]> source.dussan.org Git - vaadin-framework.git/commitdiff
IListSelect got it's own implementation.
authorMarc Englund <marc.englund@itmill.com>
Wed, 14 Nov 2007 13:43:33 +0000 (13:43 +0000)
committerMarc Englund <marc.englund@itmill.com>
Wed, 14 Nov 2007 13:43:33 +0000 (13:43 +0000)
svn changeset:2809/svn branch:trunk

src/com/itmill/toolkit/terminal/gwt/client/ui/IListSelect.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IOptionGroupBase.java
src/com/itmill/toolkit/terminal/gwt/client/ui/ISelect.java

index 4b1991b65fb9faf0a3f7aa9bf6875dac211a7183..af376824322e4aa678049e058333fd4e63723462 100644 (file)
@@ -1,5 +1,73 @@
 package com.itmill.toolkit.terminal.gwt.client.ui;
 
-public class IListSelect extends ISelect {
+import java.util.Iterator;
+import java.util.Vector;
+
+import com.google.gwt.user.client.ui.ListBox;
+import com.google.gwt.user.client.ui.Widget;
+import com.itmill.toolkit.terminal.gwt.client.UIDL;
+
+public class IListSelect extends IOptionGroupBase {
+
+    public static final String CLASSNAME = "i-select";
+
+    private static final int VISIBLE_COUNT = 10;
+
+    protected ListBox select;
+
+    private int lastSelectedIndex = -1;
+
+    public IListSelect() {
+        super(new ListBox(), CLASSNAME);
+        select = (ListBox) optionsContainer;
+        select.addChangeListener(this);
+        select.addClickListener(this);
+        select.setStyleName(CLASSNAME + "-select");
+        select.setVisibleItemCount(VISIBLE_COUNT);
+    }
+
+    protected void buildOptions(UIDL uidl) {
+        select.setMultipleSelect(multiselect);
+        select.setEnabled(!disabled && !readonly);
+        select.clear();
+        if (!multiselect && isNullSelectionAllowed()) {
+            // can't unselect last item in singleselect mode
+            select.addItem("", null);
+        }
+        for (Iterator i = uidl.getChildIterator(); i.hasNext();) {
+            UIDL optionUidl = (UIDL) i.next();
+            select.addItem(optionUidl.getStringAttribute("caption"), optionUidl
+                    .getStringAttribute("key"));
+            if (optionUidl.hasAttribute("selected")) {
+                select.setItemSelected(select.getItemCount() - 1, true);
+            }
+        }
+    }
+
+    protected Object[] getSelectedItems() {
+        Vector selectedItemKeys = new Vector();
+        for (int i = 0; i < select.getItemCount(); i++) {
+            if (select.isItemSelected(i)) {
+                selectedItemKeys.add(select.getValue(i));
+            }
+        }
+        return selectedItemKeys.toArray();
+    }
+
+    public void onChange(Widget sender) {
+        int si = select.getSelectedIndex();
+        if (si == -1 && !isNullSelectionAllowed()) {
+            select.setSelectedIndex(lastSelectedIndex);
+        } else {
+            lastSelectedIndex = si;
+            if (select.isMultipleSelect()) {
+                client.updateVariable(id, "selected", getSelectedItems(),
+                        immediate);
+            } else {
+                client.updateVariable(id, "selected", new String[] { ""
+                        + getSelectedItem() }, immediate);
+            }
+        }
+    }
 
 }
index d57f1e7426ef3c5097fb122d0a410a2ac8e9cff0..3306338ae26ad8630b2a761b67bfca934d3616d5 100644 (file)
@@ -14,140 +14,155 @@ import com.itmill.toolkit.terminal.gwt.client.Paintable;
 import com.itmill.toolkit.terminal.gwt.client.UIDL;\r
 \r
 abstract class IOptionGroupBase extends Composite implements Paintable,\r
-               ClickListener, ChangeListener, KeyboardListener {\r
+        ClickListener, ChangeListener, KeyboardListener {\r
 \r
-       public static final String CLASSNAME_OPTION = "i-select-option";\r
-\r
-       ApplicationConnection client;\r
-\r
-       String id;\r
-\r
-       protected boolean immediate;\r
-\r
-       protected Set selectedKeys;\r
-\r
-       protected boolean multiselect;\r
-\r
-       protected boolean disabled;\r
-\r
-       protected boolean readonly;\r
-\r
-       /**\r
-        * Widget holding the different options (e.g. ListBox or Panel for radio\r
-        * buttons) (optional, fallbacks to container Panel)\r
-        */\r
-       protected Widget optionsContainer;\r
-\r
-       /**\r
-        * Panel containing the component\r
-        */\r
-       private Panel container;\r
-\r
-       private ITextField newItemField;\r
-\r
-       private IButton newItemButton;\r
-\r
-       public IOptionGroupBase(String classname) {\r
-               container = new FlowPanel();\r
-               initWidget(container);\r
-               optionsContainer = container;\r
-               container.setStyleName(classname);\r
-               immediate = false;\r
-               multiselect = false;\r
-       }\r
-\r
-       /*\r
-        * Call this if you wish to specify your own container for the option\r
-        * elements (e.g. SELECT)\r
-        */\r
-       public IOptionGroupBase(Widget w, String classname) {\r
-               this(classname);\r
-               optionsContainer = w;\r
-               container.add(optionsContainer);\r
-       }\r
-\r
-       public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {\r
-               this.client = client;\r
-               this.id = uidl.getId();\r
-\r
-               if (client.updateComponent(this, uidl, true))\r
-                       return;\r
-\r
-               selectedKeys = uidl.getStringArrayVariableAsSet("selected");\r
-\r
-               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
-               buildOptions(ops);\r
-\r
-               if (uidl.getBooleanAttribute("allownewitem")) {\r
-                       if (newItemField == null) {\r
-                               newItemButton = new IButton();\r
-                               newItemButton.setText("+");\r
-                               newItemButton.addClickListener(this);\r
-                               newItemField = new ITextField();\r
-                               newItemField.addKeyboardListener(this);\r
-                               newItemField.setColumns(16);\r
-                       }\r
-                       newItemField.setEnabled(!disabled && !readonly);\r
-                       newItemButton.setEnabled(!disabled && !readonly);\r
-\r
-                       if (newItemField != null && newItemField.getParent() == container)\r
-                               return;\r
-                       container.add(newItemField);\r
-                       container.add(newItemButton);\r
-               } else if (newItemField != null) {\r
-                       container.remove(newItemField);\r
-                       container.remove(newItemButton);\r
-               }\r
-\r
-       }\r
-\r
-       public void onClick(Widget sender) {\r
-               if (sender == newItemButton && !newItemField.getText().equals("")) {\r
-                       client.updateVariable(id, "newitem", newItemField.getText(), true);\r
-                       newItemField.setText("");\r
-               }\r
-       }\r
-\r
-       public void onChange(Widget sender) {\r
-               if (multiselect) {\r
-                       client\r
-                                       .updateVariable(id, "selected", getSelectedItems(),\r
-                                                       immediate);\r
-               } else {\r
-                       client.updateVariable(id, "selected", new String[] { ""\r
-                                       + getSelectedItem() }, immediate);\r
-               }\r
-       }\r
-\r
-       public void onKeyPress(Widget sender, char keyCode, int modifiers) {\r
-               if (sender == newItemField && keyCode == KeyboardListener.KEY_ENTER)\r
-                       newItemButton.click();\r
-       }\r
-\r
-       public void onKeyUp(Widget sender, char keyCode, int modifiers) {\r
-               // Ignore, subclasses may override\r
-       }\r
-\r
-       public void onKeyDown(Widget sender, char keyCode, int modifiers) {\r
-               // Ignore, subclasses may override\r
-       }\r
-\r
-       protected abstract void buildOptions(UIDL uidl);\r
-\r
-       protected abstract Object[] getSelectedItems();\r
-\r
-       protected Object getSelectedItem() {\r
-               Object[] sel = getSelectedItems();\r
-               if (sel.length > 0)\r
-                       return sel[0];\r
-               else\r
-                       return null;\r
-       }\r
+    public static final String CLASSNAME_OPTION = "i-select-option";\r
+\r
+    ApplicationConnection client;\r
+\r
+    String id;\r
+\r
+    protected boolean immediate;\r
+\r
+    protected Set selectedKeys;\r
+\r
+    protected boolean multiselect;\r
+\r
+    protected boolean disabled;\r
+\r
+    protected boolean readonly;\r
+\r
+    protected boolean nullSelectionAllowed = true;\r
+\r
+    /**\r
+     * Widget holding the different options (e.g. ListBox or Panel for radio\r
+     * buttons) (optional, fallbacks to container Panel)\r
+     */\r
+    protected Widget optionsContainer;\r
+\r
+    /**\r
+     * Panel containing the component\r
+     */\r
+    private Panel container;\r
+\r
+    private ITextField newItemField;\r
+\r
+    private IButton newItemButton;\r
+\r
+    public IOptionGroupBase(String classname) {\r
+        container = new FlowPanel();\r
+        initWidget(container);\r
+        optionsContainer = container;\r
+        container.setStyleName(classname);\r
+        immediate = false;\r
+        multiselect = false;\r
+    }\r
+\r
+    /*\r
+     * Call this if you wish to specify your own container for the option\r
+     * elements (e.g. SELECT)\r
+     */\r
+    public IOptionGroupBase(Widget w, String classname) {\r
+        this(classname);\r
+        optionsContainer = w;\r
+        container.add(optionsContainer);\r
+    }\r
+\r
+    protected void setNullSelectionAllowed(boolean nullSelectionAllowed) {\r
+        this.nullSelectionAllowed = nullSelectionAllowed;\r
+    }\r
+\r
+    protected boolean isNullSelectionAllowed() {\r
+        return nullSelectionAllowed;\r
+    }\r
+\r
+    public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {\r
+        this.client = client;\r
+        id = uidl.getId();\r
+\r
+        if (client.updateComponent(this, uidl, true)) {\r
+            return;\r
+        }\r
+\r
+        selectedKeys = uidl.getStringArrayVariableAsSet("selected");\r
+\r
+        readonly = uidl.getBooleanAttribute("readonly");\r
+        disabled = uidl.getBooleanAttribute("disabled");\r
+        multiselect = "multi".equals(uidl.getStringAttribute("selectmode"));\r
+        immediate = uidl.getBooleanAttribute("immediate");\r
+        nullSelectionAllowed = uidl.getBooleanAttribute("nullselect");\r
+\r
+        UIDL ops = uidl.getChildUIDL(0);\r
+\r
+        buildOptions(ops);\r
+\r
+        if (uidl.getBooleanAttribute("allownewitem")) {\r
+            if (newItemField == null) {\r
+                newItemButton = new IButton();\r
+                newItemButton.setText("+");\r
+                newItemButton.addClickListener(this);\r
+                newItemField = new ITextField();\r
+                newItemField.addKeyboardListener(this);\r
+                newItemField.setColumns(16);\r
+            }\r
+            newItemField.setEnabled(!disabled && !readonly);\r
+            newItemButton.setEnabled(!disabled && !readonly);\r
+\r
+            if (newItemField != null && newItemField.getParent() == container) {\r
+                return;\r
+            }\r
+            container.add(newItemField);\r
+            container.add(newItemButton);\r
+        } else if (newItemField != null) {\r
+            container.remove(newItemField);\r
+            container.remove(newItemButton);\r
+        }\r
+\r
+    }\r
+\r
+    public void onClick(Widget sender) {\r
+        if (sender == newItemButton && !newItemField.getText().equals("")) {\r
+            client.updateVariable(id, "newitem", newItemField.getText(), true);\r
+            newItemField.setText("");\r
+        }\r
+    }\r
+\r
+    public void onChange(Widget sender) {\r
+        if (multiselect) {\r
+            client\r
+                    .updateVariable(id, "selected", getSelectedItems(),\r
+                            immediate);\r
+        } else {\r
+            client.updateVariable(id, "selected", new String[] { ""\r
+                    + getSelectedItem() }, immediate);\r
+        }\r
+    }\r
+\r
+    public void onKeyPress(Widget sender, char keyCode, int modifiers) {\r
+        if (sender == newItemField && keyCode == KeyboardListener.KEY_ENTER) {\r
+            newItemButton.click();\r
+        }\r
+    }\r
+\r
+    public void onKeyUp(Widget sender, char keyCode, int modifiers) {\r
+        // Ignore, subclasses may override\r
+    }\r
+\r
+    public void onKeyDown(Widget sender, char keyCode, int modifiers) {\r
+        // Ignore, subclasses may override\r
+    }\r
+\r
+    protected abstract void buildOptions(UIDL uidl);\r
+\r
+    protected abstract Object[] getSelectedItems();\r
+\r
+    protected Object getSelectedItem() {\r
+        Object[] sel = getSelectedItems();\r
+        if (sel.length > 0) {\r
+            return sel[0];\r
+        } else {\r
+            return null;\r
+        }\r
+    }\r
 \r
 }\r
index b60b9ccf39a2007d881bb48e2375b347ae273338..9dc218fa4f42c74fb270920fcc04e84240b73881 100644 (file)
@@ -9,52 +9,56 @@ import com.itmill.toolkit.terminal.gwt.client.UIDL;
 
 public class ISelect extends IOptionGroupBase {
 
-       public static final String CLASSNAME = "i-select";
-
-       private static final int VISIBLE_COUNT = 10;
-
-       private ListBox select;
-
-       public ISelect() {
-               super(new ListBox(), CLASSNAME);
-               select = (ListBox) optionsContainer;
-               select.addChangeListener(this);
-               select.setStyleName(CLASSNAME + "-select");
-       }
-
-       protected void buildOptions(UIDL uidl) {
-               select.setMultipleSelect(multiselect);
-               if (multiselect)
-                       select.setVisibleItemCount(VISIBLE_COUNT);
-               else
-                       select.setVisibleItemCount(1);
-               select.setEnabled(!disabled && !readonly);
-               select.clear();
-               for (Iterator i = uidl.getChildIterator(); i.hasNext();) {
-                       UIDL optionUidl = (UIDL) i.next();
-                       select.addItem(optionUidl.getStringAttribute("caption"), optionUidl
-                                       .getStringAttribute("key"));
-                       if (optionUidl.hasAttribute("selected"))
-                               select.setItemSelected(select.getItemCount() - 1, true);
-               }
-       }
-
-       protected Object[] getSelectedItems() {
-               Vector selectedItemKeys = new Vector();
-               for (int i = 0; i < select.getItemCount(); i++) {
-                       if (select.isItemSelected(i))
-                               selectedItemKeys.add(select.getValue(i));
-               }
-               return selectedItemKeys.toArray();
-       }
-
-       public void onChange(Widget sender) {
-               if (select.isMultipleSelect())
-                       client
-                                       .updateVariable(id, "selected", getSelectedItems(),
-                                                       immediate);
-               else
-                       client.updateVariable(id, "selected", new String[] { ""
-                                       + getSelectedItem() }, immediate);
-       }
+    public static final String CLASSNAME = "i-select";
+
+    private static final int VISIBLE_COUNT = 10;
+
+    protected ListBox select;
+
+    public ISelect() {
+        super(new ListBox(), CLASSNAME);
+        select = (ListBox) optionsContainer;
+        select.addChangeListener(this);
+        select.setStyleName(CLASSNAME + "-select");
+    }
+
+    protected void buildOptions(UIDL uidl) {
+        select.setMultipleSelect(multiselect);
+        if (multiselect) {
+            select.setVisibleItemCount(VISIBLE_COUNT);
+        } else {
+            select.setVisibleItemCount(1);
+        }
+        select.setEnabled(!disabled && !readonly);
+        select.clear();
+        for (Iterator i = uidl.getChildIterator(); i.hasNext();) {
+            UIDL optionUidl = (UIDL) i.next();
+            select.addItem(optionUidl.getStringAttribute("caption"), optionUidl
+                    .getStringAttribute("key"));
+            if (optionUidl.hasAttribute("selected")) {
+                select.setItemSelected(select.getItemCount() - 1, true);
+            }
+        }
+    }
+
+    protected Object[] getSelectedItems() {
+        Vector selectedItemKeys = new Vector();
+        for (int i = 0; i < select.getItemCount(); i++) {
+            if (select.isItemSelected(i)) {
+                selectedItemKeys.add(select.getValue(i));
+            }
+        }
+        return selectedItemKeys.toArray();
+    }
+
+    public void onChange(Widget sender) {
+        if (select.isMultipleSelect()) {
+            client
+                    .updateVariable(id, "selected", getSelectedItems(),
+                            immediate);
+        } else {
+            client.updateVariable(id, "selected", new String[] { ""
+                    + getSelectedItem() }, immediate);
+        }
+    }
 }