Javafx: Don't allow renaming built-in $controller property, take two. Fixed boolean getter generation and renaming. Utility methods simplified. Tests added (IDEA-153758, IDEA-153751)

This commit is contained in:
Pavel Dolgov
2016-04-21 19:50:10 +03:00
parent 674a858b45
commit 2ec46ccccc
31 changed files with 382 additions and 103 deletions

View File

@@ -17,14 +17,25 @@ package org.jetbrains.plugins.javaFX.fxml;
import com.intellij.codeInsight.TargetElementUtil;
import com.intellij.codeInsight.daemon.DaemonAnalyzerTestCase;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.application.PluginPathManager;
import com.intellij.psi.PsiClass;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiMethod;
import com.intellij.refactoring.rename.PsiElementRenameHandler;
import com.intellij.refactoring.rename.RenameHandler;
import com.intellij.refactoring.rename.RenameHandlerRegistry;
import com.intellij.refactoring.rename.RenameProcessor;
import com.intellij.refactoring.rename.inplace.MemberInplaceRenameHandler;
import com.intellij.testFramework.PsiTestUtil;
import com.intellij.refactoring.util.CommonRefactoringUtil;
import com.intellij.testFramework.MapDataContext;
import com.intellij.testFramework.fixtures.CodeInsightTestUtil;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.plugins.javaFX.refactoring.JavaFxPropertyRenameHandler;
import java.util.Arrays;
import java.util.Locale;
import java.util.stream.Collectors;
public class JavaFXRenameTest extends DaemonAnalyzerTestCase {
@Override
@@ -66,7 +77,7 @@ public class JavaFXRenameTest extends DaemonAnalyzerTestCase {
doTest(newName);
final PsiClass controllerClass = findClass(getTestName(false));
assertNotNull(controllerClass);
assertNotNull(controllerClass.findFieldByName(newName, false));
assertFieldExists(controllerClass, newName);
}
public void testIdWithRefs() throws Exception {
@@ -78,6 +89,98 @@ public class JavaFXRenameTest extends DaemonAnalyzerTestCase {
checkResultByFile(getTestName(true) + "_after.fxml");
}
public void testControllerBare() throws Exception {
doTestErrorHint("Foo", "Cannot rename built-in property");
}
public void testControllerInExpr() throws Exception {
doTestErrorHint("Foo", "Cannot rename built-in property");
}
private void doTestErrorHint(String newName, String message) throws Exception {
try {
doTest(newName, true);
fail(message);
}
catch (CommonRefactoringUtil.RefactoringErrorHintException expectedException) {
assertEquals(message, expectedException.getMessage());
}
}
public void testPropertyRenameHandlerPresent() throws Exception {
configureByFiles(null, getTestName(true) + ".fxml", getTestName(false) + ".java");
final MapDataContext dataContext = new MapDataContext();
dataContext.put(CommonDataKeys.EDITOR, myEditor);
final RenameHandler renameHandler = RenameHandlerRegistry.getInstance().getRenameHandler(dataContext);
assertTrue(renameHandler instanceof JavaFxPropertyRenameHandler);
}
public void testControllerMethod() throws Exception {
final PsiClass psiClass = doTestHandler("newName", null);
assertMethodExists(psiClass, "getNewName");
}
public void testControllerStringProperty() throws Exception {
doTestProperty("newName", false);
}
public void testControllerBooleanProperty() throws Exception {
doTestProperty("newName", true);
}
public void testModelIdProperty() throws Exception {
doTestProperty("newName", "model.Data", false);
}
public void testModelFieldProperty() throws Exception {
doTestProperty("newName", "model.Data", false);
}
public void doTestProperty(String name, boolean isBoolean) throws Exception {
doTestProperty(name, null, isBoolean);
}
public void doTestProperty(String name, String className, boolean isBoolean) throws Exception {
final PsiClass psiClass = doTestHandler(name, className);
final String propName = name.substring(0, 1).toUpperCase(Locale.ENGLISH) + name.substring(1);
assertMethodExists(psiClass, (isBoolean ? "is" : "get") + propName);
assertMethodExists(psiClass, "set" + propName);
assertMethodExists(psiClass, name + "Property");
assertFieldExists(psiClass, name);
}
@NotNull
public PsiClass doTestHandler(String newName, String className) throws Exception {
if (className == null) {
className = getTestName(false);
configureByFiles(null, getTestName(true) + ".fxml", getTestName(false) + ".java");
}
else {
configureByFiles(null, getTestName(true) + ".fxml", getTestName(false) + ".java", className.replace('.', '/') + ".java");
}
final MapDataContext dataContext = new MapDataContext();
dataContext.put(CommonDataKeys.EDITOR, myEditor);
dataContext.put(PsiElementRenameHandler.DEFAULT_NAME, newName);
final JavaFxPropertyRenameHandler renameHandler = new JavaFxPropertyRenameHandler();
assertTrue(renameHandler.isAvailableOnDataContext(dataContext));
renameHandler.invoke(myProject, myEditor, null, dataContext);
checkResultByFile(getTestName(true) + "_after.fxml");
final PsiClass psiClass = findClass(className);
assertNotNull(psiClass);
return psiClass;
}
private static void assertFieldExists(PsiClass controllerClass, String name) {
assertNotNull(name, controllerClass.findFieldByName(name, false));
}
private static void assertMethodExists(PsiClass controllerClass, String name) {
final PsiMethod[] methods = controllerClass.findMethodsByName(name, false);
assertOrderedEquals(Arrays.stream(methods).map(PsiMethod::getName).toArray(), name);
}
private void doTest(final String newName) throws Exception {
doTest(newName, false);
}

View File

@@ -46,6 +46,7 @@ public class JavaFxGetterSetterPrototypeProvider extends GetterSetterPrototypePr
final PsiMethod getter = GenerateMembersUtil.generateSimpleGetterPrototype(field);
final PsiType wrappedType = JavaFxPsiUtil.getWrappedPropertyType(field, project, JavaFxCommonNames.ourReadOnlyMap);
getter.setName(PropertyUtil.suggestGetterName(PropertyUtil.suggestPropertyName(field), wrappedType));
final PsiTypeElement returnTypeElement = getter.getReturnTypeElement();
LOG.assertTrue(returnTypeElement != null);

View File

@@ -42,6 +42,7 @@ public class FxmlConstants {
@NonNls public static final String RESOURCES = "resources";
@NonNls public static final String CHARSET = "charset";
@NonNls public static final String CONTROLLER = "controller";
@NonNls public static final String CONTROLLER_SUFFIX = "Controller";
@NonNls public static final String STYLE_CLASS = "styleClass";
@NonNls public static final String STYLESHEETS = "stylesheets";

View File

@@ -244,27 +244,26 @@ public class JavaFxPsiUtil {
final String getterName = PropertyUtil.suggestGetterName(propertyName, propertyType);
final PsiMethod[] getters = psiClass.findMethodsByName(getterName, true);
for (PsiMethod getter : getters) {
if (isInstancePropertyGetterSignature(getter)) return getter;
}
return null;
}
public static PsiMethod findObservablePropertyGetter(@NotNull PsiClass psiClass, @NotNull String propertyName) {
final PsiMethod[] accessors = psiClass.findMethodsByName(propertyName + JavaFxCommonNames.PROPERTY_METHOD_SUFFIX, true);
for (PsiMethod accessor : accessors) {
if (isInstancePropertyGetterSignature(accessor) &&
InheritanceUtil.isInheritor(accessor.getReturnType(), JavaFxCommonNames.JAVAFX_BEANS_VALUE_OBSERVABLE_VALUE)) {
return accessor;
if (getter.hasModifierProperty(PsiModifier.PUBLIC) &&
!getter.hasModifierProperty(PsiModifier.STATIC) &&
PropertyUtil.isSimplePropertyGetter(getter)) {
return getter;
}
}
return null;
}
private static boolean isInstancePropertyGetterSignature(@NotNull PsiMethod method) {
return method.hasModifierProperty(PsiModifier.PUBLIC) &&
!method.hasModifierProperty(PsiModifier.STATIC) &&
method.getParameterList().getParametersCount() == 0 &&
!PsiType.VOID.equals(method.getReturnType());
public static PsiMethod findObservablePropertyGetter(@NotNull PsiClass psiClass, @NotNull String propertyName) {
final PsiMethod[] getters = psiClass.findMethodsByName(propertyName + JavaFxCommonNames.PROPERTY_METHOD_SUFFIX, true);
for (PsiMethod getter : getters) {
if (getter.hasModifierProperty(PsiModifier.PUBLIC) &&
!getter.hasModifierProperty(PsiModifier.STATIC) &&
getter.getParameterList().getParametersCount() == 0 &&
InheritanceUtil.isInheritor(getter.getReturnType(), JavaFxCommonNames.JAVAFX_BEANS_VALUE_OBSERVABLE_VALUE)) {
return getter;
}
}
return null;
}
private static final Key<CachedValue<PsiClass>> INJECTED_CONTROLLER = Key.create("javafx.injected.controller");
@@ -962,17 +961,15 @@ public class JavaFxPsiUtil {
final String suggestedSetterName = PropertyUtil.suggestSetterName(propertyName);
final PsiMethod[] setters = psiClass.findMethodsByName(suggestedSetterName, true);
for (PsiMethod setter : setters) {
if (isInstancePropertySetterSignature(setter)) return setter;
if (setter.hasModifierProperty(PsiModifier.PUBLIC) &&
!setter.hasModifierProperty(PsiModifier.STATIC) &&
PropertyUtil.isSimplePropertySetter(setter)) {
return setter;
}
}
return null;
}
private static boolean isInstancePropertySetterSignature(@NotNull PsiMethod method) {
return !method.hasModifierProperty(PsiModifier.STATIC) &&
method.hasModifierProperty(PsiModifier.PUBLIC) &&
method.getParameterList().getParametersCount() == 1;
}
private static boolean isWritablePropertyType(@NotNull PsiClass psiClass, @NotNull PsiType fieldType) {
return isObservableCollection(PsiUtil.resolveClassInType(fieldType)) &&
JavaGenericsUtil.getCollectionItemType(fieldType, psiClass.getResolveScope()) != null ||
@@ -1107,15 +1104,10 @@ public class JavaFxPsiUtil {
}
@NotNull
public static String getPropertyNameFromMemberName(@NotNull String name, boolean isMethod) {
if(!isMethod) return name;
if (name.startsWith("get") || name.startsWith("set")) {
return StringUtil.decapitalize(name.substring(3));
}
else if (name.startsWith("is")) {
return StringUtil.decapitalize(name.substring(2));
}
return name;
public static String getPropertyName(@NotNull String memberName, boolean isMethod) {
if (!isMethod) return memberName;
final String propertyName = PropertyUtil.getPropertyName(memberName);
return propertyName != null ? propertyName : memberName;
}
private static class JavaFxControllerCachedValueProvider implements CachedValueProvider<PsiClass> {

View File

@@ -190,7 +190,7 @@ class JavaFxComponentIdReferenceProvider extends PsiReferenceProvider {
}
}
private static class JavaFxIdReferenceBase extends PsiReferenceBase<XmlAttributeValue> {
private static class JavaFxIdReferenceBase extends PsiReferenceBase<XmlAttributeValue> implements JavaFxIdAttributeReference {
private final Map<String, XmlAttributeValue> myFileIds;
private final Set<String> myAcceptableIds;
private final Map<String, TypeMatch> myTypeMatches;
@@ -231,6 +231,11 @@ class JavaFxComponentIdReferenceProvider extends PsiReferenceProvider {
.map(id -> PrioritizedLookupElement.withPriority(LookupElementBuilder.create(id), TypeMatch.getPriority(myTypeMatches.get(id))))
.toArray(LookupElement[]::new);
}
@Override
public boolean isBuiltIn() {
return FxmlConstants.CONTROLLER.equals(myReferencesId) || myReferencesId.endsWith(FxmlConstants.CONTROLLER_SUFFIX);
}
}
private static class JavaFxExpressionReferenceBase extends PsiReferenceBase<XmlAttributeValue> implements JavaFxPropertyReference {
@@ -311,7 +316,8 @@ class JavaFxComponentIdReferenceProvider extends PsiReferenceProvider {
@Override
public PsiElement handleElementRename(String newElementName) throws IncorrectOperationException {
return super.handleElementRename(JavaFxPsiUtil.getPropertyNameFromMemberName(newElementName, resolve() instanceof PsiMethod));
final String newPropertyName = JavaFxPsiUtil.getPropertyName(newElementName, resolve() instanceof PsiMethod);
return super.handleElementRename(newPropertyName);
}
}
}

View File

@@ -162,7 +162,8 @@ public class JavaFxFieldIdReferenceProvider extends JavaFxControllerBasedReferen
@Override
public PsiElement handleElementRename(String newElementName) throws IncorrectOperationException {
return super.handleElementRename(JavaFxPsiUtil.getPropertyNameFromMemberName(newElementName, myFieldOrMethod instanceof PsiMethod));
final String newPropertyName = JavaFxPsiUtil.getPropertyName(newElementName, myFieldOrMethod instanceof PsiMethod);
return super.handleElementRename(newPropertyName);
}
private PsiClass getGuessedTagClass() {

View File

@@ -0,0 +1,10 @@
package org.jetbrains.plugins.javaFX.fxml.refs;
import com.intellij.psi.PsiReference;
/**
* @author Pavel.Dolgov
*/
public interface JavaFxIdAttributeReference extends PsiReference {
boolean isBuiltIn();
}

View File

@@ -14,33 +14,6 @@ import java.util.Map;
* @author Pavel.Dolgov
*/
public interface JavaFxPropertyReference extends PsiReference {
default boolean isRenameable() {
return resolve() != null;
}
@NotNull
default Map<PsiElement, String> getElementsToRename(@NotNull String newPropertyName) {
final Map<PsiElement, String> rename = new THashMap<>();
final PsiField field = getField();
if (field != null) {
rename.put(field, newPropertyName);
}
final PsiMethod getter = getGetter();
if (getter != null) {
rename.put(getter, PropertyUtil.suggestGetterName(newPropertyName, getter.getReturnType()));
}
final PsiMethod setter = getSetter();
if (setter != null) {
rename.put(setter, PropertyUtil.suggestSetterName(newPropertyName));
}
final PsiMethod observableGetter = getObservableGetter();
if (observableGetter != null) {
rename.put(observableGetter, newPropertyName + JavaFxCommonNames.PROPERTY_METHOD_SUFFIX);
}
//TODO add "name" parameter of the observable property constructor (like new SimpleObjectProperty(this, "name", null);
return rename;
}
@Nullable
PsiMethod getGetter();

View File

@@ -6,9 +6,11 @@ import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.ui.DialogWrapper;
import com.intellij.psi.PsiDocumentManager;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiReference;
import com.intellij.psi.util.PropertyUtil;
import com.intellij.psi.xml.XmlFile;
import com.intellij.refactoring.RenameRefactoring;
import com.intellij.refactoring.openapi.impl.JavaRenameRefactoringImpl;
@@ -16,9 +18,13 @@ import com.intellij.refactoring.rename.PsiElementRenameHandler;
import com.intellij.refactoring.rename.RenameDialog;
import com.intellij.refactoring.rename.RenameHandler;
import com.intellij.refactoring.util.CommonRefactoringUtil;
import com.intellij.util.containers.ContainerUtil;
import gnu.trove.THashMap;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.plugins.javaFX.fxml.JavaFxCommonNames;
import org.jetbrains.plugins.javaFX.fxml.JavaFxFileTypeFactory;
import org.jetbrains.plugins.javaFX.fxml.refs.JavaFxIdAttributeReference;
import org.jetbrains.plugins.javaFX.fxml.refs.JavaFxPropertyReference;
import java.util.Map;
@@ -30,7 +36,9 @@ public class JavaFxPropertyRenameHandler implements RenameHandler {
@Override
public boolean isAvailableOnDataContext(DataContext dataContext) {
final PsiReference reference = getReference(dataContext);
return reference != null;
if (reference instanceof JavaFxPropertyReference) return true;
if (reference instanceof JavaFxIdAttributeReference) return ((JavaFxIdAttributeReference)reference).isBuiltIn();
return false;
}
@Override
@@ -40,31 +48,38 @@ public class JavaFxPropertyRenameHandler implements RenameHandler {
@Override
public void invoke(@NotNull Project project, Editor editor, PsiFile file, DataContext dataContext) {
//if (editor == null) {
// editor = CommonDataKeys.EDITOR.getData(dataContext);
//}
//final PsiFile file = CommonDataKeys.PSI_FILE.getData(dataContext);
final JavaFxPropertyReference reference = getReference(dataContext);
performInvoke(project, editor, dataContext);
}
@Override
public void invoke(@NotNull Project project, @NotNull PsiElement[] elements, DataContext dataContext) {
performInvoke(project, null, dataContext);
}
private static void performInvoke(@NotNull Project project, @Nullable Editor editor, DataContext dataContext) {
final PsiReference reference = getReference(dataContext);
if (reference == null) return;
if (reference.isRenameable()) {
if (reference instanceof JavaFxIdAttributeReference && ((JavaFxIdAttributeReference)reference).isBuiltIn()) {
CommonRefactoringUtil.showErrorHint(project, editor, "Cannot rename built-in property", null, null);
return;
}
if ((reference instanceof JavaFxPropertyReference) && reference.resolve() != null) {
final JavaFxPropertyReference propertyReference = (JavaFxPropertyReference)reference;
if (ApplicationManager.getApplication().isUnitTestMode()) {
final String newName = PsiElementRenameHandler.DEFAULT_NAME.getData(dataContext);
assert newName != null : "Rename property";
doRename(reference, newName, false, false);
doRename(propertyReference, newName, false, false);
return;
}
final Map<PsiElement, String> elementsToRename = reference.getElementsToRename("a");
for (PsiElement element : elementsToRename.keySet()) {
final Map<String, PsiElement> elementsToRename = getElementsToRename(propertyReference, "a");
for (PsiElement element : elementsToRename.values()) {
if (!PsiElementRenameHandler.canRename(project, editor, element)) return;
}
final PsiElement psiElement = JavaFxPropertyElement.fromReference(reference);
final PsiElement psiElement = JavaFxPropertyElement.fromReference(propertyReference);
if (psiElement != null) {
new PropertyRenameDialog(reference, psiElement, project, editor).show();
new PropertyRenameDialog(propertyReference, psiElement, project, editor).show();
}
}
else {
CommonRefactoringUtil.showErrorHint(project, editor, "Cannot rename built-in property", null, null);
}
}
private static void doRename(JavaFxPropertyReference reference, String newName, final boolean searchInComments, boolean isPreview) {
@@ -73,43 +88,44 @@ public class JavaFxPropertyRenameHandler implements RenameHandler {
final RenameRefactoring rename = new JavaRenameRefactoringImpl(psiElement.getProject(), psiElement, newName, searchInComments, false);
rename.setPreviewUsages(isPreview);
final Map<PsiElement, String> elementsToRename = reference.getElementsToRename(newName);
for (Map.Entry<PsiElement, String> entry : elementsToRename.entrySet()) {
rename.addElement(entry.getKey(), entry.getValue());
final Map<String, PsiElement> elementsToRename = getElementsToRename(reference, newName);
for (Map.Entry<String, PsiElement> entry : elementsToRename.entrySet()) {
rename.addElement(entry.getValue(), entry.getKey());
}
rename.run();
}
@Override
public void invoke(@NotNull Project project, @NotNull PsiElement[] elements, DataContext dataContext) {
final PsiReference reference = getReference(dataContext);
//final PsiElement element = getElement(dataContext);
}
@Nullable
private static JavaFxPropertyReference getReference(DataContext dataContext) {
private static PsiReference getReference(DataContext dataContext) {
final Editor editor = CommonDataKeys.EDITOR.getData(dataContext);
final PsiFile file = CommonDataKeys.PSI_FILE.getData(dataContext);
PsiFile file = CommonDataKeys.PSI_FILE.getData(dataContext);
//if (file == null && editor != null && ApplicationManager.getApplication().isUnitTestMode()) {
// final Project project = editor.getProject();
// if (project != null) {
// file = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument());
// }
//}
if (editor != null && file instanceof XmlFile && JavaFxFileTypeFactory.isFxml(file)) {
final int offset = editor.getCaretModel().getOffset();
final PsiReference reference = file.findReferenceAt(offset);
if (reference instanceof JavaFxPropertyReference) {
return (JavaFxPropertyReference)reference;
if (file == null && editor != null && ApplicationManager.getApplication().isUnitTestMode()) {
final Project project = editor.getProject();
if (project != null) {
file = PsiDocumentManager.getInstance(project).getPsiFile(editor.getDocument());
}
}
if (editor != null && file instanceof XmlFile && JavaFxFileTypeFactory.isFxml(file)) {
final int offset = editor.getCaretModel().getOffset();
return file.findReferenceAt(offset);
}
return null;
}
@NotNull
private static Map<String, PsiElement> getElementsToRename(@NotNull JavaFxPropertyReference reference, @NotNull String newPropertyName) {
final Map<String, PsiElement> rename = new THashMap<>();
ContainerUtil.putIfNotNull(newPropertyName, reference.getField(), rename);
ContainerUtil.putIfNotNull(PropertyUtil.suggestGetterName(newPropertyName, reference.getType()), reference.getGetter(), rename);
ContainerUtil.putIfNotNull(PropertyUtil.suggestSetterName(newPropertyName), reference.getSetter(), rename);
ContainerUtil.putIfNotNull(newPropertyName + JavaFxCommonNames.PROPERTY_METHOD_SUFFIX, reference.getObservableGetter(), rename);
//TODO add "name" parameter of the observable property constructor (like new SimpleObjectProperty(this, "name", null);
return rename;
}
private static class PropertyRenameDialog extends RenameDialog {
private final JavaFxPropertyReference myPropertyReference;

View File

@@ -0,0 +1,2 @@
public class ControllerBare {
}

View File

@@ -0,0 +1,18 @@
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
public class ControllerBooleanProperty {
private BooleanProperty flag = new SimpleBooleanProperty(false);
public BooleanProperty flagProperty() {
return flag;
}
public boolean getFlag() {
return flag.get();
}
public void setFlag(boolean flag) {
this.flag.set(flag);
}
}

View File

@@ -0,0 +1,5 @@
public class ControllerInExpr {
public String getText() {
return "";
}
}

View File

@@ -0,0 +1,5 @@
public class ControllerMethod {
public String getText() {
return "";
}
}

View File

@@ -0,0 +1,18 @@
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
public class ControllerStringProperty {
private StringProperty text = new SimpleStringProperty("");
public StringProperty textProperty() {
return text;
}
public String getText() {
return text.getValue();
}
public void setText(String text) {
this.text.setValue(text);
}
}

View File

@@ -0,0 +1,7 @@
import model.Data;
import javafx.fxml.FXML;
public class ModelFieldProperty {
@FXML
private Data data;
}

View File

@@ -0,0 +1,2 @@
public class ModelIdProperty {
}

View File

@@ -0,0 +1,5 @@
class PropertyRenameHandlerPresent {
public String getMyProp() {
return "";
}
}

View File

@@ -0,0 +1,6 @@
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>
<VBox fx:controller="ControllerBare"
xmlns:fx="http://javafx.com/fxml">
<Label text="$contr<caret>oller"/>
</VBox>

View File

@@ -0,0 +1,6 @@
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>
<VBox fx:controller="ControllerBooleanProperty"
xmlns:fx="http://javafx.com/fxml">
<Label text="${controller.flag<caret>}"/>
</VBox>

View File

@@ -0,0 +1,6 @@
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>
<VBox fx:controller="ControllerBooleanProperty"
xmlns:fx="http://javafx.com/fxml">
<Label text="${controller.newName}"/>
</VBox>

View File

@@ -0,0 +1,6 @@
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>
<VBox fx:controller="ControllerInExpr"
xmlns:fx="http://javafx.com/fxml">
<Label text="${contr<caret>oller.text}"/>
</VBox>

View File

@@ -0,0 +1,6 @@
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>
<VBox fx:controller="ControllerMethod"
xmlns:fx="http://javafx.com/fxml">
<Label text="${controller.text<caret>}"/>
</VBox>

View File

@@ -0,0 +1,6 @@
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>
<VBox fx:controller="ControllerMethod"
xmlns:fx="http://javafx.com/fxml">
<Label text="${controller.newName}"/>
</VBox>

View File

@@ -0,0 +1,6 @@
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>
<VBox fx:controller="ControllerStringProperty"
xmlns:fx="http://javafx.com/fxml">
<Label text="${controller.text<caret>}"/>
</VBox>

View File

@@ -0,0 +1,6 @@
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>
<VBox fx:controller="ControllerStringProperty"
xmlns:fx="http://javafx.com/fxml">
<Label text="${controller.newName}"/>
</VBox>

View File

@@ -0,0 +1,20 @@
package model;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
public class Data {
private StringProperty fooProp = new SimpleStringProperty("");
public StringProperty fooPropProperty() {
return fooProp;
}
public String getFooProp() {
return fooProp.getValue();
}
public void setFooProp(String value) {
fooProp.setValue(value);
}
}

View File

@@ -0,0 +1,10 @@
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>
<?import model.Data?>
<VBox fx:controller="ModelFieldProperty"
xmlns:fx="http://javafx.com/fxml">
<fx:define>
<Data fx:id="data" />
</fx:define>
<Label text="${data.fooProp<caret>}"/>
</VBox>

View File

@@ -0,0 +1,10 @@
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>
<?import model.Data?>
<VBox fx:controller="ModelFieldProperty"
xmlns:fx="http://javafx.com/fxml">
<fx:define>
<Data fx:id="data" />
</fx:define>
<Label text="${data.newName<caret>}"/>
</VBox>

View File

@@ -0,0 +1,10 @@
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>
<?import model.Data?>
<VBox fx:controller="ModelIdProperty"
xmlns:fx="http://javafx.com/fxml">
<fx:define>
<Data fx:id="data" />
</fx:define>
<Label text="${data.fooProp<caret>}"/>
</VBox>

View File

@@ -0,0 +1,10 @@
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>
<?import model.Data?>
<VBox fx:controller="ModelIdProperty"
xmlns:fx="http://javafx.com/fxml">
<fx:define>
<Data fx:id="data" />
</fx:define>
<Label text="${data.newName<caret>}"/>
</VBox>

View File

@@ -0,0 +1,6 @@
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.VBox?>
<VBox fx:controller="PropertyRenameHandlerPresent"
xmlns:fx="http://javafx.com/fxml">
<Label text="${controller.tex<caret>t}"/>
</VBox>