import java.util.Iterator;\r
\r
import com.google.gwt.event.dom.client.ClickEvent;\r
+import com.google.gwt.event.dom.client.KeyCodes;\r
+import com.google.gwt.event.dom.client.KeyDownEvent;\r
+import com.google.gwt.event.dom.client.KeyDownHandler;\r
+ import com.google.gwt.event.dom.client.MouseDownEvent;\r
+ import com.google.gwt.event.dom.client.MouseDownHandler;\r
import com.google.gwt.user.client.DOM;\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.vaadin.terminal.gwt.client.UIDL;\r
--\r
- public class VTwinColSelect extends VOptionGroupBase implements KeyDownHandler {\r
-public class VTwinColSelect extends VOptionGroupBase implements\r
- MouseDownHandler {\r
++
++public class VTwinColSelect extends VOptionGroupBase implements KeyDownHandler, MouseDownHandler {\r
\r
private static final String CLASSNAME = "v-select-twincol";\r
\r
buttons.add(remove);\r
panel.add(buttons);\r
panel.add(selections);\r
--\r
++
+ options.addKeyDownHandler(this);\r
- selections.addKeyDownHandler(this);\r
+ options.addMouseDownHandler(this);\r
++\r
+ selections.addMouseDownHandler(this);\r
++ selections.addKeyDownHandler(this);
}\r
\r
@Override\r
\r
public void focus() {\r
options.setFocus(true);\r
- }\r
++ }
+\r
+ /**\r
+ * Get the key that selects an item in the table. By default it is the Enter\r
+ * key but by overriding this you can change the key to whatever you want.\r
+ *\r
+ * @return\r
+ */\r
+ protected int getNavigationSelectKey() {\r
+ return KeyCodes.KEY_ENTER;\r
+ }\r
+\r
+ /*\r
+ * (non-Javadoc)\r
+ *\r
+ * @see\r
+ * com.google.gwt.event.dom.client.KeyDownHandler#onKeyDown(com.google.gwt\r
+ * .event.dom.client.KeyDownEvent)\r
+ */\r
+ public void onKeyDown(KeyDownEvent event) {\r
+ int keycode = event.getNativeKeyCode();\r
+\r
+ // Catch tab and move between select:s\r
+ if (keycode == KeyCodes.KEY_TAB && event.getSource() == options) {\r
+ // Prevent default behavior\r
+ event.preventDefault();\r
+\r
+ // Remove current selections\r
+ for (int i = 0; i < options.getItemCount(); i++) {\r
+ options.setItemSelected(i, false);\r
+ }\r
+\r
+ // Focus selections\r
+ selections.setFocus(true);\r
+ }\r
+\r
+ if (keycode == KeyCodes.KEY_TAB && event.isShiftKeyDown()\r
+ && event.getSource() == selections) {\r
+ // Prevent default behavior\r
+ event.preventDefault();\r
+\r
+ // Remove current selections\r
+ for (int i = 0; i < selections.getItemCount(); i++) {\r
+ selections.setItemSelected(i, false);\r
+ }\r
+\r
+ // Focus options\r
+ options.setFocus(true);\r
+ }\r
+\r
+ if (keycode == getNavigationSelectKey()) {\r
+ // Prevent default behavior\r
+ event.preventDefault();\r
+\r
+ // Decide which select the selection was made in\r
+ if (event.getSource() == options) {\r
+ // Prevents the selection to become a single selection when\r
+ // using Enter key\r
+ // as the selection key (default)\r
+ options.setFocus(false);\r
+\r
+ addItem();\r
+\r
+ } else if (event.getSource() == selections) {\r
+ // Prevents the selection to become a single selection when\r
+ // using Enter key\r
+ // as the selection key (default)\r
+ selections.setFocus(false);\r
+\r
+ removeItem();\r
+ }\r
+ }\r
+\r
}\r
\r
- }\r
+ /*\r
+ * (non-Javadoc)\r
+ *\r
+ * @see\r
+ * com.google.gwt.event.dom.client.MouseDownHandler#onMouseDown(com.google\r
+ * .gwt.event.dom.client.MouseDownEvent)\r
+ */\r
+ public void onMouseDown(MouseDownEvent event) {\r
+ // Ensure that items are deselected when selecting\r
+ // from a different source. See #3699 for details.\r
+ if (event.getSource() == options) {\r
+ for (int i = 0; i < selections.getItemCount(); i++) {\r
+ selections.setItemSelected(i, false);\r
+ }\r
+ } else if (event.getSource() == selections) {\r
+ for (int i = 0; i < options.getItemCount(); i++) {\r
+ options.setItemSelected(i, false);\r
+ }\r
+ }\r
+ \r
++ }
}\r