From c99fe5e8d26a9487d8a3c5d5e2113eb99cadfb17 Mon Sep 17 00:00:00 2001 From: nik Date: Tue, 18 Apr 2017 15:13:53 +0300 Subject: [PATCH] Project Structure dialog: open 'Project' item if missing SDK or output path in a module are inherited from project (IDEA-171551) --- .../intellij/compiler/impl/CompileDriver.java | 27 ++++++++++++++----- ...tModuleConfigurationEditorFactoryImpl.java | 5 ++++ .../roots/ui/configuration/OutputEditor.java | 4 +-- ...faultModuleConfigurationEditorFactory.java | 2 ++ 4 files changed, 29 insertions(+), 9 deletions(-) diff --git a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java index fd04b58fd28a..851cffb410b1 100644 --- a/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java +++ b/java/compiler/impl/src/com/intellij/compiler/impl/CompileDriver.java @@ -36,8 +36,9 @@ import com.intellij.openapi.progress.ProgressIndicator; import com.intellij.openapi.project.Project; import com.intellij.openapi.project.ProjectBundle; import com.intellij.openapi.projectRoots.Sdk; +import com.intellij.openapi.roots.CompilerModuleExtension; import com.intellij.openapi.roots.ModuleRootManager; -import com.intellij.openapi.roots.ui.configuration.CommonContentEntriesEditor; +import com.intellij.openapi.roots.ui.configuration.DefaultModuleConfigurationEditorFactory; import com.intellij.openapi.roots.ui.configuration.ProjectSettingsService; import com.intellij.openapi.ui.MessageType; import com.intellij.openapi.ui.Messages; @@ -620,6 +621,8 @@ public class CompileDriver { final List modulesWithoutOutputPathSpecified = new ArrayList<>(); final List modulesWithoutJdkAssigned = new ArrayList<>(); final CompilerManager compilerManager = CompilerManager.getInstance(myProject); + boolean projectSdkNotSpecified = false; + boolean projectOutputNotSpecified = false; for (final Module module : scopeModules) { if (!compilerManager.isValidationEnabled(module)) { continue; @@ -633,11 +636,14 @@ public class CompileDriver { } final Sdk jdk = ModuleRootManager.getInstance(module).getSdk(); if (jdk == null) { + projectSdkNotSpecified |= ModuleRootManager.getInstance(module).isSdkInherited(); modulesWithoutJdkAssigned.add(module.getName()); } final String outputPath = getModuleOutputPath(module, false); final String testsOutputPath = getModuleOutputPath(module, true); if (outputPath == null && testsOutputPath == null) { + CompilerModuleExtension compilerExtension = CompilerModuleExtension.getInstance(module); + projectOutputNotSpecified |= compilerExtension != null && compilerExtension.isCompilerOutputPathInherited(); modulesWithoutOutputPathSpecified.add(module.getName()); } else { @@ -654,12 +660,12 @@ public class CompileDriver { } } if (!modulesWithoutJdkAssigned.isEmpty()) { - showNotSpecifiedError("error.jdk.not.specified", modulesWithoutJdkAssigned, ProjectBundle.message("modules.classpath.title")); + showNotSpecifiedError("error.jdk.not.specified", projectSdkNotSpecified, modulesWithoutJdkAssigned, ProjectBundle.message("modules.classpath.title")); return false; } if (!modulesWithoutOutputPathSpecified.isEmpty()) { - showNotSpecifiedError("error.output.not.specified", modulesWithoutOutputPathSpecified, CommonContentEntriesEditor.NAME); + showNotSpecifiedError("error.output.not.specified", projectOutputNotSpecified, modulesWithoutOutputPathSpecified, DefaultModuleConfigurationEditorFactory.getInstance().getOutputEditorDisplayName()); return false; } @@ -744,14 +750,15 @@ public class CompileDriver { return !ModuleRootManager.getInstance(module).getSourceRoots(rootType).isEmpty(); } - private void showNotSpecifiedError(@NonNls final String resourceId, List modules, String editorNameToSelect) { + private void showNotSpecifiedError(@NonNls final String resourceId, boolean notSpecifiedValueInheritedFromProject, List modules, + String editorNameToSelect) { String nameToSelect = null; final StringBuilder names = StringBuilderSpinAllocator.alloc(); final String message; try { final int maxModulesToShow = 10; for (String name : modules.size() > maxModulesToShow ? modules.subList(0, maxModulesToShow) : modules) { - if (nameToSelect == null) { + if (nameToSelect == null && !notSpecifiedValueInheritedFromProject) { nameToSelect = name; } if (names.length() > 0) { @@ -778,8 +785,14 @@ public class CompileDriver { showConfigurationDialog(nameToSelect, editorNameToSelect); } - private void showConfigurationDialog(String moduleNameToSelect, String tabNameToSelect) { - ProjectSettingsService.getInstance(myProject).showModuleConfigurationDialog(moduleNameToSelect, tabNameToSelect); + private void showConfigurationDialog(@Nullable String moduleNameToSelect, @Nullable String tabNameToSelect) { + ProjectSettingsService service = ProjectSettingsService.getInstance(myProject); + if (moduleNameToSelect != null) { + service.showModuleConfigurationDialog(moduleNameToSelect, tabNameToSelect); + } + else { + service.openProjectSettings(); + } } private static class MessagesActivationListener extends NotificationListener.Adapter { diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/DefaultModuleConfigurationEditorFactoryImpl.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/DefaultModuleConfigurationEditorFactoryImpl.java index 0ff9ae51f8ae..cf6f4dcb2605 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/DefaultModuleConfigurationEditorFactoryImpl.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/DefaultModuleConfigurationEditorFactoryImpl.java @@ -41,4 +41,9 @@ public class DefaultModuleConfigurationEditorFactoryImpl extends DefaultModuleCo public ModuleConfigurationEditor createOutputEditor(ModuleConfigurationState state) { return new OutputEditor(state); } + + @Override + public String getOutputEditorDisplayName() { + return OutputEditor.NAME; + } } diff --git a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/OutputEditor.java b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/OutputEditor.java index 44d3fed6eb78..deef891e724e 100644 --- a/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/OutputEditor.java +++ b/java/idea-ui/src/com/intellij/openapi/roots/ui/configuration/OutputEditor.java @@ -34,6 +34,7 @@ import javax.swing.border.EmptyBorder; import java.awt.*; public class OutputEditor extends ModuleElementsEditor { + public static final String NAME = ProjectBundle.message("project.roots.path.tab.title"); private final BuildElementsEditor myCompilerOutputEditor; private final JavadocEditor myJavadocEditor; private final AnnotationsEditor myAnnotationsEditor; @@ -71,10 +72,9 @@ public class OutputEditor extends ModuleElementsEditor { @Override public String getDisplayName() { - return ProjectBundle.message("project.roots.path.tab.title"); + return NAME; } - @Override public void moduleStateChanged() { super.moduleStateChanged(); diff --git a/java/openapi/src/com/intellij/openapi/roots/ui/configuration/DefaultModuleConfigurationEditorFactory.java b/java/openapi/src/com/intellij/openapi/roots/ui/configuration/DefaultModuleConfigurationEditorFactory.java index 35336c3bc667..64343e3e170e 100644 --- a/java/openapi/src/com/intellij/openapi/roots/ui/configuration/DefaultModuleConfigurationEditorFactory.java +++ b/java/openapi/src/com/intellij/openapi/roots/ui/configuration/DefaultModuleConfigurationEditorFactory.java @@ -26,6 +26,8 @@ public abstract class DefaultModuleConfigurationEditorFactory { public abstract ModuleConfigurationEditor createOutputEditor(ModuleConfigurationState state); + public abstract String getOutputEditorDisplayName(); + public static DefaultModuleConfigurationEditorFactory getInstance() { return ServiceManager.getService(DefaultModuleConfigurationEditorFactory.class); }