You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by eh...@apache.org on 2007/09/22 03:20:50 UTC

svn commit: r578344 - in /wicket/trunk/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/breadcrumb: BreadCrumbBar.java DefaultBreadCrumbsModel.java panel/BreadCrumbPanel.java panel/BreadCrumbParticipantDelegate.java

Author: ehillenius
Date: Fri Sep 21 18:20:49 2007
New Revision: 578344

URL: http://svn.apache.org/viewvc?rev=578344&view=rev
Log:
added a little bit more indirection to make default implementations more accesible.

Added:
    wicket/trunk/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/breadcrumb/DefaultBreadCrumbsModel.java
    wicket/trunk/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/breadcrumb/panel/BreadCrumbParticipantDelegate.java
Modified:
    wicket/trunk/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/breadcrumb/BreadCrumbBar.java
    wicket/trunk/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/breadcrumb/panel/BreadCrumbPanel.java

Modified: wicket/trunk/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/breadcrumb/BreadCrumbBar.java
URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/breadcrumb/BreadCrumbBar.java?rev=578344&r1=578343&r2=578344&view=diff
==============================================================================
--- wicket/trunk/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/breadcrumb/BreadCrumbBar.java (original)
+++ wicket/trunk/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/breadcrumb/BreadCrumbBar.java Fri Sep 21 18:20:49 2007
@@ -38,10 +38,13 @@
  * first / second / third
  * </pre>
  * 
- * This component also functions as a implementation of
- * {@link IBreadCrumbModel bread crumb model}. This component holds the state
- * as well as doing the rendering. Override and provide your own markup file if
- * you want to work with other elements, e.g. uls instead of spans.
+ * <p>
+ * Delegates how the bread crumb model works to {@link DefaultBreadCrumbsModel}.
+ * </p>
+ * <p>
+ * Override and provide your own markup file if you want to work with other
+ * elements, e.g. uls instead of spans.
+ * </p>
  * 
  * @author Eelco Hillenius
  */
@@ -184,14 +187,7 @@
 
 	private static final long serialVersionUID = 1L;
 
-	/** The currently active participant, if any (possibly null). */
-	private IBreadCrumbParticipant activeParticipant = null;
-
-	/** Holds the current list of crumbs. */
-	private List crumbs = new ArrayList();
-
-	/** listeners utility. */
-	private final BreadCrumbModelListenerSupport listenerSupport = new BreadCrumbModelListenerSupport();
+	private final IBreadCrumbModel decorated;
 
 	/**
 	 * Construct.
@@ -202,25 +198,27 @@
 	public BreadCrumbBar(String id)
 	{
 		super(id);
+		this.decorated = new DefaultBreadCrumbsModel();
 		BreadCrumbsListView breadCrumbsListView = new BreadCrumbsListView("crumbs");
 		addListener(breadCrumbsListView);
 		add(breadCrumbsListView);
 	}
 
+
 	/**
 	 * @see org.apache.wicket.extensions.breadcrumb.IBreadCrumbModel#addListener(org.apache.wicket.extensions.breadcrumb.IBreadCrumbModelListener)
 	 */
-	public final void addListener(IBreadCrumbModelListener listener)
+	public void addListener(IBreadCrumbModelListener listener)
 	{
-		this.listenerSupport.addListener(listener);
+		decorated.addListener(listener);
 	}
 
 	/**
 	 * @see org.apache.wicket.extensions.breadcrumb.IBreadCrumbModel#allBreadCrumbParticipants()
 	 */
-	public final List allBreadCrumbParticipants()
+	public List allBreadCrumbParticipants()
 	{
-		return crumbs;
+		return decorated.allBreadCrumbParticipants();
 	}
 
 	/**
@@ -228,85 +226,23 @@
 	 */
 	public IBreadCrumbParticipant getActive()
 	{
-		return activeParticipant;
+		return decorated.getActive();
 	}
 
 	/**
 	 * @see org.apache.wicket.extensions.breadcrumb.IBreadCrumbModel#removeListener(org.apache.wicket.extensions.breadcrumb.IBreadCrumbModelListener)
 	 */
-	public final void removeListener(IBreadCrumbModelListener listener)
+	public void removeListener(IBreadCrumbModelListener listener)
 	{
-		this.listenerSupport.removeListener(listener);
+		decorated.removeListener(listener);
 	}
 
 	/**
 	 * @see org.apache.wicket.extensions.breadcrumb.IBreadCrumbModel#setActive(org.apache.wicket.extensions.breadcrumb.IBreadCrumbParticipant)
 	 */
-	public final void setActive(final IBreadCrumbParticipant breadCrumbParticipant)
-	{
-		// see if the bread crumb was already added, and if so,
-		// clean up the stack after (on top of) this bred crumb
-		// and notify listeners of the removal
-		int len = crumbs.size() - 1;
-		int i = len;
-		while (i > -1)
-		{
-			IBreadCrumbParticipant temp = (IBreadCrumbParticipant)crumbs.get(i);
-
-			// if we found the bread crumb
-			if (breadCrumbParticipant.equals(temp))
-			{
-				// remove the bread crumbs after this one
-				int j = len;
-				while (j > i)
-				{
-					// remove and fire event
-					IBreadCrumbParticipant removed = (IBreadCrumbParticipant)crumbs.remove(j--);
-					listenerSupport.fireBreadCrumbRemoved(removed);
-				}
-
-				// activate the bread crumb participant
-				activate(breadCrumbParticipant);
-
-				// we're done; the provided bread crumb is on top
-				// and the content is replaced, so just return this function
-				return;
-			}
-
-			i--;
-		}
-
-		// arriving here means we weren't able to find the bread crumb
-		// add the new crumb
-		crumbs.add(breadCrumbParticipant);
-
-		// and notify listeners
-		listenerSupport.fireBreadCrumbAdded(breadCrumbParticipant);
-
-		// activate the bread crumb participant
-		activate(breadCrumbParticipant);
-	}
-
-	/**
-	 * Activates the bread crumb participant.
-	 * 
-	 * @param breadCrumbParticipant
-	 *            The participant to activate
-	 */
-	protected final void activate(final IBreadCrumbParticipant breadCrumbParticipant)
+	public void setActive(IBreadCrumbParticipant breadCrumbParticipant)
 	{
-		// get old value
-		IBreadCrumbParticipant previousParticipant = this.activeParticipant;
-
-		// and set the provided participant as the active one
-		this.activeParticipant = breadCrumbParticipant;
-
-		// fire bread crumb activated event
-		listenerSupport.fireBreadCrumbActivated(previousParticipant, breadCrumbParticipant);
-
-		// signal the bread crumb participant that it is selected as the
-		// currently active one
-		breadCrumbParticipant.onActivate(previousParticipant);
+		decorated.setActive(breadCrumbParticipant);
 	}
 
 	/**
@@ -350,7 +286,7 @@
 	protected void onDetach()
 	{
 		super.onDetach();
-		for (Iterator i = crumbs.iterator(); i.hasNext();)
+		for (Iterator i = decorated.allBreadCrumbParticipants().iterator(); i.hasNext();)
 		{
 			IBreadCrumbParticipant crumb = (IBreadCrumbParticipant)i.next();
 			if (crumb instanceof Component)

Added: wicket/trunk/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/breadcrumb/DefaultBreadCrumbsModel.java
URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/breadcrumb/DefaultBreadCrumbsModel.java?rev=578344&view=auto
==============================================================================
--- wicket/trunk/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/breadcrumb/DefaultBreadCrumbsModel.java (added)
+++ wicket/trunk/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/breadcrumb/DefaultBreadCrumbsModel.java Fri Sep 21 18:20:49 2007
@@ -0,0 +1,149 @@
+/*
+ * 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.breadcrumb;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Default breadcrumb model implementation that should be good for 99% of the
+ * use cases out there.
+ * 
+ * @author eelcohillenius
+ */
+public class DefaultBreadCrumbsModel implements IBreadCrumbModel
+{
+	private static final long serialVersionUID = 1L;
+
+	/** The currently active participant, if any (possibly null). */
+	private IBreadCrumbParticipant activeParticipant = null;
+
+	/** Holds the current list of crumbs. */
+	private List crumbs = new ArrayList();
+
+	/** listeners utility. */
+	private final BreadCrumbModelListenerSupport listenerSupport = new BreadCrumbModelListenerSupport();
+
+	/**
+	 * Construct.
+	 */
+	public DefaultBreadCrumbsModel()
+	{
+	}
+
+	/**
+	 * @see org.apache.wicket.extensions.breadcrumb.IBreadCrumbModel#addListener(org.apache.wicket.extensions.breadcrumb.IBreadCrumbModelListener)
+	 */
+	public final void addListener(IBreadCrumbModelListener listener)
+	{
+		this.listenerSupport.addListener(listener);
+	}
+
+	/**
+	 * @see org.apache.wicket.extensions.breadcrumb.IBreadCrumbModel#allBreadCrumbParticipants()
+	 */
+	public final List allBreadCrumbParticipants()
+	{
+		return crumbs;
+	}
+
+	/**
+	 * @see org.apache.wicket.extensions.breadcrumb.IBreadCrumbModel#getActive()
+	 */
+	public IBreadCrumbParticipant getActive()
+	{
+		return activeParticipant;
+	}
+
+	/**
+	 * @see org.apache.wicket.extensions.breadcrumb.IBreadCrumbModel#removeListener(org.apache.wicket.extensions.breadcrumb.IBreadCrumbModelListener)
+	 */
+	public final void removeListener(IBreadCrumbModelListener listener)
+	{
+		this.listenerSupport.removeListener(listener);
+	}
+
+	/**
+	 * @see org.apache.wicket.extensions.breadcrumb.IBreadCrumbModel#setActive(org.apache.wicket.extensions.breadcrumb.IBreadCrumbParticipant)
+	 */
+	public final void setActive(final IBreadCrumbParticipant breadCrumbParticipant)
+	{
+		// see if the bread crumb was already added, and if so,
+		// clean up the stack after (on top of) this bred crumb
+		// and notify listeners of the removal
+		int len = crumbs.size() - 1;
+		int i = len;
+		while (i > -1)
+		{
+			IBreadCrumbParticipant temp = (IBreadCrumbParticipant)crumbs.get(i);
+
+			// if we found the bread crumb
+			if (breadCrumbParticipant.equals(temp))
+			{
+				// remove the bread crumbs after this one
+				int j = len;
+				while (j > i)
+				{
+					// remove and fire event
+					IBreadCrumbParticipant removed = (IBreadCrumbParticipant)crumbs.remove(j--);
+					listenerSupport.fireBreadCrumbRemoved(removed);
+				}
+
+				// activate the bread crumb participant
+				activate(breadCrumbParticipant);
+
+				// we're done; the provided bread crumb is on top
+				// and the content is replaced, so just return this function
+				return;
+			}
+
+			i--;
+		}
+
+		// arriving here means we weren't able to find the bread crumb
+		// add the new crumb
+		crumbs.add(breadCrumbParticipant);
+
+		// and notify listeners
+		listenerSupport.fireBreadCrumbAdded(breadCrumbParticipant);
+
+		// activate the bread crumb participant
+		activate(breadCrumbParticipant);
+	}
+
+	/**
+	 * Activates the bread crumb participant.
+	 * 
+	 * @param breadCrumbParticipant
+	 *            The participant to activate
+	 */
+	protected final void activate(final IBreadCrumbParticipant breadCrumbParticipant)
+	{
+		// get old value
+		IBreadCrumbParticipant previousParticipant = this.activeParticipant;
+
+		// and set the provided participant as the active one
+		this.activeParticipant = breadCrumbParticipant;
+
+		// fire bread crumb activated event
+		listenerSupport.fireBreadCrumbActivated(previousParticipant, breadCrumbParticipant);
+
+		// signal the bread crumb participant that it is selected as the
+		// currently active one
+		breadCrumbParticipant.onActivate(previousParticipant);
+	}
+}

Modified: wicket/trunk/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/breadcrumb/panel/BreadCrumbPanel.java
URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/breadcrumb/panel/BreadCrumbPanel.java?rev=578344&r1=578343&r2=578344&view=diff
==============================================================================
--- wicket/trunk/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/breadcrumb/panel/BreadCrumbPanel.java (original)
+++ wicket/trunk/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/breadcrumb/panel/BreadCrumbPanel.java Fri Sep 21 18:20:49 2007
@@ -17,7 +17,6 @@
 package org.apache.wicket.extensions.breadcrumb.panel;
 
 import org.apache.wicket.Component;
-import org.apache.wicket.MarkupContainer;
 import org.apache.wicket.extensions.breadcrumb.BreadCrumbLink;
 import org.apache.wicket.extensions.breadcrumb.IBreadCrumbModel;
 import org.apache.wicket.extensions.breadcrumb.IBreadCrumbParticipant;
@@ -64,6 +63,19 @@
 	private IBreadCrumbModel breadCrumbModel;
 
 	/**
+	 * Implementation of the participant.
+	 */
+	private final IBreadCrumbParticipant decorated = new BreadCrumbParticipantDelegate(this)
+	{
+		private static final long serialVersionUID = 1L;
+
+		public String getTitle()
+		{
+			return BreadCrumbPanel.this.getTitle();
+		}
+	};
+
+	/**
 	 * Construct.
 	 * 
 	 * @param id
@@ -158,70 +170,15 @@
 	 */
 	public Component getComponent()
 	{
-		return this;
+		return decorated.getComponent();
 	}
 
 	/**
-	 * If the previous participant is not null (and a component, which it should
-	 * be), replace that component on it's parent with this one.
-	 * 
 	 * @see org.apache.wicket.extensions.breadcrumb.IBreadCrumbParticipant#onActivate(org.apache.wicket.extensions.breadcrumb.IBreadCrumbParticipant)
 	 */
 	public void onActivate(IBreadCrumbParticipant previous)
 	{
-		if (previous != null)
-		{
-			MarkupContainer parent = previous.getComponent().getParent();
-			if (parent != null)
-			{
-				final String thisId = getId();
-				if (parent.get(thisId) != null)
-				{
-					parent.replace(this);
-				}
-				else
-				{
-					// try to search downwards to match the id
-					// NOTE unfortunately, we can't rely on the path pre 2.0
-					Component c = (Component)parent.visitChildren(new IVisitor()
-					{
-						public Object component(Component component)
-						{
-							if (component.getId().equals(thisId))
-							{
-								return component;
-							}
-							return IVisitor.CONTINUE_TRAVERSAL;
-						}
-					});
-					if (c == null)
-					{
-						// not found... do a reverse search (upwards)
-						c = (Component)parent.visitParents(Component.class, new IVisitor()
-						{
-							public Object component(Component component)
-							{
-								if (component.getId().equals(thisId))
-								{
-									return component;
-								}
-								return IVisitor.CONTINUE_TRAVERSAL;
-							}
-						});
-					}
-
-					// replace if found
-					if (c != null)
-					{
-						c.replaceWith(this);
-					}
-				}
-			}
-		}
-		else if (getParent() != null)
-		{
-			getParent().replace(this);
-		}
+		decorated.onActivate(previous);
 	}
 
 	/**

Added: wicket/trunk/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/breadcrumb/panel/BreadCrumbParticipantDelegate.java
URL: http://svn.apache.org/viewvc/wicket/trunk/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/breadcrumb/panel/BreadCrumbParticipantDelegate.java?rev=578344&view=auto
==============================================================================
--- wicket/trunk/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/breadcrumb/panel/BreadCrumbParticipantDelegate.java (added)
+++ wicket/trunk/jdk-1.4/wicket-extensions/src/main/java/org/apache/wicket/extensions/breadcrumb/panel/BreadCrumbParticipantDelegate.java Fri Sep 21 18:20:49 2007
@@ -0,0 +1,125 @@
+/*
+ * 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.breadcrumb.panel;
+
+import org.apache.wicket.Component;
+import org.apache.wicket.MarkupContainer;
+import org.apache.wicket.Component.IVisitor;
+import org.apache.wicket.extensions.breadcrumb.IBreadCrumbParticipant;
+import org.apache.wicket.markup.html.panel.Panel;
+
+/**
+ * Base implementation for {@link Panel}/ {@link Component} based
+ * {@link IBreadCrumbParticipant} that decouples the implementation from the
+ * actual panel class.
+ * 
+ * @author eelcohillenius
+ */
+public abstract class BreadCrumbParticipantDelegate implements IBreadCrumbParticipant
+{
+	private static final long serialVersionUID = 1L;
+
+	private final Component component;
+
+	/**
+	 * Construct.
+	 * 
+	 * @param component
+	 */
+	public BreadCrumbParticipantDelegate(Component component)
+	{
+		if (component == null)
+		{
+			throw new IllegalArgumentException("component must be not null");
+		}
+		this.component = component;
+	}
+
+	/**
+	 * @see org.apache.wicket.extensions.breadcrumb.IBreadCrumbParticipant#getComponent()
+	 */
+	public Component getComponent()
+	{
+		return component;
+	}
+
+	/**
+	 * If the previous participant is not null (and a component, which it should
+	 * be), replace that component on it's parent with this one.
+	 * 
+	 * @see org.apache.wicket.extensions.breadcrumb.IBreadCrumbParticipant#onActivate(org.apache.wicket.extensions.breadcrumb.IBreadCrumbParticipant)
+	 */
+	public void onActivate(IBreadCrumbParticipant previous)
+	{
+		if (previous != null)
+		{
+			MarkupContainer parent = previous.getComponent().getParent();
+			if (parent != null)
+			{
+				final String thisId = component.getId();
+				if (parent.get(thisId) != null)
+				{
+					parent.replace(component);
+				}
+				else
+				{
+					// try to search downwards to match the id
+					// NOTE unfortunately, we can't rely on the path pre 2.0
+					Component c = (Component)parent.visitChildren(new IVisitor()
+					{
+						public Object component(Component component)
+						{
+							if (component.getId().equals(thisId))
+							{
+								return component;
+							}
+							return IVisitor.CONTINUE_TRAVERSAL;
+						}
+					});
+					if (c == null)
+					{
+						// not found... do a reverse search (upwards)
+						c = (Component)parent.visitParents(Component.class, new IVisitor()
+						{
+							public Object component(Component component)
+							{
+								if (component.getId().equals(thisId))
+								{
+									return component;
+								}
+								return IVisitor.CONTINUE_TRAVERSAL;
+							}
+						});
+					}
+
+					// replace if found
+					if (c != null)
+					{
+						c.replaceWith(component);
+					}
+				}
+			}
+		}
+		else if (component.getParent() != null)
+		{
+			component.getParent().replace(component);
+		}
+	}
+}