word completion to work in xml tag body and attribute values

This commit is contained in:
Maxim Mossienko
2005-02-14 21:56:27 +03:00
parent 68096465f7
commit 7a0313ff2b
3 changed files with 24 additions and 33 deletions
@@ -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<LookupItem> lookupSet = new LinkedHashSet<LookupItem>();
final PsiFile file = context.file;
@@ -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);
}
}
@@ -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);
}
}