diff --git a/source/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java b/source/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java index c1a4b46b7d41..f6a23c8507a6 100644 --- a/source/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java +++ b/source/com/intellij/codeInsight/completion/CodeCompletionHandlerBase.java @@ -17,7 +17,6 @@ import com.intellij.openapi.fileEditor.FileDocumentManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Key; import com.intellij.psi.*; -import com.intellij.psi.impl.cache.impl.idCache.IdTableBuilding; import com.intellij.psi.text.BlockSupport; import com.intellij.psi.xml.XmlTag; import com.intellij.util.IncorrectOperationException; @@ -276,23 +275,6 @@ abstract class CodeCompletionHandlerBase implements CodeInsightActionHandler { return; } - - private void fillWordCompletionSet (final PsiFile file, final LinkedHashSet lookupSet, final String prefix) { - final char [] chars = file.getText().toCharArray(); - IdTableBuilding.scanWords(new IdTableBuilding.ScanWordProcessor(){ - public void run(final char[] chars, final int start, final int end) { - final int len = end - start; - if (len > prefix.length ()) { - final String word = String.valueOf(chars, start, len); - if (word.startsWith(prefix)) { - LookupItemUtil.addLookupItem(lookupSet, word, prefix); // TODO - } - } - } - }, chars, 0, chars.length); - } - - protected LookupData getLookupData(CompletionContext context) { final LinkedHashSet lookupSet = new LinkedHashSet(); final PsiFile file = context.file; diff --git a/source/com/intellij/codeInsight/completion/XmlCompletionData.java b/source/com/intellij/codeInsight/completion/XmlCompletionData.java index 382422aea95b..1ec312b47c58 100644 --- a/source/com/intellij/codeInsight/completion/XmlCompletionData.java +++ b/source/com/intellij/codeInsight/completion/XmlCompletionData.java @@ -18,6 +18,7 @@ import com.intellij.psi.PsiDocumentManager; import com.intellij.psi.PsiElement; import com.intellij.psi.filters.ElementFilter; import com.intellij.psi.filters.TrueFilter; +import com.intellij.psi.filters.position.TokenTypeFilter; import com.intellij.psi.filters.getters.XmlAttributeValueGetter; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.xml.*; @@ -64,17 +65,11 @@ public class XmlCompletionData extends CompletionData { } { - //final CompletionVariant variant = new CompletionVariant(new LeftNeighbour(new TextFilter("/"))); - //variant.includeScopeClass(XmlToken.class); - //variant.addCompletion(">",TailType.NONE); - //registerVariant(variant); - } - - { - //final CompletionVariant variant = new CompletionVariant(new LeftNeighbour(new TextFilter(">"))); - //variant.includeScopeClass(XmlTag.class, true); - //variant.setInsertHandler(new XmlTagInsertHandler()); - //registerVariant(variant); + final CompletionVariant variant = new CompletionVariant(new TokenTypeFilter(XmlTokenType.XML_DATA_CHARACTERS)); + variant.includeScopeClass(XmlToken.class, true); + variant.addCompletion(new WordCompletionData.AllWordsGetter()); + variant.setInsertHandler(WordCompletionData.ourWordInsertHandler); + registerVariant(variant); } } diff --git a/source/com/intellij/psi/filters/getters/XmlAttributeValueGetter.java b/source/com/intellij/psi/filters/getters/XmlAttributeValueGetter.java index cd1f74c46626..5e9f693e4515 100644 --- a/source/com/intellij/psi/filters/getters/XmlAttributeValueGetter.java +++ b/source/com/intellij/psi/filters/getters/XmlAttributeValueGetter.java @@ -1,12 +1,13 @@ package com.intellij.psi.filters.getters; import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiReference; import com.intellij.psi.filters.ContextGetter; import com.intellij.psi.util.PsiTreeUtil; import com.intellij.psi.xml.XmlAttribute; import com.intellij.xml.XmlAttributeDescriptor; -import com.intellij.util.ArrayUtil; import com.intellij.codeInsight.completion.CompletionContext; +import com.intellij.codeInsight.completion.WordCompletionData; /** * Created by IntelliJ IDEA. @@ -19,18 +20,31 @@ public class XmlAttributeValueGetter implements ContextGetter { public XmlAttributeValueGetter() {} public Object[] get(PsiElement context, CompletionContext completionContext) { + return getApplicableAttributeVariants(context, completionContext); + } + + public static Object[] getApplicableAttributeVariants(PsiElement context, CompletionContext completionContext) { if(context != null) context = PsiTreeUtil.getParentOfType(context, XmlAttribute.class); if(context instanceof XmlAttribute){ XmlAttributeDescriptor jspTagAttribute = ((XmlAttribute)context).getDescriptor(); + if(jspTagAttribute != null){ final String[] values = jspTagAttribute.getEnumeratedValues(); - if(values == null) - return ArrayUtil.EMPTY_OBJECT_ARRAY; + + if((values == null || values.length==0)) { + final PsiReference[] references = ((XmlAttribute)context).getValueElement().getReferences(); + if (references.length == 0) return getAllWordsFromDocument(context,completionContext); + } return values; } } - return ArrayUtil.EMPTY_OBJECT_ARRAY; + return getAllWordsFromDocument(context, completionContext); + } + + private static Object[] getAllWordsFromDocument(PsiElement context, CompletionContext completionContext) { + WordCompletionData.AllWordsGetter getter = new WordCompletionData.AllWordsGetter(); + return getter.get(context, completionContext); } }