diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/FxmlReferencesContributor.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/FxmlReferencesContributor.java index 8b1d0d9917bd..f4d44b4446d3 100644 --- a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/FxmlReferencesContributor.java +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/FxmlReferencesContributor.java @@ -51,6 +51,12 @@ public class FxmlReferencesContributor extends PsiReferenceContributor { .and(attributeValueInFxml), new JavaFxSourceReferenceProvider()); + registrar.registerReferenceProvider(XmlPatterns.xmlAttributeValue().withParent(XmlPatterns.xmlAttribute().withName(FxmlConstants.FX_ELEMENT_SOURCE) + .withParent(XmlPatterns.xmlTag() + .withName(FxmlConstants.FX_REFERENCE))) + .and(attributeValueInFxml), + new JavaFxComponentIdReferenceProvider()); + registrar.registerReferenceProvider(XmlPatterns.xmlAttributeValue().withValue(string().startsWith("#")) .and(attributeValueInFxml), new JavaFxEventHandlerReferenceProvider()); diff --git a/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxComponentIdReferenceProvider.java b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxComponentIdReferenceProvider.java new file mode 100644 index 000000000000..04550a8055a7 --- /dev/null +++ b/plugins/javaFX/src/org/jetbrains/plugins/javaFX/fxml/refs/JavaFxComponentIdReferenceProvider.java @@ -0,0 +1,67 @@ +/* + * 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.refs; + +import com.intellij.psi.*; +import com.intellij.psi.xml.XmlAttribute; +import com.intellij.psi.xml.XmlAttributeValue; +import com.intellij.psi.xml.XmlTag; +import com.intellij.util.ArrayUtil; +import com.intellij.util.ProcessingContext; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; +import org.jetbrains.plugins.javaFX.fxml.FxmlConstants; + +import java.util.HashMap; +import java.util.Map; + +/** +* User: anna +*/ +class JavaFxComponentIdReferenceProvider extends PsiReferenceProvider { + @NotNull + @Override + public PsiReference[] getReferencesByElement(@NotNull PsiElement element, + @NotNull ProcessingContext context) { + final XmlAttributeValue xmlAttributeValue = (XmlAttributeValue)element; + final String referencesId = xmlAttributeValue.getValue(); + final Map fileIds = new HashMap(); + xmlAttributeValue.getContainingFile().accept(new XmlRecursiveElementVisitor() { + @Override + public void visitXmlTag(XmlTag tag) { + super.visitXmlTag(tag); + final XmlAttribute attribute = tag.getAttribute(FxmlConstants.FX_ID); + if (attribute != null) { + fileIds.put(attribute.getValue(), attribute.getValueElement()); + } + } + }); + + return new PsiReference[]{new PsiReferenceBase(xmlAttributeValue) { + @Nullable + @Override + public PsiElement resolve() { + return fileIds.get(referencesId); + } + + @NotNull + @Override + public Object[] getVariants() { + return ArrayUtil.toStringArray(fileIds.keySet()); + } + }}; + } +} diff --git a/plugins/javaFX/testData/highlighting/referenceAttributes.fxml b/plugins/javaFX/testData/highlighting/referenceAttributes.fxml index 6dd49d046575..e1f5e19afc2e 100644 --- a/plugins/javaFX/testData/highlighting/referenceAttributes.fxml +++ b/plugins/javaFX/testData/highlighting/referenceAttributes.fxml @@ -1,5 +1,5 @@ - - + <fx:reference GridPane.halignment="CENTER" /> + lbl"/> diff --git a/plugins/javaFX/testData/highlighting/sourceAttrRecognition.fxml b/plugins/javaFX/testData/highlighting/sourceAttrRecognition.fxml index 15153423931a..b17af0779ad1 100644 --- a/plugins/javaFX/testData/highlighting/sourceAttrRecognition.fxml +++ b/plugins/javaFX/testData/highlighting/sourceAttrRecognition.fxml @@ -3,7 +3,7 @@ - + myImage"/> my_button.fxml"/> diff --git a/plugins/javaFX/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXHighlightingTest.java b/plugins/javaFX/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXHighlightingTest.java index 2453baf5ccf3..e04cd6e35778 100644 --- a/plugins/javaFX/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXHighlightingTest.java +++ b/plugins/javaFX/testSrc/org/jetbrains/plugins/javaFX/fxml/JavaFXHighlightingTest.java @@ -3,6 +3,7 @@ package org.jetbrains.plugins.javaFX.fxml; import com.intellij.codeInsight.daemon.DaemonAnalyzerTestCase; import com.intellij.codeInsight.daemon.impl.analysis.XmlPathReferenceInspection; import com.intellij.codeInspection.LocalInspectionTool; +import com.intellij.codeInspection.htmlInspections.RequiredAttributesInspection; import com.intellij.openapi.application.PluginPathManager; import com.intellij.psi.PsiClass; import com.intellij.psi.PsiField; @@ -24,7 +25,7 @@ public class JavaFXHighlightingTest extends DaemonAnalyzerTestCase { @Override protected LocalInspectionTool[] configureLocalInspectionTools() { - return new LocalInspectionTool[] {new XmlPathReferenceInspection()}; + return new LocalInspectionTool[] {new XmlPathReferenceInspection(), new RequiredAttributesInspection() }; } public void testLoginForm() throws Exception {