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
23 namespace System.Web.UI.WebControls
\r
25 public class Calendar : WebControl, IPostBackEventHandler
\r
29 private TableItemStyle dayHeaderStyle;
\r
30 private TableItemStyle dayStyle;
\r
31 private TableItemStyle nextPrevStyle;
\r
32 private TableItemStyle otherMonthDayStyle;
\r
33 private SelectedDatesCollection selectedDates;
\r
34 private ArrayList selectedDatesList;
\r
35 private TableItemStyle selectedDayStyle;
\r
36 private TableItemStyle selectorStyle;
\r
37 private TableItemStyle titleStyle;
\r
38 private TableItemStyle todayDayStyle;
\r
39 private TableItemStyle weekendDayStyle;
\r
41 private static readonly object DayRenderEvent = new object();
\r
42 private static readonly object SelectionChangedEvent = new object();
\r
43 private static readonly object VisibleMonthChangedEvent = new object();
\r
45 private Color defaultTextColor;
\r
46 private System.Globalization.Calendar globCal;
\r
48 private static int MASK_WEEKEND = (0x01 << 0);
\r
49 private static int MASK_OMONTH = (0x01 << 1);
\r
50 private static int MASK_TODAY = (0x01 << 2);
\r
51 private static int MASK_SELECTED = (0x01 << 3);
\r
52 private static int MASK_DAY = (0x01 << 4);
\r
53 private static int MASK_UNIQUE = MASK_WEEKEND | MASK_OMONTH | MASK_TODAY | MASK_SELECTED;
\r
55 public Calendar(): base()
\r
57 //TODO: Initialization
\r
60 public int CellPadding
\r
64 object o = ViewState["CellPadding"];
\r
71 ViewState["CellPadding"] = value;
\r
75 public int CellSpacing
\r
79 object o = ViewState["CellSpacing"];
\r
87 throw new ArgumentOutOfRangeException();
\r
88 ViewState["CellSpacing"] = value;
\r
92 public TableItemStyle DayHeaderStyle
\r
96 if(dayHeaderStyle==null)
\r
97 dayHeaderStyle = new TableItemStyle();
\r
98 if(IsTrackingViewState)
\r
99 dayHeaderStyle.TrackViewState();
\r
100 return dayHeaderStyle;
\r
104 public DayNameFormat DayNameFormat
\r
108 object o = ViewState["DayNameFormat"];
\r
110 return (DayNameFormat)o;
\r
111 return DayNameFormat.Short;
\r
115 if(!System.Enum.IsDefined(typeof(DayNameFormat),value))
\r
116 throw new ArgumentException();
\r
117 ViewState["DayNameFormat"] = value;
\r
121 public TableItemStyle DayStyle
\r
126 dayStyle = new TableItemStyle();
\r
127 if(IsTrackingViewState)
\r
128 dayStyle.TrackViewState();
\r
133 public FirstDayOfWeek FirstDayOfWeek
\r
137 object o = ViewState["FirstDayOfWeek"];
\r
139 return (FirstDayOfWeek)o;
\r
140 return FirstDayOfWeek.Default;
\r
144 if(!System.Enum.IsDefined(typeof(FirstDayOfWeek), value))
\r
145 throw new ArgumentException();
\r
146 ViewState["FirstDayOfWeek"] = value;
\r
150 public string NextMonthText
\r
154 object o = ViewState["NextMonthText"];
\r
161 ViewState["NextMonthText"] = value;
\r
165 public NextPrevFormat NextPrevFormat
\r
169 object o = ViewState["NextPrevFormat"];
\r
171 return (NextPrevFormat)o;
\r
172 return NextPrevFormat.CustomText;
\r
176 if(!System.Enum.IsDefined(typeof(NextPrevFormat), value))
\r
177 throw new ArgumentException();
\r
178 ViewState["NextPrevFormat"] = value;
\r
182 public TableItemStyle NextPrevStyle
\r
186 if(nextPrevStyle == null)
\r
187 nextPrevStyle = new TableItemStyle();
\r
188 if(IsTrackingViewState)
\r
189 nextPrevStyle.TrackViewState();
\r
190 return nextPrevStyle;
\r
194 public TableItemStyle OtherMonthDayStyle
\r
198 if(otherMonthDayStyle == null)
\r
199 otherMonthDayStyle = new TableItemStyle();
\r
200 if(IsTrackingViewState)
\r
201 otherMonthDayStyle.TrackViewState();
\r
202 return otherMonthDayStyle;
\r
206 public string PrevMonthText
\r
210 object o = ViewState["PrevMonthText"];
\r
217 ViewState["PrevMonthText"] = value;
\r
221 public DateTime SelectedDate
\r
225 if(SelectedDates.Count > 0)
\r
227 return SelectedDates[0];
\r
229 return DateTime.MinValue;
\r
233 if(value == DateTime.MinValue)
\r
235 SelectedDates.Clear();
\r
238 SelectedDates.SelectRange(value, value);
\r
243 public SelectedDatesCollection SelectedDates
\r
247 if(selectedDates==null)
\r
249 if(selectedDatesList == null)
\r
250 selectedDatesList = new ArrayList();
\r
251 selectedDates = new SelectedDatesCollection(selectedDatesList);
\r
253 return selectedDates;
\r
257 public TableItemStyle SelectedDayStyle
\r
261 if(selectedDayStyle==null)
\r
262 selectedDayStyle = new TableItemStyle();
\r
263 if(IsTrackingViewState)
\r
264 selectedDayStyle.TrackViewState();
\r
265 return selectedDayStyle;
\r
269 public CalendarSelectionMode SelectionMode
\r
273 object o = ViewState["SelectionMode"];
\r
275 return (CalendarSelectionMode)o;
\r
276 return CalendarSelectionMode.Day;
\r
280 if(!System.Enum.IsDefined(typeof(CalendarSelectionMode), value))
\r
281 throw new ArgumentException();
\r
282 ViewState["SelectionMode"] = value;
\r
286 public string SelectedMonthText
\r
290 object o = ViewState["SelectedMonthText"];
\r
297 ViewState["SelectedMonthText"] = value;
\r
301 public TableItemStyle SelectorStyle
\r
305 if(selectorStyle==null)
\r
306 selectorStyle = new TableItemStyle();
\r
307 return selectorStyle;
\r
311 public string SelectWeekText
\r
315 object o = ViewState["SelectWeekText"];
\r
322 ViewState["SelectWeekText"] = value;
\r
326 public bool ShowDayHeader
\r
330 object o = ViewState["ShowDayHeader"];
\r
337 ViewState["ShowDayHeader"] = value;
\r
341 public bool ShowGridLines
\r
345 object o = ViewState["ShowGridLines"];
\r
352 ViewState["ShowGridLines"] = value;
\r
356 public bool ShowNextPrevMonth
\r
360 object o = ViewState["ShowNextPrevMonth"];
\r
367 ViewState["ShowNextPrevMonth"] = value;
\r
371 public bool ShowTitle
\r
375 object o = ViewState["ShowTitle"];
\r
382 ViewState["ShowTitle"] = value;
\r
386 public TitleFormat TitleFormat
\r
390 object o = ViewState["TitleFormat"];
\r
392 return (TitleFormat)o;
\r
393 return TitleFormat.MonthYear;
\r
397 if(!System.Enum.IsDefined(typeof(TitleFormat), value))
\r
398 throw new ArgumentException();
\r
399 ViewState["TitleFormat"] = value;
\r
403 public TableItemStyle TitleStyle
\r
407 if(titleStyle==null)
\r
408 titleStyle = new TableItemStyle();
\r
409 if(IsTrackingViewState)
\r
410 titleStyle.TrackViewState();
\r
415 public TableItemStyle TodayDayStyle
\r
419 if(todayDayStyle==null)
\r
420 todayDayStyle = new TableItemStyle();
\r
421 if(IsTrackingViewState)
\r
422 todayDayStyle.TrackViewState();
\r
423 return todayDayStyle;
\r
427 public DateTime TodaysDate
\r
431 object o = ViewState["TodaysDate"];
\r
433 return (DateTime)o;
\r
434 return DateTime.Today;
\r
438 ViewState["TodaysDate"] = value;
\r
442 public DateTime VisibleDate
\r
446 object o = ViewState["VisibleDate"];
\r
448 return (DateTime)o;
\r
449 return DateTime.MinValue;
\r
453 ViewState["VisibleDate"] = value;
\r
457 public TableItemStyle WeekendDayStyle
\r
461 if(weekendDayStyle == null)
\r
462 weekendDayStyle = new TableItemStyle();
\r
463 if(IsTrackingViewState)
\r
465 weekendDayStyle.TrackViewState();
\r
467 return weekendDayStyle;
\r
471 public event DayRenderEventHandler DayRender
\r
475 Events.AddHandler(DayRenderEvent, value);
\r
479 Events.RemoveHandler(DayRenderEvent, value);
\r
483 public event EventHandler SelectionChanged
\r
487 Events.AddHandler(SelectionChangedEvent, value);
\r
491 Events.RemoveHandler(SelectionChangedEvent, value);
\r
495 public event MonthChangedEventHandler VisibleMonthChanged
\r
499 Events.AddHandler(VisibleMonthChangedEvent, value);
\r
503 Events.RemoveHandler(VisibleMonthChangedEvent, value);
\r
507 protected virtual void OnDayRender(TableCell cell, CalendarDay day)
\r
511 DayRenderEventHandler dreh = (DayRenderEventHandler)(Events[DayRenderEvent]);
\r
513 dreh(this, new DayRenderEventArgs(cell, day));
\r
517 protected virtual void OnSelectionChanged()
\r
521 EventHandler eh = (EventHandler)(Events[SelectionChangedEvent]);
\r
523 eh(this, new EventArgs());
\r
527 protected virtual void OnVisibleMonthChanged(DateTime newDate, DateTime prevDate)
\r
531 MonthChangedEventHandler mceh = (MonthChangedEventHandler)(Events[VisibleMonthChangedEvent]);
\r
533 mceh(this, new MonthChangedEventArgs(newDate, prevDate));
\r
538 /// See test6.aspx in Tests directory for verification
\r
540 void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)
\r
542 globCal = DateTimeFormatInfo.CurrentInfo.Calendar;
\r
543 DateTime visDate = GetEffectiveVisibleDate();
\r
544 //FIXME: Should it be String.Compare(eventArgument, "nextMonth", false);
\r
545 if(eventArgument == "nextMonth")
\r
547 VisibleDate = globCal.AddMonths(visDate, 1);
\r
548 OnVisibleMonthChanged(VisibleDate, visDate);
\r
551 if(eventArgument == "prevMonth")
\r
553 VisibleDate = globCal.AddMonths(visDate, -1);
\r
554 OnVisibleMonthChanged(VisibleDate, visDate);
\r
557 if(eventArgument == "selectMonth")
\r
559 DateTime oldDate = new DateTime(globCal.GetYear(visDate), globCal.GetMonth(visDate), 1, globCal);
\r
560 SelectRangeInternal(oldDate, globCal.AddDays(globCal.AddMonths(oldDate, 1), -1), visDate);
\r
563 if(String.Compare(eventArgument, 0, "selectWeek", 0, "selectWeek".Length)==0)
\r
568 week = Int32.Parse(eventArgument.Substring("selectWeek".Length));
\r
569 } catch(Exception e)
\r
572 if(week >= 0 && week <= 5)
\r
574 DateTime weekStart = globCal.AddDays(GetFirstCalendarDay(visDate), week * 7);
\r
575 SelectRangeInternal(weekStart, globCal.AddDays(weekStart, 6), visDate);
\r
579 if(String.Compare(eventArgument, 0, "selectDay", 0, "selectDay".Length)==0)
\r
584 day = Int32.Parse(eventArgument.Substring("selectDay".Length));
\r
585 } catch(Exception e)
\r
588 if(day >= 0 && day <= 42)
\r
590 DateTime dayStart = globCal.AddDays(GetFirstCalendarDay(visDate), day);
\r
591 SelectRangeInternal(dayStart, dayStart, visDate);
\r
596 protected override void Render(HtmlTextWriter writer)
\r
598 //TODO: Implement me
\r
599 globCal = DateTimeFormatInfo.CurrentInfo.Calendar;
\r
600 DateTime visDate = GetEffectiveVisibleDate();
\r
601 DateTime firstDate = GetFirstCalendarDay(visDate);
\r
603 bool isEnabled = false;
\r
604 bool isHtmlTextWriter = false;
\r
605 if(Page == null || Site == null)
\r
608 isHtmlTextWriter = false;
\r
611 isEnabled = Enabled;
\r
612 isHtmlTextWriter = (writer.GetType() != typeof(HtmlTextWriter));
\r
614 defaultTextColor = ForeColor;
\r
615 if(defaultTextColor == Color.Empty)
\r
616 defaultTextColor = Color.Black;
\r
618 Table calTable = new Table();
\r
620 calTable.CopyBaseAttributes(this);
\r
621 if(ControlStyleCreated)
\r
622 ApplyStyle(ControlStyle);
\r
623 calTable.Width = Width;
\r
624 calTable.Height = Height;
\r
625 calTable.CellSpacing = CellSpacing;
\r
626 calTable.CellPadding = CellPadding;
\r
628 if(ControlStyleCreated && ControlStyle.IsSet(WebControls.Style.BORDERWIDTH) && BorderWidth != Unit.Empty)
\r
630 calTable.BorderWidth = BorderWidth;
\r
633 calTable.BorderWidth = Unit.Pixel(1);
\r
637 calTable.GridLines = GridLines.Both;
\r
639 calTable.GridLines = GridLines.None;
\r
641 calTable.RenderBeginTag(writer);
\r
643 RenderTitle(writer, visDate, SelectionMode, isEnabled);
\r
645 RenderHeader(writer, firstDate, SelectionMode, isEnabled, isHtmlTextWriter);
\r
646 RenderAllDays(writer, firstDate, visDate, SelectionMode, isEnabled, isHtmlTextWriter);
\r
648 calTable.RenderEndTag(writer);
\r
651 protected override ControlCollection CreateControlCollection()
\r
653 return new EmptyControlCollection(this);
\r
656 protected override void LoadViewState(object savedState)
\r
658 if(savedState!=null)
\r
660 if(ViewState["_CalendarSelectedDates"] != null)
\r
661 selectedDates = (SelectedDatesCollection)ViewState["_CalendarSelectedDates"];
\r
663 object[] states = (object[]) savedState;
\r
664 if(states[0] != null)
\r
665 base.LoadViewState(states[0]);
\r
666 if(states[1] != null)
\r
667 DayHeaderStyle.LoadViewState(states[1]);
\r
668 if(states[2] != null)
\r
669 DayStyle.LoadViewState(states[2]);
\r
670 if(states[3] != null)
\r
671 NextPrevStyle.LoadViewState(states[3]);
\r
672 if(states[4] != null)
\r
673 OtherMonthDayStyle.LoadViewState(states[4]);
\r
674 if(states[5] != null)
\r
675 SelectedDayStyle.LoadViewState(states[5]);
\r
676 if(states[6] != null)
\r
677 SelectorStyle.LoadViewState(states[6]);
\r
678 if(states[7] != null)
\r
679 TitleStyle.LoadViewState(states[7]);
\r
680 if(states[8] != null)
\r
681 TodayDayStyle.LoadViewState(states[8]);
\r
682 if(states[9] != null)
\r
683 WeekendDayStyle.LoadViewState(states[9]);
\r
687 protected override object SaveViewState()
\r
689 ViewState["_CalendarSelectedDates"] = (SelectedDates.Count > 0 ? selectedDates : null);
\r
690 object[] states = new object[11];
\r
691 states[0] = base.SaveViewState();
\r
692 states[1] = (dayHeaderStyle == null ? null : dayHeaderStyle.SaveViewState());
\r
693 states[2] = (dayStyle == null ? null : dayStyle.SaveViewState());
\r
694 states[3] = (nextPrevStyle == null ? null : nextPrevStyle.SaveViewState());
\r
695 states[4] = (otherMonthDayStyle == null ? null : otherMonthDayStyle.SaveViewState());
\r
696 states[5] = (selectedDayStyle == null ? null : selectedDayStyle.SaveViewState());
\r
697 states[6] = (selectorStyle == null ? null : selectorStyle.SaveViewState());
\r
698 states[7] = (titleStyle == null ? null : titleStyle.SaveViewState());
\r
699 states[8] = (todayDayStyle == null ? null : todayDayStyle.SaveViewState());
\r
700 states[9] = (weekendDayStyle == null ? null : weekendDayStyle.SaveViewState());
\r
701 for(int i=0; i < states.Length; i++)
\r
703 if(states[i]!=null)
\r
709 protected override void TrackViewState()
\r
712 if(titleStyle!=null)
\r
714 titleStyle.TrackViewState();
\r
716 if(nextPrevStyle!=null)
\r
718 nextPrevStyle.TrackViewState();
\r
722 dayStyle.TrackViewState();
\r
724 if(dayHeaderStyle!=null)
\r
726 dayHeaderStyle.TrackViewState();
\r
728 if(todayDayStyle!=null)
\r
730 todayDayStyle.TrackViewState();
\r
732 if(weekendDayStyle!=null)
\r
734 weekendDayStyle.TrackViewState();
\r
736 if(otherMonthDayStyle!=null)
\r
738 otherMonthDayStyle.TrackViewState();
\r
740 if(selectedDayStyle!=null)
\r
742 selectedDayStyle.TrackViewState();
\r
744 if(selectorStyle!=null)
\r
746 selectorStyle.TrackViewState();
\r
750 [MonoTODO("RenderAllDays")]
\r
751 private void RenderAllDays(HtmlTextWriter writer, DateTime firstDay, DateTime activeDate, CalendarSelectionMode mode, bool isActive, bool isDownLevel)
\r
754 TableItemStyle weeksStyle;
\r
756 string weeksCellData;
\r
757 bool isWeekMode = (mode == CalendarSelectionMode.DayWeek || mode == CalendarSelectionMode.DayWeekMonth);
\r
760 weeksStyle = new TableItemStyle();
\r
761 weeksStyle.Width = Unit.Percentage(12);
\r
762 weeksStyle.HorizontalAlign = HorizontalAlign.Center;
\r
763 weeksStyle.CopyFrom(SelectorStyle);
\r
764 size = Unit.Percentage(14);
\r
766 weeksCellData = GetHtmlForCell(weeksCell, isActive);
\r
768 bool dayRenderBool = false;
\r
769 if(GetType() != typeof(Calendar) || Events[DayRenderEvent] != null || !isDownLevel)
\r
770 dayRenderBool = true;
\r
772 string[] content = new string[0x01 << 4];
\r
773 int definedStyles = MASK_SELECTED;
\r
774 if(weekendStyle != null && !weekendStyle.IsEmpty)
\r
775 definedStyles |= MASK_WEEKEND;
\r
776 if(otherMonthStyle != null && !otherMonthStyle.IsEmpty)
\r
777 definedStyles |= MASK_OMONTH;
\r
778 if(todayDayStyle != null && todayDayStyle.IsEmpty)
\r
779 definedStyles |= MASK_TODAY;
\r
780 if(dayStyle != null && !dayStyle.IsEmpty)
\r
781 definedStyles |= MASK_DAY;
\r
783 bool selectDayBool = false;
\r
784 if(isActive && mode != CalendarSelectionMode.None)
\r
786 selectDayBool = true;
\r
789 for(int crr = 0; crr < 6; crr++)
\r
791 writer.Write("<tr>");
\r
796 string cellText = GetCalendarLinkText("selectWeek" + crr.ToString(), SelectWeekText, isActive, weeksCell.ForeColor);
\r
797 weeksCell.Text = cellText;
\r
798 RenderCalendarCell(writer, weeksCell, cellText);
\r
803 writer.Write(String.Format(weeksCellData, "selectWeek" + crr.ToString(), SelectWeekText));
\r
806 writer.Write(String.Format(weeksCellData, "selectWeek" + crr.ToString()));
\r
810 for(int crc = 0; crc < 7; crc++)
\r
812 // have to display for each day in the week.
\r
813 throw new NotImplementedException();
\r
817 throw new NotImplementedException();
\r
820 private int GetMask(CalendarDay day)
\r
822 int retVal = MASK_DAY;
\r
824 retVal |= MASK_SELECTED;
\r
826 retVal |= MASK_TODAY;
\r
827 if(day.IsOtherMonth)
\r
828 retVal |= MASK_OMONTH;
\r
830 retVal |= MASK_WEEKEND;
\r
835 /// Refers to the second line of the calendar, that contains a link
\r
836 /// to select whole month, and weekdays as defined by DayNameFormat
\r
838 private void RenderHeader(HtmlTextWriter writer, DateTime firstDay, CalendarSelectionMode mode, bool isActive, bool isDownLevel)
\r
840 writer.Write("<tr>");
\r
841 bool isWeekMode = (mode == CalendarSelectionMode.DayWeek || mode == CalendarSelectionMode.DayWeekMonth);
\r
842 TableCell headerCell = new TableCell();
\r
843 headerCell.HorizontalAlign = HorizontalAlign.Center;
\r
844 string selMthText = String.Empty;
\r
847 headerCell.ApplyStyle(SelectorStyle);
\r
848 selMthText = GetCalendarLinkText("selectMonth", SelectedMonthText, SelectorStyle.ForeColor, isActive);
\r
851 headerCell.ApplyStyle(DayHeaderStyle);
\r
853 RenderCalendarCell(writer, headerCell, selMthText);
\r
855 TableCell dayHeaderCell = new TableCell();
\r
856 dayHeaderCell.HorizontalAlign = HorizontalAlign.Center;
\r
857 string content = null;
\r
860 content = GetHtmlForCell(dayHeaderCell, isActive);
\r
862 int dayOfWeek = (int)globCal.GetDayOfWeek(firstDay);
\r
863 DateTimeFormatInfo currDTInfo = DateTimeFormatInfo.CurrentInfo;
\r
864 for(int currDay = dayOfWeek; currDay < dayOfWeek + 7; currDay++)
\r
866 DayOfWeek effDay = (DayOfWeek) Enum.ToObject(typeof(DayOfWeek),currDay % 7);
\r
867 string currDayContent = String.Empty;
\r
868 switch(DayNameFormat)
\r
870 case DayNameFormat.Full: currDayContent = currDTInfo.GetDayName(effDay);
\r
872 case DayNameFormat.FirstLetter: currDayContent = currDTInfo.GetDayName(effDay).Substring(0,1);
\r
874 case DayNameFormat.FirstTwoLetters: currDayContent = currDTInfo.GetDayName(effDay).Substring(0,2);
\r
876 case DayNameFormat.Short: goto default;
\r
877 default: currDayContent = currDTInfo.GetAbbreviatedDayName(effDay);
\r
882 RenderCalendarCell(writer, dayHeaderCell, currDayContent);
\r
885 writer.Write(String.Format(content, currDayContent));
\r
888 writer.Write("</tr>");
\r
891 private void RenderTitle(HtmlTextWriter writer, DateTime visibleDate, CalendarSelectionMode mode, bool isActive)
\r
893 writer.Write("<tr>");
\r
894 Table innerTable = new Table();
\r
895 TableCell titleCell = new TableCell();
\r
896 bool isWeekMode = (mode == CalendarSelectionMode.DayWeek || mode == CalendarSelectionMode.DayWeekMonth);
\r
897 titleCell.ColumnSpan = (isWeekMode ? 8 : 7);
\r
898 titleCell.BackColor = Color.Silver;
\r
900 innerTable.GridLines = GridLines.None;
\r
901 innerTable.Width = Unit.Percentage(100);
\r
902 innerTable.CellSpacing = 0;
\r
903 ApplyTitleStyle(innerTable, titleCell, TitleStyle);
\r
905 innerTable.RenderBeginTag(writer);
\r
906 titleCell.RenderBeginTag(writer);
\r
908 writer.Write("<tr>");
\r
909 string prevContent = String.Empty;
\r
910 if(ShowNextPrevMonth)
\r
912 TableCell prevCell = new TableCell();
\r
913 prevCell.Width = Unit.Percentage(15);
\r
914 prevCell.HorizontalAlign = HorizontalAlign.Left;
\r
915 if(NextPrevFormat == NextPrevFormat.CustomText)
\r
917 prevContent = PrevMonthText;
\r
920 int pMthInt = globCal.GetMonth(globCal.AddMonths(visibleDate, -1));
\r
921 if(NextPrevFormat == NextPrevFormat.FullMonth)
\r
922 prevContent = DateTimeFormatInfo.CurrentInfo.GetMonthName(pMthInt);
\r
924 prevContent = DateTimeFormatInfo.CurrentInfo.GetAbbreviatedMonthName(pMthInt);
\r
926 prevCell.ApplyStyle(NextPrevStyle);
\r
927 RenderCalendarCell(writer, prevCell, GetCalendarLinkText("prevMonth", prevContent, NextPrevStyle.ForeColor, isActive));
\r
929 TableCell currCell = new TableCell();
\r
930 currCell.Width = Unit.Percentage(70);
\r
931 if(TitleStyle.HorizontalAlign == HorizontalAlign.NotSet)
\r
932 currCell.HorizontalAlign = HorizontalAlign.Center;
\r
934 currCell.HorizontalAlign = TitleStyle.HorizontalAlign;
\r
935 currCell.Wrap = TitleStyle.Wrap;
\r
936 string currMonthContent = String.Empty;
\r
937 if(TitleFormat == TitleFormat.Month)
\r
939 currMonthContent = visibleDate.ToString("MMMM");
\r
942 string cmcFmt = DateTimeFormatInfo.CurrentInfo.YearMonthPattern;
\r
943 if(cmcFmt.IndexOf(',') >= 0)
\r
945 cmcFmt = "MMMM yyyy";
\r
947 currMonthContent = visibleDate.ToString(cmcFmt);
\r
949 string nextContent = String.Empty;
\r
950 if(ShowNextPrevMonth)
\r
952 TableCell nextCell = new TableCell();
\r
953 nextCell.Width = Unit.Percentage(15);
\r
954 nextCell.HorizontalAlign = HorizontalAlign.Left;
\r
955 if(NextPrevFormat == NextPrevFormat.CustomText)
\r
957 nextContent = PrevMonthText;
\r
960 int nMthInt = globCal.GetMonth(globCal.AddMonths(visibleDate, 1));
\r
961 if(NextPrevFormat == NextPrevFormat.FullMonth)
\r
962 nextContent = DateTimeFormatInfo.CurrentInfo.GetMonthName(nMthInt);
\r
964 nextContent = DateTimeFormatInfo.CurrentInfo.GetAbbreviatedMonthName(nMthInt);
\r
966 nextCell.ApplyStyle(NextPrevStyle);
\r
967 RenderCalendarCell(writer, nextCell, GetCalendarLinkText("nextMonth", nextContent, NextPrevStyle.ForeColor, isActive));
\r
970 writer.Write("</tr>");
\r
971 titleCell.RenderEndTag(writer);
\r
972 innerTable.RenderEndTag(writer);
\r
974 writer.Write("</tr>");
\r
977 private void ApplyTitleStyle(Table table, TableCell cell, TableItemStyle style)
\r
979 if(style.BackColor != Color.Empty)
\r
981 cell.BackColor = style.BackColor;
\r
983 if(style.BorderStyle != BorderStyle.NotSet)
\r
985 cell.BorderStyle = style.BorderStyle;
\r
987 if(style.BorderColor != Color.Empty)
\r
989 cell.BorderColor = style.BorderColor;
\r
991 if(style.BorderWidth != Unit.Empty)
\r
993 cell.BorderWidth = style.BorderWidth;
\r
995 if(style.Height != Unit.Empty)
\r
997 cell.Height = style.Height;
\r
999 if(style.VerticalAlign != VerticalAlign.NotSet)
\r
1001 cell.VerticalAlign = style.VerticalAlign;
\r
1004 if(style.ForeColor != Color.Empty)
\r
1006 table.ForeColor = style.ForeColor;
\r
1007 } else if(ForeColor != Color.Empty)
\r
1009 table.ForeColor = ForeColor;
\r
1012 table.Font.CopyFrom(style.Font);
\r
1013 table.Font.MergeWith(Font);
\r
1016 private void RenderCalendarCell(HtmlTextWriter writer, TableCell cell, string text)
\r
1018 cell.RenderBeginTag(writer);
\r
1019 writer.Write(text);
\r
1020 cell.RenderEndTag(writer);
\r
1023 private DateTime GetFirstCalendarDay(DateTime visibleDate)
\r
1025 DayOfWeek firstDay = DateTimeFormatInfo.CurrentInfo.FirstDayOfWeek;
\r
1026 if(FirstDayOfWeek != FirstDayOfWeek.Default)
\r
1028 firstDay = (DayOfWeek) Enum.ToObject(typeof(DayOfWeek), (int)FirstDayOfWeek);
\r
1030 //FIXME: is (int)(Enum) correct?
\r
1031 int days = (int)globCal.GetDayOfWeek(visibleDate) - (int)firstDay;
\r
1036 return globCal.AddDays(visibleDate, -days);
\r
1039 private DateTime GetEffectiveVisibleDate()
\r
1041 DateTime dt = VisibleDate;
\r
1042 if(dt.Equals(DateTime.MinValue))
\r
1046 return new DateTime(globCal.GetYear(dt), globCal.GetMonth(dt), globCal.GetDayOfMonth(dt), globCal);
\r
1050 /// Creates text to be displayed, with all attributes if to be
\r
1051 /// shown as a hyperlink
\r
1053 private string GetCalendarLinkText(string eventArg, string text, Color foreground, bool isLink)
\r
1057 StringBuilder dispVal = new StringBuilder();
\r
1058 dispVal.Append("<a href=\"");
\r
1059 dispVal.Append(Page.GetPostBackClientHyperlink(this, eventArg));
\r
1060 dispVal.Append("\" style=\"color: ");
\r
1061 if(foreground.IsEmpty)
\r
1063 dispVal.Append(ColorTranslator.ToHtml(defaultTextColor));
\r
1066 dispVal.Append(ColorTranslator.ToHtml(foreground));
\r
1068 dispVal.Append("\">");
\r
1069 dispVal.Append(text);
\r
1070 dispVal.Append("</a>");
\r
1071 return dispVal.ToString();
\r
1076 private string GetHtmlForCell(TableCell cell, bool showLinks)
\r
1078 StringWriter sw = new StringWriter();
\r
1079 HtmlTextWriter htw = new HtmlTextWriter(sw);
\r
1080 cell.RenderBeginTag(htw);
\r
1083 htw.Write(GetCalendarLinkText("{0}", "{1}", cell.ForeColor, showLinks));
\r
1088 cell.RenderEndTag(htw);
\r
1089 return sw.ToString();
\r
1092 internal void SelectRangeInternal(DateTime fromDate, DateTime toDate, DateTime visibleDate)
\r
1094 TimeSpan span = fromDate - toDate;
\r
1095 if(SelectedDates.Count != span.Days || SelectedDates[SelectedDates.Count - 1]!= toDate)
\r
1097 SelectedDates.SelectRange(fromDate, toDate);
\r
1098 OnSelectionChanged();
\r
1100 if(globCal.GetMonth(fromDate) == globCal.GetMonth(fromDate) && globCal.GetMonth(fromDate) != globCal.GetMonth(visibleDate))
\r
1102 VisibleDate = new DateTime(globCal.GetYear(fromDate), globCal.GetMonth(fromDate), 1, globCal);
\r
1103 OnVisibleMonthChanged(VisibleDate, visibleDate);
\r