--- /dev/null
+package com.itmill.toolkit.demo.reservation;\r
+\r
+import java.util.Collection;\r
+import java.util.Date;\r
+import java.util.Iterator;\r
+\r
+import com.itmill.toolkit.data.Container;\r
+import com.itmill.toolkit.data.Item;\r
+import com.itmill.toolkit.data.Property;\r
+import com.itmill.toolkit.terminal.PaintException;\r
+import com.itmill.toolkit.terminal.PaintTarget;\r
+import com.itmill.toolkit.ui.DateField;\r
+\r
+// TODO use Calendar\r
+// TODO lazyLoading\r
+// TODO check date limit when updating variables\r
+// TODO Allow item selection\r
+public class CalendarField extends DateField implements Container.Viewer {\r
+\r
+ private Date minDate;\r
+ private Date maxDate;\r
+\r
+ private Container dataSource;\r
+ private Object itemStyleNamePropertyId;\r
+ private Object itemStartPropertyId;\r
+ private Object itemEndPropertyId;\r
+ private Object itemTitlePropertyId;\r
+ private Object itemDescriptionPropertyId;\r
+ private Object itemNotimePropertyId;\r
+\r
+ public CalendarField() {\r
+ super();\r
+ init();\r
+ }\r
+\r
+ public CalendarField(Property dataSource) throws IllegalArgumentException {\r
+ super(dataSource);\r
+ init();\r
+ }\r
+\r
+ public CalendarField(String caption, Date value) {\r
+ super(caption, value);\r
+ init();\r
+ }\r
+\r
+ public CalendarField(String caption, Property dataSource) {\r
+ super(caption, dataSource);\r
+ init();\r
+ }\r
+\r
+ public CalendarField(String caption) {\r
+ super(caption);\r
+ init();\r
+ }\r
+\r
+ /*\r
+ * Gets the components UIDL tag string. Don't add a JavaDoc comment here, we\r
+ * use the default documentation from implemented interface.\r
+ */\r
+ public String getTag() {\r
+ return "calendarfield";\r
+ }\r
+\r
+ public void init() {\r
+ super.setResolution(RESOLUTION_HOUR);\r
+\r
+ }\r
+\r
+ /**\r
+ * Sets the resolution of the CalendarField. Only RESOLUTION_DAY and\r
+ * RESOLUTION_HOUR are supported.\r
+ * \r
+ * @param resolution\r
+ * the resolution to set.\r
+ * @see com.itmill.toolkit.ui.DateField#setResolution(int)\r
+ */\r
+ public void setResolution(int resolution) {\r
+ if (resolution != RESOLUTION_DAY && resolution != RESOLUTION_HOUR) {\r
+ throw new IllegalArgumentException();\r
+ }\r
+ super.setResolution(resolution);\r
+ }\r
+\r
+ public void setMinimumDate(Date date) {\r
+ this.minDate = date;\r
+ requestRepaint();\r
+ }\r
+\r
+ public Date getMinimumDate() {\r
+ return minDate;\r
+ }\r
+\r
+ public void setMaximumDate(Date date) {\r
+ this.maxDate = date;\r
+ requestRepaint();\r
+ }\r
+\r
+ public Date getMaximumDate() {\r
+ return maxDate;\r
+ }\r
+\r
+ public Container getContainerDataSource() {\r
+ return this.dataSource;\r
+ }\r
+\r
+ public void setContainerDataSource(Container newDataSource) {\r
+ if (newDataSource == null || checkDataSource(newDataSource)) {\r
+ this.dataSource = newDataSource;\r
+ } else {\r
+ // TODO error message\r
+ throw new IllegalArgumentException();\r
+ }\r
+ requestRepaint();\r
+ }\r
+\r
+ private boolean checkDataSource(Container dataSource) {\r
+ /*\r
+ * if (!(dataSource instanceof Container.Sortable)) { // we really want\r
+ * the data source to be sortable return false; }\r
+ */\r
+ // Check old propertyIds\r
+ if (this.itemEndPropertyId != null) {\r
+ Class c = dataSource.getType(this.itemEndPropertyId);\r
+ if (!Date.class.isAssignableFrom(c)) {\r
+ this.itemEndPropertyId = null;\r
+ }\r
+ }\r
+ if (this.itemNotimePropertyId != null) {\r
+ Class c = dataSource.getType(this.itemNotimePropertyId);\r
+ if (!Boolean.class.isAssignableFrom(c)) {\r
+ this.itemNotimePropertyId = null;\r
+ }\r
+ }\r
+ if (this.itemStartPropertyId != null) {\r
+ Class c = dataSource.getType(this.itemStartPropertyId);\r
+ if (Date.class.isAssignableFrom(c)) {\r
+ // All we _really_ need is one date\r
+ return true;\r
+ } else {\r
+ this.itemStartPropertyId = null;\r
+ }\r
+ }\r
+ // We need at least one Date\r
+ Collection ids = dataSource.getContainerPropertyIds();\r
+ for (Iterator it = ids.iterator(); it.hasNext();) {\r
+ Object id = it.next();\r
+ Class c = dataSource.getType(id);\r
+ if (Date.class.isAssignableFrom(c)) {\r
+ this.itemStartPropertyId = id;\r
+ return true;\r
+ }\r
+ }\r
+\r
+ return false;\r
+ }\r
+\r
+ public Object getItemStyleNamePropertyId() {\r
+ return itemStyleNamePropertyId;\r
+ }\r
+\r
+ public void setItemStyleNamePropertyId(Object propertyId) {\r
+ this.itemStyleNamePropertyId = propertyId;\r
+ }\r
+\r
+ public Object getItemStartPropertyId() {\r
+ return itemStartPropertyId;\r
+ }\r
+\r
+ public void setItemStartPropertyId(Object propertyId) {\r
+ // TODO nullcheck for property id\r
+ if (this.dataSource != null\r
+ && !Date.class.isAssignableFrom(dataSource.getType(propertyId))) {\r
+ // TODO error message\r
+ throw new IllegalArgumentException();\r
+ }\r
+ this.itemStartPropertyId = propertyId;\r
+ }\r
+\r
+ public Object getItemEndPropertyId() {\r
+ return itemEndPropertyId;\r
+ }\r
+\r
+ public void setItemEndPropertyId(Object propertyId) {\r
+ // TODO nullcheck for property id\r
+ if (this.dataSource != null\r
+ && !Date.class.isAssignableFrom(dataSource.getType(propertyId))) {\r
+ // TODO error message\r
+ throw new IllegalArgumentException();\r
+ }\r
+ this.itemEndPropertyId = propertyId;\r
+ }\r
+\r
+ public Object getItemTitlePropertyId() {\r
+ return itemTitlePropertyId;\r
+ }\r
+\r
+ public void setItemTitlePropertyId(Object propertyId) {\r
+ this.itemTitlePropertyId = propertyId;\r
+ }\r
+\r
+ public Object getItemDescriptionPropertyId() {\r
+ return itemDescriptionPropertyId;\r
+ }\r
+\r
+ public void setItemDescriptionPropertyId(Object propertyId) {\r
+ this.itemDescriptionPropertyId = propertyId;\r
+ }\r
+\r
+ public Object getitemNotimePropertyId() {\r
+ return itemNotimePropertyId;\r
+ }\r
+\r
+ public void setItemNotimePropertyId(Object propertyId) {\r
+ // TODO nullcheck for property id\r
+ if (this.dataSource != null\r
+ && !Boolean.class.isAssignableFrom(dataSource\r
+ .getType(propertyId))) {\r
+ // TODO error message\r
+ throw new IllegalArgumentException();\r
+ }\r
+ this.itemNotimePropertyId = propertyId;\r
+ }\r
+\r
+ /**\r
+ * Paints the content of this component.\r
+ * \r
+ * @param target\r
+ * the Paint Event.\r
+ * @throws PaintException\r
+ * if the paint operation failed.\r
+ */\r
+ public void paintContent(PaintTarget target) throws PaintException {\r
+ super.paintContent(target);\r
+\r
+ if (this.minDate != null) {\r
+ target.addAttribute("min", String.valueOf(this.minDate.getTime()));\r
+ }\r
+ if (this.maxDate != null) {\r
+ target.addAttribute("max", String.valueOf(this.maxDate.getTime()));\r
+ }\r
+\r
+ if (this.dataSource != null) {\r
+ target.startTag("items");\r
+\r
+ // send one month now, the rest via lazyloading\r
+ int month = new Date().getMonth();\r
+ Object value = getValue();\r
+ if (value != null && value instanceof Date) {\r
+ month = ((Date) value).getMonth();\r
+ }\r
+\r
+ for (Iterator it = this.dataSource.getItemIds().iterator(); it\r
+ .hasNext();) {\r
+ Object itemId = it.next();\r
+ Item item = (Item) this.dataSource.getItem(itemId);\r
+ Property p = item.getItemProperty(this.itemStartPropertyId);\r
+ Date start = (Date) p.getValue();\r
+ Date end = start; // assume same day\r
+ if (this.itemEndPropertyId != null) {\r
+ p = item.getItemProperty(this.itemEndPropertyId);\r
+ end = (Date) p.getValue();\r
+ if (end == null) {\r
+ end = start;\r
+ } else if (end.before(start)) {\r
+ Date tmp = start;\r
+ start = end;\r
+ end = tmp;\r
+ }\r
+ }\r
+\r
+ if (start != null) {\r
+ if ((start.getMonth() <= month || end.getMonth() >= month)) {\r
+ target.startTag("item");\r
+ // TODO different id?\r
+ target.addAttribute("id", itemId.hashCode());\r
+ p = item.getItemProperty(this.itemStyleNamePropertyId);\r
+ String styleName = (String) p.getValue();\r
+ target.addAttribute("styleName", styleName);\r
+ target.addAttribute("start", "" + start.getTime());\r
+ if (end != start) {\r
+ target.addAttribute("end", "" + end.getTime());\r
+ }\r
+ if (this.itemTitlePropertyId != null) {\r
+ p = item.getItemProperty(this.itemTitlePropertyId);\r
+ Object val = p.getValue();\r
+ if (val != null) {\r
+ target.addAttribute("title", val.toString());\r
+ }\r
+ }\r
+ if (this.itemDescriptionPropertyId != null) {\r
+ p = item\r
+ .getItemProperty(this.itemDescriptionPropertyId);\r
+ Object val = p.getValue();\r
+ if (val != null) {\r
+ target.addAttribute("description", val\r
+ .toString());\r
+ }\r
+ }\r
+ if (this.itemNotimePropertyId != null) {\r
+ p = item.getItemProperty(this.itemNotimePropertyId);\r
+ Object val = p.getValue();\r
+ if (val != null) {\r
+ target.addAttribute("notime", ((Boolean) val)\r
+ .booleanValue());\r
+ }\r
+ }\r
+\r
+ target.endTag("item");\r
+ }\r
+ }\r
+ }\r
+\r
+ target.endTag("items");\r
+ }\r
+ }\r
+}\r