2
0

Calendar.cs 15 KB

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