diff -r fe7d4d503415 openide.explorer/src/org/openide/explorer/view/VisualizerEvent.java --- a/openide.explorer/src/org/openide/explorer/view/VisualizerEvent.java Mon Jun 18 06:29:24 2012 -0700 +++ b/openide.explorer/src/org/openide/explorer/view/VisualizerEvent.java Tue Jun 19 11:02:09 2012 +0200 @@ -158,8 +158,10 @@ } static final class Destroyed extends VisualizerEvent implements Runnable { - public Destroyed(VisualizerChildren ch, NodeEvent ev) { + private final VisualizerNode toNull; + public Destroyed(VisualizerChildren ch, NodeEvent ev, VisualizerNode toNull) { super(ch, null, ev, null); + this.toNull = toNull; } @Override @@ -171,7 +173,7 @@ v.nodeDestroyed(originalEvent); } } - + toNull.parent = null; } } } diff -r fe7d4d503415 openide.explorer/src/org/openide/explorer/view/VisualizerNode.java --- a/openide.explorer/src/org/openide/explorer/view/VisualizerNode.java Mon Jun 18 06:29:24 2012 -0700 +++ b/openide.explorer/src/org/openide/explorer/view/VisualizerNode.java Tue Jun 19 11:02:09 2012 +0200 @@ -399,8 +399,7 @@ @Override public void nodeDestroyed(NodeEvent ev) { node = Node.EMPTY; - parent = null; - QUEUE.runSafe(new VisualizerEvent.Destroyed(getChildren(false), ev)); + QUEUE.runSafe(new VisualizerEvent.Destroyed(getChildren(false), ev, this)); } /** Change in the node properties (icon, etc.) diff -r fe7d4d503415 openide.explorer/test/unit/src/org/openide/explorer/view/NodeTreeModelTest.java --- a/openide.explorer/test/unit/src/org/openide/explorer/view/NodeTreeModelTest.java Mon Jun 18 06:29:24 2012 -0700 +++ b/openide.explorer/test/unit/src/org/openide/explorer/view/NodeTreeModelTest.java Tue Jun 19 11:02:09 2012 +0200 @@ -78,7 +78,7 @@ Keys keys = new Keys(true); AbstractNode an = new AbstractNode(keys); - NodeTreeModel model = new NodeTreeModel(); + final NodeTreeModel model = new NodeTreeModel(); model.setNode(an); assertEquals("Node set", Visualizer.findVisualizer(an), model.getRoot()); @@ -87,9 +87,34 @@ assertEquals("3 children", 3, model.getChildCount(model.getRoot())); keys.keys("2", "1", "3"); assertEquals("still 3 children", 3, model.getChildCount(model.getRoot())); + model.addTreeModelListener(new TreeModelListener() { + @Override + public void treeNodesChanged(TreeModelEvent e) { + } + + @Override + public void treeNodesInserted(TreeModelEvent e) { + } + + @Override + public void treeNodesRemoved(TreeModelEvent e) { + for (Object ch : e.getChildren()) { + VisualizerNode vn = (VisualizerNode)ch; + assertNotNull("No null to begin with", vn); + while (vn != model.getRoot()) { + assertNotNull("Each removed node should be under the root: " + ch, vn); + vn = (VisualizerNode) vn.getParent(); + } + } + } + + @Override + public void treeStructureChanged(TreeModelEvent e) { + } + }); + keys.keys("2"); assertEquals("1 children", 1, model.getChildCount(model.getRoot())); - assertEquals("No nodes created yet", 0, keys.cnt); }