From: Marc Englund Date: Wed, 14 Nov 2007 13:43:33 +0000 (+0000) Subject: IListSelect got it's own implementation. X-Git-Tag: 6.7.0.beta1~5587 X-Git-Url: https://source.dussan.org/?a=commitdiff_plain;h=6fe0a6c8e2ac6e7c242232a8782bc51d729ff746;p=vaadin-framework.git IListSelect got it's own implementation. svn changeset:2809/svn branch:trunk --- diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IListSelect.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IListSelect.java index 4b1991b65f..af37682432 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IListSelect.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IListSelect.java @@ -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); + } + } + } } diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IOptionGroupBase.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IOptionGroupBase.java index d57f1e7426..3306338ae2 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/IOptionGroupBase.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/IOptionGroupBase.java @@ -14,140 +14,155 @@ import com.itmill.toolkit.terminal.gwt.client.Paintable; import com.itmill.toolkit.terminal.gwt.client.UIDL; abstract class IOptionGroupBase extends Composite implements Paintable, - ClickListener, ChangeListener, KeyboardListener { + ClickListener, ChangeListener, KeyboardListener { - public static final String CLASSNAME_OPTION = "i-select-option"; - - ApplicationConnection client; - - String id; - - protected boolean immediate; - - protected Set selectedKeys; - - protected boolean multiselect; - - protected boolean disabled; - - protected boolean readonly; - - /** - * Widget holding the different options (e.g. ListBox or Panel for radio - * buttons) (optional, fallbacks to container Panel) - */ - protected Widget optionsContainer; - - /** - * Panel containing the component - */ - private Panel container; - - private ITextField newItemField; - - private IButton newItemButton; - - public IOptionGroupBase(String classname) { - container = new FlowPanel(); - initWidget(container); - optionsContainer = container; - container.setStyleName(classname); - immediate = false; - multiselect = false; - } - - /* - * Call this if you wish to specify your own container for the option - * elements (e.g. SELECT) - */ - public IOptionGroupBase(Widget w, String classname) { - this(classname); - optionsContainer = w; - container.add(optionsContainer); - } - - public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { - this.client = client; - this.id = uidl.getId(); - - if (client.updateComponent(this, uidl, true)) - return; - - selectedKeys = uidl.getStringArrayVariableAsSet("selected"); - - readonly = uidl.getBooleanAttribute("readonly"); - disabled = uidl.getBooleanAttribute("disabled"); - multiselect = "multi".equals(uidl.getStringAttribute("selectmode")); - immediate = uidl.getBooleanAttribute("immediate"); - - UIDL ops = uidl.getChildUIDL(0); - - buildOptions(ops); - - if (uidl.getBooleanAttribute("allownewitem")) { - if (newItemField == null) { - newItemButton = new IButton(); - newItemButton.setText("+"); - newItemButton.addClickListener(this); - newItemField = new ITextField(); - newItemField.addKeyboardListener(this); - newItemField.setColumns(16); - } - newItemField.setEnabled(!disabled && !readonly); - newItemButton.setEnabled(!disabled && !readonly); - - if (newItemField != null && newItemField.getParent() == container) - return; - container.add(newItemField); - container.add(newItemButton); - } else if (newItemField != null) { - container.remove(newItemField); - container.remove(newItemButton); - } - - } - - public void onClick(Widget sender) { - if (sender == newItemButton && !newItemField.getText().equals("")) { - client.updateVariable(id, "newitem", newItemField.getText(), true); - newItemField.setText(""); - } - } - - public void onChange(Widget sender) { - if (multiselect) { - client - .updateVariable(id, "selected", getSelectedItems(), - immediate); - } else { - client.updateVariable(id, "selected", new String[] { "" - + getSelectedItem() }, immediate); - } - } - - public void onKeyPress(Widget sender, char keyCode, int modifiers) { - if (sender == newItemField && keyCode == KeyboardListener.KEY_ENTER) - newItemButton.click(); - } - - public void onKeyUp(Widget sender, char keyCode, int modifiers) { - // Ignore, subclasses may override - } - - public void onKeyDown(Widget sender, char keyCode, int modifiers) { - // Ignore, subclasses may override - } - - protected abstract void buildOptions(UIDL uidl); - - protected abstract Object[] getSelectedItems(); - - protected Object getSelectedItem() { - Object[] sel = getSelectedItems(); - if (sel.length > 0) - return sel[0]; - else - return null; - } + public static final String CLASSNAME_OPTION = "i-select-option"; + + ApplicationConnection client; + + String id; + + protected boolean immediate; + + protected Set selectedKeys; + + protected boolean multiselect; + + protected boolean disabled; + + protected boolean readonly; + + protected boolean nullSelectionAllowed = true; + + /** + * Widget holding the different options (e.g. ListBox or Panel for radio + * buttons) (optional, fallbacks to container Panel) + */ + protected Widget optionsContainer; + + /** + * Panel containing the component + */ + private Panel container; + + private ITextField newItemField; + + private IButton newItemButton; + + public IOptionGroupBase(String classname) { + container = new FlowPanel(); + initWidget(container); + optionsContainer = container; + container.setStyleName(classname); + immediate = false; + multiselect = false; + } + + /* + * Call this if you wish to specify your own container for the option + * elements (e.g. SELECT) + */ + public IOptionGroupBase(Widget w, String classname) { + this(classname); + optionsContainer = w; + container.add(optionsContainer); + } + + protected void setNullSelectionAllowed(boolean nullSelectionAllowed) { + this.nullSelectionAllowed = nullSelectionAllowed; + } + + protected boolean isNullSelectionAllowed() { + return nullSelectionAllowed; + } + + public void updateFromUIDL(UIDL uidl, ApplicationConnection client) { + this.client = client; + id = uidl.getId(); + + if (client.updateComponent(this, uidl, true)) { + return; + } + + selectedKeys = uidl.getStringArrayVariableAsSet("selected"); + + readonly = uidl.getBooleanAttribute("readonly"); + disabled = uidl.getBooleanAttribute("disabled"); + multiselect = "multi".equals(uidl.getStringAttribute("selectmode")); + immediate = uidl.getBooleanAttribute("immediate"); + nullSelectionAllowed = uidl.getBooleanAttribute("nullselect"); + + UIDL ops = uidl.getChildUIDL(0); + + buildOptions(ops); + + if (uidl.getBooleanAttribute("allownewitem")) { + if (newItemField == null) { + newItemButton = new IButton(); + newItemButton.setText("+"); + newItemButton.addClickListener(this); + newItemField = new ITextField(); + newItemField.addKeyboardListener(this); + newItemField.setColumns(16); + } + newItemField.setEnabled(!disabled && !readonly); + newItemButton.setEnabled(!disabled && !readonly); + + if (newItemField != null && newItemField.getParent() == container) { + return; + } + container.add(newItemField); + container.add(newItemButton); + } else if (newItemField != null) { + container.remove(newItemField); + container.remove(newItemButton); + } + + } + + public void onClick(Widget sender) { + if (sender == newItemButton && !newItemField.getText().equals("")) { + client.updateVariable(id, "newitem", newItemField.getText(), true); + newItemField.setText(""); + } + } + + public void onChange(Widget sender) { + if (multiselect) { + client + .updateVariable(id, "selected", getSelectedItems(), + immediate); + } else { + client.updateVariable(id, "selected", new String[] { "" + + getSelectedItem() }, immediate); + } + } + + public void onKeyPress(Widget sender, char keyCode, int modifiers) { + if (sender == newItemField && keyCode == KeyboardListener.KEY_ENTER) { + newItemButton.click(); + } + } + + public void onKeyUp(Widget sender, char keyCode, int modifiers) { + // Ignore, subclasses may override + } + + public void onKeyDown(Widget sender, char keyCode, int modifiers) { + // Ignore, subclasses may override + } + + protected abstract void buildOptions(UIDL uidl); + + protected abstract Object[] getSelectedItems(); + + protected Object getSelectedItem() { + Object[] sel = getSelectedItems(); + if (sel.length > 0) { + return sel[0]; + } else { + return null; + } + } } diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/ISelect.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/ISelect.java index b60b9ccf39..9dc218fa4f 100644 --- a/src/com/itmill/toolkit/terminal/gwt/client/ui/ISelect.java +++ b/src/com/itmill/toolkit/terminal/gwt/client/ui/ISelect.java @@ -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); + } + } }