]> source.dussan.org Git - vaadin-framework.git/commitdiff
Select component now has an abstract superclass IOptionGroupBase and two implementati...
authorJouni Koivuviita <jouni.koivuviita@itmill.com>
Fri, 15 Jun 2007 13:48:32 +0000 (13:48 +0000)
committerJouni Koivuviita <jouni.koivuviita@itmill.com>
Fri, 15 Jun 2007 13:48:32 +0000 (13:48 +0000)
svn changeset:1751/svn branch:trunk

src/com/itmill/toolkit/terminal/gwt/client/DefaultWidgetFactory.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IButton.java
src/com/itmill/toolkit/terminal/gwt/client/ui/IOptionGroup.java [new file with mode: 0644]
src/com/itmill/toolkit/terminal/gwt/client/ui/IOptionGroupBase.java [new file with mode: 0644]
src/com/itmill/toolkit/terminal/gwt/client/ui/ISelect.java
src/com/itmill/toolkit/terminal/gwt/client/ui/ITextField.java
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/select/css/select.css [new file with mode: 0644]
src/com/itmill/toolkit/terminal/gwt/public/component-themes/textfield/css/textfield.css

index ee4a009b3e2edfd59c51689c4b5b4f9f19f8b36c..08a58fa62affe4109744ba2ecd4c1c03bdf4e1e6 100644 (file)
@@ -2,16 +2,16 @@ package com.itmill.toolkit.terminal.gwt.client;
 
 import com.google.gwt.core.client.GWT;
 import com.google.gwt.user.client.ui.Widget;
-import com.itmill.toolkit.terminal.gwt.client.ui.ICustomLayout;
-import com.itmill.toolkit.terminal.gwt.client.ui.IPasswordField;
 import com.itmill.toolkit.terminal.gwt.client.ui.IButton;
 import com.itmill.toolkit.terminal.gwt.client.ui.ICheckBox;
+import com.itmill.toolkit.terminal.gwt.client.ui.ICustomLayout;
 import com.itmill.toolkit.terminal.gwt.client.ui.IEmbedded;
 import com.itmill.toolkit.terminal.gwt.client.ui.IGridLayout;
 import com.itmill.toolkit.terminal.gwt.client.ui.IHorizontalLayout;
 import com.itmill.toolkit.terminal.gwt.client.ui.ILabel;
-import com.itmill.toolkit.terminal.gwt.client.ui.IVerticalLayout;
+import com.itmill.toolkit.terminal.gwt.client.ui.IOptionGroup;
 import com.itmill.toolkit.terminal.gwt.client.ui.IPanel;
+import com.itmill.toolkit.terminal.gwt.client.ui.IPasswordField;
 import com.itmill.toolkit.terminal.gwt.client.ui.ISelect;
 import com.itmill.toolkit.terminal.gwt.client.ui.ITable;
 import com.itmill.toolkit.terminal.gwt.client.ui.ITabsheet;
@@ -19,6 +19,7 @@ import com.itmill.toolkit.terminal.gwt.client.ui.ITextArea;
 import com.itmill.toolkit.terminal.gwt.client.ui.ITextField;
 import com.itmill.toolkit.terminal.gwt.client.ui.ITree;
 import com.itmill.toolkit.terminal.gwt.client.ui.IUnknownComponent;
+import com.itmill.toolkit.terminal.gwt.client.ui.IVerticalLayout;
 import com.itmill.toolkit.terminal.gwt.client.ui.IWindow;
 
 public class DefaultWidgetFactory implements WidgetFactory {
@@ -46,8 +47,11 @@ public class DefaultWidgetFactory implements WidgetFactory {
                        return new IGridLayout();
                if ("tree".equals(tag))
                        return new ITree();
-               if ("select".equals(tag))
+               if ("select".equals(tag)) {
+                       if("optiongroup".equals(uidl.getStringAttribute("style")))
+                               return new IOptionGroup();
                        return new ISelect();
+               }
                if ("panel".equals(tag) || "component".equals(tag))
                        return new IPanel();
                if ("tabsheet".equals(tag))
index d40c55caff1eeca59804ad5643802d9a3be76025..8273a75366dda3d3420449cd8a1f236132b5a50d 100644 (file)
@@ -2,12 +2,12 @@ package com.itmill.toolkit.terminal.gwt.client.ui;
 
 import com.google.gwt.user.client.ui.ClickListener;
 import com.google.gwt.user.client.ui.Widget;
+import com.google.gwt.user.client.ui.Button;
 import com.itmill.toolkit.terminal.gwt.client.Client;
 import com.itmill.toolkit.terminal.gwt.client.Paintable;
 import com.itmill.toolkit.terminal.gwt.client.UIDL;
 
-public class IButton extends com.google.gwt.user.client.ui.Button implements
-               Paintable {
+public class IButton extends Button implements Paintable {
 
        String id;
 
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IOptionGroup.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IOptionGroup.java
new file mode 100644 (file)
index 0000000..b85368f
--- /dev/null
@@ -0,0 +1,68 @@
+package com.itmill.toolkit.terminal.gwt.client.ui;\r
+\r
+import java.util.Iterator;\r
+\r
+import com.google.gwt.user.client.ui.CheckBox;\r
+import com.google.gwt.user.client.ui.Panel;\r
+import com.google.gwt.user.client.ui.RadioButton;\r
+import com.google.gwt.user.client.ui.Widget;\r
+import com.itmill.toolkit.terminal.gwt.client.UIDL;\r
+\r
+public class IOptionGroup extends IOptionGroupBase {\r
+       \r
+       private static final String CLASSNAME = "i-select-optiongroup";\r
+       \r
+       private Panel panel;\r
+       \r
+       public IOptionGroup() {\r
+               super(CLASSNAME);\r
+               panel = (Panel) optionsContainer;\r
+       }\r
+       \r
+       /*\r
+        * Return true if no elements were changed, false otherwise.\r
+        */\r
+       protected void buildOptions(UIDL uidl) {\r
+               panel.clear();\r
+               for(Iterator it = uidl.getChildIterator(); it.hasNext();) {\r
+                       UIDL opUidl = (UIDL) it.next();\r
+                       CheckBox op;\r
+                       if(multiselect) {\r
+                               op = new ICheckBox();\r
+                               op.setText(opUidl.getStringAttribute("caption"));\r
+                       } else {\r
+                               op = new RadioButton(id, opUidl.getStringAttribute("caption"));\r
+                       }\r
+                       op.setStyleName(CLASSNAME_OPTION);\r
+                       op.setChecked(opUidl.getBooleanAttribute("selected"));\r
+                       op.setEnabled(!opUidl.getBooleanAttribute("disabled") && !readonly && !disabled);\r
+                       op.addClickListener(this);\r
+                       optionsToKeys.put(op, opUidl.getStringAttribute("key"));\r
+                       panel.add(op);\r
+               }\r
+       }\r
+\r
+       protected Object getSelectedItem() {\r
+               if(getSelectedItems().length > 0)\r
+                       return getSelectedItems()[0];\r
+               else\r
+                       return null;\r
+       }\r
+\r
+       protected Object[] getSelectedItems() {\r
+               return selectedKeys.toArray();\r
+       }\r
+       \r
+       public void onClick(Widget sender) {\r
+               super.onClick(sender);\r
+               if(sender instanceof CheckBox) {\r
+                       boolean selected = ((CheckBox) sender).isChecked();\r
+                       String key = (String) optionsToKeys.get(sender);\r
+                       if(!multiselect) selectedKeys.clear();\r
+                       if(selected) selectedKeys.add(key);\r
+                       else selectedKeys.remove(key);\r
+                       client.updateVariable(id, "selected", getSelectedItems(), immediate);\r
+               }\r
+       }\r
+\r
+}\r
diff --git a/src/com/itmill/toolkit/terminal/gwt/client/ui/IOptionGroupBase.java b/src/com/itmill/toolkit/terminal/gwt/client/ui/IOptionGroupBase.java
new file mode 100644 (file)
index 0000000..571a803
--- /dev/null
@@ -0,0 +1,129 @@
+package com.itmill.toolkit.terminal.gwt.client.ui;\r
+\r
+import java.util.HashMap;\r
+import java.util.Map;\r
+import java.util.Set;\r
+\r
+import com.google.gwt.user.client.ui.ChangeListener;\r
+import com.google.gwt.user.client.ui.ClickListener;\r
+import com.google.gwt.user.client.ui.Composite;\r
+import com.google.gwt.user.client.ui.FlowPanel;\r
+import com.google.gwt.user.client.ui.Panel;\r
+import com.google.gwt.user.client.ui.Widget;\r
+import com.itmill.toolkit.terminal.gwt.client.Client;\r
+import com.itmill.toolkit.terminal.gwt.client.Paintable;\r
+import com.itmill.toolkit.terminal.gwt.client.UIDL;\r
+\r
+abstract class IOptionGroupBase extends Composite implements Paintable, ClickListener, ChangeListener {\r
+       \r
+       static final String CLASSNAME_OPTION = "i-select-option";\r
+\r
+       Client client;\r
+       \r
+       String id;\r
+       \r
+       protected boolean immediate;\r
+       \r
+       protected Map optionsToKeys;\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 \r
+        * (e.g. ListBox or Panel for radio buttons)\r
+        * (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
+               optionsToKeys = new HashMap();\r
+       }\r
+       \r
+       /* Call this if you wish to specify your own container \r
+        * for the option 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, Client 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
+               \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
+                       }\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
+       }\r
+       \r
+       public void onChange(Widget sender) {\r
+               if(multiselect) {\r
+                       client.updateVariable(id, "selected", getSelectedItems(), immediate);\r
+               } else {\r
+                       client.updateVariable(id, "selected", new String[] { "" + getSelectedItem()}, immediate);\r
+               }\r
+       }\r
+       \r
+       protected abstract void buildOptions(UIDL uidl);\r
+       \r
+       protected abstract Object[] getSelectedItems();\r
+       \r
+       protected abstract Object getSelectedItem();\r
+\r
+}\r
index d3000d1c841fd8b77755f2a05a11e5583dd27beb..18a398dba27006302394b8f9fbeb145a8beed0ef 100644 (file)
@@ -3,65 +3,35 @@ package com.itmill.toolkit.terminal.gwt.client.ui;
 import java.util.Iterator;
 import java.util.Vector;
 
-import com.google.gwt.user.client.ui.ChangeListener;
-import com.google.gwt.user.client.ui.Composite;
-import com.google.gwt.user.client.ui.Label;
 import com.google.gwt.user.client.ui.ListBox;
-import com.google.gwt.user.client.ui.VerticalPanel;
 import com.google.gwt.user.client.ui.Widget;
-import com.itmill.toolkit.terminal.gwt.client.Client;
-import com.itmill.toolkit.terminal.gwt.client.Paintable;
 import com.itmill.toolkit.terminal.gwt.client.UIDL;
 
-public class ISelect extends Composite implements Paintable, ChangeListener {
+public class ISelect extends IOptionGroupBase {
        
-       Label caption = new Label();
-       ListBox select = new ListBox();
-       private Client client;
-       private String id;
-       private boolean immediate;
+       private static final String CLASSNAME = "i-select";
        
+       private ListBox select;
        
        public ISelect() {
-               VerticalPanel panel = new VerticalPanel();
-               panel.add(caption);
-               panel.add(select);
+               super(new ListBox(), CLASSNAME);
+               select = (ListBox) optionsContainer;
                select.addChangeListener(this);
-               initWidget(panel);
        }
 
-       public void updateFromUIDL(UIDL uidl, Client client) {
-               this.client = client;
-               this.id = uidl.getStringAttribute("id");
-               this.immediate = uidl.getBooleanAttribute("immediate");
-               
-               if (uidl.hasAttribute("caption")) caption.setText(uidl.getStringAttribute("caption")); 
-               
-               if(uidl.hasAttribute("selectmode"))
-                       select.setMultipleSelect(true);
-               else
-                       select.setMultipleSelect(false);
-
-               UIDL options = uidl.getChildUIDL(0);
-               
+       protected void buildOptions(UIDL uidl) {
+               select.setMultipleSelect(multiselect);
+               select.setEnabled(!disabled && !readonly);
                select.clear();
-               for (Iterator i = options.getChildIterator(); i.hasNext();) {
+               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);
                }
        }
-
-       public void onChange(Widget sender) {
-               if(select.isMultipleSelect()) {
-                       client.updateVariable(id, "selected", getSelectedKeys(), immediate);
-               } else {
-                       client.updateVariable(id, "selected", new String[] { "" + select.getValue(select.getSelectedIndex())}, immediate);
-               }
-       }
        
-       private Object[] getSelectedKeys() {
+       protected Object[] getSelectedItems() {
                Vector selectedItemKeys = new Vector();
                for(int i = 0; i < select.getItemCount();i++) {
                        if(select.isItemSelected(i))
@@ -69,4 +39,18 @@ public class ISelect extends Composite implements Paintable, ChangeListener {
                }
                return selectedItemKeys.toArray();
        }
+
+       protected Object getSelectedItem() {
+               if(getSelectedItems().length > 0)
+                       return getSelectedItems()[0];
+               else
+                       return null;
+       }
+
+       public void onChange(Widget sender) {
+               if(select.isMultipleSelect())
+                       client.updateVariable(id, "selected", getSelectedItems(), immediate);
+               else
+                       client.updateVariable(id, "selected", new String[] { "" + getSelectedItem()}, immediate);
+       }
 }
index e7254ce99e34498f814b3b386d09c9a585bde6ee..711fb3da0654fdb27b9e8e607ac3953e0da4f4d0 100644 (file)
@@ -29,9 +29,9 @@ public class ITextField extends TextBoxBase implements
         */
        private static final String CLASSNAME_FOCUS = "i-textfield-focus";
 
-       private String id;
+       protected String id;
 
-       private Client client;
+       protected Client client;
 
        private boolean immediate = false;
        
@@ -64,7 +64,8 @@ public class ITextField extends TextBoxBase implements
        }
 
        public void onChange(Widget sender) {
-               client.updateVariable(id, "text", getText() , immediate);
+               if(client != null && id != null)
+                       client.updateVariable(id, "text", getText() , immediate);
        }
 
        public void onFocus(Widget sender) {
index 4cdd3d0db21a096d16028fb0d91076102f1b794a..1b08bcd2dccb190ad2538f034290363dfaa50a66 100644 (file)
@@ -1,2 +1,3 @@
 @import "common/css/common.css";\r
-@import "textfield/css/textfield.css";
\ No newline at end of file
+@import "textfield/css/textfield.css";\r
+@import "select/css/select.css";
\ No newline at end of file
index def46157a54c2018e7f76f3b39252f020e995ec7..8f82f870a4555cb1e72b872819625bfec04136bf 100644 (file)
@@ -4,4 +4,14 @@ body {
        color: #222;\r
        font-size: 62.5%;\r
        line-height: 1.4em;\r
+}\r
+\r
+input, select, textarea, button {\r
+       font-family: helvetica, verdana, tahoma, arial, sans-serif;\r
+       font-size: 1.1em;\r
+}\r
+\r
+select {\r
+       padding: 0;\r
+       margin: 0;\r
 }
\ No newline at end of file
diff --git a/src/com/itmill/toolkit/terminal/gwt/public/component-themes/select/css/select.css b/src/com/itmill/toolkit/terminal/gwt/public/component-themes/select/css/select.css
new file mode 100644 (file)
index 0000000..710bfa1
--- /dev/null
@@ -0,0 +1,15 @@
+.i-select {\r
+\r
+}\r
+\r
+.i-select-option {\r
+\r
+}\r
+\r
+.i-select-optiongroup {\r
+\r
+}\r
+\r
+.i-select-optiongroup .i-select-option {\r
+       display: block;\r
+}
\ No newline at end of file
index 2e51616487c64c6e69851d929efc18a0e9489d91..c1cf6d833429479e4fb3d8bec3b2a56823d0d37d 100644 (file)
@@ -1,5 +1,4 @@
 .i-textfield{\r
-       font-family: helvetica, verdana, tahoma, arial, sans-serif; /* Copy from common.css */\r
        font-size: 1.2em;\r
        color: #444;\r
        background: #fff url(../img/bg.png) repeat-x;\r