This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

View | Details | Raw Unified | Return to bug 203220
Collapse All | Expand All

(-)a/ide.ergonomics/arch.xml (+6 lines)
Lines 655-660 Link Here
655
        </api>
655
        </api>
656
    </li>
656
    </li>
657
  </ul>
657
  </ul>
658
  <p>
659
      Ergonomics import a special friend contract from projectuiapi module, 
660
      they rely on special property change event to be delivered:
661
      <api name="willOpenProjects" category="friend" group="property" type="import"
662
         url="@org-netbeans-modules-projectuiapi@/architecture-overview.html#property-willOpenProjects"/>.
663
  </p>
658
 </answer>
664
 </answer>
659
665
660
666
(-)a/ide.ergonomics/nbproject/project.xml (-1 / +1 lines)
Lines 73-79 Link Here
73
                    <compile-dependency/>
73
                    <compile-dependency/>
74
                    <run-dependency>
74
                    <run-dependency>
75
                        <release-version>1</release-version>
75
                        <release-version>1</release-version>
76
                        <specification-version>1.32</specification-version>
76
                        <specification-version>1.55</specification-version>
77
                    </run-dependency>
77
                    </run-dependency>
78
                </dependency>
78
                </dependency>
79
                <dependency>
79
                <dependency>
(-)a/ide.ergonomics/src/org/netbeans/modules/ide/ergonomics/fod/FeatureProjectFactory.java (-1 / +20 lines)
Lines 91-96 Link Here
91
import org.openide.filesystems.FileUtil;
91
import org.openide.filesystems.FileUtil;
92
import org.openide.loaders.DataFolder;
92
import org.openide.loaders.DataFolder;
93
import org.openide.nodes.FilterNode;
93
import org.openide.nodes.FilterNode;
94
import org.openide.util.RequestProcessor.Task;
94
import org.xml.sax.SAXException;
95
import org.xml.sax.SAXException;
95
96
96
/**
97
/**
Lines 264-272 Link Here
264
265
265
    @Override
266
    @Override
266
    public void run() {
267
    public void run() {
268
        final Project[] toCheck = OpenProjects.getDefault().getOpenProjects();
269
        checkProjects(toCheck);
270
    }
271
272
    private void checkProjects(final Project[] toCheck) {
267
        final List<FeatureInfo> additional = new ArrayList<FeatureInfo>();
273
        final List<FeatureInfo> additional = new ArrayList<FeatureInfo>();
268
        FeatureInfo f = null;
274
        FeatureInfo f = null;
269
        for (Project p : OpenProjects.getDefault().getOpenProjects()) {
275
        for (Project p : toCheck) {
270
            Data d = new Data(p.getProjectDirectory(), true);
276
            Data d = new Data(p.getProjectDirectory(), true);
271
            for (FeatureInfo info : FeatureManager.features()) {
277
            for (FeatureInfo info : FeatureManager.features()) {
272
                switch (info.isProject(d)) {
278
                switch (info.isProject(d)) {
Lines 300-305 Link Here
300
306
301
    @Override
307
    @Override
302
    public void propertyChange(PropertyChangeEvent evt) {
308
    public void propertyChange(PropertyChangeEvent evt) {
309
        if ("willOpenProjects".equals(evt.getPropertyName())) { // NOI18N
310
            final Object arr = evt.getNewValue();
311
            if (arr instanceof Project[]) {
312
                Task t = FeatureManager.getInstance().create(new Runnable() {
313
                    @Override
314
                    public void run() {
315
                        checkProjects((Project[])arr);
316
                    }
317
                });
318
                t.schedule(0);
319
                t.waitFinished();
320
            }
321
        }
303
        if (OpenProjects.PROPERTY_OPEN_PROJECTS.equals(evt.getPropertyName())) {
322
        if (OpenProjects.PROPERTY_OPEN_PROJECTS.equals(evt.getPropertyName())) {
304
            RequestProcessor.Task t = FeatureManager.getInstance().create(this);
323
            RequestProcessor.Task t = FeatureManager.getInstance().create(this);
305
            t.schedule(0);
324
            t.schedule(0);
(-)a/projectui/src/org/netbeans/modules/project/ui/OpenProjectList.java (+11 lines)
Lines 137-142 Link Here
137
    
137
    
138
    // Property names
138
    // Property names
139
    public static final String PROPERTY_OPEN_PROJECTS = "OpenProjects";
139
    public static final String PROPERTY_OPEN_PROJECTS = "OpenProjects";
140
    public static final String PROPERTY_WILL_OPEN_PROJECTS = "willOpenProjects"; // NOI18N
140
    public static final String PROPERTY_MAIN_PROJECT = "MainProject";
141
    public static final String PROPERTY_MAIN_PROJECT = "MainProject";
141
    public static final String PROPERTY_RECENT_PROJECTS = "RecentProjects";
142
    public static final String PROPERTY_RECENT_PROJECTS = "RecentProjects";
142
    public static final String PROPERTY_REPLACE = "ReplaceProject";
143
    public static final String PROPERTY_REPLACE = "ReplaceProject";
Lines 610-615 Link Here
610
        assert !Arrays.asList(projects).contains(null) : "Projects can't be null";
611
        assert !Arrays.asList(projects).contains(null) : "Projects can't be null";
611
        LOAD.waitFinished();
612
        LOAD.waitFinished();
612
            
613
            
614
        pchSupport.firePropertyChange(PROPERTY_WILL_OPEN_PROJECTS, null, projects);
615
        for (int i = 0; i < projects.length; i++) {
616
            try {
617
                projects[i] = ProjectManager.getDefault().findProject(projects[i].getProjectDirectory());
618
            } catch (IOException ex) {
619
                LOGGER.log(Level.INFO, "Cannot convert " + projects[i].getProjectDirectory(), ex);
620
            } catch (IllegalArgumentException ex) {
621
                LOGGER.log(Level.INFO, "Cannot convert " + projects[i].getProjectDirectory(), ex);
622
            }
623
        }
613
            
624
            
614
        try {
625
        try {
615
            LOAD.enter();
626
            LOAD.enter();
(-)a/projectui/src/org/netbeans/modules/project/ui/OpenProjectsTrampolineImpl.java (+3 lines)
Lines 110-115 Link Here
110
        if ( e.getPropertyName().equals( OpenProjectList.PROPERTY_OPEN_PROJECTS ) ) {        
110
        if ( e.getPropertyName().equals( OpenProjectList.PROPERTY_OPEN_PROJECTS ) ) {        
111
            pchSupport.firePropertyChange( OpenProjects.PROPERTY_OPEN_PROJECTS, e.getOldValue(), e.getNewValue() );
111
            pchSupport.firePropertyChange( OpenProjects.PROPERTY_OPEN_PROJECTS, e.getOldValue(), e.getNewValue() );
112
        }
112
        }
113
        if ( e.getPropertyName().equals( OpenProjectList.PROPERTY_WILL_OPEN_PROJECTS ) ) {        
114
            pchSupport.firePropertyChange( OpenProjectList.PROPERTY_WILL_OPEN_PROJECTS, e.getOldValue(), e.getNewValue() );
115
        }
113
        if ( e.getPropertyName().equals( OpenProjectList.PROPERTY_MAIN_PROJECT ) ) {        
116
        if ( e.getPropertyName().equals( OpenProjectList.PROPERTY_MAIN_PROJECT ) ) {        
114
            pchSupport.firePropertyChange( OpenProjects.PROPERTY_MAIN_PROJECT, e.getOldValue(), e.getNewValue() );
117
            pchSupport.firePropertyChange( OpenProjects.PROPERTY_MAIN_PROJECT, e.getOldValue(), e.getNewValue() );
115
        }
118
        }
(-)a/projectui/test/unit/src/org/netbeans/modules/project/ui/OpenProjectListTest.java (-1 / +1 lines)
Lines 174-180 Link Here
174
        assertEquals(1, list.oldCount);
174
        assertEquals(1, list.oldCount);
175
        assertEquals(0, list.newCount);
175
        assertEquals(0, list.newCount);
176
    }
176
    }
177
177
    
178
    @RandomlyFails // locally, in 2nd check of f1_1_open
178
    @RandomlyFails // locally, in 2nd check of f1_1_open
179
    public void testClose () throws Exception {
179
    public void testClose () throws Exception {
180
        testOpen ();
180
        testOpen ();
(-)a/projectui/test/unit/src/org/netbeans/modules/project/ui/OpenProjectsTest.java (+37 lines)
Lines 130-141 Link Here
130
        assertFalse(Arrays.asList((Project[])e.getNewValue()).contains(testProject));
130
        assertFalse(Arrays.asList((Project[])e.getNewValue()).contains(testProject));
131
    }
131
    }
132
    
132
    
133
    public void testPreListenerOpenClose () throws Exception {
134
        assertEquals("No project is open.", 0, OpenProjects.getDefault ().getOpenProjects ().length); 
135
        class MyListener implements PropertyChangeListener {
136
            PropertyChangeEvent preEvent;
137
            
138
            @Override
139
            public void propertyChange(PropertyChangeEvent evt) {
140
                if ("willOpenProjects".equals(evt.getPropertyName())) {
141
                    assertNull("Only one event expected", preEvent);
142
                    preEvent = evt;
143
                    assertEquals("No open projects yet", 0, OpenProjects.getDefault().getOpenProjects().length);
144
                }
145
            }
146
        }
147
        MyListener list = new MyListener();
148
        try {
149
            OpenProjects.getDefault().addPropertyChangeListener(list);
150
            OpenProjects.getDefault ().open (new Project[] { testProject }, true);
151
            assertNotNull("Pre event delivered", list.preEvent);
152
            assertNull("No old value", list.preEvent.getOldValue());
153
            assertTrue("Array is new value", list.preEvent.getNewValue() instanceof Project[]);
154
            Project[] arr = (Project[]) list.preEvent.getNewValue();
155
            assertEquals("Length is one", 1, arr.length);
156
            assertEquals("Same as our project", testProject, arr[0]);
157
158
            list.preEvent = null;
159
            OpenProjectList.getDefault().close(new Project[] {testProject}, false);
160
            assertNull("No pre-event delivered on close", list.preEvent);
161
        } finally {
162
            OpenProjects.getDefault().removePropertyChangeListener(list);
163
        }
164
    }
165
133
    
166
    
134
    private static final class PropertyChangeListenerImpl implements PropertyChangeListener {
167
    private static final class PropertyChangeListenerImpl implements PropertyChangeListener {
135
        
168
        
136
        private List<PropertyChangeEvent> events = new ArrayList<PropertyChangeEvent>();
169
        private List<PropertyChangeEvent> events = new ArrayList<PropertyChangeEvent>();
137
        
170
        
171
        @Override
138
        public void propertyChange(PropertyChangeEvent evt) {
172
        public void propertyChange(PropertyChangeEvent evt) {
173
            if ("willOpenProjects".equals(evt.getPropertyName())) {
174
                return;
175
            }
139
            events.add(evt);
176
            events.add(evt);
140
        }
177
        }
141
        
178
        
(-)a/projectui/test/unit/src/org/netbeans/modules/project/ui/OpenProjectsTrampolineImplTest.java (+4 lines)
Lines 157-163 Link Here
157
        
157
        
158
        List<PropertyChangeEvent> events = new ArrayList<PropertyChangeEvent>();
158
        List<PropertyChangeEvent> events = new ArrayList<PropertyChangeEvent>();
159
        
159
        
160
        @Override
160
        public void propertyChange( PropertyChangeEvent e ) {
161
        public void propertyChange( PropertyChangeEvent e ) {
162
            if ("willOpenProjects".equals(e.getPropertyName())) {
163
                return;
164
            }
161
            events.add( e );
165
            events.add( e );
162
        }
166
        }
163
        
167
        
(-)a/projectuiapi/apichanges.xml (+17 lines)
Lines 107-112 Link Here
107
    <!-- ACTUAL CHANGES BEGIN HERE: -->
107
    <!-- ACTUAL CHANGES BEGIN HERE: -->
108
108
109
    <changes>
109
    <changes>
110
        <change id="willOpenProjects">
111
            <api name="general"/>
112
            <summary>Will open project notification</summary>
113
            <version major="1" minor="55"/>
114
            <date day="12" month="12" year="2011"/>
115
            <author login="jtulach"/>
116
            <compatibility addition="yes"/>
117
            <description>
118
                <p>
119
                    A <a href="@TOP@/architecture-summary.html#property-willOpenProjects">
120
                    new friend contract</a> added for benefit of ide.ergonomics
121
                    module.
122
                </p>
123
            </description>
124
            <class package="org.netbeans.api.project.ui" name="OpenProjects"/>
125
            <issue number="203220"/>
126
        </change>
110
        <change id="Templates.definesMainProject">
127
        <change id="Templates.definesMainProject">
111
            <api name="general"/>
128
            <api name="general"/>
112
            <summary>Added <code>definesMainProject</code> property to wizards</summary>
129
            <summary>Added <code>definesMainProject</code> property to wizards</summary>
(-)a/projectuiapi/arch.xml (-1 / +10 lines)
Lines 543-549 Link Here
543
-->
543
-->
544
 <answer id="exec-property">
544
 <answer id="exec-property">
545
  <p>
545
  <p>
546
   No.
546
   <api name="willOpenProjects" category="friend" group="property" type="export">
547
   Since version 1.55 a special <a href="@JDK@/java/beans/PropertyChangeEvent.html">
548
   PropertyChangeEvent</a> is generated for benefit of <code>ide.ergonomics</code>
549
   module by <a href="@TOP@/org/netbeans/api/project/ui/OpenProjects.html#getDefault()">
550
   OpenProjects.getDefault()</a>. The property name of the event is <code>"willOpenProjects"</code>
551
   and its new value contains an array of project that will be opened (a type
552
   <code>Project[]</code>). Ergonomics module uses this information to enable
553
   modules that seem to provide support for technologies used in the about 
554
   to be opened projects.
555
   </api>
547
  </p>
556
  </p>
548
 </answer>
557
 </answer>
549
558
(-)a/projectuiapi/nbproject/project.properties (-1 / +1 lines)
Lines 42-48 Link Here
42
42
43
javac.compilerargs=-Xlint -Xlint:-serial
43
javac.compilerargs=-Xlint -Xlint:-serial
44
javac.source=1.6
44
javac.source=1.6
45
spec.version.base=1.54.0
45
spec.version.base=1.55.0
46
is.autoload=true
46
is.autoload=true
47
javadoc.arch=${basedir}/arch.xml
47
javadoc.arch=${basedir}/arch.xml
48
javadoc.apichanges=${basedir}/apichanges.xml
48
javadoc.apichanges=${basedir}/apichanges.xml

Return to bug 203220