Calendar.cs 15 KB

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