blob: 92545330b6460446837bda2182d34febee531a6e [file] [log] [blame]
package org.jetbrains.plugins.javaFX.fxml.refs;
import com.intellij.codeInsight.completion.*;
import com.intellij.codeInsight.lookup.LookupElement;
import com.intellij.codeInsight.lookup.LookupElementBuilder;
import com.intellij.psi.PsiReference;
import com.intellij.psi.impl.source.xml.TagNameVariantCollector;
import com.intellij.psi.xml.XmlFile;
import com.intellij.psi.xml.XmlTag;
import com.intellij.util.ProcessingContext;
import com.intellij.xml.XmlElementDescriptor;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.javaFX.fxml.JavaFxPsiUtil;
import org.jetbrains.plugins.javaFX.fxml.descriptors.JavaFxClassBackedElementDescriptor;
import java.util.Arrays;
import java.util.List;
import static com.intellij.patterns.PlatformPatterns.psiElement;
import static com.intellij.patterns.XmlPatterns.xmlTag;
/**
* @author yole
*/
public class JavaFxCompletionContributor extends CompletionContributor {
public JavaFxCompletionContributor() {
extend(CompletionType.BASIC, psiElement().inside(xmlTag()), new JavaFxTagCompletionContributor());
}
private static class JavaFxTagCompletionContributor extends CompletionProvider<CompletionParameters> {
@Override
protected void addCompletions(@NotNull CompletionParameters parameters,
ProcessingContext context,
@NotNull CompletionResultSet result) {
PsiReference reference = parameters.getPosition().getContainingFile().findReferenceAt(parameters.getOffset());
if (reference instanceof JavaFxTagNameReference) {
addJavaFxTagVariants((JavaFxTagNameReference)reference, result);
result.stopHere();
}
}
private static void addJavaFxTagVariants(JavaFxTagNameReference reference, CompletionResultSet result) {
final XmlTag xmlTag = (XmlTag)reference.getElement();
List<String> namespaces = Arrays.asList(xmlTag.knownNamespaces());
final List<XmlElementDescriptor> variants = TagNameVariantCollector.getTagDescriptors(xmlTag, namespaces, null);
for (XmlElementDescriptor descriptor : variants) {
final String descriptorName = descriptor.getName(reference.getElement());
if (descriptorName != null) {
LookupElementBuilder lookupElement = LookupElementBuilder.create(descriptor, descriptorName);
result.addElement(lookupElement.withInsertHandler(JavaFxTagInsertHandler.INSTANCE));
}
}
}
}
private static class JavaFxTagInsertHandler extends XmlTagInsertHandler {
public static final JavaFxTagInsertHandler INSTANCE = new JavaFxTagInsertHandler();
@Override
public void handleInsert(InsertionContext context, LookupElement item) {
super.handleInsert(context, item);
final Object object = item.getObject();
if (object instanceof JavaFxClassBackedElementDescriptor) {
final XmlFile xmlFile = (XmlFile)context.getFile();
final String shortName = ((JavaFxClassBackedElementDescriptor)object).getName();
context.commitDocument();
JavaFxPsiUtil.insertImportWhenNeeded(xmlFile, shortName, ((JavaFxClassBackedElementDescriptor)object).getQualifiedName());
}
}
}
}