Index: loaders/src/org/openide/loaders/FolderChildren.java =================================================================== RCS file: /cvs/openide/loaders/src/org/openide/loaders/FolderChildren.java,v retrieving revision 1.4 diff -u -r1.4 FolderChildren.java --- loaders/src/org/openide/loaders/FolderChildren.java 26 May 2004 13:11:51 -0000 1.4 +++ loaders/src/org/openide/loaders/FolderChildren.java 5 Jun 2004 12:02:10 -0000 @@ -15,6 +15,8 @@ import java.beans.*; import java.util.*; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; import org.openide.ErrorManager; import org.openide.filesystems.FileObject; @@ -29,7 +31,7 @@ * @author Jaroslav Tulach */ final class FolderChildren extends Children.Keys -implements PropertyChangeListener { +implements PropertyChangeListener, ChangeListener { /** the folder */ private DataFolder folder; /** filter of objects */ @@ -95,6 +97,14 @@ return; } } + + public void stateChanged( ChangeEvent e ) { + // Filtering changed need to recompute children + setKeys( Collections.EMPTY_SET ); + refreshChildren().schedule(0); + postClearTask(); + return; + } /** * refreshRunnable holds references to the data object @@ -198,6 +208,10 @@ protected void addNotify () { // add as a listener for changes on nodes folder.addPropertyChangeListener (listener); + // add listener to the filter + if ( filter instanceof ChangeableDataFilter ) { + ((ChangeableDataFilter)filter).addChangeListener( this ); + } // active = true; // start the refresh task to compute the children @@ -209,6 +223,10 @@ protected void removeNotify () { // removes the listener folder.removePropertyChangeListener (listener); + // remove listener from filter + if ( filter instanceof ChangeableDataFilter ) { + ((ChangeableDataFilter)filter).removeChangeListener( this ); + } // active = false; // we don't call the setKeys directly here because Index: test/unit/src/org/openide/loaders/FolderChildrenTest.java =================================================================== RCS file: /cvs/openide/test/unit/src/org/openide/loaders/FolderChildrenTest.java,v retrieving revision 1.2 diff -u -r1.2 FolderChildrenTest.java --- test/unit/src/org/openide/loaders/FolderChildrenTest.java 16 Oct 2002 06:09:25 -0000 1.2 +++ test/unit/src/org/openide/loaders/FolderChildrenTest.java 5 Jun 2004 12:02:11 -0000 @@ -16,6 +16,8 @@ import java.io.IOException; import java.util.*; import javax.swing.SwingUtilities; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; import org.openide.filesystems.*; import org.openide.loaders.*; @@ -25,6 +27,8 @@ import org.netbeans.junit.*; import java.util.Enumeration; import org.openide.nodes.Node; +import org.openide.nodes.Children; + public class FolderChildrenTest extends NbTestCase { public FolderChildrenTest() { @@ -80,7 +84,33 @@ assertTrue ("Second one is the same", last[1] == arr[1]); } + + public void testChangeableDataFilter() throws Exception { + setupSystemProperties(); + + FileSystem fs = Repository.getDefault ().getDefaultFileSystem(); + FileUtil.createData (fs.getRoot (), "BB/A.txt"); + FileUtil.createData (fs.getRoot (), "BB/B.txt"); + FileUtil.createData (fs.getRoot (), "BB/AA.txt"); + FileUtil.createData (fs.getRoot (), "BB/BA.txt"); + + + FileObject bb = fs.findResource("/BB"); + + Filter filter = new Filter(); + DataFolder folder = DataFolder.findFolder (bb); + + Children ch = folder.createNodeChildren( filter ); + Node[] arr = ch.getNodes (true); + + assertNodes( arr, new String[] { "A.txt", "AA.txt" } ); + filter.fire(); + arr = ch.getNodes (true); + assertNodes( arr, new String[] { "B.txt", "BA.txt" } ); + + } + public static class N1 extends org.openide.nodes.AbstractNode implements Node.Cookie { public N1 () { @@ -111,4 +141,53 @@ public static final class N2 extends N1 { } + + + private void assertNodes( Node[] nodes, String names[] ) { + + assertEquals( "Wrong number of nodes.", names.length, nodes.length ); + + for( int i = 0; i < nodes.length; i++ ) { + System.out.println("Display Name :" + nodes[i].getName() + ":"); + assertEquals( "Wrong name at index " + i + ".", names[i], nodes[i].getName() ); + } + + } + + private static class Filter implements ChangeableDataFilter { + + private boolean selectA = true; + + ArrayList listeners = new ArrayList(); + + public boolean acceptDataObject (DataObject obj) { + String fileName = obj.getPrimaryFile().getName(); + boolean select = fileName.startsWith( "A" ); + select = selectA ? select : !select; + System.out.println("FILTERING " + fileName + " : " + select ); + return select; + } + + public void addChangeListener( ChangeListener listener ) { + listeners.add( listener ); + } + + public void removeChangeListener( ChangeListener listener ) { + listeners.remove( listener ); + } + + public void fire( ) { + + selectA = !selectA; + + ChangeEvent che = new ChangeEvent( this ); + + for( Iterator it = listeners.iterator(); it.hasNext(); ) { + ChangeListener chl = (ChangeListener)it.next(); + chl.stateChanged( che ); + } + } + + } + }