From 232f2020ff145753c3331df224fa28333c5e4691 Mon Sep 17 00:00:00 2001 From: "kirill.safonov" Date: Sat, 10 Mar 2012 10:47:30 +0400 Subject: [PATCH] Flex project structure: correctly navigate to module libraries from Project view (IDEA-82292) --- .../ProjectStructureConfigurable.java | 18 +------- .../ModuleStructureConfigurable.java | 45 +++++++++++++++---- .../projectRoot/ModuleStructureExtension.java | 11 +++++ 3 files changed, 49 insertions(+), 25 deletions(-) diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurable.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurable.java index 7988292deeaa..6933ecdf998f 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurable.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/ProjectStructureConfigurable.java @@ -20,7 +20,6 @@ import com.intellij.ide.util.PropertiesComponent; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.components.ServiceManager; import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleConfigurationEditor; import com.intellij.openapi.module.ModuleManager; import com.intellij.openapi.options.BaseConfigurable; import com.intellij.openapi.options.Configurable; @@ -453,22 +452,7 @@ public class ProjectStructureConfigurable extends BaseConfigurable implements Se } public ActionCallback selectOrderEntry(@NotNull final Module module, @Nullable final OrderEntry orderEntry) { - return select(module.getName(), null, true).doWhenDone(new Runnable() { - public void run() { - final MasterDetailsComponent.MyNode node = ModuleStructureConfigurable.getInstance(myProject).findModuleNode(module); - if (node != null) { - ModuleConfigurable moduleConfigurable = (ModuleConfigurable)node.getConfigurable(); - ModuleEditor moduleEditor = moduleConfigurable.getModuleEditor(); - moduleEditor.selectEditor(ClasspathEditor.NAME); - if (orderEntry != null) { - ModuleConfigurationEditor editor = moduleEditor.getEditor(ClasspathEditor.NAME); - if (editor instanceof ClasspathEditor) { - ((ClasspathEditor)editor).selectOrderEntry(orderEntry); - } - } - } - } - }); + return ModuleStructureConfigurable.getInstance(myProject).selectOrderEntry(module, orderEntry); } public ActionCallback navigateTo(@Nullable final Place place, final boolean requestFocus) { diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ModuleStructureConfigurable.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ModuleStructureConfigurable.java index 1ea708581f52..c1e9408f5c84 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ModuleStructureConfigurable.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ModuleStructureConfigurable.java @@ -30,10 +30,7 @@ import com.intellij.ide.util.projectWizard.ProjectWizardUtil; import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.components.ServiceManager; -import com.intellij.openapi.module.ModifiableModuleModel; -import com.intellij.openapi.module.Module; -import com.intellij.openapi.module.ModuleManager; -import com.intellij.openapi.module.ModuleType; +import com.intellij.openapi.module.*; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.Project; @@ -43,16 +40,16 @@ import com.intellij.openapi.roots.impl.ClonableOrderEntry; import com.intellij.openapi.roots.impl.ProjectRootManagerImpl; import com.intellij.openapi.roots.impl.RootModelImpl; import com.intellij.openapi.roots.libraries.Library; +import com.intellij.openapi.roots.ui.configuration.ClasspathEditor; import com.intellij.openapi.roots.ui.configuration.ModuleEditor; import com.intellij.openapi.roots.ui.configuration.ModulesConfigurator; +import com.intellij.openapi.roots.ui.configuration.ProjectStructureConfigurable; import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.LibraryProjectStructureElement; import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.ModuleProjectStructureElement; import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.ProjectStructureDaemonAnalyzer; import com.intellij.openapi.roots.ui.configuration.projectRoot.daemon.ProjectStructureElement; -import com.intellij.openapi.ui.DialogBuilder; -import com.intellij.openapi.ui.DialogWrapper; -import com.intellij.openapi.ui.Messages; -import com.intellij.openapi.ui.NamedConfigurable; +import com.intellij.openapi.ui.*; +import com.intellij.openapi.util.ActionCallback; import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.IconLoader; import com.intellij.openapi.util.NullableComputable; @@ -429,6 +426,38 @@ public class ModuleStructureConfigurable extends BaseStructureConfigurable imple return "reference.settingsdialog.project.structure.module"; } + public ActionCallback selectOrderEntry(@NotNull final Module module, @Nullable final OrderEntry orderEntry) { + for (final ModuleStructureExtension extension : ModuleStructureExtension.EP_NAME.getExtensions()) { + final ActionCallback callback = extension.selectOrderEntry(module, orderEntry); + if (callback != null) { + return callback; + } + } + + Place p = new Place(); + p.putPath(ProjectStructureConfigurable.CATEGORY, this); + Runnable r = null; + + final MasterDetailsComponent.MyNode node = findModuleNode(module); + if (node != null) { + p.putPath(TREE_OBJECT, module); + p.putPath(ModuleEditor.SELECTED_EDITOR_NAME, ClasspathEditor.NAME); + r = new Runnable() { + public void run() { + if (orderEntry != null) { + ModuleEditor moduleEditor = ((ModuleConfigurable)node.getConfigurable()).getModuleEditor(); + ModuleConfigurationEditor editor = moduleEditor.getEditor(ClasspathEditor.NAME); + if (editor instanceof ClasspathEditor) { + ((ClasspathEditor)editor).selectOrderEntry(orderEntry); + } + } + } + }; + } + final ActionCallback result = ProjectStructureConfigurable.getInstance(myProject).navigateTo(p, true); + return r != null ? result.doWhenDone(r) : result; + } + public static ModuleStructureConfigurable getInstance(final Project project) { return ServiceManager.getService(project, ModuleStructureConfigurable.class); diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ModuleStructureExtension.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ModuleStructureExtension.java index e653fcccc923..dd17ab3ac246 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ModuleStructureExtension.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/projectRoot/ModuleStructureExtension.java @@ -5,9 +5,12 @@ import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.module.Module; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.OrderEntry; import com.intellij.openapi.ui.MasterDetailsComponent; import com.intellij.openapi.ui.NamedConfigurable; +import com.intellij.openapi.util.ActionCallback; import com.intellij.openapi.util.NullableComputable; +import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collection; @@ -71,4 +74,12 @@ public abstract class ModuleStructureExtension { public Comparator getNodeComparator() { return null; } + + /** + * @return callback or null if not handled + */ + @Nullable + public ActionCallback selectOrderEntry(@NotNull final Module module, @Nullable final OrderEntry entry) { + return null; + } }