You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by sv...@apache.org on 2013/04/11 15:49:09 UTC
git commit: WICKET-4658 last visible tab's css
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 <sv...@apache.org>
Authored: Thu Apr 11 15:48:35 2013 +0200
Committer: svenmeier <sv...@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;
+ }
+ }
+}