From e05e91581dc9b9b5e6fcdab1a0c97a8674874eae Mon Sep 17 00:00:00 2001 From: Tagir Valeev Date: Wed, 5 Oct 2022 09:49:06 +0200 Subject: [PATCH] [live-templates] Action to edit template settings (IDEA-201181) GitOrigin-RevId: 0711d85c39e94ee2855f9991bf30eb8098307ca6 --- .../template/LiveTemplateTest.groovy | 30 +++++++++- .../template/impl/InvokeTemplateAction.java | 57 ++++++++++++++++++- 2 files changed, 83 insertions(+), 4 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/java/codeInsight/template/LiveTemplateTest.groovy b/java/java-tests/testSrc/com/intellij/java/codeInsight/template/LiveTemplateTest.groovy index 531fe4fbe4e6..a468389d7d9a 100644 --- a/java/java-tests/testSrc/com/intellij/java/codeInsight/template/LiveTemplateTest.groovy +++ b/java/java-tests/testSrc/com/intellij/java/codeInsight/template/LiveTemplateTest.groovy @@ -18,9 +18,10 @@ import com.intellij.codeInsight.template.macro.CompleteMacro import com.intellij.codeInsight.template.macro.ConcatMacro import com.intellij.codeInsight.template.macro.FilePathMacroBase import com.intellij.codeInsight.template.macro.SplitWordsMacro +import com.intellij.ide.DataManager import com.intellij.internal.statistic.FUCollectorTestCase import com.intellij.lang.java.JavaLanguage -import com.intellij.openapi.actionSystem.IdeActions +import com.intellij.openapi.actionSystem.* import com.intellij.openapi.command.WriteCommandAction import com.intellij.openapi.editor.Editor import com.intellij.openapi.project.DumbServiceImpl @@ -38,7 +39,6 @@ import org.jdom.Element import org.jetbrains.annotations.NotNull import static com.intellij.testFramework.EdtTestUtil.runInEdtAndWait - /** * @author spleaner */ @@ -1297,4 +1297,30 @@ class Foo { assert logEvent assert logEvent.event.id == "started" } + + void "test additional actions"() { + TemplateManager manager = TemplateManager.getInstance(getProject()) + TemplateImpl template = (TemplateImpl)manager.createTemplate('doubleparen', 'user', '(($END$$SELECTION$))') + TemplateContextType contextType = contextType(JavaCodeContextType.class) + template.getTemplateContext().setEnabled(contextType, true) + CodeInsightTestUtil.addTemplate(template, myFixture.getTestRootDisposable()) + myFixture.configureByText("a.java", "class X {{hello}}") + def group = SurroundWithTemplateHandler.createActionGroup(editor, myFixture.file, new HashSet()) + def action = group.find { it.templateText == "doubleparen" } + assert action instanceof ActionGroup + final Presentation presentation = new Presentation() + final DataContext context = DataManager.getInstance().getDataContext() + final AnActionEvent event = new AnActionEvent(null, context, "", presentation, ActionManager.getInstance(), 0); + assert !presentation.performGroup + assert !presentation.popupGroup + action.update(event) + assert presentation.performGroup + assert presentation.popupGroup + def children = (action as ActionGroup).getChildren(event) + assert children[0].templateText == "Edit live template settings" + assert children[1].templateText == "Disable 'doubleparen' template" + assert !template.isDeactivated() + children[1].actionPerformed(event) + assert template.isDeactivated() + } } \ No newline at end of file diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/InvokeTemplateAction.java b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/InvokeTemplateAction.java index 65cba6ef5ef1..1385f5cc59b8 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/InvokeTemplateAction.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/InvokeTemplateAction.java @@ -3,28 +3,34 @@ package com.intellij.codeInsight.template.impl; import com.intellij.codeInsight.CodeInsightBundle; import com.intellij.codeInsight.template.TemplateManager; +import com.intellij.icons.AllIcons; +import com.intellij.openapi.actionSystem.ActionUpdateThread; import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; +import com.intellij.openapi.actionSystem.DefaultActionGroup; import com.intellij.openapi.command.CommandProcessor; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.fileEditor.FileDocumentManager; +import com.intellij.openapi.options.ShowSettingsUtil; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.NlsActions.ActionText; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.ReadonlyStatusHandler; import com.intellij.openapi.vfs.VirtualFile; +import com.intellij.util.PlatformIcons; import com.intellij.util.ui.UIUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.util.Collections; +import java.util.List; import java.util.Set; /** * @author peter */ -public class InvokeTemplateAction extends AnAction { +public class InvokeTemplateAction extends DefaultActionGroup { private final TemplateImpl myTemplate; private final Editor myEditor; private final Project myProject; @@ -43,13 +49,26 @@ public class InvokeTemplateAction extends AnAction { Set usedMnemonicsSet, @Nullable Runnable afterInvocationCallback) { super(extractMnemonic(template.getKey(), usedMnemonicsSet) + - (StringUtil.isEmptyOrSpaces(template.getDescription()) ? "" : ". " + template.getDescription())); + (StringUtil.isEmptyOrSpaces(template.getDescription()) ? "" : ". " + template.getDescription()), + List.of(new EditTemplateSettingsAction(project, template), + new DisableTemplateSettingsAction(template))); myTemplate = template; myProject = project; myEditor = editor; myCallback = afterInvocationCallback; } + @Override + public void update(@NotNull AnActionEvent e) { + e.getPresentation().setPopupGroup(true); + e.getPresentation().setPerformGroup(true); + } + + @Override + public @NotNull ActionUpdateThread getActionUpdateThread() { + return ActionUpdateThread.EDT; + } + public static @ActionText String extractMnemonic(@ActionText String caption, Set usedMnemonics) { if (StringUtil.isEmpty(caption)) return ""; @@ -111,4 +130,38 @@ public class InvokeTemplateAction extends AnAction { myCallback.run(); } } + + private static class EditTemplateSettingsAction extends AnAction { + private final Project myProject; + private final TemplateImpl myTemplate; + + private EditTemplateSettingsAction(Project project, TemplateImpl template) { + //noinspection DialogTitleCapitalization + super(CodeInsightBundle.message("action.text.edit.live.template.settings"), null, PlatformIcons.EDIT); + myProject = project; + myTemplate = template; + } + + @Override + public void actionPerformed(@NotNull AnActionEvent e) { + final LiveTemplatesConfigurable configurable = new LiveTemplatesConfigurable(); + ShowSettingsUtil.getInstance().editConfigurable(myProject, configurable, () -> configurable.getTemplateListPanel().editTemplate( + myTemplate)); + } + } + + private static class DisableTemplateSettingsAction extends AnAction { + private final TemplateImpl myTemplate; + + private DisableTemplateSettingsAction(TemplateImpl template) { + //noinspection DialogTitleCapitalization + super(CodeInsightBundle.message("action.text.disable.live.template", template.getKey()), null, AllIcons.Actions.Cancel); + myTemplate = template; + } + + @Override + public void actionPerformed(@NotNull AnActionEvent e) { + myTemplate.setDeactivated(true); + } + } }