diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxClassBackedElementDescriptor.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxClassBackedElementDescriptor.java index 721948703b86..3bfe366f7838 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxClassBackedElementDescriptor.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxClassBackedElementDescriptor.java @@ -38,7 +38,11 @@ public class JavaFxClassBackedElementDescriptor implements XmlElementDescriptor, private final String myName; public JavaFxClassBackedElementDescriptor(String name, XmlTag tag) { - this(name, findPsiClass(name, JavaFXNSDescriptor.parseImports((XmlFile)tag.getContainingFile()), tag, tag.getProject())); + this(name, findPsiClass(name, tag)); + } + + public static PsiClass findPsiClass(String name, XmlTag tag) { + return findPsiClass(name, JavaFXNSDescriptor.parseImports((XmlFile)tag.getContainingFile()), tag, tag.getProject()); } public JavaFxClassBackedElementDescriptor(String name, PsiClass aClass) { @@ -314,8 +318,7 @@ public class JavaFxClassBackedElementDescriptor implements XmlElementDescriptor, public static PsiMethod findPropertySetter(String attributeName, XmlTag context) { final String packageName = StringUtil.getPackageName(attributeName); if (context != null && !StringUtil.isEmptyOrSpaces(packageName)) { - final PsiClass classWithStaticProperty = - findPsiClass(packageName, JavaFXNSDescriptor.parseImports((XmlFile)context.getContainingFile()), context, context.getProject()); + final PsiClass classWithStaticProperty = findPsiClass(packageName, context); if (classWithStaticProperty != null) { return findPropertySetter(attributeName, classWithStaticProperty); } diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxPsiUtil.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxPsiUtil.java new file mode 100644 index 000000000000..641f6079aced --- /dev/null +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxPsiUtil.java @@ -0,0 +1,35 @@ +/* + * 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 org.jetbrains.plugins.javaFX.fxml; + +import com.intellij.lang.xml.XMLLanguage; +import com.intellij.openapi.project.Project; +import com.intellij.psi.PsiElement; +import com.intellij.psi.PsiFileFactory; +import com.intellij.psi.util.PsiTreeUtil; +import com.intellij.psi.xml.XmlProcessingInstruction; + +/** + * User: anna + */ +public class JavaFxPsiUtil { + static XmlProcessingInstruction createSingleImportInstruction(String qualifiedName, Project project) { + final String importText = ""; + final PsiElement child = + PsiFileFactory.getInstance(project).createFileFromText("a.fxml", XMLLanguage.INSTANCE, importText).getFirstChild(); + return PsiTreeUtil.findChildOfType(child, XmlProcessingInstruction.class); + } +} diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxTagNameReference.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxTagNameReference.java index 9e436686beb6..e6c056b96209 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxTagNameReference.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/JavaFxTagNameReference.java @@ -1,7 +1,21 @@ package org.jetbrains.plugins.javaFX.fxml; +import com.intellij.codeInsight.completion.InsertionContext; +import com.intellij.codeInsight.completion.XmlTagInsertHandler; +import com.intellij.codeInsight.lookup.LookupElement; +import com.intellij.codeInsight.lookup.LookupElementBuilder; import com.intellij.lang.ASTNode; +import com.intellij.psi.PsiElement; +import com.intellij.psi.impl.source.PostprocessReformattingAspect; import com.intellij.psi.impl.source.xml.TagNameReference; +import com.intellij.psi.xml.*; +import com.intellij.util.Function; +import com.intellij.xml.XmlElementDescriptor; +import org.jetbrains.annotations.NotNull; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; /** * User: anna @@ -11,4 +25,52 @@ public class JavaFxTagNameReference extends TagNameReference { public JavaFxTagNameReference(ASTNode element, boolean startTagFlag) { super(element, startTagFlag); } + + @NotNull + @Override + public LookupElement[] getVariants() { + final PsiElement element = getElement(); + if(!myStartTagFlag){ + return super.getVariants(); + } + final XmlTag xmlTag = (XmlTag)element; + + final List + variants = TagNameReference.getTagNameVariants(xmlTag, Arrays.asList(xmlTag.knownNamespaces()), new ArrayList(), Function.ID); + final List elements = new ArrayList(variants.size()); + for (XmlElementDescriptor descriptor : variants) { + LookupElementBuilder lookupElement = LookupElementBuilder.create(descriptor, descriptor.getName(element)); + elements.add(lookupElement.withInsertHandler(JavaFxTagInsertHandler.INSTANCE)); + } + return elements.toArray(new LookupElement[elements.size()]); + } + + 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(); + if (shortName != null && JavaFxClassBackedElementDescriptor.findPsiClass(shortName, xmlFile.getRootTag()) == null) { + final XmlProcessingInstruction processingInstruction = JavaFxPsiUtil + .createSingleImportInstruction(((JavaFxClassBackedElementDescriptor)object).getQualifiedName(), context.getProject()); + final XmlDocument document = xmlFile.getDocument(); + if (document != null) { + final XmlProlog prolog = document.getProlog(); + if (prolog != null) { + prolog.add(processingInstruction); + } else { + document.addBefore(processingInstruction, document.getRootTag()); + } + context.commitDocument(); + PostprocessReformattingAspect.getInstance(context.getProject()).doPostponedFormatting(context.getFile().getViewProvider()); + } + } + } + } + } } diff --git a/plugins/javaFX/testData/completion/classInsertImport.fxml b/plugins/javaFX/testData/completion/classInsertImport.fxml new file mode 100644 index 000000000000..858c9f8145db --- /dev/null +++ b/plugins/javaFX/testData/completion/classInsertImport.fxml @@ -0,0 +1,8 @@ + + + + + + < + + \ No newline at end of file diff --git a/plugins/javaFX/testData/completion/classInsertImport_after.fxml b/plugins/javaFX/testData/completion/classInsertImport_after.fxml new file mode 100644 index 000000000000..07d99b9ea84d --- /dev/null +++ b/plugins/javaFX/testData/completion/classInsertImport_after.fxml @@ -0,0 +1,9 @@ + + + + + + +