Author: ivaynberg
Date: Tue Jun 17 21:01:32 2008
New Revision: 669075

URL: http://svn.apache.org/viewvc?rev=669075&view=rev
Log:
improved itab.isvisible() support

Modified:
    
wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanel.java

Modified: 
wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanel.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanel.java?rev=669075&r1=669074&r2=669075&view=diff
==============================================================================
--- 
wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanel.java
 (original)
+++ 
wicket/trunk/wicket-extensions/src/main/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanel.java
 Tue Jun 17 21:01:32 2008
@@ -37,8 +37,8 @@
  * content panels inside the TabbedPanel panel.
  * 
  * <p>
- * <b>Note:</b> When the currently selected tab is replaced by changing the 
underlying list of
- * tabs, the change is not picked up unless a call is made to [EMAIL 
PROTECTED] #setSelectedTab(int)}.
+ * <b>Note:</b> When the currently selected tab is replaced by changing the 
underlying list of tabs,
+ * the change is not picked up unless a call is made to [EMAIL PROTECTED] 
#setSelectedTab(int)}.
  * <p>
  * 
  * Example:
@@ -96,6 +96,8 @@
 
        private final List<ITab> tabs;
 
+       private transient Boolean[] tabsVisibilityCache;
+
        /**
         * Constructor
         * 
@@ -199,7 +201,7 @@
                                }
                                tag.put("class", cssClass.trim());
                        }
-                       
+
                        @Override
                        public boolean isVisible()
                        {
@@ -214,25 +216,34 @@
        @Override
        protected void onBeforeRender()
        {
-               if (!hasBeenRendered() && getSelectedTab() == -1)
-        {
-            List<ITab> tabs = getTabs();
-            for (int i = 0; i < tabs.size(); ++i)
-            {
-                ITab tab = tabs.get(i);
-                if (tab.isVisible())
-                {
-                    setSelectedTab(i);
-                    break;
-                }
-            }
-            
-            if (tabs.size() == 0)
-            {
-               add(new 
WebMarkupContainer<Void>(TAB_PANEL_ID)).setVisible(false);
-            }
-        }
-        super.onBeforeRender();
+               if (getSelectedTab() == -1 || isTabVisible(getSelectedTab()) == 
false)
+               {
+                       // find first visible selected tab
+                       int selected = 0;
+                       for (int i = 0; i < tabs.size(); i++)
+                       {
+                               if (isTabVisible(i))
+                               {
+                                       selected = i;
+                                       break;
+                               }
+                       }
+
+                       if (selected == tabs.size())
+                       {
+                               /*
+                                * none of the tabs are selected...
+                                * 
+                                * we do not need to do anything special 
because the check in setSelectedTab() will
+                                * replace the current tab panel with an empty 
one
+                                */
+                               selected = 0;
+                       }
+
+                       setSelectedTab(selected);
+               }
+
+               super.onBeforeRender();
        }
 
        /**
@@ -302,8 +313,8 @@
         * @param linkId
         *            component id with which the link should be created
         * @param index
-        *            index of the tab that should be activated when this link 
is clicked. See [EMAIL PROTECTED]
-        *            #setSelectedTab(int)}.
+        *            index of the tab that should be activated when this link 
is clicked. See
+        *            [EMAIL PROTECTED] #setSelectedTab(int)}.
         * @param <S>
         * @return created link component
         */
@@ -330,29 +341,35 @@
         */
        public void setSelectedTab(int index)
        {
-               if (index < 0 || index >= tabs.size())
+               if (index < 0 || (index >= tabs.size() && index > 0))
                {
                        throw new IndexOutOfBoundsException();
                }
 
                setModelObject(new Integer(index));
 
-               ITab tab = tabs.get(index);
-
                final Component<?> component;
-               
-               if (tab.isVisible())            
-                       component = tab.getPanel(TAB_PANEL_ID);
-               else
-                       component = new WebMarkupContainer<Void>(TAB_PANEL_ID);
 
-               if (component == null)
+
+               if (tabs.size() == 0 || !isTabVisible(index))
                {
-                       throw new WicketRuntimeException("ITab.getPanel() 
returned null. TabbedPanel [" +
-                               getPath() + "] ITab index [" + index + "]");
+                       // no tabs or the currently selected tab is not visible
+                       component = new WebMarkupContainer<Void>(TAB_PANEL_ID);
+               }
+               else
+               {
+                       // show panel from selected tab
+                       ITab tab = tabs.get(index);
+                       component = tab.getPanel(TAB_PANEL_ID);
+                       if (component == null)
+                       {
+                               throw new 
WicketRuntimeException("ITab.getPanel() returned null. TabbedPanel [" +
+                                       getPath() + "] ITab index [" + index + 
"]");
 
+                       }
                }
 
+
                if (!component.getId().equals(TAB_PANEL_ID))
                {
                        throw new WicketRuntimeException(
@@ -362,15 +379,7 @@
                                        getPath() + "] ITab index [" + index + 
"]");
                }
 
-
-               if (get(TAB_PANEL_ID) == null)
-               {
-                       add(component);
-               }
-               else
-               {
-                       replace(component);
-               }
+               addOrReplace(component);
        }
 
        /**
@@ -381,4 +390,27 @@
                return (getModelObject()).intValue();
        }
 
+       private boolean isTabVisible(int tabIndex)
+       {
+               if (tabsVisibilityCache == null)
+               {
+                       tabsVisibilityCache = new Boolean[tabs.size()];
+               }
+
+               Boolean visible = tabsVisibilityCache[tabIndex];
+               if (visible == null)
+               {
+                       visible = tabs.get(tabIndex).isVisible();
+                       tabsVisibilityCache[tabIndex] = visible;
+               }
+               return visible;
+       }
+
+       @Override
+       protected void onDetach()
+       {
+               tabsVisibilityCache = null;
+               super.onDetach();
+       }
+
 }


Reply via email to