You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by mg...@apache.org on 2010/10/19 20:25:59 UTC

svn commit: r1024347 - /wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/tree/AbstractTree.java

Author: mgrigorov
Date: Tue Oct 19 18:25:59 2010
New Revision: 1024347

URL: http://svn.apache.org/viewvc?rev=1024347&view=rev
Log:
WICKET-3112 Fix of issue 2886 breaks all individual implementations of any AbstractTree

Don't use Swing's TreeNode in AbstractTree.
Apply the patch provided by Mike Hefner with slight modifications.

brix-demo /admin works fine.
the reporter of WICKET-2886 also confirmed that the patch doesn't break the previous fix


Modified:
    wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/tree/AbstractTree.java

Modified: wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/tree/AbstractTree.java
URL: http://svn.apache.org/viewvc/wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/tree/AbstractTree.java?rev=1024347&r1=1024346&r2=1024347&view=diff
==============================================================================
--- wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/tree/AbstractTree.java (original)
+++ wicket/branches/wicket-1.4.x/wicket/src/main/java/org/apache/wicket/markup/html/tree/AbstractTree.java Tue Oct 19 18:25:59 2010
@@ -19,7 +19,6 @@ package org.apache.wicket.markup.html.tr
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -30,7 +29,6 @@ import java.util.Set;
 import javax.swing.event.TreeModelEvent;
 import javax.swing.event.TreeModelListener;
 import javax.swing.tree.TreeModel;
-import javax.swing.tree.TreeNode;
 
 import org.apache.wicket.Component;
 import org.apache.wicket.IRequestTarget;
@@ -194,6 +192,16 @@ public abstract class AbstractTree exten
 		}
 
 		/**
+		 * Whether the TreeItem has any child TreeItems
+		 * 
+		 * @return true if there are one or more child TreeItems; false otherwise
+		 */
+		public boolean hasChildTreeItems()
+		{
+			return children != null && !children.isEmpty();
+		}
+
+		/**
 		 * @see org.apache.wicket.MarkupContainer#onRender(org.apache.wicket.markup.MarkupStream)
 		 */
 		@Override
@@ -834,22 +842,16 @@ public abstract class AbstractTree exten
 		}
 
 		// get the parent node of inserted nodes
-		TreeNode parentNode = (TreeNode)e.getTreePath().getLastPathComponent();
+		Object parentNode = e.getTreePath().getLastPathComponent();
+		TreeItem parentItem = nodeToItemMap.get(parentNode);
 
-		if (isNodeVisible(parentNode))
+		if (parentItem != null && isNodeVisible(parentNode))
 		{
 			// parentNode was a leaf before this insertion event only if every one of
 			// its current children is in the event's list of children
-			boolean wasLeaf = true;
 			List<?> eventChildren = Arrays.asList(e.getChildren());
-			Enumeration<?> treeChildren = parentNode.children();
-			while (wasLeaf && treeChildren.hasMoreElements())
-			{
-				if (!eventChildren.contains(treeChildren.nextElement()))
-				{
-					wasLeaf = false;
-				}
-			}
+			List<TreeItem> itemChildren = parentItem.getChildren();
+			boolean wasLeaf = itemChildren == null || eventChildren.containsAll(itemChildren);
 
 			if (wasLeaf)
 			{
@@ -863,24 +865,17 @@ public abstract class AbstractTree exten
 			{
 				if (isNodeExpanded(parentNode))
 				{
-					TreeItem parentItem = nodeToItemMap.get(parentNode);
-					if (parentItem != null)
+					final int[] childIndices = e.getChildIndices();
+					for (int i = 0; i < eventChildren.size(); ++i)
 					{
-						if (parentItem.getChildren() == null || parentItem.getChildren().isEmpty())
-						{
-							invalidateNode(parentNode, true);
-						}
-
-						for (int i = 0; i < e.getChildren().length; ++i)
-						{
-							Object node = e.getChildren()[i];
-							int index = e.getChildIndices()[i];
+						Object node = eventChildren.get(i);
+						int index = childIndices[i];
 							TreeItem item = newTreeItem(parentItem, node, parentItem.getLevel() + 1);
 							itemContainer.add(item);
 
-							if (parentItem.getChildren() != null)
+						if (itemChildren != null)
 							{
-								parentItem.getChildren().add(index, item);
+							itemChildren.add(index, item);
 								markTheLastButOneChildDirty(parentItem, item);
 							}
 
@@ -899,7 +894,6 @@ public abstract class AbstractTree exten
 				}
 			}
 		}
-	}
 
 	/**
 	 * @see javax.swing.event.TreeModelListener#treeNodesRemoved(javax.swing.event.TreeModelEvent)
@@ -912,17 +906,11 @@ public abstract class AbstractTree exten
 		}
 
 		// get the parent node of deleted nodes
-		TreeNode parentNode = (TreeNode)removalEvent.getTreePath().getLastPathComponent();
+		Object parentNode = removalEvent.getTreePath().getLastPathComponent();
 		TreeItem parentItem = nodeToItemMap.get(parentNode);
 
 		if (parentItem != null && isNodeVisible(parentNode))
 		{
-			if (parentNode.getChildCount() == 0)
-			{
-				// rebuild parent's icon to show it no longer has children
-				invalidateNode(parentNode, true);
-			}
-
 			if (isNodeExpanded(parentNode))
 			{
 				// deleted nodes were visible; we need to delete their TreeItems
@@ -949,7 +937,14 @@ public abstract class AbstractTree exten
 					}
 				}
 			}
+
+			if (!parentItem.hasChildTreeItems())
+			{
+				// rebuild parent's icon to show it no longer has children
+				invalidateNode(parentNode, true);
 		}
+
+	}
 	}
 
 	/**