]> source.dussan.org Git - vaadin-framework.git/commitdiff
Fixed tab index handling in broken components (#10315) 27/327/3
authorArtur Signell <artur@vaadin.com>
Wed, 21 Nov 2012 18:33:05 +0000 (20:33 +0200)
committerVaadin Code Review <review@vaadin.com>
Thu, 22 Nov 2012 09:50:18 +0000 (09:50 +0000)
Change-Id: I27a1a3541886b126f0798f4d25ae6d22df81aa79

client/src/com/vaadin/client/ui/VDateFieldCalendar.java
client/src/com/vaadin/client/ui/combobox/ComboBoxConnector.java
client/src/com/vaadin/client/ui/datefield/InlineDateFieldConnector.java
client/src/com/vaadin/client/ui/datefield/TextualDateConnector.java
client/src/com/vaadin/client/ui/optiongroup/OptionGroupBaseConnector.java
client/src/com/vaadin/client/ui/table/TableConnector.java
client/src/com/vaadin/client/ui/tree/TreeConnector.java
uitest/src/com/vaadin/tests/fields/TabIndexes.html [new file with mode: 0644]
uitest/src/com/vaadin/tests/fields/TabIndexes.java [new file with mode: 0644]

index b7621f00f86b01d91ede8a1d89405f41fc995529..2bcff7f501f1f56583fed170b6efbbaa8870cebe 100644 (file)
@@ -118,4 +118,12 @@ public class VDateFieldCalendar extends VDateField {
             }
         }
     }
+
+    public void setTabIndex(int tabIndex) {
+        calendarPanel.getElement().setTabIndex(tabIndex);
+    }
+
+    public int getTabIndex() {
+        return calendarPanel.getElement().getTabIndex();
+    }
 }
index 5f9a3ded58651cfcab5f4cbce3da2e34b33fc1b9..8f3f7584584dcb3dc914505277f0966d6e6fc141 100644 (file)
@@ -66,9 +66,7 @@ public class ComboBoxConnector extends AbstractFieldConnector implements
         getWidget().setTextInputEnabled(!noTextInput);
 
         // not a FocusWidget -> needs own tabindex handling
-        if (uidl.hasAttribute("tabindex")) {
-            getWidget().tb.setTabIndex(uidl.getIntAttribute("tabindex"));
-        }
+        getWidget().tb.setTabIndex(getState().tabIndex);
 
         if (uidl.hasAttribute("filteringmode")) {
             getWidget().filteringmode = FilteringMode.valueOf(uidl
index ca3488af87bd94b30230161e0fe3f5c776483278..93e720e0cac9587a018fb4b2f24a4b8164f70d12 100644 (file)
@@ -20,6 +20,7 @@ import java.util.Date;
 import com.vaadin.client.ApplicationConnection;
 import com.vaadin.client.DateTimeService;
 import com.vaadin.client.UIDL;
+import com.vaadin.client.communication.StateChangeEvent;
 import com.vaadin.client.ui.VCalendarPanel.FocusChangeListener;
 import com.vaadin.client.ui.VCalendarPanel.TimeChangeListener;
 import com.vaadin.client.ui.VDateFieldCalendar;
@@ -109,6 +110,12 @@ public class InlineDateFieldConnector extends AbstractDateFieldConnector {
         getWidget().calendarPanel.renderCalendar();
     }
 
+    @Override
+    public void onStateChanged(StateChangeEvent stateChangeEvent) {
+        super.onStateChanged(stateChangeEvent);
+        getWidget().setTabIndex(getState().tabIndex);
+    }
+
     @Override
     public VDateFieldCalendar getWidget() {
         return (VDateFieldCalendar) super.getWidget();
index b5297f535af2401bcc1d3d8ed543694c5045bc7a..a592098180822d6fef94573aecc97308de6097aa 100644 (file)
@@ -45,9 +45,7 @@ public class TextualDateConnector extends AbstractDateFieldConnector {
 
         getWidget().buildDate();
         // not a FocusWidget -> needs own tabindex handling
-        if (uidl.hasAttribute("tabindex")) {
-            getWidget().text.setTabIndex(uidl.getIntAttribute("tabindex"));
-        }
+        getWidget().text.setTabIndex(getState().tabIndex);
 
         if (getWidget().isReadonly()) {
             getWidget().text.addStyleDependentName("readonly");
index 5d50b848338be99c40f233892a9071824c902b32..36b69922fc1d6d35fd3f0ff6e4b452364d576827 100644 (file)
@@ -94,9 +94,7 @@ public abstract class OptionGroupBaseConnector extends AbstractFieldConnector
             getWidget().container.remove(getWidget().newItemButton);
         }
 
-        getWidget().setTabIndex(
-                uidl.hasAttribute("tabindex") ? uidl
-                        .getIntAttribute("tabindex") : 0);
+        getWidget().setTabIndex(getState().tabIndex);
 
     }
 
index ef1b117bcb320413854fceb314650bc3129be0f0..aa505a91e904d9c3e01712abd6c9a788b64b8545 100644 (file)
@@ -43,8 +43,8 @@ import com.vaadin.shared.ui.table.TableConstants;
 import com.vaadin.shared.ui.table.TableState;
 
 @Connect(com.vaadin.ui.Table.class)
-public class TableConnector extends AbstractHasComponentsConnector
-        implements Paintable, DirectionalManagedLayout, PostLayoutListener {
+public class TableConnector extends AbstractHasComponentsConnector implements
+        Paintable, DirectionalManagedLayout, PostLayoutListener {
 
     @Override
     protected void init() {
@@ -276,8 +276,7 @@ public class TableConnector extends AbstractHasComponentsConnector
             getWidget().selectionRangeStart = getWidget().focusedRow;
         }
 
-        getWidget().tabIndex = uidl.hasAttribute("tabindex") ? uidl
-                .getIntAttribute("tabindex") : 0;
+        getWidget().tabIndex = getState().tabIndex;
         getWidget().setProperTabIndex();
 
         getWidget().resizeSortedColumnForSortIndicator();
index 0ddbc7e96c9e5a89d004f44fbf1f62c24a59fb41..5a64d7c077007588c848e46b73b4597b4db211c5 100644 (file)
@@ -26,6 +26,7 @@ import com.vaadin.client.Paintable;
 import com.vaadin.client.TooltipInfo;
 import com.vaadin.client.UIDL;
 import com.vaadin.client.Util;
+import com.vaadin.client.communication.StateChangeEvent;
 import com.vaadin.client.ui.AbstractComponentConnector;
 import com.vaadin.client.ui.VTree;
 import com.vaadin.client.ui.VTree.TreeNode;
@@ -145,6 +146,13 @@ public class TreeConnector extends AbstractComponentConnector implements
 
     }
 
+    @Override
+    public void onStateChanged(StateChangeEvent stateChangeEvent) {
+        super.onStateChanged(stateChangeEvent);
+        // VTree does not implement Focusable
+        getWidget().setTabIndex(getState().tabIndex);
+    }
+
     @Override
     public VTree getWidget() {
         return (VTree) super.getWidget();
diff --git a/uitest/src/com/vaadin/tests/fields/TabIndexes.html b/uitest/src/com/vaadin/tests/fields/TabIndexes.html
new file mode 100644 (file)
index 0000000..1f86562
--- /dev/null
@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+<head profile="http://selenium-ide.openqa.org/profiles/test-case">
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+<link rel="selenium.base" href="http://arturwin.office.itmill.com:8888/" />
+<title>New Test</title>
+</head>
+<body>
+<table cellpadding="1" cellspacing="1" border="1">
+<thead>
+<tr><td rowspan="1" colspan="3">New Test</td></tr>
+</thead><tbody>
+<tr>
+       <td>open</td>
+       <td>/run/com.vaadin.tests.fields.TabIndexes?restartApplication</td>
+       <td></td>
+</tr>
+<tr>
+       <td>assertAttribute</td>
+       <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-1/domChild[1]/domChild[1]@tabIndex</td>
+       <td>0</td>
+</tr>
+<tr>
+       <td>assertAttribute</td>
+       <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-2/domChild[0]@tabIndex</td>
+       <td>0</td>
+</tr>
+<tr>
+       <td>assertAttribute</td>
+       <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-3/domChild[0]@tabIndex</td>
+       <td>0</td>
+</tr>
+<tr>
+       <td>assertAttribute</td>
+       <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-4/domChild[0]@tabIndex</td>
+       <td>0</td>
+</tr>
+<tr>
+       <td>assertAttribute</td>
+       <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-5@tabIndex</td>
+       <td>0</td>
+</tr>
+<tr>
+       <td>assertAttribute</td>
+       <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-6/domChild[0]@tabIndex</td>
+       <td>0</td>
+</tr>
+<tr>
+       <td>assertAttribute</td>
+       <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-7/domChild[0]@tabIndex</td>
+       <td>0</td>
+</tr>
+<tr>
+       <td>click</td>
+       <td>vaadin=runcomvaadintestsfieldsTabIndexes::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[2]/VButton[0]/domChild[0]/domChild[0]</td>
+       <td></td>
+</tr>
+<tr>
+       <td>assertAttribute</td>
+       <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-1/domChild[1]/domChild[1]@tabIndex</td>
+       <td>1</td>
+</tr>
+<tr>
+       <td>assertAttribute</td>
+       <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-2/domChild[0]@tabIndex</td>
+       <td>1</td>
+</tr>
+<tr>
+       <td>assertAttribute</td>
+       <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-3/domChild[0]@tabIndex</td>
+       <td>1</td>
+</tr>
+<tr>
+       <td>assertAttribute</td>
+       <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-4/domChild[0]@tabIndex</td>
+       <td>1</td>
+</tr>
+<tr>
+       <td>assertAttribute</td>
+       <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-5@tabIndex</td>
+       <td>1</td>
+</tr>
+<tr>
+       <td>assertAttribute</td>
+       <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-6/domChild[0]@tabIndex</td>
+       <td>1</td>
+</tr>
+<tr>
+       <td>assertAttribute</td>
+       <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-7/domChild[0]@tabIndex</td>
+       <td>1</td>
+</tr>
+<tr>
+       <td>click</td>
+       <td>vaadin=runcomvaadintestsfieldsTabIndexes::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[3]/VButton[0]/domChild[0]/domChild[0]</td>
+       <td></td>
+</tr>
+<tr>
+       <td>assertAttribute</td>
+       <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-1/domChild[1]/domChild[1]@tabIndex</td>
+       <td>1</td>
+</tr>
+<tr>
+       <td>assertAttribute</td>
+       <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-2/domChild[0]@tabIndex</td>
+       <td>2</td>
+</tr>
+<tr>
+       <td>assertAttribute</td>
+       <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-3/domChild[0]@tabIndex</td>
+       <td>3</td>
+</tr>
+<tr>
+       <td>assertAttribute</td>
+       <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-4/domChild[0]@tabIndex</td>
+       <td>4</td>
+</tr>
+<tr>
+       <td>assertAttribute</td>
+       <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-5@tabIndex</td>
+       <td>5</td>
+</tr>
+<tr>
+       <td>assertAttribute</td>
+       <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-6/domChild[0]@tabIndex</td>
+       <td>6</td>
+</tr>
+<tr>
+       <td>assertAttribute</td>
+       <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-7/domChild[0]@tabIndex</td>
+       <td>7</td>
+</tr>
+<tr>
+       <td>click</td>
+       <td>vaadin=runcomvaadintestsfieldsTabIndexes::/VVerticalLayout[0]/VOrderedLayout$Slot[1]/VVerticalLayout[0]/VOrderedLayout$Slot[4]/VButton[0]/domChild[0]/domChild[0]</td>
+       <td></td>
+</tr>
+<tr>
+       <td>assertAttribute</td>
+       <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-1/domChild[1]/domChild[1]@tabIndex</td>
+       <td>7</td>
+</tr>
+<tr>
+       <td>assertAttribute</td>
+       <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-2/domChild[0]@tabIndex</td>
+       <td>6</td>
+</tr>
+<tr>
+       <td>assertAttribute</td>
+       <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-3/domChild[0]@tabIndex</td>
+       <td>5</td>
+</tr>
+<tr>
+       <td>assertAttribute</td>
+       <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-4/domChild[0]@tabIndex</td>
+       <td>4</td>
+</tr>
+<tr>
+       <td>assertAttribute</td>
+       <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-5@tabIndex</td>
+       <td>3</td>
+</tr>
+<tr>
+       <td>assertAttribute</td>
+       <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-6/domChild[0]@tabIndex</td>
+       <td>2</td>
+</tr>
+<tr>
+       <td>assertAttribute</td>
+       <td>vaadin=runcomvaadintestsfieldsTabIndexes::PID_Sfield-7/domChild[0]@tabIndex</td>
+       <td>1</td>
+</tr>
+</tbody></table>
+</body>
+</html>
diff --git a/uitest/src/com/vaadin/tests/fields/TabIndexes.java b/uitest/src/com/vaadin/tests/fields/TabIndexes.java
new file mode 100644 (file)
index 0000000..c88bb97
--- /dev/null
@@ -0,0 +1,159 @@
+package com.vaadin.tests.fields;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.tests.util.Log;
+import com.vaadin.ui.AbstractField;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Button.ClickListener;
+import com.vaadin.ui.CheckBox;
+import com.vaadin.ui.ComboBox;
+import com.vaadin.ui.Field;
+import com.vaadin.ui.GridLayout;
+import com.vaadin.ui.HorizontalLayout;
+import com.vaadin.ui.InlineDateField;
+import com.vaadin.ui.ListSelect;
+import com.vaadin.ui.NativeSelect;
+import com.vaadin.ui.OptionGroup;
+import com.vaadin.ui.PasswordField;
+import com.vaadin.ui.PopupDateField;
+import com.vaadin.ui.RichTextArea;
+import com.vaadin.ui.Table;
+import com.vaadin.ui.TextArea;
+import com.vaadin.ui.TextField;
+import com.vaadin.ui.Tree;
+import com.vaadin.ui.TreeTable;
+import com.vaadin.ui.TwinColSelect;
+
+public class TabIndexes extends AbstractTestUI {
+
+    private List<AbstractField> fields;
+    private Log log = new Log(5);
+
+    @Override
+    protected void setup(VaadinRequest request) {
+        addComponent(log);
+        HorizontalLayout buttonLayout = new HorizontalLayout();
+        addComponent(buttonLayout);
+        Button clearTabIndexes = new Button("Set all tab indexes to 0");
+        clearTabIndexes.addClickListener(new ClickListener() {
+
+            @Override
+            public void buttonClick(ClickEvent event) {
+                log.log("Setting tab indexes to 0");
+                for (AbstractField f : fields) {
+                    f.setTabIndex(0);
+                }
+                updateCaptions();
+            }
+        });
+        Button setTabIndexesToOne = new Button("Set all tab indexes to 1");
+        setTabIndexesToOne.addClickListener(new ClickListener() {
+
+            @Override
+            public void buttonClick(ClickEvent event) {
+                log.log("Setting tab indexes to 1");
+                for (AbstractField f : fields) {
+                    f.setTabIndex(1);
+                }
+                updateCaptions();
+            }
+        });
+        Button setTabIndexesInOrder = new Button("Set tab indexes to 1..N");
+        setTabIndexesInOrder.addClickListener(new ClickListener() {
+
+            @Override
+            public void buttonClick(ClickEvent event) {
+                int tabIndex = 1;
+                log.log("Setting tab indexes to 1..N");
+                for (AbstractField f : fields) {
+                    f.setTabIndex(tabIndex++);
+                }
+                updateCaptions();
+            }
+        });
+        Button setTabIndexesInReverseOrder = new Button(
+                "Set tab indexes to N..1");
+        setTabIndexesInReverseOrder.addClickListener(new ClickListener() {
+
+            @Override
+            public void buttonClick(ClickEvent event) {
+                int tabIndex = fields.size();
+                log.log("Setting tab indexes to N..1");
+                for (AbstractField f : fields) {
+                    f.setTabIndex(tabIndex--);
+                }
+                updateCaptions();
+            }
+        });
+        fields = new ArrayList<AbstractField>();
+        Table t = new Table();
+        t.setSelectable(true);
+        t.addContainerProperty("foo", String.class, "bar");
+        t.addItem();
+        fields.add(t);
+        fields.add(new ComboBox());
+        fields.add(new NativeSelect());
+        fields.add(new ListSelect());
+        fields.add(new TextField());
+        fields.add(new PopupDateField());
+        fields.add(new InlineDateField());
+        OptionGroup og = new OptionGroup();
+        og.addItem("Item 1");
+        og.addItem("Item 2");
+        fields.add(og);
+        TreeTable tt = new TreeTable();
+        tt.setSelectable(true);
+        tt.addContainerProperty("foo", String.class, "bar");
+        tt.addItem();
+
+        fields.add(tt);
+        Tree tree = new Tree();
+        tree.addItem("Item 1");
+        fields.add(tree);
+        fields.add(new TwinColSelect());
+        fields.add(new PasswordField());
+        fields.add(new TextField());
+        fields.add(new TextArea());
+        fields.add(new RichTextArea());
+        fields.add(new CheckBox());
+        // fields.add(new Slider());
+
+        clearTabIndexes.click();
+
+        buttonLayout.addComponents(clearTabIndexes, setTabIndexesToOne,
+                setTabIndexesInOrder, setTabIndexesInReverseOrder);
+
+        int fieldId = 1;
+        GridLayout gl = new GridLayout(4, 4);
+        for (Field f : fields) {
+            f.setId("field-" + fieldId++);
+            gl.addComponent(f);
+        }
+        addComponent(gl);
+
+    }
+
+    protected void updateCaptions() {
+        for (Field f : fields) {
+            f.setCaption(f.getClass().getSimpleName() + " Tab index: "
+                    + f.getTabIndex());
+        }
+    }
+
+    @Override
+    protected Integer getTicketNumber() {
+        return 10315;
+    }
+
+    @Override
+    protected String getTestDescription() {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+}