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