Index: projects/projectapi/src/org/netbeans/api/project/ProjectManager.java =================================================================== RCS file: /cvs/projects/projectapi/src/org/netbeans/api/project/ProjectManager.java,v retrieving revision 1.21 diff -u -r1.21 ProjectManager.java --- projects/projectapi/src/org/netbeans/api/project/ProjectManager.java 4 Apr 2006 04:05:56 -0000 1.21 +++ projects/projectapi/src/org/netbeans/api/project/ProjectManager.java 13 Jun 2006 04:48:15 -0000 @@ -308,7 +308,7 @@ * @return a project made from it, or null if it is not recognized * @throws IOException if there was a problem loading the project */ - private Project createProject(FileObject dir) throws IOException { + public Project createProject(FileObject dir) throws IOException { assert dir != null; assert dir.isFolder(); assert mutex().isReadAccess(); Index: projects/projectui/src/org/netbeans/modules/project/ui/ProjectsRootNode.java =================================================================== RCS file: /cvs/projects/projectui/src/org/netbeans/modules/project/ui/ProjectsRootNode.java,v retrieving revision 1.37 diff -u -r1.37 ProjectsRootNode.java --- projects/projectui/src/org/netbeans/modules/project/ui/ProjectsRootNode.java 4 Apr 2006 04:05:57 -0000 1.37 +++ projects/projectui/src/org/netbeans/modules/project/ui/ProjectsRootNode.java 13 Jun 2006 04:48:20 -0000 @@ -16,6 +16,7 @@ import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.CharConversionException; +import java.io.IOException; import java.lang.ref.WeakReference; import java.text.MessageFormat; import java.util.ArrayList; @@ -33,6 +34,7 @@ import javax.swing.event.ChangeListener; import org.netbeans.api.project.FileOwnerQuery; import org.netbeans.api.project.Project; +import org.netbeans.api.project.ProjectManager; import org.netbeans.api.project.ProjectUtils; import org.netbeans.api.project.Sources; import org.netbeans.spi.project.ui.LogicalViewProvider; @@ -40,7 +42,6 @@ import org.openide.filesystems.FileObject; import org.openide.filesystems.Repository; import org.openide.loaders.DataFolder; -import org.openide.loaders.DataObject; import org.openide.loaders.FolderLookup; import org.openide.nodes.AbstractNode; import org.openide.nodes.Children; @@ -239,7 +240,9 @@ } } else { - nodes = new Node[] { lvp.createLogicalView() }; + Node logical = lvp.createLogicalView(); + nodes = new Node[] { new FilterNode ( logical, + new SubprojectFilterChildren( logical, project )) }; if (nodes[0].getLookup().lookup(Project.class) != project) { // Various actions, badging, etc. are not going to work. ErrorManager.getDefault().log(ErrorManager.WARNING, "Warning - project " + ProjectUtils.getInformation(project).getName() + " failed to supply itself in the lookup of the root node of its own logical view"); // NOI18N @@ -376,6 +379,54 @@ return delegate.objectsToSearch(); } + } + + private static final class SubprojectFilterChildren extends Children.Keys { + private final Node orig; + private final Project proj; + SubprojectFilterChildren (Node orig, Project p) { + this.orig = orig; + this.proj = p; + } + + protected Node[] createNodes(Object key) { + Node n = (Node) key; + return new Node[] { new FilterNode (n) }; + } + + protected void addNotify() { + final List keys = new ArrayList ( + Arrays.asList(orig.getChildren().getNodes())); + + final FileObject[] kids = proj.getProjectDirectory().getChildren(); + final ProjectManager mgr = ProjectManager.getDefault(); + Runnable findProjects = new Runnable() { + public void run() { + for (int i=0; i < kids.length; i++) { + if (kids[i].isFolder() && mgr.isProject (kids[i])) { + try { + Project p = mgr.createProject(kids[i]); + + LogicalViewProvider lvp = (LogicalViewProvider) + p.getLookup().lookup ( + LogicalViewProvider.class ); + + if (lvp != null) { + Node n = lvp.createLogicalView(); + keys.add ( new FilterNode ( n, + new SubprojectFilterChildren( n, p )) ); + } + } catch ( IOException ioe ) { + ErrorManager.getDefault().notify ( + ErrorManager.INFORMATIONAL, ioe); + } + } + } + } + }; + mgr.mutex().readAccess(findProjects); + setKeys (keys); + } } }