You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by iv...@apache.org on 2008/06/18 06:01:32 UTC

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

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 {@link #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 {@link #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 {@link
-	 *            #setSelectedTab(int)}.
+	 *            index of the tab that should be activated when this link is clicked. See
+	 *            {@link #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();
+	}
+
 }