From f9318c277854c253e34ca3bf42ac2dcf826d3fc9 Mon Sep 17 00:00:00 2001 From: anna Date: Thu, 18 Aug 2011 15:01:22 +0200 Subject: [PATCH] live templates: provide code insight during editing (IDEA-71378) --- .../template/JavaCodeContextType.java | 14 ++++++++ .../template/TemplateContextType.java | 7 ++++ .../template/impl/EditTemplateDialog.java | 2 +- .../template/impl/TemplateEditorUtil.java | 32 +++++++++++++++++-- 4 files changed, 51 insertions(+), 4 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/template/JavaCodeContextType.java b/java/java-impl/src/com/intellij/codeInsight/template/JavaCodeContextType.java index 20cec001fc04..8f9126648094 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/JavaCodeContextType.java +++ b/java/java-impl/src/com/intellij/codeInsight/template/JavaCodeContextType.java @@ -16,11 +16,15 @@ package com.intellij.codeInsight.template; import com.intellij.codeInsight.CodeInsightBundle; +import com.intellij.ide.DataManager; import com.intellij.ide.highlighter.JavaFileHighlighter; import com.intellij.lang.StdLanguages; +import com.intellij.openapi.actionSystem.PlatformDataKeys; +import com.intellij.openapi.editor.Document; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.StdFileTypes; import com.intellij.openapi.fileTypes.SyntaxHighlighter; +import com.intellij.openapi.project.Project; import com.intellij.psi.*; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.util.PsiUtilBase; @@ -62,4 +66,14 @@ public class JavaCodeContextType extends TemplateContextType { return new JavaFileHighlighter(); } + @Override + public Document createDocument(CharSequence text, Project project) { + if (project == null) { + return super.createDocument(text, project); + } + final JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(project); + final PsiElementFactory factory = psiFacade.getElementFactory(); + final JavaCodeFragment fragment = factory.createCodeBlockCodeFragment((String)text, psiFacade.findPackage(""), true); + return PsiDocumentManager.getInstance(project).getDocument(fragment); + } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/TemplateContextType.java b/platform/lang-impl/src/com/intellij/codeInsight/template/TemplateContextType.java index 126f263248ac..bd17c61d48f0 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/TemplateContextType.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/TemplateContextType.java @@ -16,9 +16,12 @@ package com.intellij.codeInsight.template; +import com.intellij.openapi.editor.Document; +import com.intellij.openapi.editor.EditorFactory; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.fileTypes.FileType; import com.intellij.openapi.fileTypes.SyntaxHighlighter; +import com.intellij.openapi.project.Project; import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NonNls; import org.jetbrains.annotations.NotNull; @@ -77,4 +80,8 @@ public abstract class TemplateContextType { public TemplateContextType getBaseContextType() { return myBaseContextType != null ? EP_NAME.findExtension(myBaseContextType) : null; } + + public Document createDocument(CharSequence text, Project project) { + return EditorFactory.getInstance().createDocument(text); + } } diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/EditTemplateDialog.java b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/EditTemplateDialog.java index b8c14eda4145..2d2a464ab025 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/EditTemplateDialog.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/EditTemplateDialog.java @@ -88,7 +88,7 @@ public class EditTemplateDialog extends DialogWrapper { myKeyField=new JTextField(); myDescription=new JTextField(); myGroupCombo=new ComboBox(-1); - myTemplateEditor = TemplateEditorUtil.createEditor(false, myTemplate.getString()); + myTemplateEditor = TemplateEditorUtil.createEditor(false, myTemplate.getString(), context); init(); reset(); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateEditorUtil.java b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateEditorUtil.java index 17f88f199c63..4d219df8e294 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateEditorUtil.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/TemplateEditorUtil.java @@ -17,9 +17,11 @@ package com.intellij.codeInsight.template.impl; import com.intellij.codeInsight.template.TemplateContextType; +import com.intellij.ide.DataManager; import com.intellij.lexer.CompositeLexer; import com.intellij.lexer.Lexer; import com.intellij.lexer.MergingLexerAdapter; +import com.intellij.openapi.actionSystem.PlatformDataKeys; import com.intellij.openapi.editor.Document; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.editor.EditorFactory; @@ -33,15 +35,39 @@ import com.intellij.openapi.editor.ex.util.LexerEditorHighlighter; import com.intellij.openapi.fileTypes.PlainSyntaxHighlighter; import com.intellij.openapi.fileTypes.SyntaxHighlighter; import com.intellij.openapi.fileTypes.SyntaxHighlighterBase; +import com.intellij.openapi.project.Project; import com.intellij.psi.tree.IElementType; import com.intellij.psi.tree.TokenSet; import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +import java.util.Map; public class TemplateEditorUtil { - public static Editor createEditor(boolean isReadOnly, final CharSequence text) { + private TemplateEditorUtil() {} + + public static Editor createEditor(boolean isReadOnly, CharSequence text) { + return createEditor(isReadOnly, text, null); + } + + public static Editor createEditor(boolean isReadOnly, CharSequence text, @Nullable Map context) { + Document doc = EditorFactory.getInstance().createDocument(text); + final Project project = PlatformDataKeys.PROJECT.getData(DataManager.getInstance().getDataContext()); + if (context != null) { + for (Map.Entry entry : context.entrySet()) { + if (entry.getValue()) { + doc = entry.getKey().createDocument(text, project); + break; + } + } + } + + return createEditor(isReadOnly, doc, project); + } + + private static Editor createEditor(boolean isReadOnly, final Document document, final Project project) { EditorFactory editorFactory = EditorFactory.getInstance(); - Document doc = editorFactory.createDocument(text); - Editor editor = (isReadOnly ? editorFactory.createViewer(doc) : editorFactory.createEditor(doc)); + Editor editor = (isReadOnly ? editorFactory.createViewer(document, project) : editorFactory.createEditor(document, project)); EditorSettings editorSettings = editor.getSettings(); editorSettings.setVirtualSpace(false);