javafx: navigation to fields of custom components; soft reference to method handler in case of custom components (IDEA-101327)

This commit is contained in:
anna
2013-02-19 09:33:28 +01:00
parent 04177bb2d1
commit dbe79dd780
5 changed files with 60 additions and 5 deletions
@@ -201,7 +201,10 @@ public class JavaFxPsiUtil {
if (containingFile instanceof XmlFile) {
final XmlTag rootTag = ((XmlFile)containingFile).getRootTag();
if (rootTag != null) {
final XmlAttribute attribute = rootTag.getAttribute(FxmlConstants.FX_CONTROLLER);
XmlAttribute attribute = rootTag.getAttribute(FxmlConstants.FX_CONTROLLER);
if (attribute == null && FxmlConstants.FX_ROOT.equals(rootTag.getName())) {
attribute = rootTag.getAttribute(FxmlConstants.TYPE);
}
if (attribute != null) {
final String attributeValue = attribute.getValue();
if (!StringUtil.isEmptyOrSpaces(attributeValue)) {
@@ -16,11 +16,18 @@
package org.jetbrains.plugins.javaFX.fxml.refs;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.psi.*;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiReference;
import com.intellij.psi.xml.XmlAttribute;
import com.intellij.psi.xml.XmlAttributeValue;
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.FxmlConstants;
import org.jetbrains.plugins.javaFX.fxml.JavaFxPsiUtil;
/**
@@ -40,7 +47,9 @@ class JavaFxEventHandlerReferenceProvider extends JavaFxControllerBasedReference
final XmlAttribute attribute = (XmlAttribute)xmlAttributeValue.getContext();
if (attribute == null) return PsiReference.EMPTY_ARRAY;
if (!JavaFxPsiUtil.checkIfAttributeHandler(attribute)) return PsiReference.EMPTY_ARRAY;
final PsiElement currentTagClass = attribute.getParent().getDescriptor().getDeclaration();
final XmlElementDescriptor descriptor = attribute.getParent().getDescriptor();
if (descriptor == null) return PsiReference.EMPTY_ARRAY;
final PsiElement currentTagClass = descriptor.getDeclaration();
final String eventHandlerName = attValueString.substring(1);
final PsiMethod[] methods = controllerClass.findMethodsByName(eventHandlerName, true);
@@ -51,6 +60,12 @@ class JavaFxEventHandlerReferenceProvider extends JavaFxControllerBasedReference
break;
}
}
if (handlerMethod == null) {
final XmlTag rootTag = ((XmlFile)xmlAttributeValue.getContainingFile()).getRootTag();
if (rootTag == null || FxmlConstants.FX_ROOT.equals(rootTag.getName())) {
return PsiReference.EMPTY_ARRAY;
}
}
return new PsiReference[]{new JavaFxEventHandlerReference(xmlAttributeValue, (PsiClass)currentTagClass, handlerMethod, controllerClass)};
}
}
@@ -0,0 +1,16 @@
import javafx.fxml.FXML;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.VBox;
public class CustomVBox extends VBox {
@FXML
private TextField tf;
@FXML
private Label lab1;
@FXML
void myMethod(){
lab1.setText(tf.getText());
}
}
@@ -0,0 +1,8 @@
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.control.Button?>
<fx:root type="CustomVBox" xmlns:fx="http://javafx.com/fxml" >
<Label text="Hello" fx:id="lab1"/>
<TextField fx:id="t<caret>f"/>
<Button text="Click Me" onAction= "#myMethod"/>
</fx:root>
@@ -10,6 +10,7 @@ import com.intellij.psi.PsiField;
import com.intellij.psi.PsiReference;
import com.intellij.psi.search.ProjectScope;
import com.intellij.testFramework.PsiTestUtil;
import com.intellij.util.ArrayUtil;
import org.jetbrains.annotations.NotNull;
/**
@@ -98,12 +99,24 @@ public class JavaFXHighlightingTest extends DaemonAnalyzerTestCase {
doTestNavigation("javafx.geometry.Pos", "CENTER");
}
public void testCustomComponentFields() throws Exception {
doTestNavigation("CustomVBox", "tf", "custom/" + getTestName(true) + ".fxml", "custom/CustomVBox.java");
}
private void doTestNavigation(String resultClassName, String resultFieldName) throws Exception {
configureByFiles(null, getTestName(true) + ".fxml");
doTestNavigation(resultClassName, resultFieldName, ArrayUtil.EMPTY_STRING_ARRAY);
}
private void doTestNavigation(String resultClassName, String resultFieldName, String... additionalPaths) throws Exception {
if (additionalPaths.length == 0) {
configureByFiles(null, getTestName(true) + ".fxml");
} else {
configureByFiles(null, additionalPaths);
}
final int offset = myEditor.getCaretModel().getOffset();
final PsiReference reference = myFile.findReferenceAt(offset);
assertNotNull(reference);
final PsiClass resultClass = myJavaFacade.findClass(resultClassName, ProjectScope.getLibrariesScope(getProject()));
final PsiClass resultClass = myJavaFacade.findClass(resultClassName, ProjectScope.getAllScope(getProject()));
assertNotNull("Class " + resultClassName + " not found", resultClass);
final PsiField resultField = resultClass.findFieldByName(resultFieldName, false);
assertNotNull(resultField);