2001-12-01 Gaurav Vaish <gvaish@iitk.ac.in>
[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                         throw new NotImplementedException();\r
515                 }\r
516                 \r
517                 protected override void Render(HtmlTextWriter writer)\r
518                 {\r
519                         //TODO: Implement me\r
520                         throw new NotImplementedException();\r
521                         globCal = DateTimeFormatInfo.CurrentInfo.Calendar;\r
522                         SetFirstCalendarDay(GetEffectiveVisibleDate());\r
523                         /*\r
524                          * ForeColor else defaultTextColor\r
525                          * Draw a table\r
526                          * if(ControlStyleCreated())\r
527                          *      then\r
528                          * {\r
529                          *       ApplyStyle(ControlStyle)\r
530                          * }\r
531                          * GridLines?\r
532                          * RenderBeginTag(writer)\r
533                          * RenderTitle(writer, visibleDate from GetEffectiveVisibleDate, this.SelectionMode, IsEnabled)\r
534                          * if(ShowHeader)\r
535                          *  RenderHeader(writer, visibleDate, SelectionMode, IsEnabled, \r
536                          * RenderAllDays\r
537                          * RenderEndTag(writer)\r
538                          */\r
539                 }\r
540                 \r
541                 protected override ControlCollection CreateControlCollection()\r
542                 {\r
543                         return new EmptyControlCollection(this);\r
544                 }\r
545                 \r
546                 protected override void LoadViewState(object savedState)\r
547                 {\r
548                         if(savedState!=null)\r
549                         {\r
550                                 //TODO: Implement me\r
551                                 //object[] states = (object[]) savedState;\r
552                                 //loadViewState of all the states/styles\r
553                         }\r
554                         throw new NotImplementedException();\r
555                 }\r
556                 \r
557                 protected override object SaveViewState()\r
558                 {\r
559                         //TODO: Implement me\r
560                         // SaveViewState of all the styles\r
561                         throw new NotImplementedException();\r
562                 }\r
563                 \r
564                 protected override void TrackViewState()\r
565                 {\r
566                         base.TrackViewState();\r
567                         if(titleStyle!=null)\r
568                         {\r
569                                 titleStyle.TrackViewState();\r
570                         }\r
571                         if(nextPrevStyle!=null)\r
572                         {\r
573                                 nextPrevStyle.TrackViewState();\r
574                         }\r
575                         if(dayStyle!=null)\r
576                         {\r
577                                 dayStyle.TrackViewState();\r
578                         }\r
579                         if(dayHeaderStyle!=null)\r
580                         {\r
581                                 dayHeaderStyle.TrackViewState();\r
582                         }\r
583                         if(todayDayStyle!=null)\r
584                         {\r
585                                 todayDayStyle.TrackViewState();\r
586                         }\r
587                         if(weekendDayStyle!=null)\r
588                         {\r
589                                 weekendDayStyle.TrackViewState();\r
590                         }\r
591                         if(otherMonthStyle!=null)\r
592                         {\r
593                                 otherMonthStyle.TrackViewState();\r
594                         }\r
595                         if(selectedDayStyle!=null)\r
596                         {\r
597                                 selectedDayStyle.TrackViewState();\r
598                         }\r
599                         if(selectorStyle!=null)\r
600                         {\r
601                                 selectorStyle.TrackViewState();\r
602                         }\r
603                 }\r
604                 \r
605                 //TODO: Recheck, I am through with all the functions?\r
606                 \r
607                 private void RenderAllDays(HtmlTextWriter writer, DateTime firstDay, DateTime activeDate, CalendarSelectionMode mode, bool isActive, bool isDownLevel)\r
608                 {\r
609                         throw new NotImplementedException();\r
610                         //TODO: Implement me\r
611                         /*\r
612                          * "<tr>"\r
613                          * "</tr>"\r
614                          */\r
615                 }\r
616                 \r
617                 private void RenderHeader(HtmlTextWriter writer, DateTime firstDay, CalendarSelectionMode mode, bool isActive, bool isDownLevel)\r
618                 {\r
619                         throw new NotImplementedException();\r
620                         //TODO: Implement Me\r
621                         /*\r
622                          * "<tr>"\r
623                          * "</tr>"\r
624                          */\r
625                 }\r
626                 \r
627                 private void RenderTitle(HtmlTextWriter writer, DateTime visibleDate, CalendarSelectionMode mode, bool isActive)\r
628                 {\r
629                         throw new NotImplementedException();\r
630                         //TODO: Implement me\r
631                         /*\r
632                          * Make a row with the following contents: "<tr>"\r
633                          * Draw a table, with cell having the following properties\r
634                          * if(mode==CalendarSelectionMode.DayWeek || mode==CalendarSelectionMode.DayWeekMonth)\r
635                          *      then draw a column with colspan=8\r
636                          * else\r
637                          *      draw with colspan=7\r
638                          * set gridlines?\r
639                          * set width\r
640                          * set cellspacing\r
641                          * ApplyStyleToTitle(table, cell, style)\r
642                          * RenderBeginTag(writer)\r
643                          * RenderBeginTag(writer)\r
644                          * "<tr>"\r
645                          * -> The next/previous months things\r
646                          * GetCalendarText("previousMonth", PrevMonthText, NextPrevStyle.ForeColor, isActive)\r
647                          * RenderCalendarCell(writer, cell, ^^^)\r
648                          * ..\r
649                          * ..\r
650                          * Then for NextMonthText\r
651                          * "</tr>"\r
652                          * "</tr>"\r
653                          */\r
654                 }\r
655                 \r
656                 private void ApplyStyleToTitle(Table table, TableCell cell, TableItemStyle style)\r
657                 {\r
658                         throw new NotImplementedException();\r
659                         //TODO: Implement me\r
660                         /*\r
661                          * Font\r
662                          * Background color\r
663                          * Foreground color\r
664                          * Border color\r
665                          * Border width\r
666                          * Border style\r
667                          * Vertical alignment\r
668                          */\r
669                 }\r
670                 \r
671                 private void RenderCalendarCell(HtmlTextWriter writer, TableCell cell, string text)\r
672                 {\r
673                         cell.RenderBeginTag(writer);\r
674                         writer.Write(text);\r
675                         cell.RenderEndTag(writer);\r
676                 }\r
677                 \r
678                 private DateTime SetFirstCalendarDay(DateTime visibleDate)\r
679                 {\r
680                         globCal = visibleDate;\r
681                         throw new NotImplementedException();\r
682                         //TODO: Implement me\r
683                 }\r
684                 \r
685                 private DateTime GetEffectiveVisibleDate()\r
686                 {\r
687                         DateTime dt = VisibleDate;\r
688                         if(dt.Equals(DateTime.MinValue))\r
689                         {\r
690                                 dt = TodaysDate;\r
691                         }\r
692                         return new DateTime(globCal.GetYear(dt), globCal.GetMonth(dt), globCal.GetDayOfMonth(dt), globCal);\r
693                 }\r
694                 \r
695                 /*\r
696                  * Creates text to be displayed, with all attributes if to be\r
697                  * shown as a hyperlink\r
698                  */\r
699                 private string GetCalendarText(string eventArg, string text, Color foreground, bool isLink)\r
700                 {\r
701                         if(isLink)\r
702                         {\r
703                                 StringBuilder dispVal = new StringBuilder();\r
704                                 dispVal.Append("<a href=\"");\r
705                                 dispVal.Append(Page.GetPostBackClientHyperlink(this, eventArg));\r
706                                 dispVal.Append("\" style=\"color: ");\r
707                                 if(foreground.IsEmpty)\r
708                                 {\r
709                                         dispVal.Append(ColorTranslater.ToHtml(defaultTextColor);\r
710                                 } else\r
711                                 {\r
712                                         dispVal.Append(ColorTranslater.ToHtml(foreground);\r
713                                 }\r
714                                 dispVal.Append("\">");\r
715                                 dispVal.Append(text);\r
716                                 dispVal.Append("</a>");\r
717                                 return dispVal.ToString();\r
718                         }\r
719                         return text;\r
720                 }\r
721 \r
722                 private string GetHtmlForCell(TableCell cell, bool showLinks)\r
723                 {\r
724                         StringWriter sw = new StringWriter();\r
725                         HtmlTextWriter htw = new HtmlTextWriter(sw);\r
726                         RenderBeginTag(htw);\r
727                         if(showLinks)\r
728                         {\r
729                                 //sw.Write(GetCalendarText(,,true, ForeColor));\r
730                                 //TODO: Implement me\r
731                         }\r
732                         throw new NotImplementedException();\r
733                 }\r
734         }\r
735 }\r