diff -r 1f48f3eff75f openide.nodes/apichanges.xml --- a/openide.nodes/apichanges.xml Wed Sep 01 18:31:09 2010 +0200 +++ b/openide.nodes/apichanges.xml Thu Sep 02 18:43:18 2010 +0200 @@ -49,6 +49,23 @@ Nodes API + + + A mechanism to lazily update node's children. + + + + + +

+ Node has a new updateChildren() + protected method, that can be overriden to provide Children implementation + when node's children are needed. +

+
+ + +
New constructor of IndexedNode diff -r 1f48f3eff75f openide.nodes/manifest.mf --- a/openide.nodes/manifest.mf Wed Sep 01 18:31:09 2010 +0200 +++ b/openide.nodes/manifest.mf Thu Sep 02 18:43:18 2010 +0200 @@ -2,5 +2,5 @@ OpenIDE-Module: org.openide.nodes OpenIDE-Module-Localizing-Bundle: org/openide/nodes/Bundle.properties AutoUpdate-Essential-Module: true -OpenIDE-Module-Specification-Version: 7.17 +OpenIDE-Module-Specification-Version: 7.18 diff -r 1f48f3eff75f openide.nodes/src/org/openide/nodes/FilterNode.java --- a/openide.nodes/src/org/openide/nodes/FilterNode.java Wed Sep 01 18:31:09 2010 +0200 +++ b/openide.nodes/src/org/openide/nodes/FilterNode.java Thu Sep 02 18:43:18 2010 +0200 @@ -1049,7 +1049,7 @@ * setChildren will fire the appropriate events */ @Override - final void updateChildren() { + protected final org.openide.nodes.Children updateChildren(org.openide.nodes.Children origChildren) { if (isDefault()) { org.openide.nodes.Children newChildren = null; @@ -1066,16 +1066,10 @@ } if (newChildren != null) { - final org.openide.nodes.Children set = newChildren; - Children.MUTEX.postWriteRequest( - new Runnable() { - public void run() { - setChildren(set); - } - } - ); + return newChildren; } } + return origChildren; } /** An exception to be thrown from hashCode() to debug issue 46993. diff -r 1f48f3eff75f openide.nodes/src/org/openide/nodes/Node.java --- a/openide.nodes/src/org/openide/nodes/Node.java Wed Sep 01 18:31:09 2010 +0200 +++ b/openide.nodes/src/org/openide/nodes/Node.java Thu Sep 02 18:43:18 2010 +0200 @@ -461,10 +461,32 @@ return hierarchy; } - /** Can be overridden in subclasses (probably in FilterNode) to check + /** Can be called in subclasses (probably in FilterNode) to check * whether children are of the right subclass */ - void updateChildren() { + final void updateChildren() { + Children origChildren = hierarchy; + final Children newChildren = updateChildren(origChildren); + if (newChildren != origChildren && newChildren != null) { + Children.MUTEX.postWriteRequest( + new Runnable() { + public void run() { + setChildren(newChildren); + } + } + ); + } + } + + /** + * Can be overridden in subclasses to update the children of this node + * when someone asks for them. + * @param origChildren Original Children passed to the constructor. + * @return Children instance to be used instead of the original. + * @since 7.18 + */ + protected Children updateChildren(Children origChildren) { + return origChildren; } /** Allows to change Children of the node. Call to this method aquires diff -r 1f48f3eff75f openide.nodes/test/unit/src/org/openide/nodes/SetChildrenTest.java --- a/openide.nodes/test/unit/src/org/openide/nodes/SetChildrenTest.java Wed Sep 01 18:31:09 2010 +0200 +++ b/openide.nodes/test/unit/src/org/openide/nodes/SetChildrenTest.java Thu Sep 02 18:43:18 2010 +0200 @@ -261,6 +261,15 @@ GoldenEvent.assertEvents ( nl.getEvents(), goldenEvents, PropertyChangeEvent.class ); } + + /** Test whether updateChildren() is called and children are updated + */ + public void testUpdateChildren() { + TestNodeUCh n = new TestNodeUCh(Children.LEAF); + assertSame("Children not updated", n.newChildren, n.getChildren()); + n = new TestNodeUCh(Children.LEAF); + assertFalse("Children not updated, the node should not be leaf", n.isLeaf()); + } /** Tests property changes on old and new nodes @@ -290,6 +299,26 @@ } } + private static class TestNodeUCh extends AbstractNode { + + private Children origChildren; + Children newChildren = new Children.Array(); + + public TestNodeUCh( Children ch ) { + super( ch ); + origChildren = ch; + } + + @Override + protected Children updateChildren(Children origChildren) { + if (origChildren == this.origChildren) { + return newChildren; + } + return origChildren; + } + + } + /** Useful class for testing events. */