From 60aa66a629081058f96e672633ded9cc73c292e2 Mon Sep 17 00:00:00 2001 From: Juho Nurminen Date: Thu, 20 Feb 2014 16:56:10 +0200 Subject: [PATCH] Made TabSheet tabs always become visible when focused (#12343) Change-Id: I8f840bf4e45e257454d5e16c7b43f63858fd15d8 --- .../src/com/vaadin/client/ui/VTabsheet.java | 31 +++++----- .../components/tabsheet/TabSheetFocusing.java | 56 +++++++++++++++++++ .../tabsheet/TabSheetFocusingTest.java | 44 +++++++++++++++ 3 files changed, 116 insertions(+), 15 deletions(-) create mode 100644 uitest/src/com/vaadin/tests/components/tabsheet/TabSheetFocusing.java create mode 100644 uitest/src/com/vaadin/tests/components/tabsheet/TabSheetFocusingTest.java diff --git a/client/src/com/vaadin/client/ui/VTabsheet.java b/client/src/com/vaadin/client/ui/VTabsheet.java index 7d87650e24..172a25e3f3 100644 --- a/client/src/com/vaadin/client/ui/VTabsheet.java +++ b/client/src/com/vaadin/client/ui/VTabsheet.java @@ -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 index 0000000000..b6b5431c1f --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/tabsheet/TabSheetFocusing.java @@ -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 index 0000000000..77ddc94567 --- /dev/null +++ b/uitest/src/com/vaadin/tests/components/tabsheet/TabSheetFocusingTest.java @@ -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 + + "']")); + } +} -- 2.39.5