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;
+               }
+       }
+}

Reply via email to