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);
+ }
+ }
+ }
}
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
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);
+ }
+ }
}