Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

ICalendarField.java 11KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288
  1. /*
  2. @ITMillApache2LicenseForJavaFiles@
  3. */
  4. package com.itmill.toolkit.demo.reservation.gwt.client.ui;
  5. import java.util.ArrayList;
  6. import java.util.Date;
  7. import java.util.HashMap;
  8. import java.util.Iterator;
  9. import java.util.List;
  10. import com.google.gwt.i18n.client.DateTimeFormat;
  11. import com.google.gwt.user.client.DOM;
  12. import com.google.gwt.user.client.Element;
  13. import com.google.gwt.user.client.ui.FlexTable;
  14. import com.google.gwt.user.client.ui.SimplePanel;
  15. import com.google.gwt.user.client.ui.SourcesTableEvents;
  16. import com.google.gwt.user.client.ui.TableListener;
  17. import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
  18. import com.itmill.toolkit.terminal.gwt.client.DateTimeService;
  19. import com.itmill.toolkit.terminal.gwt.client.UIDL;
  20. import com.itmill.toolkit.terminal.gwt.client.ui.CalendarEntry;
  21. import com.itmill.toolkit.terminal.gwt.client.ui.ICalendarPanel;
  22. import com.itmill.toolkit.terminal.gwt.client.ui.IDateField;
  23. public class ICalendarField extends IDateField {
  24. private final ICalendarPanel calPanel;
  25. private SimplePanel hourPanel;
  26. private FlexTable hourTable;
  27. private final EntrySource entrySource;
  28. private final TableListener ftListener = new HourTableListener();
  29. private int realResolution = RESOLUTION_DAY;
  30. private static final String CLASSNAME = IDateField.CLASSNAME
  31. + "-entrycalendar";
  32. public ICalendarField() {
  33. super();
  34. setStyleName(CLASSNAME);
  35. calPanel = new ICalendarPanel(this);
  36. add(calPanel);
  37. entrySource = new EntrySource();
  38. calPanel.setCalendarEntrySource(entrySource);
  39. calPanel.addTableListener(new TableListener() {
  40. public void onCellClicked(SourcesTableEvents sender, int row,
  41. int cell) {
  42. buildDayView(date);
  43. }
  44. });
  45. }
  46. public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
  47. super.updateFromUIDL(uidl, client);
  48. // We want to draw our own hour list
  49. realResolution = currentResolution;
  50. currentResolution = RESOLUTION_DAY;
  51. if (uidl.hasAttribute("min")) {
  52. final String mins = uidl.getStringAttribute("min");
  53. final long min = (mins != null ? Long.parseLong(mins) : 0);
  54. final String maxs = uidl.getStringAttribute("max");
  55. final long max = (maxs != null ? Long.parseLong(maxs) : 0);
  56. final Date minDate = (min > 0 ? new Date(min) : null);
  57. final Date maxDate = (max > 0 ? new Date(max) : null);
  58. calPanel.setLimits(minDate, maxDate);
  59. }
  60. entrySource.clear();
  61. for (final Iterator cit = uidl.getChildIterator(); cit.hasNext();) {
  62. final UIDL child = (UIDL) cit.next();
  63. if (child.getTag().equals("items")) {
  64. for (final Iterator iit = child.getChildIterator(); iit
  65. .hasNext();) {
  66. final UIDL item = (UIDL) iit.next();
  67. entrySource.addItem(item);
  68. }
  69. break;
  70. }
  71. }
  72. calPanel.updateCalendar();
  73. buildDayView(date);
  74. }
  75. protected void buildDayView(Date date) {
  76. if (hourPanel == null) {
  77. hourPanel = new SimplePanel();
  78. hourPanel.setStyleName(CLASSNAME + "-hours");
  79. calPanel.getFlexCellFormatter().setColSpan(8, 0, 7);
  80. calPanel.setWidget(8, 0, hourPanel);
  81. } else {
  82. hourPanel.clear();
  83. }
  84. hourTable = new FlexTable();
  85. hourTable.addTableListener(ftListener);
  86. hourPanel.add(hourTable);
  87. hourTable.setCellSpacing(1);
  88. for (int i = 0; i < 24; i++) {
  89. String style = (i % 2 == 0 ? "even" : "odd");
  90. if (realResolution >= RESOLUTION_HOUR) {
  91. if (this.date != null && this.date.getHours() == i) {
  92. style = "selected";
  93. }
  94. }
  95. hourTable.getRowFormatter().setStyleName(i,
  96. CLASSNAME + "-row-" + style);
  97. String hstr = (i < 10 ? "0" : "") + i + ":00";
  98. if (dts.isTwelveHourClock()) {
  99. final String ampm = (i < 12 ? "am" : "pm");
  100. hstr = (i <= 12 ? i : i - 12) + ":00 " + ampm;
  101. }
  102. hourTable.setHTML(i, 0, "<span>" + hstr + "</span>");
  103. hourTable.getCellFormatter()
  104. .setStyleName(i, 0, CLASSNAME + "-time");
  105. }
  106. final List entries = entrySource.getEntries(date,
  107. DateTimeService.RESOLUTION_DAY);
  108. int currentCol = 1;
  109. for (final Iterator it = entries.iterator(); it.hasNext();) {
  110. final CalendarEntry entry = (CalendarEntry) it.next();
  111. int start = 0;
  112. int hours = 24;
  113. if (!entry.isNotime()) {
  114. Date d = entry.getStart();
  115. // TODO consider month&year as well
  116. start = (d.getDate() < date.getDate() ? 0 : d.getHours());
  117. d = entry.getEnd();
  118. hours = (d.getDate() > date.getDate() ? 24 : d.getHours())
  119. - start;
  120. if (hours < 1) {
  121. // We can't draw entries smaller than
  122. // one
  123. hours = 1;
  124. }
  125. }
  126. int col = currentCol;
  127. if (col > 1) {
  128. while (!hourTable.isCellPresent(start, col - 1)) {
  129. col--;
  130. }
  131. }
  132. hourTable.setHTML(start, col, "<span>"
  133. + (entry.getTitle() != null ? entry.getTitle() : "&nbsp")
  134. + "</span>");
  135. hourTable.getFlexCellFormatter().setRowSpan(start, col, hours);
  136. hourTable.getFlexCellFormatter().setStyleName(start, col,
  137. CLASSNAME + "-entry");
  138. final String sn = entry.getStyleName();
  139. if (sn != null && !sn.equals("")) {
  140. hourTable.getFlexCellFormatter().addStyleName(start, col,
  141. CLASSNAME + "-" + entry.getStyleName());
  142. }
  143. final Element el = hourTable.getFlexCellFormatter().getElement(
  144. start, col);
  145. String tooltip;
  146. if (DateTimeService.isSameDay(entry.getStart(), entry.getEnd())) {
  147. tooltip = (start < 10 ? "0" : "") + start + ":00";
  148. if (dts.isTwelveHourClock()) {
  149. final String ampm = (start < 12 ? "am" : "pm");
  150. tooltip = (start <= 12 ? start : start - 12) + ":00 "
  151. + ampm;
  152. }
  153. tooltip += " (" + hours + "h) ";
  154. if (entry.getTitle() != null) {
  155. tooltip += entry.getTitle() + "\n ";
  156. }
  157. } else {
  158. tooltip = entry.getStringForDate(entry.getEnd()) + "\n ";
  159. }
  160. if (entry.getDescription() != null) {
  161. tooltip += "\"" + entry.getDescription() + "\"";
  162. }
  163. DOM.setElementProperty(el, "title", tooltip);
  164. currentCol++;
  165. }
  166. // int hour = new Date().getHours()+1; // scroll to current hour
  167. final int hour = this.date.getHours() + 1; // scroll to selected
  168. // hour
  169. final int h1 = hourPanel.getOffsetHeight() / 2;
  170. final int oh = hourTable.getOffsetHeight();
  171. final int h2 = (int) (hour / 24.0 * oh);
  172. final int scrollTop = h2 - h1;
  173. final Element el = hourPanel.getElement();
  174. setScrollTop(el, scrollTop);
  175. }
  176. private native void setScrollTop(Element el, int scrollTop)
  177. /*-{
  178. el.scrollTop = scrollTop;
  179. }-*/;
  180. private class HourTableListener implements TableListener {
  181. public void onCellClicked(SourcesTableEvents sender, int row, int cell) {
  182. if (realResolution < RESOLUTION_HOUR || date == null) {
  183. return;
  184. }
  185. date.setHours(row);
  186. client.updateVariable(id, "hour", row, immediate);
  187. }
  188. }
  189. private class EntrySource implements ICalendarPanel.CalendarEntrySource {
  190. private final HashMap dates = new HashMap();
  191. public void addItem(UIDL item) {
  192. final String styleName = item.getStringAttribute("styleName");
  193. // final Integer id = new Integer(item.getIntAttribute("id"));
  194. DateTimeFormat dtf = DateTimeFormat
  195. .getFormat("d MM yyyy HH:mm:ss Z");
  196. Date startDate = dtf.parse(item.getStringAttribute("start"));
  197. // fix times with server-client difference
  198. int diff = (startDate.getTimezoneOffset() - item
  199. .getIntAttribute("Z")) * 60000;
  200. startDate = new Date(startDate.getTime() + diff);
  201. Date endDate;
  202. if (item.hasAttribute("end")) {
  203. endDate = dtf.parse(item.getStringAttribute("end"));
  204. endDate = new Date(endDate.getTime() + diff);
  205. } else {
  206. endDate = (Date) startDate.clone();
  207. }
  208. final String title = item.getStringAttribute("title");
  209. final String desc = item.getStringAttribute("description");
  210. final boolean notime = item.getBooleanAttribute("notime");
  211. final CalendarEntry entry = new CalendarEntry(styleName, startDate,
  212. endDate, title, desc, notime);
  213. // TODO should remove+readd if the same entry (id) is
  214. // added again
  215. for (final Date d = new Date(entry.getStart().getTime()); d
  216. .getYear() <= entry.getEnd().getYear()
  217. && d.getMonth() <= entry.getEnd().getYear()
  218. && d.getDate() <= entry.getEnd().getDate(); d.setTime(d
  219. .getTime() + 86400000)) {
  220. final String key = d.getYear() + "" + d.getMonth() + ""
  221. + d.getDate();
  222. ArrayList l = (ArrayList) dates.get(key);
  223. if (l == null) {
  224. l = new ArrayList();
  225. dates.put(key, l);
  226. }
  227. l.add(entry);
  228. }
  229. }
  230. public List getEntries(Date date, int resolution) {
  231. final List entries = (List) dates.get(date.getYear() + ""
  232. + date.getMonth() + "" + date.getDate());
  233. final ArrayList res = new ArrayList();
  234. if (entries == null) {
  235. return res;
  236. }
  237. for (final Iterator it = entries.iterator(); it.hasNext();) {
  238. final CalendarEntry item = (CalendarEntry) it.next();
  239. if (DateTimeService.isInRange(date, item.getStart(), item
  240. .getEnd(), resolution)) {
  241. res.add(item);
  242. }
  243. }
  244. return res;
  245. }
  246. public void clear() {
  247. dates.clear();
  248. }
  249. }
  250. }