You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

IOptionGroupBase.java 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. package com.itmill.toolkit.terminal.gwt.client.ui;
  2. import java.util.Set;
  3. import com.google.gwt.user.client.ui.ChangeListener;
  4. import com.google.gwt.user.client.ui.ClickListener;
  5. import com.google.gwt.user.client.ui.Composite;
  6. import com.google.gwt.user.client.ui.FlowPanel;
  7. import com.google.gwt.user.client.ui.KeyboardListener;
  8. import com.google.gwt.user.client.ui.Panel;
  9. import com.google.gwt.user.client.ui.Widget;
  10. import com.itmill.toolkit.terminal.gwt.client.ApplicationConnection;
  11. import com.itmill.toolkit.terminal.gwt.client.Paintable;
  12. import com.itmill.toolkit.terminal.gwt.client.UIDL;
  13. abstract class IOptionGroupBase extends Composite implements Paintable,
  14. ClickListener, ChangeListener, KeyboardListener {
  15. public static final String CLASSNAME_OPTION = "i-select-option";
  16. ApplicationConnection client;
  17. String id;
  18. protected boolean immediate;
  19. protected Set selectedKeys;
  20. protected boolean multiselect;
  21. protected boolean disabled;
  22. protected boolean readonly;
  23. /**
  24. * Widget holding the different options (e.g. ListBox or Panel for radio
  25. * buttons) (optional, fallbacks to container Panel)
  26. */
  27. protected Widget optionsContainer;
  28. /**
  29. * Panel containing the component
  30. */
  31. private Panel container;
  32. private ITextField newItemField;
  33. private IButton newItemButton;
  34. public IOptionGroupBase(String classname) {
  35. container = new FlowPanel();
  36. initWidget(container);
  37. optionsContainer = container;
  38. container.setStyleName(classname);
  39. immediate = false;
  40. multiselect = false;
  41. }
  42. /*
  43. * Call this if you wish to specify your own container for the option
  44. * elements (e.g. SELECT)
  45. */
  46. public IOptionGroupBase(Widget w, String classname) {
  47. this(classname);
  48. optionsContainer = w;
  49. container.add(optionsContainer);
  50. }
  51. public void updateFromUIDL(UIDL uidl, ApplicationConnection client) {
  52. this.client = client;
  53. this.id = uidl.getId();
  54. if (client.updateComponent(this, uidl, true))
  55. return;
  56. selectedKeys = uidl.getStringArrayVariableAsSet("selected");
  57. readonly = uidl.getBooleanAttribute("readonly");
  58. disabled = uidl.getBooleanAttribute("disabled");
  59. multiselect = "multi".equals(uidl.getStringAttribute("selectmode"));
  60. immediate = uidl.getBooleanAttribute("immediate");
  61. UIDL ops = uidl.getChildUIDL(0);
  62. buildOptions(ops);
  63. if (uidl.getBooleanAttribute("allownewitem")) {
  64. if (newItemField == null) {
  65. newItemButton = new IButton();
  66. newItemButton.setText("+");
  67. newItemButton.addClickListener(this);
  68. newItemField = new ITextField();
  69. newItemField.addKeyboardListener(this);
  70. newItemField.setColumns(16);
  71. }
  72. newItemField.setEnabled(!disabled && !readonly);
  73. newItemButton.setEnabled(!disabled && !readonly);
  74. if (newItemField != null && newItemField.getParent() == container)
  75. return;
  76. container.add(newItemField);
  77. container.add(newItemButton);
  78. } else if (newItemField != null) {
  79. container.remove(newItemField);
  80. container.remove(newItemButton);
  81. }
  82. }
  83. public void onClick(Widget sender) {
  84. if (sender == newItemButton && !newItemField.getText().equals("")) {
  85. client.updateVariable(id, "newitem", newItemField.getText(), true);
  86. newItemField.setText("");
  87. }
  88. }
  89. public void onChange(Widget sender) {
  90. if (multiselect) {
  91. client
  92. .updateVariable(id, "selected", getSelectedItems(),
  93. immediate);
  94. } else {
  95. client.updateVariable(id, "selected", new String[] { ""
  96. + getSelectedItem() }, immediate);
  97. }
  98. }
  99. public void onKeyPress(Widget sender, char keyCode, int modifiers) {
  100. if (sender == newItemField && keyCode == KeyboardListener.KEY_ENTER)
  101. newItemButton.click();
  102. }
  103. public void onKeyUp(Widget sender, char keyCode, int modifiers) {
  104. // Ignore, subclasses may override
  105. }
  106. public void onKeyDown(Widget sender, char keyCode, int modifiers) {
  107. // Ignore, subclasses may override
  108. }
  109. protected abstract void buildOptions(UIDL uidl);
  110. protected abstract Object[] getSelectedItems();
  111. protected Object getSelectedItem() {
  112. Object[] sel = getSelectedItems();
  113. if (sel.length > 0)
  114. return sel[0];
  115. else
  116. return null;
  117. }
  118. }