--- a/ide.ergonomics/arch.xml Tue Dec 06 20:06:01 2011 +0100 +++ a/ide.ergonomics/arch.xml Wed Dec 07 11:19:28 2011 +0100 @@ -655,6 +655,12 @@ +

+ Ergonomics import a special friend contract from projectuiapi module, + they rely on special property change event to be delivered: + . +

--- a/ide.ergonomics/nbproject/project.xml Tue Dec 06 20:06:01 2011 +0100 +++ a/ide.ergonomics/nbproject/project.xml Wed Dec 07 11:19:28 2011 +0100 @@ -73,7 +73,7 @@ 1 - 1.32 + 1.55 --- a/ide.ergonomics/src/org/netbeans/modules/ide/ergonomics/fod/FeatureProjectFactory.java Tue Dec 06 20:06:01 2011 +0100 +++ a/ide.ergonomics/src/org/netbeans/modules/ide/ergonomics/fod/FeatureProjectFactory.java Wed Dec 07 11:19:28 2011 +0100 @@ -91,6 +91,7 @@ import org.openide.filesystems.FileUtil; import org.openide.loaders.DataFolder; import org.openide.nodes.FilterNode; +import org.openide.util.RequestProcessor.Task; import org.xml.sax.SAXException; /** @@ -264,9 +265,14 @@ @Override public void run() { + final Project[] toCheck = OpenProjects.getDefault().getOpenProjects(); + checkProjects(toCheck); + } + + private void checkProjects(final Project[] toCheck) { final List additional = new ArrayList(); FeatureInfo f = null; - for (Project p : OpenProjects.getDefault().getOpenProjects()) { + for (Project p : toCheck) { Data d = new Data(p.getProjectDirectory(), true); for (FeatureInfo info : FeatureManager.features()) { switch (info.isProject(d)) { @@ -300,6 +306,19 @@ @Override public void propertyChange(PropertyChangeEvent evt) { + if ("willOpenProjects".equals(evt.getPropertyName())) { // NOI18N + final Object arr = evt.getNewValue(); + if (arr instanceof Project[]) { + Task t = FeatureManager.getInstance().create(new Runnable() { + @Override + public void run() { + checkProjects((Project[])arr); + } + }); + t.schedule(0); + t.waitFinished(); + } + } if (OpenProjects.PROPERTY_OPEN_PROJECTS.equals(evt.getPropertyName())) { RequestProcessor.Task t = FeatureManager.getInstance().create(this); t.schedule(0); --- a/projectui/src/org/netbeans/modules/project/ui/OpenProjectList.java Tue Dec 06 20:06:01 2011 +0100 +++ a/projectui/src/org/netbeans/modules/project/ui/OpenProjectList.java Wed Dec 07 11:19:28 2011 +0100 @@ -137,6 +137,7 @@ // Property names public static final String PROPERTY_OPEN_PROJECTS = "OpenProjects"; + public static final String PROPERTY_WILL_OPEN_PROJECTS = "willOpenProjects"; // NOI18N public static final String PROPERTY_MAIN_PROJECT = "MainProject"; public static final String PROPERTY_RECENT_PROJECTS = "RecentProjects"; public static final String PROPERTY_REPLACE = "ReplaceProject"; @@ -610,6 +611,16 @@ assert !Arrays.asList(projects).contains(null) : "Projects can't be null"; LOAD.waitFinished(); + pchSupport.firePropertyChange(PROPERTY_WILL_OPEN_PROJECTS, null, projects); + for (int i = 0; i < projects.length; i++) { + try { + projects[i] = ProjectManager.getDefault().findProject(projects[i].getProjectDirectory()); + } catch (IOException ex) { + LOGGER.log(Level.INFO, "Cannot convert " + projects[i].getProjectDirectory(), ex); + } catch (IllegalArgumentException ex) { + LOGGER.log(Level.INFO, "Cannot convert " + projects[i].getProjectDirectory(), ex); + } + } try { LOAD.enter(); --- a/projectui/src/org/netbeans/modules/project/ui/OpenProjectsTrampolineImpl.java Tue Dec 06 20:06:01 2011 +0100 +++ a/projectui/src/org/netbeans/modules/project/ui/OpenProjectsTrampolineImpl.java Wed Dec 07 11:19:28 2011 +0100 @@ -110,6 +110,9 @@ if ( e.getPropertyName().equals( OpenProjectList.PROPERTY_OPEN_PROJECTS ) ) { pchSupport.firePropertyChange( OpenProjects.PROPERTY_OPEN_PROJECTS, e.getOldValue(), e.getNewValue() ); } + if ( e.getPropertyName().equals( OpenProjectList.PROPERTY_WILL_OPEN_PROJECTS ) ) { + pchSupport.firePropertyChange( OpenProjectList.PROPERTY_WILL_OPEN_PROJECTS, e.getOldValue(), e.getNewValue() ); + } if ( e.getPropertyName().equals( OpenProjectList.PROPERTY_MAIN_PROJECT ) ) { pchSupport.firePropertyChange( OpenProjects.PROPERTY_MAIN_PROJECT, e.getOldValue(), e.getNewValue() ); } --- a/projectui/test/unit/src/org/netbeans/modules/project/ui/OpenProjectListTest.java Tue Dec 06 20:06:01 2011 +0100 +++ a/projectui/test/unit/src/org/netbeans/modules/project/ui/OpenProjectListTest.java Wed Dec 07 11:19:28 2011 +0100 @@ -174,7 +174,7 @@ assertEquals(1, list.oldCount); assertEquals(0, list.newCount); } - + @RandomlyFails // locally, in 2nd check of f1_1_open public void testClose () throws Exception { testOpen (); --- a/projectui/test/unit/src/org/netbeans/modules/project/ui/OpenProjectsTest.java Tue Dec 06 20:06:01 2011 +0100 +++ a/projectui/test/unit/src/org/netbeans/modules/project/ui/OpenProjectsTest.java Wed Dec 07 11:19:28 2011 +0100 @@ -130,12 +130,49 @@ assertFalse(Arrays.asList((Project[])e.getNewValue()).contains(testProject)); } + public void testPreListenerOpenClose () throws Exception { + assertEquals("No project is open.", 0, OpenProjects.getDefault ().getOpenProjects ().length); + class MyListener implements PropertyChangeListener { + PropertyChangeEvent preEvent; + + @Override + public void propertyChange(PropertyChangeEvent evt) { + if ("willOpenProjects".equals(evt.getPropertyName())) { + assertNull("Only one event expected", preEvent); + preEvent = evt; + assertEquals("No open projects yet", 0, OpenProjects.getDefault().getOpenProjects().length); + } + } + } + MyListener list = new MyListener(); + try { + OpenProjects.getDefault().addPropertyChangeListener(list); + OpenProjects.getDefault ().open (new Project[] { testProject }, true); + assertNotNull("Pre event delivered", list.preEvent); + assertNull("No old value", list.preEvent.getOldValue()); + assertTrue("Array is new value", list.preEvent.getNewValue() instanceof Project[]); + Project[] arr = (Project[]) list.preEvent.getNewValue(); + assertEquals("Length is one", 1, arr.length); + assertEquals("Same as our project", testProject, arr[0]); + + list.preEvent = null; + OpenProjectList.getDefault().close(new Project[] {testProject}, false); + assertNull("No pre-event delivered on close", list.preEvent); + } finally { + OpenProjects.getDefault().removePropertyChangeListener(list); + } + } + private static final class PropertyChangeListenerImpl implements PropertyChangeListener { private List events = new ArrayList(); + @Override public void propertyChange(PropertyChangeEvent evt) { + if ("willOpenProjects".equals(evt.getPropertyName())) { + return; + } events.add(evt); } --- a/projectui/test/unit/src/org/netbeans/modules/project/ui/OpenProjectsTrampolineImplTest.java Tue Dec 06 20:06:01 2011 +0100 +++ a/projectui/test/unit/src/org/netbeans/modules/project/ui/OpenProjectsTrampolineImplTest.java Wed Dec 07 11:19:28 2011 +0100 @@ -157,7 +157,11 @@ List events = new ArrayList(); + @Override public void propertyChange( PropertyChangeEvent e ) { + if ("willOpenProjects".equals(e.getPropertyName())) { + return; + } events.add( e ); } --- a/projectuiapi/apichanges.xml Tue Dec 06 20:06:01 2011 +0100 +++ a/projectuiapi/apichanges.xml Wed Dec 07 11:19:28 2011 +0100 @@ -107,6 +107,23 @@ + + + Will open project notification + + + + + +

+ A + new friend contract added for benefit of ide.ergonomics + module. +

+
+ + +
Added definesMainProject property to wizards --- a/projectuiapi/arch.xml Tue Dec 06 20:06:01 2011 +0100 +++ a/projectuiapi/arch.xml Wed Dec 07 11:19:28 2011 +0100 @@ -543,7 +543,16 @@ -->

- No. + + Since version 1.55 a special + PropertyChangeEvent is generated for benefit of ide.ergonomics + module by + OpenProjects.getDefault(). The property name of the event is "willOpenProjects" + and its new value contains an array of project that will be opened (a type + Project[]). Ergonomics module uses this information to enable + modules that seem to provide support for technologies used in the about + to be opened projects. +

--- a/projectuiapi/nbproject/project.properties Tue Dec 06 20:06:01 2011 +0100 +++ a/projectuiapi/nbproject/project.properties Wed Dec 07 11:19:28 2011 +0100 @@ -42,7 +42,7 @@ javac.compilerargs=-Xlint -Xlint:-serial javac.source=1.6 -spec.version.base=1.54.0 +spec.version.base=1.55.0 is.autoload=true javadoc.arch=${basedir}/arch.xml javadoc.apichanges=${basedir}/apichanges.xml