]> source.dussan.org Git - vaadin-framework.git/commitdiff
IDateField text style parsing more robust and supports more locales. Default popup...
authorJouni Koivuviita <jouni.koivuviita@itmill.com>
Wed, 11 Jul 2007 11:46:43 +0000 (11:46 +0000)
committerJouni Koivuviita <jouni.koivuviita@itmill.com>
Wed, 11 Jul 2007 11:46:43 +0000 (11:46 +0000)
Feature-browser DateField demo now allows user to select a locale from a dropdown list.
ISelect fixes and optimazations.

svn changeset:1842/svn branch:trunk

src/com/itmill/toolkit/demo/features/FeatureDateField.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IOptionGroupBase.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IPopupCalendar.java
src/com/itmill/toolkit/terminal/gwt/client/ui/ISelect.java
src/com/itmill/toolkit/terminal/gwt/client/ui/ITextualDate.java
src/com/itmill/toolkit/terminal/gwt/client/ui/ITime.java
src/com/itmill/toolkit/terminal/gwt/gwtwidgets/util/SimpleDateParser.java
src/com/itmill/toolkit/terminal/gwt/public/component-themes/textfield/css/textfield.css
src/com/itmill/toolkit/terminal/web/AjaxApplicationManager.java
src/com/itmill/toolkit/ui/Select.java

index b372bb08a25e048876aa8fe12795244f7ff24417..dae5ca2573e5208293b37a98d559e454c8b2ebd7 100644 (file)
@@ -31,18 +31,22 @@ package com.itmill.toolkit.demo.features;
 import java.util.Locale;
 
 import com.itmill.toolkit.data.util.IndexedContainer;
-import com.itmill.toolkit.ui.*;
+import com.itmill.toolkit.data.util.MethodProperty;
+import com.itmill.toolkit.ui.Component;
+import com.itmill.toolkit.ui.DateField;
+import com.itmill.toolkit.ui.Form;
+import com.itmill.toolkit.ui.Label;
+import com.itmill.toolkit.ui.OrderedLayout;
+import com.itmill.toolkit.ui.Select;
 
 public class FeatureDateField extends Feature {
 
-       static private IndexedContainer localeContainer;
+       static private String[] localeNames;
        static {
-               localeContainer = new IndexedContainer();
-               localeContainer.addContainerProperty("name", String.class, "");
                Locale[] locales = Locale.getAvailableLocales();
-               for (int i = 0; i < locales.length; i++)
-                       localeContainer.addItem(locales[i]).getItemProperty("name")
-                                       .setValue(locales[i].getDisplayName());
+               localeNames = new String[locales.length];
+               for (int i = 0; i < locales.length; i++) 
+                       localeNames[i] = locales[i].getDisplayName();
        }
 
        public FeatureDateField() {
@@ -53,28 +57,18 @@ public class FeatureDateField extends Feature {
 
                OrderedLayout l = new OrderedLayout();
 
-               l.addComponent(new Label("Your locale is: "
+               l.addComponent(new Label("Your default locale is: "
                                + this.getApplication().getLocale().toString()
                                                .replace('_', '-')));
 
                DateField df = new DateField();
                df.setValue(new java.util.Date());
                l.addComponent(df);
-
-               // Create locale selector
-               // TODO: see #244 (broken for AJAX mode), known issue exists
-               /*
-                * DISABLE UNTIL WORKS Select selector = new Select("Application
-                * Locale", localeContainer); selector.setItemCaptionPropertyId("name");
-                * selector.setImmediate(true); selector.setPropertyDataSource(new
-                * MethodProperty( this.getApplication(), "locale"));
-                * l.addComponent(selector);
-                */
-
+               
                // Properties
                propertyPanel = new PropertyPanel(df);
                Form ap = propertyPanel
-                               .createBeanPropertySet(new String[] { "resolution" });
+                               .createBeanPropertySet(new String[] { "resolution", "locale" });
                ap.replaceWithSelect("resolution", new Object[] {
                                new Integer(DateField.RESOLUTION_YEAR),
                                new Integer(DateField.RESOLUTION_MONTH),
@@ -85,8 +79,10 @@ public class FeatureDateField extends Feature {
                                new Integer(DateField.RESOLUTION_MSEC) }, new Object[] {
                                "Year", "Month", "Day", "Hour", "Minute", "Second",
                                "Millisecond" });
+               ap.replaceWithSelect("locale", Locale.getAvailableLocales(), localeNames);
                ap.getField("resolution").setValue(
                                new Integer(DateField.RESOLUTION_DAY));
+               ap.getField("locale").setValue(Locale.getDefault());
                Select themes = (Select) propertyPanel.getField("style");
                themes.addItem("text").getItemProperty(
                                themes.getItemCaptionPropertyId()).setValue("text");
index 854c45ad484c6b2480a73b6c9b2c57291f87b9f8..8ddf6502c09e274fdbb79191e7b1158c549a5333 100644 (file)
@@ -77,6 +77,7 @@ abstract class IOptionGroupBase extends Composite implements Paintable, ClickLis
                readonly = uidl.getBooleanAttribute("readonly");\r
                disabled = uidl.getBooleanAttribute("disabled");\r
                multiselect = "multi".equals(uidl.getStringAttribute("selectmode"));\r
+               immediate = uidl.getBooleanAttribute("immediate");\r
                \r
                UIDL ops = uidl.getChildUIDL(0);\r
                \r
@@ -138,8 +139,9 @@ abstract class IOptionGroupBase extends Composite implements Paintable, ClickLis
        protected abstract Object[] getSelectedItems();\r
        \r
        protected Object getSelectedItem() {\r
-               if(getSelectedItems().length > 0)\r
-                       return getSelectedItems()[0];\r
+               Object[] sel = getSelectedItems();\r
+               if(sel.length > 0)\r
+                       return sel[0];\r
                else\r
                        return null;\r
        }\r
index 78ea84d9aeb90544dd69f1fc945b58c8f24b9b46..99a1a6b95b3b1cfb60d146559269cfd6d4021b2f 100644 (file)
@@ -34,6 +34,7 @@ public class IPopupCalendar extends ITextualDate implements Paintable, ClickList
        public void updateFromUIDL(UIDL uidl, Client client) {\r
                super.updateFromUIDL(uidl, client);\r
                calendar.updateCalendar();\r
+               calendarToggle.setEnabled(enabled);\r
        }\r
 \r
        public void onClick(Widget sender) {\r
index 6076305bb5131ad7fd7daf09156d2e25128770c1..99d25f75e5d742d305f3a3dbddf633acd94989e1 100644 (file)
@@ -24,7 +24,10 @@ public class ISelect extends IOptionGroupBase {
 
        protected void buildOptions(UIDL uidl) {
                select.setMultipleSelect(multiselect);
-               if(multiselect) select.setVisibleItemCount(VISIBLE_COUNT);
+               if(multiselect) 
+                       select.setVisibleItemCount(VISIBLE_COUNT);
+               else 
+                       select.setVisibleItemCount(1);
                select.setEnabled(!disabled && !readonly);
                select.clear();
                for (Iterator i = uidl.getChildIterator(); i.hasNext();) {
index 368d4f37bbb509a3eaf41fd2a64409aa967b1f4e..f7945f163b0dcae16aea75e71a941efa17726f89 100644 (file)
@@ -40,7 +40,7 @@ public class ITextualDate extends IDateField implements Paintable, ChangeListene
                else if(currentResolution >= IDateField.RESOLUTION_DAY)\r
                        DateLocale.SUPPORTED_DF_TOKENS = DateLocale.TOKENS_RESOLUTION_DAY;\r
                        \r
-               format = new SimpleDateFormat(dts.getDateFormat());\r
+               format = new SimpleDateFormat(verifyFormat(dts.getDateFormat()));\r
                format.setLocale(dl);\r
                \r
                String dateText = format.format(date);\r
@@ -68,6 +68,12 @@ public class ITextualDate extends IDateField implements Paintable, ChangeListene
                        dateText += " " + (date.getHours()<12? dts.getAmPmStrings()[0] : dts.getAmPmStrings()[1]);\r
                \r
                text.setText(dateText);\r
+               text.setEnabled(enabled&&!readonly);\r
+               \r
+               if(readonly)\r
+                       text.addStyleName("i-readonly");\r
+               else\r
+                       text.removeStyleName("i-readonly");\r
        }\r
 \r
        public void onChange(Widget sender) {\r
@@ -80,7 +86,7 @@ public class ITextualDate extends IDateField implements Paintable, ChangeListene
                        else if(currentResolution == IDateField.RESOLUTION_DAY)\r
                                DateLocale.SUPPORTED_DF_TOKENS = DateLocale.TOKENS_RESOLUTION_DAY;\r
                        \r
-                       String f = dts.getDateFormat();\r
+                       String f = verifyFormat(dts.getDateFormat());\r
                        \r
                        if(currentResolution >= IDateField.RESOLUTION_HOUR)\r
                                f += " " + (dts.isTwelveHourClock()?\r
@@ -132,5 +138,29 @@ public class ITextualDate extends IDateField implements Paintable, ChangeListene
                        buildTime();\r
                }\r
        }\r
-\r
+       \r
+       private String verifyFormat(String format) {\r
+               // Remove unnecessary d & M if resolution is too low\r
+               if(currentResolution < IDateField.RESOLUTION_DAY)\r
+                       format = format.replaceAll("d", "");\r
+               if(currentResolution < IDateField.RESOLUTION_MONTH)\r
+                       format = format.replaceAll("M", "");\r
+               \r
+               // Remove unsupported patterns\r
+               // TODO support for 'G', era designator (used at least in Japan)\r
+               format = format.replaceAll("[GzZwWkK]", "");\r
+               \r
+               // Remove extra delimiters ('/' and '.')\r
+               while(format.startsWith("/") || format.startsWith(".") || format.startsWith("-"))\r
+                       format = format.substring(1);\r
+               while(format.endsWith("/") || format.endsWith(".") || format.endsWith("-"))\r
+                       format = format.substring(0, format.length()-1);\r
+               \r
+               // Remove duplicate delimiters\r
+               format = format.replaceAll("//", "/");\r
+               format = format.replaceAll("\\.\\.", ".");\r
+               format = format.replaceAll("--", "-");\r
+                       \r
+               return format.trim();\r
+       }\r
 }\r
index f9207b0cf91964ec55f7ec6bdbb99c5ac9ad8ee0..4cc6d99c326b4ebe69ce7dae26dc5fa9059d4a6f 100644 (file)
@@ -75,24 +75,6 @@ public class ITime extends FlowPanel implements ChangeListener {
                                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
@@ -139,6 +121,57 @@ public class ITime extends FlowPanel implements ChangeListener {
                        if(ro) return;\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
+               if(datefield.readonly && !redraw) {\r
+                       // Do complete redraw when in read-only status\r
+                       clear();\r
+                       String delimiter = datefield.dts.getClockDelimeter();\r
+                       \r
+                       int h = datefield.date.getHours();\r
+                       if(thc) h -= h<12? 0 : 12;\r
+                       add(new ILabel(h<10? "0"+h : ""+h));\r
+                       \r
+                       if(datefield.currentResolution >= IDateField.RESOLUTION_MIN) {\r
+                               add(new ILabel(delimiter));\r
+                               int m = mins.getSelectedIndex();\r
+                               add(new ILabel(m<10? "0"+m : ""+m));\r
+                       }\r
+                       if(datefield.currentResolution >= IDateField.RESOLUTION_SEC) {\r
+                               add(new ILabel(delimiter));\r
+                               int s = sec.getSelectedIndex();\r
+                               add(new ILabel(s<10? "0"+s : ""+s));\r
+                       }\r
+                       if(datefield.currentResolution == IDateField.RESOLUTION_MSEC) {\r
+                               add(new ILabel("."));\r
+                               int m = datefield.getMilliseconds();\r
+                               String ms = m<100? "0"+m : ""+m;\r
+                               add(new ILabel(m<10? "0"+ms : ms));\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
+                               add(new ILabel(ampm.getItemText(datefield.date.getHours()<12? 0 : 1)));\r
+                       }\r
+               }\r
+               \r
                boolean enabled = datefield.enabled;\r
                hours.setEnabled(enabled);\r
                if(mins != null) mins.setEnabled(enabled);\r
index 90fdb226441708d17fc581f60721705d0ee38800..8f3a53b1b931c85202861a865c0cb5138cdb686e 100644 (file)
@@ -2,7 +2,6 @@ package com.itmill.toolkit.terminal.gwt.gwtwidgets.util;
 \r
 import java.util.Date;\r
 \r
-import com.itmill.toolkit.terminal.gwt.client.DateTimeService;\r
 import com.itmill.toolkit.terminal.gwt.gwtwidgets.util.regex.Pattern;\r
 \r
 /**\r
@@ -112,7 +111,7 @@ public class SimpleDateParser {
                        int h = Integer.parseInt(text);\r
                        String token = com.itmill.toolkit.terminal.gwt.client.DateLocale.getPM();\r
                        String which = input.substring(input.length() - token.length()); // Assumes both AM and PM tokens have same length\r
-                       if(which.equals(token))\r
+                       if(which.equalsIgnoreCase(token))\r
                                h += 12;\r
                        date.setHours(h);\r
                }\r
index 5ea043f5f160b2c7c4a7ba364d115092ba44bd13..da7bbf32d71e057074d0c67fea4bc635e2272190 100644 (file)
@@ -1,4 +1,4 @@
-.i-textfield{\r
+.i-textfield {\r
        font-size: 1.1em;\r
        color: #444;\r
        background: #fff url(../img/bg.png) repeat-x;\r
 \r
 .i-textfield-error {\r
        background: #ff9999;\r
+}\r
+\r
+.i-textfield.i-readonly {\r
+       background: transparent;\r
+       color: #222;\r
+       border: none;\r
 }
\ No newline at end of file
index bf59c5ca7627b0c0220e23b0d44843f18f9c43d7..0b7d7f361e68ecf0881fbdbecf98e273adbae67e 100644 (file)
@@ -486,14 +486,22 @@ public class AjaxApplicationManager implements
                                // Force our locale as JVM default for a while (SimpleDateFormat uses JVM default)
                                Locale.setDefault(l);
                                String df = new SimpleDateFormat().toPattern();
-                               // TODO we suppose all formats separate date and time with a whitespace
-                               String dateformat = df.substring(0,df.indexOf(" "));
-                               outWriter.print("\"df\":\"" + dateformat + "\",");
+                               int timeStart = df.indexOf("H");
+                               if(timeStart < 0)
+                                       timeStart = df.indexOf("h");
+                               int ampm_first = df.indexOf("a");
+                               // E.g. in Korean locale AM/PM is before h:mm
+                               // TODO should take that into consideration on client-side as well, now always h:mm a
+                               if(ampm_first > 0 && ampm_first < timeStart)
+                                       timeStart = ampm_first;
+                               String dateformat = df.substring(0, timeStart-1);
+                               
+                               outWriter.print("\"df\":\"" + dateformat.trim() + "\",");
                                
                                /*
                                 * Time formatting (24 or 12 hour clock and AM/PM suffixes)
                                 */
-                               String timeformat = df.substring(df.indexOf(" ")+1, df.length()); // Doesn't return second or milliseconds
+                               String timeformat = df.substring(timeStart, df.length()); // Doesn't return second or milliseconds
                                // We use timeformat to determine 12/24-hour clock
                                boolean twelve_hour_clock = timeformat.contains("a");
                                // TODO there are other possibilities as well, like 'h' in french (ignore them, too complicated)
index 88120ca81050cd309086dc4d59a820eea495e3be..a2ac194e1275f6793408c55b94aa77d52babf5ea 100644 (file)
@@ -430,7 +430,7 @@ public class Select extends AbstractField implements Container,
                                                newsel = new HashSet(newsel);
                                        newsel.removeAll(visible);
                                        newsel.addAll(s);
-                                       super.setValue(newsel);
+                                       setValue(newsel, true);
                                }
                        }
 
@@ -550,7 +550,7 @@ public class Select extends AbstractField implements Container,
         * 
         * @param newValue
         *            the New selected item or collection of selected items.
-        * @param repaintIsNotNeeded True iff caller is sure that repaint is not needed. 
+        * @param repaintIsNotNeeded True if caller is sure that repaint is not needed. 
         * @see com.itmill.toolkit.ui.AbstractField#setValue(java.lang.Object, java.lang.Boolean)
         */
        protected void setValue(Object newValue, boolean repaintIsNotNeeded) throws Property.ReadOnlyException,