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
8 * Implementation: yes
\r
11 * (C) Gaurav Vaish (2001)
\r
16 using System.Collections;
\r
17 using System.Globalization;
\r
20 using System.Web.UI;
\r
21 using System.Drawing;
\r
22 using System.ComponentModel;
\r
24 namespace System.Web.UI.WebControls
\r
26 [DefaultEvent("SelectionChanged")]
\r
27 [DefaultProperty("SelectedDate")]
\r
28 //TODO: [Designer("??")]
\r
29 //[DataBindingHandler("??")]
\r
30 public class Calendar : WebControl, IPostBackEventHandler
\r
33 private TableItemStyle dayHeaderStyle;
\r
34 private TableItemStyle dayStyle;
\r
35 private TableItemStyle nextPrevStyle;
\r
36 private TableItemStyle otherMonthDayStyle;
\r
37 private SelectedDatesCollection selectedDates;
\r
38 private ArrayList selectedDatesList;
\r
39 private TableItemStyle selectedDayStyle;
\r
40 private TableItemStyle selectorStyle;
\r
41 private TableItemStyle titleStyle;
\r
42 private TableItemStyle todayDayStyle;
\r
43 private TableItemStyle weekendDayStyle;
\r
45 private static readonly object DayRenderEvent = new object();
\r
46 private static readonly object SelectionChangedEvent = new object();
\r
47 private static readonly object VisibleMonthChangedEvent = new object();
\r
49 private Color defaultTextColor;
\r
50 private System.Globalization.Calendar globCal;
\r
51 private DateTimeFormatInfo infoCal = DateTimeFormatInfo.CurrentInfo;
\r
53 private static int MASK_WEEKEND = (0x01 << 0);
\r
54 private static int MASK_OMONTH = (0x01 << 1);
\r
55 private static int MASK_TODAY = (0x01 << 2);
\r
56 private static int MASK_SELECTED = (0x01 << 3);
\r
57 private static int MASK_DAY = (0x01 << 4);
\r
58 private static int MASK_UNIQUE = MASK_WEEKEND | MASK_OMONTH | MASK_TODAY | MASK_SELECTED;
\r
60 public Calendar(): base()
\r
62 //TODO: Initialization
\r
65 public int CellPadding
\r
69 object o = ViewState["CellPadding"];
\r
76 ViewState["CellPadding"] = value;
\r
80 public int CellSpacing
\r
84 object o = ViewState["CellSpacing"];
\r
92 throw new ArgumentOutOfRangeException();
\r
93 ViewState["CellSpacing"] = value;
\r
97 public TableItemStyle DayHeaderStyle
\r
101 if(dayHeaderStyle==null)
\r
102 dayHeaderStyle = new TableItemStyle();
\r
103 if(IsTrackingViewState)
\r
104 dayHeaderStyle.TrackViewState();
\r
105 return dayHeaderStyle;
\r
109 public DayNameFormat DayNameFormat
\r
113 object o = ViewState["DayNameFormat"];
\r
115 return (DayNameFormat)o;
\r
116 return DayNameFormat.Short;
\r
120 if(!System.Enum.IsDefined(typeof(DayNameFormat),value))
\r
121 throw new ArgumentException();
\r
122 ViewState["DayNameFormat"] = value;
\r
126 public TableItemStyle DayStyle
\r
131 dayStyle = new TableItemStyle();
\r
132 if(IsTrackingViewState)
\r
133 dayStyle.TrackViewState();
\r
138 public FirstDayOfWeek FirstDayOfWeek
\r
142 object o = ViewState["FirstDayOfWeek"];
\r
144 return (FirstDayOfWeek)o;
\r
145 return FirstDayOfWeek.Default;
\r
149 if(!System.Enum.IsDefined(typeof(FirstDayOfWeek), value))
\r
150 throw new ArgumentException();
\r
151 ViewState["FirstDayOfWeek"] = value;
\r
155 public string NextMonthText
\r
159 object o = ViewState["NextMonthText"];
\r
166 ViewState["NextMonthText"] = value;
\r
170 public NextPrevFormat NextPrevFormat
\r
174 object o = ViewState["NextPrevFormat"];
\r
176 return (NextPrevFormat)o;
\r
177 return NextPrevFormat.CustomText;
\r
181 if(!System.Enum.IsDefined(typeof(NextPrevFormat), value))
\r
182 throw new ArgumentException();
\r
183 ViewState["NextPrevFormat"] = value;
\r
187 public TableItemStyle NextPrevStyle
\r
191 if(nextPrevStyle == null)
\r
192 nextPrevStyle = new TableItemStyle();
\r
193 if(IsTrackingViewState)
\r
194 nextPrevStyle.TrackViewState();
\r
195 return nextPrevStyle;
\r
199 public TableItemStyle OtherMonthDayStyle
\r
203 if(otherMonthDayStyle == null)
\r
204 otherMonthDayStyle = new TableItemStyle();
\r
205 if(IsTrackingViewState)
\r
206 otherMonthDayStyle.TrackViewState();
\r
207 return otherMonthDayStyle;
\r
211 public string PrevMonthText
\r
215 object o = ViewState["PrevMonthText"];
\r
222 ViewState["PrevMonthText"] = value;
\r
226 public DateTime SelectedDate
\r
230 if(SelectedDates.Count > 0)
\r
232 return SelectedDates[0];
\r
234 return DateTime.MinValue;
\r
238 if(value == DateTime.MinValue)
\r
240 SelectedDates.Clear();
\r
243 SelectedDates.SelectRange(value, value);
\r
248 public SelectedDatesCollection SelectedDates
\r
252 if(selectedDates==null)
\r
254 if(selectedDatesList == null)
\r
255 selectedDatesList = new ArrayList();
\r
256 selectedDates = new SelectedDatesCollection(selectedDatesList);
\r
258 return selectedDates;
\r
262 public TableItemStyle SelectedDayStyle
\r
266 if(selectedDayStyle==null)
\r
267 selectedDayStyle = new TableItemStyle();
\r
268 if(IsTrackingViewState)
\r
269 selectedDayStyle.TrackViewState();
\r
270 return selectedDayStyle;
\r
274 public CalendarSelectionMode SelectionMode
\r
278 object o = ViewState["SelectionMode"];
\r
280 return (CalendarSelectionMode)o;
\r
281 return CalendarSelectionMode.Day;
\r
285 if(!System.Enum.IsDefined(typeof(CalendarSelectionMode), value))
\r
286 throw new ArgumentException();
\r
287 ViewState["SelectionMode"] = value;
\r
291 public string SelectMonthText
\r
295 object o = ViewState["SelectMonthText"];
\r
302 ViewState["SelectMonthText"] = value;
\r
306 public TableItemStyle SelectorStyle
\r
310 if(selectorStyle==null)
\r
311 selectorStyle = new TableItemStyle();
\r
312 return selectorStyle;
\r
316 public string SelectWeekText
\r
320 object o = ViewState["SelectWeekText"];
\r
327 ViewState["SelectWeekText"] = value;
\r
331 public bool ShowDayHeader
\r
335 object o = ViewState["ShowDayHeader"];
\r
342 ViewState["ShowDayHeader"] = value;
\r
346 public bool ShowGridLines
\r
350 object o = ViewState["ShowGridLines"];
\r
357 ViewState["ShowGridLines"] = value;
\r
361 public bool ShowNextPrevMonth
\r
365 object o = ViewState["ShowNextPrevMonth"];
\r
372 ViewState["ShowNextPrevMonth"] = value;
\r
376 public bool ShowTitle
\r
380 object o = ViewState["ShowTitle"];
\r
387 ViewState["ShowTitle"] = value;
\r
391 public TitleFormat TitleFormat
\r
395 object o = ViewState["TitleFormat"];
\r
397 return (TitleFormat)o;
\r
398 return TitleFormat.MonthYear;
\r
402 if(!System.Enum.IsDefined(typeof(TitleFormat), value))
\r
403 throw new ArgumentException();
\r
404 ViewState["TitleFormat"] = value;
\r
408 public TableItemStyle TitleStyle
\r
412 if(titleStyle==null)
\r
413 titleStyle = new TableItemStyle();
\r
414 if(IsTrackingViewState)
\r
415 titleStyle.TrackViewState();
\r
420 public TableItemStyle TodayDayStyle
\r
424 if(todayDayStyle==null)
\r
425 todayDayStyle = new TableItemStyle();
\r
426 if(IsTrackingViewState)
\r
427 todayDayStyle.TrackViewState();
\r
428 return todayDayStyle;
\r
432 public DateTime TodaysDate
\r
436 object o = ViewState["TodaysDate"];
\r
438 return (DateTime)o;
\r
439 return DateTime.Today;
\r
443 ViewState["TodaysDate"] = value.Date;
\r
447 public DateTime VisibleDate
\r
451 object o = ViewState["VisibleDate"];
\r
453 return (DateTime)o;
\r
454 return DateTime.MinValue;
\r
458 ViewState["VisibleDate"] = value.Date;
\r
462 public TableItemStyle WeekendDayStyle
\r
466 if(weekendDayStyle == null)
\r
467 weekendDayStyle = new TableItemStyle();
\r
468 if(IsTrackingViewState)
\r
470 weekendDayStyle.TrackViewState();
\r
472 return weekendDayStyle;
\r
476 public event DayRenderEventHandler DayRender
\r
480 Events.AddHandler(DayRenderEvent, value);
\r
484 Events.RemoveHandler(DayRenderEvent, value);
\r
488 public event EventHandler SelectionChanged
\r
492 Events.AddHandler(SelectionChangedEvent, value);
\r
496 Events.RemoveHandler(SelectionChangedEvent, value);
\r
500 public event MonthChangedEventHandler VisibleMonthChanged
\r
504 Events.AddHandler(VisibleMonthChangedEvent, value);
\r
508 Events.RemoveHandler(VisibleMonthChangedEvent, value);
\r
512 protected virtual void OnDayRender(TableCell cell, CalendarDay day)
\r
516 DayRenderEventHandler dreh = (DayRenderEventHandler)(Events[DayRenderEvent]);
\r
518 dreh(this, new DayRenderEventArgs(cell, day));
\r
522 protected virtual void OnSelectionChanged()
\r
526 EventHandler eh = (EventHandler)(Events[SelectionChangedEvent]);
\r
528 eh(this, new EventArgs());
\r
532 protected virtual void OnVisibleMonthChanged(DateTime newDate, DateTime prevDate)
\r
536 MonthChangedEventHandler mceh = (MonthChangedEventHandler)(Events[VisibleMonthChangedEvent]);
\r
538 mceh(this, new MonthChangedEventArgs(newDate, prevDate));
\r
543 /// See test6.aspx in Tests directory for verification
\r
545 void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)
\r
547 globCal = DateTimeFormatInfo.CurrentInfo.Calendar;
\r
548 DateTime visDate = GetEffectiveVisibleDate();
\r
549 if(eventArgument == "nextMonth")
\r
551 VisibleDate = globCal.AddMonths(visDate, 1);
\r
552 OnVisibleMonthChanged(VisibleDate, visDate);
\r
555 if(eventArgument == "prevMonth")
\r
557 VisibleDate = globCal.AddMonths(visDate, -1);
\r
558 OnVisibleMonthChanged(VisibleDate, visDate);
\r
561 if(eventArgument == "selectMonth")
\r
563 DateTime oldDate = new DateTime(globCal.GetYear(visDate), globCal.GetMonth(visDate), 1, globCal);
\r
564 SelectRangeInternal(oldDate, globCal.AddDays(globCal.AddMonths(oldDate, 1), -1), visDate);
\r
567 if(String.Compare(eventArgument, 0, "selectWeek", 0, "selectWeek".Length)==0)
\r
572 week = Int32.Parse(eventArgument.Substring("selectWeek".Length));
\r
573 } catch(Exception e)
\r
576 if(week >= 0 && week <= 5)
\r
578 DateTime weekStart = globCal.AddDays(GetFirstCalendarDay(visDate), week * 7);
\r
579 SelectRangeInternal(weekStart, globCal.AddDays(weekStart, 6), visDate);
\r
583 if(String.Compare(eventArgument, 0, "selectDay", 0, "selectDay".Length)==0)
\r
588 day = Int32.Parse(eventArgument.Substring("selectDay".Length));
\r
589 } catch(Exception e)
\r
592 if(day >= 0 && day <= 42)
\r
594 DateTime dayStart = globCal.AddDays(GetFirstCalendarDay(visDate), day);
\r
595 SelectRangeInternal(dayStart, dayStart, visDate);
\r
600 protected override void Render(HtmlTextWriter writer)
\r
602 //TODO: Implement me
\r
603 globCal = DateTimeFormatInfo.CurrentInfo.Calendar;
\r
604 DateTime visDate = GetEffectiveVisibleDate();
\r
605 DateTime firstDate = GetFirstCalendarDay(visDate);
\r
608 bool isHtmlTextWriter;
\r
609 //FIXME: when Control.Site works, reactivate this
\r
610 //if (Page == null || Site == null) {
\r
611 // isEnabled = false;
\r
612 // isHtmlTextWriter = false;
\r
614 isEnabled = Enabled;
\r
615 isHtmlTextWriter = (writer.GetType() != typeof(HtmlTextWriter));
\r
617 defaultTextColor = ForeColor;
\r
618 if(defaultTextColor == Color.Empty)
\r
619 defaultTextColor = Color.Black;
\r
621 Table calTable = new Table ();
\r
623 calTable.CopyBaseAttributes(this);
\r
624 if(ControlStyleCreated)
\r
625 ApplyStyle(ControlStyle);
\r
626 calTable.Width = Width;
\r
627 calTable.Height = Height;
\r
628 calTable.CellSpacing = CellSpacing;
\r
629 calTable.CellPadding = CellPadding;
\r
631 if (ControlStyleCreated &&
\r
632 ControlStyle.IsSet (WebControls.Style.BORDERWIDTH) &&
\r
633 BorderWidth != Unit.Empty)
\r
634 calTable.BorderWidth = BorderWidth;
\r
636 calTable.BorderWidth = Unit.Pixel(1);
\r
639 calTable.GridLines = GridLines.Both;
\r
641 calTable.GridLines = GridLines.None;
\r
643 calTable.RenderBeginTag (writer);
\r
646 RenderTitle (writer, visDate, SelectionMode, isEnabled);
\r
649 RenderHeader (writer, firstDate, SelectionMode, isEnabled, isHtmlTextWriter);
\r
651 RenderAllDays (writer, firstDate, visDate, SelectionMode, isEnabled, isHtmlTextWriter);
\r
653 calTable.RenderEndTag(writer);
\r
656 protected override ControlCollection CreateControlCollection()
\r
658 return new EmptyControlCollection(this);
\r
661 protected override void LoadViewState(object savedState)
\r
663 if(savedState!=null)
\r
665 if(ViewState["_CalendarSelectedDates"] != null)
\r
666 selectedDates = (SelectedDatesCollection)ViewState["_CalendarSelectedDates"];
\r
668 object[] states = (object[]) savedState;
\r
669 if(states[0] != null)
\r
670 base.LoadViewState(states[0]);
\r
671 if(states[1] != null)
\r
672 DayHeaderStyle.LoadViewState(states[1]);
\r
673 if(states[2] != null)
\r
674 DayStyle.LoadViewState(states[2]);
\r
675 if(states[3] != null)
\r
676 NextPrevStyle.LoadViewState(states[3]);
\r
677 if(states[4] != null)
\r
678 OtherMonthDayStyle.LoadViewState(states[4]);
\r
679 if(states[5] != null)
\r
680 SelectedDayStyle.LoadViewState(states[5]);
\r
681 if(states[6] != null)
\r
682 SelectorStyle.LoadViewState(states[6]);
\r
683 if(states[7] != null)
\r
684 TitleStyle.LoadViewState(states[7]);
\r
685 if(states[8] != null)
\r
686 TodayDayStyle.LoadViewState(states[8]);
\r
687 if(states[9] != null)
\r
688 WeekendDayStyle.LoadViewState(states[9]);
\r
692 protected override object SaveViewState()
\r
694 ViewState["_CalendarSelectedDates"] = (SelectedDates.Count > 0 ? selectedDates : null);
\r
695 object[] states = new object[11];
\r
696 states[0] = base.SaveViewState();
\r
697 states[1] = (dayHeaderStyle == null ? null : dayHeaderStyle.SaveViewState());
\r
698 states[2] = (dayStyle == null ? null : dayStyle.SaveViewState());
\r
699 states[3] = (nextPrevStyle == null ? null : nextPrevStyle.SaveViewState());
\r
700 states[4] = (otherMonthDayStyle == null ? null : otherMonthDayStyle.SaveViewState());
\r
701 states[5] = (selectedDayStyle == null ? null : selectedDayStyle.SaveViewState());
\r
702 states[6] = (selectorStyle == null ? null : selectorStyle.SaveViewState());
\r
703 states[7] = (titleStyle == null ? null : titleStyle.SaveViewState());
\r
704 states[8] = (todayDayStyle == null ? null : todayDayStyle.SaveViewState());
\r
705 states[9] = (weekendDayStyle == null ? null : weekendDayStyle.SaveViewState());
\r
706 for(int i=0; i < states.Length; i++)
\r
708 if(states[i]!=null)
\r
714 protected override void TrackViewState()
\r
716 base.TrackViewState();
\r
717 if(titleStyle!=null)
\r
719 titleStyle.TrackViewState();
\r
721 if(nextPrevStyle!=null)
\r
723 nextPrevStyle.TrackViewState();
\r
727 dayStyle.TrackViewState();
\r
729 if(dayHeaderStyle!=null)
\r
731 dayHeaderStyle.TrackViewState();
\r
733 if(todayDayStyle!=null)
\r
735 todayDayStyle.TrackViewState();
\r
737 if(weekendDayStyle!=null)
\r
739 weekendDayStyle.TrackViewState();
\r
741 if(otherMonthDayStyle!=null)
\r
743 otherMonthDayStyle.TrackViewState();
\r
745 if(selectedDayStyle!=null)
\r
747 selectedDayStyle.TrackViewState();
\r
749 if(selectorStyle!=null)
\r
751 selectorStyle.TrackViewState();
\r
755 private void RenderAllDays (HtmlTextWriter writer,
\r
757 DateTime activeDate,
\r
758 CalendarSelectionMode mode,
\r
762 TableItemStyle weeksStyle;
\r
763 TableCell weeksCell = new TableCell ();
\r
764 TableItemStyle weekendStyle = WeekendDayStyle;
\r
765 TableItemStyle otherMonthStyle = OtherMonthDayStyle;
\r
767 bool isWeekMode = (mode == CalendarSelectionMode.DayWeek ||
\r
768 mode == CalendarSelectionMode.DayWeekMonth);
\r
771 weeksStyle = new TableItemStyle ();
\r
772 weeksStyle.Width = Unit.Percentage (12);
\r
773 weeksStyle.HorizontalAlign = HorizontalAlign.Center;
\r
774 weeksStyle.CopyFrom (SelectorStyle);
\r
775 size = Unit.Percentage (12);
\r
777 size = Unit.Percentage (14);
\r
780 TableItemStyle [] styles = new TableItemStyle [16];
\r
781 int definedStyles = MASK_SELECTED;
\r
782 if (weekendStyle != null && !weekendStyle.IsEmpty)
\r
783 definedStyles |= MASK_WEEKEND;
\r
784 if (otherMonthStyle != null && !otherMonthStyle.IsEmpty)
\r
785 definedStyles |= MASK_OMONTH;
\r
786 if (todayDayStyle != null && !todayDayStyle.IsEmpty)
\r
787 definedStyles |= MASK_TODAY;
\r
788 if (dayStyle != null && !dayStyle.IsEmpty)
\r
789 definedStyles |= MASK_DAY;
\r
791 bool isCalendar = GetType () == typeof (Calendar);
\r
792 int month = globCal.GetMonth (activeDate);
\r
793 DateTime currentDay = firstDay;
\r
794 for (int crr = 0; crr < 6; crr++) {
\r
795 writer.Write ("<tr>");
\r
797 string cellText = GetCalendarLinkText (
\r
798 "selectWeek" + crr.ToString (),
\r
800 weeksCell.ForeColor,
\r
803 weeksCell.Text = cellText;
\r
804 RenderCalendarCell (writer, weeksCell, cellText);
\r
807 for (int weekDay = 0; weekDay < 7; weekDay++) {
\r
808 string dayString = currentDay.Day.ToString ();
\r
809 CalendarDay calDay =
\r
813 currentDay == TodaysDate,
\r
814 selectedDates.Contains (currentDay),
\r
815 globCal.GetMonth (currentDay) != month,
\r
820 int dayStyles = GetMask (calDay) & definedStyles;
\r
821 TableItemStyle currentDayStyle = styles [dayStyles];
\r
822 if (currentDayStyle == null) {
\r
823 currentDayStyle = new TableItemStyle ();
\r
824 if ((dayStyles & MASK_DAY) != 0)
\r
825 currentDayStyle.CopyFrom (DayStyle);
\r
827 if ((dayStyles & MASK_WEEKEND) != 0)
\r
828 currentDayStyle.CopyFrom (WeekendDayStyle);
\r
830 if ((dayStyles & MASK_TODAY) != 0)
\r
831 currentDayStyle.CopyFrom (TodayDayStyle);
\r
833 if ((dayStyles & MASK_OMONTH) != 0)
\r
834 currentDayStyle.CopyFrom (OtherMonthDayStyle);
\r
836 if ((dayStyles & MASK_SELECTED) != 0) {
\r
837 currentDayStyle.ForeColor = Color.White;
\r
838 currentDayStyle.BackColor = Color.Silver;
\r
839 currentDayStyle.CopyFrom (SelectedDayStyle);
\r
842 currentDayStyle.Width = size;
\r
843 currentDayStyle.HorizontalAlign = HorizontalAlign.Center;
\r
846 TableCell dayCell = new TableCell ();
\r
847 dayCell.ApplyStyle (currentDayStyle);
\r
848 calDay.IsSelectable = isActive;
\r
849 OnDayRender (dayCell, calDay);
\r
851 dayCell.Text = GetCalendarLinkText (
\r
852 "selectDay" + (crr * 7 + weekDay),
\r
857 dayCell.Text = dayString;
\r
859 dayCell.RenderControl (writer);
\r
861 currentDay = globCal.AddDays (currentDay, 1);
\r
863 writer.Write("</tr>");
\r
867 private int GetMask (CalendarDay day)
\r
869 int retVal = MASK_DAY;
\r
871 retVal |= MASK_SELECTED;
\r
873 retVal |= MASK_TODAY;
\r
874 if(day.IsOtherMonth)
\r
875 retVal |= MASK_OMONTH;
\r
877 retVal |= MASK_WEEKEND;
\r
882 /// Refers to the second line of the calendar, that contains a link
\r
883 /// to select whole month, and weekdays as defined by DayNameFormat
\r
885 private void RenderHeader (HtmlTextWriter writer,
\r
887 CalendarSelectionMode mode,
\r
891 writer.Write("<tr>");
\r
892 bool isWeekMode = (mode == CalendarSelectionMode.DayWeek ||
\r
893 mode == CalendarSelectionMode.DayWeekMonth);
\r
895 TableCell headerCell = new TableCell ();
\r
896 headerCell.HorizontalAlign = HorizontalAlign.Center;
\r
897 string selMthText = String.Empty;
\r
899 if (mode == CalendarSelectionMode.DayWeekMonth) {
\r
900 headerCell.ApplyStyle (SelectorStyle);
\r
901 selMthText = GetCalendarLinkText ("selectMonth",
\r
903 SelectorStyle.ForeColor,
\r
906 headerCell.ApplyStyle (DayHeaderStyle);
\r
907 selMthText = String.Empty;
\r
909 RenderCalendarCell (writer, headerCell, selMthText);
\r
912 TableCell dayHeaderCell = new TableCell ();
\r
913 dayHeaderCell.HorizontalAlign = HorizontalAlign.Center;
\r
915 int dayOfWeek = (int) globCal.GetDayOfWeek (firstDay);
\r
916 DateTimeFormatInfo currDTInfo = DateTimeFormatInfo.CurrentInfo;
\r
917 for(int currDay = dayOfWeek; currDay < dayOfWeek + 7; currDay++) {
\r
918 DayOfWeek effDay = (DayOfWeek) Enum.ToObject (typeof (DayOfWeek), currDay % 7);
\r
919 string currDayContent;
\r
920 switch(DayNameFormat) {
\r
921 case DayNameFormat.Full:
\r
922 currDayContent = currDTInfo.GetDayName (effDay);
\r
924 case DayNameFormat.FirstLetter:
\r
925 currDayContent = currDTInfo.GetDayName (effDay).Substring (0,1);
\r
927 case DayNameFormat.FirstTwoLetters:
\r
928 currDayContent = currDTInfo.GetDayName (effDay).Substring (0,2);
\r
930 case DayNameFormat.Short:
\r
933 currDayContent = currDTInfo.GetAbbreviatedDayName (effDay);
\r
937 RenderCalendarCell(writer, dayHeaderCell, currDayContent);
\r
939 writer.Write ("</tr>");
\r
942 private void RenderTitle (HtmlTextWriter writer,
\r
943 DateTime visibleDate,
\r
944 CalendarSelectionMode mode,
\r
947 writer.Write("<tr>");
\r
948 Table innerTable = new Table ();
\r
949 TableCell titleCell = new TableCell();
\r
950 bool isWeekMode = (mode == CalendarSelectionMode.DayWeek ||
\r
951 mode == CalendarSelectionMode.DayWeekMonth);
\r
953 titleCell.ColumnSpan = (isWeekMode ? 8 : 7);
\r
954 titleCell.BackColor = Color.Silver;
\r
956 innerTable.GridLines = GridLines.None;
\r
957 innerTable.Width = Unit.Percentage (100);
\r
958 innerTable.CellSpacing = 0;
\r
959 ApplyTitleStyle (innerTable, titleCell, TitleStyle);
\r
961 titleCell.RenderBeginTag (writer);
\r
962 innerTable.RenderBeginTag (writer);
\r
964 writer.Write ("<tr>");
\r
965 string prevContent = String.Empty;
\r
966 if (ShowNextPrevMonth) {
\r
967 TableCell prevCell = new TableCell ();
\r
968 prevCell.Width = Unit.Percentage (15);
\r
969 prevCell.HorizontalAlign = HorizontalAlign.Left;
\r
970 if (NextPrevFormat == NextPrevFormat.CustomText) {
\r
971 prevContent = PrevMonthText;
\r
973 int pMthInt = globCal.GetMonth(globCal.AddMonths (visibleDate, -1));
\r
974 if (NextPrevFormat == NextPrevFormat.FullMonth)
\r
975 prevContent = infoCal.GetMonthName (pMthInt);
\r
977 prevContent = infoCal.GetAbbreviatedMonthName (pMthInt);
\r
979 prevCell.ApplyStyle (NextPrevStyle);
\r
980 RenderCalendarCell (writer,
\r
982 GetCalendarLinkText ("prevMonth",
\r
984 NextPrevStyle.ForeColor,
\r
989 TableCell currCell = new TableCell ();
\r
990 currCell.Width = Unit.Percentage (70);
\r
991 if (TitleStyle.HorizontalAlign == HorizontalAlign.NotSet)
\r
992 currCell.HorizontalAlign = HorizontalAlign.Center;
\r
994 currCell.HorizontalAlign = TitleStyle.HorizontalAlign;
\r
996 currCell.Wrap = TitleStyle.Wrap;
\r
997 string currMonthContent = String.Empty;
\r
998 if (TitleFormat == TitleFormat.Month) {
\r
999 currMonthContent = visibleDate.ToString ("MMMM");
\r
1001 string cmcFmt = infoCal.YearMonthPattern;
\r
1002 if (cmcFmt.IndexOf (',') >= 0)
\r
1003 cmcFmt = "MMMM yyyy";
\r
1005 currMonthContent = visibleDate.ToString (cmcFmt);
\r
1008 RenderCalendarCell (writer, currCell, currMonthContent);
\r
1010 string nextContent = String.Empty;
\r
1011 if (ShowNextPrevMonth) {
\r
1012 TableCell nextCell = new TableCell ();
\r
1013 nextCell.Width = Unit.Percentage(15);
\r
1014 nextCell.HorizontalAlign = HorizontalAlign.Left;
\r
1015 if (NextPrevFormat == NextPrevFormat.CustomText) {
\r
1016 nextContent = NextMonthText;
\r
1018 int nMthInt = globCal.GetMonth (globCal.AddMonths (visibleDate, 1));
\r
1019 if(NextPrevFormat == NextPrevFormat.FullMonth)
\r
1020 nextContent = infoCal.GetMonthName(nMthInt);
\r
1022 nextContent = infoCal.GetAbbreviatedMonthName(nMthInt);
\r
1024 nextCell.ApplyStyle(NextPrevStyle);
\r
1025 RenderCalendarCell (writer,
\r
1027 GetCalendarLinkText ("nextMonth",
\r
1029 NextPrevStyle.ForeColor,
\r
1034 writer.Write("</tr>");
\r
1035 innerTable.RenderEndTag(writer);
\r
1036 titleCell.RenderEndTag(writer);
\r
1038 writer.Write("</tr>");
\r
1041 private void ApplyTitleStyle(Table table, TableCell cell, TableItemStyle style)
\r
1043 if(style.BackColor != Color.Empty)
\r
1045 cell.BackColor = style.BackColor;
\r
1047 if(style.BorderStyle != BorderStyle.NotSet)
\r
1049 cell.BorderStyle = style.BorderStyle;
\r
1051 if(style.BorderColor != Color.Empty)
\r
1053 cell.BorderColor = style.BorderColor;
\r
1055 if(style.BorderWidth != Unit.Empty)
\r
1057 cell.BorderWidth = style.BorderWidth;
\r
1059 if(style.Height != Unit.Empty)
\r
1061 cell.Height = style.Height;
\r
1063 if(style.VerticalAlign != VerticalAlign.NotSet)
\r
1065 cell.VerticalAlign = style.VerticalAlign;
\r
1068 if(style.ForeColor != Color.Empty)
\r
1070 table.ForeColor = style.ForeColor;
\r
1071 } else if(ForeColor != Color.Empty)
\r
1073 table.ForeColor = ForeColor;
\r
1076 table.Font.CopyFrom(style.Font);
\r
1077 table.Font.MergeWith(Font);
\r
1080 private void RenderCalendarCell (HtmlTextWriter writer, TableCell cell, string text)
\r
1082 cell.RenderBeginTag(writer);
\r
1083 writer.Write(text);
\r
1084 cell.RenderEndTag(writer);
\r
1087 private DateTime GetFirstCalendarDay(DateTime visibleDate)
\r
1089 int fow = (int) FirstDayOfWeek;
\r
1091 fow = (int) infoCal.FirstDayOfWeek;
\r
1093 int days = (int) globCal.GetDayOfWeek (visibleDate) - fow;
\r
1096 return globCal.AddDays (visibleDate, -days);
\r
1099 private DateTime GetEffectiveVisibleDate()
\r
1101 DateTime dt = VisibleDate;
\r
1102 if (VisibleDate == DateTime.MinValue)
\r
1104 return globCal.AddDays (dt, 1 - globCal.GetDayOfMonth (dt));
\r
1108 /// Creates text to be displayed, with all attributes if to be
\r
1109 /// shown as a hyperlink
\r
1111 private string GetCalendarLinkText (string eventArg,
\r
1117 StringBuilder dispVal = new StringBuilder ();
\r
1118 dispVal.Append ("<a href=\"");
\r
1119 dispVal.Append (Page.GetPostBackClientHyperlink (this, eventArg));
\r
1120 dispVal.Append ("\" style=\"color: ");
\r
1121 if (foreground.IsEmpty) {
\r
1122 dispVal.Append (ColorTranslator.ToHtml (defaultTextColor));
\r
1124 dispVal.Append (ColorTranslator.ToHtml (foreground));
\r
1126 dispVal.Append ("\">");
\r
1127 dispVal.Append (text);
\r
1128 dispVal.Append ("</a>");
\r
1129 return dispVal.ToString ();
\r
1134 private string GetHtmlForCell (TableCell cell, bool showLinks)
\r
1136 StringWriter sw = new StringWriter ();
\r
1137 HtmlTextWriter htw = new HtmlTextWriter (sw);
\r
1138 cell.RenderBeginTag (htw);
\r
1140 htw.Write (GetCalendarLinkText ("{0}", "{1}", cell.ForeColor, showLinks));
\r
1142 htw.Write ("{0}");
\r
1144 cell.RenderEndTag (htw);
\r
1145 return sw.ToString();
\r
1148 internal void SelectRangeInternal (DateTime fromDate, DateTime toDate, DateTime visibleDate)
\r
1150 TimeSpan span = toDate - fromDate;
\r
1151 if (SelectedDates.Count != span.Days + 1 ||
\r
1152 SelectedDates [0] != fromDate ||
\r
1153 SelectedDates [SelectedDates.Count - 1] != toDate) {
\r
1154 SelectedDates.SelectRange (fromDate, toDate);
\r
1155 OnSelectionChanged ();
\r