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