# HG changeset patch # Parent 0edd2af566c8c834175175f85d837a37d070a91f diff -r 0edd2af566c8 apisupport.ant/src/org/netbeans/modules/apisupport/project/resources/layer.xml --- a/apisupport.ant/src/org/netbeans/modules/apisupport/project/resources/layer.xml Tue Jan 10 10:14:33 2012 +0100 +++ b/apisupport.ant/src/org/netbeans/modules/apisupport/project/resources/layer.xml Thu Jan 12 15:14:32 2012 +0100 @@ -3,6 +3,136 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff -r 0edd2af566c8 apisupport.ant/src/org/netbeans/modules/apisupport/project/ui/ModuleActions.java --- a/apisupport.ant/src/org/netbeans/modules/apisupport/project/ui/ModuleActions.java Tue Jan 10 10:14:33 2012 +0100 +++ b/apisupport.ant/src/org/netbeans/modules/apisupport/project/ui/ModuleActions.java Thu Jan 12 15:14:32 2012 +0100 @@ -44,7 +44,6 @@ package org.netbeans.modules.apisupport.project.ui; -import java.awt.event.ActionEvent; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; @@ -60,7 +59,6 @@ import java.util.Set; import java.util.regex.Pattern; import javax.lang.model.element.TypeElement; -import javax.swing.AbstractAction; import javax.swing.Action; import org.apache.tools.ant.module.api.support.ActionUtils; import org.netbeans.api.annotations.common.CheckForNull; @@ -70,6 +68,7 @@ import org.netbeans.api.java.project.runner.JavaRunner; import org.netbeans.api.java.source.ElementHandle; import org.netbeans.api.java.source.SourceUtils; +import org.netbeans.api.project.Project; import org.netbeans.api.project.ProjectManager; import org.netbeans.modules.apisupport.project.NbModuleProject; import org.netbeans.modules.apisupport.project.NbModuleType; @@ -88,11 +87,12 @@ import org.netbeans.spi.project.support.ant.GeneratedFilesHelper; import org.netbeans.spi.project.ui.support.CommonProjectActions; import org.netbeans.spi.project.ui.support.DefaultProjectOperations; +import org.netbeans.spi.project.ui.support.ProjectActionPerformer; import org.netbeans.spi.project.ui.support.ProjectSensitiveActions; import org.openide.DialogDisplayer; import org.openide.ErrorManager; import org.openide.NotifyDescriptor; -import org.openide.actions.FindAction; +import org.openide.awt.DynamicMenuContent; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; import org.openide.util.Exceptions; @@ -102,7 +102,7 @@ import org.openide.util.RequestProcessor; import org.openide.util.Task; import org.openide.util.Utilities; -import org.openide.util.actions.SystemAction; +import org.openide.util.lookup.Lookups; public final class ModuleActions implements ActionProvider, ExecProject { static final String TEST_USERDIR_LOCK_PROP_NAME = "run.args.ide"; // NOI18N @@ -115,6 +115,270 @@ private static final RequestProcessor RP = new RequestProcessor(ModuleActions.class); + final public static class ActionFactory { + public static Action unitTestAction() { + Action a = ProjectSensitiveActions.projectSensitiveAction(new ProjectActionPerformer() { + + @Override + public boolean enable(Project project) { + if (!(project instanceof NbModuleProject)) return false; + if (!((NbModuleProject)project).supportedTestTypes().contains("unit")) return false; // NOI18N + + ActionProvider ap = project.getLookup().lookup(ActionProvider.class); + if (ap == null) return false; + + return ap.isActionEnabled(ActionProvider.COMMAND_TEST, Lookups.singleton(project)); + } + + @Override + public void perform(Project project) { + assert project != null; + + ActionProvider ap = project.getLookup().lookup(ActionProvider.class); + if (ap != null) { + ap.invokeAction(ActionProvider.COMMAND_TEST, Lookups.singleton(project)); + } + } + }, NbBundle.getMessage(ModuleActions.class, "ACTION_test"), null); // NOi18N + + a.putValue(DynamicMenuContent.HIDE_WHEN_DISABLED, true); + + return a; + } + + public static Action checkBundleAction() { + final Action[] as = new Action[1]; + Action a = ProjectSensitiveActions.projectSensitiveAction(new ProjectActionPerformer() { + + @Override + public boolean enable(Project project) { + if (!(project instanceof NbModuleProject)) return false; + + NbModuleProject nProject = (NbModuleProject)project; + + if (as[0] != null) { + as[0].putValue(DynamicMenuContent.HIDE_WHEN_DISABLED, nProject.getModuleType() != NbModuleType.NETBEANS_ORG); + } + + return findMonitorXml(nProject) != null && + nProject.getPathWithinNetBeansOrg() != null; + } + + @Override + public void perform(Project project) { + assert project != null; + assert project instanceof NbModuleProject; + + Properties props = new Properties(); + + NbModuleProject nProject = (NbModuleProject)project; + props.put("modules", nProject.getPathWithinNetBeansOrg()); // NOI18N + props.put("fixedmodules", ""); // NOI18N + try { + ActionUtils.runTarget(findMonitorXml(nProject), new String[] {"check-bundle-usage"}, props); // NOI18N + } catch (IOException e) { + Util.err.notify(e); + } + } + + private FileObject findMonitorXml(NbModuleProject project) { + return project.getNbrootFileObject("nbbuild/monitor.xml"); // NOI18N + } + }, NbBundle.getMessage(ModuleActions.class, "ACTION_unused_bundle_keys"), null); + + as[0] = a; + return a; + } + + public static Action reloadAction() { + Action a = ProjectSensitiveActions.projectSensitiveAction(new ProjectActionPerformer() { + + @Override + public boolean enable(Project project) { + if (!(project instanceof NbModuleProject)) return false; + + NbModuleProject nProject = (NbModuleProject)project; + + if (findBuildXml(nProject) == null) { + return false; + } + if (Boolean.parseBoolean(nProject.evaluator().getProperty("is.autoload")) || Boolean.parseBoolean(nProject.evaluator().getProperty("is.eager"))) { // NOI18N + return false; // #86395 + } + return nProject.getTestUserDirLockFile().isFile(); + } + + @Override + public void perform(Project project) { + assert project != null; + assert project instanceof NbModuleProject; + + NbModuleProject nProject = (NbModuleProject)project; + + if (!verifySufficientlyNewHarness(nProject)) { + return; + } + + try { + ActionUtils.runTarget(findBuildXml(nProject), new String[]{"reload"}, null); + } catch (IOException e) { + Util.err.notify(e); + } + } + }, NbBundle.getMessage(ModuleActions.class, "ACTION_reload"), null); + + return a; + } + + public static Action reloadInIdeAction() { + Action a = ProjectSensitiveActions.projectSensitiveAction(new ProjectActionPerformer() { + + @Override + public boolean enable(Project project) { + if (!(project instanceof NbModuleProject)) return false; + + NbModuleProject nProject = (NbModuleProject)project; + if (findBuildXml(nProject) == null) { + return false; + } + if (Boolean.parseBoolean(nProject.evaluator().getProperty("is.autoload")) || Boolean.parseBoolean(nProject.evaluator().getProperty("is.eager"))) { // NOI18N + return false; // #86395 + } + NbModuleType type = nProject.getModuleType(); + if (type == NbModuleType.NETBEANS_ORG) { + return true; + } else if (type == NbModuleType.STANDALONE) { + NbPlatform p = nProject.getPlatform(false); + return p != null && p.isDefault(); + } else { + assert type == NbModuleType.SUITE_COMPONENT : type; + try { + SuiteProject suite = SuiteUtils.findSuite(project); + if (suite == null) { + return false; + } + NbPlatform p = suite.getPlatform(false); + if (/* #67148 */p == null || !p.isDefault()) { + return false; + } + return SuiteProperties.getArrayProperty(suite.getEvaluator(), SuiteProperties.ENABLED_CLUSTERS_PROPERTY).length == 0 && + SuiteProperties.getArrayProperty(suite.getEvaluator(), SuiteProperties.DISABLED_CLUSTERS_PROPERTY).length == 0 && + SuiteProperties.getArrayProperty(suite.getEvaluator(), SuiteProperties.DISABLED_MODULES_PROPERTY).length == 0; + } catch (IOException e) { + Util.err.notify(ErrorManager.INFORMATIONAL, e); + return false; + } + } + } + + @Override + public void perform(Project project) { + assert project != null; + assert project instanceof NbModuleProject; + + NbModuleProject nProject = (NbModuleProject)project; + + if (!verifySufficientlyNewHarness(nProject)) { + return; + } + if (ModuleUISettings.getDefault().getConfirmReloadInIDE()) { + NotifyDescriptor d = new NotifyDescriptor.Confirmation( + NbBundle.getMessage(ModuleActions.class, "LBL_reload_in_ide_confirm"), + NbBundle.getMessage(ModuleActions.class, "LBL_reload_in_ide_confirm_title"), + NotifyDescriptor.OK_CANCEL_OPTION); + if (DialogDisplayer.getDefault().notify(d) != NotifyDescriptor.OK_OPTION) { + return; + } + ModuleUISettings.getDefault().setConfirmReloadInIDE(false); // do not ask again + } + try { + ActionUtils.runTarget(findBuildXml(nProject), new String[]{"reload-in-ide"}, null); + } catch (IOException e) { + Util.err.notify(e); + } + } + }, NbBundle.getMessage(ModuleActions.class, "ACTION_reload_in_ide"), null); + + return a; + } + + public static Action createNbmAction() { + Action a = ProjectSensitiveActions.projectSensitiveAction(new ProjectActionPerformer() { + @Override + public boolean enable(Project project) { + if (!(project instanceof NbModuleProject)) return false; + + return findBuildXml((NbModuleProject)project) != null; + } + + @Override + public void perform(Project project) { + assert project != null; + assert project instanceof NbModuleProject; + + NbModuleProject nProject = (NbModuleProject)project; + + if (!verifySufficientlyNewHarness(nProject)) { + return; + } + try { + ActionUtils.runTarget(findBuildXml(nProject), new String[]{"nbm"}, null); + } catch (IOException e) { + Util.err.notify(e); + } + } + }, NbBundle.getMessage(ModuleActions.class, "ACTION_nbm"), null); + return a; + } + + public static Action archAction() { + Action a = ProjectSensitiveActions.projectSensitiveAction(new ProjectActionPerformer() { + @Override + public boolean enable(Project project) { + if (!(project instanceof NbModuleProject)) return false; + + return findBuildXml((NbModuleProject)project) != null; + } + + @Override + public void perform(Project project) { + assert project != null; + assert project instanceof NbModuleProject; + + final NbModuleProject nProject = (NbModuleProject)project; + + if (!verifySufficientlyNewHarness(nProject)) { + return; + } + ProjectManager.mutex().writeAccess(new Mutex.Action() { + public Void run() { + String prop = "javadoc.arch"; // NOI18N + if (nProject.evaluator().getProperty(prop) == null) { + // User has not yet configured an arch desc. Assume we should just do it for them. + EditableProperties props = nProject.getHelper().getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH); + props.setProperty(prop, "${basedir}/arch.xml"); // NOI18N + nProject.getHelper().putProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH, props); + try { + ProjectManager.getDefault().saveProject(nProject); + } catch (IOException e) { + Util.err.notify(e); + } + } + return null; + } + }); + try { + ActionUtils.runTarget(findBuildXml(nProject), new String[] {"arch-nb"}, null); // NOI18N + } catch (IOException e) { + Util.err.notify(e); + } + } + }, NbBundle.getMessage(ModuleActions.class, "ACTION_arch"), null); + + return a; + } + } + @Override public Task execute(String... args) throws IOException { StringBuilder sb = new StringBuilder(); @@ -128,48 +392,7 @@ } static Action[] getProjectActions(NbModuleProject project) { - List actions = new ArrayList(); - actions.add(CommonProjectActions.newFileAction()); - actions.add(null); - actions.add(ProjectSensitiveActions.projectCommandAction(ActionProvider.COMMAND_BUILD, NbBundle.getMessage(ModuleActions.class, "ACTION_build"), null)); - actions.add(ProjectSensitiveActions.projectCommandAction(ActionProvider.COMMAND_REBUILD, NbBundle.getMessage(ModuleActions.class, "ACTION_rebuild"), null)); - actions.add(ProjectSensitiveActions.projectCommandAction(ActionProvider.COMMAND_CLEAN, NbBundle.getMessage(ModuleActions.class, "ACTION_clean"), null)); - actions.add(null); - actions.add(ProjectSensitiveActions.projectCommandAction(ActionProvider.COMMAND_RUN, NbBundle.getMessage(ModuleActions.class, "ACTION_run"), null)); - actions.add(ProjectSensitiveActions.projectCommandAction(ActionProvider.COMMAND_DEBUG, NbBundle.getMessage(ModuleActions.class, "ACTION_debug"), null)); - actions.addAll(Utilities.actionsForPath("Projects/Profiler_Actions_temporary")); //NOI18N - if (project.supportedTestTypes().contains("unit")) { // NOI18N - actions.add(ProjectSensitiveActions.projectCommandAction(ActionProvider.COMMAND_TEST, NbBundle.getMessage(ModuleActions.class, "ACTION_test"), null)); - } - actions.add(null); - boolean isNetBeansOrg = project.getModuleType() == NbModuleType.NETBEANS_ORG; - if (isNetBeansOrg) { - actions.add(createCheckBundleAction(project, NbBundle.getMessage(ModuleActions.class, "ACTION_unused_bundle_keys"))); - actions.add(null); - } - actions.add(createReloadAction(project, new String[] {"reload"}, NbBundle.getMessage(ModuleActions.class, "ACTION_reload"), false)); - actions.add(createReloadAction(project, new String[] {"reload-in-ide"}, NbBundle.getMessage(ModuleActions.class, "ACTION_reload_in_ide"), true)); - actions.add(createSimpleAction(project, new String[] {"nbm"}, NbBundle.getMessage(ModuleActions.class, "ACTION_nbm"))); - actions.add(null); - actions.add(ProjectSensitiveActions.projectCommandAction(JavaProjectConstants.COMMAND_JAVADOC, NbBundle.getMessage(ModuleActions.class, "ACTION_javadoc"), null)); - actions.add(createArchAction(project)); - actions.add(null); - actions.add(CommonProjectActions.setAsMainProjectAction()); - actions.add(CommonProjectActions.openSubprojectsAction()); - actions.add(CommonProjectActions.closeProjectAction()); - actions.add(null); - actions.add(CommonProjectActions.renameProjectAction()); - actions.add(CommonProjectActions.moveProjectAction()); - actions.add(CommonProjectActions.copyProjectAction()); - actions.add(CommonProjectActions.deleteProjectAction()); - - actions.add(null); - actions.add(SystemAction.get(FindAction.class)); - // Honor #57874 contract: - actions.addAll(Utilities.actionsForPath("Projects/Actions")); // NOI18N - actions.add(null); - actions.add(CommonProjectActions.customizeProjectAction()); - return actions.toArray(new Action[actions.size()]); + return CommonProjectActions.forType("org-netbeans-modules-apisupport-project"); } private final NbModuleProject project; @@ -634,140 +857,4 @@ return false; } - - private static Action createSimpleAction(final NbModuleProject project, final String[] targetNames, String displayName) { - return new AbstractAction(displayName) { - public @Override boolean isEnabled() { - return findBuildXml(project) != null; - } - public void actionPerformed(ActionEvent ignore) { - if (!verifySufficientlyNewHarness(project)) { - return; - } - try { - ActionUtils.runTarget(findBuildXml(project), targetNames, null); - } catch (IOException e) { - Util.err.notify(e); - } - } - }; - } - - private static Action createCheckBundleAction(final NbModuleProject project, String displayName) { - return new AbstractAction(displayName) { - public @Override boolean isEnabled() { - return findMonitorXml() != null && project.getPathWithinNetBeansOrg() != null; - } - public void actionPerformed(ActionEvent ignore) { - Properties props = new Properties(); - props.put("modules", project.getPathWithinNetBeansOrg()); // NOI18N - props.put("fixedmodules", ""); // NOI18N - try { - ActionUtils.runTarget(findMonitorXml(), new String[] {"check-bundle-usage"}, props); // NOI18N - } catch (IOException e) { - Util.err.notify(e); - } - } - private FileObject findMonitorXml() { - return project.getNbrootFileObject("nbbuild/monitor.xml"); // NOI18N - } - }; - } - - private static Action createReloadAction(final NbModuleProject project, final String[] targetNames, String displayName, final boolean inIDE) { - return new AbstractAction(displayName) { - public @Override boolean isEnabled() { - if (findBuildXml(project) == null) { - return false; - } - if (Boolean.parseBoolean(project.evaluator().getProperty("is.autoload")) || Boolean.parseBoolean(project.evaluator().getProperty("is.eager"))) { // NOI18N - return false; // #86395 - } - if (!inIDE) { - return project.getTestUserDirLockFile().isFile(); - } - NbModuleType type = project.getModuleType(); - if (type == NbModuleType.NETBEANS_ORG) { - return true; - } else if (type == NbModuleType.STANDALONE) { - NbPlatform p = project.getPlatform(false); - return p != null && p.isDefault(); - } else { - assert type == NbModuleType.SUITE_COMPONENT : type; - try { - SuiteProject suite = SuiteUtils.findSuite(project); - if (suite == null) { - return false; - } - NbPlatform p = suite.getPlatform(false); - if (/* #67148 */p == null || !p.isDefault()) { - return false; - } - return SuiteProperties.getArrayProperty(suite.getEvaluator(), SuiteProperties.ENABLED_CLUSTERS_PROPERTY).length == 0 && - SuiteProperties.getArrayProperty(suite.getEvaluator(), SuiteProperties.DISABLED_CLUSTERS_PROPERTY).length == 0 && - SuiteProperties.getArrayProperty(suite.getEvaluator(), SuiteProperties.DISABLED_MODULES_PROPERTY).length == 0; - } catch (IOException e) { - Util.err.notify(ErrorManager.INFORMATIONAL, e); - return false; - } - } - } - public void actionPerformed(ActionEvent ignore) { - if (!verifySufficientlyNewHarness(project)) { - return; - } - if (inIDE && ModuleUISettings.getDefault().getConfirmReloadInIDE()) { - NotifyDescriptor d = new NotifyDescriptor.Confirmation( - NbBundle.getMessage(ModuleActions.class, "LBL_reload_in_ide_confirm"), - NbBundle.getMessage(ModuleActions.class, "LBL_reload_in_ide_confirm_title"), - NotifyDescriptor.OK_CANCEL_OPTION); - if (DialogDisplayer.getDefault().notify(d) != NotifyDescriptor.OK_OPTION) { - return; - } - ModuleUISettings.getDefault().setConfirmReloadInIDE(false); // do not ask again - } - try { - ActionUtils.runTarget(findBuildXml(project), targetNames, null); - } catch (IOException e) { - Util.err.notify(e); - } - } - }; - } - - private static Action createArchAction(final NbModuleProject project) { - return new AbstractAction(NbBundle.getMessage(ModuleActions.class, "ACTION_arch")) { - public @Override boolean isEnabled() { - return findBuildXml(project) != null; - } - public void actionPerformed(ActionEvent ignore) { - if (!verifySufficientlyNewHarness(project)) { - return; - } - ProjectManager.mutex().writeAccess(new Mutex.Action() { - public Void run() { - String prop = "javadoc.arch"; // NOI18N - if (project.evaluator().getProperty(prop) == null) { - // User has not yet configured an arch desc. Assume we should just do it for them. - EditableProperties props = project.getHelper().getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH); - props.setProperty(prop, "${basedir}/arch.xml"); // NOI18N - project.getHelper().putProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH, props); - try { - ProjectManager.getDefault().saveProject(project); - } catch (IOException e) { - Util.err.notify(e); - } - } - return null; - } - }); - try { - ActionUtils.runTarget(findBuildXml(project), new String[] {"arch-nb"}, null); // NOI18N - } catch (IOException e) { - Util.err.notify(e); - } - } - }; - } - }