9647fe81d5025d7d09b830481a52af68563aab3c
[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  * Status:  60%\r
9  * \r
10  * (C) Gaurav Vaish (2001)\r
11  */\r
12 \r
13 using System;\r
14 using System.Collections;\r
15 using System.Globalization;\r
16 using System.Text;\r
17 using System.Web;\r
18 using System.Web.UI;\r
19 using System.Drawing;\r
20 \r
21 namespace System.Web.UI.WebControls\r
22 {\r
23         public class Calendar : WebControl, IPostBackEventHandler\r
24         {\r
25                 //\r
26                 \r
27                 private TableItemStyle          dayHeaderStyle;\r
28                 private TableItemStyle          dayStyle;\r
29                 private TableItemStyle          nextPrevStyle;\r
30                 private TableItemStyle          otherMonthDayStyle;\r
31                 private SelectedDatesCollection selectedDates;\r
32                 private ArrayList               selectedDatesList;\r
33                 private TableItemStyle          selectedDayStyle;\r
34                 private TableItemStyle          selectorStyle;\r
35                 private TableItemStyle          titleStyle;\r
36                 private TableItemStyle          todayDayStyle;\r
37                 private TableItemStyle          weekendDayStyle;\r
38 \r
39                 private static readonly object DayRenderEvent           = new object();\r
40                 private static readonly object SelectionChangedEvent    = new object();\r
41                 private static readonly object VisibleMonthChangedEvent = new object();\r
42                 \r
43                 private Color defaultTextColor;\r
44                 private System.Globalization.Calendar globCal;\r
45 \r
46                 public Calendar(): base()\r
47                 {\r
48                         //TODO: Initialization\r
49                 }\r
50                 \r
51                 public int CellPadding\r
52                 {\r
53                         get\r
54                         {\r
55                                 object o = ViewState["CellPadding"];\r
56                                 if(o!=null)\r
57                                         return (int)o;\r
58                                 return 2;\r
59                         }\r
60                         set\r
61                         {\r
62                                 ViewState["CellPadding"] = value;\r
63                         }\r
64                 }\r
65 \r
66                 public int CellSpacing\r
67                 {\r
68                         get\r
69                         {\r
70                                 object o = ViewState["CellSpacing"];\r
71                                 if(o!=null)\r
72                                         return (int)o;\r
73                                 return 0;\r
74                         }\r
75                         set\r
76                         {\r
77                                 if(value<-1)\r
78                                         throw new ArgumentOutOfRangeException();\r
79                                 ViewState["CellSpacing"] = value;\r
80                         }\r
81                 }\r
82                 \r
83                 public TableItemStyle DayHeaderStyle\r
84                 {\r
85                         get\r
86                         {\r
87                                 if(dayHeaderStyle==null)\r
88                                         dayHeaderStyle = new TableItemStyle();\r
89                                 return dayHeaderStyle;\r
90                         }\r
91                 }\r
92 \r
93                 public DayNameFormat DayNameFormat\r
94                 {\r
95                         get\r
96                         {\r
97                                 object o = ViewState["DayNameFormat"];\r
98                                 if(o!=null)\r
99                                         return (DayNameFormat)o;\r
100                                 return DayNameFormat.Short;\r
101                         }\r
102                         set\r
103                         {\r
104                                 if(!System.Enum.IsDefined(typeof(DayNameFormat),value))\r
105                                         throw new ArgumentException();\r
106                                 ViewState["DayNameFormat"] = value;\r
107                         }\r
108                 }\r
109 \r
110                 public TableItemStyle DayStyle\r
111                 {\r
112                         get\r
113                         {\r
114                                 if(dayStyle==null)\r
115                                         dayStyle = new TableItemStyle();\r
116                                 return dayStyle;\r
117                         }\r
118                 }\r
119                 \r
120                 public FirstDayOfWeek FirstDayOfWeek\r
121                 {\r
122                         get\r
123                         {\r
124                                 object o = ViewState["FirstDayOfWeek"];\r
125                                 if(o!=null)\r
126                                         return (FirstDayOfWeek)o;\r
127                                 return FirstDayOfWeek.Default;\r
128                         }\r
129                         set\r
130                         {\r
131                                 if(!System.Enum.IsDefined(typeof(FirstDayOfWeek), value))\r
132                                         throw new ArgumentException();\r
133                                 ViewState["FirstDayOfWeek"] = value;\r
134                         }\r
135                 }\r
136                 \r
137                 public string NextMonthText\r
138                 {\r
139                         get\r
140                         {\r
141                                 object o = ViewState["NextMonthText"];\r
142                                 if(o!=null)\r
143                                         return (string)o;\r
144                                 return "&gt;";\r
145                         }\r
146                         set\r
147                         {\r
148                                 ViewState["NextMonthText"] = value;\r
149                         }\r
150                 }\r
151                 \r
152                 public NextPrevFormat NextPrevFormat\r
153                 {\r
154                         get\r
155                         {\r
156                                 object o = ViewState["NextPrevFormat"];\r
157                                 if(o!=null)\r
158                                         return (NextPrevFormat)o;\r
159                                 return NextPrevFormat.CustomText;\r
160                         }\r
161                         set\r
162                         {\r
163                                 if(!System.Enum.IsDefined(typeof(NextPrevFormat), value))\r
164                                         throw new ArgumentException();\r
165                                 ViewState["NextPrevFormat"] = value;\r
166                         }\r
167                 }\r
168                 \r
169                 public TableItemStyle NextPrevStyle\r
170                 {\r
171                         get\r
172                         {\r
173                                 if(nextPrevStyle == null)\r
174                                         nextPrevStyle = new TableItemStyle();\r
175                                 return nextPrevStyle;\r
176                         }\r
177                 }\r
178                 \r
179                 public TableItemStyle OtherMonthDayStyle\r
180                 {\r
181                         get\r
182                         {\r
183                                 if(otherMonthDayStyle == null)\r
184                                         otherMonthDayStyle = new TableItemStyle();\r
185                                 return otherMonthDayStyle;\r
186                         }\r
187                 }\r
188                 \r
189                 public string PrevMonthText\r
190                 {\r
191                         get\r
192                         {\r
193                                 object o = ViewState["PrevMonthText"];\r
194                                 if(o!=null)\r
195                                         return (string)o;\r
196                                 return "&lt;";\r
197                         }\r
198                         set\r
199                         {\r
200                                 ViewState["PrevMonthText"] = value;\r
201                         }\r
202                 }\r
203                 \r
204                 public DateTime SelectedDate\r
205                 {\r
206                         // TODO: Am I right here? I got confused with the "Remarks" written in the documentation\r
207                         /*\r
208                          * Looks like I have to first do something with SelectionMode,\r
209                          * then with SelectedDates,\r
210                          * Update when SelectionChanged is called => Link to the function.\r
211                          * Pretty confused at this point\r
212                         */\r
213                         get\r
214                         {\r
215                                 object o = ViewState["SelectedDate"];\r
216                                 if(o!=null)\r
217                                         return (DateTime)o;\r
218                                 return DateTime.MinValue;\r
219                         }\r
220                         set\r
221                         {\r
222                                 ViewState["SelectedDate"] = value;\r
223                         }\r
224                 }\r
225                 \r
226                 public SelectedDatesCollection SelectedDates\r
227                 {\r
228                         get\r
229                         {\r
230                                 if(selectedDates==null)\r
231                                 {\r
232                                         if(selectedDatesList == null)\r
233                                                 selectedDatesList = new ArrayList();\r
234                                         selectedDates = new SelectedDatesCollection(selectedDatesList);\r
235                                 }\r
236                                 return selectedDates;\r
237                         }\r
238                 }\r
239                 \r
240                 public TableItemStyle SelectedDayStyle\r
241                 {\r
242                         get\r
243                         {\r
244                                 if(selectedDayStyle==null)\r
245                                         selectedDayStyle = new TableItemStyle();\r
246                                 return selectedDayStyle;\r
247                         }\r
248                 }\r
249 \r
250                 public CalendarSelectionMode SelectionMode\r
251                 {\r
252                         get\r
253                         {\r
254                                 object o = ViewState["SelectionMode"];\r
255                                 if(o!=null)\r
256                                         return (CalendarSelectionMode)o;\r
257                                 return CalendarSelectionMode.Day;\r
258                         }\r
259                         set\r
260                         {\r
261                                 if(!System.Enum.IsDefined(typeof(CalendarSelectionMode), value))\r
262                                         throw new ArgumentException();\r
263                                 ViewState["SelectionMode"] = value;\r
264                         }\r
265                 }\r
266                 \r
267                 public string SelectedMonthText\r
268                 {\r
269                         get\r
270                         {\r
271                                 object o = ViewState["SelectedMonthText"];\r
272                                 if(o!=null)\r
273                                         return (string)o;\r
274                                 return "&gt;&gt;";\r
275                         }\r
276                         set\r
277                         {\r
278                                 ViewState["SelectedMonthText"] = value;\r
279                         }\r
280                 }\r
281 \r
282                 public TableItemStyle SelectorStyle\r
283                 {\r
284                         get\r
285                         {\r
286                                 if(selectorStyle==null)\r
287                                         selectorStyle = new TableItemStyle();\r
288                                 return selectorStyle;\r
289                         }\r
290                 }\r
291                 \r
292                 public string SelectedWeekText\r
293                 {\r
294                         get\r
295                         {\r
296                                 object o = ViewState["SelectedWeekText"];\r
297                                 if(o!=null)\r
298                                         return (string)o;\r
299                                 return "&gt;";\r
300                         }\r
301                         set\r
302                         {\r
303                                 ViewState["SelectedWeekText"] = value;\r
304                         }\r
305                 }\r
306                 \r
307                 public bool ShowDayHeader\r
308                 {\r
309                         get\r
310                         {\r
311                                 object o = ViewState["ShowDayHeader"];\r
312                                 if(o!=null)\r
313                                         return (bool)o;\r
314                                 return true;\r
315                         }\r
316                         set\r
317                         {\r
318                                 ViewState["ShowDayHeader"] = value;\r
319                         }\r
320                 }\r
321                 \r
322                 public bool ShowGridLines\r
323                 {\r
324                         get\r
325                         {\r
326                                 object o = ViewState["ShowGridLines"];\r
327                                 if(o!=null)\r
328                                         return (bool)o;\r
329                                 return false;\r
330                         }\r
331                         set\r
332                         {\r
333                                 ViewState["ShowGridLines"] = value;\r
334                         }\r
335                 }\r
336                 \r
337                 public bool ShowNextPrevMonth\r
338                 {\r
339                         get\r
340                         {\r
341                                 object o = ViewState["ShowNextPrevMonth"];\r
342                                 if(o!=null)\r
343                                         return (bool)o;\r
344                                 return true;\r
345                         }\r
346                         set\r
347                         {\r
348                                 ViewState["ShowNextPrevMonth"] = value;\r
349                         }\r
350                 }\r
351                 \r
352                 public bool ShowTitle\r
353                 {\r
354                         get\r
355                         {\r
356                                 object o = ViewState["ShowTitle"];\r
357                                 if(o!=null)\r
358                                         return (bool)o;\r
359                                 return true;\r
360                         }\r
361                         set\r
362                         {\r
363                                 ViewState["ShowTitle"] = value;\r
364                         }\r
365                 }\r
366 \r
367                 public TitleFormat TitleFormat\r
368                 {\r
369                         get\r
370                         {\r
371                                 object o = ViewState["TitleFormat"];\r
372                                 if(o!=null)\r
373                                         return (TitleFormat)o;\r
374                                 return TitleFormat.MonthYear;\r
375                         }\r
376                         set\r
377                         {\r
378                                 if(!System.Enum.IsDefined(typeof(TitleFormat), value))\r
379                                         throw new ArgumentException();\r
380                                 ViewState["TitleFormat"] = value;\r
381                         }\r
382                 }\r
383                 \r
384                 public TableItemStyle TitleStyle\r
385                 {\r
386                         get\r
387                         {\r
388                                 if(titleStyle==null)\r
389                                         titleStyle = new TableItemStyle();\r
390                                 return titleStyle;\r
391                         }\r
392                 }\r
393                 \r
394                 public TableItemStyle TodayDayStyle\r
395                 {\r
396                         get\r
397                         {\r
398                                 if(todayDayStyle==null)\r
399                                         todayDayStyle = new TableItemStyle();\r
400                                 return todayDayStyle;\r
401                         }\r
402                 }\r
403                 \r
404                 public DateTime TodaysDate\r
405                 {\r
406                         get\r
407                         {\r
408                                 object o = ViewState["TodaysDate"];\r
409                                 if(o!=null)\r
410                                         return (DateTime)o;\r
411                                 return DateTime.Today;\r
412                         }\r
413                         set\r
414                         {\r
415                                 ViewState["TodaysDate"] = value;\r
416                         }\r
417                 }\r
418                 \r
419                 public DateTime VisibleDate\r
420                 {\r
421                         get\r
422                         {\r
423                                 object o = ViewState["VisibleDate"];\r
424                                 if(o!=null)\r
425                                         return (DateTime)o;\r
426                                 return DateTime.MinValue;\r
427                         }\r
428                         set\r
429                         {\r
430                                 ViewState["VisibleDate"] = value;\r
431                         }\r
432                 }\r
433                 \r
434                 public TableItemStyle WeekendDayStyle\r
435                 {\r
436                         get\r
437                         {\r
438                                 if(weekendDayStyle == null)\r
439                                         weekendDayStyle = new TableItemStyle();\r
440                                 return weekendDayStyle;\r
441                         }\r
442                 }\r
443                 \r
444                 public event DayRenderEventHandler DayRender\r
445                 {\r
446                         add\r
447                         {\r
448                                 Events.AddHandler(DayRenderEvent, value);\r
449                         }\r
450                         remove\r
451                         {\r
452                                 Events.RemoveHandler(DayRenderEvent, value);\r
453                         }\r
454                 }\r
455                 \r
456                 public event EventHandler SelectionChanged\r
457                 {\r
458                         add\r
459                         {\r
460                                 Events.AddHandler(SelectionChangedEvent, value);\r
461                         }\r
462                         remove\r
463                         {\r
464                                 Events.RemoveHandler(SelectionChangedEvent, value);\r
465                         }\r
466                 }\r
467 \r
468                 public event MonthChangedEventHandler VisibleMonthChanged\r
469                 {\r
470                         add\r
471                         {\r
472                                 Events.AddHandler(VisibleMonthChangedEvent, value);\r
473                         }\r
474                         remove\r
475                         {\r
476                                 Events.RemoveHandler(VisibleMonthChangedEvent, value);\r
477                         }\r
478                 }\r
479                 \r
480                 protected virtual void OnDayRender(TableCell cell, CalendarDay day)\r
481                 {\r
482                         if(Events!=null)\r
483                         {\r
484                                 DayRenderEventHandler dreh = (DayRenderEventHandler)(Events[DayRenderEvent]);\r
485                                 if(dreh!=null)\r
486                                         dreh(this, new DayRenderEventArgs(cell, day));\r
487                         }\r
488                 }\r
489                 \r
490                 protected virtual void OnSelectionChanged()\r
491                 {\r
492                         if(Events!=null)\r
493                         {\r
494                                 EventHandler eh = (EventHandler)(Events[SelectionChangedEvent]);\r
495                                 if(eh!=null)\r
496                                         eh(this, new EventArgs());\r
497                         }\r
498                 }\r
499                 \r
500                 protected virtual void OnVisibleMonthChanged(DateTime newDate, DateTime prevDate)\r
501                 {\r
502                         if(Events!=null)\r
503                         {\r
504                                 MonthChangedEventHandler mceh = (MonthChangedEventHandler)(Events[VisibleMonthChangedEvent]);\r
505                                 if(mceh!=null)\r
506                                         mceh(this, new MonthChangedEventArgs(newDate, prevDate));\r
507                         }\r
508                 }\r
509                 \r
510                 public void RaisePostBackEvent(string eventArgument)\r
511                 {\r
512                         //TODO: Implement Me\r
513                         // Written to keep compile get going\r
514                 }\r
515                 \r
516                 protected override void Render(HtmlTextWriter writer)\r
517                 {\r
518                         //TODO: Implement me\r
519                         globCal = DateTimeFormatInfo.CurrentInfo.Calendar;\r
520                         SetFirstCalendarDay(GetEffectiveVisibleDate());\r
521                         /*\r
522                          * ForeColor else defaultTextColor\r
523                          * Draw a table\r
524                          * if(ControlStyleCreated())\r
525                          *      then\r
526                          * {\r
527                          *       ApplyStyle(ControlStyle)\r
528                          * }\r
529                          * GridLines?\r
530                          * RenderBeginTag(writer)\r
531                          * RenderTitle(writer, visibleDate from GetEffectiveVisibleDate, this.SelectionMode, IsEnabled)\r
532                          * if(ShowHeader)\r
533                          *  RenderHeader(writer, visibleDate, SelectionMode, IsEnabled, \r
534                          * RenderAllDays\r
535                          * RenderEndTag(writer)\r
536                          */\r
537                 }\r
538                 \r
539                 protected override ControlCollection CreateControlCollection()\r
540                 {\r
541                         return new EmptyControlCollection(this);\r
542                 }\r
543                 \r
544                 protected override void LoadViewState(object savedState)\r
545                 {\r
546                         if(savedState!=null)\r
547                         {\r
548                                 //TODO: Implement me\r
549                                 //object[] states = (object[]) savedState;\r
550                                 //loadViewState of all the states/styles\r
551                         }\r
552                 }\r
553                 \r
554                 protected override object SaveViewState()\r
555                 {\r
556                         //TODO: Implement me\r
557                         // SaveViewState of all the styles\r
558                 }\r
559                 \r
560                 protected override void TrackViewState()\r
561                 {\r
562                         base.TrackViewState();\r
563                         if(titleStyle!=null)\r
564                         {\r
565                                 titleStyle.TrackViewState();\r
566                         }\r
567                         if(nextPrevStyle!=null)\r
568                         {\r
569                                 nextPrevStyle.TrackViewState();\r
570                         }\r
571                         if(dayStyle!=null)\r
572                         {\r
573                                 dayStyle.TrackViewState();\r
574                         }\r
575                         if(dayHeaderStyle!=null)\r
576                         {\r
577                                 dayHeaderStyle.TrackViewState();\r
578                         }\r
579                         if(todayDayStyle!=null)\r
580                         {\r
581                                 todayDayStyle.TrackViewState();\r
582                         }\r
583                         if(weekendDayStyle!=null)\r
584                         {\r
585                                 weekendDayStyle.TrackViewState();\r
586                         }\r
587                         if(otherMonthStyle!=null)\r
588                         {\r
589                                 otherMonthStyle.TrackViewState();\r
590                         }\r
591                         if(selectedDayStyle!=null)\r
592                         {\r
593                                 selectedDayStyle.TrackViewState();\r
594                         }\r
595                         if(selectorStyle!=null)\r
596                         {\r
597                                 selectorStyle.TrackViewState();\r
598                         }\r
599                 }\r
600                 \r
601                 //TODO: Recheck, I am through with all the functions?\r
602                 \r
603                 private void RenderAllDays(HtmlTextWriter writer, DateTime firstDay, DateTime activeDate, CalendarSelectionMode mode, bool isActive, bool isDownLevel)\r
604                 {\r
605                         //TODO: Implement me\r
606                         /*\r
607                          * "<tr>"\r
608                          * "</tr>"\r
609                          */\r
610                 }\r
611                 \r
612                 private void RenderHeader(HtmlTextWriter writer, DateTime firstDay, CalendarSelectionMode mode, bool isActive, bool isDownLevel)\r
613                 {\r
614                         //TODO: Implement Me\r
615                         /*\r
616                          * "<tr>"\r
617                          * "</tr>"\r
618                          */\r
619                 }\r
620                 \r
621                 private void RenderTitle(HtmlTextWriter writer, DateTime visibleDate, CalendarSelectionMode mode, bool isActive)\r
622                 {\r
623                         //TODO: Implement me\r
624                         /*\r
625                          * Make a row with the following contents: "<tr>"\r
626                          * Draw a table, with cell having the following properties\r
627                          * if(mode==CalendarSelectionMode.DayWeek || mode==CalendarSelectionMode.DayWeekMonth)\r
628                          *      then draw a column with colspan=8\r
629                          * else\r
630                          *      draw with colspan=7\r
631                          * set gridlines?\r
632                          * set width\r
633                          * set cellspacing\r
634                          * ApplyStyleToTitle(table, cell, style)\r
635                          * RenderBeginTag(writer)\r
636                          * RenderBeginTag(writer)\r
637                          * "<tr>"\r
638                          * -> The next/previous months things\r
639                          * GetCalendarText("previousMonth", PrevMonthText, NextPrevStyle.ForeColor, isActive)\r
640                          * RenderCalendarCell(writer, cell, ^^^)\r
641                          * ..\r
642                          * ..\r
643                          * Then for NextMonthText\r
644                          * "</tr>"\r
645                          * "</tr>"\r
646                          */\r
647                 }\r
648                 \r
649                 private void ApplyStyleToTitle(Table table, TableCell cell, TableItemStyle style)\r
650                 {\r
651                         //TODO: Implement me\r
652                         /*\r
653                          * Font\r
654                          * Background color\r
655                          * Foreground color\r
656                          * Border color\r
657                          * Border width\r
658                          * Border style\r
659                          * Vertical alignment\r
660                          */\r
661                 }\r
662                 \r
663                 private void RenderCalendarCell(HtmlTextWriter writer, TableCell cell, string text)\r
664                 {\r
665                         cell.RenderBeginTag(writer);\r
666                         writer.Write(text);\r
667                         cell.RenderEndTag(writer);\r
668                 }\r
669                 \r
670                 private DateTime SetFirstCalendarDay(DateTime visibleDate)\r
671                 {\r
672                         globCal = visibleDate;\r
673                         //TODO: Implement me\r
674                 }\r
675                 \r
676                 private DateTime GetEffectiveVisibleDate()\r
677                 {\r
678                         DateTime dt = VisibleDate;\r
679                         if(dt.Equals(DateTime.MinValue))\r
680                         {\r
681                                 dt = TodaysDate;\r
682                         }\r
683                         return new DateTime(globCal.GetYear(dt), globCal.GetMonth(dt), globCal.GetDayOfMonth(dt), globCal);\r
684                 }\r
685                 \r
686                 /*\r
687                  * Creates text to be displayed, with all attributes if to be\r
688                  * shown as a hyperlink\r
689                  */\r
690                 private string GetCalendarText(string eventArg, string text, Color foreground, bool isLink)\r
691                 {\r
692                         if(isLink)\r
693                         {\r
694                                 StringBuilder dispVal = new StringBuilder();\r
695                                 dispVal.Append("<a href=\"");\r
696                                 dispVal.Append(Page.GetPostBackClientHyperlink(this, eventArg));\r
697                                 dispVal.Append("\" style=\"color: ");\r
698                                 if(foreground.IsEmpty)\r
699                                 {\r
700                                         dispVal.Append(ColorTranslater.ToHtml(defaultTextColor);\r
701                                 } else\r
702                                 {\r
703                                         dispVal.Append(ColorTranslater.ToHtml(foreground);\r
704                                 }\r
705                                 dispVal.Append("\">");\r
706                                 dispVal.Append(text);\r
707                                 dispVal.Append("</a>");\r
708                                 return dispVal.ToString();\r
709                         }\r
710                         return text;\r
711                 }\r
712 \r
713                 private string GetHtmlForCell(TableCell cell, bool showLinks)\r
714                 {\r
715                         StringWriter sw = new StringWriter();\r
716                         HtmlTextWriter htw = new HtmlTextWriter(sw);\r
717                         RenderBeginTag(htw);\r
718                         if(showLinks)\r
719                         {\r
720                                 //sw.Write(GetCalendarText(,,true, ForeColor));\r
721                                 //TODO: Implement me\r
722                         }\r
723                 }\r
724         }\r
725 }\r