diff --git a/java/java-impl/src/com/intellij/codeInsight/template/postfix/completion/PostfixTemplatesCompletionProvider.java b/java/java-impl/src/com/intellij/codeInsight/template/postfix/completion/PostfixTemplatesCompletionProvider.java index 16c340938e3f..db253a6808b1 100644 --- a/java/java-impl/src/com/intellij/codeInsight/template/postfix/completion/PostfixTemplatesCompletionProvider.java +++ b/java/java-impl/src/com/intellij/codeInsight/template/postfix/completion/PostfixTemplatesCompletionProvider.java @@ -18,13 +18,11 @@ package com.intellij.codeInsight.template.postfix.completion; import com.intellij.codeInsight.completion.CompletionParameters; import com.intellij.codeInsight.completion.CompletionProvider; import com.intellij.codeInsight.completion.CompletionResultSet; -import com.intellij.codeInsight.template.CustomTemplateCallback; +import com.intellij.codeInsight.completion.PrefixMatcher; import com.intellij.codeInsight.template.impl.LiveTemplateCompletionContributor; import com.intellij.codeInsight.template.postfix.settings.PostfixTemplatesSettings; import com.intellij.codeInsight.template.postfix.templates.PostfixLiveTemplate; -import com.intellij.codeInsight.template.postfix.templates.PostfixTemplate; import com.intellij.patterns.StandardPatterns; -import com.intellij.psi.PsiFile; import com.intellij.util.ProcessingContext; import org.jetbrains.annotations.NotNull; @@ -43,17 +41,7 @@ class PostfixTemplatesCompletionProvider extends CompletionProvider entry : myTemplates.entrySet()) { PostfixTemplate postfixTemplate = entry.getValue(); if (entry.getKey().startsWith(key) && isApplicationTemplateFunction.value(postfixTemplate)) { - result.put(postfixTemplate.getKey(), new PostfixTemplateLookupElement(this, postfixTemplate, postfixTemplate.getKey(), false)); + result.put(postfixTemplate.getKey(), new PostfixTemplateLookupElement(this, postfixTemplate, entry.getKey(), false)); } } return result.values(); diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/CustomLiveTemplateBase.java b/platform/lang-impl/src/com/intellij/codeInsight/template/CustomLiveTemplateBase.java index 88771ca1d5a0..7e115ac05623 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/CustomLiveTemplateBase.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/CustomLiveTemplateBase.java @@ -15,6 +15,8 @@ */ package com.intellij.codeInsight.template; +import com.intellij.codeInsight.completion.CompletionParameters; +import com.intellij.codeInsight.completion.CompletionResultSet; import com.intellij.codeInsight.template.impl.CustomLiveTemplateLookupElement; import com.intellij.openapi.editor.Editor; import com.intellij.psi.PsiFile; @@ -40,6 +42,17 @@ abstract public class CustomLiveTemplateBase implements CustomLiveTemplate { public Collection getLookupElements(@NotNull PsiFile file, @NotNull Editor editor, int offset) { return Collections.emptyList(); } + + /** + * Populate completion result set. Used by LiveTemplateCompletionContributor + */ + public void addCompletions(CompletionParameters parameters, CompletionResultSet result) { + String prefix = computeTemplateKeyWithoutContextChecking(new CustomTemplateCallback(parameters.getEditor(), parameters.getOriginalFile(), false)); + if (prefix != null) { + result.withPrefixMatcher(result.getPrefixMatcher().cloneWithPrefix(prefix)).addAllElements( + getLookupElements(parameters.getOriginalFile(), parameters.getEditor(), parameters.getOffset())); + } + } @Nullable public String computeTemplateKeyWithoutContextChecking(@NotNull CustomTemplateCallback callback) { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/ListTemplatesHandler.java b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/ListTemplatesHandler.java index 887dca435b14..45e2e2c08a85 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/ListTemplatesHandler.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/ListTemplatesHandler.java @@ -112,7 +112,7 @@ public class ListTemplatesHandler implements CodeInsightActionHandler { showLookup(lookup, file); } - public static MultiMap listApplicableCustomTemplates(@NotNull Editor editor, @NotNull PsiFile file, int offset) { + private static MultiMap listApplicableCustomTemplates(@NotNull Editor editor, @NotNull PsiFile file, int offset) { final MultiMap result = MultiMap.create(); CustomTemplateCallback customTemplateCallback = new CustomTemplateCallback(editor, file, false); for (CustomLiveTemplate customLiveTemplate : CustomLiveTemplate.EP_NAME.getExtensions()) { diff --git a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/LiveTemplateCompletionContributor.java b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/LiveTemplateCompletionContributor.java index db9df19aa112..0bbe11f748d1 100644 --- a/platform/lang-impl/src/com/intellij/codeInsight/template/impl/LiveTemplateCompletionContributor.java +++ b/platform/lang-impl/src/com/intellij/codeInsight/template/impl/LiveTemplateCompletionContributor.java @@ -18,12 +18,12 @@ package com.intellij.codeInsight.template.impl; import com.intellij.codeInsight.completion.*; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.template.CustomLiveTemplate; +import com.intellij.codeInsight.template.CustomLiveTemplateBase; import com.intellij.codeInsight.template.CustomTemplateCallback; import com.intellij.codeInsight.template.TemplateContextType; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.util.Condition; -import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.registry.Registry; import com.intellij.patterns.PlatformPatterns; import com.intellij.psi.PsiFile; @@ -32,13 +32,13 @@ import com.intellij.ui.EditorTextField; import com.intellij.util.Consumer; import com.intellij.util.ProcessingContext; import com.intellij.util.containers.ContainerUtil; -import com.intellij.util.containers.MultiMap; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.util.*; - -import static com.intellij.codeInsight.template.impl.ListTemplatesHandler.listApplicableCustomTemplates; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; +import java.util.concurrent.atomic.AtomicBoolean; /** * @author peter @@ -69,18 +69,17 @@ public class LiveTemplateCompletionContributor extends CompletionContributor { final List templates = listApplicableTemplates(file, offset); Editor editor = parameters.getEditor(); if (showAllTemplates()) { - final MultiMap customTemplates = listApplicableCustomTemplates(editor, file, offset); - final Ref templatesShown = Ref.create(false); + final AtomicBoolean templatesShown = new AtomicBoolean(false); final CompletionResultSet finalResult = result; result.runRemainingContributors(parameters, new Consumer() { @Override public void consume(CompletionResult completionResult) { finalResult.passResult(completionResult); - ensureTemplatesShown(templatesShown, templates, customTemplates, finalResult); + ensureTemplatesShown(templatesShown, templates, parameters, finalResult); } }); - ensureTemplatesShown(templatesShown, templates, customTemplates, result); + ensureTemplatesShown(templatesShown, templates, parameters, result); return; } @@ -104,20 +103,20 @@ public class LiveTemplateCompletionContributor extends CompletionContributor { return shouldShowAllTemplates(); } - private static void ensureTemplatesShown(Ref templatesShown, + private static void ensureTemplatesShown(AtomicBoolean templatesShown, List templates, - MultiMap customTemplates, + CompletionParameters parameters, CompletionResultSet result) { - if (!templatesShown.get()) { - templatesShown.set(true); + if (!templatesShown.getAndSet(true)) { for (final TemplateImpl possible : templates) { result.addElement(new LiveTemplateLookupElementImpl(possible, false)); } - for (Map.Entry> entry : customTemplates.entrySet()) { - Collection value = entry.getValue(); - if (!value.isEmpty()) { - result.withPrefixMatcher(entry.getKey()).addAllElements(value); + PsiFile file = parameters.getPosition().getContainingFile(); + Editor editor = parameters.getEditor(); + for (CustomLiveTemplate customLiveTemplate : CustomLiveTemplate.EP_NAME.getExtensions()) { + if (customLiveTemplate instanceof CustomLiveTemplateBase && TemplateManagerImpl.isApplicable(customLiveTemplate, editor, file)) { + ((CustomLiveTemplateBase)customLiveTemplate).addCompletions(parameters, result); } } } diff --git a/xml/impl/src/com/intellij/codeInsight/completion/XmlCompletionContributor.java b/xml/impl/src/com/intellij/codeInsight/completion/XmlCompletionContributor.java index 851c2f69bc4a..453a825318ce 100644 --- a/xml/impl/src/com/intellij/codeInsight/completion/XmlCompletionContributor.java +++ b/xml/impl/src/com/intellij/codeInsight/completion/XmlCompletionContributor.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,7 +19,7 @@ import com.intellij.codeInsight.lookup.InsertHandlerDecorator; import com.intellij.codeInsight.lookup.LookupElement; import com.intellij.codeInsight.lookup.LookupElementBuilder; import com.intellij.codeInsight.lookup.LookupElementDecorator; -import com.intellij.codeInsight.template.emmet.completion.XmlEmmetAbbreviationCompletionProvider; +import com.intellij.codeInsight.template.emmet.completion.EmmetAbbreviationCompletionProvider; import com.intellij.featureStatistics.FeatureUsageTracker; import com.intellij.lang.ASTNode; import com.intellij.openapi.actionSystem.IdeActions; @@ -78,7 +78,7 @@ public class XmlCompletionContributor extends CompletionContributor { }; public XmlCompletionContributor() { - extend(CompletionType.BASIC, psiElement().inside(XmlPatterns.xmlFile()), new XmlEmmetAbbreviationCompletionProvider()); + extend(CompletionType.BASIC, psiElement().inside(XmlPatterns.xmlFile()), new EmmetAbbreviationCompletionProvider()); extend(CompletionType.BASIC, psiElement().inside(XmlPatterns.xmlAttributeValue()), new CompletionProvider() { diff --git a/xml/impl/src/com/intellij/codeInsight/template/emmet/ZenCodingTemplate.java b/xml/impl/src/com/intellij/codeInsight/template/emmet/ZenCodingTemplate.java index 7df1dfa33d8e..56b718e210dd 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/emmet/ZenCodingTemplate.java +++ b/xml/impl/src/com/intellij/codeInsight/template/emmet/ZenCodingTemplate.java @@ -17,6 +17,8 @@ package com.intellij.codeInsight.template.emmet; import com.intellij.application.options.emmet.EmmetOptions; import com.intellij.codeInsight.CodeInsightBundle; +import com.intellij.codeInsight.completion.CompletionParameters; +import com.intellij.codeInsight.completion.CompletionResultSet; import com.intellij.codeInsight.template.*; import com.intellij.codeInsight.template.emmet.filters.SingleLineEmmetFilter; import com.intellij.codeInsight.template.emmet.filters.ZenCodingFilter; @@ -26,6 +28,7 @@ import com.intellij.codeInsight.template.emmet.nodes.*; import com.intellij.codeInsight.template.emmet.tokens.TemplateToken; import com.intellij.codeInsight.template.emmet.tokens.TextToken; import com.intellij.codeInsight.template.emmet.tokens.ZenCodingToken; +import com.intellij.codeInsight.template.impl.LiveTemplateCompletionContributor; import com.intellij.codeInsight.template.impl.TemplateImpl; import com.intellij.codeInsight.template.impl.TemplateState; import com.intellij.diagnostic.AttachmentFactory; @@ -41,9 +44,11 @@ import com.intellij.openapi.ui.popup.JBPopupListener; import com.intellij.openapi.ui.popup.LightweightWindowEvent; import com.intellij.openapi.ui.popup.util.PopupUtil; import com.intellij.openapi.util.Pair; +import com.intellij.openapi.util.Ref; import com.intellij.openapi.util.TextRange; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.wm.IdeFocusManager; +import com.intellij.patterns.StandardPatterns; import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; @@ -59,9 +64,7 @@ import java.awt.event.ComponentEvent; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; +import java.util.*; import java.util.List; @@ -454,4 +457,47 @@ public class ZenCodingTemplate extends CustomLiveTemplateBase { public boolean supportsWrapping() { return true; } + + @Override + public void addCompletions(CompletionParameters parameters, CompletionResultSet result) { + PsiFile file = parameters.getOriginalFile(); + int offset = parameters.getOffset(); + Editor editor = parameters.getEditor(); + + ZenCodingGenerator generator = findApplicableDefaultGenerator(CustomTemplateCallback.getContext(file, offset), false); + if (generator != null && generator.hasCompletionItem()) { + final Ref generatedTemplate = new Ref(); + final CustomTemplateCallback callback = new CustomTemplateCallback(editor, file, false) { + @Override + public void deleteTemplateKey(String key) { + } + + @Override + public void startTemplate(Template template, Map predefinedValues, TemplateEditingListener listener) { + if (template instanceof TemplateImpl && !((TemplateImpl)template).isDeactivated()) { + generatedTemplate.set((TemplateImpl)template); + } + } + }; + + String templatePrefix = computeTemplateKeyWithoutContextChecking(callback); + + if (templatePrefix != null) { + if (LiveTemplateCompletionContributor.findApplicableTemplate(file, offset, templatePrefix) == null) { + // exclude perfect matches with existing templates because LiveTemplateCompletionContributor handles it + final Collection extraFilters = ContainerUtil.newLinkedList(new SingleLineEmmetFilter()); + expand(templatePrefix, callback, null, generator, extraFilters, false); + if (!generatedTemplate.isNull()) { + final TemplateImpl template = generatedTemplate.get(); + template.setKey(templatePrefix); + template.setDescription(template.getTemplateText()); + + CompletionResultSet resultSet = result.withPrefixMatcher(result.getPrefixMatcher().cloneWithPrefix(templatePrefix)); + resultSet.restartCompletionOnPrefixChange(StandardPatterns.string().startsWith(templatePrefix)); + resultSet.addElement(generator.createLookupElement(this, template)); + } + } + } + } + } } diff --git a/xml/impl/src/com/intellij/codeInsight/template/emmet/completion/EmmetAbbreviationCompletionProvider.java b/xml/impl/src/com/intellij/codeInsight/template/emmet/completion/EmmetAbbreviationCompletionProvider.java index 0dd4769599c5..a05538035251 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/emmet/completion/EmmetAbbreviationCompletionProvider.java +++ b/xml/impl/src/com/intellij/codeInsight/template/emmet/completion/EmmetAbbreviationCompletionProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -18,93 +18,31 @@ package com.intellij.codeInsight.template.emmet.completion; import com.intellij.codeInsight.completion.CompletionParameters; import com.intellij.codeInsight.completion.CompletionProvider; import com.intellij.codeInsight.completion.CompletionResultSet; -import com.intellij.codeInsight.template.*; +import com.intellij.codeInsight.template.CustomLiveTemplate; import com.intellij.codeInsight.template.emmet.ZenCodingTemplate; -import com.intellij.codeInsight.template.emmet.filters.SingleLineEmmetFilter; -import com.intellij.codeInsight.template.emmet.generators.ZenCodingGenerator; -import com.intellij.codeInsight.template.impl.CustomLiveTemplateLookupElement; import com.intellij.codeInsight.template.impl.LiveTemplateCompletionContributor; -import com.intellij.codeInsight.template.impl.LiveTemplateLookupElement; -import com.intellij.codeInsight.template.impl.TemplateImpl; -import com.intellij.openapi.editor.Editor; -import com.intellij.openapi.util.Ref; -import com.intellij.patterns.StandardPatterns; -import com.intellij.psi.PsiFile; import com.intellij.util.ProcessingContext; -import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; -import java.util.Collection; -import java.util.Map; - /** * User: zolotov * Date: 8/9/13 */ -abstract public class EmmetAbbreviationCompletionProvider extends CompletionProvider { +public class EmmetAbbreviationCompletionProvider extends CompletionProvider { @Override protected void addCompletions(@NotNull CompletionParameters parameters, ProcessingContext context, @NotNull CompletionResultSet result) { - if (!isAvailable(parameters)) { - return; - } - - final ZenCodingGenerator generator = getGenerator(); - if (!generator.isMyContext(parameters.getPosition(), false) || !generator.isAppliedByDefault(parameters.getPosition())) { + if (LiveTemplateCompletionContributor.shouldShowAllTemplates() || !parameters.isAutoPopup()) { + /** + * covered with {@link com.intellij.codeInsight.template.impl.LiveTemplateCompletionContributor} + */ return; } ZenCodingTemplate zenCodingTemplate = CustomLiveTemplate.EP_NAME.findExtension(ZenCodingTemplate.class); - if (zenCodingTemplate == null) { - return; + if (zenCodingTemplate != null) { + zenCodingTemplate.addCompletions(parameters, result); } - - final PsiFile file = parameters.getPosition().getContainingFile(); - final Editor editor = parameters.getEditor(); - - final String completionPrefix = result.getPrefixMatcher().getPrefix(); - final String templatePrefix = LiveTemplateCompletionContributor.findLiveTemplatePrefix(file, editor, completionPrefix); - - if (LiveTemplateCompletionContributor.findApplicableTemplate(file, parameters.getOffset(), templatePrefix) != null) { - // exclude perfect matches with existing templates because LiveTemplateCompletionContributor handles it - result.restartCompletionOnPrefixChange(StandardPatterns.string().startsWith(templatePrefix)); - return; - } - - final Ref generatedTemplate = new Ref(); - final CustomTemplateCallback callback = new CustomTemplateCallback(editor, file, false) { - @Override - public void deleteTemplateKey(String key) { - } - - @Override - public void startTemplate(Template template, Map predefinedValues, TemplateEditingListener listener) { - if (template instanceof TemplateImpl && !((TemplateImpl)template).isDeactivated()) { - generatedTemplate.set((TemplateImpl)template); - } - } - }; - - final Collection extraFilters = ContainerUtil.newLinkedList(new SingleLineEmmetFilter()); - ZenCodingTemplate.expand(templatePrefix, callback, null, generator, extraFilters, false); - if (!generatedTemplate.isNull()) { - result = result.withPrefixMatcher(templatePrefix); - final TemplateImpl template = generatedTemplate.get(); - template.setKey(templatePrefix); - template.setDescription(template.getTemplateText()); - result.addElement(createLookupElement(zenCodingTemplate, template)); - result.restartCompletionOnPrefixChange(StandardPatterns.string().startsWith(templatePrefix)); - } - } - - protected LiveTemplateLookupElement createLookupElement(@NotNull CustomLiveTemplateBase customLiveTemplate, @NotNull TemplateImpl template) { - return new CustomLiveTemplateLookupElement(customLiveTemplate, template.getKey(), template.getKey(), template.getDescription(), true, true); - } - - protected abstract ZenCodingGenerator getGenerator(); - - protected boolean isAvailable(CompletionParameters parameters) { - return parameters.getInvocationCount() == 0; } } diff --git a/xml/impl/src/com/intellij/codeInsight/template/emmet/completion/XmlEmmetAbbreviationCompletionProvider.java b/xml/impl/src/com/intellij/codeInsight/template/emmet/completion/XmlEmmetAbbreviationCompletionProvider.java deleted file mode 100644 index b251ffd23ec6..000000000000 --- a/xml/impl/src/com/intellij/codeInsight/template/emmet/completion/XmlEmmetAbbreviationCompletionProvider.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright 2000-2013 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.intellij.codeInsight.template.emmet.completion; - -import com.intellij.application.options.emmet.EmmetOptions; -import com.intellij.codeInsight.completion.CompletionParameters; -import com.intellij.codeInsight.template.CustomLiveTemplateBase; -import com.intellij.codeInsight.template.emmet.generators.XmlZenCodingGeneratorImpl; -import com.intellij.codeInsight.template.emmet.generators.ZenCodingGenerator; -import com.intellij.codeInsight.template.impl.CustomLiveTemplateLookupElement; -import com.intellij.codeInsight.template.impl.LiveTemplateLookupElement; -import com.intellij.codeInsight.template.impl.TemplateImpl; -import org.jetbrains.annotations.NotNull; - -public class XmlEmmetAbbreviationCompletionProvider extends EmmetAbbreviationCompletionProvider { - @Override - protected boolean isAvailable(CompletionParameters parameters) { - final EmmetOptions emmetOptions = EmmetOptions.getInstance(); - return super.isAvailable(parameters) && emmetOptions.isEmmetEnabled() && emmetOptions.isPreviewEnabled(); - } - - @Override - protected LiveTemplateLookupElement createLookupElement(@NotNull CustomLiveTemplateBase customLiveTemplate, @NotNull final TemplateImpl template) { - return new CustomLiveTemplateLookupElement(customLiveTemplate, template.getKey(), template.getDescription(), "", false, true); - } - - @Override - protected ZenCodingGenerator getGenerator() { - return XmlZenCodingGeneratorImpl.INSTANCE; - } -} diff --git a/xml/impl/src/com/intellij/codeInsight/template/emmet/generators/XmlZenCodingGenerator.java b/xml/impl/src/com/intellij/codeInsight/template/emmet/generators/XmlZenCodingGenerator.java index 4febf21b0e6d..9ac35a5b2a88 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/emmet/generators/XmlZenCodingGenerator.java +++ b/xml/impl/src/com/intellij/codeInsight/template/emmet/generators/XmlZenCodingGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2010 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,7 +15,10 @@ */ package com.intellij.codeInsight.template.emmet.generators; +import com.intellij.application.options.emmet.EmmetOptions; +import com.intellij.codeInsight.template.CustomLiveTemplateBase; import com.intellij.codeInsight.template.emmet.tokens.TemplateToken; +import com.intellij.codeInsight.template.impl.CustomLiveTemplateLookupElement; import com.intellij.codeInsight.template.impl.TemplateImpl; import com.intellij.openapi.util.Pair; import com.intellij.psi.PsiElement; @@ -76,4 +79,16 @@ public abstract class XmlZenCodingGenerator extends ZenCodingGenerator { int totalIterations, @Nullable String surroundedText); public abstract boolean isMyContext(@NotNull PsiElement context, boolean wrapping); + + @Override + public CustomLiveTemplateLookupElement createLookupElement(@NotNull CustomLiveTemplateBase customLiveTemplate, + @NotNull final TemplateImpl template) { + return new CustomLiveTemplateLookupElement(customLiveTemplate, template.getKey(), template.getDescription(), "", false, true); + } + + @Override + public boolean hasCompletionItem() { + EmmetOptions emmetOptions = EmmetOptions.getInstance(); + return emmetOptions.isEmmetEnabled() && emmetOptions.isPreviewEnabled(); + } } diff --git a/xml/impl/src/com/intellij/codeInsight/template/emmet/generators/ZenCodingGenerator.java b/xml/impl/src/com/intellij/codeInsight/template/emmet/generators/ZenCodingGenerator.java index 1965bf1e0470..7c04edd646df 100644 --- a/xml/impl/src/com/intellij/codeInsight/template/emmet/generators/ZenCodingGenerator.java +++ b/xml/impl/src/com/intellij/codeInsight/template/emmet/generators/ZenCodingGenerator.java @@ -1,5 +1,5 @@ /* - * Copyright 2000-2013 JetBrains s.r.o. + * Copyright 2000-2014 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,12 +15,14 @@ */ package com.intellij.codeInsight.template.emmet.generators; +import com.intellij.codeInsight.template.CustomLiveTemplateBase; import com.intellij.codeInsight.template.CustomTemplateCallback; import com.intellij.codeInsight.template.emmet.EmmetParser; import com.intellij.codeInsight.template.emmet.XmlEmmetParser; import com.intellij.codeInsight.template.emmet.ZenCodingTemplate; import com.intellij.codeInsight.template.emmet.tokens.TemplateToken; import com.intellij.codeInsight.template.emmet.tokens.ZenCodingToken; +import com.intellij.codeInsight.template.impl.CustomLiveTemplateLookupElement; import com.intellij.codeInsight.template.impl.TemplateImpl; import com.intellij.openapi.editor.Editor; import com.intellij.openapi.extensions.ExtensionPointName; @@ -183,4 +185,8 @@ public abstract class ZenCodingGenerator { public boolean hasCompletionItem() { return false; } + + public CustomLiveTemplateLookupElement createLookupElement(@NotNull CustomLiveTemplateBase customLiveTemplate, @NotNull TemplateImpl template) { + return new CustomLiveTemplateLookupElement(customLiveTemplate, template.getKey(), template.getKey(), template.getDescription(), true, true); + } }