Updated Branches: refs/heads/master 7536311b8 -> ef3adb122
WICKET-4658 last visible tab's css Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/ef3adb12 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/ef3adb12 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/ef3adb12 Branch: refs/heads/master Commit: ef3adb12297e23df32dfd708d250e26e827ebc08 Parents: 7536311 Author: svenmeier <svenme...@apache.org> Authored: Thu Apr 11 15:48:35 2013 +0200 Committer: svenmeier <svenme...@apache.org> Committed: Thu Apr 11 15:48:35 2013 +0200 ---------------------------------------------------------------------- .../extensions/markup/html/tabs/TabbedPanel.java | 124 ++++++++++----- .../markup/html/tabs/TabbedPanelTest$TestPage.html | 2 +- .../html/tabs/TabbedPanelTest$TestPanel.html | 2 +- .../html/tabs/TabbedPanelVisibilityTest.java | 76 +++++++++ .../html/tabs/TabbedPanelVisibilityTestPage.html | 22 +++ .../html/tabs/TabbedPanelVisibilityTestPage.java | 74 +++++++++ 6 files changed, 256 insertions(+), 44 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/ef3adb12/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanel.java ---------------------------------------------------------------------- diff --git a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanel.java b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanel.java index 10be55d..f70ef2b 100644 --- a/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanel.java +++ b/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanel.java @@ -84,7 +84,7 @@ public class TabbedPanel<T extends ITab> extends Panel /** the current tab */ private int currentTab = -1; - private transient Boolean[] tabsVisibilityCache; + private transient VisibilityCache visibilityCache; /** * Constructor @@ -204,9 +204,18 @@ public class TabbedPanel<T extends ITab> extends Panel private static final long serialVersionUID = 1L; @Override + protected void onConfigure() + { + super.onConfigure(); + + setVisible(getVisiblityCache().isVisible(tabIndex)); + } + + @Override protected void onComponentTag(final ComponentTag tag) { super.onComponentTag(tag); + String cssClass = tag.getAttribute("class"); if (cssClass == null) { @@ -218,18 +227,12 @@ public class TabbedPanel<T extends ITab> extends Panel { cssClass += ' ' + getSelectedTabCssClass(); } - if (getIndex() == getTabs().size() - 1) + if (getVisiblityCache().getLastVisible() == getIndex()) { cssClass += ' ' + getLastTabCssClass(); } tag.put("class", cssClass.trim()); } - - @Override - public boolean isVisible() - { - return getTabs().get(tabIndex).isVisible(); - } }; } @@ -238,13 +241,13 @@ public class TabbedPanel<T extends ITab> extends Panel { int index = getSelectedTab(); - if ((index == -1) || (isTabVisible(index) == false)) + if ((index == -1) || (getVisiblityCache().isVisible(index) == false)) { // find first visible tab index = -1; for (int i = 0; i < tabs.size(); i++) { - if (isTabVisible(i)) + if (getVisiblityCache().isVisible(i)) { index = i; break; @@ -253,9 +256,7 @@ public class TabbedPanel<T extends ITab> extends Panel if (index != -1) { - /* - * found a visible tab, so select it - */ + // found a visible tab, so select it setSelectedTab(index); } } @@ -401,7 +402,7 @@ public class TabbedPanel<T extends ITab> extends Panel final Component component; - if (currentTab == -1 || (tabs.size() == 0) || !isTabVisible(currentTab)) + if (currentTab == -1 || (tabs.size() == 0) || !getVisiblityCache().isVisible(currentTab)) { // no tabs or the current tab is not visible component = newPanel(); @@ -443,45 +444,84 @@ public class TabbedPanel<T extends ITab> extends Panel return (Integer)getDefaultModelObject(); } - /** - * - * @param tabIndex - * @return visible - */ - private boolean isTabVisible(final int tabIndex) + @Override + protected void onDetach() + { + visibilityCache = null; + + super.onDetach(); + } + + private VisibilityCache getVisiblityCache() { - if (tabsVisibilityCache == null) + if (visibilityCache == null) { - tabsVisibilityCache = new Boolean[tabs.size()]; + visibilityCache = new VisibilityCache(); } - if (tabsVisibilityCache.length < tabIndex + 1) + return visibilityCache; + } + + /** + * A cache for visibilities of {@link ITab}s. + */ + private class VisibilityCache + { + + /** + * Visibility for each tab. + */ + private Boolean[] visibilities; + + /** + * Last visible tab. + */ + private int lastVisible = -1; + + public VisibilityCache() { - Boolean[] resized = new Boolean[tabIndex + 1]; - System.arraycopy(tabsVisibilityCache, 0, resized, 0, tabsVisibilityCache.length); - tabsVisibilityCache = resized; + visibilities = new Boolean[tabs.size()]; } - if (tabsVisibilityCache.length > 0) + public int getLastVisible() { - Boolean visible = tabsVisibilityCache[tabIndex]; - if (visible == null) + if (lastVisible == -1) { - visible = tabs.get(tabIndex).isVisible(); - tabsVisibilityCache[tabIndex] = visible; + for (int t = 0; t < tabs.size(); t++) + { + if (isVisible(t)) + { + lastVisible = t; + } + } } - return visible; + + return lastVisible; } - else + + public boolean isVisible(int index) { - return false; - } - } + if (visibilities.length < index + 1) + { + Boolean[] resized = new Boolean[index + 1]; + System.arraycopy(visibilities, 0, resized, 0, visibilities.length); + visibilities = resized; + } - @Override - protected void onDetach() - { - tabsVisibilityCache = null; - super.onDetach(); + if (visibilities.length > 0) + { + Boolean visible = visibilities[index]; + if (visible == null) + { + visible = tabs.get(index).isVisible(); + visibilities[index] = visible; + } + return visible; + } + else + { + return false; + } + } } -} +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/wicket/blob/ef3adb12/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanelTest$TestPage.html ---------------------------------------------------------------------- diff --git a/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanelTest$TestPage.html b/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanelTest$TestPage.html index 6de956a..825af95 100644 --- a/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanelTest$TestPage.html +++ b/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanelTest$TestPage.html @@ -1,4 +1,4 @@ -<html> +<html xmlns:wicket> <body> <div wicket:id="tabpanel"></div> </body> http://git-wip-us.apache.org/repos/asf/wicket/blob/ef3adb12/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanelTest$TestPanel.html ---------------------------------------------------------------------- diff --git a/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanelTest$TestPanel.html b/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanelTest$TestPanel.html index f08475e..18cc6cc 100644 --- a/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanelTest$TestPanel.html +++ b/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanelTest$TestPanel.html @@ -1,3 +1,3 @@ -<wicket:panel> +<wicket:panel xmlns:wicket> <span wicket:id="label"></span> </wicket:panel> http://git-wip-us.apache.org/repos/asf/wicket/blob/ef3adb12/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanelVisibilityTest.java ---------------------------------------------------------------------- diff --git a/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanelVisibilityTest.java b/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanelVisibilityTest.java new file mode 100644 index 0000000..dca2a81 --- /dev/null +++ b/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanelVisibilityTest.java @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.wicket.extensions.markup.html.tabs; + +import java.util.List; + +import org.apache.wicket.WicketTestCase; +import org.apache.wicket.util.tester.TagTester; +import org.junit.Test; + +/** + * Test for visibility of {@link ITab}s in a {@link TabbedPanel}. + */ +public class TabbedPanelVisibilityTest extends WicketTestCase +{ + + /** + * WICKET-4658 + */ + @Test + public void firstSelected_2Visible() + { + final TabbedPanelVisibilityTestPage visibilityTestPage = new TabbedPanelVisibilityTestPage( + 2, 2); + tester.startPage(visibilityTestPage); + + final List<TagTester> tabsTags = tester.getTagsByWicketId("tabs"); + assertEquals("tab0 selected", tabsTags.get(0).getAttribute("class")); + assertEquals("tab1 last", tabsTags.get(1).getAttribute("class")); + } + + /** + * WICKET-4658 + */ + @Test + public void lastSelected_2Visible() + { + final TabbedPanelVisibilityTestPage visibilityTestPage = new TabbedPanelVisibilityTestPage( + 2, 2); + // selecting the last tab + visibilityTestPage.tabbedPanel.setSelectedTab(1); + tester.startPage(visibilityTestPage); + + final List<TagTester> tabsTags = tester.getTagsByWicketId("tabs"); + assertEquals("tab0", tabsTags.get(0).getAttribute("class")); + assertEquals("tab1 selected last", tabsTags.get(1).getAttribute("class")); + } + + /** + * WICKET-4658 + */ + @Test + public void firstSelected_1Visible() + { + final TabbedPanelVisibilityTestPage visibilityTestPage = new TabbedPanelVisibilityTestPage( + 2, 1); + tester.startPage(visibilityTestPage); + + final List<TagTester> tabsTags = tester.getTagsByWicketId("tabs"); + assertEquals("tab0 selected last", tabsTags.get(0).getAttribute("class")); + } +} \ No newline at end of file http://git-wip-us.apache.org/repos/asf/wicket/blob/ef3adb12/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanelVisibilityTestPage.html ---------------------------------------------------------------------- diff --git a/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanelVisibilityTestPage.html b/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanelVisibilityTestPage.html new file mode 100644 index 0000000..2cda362 --- /dev/null +++ b/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanelVisibilityTestPage.html @@ -0,0 +1,22 @@ +<!-- + Licensed to the Apache Software Foundation (ASF) under one or more + contributor license agreements. See the NOTICE file distributed with + this work for additional information regarding copyright ownership. + The ASF licenses this file to You 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. +--> +<html xmlns:wicket> + <head> + <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> + </head> + <body> + <div wicket:id="tabbedPanel">[TabbedPanel]</div> + </body> +</html> \ No newline at end of file http://git-wip-us.apache.org/repos/asf/wicket/blob/ef3adb12/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanelVisibilityTestPage.java ---------------------------------------------------------------------- diff --git a/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanelVisibilityTestPage.java b/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanelVisibilityTestPage.java new file mode 100644 index 0000000..c475956 --- /dev/null +++ b/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanelVisibilityTestPage.java @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You 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 org.apache.wicket.extensions.markup.html.tabs; + +import java.util.ArrayList; +import java.util.List; + +import org.apache.wicket.markup.html.WebMarkupContainer; +import org.apache.wicket.markup.html.WebPage; +import org.apache.wicket.markup.html.panel.EmptyPanel; +import org.apache.wicket.model.IModel; +import org.apache.wicket.model.Model; + +/** + */ +public class TabbedPanelVisibilityTestPage extends WebPage +{ + + final TabbedPanel tabbedPanel; + + public TabbedPanelVisibilityTestPage(int nbTabs, int nbTabsVisible) + { + List<ITab> tabs = new ArrayList<ITab>(nbTabs); + for (int i = 0; i < nbTabs; i++) + { + tabs.add(new DummyTab(i < nbTabsVisible)); + } + + tabbedPanel = new TabbedPanel("tabbedPanel", tabs); + add(tabbedPanel); + } + + public static final class DummyTab implements ITab + { + private boolean visible; + + public DummyTab(final boolean visible) + { + this.visible = visible; + } + + @Override + public IModel<String> getTitle() + { + return Model.of("Dummy"); + } + + @Override + public WebMarkupContainer getPanel(final String containerId) + { + return new EmptyPanel(containerId); + } + + @Override + public boolean isVisible() + { + return visible; + } + } +}