diff --git a/projectui/nbproject/project.xml b/projectui/nbproject/project.xml --- a/projectui/nbproject/project.xml +++ b/projectui/nbproject/project.xml @@ -185,7 +185,7 @@ - 8.4 + 8.6 diff --git a/projectui/src/org/netbeans/modules/project/ui/actions/MainProjectAction.java b/projectui/src/org/netbeans/modules/project/ui/actions/MainProjectAction.java --- a/projectui/src/org/netbeans/modules/project/ui/actions/MainProjectAction.java +++ b/projectui/src/org/netbeans/modules/project/ui/actions/MainProjectAction.java @@ -42,7 +42,6 @@ package org.netbeans.modules.project.ui.actions; import java.awt.Dialog; -import java.awt.EventQueue; import java.awt.Toolkit; import java.awt.event.MouseEvent; import java.beans.PropertyChangeEvent; @@ -54,7 +53,6 @@ import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import org.netbeans.api.project.Project; -import org.netbeans.api.project.ProjectManager; import org.netbeans.api.project.ProjectUtils; import org.netbeans.api.project.ui.OpenProjects; import org.netbeans.modules.project.ui.NoMainProjectWarning; @@ -69,6 +67,7 @@ import org.openide.util.Lookup; import org.openide.util.Mutex; import org.openide.util.NbBundle; +import org.openide.util.RequestProcessor; import org.openide.util.WeakListeners; /** Invokes command on the main project. @@ -80,6 +79,7 @@ private String command; private ProjectActionPerformer performer; private String name; + static final RequestProcessor RP = new RequestProcessor(MainProjectAction.class); public MainProjectAction(ProjectActionPerformer performer, String name, Icon icon) { this( null, performer, name, icon ); @@ -178,15 +178,13 @@ public void propertyChange( PropertyChangeEvent evt ) { if ( evt.getPropertyName() == OpenProjectList.PROPERTY_MAIN_PROJECT || evt.getPropertyName() == OpenProjectList.PROPERTY_OPEN_PROJECTS ) { - Mutex.EVENT.readAccess(new Runnable() { - public void run() { - refreshView(null); - } - }); + refreshView(null); } } - private void refreshView(Lookup context) { + private void refreshView(final Lookup context) { + RP.post(new Runnable() { + public @Override void run() { Project p = OpenProjectList.getDefault().getMainProject(); Lookup theContext = context; @@ -211,28 +209,35 @@ } boolean noOpenProject = OpenProjectList.getDefault ().getOpenProjects ().length == 0; + Project mainProject = OpenProjectList.getDefault().getMainProject(); + + final String presenterName = getPresenterName(name, mainProject, p); + final boolean enabled; if ( command == null ) { - enable( performer.enable( p ) ); + enabled = performer.enable(p); } else { if ( p == null ) { - enable(false); + enabled = false; } else if ( ActionsUtil.commandSupported ( p, command, Lookup.EMPTY ) ) { - enable( !noOpenProject ); + enabled = !noOpenProject; } else { - enable( false ); + enabled = false; } } - Project mainProject = OpenProjectList.getDefault().getMainProject(); - - String presenterName = getPresenterName(name, mainProject, p); + Mutex.EVENT.writeAccess(new Runnable() { + public void run() { putValue("menuText", presenterName); putValue(SHORT_DESCRIPTION, Actions.cutAmpersand(presenterName)); - + setEnabled(enabled); + } + }); + } + }); } private String getPresenterName(String name, Project mPrj, Project cPrj) { @@ -253,18 +258,6 @@ return toReturn; } - private void enable(final boolean enable) { - if (!EventQueue.isDispatchThread()) { - EventQueue.invokeLater(new Runnable() { - public void run() { - setEnabled(enable); - } - }); - } else { - setEnabled(enable); - } - } - private boolean showNoMainProjectWarning(Project[] projects, String action) { boolean canceled; final JButton okButton = new JButton (NbBundle.getMessage (NoMainProjectWarning.class, "LBL_NoMainClassWarning_ChooseMainProject_OK")); // NOI18N diff --git a/projectui/test/unit/src/org/netbeans/modules/project/ui/actions/MainProjectActionTest.java b/projectui/test/unit/src/org/netbeans/modules/project/ui/actions/MainProjectActionTest.java --- a/projectui/test/unit/src/org/netbeans/modules/project/ui/actions/MainProjectActionTest.java +++ b/projectui/test/unit/src/org/netbeans/modules/project/ui/actions/MainProjectActionTest.java @@ -40,6 +40,7 @@ package org.netbeans.modules.project.ui.actions; import java.awt.EventQueue; +import java.util.concurrent.TimeUnit; import javax.swing.Action; import org.netbeans.api.project.Project; import org.netbeans.api.project.ui.OpenProjects; @@ -97,6 +98,7 @@ run.init(); assertEquals("No calls to the Project when outside of AWT", 0, prj.counter); EventQueue.invokeAndWait(run); + assertTrue(MainProjectAction.RP.awaitTermination(5, TimeUnit.MINUTES)); assertEquals("One call to the Project from AWT", 2, prj.counter); run.finish(); } @@ -122,16 +124,13 @@ public String[] getSupportedActions() { counter++; - assertTrue("Need to be called from AWT thread", EventQueue.isDispatchThread()); return new String[] { ActionProvider.COMMAND_BUILD }; } public void invokeAction(String command, Lookup context) throws IllegalArgumentException { - assertTrue("Need to be called from AWT thread", EventQueue.isDispatchThread()); } public boolean isActionEnabled(String command, Lookup context) throws IllegalArgumentException { - assertTrue("Need to be called from AWT thread", EventQueue.isDispatchThread()); return true; } }