]> source.dussan.org Git - vaadin-framework.git/commitdiff
ICalendar -> ICalendarField (#1017)
authorMarc Englund <marc.englund@itmill.com>
Tue, 23 Oct 2007 07:21:13 +0000 (07:21 +0000)
committerMarc Englund <marc.englund@itmill.com>
Tue, 23 Oct 2007 07:21:13 +0000 (07:21 +0000)
svn changeset:2583/svn branch:trunk

src/com/itmill/toolkit/demo/reservation/CalendarField.java
src/com/itmill/toolkit/demo/reservation/gwt/client/WidgetSet.java
src/com/itmill/toolkit/demo/reservation/gwt/client/ui/ICalendar.java [deleted file]
src/com/itmill/toolkit/demo/reservation/gwt/client/ui/ICalendarField.java [new file with mode: 0644]

index a0c217e443b04222483a6b7be841af752547f0ae..8cd67500a2d8a9ffb6b294e66f4ed2e0be6cb84a 100644 (file)
@@ -11,12 +11,13 @@ import com.itmill.toolkit.terminal.PaintException;
 import com.itmill.toolkit.terminal.PaintTarget;\r
 import com.itmill.toolkit.ui.DateField;\r
 \r
-// TODO use Calendar\r
-// TODO lazyLoading\r
+// TODO send one month at a time, do 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 static final String TAGNAME = "calendarfield";\r
+       \r
        private Date minDate;\r
        private Date maxDate;\r
 \r
@@ -58,7 +59,7 @@ public class CalendarField extends DateField implements Container.Viewer {
         * use the default documentation from implemented interface.\r
         */\r
        public String getTag() {\r
-               return "calendarfield";\r
+               return TAGNAME;\r
        }\r
 \r
        public void init() {\r
@@ -114,10 +115,7 @@ public class CalendarField extends DateField implements Container.Viewer {
        }\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
+\r
                // Check old propertyIds\r
                if (this.itemEndPropertyId != null) {\r
                        Class c = dataSource.getType(this.itemEndPropertyId);\r
index f5a626017e262cf83f7fdab9d2371882e0767d5d..7920bc3dbc1bbd95f4eee30797ed16612bfd86eb 100644 (file)
@@ -2,7 +2,7 @@ package com.itmill.toolkit.demo.reservation.gwt.client;
 \r
 import com.google.gwt.core.client.GWT;\r
 import com.google.gwt.user.client.ui.Widget;\r
-import com.itmill.toolkit.demo.reservation.gwt.client.ui.ICalendar;\r
+import com.itmill.toolkit.demo.reservation.gwt.client.ui.ICalendarField;\r
 import com.itmill.toolkit.demo.reservation.gwt.client.ui.IGoogleMap;\r
 import com.itmill.toolkit.terminal.gwt.client.DefaultWidgetSet;\r
 import com.itmill.toolkit.terminal.gwt.client.UIDL;\r
@@ -13,9 +13,9 @@ public class WidgetSet extends DefaultWidgetSet {
                if ("com.itmill.toolkit.terminal.gwt.client.ui.IGoogleMap"\r
                                .equals(className)) {\r
                        return new IGoogleMap();\r
-               } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ICalendar"\r
+               } else if ("com.itmill.toolkit.terminal.gwt.client.ui.ICalendarField"\r
                                .equals(className)) {\r
-                       return new ICalendar();\r
+                       return new ICalendarField();\r
                }\r
 \r
                return super.createWidget(uidl);\r
@@ -27,7 +27,7 @@ public class WidgetSet extends DefaultWidgetSet {
                if ("googlemap".equals(tag)) {\r
                        return "com.itmill.toolkit.terminal.gwt.client.ui.IGoogleMap";\r
                } else if ("calendarfield".equals(tag)) {\r
-                       return "com.itmill.toolkit.terminal.gwt.client.ui.ICalendar";\r
+                       return "com.itmill.toolkit.terminal.gwt.client.ui.ICalendarField";\r
                }\r
 \r
                return super.resolveWidgetTypeName(uidl);\r
diff --git a/src/com/itmill/toolkit/demo/reservation/gwt/client/ui/ICalendar.java b/src/com/itmill/toolkit/demo/reservation/gwt/client/ui/ICalendar.java
deleted file mode 100644 (file)
index 3dadb9a..0000000
+++ /dev/null
@@ -1,272 +0,0 @@
-package com.itmill.toolkit.demo.reservation.gwt.client.ui;\r
-\r
-import java.util.ArrayList;\r
-import java.util.Date;\r
-import java.util.HashMap;\r
-import java.util.Iterator;\r
-import java.util.List;\r
-\r
-import com.google.gwt.user.client.DOM;\r
-import com.google.gwt.user.client.Element;\r
-import com.google.gwt.user.client.ui.FlexTable;\r
-import com.google.gwt.user.client.ui.SimplePanel;\r
-import com.google.gwt.user.client.ui.SourcesTableEvents;\r
-import com.google.gwt.user.client.ui.TableListener;\r
-import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;\r
-import com.itmill.toolkit.terminal.gwt.client.DateTimeService;\r
-import com.itmill.toolkit.terminal.gwt.client.UIDL;\r
-import com.itmill.toolkit.terminal.gwt.client.ui.CalendarEntry;\r
-import com.itmill.toolkit.terminal.gwt.client.ui.CalendarPanel;\r
-import com.itmill.toolkit.terminal.gwt.client.ui.IDateField;\r
-import com.itmill.toolkit.terminal.gwt.client.ui.CalendarPanel.CalendarEntrySource;\r
-\r
-public class ICalendar extends IDateField {\r
-\r
-       private CalendarPanel calPanel;\r
-\r
-       private SimplePanel hourPanel;\r
-\r
-       private FlexTable hourTable;\r
-\r
-       private EntrySource entrySource;\r
-\r
-       private TableListener ftListener = new HourTableListener();\r
-\r
-       private int realResolution = RESOLUTION_DAY;\r
-\r
-       private static final String CLASSNAME = IDateField.CLASSNAME\r
-                       + "-entrycalendar";\r
-\r
-       public ICalendar() {\r
-               super();\r
-               setStyleName(CLASSNAME);\r
-               calPanel = new CalendarPanel(this);\r
-               add(calPanel);\r
-               this.entrySource = new EntrySource();\r
-               calPanel.setCalendarEntrySource(this.entrySource);\r
-               calPanel.addTableListener(new TableListener() {\r
-                       public void onCellClicked(SourcesTableEvents sender, int row,\r
-                                       int cell) {\r
-                               buildDayView(date);\r
-                       }\r
-               });\r
-       }\r
-\r
-       public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {\r
-               super.updateFromUIDL(uidl, client);\r
-               // We want to draw our own hour list\r
-               this.realResolution = currentResolution;\r
-               this.currentResolution = RESOLUTION_DAY;\r
-               if (uidl.hasAttribute("min")) {\r
-                       String mins = uidl.getStringAttribute("min");\r
-                       long min = (mins != null ? Long.parseLong(mins) : 0);\r
-                       String maxs = uidl.getStringAttribute("max");\r
-                       long max = (maxs != null ? Long.parseLong(maxs) : 0);\r
-                       Date minDate = (min > 0 ? new Date(min) : null);\r
-                       Date maxDate = (max > 0 ? new Date(max) : null);\r
-                       calPanel.setLimits(minDate, maxDate);\r
-               }\r
-               this.entrySource.clear();\r
-               for (Iterator cit = uidl.getChildIterator(); cit.hasNext();) {\r
-                       UIDL child = (UIDL) cit.next();\r
-                       if (child.getTag().equals("items")) {\r
-                               for (Iterator iit = child.getChildIterator(); iit.hasNext();) {\r
-                                       UIDL item = (UIDL) iit.next();\r
-                                       this.entrySource.addItem(item);\r
-                               }\r
-                               break;\r
-                       }\r
-               }\r
-               calPanel.updateCalendar();\r
-               buildDayView(this.date);\r
-       }\r
-\r
-       protected void buildDayView(Date date) {\r
-               boolean firstRender = true;\r
-               if (this.hourPanel == null) {\r
-                       this.hourPanel = new SimplePanel();\r
-                       this.hourPanel.setStyleName(CLASSNAME + "-hours");\r
-                       this.calPanel.getFlexCellFormatter().setColSpan(8, 0, 7);\r
-                       this.calPanel.setWidget(8, 0, this.hourPanel);\r
-               } else {\r
-                       firstRender = false;\r
-                       this.hourPanel.clear();\r
-               }\r
-               this.hourTable = new FlexTable();\r
-               this.hourTable.addTableListener(this.ftListener);\r
-               this.hourPanel.add(this.hourTable);\r
-               this.hourTable.setCellSpacing(1);\r
-\r
-               for (int i = 0; i < 24; i++) {\r
-                       String style = (i % 2 == 0 ? "even" : "odd");\r
-                       if (realResolution >= RESOLUTION_HOUR) {\r
-                               if (this.date != null && this.date.getHours() == i) {\r
-                                       style = "selected";\r
-                               }\r
-                       }\r
-                       hourTable.getRowFormatter().setStyleName(i,\r
-                                       CLASSNAME + "-row-" + style);\r
-                       String hstr = (i < 10 ? "0" : "") + i + ":00";\r
-                       if (this.dts.isTwelveHourClock()) {\r
-                               String ampm = (i < 12 ? "am" : "pm");\r
-                               hstr = (i <= 12 ? i : i - 12) + ":00 " + ampm;\r
-                       }\r
-                       hourTable.setHTML(i, 0, "<span>" + hstr + "</span>");\r
-                       hourTable.getCellFormatter()\r
-                                       .setStyleName(i, 0, CLASSNAME + "-time");\r
-               }\r
-\r
-               List entries = this.entrySource.getEntries(date,\r
-                               DateTimeService.RESOLUTION_DAY);\r
-               int currentCol = 1;\r
-               for (Iterator it = entries.iterator(); it.hasNext();) {\r
-                       CalendarEntry entry = (CalendarEntry) it.next();\r
-                       int start = 0;\r
-                       int hours = 24;\r
-                       if (!entry.isNotime()) {\r
-                               Date d = entry.getStart();\r
-                               // TODO consider month&year as well\r
-                               start = (d.getDate() < date.getDate() ? 0 : d.getHours());\r
-                               d = entry.getEnd();\r
-                               hours = (d.getDate() > date.getDate() ? 24 : d.getHours())\r
-                                               - start;\r
-                               if (hours == 0) {\r
-                                       // We can't draw entries smaller than one\r
-                                       hours = 1;\r
-                               }\r
-                       }\r
-                       int col = currentCol;\r
-                       if (col > 1) {\r
-                               while (!this.hourTable.isCellPresent(start, col - 1))\r
-                                       col--;\r
-                       }\r
-                       this.hourTable.setHTML(start, col, "<span>"\r
-                                       + (entry.getTitle() != null ? entry.getTitle() : "&nbsp")\r
-                                       + "</span>");\r
-                       this.hourTable.getFlexCellFormatter().setRowSpan(start, col, hours);\r
-                       this.hourTable.getFlexCellFormatter().setStyleName(start, col,\r
-                                       CLASSNAME + "-entry");\r
-                       String sn = entry.getStyleName();\r
-                       if (sn != null && !sn.equals("")) {\r
-                               this.hourTable.getFlexCellFormatter().addStyleName(start, col,\r
-                                               CLASSNAME + "-" + entry.getStyleName());\r
-                       }\r
-                       Element el = this.hourTable.getFlexCellFormatter().getElement(\r
-                                       start, col);\r
-\r
-                       String tooltip;\r
-                       if (DateTimeService.isSameDay(entry.getStart(), entry.getEnd())) {\r
-                               tooltip = (start < 10 ? "0" : "") + start + ":00";\r
-                               if (this.dts.isTwelveHourClock()) {\r
-                                       String ampm = (start < 12 ? "am" : "pm");\r
-                                       tooltip = (start <= 12 ? start : start - 12) + ":00 "\r
-                                                       + ampm;\r
-\r
-                               }\r
-                               tooltip += " (" + hours + "h) ";\r
-                               if (entry.getTitle()!=null) {\r
-                                       tooltip += entry.getTitle() + "\n ";\r
-                               }\r
-                       } else {\r
-                               tooltip = entry.getStringForDate(entry.getEnd()) + "\n ";\r
-                       }\r
-                       if (entry.getDescription()!=null) {\r
-                               tooltip += "\"" + entry.getDescription() + "\"";\r
-                       }\r
-                       DOM.setElementProperty(el, "title", tooltip);\r
-\r
-                       currentCol++;\r
-               }\r
-\r
-               // int hour = new Date().getHours()+1; // scroll to current hour\r
-               int hour = this.date.getHours() + 1; // scroll to selected hour\r
-               int h1 = (int) this.hourPanel.getOffsetHeight() / 2;\r
-               int oh = this.hourTable.getOffsetHeight();\r
-               int h2 = (int) (hour / 24.0 * oh);\r
-               int scrollTop = (int) h2 - h1;\r
-               Element el = this.hourPanel.getElement();\r
-               setScrollTop(el, scrollTop);\r
-\r
-       }\r
-\r
-       private native void setScrollTop(Element el, int scrollTop) /*-{\r
-           el.scrollTop = scrollTop;\r
-         }-*/;\r
-\r
-       private class HourTableListener implements TableListener {\r
-\r
-               public void onCellClicked(SourcesTableEvents sender, int row, int cell) {\r
-                       if (realResolution < RESOLUTION_HOUR || date == null) {\r
-                               return;\r
-                       }\r
-                       date.setHours(row);\r
-                       client.updateVariable(id, "hour", row, immediate);\r
-               }\r
-\r
-       }\r
-\r
-       private class EntrySource implements CalendarPanel.CalendarEntrySource {\r
-\r
-               private HashMap dates = new HashMap();\r
-\r
-               public void addItem(UIDL item) {\r
-                       String styleName = item.getStringAttribute("styleName");\r
-                       Integer id = new Integer(item.getIntAttribute("id"));\r
-                       long start = Long.parseLong(item.getStringAttribute("start"));\r
-                       Date startDate = new Date(start);\r
-                       long end = -1;\r
-                       try {\r
-                               end = Long.parseLong(item.getStringAttribute("end"));\r
-                       } catch (Exception IGNORED) {\r
-                               // IGNORED attribute not required\r
-                       }\r
-                       Date endDate = (end > 0 && end != start ? new Date(end) : new Date(\r
-                                       start));\r
-                       String title = item.getStringAttribute("title");\r
-                       String desc = item.getStringAttribute("description");\r
-                       boolean notime = item.getBooleanAttribute("notime");\r
-                       CalendarEntry entry = new CalendarEntry(styleName, startDate,\r
-                                       endDate, title, desc, notime);\r
-\r
-                       // TODO should remove+readd if the same entry (id) is added again\r
-\r
-                       for (Date d = entry.getStart(); d.getYear() <= entry.getEnd()\r
-                                       .getYear()\r
-                                       && d.getMonth() <= entry.getEnd().getYear()\r
-                                       && d.getDate() <= entry.getEnd().getDate(); d.setTime(d\r
-                                       .getTime() + 86400000)) {\r
-                               String key = d.getYear() + "" + d.getMonth() + "" + d.getDate();\r
-                               ArrayList l = (ArrayList) dates.get(key);\r
-                               if (l == null) {\r
-                                       l = new ArrayList();\r
-                                       dates.put(key, l);\r
-                               }\r
-                               l.add(entry);\r
-                       }\r
-               }\r
-\r
-               public List getEntries(Date date, int resolution) {\r
-                       List entries = (List) dates.get(date.getYear() + ""\r
-                                       + date.getMonth() + "" + date.getDate());\r
-                       ArrayList res = new ArrayList();\r
-                       if (entries == null) {\r
-                               return res;\r
-                       }\r
-                       for (Iterator it = entries.iterator(); it.hasNext();) {\r
-                               CalendarEntry item = (CalendarEntry) it.next();\r
-                               if (DateTimeService.isInRange(date, item.getStart(), item\r
-                                               .getEnd(), resolution)) {\r
-                                       res.add(item);\r
-                               }\r
-                       }\r
-\r
-                       return res;\r
-               }\r
-\r
-               public void clear() {\r
-                       dates.clear();\r
-               }\r
-\r
-       }\r
-\r
-}\r
diff --git a/src/com/itmill/toolkit/demo/reservation/gwt/client/ui/ICalendarField.java b/src/com/itmill/toolkit/demo/reservation/gwt/client/ui/ICalendarField.java
new file mode 100644 (file)
index 0000000..a036488
--- /dev/null
@@ -0,0 +1,272 @@
+package com.itmill.toolkit.demo.reservation.gwt.client.ui;\r
+\r
+import java.util.ArrayList;\r
+import java.util.Date;\r
+import java.util.HashMap;\r
+import java.util.Iterator;\r
+import java.util.List;\r
+\r
+import com.google.gwt.user.client.DOM;\r
+import com.google.gwt.user.client.Element;\r
+import com.google.gwt.user.client.ui.FlexTable;\r
+import com.google.gwt.user.client.ui.SimplePanel;\r
+import com.google.gwt.user.client.ui.SourcesTableEvents;\r
+import com.google.gwt.user.client.ui.TableListener;\r
+import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;\r
+import com.itmill.toolkit.terminal.gwt.client.DateTimeService;\r
+import com.itmill.toolkit.terminal.gwt.client.UIDL;\r
+import com.itmill.toolkit.terminal.gwt.client.ui.CalendarEntry;\r
+import com.itmill.toolkit.terminal.gwt.client.ui.CalendarPanel;\r
+import com.itmill.toolkit.terminal.gwt.client.ui.IDateField;\r
+import com.itmill.toolkit.terminal.gwt.client.ui.CalendarPanel.CalendarEntrySource;\r
+\r
+public class ICalendarField extends IDateField {\r
+\r
+       private CalendarPanel calPanel;\r
+\r
+       private SimplePanel hourPanel;\r
+\r
+       private FlexTable hourTable;\r
+\r
+       private EntrySource entrySource;\r
+\r
+       private TableListener ftListener = new HourTableListener();\r
+\r
+       private int realResolution = RESOLUTION_DAY;\r
+\r
+       private static final String CLASSNAME = IDateField.CLASSNAME\r
+                       + "-entrycalendar";\r
+\r
+       public ICalendarField() {\r
+               super();\r
+               setStyleName(CLASSNAME);\r
+               calPanel = new CalendarPanel(this);\r
+               add(calPanel);\r
+               this.entrySource = new EntrySource();\r
+               calPanel.setCalendarEntrySource(this.entrySource);\r
+               calPanel.addTableListener(new TableListener() {\r
+                       public void onCellClicked(SourcesTableEvents sender, int row,\r
+                                       int cell) {\r
+                               buildDayView(date);\r
+                       }\r
+               });\r
+       }\r
+\r
+       public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {\r
+               super.updateFromUIDL(uidl, client);\r
+               // We want to draw our own hour list\r
+               this.realResolution = currentResolution;\r
+               this.currentResolution = RESOLUTION_DAY;\r
+               if (uidl.hasAttribute("min")) {\r
+                       String mins = uidl.getStringAttribute("min");\r
+                       long min = (mins != null ? Long.parseLong(mins) : 0);\r
+                       String maxs = uidl.getStringAttribute("max");\r
+                       long max = (maxs != null ? Long.parseLong(maxs) : 0);\r
+                       Date minDate = (min > 0 ? new Date(min) : null);\r
+                       Date maxDate = (max > 0 ? new Date(max) : null);\r
+                       calPanel.setLimits(minDate, maxDate);\r
+               }\r
+               this.entrySource.clear();\r
+               for (Iterator cit = uidl.getChildIterator(); cit.hasNext();) {\r
+                       UIDL child = (UIDL) cit.next();\r
+                       if (child.getTag().equals("items")) {\r
+                               for (Iterator iit = child.getChildIterator(); iit.hasNext();) {\r
+                                       UIDL item = (UIDL) iit.next();\r
+                                       this.entrySource.addItem(item);\r
+                               }\r
+                               break;\r
+                       }\r
+               }\r
+               calPanel.updateCalendar();\r
+               buildDayView(this.date);\r
+       }\r
+\r
+       protected void buildDayView(Date date) {\r
+               boolean firstRender = true;\r
+               if (this.hourPanel == null) {\r
+                       this.hourPanel = new SimplePanel();\r
+                       this.hourPanel.setStyleName(CLASSNAME + "-hours");\r
+                       this.calPanel.getFlexCellFormatter().setColSpan(8, 0, 7);\r
+                       this.calPanel.setWidget(8, 0, this.hourPanel);\r
+               } else {\r
+                       firstRender = false;\r
+                       this.hourPanel.clear();\r
+               }\r
+               this.hourTable = new FlexTable();\r
+               this.hourTable.addTableListener(this.ftListener);\r
+               this.hourPanel.add(this.hourTable);\r
+               this.hourTable.setCellSpacing(1);\r
+\r
+               for (int i = 0; i < 24; i++) {\r
+                       String style = (i % 2 == 0 ? "even" : "odd");\r
+                       if (realResolution >= RESOLUTION_HOUR) {\r
+                               if (this.date != null && this.date.getHours() == i) {\r
+                                       style = "selected";\r
+                               }\r
+                       }\r
+                       hourTable.getRowFormatter().setStyleName(i,\r
+                                       CLASSNAME + "-row-" + style);\r
+                       String hstr = (i < 10 ? "0" : "") + i + ":00";\r
+                       if (this.dts.isTwelveHourClock()) {\r
+                               String ampm = (i < 12 ? "am" : "pm");\r
+                               hstr = (i <= 12 ? i : i - 12) + ":00 " + ampm;\r
+                       }\r
+                       hourTable.setHTML(i, 0, "<span>" + hstr + "</span>");\r
+                       hourTable.getCellFormatter()\r
+                                       .setStyleName(i, 0, CLASSNAME + "-time");\r
+               }\r
+\r
+               List entries = this.entrySource.getEntries(date,\r
+                               DateTimeService.RESOLUTION_DAY);\r
+               int currentCol = 1;\r
+               for (Iterator it = entries.iterator(); it.hasNext();) {\r
+                       CalendarEntry entry = (CalendarEntry) it.next();\r
+                       int start = 0;\r
+                       int hours = 24;\r
+                       if (!entry.isNotime()) {\r
+                               Date d = entry.getStart();\r
+                               // TODO consider month&year as well\r
+                               start = (d.getDate() < date.getDate() ? 0 : d.getHours());\r
+                               d = entry.getEnd();\r
+                               hours = (d.getDate() > date.getDate() ? 24 : d.getHours())\r
+                                               - start;\r
+                               if (hours == 0) {\r
+                                       // We can't draw entries smaller than one\r
+                                       hours = 1;\r
+                               }\r
+                       }\r
+                       int col = currentCol;\r
+                       if (col > 1) {\r
+                               while (!this.hourTable.isCellPresent(start, col - 1))\r
+                                       col--;\r
+                       }\r
+                       this.hourTable.setHTML(start, col, "<span>"\r
+                                       + (entry.getTitle() != null ? entry.getTitle() : "&nbsp")\r
+                                       + "</span>");\r
+                       this.hourTable.getFlexCellFormatter().setRowSpan(start, col, hours);\r
+                       this.hourTable.getFlexCellFormatter().setStyleName(start, col,\r
+                                       CLASSNAME + "-entry");\r
+                       String sn = entry.getStyleName();\r
+                       if (sn != null && !sn.equals("")) {\r
+                               this.hourTable.getFlexCellFormatter().addStyleName(start, col,\r
+                                               CLASSNAME + "-" + entry.getStyleName());\r
+                       }\r
+                       Element el = this.hourTable.getFlexCellFormatter().getElement(\r
+                                       start, col);\r
+\r
+                       String tooltip;\r
+                       if (DateTimeService.isSameDay(entry.getStart(), entry.getEnd())) {\r
+                               tooltip = (start < 10 ? "0" : "") + start + ":00";\r
+                               if (this.dts.isTwelveHourClock()) {\r
+                                       String ampm = (start < 12 ? "am" : "pm");\r
+                                       tooltip = (start <= 12 ? start : start - 12) + ":00 "\r
+                                                       + ampm;\r
+\r
+                               }\r
+                               tooltip += " (" + hours + "h) ";\r
+                               if (entry.getTitle()!=null) {\r
+                                       tooltip += entry.getTitle() + "\n ";\r
+                               }\r
+                       } else {\r
+                               tooltip = entry.getStringForDate(entry.getEnd()) + "\n ";\r
+                       }\r
+                       if (entry.getDescription()!=null) {\r
+                               tooltip += "\"" + entry.getDescription() + "\"";\r
+                       }\r
+                       DOM.setElementProperty(el, "title", tooltip);\r
+\r
+                       currentCol++;\r
+               }\r
+\r
+               // int hour = new Date().getHours()+1; // scroll to current hour\r
+               int hour = this.date.getHours() + 1; // scroll to selected hour\r
+               int h1 = (int) this.hourPanel.getOffsetHeight() / 2;\r
+               int oh = this.hourTable.getOffsetHeight();\r
+               int h2 = (int) (hour / 24.0 * oh);\r
+               int scrollTop = (int) h2 - h1;\r
+               Element el = this.hourPanel.getElement();\r
+               setScrollTop(el, scrollTop);\r
+\r
+       }\r
+\r
+       private native void setScrollTop(Element el, int scrollTop) /*-{\r
+           el.scrollTop = scrollTop;\r
+         }-*/;\r
+\r
+       private class HourTableListener implements TableListener {\r
+\r
+               public void onCellClicked(SourcesTableEvents sender, int row, int cell) {\r
+                       if (realResolution < RESOLUTION_HOUR || date == null) {\r
+                               return;\r
+                       }\r
+                       date.setHours(row);\r
+                       client.updateVariable(id, "hour", row, immediate);\r
+               }\r
+\r
+       }\r
+\r
+       private class EntrySource implements CalendarPanel.CalendarEntrySource {\r
+\r
+               private HashMap dates = new HashMap();\r
+\r
+               public void addItem(UIDL item) {\r
+                       String styleName = item.getStringAttribute("styleName");\r
+                       Integer id = new Integer(item.getIntAttribute("id"));\r
+                       long start = Long.parseLong(item.getStringAttribute("start"));\r
+                       Date startDate = new Date(start);\r
+                       long end = -1;\r
+                       try {\r
+                               end = Long.parseLong(item.getStringAttribute("end"));\r
+                       } catch (Exception IGNORED) {\r
+                               // IGNORED attribute not required\r
+                       }\r
+                       Date endDate = (end > 0 && end != start ? new Date(end) : new Date(\r
+                                       start));\r
+                       String title = item.getStringAttribute("title");\r
+                       String desc = item.getStringAttribute("description");\r
+                       boolean notime = item.getBooleanAttribute("notime");\r
+                       CalendarEntry entry = new CalendarEntry(styleName, startDate,\r
+                                       endDate, title, desc, notime);\r
+\r
+                       // TODO should remove+readd if the same entry (id) is added again\r
+\r
+                       for (Date d = entry.getStart(); d.getYear() <= entry.getEnd()\r
+                                       .getYear()\r
+                                       && d.getMonth() <= entry.getEnd().getYear()\r
+                                       && d.getDate() <= entry.getEnd().getDate(); d.setTime(d\r
+                                       .getTime() + 86400000)) {\r
+                               String key = d.getYear() + "" + d.getMonth() + "" + d.getDate();\r
+                               ArrayList l = (ArrayList) dates.get(key);\r
+                               if (l == null) {\r
+                                       l = new ArrayList();\r
+                                       dates.put(key, l);\r
+                               }\r
+                               l.add(entry);\r
+                       }\r
+               }\r
+\r
+               public List getEntries(Date date, int resolution) {\r
+                       List entries = (List) dates.get(date.getYear() + ""\r
+                                       + date.getMonth() + "" + date.getDate());\r
+                       ArrayList res = new ArrayList();\r
+                       if (entries == null) {\r
+                               return res;\r
+                       }\r
+                       for (Iterator it = entries.iterator(); it.hasNext();) {\r
+                               CalendarEntry item = (CalendarEntry) it.next();\r
+                               if (DateTimeService.isInRange(date, item.getStart(), item\r
+                                               .getEnd(), resolution)) {\r
+                                       res.add(item);\r
+                               }\r
+                       }\r
+\r
+                       return res;\r
+               }\r
+\r
+               public void clear() {\r
+                       dates.clear();\r
+               }\r
+\r
+       }\r
+\r
+}\r