2002-07-30 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / mcs / class / System.Web / System.Web.UI.WebControls / Calendar.cs
1 /**\r
2  * Namespace: System.Web.UI.WebControls\r
3  * Class:     Calendar\r
4  *\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
9  * Status:  98%\r
10  *\r
11  * (C) Gaurav Vaish (2001)\r
12  */\r
13 \r
14 using System;\r
15 using System.IO;\r
16 using System.Collections;\r
17 using System.Globalization;\r
18 using System.Text;\r
19 using System.Web;\r
20 using System.Web.UI;\r
21 using System.Drawing;\r
22 using System.ComponentModel;\r
23 \r
24 namespace System.Web.UI.WebControls\r
25 {\r
26         [DefaultEvent("SelectionChanged")]\r
27         [DefaultProperty("SelectedDate")]\r
28         //TODO: [Designer("??")]\r
29         //[DataBindingHandler("??")]\r
30         public class Calendar : WebControl, IPostBackEventHandler\r
31         {\r
32                 //\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
44 \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
48 \r
49                 private Color defaultTextColor;\r
50                 private System.Globalization.Calendar globCal;\r
51                 private DateTimeFormatInfo infoCal = DateTimeFormatInfo.CurrentInfo;\r
52 \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
59 \r
60                 public Calendar(): base()\r
61                 {\r
62                         //TODO: Initialization\r
63                 }\r
64 \r
65                 public int CellPadding\r
66                 {\r
67                         get\r
68                         {\r
69                                 object o = ViewState["CellPadding"];\r
70                                 if(o!=null)\r
71                                         return (int)o;\r
72                                 return 2;\r
73                         }\r
74                         set\r
75                         {\r
76                                 ViewState["CellPadding"] = value;\r
77                         }\r
78                 }\r
79 \r
80                 public int CellSpacing\r
81                 {\r
82                         get\r
83                         {\r
84                                 object o = ViewState["CellSpacing"];\r
85                                 if(o!=null)\r
86                                         return (int)o;\r
87                                 return 0;\r
88                         }\r
89                         set\r
90                         {\r
91                                 if(value<-1)\r
92                                         throw new ArgumentOutOfRangeException();\r
93                                 ViewState["CellSpacing"] = value;\r
94                         }\r
95                 }\r
96 \r
97                 public TableItemStyle DayHeaderStyle\r
98                 {\r
99                         get\r
100                         {\r
101                                 if(dayHeaderStyle==null)\r
102                                         dayHeaderStyle = new TableItemStyle();\r
103                                 if(IsTrackingViewState)\r
104                                         dayHeaderStyle.TrackViewState();\r
105                                 return dayHeaderStyle;\r
106                         }\r
107                 }\r
108 \r
109                 public DayNameFormat DayNameFormat\r
110                 {\r
111                         get\r
112                         {\r
113                                 object o = ViewState["DayNameFormat"];\r
114                                 if(o!=null)\r
115                                         return (DayNameFormat)o;\r
116                                 return DayNameFormat.Short;\r
117                         }\r
118                         set\r
119                         {\r
120                                 if(!System.Enum.IsDefined(typeof(DayNameFormat),value))\r
121                                         throw new ArgumentException();\r
122                                 ViewState["DayNameFormat"] = value;\r
123                         }\r
124                 }\r
125 \r
126                 public TableItemStyle DayStyle\r
127                 {\r
128                         get\r
129                         {\r
130                                 if(dayStyle==null)\r
131                                         dayStyle = new TableItemStyle();\r
132                                 if(IsTrackingViewState)\r
133                                         dayStyle.TrackViewState();\r
134                                 return dayStyle;\r
135                         }\r
136                 }\r
137 \r
138                 public FirstDayOfWeek FirstDayOfWeek\r
139                 {\r
140                         get\r
141                         {\r
142                                 object o = ViewState["FirstDayOfWeek"];\r
143                                 if(o!=null)\r
144                                         return (FirstDayOfWeek)o;\r
145                                 return FirstDayOfWeek.Default;\r
146                         }\r
147                         set\r
148                         {\r
149                                 if(!System.Enum.IsDefined(typeof(FirstDayOfWeek), value))\r
150                                         throw new ArgumentException();\r
151                                 ViewState["FirstDayOfWeek"] = value;\r
152                         }\r
153                 }\r
154 \r
155                 public string NextMonthText\r
156                 {\r
157                         get\r
158                         {\r
159                                 object o = ViewState["NextMonthText"];\r
160                                 if(o!=null)\r
161                                         return (string)o;\r
162                                 return "&gt;";\r
163                         }\r
164                         set\r
165                         {\r
166                                 ViewState["NextMonthText"] = value;\r
167                         }\r
168                 }\r
169 \r
170                 public NextPrevFormat NextPrevFormat\r
171                 {\r
172                         get\r
173                         {\r
174                                 object o = ViewState["NextPrevFormat"];\r
175                                 if(o!=null)\r
176                                         return (NextPrevFormat)o;\r
177                                 return NextPrevFormat.CustomText;\r
178                         }\r
179                         set\r
180                         {\r
181                                 if(!System.Enum.IsDefined(typeof(NextPrevFormat), value))\r
182                                         throw new ArgumentException();\r
183                                 ViewState["NextPrevFormat"] = value;\r
184                         }\r
185                 }\r
186 \r
187                 public TableItemStyle NextPrevStyle\r
188                 {\r
189                         get\r
190                         {\r
191                                 if(nextPrevStyle == null)\r
192                                         nextPrevStyle = new TableItemStyle();\r
193                                 if(IsTrackingViewState)\r
194                                         nextPrevStyle.TrackViewState();\r
195                                 return nextPrevStyle;\r
196                         }\r
197                 }\r
198 \r
199                 public TableItemStyle OtherMonthDayStyle\r
200                 {\r
201                         get\r
202                         {\r
203                                 if(otherMonthDayStyle == null)\r
204                                         otherMonthDayStyle = new TableItemStyle();\r
205                                 if(IsTrackingViewState)\r
206                                         otherMonthDayStyle.TrackViewState();\r
207                                 return otherMonthDayStyle;\r
208                         }\r
209                 }\r
210 \r
211                 public string PrevMonthText\r
212                 {\r
213                         get\r
214                         {\r
215                                 object o = ViewState["PrevMonthText"];\r
216                                 if(o!=null)\r
217                                         return (string)o;\r
218                                 return "&lt;";\r
219                         }\r
220                         set\r
221                         {\r
222                                 ViewState["PrevMonthText"] = value;\r
223                         }\r
224                 }\r
225 \r
226                 public DateTime SelectedDate\r
227                 {\r
228                         get\r
229                         {\r
230                                 if(SelectedDates.Count > 0)\r
231                                 {\r
232                                         return SelectedDates[0];\r
233                                 }\r
234                                 return DateTime.MinValue;\r
235                         }\r
236                         set\r
237                         {\r
238                                 if(value == DateTime.MinValue)\r
239                                 {\r
240                                         SelectedDates.Clear();\r
241                                 } else\r
242                                 {\r
243                                         SelectedDates.SelectRange(value, value);\r
244                                 }\r
245                         }\r
246                 }\r
247 \r
248                 public SelectedDatesCollection SelectedDates\r
249                 {\r
250                         get\r
251                         {\r
252                                 if(selectedDates==null)\r
253                                 {\r
254                                         if(selectedDatesList == null)\r
255                                                 selectedDatesList = new ArrayList();\r
256                                         selectedDates = new SelectedDatesCollection(selectedDatesList);\r
257                                 }\r
258                                 return selectedDates;\r
259                         }\r
260                 }\r
261 \r
262                 public TableItemStyle SelectedDayStyle\r
263                 {\r
264                         get\r
265                         {\r
266                                 if(selectedDayStyle==null)\r
267                                         selectedDayStyle = new TableItemStyle();\r
268                                 if(IsTrackingViewState)\r
269                                         selectedDayStyle.TrackViewState();\r
270                                 return selectedDayStyle;\r
271                         }\r
272                 }\r
273 \r
274                 public CalendarSelectionMode SelectionMode\r
275                 {\r
276                         get\r
277                         {\r
278                                 object o = ViewState["SelectionMode"];\r
279                                 if(o!=null)\r
280                                         return (CalendarSelectionMode)o;\r
281                                 return CalendarSelectionMode.Day;\r
282                         }\r
283                         set\r
284                         {\r
285                                 if(!System.Enum.IsDefined(typeof(CalendarSelectionMode), value))\r
286                                         throw new ArgumentException();\r
287                                 ViewState["SelectionMode"] = value;\r
288                         }\r
289                 }\r
290 \r
291                 public string SelectMonthText\r
292                 {\r
293                         get\r
294                         {\r
295                                 object o = ViewState["SelectMonthText"];\r
296                                 if(o!=null)\r
297                                         return (string)o;\r
298                                 return "&gt;&gt;";\r
299                         }\r
300                         set\r
301                         {\r
302                                 ViewState["SelectMonthText"] = value;\r
303                         }\r
304                 }\r
305 \r
306                 public TableItemStyle SelectorStyle\r
307                 {\r
308                         get\r
309                         {\r
310                                 if(selectorStyle==null)\r
311                                         selectorStyle = new TableItemStyle();\r
312                                 return selectorStyle;\r
313                         }\r
314                 }\r
315 \r
316                 public string SelectWeekText\r
317                 {\r
318                         get\r
319                         {\r
320                                 object o = ViewState["SelectWeekText"];\r
321                                 if(o!=null)\r
322                                         return (string)o;\r
323                                 return "&gt;";\r
324                         }\r
325                         set\r
326                         {\r
327                                 ViewState["SelectWeekText"] = value;\r
328                         }\r
329                 }\r
330 \r
331                 public bool ShowDayHeader\r
332                 {\r
333                         get\r
334                         {\r
335                                 object o = ViewState["ShowDayHeader"];\r
336                                 if(o!=null)\r
337                                         return (bool)o;\r
338                                 return true;\r
339                         }\r
340                         set\r
341                         {\r
342                                 ViewState["ShowDayHeader"] = value;\r
343                         }\r
344                 }\r
345 \r
346                 public bool ShowGridLines\r
347                 {\r
348                         get\r
349                         {\r
350                                 object o = ViewState["ShowGridLines"];\r
351                                 if(o!=null)\r
352                                         return (bool)o;\r
353                                 return false;\r
354                         }\r
355                         set\r
356                         {\r
357                                 ViewState["ShowGridLines"] = value;\r
358                         }\r
359                 }\r
360 \r
361                 public bool ShowNextPrevMonth\r
362                 {\r
363                         get\r
364                         {\r
365                                 object o = ViewState["ShowNextPrevMonth"];\r
366                                 if(o!=null)\r
367                                         return (bool)o;\r
368                                 return true;\r
369                         }\r
370                         set\r
371                         {\r
372                                 ViewState["ShowNextPrevMonth"] = value;\r
373                         }\r
374                 }\r
375 \r
376                 public bool ShowTitle\r
377                 {\r
378                         get\r
379                         {\r
380                                 object o = ViewState["ShowTitle"];\r
381                                 if(o!=null)\r
382                                         return (bool)o;\r
383                                 return true;\r
384                         }\r
385                         set\r
386                         {\r
387                                 ViewState["ShowTitle"] = value;\r
388                         }\r
389                 }\r
390 \r
391                 public TitleFormat TitleFormat\r
392                 {\r
393                         get\r
394                         {\r
395                                 object o = ViewState["TitleFormat"];\r
396                                 if(o!=null)\r
397                                         return (TitleFormat)o;\r
398                                 return TitleFormat.MonthYear;\r
399                         }\r
400                         set\r
401                         {\r
402                                 if(!System.Enum.IsDefined(typeof(TitleFormat), value))\r
403                                         throw new ArgumentException();\r
404                                 ViewState["TitleFormat"] = value;\r
405                         }\r
406                 }\r
407 \r
408                 public TableItemStyle TitleStyle\r
409                 {\r
410                         get\r
411                         {\r
412                                 if(titleStyle==null)\r
413                                         titleStyle = new TableItemStyle();\r
414                                 if(IsTrackingViewState)\r
415                                         titleStyle.TrackViewState();\r
416                                 return titleStyle;\r
417                         }\r
418                 }\r
419 \r
420                 public TableItemStyle TodayDayStyle\r
421                 {\r
422                         get\r
423                         {\r
424                                 if(todayDayStyle==null)\r
425                                         todayDayStyle = new TableItemStyle();\r
426                                 if(IsTrackingViewState)\r
427                                         todayDayStyle.TrackViewState();\r
428                                 return todayDayStyle;\r
429                         }\r
430                 }\r
431 \r
432                 public DateTime TodaysDate\r
433                 {\r
434                         get\r
435                         {\r
436                                 object o = ViewState["TodaysDate"];\r
437                                 if(o!=null)\r
438                                         return (DateTime)o;\r
439                                 return DateTime.Today;\r
440                         }\r
441                         set\r
442                         {\r
443                                 ViewState["TodaysDate"] = value.Date;\r
444                         }\r
445                 }\r
446 \r
447                 public DateTime VisibleDate\r
448                 {\r
449                         get\r
450                         {\r
451                                 object o = ViewState["VisibleDate"];\r
452                                 if(o!=null)\r
453                                         return (DateTime)o;\r
454                                 return DateTime.MinValue;\r
455                         }\r
456                         set\r
457                         {\r
458                                 ViewState["VisibleDate"] = value.Date;\r
459                         }\r
460                 }\r
461 \r
462                 public TableItemStyle WeekendDayStyle\r
463                 {\r
464                         get\r
465                         {\r
466                                 if(weekendDayStyle == null)\r
467                                         weekendDayStyle = new TableItemStyle();\r
468                                 if(IsTrackingViewState)\r
469                                 {\r
470                                         weekendDayStyle.TrackViewState();\r
471                                 }\r
472                                 return weekendDayStyle;\r
473                         }\r
474                 }\r
475 \r
476                 public event DayRenderEventHandler DayRender\r
477                 {\r
478                         add\r
479                         {\r
480                                 Events.AddHandler(DayRenderEvent, value);\r
481                         }\r
482                         remove\r
483                         {\r
484                                 Events.RemoveHandler(DayRenderEvent, value);\r
485                         }\r
486                 }\r
487 \r
488                 public event EventHandler SelectionChanged\r
489                 {\r
490                         add\r
491                         {\r
492                                 Events.AddHandler(SelectionChangedEvent, value);\r
493                         }\r
494                         remove\r
495                         {\r
496                                 Events.RemoveHandler(SelectionChangedEvent, value);\r
497                         }\r
498                 }\r
499 \r
500                 public event MonthChangedEventHandler VisibleMonthChanged\r
501                 {\r
502                         add\r
503                         {\r
504                                 Events.AddHandler(VisibleMonthChangedEvent, value);\r
505                         }\r
506                         remove\r
507                         {\r
508                                 Events.RemoveHandler(VisibleMonthChangedEvent, value);\r
509                         }\r
510                 }\r
511 \r
512                 protected virtual void OnDayRender(TableCell cell, CalendarDay day)\r
513                 {\r
514                         if(Events!=null)\r
515                         {\r
516                                 DayRenderEventHandler dreh = (DayRenderEventHandler)(Events[DayRenderEvent]);\r
517                                 if(dreh!=null)\r
518                                         dreh(this, new DayRenderEventArgs(cell, day));\r
519                         }\r
520                 }\r
521 \r
522                 protected virtual void OnSelectionChanged()\r
523                 {\r
524                         if(Events!=null)\r
525                         {\r
526                                 EventHandler eh = (EventHandler)(Events[SelectionChangedEvent]);\r
527                                 if(eh!=null)\r
528                                         eh(this, new EventArgs());\r
529                         }\r
530                 }\r
531 \r
532                 protected virtual void OnVisibleMonthChanged(DateTime newDate, DateTime prevDate)\r
533                 {\r
534                         if(Events!=null)\r
535                         {\r
536                                 MonthChangedEventHandler mceh = (MonthChangedEventHandler)(Events[VisibleMonthChangedEvent]);\r
537                                 if(mceh!=null)\r
538                                         mceh(this, new MonthChangedEventArgs(newDate, prevDate));\r
539                         }\r
540                 }\r
541 \r
542                 /// <remarks>\r
543                 /// See test6.aspx in Tests directory for verification\r
544                 /// </remarks>\r
545                 void IPostBackEventHandler.RaisePostBackEvent(string eventArgument)\r
546                 {\r
547                         globCal = DateTimeFormatInfo.CurrentInfo.Calendar;\r
548                         DateTime visDate = GetEffectiveVisibleDate();\r
549                         if(eventArgument == "nextMonth")\r
550                         {\r
551                                 VisibleDate = globCal.AddMonths(visDate, 1);\r
552                                 OnVisibleMonthChanged(VisibleDate, visDate);\r
553                                 return;\r
554                         }\r
555                         if(eventArgument == "prevMonth")\r
556                         {\r
557                                 VisibleDate = globCal.AddMonths(visDate, -1);\r
558                                 OnVisibleMonthChanged(VisibleDate, visDate);\r
559                                 return;\r
560                         }\r
561                         if(eventArgument == "selectMonth")\r
562                         {\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
565                                 return;\r
566                         }\r
567                         if(String.Compare(eventArgument, 0, "selectWeek", 0, "selectWeek".Length)==0)\r
568                         {\r
569                                 int week = -1;\r
570                                 try\r
571                                 {\r
572                                         week = Int32.Parse(eventArgument.Substring("selectWeek".Length));\r
573                                 } catch(Exception e)\r
574                                 {\r
575                                 }\r
576                                 if(week >= 0 && week <= 5)\r
577                                 {\r
578                                         DateTime weekStart = globCal.AddDays(GetFirstCalendarDay(visDate), week * 7);\r
579                                         SelectRangeInternal(weekStart, globCal.AddDays(weekStart, 6), visDate);\r
580                                 }\r
581                                 return;\r
582                         }\r
583                         if(String.Compare(eventArgument, 0, "selectDay", 0, "selectDay".Length)==0)\r
584                         {\r
585                                 int day = -1;\r
586                                 try\r
587                                 {\r
588                                         day = Int32.Parse(eventArgument.Substring("selectDay".Length));\r
589                                 } catch(Exception e)\r
590                                 {\r
591                                 }\r
592                                 if(day >= 0 && day <= 42)\r
593                                 {\r
594                                         DateTime dayStart = globCal.AddDays(GetFirstCalendarDay(visDate), day);\r
595                                         SelectRangeInternal(dayStart, dayStart, visDate);\r
596                                 }\r
597                         }\r
598                 }\r
599 \r
600                 protected override void Render(HtmlTextWriter writer)\r
601                 {\r
602                         //TODO: Implement me\r
603                         globCal = DateTimeFormatInfo.CurrentInfo.Calendar;\r
604                         DateTime visDate   = GetEffectiveVisibleDate();\r
605                         DateTime firstDate = GetFirstCalendarDay(visDate);\r
606 \r
607                         bool isEnabled;\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
613                         //} else {\r
614                                 isEnabled = Enabled;\r
615                                 isHtmlTextWriter = (writer.GetType() != typeof(HtmlTextWriter));\r
616                         //}\r
617                         defaultTextColor = ForeColor;\r
618                         if(defaultTextColor == Color.Empty)\r
619                                 defaultTextColor = Color.Black;\r
620 \r
621                         Table calTable = new Table ();\r
622                         calTable.ID = ID;\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
630 \r
631                         if (ControlStyleCreated &&\r
632                             ControlStyle.IsSet (WebControls.Style.BORDERWIDTH) &&\r
633                             BorderWidth != Unit.Empty)\r
634                                 calTable.BorderWidth = BorderWidth;\r
635                         else\r
636                                 calTable.BorderWidth = Unit.Pixel(1);\r
637 \r
638                         if (ShowGridLines)\r
639                                 calTable.GridLines = GridLines.Both;\r
640                         else\r
641                                 calTable.GridLines = GridLines.None;\r
642 \r
643                         calTable.RenderBeginTag (writer);\r
644 \r
645                         if (ShowTitle)\r
646                                 RenderTitle (writer, visDate, SelectionMode, isEnabled);\r
647 \r
648                         if (ShowDayHeader)\r
649                                 RenderHeader (writer, firstDate, SelectionMode, isEnabled, isHtmlTextWriter);\r
650 \r
651                         RenderAllDays (writer, firstDate, visDate, SelectionMode, isEnabled, isHtmlTextWriter);\r
652 \r
653                         calTable.RenderEndTag(writer);\r
654                 }\r
655 \r
656                 protected override ControlCollection CreateControlCollection()\r
657                 {\r
658                         return new EmptyControlCollection(this);\r
659                 }\r
660 \r
661                 protected override void LoadViewState(object savedState)\r
662                 {\r
663                         if(savedState!=null)\r
664                         {\r
665                                 if(ViewState["_CalendarSelectedDates"] != null)\r
666                                         selectedDates = (SelectedDatesCollection)ViewState["_CalendarSelectedDates"];\r
667 \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
689                         }\r
690                 }\r
691 \r
692                 protected override object SaveViewState()\r
693                 {\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
707                         {\r
708                                 if(states[i]!=null)\r
709                                         return states;\r
710                         }\r
711                         return null;\r
712                 }\r
713 \r
714                 protected override void TrackViewState()\r
715                 {\r
716                         base.TrackViewState();\r
717                         if(titleStyle!=null)\r
718                         {\r
719                                 titleStyle.TrackViewState();\r
720                         }\r
721                         if(nextPrevStyle!=null)\r
722                         {\r
723                                 nextPrevStyle.TrackViewState();\r
724                         }\r
725                         if(dayStyle!=null)\r
726                         {\r
727                                 dayStyle.TrackViewState();\r
728                         }\r
729                         if(dayHeaderStyle!=null)\r
730                         {\r
731                                 dayHeaderStyle.TrackViewState();\r
732                         }\r
733                         if(todayDayStyle!=null)\r
734                         {\r
735                                 todayDayStyle.TrackViewState();\r
736                         }\r
737                         if(weekendDayStyle!=null)\r
738                         {\r
739                                 weekendDayStyle.TrackViewState();\r
740                         }\r
741                         if(otherMonthDayStyle!=null)\r
742                         {\r
743                                 otherMonthDayStyle.TrackViewState();\r
744                         }\r
745                         if(selectedDayStyle!=null)\r
746                         {\r
747                                 selectedDayStyle.TrackViewState();\r
748                         }\r
749                         if(selectorStyle!=null)\r
750                         {\r
751                                 selectorStyle.TrackViewState();\r
752                         }\r
753                 }\r
754 \r
755                 private void RenderAllDays (HtmlTextWriter writer,\r
756                                             DateTime firstDay,\r
757                                             DateTime activeDate,\r
758                                             CalendarSelectionMode mode,\r
759                                             bool isActive,\r
760                                             bool isDownLevel)\r
761                 {\r
762                         TableItemStyle weeksStyle;\r
763                         TableCell weeksCell = new TableCell ();\r
764                         TableItemStyle weekendStyle = WeekendDayStyle;\r
765                         TableItemStyle otherMonthStyle = OtherMonthDayStyle;\r
766                         Unit size;\r
767                         bool isWeekMode = (mode == CalendarSelectionMode.DayWeek ||\r
768                                            mode == CalendarSelectionMode.DayWeekMonth);\r
769 \r
770                         if (isWeekMode) {\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
776                         } else {\r
777                                 size = Unit.Percentage (14);\r
778                         }\r
779 \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
790 \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
796                                 if (isWeekMode) {\r
797                                         string cellText = GetCalendarLinkText (\r
798                                                                 "selectWeek" + crr.ToString (),\r
799                                                                 SelectWeekText, \r
800                                                                 weeksCell.ForeColor,\r
801                                                                 isActive);\r
802 \r
803                                         weeksCell.Text = cellText;\r
804                                         RenderCalendarCell (writer, weeksCell, cellText);\r
805                                 }\r
806 \r
807                                 for (int weekDay = 0; weekDay < 7; weekDay++) {\r
808                                         string dayString = currentDay.Day.ToString ();\r
809                                         CalendarDay calDay =\r
810                                                 new CalendarDay (\r
811                                                                 currentDay,\r
812                                                                 weekDay < 2,\r
813                                                                 currentDay == TodaysDate, \r
814                                                                 selectedDates.Contains (currentDay),\r
815                                                                 globCal.GetMonth (currentDay) != month,\r
816                                                                 dayString\r
817                                                                 );\r
818 \r
819 \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
826 \r
827                                                 if ((dayStyles & MASK_WEEKEND) != 0)\r
828                                                         currentDayStyle.CopyFrom (WeekendDayStyle);\r
829 \r
830                                                 if ((dayStyles & MASK_TODAY) != 0)\r
831                                                         currentDayStyle.CopyFrom (TodayDayStyle);\r
832 \r
833                                                 if ((dayStyles & MASK_OMONTH) != 0)\r
834                                                         currentDayStyle.CopyFrom (OtherMonthDayStyle);\r
835 \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
840                                                 }\r
841 \r
842                                                 currentDayStyle.Width = size;\r
843                                                 currentDayStyle.HorizontalAlign = HorizontalAlign.Center;\r
844                                         }\r
845 \r
846                                         TableCell dayCell = new TableCell ();\r
847                                         dayCell.ApplyStyle (currentDayStyle);\r
848                                         calDay.IsSelectable = isActive;\r
849                                         OnDayRender (dayCell, calDay);\r
850                                         if (isActive)\r
851                                                 dayCell.Text = GetCalendarLinkText (\r
852                                                                         "selectDay" + (crr * 7 + weekDay),\r
853                                                                         dayString,\r
854                                                                         dayCell.ForeColor,\r
855                                                                         true);\r
856                                         else\r
857                                                 dayCell.Text = dayString;\r
858 \r
859                                         dayCell.RenderControl (writer);\r
860 \r
861                                         currentDay = globCal.AddDays (currentDay, 1);\r
862                                 }\r
863                                 writer.Write("</tr>");\r
864                         }\r
865                 }\r
866 \r
867                 private int GetMask (CalendarDay day)\r
868                 {\r
869                         int retVal = MASK_DAY;\r
870                         if(day.IsSelected)\r
871                                 retVal |= MASK_SELECTED;\r
872                         if(day.IsToday)\r
873                                 retVal |= MASK_TODAY;\r
874                         if(day.IsOtherMonth)\r
875                                 retVal |= MASK_OMONTH;\r
876                         if(day.IsWeekend)\r
877                                 retVal |= MASK_WEEKEND;\r
878                         return retVal;\r
879                 }\r
880 \r
881                 /// <remarks>\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
884                 /// </remarks>\r
885                 private void RenderHeader (HtmlTextWriter writer,\r
886                                            DateTime firstDay,\r
887                                            CalendarSelectionMode mode,\r
888                                            bool isActive,\r
889                                            bool isDownLevel)\r
890                 {\r
891                         writer.Write("<tr>");\r
892                         bool isWeekMode = (mode == CalendarSelectionMode.DayWeek ||\r
893                                            mode == CalendarSelectionMode.DayWeekMonth);\r
894 \r
895                         TableCell headerCell = new TableCell ();\r
896                         headerCell.HorizontalAlign = HorizontalAlign.Center;\r
897                         string selMthText = String.Empty;\r
898                         if (isWeekMode) {\r
899                                 if (mode == CalendarSelectionMode.DayWeekMonth) {\r
900                                         headerCell.ApplyStyle (SelectorStyle);\r
901                                         selMthText = GetCalendarLinkText ("selectMonth",\r
902                                                                           SelectMonthText,\r
903                                                                           SelectorStyle.ForeColor,\r
904                                                                           isActive);\r
905                                 } else {\r
906                                         headerCell.ApplyStyle (DayHeaderStyle);\r
907                                         selMthText = String.Empty;\r
908                                 }\r
909                                 RenderCalendarCell (writer, headerCell, selMthText);\r
910                         }\r
911 \r
912                         TableCell dayHeaderCell = new TableCell ();\r
913                         dayHeaderCell.HorizontalAlign = HorizontalAlign.Center;\r
914 \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
923                                         break;\r
924                                 case DayNameFormat.FirstLetter:\r
925                                         currDayContent = currDTInfo.GetDayName (effDay).Substring (0,1);\r
926                                         break;\r
927                                 case DayNameFormat.FirstTwoLetters:\r
928                                         currDayContent = currDTInfo.GetDayName (effDay).Substring (0,2);\r
929                                         break;\r
930                                 case DayNameFormat.Short:\r
931                                         goto default;\r
932                                 default:\r
933                                         currDayContent = currDTInfo.GetAbbreviatedDayName (effDay);\r
934                                         break;\r
935                                 }\r
936 \r
937                                 RenderCalendarCell(writer, dayHeaderCell, currDayContent);\r
938                         }\r
939                         writer.Write ("</tr>");\r
940                 }\r
941 \r
942                 private void RenderTitle (HtmlTextWriter writer,\r
943                                           DateTime visibleDate,\r
944                                           CalendarSelectionMode mode,\r
945                                           bool isActive)\r
946                 {\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
952 \r
953                         titleCell.ColumnSpan = (isWeekMode ? 8 : 7);\r
954                         titleCell.BackColor = Color.Silver;\r
955 \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
960 \r
961                         titleCell.RenderBeginTag (writer);\r
962                         innerTable.RenderBeginTag (writer);\r
963 \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
972                                 } else {\r
973                                         int pMthInt = globCal.GetMonth(globCal.AddMonths (visibleDate, -1));\r
974                                         if (NextPrevFormat == NextPrevFormat.FullMonth)\r
975                                                 prevContent = infoCal.GetMonthName (pMthInt);\r
976                                         else\r
977                                                 prevContent = infoCal.GetAbbreviatedMonthName (pMthInt);\r
978                                 }\r
979                                 prevCell.ApplyStyle (NextPrevStyle);\r
980                                 RenderCalendarCell (writer,\r
981                                                     prevCell,\r
982                                                     GetCalendarLinkText ("prevMonth",\r
983                                                                          prevContent,\r
984                                                                          NextPrevStyle.ForeColor,\r
985                                                                          isActive)\r
986                                                     );\r
987                         }\r
988 \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
993                         else\r
994                                 currCell.HorizontalAlign = TitleStyle.HorizontalAlign;\r
995 \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
1000                         } else {\r
1001                                 string cmcFmt = infoCal.YearMonthPattern;\r
1002                                 if (cmcFmt.IndexOf (',') >= 0)\r
1003                                         cmcFmt = "MMMM yyyy";\r
1004 \r
1005                                 currMonthContent = visibleDate.ToString (cmcFmt);\r
1006                         }\r
1007 \r
1008                         RenderCalendarCell (writer, currCell, currMonthContent);\r
1009                                                                  \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
1017                                 } else {\r
1018                                         int nMthInt = globCal.GetMonth (globCal.AddMonths (visibleDate, 1));\r
1019                                         if(NextPrevFormat == NextPrevFormat.FullMonth)\r
1020                                                 nextContent = infoCal.GetMonthName(nMthInt);\r
1021                                         else\r
1022                                                 nextContent = infoCal.GetAbbreviatedMonthName(nMthInt);\r
1023                                 }\r
1024                                 nextCell.ApplyStyle(NextPrevStyle);\r
1025                                 RenderCalendarCell (writer,\r
1026                                                     nextCell,\r
1027                                                     GetCalendarLinkText ("nextMonth",\r
1028                                                                          nextContent,\r
1029                                                                          NextPrevStyle.ForeColor,\r
1030                                                                          isActive)\r
1031                                                     );\r
1032                         }\r
1033 \r
1034                         writer.Write("</tr>");\r
1035                         innerTable.RenderEndTag(writer);\r
1036                         titleCell.RenderEndTag(writer);\r
1037 \r
1038                         writer.Write("</tr>");\r
1039                 }\r
1040 \r
1041                 private void ApplyTitleStyle(Table table, TableCell cell, TableItemStyle style)\r
1042                 {\r
1043                         if(style.BackColor != Color.Empty)\r
1044                         {\r
1045                                 cell.BackColor = style.BackColor;\r
1046                         }\r
1047                         if(style.BorderStyle != BorderStyle.NotSet)\r
1048                         {\r
1049                                 cell.BorderStyle = style.BorderStyle;\r
1050                         }\r
1051                         if(style.BorderColor != Color.Empty)\r
1052                         {\r
1053                                 cell.BorderColor = style.BorderColor;\r
1054                         }\r
1055                         if(style.BorderWidth != Unit.Empty)\r
1056                         {\r
1057                                 cell.BorderWidth = style.BorderWidth;\r
1058                         }\r
1059                         if(style.Height != Unit.Empty)\r
1060                         {\r
1061                                 cell.Height = style.Height;\r
1062                         }\r
1063                         if(style.VerticalAlign != VerticalAlign.NotSet)\r
1064                         {\r
1065                                 cell.VerticalAlign = style.VerticalAlign;\r
1066                         }\r
1067 \r
1068                         if(style.ForeColor != Color.Empty)\r
1069                         {\r
1070                                 table.ForeColor = style.ForeColor;\r
1071                         } else if(ForeColor != Color.Empty)\r
1072                         {\r
1073                                 table.ForeColor = ForeColor;\r
1074                         }\r
1075 \r
1076                         table.Font.CopyFrom(style.Font);\r
1077                         table.Font.MergeWith(Font);\r
1078                 }\r
1079 \r
1080                 private void RenderCalendarCell (HtmlTextWriter writer, TableCell cell, string text)\r
1081                 {\r
1082                         cell.RenderBeginTag(writer);\r
1083                         writer.Write(text);\r
1084                         cell.RenderEndTag(writer);\r
1085                 }\r
1086 \r
1087                 private DateTime GetFirstCalendarDay(DateTime visibleDate)\r
1088                 {\r
1089                         int fow = (int) FirstDayOfWeek;\r
1090                         if (fow == 7)\r
1091                                 fow = (int) infoCal.FirstDayOfWeek;\r
1092 \r
1093                         int days = (int) globCal.GetDayOfWeek (visibleDate) - fow;\r
1094                         if (days <= 0)\r
1095                                 days += 7;\r
1096                         return globCal.AddDays (visibleDate, -days);\r
1097                 }\r
1098 \r
1099                 private DateTime GetEffectiveVisibleDate()\r
1100                 {\r
1101                         DateTime dt = VisibleDate;\r
1102                         if (VisibleDate == DateTime.MinValue)\r
1103                                  dt = TodaysDate;\r
1104                         return globCal.AddDays (dt, 1 - globCal.GetDayOfMonth (dt));\r
1105                 }\r
1106 \r
1107                 /// <summary>\r
1108                 /// Creates text to be displayed, with all attributes if to be\r
1109                 /// shown as a hyperlink\r
1110                 /// </summary>\r
1111                 private string GetCalendarLinkText (string eventArg,\r
1112                                                     string text,\r
1113                                                     Color foreground,\r
1114                                                     bool isLink)\r
1115                 {\r
1116                         if (isLink) {\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
1123                                 } else {\r
1124                                         dispVal.Append (ColorTranslator.ToHtml (foreground));\r
1125                                 }\r
1126                                 dispVal.Append ("\">");\r
1127                                 dispVal.Append (text);\r
1128                                 dispVal.Append ("</a>");\r
1129                                 return dispVal.ToString ();\r
1130                         }\r
1131                         return text;\r
1132                 }\r
1133 \r
1134                 private string GetHtmlForCell (TableCell cell, bool showLinks)\r
1135                 {\r
1136                         StringWriter sw = new StringWriter ();\r
1137                         HtmlTextWriter htw = new HtmlTextWriter (sw);\r
1138                         cell.RenderBeginTag (htw);\r
1139                         if(showLinks) {\r
1140                                 htw.Write (GetCalendarLinkText ("{0}", "{1}", cell.ForeColor, showLinks));\r
1141                         } else {\r
1142                                 htw.Write ("{0}");\r
1143                         }\r
1144                         cell.RenderEndTag (htw);\r
1145                         return sw.ToString();\r
1146                 }\r
1147 \r
1148                 internal void SelectRangeInternal (DateTime fromDate, DateTime toDate, DateTime visibleDate)\r
1149                 {\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
1156                         }\r
1157                 }\r
1158         }\r
1159 }\r