/**\r
* Namespace: System.Web.UI.WebControls\r
* Class: Calendar\r
- * \r
+ *\r
* Author: Gaurav Vaish\r
+ * Maintainer: gvaish@iitk.ac.in\r
* Contact: <my_scripts2001@yahoo.com>, <gvaish@iitk.ac.in>\r
- * Status: 20%\r
- * \r
+ * Implementation: yes\r
+ * Status: 98%\r
+ *\r
* (C) Gaurav Vaish (2001)\r
*/\r
\r
using System;\r
+using System.IO;\r
+using System.Collections;\r
+using System.Globalization;\r
+using System.Text;\r
using System.Web;\r
using System.Web.UI;\r
+using System.Drawing;\r
\r
namespace System.Web.UI.WebControls\r
{\r
public class Calendar : WebControl, IPostBackEventHandler\r
{\r
//\r
- \r
- private TableItemStyle dayHeaderStyle;\r
+\r
+ private TableItemStyle dayHeaderStyle;\r
+ private TableItemStyle dayStyle;\r
+ private TableItemStyle nextPrevStyle;\r
+ private TableItemStyle otherMonthDayStyle;\r
+ private SelectedDatesCollection selectedDates;\r
+ private ArrayList selectedDatesList;\r
+ private TableItemStyle selectedDayStyle;\r
+ private TableItemStyle selectorStyle;\r
+ private TableItemStyle titleStyle;\r
+ private TableItemStyle todayDayStyle;\r
+ private TableItemStyle weekendDayStyle;\r
+\r
+ private static readonly object DayRenderEvent = new object();\r
+ private static readonly object SelectionChangedEvent = new object();\r
+ private static readonly object VisibleMonthChangedEvent = new object();\r
+\r
+ private Color defaultTextColor;\r
+ private System.Globalization.Calendar globCal;\r
+\r
+ private static int MASK_WEEKEND = (0x01 << 0);\r
+ private static int MASK_OMONTH = (0x01 << 1);\r
+ private static int MASK_TODAY = (0x01 << 2);\r
+ private static int MASK_SELECTED = (0x01 << 3);\r
+ private static int MASK_DAY = (0x01 << 4);\r
+ private static int MASK_UNIQUE = MASK_WEEKEND | MASK_OMONTH | MASK_TODAY | MASK_SELECTED;\r
+\r
public Calendar(): base()\r
{\r
//TODO: Initialization\r
}\r
- \r
+\r
public int CellPadding\r
{\r
get\r
ViewState["CellSpacing"] = value;\r
}\r
}\r
- \r
+\r
public TableItemStyle DayHeaderStyle\r
{\r
get\r
{\r
if(dayHeaderStyle==null)\r
dayHeaderStyle = new TableItemStyle();\r
+ if(IsTrackingViewState)\r
+ dayHeaderStyle.TrackViewState();\r
return dayHeaderStyle;\r
}\r
}\r
ViewState["DayNameFormat"] = value;\r
}\r
}\r
+\r
+ public TableItemStyle DayStyle\r
+ {\r
+ get\r
+ {\r
+ if(dayStyle==null)\r
+ dayStyle = new TableItemStyle();\r
+ if(IsTrackingViewState)\r
+ dayStyle.TrackViewState();\r
+ return dayStyle;\r
+ }\r
+ }\r
+\r
+ public FirstDayOfWeek FirstDayOfWeek\r
+ {\r
+ get\r
+ {\r
+ object o = ViewState["FirstDayOfWeek"];\r
+ if(o!=null)\r
+ return (FirstDayOfWeek)o;\r
+ return FirstDayOfWeek.Default;\r
+ }\r
+ set\r
+ {\r
+ if(!System.Enum.IsDefined(typeof(FirstDayOfWeek), value))\r
+ throw new ArgumentException();\r
+ ViewState["FirstDayOfWeek"] = value;\r
+ }\r
+ }\r
+\r
+ public string NextMonthText\r
+ {\r
+ get\r
+ {\r
+ object o = ViewState["NextMonthText"];\r
+ if(o!=null)\r
+ return (string)o;\r
+ return ">";\r
+ }\r
+ set\r
+ {\r
+ ViewState["NextMonthText"] = value;\r
+ }\r
+ }\r
+\r
+ public NextPrevFormat NextPrevFormat\r
+ {\r
+ get\r
+ {\r
+ object o = ViewState["NextPrevFormat"];\r
+ if(o!=null)\r
+ return (NextPrevFormat)o;\r
+ return NextPrevFormat.CustomText;\r
+ }\r
+ set\r
+ {\r
+ if(!System.Enum.IsDefined(typeof(NextPrevFormat), value))\r
+ throw new ArgumentException();\r
+ ViewState["NextPrevFormat"] = value;\r
+ }\r
+ }\r
+\r
+ public TableItemStyle NextPrevStyle\r
+ {\r
+ get\r
+ {\r
+ if(nextPrevStyle == null)\r
+ nextPrevStyle = new TableItemStyle();\r
+ if(IsTrackingViewState)\r
+ nextPrevStyle.TrackViewState();\r
+ return nextPrevStyle;\r
+ }\r
+ }\r
+\r
+ public TableItemStyle OtherMonthDayStyle\r
+ {\r
+ get\r
+ {\r
+ if(otherMonthDayStyle == null)\r
+ otherMonthDayStyle = new TableItemStyle();\r
+ if(IsTrackingViewState)\r
+ otherMonthDayStyle.TrackViewState();\r
+ return otherMonthDayStyle;\r
+ }\r
+ }\r
+\r
+ public string PrevMonthText\r
+ {\r
+ get\r
+ {\r
+ object o = ViewState["PrevMonthText"];\r
+ if(o!=null)\r
+ return (string)o;\r
+ return "<";\r
+ }\r
+ set\r
+ {\r
+ ViewState["PrevMonthText"] = value;\r
+ }\r
+ }\r
+\r
+ public DateTime SelectedDate\r
+ {\r
+ get\r
+ {\r
+ if(SelectedDates.Count > 0)\r
+ {\r
+ return SelectedDates[0];\r
+ }\r
+ return DateTime.MinValue;\r
+ }\r
+ set\r
+ {\r
+ if(value == DateTime.MinValue)\r
+ {\r
+ SelectedDates.Clear();\r
+ } else\r
+ {\r
+ SelectedDates.SelectRange(value, value);\r
+ }\r
+ }\r
+ }\r
+\r
+ public SelectedDatesCollection SelectedDates\r
+ {\r
+ get\r
+ {\r
+ if(selectedDates==null)\r
+ {\r
+ if(selectedDatesList == null)\r
+ selectedDatesList = new ArrayList();\r
+ selectedDates = new SelectedDatesCollection(selectedDatesList);\r
+ }\r
+ return selectedDates;\r
+ }\r
+ }\r
+\r
+ public TableItemStyle SelectedDayStyle\r
+ {\r
+ get\r
+ {\r
+ if(selectedDayStyle==null)\r
+ selectedDayStyle = new TableItemStyle();\r
+ if(IsTrackingViewState)\r
+ selectedDayDtyle.TrackViewState();\r
+ return selectedDayStyle;\r
+ }\r
+ }\r
+\r
+ public CalendarSelectionMode SelectionMode\r
+ {\r
+ get\r
+ {\r
+ object o = ViewState["SelectionMode"];\r
+ if(o!=null)\r
+ return (CalendarSelectionMode)o;\r
+ return CalendarSelectionMode.Day;\r
+ }\r
+ set\r
+ {\r
+ if(!System.Enum.IsDefined(typeof(CalendarSelectionMode), value))\r
+ throw new ArgumentException();\r
+ ViewState["SelectionMode"] = value;\r
+ }\r
+ }\r
+\r
+ public string SelectedMonthText\r
+ {\r
+ get\r
+ {\r
+ object o = ViewState["SelectedMonthText"];\r
+ if(o!=null)\r
+ return (string)o;\r
+ return ">>";\r
+ }\r
+ set\r
+ {\r
+ ViewState["SelectedMonthText"] = value;\r
+ }\r
+ }\r
+\r
+ public TableItemStyle SelectorStyle\r
+ {\r
+ get\r
+ {\r
+ if(selectorStyle==null)\r
+ selectorStyle = new TableItemStyle();\r
+ return selectorStyle;\r
+ }\r
+ }\r
+\r
+ public string SelectWeekText\r
+ {\r
+ get\r
+ {\r
+ object o = ViewState["SelectWeekText"];\r
+ if(o!=null)\r
+ return (string)o;\r
+ return ">";\r
+ }\r
+ set\r
+ {\r
+ ViewState["SelectWeekText"] = value;\r
+ }\r
+ }\r
+\r
+ public bool ShowDayHeader\r
+ {\r
+ get\r
+ {\r
+ object o = ViewState["ShowDayHeader"];\r
+ if(o!=null)\r
+ return (bool)o;\r
+ return true;\r
+ }\r
+ set\r
+ {\r
+ ViewState["ShowDayHeader"] = value;\r
+ }\r
+ }\r
+\r
+ public bool ShowGridLines\r
+ {\r
+ get\r
+ {\r
+ object o = ViewState["ShowGridLines"];\r
+ if(o!=null)\r
+ return (bool)o;\r
+ return false;\r
+ }\r
+ set\r
+ {\r
+ ViewState["ShowGridLines"] = value;\r
+ }\r
+ }\r
+\r
+ public bool ShowNextPrevMonth\r
+ {\r
+ get\r
+ {\r
+ object o = ViewState["ShowNextPrevMonth"];\r
+ if(o!=null)\r
+ return (bool)o;\r
+ return true;\r
+ }\r
+ set\r
+ {\r
+ ViewState["ShowNextPrevMonth"] = value;\r
+ }\r
+ }\r
+\r
+ public bool ShowTitle\r
+ {\r
+ get\r
+ {\r
+ object o = ViewState["ShowTitle"];\r
+ if(o!=null)\r
+ return (bool)o;\r
+ return true;\r
+ }\r
+ set\r
+ {\r
+ ViewState["ShowTitle"] = value;\r
+ }\r
+ }\r
+\r
+ public TitleFormat TitleFormat\r
+ {\r
+ get\r
+ {\r
+ object o = ViewState["TitleFormat"];\r
+ if(o!=null)\r
+ return (TitleFormat)o;\r
+ return TitleFormat.MonthYear;\r
+ }\r
+ set\r
+ {\r
+ if(!System.Enum.IsDefined(typeof(TitleFormat), value))\r
+ throw new ArgumentException();\r
+ ViewState["TitleFormat"] = value;\r
+ }\r
+ }\r
+\r
+ public TableItemStyle TitleStyle\r
+ {\r
+ get\r
+ {\r
+ if(titleStyle==null)\r
+ titleStyle = new TableItemStyle();\r
+ if(IsTrackingViewState)\r
+ titleStyle.TrackViewState();\r
+ return titleStyle;\r
+ }\r
+ }\r
+\r
+ public TableItemStyle TodayDayStyle\r
+ {\r
+ get\r
+ {\r
+ if(todayDayStyle==null)\r
+ todayDayStyle = new TableItemStyle();\r
+ if(IsTrackingViewState)\r
+ todayDayStyle.TrackViewState();\r
+ return todayDayStyle;\r
+ }\r
+ }\r
+\r
+ public DateTime TodaysDate\r
+ {\r
+ get\r
+ {\r
+ object o = ViewState["TodaysDate"];\r
+ if(o!=null)\r
+ return (DateTime)o;\r
+ return DateTime.Today;\r
+ }\r
+ set\r
+ {\r
+ ViewState["TodaysDate"] = value;\r
+ }\r
+ }\r
+\r
+ public DateTime VisibleDate\r
+ {\r
+ get\r
+ {\r
+ object o = ViewState["VisibleDate"];\r
+ if(o!=null)\r
+ return (DateTime)o;\r
+ return DateTime.MinValue;\r
+ }\r
+ set\r
+ {\r
+ ViewState["VisibleDate"] = value;\r
+ }\r
+ }\r
+\r
+ public TableItemStyle WeekendDayStyle\r
+ {\r
+ get\r
+ {\r
+ if(weekendDayStyle == null)\r
+ weekendDayStyle = new TableItemStyle();\r
+ if(IsTrackingViewState)\r
+ {\r
+ weekendDayStyle.TrackViewState();\r
+ }\r
+ return weekendDayStyle;\r
+ }\r
+ }\r
+\r
+ public event DayRenderEventHandler DayRender\r
+ {\r
+ add\r
+ {\r
+ Events.AddHandler(DayRenderEvent, value);\r
+ }\r
+ remove\r
+ {\r
+ Events.RemoveHandler(DayRenderEvent, value);\r
+ }\r
+ }\r
+\r
+ public event EventHandler SelectionChanged\r
+ {\r
+ add\r
+ {\r
+ Events.AddHandler(SelectionChangedEvent, value);\r
+ }\r
+ remove\r
+ {\r
+ Events.RemoveHandler(SelectionChangedEvent, value);\r
+ }\r
+ }\r
+\r
+ public event MonthChangedEventHandler VisibleMonthChanged\r
+ {\r
+ add\r
+ {\r
+ Events.AddHandler(VisibleMonthChangedEvent, value);\r
+ }\r
+ remove\r
+ {\r
+ Events.RemoveHandler(VisibleMonthChangedEvent, value);\r
+ }\r
+ }\r
+\r
+ protected virtual void OnDayRender(TableCell cell, CalendarDay day)\r
+ {\r
+ if(Events!=null)\r
+ {\r
+ DayRenderEventHandler dreh = (DayRenderEventHandler)(Events[DayRenderEvent]);\r
+ if(dreh!=null)\r
+ dreh(this, new DayRenderEventArgs(cell, day));\r
+ }\r
+ }\r
+\r
+ protected virtual void OnSelectionChanged()\r
+ {\r
+ if(Events!=null)\r
+ {\r
+ EventHandler eh = (EventHandler)(Events[SelectionChangedEvent]);\r
+ if(eh!=null)\r
+ eh(this, new EventArgs());\r
+ }\r
+ }\r
+\r
+ protected virtual void OnVisibleMonthChanged(DateTime newDate, DateTime prevDate)\r
+ {\r
+ if(Events!=null)\r
+ {\r
+ MonthChangedEventHandler mceh = (MonthChangedEventHandler)(Events[VisibleMonthChangedEvent]);\r
+ if(mceh!=null)\r
+ mceh(this, new MonthChangedEventArgs(newDate, prevDate));\r
+ }\r
+ }\r
+\r
+ /// <remarks>\r
+ /// See test6.aspx in Tests directory for verification\r
+ /// </remarks>\r
+ void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)\r
+ {\r
+ globCal = DateTimeFormatInfo.CurrentInfo.Calendar;\r
+ DateTime visDate = GetEffectiveVisibleDate();\r
+ //FIXME: Should it be String.Compare(eventArgument, "nextMonth", false);\r
+ if(eventArgument == "nextMonth")\r
+ {\r
+ VisibleDate = globCal.AddMonths(visDate, 1);\r
+ OnVisibleDateChanged(VisibleDate, visDate);\r
+ return;\r
+ }\r
+ if(eventArgument == "prevMonth")\r
+ {\r
+ VisibleDate = globCal.AddMonths(visDate, -1);\r
+ OnVisibleDateChanged(VisibleDate, visDate);\r
+ return;\r
+ }\r
+ if(eventArgument == "selectMonth")\r
+ {\r
+ DateTime oldDate = new DateTime(globCal.GetYear(visDate), globCal.GetMonth(visDate), 1, globCal);\r
+ SelectRangeInternal(oldDate, globCal.AddDays(gloCal.AddMonths(oldDate, 1), -1), visDate);\r
+ return;\r
+ }\r
+ if(String.Compare(eventArgument, 0, "selectWeek", 0, "selectWeek".Length)==0)\r
+ {\r
+ int week = -1;\r
+ try\r
+ {\r
+ week = Int32.Parse(eventArgument.Substring("selectWeek".Length));\r
+ } catch(Exception e)\r
+ {\r
+ }\r
+ if(week >= 0 && week <= 5)\r
+ {\r
+ DateTime weekStart = globCal.AddDays(GetFirstCalendarDay(visDate), week * 7);\r
+ SelectRangeInternal(weekStart, globCal.AddDays(weekStart, 6), visDate);\r
+ }\r
+ return;\r
+ }\r
+ if(String.Compare(eventArgument, 0, "selectDay", 0, "selectDay".Length)==0)\r
+ {\r
+ int day = -1;\r
+ try\r
+ {\r
+ day = Int32.Parse(eventArgument.Substring("selectDay".Length);\r
+ } catch(Exception e)\r
+ {\r
+ }\r
+ if(day >= 0 && day <= 42)\r
+ {\r
+ DateTime dayStart = globCal.AddDays(GetFirstCalendarDay(visDate), day);\r
+ SelectRangeInternal(dayStart, dayStart, visDate);\r
+ }\r
+ }\r
+ }\r
+\r
+ protected override void Render(HtmlTextWriter writer)\r
+ {\r
+ //TODO: Implement me\r
+ globCal = DateTimeFormatInfo.CurrentInfo.Calendar;\r
+ DateTime visDate = GetEffectiveVisibleDate()\r
+ DateTime firstDate = GetFirstCalendarDay(visDate);\r
+ \r
+ bool isEnabled = false;\r
+ bool isHtmlTextWriter = false;\r
+ if(Page == null || Site == null || Site.DesignMode == null )\r
+ {\r
+ isEnabled = false;\r
+ isHtmlTextWriter = false;\r
+ } else\r
+ {\r
+ isEnabled = Enabled;\r
+ isHtmlTextWriter = (writer.GetType() != typeof(HtmlTextWriter));\r
+ }\r
+ defaultTextColor = ForeColor;\r
+ if(defaultTextColor == Color.Empty)\r
+ defaultTextColor = Color.Black;\r
+ \r
+ Table calTable = new Table();\r
+ calTable.ID = ID;\r
+ calTable.CopyBaseAttributes(this);\r
+ if(ControlStyleCreated)\r
+ ApplyStyle(ControlStyle);\r
+ calTable.Width = Width;\r
+ calTable.Height = Height;\r
+ calTable.CellSpacing = CellSpacing;\r
+ calTable.CellPadding = CellPadding;\r
+ \r
+ if(ControlStyleCreated && ControlStyle.IsSet(Style.BORDERWIDTH) && BorderWidth != Unit.Empty)\r
+ {\r
+ calTable.BorderWidth = BorderWidth;\r
+ } else\r
+ {\r
+ calTable.BorderWidth = Unit.Pixel(1);\r
+ }\r
+ \r
+ if(ShowGridLines)\r
+ calTable.GridLines = GridLines.Both;\r
+ else\r
+ calTable.GridLines = GridLines.None;\r
+ \r
+ calTable.RenderBeginTag(writer);\r
+ if(ShowTitle)\r
+ RenderTitle(writer, visDate, SelectionMode, isEnabled);\r
+ if(ShowDayHeader)\r
+ RenderHeader(writer, firstDate, SelectionMode, isEnabled, isHtmlTextWriter);\r
+ RenderAllDays(writer, firstDate, visDate, SelectionMode, isEnabled, isHtmlTextWriter);\r
+ \r
+ calTable.RenderEndTag(writer);\r
+ }\r
+\r
+ protected override ControlCollection CreateControlCollection()\r
+ {\r
+ return new EmptyControlCollection(this);\r
+ }\r
+\r
+ protected override void LoadViewState(object savedState)\r
+ {\r
+ if(savedState!=null)\r
+ {\r
+ if(ViewState["_CalendarSelectedDates"] != null)\r
+ SelectedDates = (SelectedDatesCollection)ViewState["_CalendarSelectedDates"];\r
+\r
+ object[] states = (object[]) savedState;\r
+ if(states[0] != null)\r
+ base.LoadViewState(states[0]);\r
+ if(states[1] != null)\r
+ DayHeaderStyle.LoadViewState(states[1]);\r
+ if(states[2] != null)\r
+ DayStyle.LoadViewState(states[2]);\r
+ if(states[3] != null)\r
+ NextPrevStyle.LoadViewState(states[3]);\r
+ if(states[4] != null)\r
+ OtherMonthStyle.LoadViewState(states[4]);\r
+ if(states[5] != null)\r
+ SelectedDayStyle.LoadViewState(states[5]);\r
+ if(states[6] != null)\r
+ SelectorStyle.LoadViewState(states[6]);\r
+ if(states[7] != null)\r
+ TitleStyle.LoadViewState(states[7]);\r
+ if(states[8] != null)\r
+ TodayDayStyle.LoadViewState(states[8]);\r
+ if(states[9] != null)\r
+ WeekendDayStyle.LoadViewState(states[9]);\r
+ }\r
+ }\r
+\r
+ protected override object SaveViewState()\r
+ {\r
+ ViewState["_CalendarSelectedDates"] = (SelectedDates.Count > 0 ? selectedDates : null);\r
+ object[] states = new object[11];\r
+ states[0] = base.SaveViewState();\r
+ states[1] = (dayHeaderStyle == null ? null : dayHeaderStyle.SaveViewStyle());\r
+ states[2] = (dayStyle == null ? null : dayStyle.SaveViewStyle());\r
+ states[3] = (nextPrevStyle == null ? null : nextPrevStyle.SaveViewStyle());\r
+ states[4] = (otherMonthDayStyle == null ? null : otherMonthDayStyle.SaveViewStyle());\r
+ states[5] = (selectedDayStyle == null ? null : selectedDayStyle.SaveViewStyle());\r
+ states[6] = (selectorStyle == null ? null : selectorStyle.SaveViewStyle());\r
+ states[7] = (titleStyle == null ? null : titleStyle.SaveViewStyle());\r
+ states[8] = (todayDayStyle == null ? null : todayDayStyle.SaveViewStyle());\r
+ states[9] = (weekendDayStyle == null ? null : weekendDayStyle.SaveViewStyle());\r
+ for(int i=0; i < states.Length)\r
+ {\r
+ if(states[i]!=null)\r
+ return states;\r
+ }\r
+ return null;\r
+ }\r
+\r
+ protected override void TrackViewState(): TrackViewState()\r
+ {\r
+ if(titleStyle!=null)\r
+ {\r
+ titleStyle.TrackViewState();\r
+ }\r
+ if(nextPrevStyle!=null)\r
+ {\r
+ nextPrevStyle.TrackViewState();\r
+ }\r
+ if(dayStyle!=null)\r
+ {\r
+ dayStyle.TrackViewState();\r
+ }\r
+ if(dayHeaderStyle!=null)\r
+ {\r
+ dayHeaderStyle.TrackViewState();\r
+ }\r
+ if(todayDayStyle!=null)\r
+ {\r
+ todayDayStyle.TrackViewState();\r
+ }\r
+ if(weekendDayStyle!=null)\r
+ {\r
+ weekendDayStyle.TrackViewState();\r
+ }\r
+ if(otherMonthDayStyle!=null)\r
+ {\r
+ otherMonthDayStyle.TrackViewState();\r
+ }\r
+ if(selectedDayStyle!=null)\r
+ {\r
+ selectedDayStyle.TrackViewState();\r
+ }\r
+ if(selectorStyle!=null)\r
+ {\r
+ selectorStyle.TrackViewState();\r
+ }\r
+ }\r
+\r
+ [MonoTODO("Individual_Day_Rendering_Part_Left")]\r
+ private void RenderAllDays(HtmlTextWriter writer, DateTime firstDay, DateTime activeDate, CalendarSelectionMode mode, bool isActive, bool isDownLevel)\r
+ {\r
+ TableCell weeksCell;\r
+ string weeksCellData;\r
+ bool isWeekMode = (mode == CalendarSelectionMode.DayWeek || mode == CalendarSelectionMode.DayWeekMonth);\r
+ if(isWeekMode)\r
+ {\r
+ weeksCell = new TableCell();\r
+ weeksCell.Width = Unit.Percentage(12);\r
+ weeksCell.HorizontalAlign = HorizontalAlign.Center;\r
+ weeksCell.ApplyStyle(SelectorStyle);\r
+ if(!isDownLevel)\r
+ weeksCellData = GetHtmlForCell(weeksCell, isActive);\r
+ }\r
+ bool dayRenderBool = false;\r
+ if(GetType() != typeof(Calendar) || Events[DayRenderEvent] != null || !isDownLevel)\r
+ dayRenderBool = true;\r
+\r
+ string[] content = new string[0x01 << 4];\r
+ int definedStyles = MASK_SELECTED;\r
+ if(weekendStyle != null && !weekendStyle.IsEmpty)\r
+ definedStyles |= MASK_WEEKEND;\r
+ if(otherMonthStyle != null && !otherMonthStyle.IsEmpty)\r
+ definedStyles |= MASK_OMONTH;\r
+ if(todayDayStyle != null && todayDayStyle.IsEmpty)\r
+ definedStyles |= MASK_TODAY;\r
+ if(dayStyle != null && !dayStyle.IsEmpty)\r
+ definedStyles |= MASK_DAY;\r
+\r
+ bool selectDayBool = false;\r
+ if(isActive && mode != CalendarSelectionMode.None)\r
+ {\r
+ selectDayBool = true;\r
+ }\r
+ \r
+ for(int crr = 0; crr < 6; crr++)\r
+ {\r
+ writer.Write("<tr>");\r
+ if(isWeekMode)\r
+ {\r
+ if(isDownLevel)\r
+ {\r
+ string cellText = GetCalendarLinkText("selectWeek" + crr.ToString(), SelectWeekText, isActive, weeksCell.ForeColor);\r
+ weeksCell.Text = cellText;\r
+ RenderCalendarCell(writer, weeksCell, cellText);\r
+ } else\r
+ {\r
+ if(isActive)\r
+ {\r
+ writer.Write(String.Format(weeksCellData, "selectWeek" + crr.ToString(), SelectWeekText));\r
+ } else\r
+ {\r
+ writer.Write(String.Format(weeksCellData, "selectWeek" + crr.ToString()));\r
+ }\r
+ }\r
+ }\r
+ for(int crc = 0; crc < 7; crc++)\r
+ {\r
+ // have to display for each day in the week.\r
+ throw new NotImplementedException();\r
+ }\r
+ }\r
+\r
+ throw new NotImplementedException();\r
+ }\r
\r
- public void RaisePostBackEvent(string eventArgument)\r
+ private int GetMask(CalendarDay day)\r
+ {\r
+ int retVal = MASK_DAY;\r
+ if(day.IsSelected)\r
+ retVal |= MASK_SELECTED;\r
+ if(day.IsToday)\r
+ retVal |= MASK_TODAY;\r
+ if(day.IsOtherMonth)\r
+ retVal |= MASK_OMONTH;\r
+ if(day.IsWeekend)\r
+ retVal |= MASK_WEEKEND;\r
+ return retVal;\r
+ }\r
+\r
+ /// <remarks>\r
+ /// Refers to the second line of the calendar, that contains a link\r
+ /// to select whole month, and weekdays as defined by DayNameFormat\r
+ /// </remarks>\r
+ private void RenderHeader(HtmlTextWriter writer, DateTime firstDay, CalendarSelectionMode mode, bool isActive, bool isDownLevel)\r
+ {\r
+ writer.Write("<tr>");\r
+ bool isWeekMode = (mode == CalendarSelectionMode.DayWeek || mode == CalendarSelectionMode.DayWeekMonth);\r
+ TableCell headerCell = new TableCell();\r
+ headerCell.HorizontalAlign = HorizontalAlign.Center;\r
+ string selMthText = String.Empty;\r
+ if(isWeekMode)\r
+ {\r
+ headerCell.ApplyStyle(SelectorStyle);\r
+ selMthText = GetCalendarLinkText("selectMonth", SelectMonthText, isActive, SelectorStyle.ForeColor);\r
+ } else\r
+ {\r
+ headerCell.ApplyStyle(DayHeaderStyle);\r
+ }\r
+ RenderCalendarCell(writer, headerCell, selMthText);\r
+ \r
+ TableCell dayHeaderCell = new TableCell();\r
+ dayHeaderCell.HorizontalAlign = HorizontalAlign.Center;\r
+ string content = null;\r
+ if(!isDownLevel)\r
+ {\r
+ content = GetHtmlForCell(dayHeaderCell, isActive);\r
+ }\r
+ int dayOfWeek = (int)globCal.GetDayOfWeek(firstDay);\r
+ for(int currDay = dayOfWeek; currDay < dayOfWeek + 7; currDay++)\r
+ {\r
+ int effDay = (currDay % 7);\r
+ string currDayContent = String.Empty;\r
+ switch(DayNameFormat)\r
+ {\r
+ DayNameFormat.Full: currDayContent = DateTimeFormatInfo.GetDayName(effDay);\r
+ break;\r
+ DayNameFormat.FirstLetter: currDayContent = DateTimeFormatInfo.GetDayName(effDay).Substring(0,1);\r
+ break;\r
+ DayNameFormat.FirstTwoLetters: currDayContent = DateTimeFormatInfo.GetDayName(effDay).Substring(0,2);\r
+ break;\r
+ DayNameFormat.Short:\r
+ default: currDayContent = DateTimeFormatInfo.GetAbbreviatedDayName(effDay);\r
+ break;\r
+ }\r
+ if(isDownLevel)\r
+ {\r
+ RenderCalendarCell(writer, dayHeaderCell, currDayContent);\r
+ } else\r
+ {\r
+ writer.Write(String.Format(content, currDayContent);\r
+ }\r
+ }\r
+ writer.Write("</tr>");\r
+ }\r
+\r
+ private void RenderTitle(HtmlTextWriter writer, DateTime visibleDate, CalendarSelectionMode mode, bool isActive)\r
{\r
- //TODO: THE LOST WORLD\r
- // Written to keep compile get going\r
+ writer.Write("<tr>");\r
+ Table innerTable = new Table();\r
+ TableCell titleCell = new TableCell();\r
+ bool isWeekMode = (mode == CalendarSelectionMode.DayWeek || mode == CalendarSelectionMode.DayWeekMonth);\r
+ titleCell.ColumnSpan = (isWeekMode ? 8 : 7);\r
+ titleCell.BackColor = "Silver";\r
+ \r
+ innerTable.GridLines = GridLine.None;\r
+ innerTable.Width = Unit.Percentage(100);\r
+ innerTable.CellSpacing = 0;\r
+ ApplyTitleStyle(innerTable, titleCell, TitleStyle);\r
+ \r
+ innerTable.RenderBeginTag(writer);\r
+ titleCell.RenderBeginTag(writer);\r
+ \r
+ writer.Write("<tr>");\r
+ string prevContent = String.Empty;\r
+ if(ShowNextPrevMonth)\r
+ {\r
+ TableCell prevCell = new TableCell();\r
+ prevCell.Width = Unit.Percentage(15);\r
+ prevCell.HorizontalAlign = HorizontalAlign.Left;\r
+ if(NextPrevFormat == NextPrevFormat.CustomText)\r
+ {\r
+ prevContent = PrevMonthText;\r
+ } else\r
+ {\r
+ int pMthInt = globCal.GetMonth(globCal.AddMonths(visibleDate, -1));\r
+ if(NextPrevFormat == NextPrevFormat.FullText)\r
+ prevContent = DateTimeFormatInfo.CurrentInfo.GetMonthName(pMthInt);\r
+ else\r
+ prevContent = DateTimeFormatInfo.CurrentInfo.GetAbbreviatedMonthName(pMthInt);\r
+ }\r
+ prevCell.ApplyStyle(NextPrevStyle);\r
+ RenderCalendarCell(writer, prevCell, GetCalendarLinkText("prevMonth", prevContent, isActive, NextPrevStyle.ForeColor));\r
+ }\r
+ TableCell currCell = new TableCell();\r
+ currCell.Width = Unit.Percentage(70);\r
+ if(TitleStyle.HorizontalAlign == HorizontalAlign.NotSet)\r
+ currCell.HorizontalAlign = HorizontalAlign.Center;\r
+ else\r
+ currCell.HorizontalAlign = TitleStyle.HorizontalAlign;\r
+ currCell.Wrap = TitleStyle.Wrap;\r
+ string currMonthContent = String.Empty;\r
+ if(TitleFormat == TitleFormat.Month)\r
+ {\r
+ currMonthContent = visibleDate.ToString("MMMM");\r
+ } else\r
+ {\r
+ string cmcFmt = DateTimeFormatInfo.CurrentInfo.YearMonthPattern;\r
+ if(cmcFmt.IndexOf(',') >= 0)\r
+ {\r
+ cmcFmt = "MMMM yyyy";\r
+ }\r
+ currMonthContent = visibleDate.ToString(cmcFmt);\r
+ }\r
+ string nextContent = String.Empty;\r
+ if(ShowNextPrevMonth)\r
+ {\r
+ TableCell nextCell = new TableCell();\r
+ nextCell.Width = Unit.Percentage(15);\r
+ nextCell.HorizontalAlign = HorizontalAlign.Left;\r
+ if(NextPrevFormat == NextPrevFormat.CustomText)\r
+ {\r
+ nextContent = PrevMonthText;\r
+ } else\r
+ {\r
+ int nMthInt = globCal.GetMonth(globCal.AddMonths(visibleDate, 1));\r
+ if(NextPrevFormat == NextPrevFormat.FullText)\r
+ nextContent = DateTimeFormatInfo.CurrentInfo.GetMonthName(nMthInt);\r
+ else\r
+ nextContent = DateTimeFormatInfo.CurrentInfo.GetAbbreviatedMonthName(nMthInt);\r
+ }\r
+ nextCell.ApplyStyle(NextPrevStyle);\r
+ RenderCalendarCell(writer, nextCell, GetCalendarLinkText("nextMonth", nextContent, isActive, NextPrevStyle.ForeColor));\r
+ }\r
+ \r
+ writer.Write("</tr>");\r
+ titleCell.RenderEndTag(writer);\r
+ innerTable.RenderEndTag(writer);\r
+ \r
+ writer.Write("</tr>");\r
+ }\r
+\r
+ private void ApplyTitleStyle(Table table, TableCell cell, TableItemStyle style)\r
+ {\r
+ if(style.BackColor != Color.Empty)\r
+ {\r
+ cell.BackColor = style.BackColor;\r
+ }\r
+ if(style.BorderStyle != BorderStyle.NotSet)\r
+ {\r
+ cell.BorderStyle = style.BorderStyle;\r
+ }\r
+ if(style.BorderColor != Color.Empty)\r
+ {\r
+ cell.BorderColor = style.BorderColor;\r
+ }\r
+ if(style.BorderWidth != Unit.Empty)\r
+ {\r
+ cell.BorderWidth = style.BorderWidth;\r
+ }\r
+ if(style.Height != Unit.Empty)\r
+ {\r
+ cell.Height = style.Height;\r
+ }\r
+ if(style.VerticalAlign != VerticalAlign.NotSet)\r
+ {\r
+ cell.VerticalAlign = style.VerticalAlign;\r
+ }\r
+ \r
+ if(style.ForeColor != Color.Empty)\r
+ {\r
+ table.ForeColor = style.ForeColor;\r
+ } else if(ForeColor != Color.Empty)\r
+ {\r
+ table.ForeColor = ForeColor;\r
+ }\r
+ \r
+ table.Font.CopyFrom(style.Font);\r
+ table.Font.MergeWith(Font);\r
+ }\r
+\r
+ private void RenderCalendarCell(HtmlTextWriter writer, TableCell cell, string text)\r
+ {\r
+ cell.RenderBeginTag(writer);\r
+ writer.Write(text);\r
+ cell.RenderEndTag(writer);\r
+ }\r
+\r
+ private DateTime GetFirstCalendarDay(DateTime visibleDate)\r
+ {\r
+ DayOfWeek firstDay = ( FirstDayOfWeek == FirstDayOfWeek.Default ? DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek : FirstDayOfWeek);\r
+ //FIXME: is (int)(Enum) correct?\r
+ int days = (int)globCal.GetDayOfWeek(visibleDate) - (int)firstDay;\r
+ if(days < 0)\r
+ {\r
+ days += 7;\r
+ }\r
+ return globCal.AddDays(visibleDate, -days);\r
+ }\r
+\r
+ private DateTime GetEffectiveVisibleDate()\r
+ {\r
+ DateTime dt = VisibleDate;\r
+ if(dt.Equals(DateTime.MinValue))\r
+ {\r
+ dt = TodaysDate;\r
+ }\r
+ return new DateTime(globCal.GetYear(dt), globCal.GetMonth(dt), globCal.GetDayOfMonth(dt), globCal);\r
+ }\r
+\r
+ /// <summary>\r
+ /// Creates text to be displayed, with all attributes if to be\r
+ /// shown as a hyperlink\r
+ /// </summary>\r
+ private string GetCalendarLinkText(string eventArg, string text, Color foreground, bool isLink)\r
+ {\r
+ if(isLink)\r
+ {\r
+ StringBuilder dispVal = new StringBuilder();\r
+ dispVal.Append("<a href=\"");\r
+ dispVal.Append(Page.GetPostBackClientHyperlink(this, eventArg));\r
+ dispVal.Append("\" style=\"color: ");\r
+ if(foreground.IsEmpty)\r
+ {\r
+ dispVal.Append(ColorTranslator.ToHtml(defaultTextColor));\r
+ } else\r
+ {\r
+ dispVal.Append(ColorTranslator.ToHtml(foreground));\r
+ }\r
+ dispVal.Append("\">");\r
+ dispVal.Append(text);\r
+ dispVal.Append("</a>");\r
+ return dispVal.ToString();\r
+ }\r
+ return text;\r
+ }\r
+\r
+ private string GetHtmlForCell(TableCell cell, bool showLinks)\r
+ {\r
+ StringWriter sw = new StringWriter();\r
+ HtmlTextWriter htw = new HtmlTextWriter(sw);\r
+ cell.RenderBeginTag(htw);\r
+ if(showLinks)\r
+ {\r
+ htw.Write(GetCalendarLinkText("{0}", "{1}", cell.ForeColor, showLinks));\r
+ } else\r
+ {\r
+ htw.Write("{0}");\r
+ }\r
+ cell.RenderEndTag(htw);\r
+ return sw.ToString();\r
+ }\r
+\r
+ internal DateTime SelectRangeInternal(DateTime fromDate, DateTime toDate, DateTime visibleDate)\r
+ {\r
+ TimeSpan span = fromDate - toDate;\r
+ if(SelectedDates.Count != span.Days || SelectedDates[SelectedDate.Count - 1]!= toDate)\r
+ {\r
+ SelectedDates.SelectRange(fromDate, toDate);\r
+ OnSelectionChanged();\r
+ }\r
+ if(globCal.GetMonth(fromDate) == globCal.GetMonth(fromDate) && globCal.GetMonth(fromDate) != globCal.GetMonth(visibleDate)\r
+ {\r
+ VisibleDate = new DateTime(globCal.GetYear(fromDate), globCal.getMonth(fromDate), 1, globCal);\r
+ OnVisibleMonthChanged(VisibleDate, visibleDate);\r
+ }\r
}\r
}\r
}\r