From 0412d3fe7139431c2db54817d3d7b751e9354b79 Mon Sep 17 00:00:00 2001 From: Dmitry Avdeev Date: Fri, 18 Sep 2015 13:36:54 +0300 Subject: [PATCH] embedded live templates: support variables --- .../EmbeddedLiveTemplatesTest.java | 24 ++++++++++++++++--- .../actions/CreateFileFromTemplateAction.java | 8 ++++++- .../actions/CreateFromTemplateActionBase.java | 15 +++++++++++- 3 files changed, 42 insertions(+), 5 deletions(-) diff --git a/java/java-tests/testSrc/com/intellij/ide/fileTemplates/EmbeddedLiveTemplatesTest.java b/java/java-tests/testSrc/com/intellij/ide/fileTemplates/EmbeddedLiveTemplatesTest.java index 2e4b3a836975..dde5003204ec 100644 --- a/java/java-tests/testSrc/com/intellij/ide/fileTemplates/EmbeddedLiveTemplatesTest.java +++ b/java/java-tests/testSrc/com/intellij/ide/fileTemplates/EmbeddedLiveTemplatesTest.java @@ -15,6 +15,7 @@ */ package com.intellij.ide.fileTemplates; +import com.intellij.codeInsight.template.impl.TemplateManagerImpl; import com.intellij.ide.fileTemplates.actions.CreateFromTemplateActionBase; import com.intellij.ide.fileTemplates.impl.CustomFileTemplate; import com.intellij.openapi.fileEditor.FileEditorManager; @@ -31,14 +32,31 @@ public class EmbeddedLiveTemplatesTest extends LightPlatformCodeInsightFixtureTe public void testCreateFromTemplateAction() throws Exception { - myFixture.configureByText(PlainTextFileType.INSTANCE, ""); + doTest("Put caret here: #[[$END$]]# end of template", + "Put caret here: end of template"); + } + + public void testSupportVariables() throws Exception { + + doTest("First: #[[$Var$]]# Second: #[[$Var$]]#", + "First: Second: "); + } + + protected void doTest(String text, String result) { CustomFileTemplate template = new CustomFileTemplate("foo", "txt"); - template.setText("Put caret here: #[[$END$]]# end of template"); + template.setText(text); template.setLiveTemplateEnabled(true); myFixture.testAction(new TestAction(template)); VirtualFile[] files = FileEditorManager.getInstance(getProject()).getSelectedFiles(); myFixture.openFileInEditor(files[0]); - myFixture.checkResult("Put caret here: end of template"); + myFixture.checkResult(result); + } + + @Override + public void setUp() throws Exception { + super.setUp(); + myFixture.configureByText(PlainTextFileType.INSTANCE, ""); // enable editor action context + TemplateManagerImpl.setTemplateTesting(getProject(), getTestRootDisposable()); } private static class TestAction extends CreateFromTemplateActionBase { diff --git a/platform/lang-impl/src/com/intellij/ide/actions/CreateFileFromTemplateAction.java b/platform/lang-impl/src/com/intellij/ide/actions/CreateFileFromTemplateAction.java index f7aaec67c9af..cabbaeb8aed7 100644 --- a/platform/lang-impl/src/com/intellij/ide/actions/CreateFileFromTemplateAction.java +++ b/platform/lang-impl/src/com/intellij/ide/actions/CreateFileFromTemplateAction.java @@ -18,6 +18,7 @@ package com.intellij.ide.actions; import com.intellij.ide.fileTemplates.FileTemplate; import com.intellij.ide.fileTemplates.FileTemplateManager; import com.intellij.ide.fileTemplates.FileTemplateUtil; +import com.intellij.ide.fileTemplates.actions.CreateFromTemplateActionBase; import com.intellij.ide.util.PropertiesComponent; import com.intellij.openapi.fileEditor.FileEditorManager; import com.intellij.openapi.project.DumbModePermission; @@ -76,7 +77,12 @@ public abstract class CreateFileFromTemplateAction extends CreateFromTemplateAct final VirtualFile virtualFile = psiFile.getVirtualFile(); if (virtualFile != null) { if (openFile) { - FileEditorManager.getInstance(project).openFile(virtualFile, true); + if (template.isLiveTemplateEnabled()) { + CreateFromTemplateActionBase.startLiveTemplate(psiFile); + } + else { + FileEditorManager.getInstance(project).openFile(virtualFile, true); + } } if (defaultTemplateProperty != null) { PropertiesComponent.getInstance(project).setValue(defaultTemplateProperty, template.getName()); diff --git a/platform/lang-impl/src/com/intellij/ide/fileTemplates/actions/CreateFromTemplateActionBase.java b/platform/lang-impl/src/com/intellij/ide/fileTemplates/actions/CreateFromTemplateActionBase.java index 7bc4d4e4ed01..70d1406285d1 100644 --- a/platform/lang-impl/src/com/intellij/ide/fileTemplates/actions/CreateFromTemplateActionBase.java +++ b/platform/lang-impl/src/com/intellij/ide/fileTemplates/actions/CreateFromTemplateActionBase.java @@ -37,6 +37,8 @@ import com.intellij.psi.PsiFile; import org.jetbrains.annotations.Nullable; import javax.swing.*; +import java.util.HashSet; +import java.util.Set; public abstract class CreateFromTemplateActionBase extends AnAction { @@ -79,13 +81,24 @@ public abstract class CreateFromTemplateActionBase extends AnAction { } } - private static void startLiveTemplate(PsiFile file) { + public static void startLiveTemplate(PsiFile file) { Project project = file.getProject(); final Editor editor = EditorHelper.openInEditor(file); if (editor == null) return; final TemplateImpl template = new TemplateImpl("", file.getText(), ""); template.setInline(true); + int count = template.getSegmentsCount(); + if (count == 0) return; + + Set variables = new HashSet(); + for (int i = 0; i < count; i++) { + String name = template.getSegmentName(i); + variables.add(name); + } + for (String variable : variables) { + template.addVariable(variable, null, variable, true); + } WriteCommandAction.runWriteCommandAction(project, new Runnable() { @Override public void run() {