PsiFile file = PsiUtilBase.getPsiFileInEditor(editor, myProject);
if (file == null) return false;
TemplateSettings templateSettings = TemplateSettings.getInstance();
-
Map<TemplateImpl, String> template2argument = findMatchingTemplates(file, editor, shortcutChar, templateSettings);
-
- if (shortcutChar == templateSettings.getDefaultShortcutChar()) {
- for (final CustomLiveTemplate customLiveTemplate : CustomLiveTemplate.EP_NAME.getExtensions()) {
- int caretOffset = editor.getCaretModel().getOffset();
- if (customLiveTemplate.isApplicable(file, caretOffset, false)) {
- final CustomTemplateCallback callback = new CustomTemplateCallback(editor, file);
- String key = customLiveTemplate.computeTemplateKey(callback);
- if (key != null) {
- int offsetBeforeKey = caretOffset - key.length();
- CharSequence text = editor.getDocument().getCharsSequence();
- if (template2argument == null || !containsTemplateStartingBefore(template2argument, offsetBeforeKey, caretOffset, text)) {
- callback.getEditor().getDocument().deleteString(offsetBeforeKey, caretOffset);
- customLiveTemplate.expand(key, callback, new TemplateInvokationListener() {
- public void finished(boolean inSeparateEvent) {
- callback.finish();
- }
- });
- return true;
- }
- }
- }
- }
- }
return startNonCustomTemplates(template2argument, editor, processor);
}
package com.intellij.codeInsight.completion;
import com.intellij.codeInsight.editorActions.smartEnter.SmartEnterProcessor;
+import com.intellij.codeInsight.template.zencoding.XmlZenCodingTemplate;
import com.intellij.lang.ASTNode;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.editor.Document;
final ASTNode emptyTagEnd = XmlChildRole.EMPTY_TAG_END_FINDER.findChild(tagAtCaret.getNode());
final ASTNode endTagEnd = XmlChildRole.START_TAG_END_FINDER.findChild(tagAtCaret.getNode());
if (emptyTagEnd != null || endTagEnd != null) {
- return false;
+ return XmlZenCodingTemplate.startZenCoding(editor, psiFile);
}
int insertionOffset = tagAtCaret.getTextRange().getEndOffset();
if (shouldInsertClosingTag(xmlAttribute, tagAtCaret)) {
doc.insertString(tag.getTextRange().getEndOffset() + text2insert.length(), "</" + tagAtCaret.getName() + ">");
}
-
+
caretTo = tag.getTextRange().getEndOffset() + text2insert.length();
}
else {
package com.intellij.codeInsight.template.zencoding;
import com.intellij.application.options.editor.WebEditorOptions;
-import com.intellij.codeInsight.template.CustomLiveTemplate;
import com.intellij.codeInsight.template.CustomTemplateCallback;
import com.intellij.codeInsight.template.TemplateInvokationListener;
+import com.intellij.codeInsight.template.TemplateManager;
import com.intellij.codeInsight.template.impl.TemplateImpl;
+import com.intellij.codeInsight.template.impl.TemplateSettings;
import com.intellij.lang.xml.XMLLanguage;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiFileFactory;
-import com.intellij.psi.xml.*;
+import com.intellij.psi.xml.XmlDocument;
+import com.intellij.psi.xml.XmlFile;
+import com.intellij.psi.xml.XmlTag;
import com.intellij.util.containers.HashSet;
import org.apache.xerces.util.XML11Char;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
/**
* @author Eugene.Kudelevsky
*/
-public class XmlZenCodingTemplate implements CustomLiveTemplate {
+public class XmlZenCodingTemplate {
static final char MARKER = '$';
private static final String OPERATIONS = ">+*";
private static final String SELECTORS = ".#[";
XmlDocument document = xmlFile.getDocument();
return document == null ? null : document.getRootTag();
}
+
+ public static boolean startZenCoding(Editor editor, PsiFile file) {
+ int caretAt = editor.getCaretModel().getOffset();
+ XmlZenCodingTemplate template = new XmlZenCodingTemplate();
+ if (template.isApplicable(file, caretAt, false)) {
+ final CustomTemplateCallback callback = new CustomTemplateCallback(editor, file);
+ String key = template.computeTemplateKey(callback);
+ if (key != null) {
+ int offsetBeforeKey = caretAt - key.length();
+ callback.getEditor().getDocument().deleteString(offsetBeforeKey, caretAt);
+ template.expand(key, callback, new TemplateInvokationListener() {
+ public void finished(boolean inSeparateEvent) {
+ callback.finish();
+ }
+ });
+ return true;
+ }
+ }
+ // if it is simple live template invokation, we should start it using TemplateManager because template may be ambiguous
+ TemplateManager manager = TemplateManager.getInstance(file.getProject());
+ return manager.startTemplate(editor, TemplateSettings.getInstance().getDefaultShortcutChar());
+ }
}
\ No newline at end of file