You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by iv...@apache.org on 2010/08/25 00:19:14 UTC
svn commit: r988745 -
/wicket/trunk/wicket/src/main/java/org/apache/wicket/markup/html/tree/AbstractTree.java
Author: ivaynberg
Date: Tue Aug 24 22:19:14 2010
New Revision: 988745
URL: http://svn.apache.org/viewvc?rev=988745&view=rev
Log:
Tree does not update correctly
Issue: WICKET-2886
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=988745&r1=988744&r2=988745&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 Aug 24 22:19:14 2010
@@ -18,6 +18,8 @@ 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.Iterator;
import java.util.List;
@@ -26,6 +28,7 @@ import java.util.Map;
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;
@@ -799,38 +802,66 @@ public abstract class AbstractTree exten
}
// get the parent node of inserted nodes
- Object parent = e.getTreePath().getLastPathComponent();
+ TreeNode parentNode = (TreeNode)e.getTreePath().getLastPathComponent();
- if (isNodeVisible(parent) && isNodeExpanded(parent))
+ if (isNodeVisible(parentNode))
{
- TreeItem parentItem = nodeToItemMap.get(parent);
-
- if (parentItem != null)
+ // 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 (parentItem.getChildren() == null || parentItem.getChildren().isEmpty())
+ if (!eventChildren.contains(treeChildren.nextElement()))
{
- invalidateNode(parent, true);
+ wasLeaf = false;
}
+ }
- for (int i = 0; i < e.getChildren().length; ++i)
+ if (wasLeaf)
+ {
+ // parentNode now has children for the first time, so we need to invalidate
+ // grandparent so that parentNode's junctionLink gets rebuilt with a plus/minus link
+ Object grandparentNode = getParentNode(parentNode);
+ invalidateNodeWithChildren(grandparentNode);
+ getTreeState().expandNode(parentNode);
+ }
+ else
+ {
+ if (isNodeExpanded(parentNode))
{
- Object node = e.getChildren()[i];
- int index = e.getChildIndices()[i];
- TreeItem item = newTreeItem(parentItem, node, parentItem.getLevel() + 1);
- itemContainer.add(item);
- parentItem.getChildren().add(index, item);
+ TreeItem parentItem = nodeToItemMap.get(parentNode);
+ if (parentItem != null)
+ {
+ if (parentItem.getChildren() == null || parentItem.getChildren().isEmpty())
+ {
+ invalidateNode(parentNode, true);
+ }
- markTheLastButOneChildDirty(parentItem, item);
+ for (int i = 0; i < e.getChildren().length; ++i)
+ {
+ Object node = e.getChildren()[i];
+ int index = e.getChildIndices()[i];
+ TreeItem item = newTreeItem(parentItem, node, parentItem.getLevel() + 1);
+ itemContainer.add(item);
- if (!dirtyItems.contains(item))
- {
- dirtyItems.add(item);
- }
+ if (parentItem.getChildren() != null)
+ {
+ parentItem.getChildren().add(index, item);
+ markTheLastButOneChildDirty(parentItem, item);
+ }
- if (!dirtyItemsCreateDOM.contains(item))
- {
- dirtyItemsCreateDOM.add(item);
+ if (!dirtyItems.contains(item))
+ {
+ dirtyItems.add(item);
+ }
+
+ if (!dirtyItemsCreateDOM.contains(item))
+ {
+ dirtyItemsCreateDOM.add(item);
+ }
+ }
}
}
}