![]() |
Desktop Development »
Selection Controls »
Date/Time controls
Intermediate
License: The MIT License
Farsi Library - Working with Dates, Calendars, and DatePickersBy Hadi EskandariA library to work with "Persian Calendar", "Hijri Calendar", and "Gregorian Calendar" with WinForms GUI controls designed for Persian (Farsi) or Arabic language applications in mind, but usable in any Windows application that makes use of calendars and dates. |
C#.NET2.0, Win2K, WinXP, Win2003, WinForms, VS2005, Dev
|
|
Advanced Search Add to IE Search |
|
|
|
||||||||||||||||
The Persian Calendar is used in most countries where Persian is spoken, although some regions use different month names. The Persian calendar is the official calendar of Iran and Afghanistan, and is one of the alternative calendars in regions such as Kazakhstan and Tajikistan. The Persian calendar is based on a solar year and is approximately 365 days long. A year cycles through four seasons, and a new year begins when the sun appears to cross the equator from the southern hemisphere to the northern hemisphere as viewed from the center of the Earth. The new year marks the first day of the month of Farvardin, which is the first day of spring in the northern hemisphere.
Each of the first six months in the Persian calendar has 31 days, each of the next five months has 30 days, and the last month has 29 days in a common year and 30 days in a leap year. A leap year is a year that, when divided by 33, has a remainder of 1, 5, 9, 13, 17, 22, 26, or 30. For example, the year 1370 is a leap year because dividing it by 33 yields a remainder of 17. There are approximately 8 leap years in every 33-year cycle.
Since .NET Framework 1.0 and 1.1 does not provide any Persian Calendar, and Persian Calendar on .NET 2.0 has a bug and is useless, here, I'm going to show how to write the required DataType, and GUI controls to work with this DataType.
It seems that Microsoft forgot to provide a "Persian Calendar" on .NET 1.1, and while they do provide a class for this special kind of calendar in their second version of the Framework, they have somehow mis-calculated. We're going to write a Persian Calendar, plus a DataType to be replaced with the standard DateTime class, while maintaining the same structure. As it is required to convert standard DateTime to PersianDate, I'll be providing a converter class too. Since the use of these classes could be maximized when combined with GUI controls, I'll be providing a MonthView and a DatePicker control too.
I've changed the design-time integration a little bit. Since some developers like to use PersianDate and others use DateTime classes to work with these libraries, I've exposed both of these properties as SelectedDate and SelectedDateTime. As for SelectedDate which has PersianDate type, there's a TypeConverter to do the conversion of Text to PersianDate instances at design time.
I'm using .NET 2.0 VisualStyleRenderer, which is a managed wrapper for XP styles. In addition, there are some classes to simulate Office 2003 rendering. There's also an Office 2000 style available. If theming is disabled or not supported by the OS, controls render using Office 2000 style.
Popup controls should have shadows. On RTL controls, shadows should be at the left-bottom of the control. All the strings used in the controls are using a localizer manager class to get the strings based on StringID enumeration.To use the localized version you should change current thread's Culture and CultureUI properties to one of the defined cultures : (AR-SA for Arabic Culture, FA-IR for Persian Culture, and InvariantCulture for English or neutral culture. Here's how to do this in the application's Main() method:
//
// The main entry point for the application.
//
[STAThread]
static void Main()
{
Thread.CurrentThread.CurrentUICulture =
new System.Globalization.CultureInfo("fa-IR");
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
Here's the correct behavior of a popup control with standard strings and localized version for the FA-IR culture.

I primarily used AR-AE culture for Arabic, but in version 1.3.1.0, I had to change this to AR-SA. This is because of a problem (bug?) with the Hijri Calendar not being the default calendar of AR-AE culture, while it IS the default culture for AR-SA culture. Now the control is drawn in the correct way when you set the culture to Arabic.
Rendering in neutral culture is now done in Left-To-Right order. Generally the control decides to render in RTL or LTR based on the reading order of the current culture.
You can use the PersianDate class in much the same way as you use the DateTime class. Here are some examples:
//
// Use of Persian date class
//
PersianDate pd1 = PersianDate.Now.ToString(); // prints 1385/01/13
// constructs a new instance with the specified vales
PersianDate pd2 = new PersianDate(1386, 4, 26);
// You can use operator overloading, too!
if(pd1 >= pd2)
MessageBox.Show("Date is greater or equal");
// Use of normal DateTime and Conversion
PersianDate pd3 = PersianDateConverter.ToPersianDate(DateTime.Now);
DateTime dt1 = PersianDateConverter.ToGregorianDate(PersianDate.Now);
Please send any suggestions/comments/feedbacks to my email address or use the Forum at the bottom of the page. For further releases or other libraries, visit my website.
This library is tested on VS.NET 2005 and .NET Framework version 2.0. So, it won't run on VS.NET 2003. If you REALLY need to get this going, you'll have to port this to VS.NET 2003 and you'll have to change the drawing part of the code, since it actually uses managed classes of .NET 2.0 to draw in WindowsXP style. You'll have to use a wrapper on Theme API (there is already a project in CodeProject) to do the job for you. To make the porting easier, you can also cut out all the drawings in WindowsXP and Office 2003 style, and stick to the good-old Office2000 theme which uses GDI+ classes to draw.
The WPF version is out. You can have a look at the Vista (Windows Presentation Foundation) section of The Code Project website. Your feedbacks and comments are greatly appreciated.
SelectedDateRange property and changes will be reflected on the UI.PersianDayOfWeek enum with correct days order.DayOfWeek property to PersianDate class, to return the correct day of the week.MessageBox control with RTL and LTR views, and ability to remember the selected value, with both standard and custom MessageBox buttons. PersianDate.ToString() method, (like the DateTime control), which gives the functionality to return formatted strings, e.g. Long Date, Long Time, DateTime, etc. SelectedDateTimeChanging event. FAMonthView control when selecting a date prior to MinValue and greater than MaxValue. PersianDate MinValue and MaxValue classes. MonthNames is a zero-based index. First month's name is now okay in Invariant Culture. PersianDate. null values on != and == operators of PersianDate. DateTime and PersianDate properties and events of the GUI controls. You can convert DateTime instances directly to PersianDate. DatePicker. DateTime and PersianDate. Millisecond property to PersianDate class for better precision. PersianDate class is now serializable and implements the following interfaces: ICloneable , IComparable , IComparable<T>, IComparer , IComparer<T>, IEquatable<T>. FAMonthView. You can scroll through days, months, or years. FAThemeManager class that handles selected themes of all controls. To change the theme globally, you just need to set this class' Theme property. FALocalizeManager class that handles other cultures. You can now localize strings into any culture. ToolStrip support. Now you can integrate controls in ToolStrip, MenuStrip, etc. DataGridView custom column and editor support. PopupForms, Controls hierarchy and Painter classes.ComboBox controls.FADatePickerConverter.FADa<code>tePicker control now displays the popup calendar according to its theme.FADatePicker control not showing text property correctly.AR-SA (Hijri Calendar) and FA-IR (Persian Calendar).Localizer class to update strings.DatePickerConverter control which converts selected date by pressing a button.Providing base classes, and GUI controls to work with "Persian Dates". Some of the features (e.g. Office 2000 drawing) are not yet implemented.
General
News
Question
Answer
Joke
Rant
Admin
Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads.
|
PermaLink |
Privacy |
Terms of Use
Last Updated: 21 Nov 2007 Editor: Deeksha Shenoy |
Copyright 2006 by Hadi Eskandari Everything else Copyright © CodeProject, 1999-2010 Web22 | Advertise on the Code Project |