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;
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 {
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))
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;
--- /dev/null
+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
--- /dev/null
+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
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))
}
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);
+ }
}
*/
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;
}
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) {
@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
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
--- /dev/null
+.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
.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