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 21:00:43 UTC

svn commit: r1024360 - /wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/AbstractTree.java

Author: mgrigorov
Date: Tue Oct 19 19:00:43 2010
New Revision: 1024360

URL: http://svn.apache.org/viewvc?rev=1024360&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.

merge r1024347 from wicket-1.4.x

wicket-examples work ok (though there is no usage of add/remove node methods)
no way to check brix against 1.5 for now

Modified:
    wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/AbstractTree.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=1024360&r1=1024359&r2=1024360&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 Tue Oct 19 19:00:43 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.MarkupContainer;
@@ -197,6 +195,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()
 		 */
 		@Override
@@ -808,22 +816,17 @@ 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)
 			{
@@ -837,37 +840,29 @@ 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())
+						Object node = eventChildren.get(i);
+						int index = childIndices[i];
+						TreeItem item = newTreeItem(parentItem, node, parentItem.getLevel() + 1);
+						itemContainer.add(item);
+
+						if (itemChildren != null)
 						{
-							invalidateNode(parentNode, true);
+							itemChildren.add(index, item);
+							markTheLastButOneChildDirty(parentItem, item);
 						}
 
-						for (int i = 0; i < e.getChildren().length; ++i)
+						if (!dirtyItems.contains(item))
 						{
-							Object node = e.getChildren()[i];
-							int index = e.getChildIndices()[i];
-							TreeItem item = newTreeItem(parentItem, node, parentItem.getLevel() + 1);
-							itemContainer.add(item);
-
-							if (parentItem.getChildren() != null)
-							{
-								parentItem.getChildren().add(index, item);
-								markTheLastButOneChildDirty(parentItem, item);
-							}
-
-							if (!dirtyItems.contains(item))
-							{
-								dirtyItems.add(item);
-							}
+							dirtyItems.add(item);
+						}
 
-							if (!dirtyItemsCreateDOM.contains(item) &&
-								!item.hasParentWithChildrenMarkedToRecreation())
-							{
-								dirtyItemsCreateDOM.add(item);
-							}
+						if (!dirtyItemsCreateDOM.contains(item) &&
+							!item.hasParentWithChildrenMarkedToRecreation())
+						{
+							dirtyItemsCreateDOM.add(item);
 						}
 					}
 				}
@@ -886,17 +881,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
@@ -923,6 +912,12 @@ public abstract class AbstractTree exten
 					}
 				}
 			}
+
+			if (!parentItem.hasChildTreeItems())
+			{
+				// rebuild parent's icon to show it no longer has children
+				invalidateNode(parentNode, true);
+			}
 		}
 	}