diff --git a/java/execution/impl/src/com/intellij/execution/application/JavaApplicationSettingsEditor.java b/java/execution/impl/src/com/intellij/execution/application/JavaApplicationSettingsEditor.java index d7ae93dbb732..3d00410c3d32 100644 --- a/java/execution/impl/src/com/intellij/execution/application/JavaApplicationSettingsEditor.java +++ b/java/execution/impl/src/com/intellij/execution/application/JavaApplicationSettingsEditor.java @@ -4,8 +4,10 @@ package com.intellij.execution.application; import com.intellij.application.options.ModuleDescriptionsComboBox; import com.intellij.execution.ExecutionBundle; import com.intellij.execution.ui.*; +import com.intellij.ide.macro.MacrosDialog; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.LabeledComponent; +import com.intellij.openapi.util.Computable; import com.intellij.ui.EditorTextField; import com.intellij.ui.RawCommandLineEditor; @@ -26,11 +28,15 @@ public class JavaApplicationSettingsEditor extends RunConfigurationFragmentedEdi @Override protected Collection> createFragments() { List> fragments = new ArrayList<>(); - fragments.add(CommonTags.parallelRun()); - fragments.add(CommonParameterFragments.createRedirectFragment()); - fragments.addAll(new CommonParameterFragments(myProject).getFragments()); SettingsEditorFragment> moduleClasspath = CommonJavaFragments.moduleClasspath(myProject); + Computable hasModule = () -> moduleClasspath.component().getComponent().getSelectedModule() != null; + + fragments.add(CommonTags.parallelRun()); + fragments.add(CommonParameterFragments.createRedirectFragment(hasModule)); + + CommonParameterFragments commonParameterFragments = new CommonParameterFragments<>(myProject, hasModule); + fragments.addAll(commonParameterFragments.getFragments()); fragments.add(CommonJavaFragments.createBuildBeforeRun()); fragments.add(CommonJavaFragments.createEnvParameters()); @@ -38,7 +44,9 @@ public class JavaApplicationSettingsEditor extends RunConfigurationFragmentedEdi jrePathEditor.getLabel().setVisible(false); jrePathEditor.setDefaultJreSelector(DefaultJreSelector.projectSdk(myProject)); - LabeledComponent vmParams = LabeledComponent.create(new RawCommandLineEditor(), + RawCommandLineEditor commandLineEditor = new RawCommandLineEditor(); + MacrosDialog.addMacroSupport(commandLineEditor.getEditorField(), MacrosDialog.Filters.ALL, hasModule); + LabeledComponent vmParams = LabeledComponent.create(commandLineEditor, ExecutionBundle.message("run.configuration.java.vm.parameters.label")); vmParams.setLabelLocation(BorderLayout.WEST); String group = ExecutionBundle.message("group.java.options"); diff --git a/platform/execution-impl/src/com/intellij/execution/ui/CommonParameterFragments.java b/platform/execution-impl/src/com/intellij/execution/ui/CommonParameterFragments.java index 31364c15bd91..d175ba22ee21 100644 --- a/platform/execution-impl/src/com/intellij/execution/ui/CommonParameterFragments.java +++ b/platform/execution-impl/src/com/intellij/execution/ui/CommonParameterFragments.java @@ -4,13 +4,16 @@ package com.intellij.execution.ui; import com.intellij.execution.CommonProgramRunConfigurationParameters; import com.intellij.execution.ExecutionBundle; import com.intellij.execution.InputRedirectAware; +import com.intellij.ide.macro.MacrosDialog; import com.intellij.openapi.fileChooser.FileChooserDescriptorFactory; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.LabeledComponent; import com.intellij.openapi.ui.TextComponentAccessor; import com.intellij.openapi.ui.TextFieldWithBrowseButton; +import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.io.FileUtil; import com.intellij.ui.RawCommandLineEditor; +import com.intellij.ui.components.fields.ExtendableTextField; import org.jetbrains.annotations.NotNull; import java.awt.*; @@ -23,9 +26,10 @@ public class CommonParameterFragments> myFragments = new ArrayList<>(); - public CommonParameterFragments(@NotNull Project project) { + public CommonParameterFragments(@NotNull Project project, Computable hasModule) { RawCommandLineEditor commandLineEditor = new RawCommandLineEditor(); commandLineEditor.getEditorField().getEmptyText().setText(ExecutionBundle.message("run.configuration.program.hint")); + MacrosDialog.addMacroSupport(commandLineEditor.getEditorField(), MacrosDialog.Filters.ALL, hasModule); myFragments.add(new SettingsEditorFragment<>("commandLineParameters", null, null, commandLineEditor, 100, (settings, component) -> component.setText(settings.getProgramParameters()), @@ -37,6 +41,7 @@ public class CommonParameterFragments field = LabeledComponent.create(workingDirectoryField, ExecutionBundle.message( "run.configuration.working.directory.label")); @@ -51,12 +56,13 @@ public class CommonParameterFragments SettingsEditorFragment createRedirectFragment() { + public static SettingsEditorFragment createRedirectFragment(Computable hasModule) { TextFieldWithBrowseButton inputFile = new TextFieldWithBrowseButton(); inputFile.addBrowseFolderListener(null, null, null, FileChooserDescriptorFactory.createSingleFileDescriptor(), TextComponentAccessor.TEXT_FIELD_WHOLE_TEXT); + MacrosDialog.addMacroSupport((ExtendableTextField)inputFile.getTextField(), MacrosDialog.Filters.ALL, hasModule); LabeledComponent labeledComponent = LabeledComponent.create(inputFile, ExecutionBundle.message("redirect.input.from")); labeledComponent.setLabelLocation(BorderLayout.WEST); 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 52213a095a40..0dc862bb3968 100644 --- a/platform/execution-impl/src/com/intellij/execution/ui/CommonProgramParametersPanel.java +++ b/platform/execution-impl/src/com/intellij/execution/ui/CommonProgramParametersPanel.java @@ -10,7 +10,6 @@ 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; import com.intellij.openapi.module.Module; import com.intellij.openapi.project.Project; @@ -26,13 +25,11 @@ import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.jps.model.serialization.PathMacroUtil; import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Predicate; @@ -179,13 +176,7 @@ public class CommonProgramParametersPanel extends JPanel implements PanelWithAnc } 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)); - macros.put(ProgramParametersConfigurator.MODULE_WORKING_DIR, - PathMacros.getInstance().getValue(PathMacroUtil.MODULE_WORKING_DIR_NAME)); - } - return macros; + return MacrosDialog.getPathMacros(myModuleContext != null || myHasModuleMacro); } protected void copyDialogCaption(final LabeledComponent component) { diff --git a/platform/execution-impl/src/com/intellij/ide/macro/MacrosDialog.java b/platform/execution-impl/src/com/intellij/ide/macro/MacrosDialog.java index 15acdab5e246..1987d7b5832b 100644 --- a/platform/execution-impl/src/com/intellij/ide/macro/MacrosDialog.java +++ b/platform/execution-impl/src/com/intellij/ide/macro/MacrosDialog.java @@ -2,13 +2,16 @@ package com.intellij.ide.macro; import com.intellij.execution.ExecutionBundle; +import com.intellij.execution.util.ProgramParametersConfigurator; import com.intellij.icons.AllIcons; import com.intellij.ide.DataManager; import com.intellij.ide.IdeBundle; import com.intellij.openapi.actionSystem.impl.SimpleDataContext; +import com.intellij.openapi.application.PathMacros; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.DialogWrapper; import com.intellij.openapi.ui.popup.ListItemDescriptorAdapter; +import com.intellij.openapi.util.Computable; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.wm.IdeFocusManager; import com.intellij.ui.DoubleClickListener; @@ -23,6 +26,7 @@ import com.intellij.util.containers.ContainerUtil; import com.intellij.util.ui.JBUI; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import org.jetbrains.jps.model.serialization.PathMacroUtil; import javax.swing.*; import javax.swing.event.ListSelectionEvent; @@ -32,6 +36,7 @@ import javax.swing.text.JTextComponent; import java.awt.*; import java.awt.event.MouseEvent; import java.util.Comparator; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.function.Predicate; @@ -68,6 +73,14 @@ public final class MacrosDialog extends DialogWrapper { () -> show(textField, macroFilter, userMacros))); } + public static void addMacroSupport(@NotNull ExtendableTextField textField, + @NotNull Predicate macroFilter, + Computable hasModule) { + textField.addExtension(ExtendableTextComponent.Extension.create( + AllIcons.General.InlineAdd, AllIcons.General.InlineAddHover, ExecutionBundle.message("insert.macros"), + () -> show(textField, macroFilter, getPathMacros(hasModule.compute())))); + } + public static void show(@NotNull JTextComponent textComponent) { show(textComponent, Filters.ALL, null); } @@ -223,6 +236,17 @@ public final class MacrosDialog extends DialogWrapper { return panel; } + @NotNull + public static HashMap getPathMacros(boolean addModuleMacros) { + final HashMap macros = new HashMap<>(PathMacros.getInstance().getUserMacros()); + if (addModuleMacros) { + macros.put(PathMacroUtil.MODULE_DIR_MACRO_NAME, PathMacros.getInstance().getValue(PathMacroUtil.MODULE_DIR_MACRO_NAME)); + macros.put(ProgramParametersConfigurator.MODULE_WORKING_DIR, + PathMacros.getInstance().getValue(PathMacroUtil.MODULE_WORKING_DIR_NAME)); + } + return macros; + } + /** * Macro info shown in list */