Index: projectui/src/org/netbeans/modules/project/ui/OpenProjectList.java =================================================================== RCS file: /cvs/projects/projectui/src/org/netbeans/modules/project/ui/OpenProjectList.java,v retrieving revision 1.31 diff -u -r1.31 OpenProjectList.java --- projectui/src/org/netbeans/modules/project/ui/OpenProjectList.java 12 Apr 2005 12:27:08 -0000 1.31 +++ projectui/src/org/netbeans/modules/project/ui/OpenProjectList.java 4 May 2005 15:11:42 -0000 @@ -45,6 +45,7 @@ import org.openide.filesystems.URLMapper; import org.openide.loaders.DataObject; import org.openide.loaders.DataObjectNotFoundException; +import org.openide.util.Lookup; /** * List of projects open in the GUI. @@ -398,8 +399,11 @@ private static void notifyOpened(Project p) { - ProjectOpenedHook hook = (ProjectOpenedHook)p.getLookup().lookup(ProjectOpenedHook.class); - if (hook != null) { + Lookup.Result result = p.getLookup().lookup(new Lookup.Template(ProjectOpenedHook.class)); + + for (Iterator i = result.allInstances().iterator(); i.hasNext(); ) { + ProjectOpenedHook hook = (ProjectOpenedHook) i.next(); + try { ProjectOpenedTrampoline.DEFAULT.projectOpened(hook); } catch (RuntimeException e) { @@ -409,8 +413,11 @@ } private static void notifyClosed(Project p) { - ProjectOpenedHook hook = (ProjectOpenedHook)p.getLookup().lookup(ProjectOpenedHook.class); - if (hook != null) { + Lookup.Result result = p.getLookup().lookup(new Lookup.Template(ProjectOpenedHook.class)); + + for (Iterator i = result.allInstances().iterator(); i.hasNext(); ) { + ProjectOpenedHook hook = (ProjectOpenedHook) i.next(); + try { ProjectOpenedTrampoline.DEFAULT.projectClosed(hook); } catch (RuntimeException e) { Index: projectui/test/unit/src/org/netbeans/modules/project/ui/OpenProjectListTest.java =================================================================== RCS file: /cvs/projects/projectui/test/unit/src/org/netbeans/modules/project/ui/OpenProjectListTest.java,v retrieving revision 1.3 diff -u -r1.3 OpenProjectListTest.java --- projectui/test/unit/src/org/netbeans/modules/project/ui/OpenProjectListTest.java 5 Apr 2005 07:53:58 -0000 1.3 +++ projectui/test/unit/src/org/netbeans/modules/project/ui/OpenProjectListTest.java 4 May 2005 15:11:42 -0000 @@ -30,6 +30,7 @@ import org.netbeans.junit.NbTestCase; import org.netbeans.modules.project.ui.actions.TestSupport; import org.netbeans.spi.project.SubprojectProvider; +import org.netbeans.spi.project.ui.ProjectOpenedHook; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileStateInvalidException; import org.openide.filesystems.FileUtil; @@ -156,6 +157,26 @@ assertFalse ("Project2 is closed.", OpenProjectList.getDefault ().isOpen (project2)); } + public void testProjectOpenedClosed() throws Exception { + ((TestSupport.TestProject) project1).setLookup(Lookups.fixed(new Object[] { + new TestProjectOpenedHookImpl(), + new TestProjectOpenedHookImpl(), + })); + + TestProjectOpenedHookImpl.opened = 0; + TestProjectOpenedHookImpl.closed = 0; + + OpenProjectList.getDefault().open(project1); + + assertEquals("both open hooks were called", 2, TestProjectOpenedHookImpl.opened); + assertEquals("no close hook was called", 0, TestProjectOpenedHookImpl.closed); + + OpenProjectList.getDefault().close(new Project[] {project1}); + + assertEquals("both open hooks were called", 2, TestProjectOpenedHookImpl.opened); + assertEquals("both close hooks were called", 2, TestProjectOpenedHookImpl.closed); + } + // helper code private static class MySubprojectProvider implements SubprojectProvider { @@ -224,4 +245,18 @@ } } + private static class TestProjectOpenedHookImpl extends ProjectOpenedHook { + + public static int opened = 0; + public static int closed = 0; + + protected void projectClosed() { + closed++; + } + + protected void projectOpened() { + opened++; + } + + } } Index: projectuiapi/apichanges.xml =================================================================== RCS file: /cvs/projects/projectuiapi/apichanges.xml,v retrieving revision 1.7 diff -u -r1.7 apichanges.xml --- projectuiapi/apichanges.xml 22 Jan 2005 22:10:50 -0000 1.7 +++ projectuiapi/apichanges.xml 4 May 2005 15:11:42 -0000 @@ -76,6 +76,30 @@ + + + The projectOpened and projectClosed methods are called on + all ProjectOpenedHook instances in the lookup. + + + + + +

+ This change is incompatible because a project type can return a lookup with several + ProjectOpenedHooks and depend on only first one being notified on open/close. + Such a code should be rewritten using org.openide.util.lookup.Lookups.exclude. +

+
+ +

+ The projectOpened and projectClosed methods are called on + all ProjectOpenedHook instances found in a project's lookup. +

+
+ +
+ Added open and close methods into OpenProjects class Index: projectuiapi/src/org/netbeans/spi/project/ui/ProjectOpenedHook.java =================================================================== RCS file: /cvs/projects/projectuiapi/src/org/netbeans/spi/project/ui/ProjectOpenedHook.java,v retrieving revision 1.4 diff -u -r1.4 ProjectOpenedHook.java --- projectuiapi/src/org/netbeans/spi/project/ui/ProjectOpenedHook.java 4 Jan 2005 20:40:50 -0000 1.4 +++ projectuiapi/src/org/netbeans/spi/project/ui/ProjectOpenedHook.java 4 May 2005 15:11:42 -0000 @@ -36,6 +36,7 @@ *

*

* An instance should be placed into a project's lookup to register it. + * All instances found in the lookup will be notified on project open and close. *

* @see org.netbeans.api.project.Project#getLookup * @author Jesse Glick