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 178848
Collapse All | Expand All

(-)a/projectui/nbproject/project.xml (-1 / +1 lines)
Lines 185-191 Link Here
185
                    <build-prerequisite/>
185
                    <build-prerequisite/>
186
                    <compile-dependency/>
186
                    <compile-dependency/>
187
                    <run-dependency>
187
                    <run-dependency>
188
                        <specification-version>8.4</specification-version>
188
                        <specification-version>8.6</specification-version>
189
                    </run-dependency>
189
                    </run-dependency>
190
                </dependency>
190
                </dependency>
191
                <dependency>
191
                <dependency>
(-)a/projectui/src/org/netbeans/modules/project/ui/actions/MainProjectAction.java (-28 / +21 lines)
Lines 42-48 Link Here
42
package org.netbeans.modules.project.ui.actions;
42
package org.netbeans.modules.project.ui.actions;
43
43
44
import java.awt.Dialog;
44
import java.awt.Dialog;
45
import java.awt.EventQueue;
46
import java.awt.Toolkit;
45
import java.awt.Toolkit;
47
import java.awt.event.MouseEvent;
46
import java.awt.event.MouseEvent;
48
import java.beans.PropertyChangeEvent;
47
import java.beans.PropertyChangeEvent;
Lines 54-60 Link Here
54
import javax.swing.event.ChangeEvent;
53
import javax.swing.event.ChangeEvent;
55
import javax.swing.event.ChangeListener;
54
import javax.swing.event.ChangeListener;
56
import org.netbeans.api.project.Project;
55
import org.netbeans.api.project.Project;
57
import org.netbeans.api.project.ProjectManager;
58
import org.netbeans.api.project.ProjectUtils;
56
import org.netbeans.api.project.ProjectUtils;
59
import org.netbeans.api.project.ui.OpenProjects;
57
import org.netbeans.api.project.ui.OpenProjects;
60
import org.netbeans.modules.project.ui.NoMainProjectWarning;
58
import org.netbeans.modules.project.ui.NoMainProjectWarning;
Lines 69-74 Link Here
69
import org.openide.util.Lookup;
67
import org.openide.util.Lookup;
70
import org.openide.util.Mutex;
68
import org.openide.util.Mutex;
71
import org.openide.util.NbBundle;
69
import org.openide.util.NbBundle;
70
import org.openide.util.RequestProcessor;
72
import org.openide.util.WeakListeners;
71
import org.openide.util.WeakListeners;
73
72
74
/** Invokes command on the main project.
73
/** Invokes command on the main project.
Lines 80-85 Link Here
80
    private String command;
79
    private String command;
81
    private ProjectActionPerformer performer;
80
    private ProjectActionPerformer performer;
82
    private String name;
81
    private String name;
82
    static final RequestProcessor RP = new RequestProcessor(MainProjectAction.class);
83
83
84
    public MainProjectAction(ProjectActionPerformer performer, String name, Icon icon) {
84
    public MainProjectAction(ProjectActionPerformer performer, String name, Icon icon) {
85
        this( null, performer, name, icon );
85
        this( null, performer, name, icon );
Lines 178-192 Link Here
178
    public void propertyChange( PropertyChangeEvent evt ) {
178
    public void propertyChange( PropertyChangeEvent evt ) {
179
        if ( evt.getPropertyName() == OpenProjectList.PROPERTY_MAIN_PROJECT ||
179
        if ( evt.getPropertyName() == OpenProjectList.PROPERTY_MAIN_PROJECT ||
180
             evt.getPropertyName() == OpenProjectList.PROPERTY_OPEN_PROJECTS ) {
180
             evt.getPropertyName() == OpenProjectList.PROPERTY_OPEN_PROJECTS ) {
181
            Mutex.EVENT.readAccess(new Runnable() {
181
            refreshView(null);
182
                public void run() {
183
                    refreshView(null);
184
                }
185
            });
186
        }
182
        }
187
    }
183
    }
188
184
189
    private void refreshView(Lookup context) {
185
    private void refreshView(final Lookup context) {
186
        RP.post(new Runnable() {
187
            public @Override void run() {
190
188
191
        Project p = OpenProjectList.getDefault().getMainProject();
189
        Project p = OpenProjectList.getDefault().getMainProject();
192
        Lookup theContext = context;
190
        Lookup theContext = context;
Lines 211-238 Link Here
211
        }
209
        }
212
210
213
        boolean noOpenProject = OpenProjectList.getDefault ().getOpenProjects ().length == 0;
211
        boolean noOpenProject = OpenProjectList.getDefault ().getOpenProjects ().length == 0;
212
        Project mainProject = OpenProjectList.getDefault().getMainProject();
213
214
        final String presenterName = getPresenterName(name, mainProject, p);
215
        final boolean enabled;
214
216
215
        if ( command == null ) {
217
        if ( command == null ) {
216
            enable( performer.enable( p ) );
218
            enabled = performer.enable(p);
217
        }
219
        }
218
        else {
220
        else {
219
            if ( p == null ) {
221
            if ( p == null ) {
220
                enable(false);
222
                enabled = false;
221
            }
223
            }
222
            else if ( ActionsUtil.commandSupported ( p, command, Lookup.EMPTY ) ) {
224
            else if ( ActionsUtil.commandSupported ( p, command, Lookup.EMPTY ) ) {
223
                enable( !noOpenProject );
225
                enabled = !noOpenProject;
224
            }
226
            }
225
            else {
227
            else {
226
                enable( false );
228
                enabled = false;
227
            }
229
            }
228
        }
230
        }
229
231
230
        Project mainProject = OpenProjectList.getDefault().getMainProject();
232
        Mutex.EVENT.writeAccess(new Runnable() {
231
233
            public void run() {
232
        String presenterName = getPresenterName(name, mainProject, p);
233
        putValue("menuText", presenterName);
234
        putValue("menuText", presenterName);
234
        putValue(SHORT_DESCRIPTION, Actions.cutAmpersand(presenterName));
235
        putValue(SHORT_DESCRIPTION, Actions.cutAmpersand(presenterName));
235
236
        setEnabled(enabled);
237
            }
238
        });
239
            }
240
        });
236
    }
241
    }
237
242
238
    private String getPresenterName(String name, Project mPrj, Project cPrj) {
243
    private String getPresenterName(String name, Project mPrj, Project cPrj) {
Lines 253-270 Link Here
253
        return toReturn;
258
        return toReturn;
254
    }
259
    }
255
260
256
    private void enable(final boolean enable) {
257
        if (!EventQueue.isDispatchThread()) {
258
            EventQueue.invokeLater(new Runnable() {
259
                public void run() {
260
                    setEnabled(enable);
261
                }
262
            });
263
        } else {
264
            setEnabled(enable);
265
        }
266
    }
267
268
    private boolean showNoMainProjectWarning(Project[] projects, String action) {
261
    private boolean showNoMainProjectWarning(Project[] projects, String action) {
269
        boolean canceled;
262
        boolean canceled;
270
        final JButton okButton = new JButton (NbBundle.getMessage (NoMainProjectWarning.class, "LBL_NoMainClassWarning_ChooseMainProject_OK")); // NOI18N
263
        final JButton okButton = new JButton (NbBundle.getMessage (NoMainProjectWarning.class, "LBL_NoMainClassWarning_ChooseMainProject_OK")); // NOI18N
(-)a/projectui/test/unit/src/org/netbeans/modules/project/ui/actions/MainProjectActionTest.java (-3 / +2 lines)
Lines 40-45 Link Here
40
package org.netbeans.modules.project.ui.actions;
40
package org.netbeans.modules.project.ui.actions;
41
41
42
import java.awt.EventQueue;
42
import java.awt.EventQueue;
43
import java.util.concurrent.TimeUnit;
43
import javax.swing.Action;
44
import javax.swing.Action;
44
import org.netbeans.api.project.Project;
45
import org.netbeans.api.project.Project;
45
import org.netbeans.api.project.ui.OpenProjects;
46
import org.netbeans.api.project.ui.OpenProjects;
Lines 97-102 Link Here
97
        run.init();
98
        run.init();
98
        assertEquals("No calls to the Project when outside of AWT", 0, prj.counter);
99
        assertEquals("No calls to the Project when outside of AWT", 0, prj.counter);
99
        EventQueue.invokeAndWait(run);
100
        EventQueue.invokeAndWait(run);
101
        assertTrue(MainProjectAction.RP.awaitTermination(5, TimeUnit.MINUTES));
100
        assertEquals("One call to the Project from AWT", 2, prj.counter);
102
        assertEquals("One call to the Project from AWT", 2, prj.counter);
101
        run.finish();
103
        run.finish();
102
    }
104
    }
Lines 122-137 Link Here
122
124
123
        public String[] getSupportedActions() {
125
        public String[] getSupportedActions() {
124
            counter++;
126
            counter++;
125
            assertTrue("Need to be called from AWT thread", EventQueue.isDispatchThread());
126
            return new String[] { ActionProvider.COMMAND_BUILD };
127
            return new String[] { ActionProvider.COMMAND_BUILD };
127
        }
128
        }
128
129
129
        public void invokeAction(String command, Lookup context) throws IllegalArgumentException {
130
        public void invokeAction(String command, Lookup context) throws IllegalArgumentException {
130
            assertTrue("Need to be called from AWT thread", EventQueue.isDispatchThread());
131
        }
131
        }
132
132
133
        public boolean isActionEnabled(String command, Lookup context) throws IllegalArgumentException {
133
        public boolean isActionEnabled(String command, Lookup context) throws IllegalArgumentException {
134
            assertTrue("Need to be called from AWT thread", EventQueue.isDispatchThread());
135
            return true;
134
            return true;
136
        }
135
        }
137
    }
136
    }

Return to bug 178848