live templates: provide code insight during editing (IDEA-71378)

This commit is contained in:
anna
2011-08-19 21:10:24 +02:00
parent a02dca8eca
commit f9318c2778
4 changed files with 51 additions and 4 deletions
@@ -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);
}
}
@@ -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);
}
}
@@ -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();
@@ -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<TemplateContextType, Boolean> context) {
Document doc = EditorFactory.getInstance().createDocument(text);
final Project project = PlatformDataKeys.PROJECT.getData(DataManager.getInstance().getDataContext());
if (context != null) {
for (Map.Entry<TemplateContextType, Boolean> 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);