From 1c177da4624c9b0cffd2fb7cd576292da3e41927 Mon Sep 17 00:00:00 2001 From: nik Date: Wed, 14 Jun 2017 15:31:35 +0200 Subject: [PATCH] run configurations: correctly handle unloaded modules in 'Use classpath of' combobox in Remote and JUnit configurations Previously combobox model supported only loaded modules, so if some run configuration referred to an unloaded module, it lost its value after ConfigurationModuleSelector#reset/applyTo. (IDEA-174456) --- .../intellij/execution/remote/RemoteConfigurable.form | 2 +- .../intellij/execution/remote/RemoteConfigurable.java | 9 +++++---- .../execution/ui/ConfigurationModuleSelector.java | 10 ++++++++-- .../com/intellij/execution/ui/DefaultJreSelector.kt | 4 ++++ .../intellij/java/execution/ConfigurationsTest.java | 8 ++++---- .../junit2/configuration/JUnitConfigurable.form | 2 +- .../junit2/configuration/JUnitConfigurable.java | 6 +++--- 7 files changed, 26 insertions(+), 15 deletions(-) diff --git a/java/execution/impl/src/com/intellij/execution/remote/RemoteConfigurable.form b/java/execution/impl/src/com/intellij/execution/remote/RemoteConfigurable.form index 4f14c055a8b1..4d422a7538c7 100644 --- a/java/execution/impl/src/com/intellij/execution/remote/RemoteConfigurable.form +++ b/java/execution/impl/src/com/intellij/execution/remote/RemoteConfigurable.form @@ -160,7 +160,7 @@ - + diff --git a/java/execution/impl/src/com/intellij/execution/remote/RemoteConfigurable.java b/java/execution/impl/src/com/intellij/execution/remote/RemoteConfigurable.java index 352a4ba424e4..b364546d6af5 100644 --- a/java/execution/impl/src/com/intellij/execution/remote/RemoteConfigurable.java +++ b/java/execution/impl/src/com/intellij/execution/remote/RemoteConfigurable.java @@ -20,7 +20,7 @@ */ package com.intellij.execution.remote; -import com.intellij.application.options.ModulesComboBox; +import com.intellij.application.options.ModuleDescriptionsComboBox; import com.intellij.execution.ExecutionBundle; import com.intellij.execution.configurations.RemoteConnection; import com.intellij.execution.ui.ConfigurationArgumentsHelpArea; @@ -53,7 +53,7 @@ public class RemoteConfigurable extends SettingsEditor { private ConfigurationArgumentsHelpArea myHelpArea; @NonNls private ConfigurationArgumentsHelpArea myJDK13HelpArea; private ConfigurationArgumentsHelpArea myJDK14HelpArea; - private LabeledComponent myModule; + private LabeledComponent myModule; private String myHostName = ""; @NonNls protected static final String LOCALHOST = "localhost"; @@ -128,8 +128,9 @@ public class RemoteConfigurable extends SettingsEditor { }; myAddressField.addFocusListener(fieldFocusListener); myPortField.addFocusListener(fieldFocusListener); - - myModuleSelector = new ConfigurationModuleSelector(project, myModule.getComponent(), ""); + + myModule.getComponent().allowEmptySelection(""); + myModuleSelector = new ConfigurationModuleSelector(project, myModule.getComponent()); } public void applyEditorTo(@NotNull final RemoteConfiguration configuration) throws ConfigurationException { diff --git a/java/execution/impl/src/com/intellij/execution/ui/ConfigurationModuleSelector.java b/java/execution/impl/src/com/intellij/execution/ui/ConfigurationModuleSelector.java index 5f62966edb0b..243d67511f28 100644 --- a/java/execution/impl/src/com/intellij/execution/ui/ConfigurationModuleSelector.java +++ b/java/execution/impl/src/com/intellij/execution/ui/ConfigurationModuleSelector.java @@ -37,6 +37,7 @@ import java.util.Collection; import java.util.List; public class ConfigurationModuleSelector { + public static final String NO_MODULE_TEXT = ""; private final Project myProject; /** this field is {@code null} if and only if {@link #myModulesList} is not null */ private final ModuleDescriptionsComboBox myModulesDescriptionsComboBox; @@ -47,17 +48,22 @@ public class ConfigurationModuleSelector { * @deprecated use {@link #ConfigurationModuleSelector(Project, ModulesComboBox)} instead */ public ConfigurationModuleSelector(final Project project, final JComboBox modulesList) { - this(project, modulesList, ""); + this(project, modulesList, NO_MODULE_TEXT); } public ConfigurationModuleSelector(Project project, ModulesComboBox modulesComboBox) { - this(project, modulesComboBox, ""); + this(project, modulesComboBox, NO_MODULE_TEXT); } public ConfigurationModuleSelector(Project project, ModuleDescriptionsComboBox modulesDescriptionsComboBox) { + this(project, modulesDescriptionsComboBox, NO_MODULE_TEXT); + } + + public ConfigurationModuleSelector(Project project, ModuleDescriptionsComboBox modulesDescriptionsComboBox, String emptySelectionText) { myProject = project; myModulesDescriptionsComboBox = modulesDescriptionsComboBox; myModulesList = null; + modulesDescriptionsComboBox.allowEmptySelection(emptySelectionText); } public ConfigurationModuleSelector(Project project, ModulesComboBox modulesComboBox, String noModule) { diff --git a/java/execution/impl/src/com/intellij/execution/ui/DefaultJreSelector.kt b/java/execution/impl/src/com/intellij/execution/ui/DefaultJreSelector.kt index feb3b6658ccc..b5a599b5b091 100644 --- a/java/execution/impl/src/com/intellij/execution/ui/DefaultJreSelector.kt +++ b/java/execution/impl/src/com/intellij/execution/ui/DefaultJreSelector.kt @@ -46,6 +46,10 @@ abstract class DefaultJreSelector { fun fromModuleDependencies(moduleComboBox: ModulesComboBox, productionOnly: Boolean): DefaultJreSelector = SdkFromModuleDependencies(moduleComboBox, ModulesComboBox::getSelectedModule, {productionOnly}) + @JvmStatic + fun fromModuleDependencies(moduleComboBox: ModuleDescriptionsComboBox, productionOnly: Boolean): DefaultJreSelector + = SdkFromModuleDependencies(moduleComboBox, ModuleDescriptionsComboBox::getSelectedModule, {productionOnly}) + @JvmStatic fun fromSourceRootsDependencies(moduleComboBox: ModulesComboBox, classSelector: EditorTextFieldWithBrowseButton): DefaultJreSelector = SdkFromSourceRootDependencies(moduleComboBox, ModulesComboBox::getSelectedModule, classSelector) diff --git a/java/java-tests/testSrc/com/intellij/java/execution/ConfigurationsTest.java b/java/java-tests/testSrc/com/intellij/java/execution/ConfigurationsTest.java index b7aec57fea50..deefe1037aae 100644 --- a/java/java-tests/testSrc/com/intellij/java/execution/ConfigurationsTest.java +++ b/java/java-tests/testSrc/com/intellij/java/execution/ConfigurationsTest.java @@ -15,6 +15,7 @@ */ package com.intellij.java.execution; +import com.intellij.application.options.ModuleDescriptionsComboBox; import com.intellij.execution.CantRunException; import com.intellij.execution.ExecutionException; import com.intellij.execution.RunConfigurationConfigurableAdapter; @@ -62,7 +63,6 @@ import com.intellij.util.containers.ContainerUtilRt; import junit.framework.TestCase; import org.jdom.Element; -import javax.swing.*; import java.io.*; import java.util.ArrayList; import java.util.Collections; @@ -127,12 +127,12 @@ public class ConfigurationsTest extends BaseConfigurationTestCase { JUnitConfiguration configuration = createConfiguration(findTestA(module2)); editor.getComponent(); // To get all the watchers installed. Configurable configurable = new RunConfigurationConfigurableAdapter(editor, configuration); - JComboBox comboBox = editor.getModulesComponent(); + ModuleDescriptionsComboBox comboBox = editor.getModulesComponent(); configurable.reset(); assertFalse(configurable.isModified()); - assertEquals(module2.getName(), ((Module)comboBox.getSelectedItem()).getName()); + assertEquals(module2.getName(), comboBox.getSelectedModuleName()); assertEquals(ModuleManager.getInstance(myProject).getModules().length + 1, comboBox.getModel().getSize()); //no module - comboBox.setSelectedItem(module1); + comboBox.setSelectedModule(module1); assertTrue(configurable.isModified()); configurable.apply(); assertFalse(configurable.isModified()); diff --git a/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurable.form b/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurable.form index 1d9a7e53c6dc..9d1d2f305c3f 100644 --- a/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurable.form +++ b/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurable.form @@ -62,7 +62,7 @@ - + diff --git a/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurable.java b/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurable.java index 081753048910..3fe79c8654ef 100644 --- a/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurable.java +++ b/plugins/junit/src/com/intellij/execution/junit2/configuration/JUnitConfigurable.java @@ -16,7 +16,7 @@ package com.intellij.execution.junit2.configuration; -import com.intellij.application.options.ModulesComboBox; +import com.intellij.application.options.ModuleDescriptionsComboBox; import com.intellij.execution.ExecutionBundle; import com.intellij.execution.MethodBrowser; import com.intellij.execution.configuration.BrowseModuleValueActionListener; @@ -94,7 +94,7 @@ public class JUnitConfigurable extends SettingsEdi private LabeledComponent myCategory; // Fields private JPanel myWholePanel; - private LabeledComponent myModule; + private LabeledComponent myModule; private CommonJavaParametersPanel myCommonJavaParameters; private JRadioButton myWholeProjectScope; private JRadioButton mySingleModuleScope; @@ -445,7 +445,7 @@ public class JUnitConfigurable extends SettingsEdi return new DefaultComboBoxModel(RepeatCount.ONCE.equals(myRepeatCb.getSelectedItem()) ? FORK_MODE : FORK_MODE_ALL); } - public ModulesComboBox getModulesComponent() { + public ModuleDescriptionsComboBox getModulesComponent() { return myModule.getComponent(); }