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.0KB

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