2 * Namespace: System.Web.UI.WebControls
\r
5 * Author: Gaurav Vaish
\r
6 * Maintainer: gvaish@iitk.ac.in
\r
7 * Contact: <my_scripts2001@yahoo.com>, <gvaish@iitk.ac.in>
\r
10 * (C) Gaurav Vaish (2001)
\r
14 using System.Collections;
\r
15 using System.Globalization;
\r
18 using System.Web.UI;
\r
19 using System.Drawing;
\r
21 namespace System.Web.UI.WebControls
\r
23 public class Calendar : WebControl, IPostBackEventHandler
\r
27 private TableItemStyle dayHeaderStyle;
\r
28 private TableItemStyle dayStyle;
\r
29 private TableItemStyle nextPrevStyle;
\r
30 private TableItemStyle otherMonthDayStyle;
\r
31 private SelectedDatesCollection selectedDates;
\r
32 private ArrayList selectedDatesList;
\r
33 private TableItemStyle selectedDayStyle;
\r
34 private TableItemStyle selectorStyle;
\r
35 private TableItemStyle titleStyle;
\r
36 private TableItemStyle todayDayStyle;
\r
37 private TableItemStyle weekendDayStyle;
\r
39 private static readonly object DayRenderEvent = new object();
\r
40 private static readonly object SelectionChangedEvent = new object();
\r
41 private static readonly object VisibleMonthChangedEvent = new object();
\r
43 private Color defaultTextColor;
\r
44 private System.Globalization.Calendar globCal;
\r
46 public Calendar(): base()
\r
48 //TODO: Initialization
\r
51 public int CellPadding
\r
55 object o = ViewState["CellPadding"];
\r
62 ViewState["CellPadding"] = value;
\r
66 public int CellSpacing
\r
70 object o = ViewState["CellSpacing"];
\r
78 throw new ArgumentOutOfRangeException();
\r
79 ViewState["CellSpacing"] = value;
\r
83 public TableItemStyle DayHeaderStyle
\r
87 if(dayHeaderStyle==null)
\r
88 dayHeaderStyle = new TableItemStyle();
\r
89 return dayHeaderStyle;
\r
93 public DayNameFormat DayNameFormat
\r
97 object o = ViewState["DayNameFormat"];
\r
99 return (DayNameFormat)o;
\r
100 return DayNameFormat.Short;
\r
104 if(!System.Enum.IsDefined(typeof(DayNameFormat),value))
\r
105 throw new ArgumentException();
\r
106 ViewState["DayNameFormat"] = value;
\r
110 public TableItemStyle DayStyle
\r
115 dayStyle = new TableItemStyle();
\r
120 public FirstDayOfWeek FirstDayOfWeek
\r
124 object o = ViewState["FirstDayOfWeek"];
\r
126 return (FirstDayOfWeek)o;
\r
127 return FirstDayOfWeek.Default;
\r
131 if(!System.Enum.IsDefined(typeof(FirstDayOfWeek), value))
\r
132 throw new ArgumentException();
\r
133 ViewState["FirstDayOfWeek"] = value;
\r
137 public string NextMonthText
\r
141 object o = ViewState["NextMonthText"];
\r
148 ViewState["NextMonthText"] = value;
\r
152 public NextPrevFormat NextPrevFormat
\r
156 object o = ViewState["NextPrevFormat"];
\r
158 return (NextPrevFormat)o;
\r
159 return NextPrevFormat.CustomText;
\r
163 if(!System.Enum.IsDefined(typeof(NextPrevFormat), value))
\r
164 throw new ArgumentException();
\r
165 ViewState["NextPrevFormat"] = value;
\r
169 public TableItemStyle NextPrevStyle
\r
173 if(nextPrevStyle == null)
\r
174 nextPrevStyle = new TableItemStyle();
\r
175 return nextPrevStyle;
\r
179 public TableItemStyle OtherMonthDayStyle
\r
183 if(otherMonthDayStyle == null)
\r
184 otherMonthDayStyle = new TableItemStyle();
\r
185 return otherMonthDayStyle;
\r
189 public string PrevMonthText
\r
193 object o = ViewState["PrevMonthText"];
\r
200 ViewState["PrevMonthText"] = value;
\r
204 public DateTime SelectedDate
\r
206 // TODO: Am I right here? I got confused with the "Remarks" written in the documentation
\r
208 * Looks like I have to first do something with SelectionMode,
\r
209 * then with SelectedDates,
\r
210 * Update when SelectionChanged is called => Link to the function.
\r
211 * Pretty confused at this point
\r
215 object o = ViewState["SelectedDate"];
\r
217 return (DateTime)o;
\r
218 return DateTime.MinValue;
\r
222 ViewState["SelectedDate"] = value;
\r
226 public SelectedDatesCollection SelectedDates
\r
230 if(selectedDates==null)
\r
232 if(selectedDatesList == null)
\r
233 selectedDatesList = new ArrayList();
\r
234 selectedDates = new SelectedDatesCollection(selectedDatesList);
\r
236 return selectedDates;
\r
240 public TableItemStyle SelectedDayStyle
\r
244 if(selectedDayStyle==null)
\r
245 selectedDayStyle = new TableItemStyle();
\r
246 return selectedDayStyle;
\r
250 public CalendarSelectionMode SelectionMode
\r
254 object o = ViewState["SelectionMode"];
\r
256 return (CalendarSelectionMode)o;
\r
257 return CalendarSelectionMode.Day;
\r
261 if(!System.Enum.IsDefined(typeof(CalendarSelectionMode), value))
\r
262 throw new ArgumentException();
\r
263 ViewState["SelectionMode"] = value;
\r
267 public string SelectedMonthText
\r
271 object o = ViewState["SelectedMonthText"];
\r
278 ViewState["SelectedMonthText"] = value;
\r
282 public TableItemStyle SelectorStyle
\r
286 if(selectorStyle==null)
\r
287 selectorStyle = new TableItemStyle();
\r
288 return selectorStyle;
\r
292 public string SelectedWeekText
\r
296 object o = ViewState["SelectedWeekText"];
\r
303 ViewState["SelectedWeekText"] = value;
\r
307 public bool ShowDayHeader
\r
311 object o = ViewState["ShowDayHeader"];
\r
318 ViewState["ShowDayHeader"] = value;
\r
322 public bool ShowGridLines
\r
326 object o = ViewState["ShowGridLines"];
\r
333 ViewState["ShowGridLines"] = value;
\r
337 public bool ShowNextPrevMonth
\r
341 object o = ViewState["ShowNextPrevMonth"];
\r
348 ViewState["ShowNextPrevMonth"] = value;
\r
352 public bool ShowTitle
\r
356 object o = ViewState["ShowTitle"];
\r
363 ViewState["ShowTitle"] = value;
\r
367 public TitleFormat TitleFormat
\r
371 object o = ViewState["TitleFormat"];
\r
373 return (TitleFormat)o;
\r
374 return TitleFormat.MonthYear;
\r
378 if(!System.Enum.IsDefined(typeof(TitleFormat), value))
\r
379 throw new ArgumentException();
\r
380 ViewState["TitleFormat"] = value;
\r
384 public TableItemStyle TitleStyle
\r
388 if(titleStyle==null)
\r
389 titleStyle = new TableItemStyle();
\r
394 public TableItemStyle TodayDayStyle
\r
398 if(todayDayStyle==null)
\r
399 todayDayStyle = new TableItemStyle();
\r
400 return todayDayStyle;
\r
404 public DateTime TodaysDate
\r
408 object o = ViewState["TodaysDate"];
\r
410 return (DateTime)o;
\r
411 return DateTime.Today;
\r
415 ViewState["TodaysDate"] = value;
\r
419 public DateTime VisibleDate
\r
423 object o = ViewState["VisibleDate"];
\r
425 return (DateTime)o;
\r
426 return DateTime.MinValue;
\r
430 ViewState["VisibleDate"] = value;
\r
434 public TableItemStyle WeekendDayStyle
\r
438 if(weekendDayStyle == null)
\r
439 weekendDayStyle = new TableItemStyle();
\r
440 return weekendDayStyle;
\r
444 public event DayRenderEventHandler DayRender
\r
448 Events.AddHandler(DayRenderEvent, value);
\r
452 Events.RemoveHandler(DayRenderEvent, value);
\r
456 public event EventHandler SelectionChanged
\r
460 Events.AddHandler(SelectionChangedEvent, value);
\r
464 Events.RemoveHandler(SelectionChangedEvent, value);
\r
468 public event MonthChangedEventHandler VisibleMonthChanged
\r
472 Events.AddHandler(VisibleMonthChangedEvent, value);
\r
476 Events.RemoveHandler(VisibleMonthChangedEvent, value);
\r
480 protected virtual void OnDayRender(TableCell cell, CalendarDay day)
\r
484 DayRenderEventHandler dreh = (DayRenderEventHandler)(Events[DayRenderEvent]);
\r
486 dreh(this, new DayRenderEventArgs(cell, day));
\r
490 protected virtual void OnSelectionChanged()
\r
494 EventHandler eh = (EventHandler)(Events[SelectionChangedEvent]);
\r
496 eh(this, new EventArgs());
\r
500 protected virtual void OnVisibleMonthChanged(DateTime newDate, DateTime prevDate)
\r
504 MonthChangedEventHandler mceh = (MonthChangedEventHandler)(Events[VisibleMonthChangedEvent]);
\r
506 mceh(this, new MonthChangedEventArgs(newDate, prevDate));
\r
510 public void RaisePostBackEvent(string eventArgument)
\r
512 //TODO: Implement Me
\r
513 // Written to keep compile get going
\r
516 protected override void Render(HtmlTextWriter writer)
\r
518 //TODO: Implement me
\r
519 globCal = DateTimeFormatInfo.CurrentInfo.Calendar;
\r
520 SetFirstCalendarDay(GetEffectiveVisibleDate());
\r
522 * ForeColor else defaultTextColor
\r
524 * if(ControlStyleCreated())
\r
527 * ApplyStyle(ControlStyle)
\r
530 * RenderBeginTag(writer)
\r
531 * RenderTitle(writer, visibleDate from GetEffectiveVisibleDate, this.SelectionMode, IsEnabled)
\r
533 * RenderHeader(writer, visibleDate, SelectionMode, IsEnabled,
\r
535 * RenderEndTag(writer)
\r
539 protected override ControlCollection CreateControlCollection()
\r
541 return new EmptyControlCollection(this);
\r
544 protected override void LoadViewState(object savedState)
\r
546 if(savedState!=null)
\r
548 //TODO: Implement me
\r
549 //object[] states = (object[]) savedState;
\r
550 //loadViewState of all the states/styles
\r
554 protected override object SaveViewState()
\r
556 //TODO: Implement me
\r
557 // SaveViewState of all the styles
\r
560 protected override void TrackViewState()
\r
562 base.TrackViewState();
\r
563 if(titleStyle!=null)
\r
565 titleStyle.TrackViewState();
\r
567 if(nextPrevStyle!=null)
\r
569 nextPrevStyle.TrackViewState();
\r
573 dayStyle.TrackViewState();
\r
575 if(dayHeaderStyle!=null)
\r
577 dayHeaderStyle.TrackViewState();
\r
579 if(todayDayStyle!=null)
\r
581 todayDayStyle.TrackViewState();
\r
583 if(weekendDayStyle!=null)
\r
585 weekendDayStyle.TrackViewState();
\r
587 if(otherMonthStyle!=null)
\r
589 otherMonthStyle.TrackViewState();
\r
591 if(selectedDayStyle!=null)
\r
593 selectedDayStyle.TrackViewState();
\r
595 if(selectorStyle!=null)
\r
597 selectorStyle.TrackViewState();
\r
601 //TODO: Recheck, I am through with all the functions?
\r
603 private void RenderAllDays(HtmlTextWriter writer, DateTime firstDay, DateTime activeDate, CalendarSelectionMode mode, bool isActive, bool isDownLevel)
\r
605 //TODO: Implement me
\r
612 private void RenderHeader(HtmlTextWriter writer, DateTime firstDay, CalendarSelectionMode mode, bool isActive, bool isDownLevel)
\r
614 //TODO: Implement Me
\r
621 private void RenderTitle(HtmlTextWriter writer, DateTime visibleDate, CalendarSelectionMode mode, bool isActive)
\r
623 //TODO: Implement me
\r
625 * Make a row with the following contents: "<tr>"
\r
626 * Draw a table, with cell having the following properties
\r
627 * if(mode==CalendarSelectionMode.DayWeek || mode==CalendarSelectionMode.DayWeekMonth)
\r
628 * then draw a column with colspan=8
\r
630 * draw with colspan=7
\r
634 * ApplyStyleToTitle(table, cell, style)
\r
635 * RenderBeginTag(writer)
\r
636 * RenderBeginTag(writer)
\r
638 * -> The next/previous months things
\r
639 * GetCalendarText("previousMonth", PrevMonthText, NextPrevStyle.ForeColor, isActive)
\r
640 * RenderCalendarCell(writer, cell, ^^^)
\r
643 * Then for NextMonthText
\r
649 private void ApplyStyleToTitle(Table table, TableCell cell, TableItemStyle style)
\r
651 //TODO: Implement me
\r
659 * Vertical alignment
\r
663 private void RenderCalendarCell(HtmlTextWriter writer, TableCell cell, string text)
\r
665 cell.RenderBeginTag(writer);
\r
666 writer.Write(text);
\r
667 cell.RenderEndTag(writer);
\r
670 private DateTime SetFirstCalendarDay(DateTime visibleDate)
\r
672 globCal = visibleDate;
\r
673 //TODO: Implement me
\r
676 private DateTime GetEffectiveVisibleDate()
\r
678 DateTime dt = VisibleDate;
\r
679 if(dt.Equals(DateTime.MinValue))
\r
683 return new DateTime(globCal.GetYear(dt), globCal.GetMonth(dt), globCal.GetDayOfMonth(dt), globCal);
\r
687 * Creates text to be displayed, with all attributes if to be
\r
688 * shown as a hyperlink
\r
690 private string GetCalendarText(string eventArg, string text, Color foreground, bool isLink)
\r
694 StringBuilder dispVal = new StringBuilder();
\r
695 dispVal.Append("<a href=\"");
\r
696 dispVal.Append(Page.GetPostBackClientHyperlink(this, eventArg));
\r
697 dispVal.Append("\" style=\"color: ");
\r
698 if(foreground.IsEmpty)
\r
700 dispVal.Append(ColorTranslater.ToHtml(defaultTextColor);
\r
703 dispVal.Append(ColorTranslater.ToHtml(foreground);
\r
705 dispVal.Append("\">");
\r
706 dispVal.Append(text);
\r
707 dispVal.Append("</a>");
\r
708 return dispVal.ToString();
\r
713 private string GetHtmlForCell(TableCell cell, bool showLinks)
\r
715 StringWriter sw = new StringWriter();
\r
716 HtmlTextWriter htw = new HtmlTextWriter(sw);
\r
717 RenderBeginTag(htw);
\r
720 //sw.Write(GetCalendarText(,,true, ForeColor));
\r
721 //TODO: Implement me
\r