diff --git a/java/execution/impl/src/com/intellij/execution/util/JavaParametersUtil.java b/java/execution/impl/src/com/intellij/execution/util/JavaParametersUtil.java index 86d339aee6cb..bcaf1b8a94a4 100644 --- a/java/execution/impl/src/com/intellij/execution/util/JavaParametersUtil.java +++ b/java/execution/impl/src/com/intellij/execution/util/JavaParametersUtil.java @@ -139,7 +139,7 @@ public class JavaParametersUtil { parameters.configureByProject(project, classPathType, createProjectJdk(project, jreHome)); } - private static Sdk createModuleJdk(final Module module, boolean productionOnly, @Nullable String jreHome) throws CantRunException { + public static Sdk createModuleJdk(final Module module, boolean productionOnly, @Nullable String jreHome) throws CantRunException { return jreHome == null ? JavaParameters.getValidJdkToRunModule(module, productionOnly) : createAlternativeJdk(jreHome); } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyRunConfigurationEditor.form b/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyRunConfigurationEditor.form index c88ca66580fe..c082d99f08b8 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyRunConfigurationEditor.form +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyRunConfigurationEditor.form @@ -1,104 +1,63 @@
- + - + - + - + + + + + + + + + + + + + + + + + + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + - + - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + + + - - - - - - - - - - - - + - + @@ -107,12 +66,17 @@ - + + + + + + diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyRunConfigurationEditor.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyRunConfigurationEditor.java index 1ed48a1cbe99..423a55b1ead0 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyRunConfigurationEditor.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyRunConfigurationEditor.java @@ -17,116 +17,123 @@ package org.jetbrains.plugins.groovy.runner; import com.intellij.application.options.ModulesComboBox; -import com.intellij.execution.configuration.EnvironmentVariablesComponent; -import com.intellij.ide.util.BrowseFilesListener; -import com.intellij.openapi.fileChooser.FileChooserDescriptor; +import com.intellij.execution.ui.CommonJavaParametersPanel; +import com.intellij.execution.ui.DefaultJreSelector.SdkFromModuleDependencies; +import com.intellij.execution.ui.JrePathEditor; +import com.intellij.execution.util.ScriptFileUtil; +import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.SettingsEditor; +import com.intellij.openapi.project.Project; +import com.intellij.openapi.roots.ProjectFileIndex; +import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.ui.LabeledComponent; +import com.intellij.openapi.ui.TextFieldWithBrowseButton; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.ui.FieldPanel; +import com.intellij.ui.DocumentAdapter; import com.intellij.ui.PanelWithAnchor; -import com.intellij.ui.RawCommandLineEditor; -import com.intellij.ui.components.JBLabel; +import com.intellij.util.ui.UIUtil; +import kotlin.jvm.functions.Function0; import org.jetbrains.annotations.NotNull; import org.jetbrains.plugins.groovy.GroovyFileType; import javax.swing.*; -import java.awt.*; +import javax.swing.event.DocumentEvent; public class GroovyRunConfigurationEditor extends SettingsEditor implements PanelWithAnchor { - private ModulesComboBox myModulesBox; + private JPanel myMainPanel; - private RawCommandLineEditor myVMParameters; - private RawCommandLineEditor myParameters; - private JPanel scriptPathPanel; - private JPanel workDirPanel; + + private LabeledComponent myScriptPathComponent; + private CommonJavaParametersPanel myCommonJavaParametersPanel; + + private LabeledComponent myModulesComboBoxComponent; + private JrePathEditor myJrePathEditor; + private JCheckBox myDebugCB; - private EnvironmentVariablesComponent myEnvVariables; - private JBLabel myScriptParametersLabel; private JCheckBox myAddClasspathCB; - private final JTextField scriptPathField; - private final JTextField workDirField; - private JComponent anchor; - public GroovyRunConfigurationEditor() { + private JComponent myAnchor; - scriptPathField = new JTextField(); - final BrowseFilesListener scriptBrowseListener = new BrowseFilesListener(scriptPathField, - "Script Path", - "Specify path to script", - new FileChooserDescriptor(true, false, false, false, false, false) { - @Override - public boolean isFileSelectable(VirtualFile file) { - return file.getFileType() == GroovyFileType.GROOVY_FILE_TYPE; + public GroovyRunConfigurationEditor(@NotNull Project project) { + final TextFieldWithBrowseButton scriptPath = myScriptPathComponent.getComponent(); + scriptPath.addBrowseFolderListener( + "Script Path", "Specify path to script", project, + FileChooserDescriptorFactory.createSingleFileDescriptor(GroovyFileType.GROOVY_FILE_TYPE) + ); + + final ModulesComboBox modulesComboBox = myModulesComboBoxComponent.getComponent(); + modulesComboBox.addActionListener(e -> myCommonJavaParametersPanel.setModuleContext(modulesComboBox.getSelectedModule())); + ProjectFileIndex fileIndex = ProjectRootManager.getInstance(project).getFileIndex(); + Function0 productionOnly = () -> { + VirtualFile script = ScriptFileUtil.findScriptFileByPath(scriptPath.getText()); + return script != null && !fileIndex.isInTestSourceContent(script); + }; + myJrePathEditor.setDefaultJreSelector(new SdkFromModuleDependencies(modulesComboBox, productionOnly) { + @Override + public void addChangeListener(@NotNull Runnable listener) { + super.addChangeListener(listener); + scriptPath.getChildComponent().getDocument().addDocumentListener( + new DocumentAdapter() { + @Override + protected void textChanged(DocumentEvent e) { + listener.run(); + } } - }); - final FieldPanel scriptFieldPanel = new FieldPanel(scriptPathField, null, null, scriptBrowseListener, null); - scriptPathPanel.setLayout(new BorderLayout()); - scriptPathPanel.add(scriptFieldPanel, BorderLayout.CENTER); - - workDirField = new JTextField(); - final BrowseFilesListener workDirBrowseFilesListener = new BrowseFilesListener(workDirField, - "Working directory", - "Specify working directory", - BrowseFilesListener.SINGLE_DIRECTORY_DESCRIPTOR); - final FieldPanel workDirFieldPanel = new FieldPanel(workDirField, null, null, workDirBrowseFilesListener, null); - workDirPanel.setLayout(new BorderLayout()); - workDirPanel.add(workDirFieldPanel, BorderLayout.CENTER); - - setAnchor(myEnvVariables.getLabel()); + ); + } + }); + myAnchor = UIUtil.mergeComponentsWithAnchor( + myScriptPathComponent, + myCommonJavaParametersPanel, + myModulesComboBoxComponent, + myJrePathEditor + ); } @Override public void resetEditorFrom(@NotNull GroovyScriptRunConfiguration configuration) { - myVMParameters.setDialogCaption("VM Options"); - myVMParameters.setText(configuration.getVMParameters()); + myScriptPathComponent.getComponent().setText(configuration.getScriptPath()); + myCommonJavaParametersPanel.reset(configuration); - myParameters.setDialogCaption("Script Parameters"); - myParameters.setText(configuration.getProgramParameters()); + myModulesComboBoxComponent.getComponent().setModules(configuration.getValidModules()); + myModulesComboBoxComponent.getComponent().setSelectedModule(configuration.getConfigurationModule().getModule()); + myJrePathEditor.setPathOrName(configuration.getAlternativeJrePath(), configuration.isAlternativeJrePathEnabled()); - scriptPathField.setText(configuration.getScriptPath()); - workDirField.setText(configuration.getWorkingDirectory()); - - myDebugCB.setEnabled(true); myDebugCB.setSelected(configuration.isDebugEnabled()); - myAddClasspathCB.setSelected(configuration.isAddClasspathToTheRunner()); - - myModulesBox.setModules(configuration.getValidModules()); - myModulesBox.setSelectedModule(configuration.getConfigurationModule().getModule()); - - myEnvVariables.setEnvs(configuration.getEnvs()); } @Override public void applyEditorTo(@NotNull GroovyScriptRunConfiguration configuration) throws ConfigurationException { - configuration.setModule(myModulesBox.getSelectedModule()); - configuration.setVMParameters(myVMParameters.getText()); + configuration.setScriptPath(myScriptPathComponent.getComponent().getText().trim()); + myCommonJavaParametersPanel.applyTo(configuration); + + configuration.setModule(myModulesComboBoxComponent.getComponent().getSelectedModule()); + configuration.setAlternativeJrePathEnabled(myJrePathEditor.isAlternativeJreSelected()); + configuration.setAlternativeJrePath(myJrePathEditor.getJrePathOrName()); + configuration.setDebugEnabled(myDebugCB.isSelected()); configuration.setAddClasspathToTheRunner(myAddClasspathCB.isSelected()); - configuration.setProgramParameters(myParameters.getText()); - configuration.setScriptPath(scriptPathField.getText().trim()); - configuration.setWorkingDirectory(workDirField.getText().trim()); - configuration.setEnvs(myEnvVariables.getEnvs()); } @Override @NotNull public JComponent createEditor() { - myDebugCB.setEnabled(true); - myDebugCB.setSelected(false); return myMainPanel; } @Override public JComponent getAnchor() { - return anchor; + return myAnchor; } @Override public void setAnchor(JComponent anchor) { - this.anchor = anchor; - myScriptParametersLabel.setAnchor(anchor); - myEnvVariables.setAnchor(anchor); + myAnchor = anchor; + myScriptPathComponent.setAnchor(anchor); + myCommonJavaParametersPanel.setAnchor(anchor); + myModulesComboBoxComponent.setAnchor(anchor); + myJrePathEditor.setAnchor(anchor); } } diff --git a/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyScriptRunConfiguration.java b/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyScriptRunConfiguration.java index ee82e7356c51..ef5c33636332 100644 --- a/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyScriptRunConfiguration.java +++ b/plugins/groovy/src/org/jetbrains/plugins/groovy/runner/GroovyScriptRunConfiguration.java @@ -24,6 +24,7 @@ import com.intellij.execution.process.OSProcessHandler; import com.intellij.execution.process.ProcessAdapter; import com.intellij.execution.process.ProcessEvent; import com.intellij.execution.runners.ExecutionEnvironment; +import com.intellij.execution.util.JavaParametersUtil; import com.intellij.execution.util.ProgramParametersUtil; import com.intellij.execution.util.ScriptFileUtil; import com.intellij.openapi.application.ApplicationManager; @@ -38,6 +39,7 @@ import com.intellij.openapi.roots.ModuleRootManager; import com.intellij.openapi.roots.ProjectRootManager; import com.intellij.openapi.util.JDOMExternalizer; import com.intellij.openapi.util.WriteExternalException; +import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.LocalFileSystem; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.openapi.vfs.VirtualFileManager; @@ -82,6 +84,9 @@ public class GroovyScriptRunConfiguration extends ModuleBasedConfiguration envs = new LinkedHashMap<>(); public boolean passParentEnv = true; + private boolean myAlternativeJrePathEnabled; + private @Nullable String myAlternativeJrePath; + public GroovyScriptRunConfiguration(final String name, final Project project, final ConfigurationFactory factory) { super(name, new RunConfigurationModule(project), factory); workDir = PathUtil.getLocalPath(project.getBaseDir()); @@ -142,6 +147,9 @@ public class GroovyScriptRunConfiguration extends ModuleBasedConfiguration getConfigurationEditor() { - return new GroovyRunConfigurationEditor(); + return new GroovyRunConfigurationEditor(getProject()); } @Override @@ -297,6 +317,7 @@ public class GroovyScriptRunConfiguration extends ModuleBasedConfiguration