IDEA-233549: run: Add CommonProgramParametersPanel.initMacroSupport()

Also move addMacroSupport() from ProgramParametersConfigurator
to CommonProgramParametersPanel.

GitOrigin-RevId: 3e4a864e410b676febf37a7bca70bd9c2fb22804
This commit is contained in:
Eldar Abusalimov
2020-02-25 02:05:53 +00:00
committed by intellij-monorepo-bot
parent 8fc913243f
commit b2d1270096
8 changed files with 81 additions and 57 deletions
@@ -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<ApplicationConfigura
myJrePathEditor.setDefaultJreSelector(DefaultJreSelector.fromSourceRootsDependencies(myModule.getComponent(), getMainClassField()));
myCommonProgramParameters.setModuleContext(myModuleSelector.getModule());
ProgramParametersConfigurator.addMacroSupport(myCommonProgramParameters.getProgramParametersComponent().getComponent().getEditorField());
myModule.getComponent().addActionListener(e -> myCommonProgramParameters.setModuleContext(myModuleSelector.getModule()));
new ClassBrowser.AppClassBrowser<EditorTextField>(project, myModuleSelector).setField(getMainClassField());
myShortenClasspathModeCombo.setComponent(new ShortenCommandLineModeCombo(myProject, myJrePathEditor, myModule.getComponent()));
@@ -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);
}
@@ -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();
@@ -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<RawCommandLineEditor> 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<String, String> 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<? super Macro> macroFilter,
@Nullable Map<String, String> userMacros) {
if (Registry.is("allow.macros.for.run.configurations")) {
MacrosDialog.addTextFieldExtension(textField, macroFilter.and(macro -> !(macro instanceof EditorMacro)), userMacros);
}
}
protected @NotNull Map<String, String> getPathMacros() {
final HashMap<String, String> 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<RawCommandLineEditor> component) {
final RawCommandLineEditor rawCommandLineEditor = component.getComponent();
rawCommandLineEditor.setDialogCaption(component.getRawText());
@@ -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();
@@ -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<WorkingDirectoryProvider> 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<? super Macro> macroFilter) {
addMacroSupport(textField, macroFilter, null);
}
public static void addMacroSupport(@NotNull ExtendableTextField textField,
@NotNull Predicate<? super Macro> macroFilter,
@Nullable Map<String, String> 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);
}
@@ -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);
@@ -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() {