mirror of
https://gitflic.ru/project/openide/openide.git
synced 2026-09-27 10:03:11 +07:00
javafx: navigation to fields of custom components; soft reference to method handler in case of custom components (IDEA-101327)
This commit is contained in:
@@ -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)) {
|
||||
|
||||
+17
-2
@@ -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>
|
||||
+15
-2
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user