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.

VListSelect.java 4.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. /*
  2. @VaadinApache2LicenseForJavaFiles@
  3. */
  4. package com.vaadin.terminal.gwt.client.ui;
  5. import java.util.ArrayList;
  6. import java.util.Iterator;
  7. import com.google.gwt.event.dom.client.ChangeEvent;
  8. import com.google.gwt.user.client.Event;
  9. import com.google.gwt.user.client.ui.ListBox;
  10. import com.google.gwt.user.client.ui.Widget;
  11. import com.vaadin.terminal.gwt.client.ApplicationConnection;
  12. import com.vaadin.terminal.gwt.client.VPaintableWidget;
  13. import com.vaadin.terminal.gwt.client.UIDL;
  14. import com.vaadin.terminal.gwt.client.VTooltip;
  15. public class VListSelect extends VOptionGroupBase {
  16. public static final String CLASSNAME = "v-select";
  17. private static final int VISIBLE_COUNT = 10;
  18. protected TooltipListBox select;
  19. private int lastSelectedIndex = -1;
  20. public VListSelect() {
  21. super(new TooltipListBox(true), CLASSNAME);
  22. select = (TooltipListBox) optionsContainer;
  23. select.setSelect(this);
  24. select.addChangeHandler(this);
  25. select.addClickHandler(this);
  26. select.setStyleName(CLASSNAME + "-select");
  27. select.setVisibleItemCount(VISIBLE_COUNT);
  28. }
  29. @Override
  30. protected void buildOptions(UIDL uidl) {
  31. select.setClient(client);
  32. select.setMultipleSelect(isMultiselect());
  33. select.setEnabled(!isDisabled() && !isReadonly());
  34. select.clear();
  35. if (!isMultiselect() && isNullSelectionAllowed()
  36. && !isNullSelectionItemAvailable()) {
  37. // can't unselect last item in singleselect mode
  38. select.addItem("", (String) null);
  39. }
  40. for (final Iterator<?> i = uidl.getChildIterator(); i.hasNext();) {
  41. final UIDL optionUidl = (UIDL) i.next();
  42. select.addItem(optionUidl.getStringAttribute("caption"),
  43. optionUidl.getStringAttribute("key"));
  44. if (optionUidl.hasAttribute("selected")) {
  45. int itemIndex = select.getItemCount() - 1;
  46. select.setItemSelected(itemIndex, true);
  47. lastSelectedIndex = itemIndex;
  48. }
  49. }
  50. if (getRows() > 0) {
  51. select.setVisibleItemCount(getRows());
  52. }
  53. }
  54. @Override
  55. protected String[] getSelectedItems() {
  56. final ArrayList<String> selectedItemKeys = new ArrayList<String>();
  57. for (int i = 0; i < select.getItemCount(); i++) {
  58. if (select.isItemSelected(i)) {
  59. selectedItemKeys.add(select.getValue(i));
  60. }
  61. }
  62. return selectedItemKeys.toArray(new String[selectedItemKeys.size()]);
  63. }
  64. @Override
  65. public void onChange(ChangeEvent event) {
  66. final int si = select.getSelectedIndex();
  67. if (si == -1 && !isNullSelectionAllowed()) {
  68. select.setSelectedIndex(lastSelectedIndex);
  69. } else {
  70. lastSelectedIndex = si;
  71. if (isMultiselect()) {
  72. client.updateVariable(id, "selected", getSelectedItems(),
  73. isImmediate());
  74. } else {
  75. client.updateVariable(id, "selected", new String[] { ""
  76. + getSelectedItem() }, isImmediate());
  77. }
  78. }
  79. }
  80. @Override
  81. public void setHeight(String height) {
  82. select.setHeight(height);
  83. super.setHeight(height);
  84. }
  85. @Override
  86. public void setWidth(String width) {
  87. select.setWidth(width);
  88. super.setWidth(width);
  89. }
  90. @Override
  91. protected void setTabIndex(int tabIndex) {
  92. ((TooltipListBox) optionsContainer).setTabIndex(tabIndex);
  93. }
  94. public void focus() {
  95. select.setFocus(true);
  96. }
  97. public Widget getWidgetForPaintable() {
  98. return this;
  99. }
  100. }
  101. /**
  102. * Extended ListBox to listen tooltip events and forward them to generic
  103. * handler.
  104. */
  105. class TooltipListBox extends ListBox {
  106. private ApplicationConnection client;
  107. private VPaintableWidget pntbl;
  108. TooltipListBox(boolean isMultiselect) {
  109. super(isMultiselect);
  110. sinkEvents(VTooltip.TOOLTIP_EVENTS);
  111. }
  112. public void setClient(ApplicationConnection client) {
  113. this.client = client;
  114. }
  115. public void setSelect(VPaintableWidget s) {
  116. pntbl = s;
  117. }
  118. @Override
  119. public void onBrowserEvent(Event event) {
  120. super.onBrowserEvent(event);
  121. if (client != null) {
  122. client.handleTooltipEvent(event, pntbl);
  123. }
  124. }
  125. }