From b2d1270096ff7af3d49953be29c9f439e2914551 Mon Sep 17 00:00:00 2001 From: Eldar Abusalimov Date: Fri, 21 Feb 2020 07:06:49 +0300 Subject: [PATCH] IDEA-233549: run: Add CommonProgramParametersPanel.initMacroSupport() Also move addMacroSupport() from ProgramParametersConfigurator to CommonProgramParametersPanel. GitOrigin-RevId: 3e4a864e410b676febf37a7bca70bd9c2fb22804 --- .../application/ApplicationConfigurable.java | 4 +- .../ui/CommonJavaParametersPanel.java | 18 +++++-- .../execution/InputRedirectAware.java | 8 ++- .../ui/CommonProgramParametersPanel.java | 52 +++++++++++++++---- .../ui/ProgramInputRedirectPanel.java | 5 ++ .../util/ProgramParametersConfigurator.java | 23 ++------ .../execution/util/ProgramParametersUtil.java | 20 ++----- .../run/PythonRunConfigurationForm.java | 8 +-- 8 files changed, 81 insertions(+), 57 deletions(-) diff --git a/java/execution/impl/src/com/intellij/execution/application/ApplicationConfigurable.java b/java/execution/impl/src/com/intellij/execution/application/ApplicationConfigurable.java index d0031114085c..2929452740b5 100644 --- a/java/execution/impl/src/com/intellij/execution/application/ApplicationConfigurable.java +++ b/java/execution/impl/src/com/intellij/execution/application/ApplicationConfigurable.java @@ -1,4 +1,4 @@ -// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.execution.application; import com.intellij.application.options.ModuleDescriptionsComboBox; @@ -8,7 +8,6 @@ import com.intellij.execution.configurations.ConfigurationUtil; import com.intellij.execution.impl.SingleConfigurationConfigurable; import com.intellij.execution.ui.*; import com.intellij.execution.util.JreVersionDetector; -import com.intellij.execution.util.ProgramParametersConfigurator; import com.intellij.ide.DataManager; import com.intellij.openapi.options.ConfigurationException; import com.intellij.openapi.options.SettingsEditor; @@ -49,7 +48,6 @@ public class ApplicationConfigurable extends SettingsEditor myCommonProgramParameters.setModuleContext(myModuleSelector.getModule())); new ClassBrowser.AppClassBrowser(project, myModuleSelector).setField(getMainClassField()); myShortenClasspathModeCombo.setComponent(new ShortenCommandLineModeCombo(myProject, myJrePathEditor, myModule.getComponent())); diff --git a/java/execution/impl/src/com/intellij/execution/ui/CommonJavaParametersPanel.java b/java/execution/impl/src/com/intellij/execution/ui/CommonJavaParametersPanel.java index 0a1c465b9f6d..491ed00dc99e 100644 --- a/java/execution/impl/src/com/intellij/execution/ui/CommonJavaParametersPanel.java +++ b/java/execution/impl/src/com/intellij/execution/ui/CommonJavaParametersPanel.java @@ -5,9 +5,10 @@ import com.intellij.execution.CommonJavaRunConfigurationParameters; import com.intellij.execution.ExecutionBundle; import com.intellij.execution.InputRedirectAware; import com.intellij.execution.configurations.RunConfiguration; -import com.intellij.execution.util.ProgramParametersConfigurator; +import com.intellij.ide.macro.MacrosDialog; import com.intellij.openapi.ui.LabeledComponent; import com.intellij.ui.RawCommandLineEditor; +import com.intellij.ui.components.fields.ExtendableTextField; import com.intellij.util.ui.UIUtil; import javax.swing.*; @@ -25,8 +26,6 @@ public class CommonJavaParametersPanel extends CommonProgramParametersPanel { protected void addComponents() { myVMParametersComponent = LabeledComponent.create(new RawCommandLineEditor(), ExecutionBundle.message("run.configuration.java.vm.parameters.label")); - ProgramParametersConfigurator.addMacroSupport(myVMParametersComponent.getComponent().getEditorField()); - copyDialogCaption(myVMParametersComponent); myVMParametersComponent.setLabelLocation(BorderLayout.WEST); @@ -38,6 +37,19 @@ public class CommonJavaParametersPanel extends CommonProgramParametersPanel { add(myInputRedirectPanel); } + @Override + protected final boolean isMacroSupportEnabled() { + return true; + } + + @Override + protected void initMacroSupport() { + super.initMacroSupport(); + addMacroSupport(myVMParametersComponent.getComponent().getEditorField(), MacrosDialog.Filters.ALL, getPathMacros()); + addMacroSupport((ExtendableTextField)myInputRedirectPanel.getComponent().getTextField(), MacrosDialog.Filters.FILE_PATH, + getPathMacros()); + } + public void setVMParameters(String text) { myVMParametersComponent.getComponent().setText(text); } diff --git a/platform/execution-impl/src/com/intellij/execution/InputRedirectAware.java b/platform/execution-impl/src/com/intellij/execution/InputRedirectAware.java index 1e5e4fcaf434..b09262b08091 100644 --- a/platform/execution-impl/src/com/intellij/execution/InputRedirectAware.java +++ b/platform/execution-impl/src/com/intellij/execution/InputRedirectAware.java @@ -1,7 +1,9 @@ -// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.execution; import com.intellij.execution.configurations.RunConfiguration; +import com.intellij.execution.util.ProgramParametersUtil; +import com.intellij.openapi.module.Module; import com.intellij.openapi.util.JDOMExternalizerUtil; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; @@ -36,7 +38,9 @@ public interface InputRedirectAware extends RunConfiguration { String filePath = inputRedirectOptions.getRedirectInputPath(); if (!StringUtil.isEmpty(filePath)) { - filePath = FileUtil.toSystemDependentName(filePath); + Module module = configuration instanceof CommonProgramRunConfigurationParameters + ? ProgramParametersUtil.getModule((CommonProgramRunConfigurationParameters)configuration) : null; + filePath = FileUtil.toSystemDependentName(ProgramParametersUtil.expandPathAndMacros(filePath, module, configuration.getProject())); File file = new File(filePath); if (configuration instanceof CommonProgramRunConfigurationParameters && !FileUtil.isAbsolute(filePath)) { String directory = ((CommonProgramRunConfigurationParameters)configuration).getWorkingDirectory(); diff --git a/platform/execution-impl/src/com/intellij/execution/ui/CommonProgramParametersPanel.java b/platform/execution-impl/src/com/intellij/execution/ui/CommonProgramParametersPanel.java index 62ae76681ddc..c5f7433e4197 100644 --- a/platform/execution-impl/src/com/intellij/execution/ui/CommonProgramParametersPanel.java +++ b/platform/execution-impl/src/com/intellij/execution/ui/CommonProgramParametersPanel.java @@ -5,7 +5,10 @@ import com.intellij.execution.CommonProgramRunConfigurationParameters; import com.intellij.execution.ExecutionBundle; import com.intellij.execution.configuration.EnvironmentVariablesComponent; import com.intellij.execution.util.ProgramParametersConfigurator; +import com.intellij.execution.util.ProgramParametersUtil; import com.intellij.icons.AllIcons; +import com.intellij.ide.macro.EditorMacro; +import com.intellij.ide.macro.Macro; import com.intellij.ide.macro.MacrosDialog; import com.intellij.openapi.application.PathMacros; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; @@ -13,6 +16,7 @@ import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.*; import com.intellij.openapi.ui.popup.JBPopupFactory; +import com.intellij.openapi.util.registry.Registry; import com.intellij.ui.PanelWithAnchor; import com.intellij.ui.RawCommandLineEditor; import com.intellij.ui.TextAccessor; @@ -31,6 +35,7 @@ import java.awt.event.ActionListener; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.function.Predicate; public class CommonProgramParametersPanel extends JPanel implements PanelWithAnchor { protected LabeledComponent myProgramParametersComponent; @@ -93,6 +98,9 @@ public class CommonProgramParametersPanel extends JPanel implements PanelWithAnc myWorkingDirectoryComponent.setLabelLocation(BorderLayout.WEST); addComponents(); + if (isMacroSupportEnabled()) { + initMacroSupport(); + } setPreferredSize(new Dimension(10, 10)); @@ -126,7 +134,40 @@ public class CommonProgramParametersPanel extends JPanel implements PanelWithAnc return panel; } - private @NotNull Map getPathMacros() { + protected void addComponents() { + add(myProgramParametersComponent); + add(myWorkingDirectoryComponent); + add(myEnvVariablesComponent); + } + + /** + * Macro support for run configuration fields is opt-in. + * Run configurations that can handle macros (basically any using {@link ProgramParametersConfigurator} or {@link ProgramParametersUtil}) + * are encouraged to enable "add macro" inline button for program parameters and working directory fields by overriding this method, + * and optionally overriding {@link #initMacroSupport()} to enable macros for other fields. + */ + protected boolean isMacroSupportEnabled() { + return false; + } + + protected void initMacroSupport() { + addMacroSupport(myProgramParametersComponent.getComponent().getEditorField(), MacrosDialog.Filters.ALL, getPathMacros()); + addMacroSupport((ExtendableTextField)myWorkingDirectoryField.getTextField(), MacrosDialog.Filters.DIRECTORY_PATH, getPathMacros()); + } + + public static void addMacroSupport(@NotNull ExtendableTextField textField) { + addMacroSupport(textField, MacrosDialog.Filters.ALL, null); + } + + protected static void addMacroSupport(@NotNull ExtendableTextField textField, + @NotNull Predicate macroFilter, + @Nullable Map userMacros) { + if (Registry.is("allow.macros.for.run.configurations")) { + MacrosDialog.addTextFieldExtension(textField, macroFilter.and(macro -> !(macro instanceof EditorMacro)), userMacros); + } + } + + protected @NotNull Map getPathMacros() { final HashMap macros = new HashMap<>(PathMacros.getInstance().getUserMacros()); if (myModuleContext != null || myHasModuleMacro) { macros.put(PathMacroUtil.MODULE_DIR_MACRO_NAME, PathMacros.getInstance().getValue(PathMacroUtil.MODULE_DIR_MACRO_NAME)); @@ -136,15 +177,6 @@ public class CommonProgramParametersPanel extends JPanel implements PanelWithAnc return macros; } - protected void addComponents() { - add(myProgramParametersComponent); - add(myWorkingDirectoryComponent); - add(myEnvVariablesComponent); - - ProgramParametersConfigurator.addMacroSupport((ExtendableTextField)myWorkingDirectoryField.getTextField(), - MacrosDialog.Filters.DIRECTORY_PATH, getPathMacros()); - } - protected void copyDialogCaption(final LabeledComponent component) { final RawCommandLineEditor rawCommandLineEditor = component.getComponent(); rawCommandLineEditor.setDialogCaption(component.getRawText()); diff --git a/platform/execution-impl/src/com/intellij/execution/ui/ProgramInputRedirectPanel.java b/platform/execution-impl/src/com/intellij/execution/ui/ProgramInputRedirectPanel.java index b00be95bfbf8..86215361bafa 100644 --- a/platform/execution-impl/src/com/intellij/execution/ui/ProgramInputRedirectPanel.java +++ b/platform/execution-impl/src/com/intellij/execution/ui/ProgramInputRedirectPanel.java @@ -21,6 +21,7 @@ import java.awt.event.ActionListener; public class ProgramInputRedirectPanel extends JPanel implements PanelWithAnchor { private final JBCheckBox myCheckBox = new JBCheckBox(ExecutionBundle.message("redirect.input.from")); + private final TextFieldWithBrowseButton myInputFile = new TextFieldWithBrowseButton(); public ProgramInputRedirectPanel() { @@ -40,6 +41,10 @@ public class ProgramInputRedirectPanel extends JPanel implements PanelWithAnchor }); } + public @NotNull TextFieldWithBrowseButton getComponent() { + return myInputFile; + } + @Override public JComponent getAnchor() { return myCheckBox.getAnchor(); diff --git a/platform/execution-impl/src/com/intellij/execution/util/ProgramParametersConfigurator.java b/platform/execution-impl/src/com/intellij/execution/util/ProgramParametersConfigurator.java index f65dafbd29f7..80bc61917732 100644 --- a/platform/execution-impl/src/com/intellij/execution/util/ProgramParametersConfigurator.java +++ b/platform/execution-impl/src/com/intellij/execution/util/ProgramParametersConfigurator.java @@ -5,7 +5,9 @@ import com.intellij.execution.CommonProgramRunConfigurationParameters; import com.intellij.execution.configurations.ModuleBasedConfiguration; import com.intellij.execution.configurations.RuntimeConfigurationWarning; import com.intellij.execution.configurations.SimpleProgramParameters; -import com.intellij.ide.macro.*; +import com.intellij.ide.macro.Macro; +import com.intellij.ide.macro.MacroManager; +import com.intellij.ide.macro.PromptingMacro; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.actionSystem.DataContext; import com.intellij.openapi.actionSystem.LangDataKeys; @@ -20,7 +22,6 @@ import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.registry.Registry; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; -import com.intellij.ui.components.fields.ExtendableTextField; import com.intellij.util.EnvironmentUtil; import com.intellij.util.PathUtil; import com.intellij.util.execution.ParametersListUtil; @@ -32,7 +33,6 @@ import org.jetbrains.jps.model.serialization.PathMacroUtil; import java.io.File; import java.util.HashMap; import java.util.Map; -import java.util.function.Predicate; public class ProgramParametersConfigurator { private static final ExtensionPointName WORKING_DIRECTORY_PROVIDER_EP_NAME= ExtensionPointName @@ -74,23 +74,6 @@ public class ProgramParametersConfigurator { }; } - public static void addMacroSupport(@NotNull ExtendableTextField textField) { - addMacroSupport(textField, MacrosDialog.Filters.ALL); - } - - public static void addMacroSupport(@NotNull ExtendableTextField textField, - @NotNull Predicate macroFilter) { - addMacroSupport(textField, macroFilter, null); - } - - public static void addMacroSupport(@NotNull ExtendableTextField textField, - @NotNull Predicate macroFilter, - @Nullable Map userMacros) { - if (Registry.is("allow.macros.for.run.configurations")) { - MacrosDialog.addTextFieldExtension(textField, macroFilter.and(macro -> !(macro instanceof EditorMacro)), userMacros); - } - } - public static String expandMacros(@Nullable String path) { return expandMacros(path, DataContext.EMPTY_CONTEXT); } diff --git a/platform/execution-impl/src/com/intellij/execution/util/ProgramParametersUtil.java b/platform/execution-impl/src/com/intellij/execution/util/ProgramParametersUtil.java index 369eb15c54c0..e1317b4467e2 100644 --- a/platform/execution-impl/src/com/intellij/execution/util/ProgramParametersUtil.java +++ b/platform/execution-impl/src/com/intellij/execution/util/ProgramParametersUtil.java @@ -1,18 +1,4 @@ -/* - * Copyright 2000-2010 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.execution.util; import com.intellij.execution.CommonProgramRunConfigurationParameters; @@ -40,6 +26,10 @@ public class ProgramParametersUtil { return new ProgramParametersConfigurator().expandPath(path, module, project); } + public static String expandPathAndMacros(String path, Module module, Project project) { + return new ProgramParametersConfigurator().expandPathAndMacros(path, module, project); + } + @Nullable public static Module getModule(CommonProgramRunConfigurationParameters configuration) { return new ProgramParametersConfigurator().getModule(configuration); diff --git a/python/src/com/jetbrains/python/run/PythonRunConfigurationForm.java b/python/src/com/jetbrains/python/run/PythonRunConfigurationForm.java index 5e877011a282..c8995392d30e 100644 --- a/python/src/com/jetbrains/python/run/PythonRunConfigurationForm.java +++ b/python/src/com/jetbrains/python/run/PythonRunConfigurationForm.java @@ -1,8 +1,8 @@ -// Copyright 2000-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. +// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.jetbrains.python.run; import com.google.common.collect.Lists; -import com.intellij.execution.util.ProgramParametersConfigurator; +import com.intellij.execution.ui.CommonProgramParametersPanel; import com.intellij.openapi.fileChooser.FileChooserDescriptor; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.module.Module; @@ -30,10 +30,10 @@ import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.JBUI; import com.jetbrains.PySymbolFieldWithBrowseButton; import com.jetbrains.PySymbolFieldWithBrowseButtonKt; -import com.jetbrains.extensions.python.FileChooserDescriptorExtKt; import com.jetbrains.extensions.ContextAnchor; import com.jetbrains.extensions.ModuleBasedContextAnchor; import com.jetbrains.extensions.ProjectSdkContextAnchor; +import com.jetbrains.extensions.python.FileChooserDescriptorExtKt; import com.jetbrains.python.PyBundle; import com.jetbrains.python.debugger.PyDebuggerOptionsProvider; import org.jetbrains.annotations.NotNull; @@ -146,7 +146,7 @@ public class PythonRunConfigurationForm implements PythonRunConfigurationParams, group.add(myRedirectInputCheckBox); group.add(myShowCommandLineCheckbox); - ProgramParametersConfigurator.addMacroSupport(myScriptParametersTextField.getEditorField()); + CommonProgramParametersPanel.addMacroSupport(myScriptParametersTextField.getEditorField()); } private void updateRunModuleMode() {