You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by kn...@apache.org on 2008/04/20 22:06:52 UTC

svn commit: r649964 - in /wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree: AbstractTree.java BaseTree.java DefaultTreeState.java ExtendedTreeModel.java ITreeState.java ITreeStateListener.java

Author: knopp
Date: Sun Apr 20 13:06:50 2008
New Revision: 649964

URL: http://svn.apache.org/viewvc?rev=649964&view=rev
Log:
WICKET-1555

Added:
    wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ExtendedTreeModel.java   (with props)
Modified:
    wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/AbstractTree.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/BaseTree.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/DefaultTreeState.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ITreeState.java
    wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ITreeStateListener.java

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/AbstractTree.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/AbstractTree.java?rev=649964&r1=649963&r2=649964&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/AbstractTree.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/AbstractTree.java Sun Apr 20 13:06:50 2008
@@ -18,7 +18,6 @@
 
 import java.io.Serializable;
 import java.util.ArrayList;
-import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -109,7 +108,7 @@
 		 * @param level
 		 *            current level
 		 */
-		public TreeItem(String id, final TreeNode node, int level)
+		public TreeItem(String id, final Object node, int level)
 		{
 			super(id, new Model((Serializable)node));
 
@@ -143,6 +142,7 @@
 		/**
 		 * @see org.apache.wicket.Component#getMarkupId()
 		 */
+		@Override
 		public String getMarkupId()
 		{
 			// this is overridden to produce id that begins with id of tree
@@ -156,7 +156,7 @@
 		 */
 		public TreeItem getParentItem()
 		{
-			return (TreeItem)nodeToItemMap.get(getParentNode((TreeNode)getModelObject()));
+			return (TreeItem)nodeToItemMap.get(getParentNode(getModelObject()));
 		}
 
 		/**
@@ -183,6 +183,7 @@
 		/**
 		 * @see org.apache.wicket.MarkupContainer#onRender(org.apache.wicket.markup.MarkupStream)
 		 */
+		@Override
 		protected void onRender(final MarkupStream markupStream)
 		{
 			// is this root and tree is in rootless mode?
@@ -229,6 +230,7 @@
 			}
 		}
 
+		@Override
 		public void renderHead(final HtmlHeaderContainer container)
 		{
 			super.renderHead(container);
@@ -266,6 +268,7 @@
 			setFlag(FLAG_RENDER_CHILDREN, value);
 		}
 
+		@Override
 		protected void onDetach()
 		{
 			super.onDetach();
@@ -291,6 +294,7 @@
 			setRenderChildren(false);
 		}
 
+		@Override
 		protected void onBeforeRender()
 		{
 			onBeforeRenderInternal();
@@ -309,6 +313,7 @@
 			}
 		}
 
+		@Override
 		protected void onAfterRender()
 		{
 			super.onAfterRender();
@@ -348,6 +353,7 @@
 		/**
 		 * @see org.apache.wicket.MarkupContainer#remove(org.apache.wicket.Component)
 		 */
+		@Override
 		public void remove(Component component)
 		{
 			// when a treeItem is removed, remove reference to it from
@@ -364,6 +370,7 @@
 		 * 
 		 * @param markupStream
 		 */
+		@Override
 		protected void onRender(final MarkupStream markupStream)
 		{
 			// Save position in markup stream
@@ -406,36 +413,6 @@
 		}
 	}
 
-	/**
-	 * Returns an iterator that iterates trough the enumeration.
-	 * 
-	 * @param enumeration
-	 *            The enumeration to iterate through
-	 * @return The iterator
-	 */
-	private static final Iterator toIterator(final Enumeration enumeration)
-	{
-		return new Iterator()
-		{
-			private final Enumeration e = enumeration;
-
-			public boolean hasNext()
-			{
-				return e.hasMoreElements();
-			}
-
-			public Object next()
-			{
-				return e.nextElement();
-			}
-
-			public void remove()
-			{
-				throw new UnsupportedOperationException("Remove is not supported on enumeration.");
-			}
-		};
-	}
-
 	private boolean attached = false;
 
 	/** comma separated list of ids of elements to be deleted. */
@@ -574,7 +551,7 @@
 			// has been called
 			if (rootItem == null)
 			{
-				TreeNode rootNode = (TreeNode)((TreeModel)getModelObject()).getRoot();
+				Object rootNode = ((TreeModel)getModelObject()).getRoot();
 				if (rootNode != null)
 				{
 					if (isRootLess())
@@ -598,6 +575,7 @@
 	 * Called at the beginning of the request (not ajax request, unless we are rendering the entire
 	 * component)
 	 */
+	@Override
 	public void onBeforeRender()
 	{
 		onBeforeRenderInternal();
@@ -607,10 +585,15 @@
 	/**
 	 * @see org.apache.wicket.MarkupContainer#onDetach()
 	 */
+	@Override
 	public void onDetach()
 	{
 		attached = false;
 		super.onDetach();
+		if (getTreeState() instanceof IDetachable)
+		{
+			((IDetachable)getTreeState()).detach();
+		}
 	}
 
 	/**
@@ -634,7 +617,7 @@
 	/**
 	 * @see org.apache.wicket.markup.html.tree.ITreeStateListener#nodeCollapsed(javax.swing.tree.TreeNode)
 	 */
-	public final void nodeCollapsed(TreeNode node)
+	public final void nodeCollapsed(Object node)
 	{
 		if (isNodeVisible(node) == true)
 		{
@@ -645,7 +628,7 @@
 	/**
 	 * @see org.apache.wicket.markup.html.tree.ITreeStateListener#nodeExpanded(javax.swing.tree.TreeNode)
 	 */
-	public final void nodeExpanded(TreeNode node)
+	public final void nodeExpanded(Object node)
 	{
 		if (isNodeVisible(node) == true)
 		{
@@ -656,7 +639,7 @@
 	/**
 	 * @see org.apache.wicket.markup.html.tree.ITreeStateListener#nodeSelected(javax.swing.tree.TreeNode)
 	 */
-	public final void nodeSelected(TreeNode node)
+	public final void nodeSelected(Object node)
 	{
 		if (isNodeVisible(node))
 		{
@@ -667,7 +650,7 @@
 	/**
 	 * @see org.apache.wicket.markup.html.tree.ITreeStateListener#nodeUnselected(javax.swing.tree.TreeNode)
 	 */
-	public final void nodeUnselected(TreeNode node)
+	public final void nodeUnselected(Object node)
 	{
 		if (isNodeVisible(node))
 		{
@@ -702,7 +685,7 @@
 			// expanded
 			if (rootLess == true && getModelObject() != null)
 			{
-				getTreeState().expandNode((TreeNode)((TreeModel)getModelObject()).getRoot());
+				getTreeState().expandNode(((TreeModel)getModelObject()).getRoot());
 			}
 		}
 	}
@@ -717,7 +700,7 @@
 		{
 			if (rootItem != null)
 			{
-				invalidateNode((TreeNode)rootItem.getModelObject(), true);
+				invalidateNode(rootItem.getModelObject(), true);
 			}
 		}
 		else
@@ -728,7 +711,7 @@
 			{
 				for (int i = 0; i < children.length; i++)
 				{
-					TreeNode node = (TreeNode)children[i];
+					Object node = children[i];
 					if (isNodeVisible(node))
 					{
 						// if the nodes is visible invalidate it
@@ -761,7 +744,7 @@
 
 				// invalidate the node and it's children, so that they are
 				// redrawn
-				invalidateNodeWithChildren((TreeNode)item.getModelObject());
+				invalidateNodeWithChildren(item.getModelObject());
 
 			}
 		}
@@ -773,20 +756,20 @@
 	public final void treeNodesInserted(TreeModelEvent e)
 	{
 		// get the parent node of inserted nodes
-		TreeNode parent = (TreeNode)e.getTreePath().getLastPathComponent();
+		Object parent = e.getTreePath().getLastPathComponent();
 
 		if (isNodeVisible(parent) && isNodeExpanded(parent))
 		{
 			TreeItem parentItem = (TreeItem)nodeToItemMap.get(parent);
-			
-			if (parentItem.getChildren().isEmpty()) 
+
+			if (parentItem.getChildren().isEmpty())
 			{
 				invalidateNode(parent, true);
 			}
-			
+
 			for (int i = 0; i < e.getChildren().length; ++i)
 			{
-				TreeNode node = (TreeNode)e.getChildren()[i];
+				Object node = e.getChildren()[i];
 				int index = e.getChildIndices()[i];
 				TreeItem item = newTreeItem(node, parentItem.getLevel() + 1);
 				itemContainer.add(item);
@@ -794,8 +777,11 @@
 
 				markTheLastButOneChildDirty(parentItem, item);
 
-				dirtyItems.add(item);
-				dirtyItemsCreateDOM.add(item);
+				if (!dirtyItems.contains(item))
+					dirtyItems.add(item);
+
+				if (!dirtyItemsCreateDOM.contains(item))
+					dirtyItemsCreateDOM.add(item);
 			}
 		}
 	}
@@ -806,7 +792,7 @@
 	public final void treeNodesRemoved(TreeModelEvent e)
 	{
 		// get the parent node of inserted nodes
-		TreeNode parent = (TreeNode)e.getTreePath().getLastPathComponent();
+		Object parent = e.getTreePath().getLastPathComponent();
 		TreeItem parentItem = (TreeItem)nodeToItemMap.get(parent);
 
 		if (isNodeVisible(parent) && isNodeExpanded(parent))
@@ -814,7 +800,7 @@
 			boolean nonEmpty = !parentItem.getChildren().isEmpty();
 			for (int i = 0; i < e.getChildren().length; ++i)
 			{
-				TreeNode node = (TreeNode)e.getChildren()[i];
+				Object node = e.getChildren()[i];
 
 				TreeItem item = (TreeItem)nodeToItemMap.get(node);
 				if (item != null)
@@ -831,7 +817,7 @@
 							removeItem(item);
 
 							// deselect the node
-							getTreeState().selectNode((TreeNode)item.getModelObject(), false);
+							getTreeState().selectNode(item.getModelObject(), false);
 						}
 					});
 
@@ -851,7 +837,7 @@
 	public final void treeStructureChanged(TreeModelEvent e)
 	{
 		// get the parent node of changed nodes
-		TreeNode node = (TreeNode)e.getTreePath().getLastPathComponent();
+		Object node = e.getTreePath().getLastPathComponent();
 
 		// has the tree root changed?
 		if (e.getTreePath().getPathCount() == 1)
@@ -983,6 +969,7 @@
 			for (Iterator i = dirtyItems.iterator(); i.hasNext();)
 			{
 				TreeItem item = (TreeItem)i.next();
+
 				// does the item need to rebuild children?
 				if (item.getChildren() == null)
 				{
@@ -996,6 +983,7 @@
 
 				// add the component to target
 				addComponent(target, item);
+
 			}
 
 			// clear dirty flags
@@ -1010,7 +998,7 @@
 	 *            The node to inspect
 	 * @return true if the node is expanded, false otherwise
 	 */
-	protected final boolean isNodeExpanded(TreeNode node)
+	protected final boolean isNodeExpanded(Object node)
 	{
 		// In root less mode the root node is always expanded
 		if (isRootLess() && rootItem != null && rootItem.getModelObject().equals(node))
@@ -1035,6 +1023,7 @@
 	/**
 	 * Called after the rendering of tree is complete. Here we clear the dirty flags.
 	 */
+	@Override
 	protected void onAfterRender()
 	{
 		super.onAfterRender();
@@ -1066,11 +1055,10 @@
 		List items;
 
 		// if the node is expanded
-		if (isNodeExpanded((TreeNode)item.getModelObject()))
+		if (isNodeExpanded(item.getModelObject()))
 		{
 			// build the items for children of the items' treenode.
-			items = buildTreeItems(nodeChildren((TreeNode)item.getModelObject()),
-				item.getLevel() + 1);
+			items = buildTreeItems(nodeChildren(item.getModelObject()), item.getLevel() + 1);
 		}
 		else
 		{
@@ -1097,7 +1085,7 @@
 		// for each node
 		while (nodes.hasNext())
 		{
-			TreeNode node = (TreeNode)nodes.next();
+			Object node = nodes.next();
 			// create tree item
 			TreeItem item = newTreeItem(node, level);
 			itemContainer.add(item);
@@ -1230,7 +1218,7 @@
 	 * 
 	 * @param node
 	 */
-	public final void markNodeDirty(TreeNode node)
+	public final void markNodeDirty(Object node)
 	{
 		invalidateNode(node, false);
 	}
@@ -1243,7 +1231,7 @@
 	 *            The node to invalidate
 	 * @param forceRebuild
 	 */
-	private final void invalidateNode(TreeNode node, boolean forceRebuild)
+	private final void invalidateNode(Object node, boolean forceRebuild)
 	{
 		if (dirtyAll == false)
 		{
@@ -1290,8 +1278,10 @@
 					}
 				}
 
-				dirtyItems.add(item);
-				if (createDOM)
+				if (!dirtyItems.contains(item))
+					dirtyItems.add(item);
+
+				if (createDOM && !dirtyItemsCreateDOM.contains(item))
 				{
 					dirtyItemsCreateDOM.add(item);
 				}
@@ -1306,7 +1296,7 @@
 	 * @param node
 	 *            The node to invalidate
 	 */
-	private final void invalidateNodeWithChildren(TreeNode node)
+	private final void invalidateNodeWithChildren(Object node)
 	{
 		if (dirtyAll == false)
 		{
@@ -1328,8 +1318,11 @@
 				// set children to null so that they get rebuild
 				item.setChildren(null);
 
-				// add item to dirty items
-				dirtyItems.add(item);
+				if (!dirtyItems.contains(item))
+				{
+					// add item to dirty items
+					dirtyItems.add(item);
+				}
 			}
 		}
 	}
@@ -1341,27 +1334,41 @@
 	 *            The node to inspect
 	 * @return true if the node is visible, false otherwise
 	 */
-	private final boolean isNodeVisible(TreeNode node)
+	private final boolean isNodeVisible(Object node)
 	{
-		while (getParentNode(node) != null)
+		Object parent = getParentNode(node);
+		while (parent != null)
 		{
-			if (isNodeExpanded(node.getParent()) == false)
+			if (isNodeExpanded(parent) == false)
 			{
 				return false;
 			}
-			node = node.getParent();
+			parent = getParentNode(parent);
 		}
 		return true;
 	}
-	
+
 	/**
 	 * Returns parent node of given node.
+	 * 
 	 * @param node
 	 * @return
 	 */
-	protected TreeNode getParentNode(TreeNode node)
+	public Object getParentNode(Object node)
 	{
-		return node.getParent();
+		if (getModelObject() instanceof ExtendedTreeModel)
+		{
+			return ((ExtendedTreeModel)getModelObject()).getParent(node);
+		}
+		else if (node instanceof TreeNode)
+		{
+			return ((TreeNode)node).getParent();
+		}
+		else
+		{
+			throw new IllegalStateException(
+				"Couldn't determine node parent. Either the tree model must implement ParentTreeModel or Node must implement TreeNode.");
+		}
 	}
 
 	/**
@@ -1373,7 +1380,7 @@
 	 *            The level
 	 * @return The new tree item
 	 */
-	private final TreeItem newTreeItem(TreeNode node, int level)
+	private final TreeItem newTreeItem(Object node, int level)
 	{
 		return new TreeItem("" + idCounter++, node, level);
 	}
@@ -1389,7 +1396,7 @@
 	 *            the component id
 	 * @return The new tree item
 	 */
-	private final TreeItem newTreeItem(TreeNode node, int level, String id)
+	private final TreeItem newTreeItem(Object node, int level, String id)
 	{
 		return new TreeItem(id, node, level);
 	}
@@ -1401,9 +1408,36 @@
 	 *            The tree node
 	 * @return iterable presentation of node children
 	 */
-	private final Iterator nodeChildren(TreeNode node)
+	public final Iterator<Object> nodeChildren(Object node)
+	{
+		TreeModel model = getTreeModel();
+		int count = model.getChildCount(node);
+		List<Object> nodes = new ArrayList<Object>(count);
+		for (int i = 0; i < count; ++i)
+		{
+			nodes.add(model.getChild(node, i));
+		}
+		return nodes.iterator();
+	}
+
+	public final Object getChildAt(Object parent, int index)
+	{
+		return getTreeModel().getChild(parent, index);
+	}
+
+	public final boolean isLeaf(Object node)
+	{
+		return getTreeModel().isLeaf(node);
+	}
+
+	public final int getChildCount(Object parent)
+	{
+		return getTreeModel().getChildCount(parent);
+	}
+
+	private TreeModel getTreeModel()
 	{
-		return toIterator(node.children());
+		return (TreeModel)getModelObject();
 	}
 
 	/**
@@ -1509,7 +1543,7 @@
 	 *            Tree node
 	 * @return Component associated with given node, or null if node is not visible.
 	 */
-	public Component getNodeComponent(TreeNode node)
+	public Component getNodeComponent(Object node)
 	{
 		return (Component)nodeToItemMap.get(node);
 	}

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/BaseTree.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/BaseTree.java?rev=649964&r1=649963&r2=649964&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/BaseTree.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/BaseTree.java Sun Apr 20 13:06:50 2008
@@ -16,8 +16,6 @@
  */
 package org.apache.wicket.markup.html.tree;
 
-import javax.swing.tree.TreeNode;
-
 import org.apache.wicket.Component;
 import org.apache.wicket.IClusterable;
 import org.apache.wicket.IComponentBorder;
@@ -98,10 +96,11 @@
 	 * @see org.apache.wicket.markup.html.tree.AbstractTree#populateTreeItem(org.apache.wicket.markup.html.WebMarkupContainer,
 	 *      int)
 	 */
+	@Override
 	protected void populateTreeItem(WebMarkupContainer item, int level)
 	{
 		// add junction link
-		TreeNode node = (TreeNode)item.getModelObject();
+		Object node = item.getModelObject();
 		Component junctionLink = newJunctionLink(item, JUNCTION_LINK_ID, node);
 		junctionLink.setComponentBorder(new JunctionBorder(node, level));
 		item.add(junctionLink);
@@ -115,9 +114,10 @@
 		{
 			private static final long serialVersionUID = 1L;
 
+			@Override
 			public void onComponentTag(Component component, ComponentTag tag)
 			{
-				TreeNode node = (TreeNode)component.getModelObject();
+				Object node = component.getModelObject();
 				if (getTreeState().isNodeSelected(node))
 				{
 					CharSequence oldClass = tag.getString("class");
@@ -162,16 +162,16 @@
 	 *            The node
 	 * @return whether the provided node is the last child
 	 */
-	private static boolean isNodeLast(TreeNode node)
+	private boolean isNodeLast(Object node)
 	{
-		TreeNode parent = node.getParent();
+		Object parent = getParentNode(node);
 		if (parent == null)
 		{
 			return true;
 		}
 		else
 		{
-			return parent.getChildAt(parent.getChildCount() - 1).equals(node);
+			return getChildAt(parent, getChildCount(parent) - 1).equals(node);
 		}
 	}
 
@@ -180,11 +180,11 @@
 	 * 
 	 * @author Matej Knopp
 	 */
-	private static class JunctionBorder implements IComponentBorder
+	private class JunctionBorder implements IComponentBorder
 	{
 		private static final long serialVersionUID = 1L;
 
-		private final TreeNode node;
+		private final Object node;
 		private final int level;
 
 		/**
@@ -193,7 +193,7 @@
 		 * @param node
 		 * @param level
 		 */
-		public JunctionBorder(TreeNode node, int level)
+		public JunctionBorder(Object node, int level)
 		{
 			this.node = node;
 			this.level = level;
@@ -207,7 +207,7 @@
 		public void renderBefore(Component component)
 		{
 			Response response = RequestCycle.get().getResponse();
-			TreeNode parent = node.getParent();
+			Object parent = getParentNode(node);
 
 			CharSequence classes[] = new CharSequence[level];
 			for (int i = 0; i < level; ++i)
@@ -221,7 +221,7 @@
 					classes[i] = "line";
 				}
 
-				parent = parent.getParent();
+				parent = getParentNode(parent);
 			}
 
 			for (int i = level - 1; i >= 0; --i)
@@ -252,11 +252,11 @@
 	 *            tree node for which the link should be created.
 	 * @return The link component
 	 */
-	protected Component newJunctionLink(MarkupContainer parent, final String id, final TreeNode node)
+	protected Component newJunctionLink(MarkupContainer parent, final String id, final Object node)
 	{
 		final MarkupContainer junctionLink;
 
-		if (node.isLeaf() == false)
+		if (isLeaf(node) == false)
 		{
 			junctionLink = newLink(id, new ILinkCallback()
 			{
@@ -280,6 +280,7 @@
 			{
 				private static final long serialVersionUID = 1L;
 
+				@Override
 				public void onComponentTag(Component component, ComponentTag tag)
 				{
 					if (isNodeExpanded(node))
@@ -302,6 +303,7 @@
 				/**
 				 * @see org.apache.wicket.Component#onComponentTag(org.apache.wicket.markup.ComponentTag)
 				 */
+				@Override
 				protected void onComponentTag(ComponentTag tag)
 				{
 					super.onComponentTag(tag);
@@ -325,7 +327,7 @@
 	 * @param node
 	 *            Node for which this callback is relevant
 	 */
-	protected void onJunctionLinkClicked(AjaxRequestTarget target, TreeNode node)
+	protected void onJunctionLinkClicked(AjaxRequestTarget target, Object node)
 	{
 	}
 
@@ -409,6 +411,7 @@
 				/**
 				 * @see org.apache.wicket.markup.html.link.Link#onClick()
 				 */
+				@Override
 				public void onClick()
 				{
 					callback.onClick(null);
@@ -424,6 +427,7 @@
 				/**
 				 * @see org.apache.wicket.ajax.markup.html.AjaxLink#onClick(org.apache.wicket.ajax.AjaxRequestTarget)
 				 */
+				@Override
 				public void onClick(AjaxRequestTarget target)
 				{
 					callback.onClick(target);
@@ -439,6 +443,7 @@
 				/**
 				 * @see org.apache.wicket.ajax.markup.html.AjaxFallbackLink#onClick(org.apache.wicket.ajax.AjaxRequestTarget)
 				 */
+				@Override
 				public void onClick(AjaxRequestTarget target)
 				{
 					callback.onClick(target);
@@ -458,8 +463,8 @@
 	}
 
 	/**
-	 * Sets the type of links on tree items. After the link type is changed, the whole tree is
-	 * rebuild and re-rendered.
+	 * Sets the type of links on tree items. After the link type is changed, the whole tree must be
+	 * rebuilt (call invalidateAll).
 	 * 
 	 * @param linkType
 	 *            type of links
@@ -469,13 +474,13 @@
 		if (this.linkType != linkType)
 		{
 			this.linkType = linkType;
-			invalidateAll();
 		}
 	}
 
 	/**
 	 * @see org.apache.wicket.markup.html.tree.AbstractTree#isForceRebuildOnSelectionChange()
 	 */
+	@Override
 	protected boolean isForceRebuildOnSelectionChange()
 	{
 		return false;

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/DefaultTreeState.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/DefaultTreeState.java?rev=649964&r1=649963&r2=649964&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/DefaultTreeState.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/DefaultTreeState.java Sun Apr 20 13:06:50 2008
@@ -24,9 +24,8 @@
 import java.util.List;
 import java.util.Set;
 
-import javax.swing.tree.TreeNode;
-
 import org.apache.wicket.IClusterable;
+import org.apache.wicket.model.IDetachable;
 
 /**
  * Default implementation of TreeState.
@@ -35,7 +34,7 @@
  * 
  * @author Matej Knopp
  */
-public class DefaultTreeState implements ITreeState, IClusterable
+public class DefaultTreeState implements ITreeState, IClusterable, IDetachable
 {
 	private static final long serialVersionUID = 1L;
 
@@ -91,10 +90,7 @@
 		}
 	}
 
-	/**
-	 * @see org.apache.wicket.markup.html.tree.ITreeState#collapseNode(javax.swing.tree.TreeNode)
-	 */
-	public void collapseNode(TreeNode node)
+	public void collapseNode(Object node)
 	{
 		if (nodesCollapsed == true)
 		{
@@ -137,10 +133,7 @@
 		}
 	}
 
-	/**
-	 * @see org.apache.wicket.markup.html.tree.ITreeState#expandNode(javax.swing.tree.TreeNode)
-	 */
-	public void expandNode(TreeNode node)
+	public void expandNode(Object node)
 	{
 		if (nodesCollapsed == false)
 		{
@@ -175,10 +168,7 @@
 		return allowSelectMultiple;
 	}
 
-	/**
-	 * @see org.apache.wicket.markup.html.tree.ITreeState#isNodeExpanded(javax.swing.tree.TreeNode)
-	 */
-	public boolean isNodeExpanded(TreeNode node)
+	public boolean isNodeExpanded(Object node)
 	{
 		if (nodesCollapsed == false)
 		{
@@ -190,10 +180,7 @@
 		}
 	}
 
-	/**
-	 * @see org.apache.wicket.markup.html.tree.ITreeState#isNodeSelected(javax.swing.tree.TreeNode)
-	 */
-	public boolean isNodeSelected(TreeNode node)
+	public boolean isNodeSelected(Object node)
 	{
 		return selectedNodes.contains(node);
 	}
@@ -206,17 +193,13 @@
 		listeners.remove(l);
 	}
 
-	/**
-	 * @see org.apache.wicket.markup.html.tree.ITreeState#selectNode(javax.swing.tree.TreeNode,
-	 *      boolean)
-	 */
-	public void selectNode(TreeNode node, boolean selected)
+	public void selectNode(Object node, boolean selected)
 	{
 		if (isAllowSelectMultiple() == false && selectedNodes.size() > 0)
 		{
 			for (Iterator i = selectedNodes.iterator(); i.hasNext();)
 			{
-				TreeNode current = (TreeNode)i.next();
+				Object current = i.next();
 				if (current.equals(node) == false)
 				{
 					i.remove();
@@ -259,5 +242,23 @@
 	public void setAllowSelectMultiple(boolean value)
 	{
 		allowSelectMultiple = value;
+	}
+
+	public void detach()
+	{
+		for (Object node : nodes)
+		{
+			if (node instanceof IDetachable)
+			{
+				((IDetachable)node).detach();
+			}
+		}
+		for (Object node : selectedNodes)
+		{
+			if (node instanceof IDetachable)
+			{
+				((IDetachable)node).detach();
+			}
+		}
 	}
 }

Added: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ExtendedTreeModel.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ExtendedTreeModel.java?rev=649964&view=auto
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ExtendedTreeModel.java (added)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ExtendedTreeModel.java Sun Apr 20 13:06:50 2008
@@ -0,0 +1,35 @@
+/*
+ * 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.markup.html.tree;
+
+import javax.swing.tree.TreeModel;
+
+/**
+ * Tree model that can provide parent for a tree node.
+ * 
+ * @author Matej Knopp
+ */
+public interface ExtendedTreeModel extends TreeModel
+{
+	/**
+	 * Returns parent of the given node or <code>null</code> if the node is a root node.
+	 * 
+	 * @param node
+	 * @return node parent or <code>null</code>
+	 */
+	public Object getParent(Object node);
+}

Propchange: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ExtendedTreeModel.java
------------------------------------------------------------------------------
    svn:mime-type = text/plain

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ITreeState.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ITreeState.java?rev=649964&r1=649963&r2=649964&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ITreeState.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ITreeState.java Sun Apr 20 13:06:50 2008
@@ -18,8 +18,6 @@
 
 import java.util.Collection;
 
-import javax.swing.tree.TreeNode;
-
 /**
  * Tree state holds information about a tree such as which nodes are expanded / collapsed and which
  * nodes are selected, It can also fire callbacks on listener in case any of the information
@@ -48,7 +46,7 @@
 	 * @param node
 	 *            Node to collapse
 	 */
-	void collapseNode(TreeNode node);
+	void collapseNode(Object node);
 
 	/**
 	 * Expands all nodes of the tree.
@@ -61,7 +59,7 @@
 	 * @param node
 	 *            Node to expand
 	 */
-	void expandNode(TreeNode node);
+	void expandNode(Object node);
 
 	/**
 	 * Returns the collection of all selected nodes.
@@ -84,7 +82,7 @@
 	 *            The node to inspect
 	 * @return True if the node is expanded
 	 */
-	boolean isNodeExpanded(TreeNode node);
+	boolean isNodeExpanded(Object node);
 
 	/**
 	 * Returns true if the given node is selected, false otherwise.
@@ -93,7 +91,7 @@
 	 *            The node to inspect
 	 * @return True if the node is selected
 	 */
-	boolean isNodeSelected(TreeNode node);
+	boolean isNodeSelected(Object node);
 
 	/**
 	 * Removes a tree state listener.
@@ -115,7 +113,7 @@
 	 * @param selected
 	 *            If true, the node will be selected, otherwise, the node will be unselected
 	 */
-	void selectNode(TreeNode node, boolean selected);
+	void selectNode(Object node, boolean selected);
 
 	/**
 	 * Sets whether multiple nodes can be selected.

Modified: wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ITreeStateListener.java
URL: http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ITreeStateListener.java?rev=649964&r1=649963&r2=649964&view=diff
==============================================================================
--- wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ITreeStateListener.java (original)
+++ wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/ITreeStateListener.java Sun Apr 20 13:06:50 2008
@@ -16,11 +16,10 @@
  */
 package org.apache.wicket.markup.html.tree;
 
-import javax.swing.tree.TreeNode;
 
 /**
  * Methods this interface are called when tree state is changing.
- * 
+ *
  * @author Matej Knopp
  */
 public interface ITreeStateListener
@@ -37,32 +36,32 @@
 
 	/**
 	 * Fired when given node is collapsed.
-	 * 
+	 *
 	 * @param node
 	 *            The node that was collapsed
 	 */
-	void nodeCollapsed(TreeNode node);
+	void nodeCollapsed(Object node);
 
 	/**
 	 * Fired when given node is expanded.
-	 * 
+	 *
 	 * @param node
 	 */
-	void nodeExpanded(TreeNode node);
+	void nodeExpanded(Object node);
 
 	/**
 	 * Fired when given node gets selected.
-	 * 
+	 *
 	 * @param node
 	 *            The node that was selected
 	 */
-	void nodeSelected(TreeNode node);
+	void nodeSelected(Object node);
 
 	/**
 	 * Fired when given node gets unselected.
-	 * 
+	 *
 	 * @param node
 	 *            The node that was unselected
 	 */
-	void nodeUnselected(TreeNode node);
+	void nodeUnselected(Object node);
 }