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 2012/06/28 18:57:23 UTC

git commit: WICKET-4593 reverted changes which lead to ITab#getPanel() created multiple times

Updated Branches:
  refs/heads/master ee6a79871 -> f4fca19c0


WICKET-4593 reverted changes which lead to ITab#getPanel() created multiple times


Project: http://git-wip-us.apache.org/repos/asf/wicket/repo
Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/f4fca19c
Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/f4fca19c
Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/f4fca19c

Branch: refs/heads/master
Commit: f4fca19c0783381a058910e91cd573aae094217d
Parents: ee6a798
Author: svenmeier <sv...@apache.org>
Authored: Thu Jun 28 18:56:41 2012 +0200
Committer: svenmeier <sv...@apache.org>
Committed: Thu Jun 28 18:56:41 2012 +0200

----------------------------------------------------------------------
 .../extensions/markup/html/tabs/TabbedPanel.java   |  124 +++------------
 .../markup/html/tabs/TabbedPanelTest.java          |   12 +-
 2 files changed, 32 insertions(+), 104 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/wicket/blob/f4fca19c/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 fa8ac71..8fa9d50 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
@@ -37,6 +37,9 @@ import org.apache.wicket.util.lang.Args;
  * TabbedPanel component represets a panel with tabs that are used to switch between different
  * 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)}.
+ * <p>
  * Example:
  * 
  * <pre>
@@ -90,22 +93,7 @@ public class TabbedPanel<T extends ITab> extends Panel
 	 */
 	public TabbedPanel(final String id, final List<T> tabs)
 	{
-		this(id, tabs, null);
-	}
-
-	/**
-	 * Constructor
-	 * 
-	 * @param id
-	 *            component id
-	 * @param tabs
-	 *            list of ITab objects used to represent tabs
-	 * @param model
-	 *            model holding the selected tab index OR {@code -1}
-	 */
-	public TabbedPanel(final String id, final List<T> tabs, IModel<Integer> model)
-	{
-		super(id, model);
+		super(id, new Model<Integer>(-1));
 
 		this.tabs = Args.notNull(tabs, "tabs");
 
@@ -149,61 +137,6 @@ public class TabbedPanel<T extends ITab> extends Panel
 	}
 
 	/**
-	 * Get the model.
-	 * 
-	 * @return model
-	 */
-	@SuppressWarnings("unchecked")
-	public final IModel<Integer> getModel()
-	{
-		return (IModel<Integer>)getDefaultModel();
-	}
-
-	/**
-	 * Get the model object.
-	 * 
-	 * @return model object
-	 */
-	public final Integer getModelObject()
-	{
-		return getModel().getObject();
-	}
-
-	/**
-	 * Set the model.
-	 * 
-	 * @param model
-	 */
-	public final void setModel(IModel<Integer> model)
-	{
-		setDefaultModel(model);
-	}
-
-	/**
-	 * Set the model object.
-	 * 
-	 * @param object
-	 *            model object
-	 */
-	public final void setModelObject(Integer object)
-	{
-		setDefaultModelObject(object);
-	}
-
-	@Override
-	protected IModel<?> initModel()
-	{
-		IModel<?> model = super.initModel();
-
-		if (model == null)
-		{
-			model = new Model<Integer>(new Integer(-1));
-		}
-
-		return model;
-	}
-
-	/**
 	 * Generates the container for all tabs. The default container automatically adds the css
 	 * <code>class</code> attribute based on the return value of {@link #getTabContainerCssClass()}
 	 * 
@@ -274,36 +207,37 @@ public class TabbedPanel<T extends ITab> extends Panel
 	@Override
 	protected void onBeforeRender()
 	{
-		int index = getSelectedTab();
-
-		if (index == -1 || isTabVisible(index) == false)
+		if (tabs.size() == 0)
+		{
+			// force an empty container to be created every time if we have no tabs
+			setSelectedTab(0);
+		}
+		else if ((getSelectedTab() == -1) || (isTabVisible(getSelectedTab()) == false))
 		{
 			// find first visible selected tab
-			index = 0;
+			int selected = 0;
 			for (int i = 0; i < tabs.size(); i++)
 			{
 				if (isTabVisible(i))
 				{
-					index = i;
+					selected = i;
 					break;
 				}
 			}
 
-			if (index == tabs.size())
+			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
 				 */
-				index = -1;
-			}
-			else
-			{
-				setModelObject(index);
+				selected = 0;
 			}
-		}
 
-		// updating the tab will do no harm if the index hasn't changed
-		updateTab(index);
+			setSelectedTab(selected);
+		}
 
 		super.onBeforeRender();
 	}
@@ -397,25 +331,18 @@ public class TabbedPanel<T extends ITab> extends Panel
 	 *            index of the tab to select
 	 * @return this for chaining
 	 */
-	public TabbedPanel<T> setSelectedTab(int index)
+	public TabbedPanel setSelectedTab(final int index)
 	{
-		if (index < 0 || index >= tabs.size())
+		if ((index < 0) || ((index >= tabs.size()) && (index > 0)))
 		{
 			throw new IndexOutOfBoundsException();
 		}
 
-		setModelObject(index);
-
-		updateTab(index);
+		setDefaultModelObject(index);
 
-		return this;
-	}
-
-	private void updateTab(int index)
-	{
 		final Component component;
 
-		if (index == -1 || !isTabVisible(index))
+		if ((tabs.size() == 0) || !isTabVisible(index))
 		{
 			// no tabs or the currently selected tab is not visible
 			component = new WebMarkupContainer(TAB_PANEL_ID);
@@ -423,13 +350,12 @@ public class TabbedPanel<T extends ITab> extends Panel
 		else
 		{
 			// show panel from selected tab
-			ITab tab = tabs.get(index);
+			T 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 + "]");
-
 			}
 		}
 
@@ -443,6 +369,8 @@ public class TabbedPanel<T extends ITab> extends Panel
 		}
 
 		addOrReplace(component);
+
+		return this;
 	}
 
 	/**

http://git-wip-us.apache.org/repos/asf/wicket/blob/f4fca19c/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanelTest.java
----------------------------------------------------------------------
diff --git a/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanelTest.java b/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanelTest.java
index 9acbd13..a220375 100644
--- a/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanelTest.java
+++ b/wicket-extensions/src/test/java/org/apache/wicket/extensions/markup/html/tabs/TabbedPanelTest.java
@@ -90,7 +90,7 @@ public class TabbedPanelTest extends WicketTestCase
 		tester.assertContainsNot("<span wicket:id=\"label\">default 2</span>");
 		tester.assertContains("<!-- no panel -->");
 
-		assertEquals(Integer.valueOf(-1), page.tabbedPanel.getModelObject());
+		assertEquals(Integer.valueOf(0), page.tabbedPanel.getDefaultModelObject());
 	}
 
 	@Test
@@ -101,12 +101,12 @@ public class TabbedPanelTest extends WicketTestCase
 		tester.assertContains("<span wicket:id=\"label\">default 1</span>");
 		tester.assertContains("<span wicket:id=\"title\">default 2</span></a>");
 
-		assertEquals(Integer.valueOf(0), page.tabbedPanel.getModelObject());
+		assertEquals(Integer.valueOf(0), page.tabbedPanel.getDefaultModelObject());
 
 		tester.clickLink("tabpanel:tabs-container:tabs:1:link");
 		tester.assertContains("<span wicket:id=\"label\">default 2</span>");
 
-		assertEquals(Integer.valueOf(1), page.tabbedPanel.getModelObject());
+		assertEquals(Integer.valueOf(1), page.tabbedPanel.getDefaultModelObject());
 	}
 
 	@Test
@@ -125,20 +125,20 @@ public class TabbedPanelTest extends WicketTestCase
 		tester.assertContainsNot("<span wicket:id=\"title\">added 1</span></a>");
 		tester.assertContainsNot("<span wicket:id=\"label\">added 1</span>");
 
-		assertEquals(Integer.valueOf(0), page.tabbedPanel.getModelObject());
+		assertEquals(Integer.valueOf(0), page.tabbedPanel.getDefaultModelObject());
 
 		// now its title is visible, but the contents not
 		tester.clickLink("tabpanel:tabs-container:tabs:1:link");
 		tester.assertContains("<span wicket:id=\"title\">added 1</span></a>");
 		tester.assertContainsNot("<span wicket:id=\"label\">added 1</span>");
 
-		assertEquals(Integer.valueOf(1), page.tabbedPanel.getModelObject());
+		assertEquals(Integer.valueOf(1), page.tabbedPanel.getDefaultModelObject());
 
 		// now the entire panel should be there
 		tester.clickLink("tabpanel:tabs-container:tabs:2:link");
 		tester.assertContains("<span wicket:id=\"title\">added 1</span></a>");
 		tester.assertContains("<span wicket:id=\"label\">added 1</span>");
 
-		assertEquals(Integer.valueOf(2), page.tabbedPanel.getModelObject());
+		assertEquals(Integer.valueOf(2), page.tabbedPanel.getDefaultModelObject());
 	}
 }