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.

VTwinColSelect.java 8.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. /*
  2. @ITMillApache2LicenseForJavaFiles@
  3. */
  4. package com.vaadin.terminal.gwt.client.ui;
  5. import java.util.Iterator;
  6. import java.util.Vector;
  7. import com.google.gwt.user.client.DOM;
  8. import com.google.gwt.user.client.ui.FlowPanel;
  9. import com.google.gwt.user.client.ui.HTML;
  10. import com.google.gwt.user.client.ui.ListBox;
  11. import com.google.gwt.user.client.ui.Panel;
  12. import com.google.gwt.user.client.ui.Widget;
  13. import com.vaadin.terminal.gwt.client.UIDL;
  14. public class VTwinColSelect extends VOptionGroupBase {
  15. private static final String CLASSNAME = "i-select-twincol";
  16. private static final int VISIBLE_COUNT = 10;
  17. private static final int DEFAULT_COLUMN_COUNT = 10;
  18. private final ListBox options;
  19. private final ListBox selections;
  20. private final VButton add;
  21. private final VButton remove;
  22. private FlowPanel buttons;
  23. private Panel panel;
  24. private boolean widthSet = false;
  25. public VTwinColSelect() {
  26. super(CLASSNAME);
  27. options = new ListBox();
  28. options.addClickListener(this);
  29. selections = new ListBox();
  30. selections.addClickListener(this);
  31. options.setVisibleItemCount(VISIBLE_COUNT);
  32. selections.setVisibleItemCount(VISIBLE_COUNT);
  33. options.setStyleName(CLASSNAME + "-options");
  34. selections.setStyleName(CLASSNAME + "-selections");
  35. buttons = new FlowPanel();
  36. buttons.setStyleName(CLASSNAME + "-buttons");
  37. add = new VButton();
  38. add.setText(">>");
  39. add.addClickListener(this);
  40. remove = new VButton();
  41. remove.setText("<<");
  42. remove.addClickListener(this);
  43. panel = ((Panel) optionsContainer);
  44. panel.add(options);
  45. buttons.add(add);
  46. final HTML br = new HTML("<span/>");
  47. br.setStyleName(CLASSNAME + "-deco");
  48. buttons.add(br);
  49. buttons.add(remove);
  50. panel.add(buttons);
  51. panel.add(selections);
  52. }
  53. @Override
  54. protected void buildOptions(UIDL uidl) {
  55. final boolean enabled = !isDisabled() && !isReadonly();
  56. options.setMultipleSelect(isMultiselect());
  57. selections.setMultipleSelect(isMultiselect());
  58. options.setEnabled(enabled);
  59. selections.setEnabled(enabled);
  60. add.setEnabled(enabled);
  61. remove.setEnabled(enabled);
  62. options.clear();
  63. selections.clear();
  64. for (final Iterator i = uidl.getChildIterator(); i.hasNext();) {
  65. final UIDL optionUidl = (UIDL) i.next();
  66. if (optionUidl.hasAttribute("selected")) {
  67. selections.addItem(optionUidl.getStringAttribute("caption"),
  68. optionUidl.getStringAttribute("key"));
  69. } else {
  70. options.addItem(optionUidl.getStringAttribute("caption"),
  71. optionUidl.getStringAttribute("key"));
  72. }
  73. }
  74. int cols = -1;
  75. if (getColumns() > 0) {
  76. cols = getColumns();
  77. } else if (!widthSet) {
  78. cols = DEFAULT_COLUMN_COUNT;
  79. }
  80. if (cols >= 0) {
  81. options.setWidth(cols + "em");
  82. selections.setWidth(cols + "em");
  83. buttons.setWidth("3.5em");
  84. optionsContainer.setWidth((2 * cols + 4) + "em");
  85. }
  86. if (getRows() > 0) {
  87. options.setVisibleItemCount(getRows());
  88. selections.setVisibleItemCount(getRows());
  89. }
  90. }
  91. @Override
  92. protected Object[] getSelectedItems() {
  93. final Vector selectedItemKeys = new Vector();
  94. for (int i = 0; i < selections.getItemCount(); i++) {
  95. selectedItemKeys.add(selections.getValue(i));
  96. }
  97. return selectedItemKeys.toArray();
  98. }
  99. private boolean[] getItemsToAdd() {
  100. final boolean[] selectedIndexes = new boolean[options.getItemCount()];
  101. for (int i = 0; i < options.getItemCount(); i++) {
  102. if (options.isItemSelected(i)) {
  103. selectedIndexes[i] = true;
  104. } else {
  105. selectedIndexes[i] = false;
  106. }
  107. }
  108. return selectedIndexes;
  109. }
  110. private boolean[] getItemsToRemove() {
  111. final boolean[] selectedIndexes = new boolean[selections.getItemCount()];
  112. for (int i = 0; i < selections.getItemCount(); i++) {
  113. if (selections.isItemSelected(i)) {
  114. selectedIndexes[i] = true;
  115. } else {
  116. selectedIndexes[i] = false;
  117. }
  118. }
  119. return selectedIndexes;
  120. }
  121. @Override
  122. public void onClick(Widget sender) {
  123. super.onClick(sender);
  124. if (sender == add) {
  125. final boolean[] sel = getItemsToAdd();
  126. for (int i = 0; i < sel.length; i++) {
  127. if (sel[i]) {
  128. final int optionIndex = i
  129. - (sel.length - options.getItemCount());
  130. selectedKeys.add(options.getValue(optionIndex));
  131. // Move selection to another column
  132. final String text = options.getItemText(optionIndex);
  133. final String value = options.getValue(optionIndex);
  134. selections.addItem(text, value);
  135. selections.setItemSelected(selections.getItemCount() - 1,
  136. true);
  137. options.removeItem(optionIndex);
  138. }
  139. }
  140. client.updateVariable(id, "selected", selectedKeys.toArray(),
  141. isImmediate());
  142. } else if (sender == remove) {
  143. final boolean[] sel = getItemsToRemove();
  144. for (int i = 0; i < sel.length; i++) {
  145. if (sel[i]) {
  146. final int selectionIndex = i
  147. - (sel.length - selections.getItemCount());
  148. selectedKeys.remove(selections.getValue(selectionIndex));
  149. // Move selection to another column
  150. final String text = selections.getItemText(selectionIndex);
  151. final String value = selections.getValue(selectionIndex);
  152. options.addItem(text, value);
  153. options.setItemSelected(options.getItemCount() - 1, true);
  154. selections.removeItem(selectionIndex);
  155. }
  156. }
  157. client.updateVariable(id, "selected", selectedKeys.toArray(),
  158. isImmediate());
  159. } else if (sender == options) {
  160. // unselect all in other list, to avoid mistakes (i.e wrong button)
  161. final int c = selections.getItemCount();
  162. for (int i = 0; i < c; i++) {
  163. selections.setItemSelected(i, false);
  164. }
  165. } else if (sender == selections) {
  166. // unselect all in other list, to avoid mistakes (i.e wrong button)
  167. final int c = options.getItemCount();
  168. for (int i = 0; i < c; i++) {
  169. options.setItemSelected(i, false);
  170. }
  171. }
  172. }
  173. @Override
  174. public void setHeight(String height) {
  175. super.setHeight(height);
  176. if ("".equals(height)) {
  177. options.setHeight("");
  178. selections.setHeight("");
  179. } else {
  180. setFullHeightInternals();
  181. }
  182. }
  183. private void setFullHeightInternals() {
  184. options.setHeight("100%");
  185. selections.setHeight("100%");
  186. }
  187. @Override
  188. public void setWidth(String width) {
  189. super.setWidth(width);
  190. if (!"".equals(width) && width != null) {
  191. setRelativeInternalWidths();
  192. }
  193. }
  194. private void setRelativeInternalWidths() {
  195. DOM.setStyleAttribute(getElement(), "position", "relative");
  196. buttons.setWidth("15%");
  197. options.setWidth("42%");
  198. selections.setWidth("42%");
  199. widthSet = true;
  200. }
  201. @Override
  202. protected void setTabIndex(int tabIndex) {
  203. options.setTabIndex(tabIndex);
  204. selections.setTabIndex(tabIndex);
  205. add.setTabIndex(tabIndex);
  206. remove.setTabIndex(tabIndex);
  207. }
  208. public void focus() {
  209. options.setFocus(true);
  210. }
  211. }