]> source.dussan.org Git - vaadin-framework.git/commitdiff
DateField calendar style client-side implemetation fully functional. DateField now...
authorJouni Koivuviita <jouni.koivuviita@itmill.com>
Mon, 9 Jul 2007 12:44:57 +0000 (12:44 +0000)
committerJouni Koivuviita <jouni.koivuviita@itmill.com>
Mon, 9 Jul 2007 12:44:57 +0000 (12:44 +0000)
Fixed locale loading and parsing (now supports all possible locales found from JVM).

svn changeset:1821/svn branch:trunk

15 files changed:
src/com/itmill/toolkit/terminal/gwt/client/Client.java
src/com/itmill/toolkit/terminal/gwt/client/DateTimeService.java
src/com/itmill/toolkit/terminal/gwt/client/LocaleService.java
src/com/itmill/toolkit/terminal/gwt/client/ui/ICalendar.java
src/com/itmill/toolkit/terminal/gwt/client/ui/ICalendarPanel.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IDateField.java
src/com/itmill/toolkit/terminal/gwt/client/ui/ILabel.java
src/com/itmill/toolkit/terminal/gwt/client/ui/ITextualDate.java
src/com/itmill/toolkit/terminal/gwt/client/ui/ITime.java [new file with mode: 0644]
src/com/itmill/toolkit/terminal/gwt/public/component-themes/collection.css
src/com/itmill/toolkit/terminal/gwt/public/component-themes/common/css/common.css
src/com/itmill/toolkit/terminal/gwt/public/component-themes/datefield/css/datefield.css [new file with mode: 0644]
src/com/itmill/toolkit/terminal/web/AjaxApplicationManager.java
src/com/itmill/toolkit/terminal/web/AjaxJsonPaintTarget.java
src/com/itmill/toolkit/ui/DateField.java

index 556d4cf66f1bae1a097cb82377ddcc9b07c4cfb8..b1151e0ac8cadf1f8dcbac5a1474520232951c9f 100755 (executable)
@@ -329,6 +329,14 @@ public class Client implements EntryPoint {
                        else if (uidl.hasAttribute("readonly"))
                                enabled = !uidl.getBooleanAttribute("readonly");
                        ((FocusWidget) component).setEnabled(enabled);
+               } else {
+                       boolean enabled = true;
+                       if (uidl.hasAttribute("disabled"))
+                               enabled = !uidl.getBooleanAttribute("disabled");
+                       if(!enabled)
+                               component.addStyleName("i-disabled");
+                       else
+                               component.removeStyleName("i-disabled");
                }
                boolean visible = !uidl.getBooleanAttribute("invisible");
                component.setVisible(visible);
index a5781c2fe5d18cfce6268887bedeaaffb7b3142c..7e92ff80a39d888614d1328c4d92a2dd5bcf753c 100644 (file)
@@ -92,6 +92,39 @@ public class DateTimeService {
                return 0;\r
        }\r
        \r
+       public boolean isTwelveHourClock() {\r
+               try {\r
+                       return LocaleService.isTwelveHourClock(currentLocale);\r
+               } catch (LocaleNotLoadedException e) {\r
+                       // TODO redirect to console\r
+                       System.out.println(e + ":" + e.getMessage());\r
+               }\r
+               return false;\r
+       }\r
+       \r
+       public String getClockDelimeter() {\r
+               try {\r
+                       return LocaleService.getClockDelimiter(currentLocale);\r
+               } catch (LocaleNotLoadedException e) {\r
+                       // TODO redirect to console\r
+                       System.out.println(e + ":" + e.getMessage());\r
+               }\r
+               return ":";\r
+       }\r
+       \r
+       public String[] getAmPmStrings() {\r
+               try {\r
+                       return LocaleService.getAmPmStrings(currentLocale);\r
+               } catch (LocaleNotLoadedException e) {\r
+                       // TODO redirect to console\r
+                       System.out.println(e + ":" + e.getMessage());\r
+               }\r
+               String[] temp = new String[2];\r
+               temp[0] = "AM";\r
+               temp[1] = "PM";\r
+               return temp;\r
+       }\r
+       \r
        public int getStartWeekDay(Date date){\r
                Date dateForFirstOfThisMonth = new Date(date.getYear(), date.getMonth(), 1);\r
                int firstDay;\r
index fdd6b99b8d94ef98afe550541e2fd01a38105e1d..f5d9b1f344935e3300fb07b233b3857712a1aa0c 100644 (file)
@@ -12,7 +12,7 @@ import com.google.gwt.json.client.JSONString;
 \r
 /**\r
  * Date / time etc. localisation service for all widgets.\r
- * Should cache all loaded locales as JSON strings.\r
+ * Caches all loaded locales as JSONObjects.\r
  * \r
  * @author IT Mill Ltd.\r
  *\r
@@ -148,5 +148,16 @@ public class LocaleService {
                        return hmd.stringValue();\r
                } else throw new LocaleNotLoadedException(locale);\r
        }\r
+       \r
+       public static String[] getAmPmStrings(String locale) throws LocaleNotLoadedException {\r
+               if(cache.containsKey(locale)) {\r
+                       JSONObject l = (JSONObject) cache.get(locale);\r
+                       JSONArray ampm = (JSONArray) l.get("ampm");\r
+                       String[] temp = new String[2];\r
+                       temp[0] = ((JSONString)ampm.get(0)).stringValue();\r
+                       temp[1] = ((JSONString)ampm.get(1)).stringValue();\r
+                       return temp;\r
+               } else throw new LocaleNotLoadedException(locale);\r
+       }\r
 \r
 }\r
index 1213c18099e4fdd2390ad9982d1fc44bc93c75c0..b5ce2c7b4b9a2613706a49f8736c8c9511e0df98 100644 (file)
@@ -5,21 +5,18 @@ import com.itmill.toolkit.terminal.gwt.client.UIDL;
 \r
 public class ICalendar extends IDateField {\r
        \r
-       private ICalendarPanel body;\r
-       \r
-       private String locale;\r
+       private ICalendarPanel date;\r
        \r
        public ICalendar() {\r
                super();\r
-               body = new ICalendarPanel(this);\r
-               container.add(body);\r
+               setStyleName(CLASSNAME+"-calendar");\r
+               date = new ICalendarPanel(this);\r
+               add(date);\r
        }\r
        \r
        public void updateFromUIDL(UIDL uidl, Client client) {\r
                super.updateFromUIDL(uidl, client);\r
-               boolean needsRedraw = (locale == null || !locale.equals(currentLocale));\r
-               body.updateCalendar(needsRedraw);\r
-               locale = currentLocale;\r
+               date.updateCalendar();\r
        }\r
 \r
 }\r
index 32f60a7edde02322e640bc75acc9153d540fef53..fa540057a9025590230d5246606b07452898fce6 100644 (file)
@@ -2,66 +2,119 @@ package com.itmill.toolkit.terminal.gwt.client.ui;
 \r
 import java.util.Date;\r
 \r
+import com.google.gwt.user.client.DOM;\r
+import com.google.gwt.user.client.Event;\r
+import com.google.gwt.user.client.Timer;\r
 import com.google.gwt.user.client.ui.ClickListener;\r
 import com.google.gwt.user.client.ui.FlexTable;\r
+import com.google.gwt.user.client.ui.MouseListener;\r
+import com.google.gwt.user.client.ui.MouseListenerCollection;\r
+import com.google.gwt.user.client.ui.SourcesMouseEvents;\r
+import com.google.gwt.user.client.ui.SourcesTableEvents;\r
+import com.google.gwt.user.client.ui.TableListener;\r
 import com.google.gwt.user.client.ui.Widget;\r
 import com.itmill.toolkit.terminal.gwt.client.DateTimeService;\r
+import com.itmill.toolkit.terminal.gwt.client.LocaleService;\r
 \r
-public class ICalendarPanel extends FlexTable implements ClickListener {\r
+public class ICalendarPanel extends FlexTable implements MouseListener, ClickListener {\r
        \r
        private IDateField datefield;\r
        \r
-       private IButton prevYear;\r
-       private IButton nextYear;\r
-       private IButton prevMonth;\r
-       private IButton nextMonth;\r
+       private IEventButton prevYear;\r
+       private IEventButton nextYear;\r
+       private IEventButton prevMonth;\r
+       private IEventButton nextMonth;\r
+       \r
+       private ITime time;\r
+       \r
+       /* Needed to identify resolution changes */\r
+       private int resolution = IDateField.RESOLUTION_YEAR;\r
+       \r
+       /* Needed to identify locale changes */\r
+       private String locale = LocaleService.getDefaultLocale();\r
        \r
        public ICalendarPanel(IDateField parent) {\r
                datefield = parent;\r
-               // Force table size\r
-               setText(0, 0, "");\r
-               setText(7, 6, "");\r
-               buildCalendar(true);\r
+               setStyleName(datefield.CLASSNAME+"-calendarpanel");\r
+               //buildCalendar(true);\r
+               addTableListener(new DateClickListener(this));\r
        }\r
        \r
-       public void buildCalendar(boolean forceRedraw) {\r
-               buildCalendarHeader(forceRedraw);\r
-               buildCalendarBody();\r
+       private void buildCalendar(boolean forceRedraw) {\r
+               boolean needsMonth = datefield.currentResolution > IDateField.RESOLUTION_YEAR;\r
+               boolean needsBody = datefield.currentResolution >= IDateField.RESOLUTION_DAY;\r
+               boolean needsTime = datefield.currentResolution >= IDateField.RESOLUTION_HOUR;\r
+               buildCalendarHeader(forceRedraw, needsMonth);\r
+               clearCalendarBody(!needsBody);\r
+               if(needsBody)\r
+                       buildCalendarBody();\r
+               if(needsTime)\r
+                       buildTime(forceRedraw);\r
+               else if(time != null) {\r
+                       remove(time);\r
+                       time = null;\r
+               }\r
        }\r
-       \r
-       private void clearCalendarBody() {\r
-               for (int row=2; row < 8; row++){\r
-                       for (int col=0; col < 7; col++){\r
-                               setText(row, col, "");\r
+\r
+       private void clearCalendarBody(boolean remove) {\r
+               if(!remove) {\r
+                       for (int row = 2; row < 8; row++) {\r
+                               for (int col = 0; col < 7; col++) {\r
+                                       setHTML(row, col, "&nbsp;");\r
+                               }\r
                        }\r
+               } else if(getRowCount() > 2) {\r
+                       while(getRowCount() > 2)\r
+                               removeRow(2);\r
                }\r
        }\r
        \r
-       private void buildCalendarHeader(boolean forceRedraw) {\r
+       private void buildCalendarHeader(boolean forceRedraw, boolean needsMonth) {\r
                if(forceRedraw) {\r
-                       prevYear = new IButton(); prevYear.setText("&laquo;");\r
-                       nextYear = new IButton(); nextYear.setText("&raquo;");\r
-                       prevMonth = new IButton(); prevMonth.setText("&lsaquo;");\r
-                       nextMonth = new IButton(); nextMonth.setText("&rsaquo;");\r
-                       prevYear.addClickListener(this); nextYear.addClickListener(this);\r
-                       prevMonth.addClickListener(this); nextMonth.addClickListener(this);setWidget(0, 0, prevYear);\r
-                       \r
-                       setWidget(0, 1, prevMonth);\r
-                       setWidget(0, 3, nextMonth);\r
-                       setWidget(0, 4, nextYear);\r
-                       getFlexCellFormatter().setColSpan(0, 2, 3);\r
+                       if(prevMonth == null) { // Only do once\r
+                               prevYear = new IEventButton(); prevYear.setHTML("&laquo;");\r
+                               nextYear = new IEventButton(); nextYear.setHTML("&raquo;");\r
+                               prevYear.addMouseListener(this); nextYear.addMouseListener(this);\r
+                               prevYear.addClickListener(this); nextYear.addClickListener(this);\r
+                               setWidget(0, 0, prevYear);\r
+                               setWidget(0, 4, nextYear);\r
+                               \r
+                               if(needsMonth) {\r
+                                       prevMonth = new IEventButton(); prevMonth.setHTML("&lsaquo;");\r
+                                       nextMonth = new IEventButton(); nextMonth.setHTML("&rsaquo;");\r
+                                       prevMonth.addMouseListener(this); nextMonth.addMouseListener(this);\r
+                                       prevMonth.addClickListener(this); nextMonth.addClickListener(this);\r
+                                       setWidget(0, 3, nextMonth);\r
+                                       setWidget(0, 1, prevMonth);\r
+                               }\r
+                               \r
+                               getFlexCellFormatter().setColSpan(0, 2, 3);\r
+                       } else if(!needsMonth){\r
+                               // Remove month traverse buttons\r
+                               prevMonth.removeClickListener(this);\r
+                               prevMonth.removeMouseListener(this);\r
+                               nextMonth.removeClickListener(this);\r
+                               nextMonth.removeMouseListener(this);\r
+                               remove(prevMonth);\r
+                               remove(nextMonth);\r
+                               prevMonth = null; nextMonth = null;\r
+                       }\r
                        \r
+                       // Print weekday names\r
                        int firstDay = datefield.dts.getFirstDayOfWeek();\r
                        for(int i = 0; i < 7; i++) {\r
                                int day = i + firstDay;\r
                                if(day > 6) day = 0;\r
-                               setText(1,i, datefield.dts.getShortDay(day));\r
+                               if(datefield.currentResolution > IDateField.RESOLUTION_MONTH)\r
+                                       setHTML(1,i, "<strong>" + datefield.dts.getShortDay(day) + "</strong>");\r
+                               else\r
+                                       setHTML(1,i, "");\r
                        }\r
                }\r
                \r
-               String monthName = datefield.dts.getMonth(datefield.date.getMonth());\r
+               String monthName = needsMonth? datefield.dts.getMonth(datefield.date.getMonth()) : "";\r
                int year = datefield.date.getYear()+1900;\r
-               setText(0, 2, monthName + " " + year);\r
+               setHTML(0, 2, "<span class=\""+datefield.CLASSNAME+"-calendarpanel-month\">" + monthName + " " + year + "</span>");\r
        }\r
        \r
        private void buildCalendarBody() {\r
@@ -69,55 +122,159 @@ public class ICalendarPanel extends FlexTable implements ClickListener {
                int startWeekDay = datefield.dts.getStartWeekDay(date);\r
                int numDays = DateTimeService.getNumberOfDaysInMonth(date);\r
                int dayCount = 0;\r
+               Date today = new Date();\r
                for (int row = 2; row < 8; row++){\r
                        for (int col = 0; col < 7; col++){\r
-                               if(row == 2 && col < startWeekDay){\r
-                                       setText(row, col, "");\r
-                                       //cellValues[row][col] = ""; \r
-                               } else {\r
-                                       if(numDays > dayCount){\r
+                               if(!(row == 2 && col < startWeekDay)) {\r
+                                       if(dayCount < numDays){\r
                                                int selectedDate = ++dayCount;\r
-                                               //cellValues[row][col] = selectedDate +"";\r
-                                               //if(true == isSelectedDate(date, selectedDate)){\r
-                                                       //setHTML(row, col, "<font class='currentDate'>" + selectedDate+"<font>");\r
-                                               //}else{\r
-                                                       setText(row, col, ""+selectedDate);\r
-                                               //}\r
+                                               if(date.getDate() == dayCount){\r
+                                                       setHTML(row, col, "<span class=\""+datefield.CLASSNAME+"-calendarpanel-day-selected\">" + selectedDate + "</span>");\r
+                                               } else if(today.getDate() == dayCount && today.getMonth() == date.getMonth() && today.getYear() == date.getYear()){\r
+                                                       setHTML(row, col, "<span class=\""+datefield.CLASSNAME+"-calendarpanel-day-today\">" + selectedDate + "</span>");\r
+                                               } else {\r
+                                                       setHTML(row, col, "<span class=\""+datefield.CLASSNAME+"-calendarpanel-day\">" + selectedDate + "</span>");\r
+                                               }\r
                                        } else {\r
-                                               setText(row, col, "");\r
-                                               //cellValues[row][col] = ""; \r
+                                               break;\r
                                        }\r
                                }\r
                        }\r
                }\r
        }\r
        \r
+       private void buildTime(boolean forceRedraw) {\r
+               if(time == null) {\r
+                       time = new ITime(datefield);\r
+                       setText(8,0,""); // Add new row\r
+                       getFlexCellFormatter().setColSpan(8, 0, 7);\r
+                       setWidget(8, 0, time);\r
+               }\r
+               time.updateTime(forceRedraw);\r
+       }\r
+       \r
        /**\r
         * \r
         * @param forceRedraw Build all from scratch, in case of e.g. locale changes\r
         */\r
-       public void updateCalendar(boolean forceRedraw) {\r
-               clearCalendarBody();\r
-               buildCalendar(forceRedraw);\r
+       public void updateCalendar() {\r
+               // Locale and resolution changes force a complete redraw\r
+               buildCalendar(locale != datefield.currentLocale || resolution != datefield.currentResolution);\r
+               locale = datefield.currentLocale;\r
+               resolution = datefield.currentResolution;\r
        }\r
        \r
        public void onClick(Widget sender) {\r
+               processClickEvent(sender);\r
+       }\r
+\r
+       private void processClickEvent(Widget sender) {\r
+               if(!datefield.enabled || datefield.readonly)\r
+                       return;\r
                if(sender == prevYear) {\r
                        datefield.date.setYear(datefield.date.getYear()-1);\r
                        datefield.client.updateVariable(datefield.id, "year", datefield.date.getYear()+1900, datefield.immediate);\r
-                       updateCalendar(false);\r
+                       updateCalendar();\r
                } else if(sender == nextYear) {\r
                        datefield.date.setYear(datefield.date.getYear()+1);\r
                        datefield.client.updateVariable(datefield.id, "year", datefield.date.getYear()+1900, datefield.immediate);\r
-                       updateCalendar(false);\r
+                       updateCalendar();\r
                } else if(sender == prevMonth) {\r
                        datefield.date.setMonth(datefield.date.getMonth()-1);\r
                        datefield.client.updateVariable(datefield.id, "month", datefield.date.getMonth()+1, datefield.immediate);\r
-                       updateCalendar(false);\r
+                       updateCalendar();\r
                } else if(sender == nextMonth) {\r
                        datefield.date.setMonth(datefield.date.getMonth()+1);\r
                        datefield.client.updateVariable(datefield.id, "month", datefield.date.getMonth()+1, datefield.immediate);\r
-                       updateCalendar(false);\r
+                       updateCalendar();\r
+               }\r
+       }\r
+       \r
+       private Timer timer;\r
+\r
+       public void onMouseDown(final Widget sender, int x, int y) {\r
+               if(sender instanceof IEventButton) {\r
+                       timer = new Timer() {\r
+                               public void run() {\r
+                                       processClickEvent(sender);\r
+                               }\r
+                       };\r
+                       timer.scheduleRepeating(100);\r
+               }\r
+       }\r
+\r
+       public void onMouseEnter(Widget sender) {}\r
+\r
+       public void onMouseLeave(Widget sender) {\r
+               if(timer != null)\r
+                       timer.cancel();\r
+       }\r
+\r
+       public void onMouseMove(Widget sender, int x, int y) {}\r
+\r
+       public void onMouseUp(Widget sender, int x, int y) {\r
+               if(timer != null)\r
+                       timer.cancel();\r
+       }\r
+       \r
+       private class IEventButton extends IButton implements SourcesMouseEvents {\r
+\r
+               private MouseListenerCollection mouseListeners;\r
+               \r
+               public IEventButton() {\r
+                       super();\r
+                       sinkEvents(Event.FOCUSEVENTS | Event.KEYEVENTS | Event.ONCLICK\r
+                                     | Event.MOUSEEVENTS);\r
+               }\r
+               \r
+               public void addMouseListener(MouseListener listener) {\r
+                   if (mouseListeners == null) {\r
+                       mouseListeners = new MouseListenerCollection();\r
+                   }\r
+                   mouseListeners.add(listener);\r
+               }\r
+\r
+               public void removeMouseListener(MouseListener listener) {\r
+                       if (mouseListeners != null)\r
+                               mouseListeners.remove(listener);\r
+               }\r
+                       \r
+               public void onBrowserEvent(Event event) {\r
+                       super.onBrowserEvent(event);\r
+                       switch (DOM.eventGetType(event)) {\r
+                               case Event.ONMOUSEDOWN:\r
+                               case Event.ONMOUSEUP:\r
+                               case Event.ONMOUSEMOVE:\r
+                               case Event.ONMOUSEOVER:\r
+                               case Event.ONMOUSEOUT:\r
+                                       if (mouseListeners != null) {\r
+                                               mouseListeners.fireMouseEvent(this, event);\r
+                                       }\r
+                                       break;\r
+                       }\r
+               }       \r
+       }\r
+       \r
+       private class DateClickListener implements TableListener {\r
+               \r
+               private ICalendarPanel cal;\r
+               \r
+               public DateClickListener(ICalendarPanel panel) {\r
+                       cal = panel;\r
+               }\r
+\r
+               public void onCellClicked(SourcesTableEvents sender, int row, int col) {\r
+                       if(sender != cal || row < 2 || row > 7 || !cal.datefield.enabled || cal.datefield.readonly)\r
+                               return;\r
+                       \r
+                       Integer day = new Integer(cal.getText(row, col));\r
+                       cal.datefield.date.setDate(day.intValue());\r
+                       cal.datefield.client.updateVariable(cal.datefield.id, "day", cal.datefield.date.getDate(), cal.datefield.immediate);\r
+                       \r
+                       // No need to update calendar header\r
+                       cal.clearCalendarBody(false);\r
+                       cal.buildCalendarBody();\r
                }\r
+               \r
        }\r
 }\r
index f4d980df1742f744afac20e49e4d8e3ae451b9e6..358ef30c2db0abd3d02b56f7b0a04674e8690bf3 100644 (file)
@@ -2,7 +2,6 @@ package com.itmill.toolkit.terminal.gwt.client.ui;
 \r
 import java.util.Date;\r
 \r
-import com.google.gwt.user.client.ui.Composite;\r
 import com.google.gwt.user.client.ui.FlowPanel;\r
 import com.itmill.toolkit.terminal.gwt.client.Client;\r
 import com.itmill.toolkit.terminal.gwt.client.DateTimeService;\r
@@ -10,15 +9,13 @@ import com.itmill.toolkit.terminal.gwt.client.LocaleNotLoadedException;
 import com.itmill.toolkit.terminal.gwt.client.Paintable;\r
 import com.itmill.toolkit.terminal.gwt.client.UIDL;\r
 \r
-public class IDateField extends Composite implements Paintable {\r
+public class IDateField extends FlowPanel implements Paintable {\r
 \r
        public static final String CLASSNAME = "i-datefield";\r
        \r
        String id;\r
        \r
        Client client;\r
-\r
-       protected FlowPanel container;\r
        \r
        protected boolean immediate;\r
        \r
@@ -33,13 +30,19 @@ public class IDateField extends Composite implements Paintable {
        \r
        protected String currentLocale;\r
        \r
+       protected boolean readonly;\r
+       \r
+       protected boolean enabled;\r
+       \r
        protected Date date;\r
        \r
+       /* For easy access, because java.util.Date doesn't have getMilliseconds method */\r
+       private int milliseconds = 0;\r
+       \r
        protected DateTimeService dts;\r
        \r
        public IDateField() {\r
-               container = new FlowPanel();\r
-               initWidget(container);\r
+               setStyleName(CLASSNAME);\r
                date = new Date();\r
                dts = new DateTimeService();\r
        }\r
@@ -51,8 +54,11 @@ public class IDateField extends Composite implements Paintable {
 \r
                // Save details\r
                this.client = client;\r
-               id = uidl.getId();\r
-               immediate = uidl.getBooleanAttribute("immediate");\r
+               this.id = uidl.getId();\r
+               this.immediate = uidl.getBooleanAttribute("immediate");\r
+               \r
+               readonly = uidl.getBooleanAttribute("readonly");\r
+               enabled = !uidl.getBooleanAttribute("disabled");\r
                \r
                if(uidl.hasAttribute("locale")) {\r
                        String locale = uidl.getStringAttribute("locale");\r
@@ -60,61 +66,74 @@ public class IDateField extends Composite implements Paintable {
                                dts.setLocale(locale);\r
                                currentLocale = locale;\r
                        } catch (LocaleNotLoadedException e) {\r
-                               dts = new DateTimeService();\r
                                currentLocale = dts.getLocale();\r
+                               // TODO redirect this to console\r
                                System.out.println("Tried to use an unloaded locale \"" + locale + "\". Using default locale (" + currentLocale + ").");\r
                        }\r
                }\r
-               \r
-               int newResolution = RESOLUTION_YEAR;\r
-               if(uidl.hasAttribute("month"))\r
-                       newResolution = RESOLUTION_MONTH;\r
-               if(uidl.hasAttribute("day"))\r
-                       newResolution = RESOLUTION_DAY;\r
-               if(uidl.hasAttribute("hour"))\r
-                       newResolution = RESOLUTION_HOUR;\r
-               if(uidl.hasAttribute("min"))\r
-                       newResolution = RESOLUTION_MIN;\r
-               if(uidl.hasAttribute("sec"))\r
-                       newResolution = RESOLUTION_SEC;\r
-               if(uidl.hasAttribute("msec"))\r
+\r
+               int newResolution;\r
+               if(uidl.hasVariable("msec"))\r
                        newResolution = RESOLUTION_MSEC;\r
-               \r
-               if(currentResolution > newResolution)\r
-                       container.clear();\r
+               else if(uidl.hasVariable("sec"))\r
+                       newResolution = RESOLUTION_SEC;\r
+               else if(uidl.hasVariable("min"))\r
+                       newResolution = RESOLUTION_MIN;\r
+               else if(uidl.hasVariable("hour"))\r
+                       newResolution = RESOLUTION_HOUR;\r
+               else if(uidl.hasVariable("day"))\r
+                       newResolution = RESOLUTION_DAY;\r
+               else if(uidl.hasVariable("month"))\r
+                       newResolution = RESOLUTION_MONTH;\r
+               else\r
+                       newResolution = RESOLUTION_YEAR;\r
                \r
                currentResolution = newResolution;\r
                \r
-               int year = uidl.getIntAttribute("year");\r
-               int month = uidl.getIntAttribute("month");\r
-               int day = uidl.getIntAttribute("day");\r
-               int hour = uidl.getIntAttribute("hour");\r
-               int min = uidl.getIntAttribute("min");\r
-               int sec = uidl.getIntAttribute("sec");\r
-               int msec = uidl.getIntAttribute("msec");\r
+               int year = uidl.getIntVariable("year");\r
+               int month = (currentResolution >= RESOLUTION_MONTH)? uidl.getIntVariable("month") : -1;\r
+               int day = (currentResolution >= RESOLUTION_DAY)? uidl.getIntVariable("day") : -1;\r
+               int hour = (currentResolution >= RESOLUTION_HOUR)? uidl.getIntVariable("hour") : -1;\r
+               int min = (currentResolution >= RESOLUTION_MIN)? uidl.getIntVariable("min") : -1;\r
+               int sec = (currentResolution >= RESOLUTION_SEC)? uidl.getIntVariable("sec") : -1;\r
+               int msec = (currentResolution >= RESOLUTION_MSEC)? uidl.getIntVariable("msec") : -1;\r
                \r
-               date = new Date((long) buildDate(year, month, day, hour, min, sec, msec));\r
+               // Construct new date for this datefield\r
+               date = new Date((long) buildTime(year, month, day, hour, min, sec, msec));\r
+               milliseconds = msec<0? 0 : msec;\r
                \r
        }\r
        \r
        /*\r
         * We need this redundant native function because \r
-        * GWT hasn't implemented setMilliseconds to the Date class.\r
+        * Java's Date object doesn't have a setMilliseconds method.\r
         */\r
-       private native double buildDate(int y, int m, int d, int h, int mi, int s, int ms) /*-{\r
+       private static native double buildTime(int y, int m, int d, int h, int mi, int s, int ms) /*-{\r
        try {\r
                var date = new Date();\r
-               if(y) date.setFullYear(y-1900);\r
-               if(m) date.setMonth(m-1);\r
-               if(d) date.setDate(d);\r
-               if(h) date.setHour(h);\r
-               if(mi) date.setMinutes(mi);\r
-               if(s) date.setSeconds(s);\r
-               if(ms) date.setMilliseconds(ms);\r
+               if(y && y >= 0) date.setFullYear(y);\r
+               if(m && m >= 1) date.setMonth(m-1);\r
+               if(d && d >= 0) date.setDate(d);\r
+               if(h && h >= 0) date.setHours(h);\r
+               if(mi && mi >= 0) date.setMinutes(mi);\r
+               if(s && s >= 0) date.setSeconds(s);\r
+               if(ms && ms >= 0) date.setMilliseconds(ms);\r
                return date.getTime();\r
        } catch (e) {\r
-               console.error(e);\r
+               // TODO print some error message on the console\r
+               //console.log(e);\r
+               return (new Date()).getTime();\r
        }\r
        }-*/;\r
+       \r
+       public int getMilliseconds() {\r
+               return milliseconds;\r
+       }\r
+\r
+       public void setMilliseconds(int ms) {\r
+               long time = (long) buildTime(date.getYear(), date.getMonth(), date.getDate(), date.getHours(), date.getMinutes(), date.getSeconds(), ms);\r
+               date = new Date(time);\r
+               milliseconds = ms;\r
+       }\r
 \r
 }\r
index 187d8e01d651c7fb7914db0c136b38bf6f1c958b..dbfff25850adcbf08c56e30066e9f28d6168b927 100644 (file)
@@ -8,10 +8,17 @@ import com.itmill.toolkit.terminal.gwt.client.UIDL;
 public class ILabel extends HTML implements Paintable {
        
        public static final String CLASSNAME = "i-label";
+       
+       public ILabel() {
+               super();
+       }
+       
+       public ILabel(String text) {
+               super(text);
+               setStyleName(CLASSNAME);
+       }
 
        public void updateFromUIDL(UIDL uidl, Client client) {
-               
-               setStyleName(CLASSNAME);
 
                if (client.updateComponent(this, uidl, true))
                        return;
index a93870f07132cd124feaaa1176869c3f7a398b71..73993bbd70ffdc3ef235f6ecb4a7581951d5e979 100644 (file)
@@ -26,9 +26,9 @@ public class ITextualDate extends IDateField implements Paintable, ChangeListene
                \r
                if(uidl.hasVariable("year")) {\r
                        int selectedYear = uidl.getIntVariable("year");\r
-                       int y = container.getWidgetIndex(year);\r
+                       int y = getWidgetIndex(year);\r
                        if(y > -1 || !currentLocale.equals(uidl.getStringAttribute("locale"))) {\r
-                               year = (ListBox) container.getWidget(y);\r
+                               year = (ListBox) getWidget(y);\r
                                // Deselect old value\r
                                year.setItemSelected(year.getSelectedIndex(), false);\r
                                // and select new\r
@@ -47,14 +47,14 @@ public class ITextualDate extends IDateField implements Paintable, ChangeListene
                                                year.setSelectedIndex(year.getItemCount()-1);\r
                                }\r
                                year.addChangeListener(this);\r
-                               container.add(year);\r
+                               add(year);\r
                        }\r
                }\r
                if(uidl.hasVariable("month")) {\r
                        int selectedMonth = uidl.getIntVariable("month");\r
-                       int y = container.getWidgetIndex(month);\r
+                       int y = getWidgetIndex(month);\r
                        if(y > -1) {\r
-                               month = (ListBox) container.getWidget(y);\r
+                               month = (ListBox) getWidget(y);\r
                                // Deselect old value\r
                                month.setItemSelected(month.getSelectedIndex(), false);\r
                                // and select new\r
@@ -73,14 +73,14 @@ public class ITextualDate extends IDateField implements Paintable, ChangeListene
                                                month.setSelectedIndex(month.getItemCount()-1);\r
                                }\r
                                month.addChangeListener(this);\r
-                               container.add(month);\r
+                               add(month);\r
                        }\r
                }\r
                if(uidl.hasVariable("day")) {\r
                        int selectedMonth = uidl.getIntVariable("day");\r
-                       int y = container.getWidgetIndex(day);\r
+                       int y = getWidgetIndex(day);\r
                        if(y > -1) {\r
-                               day = (ListBox) container.getWidget(y);\r
+                               day = (ListBox) getWidget(y);\r
                                // Deselect old value\r
                                day.setItemSelected(day.getSelectedIndex(), false);\r
                                // and select new\r
@@ -99,7 +99,7 @@ public class ITextualDate extends IDateField implements Paintable, ChangeListene
                                                day.setSelectedIndex(day.getItemCount()-1);\r
                                }\r
                                day.addChangeListener(this);\r
-                               container.add(day);\r
+                               add(day);\r
                        }\r
                }\r
        }\r
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/ITime.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/ITime.java
new file mode 100644 (file)
index 0000000..f9207b0
--- /dev/null
@@ -0,0 +1,193 @@
+package com.itmill.toolkit.terminal.gwt.client.ui;\r
+\r
+import com.google.gwt.user.client.ui.ChangeListener;\r
+import com.google.gwt.user.client.ui.FlowPanel;\r
+import com.google.gwt.user.client.ui.ListBox;\r
+import com.google.gwt.user.client.ui.Widget;\r
+\r
+public class ITime extends FlowPanel implements ChangeListener {\r
+       \r
+       private IDateField datefield;\r
+       \r
+       private ListBox hours;\r
+       \r
+       private ListBox mins;\r
+       \r
+       private ListBox sec;\r
+       \r
+       private ListBox msec;\r
+       \r
+       private ListBox ampm;\r
+       \r
+       private int resolution = IDateField.RESOLUTION_HOUR;\r
+       \r
+       private boolean readonly;\r
+       \r
+       public ITime(IDateField parent) {\r
+               super();\r
+               datefield = parent;\r
+               setStyleName(IDateField.CLASSNAME+"-time");\r
+       }\r
+       \r
+       private void buildTime(boolean redraw) {\r
+               boolean thc = datefield.dts.isTwelveHourClock();\r
+               if(redraw) {\r
+                       clear();\r
+                       int numHours = thc?12:24;\r
+                       hours = new ListBox();\r
+                       hours.setStyleName(ISelect.CLASSNAME);\r
+                       for(int i=0; i<numHours; i++)\r
+                               hours.addItem((i<10)?"0"+i:""+i);\r
+                       hours.addChangeListener(this);\r
+                       if(thc) {\r
+                               ampm = new ListBox();\r
+                               ampm.setStyleName(ISelect.CLASSNAME);\r
+                               String[] ampmText = datefield.dts.getAmPmStrings();\r
+                               ampm.addItem(ampmText[0]);\r
+                               ampm.addItem(ampmText[1]);\r
+                               ampm.addChangeListener(this);\r
+                       }\r
+                       \r
+                       if(datefield.currentResolution >= IDateField.RESOLUTION_MIN) {\r
+                               mins = new ListBox();\r
+                               mins.setStyleName(ISelect.CLASSNAME);\r
+                               for(int i=0; i<60; i++)\r
+                                       mins.addItem((i<10)?"0"+i:""+i);\r
+                               mins.addChangeListener(this);\r
+                       }\r
+                       if(datefield.currentResolution >= IDateField.RESOLUTION_SEC) {\r
+                               sec = new ListBox();\r
+                               sec.setStyleName(ISelect.CLASSNAME);\r
+                               for(int i=0; i<60; i++)\r
+                                       sec.addItem((i<10)?"0"+i:""+i);\r
+                               sec.addChangeListener(this);\r
+                       }\r
+                       if(datefield.currentResolution == IDateField.RESOLUTION_MSEC) {\r
+                               msec = new ListBox();\r
+                               msec.setStyleName(ISelect.CLASSNAME);\r
+                               for(int i=0; i<1000; i++) {\r
+                                       if(i<10)\r
+                                               msec.addItem("00"+i);\r
+                                       else if(i<100)\r
+                                               msec.addItem("0"+i);\r
+                                       else msec.addItem(""+i);\r
+                               }\r
+                               msec.addChangeListener(this);\r
+                       }\r
+                       \r
+                       // Update times\r
+                       if(thc) {\r
+                               int h = datefield.date.getHours();\r
+                               ampm.setSelectedIndex(h<12? 0 : 1);\r
+                               h -= ampm.getSelectedIndex()*12;\r
+                               hours.setSelectedIndex(h);\r
+                       } else\r
+                               hours.setSelectedIndex(datefield.date.getHours());\r
+                       if(datefield.currentResolution >= IDateField.RESOLUTION_MIN)\r
+                               mins.setSelectedIndex(datefield.date.getMinutes());\r
+                       if(datefield.currentResolution >= IDateField.RESOLUTION_SEC)\r
+                               sec.setSelectedIndex(datefield.date.getSeconds());\r
+                       if(datefield.currentResolution == IDateField.RESOLUTION_MSEC)\r
+                               msec.setSelectedIndex(datefield.getMilliseconds());\r
+                       if(thc)\r
+                               ampm.setSelectedIndex(datefield.date.getHours()<12?0:1);\r
+\r
+                       \r
+                       String delimiter = datefield.dts.getClockDelimeter();\r
+                       boolean ro = datefield.readonly;\r
+                       \r
+                       if(ro) {\r
+                               int h = datefield.date.getHours();\r
+                               if(thc) h -= h<12? 0 : 12;\r
+                               add(new ILabel(h<10? "0"+h : ""+h));\r
+                       } else add(hours);\r
+                       \r
+                       if(datefield.currentResolution >= IDateField.RESOLUTION_MIN) {\r
+                               add(new ILabel(delimiter));\r
+                               if(ro) {\r
+                                       int m = mins.getSelectedIndex();\r
+                                       add(new ILabel(m<10? "0"+m : ""+m));\r
+                               }\r
+                               else add(mins);\r
+                       }\r
+                       if(datefield.currentResolution >= IDateField.RESOLUTION_SEC) {\r
+                               add(new ILabel(delimiter));\r
+                               if(ro) {\r
+                                       int s = sec.getSelectedIndex();\r
+                                       add(new ILabel(s<10? "0"+s : ""+s));\r
+                               }\r
+                               else add(sec);\r
+                       }\r
+                       if(datefield.currentResolution == IDateField.RESOLUTION_MSEC) {\r
+                               add(new ILabel("."));\r
+                               if(ro) {\r
+                                       int m = datefield.getMilliseconds();\r
+                                       String ms = m<100? "0"+m : ""+m;\r
+                                       add(new ILabel(m<10? "0"+ms : ms));\r
+                               }\r
+                               else add(msec);\r
+                       }\r
+                       if(datefield.currentResolution == IDateField.RESOLUTION_HOUR) {\r
+                               add(new ILabel(delimiter+"00")); // o'clock\r
+                       }\r
+                       if(thc) {\r
+                               add(new ILabel("&nbsp;"));\r
+                               if(ro) add(new ILabel(ampm.getItemText(datefield.date.getHours()<12? 0 : 1)));\r
+                               else add(ampm);\r
+                       }\r
+                       \r
+                       if(ro) return;\r
+               }\r
+               \r
+               boolean enabled = datefield.enabled;\r
+               hours.setEnabled(enabled);\r
+               if(mins != null) mins.setEnabled(enabled);\r
+               if(sec != null) sec.setEnabled(enabled);\r
+               if(msec != null) msec.setEnabled(enabled);\r
+               if(ampm != null) ampm.setEnabled(enabled);\r
+               \r
+       }\r
+\r
+       public void updateTime(boolean redraw) {\r
+               buildTime(redraw || resolution != datefield.currentResolution \r
+                                               || readonly != datefield.readonly);\r
+               resolution = datefield.currentResolution;\r
+               readonly = datefield.readonly;\r
+       }\r
+\r
+       public void onChange(Widget sender) {\r
+               if(sender == hours) {\r
+                       int h = hours.getSelectedIndex();\r
+                       if(datefield.dts.isTwelveHourClock())\r
+                               h = h + ampm.getSelectedIndex()*12;\r
+                       datefield.date.setHours(h);\r
+                       datefield.client.updateVariable(datefield.id, "hour", h, datefield.immediate);\r
+                       //updateTime(false);\r
+               }\r
+               else if(sender == mins) {\r
+                       int m = mins.getSelectedIndex();\r
+                       datefield.date.setMinutes(m);\r
+                       datefield.client.updateVariable(datefield.id, "min", m, datefield.immediate);\r
+                       //updateTime(false);\r
+               }\r
+               else if(sender == sec) {\r
+                       int s = sec.getSelectedIndex();\r
+                       datefield.date.setSeconds(s);\r
+                       datefield.client.updateVariable(datefield.id, "sec", s, datefield.immediate);\r
+                       //updateTime(false);\r
+               }\r
+               else if(sender == msec) {\r
+                       int ms = msec.getSelectedIndex();\r
+                       datefield.setMilliseconds(ms);\r
+                       datefield.client.updateVariable(datefield.id, "msec", ms, datefield.immediate);\r
+                       //updateTime(false);\r
+               }\r
+               else if(sender == ampm) {\r
+                       int h = hours.getSelectedIndex() + ampm.getSelectedIndex()*12;\r
+                       datefield.date.setHours(h);\r
+                       datefield.client.updateVariable(datefield.id, "hour", h, datefield.immediate);\r
+                       //updateTime(false);\r
+               }\r
+       }\r
+\r
+}\r
index 7268334ddcc2be4faf89846db6200de92004055b..98f8c2507db66247baf79a8f22f260c14f37f6fc 100644 (file)
@@ -2,4 +2,5 @@
 @import "textfield/css/textfield.css";\r
 @import "select/css/select.css";\r
 @import "panel/css/panel.css";\r
-@import "tabsheet/css/tabsheet.css";
\ No newline at end of file
+@import "tabsheet/css/tabsheet.css";\r
+@import "datefield/css/datefield.css";
\ No newline at end of file
index da3303918757b027445cd8e1a399595ca5132f8a..46ac419287964ad4883e86fe2f0d2e26a1e0e4a0 100644 (file)
@@ -14,6 +14,11 @@ input, select, textarea, button {
 select {\r
        padding: 0;\r
        margin: 0;\r
+}\r
+\r
+.i-disabled {\r
+       opacity: 0.3;\r
+       filter: alpha(opacity:30);\r
 }
 
 /* TODO move table styles to separate file */
diff --git a/src/com/itmill/toolkit/terminal/gwt/public/component-themes/datefield/css/datefield.css b/src/com/itmill/toolkit/terminal/gwt/public/component-themes/datefield/css/datefield.css
new file mode 100644 (file)
index 0000000..b990a94
--- /dev/null
@@ -0,0 +1,71 @@
+.i-datefield-calendarpanel {\r
+       width: 22em;\r
+}\r
+.i-datefield-calendarpanel table {\r
+       width: 100%;\r
+}\r
+.i-datefield-calendarpanel td {\r
+       width: 14.2%;\r
+       text-align: center;\r
+       padding: 0;\r
+}\r
+.i-datefield-calendarpanel .i-button {\r
+       width: 22px;\r
+       height: 22px;\r
+       font-size: 1.1em;\r
+       padding: 0;\r
+       line-height: 1em;\r
+}\r
+.i-datefield-calendarpanel-month {\r
+       font-size: 1.1em;\r
+}\r
+.i-datefield-calendarpanel-day {\r
+       cursor: pointer;\r
+       padding: 0 3px;\r
+}\r
+.i-datefield-calendarpanel-day-today {\r
+       font-weight: bold;\r
+       border: 1px solid #aaa;\r
+       padding: 0 3px;\r
+       cursor: pointer;\r
+}\r
+.i-disabled .i-datefield-calendarpanel-day,\r
+.i-disabled .i-datefield-calendarpanel-day-today {\r
+       cursor: default;\r
+}\r
+.i-datefield-calendarpanel-day-selected {\r
+       font-weight: bold;\r
+       color: #fff;\r
+       padding: 0 3px;\r
+       background-color: #1C3E6E;\r
+       cursor: default;\r
+}\r
+.i-datefield-time {\r
+       white-space: nowrap;\r
+}\r
+.i-datefield-time .i-label {\r
+       display: inline;\r
+}\r
+\r
+\r
+.i-datefield-calendar {\r
+       border: 1px solid #29528a;\r
+       padding: 5px;\r
+       background: #fff;\r
+}\r
+.i-datefield-calendar:before {\r
+       display: block;\r
+       height: 2px;\r
+       overflow: hidden;\r
+       background: transparent url(../../panel/img/top-right-small.png) no-repeat right top;\r
+       content: url(../../panel/img/top-left-small.png);\r
+       margin: -6px -6px 3px -6px;\r
+}\r
+.i-datefield-calendar:after {\r
+       display: block;\r
+       height: 2px;\r
+       overflow: hidden;\r
+       background: transparent url(../../panel/img/bottom-right.png) no-repeat right top;\r
+       content: url(../../panel/img/bottom-left.png);\r
+       margin: 5px -6px -6px -6px;\r
+}
\ No newline at end of file
index 50215a1c35da4353ab1e3f77efce79964bd48e0e..bf59c5ca7627b0c0220e23b0d44843f18f9c43d7 100644 (file)
@@ -108,7 +108,7 @@ public class AjaxApplicationManager implements
 
        public AjaxApplicationManager(Application application) {
                this.application = application;
-               requireLocale(application.getLocale().getLanguage());
+               requireLocale(application.getLocale().toString());
        }
 
        /**
@@ -233,7 +233,7 @@ public class AjaxApplicationManager implements
                                                
                                                // Reset sent locales
                                                locales = null;
-                                               requireLocale(application.getLocale().getLanguage());
+                                               requireLocale(application.getLocale().toString());
 
                                                // Adds all non-native windows
                                                for (Iterator i = window.getApplication().getWindows()
@@ -397,6 +397,12 @@ public class AjaxApplicationManager implements
                     }
                        outWriter.print("}");
                        
+                       
+                       /* -----------------------------
+                        * Sending Locale sensitive date
+                        * -----------------------------
+                        */
+                       
                        // Store JVM default locale for later restoration
                        // (we'll have to change the default locale for a while)
                        Locale jvmDefault = Locale.getDefault();
@@ -405,7 +411,7 @@ public class AjaxApplicationManager implements
                        outWriter.print(", \"locales\":[");
                        for(;pendingLocalesIndex < locales.size(); pendingLocalesIndex++) {
                                
-                               Locale l = new Locale((String) locales.get(pendingLocalesIndex));
+                               Locale l = generateLocale((String) locales.get(pendingLocalesIndex));
                                // Locale name
                                outWriter.print("{\"name\":\"" + l.toString() + "\",");
                                
@@ -495,7 +501,10 @@ public class AjaxApplicationManager implements
                                //outWriter.print("\"tf\":\"" + timeformat + "\",");
                                outWriter.print("\"thc\":" + twelve_hour_clock + ",");
                                outWriter.print("\"hmd\":\"" + hour_min_delimiter + "\"");
-                               
+                               if(twelve_hour_clock) {
+                                       String[] ampm = dfs.getAmPmStrings();
+                                       outWriter.print(",\"ampm\":[\""+ampm[0]+"\",\""+ampm[1]+"\"]");
+                               }
                                outWriter.print("}");
                                if(pendingLocalesIndex < locales.size()-1)
                                        outWriter.print(",");
@@ -904,10 +913,20 @@ public class AjaxApplicationManager implements
        public void requireLocale(String value) {
                if(locales == null) {
                        locales = new ArrayList();
-                       locales.add(application.getLocale().getLanguage());
+                       locales.add(application.getLocale().toString());
                        pendingLocalesIndex = 0;
                }
                if(!locales.contains(value))
                                locales.add(value);
        }
+       
+       private Locale generateLocale(String value) {
+               String[] temp = value.split("_");
+               if(temp.length == 1)
+                       return new Locale(temp[0]);
+               else if(temp.length == 2)
+                       return new Locale(temp[0], temp[1]);
+               else
+                       return new Locale(temp[0], temp[1], temp[2]);
+       }
 }
index 0d13cb9e453bc760b565378c932a7989ec27c411..882dd8f1402f643086977532447cab0a554cb697 100644 (file)
@@ -433,9 +433,9 @@ public class AjaxJsonPaintTarget implements PaintTarget, AjaxPaintTarget {
         * content is written.
         * 
         * @param name
-        *            the Boolean attribute name.
+        *            the String attribute name.
         * @param value
-        *            the Boolean attribute value.
+        *            the String attribute value.
         * 
         * @throws PaintException
         *             if the paint operation failed.
index 17a10e2423b1f5cb4adb31272c449c9133775b12..350716a59505a4281550cf19fd68f4847e2bed88 100644 (file)
@@ -316,7 +316,7 @@ public class DateField extends AbstractField {
 
                        if (newDate != oldDate
                                        && (newDate == null || !newDate.equals(oldDate)))
-                               setValue(newDate);
+                               setValue(newDate, true); // Don't require a repaint, client updates itself
                }
        }
 
@@ -348,17 +348,22 @@ public class DateField extends AbstractField {
         */
        public void setValue(Object newValue) throws Property.ReadOnlyException,
                        Property.ConversionException {
+               setValue(newValue, false);
+       }
+       
+       public void setValue(Object newValue, boolean repaintIsNotNeeded) throws Property.ReadOnlyException,
+                       Property.ConversionException {
 
                // Allows setting dates directly
                if (newValue == null || newValue instanceof Date)
-                       super.setValue(newValue);
+                       super.setValue(newValue, repaintIsNotNeeded);
                else {
-
+               
                        // Try to parse as string
                        try {
                                SimpleDateFormat parser = new SimpleDateFormat();
                                Date val = parser.parse(newValue.toString());
-                               super.setValue(val);
+                               super.setValue(val, repaintIsNotNeeded);
                        } catch (ParseException e) {
                                throw new Property.ConversionException(e.getMessage());
                        }