From b49b61e9c427d5306f9e5a0c718febabaf9f79e0 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Wed, 23 Sep 2020 14:10:23 +0300 Subject: [PATCH] IDEA-248457 Java Application with run targets: show Java language runtimes configured on a target instead of local JDKs GitOrigin-RevId: c79ffcd9cbcbe783d8ed59492e563f0cbbf3a0a0 --- .../application/ApplicationConfiguration.java | 4 +- .../application/JavaSettingsEditorBase.java | 11 +++ .../execution/ui/CommonJavaFragments.java | 5 +- .../intellij/execution/ui/JrePathEditor.java | 98 ++++++++++++------- .../impl/SingleConfigurationConfigurable.java | 13 ++- .../ui/RunConfigurationFragmentedEditor.java | 6 ++ .../RunnerAndConfigurationSettingsEditor.java | 4 + .../TargetEnvironmentAwareRunProfile.java | 2 +- 8 files changed, 102 insertions(+), 41 deletions(-) diff --git a/java/execution/impl/src/com/intellij/execution/application/ApplicationConfiguration.java b/java/execution/impl/src/com/intellij/execution/application/ApplicationConfiguration.java index 119d16e39559..8ba0387b6c43 100644 --- a/java/execution/impl/src/com/intellij/execution/application/ApplicationConfiguration.java +++ b/java/execution/impl/src/com/intellij/execution/application/ApplicationConfiguration.java @@ -156,7 +156,9 @@ public class ApplicationConfiguration extends JavaRunConfigurationBase @Override public void checkConfiguration() throws RuntimeConfigurationException { - JavaParametersUtil.checkAlternativeJRE(this); + if (getDefaultTargetName() == null) { + JavaParametersUtil.checkAlternativeJRE(this); + } final JavaRunConfigurationModule configurationModule = getConfigurationModule(); final PsiClass psiClass = configurationModule.checkModuleAndClassName(getMainClassName(), ExecutionBundle.message("no.main.class.specified.error.text")); diff --git a/java/execution/impl/src/com/intellij/execution/application/JavaSettingsEditorBase.java b/java/execution/impl/src/com/intellij/execution/application/JavaSettingsEditorBase.java index 30b69af54d60..51a5eda3c6d1 100644 --- a/java/execution/impl/src/com/intellij/execution/application/JavaSettingsEditorBase.java +++ b/java/execution/impl/src/com/intellij/execution/application/JavaSettingsEditorBase.java @@ -11,6 +11,7 @@ import com.intellij.ide.macro.MacrosDialog; import com.intellij.openapi.ui.LabeledComponent; import com.intellij.openapi.util.Computable; import com.intellij.ui.RawCommandLineEditor; +import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; import java.awt.*; @@ -106,4 +107,14 @@ public abstract class JavaSettingsEditorBase protected abstract void customizeFragments(List> fragments, ModuleClasspathCombo classpathCombo, CommonParameterFragments commonParameterFragments); + + @Override + public void targetChanged(String targetName) { + SettingsEditorFragment fragment = ContainerUtil.find(getFragments(), f -> CommonJavaFragments.JRE_PATH == f.getId()); + if (fragment != null) { + if (((JrePathEditor)fragment.component()).updateModel(targetName)) { + fragment.resetFrom(getRunConfiguration()); + } + } + } } diff --git a/java/execution/impl/src/com/intellij/execution/ui/CommonJavaFragments.java b/java/execution/impl/src/com/intellij/execution/ui/CommonJavaFragments.java index c4f7902f4fda..21b4e65d7477 100644 --- a/java/execution/impl/src/com/intellij/execution/ui/CommonJavaFragments.java +++ b/java/execution/impl/src/com/intellij/execution/ui/CommonJavaFragments.java @@ -29,6 +29,8 @@ import static com.intellij.util.containers.ContainerUtil.exists; public final class CommonJavaFragments { + public static final String JRE_PATH = "jrePath"; + public static > SettingsEditorFragment createBuildBeforeRun(BeforeRunComponent beforeRunComponent) { String buildAndRun = ExecutionBundle.message("application.configuration.title.build.and.run"); String run = ExecutionBundle.message("application.configuration.title.run"); @@ -133,7 +135,6 @@ public final class CommonJavaFragments { public static SettingsEditorFragment createJrePath(DefaultJreSelector defaultJreSelector) { JrePathEditor jrePathEditor = new JrePathEditor(false); jrePathEditor.setDefaultJreSelector(defaultJreSelector); - //noinspection unchecked ComboBox comboBox = jrePathEditor.getComponent(); comboBox.setRenderer(new ColoredListCellRenderer<>() { @Override @@ -196,7 +197,7 @@ public final class CommonJavaFragments { jrePathEditor.getLabel().setVisible(false); jrePathEditor.getComponent().getAccessibleContext().setAccessibleName(jrePathEditor.getLabel().getText()); SettingsEditorFragment jrePath = - new SettingsEditorFragment<>("jrePath", ExecutionBundle.message("run.configuration.jre.name"), null, jrePathEditor, 5, + new SettingsEditorFragment<>(JRE_PATH, ExecutionBundle.message("run.configuration.jre.name"), null, jrePathEditor, 5, (configuration, editor) -> editor.setPathOrName(configuration.getAlternativeJrePath(), configuration.isAlternativeJrePathEnabled()), (configuration, editor) -> { diff --git a/java/execution/impl/src/com/intellij/execution/ui/JrePathEditor.java b/java/execution/impl/src/com/intellij/execution/ui/JrePathEditor.java index cf4e855c8f2f..b1eebced6dca 100644 --- a/java/execution/impl/src/com/intellij/execution/ui/JrePathEditor.java +++ b/java/execution/impl/src/com/intellij/execution/ui/JrePathEditor.java @@ -2,6 +2,9 @@ package com.intellij.execution.ui; import com.intellij.execution.ExecutionBundle; +import com.intellij.execution.target.TargetEnvironmentConfiguration; +import com.intellij.execution.target.TargetEnvironmentsManager; +import com.intellij.execution.target.java.JavaLanguageRuntimeConfiguration; import com.intellij.icons.AllIcons; import com.intellij.ide.util.BrowseFilesListener; import com.intellij.openapi.projectRoots.ProjectJdkTable; @@ -37,7 +40,7 @@ import java.io.File; import java.util.HashSet; import java.util.Set; -public class JrePathEditor extends LabeledComponent implements PanelWithAnchor { +public class JrePathEditor extends LabeledComponent> implements PanelWithAnchor { private final JreComboboxEditor myComboboxEditor; private final DefaultJreItem myDefaultJreItem; private DefaultJreSelector myDefaultJreSelector; @@ -76,39 +79,7 @@ public class JrePathEditor extends LabeledComponent implements PanelWi } }; myDefaultJreItem = new DefaultJreItem(); - myComboBoxModel.add(myDefaultJreItem); - final Sdk[] allJDKs = ProjectJdkTable.getInstance().getAllJdks(); - for (Sdk sdk : allJDKs) { - myComboBoxModel.add(new SdkAsJreItem(sdk)); - } - - final Set jrePaths = new HashSet<>(); - for (JreProvider provider : JreProvider.EP_NAME.getExtensionList()) { - if (provider.isAvailable()) { - String path = provider.getJrePath(); - if (!StringUtil.isEmpty(path)) { - jrePaths.add(path); - myComboBoxModel.add(new CustomJreItem(provider)); - } - } - } - - for (Sdk jdk : allJDKs) { - String homePath = jdk.getHomePath(); - - if (!SystemInfo.isMac) { - final File jre = new File(jdk.getHomePath(), "jre"); - if (jre.isDirectory()) { - homePath = jre.getPath(); - } - } - if (jrePaths.add(homePath)) { - myComboBoxModel.add(new CustomJreItem(homePath, null, jdk.getVersionString())); - } - } - if (!editable) { - myComboBoxModel.add(new AddJreItem()); - } + buildModel(editable); myComboBoxModel.setSelectedItem(myDefaultJreItem); ComboBox comboBox = new ComboBox<>(myComboBoxModel); @@ -168,13 +139,70 @@ public class JrePathEditor extends LabeledComponent implements PanelWi updateUI(); } + /** + * @return true if selection update needed + */ + public boolean updateModel(@Nullable String targetName) { + myComboBoxModel.clear(); + if (targetName != null) { + TargetEnvironmentConfiguration config = TargetEnvironmentsManager.getInstance().getTargets().findByName(targetName); + if (config != null) { + JavaLanguageRuntimeConfiguration runtime = config.getRuntimes().findByType(JavaLanguageRuntimeConfiguration.class); + if (runtime != null) { + CustomJreItem item = new CustomJreItem(runtime.getHomePath()); + myComboBoxModel.add(item); + myComboBoxModel.setSelectedItem(item); + } + return false; + } + } + buildModel(getComponent().isEditable()); + return true; + } + + private void buildModel(boolean editable) { + myComboBoxModel.add(myDefaultJreItem); + final Sdk[] allJDKs = ProjectJdkTable.getInstance().getAllJdks(); + for (Sdk sdk : allJDKs) { + myComboBoxModel.add(new SdkAsJreItem(sdk)); + } + + final Set jrePaths = new HashSet<>(); + for (JreProvider provider : JreProvider.EP_NAME.getExtensionList()) { + if (provider.isAvailable()) { + String path = provider.getJrePath(); + if (!StringUtil.isEmpty(path)) { + jrePaths.add(path); + myComboBoxModel.add(new CustomJreItem(provider)); + } + } + } + + for (Sdk jdk : allJDKs) { + String homePath = jdk.getHomePath(); + + if (!SystemInfo.isMac) { + final File jre = new File(jdk.getHomePath(), "jre"); + if (jre.isDirectory()) { + homePath = jre.getPath(); + } + } + if (jrePaths.add(homePath)) { + myComboBoxModel.add(new CustomJreItem(homePath, null, jdk.getVersionString())); + } + } + if (!editable) { + myComboBoxModel.add(new AddJreItem()); + } + } + @NotNull private Runnable getBrowseRunnable() { return new BrowseFolderRunnable<>(ExecutionBundle.message("run.configuration.select.alternate.jre.label"), ExecutionBundle.message("run.configuration.select.jre.dir.label"), null, BrowseFilesListener.SINGLE_DIRECTORY_DESCRIPTOR, - (ComboBox)getComponent(), + getComponent(), JreComboboxEditor.TEXT_COMPONENT_ACCESSOR); } diff --git a/platform/execution-impl/src/com/intellij/execution/impl/SingleConfigurationConfigurable.java b/platform/execution-impl/src/com/intellij/execution/impl/SingleConfigurationConfigurable.java index 1034e6a57391..f66ad8101250 100644 --- a/platform/execution-impl/src/com/intellij/execution/impl/SingleConfigurationConfigurable.java +++ b/platform/execution-impl/src/com/intellij/execution/impl/SingleConfigurationConfigurable.java @@ -11,6 +11,7 @@ import com.intellij.execution.target.LanguageRuntimeType; import com.intellij.execution.target.TargetEnvironmentAwareRunProfile; import com.intellij.execution.target.TargetEnvironmentsConfigurable; import com.intellij.execution.target.TargetEnvironmentsManager; +import com.intellij.execution.ui.RunnerAndConfigurationSettingsEditor; import com.intellij.icons.AllIcons; import com.intellij.ide.DataManager; import com.intellij.openapi.actionSystem.DataKey; @@ -428,7 +429,7 @@ public final class SingleConfigurationConfigurable defaultRuntime = ((TargetEnvironmentAwareRunProfile)configuration).getDefaultLanguageRuntimeType(); ((RunOnTargetComboBox)myRunOnComboBox).setDefaultLanguageRuntimeTime(defaultRuntime); resetRunOnComboBox(defaultTargetName); - myDefaultTargetName = defaultTargetName; + setTargetName(defaultTargetName); } myIsAllowRunningInParallel = configuration.isAllowRunningInParallel(); @@ -528,4 +529,12 @@ public final class SingleConfigurationConfigurable editor = getEditor(); + if (editor instanceof RunnerAndConfigurationSettingsEditor) { + ((RunnerAndConfigurationSettingsEditor)editor).targetChanged(chosenTarget); + } + } } diff --git a/platform/execution-impl/src/com/intellij/execution/ui/RunConfigurationFragmentedEditor.java b/platform/execution-impl/src/com/intellij/execution/ui/RunConfigurationFragmentedEditor.java index 84c131b8d30b..93a443edb2a2 100644 --- a/platform/execution-impl/src/com/intellij/execution/ui/RunConfigurationFragmentedEditor.java +++ b/platform/execution-impl/src/com/intellij/execution/ui/RunConfigurationFragmentedEditor.java @@ -34,6 +34,10 @@ public abstract class RunConfigurationFragmentedEditor)fragment : null); } + + public void targetChanged(String targetName) {} } diff --git a/platform/execution-impl/src/com/intellij/execution/ui/RunnerAndConfigurationSettingsEditor.java b/platform/execution-impl/src/com/intellij/execution/ui/RunnerAndConfigurationSettingsEditor.java index ea11f0195cc1..a7400e3ee6ff 100644 --- a/platform/execution-impl/src/com/intellij/execution/ui/RunnerAndConfigurationSettingsEditor.java +++ b/platform/execution-impl/src/com/intellij/execution/ui/RunnerAndConfigurationSettingsEditor.java @@ -36,6 +36,10 @@ public class RunnerAndConfigurationSettingsEditor extends SettingsEditor getDefaultLanguageRuntimeType(); /** - * @return display name of target environment to run on + * @return display name of target environment to run on, or null if local machine target is chosen * @see TargetEnvironmentConfiguration#getDisplayName() */ @Nullable