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.ITwinColSelect;
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;
if ("select".equals(tag)) {
if("optiongroup".equals(uidl.getStringAttribute("style")))
return new IOptionGroup();
+ else if("twincol".equals(uidl.getStringAttribute("style")))
+ return new ITwinColSelect();
return new ISelect();
}
if ("panel".equals(tag) || "component".equals(tag))
import com.itmill.toolkit.terminal.gwt.client.UIDL;
public class IButton extends Button implements Paintable {
+
+ private static final String CLASSNAME = "i-button";
String id;
Client client;
public IButton() {
+ setStyleName(CLASSNAME);
addClickListener(new ClickListener() {
public void onClick(Widget sender) {
public void updateFromUIDL(UIDL uidl, Client client) {
- // Ensure correct implementation
+ // Ensure correct implementation,
+ // but don't let container manage caption etc.
if (client.updateComponent(this, uidl, false))
return;
package com.itmill.toolkit.terminal.gwt.client.ui;\r
\r
+import java.util.HashMap;\r
import java.util.Iterator;\r
+import java.util.Map;\r
\r
import com.google.gwt.user.client.ui.CheckBox;\r
import com.google.gwt.user.client.ui.Panel;\r
\r
private Panel panel;\r
\r
+ private Map optionsToKeys;\r
+ \r
public IOptionGroup() {\r
super(CLASSNAME);\r
panel = (Panel) optionsContainer;\r
+ optionsToKeys = new HashMap();\r
}\r
\r
/*\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
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.KeyboardListener;\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
+abstract class IOptionGroupBase extends Composite implements Paintable, ClickListener, ChangeListener, KeyboardListener {\r
\r
static final String CLASSNAME_OPTION = "i-select-option";\r
\r
\r
protected boolean immediate;\r
\r
- protected Map optionsToKeys;\r
- \r
protected Set selectedKeys;\r
\r
protected boolean multiselect;\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
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
\r
public void onClick(Widget sender) {\r
- if(sender == newItemButton && !newItemField.getText().equals(""))\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
}\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 abstract Object getSelectedItem();\r
+ protected Object getSelectedItem() {\r
+ if(getSelectedItems().length > 0)\r
+ return getSelectedItems()[0];\r
+ else\r
+ return null;\r
+ }\r
\r
}\r
private 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);
select.setEnabled(!disabled && !readonly);
select.clear();
for (Iterator i = uidl.getChildIterator(); i.hasNext();) {
protected Object[] getSelectedItems() {
Vector selectedItemKeys = new Vector();
- for(int i = 0; i < select.getItemCount();i++) {
+ for(int i = 0; i < select.getItemCount(); i++) {
if(select.isItemSelected(i))
selectedItemKeys.add(select.getValue(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);
super.updateFromUIDL(uidl, client);\r
\r
if(uidl.hasAttribute("rows"))\r
- setHeight(uidl.getStringAttribute("rows")+"em");\r
+ setRows(new Integer(uidl.getStringAttribute("rows")).intValue());\r
}\r
\r
}\r
immediate = uidl.getBooleanAttribute("immediate");
if(uidl.hasAttribute("cols"))
- setWidth(uidl.getStringAttribute("cols")+"em");
+ setColumns(new Integer(uidl.getStringAttribute("cols")).intValue());
setText(uidl.getStringVariable("text"));
public void onLostFocus(Widget sender) {
removeStyleName(CLASSNAME_FOCUS);
}
+
+ public void setColumns(int columns) {
+ setColumns(getElement(), columns);
+ }
+
+ public void setRows(int rows) {
+ setRows(getElement(), rows);
+ }
+
+ private native void setColumns(Element e, int c) /*-{
+ try {
+ switch(e.tagName.toLowerCase()) {
+ case "input":
+ e.size = c;
+ break;
+ case "textarea":
+ e.cols = c;
+ break;
+ default:;
+ }
+ } catch (e) {}
+ }-*/;
+
+ private native void setRows(Element e, int r) /*-{
+ try {
+ if(e.tagName.toLowerCase() == "textarea")
+ e.rows = r;
+ } catch (e) {}
+}-*/;
}
--- /dev/null
+package com.itmill.toolkit.terminal.gwt.client.ui;\r
+\r
+import java.util.Iterator;\r
+import java.util.Vector;\r
+\r
+import com.google.gwt.user.client.ui.FlowPanel;\r
+import com.google.gwt.user.client.ui.HTML;\r
+import com.google.gwt.user.client.ui.ListBox;\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.UIDL;\r
+\r
+public class ITwinColSelect extends IOptionGroupBase {\r
+ \r
+ private static final String CLASSNAME = "i-select-twincol";\r
+ \r
+ private static final int VISIBLE_COUNT = 10;\r
+ \r
+ private ListBox options;\r
+ \r
+ private ListBox selections;\r
+ \r
+ private IButton add;\r
+ \r
+ private IButton remove;\r
+ \r
+ public ITwinColSelect() {\r
+ super(CLASSNAME);\r
+ options = new ListBox();\r
+ selections = new ListBox();\r
+ options.setVisibleItemCount(VISIBLE_COUNT);\r
+ selections.setVisibleItemCount(VISIBLE_COUNT);\r
+ options.setStyleName(CLASSNAME+"-options");\r
+ selections.setStyleName(CLASSNAME+"-selections");\r
+ Panel buttons = new FlowPanel();\r
+ buttons.setStyleName(CLASSNAME+"-buttons");\r
+ add = new IButton();\r
+ remove = new IButton();\r
+ add.setText(">>");\r
+ remove.setText("<<");\r
+ add.addClickListener(this);\r
+ remove.addClickListener(this);\r
+ Panel p = ((Panel)optionsContainer);\r
+ p.add(options);\r
+ buttons.add(add);\r
+ HTML br = new HTML(" ");\r
+ br.setStyleName(CLASSNAME+"-deco");\r
+ buttons.add(br);\r
+ buttons.add(remove);\r
+ p.add(buttons);\r
+ p.add(selections);\r
+ }\r
+\r
+ protected void buildOptions(UIDL uidl) {\r
+ boolean enabled = !disabled && !readonly;\r
+ options.setMultipleSelect(multiselect);\r
+ selections.setMultipleSelect(multiselect);\r
+ options.setEnabled(enabled);\r
+ selections.setEnabled(enabled);\r
+ add.setEnabled(enabled);\r
+ remove.setEnabled(enabled);\r
+ options.clear();\r
+ selections.clear();\r
+ for (Iterator i = uidl.getChildIterator(); i.hasNext();) {\r
+ UIDL optionUidl = (UIDL)i.next();\r
+ if(optionUidl.hasAttribute("selected")) {\r
+ selections.addItem(optionUidl.getStringAttribute("caption"), optionUidl.getStringAttribute("key"));\r
+ } else\r
+ options.addItem(optionUidl.getStringAttribute("caption"), optionUidl.getStringAttribute("key"));\r
+ }\r
+ }\r
+\r
+ protected Object[] getSelectedItems() {\r
+ Vector selectedItemKeys = new Vector();\r
+ for(int i = 0; i < selections.getItemCount(); i++) {\r
+ selectedItemKeys.add(selections.getValue(i));\r
+ }\r
+ return selectedItemKeys.toArray();\r
+ }\r
+ \r
+ private String[] getItemsToAdd() {\r
+ String[] selectedIndexes = new String[options.getItemCount()];\r
+ for(int i = 0; i < options.getItemCount(); i++) {\r
+ if(options.isItemSelected(i))\r
+ selectedIndexes[i] = options.getValue(i);\r
+ }\r
+ return selectedIndexes;\r
+ }\r
+ \r
+ private String[] getItemsToRemove() {\r
+ String[] selectedIndexes = new String[selections.getItemCount()];\r
+ for(int i = 0; i < selections.getItemCount(); i++) {\r
+ if(selections.isItemSelected(i))\r
+ selectedIndexes[i] = selections.getValue(i);\r
+ }\r
+ return selectedIndexes;\r
+ }\r
+ \r
+ public void onClick(Widget sender) {\r
+ super.onClick(sender);\r
+ if(sender == add) {\r
+ String[] sel = getItemsToAdd();\r
+ for(int i=0; i < sel.length; i++) {\r
+ if(sel[i]!=null) selectedKeys.add(sel[i]);\r
+ }\r
+ client.updateVariable(id, "selected", selectedKeys.toArray(), true); // Immediate\r
+ } else if(sender == remove) {\r
+ String[] sel = getItemsToRemove();\r
+ for(int i=0; i < sel.length; i++) {\r
+ if(sel[i]!=null) selectedKeys.remove(sel[i]);\r
+ }\r
+ client.updateVariable(id, "selected", selectedKeys.toArray(), true); // Immediate\r
+ }\r
+ }\r
+\r
+}\r
\r
.i-select-optiongroup .i-select-option {\r
display: block;\r
+}\r
+\r
+.i-select-select {\r
+ border: 1px solid #b6b6b6;\r
+ border-top-color: #9d9d9d;\r
+ border-bottom-color: #d6d6d6;\r
+ border-right-color: #d6d6d6;\r
+ display: block;\r
+}\r
+\r
+/* Twincol style */\r
+.i-select-twincol-options {\r
+ float: left;\r
+}\r
+\r
+.i-select-twincol-buttons {\r
+ float: left;\r
+ width: 40px;\r
+ text-align: center;\r
+}\r
+\r
+.i-select-twincol-buttons .i-select-twincol-deco {\r
+ display: inline; /* Needed to push the two buttons in stack */\r
+}\r
+\r
+.i-select-twincol .i-textfield {\r
+ display: block;\r
+ float: left;\r
+ clear: left;\r
+}\r
+\r
+.i-select-twincol .i-button {\r
+ display: block;\r
+ float: left;\r
+}\r
+\r
+.i-select-twincol-buttons .i-button {\r
+ display: inline;\r
+ float: none;\r
}
\ No newline at end of file
background: #fff url(../img/bg.png) repeat-x;\r
padding: 2px;\r
border: 1px solid #b6b6b6;\r
+ border-top-color: #9d9d9d;\r
border-bottom-color: #d6d6d6;\r
border-right-color: #d6d6d6;\r
margin: 0;\r