]> source.dussan.org Git - vaadin-framework.git/commitdiff
Made TabSheet tabs always become visible when focused (#12343)
authorJuho Nurminen <juho@vaadin.com>
Thu, 20 Feb 2014 14:56:10 +0000 (16:56 +0200)
committerJuho Nurminen <juho@vaadin.com>
Wed, 19 Mar 2014 14:39:17 +0000 (16:39 +0200)
Change-Id: I8f840bf4e45e257454d5e16c7b43f63858fd15d8

client/src/com/vaadin/client/ui/VTabsheet.java
uitest/src/com/vaadin/tests/components/tabsheet/TabSheetFocusing.java [new file with mode: 0644]
uitest/src/com/vaadin/tests/components/tabsheet/TabSheetFocusingTest.java [new file with mode: 0644]

index 7d87650e24b1bd0482b11dc95ccf62a4cb0d0c4e..172a25e3f3349642c28d520cd410d4d52d08e5f5 100644 (file)
@@ -243,6 +243,7 @@ public class VTabsheet extends VTabsheetBase implements Focusable,
         }
 
         public void focus() {
+            getTabsheet().scrollIntoView(this);
             focusImpl.focus(td);
         }
 
@@ -1160,13 +1161,6 @@ public class VTabsheet extends VTabsheetBase implements Focusable,
         } while (newTabIndex >= 0 && !newTab.isSelectable());
 
         if (newTabIndex >= 0) {
-            if (isScrolledTabs()) {
-                // Scroll until the new active tab is visible
-                while (!newTab.isVisible()) {
-                    scrollerIndex = tb.scrollLeft(scrollerIndex);
-                }
-                updateTabScroller();
-            }
             onTabSelected(newTabIndex);
             activeTabIndex = newTabIndex;
         }
@@ -1182,17 +1176,24 @@ public class VTabsheet extends VTabsheetBase implements Focusable,
         } while (newTabIndex < getTabCount() && !newTab.isSelectable());
 
         if (newTabIndex < getTabCount()) {
-            if (isClippedTabs()) {
-                // Scroll until the new active tab is completely visible
-                int newScrollerIndex = scrollerIndex;
-                while (isClipped(newTab) && newScrollerIndex != -1) {
-                    newScrollerIndex = tb.scrollRight(newScrollerIndex);
+            onTabSelected(newTabIndex);
+            activeTabIndex = newTabIndex;
+        }
+    }
+
+    private void scrollIntoView(Tab tab) {
+        if (!tab.isHiddenOnServer()) {
+            if (isClipped(tab)) {
+                while (isClipped(tab) && scrollerIndex != -1) {
+                    scrollerIndex = tb.scrollRight(scrollerIndex);
+                }
+                updateTabScroller();
+            } else if (!tab.isVisible()) {
+                while (!tab.isVisible()) {
+                    scrollerIndex = tb.scrollLeft(scrollerIndex);
                 }
-                scrollerIndex = newScrollerIndex;
                 updateTabScroller();
             }
-            onTabSelected(newTabIndex);
-            activeTabIndex = newTabIndex;
         }
     }
 }
diff --git a/uitest/src/com/vaadin/tests/components/tabsheet/TabSheetFocusing.java b/uitest/src/com/vaadin/tests/components/tabsheet/TabSheetFocusing.java
new file mode 100644 (file)
index 0000000..b6b5431
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.tabsheet;
+
+import com.vaadin.server.VaadinRequest;
+import com.vaadin.tests.components.AbstractTestUI;
+import com.vaadin.ui.Button;
+import com.vaadin.ui.Button.ClickEvent;
+import com.vaadin.ui.Button.ClickListener;
+import com.vaadin.ui.TabSheet;
+import com.vaadin.ui.TabSheet.Tab;
+
+public class TabSheetFocusing extends AbstractTestUI {
+
+    @Override
+    protected void setup(VaadinRequest request) {
+        final TabSheet ts = new TabSheet();
+        ts.setWidth("400px");
+        ts.setHeight("200px");
+        addComponent(ts);
+        addComponent(new Button("Add tab", new ClickListener() {
+            int i = 0;
+
+            @Override
+            public void buttonClick(ClickEvent event) {
+                Tab t = ts.addTab(new Button("Tab " + ++i));
+                ts.setSelectedTab(t);
+                ts.focus();
+            }
+        }));
+    }
+
+    @Override
+    protected String getTestDescription() {
+        return "The tab scroller should stay in place when tabs are focused using server-side calls.";
+    }
+
+    @Override
+    protected Integer getTicketNumber() {
+        return 12343;
+    }
+
+}
diff --git a/uitest/src/com/vaadin/tests/components/tabsheet/TabSheetFocusingTest.java b/uitest/src/com/vaadin/tests/components/tabsheet/TabSheetFocusingTest.java
new file mode 100644 (file)
index 0000000..77ddc94
--- /dev/null
@@ -0,0 +1,44 @@
+/*
+ * Copyright 2000-2013 Vaadin Ltd.
+ * 
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ * 
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+package com.vaadin.tests.components.tabsheet;
+
+import java.io.IOException;
+
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebElement;
+
+import com.vaadin.tests.tb3.MultiBrowserTest;
+
+public class TabSheetFocusingTest extends MultiBrowserTest {
+
+    @Test
+    public void addAndFocusTabs() throws IOException {
+        openTestURL();
+        WebElement addButton = getButton("Add tab");
+        for (int i = 1; i <= 15; i++) {
+            addButton.click();
+            getButton("Tab " + i);
+        }
+        compareScreen("tabsAdded");
+    }
+
+    private WebElement getButton(String caption) {
+        return driver.findElement(By
+                .xpath("//span[@class='v-button-caption'][text()='" + caption
+                        + "']"));
+    }
+}