From 4777ec81043f392b518bea80268ea2a6293cf558 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Guillaume=20T=C3=A2che?= Date: Mon, 18 Nov 2024 22:01:42 +0100 Subject: [PATCH] Adds some tests --- core/pom.xml | 25 + .../fxml/compiler/impl/GeneratorImpl.java | 26 +- .../parsing/impl/ParsedIncludeImpl.java | 3 +- .../parsing/impl/ParsedObjectImpl.java | 5 +- .../compiler/impl/ControlsController.java | 4 +- .../compiler/impl/IncludesController.java | 10 +- .../fxml/compiler/impl/TestGeneratorImpl.java | 4 - .../parsing/impl/TestParsedIncludeImpl.java | 50 +- .../compiler/impl/ControlsBundle.properties | 0 .../compiler/impl/IncludesBundle.properties | 0 .../fxml/compiler/impl/controlsView.fxml | 2 +- .../fxml/compiler/impl/includesView.fxml | 6 +- .../gtache/fxml/compiler/impl}/style.css | 0 loader/pom.xml | 39 -- .../parsing/listener/ParsingLoadListener.java | 78 ++- .../compiler/impl/ControlsController.java | 1 + .../compiler/impl/IncludesController.java | 1 + .../fxml/compiler/impl/TestGeneratorImpl.java | 157 ++++++ .../compiler/loader/AssignIncludeView.java | 439 ---------------- .../fxml/compiler/loader/AssignTestView.java | 198 ------- .../compiler/loader/CreationBenchmark.java | 128 ----- .../compiler/loader/FactoryIncludeView.java | 444 ---------------- .../fxml/compiler/loader/FactoryTestView.java | 202 ------- .../gtache/fxml/compiler/loader/Main.java | 10 - .../compiler/loader/PrintLoadListener.java | 96 ---- .../loader/ReflectionIncludeView.java | 494 ------------------ .../compiler/loader/ReflectionTestView.java | 253 --------- .../compiler/loader/SettersIncludeView.java | 439 ---------------- .../fxml/compiler/loader/SettersTestView.java | 198 ------- .../gtache/fxml/compiler/loader/TestApp.java | 56 -- .../parsing/listener/LoadController.java | 17 + .../listener/TestParsingLoadListener.java | 273 ++++++++++ .../compiler/impl/ControlsBundle.properties | 1 + .../compiler/impl/IncludesBundle.properties | 1 + .../fxml/compiler/impl/controlsView.fxml | 1 + ...-controls-assign-reference-constructor.txt | 425 +++++++++++++++ ...ed-controls-assign-reference-getbundle.txt | 425 +++++++++++++++ ...ected-controls-assign-reference-getter.txt | 424 +++++++++++++++ ...controls-assign-reflection-constructor.txt | 469 +++++++++++++++++ ...d-controls-assign-reflection-getbundle.txt | 469 +++++++++++++++++ ...cted-controls-assign-reflection-getter.txt | 468 +++++++++++++++++ ...controls-factory-reference-constructor.txt | 428 +++++++++++++++ ...d-controls-factory-reference-getbundle.txt | 428 +++++++++++++++ ...cted-controls-factory-reference-getter.txt | 427 +++++++++++++++ ...ontrols-factory-reflection-constructor.txt | 472 +++++++++++++++++ ...-controls-factory-reflection-getbundle.txt | 472 +++++++++++++++++ ...ted-controls-factory-reflection-getter.txt | 471 +++++++++++++++++ ...trols-reflection-reference-constructor.txt | 434 +++++++++++++++ ...ontrols-reflection-reference-getbundle.txt | 434 +++++++++++++++ ...d-controls-reflection-reference-getter.txt | 433 +++++++++++++++ ...rols-reflection-reflection-constructor.txt | 478 +++++++++++++++++ ...ntrols-reflection-reflection-getbundle.txt | 478 +++++++++++++++++ ...-controls-reflection-reflection-getter.txt | 477 +++++++++++++++++ ...controls-setters-reference-constructor.txt | 425 +++++++++++++++ ...d-controls-setters-reference-getbundle.txt | 425 +++++++++++++++ ...cted-controls-setters-reference-getter.txt | 424 +++++++++++++++ ...ontrols-setters-reflection-constructor.txt | 469 +++++++++++++++++ ...-controls-setters-reflection-getbundle.txt | 469 +++++++++++++++++ ...ted-controls-setters-reflection-getter.txt | 468 +++++++++++++++++ ...-includes-assign-reference-constructor.txt | 182 +++++++ ...ed-includes-assign-reference-getbundle.txt | 182 +++++++ ...ected-includes-assign-reference-getter.txt | 181 +++++++ ...includes-assign-reflection-constructor.txt | 226 ++++++++ ...d-includes-assign-reflection-getbundle.txt | 226 ++++++++ ...cted-includes-assign-reflection-getter.txt | 225 ++++++++ ...includes-factory-reference-constructor.txt | 185 +++++++ ...d-includes-factory-reference-getbundle.txt | 185 +++++++ ...cted-includes-factory-reference-getter.txt | 184 +++++++ ...ncludes-factory-reflection-constructor.txt | 229 ++++++++ ...-includes-factory-reflection-getbundle.txt | 229 ++++++++ ...ted-includes-factory-reflection-getter.txt | 228 ++++++++ ...ludes-reflection-reference-constructor.txt | 191 +++++++ ...ncludes-reflection-reference-getbundle.txt | 191 +++++++ ...d-includes-reflection-reference-getter.txt | 190 +++++++ ...udes-reflection-reflection-constructor.txt | 235 +++++++++ ...cludes-reflection-reflection-getbundle.txt | 235 +++++++++ ...-includes-reflection-reflection-getter.txt | 234 +++++++++ ...includes-setters-reference-constructor.txt | 182 +++++++ ...d-includes-setters-reference-getbundle.txt | 182 +++++++ ...cted-includes-setters-reference-getter.txt | 181 +++++++ ...ncludes-setters-reflection-constructor.txt | 226 ++++++++ ...-includes-setters-reflection-getbundle.txt | 226 ++++++++ ...ted-includes-setters-reflection-getter.txt | 225 ++++++++ .../fxml/compiler/impl/includesView.fxml | 1 + .../gtache/fxml/compiler/impl/style.css | 1 + .../listener/IncludedBundle.properties | 0 .../parsing/listener/includedView.fxml | 6 + .../compiler/parsing/listener/loadView.fxml | 33 ++ 88 files changed, 16404 insertions(+), 3050 deletions(-) rename loader/src/test/java/com/github/gtache/fxml/compiler/loader/IncludeController.java => core/src/test/java/com/github/gtache/fxml/compiler/impl/ControlsController.java (99%) rename loader/src/test/java/com/github/gtache/fxml/compiler/loader/TestController.java => core/src/test/java/com/github/gtache/fxml/compiler/impl/IncludesController.java (93%) delete mode 100644 core/src/test/java/com/github/gtache/fxml/compiler/impl/TestGeneratorImpl.java rename loader/src/test/resources/com/github/gtache/fxml/compiler/loader/IncludeBundle.properties => core/src/test/resources/com/github/gtache/fxml/compiler/impl/ControlsBundle.properties (100%) rename loader/src/test/resources/com/github/gtache/fxml/compiler/loader/TestBundle.properties => core/src/test/resources/com/github/gtache/fxml/compiler/impl/IncludesBundle.properties (100%) rename loader/src/test/resources/com/github/gtache/fxml/compiler/loader/includeView.fxml => core/src/test/resources/com/github/gtache/fxml/compiler/impl/controlsView.fxml (99%) rename loader/src/test/resources/com/github/gtache/fxml/compiler/loader/testView.fxml => core/src/test/resources/com/github/gtache/fxml/compiler/impl/includesView.fxml (98%) rename {loader/src/test/resources/com/github/gtache/fxml/compiler/loader => core/src/test/resources/com/github/gtache/fxml/compiler/impl}/style.css (100%) create mode 120000 loader/src/test/java/com/github/gtache/fxml/compiler/impl/ControlsController.java create mode 120000 loader/src/test/java/com/github/gtache/fxml/compiler/impl/IncludesController.java create mode 100644 loader/src/test/java/com/github/gtache/fxml/compiler/impl/TestGeneratorImpl.java delete mode 100644 loader/src/test/java/com/github/gtache/fxml/compiler/loader/AssignIncludeView.java delete mode 100644 loader/src/test/java/com/github/gtache/fxml/compiler/loader/AssignTestView.java delete mode 100644 loader/src/test/java/com/github/gtache/fxml/compiler/loader/CreationBenchmark.java delete mode 100644 loader/src/test/java/com/github/gtache/fxml/compiler/loader/FactoryIncludeView.java delete mode 100644 loader/src/test/java/com/github/gtache/fxml/compiler/loader/FactoryTestView.java delete mode 100644 loader/src/test/java/com/github/gtache/fxml/compiler/loader/Main.java delete mode 100644 loader/src/test/java/com/github/gtache/fxml/compiler/loader/PrintLoadListener.java delete mode 100644 loader/src/test/java/com/github/gtache/fxml/compiler/loader/ReflectionIncludeView.java delete mode 100644 loader/src/test/java/com/github/gtache/fxml/compiler/loader/ReflectionTestView.java delete mode 100644 loader/src/test/java/com/github/gtache/fxml/compiler/loader/SettersIncludeView.java delete mode 100644 loader/src/test/java/com/github/gtache/fxml/compiler/loader/SettersTestView.java delete mode 100644 loader/src/test/java/com/github/gtache/fxml/compiler/loader/TestApp.java create mode 100644 loader/src/test/java/com/github/gtache/fxml/compiler/parsing/listener/LoadController.java create mode 100644 loader/src/test/java/com/github/gtache/fxml/compiler/parsing/listener/TestParsingLoadListener.java create mode 120000 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/ControlsBundle.properties create mode 120000 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/IncludesBundle.properties create mode 120000 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/controlsView.fxml create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-assign-reference-constructor.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-assign-reference-getbundle.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-assign-reference-getter.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-assign-reflection-constructor.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-assign-reflection-getbundle.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-assign-reflection-getter.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-factory-reference-constructor.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-factory-reference-getbundle.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-factory-reference-getter.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-factory-reflection-constructor.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-factory-reflection-getbundle.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-factory-reflection-getter.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-reflection-reference-constructor.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-reflection-reference-getbundle.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-reflection-reference-getter.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-reflection-reflection-constructor.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-reflection-reflection-getbundle.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-reflection-reflection-getter.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-setters-reference-constructor.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-setters-reference-getbundle.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-setters-reference-getter.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-setters-reflection-constructor.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-setters-reflection-getbundle.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-setters-reflection-getter.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-assign-reference-constructor.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-assign-reference-getbundle.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-assign-reference-getter.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-assign-reflection-constructor.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-assign-reflection-getbundle.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-assign-reflection-getter.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-factory-reference-constructor.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-factory-reference-getbundle.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-factory-reference-getter.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-factory-reflection-constructor.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-factory-reflection-getbundle.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-factory-reflection-getter.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-reflection-reference-constructor.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-reflection-reference-getbundle.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-reflection-reference-getter.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-reflection-reflection-constructor.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-reflection-reflection-getbundle.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-reflection-reflection-getter.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-setters-reference-constructor.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-setters-reference-getbundle.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-setters-reference-getter.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-setters-reflection-constructor.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-setters-reflection-getbundle.txt create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-setters-reflection-getter.txt create mode 120000 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/includesView.fxml create mode 120000 loader/src/test/resources/com/github/gtache/fxml/compiler/impl/style.css create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/parsing/listener/IncludedBundle.properties create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/parsing/listener/includedView.fxml create mode 100644 loader/src/test/resources/com/github/gtache/fxml/compiler/parsing/listener/loadView.fxml diff --git a/core/pom.xml b/core/pom.xml index 6f5758d..662b3a2 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -22,5 +22,30 @@ ${javafx.version} provided + + org.openjfx + javafx-controls + ${javafx.version} + test + + + org.openjfx + javafx-fxml + ${javafx.version} + test + + + org.openjfx + javafx-media + ${javafx.version} + test + + + org.openjfx + javafx-web + ${javafx.version} + test + + \ No newline at end of file diff --git a/core/src/main/java/com/github/gtache/fxml/compiler/impl/GeneratorImpl.java b/core/src/main/java/com/github/gtache/fxml/compiler/impl/GeneratorImpl.java index 4f15fea..618a14c 100644 --- a/core/src/main/java/com/github/gtache/fxml/compiler/impl/GeneratorImpl.java +++ b/core/src/main/java/com/github/gtache/fxml/compiler/impl/GeneratorImpl.java @@ -195,7 +195,8 @@ public class GeneratorImpl implements Generator { } catch (final NoSuchFieldException | IllegalAccessException e) { throw new RuntimeException("Error using reflection on " + fieldName, e); } - }"""); + } + """); } return sb.toString(); } @@ -408,7 +409,7 @@ public class GeneratorImpl implements Generator { final var method = getStaticMethod(property.sourceType(), setMethod); final var parameterType = method.getParameterTypes()[1]; final var arg = getArg(request, property.value(), parameterType); - sb.append(" ").append(property.sourceType().getName()).append(".").append(setMethod).append("(").append(parentVariable).append(", ").append(arg).append(");\n"); + setLaterIfNeeded(request, property, parameterType, " " + property.sourceType().getName() + "." + setMethod + "(" + parentVariable + ", " + arg + ");\n", sb); } else { throw new IllegalStateException("Cannot set " + propertyName + " on " + property.sourceType().getCanonicalName()); } @@ -418,13 +419,13 @@ public class GeneratorImpl implements Generator { final var method = getMethod(parent.clazz(), setMethod); final var parameterType = method.getParameterTypes()[0]; final var arg = getArg(request, property.value(), parameterType); - sb.append(" ").append(parentVariable).append(".").append(setMethod).append("(").append(arg).append(");\n"); + setLaterIfNeeded(request, property, parameterType, " " + parentVariable + "." + setMethod + "(" + arg + ");\n", sb); } else if (hasMethod(parent.clazz(), getMethod)) { final var method = getMethod(parent.clazz(), getMethod); final var returnType = method.getReturnType(); if (hasMethod(returnType, "addAll")) { final var arg = getArg(request, property.value(), String.class); - sb.append(" ").append(parentVariable).append(".").append(getMethod).append("().addAll(").append(arg).append(");\n"); + setLaterIfNeeded(request, property, String.class, " " + parentVariable + "." + getMethod + "().addAll(" + arg + ");\n", sb); } } else { throw new IllegalStateException("Cannot set " + propertyName + " on " + parent.clazz().getCanonicalName()); @@ -432,6 +433,15 @@ public class GeneratorImpl implements Generator { } } + private void setLaterIfNeeded(final GenerationRequest request, final ParsedProperty property, final Class type, final String arg, final StringBuilder sb) { + if (type == String.class && property.value().startsWith("%") && request.parameters().resourceBundleInjection().injectionType() == ResourceBundleInjectionTypes.GETTER + && getControllerInjection(request).fieldInjectionType() == ControllerFieldInjectionTypes.FACTORY) { + controllerFactoryPostAction.add(arg); + } else { + sb.append(arg); + } + } + /** * Injects a controller method * @@ -800,13 +810,7 @@ public class GeneratorImpl implements Generator { if (resourceBundleInjectionType instanceof final ResourceBundleInjectionTypes types) { return switch (types) { case CONSTRUCTOR, GET_BUNDLE -> "bundle.getString(\"" + value + "\")"; - case GETTER -> { - if (getControllerInjection(request).fieldInjectionType() == ControllerFieldInjectionTypes.FACTORY) { - throw new UnsupportedOperationException("Factory injection with bundle getter not supported yet"); - } else { - yield "controller.resources().getString(\"" + value + "\")"; - } - } + case GETTER -> "controller.resources().getString(\"" + value + "\")"; }; } else { throw new IllegalArgumentException("Unknown resource bundle injection type : " + resourceBundleInjectionType); diff --git a/core/src/main/java/com/github/gtache/fxml/compiler/parsing/impl/ParsedIncludeImpl.java b/core/src/main/java/com/github/gtache/fxml/compiler/parsing/impl/ParsedIncludeImpl.java index 05a1a07..ec462ae 100644 --- a/core/src/main/java/com/github/gtache/fxml/compiler/parsing/impl/ParsedIncludeImpl.java +++ b/core/src/main/java/com/github/gtache/fxml/compiler/parsing/impl/ParsedIncludeImpl.java @@ -3,6 +3,7 @@ package com.github.gtache.fxml.compiler.parsing.impl; import com.github.gtache.fxml.compiler.parsing.ParsedInclude; import com.github.gtache.fxml.compiler.parsing.ParsedProperty; +import java.util.Collections; import java.util.LinkedHashMap; import java.util.SequencedMap; @@ -14,6 +15,6 @@ import java.util.SequencedMap; public record ParsedIncludeImpl(SequencedMap properties) implements ParsedInclude { public ParsedIncludeImpl { - properties = new LinkedHashMap<>(properties); + properties = Collections.unmodifiableSequencedMap(new LinkedHashMap<>(properties)); } } diff --git a/core/src/main/java/com/github/gtache/fxml/compiler/parsing/impl/ParsedObjectImpl.java b/core/src/main/java/com/github/gtache/fxml/compiler/parsing/impl/ParsedObjectImpl.java index 46c8301..5cdc077 100644 --- a/core/src/main/java/com/github/gtache/fxml/compiler/parsing/impl/ParsedObjectImpl.java +++ b/core/src/main/java/com/github/gtache/fxml/compiler/parsing/impl/ParsedObjectImpl.java @@ -4,6 +4,7 @@ import com.github.gtache.fxml.compiler.parsing.ParsedObject; import com.github.gtache.fxml.compiler.parsing.ParsedProperty; import java.util.ArrayList; +import java.util.Collections; import java.util.LinkedHashMap; import java.util.Objects; import java.util.SequencedCollection; @@ -21,8 +22,8 @@ public record ParsedObjectImpl(Class clazz, SequencedMap(properties); - children = new LinkedHashMap<>(children); + properties = Collections.unmodifiableSequencedMap(new LinkedHashMap<>(properties)); + children = Collections.unmodifiableSequencedMap(new LinkedHashMap<>(children)); } /** diff --git a/loader/src/test/java/com/github/gtache/fxml/compiler/loader/IncludeController.java b/core/src/test/java/com/github/gtache/fxml/compiler/impl/ControlsController.java similarity index 99% rename from loader/src/test/java/com/github/gtache/fxml/compiler/loader/IncludeController.java rename to core/src/test/java/com/github/gtache/fxml/compiler/impl/ControlsController.java index 0c21256..b00f5ad 100644 --- a/loader/src/test/java/com/github/gtache/fxml/compiler/loader/IncludeController.java +++ b/core/src/test/java/com/github/gtache/fxml/compiler/impl/ControlsController.java @@ -1,4 +1,4 @@ -package com.github.gtache.fxml.compiler.loader; +package com.github.gtache.fxml.compiler.impl; import javafx.fxml.FXML; import javafx.scene.control.*; @@ -9,7 +9,7 @@ import javafx.scene.paint.Color; import javafx.scene.web.HTMLEditor; import javafx.scene.web.WebView; -public class IncludeController { +public class ControlsController { @FXML GridPane gridPane; @FXML diff --git a/loader/src/test/java/com/github/gtache/fxml/compiler/loader/TestController.java b/core/src/test/java/com/github/gtache/fxml/compiler/impl/IncludesController.java similarity index 93% rename from loader/src/test/java/com/github/gtache/fxml/compiler/loader/TestController.java rename to core/src/test/java/com/github/gtache/fxml/compiler/impl/IncludesController.java index 0814749..4dc07a4 100644 --- a/loader/src/test/java/com/github/gtache/fxml/compiler/loader/TestController.java +++ b/core/src/test/java/com/github/gtache/fxml/compiler/impl/IncludesController.java @@ -1,4 +1,4 @@ -package com.github.gtache.fxml.compiler.loader; +package com.github.gtache.fxml.compiler.impl; import javafx.event.ActionEvent; import javafx.fxml.FXML; @@ -15,7 +15,7 @@ import javafx.scene.layout.TilePane; import javafx.scene.layout.VBox; import javafx.scene.text.TextFlow; -public class TestController { +public class IncludesController { @FXML StackPane stackPane; @FXML @@ -30,7 +30,7 @@ public class TestController { Slider playSlider; @FXML - IncludeController includeController; + ControlsController controlsController; @FXML VBox vbox; @FXML @@ -101,8 +101,8 @@ public class TestController { this.playSlider = playSlider; } - public void setIncludeController(final IncludeController includeController) { - this.includeController = includeController; + public void setIncludeController(final ControlsController controlsController) { + this.controlsController = controlsController; } public void setVbox(final VBox vbox) { diff --git a/core/src/test/java/com/github/gtache/fxml/compiler/impl/TestGeneratorImpl.java b/core/src/test/java/com/github/gtache/fxml/compiler/impl/TestGeneratorImpl.java deleted file mode 100644 index 8ee1282..0000000 --- a/core/src/test/java/com/github/gtache/fxml/compiler/impl/TestGeneratorImpl.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.github.gtache.fxml.compiler.impl; - -class TestGeneratorImpl { -} diff --git a/core/src/test/java/com/github/gtache/fxml/compiler/parsing/impl/TestParsedIncludeImpl.java b/core/src/test/java/com/github/gtache/fxml/compiler/parsing/impl/TestParsedIncludeImpl.java index f657c61..cedd1f3 100644 --- a/core/src/test/java/com/github/gtache/fxml/compiler/parsing/impl/TestParsedIncludeImpl.java +++ b/core/src/test/java/com/github/gtache/fxml/compiler/parsing/impl/TestParsedIncludeImpl.java @@ -1,4 +1,52 @@ package com.github.gtache.fxml.compiler.parsing.impl; -public class TestParsedIncludeImpl { +import com.github.gtache.fxml.compiler.parsing.ParsedInclude; +import com.github.gtache.fxml.compiler.parsing.ParsedProperty; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.util.LinkedHashMap; +import java.util.SequencedMap; + +import static org.junit.jupiter.api.Assertions.*; + +@ExtendWith(MockitoExtension.class) +class TestParsedIncludeImpl { + + private final SequencedMap properties; + private final ParsedInclude include; + + TestParsedIncludeImpl(@Mock final ParsedProperty property) { + this.properties = new LinkedHashMap<>(); + this.properties.put("name", property); + this.include = new ParsedIncludeImpl(properties); + } + + @Test + void testGetters() { + assertEquals(properties, include.properties()); + assertEquals(ParsedInclude.class, include.clazz()); + assertEquals(new LinkedHashMap<>(), include.children()); + } + + @Test + void testCopyMap() { + final var originalProperties = include.properties(); + properties.clear(); + assertEquals(originalProperties, include.properties()); + assertNotEquals(properties, include.properties()); + } + + @Test + void testUnmodifiable() { + final var objectProperties = include.properties(); + assertThrows(UnsupportedOperationException.class, objectProperties::clear); + } + + @Test + void testIllegal() { + assertThrows(NullPointerException.class, () -> new ParsedIncludeImpl(null)); + } } diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/loader/IncludeBundle.properties b/core/src/test/resources/com/github/gtache/fxml/compiler/impl/ControlsBundle.properties similarity index 100% rename from loader/src/test/resources/com/github/gtache/fxml/compiler/loader/IncludeBundle.properties rename to core/src/test/resources/com/github/gtache/fxml/compiler/impl/ControlsBundle.properties diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/loader/TestBundle.properties b/core/src/test/resources/com/github/gtache/fxml/compiler/impl/IncludesBundle.properties similarity index 100% rename from loader/src/test/resources/com/github/gtache/fxml/compiler/loader/TestBundle.properties rename to core/src/test/resources/com/github/gtache/fxml/compiler/impl/IncludesBundle.properties diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/loader/includeView.fxml b/core/src/test/resources/com/github/gtache/fxml/compiler/impl/controlsView.fxml similarity index 99% rename from loader/src/test/resources/com/github/gtache/fxml/compiler/loader/includeView.fxml rename to core/src/test/resources/com/github/gtache/fxml/compiler/impl/controlsView.fxml index 11d1c11..e6dc611 100644 --- a/loader/src/test/resources/com/github/gtache/fxml/compiler/loader/includeView.fxml +++ b/core/src/test/resources/com/github/gtache/fxml/compiler/impl/controlsView.fxml @@ -15,7 +15,7 @@ + fx:controller="com.github.gtache.fxml.compiler.impl.ControlsController"> diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/loader/testView.fxml b/core/src/test/resources/com/github/gtache/fxml/compiler/impl/includesView.fxml similarity index 98% rename from loader/src/test/resources/com/github/gtache/fxml/compiler/loader/testView.fxml rename to core/src/test/resources/com/github/gtache/fxml/compiler/impl/includesView.fxml index 761a3fa..03f7f5f 100644 --- a/loader/src/test/resources/com/github/gtache/fxml/compiler/loader/testView.fxml +++ b/core/src/test/resources/com/github/gtache/fxml/compiler/impl/includesView.fxml @@ -6,7 +6,7 @@ + fx:controller="com.github.gtache.fxml.compiler.impl.IncludesController"> @@ -37,8 +37,8 @@ diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/loader/style.css b/core/src/test/resources/com/github/gtache/fxml/compiler/impl/style.css similarity index 100% rename from loader/src/test/resources/com/github/gtache/fxml/compiler/loader/style.css rename to core/src/test/resources/com/github/gtache/fxml/compiler/impl/style.css diff --git a/loader/pom.xml b/loader/pom.xml index 7e36094..4aeb556 100644 --- a/loader/pom.xml +++ b/loader/pom.xml @@ -11,9 +11,6 @@ fxml-compiler-loader - - 1.37 - com.github.gtache @@ -32,12 +29,6 @@ provided - - org.openjfx - javafx-controls - ${javafx.version} - test - org.openjfx javafx-media @@ -50,35 +41,5 @@ ${javafx.version} test - - - org.openjdk.jmh - jmh-core - ${jmh.version} - test - - - org.openjdk.jmh - jmh-generator-annprocess - ${jmh.version} - test - - - - - org.apache.maven.plugins - maven-compiler-plugin - - - - org.openjdk.jmh - jmh-generator-annprocess - ${jmh.version} - - - - - - \ No newline at end of file diff --git a/loader/src/main/java/com/github/gtache/fxml/compiler/parsing/listener/ParsingLoadListener.java b/loader/src/main/java/com/github/gtache/fxml/compiler/parsing/listener/ParsingLoadListener.java index 7b5ddd5..a4be0d9 100644 --- a/loader/src/main/java/com/github/gtache/fxml/compiler/parsing/listener/ParsingLoadListener.java +++ b/loader/src/main/java/com/github/gtache/fxml/compiler/parsing/listener/ParsingLoadListener.java @@ -24,12 +24,12 @@ public class ParsingLoadListener implements LoadListener { private final Deque stack; private final Deque propertyStack; private final Deque> currentObjectStack; + private final SequencedMap currentIncludeProperties; private ParsedObjectImpl.Builder current; private ParsedProperty currentProperty; private List currentObjects; private Object previousEnd; private boolean isInclude; - private SequencedMap currentIncludeProperties; /** * Instantiates the listener @@ -115,12 +115,16 @@ public class ParsingLoadListener implements LoadListener { @Override public void beginPropertyElement(final String name, final Class sourceType) { previousEnd = null; - if (currentProperty != null) { - propertyStack.push(currentProperty); + if (isInclude) { + throw new IllegalStateException("Reading complex property for include"); + } else { + if (currentProperty != null) { + propertyStack.push(currentProperty); + } + currentProperty = new ParsedPropertyImpl(name, sourceType, null); + currentObjectStack.push(currentObjects); + currentObjects = new ArrayList<>(); } - currentProperty = new ParsedPropertyImpl(name, sourceType, null); - currentObjectStack.push(currentObjects); - currentObjects = new ArrayList<>(); } @Override @@ -144,6 +148,8 @@ public class ParsingLoadListener implements LoadListener { final var property = new ParsedPropertyImpl(name, null, value); if (isInclude) { currentIncludeProperties.put(name, property); + } else if (current == null) { + throw new IllegalStateException("Current object is null (trying to add attribute " + name + " = " + value + ")"); } else { current.addProperty(property); } @@ -151,8 +157,14 @@ public class ParsingLoadListener implements LoadListener { @Override public void readPropertyAttribute(final String name, final Class sourceType, final String value) { - previousEnd = null; - current.addProperty(new ParsedPropertyImpl(name, sourceType, value)); + if (isInclude) { + throw new IllegalStateException("Reading complex property for include"); + } else if (current == null) { + throw new IllegalStateException("Current object is null (trying to add property " + name + "/" + sourceType + " = " + value + ")"); + } else { + previousEnd = null; + current.addProperty(new ParsedPropertyImpl(name, sourceType, value)); + } } @Override @@ -162,31 +174,49 @@ public class ParsingLoadListener implements LoadListener { @Override public void readEventHandlerAttribute(final String name, final String value) { - current.addProperty(new ParsedPropertyImpl(name, EventHandler.class, value)); + if (isInclude) { + throw new IllegalStateException("Reading event handler for include"); + } else if (current == null) { + throw new IllegalStateException("Current object is null (trying to add event handler" + name + " = " + value + ")"); + } else { + current.addProperty(new ParsedPropertyImpl(name, EventHandler.class, value)); + } } @Override public void endElement(final Object value) { if (isInclude) { - currentObjects.add(new ParsedIncludeImpl(currentIncludeProperties)); - currentIncludeProperties.clear(); - isInclude = false; + endInclude(); } else if (previousEnd == value || value instanceof ObservableList) { - //End of property - if (currentProperty == null) { - throw new IllegalStateException("Unexpected end element (property is null) : " + value); - } else { - currentObjects.forEach(go -> current.addChild(currentProperty, go)); - currentObjects = currentObjectStack.isEmpty() ? new ArrayList<>() : currentObjectStack.pop(); - currentProperty = propertyStack.isEmpty() ? null : propertyStack.pop(); - } + endProperty(value); } else if (current != null) { - final var built = current.build(); - currentObjects.add(built); - current = stack.isEmpty() ? null : stack.pop(); - previousEnd = value; + endObject(value); } else { throw new IllegalStateException("Unexpected end element (current is null) : " + value); } } + + private void endInclude() { + currentObjects.add(new ParsedIncludeImpl(currentIncludeProperties)); + currentIncludeProperties.clear(); + isInclude = false; + } + + private void endProperty(final Object value) { + //End of property + if (currentProperty == null) { + throw new IllegalStateException("Unexpected end element (property is null) : " + value); + } else { + currentObjects.forEach(go -> current.addChild(currentProperty, go)); + currentObjects = currentObjectStack.isEmpty() ? new ArrayList<>() : currentObjectStack.pop(); + currentProperty = propertyStack.isEmpty() ? null : propertyStack.pop(); + } + } + + private void endObject(final Object value) { + final var built = current.build(); + currentObjects.add(built); + current = stack.isEmpty() ? null : stack.pop(); + previousEnd = value; + } } diff --git a/loader/src/test/java/com/github/gtache/fxml/compiler/impl/ControlsController.java b/loader/src/test/java/com/github/gtache/fxml/compiler/impl/ControlsController.java new file mode 120000 index 0000000..c73ef71 --- /dev/null +++ b/loader/src/test/java/com/github/gtache/fxml/compiler/impl/ControlsController.java @@ -0,0 +1 @@ +../../../../../../../../../../core/src/test/java/com/github/gtache/fxml/compiler/impl/ControlsController.java \ No newline at end of file diff --git a/loader/src/test/java/com/github/gtache/fxml/compiler/impl/IncludesController.java b/loader/src/test/java/com/github/gtache/fxml/compiler/impl/IncludesController.java new file mode 120000 index 0000000..1ebca78 --- /dev/null +++ b/loader/src/test/java/com/github/gtache/fxml/compiler/impl/IncludesController.java @@ -0,0 +1 @@ +../../../../../../../../../../core/src/test/java/com/github/gtache/fxml/compiler/impl/IncludesController.java \ No newline at end of file diff --git a/loader/src/test/java/com/github/gtache/fxml/compiler/impl/TestGeneratorImpl.java b/loader/src/test/java/com/github/gtache/fxml/compiler/impl/TestGeneratorImpl.java new file mode 100644 index 0000000..f5c5560 --- /dev/null +++ b/loader/src/test/java/com/github/gtache/fxml/compiler/impl/TestGeneratorImpl.java @@ -0,0 +1,157 @@ +package com.github.gtache.fxml.compiler.impl; + +import com.github.gtache.fxml.compiler.GenerationRequest; +import com.github.gtache.fxml.compiler.Generator; +import com.github.gtache.fxml.compiler.parsing.listener.ParsingLoadListener; +import javafx.application.Platform; +import javafx.fxml.FXMLLoader; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.Arguments; +import org.junit.jupiter.params.provider.MethodSource; + +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.ResourceBundle; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Stream; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class TestGeneratorImpl { + + private static final Map> GENERIC_TYPES; + + static { + GENERIC_TYPES = new HashMap<>(); + GENERIC_TYPES.put("choiceBox", List.of("String")); + GENERIC_TYPES.put("listView", List.of("javafx.scene.control.Label")); + GENERIC_TYPES.put("spinner", List.of("Double")); + GENERIC_TYPES.put("tableView", List.of("javafx.scene.control.TextArea")); + GENERIC_TYPES.put("treeView", List.of("String")); + GENERIC_TYPES.put("treeTableView", List.of("javafx.scene.control.TreeItem")); + GENERIC_TYPES.put("treeTableColumn1", List.of("javafx.scene.control.TreeItem", "String")); + GENERIC_TYPES.put("treeTableColumn2", List.of("javafx.scene.control.TreeItem", "Integer")); + GENERIC_TYPES.put("tableColumn1", List.of("javafx.scene.control.TextArea", "Float")); + GENERIC_TYPES.put("tableColumn2", List.of("javafx.scene.control.TextArea", "String")); + } + + private final Generator generator; + + TestGeneratorImpl() { + this.generator = new GeneratorImpl(); + } + + @BeforeAll + static void beforeAll() { + try { + Platform.startup(() -> { + + }); + } catch (final IllegalStateException ignored) { + + } + } + + @ParameterizedTest + @MethodSource("providesGenerationTestCases") + public void testGenerate(final String file, final ControllerFieldInjectionTypes field, final ControllerMethodsInjectionType method, final ResourceBundleInjectionTypes bundle) { + final var request = getRequest(file, field, method, bundle); + final var path = Paths.get(getPath(file, field, method, bundle)); + try (final var in = getClass().getResourceAsStream("/com/github/gtache/fxml/compiler/impl/" + path)) { + final var expected = new String(in.readAllBytes(), StandardCharsets.UTF_8); + final var actual = generator.generate(request); + assertEquals(expected, actual); + } catch (final IOException e) { + throw new RuntimeException(e); + } + } + + public static void main(final String[] args) { + //Generates the test cases + try { + Platform.startup(() -> { + final var generator = new GeneratorImpl(); + final var files = List.of("Controls", "Includes"); + for (final var file : files) { + for (final var field : ControllerFieldInjectionTypes.values()) { + for (final var method : ControllerMethodsInjectionType.values()) { + for (final var bundle : ResourceBundleInjectionTypes.values()) { + final var request = getRequest(file, field, method, bundle); + final var content = generator.generate(request); + final var path = Paths.get(getPath(file, field, method, bundle)); + try { + Files.writeString(path, content); + } catch (final IOException e) { + throw new RuntimeException(e); + } + } + } + } + } + }); + } finally { + Platform.exit(); + } + } + + private static String getPath(final String file, final ControllerFieldInjectionTypes field, final ControllerMethodsInjectionType method, final ResourceBundleInjectionTypes bundle) { + return "expected-" + file.toLowerCase() + "-" + field.name().toLowerCase() + "-" + method.name().toLowerCase() + "-" + bundle.name().replace("_", "").toLowerCase() + ".txt"; + } + + private static GenerationRequest getRequest(final String file, final ControllerFieldInjectionTypes field, final ControllerMethodsInjectionType method, final ResourceBundleInjectionTypes bundle) { + return CompletableFuture.supplyAsync(() -> { + final var controlsControllerInfo = new ControllerInfoImpl(Map.of("keyPressed", false, "mouseClicked", false), + GENERIC_TYPES); + final var includesControllerInfo = new ControllerInfoImpl(Map.of(), Map.of()); + final var controllerInfo = file.equals("Controls") ? controlsControllerInfo : includesControllerInfo; + final var resourceBundlePath = "com.github.gtache.fxml.compiler.impl." + file + "Bundle"; + final var viewPath = "/com/github/gtache/fxml/compiler/impl/" + file + "View.fxml"; + final var listener = new ParsingLoadListener(); + final var loader = new FXMLLoader(TestGeneratorImpl.class.getResource(viewPath)); + loader.setLoadListener(listener); + loader.setResources(ResourceBundle.getBundle(resourceBundlePath)); + try { + loader.load(); + } catch (final IOException e) { + throw new RuntimeException(e); + } + final var root = listener.root(); + return new GenerationRequestImpl( + new GenerationParametersImpl(Map.of( + "com.github.gtache.fxml.compiler.impl.ControlsController", new ControllerInjectionImpl(field, method, + "com.github.gtache.fxml.compiler.impl.ControlsController"), + "com.github.gtache.fxml.compiler.impl.IncludesController", new ControllerInjectionImpl(field, method, + "com.github.gtache.fxml.compiler.impl.IncludesController")), + Map.of("controlsView.fxml", "com.github.gtache.fxml.compiler.impl.ControlsView"), + Map.of("controlsView.fxml", "com.github.gtache.fxml.compiler.impl.ControlsController"), + new ResourceBundleInjectionImpl(bundle, resourceBundlePath) + ), + controllerInfo, + root, + "com.github.gtache.fxml.compiler.impl." + file + "Controller" + ); + }, Platform::runLater).join(); + } + + private static Stream providesGenerationTestCases() { + final var files = List.of("Controls", "Includes"); + final var list = new ArrayList(); + for (final var file : files) { + for (final var field : ControllerFieldInjectionTypes.values()) { + for (final var method : ControllerMethodsInjectionType.values()) { + for (final var bundle : ResourceBundleInjectionTypes.values()) { + list.add(Arguments.of(file, field, method, bundle)); + } + } + } + } + return list.stream(); + } +} diff --git a/loader/src/test/java/com/github/gtache/fxml/compiler/loader/AssignIncludeView.java b/loader/src/test/java/com/github/gtache/fxml/compiler/loader/AssignIncludeView.java deleted file mode 100644 index f65a5e8..0000000 --- a/loader/src/test/java/com/github/gtache/fxml/compiler/loader/AssignIncludeView.java +++ /dev/null @@ -1,439 +0,0 @@ -package com.github.gtache.fxml.compiler.loader; - -import java.util.Map; -import java.util.ResourceBundle; - - -/** - * Generated code, not thread-safe - */ -public final class AssignIncludeView { - - private final Map, Object> controllersMap; - private final Map, ResourceBundle> resourceBundlesMap; - private final Map> includeControllersMap; - private boolean loaded; - private com.github.gtache.fxml.compiler.loader.IncludeController controller; - - /** - * Instantiates a new AssignIncludeView with no nested controllers and no resource bundle - * - * @param controller The controller - */ - public AssignIncludeView(final com.github.gtache.fxml.compiler.loader.IncludeController controller) { - this(Map.of(com.github.gtache.fxml.compiler.loader.IncludeController.class, controller), Map.of(), Map.of()); - } - - /** - * Instantiates a new AssignIncludeView with no nested controllers - * - * @param controller The controller - * @param resourceBundle The resource bundle - */ - public AssignIncludeView(final com.github.gtache.fxml.compiler.loader.IncludeController controller, final ResourceBundle resourceBundle) { - this(Map.of(com.github.gtache.fxml.compiler.loader.IncludeController.class, controller), Map.of(), Map.of(com.github.gtache.fxml.compiler.loader.IncludeController.class, resourceBundle)); - } - - /** - * Instantiates a new AssignIncludeView with nested controllers and no resource bundle - * - * @param controllersMap The map of controller class to controller - * @param includeControllersMap The map of source to controller class - */ - public AssignIncludeView(final Map, Object> controllersMap, final Map> includeControllersMap) { - this(controllersMap, includeControllersMap, Map.of()); - } - - /** - * Instantiates a new AssignIncludeView with nested controllers - * - * @param controllersMap The map of controller class to controller - * @param includeControllersMap The map of source to controller class - * @param resourceBundlesMap The map of controller class to resource bundle - */ - public AssignIncludeView(final Map, Object> controllersMap, final Map> includeControllersMap, final Map, ResourceBundle> resourceBundlesMap) { - this.controllersMap = Map.copyOf(controllersMap); - this.includeControllersMap = Map.copyOf(includeControllersMap); - this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); - } - - public javafx.scene.Parent load() { - if (loaded) { - throw new IllegalStateException("Already loaded"); - } - final var bundle = resourceBundlesMap.get(com.github.gtache.fxml.compiler.loader.IncludeController.class); - controller = (com.github.gtache.fxml.compiler.loader.IncludeController) controllersMap.get(com.github.gtache.fxml.compiler.loader.IncludeController.class); - final var object0 = new javafx.scene.layout.GridPane(); - controller.gridPane = object0; - object0.setOnInputMethodTextChanged(controller::inputMethodTextChanged); - object0.setOnKeyPressed(e -> controller.keyPressed()); - object0.setOnKeyReleased(controller::keyReleased); - object0.setOnKeyTyped(controller::keyTyped); - final var object1 = new javafx.scene.layout.RowConstraints(); - final var object2 = new javafx.scene.layout.RowConstraints(); - final var object3 = new javafx.scene.layout.RowConstraints(); - final var object4 = new javafx.scene.layout.RowConstraints(); - final var object5 = new javafx.scene.layout.RowConstraints(); - final var object6 = new javafx.scene.layout.RowConstraints(); - final var object7 = new javafx.scene.layout.RowConstraints(); - final var object8 = new javafx.scene.layout.RowConstraints(); - final var object9 = new javafx.scene.layout.RowConstraints(); - final var object10 = new javafx.scene.layout.RowConstraints(); - final var object11 = new javafx.scene.layout.RowConstraints(); - final var object12 = new javafx.scene.layout.RowConstraints(); - final var object13 = new javafx.scene.layout.RowConstraints(); - final var object14 = new javafx.scene.layout.RowConstraints(); - final var object15 = new javafx.scene.layout.RowConstraints(); - final var object16 = new javafx.scene.layout.RowConstraints(); - final var object17 = new javafx.scene.layout.RowConstraints(); - final var object18 = new javafx.scene.layout.RowConstraints(); - object0.getRowConstraints().addAll(object1, object2, object3, object4, object5, object6, object7, object8, object9, object10, object11, object12, object13, object14, object15, object16, object17, object18); - final var object19 = new javafx.scene.layout.ColumnConstraints(); - final var object20 = new javafx.scene.layout.ColumnConstraints(); - final var object21 = new javafx.scene.layout.ColumnConstraints(); - object21.setMinWidth(10.0); - object21.setPrefWidth(100.0); - object0.getColumnConstraints().addAll(object19, object20, object21); - final var object22 = new javafx.scene.control.Button(); - controller.button = object22; - object22.setMnemonicParsing(false); - object22.setText("Button"); - final var object23 = new javafx.scene.control.CheckBox(); - controller.checkBox = object23; - object23.setIndeterminate(true); - object23.setMnemonicParsing(false); - object23.setText("CheckBox"); - javafx.scene.layout.GridPane.setColumnIndex(object23, 1); - final var object24 = new javafx.scene.control.ChoiceBox(); - controller.choiceBox = object24; - object24.setCacheShape(false); - object24.setCenterShape(false); - object24.setDisable(true); - object24.setFocusTraversable(false); - object24.setPrefWidth(150.0); - object24.setScaleShape(false); - object24.setVisible(false); - javafx.scene.layout.GridPane.setRowIndex(object24, 1); - final var object25 = new javafx.scene.control.ColorPicker(); - controller.colorPicker = object25; - object25.setNodeOrientation(javafx.geometry.NodeOrientation.LEFT_TO_RIGHT); - object25.setOpacity(0.5); - javafx.scene.layout.GridPane.setColumnIndex(object25, 1); - javafx.scene.layout.GridPane.setRowIndex(object25, 1); - final var object26 = new javafx.scene.paint.Color(0.7894737124443054, 0.08771929889917374, 0.08771929889917374, 1); - controller.color = object26; - object25.setValue(object26); - final var object27 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); - object25.setOpaqueInsets(object27); - final var object28 = new javafx.scene.control.ComboBox(); - controller.comboBox = object28; - object28.setEditable(true); - object28.setPrefWidth(150.0); - object28.setPromptText("Text"); - object28.setVisibleRowCount(5); - javafx.scene.layout.GridPane.setRowIndex(object28, 2); - final var object29 = javafx.scene.Cursor.CLOSED_HAND; - object28.setCursor(object29); - final var object30 = new javafx.scene.effect.Bloom(); - object28.setEffect(object30); - final var object31 = new javafx.scene.control.DatePicker(); - controller.datePicker = object31; - object31.setShowWeekNumbers(true); - object31.setStyle("-fx-background-color: #ffffff;"); - javafx.scene.layout.GridPane.setColumnIndex(object31, 1); - javafx.scene.layout.GridPane.setRowIndex(object31, 2); - final var object32 = new javafx.scene.web.HTMLEditor(); - controller.htmlEditor = object32; - object32.setHtmlText(""); - object32.setPrefHeight(200.0); - object32.setPrefWidth(506.0); - object32.getStyleClass().addAll("clazz"); - object32.getStylesheets().addAll("@style.css"); - javafx.scene.layout.GridPane.setRowIndex(object32, 3); - final var object33 = new javafx.scene.control.Hyperlink(); - controller.hyperlink = object33; - object33.setText("Hyperlink"); - javafx.scene.layout.GridPane.setColumnIndex(object33, 1); - javafx.scene.layout.GridPane.setRowIndex(object33, 3); - final var object34 = new javafx.scene.image.ImageView(); - controller.imageView = object34; - object34.setFitHeight(150.0); - object34.setFitWidth(200.0); - object34.setPickOnBounds(true); - object34.setPreserveRatio(true); - javafx.scene.layout.GridPane.setRowIndex(object34, 4); - final var object35 = new javafx.scene.control.Label(); - controller.label = object35; - object35.setAccessibleHelp("TTTTT"); - object35.setAccessibleText("TTT"); - object35.setBlendMode(javafx.scene.effect.BlendMode.ADD); - object35.setCache(true); - object35.setCacheHint(javafx.scene.CacheHint.QUALITY); - object35.setDepthTest(javafx.scene.DepthTest.ENABLE); - object35.setMnemonicParsing(true); - object35.setMouseTransparent(true); - object35.setText(bundle.getString("include.label")); - javafx.scene.layout.GridPane.setColumnIndex(object35, 1); - javafx.scene.layout.GridPane.setRowIndex(object35, 4); - final var object36 = new javafx.scene.control.ListView(); - controller.listView = object36; - object36.setFixedCellSize(20.0); - object36.setNodeOrientation(javafx.geometry.NodeOrientation.RIGHT_TO_LEFT); - object36.setOrientation(javafx.geometry.Orientation.HORIZONTAL); - object36.setPrefHeight(200.0); - object36.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setRowIndex(object36, 5); - final var object37 = new javafx.scene.media.MediaView(); - controller.mediaView = object37; - object37.setFitHeight(200.0); - object37.setFitWidth(200.0); - javafx.scene.layout.GridPane.setColumnIndex(object37, 1); - javafx.scene.layout.GridPane.setColumnSpan(object37, 2); - javafx.scene.layout.GridPane.setRowIndex(object37, 5); - javafx.scene.layout.GridPane.setRowSpan(object37, 2); - final var object38 = new javafx.scene.control.MenuBar(); - controller.menuBar = object38; - javafx.scene.layout.GridPane.setHalignment(object38, javafx.geometry.HPos.RIGHT); - javafx.scene.layout.GridPane.setHgrow(object38, javafx.scene.layout.Priority.ALWAYS); - javafx.scene.layout.GridPane.setRowIndex(object38, 7); - javafx.scene.layout.GridPane.setValignment(object38, javafx.geometry.VPos.BASELINE); - javafx.scene.layout.GridPane.setVgrow(object38, javafx.scene.layout.Priority.SOMETIMES); - final var object39 = new javafx.scene.control.Menu(); - controller.menu1 = object39; - object39.setMnemonicParsing(false); - object39.setText("File"); - final var object40 = new javafx.scene.control.MenuItem(); - controller.menuItem1 = object40; - object40.setMnemonicParsing(false); - object40.setText("Close"); - object39.getItems().addAll(object40); - final var object41 = new javafx.scene.control.Menu(); - object41.setMnemonicParsing(false); - object41.setText("Edit"); - final var object42 = new javafx.scene.control.MenuItem(); - object42.setMnemonicParsing(false); - object42.setText("Delete"); - object41.getItems().addAll(object42); - final var object43 = new javafx.scene.control.Menu(); - object43.setMnemonicParsing(false); - object43.setText("Help"); - final var object44 = new javafx.scene.control.MenuItem(); - object44.setMnemonicParsing(false); - object44.setText("About"); - object43.getItems().addAll(object44); - object38.getMenus().addAll(object39, object41, object43); - final var object45 = new javafx.scene.control.MenuButton(); - controller.menuButton = object45; - object45.setMnemonicParsing(false); - object45.setText("MenuButton"); - javafx.scene.layout.GridPane.setColumnIndex(object45, 1); - javafx.scene.layout.GridPane.setRowIndex(object45, 7); - final var object46 = new javafx.scene.control.MenuItem(); - object46.setMnemonicParsing(false); - object46.setText("Action 1"); - final var object47 = new javafx.scene.control.MenuItem(); - object47.setMnemonicParsing(false); - object47.setText("Action 2"); - object45.getItems().addAll(object46, object47); - final var object48 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); - javafx.scene.layout.GridPane.setMargin(object45, object48); - final var object49 = new javafx.scene.control.Pagination(); - controller.pagination = object49; - object49.setPrefHeight(200.0); - object49.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setRowIndex(object49, 8); - final var object50 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); - object49.setPadding(object50); - final var object51 = new javafx.scene.control.PasswordField(); - controller.passwordField = object51; - object51.setMaxHeight(6.0); - object51.setMaxWidth(5.0); - object51.setMinHeight(2.0); - object51.setMinWidth(1.0); - object51.setPrefColumnCount(7); - object51.setPrefHeight(4.0); - object51.setPrefWidth(3.0); - javafx.scene.layout.GridPane.setColumnIndex(object51, 1); - javafx.scene.layout.GridPane.setRowIndex(object51, 8); - final var object52 = new javafx.scene.control.ProgressBar(); - controller.progressBar = object52; - object52.setLayoutX(10.0); - object52.setLayoutY(20.0); - object52.setPrefWidth(200.0); - object52.setProgress(0.0); - javafx.scene.layout.GridPane.setRowIndex(object52, 9); - final var object53 = new javafx.scene.control.ProgressIndicator(); - controller.progressIndicator = object53; - object53.setProgress(0.0); - object53.setRotate(2.0); - javafx.scene.layout.GridPane.setColumnIndex(object53, 1); - javafx.scene.layout.GridPane.setRowIndex(object53, 9); - final var object54 = new javafx.geometry.Point3D(4.0, 5.0, 6.0); - object53.setRotationAxis(object54); - final var object55 = new javafx.scene.control.RadioButton(); - controller.radioButton = object55; - object55.setMnemonicParsing(false); - object55.setScaleX(7.0); - object55.setScaleY(2.0); - object55.setScaleZ(3.0); - object55.setText("RadioButton"); - object55.setTranslateX(4.0); - object55.setTranslateY(5.0); - object55.setTranslateZ(6.0); - javafx.scene.layout.GridPane.setRowIndex(object55, 10); - final var object56 = new javafx.scene.control.ScrollBar(); - controller.scrollBarH = object56; - javafx.scene.layout.GridPane.setColumnIndex(object56, 1); - javafx.scene.layout.GridPane.setRowIndex(object56, 10); - final var object57 = new javafx.scene.control.ScrollBar(); - controller.scrollBarV = object57; - object57.setOrientation(javafx.geometry.Orientation.VERTICAL); - javafx.scene.layout.GridPane.setRowIndex(object57, 11); - final var object58 = new javafx.scene.control.Separator(); - controller.separatorH = object58; - object58.setOnDragDetected(controller::dragDetected); - object58.setOnDragDone(controller::dragDone); - object58.setOnDragDropped(controller::dragDropped); - object58.setOnDragEntered(controller::dragEntered); - object58.setOnDragExited(controller::dragExited); - object58.setOnDragOver(controller::dragOver); - object58.setOnMouseDragEntered(controller::mouseDragEntered); - object58.setOnMouseDragExited(controller::mouseDragExited); - object58.setOnMouseDragOver(controller::mouseDragOver); - object58.setOnMouseDragReleased(controller::mouseDragReleased); - object58.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setColumnIndex(object58, 1); - javafx.scene.layout.GridPane.setRowIndex(object58, 11); - final var object59 = new javafx.scene.control.Separator(); - controller.separatorV = object59; - object59.setOrientation(javafx.geometry.Orientation.VERTICAL); - object59.setPrefHeight(200.0); - javafx.scene.layout.GridPane.setRowIndex(object59, 12); - final var object60 = new javafx.scene.control.Slider(); - controller.sliderH = object60; - object60.setOnContextMenuRequested(controller::contextMenuRequested); - object60.setOnMouseClicked(e -> controller.mouseClicked()); - object60.setOnMouseDragged(controller::mouseDragged); - object60.setOnMouseEntered(controller::mouseEntered); - object60.setOnMouseExited(controller::mouseExited); - object60.setOnMouseMoved(controller::mouseMoved); - object60.setOnMousePressed(controller::mousePressed); - object60.setOnMouseReleased(controller::mouseReleased); - object60.setOnScroll(controller::onScroll); - object60.setOnScrollFinished(controller::onScrollFinished); - object60.setOnScrollStarted(controller::onScrollStarted); - javafx.scene.layout.GridPane.setColumnIndex(object60, 1); - javafx.scene.layout.GridPane.setRowIndex(object60, 12); - final var object61 = new javafx.scene.control.Slider(); - controller.sliderV = object61; - object61.setOnZoom(controller::onZoom); - object61.setOnZoomFinished(controller::onZoomFinished); - object61.setOnZoomStarted(controller::onZoomStarted); - object61.setOrientation(javafx.geometry.Orientation.VERTICAL); - javafx.scene.layout.GridPane.setRowIndex(object61, 13); - final var object62 = new javafx.scene.control.Spinner(); - controller.spinner = object62; - javafx.scene.layout.GridPane.setColumnIndex(object62, 1); - javafx.scene.layout.GridPane.setRowIndex(object62, 13); - final var object63 = new javafx.scene.control.SplitMenuButton(); - controller.splitMenuButton = object63; - object63.setMnemonicParsing(false); - object63.setText("SplitMenuButton"); - javafx.scene.layout.GridPane.setRowIndex(object63, 14); - final var object64 = new javafx.scene.control.MenuItem(); - controller.item1 = object64; - object64.setMnemonicParsing(false); - object64.setText("Action 1"); - final var object65 = new javafx.scene.control.MenuItem(); - controller.item2 = object65; - object65.setMnemonicParsing(false); - object65.setText("Action 2"); - object63.getItems().addAll(object64, object65); - final var object66 = new javafx.scene.control.TableView(); - controller.tableView = object66; - object66.setPrefHeight(200.0); - object66.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setColumnIndex(object66, 1); - javafx.scene.layout.GridPane.setRowIndex(object66, 14); - final var object67 = new javafx.scene.control.TableColumn(); - controller.tableColumn1 = object67; - object67.setPrefWidth(75.0); - object67.setText("C1"); - final var object68 = new javafx.scene.control.TableColumn(); - controller.tableColumn2 = object68; - object68.setPrefWidth(75.0); - object68.setText("C2"); - object66.getColumns().addAll(object67, object68); - final var object69 = new javafx.scene.control.TextArea(); - controller.textArea = object69; - object69.setPrefHeight(200.0); - object69.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setRowIndex(object69, 15); - final var object70 = new javafx.scene.control.TextField(); - controller.textField = object70; - javafx.scene.layout.GridPane.setColumnIndex(object70, 1); - javafx.scene.layout.GridPane.setRowIndex(object70, 15); - final var object71 = new javafx.scene.control.ToggleButton(); - object71.setMnemonicParsing(false); - object71.setOnAction(controller::onAction); - object71.setOnRotate(controller::onRotate); - object71.setOnRotationFinished(controller::onRotationFinished); - object71.setOnRotationStarted(controller::onRotationStarted); - object71.setText("ToggleButton"); - javafx.scene.layout.GridPane.setRowIndex(object71, 16); - final var object72 = new javafx.scene.control.TreeTableView>(); - controller.treeTableView = object72; - object72.setPrefHeight(200.0); - object72.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setColumnIndex(object72, 1); - javafx.scene.layout.GridPane.setRowIndex(object72, 16); - final var object73 = new javafx.scene.control.TreeTableColumn, String>(); - controller.treeTableColumn1 = object73; - object73.setOnEditCancel(controller::onEditCancel); - object73.setOnEditCommit(controller::onEditCommit); - object73.setOnEditStart(controller::onEditStart); - object73.setPrefWidth(75.0); - object73.setText("C1"); - final var object74 = new javafx.scene.control.TreeTableColumn, Integer>(); - controller.treeTableColumn2 = object74; - object74.setPrefWidth(75.0); - object74.setSortType(javafx.scene.control.TreeTableColumn.SortType.DESCENDING); - object74.setText("C2"); - object72.getColumns().addAll(object73, object74); - final var object75 = new javafx.scene.control.TreeView(); - controller.treeView = object75; - object75.setOnSwipeDown(controller::onSwipeDown); - object75.setOnSwipeLeft(controller::onSwipeLeft); - object75.setOnSwipeRight(controller::onSwipeRight); - object75.setOnSwipeUp(controller::onSwipeUp); - object75.setPrefHeight(200.0); - object75.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setRowIndex(object75, 17); - final var object76 = new javafx.scene.web.WebView(); - controller.webView = object76; - object76.setOnTouchMoved(controller::onTouchMoved); - object76.setOnTouchPressed(controller::onTouchPressed); - object76.setOnTouchReleased(controller::onTouchReleased); - object76.setOnTouchStationary(controller::onTouchStationary); - object76.setPrefHeight(200.0); - object76.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setColumnIndex(object76, 1); - javafx.scene.layout.GridPane.setRowIndex(object76, 17); - object0.getChildren().addAll(object22, object23, object24, object25, object28, object31, object32, object33, object34, object35, object36, object37, object38, object45, object49, object51, object52, object53, object55, object56, object57, object58, object59, object60, object61, object62, object63, object66, object69, object70, object71, object72, object75, object76); - controller.initialize(); - loaded = true; - return object0; - } - - - /** - * @return The controller - */ - public com.github.gtache.fxml.compiler.loader.IncludeController controller() { - if (loaded) { - return controller; - } else { - throw new IllegalStateException("Not loaded"); - } - } -} diff --git a/loader/src/test/java/com/github/gtache/fxml/compiler/loader/AssignTestView.java b/loader/src/test/java/com/github/gtache/fxml/compiler/loader/AssignTestView.java deleted file mode 100644 index af5acb0..0000000 --- a/loader/src/test/java/com/github/gtache/fxml/compiler/loader/AssignTestView.java +++ /dev/null @@ -1,198 +0,0 @@ -package com.github.gtache.fxml.compiler.loader; - -import java.util.HashMap; -import java.util.Map; -import java.util.ResourceBundle; - - -/** - * Generated code, not thread-safe - */ -public final class AssignTestView { - - private final Map, Object> controllersMap; - private final Map, ResourceBundle> resourceBundlesMap; - private final Map> includeControllersMap; - private boolean loaded; - private com.github.gtache.fxml.compiler.loader.TestController controller; - - /** - * Instantiates a new AssignTestView with no nested controllers and no resource bundle - * - * @param controller The controller - */ - public AssignTestView(final com.github.gtache.fxml.compiler.loader.TestController controller) { - this(Map.of(com.github.gtache.fxml.compiler.loader.TestController.class, controller), Map.of(), Map.of()); - } - - /** - * Instantiates a new AssignTestView with no nested controllers - * - * @param controller The controller - * @param resourceBundle The resource bundle - */ - public AssignTestView(final com.github.gtache.fxml.compiler.loader.TestController controller, final ResourceBundle resourceBundle) { - this(Map.of(com.github.gtache.fxml.compiler.loader.TestController.class, controller), Map.of(), Map.of(com.github.gtache.fxml.compiler.loader.TestController.class, resourceBundle)); - } - - /** - * Instantiates a new AssignTestView with nested controllers and no resource bundle - * - * @param controllersMap The map of controller class to controller - * @param includeControllersMap The map of source to controller class - */ - public AssignTestView(final Map, Object> controllersMap, final Map> includeControllersMap) { - this(controllersMap, includeControllersMap, Map.of()); - } - - /** - * Instantiates a new AssignTestView with nested controllers - * - * @param controllersMap The map of controller class to controller - * @param includeControllersMap The map of source to controller class - * @param resourceBundlesMap The map of controller class to resource bundle - */ - public AssignTestView(final Map, Object> controllersMap, final Map> includeControllersMap, final Map, ResourceBundle> resourceBundlesMap) { - this.controllersMap = Map.copyOf(controllersMap); - this.includeControllersMap = Map.copyOf(includeControllersMap); - this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); - } - - public javafx.scene.Parent load() { - if (loaded) { - throw new IllegalStateException("Already loaded"); - } - final var bundle = resourceBundlesMap.get(com.github.gtache.fxml.compiler.loader.TestController.class); - controller = (com.github.gtache.fxml.compiler.loader.TestController) controllersMap.get(com.github.gtache.fxml.compiler.loader.TestController.class); - final var object0 = new javafx.scene.layout.BorderPane(); - final var object1 = new javafx.scene.layout.VBox(); - javafx.scene.layout.BorderPane.setAlignment(object1, javafx.geometry.Pos.CENTER); - final var object2 = new javafx.scene.layout.HBox(); - object2.setAlignment(javafx.geometry.Pos.CENTER); - object2.setSpacing(10.0); - final var object3 = new javafx.scene.control.Slider(); - controller.playSlider = object3; - javafx.scene.layout.HBox.setHgrow(object3, javafx.scene.layout.Priority.ALWAYS); - final var object4 = new javafx.geometry.Insets(0, 0, 0, 10.0); - object3.setPadding(object4); - final var object5 = new javafx.scene.control.Label(); - controller.playLabel = object5; - object5.setText("Label"); - final var object6 = new javafx.geometry.Insets(0, 10.0, 0, 0); - object5.setPadding(object6); - object2.getChildren().addAll(object3, object5); - final var object7 = new javafx.geometry.Insets(10.0, 0, 0, 0); - object2.setPadding(object7); - final var object8 = new javafx.scene.layout.HBox(); - object8.setAlignment(javafx.geometry.Pos.CENTER); - object8.setSpacing(10.0); - final var object9 = new javafx.scene.control.Button(); - controller.playButton = object9; - object9.setMnemonicParsing(false); - object9.setOnAction(controller::playPressed); - final var object10 = new javafx.geometry.Insets(0, 20.0, 0, 0); - javafx.scene.layout.HBox.setMargin(object9, object10); - final var object11 = new javafx.scene.control.Label(); - object11.setText(bundle.getString("media.volume.label")); - final var object12 = new javafx.scene.control.Slider(); - controller.volumeSlider = object12; - object12.setValue(100); - final var object13 = new javafx.scene.control.Label(); - controller.volumeValueLabel = object13; - object13.setText("Label"); - final var class0 = includeControllersMap.get("includeView.fxml"); - final var map0 = new HashMap<>(resourceBundlesMap); - final var bundle0 = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.loader.IncludeBundle"); - map0.put(class0, bundle0); - final var view0 = new com.github.gtache.fxml.compiler.loader.AssignIncludeView(controllersMap, includeControllersMap, map0); - final var object14 = view0.load(); - final var controller0 = view0.controller(); - controller.includeController = controller0; - object8.getChildren().addAll(object9, object11, object12, object13, object14); - final var object15 = new javafx.geometry.Insets(10.0, 10.0, 10.0, 10.0); - object8.setPadding(object15); - object1.getChildren().addAll(object2, object8); - object0.setBottom(object1); - final var object16 = new javafx.scene.layout.VBox(); - controller.vbox = object16; - final var object17 = new javafx.scene.control.ToolBar(); - controller.toolBar = object17; - final var object18 = new javafx.scene.control.TitledPane(); - controller.titledPane = object18; - final var object19 = new javafx.scene.layout.TilePane(); - controller.tilePane = object19; - final var object20 = new javafx.scene.text.TextFlow(); - controller.textFlow = object20; - final var object21 = new javafx.scene.control.TabPane(); - controller.tabPane = object21; - final var object22 = new javafx.scene.control.Tab(); - controller.tab = object22; - final var object23 = new javafx.scene.layout.StackPane(); - controller.stackPane = object23; - final var object24 = new javafx.scene.control.SplitPane(); - controller.splitPane = object24; - final var object25 = new javafx.scene.control.ScrollPane(); - controller.scrollPane = object25; - final var object26 = new javafx.scene.layout.Pane(); - controller.pane = object26; - final var object27 = new javafx.scene.layout.HBox(); - controller.hbox = object27; - final var object28 = new javafx.scene.Group(); - controller.group = object28; - final var object29 = new javafx.scene.layout.GridPane(); - controller.gridPane = object29; - final var object30 = new javafx.scene.layout.ColumnConstraints(); - controller.columnConstraints = object30; - object30.setHgrow(javafx.scene.layout.Priority.SOMETIMES); - object30.setMinWidth(10.0); - object29.getColumnConstraints().addAll(object30); - final var object31 = new javafx.scene.layout.RowConstraints(); - object31.setMinHeight(10.0); - object31.setVgrow(javafx.scene.layout.Priority.SOMETIMES); - object29.getRowConstraints().addAll(object31); - final var object32 = new javafx.scene.layout.FlowPane(); - controller.flowPane = object32; - final var object33 = new javafx.scene.control.DialogPane(); - controller.dialogPane = object33; - final var object34 = new javafx.scene.control.ButtonBar(); - controller.buttonBar = object34; - final var object35 = new javafx.scene.layout.AnchorPane(); - controller.anchorPane = object35; - final var object36 = new javafx.scene.control.Label(); - object36.setManaged(false); - object35.getChildren().addAll(object36); - object34.getButtons().addAll(object35); - object33.setContent(object34); - object32.getChildren().addAll(object33); - object29.getChildren().addAll(object32); - object28.getChildren().addAll(object29); - object27.getChildren().addAll(object28); - object26.getChildren().addAll(object27); - object25.setContent(object26); - object24.getItems().addAll(object25); - object23.getChildren().addAll(object24); - object22.setContent(object23); - object21.getTabs().addAll(object22); - object20.getChildren().addAll(object21); - object19.getChildren().addAll(object20); - object18.setContent(object19); - object17.getItems().addAll(object18); - object16.getChildren().addAll(object17); - object0.setCenter(object16); - controller.initialize(); - loaded = true; - return object0; - } - - - /** - * @return The controller - */ - public com.github.gtache.fxml.compiler.loader.TestController controller() { - if (loaded) { - return controller; - } else { - throw new IllegalStateException("Not loaded"); - } - } -} \ No newline at end of file diff --git a/loader/src/test/java/com/github/gtache/fxml/compiler/loader/CreationBenchmark.java b/loader/src/test/java/com/github/gtache/fxml/compiler/loader/CreationBenchmark.java deleted file mode 100644 index 14d93af..0000000 --- a/loader/src/test/java/com/github/gtache/fxml/compiler/loader/CreationBenchmark.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.github.gtache.fxml.compiler.loader; - -import javafx.application.Platform; -import javafx.fxml.FXMLLoader; -import org.openjdk.jmh.annotations.Benchmark; -import org.openjdk.jmh.annotations.Fork; -import org.openjdk.jmh.annotations.Level; -import org.openjdk.jmh.annotations.Scope; -import org.openjdk.jmh.annotations.Setup; -import org.openjdk.jmh.annotations.State; - -import java.io.IOException; -import java.util.Map; -import java.util.ResourceBundle; -import java.util.concurrent.CompletableFuture; - -@Fork(1) -@State(Scope.Benchmark) -public class CreationBenchmark { - - public static void main(final String[] args) throws java.io.IOException { - org.openjdk.jmh.Main.main(args); - } - - @Setup(Level.Trial) - public void setup() { - Platform.startup(() -> { - }); - } - - @Benchmark - public Object useFXMLLoader() { - return CompletableFuture.supplyAsync(() -> { - final var loader = new FXMLLoader(getClass().getResource("/com/github/gtache/fxml/compiler/loader/includeView.fxml")); - loader.setResources(ResourceBundle.getBundle("com.github.gtache.fxml.compiler.loader.IncludeBundle")); - try { - return loader.load(); - } catch (final IOException e) { - throw new RuntimeException(e); - } - }, Platform::runLater).join(); - } - - @Benchmark - public Object useFXMLLoaderInclude() { - return CompletableFuture.supplyAsync(() -> { - final var loader = new FXMLLoader(getClass().getResource("/com/github/gtache/fxml/compiler/loader/testView.fxml")); - loader.setResources(ResourceBundle.getBundle("com.github.gtache.fxml.compiler.loader.TestBundle")); - try { - return loader.load(); - } catch (final IOException e) { - throw new RuntimeException(e); - } - }, Platform::runLater).join(); - } - - @Benchmark - public Object useReflection() { - return CompletableFuture.supplyAsync(() -> { - final var view = new ReflectionIncludeView(new IncludeController(), ResourceBundle.getBundle("com.github.gtache.fxml.compiler.loader.IncludeBundle")); - return view.load(); - }, Platform::runLater).join(); - } - - @Benchmark - public Object useReflectionInclude() { - return CompletableFuture.supplyAsync(() -> { - final var view = new ReflectionTestView(Map.of(TestController.class, new TestController(), IncludeController.class, new IncludeController()), Map.of("includeView.fxml", IncludeController.class), - Map.of(TestController.class, ResourceBundle.getBundle("com.github.gtache.fxml.compiler.loader.TestBundle"), - IncludeController.class, ResourceBundle.getBundle("com.github.gtache.fxml.compiler.loader.IncludeBundle"))); - return view.load(); - }, Platform::runLater).join(); - } - - @Benchmark - public Object useAssignment() { - return CompletableFuture.supplyAsync(() -> { - final var view = new AssignIncludeView(new IncludeController(), ResourceBundle.getBundle("com.github.gtache.fxml.compiler.loader.IncludeBundle")); - return view.load(); - }, Platform::runLater).join(); - } - - @Benchmark - public Object useAssignmentInclude() { - return CompletableFuture.supplyAsync(() -> { - final var view = new AssignTestView(Map.of(TestController.class, new TestController(), IncludeController.class, new IncludeController()), Map.of("includeView.fxml", IncludeController.class), - Map.of(TestController.class, ResourceBundle.getBundle("com.github.gtache.fxml.compiler.loader.TestBundle"), - IncludeController.class, ResourceBundle.getBundle("com.github.gtache.fxml.compiler.loader.IncludeBundle"))); - return view.load(); - }, Platform::runLater).join(); - } - - @Benchmark - public Object useFactory() { - return CompletableFuture.supplyAsync(() -> { - final var view = new FactoryIncludeView(c -> new IncludeController(), ResourceBundle.getBundle("com.github.gtache.fxml.compiler.loader.IncludeBundle")); - return view.load(); - }, Platform::runLater).join(); - } - - @Benchmark - public Object useFactoryInclude() { - return CompletableFuture.supplyAsync(() -> { - final var view = new FactoryIncludeView(Map.of(TestController.class, c -> new TestController(), IncludeController.class, c -> new IncludeController()), Map.of("includeView.fxml", IncludeController.class), - Map.of(TestController.class, ResourceBundle.getBundle("com.github.gtache.fxml.compiler.loader.TestBundle"), - IncludeController.class, ResourceBundle.getBundle("com.github.gtache.fxml.compiler.loader.IncludeBundle"))); - return view.load(); - }, Platform::runLater).join(); - } - - @Benchmark - public Object useSetters() { - return CompletableFuture.supplyAsync(() -> { - final var view = new SettersIncludeView(new IncludeController(), ResourceBundle.getBundle("com.github.gtache.fxml.compiler.loader.IncludeBundle")); - return view.load(); - }, Platform::runLater).join(); - } - - @Benchmark - public Object useSettersInclude() { - return CompletableFuture.supplyAsync(() -> { - final var view = new SettersIncludeView(Map.of(TestController.class, new TestController(), IncludeController.class, new IncludeController()), Map.of("includeView.fxml", IncludeController.class), - Map.of(TestController.class, ResourceBundle.getBundle("com.github.gtache.fxml.compiler.loader.TestBundle"), - IncludeController.class, ResourceBundle.getBundle("com.github.gtache.fxml.compiler.loader.IncludeBundle"))); - return view.load(); - }, Platform::runLater).join(); - } -} diff --git a/loader/src/test/java/com/github/gtache/fxml/compiler/loader/FactoryIncludeView.java b/loader/src/test/java/com/github/gtache/fxml/compiler/loader/FactoryIncludeView.java deleted file mode 100644 index 5a2e9f7..0000000 --- a/loader/src/test/java/com/github/gtache/fxml/compiler/loader/FactoryIncludeView.java +++ /dev/null @@ -1,444 +0,0 @@ -package com.github.gtache.fxml.compiler.loader; - -import com.github.gtache.fxml.compiler.ControllerFactory; - -import java.util.HashMap; -import java.util.Map; -import java.util.ResourceBundle; - - -/** - * Generated code, not thread-safe - */ -public final class FactoryIncludeView { - - private final Map, ControllerFactory> controllersMap; - private final Map, ResourceBundle> resourceBundlesMap; - private final Map> includeControllersMap; - private boolean loaded; - private com.github.gtache.fxml.compiler.loader.IncludeController controller; - - /** - * Instantiates a new FactoryIncludeView with no nested controllers and no resource bundle - * - * @param controllerFactory The controller factory - */ - public FactoryIncludeView(final ControllerFactory controllerFactory) { - this(Map.of(com.github.gtache.fxml.compiler.loader.IncludeController.class, controllerFactory), Map.of(), Map.of()); - } - - /** - * Instantiates a new FactoryIncludeView with no nested controllers - * - * @param controllerFactory The controller factory - * @param resourceBundle The resource bundle - */ - public FactoryIncludeView(final ControllerFactory controllerFactory, final ResourceBundle resourceBundle) { - this(Map.of(com.github.gtache.fxml.compiler.loader.IncludeController.class, controllerFactory), Map.of(), Map.of(com.github.gtache.fxml.compiler.loader.IncludeController.class, resourceBundle)); - } - - /** - * Instantiates a new FactoryIncludeView with nested controllers and no resource bundle - * - * @param controllersMap The map of controller class to controller factory - * @param includeControllersMap The map of source to controller class - */ - public FactoryIncludeView(final Map, ControllerFactory> controllersMap, final Map> includeControllersMap) { - this(controllersMap, includeControllersMap, Map.of()); - } - - /** - * Instantiates a new FactoryIncludeView with nested controllers - * - * @param controllersMap The map of controller class to controller factory - * @param includeControllersMap The map of source to controller class - * @param resourceBundlesMap The map of controller class to resource bundle - */ - public FactoryIncludeView(final Map, ControllerFactory> controllersMap, final Map> includeControllersMap, final Map, ResourceBundle> resourceBundlesMap) { - this.controllersMap = Map.copyOf(controllersMap); - this.includeControllersMap = Map.copyOf(includeControllersMap); - this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); - } - - public javafx.scene.Parent load() { - if (loaded) { - throw new IllegalStateException("Already loaded"); - } - final var bundle = resourceBundlesMap.get(com.github.gtache.fxml.compiler.loader.IncludeController.class); - final var fieldMap = new HashMap(); - final var object0 = new javafx.scene.layout.GridPane(); - fieldMap.put("gridPane", object0); - final var object1 = new javafx.scene.layout.RowConstraints(); - final var object2 = new javafx.scene.layout.RowConstraints(); - final var object3 = new javafx.scene.layout.RowConstraints(); - final var object4 = new javafx.scene.layout.RowConstraints(); - final var object5 = new javafx.scene.layout.RowConstraints(); - final var object6 = new javafx.scene.layout.RowConstraints(); - final var object7 = new javafx.scene.layout.RowConstraints(); - final var object8 = new javafx.scene.layout.RowConstraints(); - final var object9 = new javafx.scene.layout.RowConstraints(); - final var object10 = new javafx.scene.layout.RowConstraints(); - final var object11 = new javafx.scene.layout.RowConstraints(); - final var object12 = new javafx.scene.layout.RowConstraints(); - final var object13 = new javafx.scene.layout.RowConstraints(); - final var object14 = new javafx.scene.layout.RowConstraints(); - final var object15 = new javafx.scene.layout.RowConstraints(); - final var object16 = new javafx.scene.layout.RowConstraints(); - final var object17 = new javafx.scene.layout.RowConstraints(); - final var object18 = new javafx.scene.layout.RowConstraints(); - object0.getRowConstraints().addAll(object1, object2, object3, object4, object5, object6, object7, object8, object9, object10, object11, object12, object13, object14, object15, object16, object17, object18); - final var object19 = new javafx.scene.layout.ColumnConstraints(); - final var object20 = new javafx.scene.layout.ColumnConstraints(); - final var object21 = new javafx.scene.layout.ColumnConstraints(); - object21.setMinWidth(10.0); - object21.setPrefWidth(100.0); - object0.getColumnConstraints().addAll(object19, object20, object21); - final var object22 = new javafx.scene.control.Button(); - fieldMap.put("button", object22); - object22.setMnemonicParsing(false); - object22.setText("Button"); - final var object23 = new javafx.scene.control.CheckBox(); - fieldMap.put("checkBox", object23); - object23.setIndeterminate(true); - object23.setMnemonicParsing(false); - object23.setText("CheckBox"); - javafx.scene.layout.GridPane.setColumnIndex(object23, 1); - final var object24 = new javafx.scene.control.ChoiceBox(); - fieldMap.put("choiceBox", object24); - object24.setCacheShape(false); - object24.setCenterShape(false); - object24.setDisable(true); - object24.setFocusTraversable(false); - object24.setPrefWidth(150.0); - object24.setScaleShape(false); - object24.setVisible(false); - javafx.scene.layout.GridPane.setRowIndex(object24, 1); - final var object25 = new javafx.scene.control.ColorPicker(); - fieldMap.put("colorPicker", object25); - object25.setNodeOrientation(javafx.geometry.NodeOrientation.LEFT_TO_RIGHT); - object25.setOpacity(0.5); - javafx.scene.layout.GridPane.setColumnIndex(object25, 1); - javafx.scene.layout.GridPane.setRowIndex(object25, 1); - final var object26 = new javafx.scene.paint.Color(0.7894737124443054, 0.08771929889917374, 0.08771929889917374, 1); - fieldMap.put("color", object26); - object25.setValue(object26); - final var object27 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); - object25.setOpaqueInsets(object27); - final var object28 = new javafx.scene.control.ComboBox(); - fieldMap.put("comboBox", object28); - object28.setEditable(true); - object28.setPrefWidth(150.0); - object28.setPromptText("Text"); - object28.setVisibleRowCount(5); - javafx.scene.layout.GridPane.setRowIndex(object28, 2); - final var object29 = javafx.scene.Cursor.CLOSED_HAND; - object28.setCursor(object29); - final var object30 = new javafx.scene.effect.Bloom(); - object28.setEffect(object30); - final var object31 = new javafx.scene.control.DatePicker(); - fieldMap.put("datePicker", object31); - object31.setShowWeekNumbers(true); - object31.setStyle("-fx-background-color: #ffffff;"); - javafx.scene.layout.GridPane.setColumnIndex(object31, 1); - javafx.scene.layout.GridPane.setRowIndex(object31, 2); - final var object32 = new javafx.scene.web.HTMLEditor(); - fieldMap.put("htmlEditor", object32); - object32.setHtmlText(""); - object32.setPrefHeight(200.0); - object32.setPrefWidth(506.0); - object32.getStyleClass().addAll("clazz"); - object32.getStylesheets().addAll("@style.css"); - javafx.scene.layout.GridPane.setRowIndex(object32, 3); - final var object33 = new javafx.scene.control.Hyperlink(); - fieldMap.put("hyperlink", object33); - object33.setText("Hyperlink"); - javafx.scene.layout.GridPane.setColumnIndex(object33, 1); - javafx.scene.layout.GridPane.setRowIndex(object33, 3); - final var object34 = new javafx.scene.image.ImageView(); - fieldMap.put("imageView", object34); - object34.setFitHeight(150.0); - object34.setFitWidth(200.0); - object34.setPickOnBounds(true); - object34.setPreserveRatio(true); - javafx.scene.layout.GridPane.setRowIndex(object34, 4); - final var object35 = new javafx.scene.control.Label(); - fieldMap.put("label", object35); - object35.setAccessibleHelp("TTTTT"); - object35.setAccessibleText("TTT"); - object35.setBlendMode(javafx.scene.effect.BlendMode.ADD); - object35.setCache(true); - object35.setCacheHint(javafx.scene.CacheHint.QUALITY); - object35.setDepthTest(javafx.scene.DepthTest.ENABLE); - object35.setMnemonicParsing(true); - object35.setMouseTransparent(true); - object35.setText(bundle.getString("include.label")); - javafx.scene.layout.GridPane.setColumnIndex(object35, 1); - javafx.scene.layout.GridPane.setRowIndex(object35, 4); - final var object36 = new javafx.scene.control.ListView(); - fieldMap.put("listView", object36); - object36.setFixedCellSize(20.0); - object36.setNodeOrientation(javafx.geometry.NodeOrientation.RIGHT_TO_LEFT); - object36.setOrientation(javafx.geometry.Orientation.HORIZONTAL); - object36.setPrefHeight(200.0); - object36.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setRowIndex(object36, 5); - final var object37 = new javafx.scene.media.MediaView(); - fieldMap.put("mediaView", object37); - object37.setFitHeight(200.0); - object37.setFitWidth(200.0); - javafx.scene.layout.GridPane.setColumnIndex(object37, 1); - javafx.scene.layout.GridPane.setColumnSpan(object37, 2); - javafx.scene.layout.GridPane.setRowIndex(object37, 5); - javafx.scene.layout.GridPane.setRowSpan(object37, 2); - final var object38 = new javafx.scene.control.MenuBar(); - fieldMap.put("menuBar", object38); - javafx.scene.layout.GridPane.setHalignment(object38, javafx.geometry.HPos.RIGHT); - javafx.scene.layout.GridPane.setHgrow(object38, javafx.scene.layout.Priority.ALWAYS); - javafx.scene.layout.GridPane.setRowIndex(object38, 7); - javafx.scene.layout.GridPane.setValignment(object38, javafx.geometry.VPos.BASELINE); - javafx.scene.layout.GridPane.setVgrow(object38, javafx.scene.layout.Priority.SOMETIMES); - final var object39 = new javafx.scene.control.Menu(); - fieldMap.put("menu1", object39); - object39.setMnemonicParsing(false); - object39.setText("File"); - final var object40 = new javafx.scene.control.MenuItem(); - fieldMap.put("menuItem1", object40); - object40.setMnemonicParsing(false); - object40.setText("Close"); - object39.getItems().addAll(object40); - final var object41 = new javafx.scene.control.Menu(); - object41.setMnemonicParsing(false); - object41.setText("Edit"); - final var object42 = new javafx.scene.control.MenuItem(); - object42.setMnemonicParsing(false); - object42.setText("Delete"); - object41.getItems().addAll(object42); - final var object43 = new javafx.scene.control.Menu(); - object43.setMnemonicParsing(false); - object43.setText("Help"); - final var object44 = new javafx.scene.control.MenuItem(); - object44.setMnemonicParsing(false); - object44.setText("About"); - object43.getItems().addAll(object44); - object38.getMenus().addAll(object39, object41, object43); - final var object45 = new javafx.scene.control.MenuButton(); - fieldMap.put("menuButton", object45); - object45.setMnemonicParsing(false); - object45.setText("MenuButton"); - javafx.scene.layout.GridPane.setColumnIndex(object45, 1); - javafx.scene.layout.GridPane.setRowIndex(object45, 7); - final var object46 = new javafx.scene.control.MenuItem(); - object46.setMnemonicParsing(false); - object46.setText("Action 1"); - final var object47 = new javafx.scene.control.MenuItem(); - object47.setMnemonicParsing(false); - object47.setText("Action 2"); - object45.getItems().addAll(object46, object47); - final var object48 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); - javafx.scene.layout.GridPane.setMargin(object45, object48); - final var object49 = new javafx.scene.control.Pagination(); - fieldMap.put("pagination", object49); - object49.setPrefHeight(200.0); - object49.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setRowIndex(object49, 8); - final var object50 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); - object49.setPadding(object50); - final var object51 = new javafx.scene.control.PasswordField(); - fieldMap.put("passwordField", object51); - object51.setMaxHeight(6.0); - object51.setMaxWidth(5.0); - object51.setMinHeight(2.0); - object51.setMinWidth(1.0); - object51.setPrefColumnCount(7); - object51.setPrefHeight(4.0); - object51.setPrefWidth(3.0); - javafx.scene.layout.GridPane.setColumnIndex(object51, 1); - javafx.scene.layout.GridPane.setRowIndex(object51, 8); - final var object52 = new javafx.scene.control.ProgressBar(); - fieldMap.put("progressBar", object52); - object52.setLayoutX(10.0); - object52.setLayoutY(20.0); - object52.setPrefWidth(200.0); - object52.setProgress(0.0); - javafx.scene.layout.GridPane.setRowIndex(object52, 9); - final var object53 = new javafx.scene.control.ProgressIndicator(); - fieldMap.put("progressIndicator", object53); - object53.setProgress(0.0); - object53.setRotate(2.0); - javafx.scene.layout.GridPane.setColumnIndex(object53, 1); - javafx.scene.layout.GridPane.setRowIndex(object53, 9); - final var object54 = new javafx.geometry.Point3D(4.0, 5.0, 6.0); - object53.setRotationAxis(object54); - final var object55 = new javafx.scene.control.RadioButton(); - fieldMap.put("radioButton", object55); - object55.setMnemonicParsing(false); - object55.setScaleX(7.0); - object55.setScaleY(2.0); - object55.setScaleZ(3.0); - object55.setText("RadioButton"); - object55.setTranslateX(4.0); - object55.setTranslateY(5.0); - object55.setTranslateZ(6.0); - javafx.scene.layout.GridPane.setRowIndex(object55, 10); - final var object56 = new javafx.scene.control.ScrollBar(); - fieldMap.put("scrollBarH", object56); - javafx.scene.layout.GridPane.setColumnIndex(object56, 1); - javafx.scene.layout.GridPane.setRowIndex(object56, 10); - final var object57 = new javafx.scene.control.ScrollBar(); - fieldMap.put("scrollBarV", object57); - object57.setOrientation(javafx.geometry.Orientation.VERTICAL); - javafx.scene.layout.GridPane.setRowIndex(object57, 11); - final var object58 = new javafx.scene.control.Separator(); - fieldMap.put("separatorH", object58); - object58.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setColumnIndex(object58, 1); - javafx.scene.layout.GridPane.setRowIndex(object58, 11); - final var object59 = new javafx.scene.control.Separator(); - fieldMap.put("separatorV", object59); - object59.setOrientation(javafx.geometry.Orientation.VERTICAL); - object59.setPrefHeight(200.0); - javafx.scene.layout.GridPane.setRowIndex(object59, 12); - final var object60 = new javafx.scene.control.Slider(); - fieldMap.put("sliderH", object60); - javafx.scene.layout.GridPane.setColumnIndex(object60, 1); - javafx.scene.layout.GridPane.setRowIndex(object60, 12); - final var object61 = new javafx.scene.control.Slider(); - fieldMap.put("sliderV", object61); - object61.setOrientation(javafx.geometry.Orientation.VERTICAL); - javafx.scene.layout.GridPane.setRowIndex(object61, 13); - final var object62 = new javafx.scene.control.Spinner(); - fieldMap.put("spinner", object62); - javafx.scene.layout.GridPane.setColumnIndex(object62, 1); - javafx.scene.layout.GridPane.setRowIndex(object62, 13); - final var object63 = new javafx.scene.control.SplitMenuButton(); - fieldMap.put("splitMenuButton", object63); - object63.setMnemonicParsing(false); - object63.setText("SplitMenuButton"); - javafx.scene.layout.GridPane.setRowIndex(object63, 14); - final var object64 = new javafx.scene.control.MenuItem(); - fieldMap.put("item1", object64); - object64.setMnemonicParsing(false); - object64.setText("Action 1"); - final var object65 = new javafx.scene.control.MenuItem(); - fieldMap.put("item2", object65); - object65.setMnemonicParsing(false); - object65.setText("Action 2"); - object63.getItems().addAll(object64, object65); - final var object66 = new javafx.scene.control.TableView(); - fieldMap.put("tableView", object66); - object66.setPrefHeight(200.0); - object66.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setColumnIndex(object66, 1); - javafx.scene.layout.GridPane.setRowIndex(object66, 14); - final var object67 = new javafx.scene.control.TableColumn(); - fieldMap.put("tableColumn1", object67); - object67.setPrefWidth(75.0); - object67.setText("C1"); - final var object68 = new javafx.scene.control.TableColumn(); - fieldMap.put("tableColumn2", object68); - object68.setPrefWidth(75.0); - object68.setText("C2"); - object66.getColumns().addAll(object67, object68); - final var object69 = new javafx.scene.control.TextArea(); - fieldMap.put("textArea", object69); - object69.setPrefHeight(200.0); - object69.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setRowIndex(object69, 15); - final var object70 = new javafx.scene.control.TextField(); - fieldMap.put("textField", object70); - javafx.scene.layout.GridPane.setColumnIndex(object70, 1); - javafx.scene.layout.GridPane.setRowIndex(object70, 15); - final var object71 = new javafx.scene.control.ToggleButton(); - object71.setMnemonicParsing(false); - object71.setText("ToggleButton"); - javafx.scene.layout.GridPane.setRowIndex(object71, 16); - final var object72 = new javafx.scene.control.TreeTableView>(); - fieldMap.put("treeTableView", object72); - object72.setPrefHeight(200.0); - object72.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setColumnIndex(object72, 1); - javafx.scene.layout.GridPane.setRowIndex(object72, 16); - final var object73 = new javafx.scene.control.TreeTableColumn, String>(); - fieldMap.put("treeTableColumn1", object73); - object73.setPrefWidth(75.0); - object73.setText("C1"); - final var object74 = new javafx.scene.control.TreeTableColumn, Integer>(); - fieldMap.put("treeTableColumn2", object74); - object74.setPrefWidth(75.0); - object74.setSortType(javafx.scene.control.TreeTableColumn.SortType.DESCENDING); - object74.setText("C2"); - object72.getColumns().addAll(object73, object74); - final var object75 = new javafx.scene.control.TreeView(); - fieldMap.put("treeView", object75); - object75.setPrefHeight(200.0); - object75.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setRowIndex(object75, 17); - final var object76 = new javafx.scene.web.WebView(); - fieldMap.put("webView", object76); - object76.setPrefHeight(200.0); - object76.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setColumnIndex(object76, 1); - javafx.scene.layout.GridPane.setRowIndex(object76, 17); - object0.getChildren().addAll(object22, object23, object24, object25, object28, object31, object32, object33, object34, object35, object36, object37, object38, object45, object49, object51, object52, object53, object55, object56, object57, object58, object59, object60, object61, object62, object63, object66, object69, object70, object71, object72, object75, object76); - final var controllerFactory = controllersMap.get(com.github.gtache.fxml.compiler.loader.IncludeController.class); - controller = (com.github.gtache.fxml.compiler.loader.IncludeController) controllerFactory.create(fieldMap); - object0.setOnInputMethodTextChanged(controller::inputMethodTextChanged); - object0.setOnKeyPressed(e -> controller.keyPressed()); - object0.setOnKeyReleased(controller::keyReleased); - object0.setOnKeyTyped(controller::keyTyped); - object58.setOnDragDetected(controller::dragDetected); - object58.setOnDragDone(controller::dragDone); - object58.setOnDragDropped(controller::dragDropped); - object58.setOnDragEntered(controller::dragEntered); - object58.setOnDragExited(controller::dragExited); - object58.setOnDragOver(controller::dragOver); - object58.setOnMouseDragEntered(controller::mouseDragEntered); - object58.setOnMouseDragExited(controller::mouseDragExited); - object58.setOnMouseDragOver(controller::mouseDragOver); - object58.setOnMouseDragReleased(controller::mouseDragReleased); - object60.setOnContextMenuRequested(controller::contextMenuRequested); - object60.setOnMouseClicked(e -> controller.mouseClicked()); - object60.setOnMouseDragged(controller::mouseDragged); - object60.setOnMouseEntered(controller::mouseEntered); - object60.setOnMouseExited(controller::mouseExited); - object60.setOnMouseMoved(controller::mouseMoved); - object60.setOnMousePressed(controller::mousePressed); - object60.setOnMouseReleased(controller::mouseReleased); - object60.setOnScroll(controller::onScroll); - object60.setOnScrollFinished(controller::onScrollFinished); - object60.setOnScrollStarted(controller::onScrollStarted); - object61.setOnZoom(controller::onZoom); - object61.setOnZoomFinished(controller::onZoomFinished); - object61.setOnZoomStarted(controller::onZoomStarted); - object71.setOnAction(controller::onAction); - object71.setOnRotate(controller::onRotate); - object71.setOnRotationFinished(controller::onRotationFinished); - object71.setOnRotationStarted(controller::onRotationStarted); - object73.setOnEditCancel(controller::onEditCancel); - object73.setOnEditCommit(controller::onEditCommit); - object73.setOnEditStart(controller::onEditStart); - object75.setOnSwipeDown(controller::onSwipeDown); - object75.setOnSwipeLeft(controller::onSwipeLeft); - object75.setOnSwipeRight(controller::onSwipeRight); - object75.setOnSwipeUp(controller::onSwipeUp); - object76.setOnTouchMoved(controller::onTouchMoved); - object76.setOnTouchPressed(controller::onTouchPressed); - object76.setOnTouchReleased(controller::onTouchReleased); - object76.setOnTouchStationary(controller::onTouchStationary); - controller.initialize(); - loaded = true; - return object0; - } - - - /** - * @return The controller - */ - public com.github.gtache.fxml.compiler.loader.IncludeController controller() { - if (loaded) { - return controller; - } else { - throw new IllegalStateException("Not loaded"); - } - } -} diff --git a/loader/src/test/java/com/github/gtache/fxml/compiler/loader/FactoryTestView.java b/loader/src/test/java/com/github/gtache/fxml/compiler/loader/FactoryTestView.java deleted file mode 100644 index e425e0a..0000000 --- a/loader/src/test/java/com/github/gtache/fxml/compiler/loader/FactoryTestView.java +++ /dev/null @@ -1,202 +0,0 @@ -package com.github.gtache.fxml.compiler.loader; - -import com.github.gtache.fxml.compiler.ControllerFactory; - -import java.util.HashMap; -import java.util.Map; -import java.util.ResourceBundle; - - -/** - * Generated code, not thread-safe - */ -public final class FactoryTestView { - - private final Map, ControllerFactory> controllersMap; - private final Map, ResourceBundle> resourceBundlesMap; - private final Map> includeControllersMap; - private boolean loaded; - private com.github.gtache.fxml.compiler.loader.TestController controller; - - /** - * Instantiates a new FactoryTestView with no nested controllers and no resource bundle - * - * @param controllerFactory The controller factory - */ - public FactoryTestView(final ControllerFactory controllerFactory) { - this(Map.of(com.github.gtache.fxml.compiler.loader.TestController.class, controllerFactory), Map.of(), Map.of()); - } - - /** - * Instantiates a new FactoryTestView with no nested controllers - * - * @param controllerFactory The controller factory - * @param resourceBundle The resource bundle - */ - public FactoryTestView(final ControllerFactory controllerFactory, final ResourceBundle resourceBundle) { - this(Map.of(com.github.gtache.fxml.compiler.loader.TestController.class, controllerFactory), Map.of(), Map.of(com.github.gtache.fxml.compiler.loader.TestController.class, resourceBundle)); - } - - /** - * Instantiates a new FactoryTestView with nested controllers and no resource bundle - * - * @param controllersMap The map of controller class to controller factory - * @param includeControllersMap The map of source to controller class - */ - public FactoryTestView(final Map, ControllerFactory> controllersMap, final Map> includeControllersMap) { - this(controllersMap, includeControllersMap, Map.of()); - } - - /** - * Instantiates a new FactoryTestView with nested controllers - * - * @param controllersMap The map of controller class to controller factory - * @param includeControllersMap The map of source to controller class - * @param resourceBundlesMap The map of controller class to resource bundle - */ - public FactoryTestView(final Map, ControllerFactory> controllersMap, final Map> includeControllersMap, final Map, ResourceBundle> resourceBundlesMap) { - this.controllersMap = Map.copyOf(controllersMap); - this.includeControllersMap = Map.copyOf(includeControllersMap); - this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); - } - - public javafx.scene.Parent load() { - if (loaded) { - throw new IllegalStateException("Already loaded"); - } - final var bundle = resourceBundlesMap.get(com.github.gtache.fxml.compiler.loader.TestController.class); - final var fieldMap = new HashMap(); - final var object0 = new javafx.scene.layout.BorderPane(); - final var object1 = new javafx.scene.layout.VBox(); - javafx.scene.layout.BorderPane.setAlignment(object1, javafx.geometry.Pos.CENTER); - final var object2 = new javafx.scene.layout.HBox(); - object2.setAlignment(javafx.geometry.Pos.CENTER); - object2.setSpacing(10.0); - final var object3 = new javafx.scene.control.Slider(); - fieldMap.put("playSlider", object3); - javafx.scene.layout.HBox.setHgrow(object3, javafx.scene.layout.Priority.ALWAYS); - final var object4 = new javafx.geometry.Insets(0, 0, 0, 10.0); - object3.setPadding(object4); - final var object5 = new javafx.scene.control.Label(); - fieldMap.put("playLabel", object5); - object5.setText("Label"); - final var object6 = new javafx.geometry.Insets(0, 10.0, 0, 0); - object5.setPadding(object6); - object2.getChildren().addAll(object3, object5); - final var object7 = new javafx.geometry.Insets(10.0, 0, 0, 0); - object2.setPadding(object7); - final var object8 = new javafx.scene.layout.HBox(); - object8.setAlignment(javafx.geometry.Pos.CENTER); - object8.setSpacing(10.0); - final var object9 = new javafx.scene.control.Button(); - fieldMap.put("playButton", object9); - object9.setMnemonicParsing(false); - final var object10 = new javafx.geometry.Insets(0, 20.0, 0, 0); - javafx.scene.layout.HBox.setMargin(object9, object10); - final var object11 = new javafx.scene.control.Label(); - object11.setText(bundle.getString("media.volume.label")); - final var object12 = new javafx.scene.control.Slider(); - fieldMap.put("volumeSlider", object12); - object12.setValue(100); - final var object13 = new javafx.scene.control.Label(); - fieldMap.put("volumeValueLabel", object13); - object13.setText("Label"); - final var class0 = includeControllersMap.get("includeView.fxml"); - final var map0 = new HashMap<>(resourceBundlesMap); - final var bundle0 = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.loader.IncludeBundle"); - map0.put(class0, bundle0); - final var view0 = new com.github.gtache.fxml.compiler.loader.FactoryIncludeView(controllersMap, includeControllersMap, map0); - final var object14 = view0.load(); - final var controller0 = view0.controller(); - fieldMap.put("includeController", controller0); - object8.getChildren().addAll(object9, object11, object12, object13, object14); - final var object15 = new javafx.geometry.Insets(10.0, 10.0, 10.0, 10.0); - object8.setPadding(object15); - object1.getChildren().addAll(object2, object8); - object0.setBottom(object1); - final var object16 = new javafx.scene.layout.VBox(); - fieldMap.put("vbox", object16); - final var object17 = new javafx.scene.control.ToolBar(); - fieldMap.put("toolBar", object17); - final var object18 = new javafx.scene.control.TitledPane(); - fieldMap.put("titledPane", object18); - final var object19 = new javafx.scene.layout.TilePane(); - fieldMap.put("tilePane", object19); - final var object20 = new javafx.scene.text.TextFlow(); - fieldMap.put("textFlow", object20); - final var object21 = new javafx.scene.control.TabPane(); - fieldMap.put("tabPane", object21); - final var object22 = new javafx.scene.control.Tab(); - fieldMap.put("tab", object22); - final var object23 = new javafx.scene.layout.StackPane(); - fieldMap.put("stackPane", object23); - final var object24 = new javafx.scene.control.SplitPane(); - fieldMap.put("splitPane", object24); - final var object25 = new javafx.scene.control.ScrollPane(); - fieldMap.put("scrollPane", object25); - final var object26 = new javafx.scene.layout.Pane(); - fieldMap.put("pane", object26); - final var object27 = new javafx.scene.layout.HBox(); - fieldMap.put("hbox", object27); - final var object28 = new javafx.scene.Group(); - fieldMap.put("group", object28); - final var object29 = new javafx.scene.layout.GridPane(); - fieldMap.put("gridPane", object29); - final var object30 = new javafx.scene.layout.ColumnConstraints(); - fieldMap.put("columnConstraints", object30); - object30.setHgrow(javafx.scene.layout.Priority.SOMETIMES); - object30.setMinWidth(10.0); - object29.getColumnConstraints().addAll(object30); - final var object31 = new javafx.scene.layout.RowConstraints(); - object31.setMinHeight(10.0); - object31.setVgrow(javafx.scene.layout.Priority.SOMETIMES); - object29.getRowConstraints().addAll(object31); - final var object32 = new javafx.scene.layout.FlowPane(); - fieldMap.put("flowPane", object32); - final var object33 = new javafx.scene.control.DialogPane(); - fieldMap.put("dialogPane", object33); - final var object34 = new javafx.scene.control.ButtonBar(); - fieldMap.put("buttonBar", object34); - final var object35 = new javafx.scene.layout.AnchorPane(); - fieldMap.put("anchorPane", object35); - final var object36 = new javafx.scene.control.Label(); - object36.setManaged(false); - object35.getChildren().addAll(object36); - object34.getButtons().addAll(object35); - object33.setContent(object34); - object32.getChildren().addAll(object33); - object29.getChildren().addAll(object32); - object28.getChildren().addAll(object29); - object27.getChildren().addAll(object28); - object26.getChildren().addAll(object27); - object25.setContent(object26); - object24.getItems().addAll(object25); - object23.getChildren().addAll(object24); - object22.setContent(object23); - object21.getTabs().addAll(object22); - object20.getChildren().addAll(object21); - object19.getChildren().addAll(object20); - object18.setContent(object19); - object17.getItems().addAll(object18); - object16.getChildren().addAll(object17); - object0.setCenter(object16); - final var controllerFactory = controllersMap.get(com.github.gtache.fxml.compiler.loader.TestController.class); - controller = (com.github.gtache.fxml.compiler.loader.TestController) controllerFactory.create(fieldMap); - object9.setOnAction(controller::playPressed); - controller.initialize(); - loaded = true; - return object0; - } - - - /** - * @return The controller - */ - public com.github.gtache.fxml.compiler.loader.TestController controller() { - if (loaded) { - return controller; - } else { - throw new IllegalStateException("Not loaded"); - } - } -} diff --git a/loader/src/test/java/com/github/gtache/fxml/compiler/loader/Main.java b/loader/src/test/java/com/github/gtache/fxml/compiler/loader/Main.java deleted file mode 100644 index ec7d3b3..0000000 --- a/loader/src/test/java/com/github/gtache/fxml/compiler/loader/Main.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.github.gtache.fxml.compiler.loader; - -import javafx.application.Application; - -public class Main { - - public static void main(String[] args) { - Application.launch(TestApp.class); - } -} diff --git a/loader/src/test/java/com/github/gtache/fxml/compiler/loader/PrintLoadListener.java b/loader/src/test/java/com/github/gtache/fxml/compiler/loader/PrintLoadListener.java deleted file mode 100644 index baa60ce..0000000 --- a/loader/src/test/java/com/github/gtache/fxml/compiler/loader/PrintLoadListener.java +++ /dev/null @@ -1,96 +0,0 @@ -package com.github.gtache.fxml.compiler.loader; - -import javafx.fxml.LoadListener; - -public class PrintLoadListener implements LoadListener { - - @Override - public void readImportProcessingInstruction(final String target) { - System.out.println("import : " + target); - } - - @Override - public void readLanguageProcessingInstruction(final String language) { - System.out.println("language : " + language); - } - - @Override - public void readComment(final String comment) { - System.out.println("comment : " + comment); - } - - @Override - public void beginInstanceDeclarationElement(final Class type) { - System.out.println("begin instance declaration : " + type); - } - - @Override - public void beginUnknownTypeElement(final String name) { - System.out.println("begin unknown type : " + name); - } - - @Override - public void beginIncludeElement() { - System.out.println("beginInclude"); - } - - @Override - public void beginReferenceElement() { - System.out.println("beginReference"); - } - - @Override - public void beginCopyElement() { - System.out.println("beginCopy"); - } - - @Override - public void beginRootElement() { - System.out.println("beginRoot"); - } - - @Override - public void beginPropertyElement(final String name, final Class sourceType) { - System.out.println("begin property : " + name + " (" + sourceType + ")"); - } - - @Override - public void beginUnknownStaticPropertyElement(final String name) { - System.out.println("begin unknown static property : " + name); - } - - @Override - public void beginScriptElement() { - System.out.println("begin script"); - } - - @Override - public void beginDefineElement() { - System.out.println("begin define"); - } - - @Override - public void readInternalAttribute(final String name, final String value) { - System.out.println("read internal attribute : " + name + " = " + value); - } - - @Override - public void readPropertyAttribute(final String name, final Class sourceType, final String value) { - System.out.println("read property attribute : " + name + " (" + sourceType + ") = " + value); - } - - @Override - public void readUnknownStaticPropertyAttribute(final String name, final String value) { - System.out.println("read unknown static property attribute : " + name + " = " + value); - } - - @Override - public void readEventHandlerAttribute(final String name, final String value) { - System.out.println("read event handler attribute : " + name + " = " + value); - } - - @Override - public void endElement(final Object value) { - System.out.println("end element : " + value.getClass() + " - " + value); - } -} diff --git a/loader/src/test/java/com/github/gtache/fxml/compiler/loader/ReflectionIncludeView.java b/loader/src/test/java/com/github/gtache/fxml/compiler/loader/ReflectionIncludeView.java deleted file mode 100644 index 5b3a460..0000000 --- a/loader/src/test/java/com/github/gtache/fxml/compiler/loader/ReflectionIncludeView.java +++ /dev/null @@ -1,494 +0,0 @@ -package com.github.gtache.fxml.compiler.loader; - -import javafx.event.Event; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.Map; -import java.util.ResourceBundle; - - -/** - * Generated code, not thread-safe - */ -public final class ReflectionIncludeView { - - private final Map, Object> controllersMap; - private final Map, ResourceBundle> resourceBundlesMap; - private final Map> includeControllersMap; - private boolean loaded; - private com.github.gtache.fxml.compiler.loader.IncludeController controller; - - /** - * Instantiates a new ReflectionIncludeView with no nested controllers and no resource bundle - * - * @param controller The controller - */ - public ReflectionIncludeView(final com.github.gtache.fxml.compiler.loader.IncludeController controller) { - this(Map.of(com.github.gtache.fxml.compiler.loader.IncludeController.class, controller), Map.of(), Map.of()); - } - - /** - * Instantiates a new ReflectionIncludeView with no nested controllers - * - * @param controller The controller - * @param resourceBundle The resource bundle - */ - public ReflectionIncludeView(final com.github.gtache.fxml.compiler.loader.IncludeController controller, final ResourceBundle resourceBundle) { - this(Map.of(com.github.gtache.fxml.compiler.loader.IncludeController.class, controller), Map.of(), Map.of(com.github.gtache.fxml.compiler.loader.IncludeController.class, resourceBundle)); - } - - /** - * Instantiates a new ReflectionIncludeView with nested controllers and no resource bundle - * - * @param controllersMap The map of controller class to controller - * @param includeControllersMap The map of source to controller class - */ - public ReflectionIncludeView(final Map, Object> controllersMap, final Map> includeControllersMap) { - this(controllersMap, includeControllersMap, Map.of()); - } - - /** - * Instantiates a new ReflectionIncludeView with nested controllers - * - * @param controllersMap The map of controller class to controller - * @param includeControllersMap The map of source to controller class - * @param resourceBundlesMap The map of controller class to resource bundle - */ - public ReflectionIncludeView(final Map, Object> controllersMap, final Map> includeControllersMap, final Map, ResourceBundle> resourceBundlesMap) { - this.controllersMap = Map.copyOf(controllersMap); - this.includeControllersMap = Map.copyOf(includeControllersMap); - this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); - } - - public javafx.scene.Parent load() { - if (loaded) { - throw new IllegalStateException("Already loaded"); - } - final var bundle = resourceBundlesMap.get(com.github.gtache.fxml.compiler.loader.IncludeController.class); - controller = (com.github.gtache.fxml.compiler.loader.IncludeController) controllersMap.get(com.github.gtache.fxml.compiler.loader.IncludeController.class); - final var object0 = new javafx.scene.layout.GridPane(); - injectField("gridPane", object0); - object0.setOnInputMethodTextChanged(e -> callMethod("inputMethodTextChanged", e)); - object0.setOnKeyPressed(e -> callMethod("keyPressed", e)); - object0.setOnKeyReleased(e -> callMethod("keyReleased", e)); - object0.setOnKeyTyped(e -> callMethod("keyTyped", e)); - final var object1 = new javafx.scene.layout.RowConstraints(); - final var object2 = new javafx.scene.layout.RowConstraints(); - final var object3 = new javafx.scene.layout.RowConstraints(); - final var object4 = new javafx.scene.layout.RowConstraints(); - final var object5 = new javafx.scene.layout.RowConstraints(); - final var object6 = new javafx.scene.layout.RowConstraints(); - final var object7 = new javafx.scene.layout.RowConstraints(); - final var object8 = new javafx.scene.layout.RowConstraints(); - final var object9 = new javafx.scene.layout.RowConstraints(); - final var object10 = new javafx.scene.layout.RowConstraints(); - final var object11 = new javafx.scene.layout.RowConstraints(); - final var object12 = new javafx.scene.layout.RowConstraints(); - final var object13 = new javafx.scene.layout.RowConstraints(); - final var object14 = new javafx.scene.layout.RowConstraints(); - final var object15 = new javafx.scene.layout.RowConstraints(); - final var object16 = new javafx.scene.layout.RowConstraints(); - final var object17 = new javafx.scene.layout.RowConstraints(); - final var object18 = new javafx.scene.layout.RowConstraints(); - object0.getRowConstraints().addAll(object1, object2, object3, object4, object5, object6, object7, object8, object9, object10, object11, object12, object13, object14, object15, object16, object17, object18); - final var object19 = new javafx.scene.layout.ColumnConstraints(); - final var object20 = new javafx.scene.layout.ColumnConstraints(); - final var object21 = new javafx.scene.layout.ColumnConstraints(); - object21.setMinWidth(10.0); - object21.setPrefWidth(100.0); - object0.getColumnConstraints().addAll(object19, object20, object21); - final var object22 = new javafx.scene.control.Button(); - injectField("button", object22); - object22.setMnemonicParsing(false); - object22.setText("Button"); - final var object23 = new javafx.scene.control.CheckBox(); - injectField("checkBox", object23); - object23.setIndeterminate(true); - object23.setMnemonicParsing(false); - object23.setText("CheckBox"); - javafx.scene.layout.GridPane.setColumnIndex(object23, 1); - final var object24 = new javafx.scene.control.ChoiceBox<>(); - injectField("choiceBox", object24); - object24.setCacheShape(false); - object24.setCenterShape(false); - object24.setDisable(true); - object24.setFocusTraversable(false); - object24.setPrefWidth(150.0); - object24.setScaleShape(false); - object24.setVisible(false); - javafx.scene.layout.GridPane.setRowIndex(object24, 1); - final var object25 = new javafx.scene.control.ColorPicker(); - injectField("colorPicker", object25); - object25.setNodeOrientation(javafx.geometry.NodeOrientation.LEFT_TO_RIGHT); - object25.setOpacity(0.5); - javafx.scene.layout.GridPane.setColumnIndex(object25, 1); - javafx.scene.layout.GridPane.setRowIndex(object25, 1); - final var object26 = new javafx.scene.paint.Color(0.7894737124443054, 0.08771929889917374, 0.08771929889917374, 1); - injectField("color", object26); - object25.setValue(object26); - final var object27 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); - object25.setOpaqueInsets(object27); - final var object28 = new javafx.scene.control.ComboBox<>(); - injectField("comboBox", object28); - object28.setEditable(true); - object28.setPrefWidth(150.0); - object28.setPromptText("Text"); - object28.setVisibleRowCount(5); - javafx.scene.layout.GridPane.setRowIndex(object28, 2); - final var object29 = javafx.scene.Cursor.CLOSED_HAND; - object28.setCursor(object29); - final var object30 = new javafx.scene.effect.Bloom(); - object28.setEffect(object30); - final var object31 = new javafx.scene.control.DatePicker(); - injectField("datePicker", object31); - object31.setShowWeekNumbers(true); - object31.setStyle("-fx-background-color: #ffffff;"); - javafx.scene.layout.GridPane.setColumnIndex(object31, 1); - javafx.scene.layout.GridPane.setRowIndex(object31, 2); - final var object32 = new javafx.scene.web.HTMLEditor(); - injectField("htmlEditor", object32); - object32.setHtmlText(""); - object32.setPrefHeight(200.0); - object32.setPrefWidth(506.0); - object32.getStyleClass().addAll("clazz"); - object32.getStylesheets().addAll("@style.css"); - javafx.scene.layout.GridPane.setRowIndex(object32, 3); - final var object33 = new javafx.scene.control.Hyperlink(); - injectField("hyperlink", object33); - object33.setText("Hyperlink"); - javafx.scene.layout.GridPane.setColumnIndex(object33, 1); - javafx.scene.layout.GridPane.setRowIndex(object33, 3); - final var object34 = new javafx.scene.image.ImageView(); - injectField("imageView", object34); - object34.setFitHeight(150.0); - object34.setFitWidth(200.0); - object34.setPickOnBounds(true); - object34.setPreserveRatio(true); - javafx.scene.layout.GridPane.setRowIndex(object34, 4); - final var object35 = new javafx.scene.control.Label(); - injectField("label", object35); - object35.setAccessibleHelp("TTTTT"); - object35.setAccessibleText("TTT"); - object35.setBlendMode(javafx.scene.effect.BlendMode.ADD); - object35.setCache(true); - object35.setCacheHint(javafx.scene.CacheHint.QUALITY); - object35.setDepthTest(javafx.scene.DepthTest.ENABLE); - object35.setMnemonicParsing(true); - object35.setMouseTransparent(true); - object35.setText(bundle.getString("include.label")); - javafx.scene.layout.GridPane.setColumnIndex(object35, 1); - javafx.scene.layout.GridPane.setRowIndex(object35, 4); - final var object36 = new javafx.scene.control.ListView<>(); - injectField("listView", object36); - object36.setFixedCellSize(20.0); - object36.setNodeOrientation(javafx.geometry.NodeOrientation.RIGHT_TO_LEFT); - object36.setOrientation(javafx.geometry.Orientation.HORIZONTAL); - object36.setPrefHeight(200.0); - object36.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setRowIndex(object36, 5); - final var object37 = new javafx.scene.media.MediaView(); - injectField("mediaView", object37); - object37.setFitHeight(200.0); - object37.setFitWidth(200.0); - javafx.scene.layout.GridPane.setColumnIndex(object37, 1); - javafx.scene.layout.GridPane.setColumnSpan(object37, 2); - javafx.scene.layout.GridPane.setRowIndex(object37, 5); - javafx.scene.layout.GridPane.setRowSpan(object37, 2); - final var object38 = new javafx.scene.control.MenuBar(); - injectField("menuBar", object38); - javafx.scene.layout.GridPane.setHalignment(object38, javafx.geometry.HPos.RIGHT); - javafx.scene.layout.GridPane.setHgrow(object38, javafx.scene.layout.Priority.ALWAYS); - javafx.scene.layout.GridPane.setRowIndex(object38, 7); - javafx.scene.layout.GridPane.setValignment(object38, javafx.geometry.VPos.BASELINE); - javafx.scene.layout.GridPane.setVgrow(object38, javafx.scene.layout.Priority.SOMETIMES); - final var object39 = new javafx.scene.control.Menu(); - injectField("menu1", object39); - object39.setMnemonicParsing(false); - object39.setText("File"); - final var object40 = new javafx.scene.control.MenuItem(); - injectField("menuItem1", object40); - object40.setMnemonicParsing(false); - object40.setText("Close"); - object39.getItems().addAll(object40); - final var object41 = new javafx.scene.control.Menu(); - object41.setMnemonicParsing(false); - object41.setText("Edit"); - final var object42 = new javafx.scene.control.MenuItem(); - object42.setMnemonicParsing(false); - object42.setText("Delete"); - object41.getItems().addAll(object42); - final var object43 = new javafx.scene.control.Menu(); - object43.setMnemonicParsing(false); - object43.setText("Help"); - final var object44 = new javafx.scene.control.MenuItem(); - object44.setMnemonicParsing(false); - object44.setText("About"); - object43.getItems().addAll(object44); - object38.getMenus().addAll(object39, object41, object43); - final var object45 = new javafx.scene.control.MenuButton(); - injectField("menuButton", object45); - object45.setMnemonicParsing(false); - object45.setText("MenuButton"); - javafx.scene.layout.GridPane.setColumnIndex(object45, 1); - javafx.scene.layout.GridPane.setRowIndex(object45, 7); - final var object46 = new javafx.scene.control.MenuItem(); - object46.setMnemonicParsing(false); - object46.setText("Action 1"); - final var object47 = new javafx.scene.control.MenuItem(); - object47.setMnemonicParsing(false); - object47.setText("Action 2"); - object45.getItems().addAll(object46, object47); - final var object48 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); - javafx.scene.layout.GridPane.setMargin(object45, object48); - final var object49 = new javafx.scene.control.Pagination(); - injectField("pagination", object49); - object49.setPrefHeight(200.0); - object49.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setRowIndex(object49, 8); - final var object50 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); - object49.setPadding(object50); - final var object51 = new javafx.scene.control.PasswordField(); - injectField("passwordField", object51); - object51.setMaxHeight(6.0); - object51.setMaxWidth(5.0); - object51.setMinHeight(2.0); - object51.setMinWidth(1.0); - object51.setPrefColumnCount(7); - object51.setPrefHeight(4.0); - object51.setPrefWidth(3.0); - javafx.scene.layout.GridPane.setColumnIndex(object51, 1); - javafx.scene.layout.GridPane.setRowIndex(object51, 8); - final var object52 = new javafx.scene.control.ProgressBar(); - injectField("progressBar", object52); - object52.setLayoutX(10.0); - object52.setLayoutY(20.0); - object52.setPrefWidth(200.0); - object52.setProgress(0.0); - javafx.scene.layout.GridPane.setRowIndex(object52, 9); - final var object53 = new javafx.scene.control.ProgressIndicator(); - injectField("progressIndicator", object53); - object53.setProgress(0.0); - object53.setRotate(2.0); - javafx.scene.layout.GridPane.setColumnIndex(object53, 1); - javafx.scene.layout.GridPane.setRowIndex(object53, 9); - final var object54 = new javafx.geometry.Point3D(4.0, 5.0, 6.0); - object53.setRotationAxis(object54); - final var object55 = new javafx.scene.control.RadioButton(); - injectField("radioButton", object55); - object55.setMnemonicParsing(false); - object55.setScaleX(7.0); - object55.setScaleY(2.0); - object55.setScaleZ(3.0); - object55.setText("RadioButton"); - object55.setTranslateX(4.0); - object55.setTranslateY(5.0); - object55.setTranslateZ(6.0); - javafx.scene.layout.GridPane.setRowIndex(object55, 10); - final var object56 = new javafx.scene.control.ScrollBar(); - injectField("scrollBarH", object56); - javafx.scene.layout.GridPane.setColumnIndex(object56, 1); - javafx.scene.layout.GridPane.setRowIndex(object56, 10); - final var object57 = new javafx.scene.control.ScrollBar(); - injectField("scrollBarV", object57); - object57.setOrientation(javafx.geometry.Orientation.VERTICAL); - javafx.scene.layout.GridPane.setRowIndex(object57, 11); - final var object58 = new javafx.scene.control.Separator(); - injectField("separatorH", object58); - object58.setOnDragDetected(e -> callMethod("dragDetected", e)); - object58.setOnDragDone(e -> callMethod("dragDone", e)); - object58.setOnDragDropped(e -> callMethod("dragDropped", e)); - object58.setOnDragEntered(e -> callMethod("dragEntered", e)); - object58.setOnDragExited(e -> callMethod("dragExited", e)); - object58.setOnDragOver(e -> callMethod("dragOver", e)); - object58.setOnMouseDragEntered(e -> callMethod("mouseDragEntered", e)); - object58.setOnMouseDragExited(e -> callMethod("mouseDragExited", e)); - object58.setOnMouseDragOver(e -> callMethod("mouseDragOver", e)); - object58.setOnMouseDragReleased(e -> callMethod("mouseDragReleased", e)); - object58.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setColumnIndex(object58, 1); - javafx.scene.layout.GridPane.setRowIndex(object58, 11); - final var object59 = new javafx.scene.control.Separator(); - injectField("separatorV", object59); - object59.setOrientation(javafx.geometry.Orientation.VERTICAL); - object59.setPrefHeight(200.0); - javafx.scene.layout.GridPane.setRowIndex(object59, 12); - final var object60 = new javafx.scene.control.Slider(); - injectField("sliderH", object60); - object60.setOnContextMenuRequested(e -> callMethod("contextMenuRequested", e)); - object60.setOnMouseClicked(e -> callMethod("mouseClicked", e)); - object60.setOnMouseDragged(e -> callMethod("mouseDragged", e)); - object60.setOnMouseEntered(e -> callMethod("mouseEntered", e)); - object60.setOnMouseExited(e -> callMethod("mouseExited", e)); - object60.setOnMouseMoved(e -> callMethod("mouseMoved", e)); - object60.setOnMousePressed(e -> callMethod("mousePressed", e)); - object60.setOnMouseReleased(e -> callMethod("mouseReleased", e)); - object60.setOnScroll(e -> callMethod("onScroll", e)); - object60.setOnScrollFinished(e -> callMethod("onScrollFinished", e)); - object60.setOnScrollStarted(e -> callMethod("onScrollStarted", e)); - javafx.scene.layout.GridPane.setColumnIndex(object60, 1); - javafx.scene.layout.GridPane.setRowIndex(object60, 12); - final var object61 = new javafx.scene.control.Slider(); - injectField("sliderV", object61); - object61.setOnZoom(e -> callMethod("onZoom", e)); - object61.setOnZoomFinished(e -> callMethod("onZoomFinished", e)); - object61.setOnZoomStarted(e -> callMethod("onZoomStarted", e)); - object61.setOrientation(javafx.geometry.Orientation.VERTICAL); - javafx.scene.layout.GridPane.setRowIndex(object61, 13); - final var object62 = new javafx.scene.control.Spinner<>(); - injectField("spinner", object62); - javafx.scene.layout.GridPane.setColumnIndex(object62, 1); - javafx.scene.layout.GridPane.setRowIndex(object62, 13); - final var object63 = new javafx.scene.control.SplitMenuButton(); - injectField("splitMenuButton", object63); - object63.setMnemonicParsing(false); - object63.setText("SplitMenuButton"); - javafx.scene.layout.GridPane.setRowIndex(object63, 14); - final var object64 = new javafx.scene.control.MenuItem(); - injectField("item1", object64); - object64.setMnemonicParsing(false); - object64.setText("Action 1"); - final var object65 = new javafx.scene.control.MenuItem(); - injectField("item2", object65); - object65.setMnemonicParsing(false); - object65.setText("Action 2"); - object63.getItems().addAll(object64, object65); - final var object66 = new javafx.scene.control.TableView<>(); - injectField("tableView", object66); - object66.setPrefHeight(200.0); - object66.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setColumnIndex(object66, 1); - javafx.scene.layout.GridPane.setRowIndex(object66, 14); - final var object67 = new javafx.scene.control.TableColumn<>(); - injectField("tableColumn1", object67); - object67.setPrefWidth(75.0); - object67.setText("C1"); - final var object68 = new javafx.scene.control.TableColumn<>(); - injectField("tableColumn2", object68); - object68.setPrefWidth(75.0); - object68.setText("C2"); - object66.getColumns().addAll(object67, object68); - final var object69 = new javafx.scene.control.TextArea(); - injectField("textArea", object69); - object69.setPrefHeight(200.0); - object69.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setRowIndex(object69, 15); - final var object70 = new javafx.scene.control.TextField(); - injectField("textField", object70); - javafx.scene.layout.GridPane.setColumnIndex(object70, 1); - javafx.scene.layout.GridPane.setRowIndex(object70, 15); - final var object71 = new javafx.scene.control.ToggleButton(); - object71.setMnemonicParsing(false); - object71.setOnAction(e -> callMethod("onAction", e)); - object71.setOnRotate(e -> callMethod("onRotate", e)); - object71.setOnRotationFinished(e -> callMethod("onRotationFinished", e)); - object71.setOnRotationStarted(e -> callMethod("onRotationStarted", e)); - object71.setText("ToggleButton"); - javafx.scene.layout.GridPane.setRowIndex(object71, 16); - final var object72 = new javafx.scene.control.TreeTableView<>(); - injectField("treeTableView", object72); - object72.setPrefHeight(200.0); - object72.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setColumnIndex(object72, 1); - javafx.scene.layout.GridPane.setRowIndex(object72, 16); - final var object73 = new javafx.scene.control.TreeTableColumn<>(); - injectField("treeTableColumn1", object73); - object73.setOnEditCancel(e -> callMethod("onEditCancel", e)); - object73.setOnEditCommit(e -> callMethod("onEditCommit", e)); - object73.setOnEditStart(e -> callMethod("onEditStart", e)); - object73.setPrefWidth(75.0); - object73.setText("C1"); - final var object74 = new javafx.scene.control.TreeTableColumn<>(); - injectField("treeTableColumn2", object74); - object74.setPrefWidth(75.0); - object74.setSortType(javafx.scene.control.TreeTableColumn.SortType.DESCENDING); - object74.setText("C2"); - object72.getColumns().addAll(object73, object74); - final var object75 = new javafx.scene.control.TreeView<>(); - injectField("treeView", object75); - object75.setOnSwipeDown(e -> callMethod("onSwipeDown", e)); - object75.setOnSwipeLeft(e -> callMethod("onSwipeLeft", e)); - object75.setOnSwipeRight(e -> callMethod("onSwipeRight", e)); - object75.setOnSwipeUp(e -> callMethod("onSwipeUp", e)); - object75.setPrefHeight(200.0); - object75.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setRowIndex(object75, 17); - final var object76 = new javafx.scene.web.WebView(); - injectField("webView", object76); - object76.setOnTouchMoved(e -> callMethod("onTouchMoved", e)); - object76.setOnTouchPressed(e -> callMethod("onTouchPressed", e)); - object76.setOnTouchReleased(e -> callMethod("onTouchReleased", e)); - object76.setOnTouchStationary(e -> callMethod("onTouchStationary", e)); - object76.setPrefHeight(200.0); - object76.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setColumnIndex(object76, 1); - javafx.scene.layout.GridPane.setRowIndex(object76, 17); - object0.getChildren().addAll(object22, object23, object24, object25, object28, object31, object32, object33, object34, object35, object36, object37, object38, object45, object49, object51, object52, object53, object55, object56, object57, object58, object59, object60, object61, object62, object63, object66, object69, object70, object71, object72, object75, object76); - try { - final var initialize = controller.getClass().getDeclaredMethod("initialize"); - initialize.setAccessible(true); - initialize.invoke(controller); - } catch (final InvocationTargetException | IllegalAccessException e) { - throw new RuntimeException("Error using reflection", e); - } catch (final NoSuchMethodException ignored) { - } - loaded = true; - return object0; - } - - private void callMethod(final String methodName, final T event) { - try { - final Method method; - final var methods = Arrays.stream(controller.getClass().getDeclaredMethods()) - .filter(m -> m.getName().equals(methodName)).toList(); - if (methods.size() > 1) { - final var eventMethods = methods.stream().filter(m -> - m.getParameterCount() == 1 && Event.class.isAssignableFrom(m.getParameterTypes()[0])).toList(); - if (eventMethods.size() == 1) { - method = eventMethods.getFirst(); - } else { - final var emptyMethods = methods.stream().filter(m -> m.getParameterCount() == 0).toList(); - if (emptyMethods.size() == 1) { - method = emptyMethods.getFirst(); - } else { - throw new IllegalArgumentException("Multiple matching methods for " + methodName); - } - } - } else if (methods.size() == 1) { - method = methods.getFirst(); - } else { - throw new IllegalArgumentException("No matching method for " + methodName); - } - method.setAccessible(true); - if (method.getParameterCount() == 0) { - method.invoke(controller); - } else { - method.invoke(controller, event); - } - } catch (final IllegalAccessException | InvocationTargetException ex) { - throw new RuntimeException("Error using reflection on " + methodName, ex); - } - } - - private void injectField(final String fieldName, final T object) { - try { - final var field = controller.getClass().getDeclaredField(fieldName); - field.setAccessible(true); - field.set(controller, object); - } catch (final NoSuchFieldException | IllegalAccessException e) { - throw new RuntimeException("Error using reflection on " + fieldName, e); - } - } - - /** - * @return The controller - */ - public com.github.gtache.fxml.compiler.loader.IncludeController controller() { - if (loaded) { - return controller; - } else { - throw new IllegalStateException("Not loaded"); - } - } -} diff --git a/loader/src/test/java/com/github/gtache/fxml/compiler/loader/ReflectionTestView.java b/loader/src/test/java/com/github/gtache/fxml/compiler/loader/ReflectionTestView.java deleted file mode 100644 index c815d43..0000000 --- a/loader/src/test/java/com/github/gtache/fxml/compiler/loader/ReflectionTestView.java +++ /dev/null @@ -1,253 +0,0 @@ -package com.github.gtache.fxml.compiler.loader; - -import javafx.event.Event; - -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.ResourceBundle; - - -/** - * Generated code, not thread-safe - */ -public final class ReflectionTestView { - - private final Map, Object> controllersMap; - private final Map, ResourceBundle> resourceBundlesMap; - private final Map> includeControllersMap; - private boolean loaded; - private com.github.gtache.fxml.compiler.loader.TestController controller; - - /** - * Instantiates a new ReflectionTestView with no nested controllers and no resource bundle - * - * @param controller The controller - */ - public ReflectionTestView(final com.github.gtache.fxml.compiler.loader.TestController controller) { - this(Map.of(com.github.gtache.fxml.compiler.loader.TestController.class, controller), Map.of(), Map.of()); - } - - /** - * Instantiates a new ReflectionTestView with no nested controllers - * - * @param controller The controller - * @param resourceBundle The resource bundle - */ - public ReflectionTestView(final com.github.gtache.fxml.compiler.loader.TestController controller, final ResourceBundle resourceBundle) { - this(Map.of(com.github.gtache.fxml.compiler.loader.TestController.class, controller), Map.of(), Map.of(com.github.gtache.fxml.compiler.loader.TestController.class, resourceBundle)); - } - - /** - * Instantiates a new ReflectionTestView with nested controllers and no resource bundle - * - * @param controllersMap The map of controller class to controller - * @param includeControllersMap The map of source to controller class - */ - public ReflectionTestView(final Map, Object> controllersMap, final Map> includeControllersMap) { - this(controllersMap, includeControllersMap, Map.of()); - } - - /** - * Instantiates a new ReflectionTestView with nested controllers - * - * @param controllersMap The map of controller class to controller - * @param includeControllersMap The map of source to controller class - * @param resourceBundlesMap The map of controller class to resource bundle - */ - public ReflectionTestView(final Map, Object> controllersMap, final Map> includeControllersMap, final Map, ResourceBundle> resourceBundlesMap) { - this.controllersMap = Map.copyOf(controllersMap); - this.includeControllersMap = Map.copyOf(includeControllersMap); - this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); - } - - public javafx.scene.Parent load() { - if (loaded) { - throw new IllegalStateException("Already loaded"); - } - final var bundle = resourceBundlesMap.get(com.github.gtache.fxml.compiler.loader.TestController.class); - controller = (com.github.gtache.fxml.compiler.loader.TestController) controllersMap.get(com.github.gtache.fxml.compiler.loader.TestController.class); - final var object0 = new javafx.scene.layout.BorderPane(); - final var object1 = new javafx.scene.layout.VBox(); - javafx.scene.layout.BorderPane.setAlignment(object1, javafx.geometry.Pos.CENTER); - final var object2 = new javafx.scene.layout.HBox(); - object2.setAlignment(javafx.geometry.Pos.CENTER); - object2.setSpacing(10.0); - final var object3 = new javafx.scene.control.Slider(); - injectField("playSlider", object3); - javafx.scene.layout.HBox.setHgrow(object3, javafx.scene.layout.Priority.ALWAYS); - final var object4 = new javafx.geometry.Insets(0, 0, 0, 10.0); - object3.setPadding(object4); - final var object5 = new javafx.scene.control.Label(); - injectField("playLabel", object5); - object5.setText("Label"); - final var object6 = new javafx.geometry.Insets(0, 10.0, 0, 0); - object5.setPadding(object6); - object2.getChildren().addAll(object3, object5); - final var object7 = new javafx.geometry.Insets(10.0, 0, 0, 0); - object2.setPadding(object7); - final var object8 = new javafx.scene.layout.HBox(); - object8.setAlignment(javafx.geometry.Pos.CENTER); - object8.setSpacing(10.0); - final var object9 = new javafx.scene.control.Button(); - injectField("playButton", object9); - object9.setMnemonicParsing(false); - object9.setOnAction(e -> callMethod("playPressed", e)); - final var object10 = new javafx.geometry.Insets(0, 20.0, 0, 0); - javafx.scene.layout.HBox.setMargin(object9, object10); - final var object11 = new javafx.scene.control.Label(); - object11.setText(bundle.getString("media.volume.label")); - final var object12 = new javafx.scene.control.Slider(); - injectField("volumeSlider", object12); - object12.setValue(100); - final var object13 = new javafx.scene.control.Label(); - injectField("volumeValueLabel", object13); - object13.setText("Label"); - final var class0 = includeControllersMap.get("includeView.fxml"); - final var map0 = new HashMap<>(resourceBundlesMap); - final var bundle0 = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.loader.IncludeBundle"); - map0.put(class0, bundle0); - final var view0 = new com.github.gtache.fxml.compiler.loader.ReflectionIncludeView(controllersMap, includeControllersMap, map0); - final var object14 = view0.load(); - final var controller0 = view0.controller(); - injectField("includeController", controller0); - object8.getChildren().addAll(object9, object11, object12, object13, object14); - final var object15 = new javafx.geometry.Insets(10.0, 10.0, 10.0, 10.0); - object8.setPadding(object15); - object1.getChildren().addAll(object2, object8); - object0.setBottom(object1); - final var object16 = new javafx.scene.layout.VBox(); - injectField("vbox", object16); - final var object17 = new javafx.scene.control.ToolBar(); - injectField("toolBar", object17); - final var object18 = new javafx.scene.control.TitledPane(); - injectField("titledPane", object18); - final var object19 = new javafx.scene.layout.TilePane(); - injectField("tilePane", object19); - final var object20 = new javafx.scene.text.TextFlow(); - injectField("textFlow", object20); - final var object21 = new javafx.scene.control.TabPane(); - injectField("tabPane", object21); - final var object22 = new javafx.scene.control.Tab(); - injectField("tab", object22); - final var object23 = new javafx.scene.layout.StackPane(); - injectField("stackPane", object23); - final var object24 = new javafx.scene.control.SplitPane(); - injectField("splitPane", object24); - final var object25 = new javafx.scene.control.ScrollPane(); - injectField("scrollPane", object25); - final var object26 = new javafx.scene.layout.Pane(); - injectField("pane", object26); - final var object27 = new javafx.scene.layout.HBox(); - injectField("hbox", object27); - final var object28 = new javafx.scene.Group(); - injectField("group", object28); - final var object29 = new javafx.scene.layout.GridPane(); - injectField("gridPane", object29); - final var object30 = new javafx.scene.layout.ColumnConstraints(); - injectField("columnConstraints", object30); - object30.setHgrow(javafx.scene.layout.Priority.SOMETIMES); - object30.setMinWidth(10.0); - object29.getColumnConstraints().addAll(object30); - final var object31 = new javafx.scene.layout.RowConstraints(); - object31.setMinHeight(10.0); - object31.setVgrow(javafx.scene.layout.Priority.SOMETIMES); - object29.getRowConstraints().addAll(object31); - final var object32 = new javafx.scene.layout.FlowPane(); - injectField("flowPane", object32); - final var object33 = new javafx.scene.control.DialogPane(); - injectField("dialogPane", object33); - final var object34 = new javafx.scene.control.ButtonBar(); - injectField("buttonBar", object34); - final var object35 = new javafx.scene.layout.AnchorPane(); - injectField("anchorPane", object35); - final var object36 = new javafx.scene.control.Label(); - object36.setManaged(false); - object35.getChildren().addAll(object36); - object34.getButtons().addAll(object35); - object33.setContent(object34); - object32.getChildren().addAll(object33); - object29.getChildren().addAll(object32); - object28.getChildren().addAll(object29); - object27.getChildren().addAll(object28); - object26.getChildren().addAll(object27); - object25.setContent(object26); - object24.getItems().addAll(object25); - object23.getChildren().addAll(object24); - object22.setContent(object23); - object21.getTabs().addAll(object22); - object20.getChildren().addAll(object21); - object19.getChildren().addAll(object20); - object18.setContent(object19); - object17.getItems().addAll(object18); - object16.getChildren().addAll(object17); - object0.setCenter(object16); - try { - final var initialize = controller.getClass().getDeclaredMethod("initialize"); - initialize.setAccessible(true); - initialize.invoke(controller); - } catch (final InvocationTargetException | IllegalAccessException e) { - throw new RuntimeException("Error using reflection", e); - } catch (final NoSuchMethodException ignored) { - } - loaded = true; - return object0; - } - - private void callMethod(final String methodName, final T event) { - try { - final Method method; - final var methods = Arrays.stream(controller.getClass().getDeclaredMethods()) - .filter(m -> m.getName().equals(methodName)).toList(); - if (methods.size() > 1) { - final var eventMethods = methods.stream().filter(m -> - m.getParameterCount() == 1 && Event.class.isAssignableFrom(m.getParameterTypes()[0])).toList(); - if (eventMethods.size() == 1) { - method = eventMethods.getFirst(); - } else { - final var emptyMethods = methods.stream().filter(m -> m.getParameterCount() == 0).toList(); - if (emptyMethods.size() == 1) { - method = emptyMethods.getFirst(); - } else { - throw new IllegalArgumentException("Multiple matching methods for " + methodName); - } - } - } else if (methods.size() == 1) { - method = methods.getFirst(); - } else { - throw new IllegalArgumentException("No matching method for " + methodName); - } - method.setAccessible(true); - if (method.getParameterCount() == 0) { - method.invoke(controller); - } else { - method.invoke(controller, event); - } - } catch (final IllegalAccessException | InvocationTargetException ex) { - throw new RuntimeException("Error using reflection on " + methodName, ex); - } - } - - private void injectField(final String fieldName, final T object) { - try { - final var field = controller.getClass().getDeclaredField(fieldName); - field.setAccessible(true); - field.set(controller, object); - } catch (final NoSuchFieldException | IllegalAccessException e) { - throw new RuntimeException("Error using reflection on " + fieldName, e); - } - } - - /** - * @return The controller - */ - public com.github.gtache.fxml.compiler.loader.TestController controller() { - if (loaded) { - return controller; - } else { - throw new IllegalStateException("Not loaded"); - } - } -} \ No newline at end of file diff --git a/loader/src/test/java/com/github/gtache/fxml/compiler/loader/SettersIncludeView.java b/loader/src/test/java/com/github/gtache/fxml/compiler/loader/SettersIncludeView.java deleted file mode 100644 index 059b847..0000000 --- a/loader/src/test/java/com/github/gtache/fxml/compiler/loader/SettersIncludeView.java +++ /dev/null @@ -1,439 +0,0 @@ -package com.github.gtache.fxml.compiler.loader; - -import java.util.Map; -import java.util.ResourceBundle; - - -/** - * Generated code, not thread-safe - */ -public final class SettersIncludeView { - - private final Map, Object> controllersMap; - private final Map, ResourceBundle> resourceBundlesMap; - private final Map> includeControllersMap; - private boolean loaded; - private com.github.gtache.fxml.compiler.loader.IncludeController controller; - - /** - * Instantiates a new SettersIncludeView with no nested controllers and no resource bundle - * - * @param controller The controller - */ - public SettersIncludeView(final com.github.gtache.fxml.compiler.loader.IncludeController controller) { - this(Map.of(com.github.gtache.fxml.compiler.loader.IncludeController.class, controller), Map.of(), Map.of()); - } - - /** - * Instantiates a new SettersIncludeView with no nested controllers - * - * @param controller The controller - * @param resourceBundle The resource bundle - */ - public SettersIncludeView(final com.github.gtache.fxml.compiler.loader.IncludeController controller, final ResourceBundle resourceBundle) { - this(Map.of(com.github.gtache.fxml.compiler.loader.IncludeController.class, controller), Map.of(), Map.of(com.github.gtache.fxml.compiler.loader.IncludeController.class, resourceBundle)); - } - - /** - * Instantiates a new SettersIncludeView with nested controllers and no resource bundle - * - * @param controllersMap The map of controller class to controller - * @param includeControllersMap The map of source to controller class - */ - public SettersIncludeView(final Map, Object> controllersMap, final Map> includeControllersMap) { - this(controllersMap, includeControllersMap, Map.of()); - } - - /** - * Instantiates a new SettersIncludeView with nested controllers - * - * @param controllersMap The map of controller class to controller - * @param includeControllersMap The map of source to controller class - * @param resourceBundlesMap The map of controller class to resource bundle - */ - public SettersIncludeView(final Map, Object> controllersMap, final Map> includeControllersMap, final Map, ResourceBundle> resourceBundlesMap) { - this.controllersMap = Map.copyOf(controllersMap); - this.includeControllersMap = Map.copyOf(includeControllersMap); - this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); - } - - public javafx.scene.Parent load() { - if (loaded) { - throw new IllegalStateException("Already loaded"); - } - final var bundle = resourceBundlesMap.get(com.github.gtache.fxml.compiler.loader.IncludeController.class); - controller = (com.github.gtache.fxml.compiler.loader.IncludeController) controllersMap.get(com.github.gtache.fxml.compiler.loader.IncludeController.class); - final var object0 = new javafx.scene.layout.GridPane(); - controller.setGridPane(object0); - object0.setOnInputMethodTextChanged(controller::inputMethodTextChanged); - object0.setOnKeyPressed(e -> controller.keyPressed()); - object0.setOnKeyReleased(controller::keyReleased); - object0.setOnKeyTyped(controller::keyTyped); - final var object1 = new javafx.scene.layout.RowConstraints(); - final var object2 = new javafx.scene.layout.RowConstraints(); - final var object3 = new javafx.scene.layout.RowConstraints(); - final var object4 = new javafx.scene.layout.RowConstraints(); - final var object5 = new javafx.scene.layout.RowConstraints(); - final var object6 = new javafx.scene.layout.RowConstraints(); - final var object7 = new javafx.scene.layout.RowConstraints(); - final var object8 = new javafx.scene.layout.RowConstraints(); - final var object9 = new javafx.scene.layout.RowConstraints(); - final var object10 = new javafx.scene.layout.RowConstraints(); - final var object11 = new javafx.scene.layout.RowConstraints(); - final var object12 = new javafx.scene.layout.RowConstraints(); - final var object13 = new javafx.scene.layout.RowConstraints(); - final var object14 = new javafx.scene.layout.RowConstraints(); - final var object15 = new javafx.scene.layout.RowConstraints(); - final var object16 = new javafx.scene.layout.RowConstraints(); - final var object17 = new javafx.scene.layout.RowConstraints(); - final var object18 = new javafx.scene.layout.RowConstraints(); - object0.getRowConstraints().addAll(object1, object2, object3, object4, object5, object6, object7, object8, object9, object10, object11, object12, object13, object14, object15, object16, object17, object18); - final var object19 = new javafx.scene.layout.ColumnConstraints(); - final var object20 = new javafx.scene.layout.ColumnConstraints(); - final var object21 = new javafx.scene.layout.ColumnConstraints(); - object21.setMinWidth(10.0); - object21.setPrefWidth(100.0); - object0.getColumnConstraints().addAll(object19, object20, object21); - final var object22 = new javafx.scene.control.Button(); - controller.setButton(object22); - object22.setMnemonicParsing(false); - object22.setText("Button"); - final var object23 = new javafx.scene.control.CheckBox(); - controller.setCheckBox(object23); - object23.setIndeterminate(true); - object23.setMnemonicParsing(false); - object23.setText("CheckBox"); - javafx.scene.layout.GridPane.setColumnIndex(object23, 1); - final var object24 = new javafx.scene.control.ChoiceBox(); - controller.setChoiceBox(object24); - object24.setCacheShape(false); - object24.setCenterShape(false); - object24.setDisable(true); - object24.setFocusTraversable(false); - object24.setPrefWidth(150.0); - object24.setScaleShape(false); - object24.setVisible(false); - javafx.scene.layout.GridPane.setRowIndex(object24, 1); - final var object25 = new javafx.scene.control.ColorPicker(); - controller.setColorPicker(object25); - object25.setNodeOrientation(javafx.geometry.NodeOrientation.LEFT_TO_RIGHT); - object25.setOpacity(0.5); - javafx.scene.layout.GridPane.setColumnIndex(object25, 1); - javafx.scene.layout.GridPane.setRowIndex(object25, 1); - final var object26 = new javafx.scene.paint.Color(0.7894737124443054, 0.08771929889917374, 0.08771929889917374, 1); - controller.setColor(object26); - object25.setValue(object26); - final var object27 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); - object25.setOpaqueInsets(object27); - final var object28 = new javafx.scene.control.ComboBox(); - controller.setComboBox(object28); - object28.setEditable(true); - object28.setPrefWidth(150.0); - object28.setPromptText("Text"); - object28.setVisibleRowCount(5); - javafx.scene.layout.GridPane.setRowIndex(object28, 2); - final var object29 = javafx.scene.Cursor.CLOSED_HAND; - object28.setCursor(object29); - final var object30 = new javafx.scene.effect.Bloom(); - object28.setEffect(object30); - final var object31 = new javafx.scene.control.DatePicker(); - controller.setDatePicker(object31); - object31.setShowWeekNumbers(true); - object31.setStyle("-fx-background-color: #ffffff;"); - javafx.scene.layout.GridPane.setColumnIndex(object31, 1); - javafx.scene.layout.GridPane.setRowIndex(object31, 2); - final var object32 = new javafx.scene.web.HTMLEditor(); - controller.setHtmlEditor(object32); - object32.setHtmlText(""); - object32.setPrefHeight(200.0); - object32.setPrefWidth(506.0); - object32.getStyleClass().addAll("clazz"); - object32.getStylesheets().addAll("@style.css"); - javafx.scene.layout.GridPane.setRowIndex(object32, 3); - final var object33 = new javafx.scene.control.Hyperlink(); - controller.setHyperlink(object33); - object33.setText("Hyperlink"); - javafx.scene.layout.GridPane.setColumnIndex(object33, 1); - javafx.scene.layout.GridPane.setRowIndex(object33, 3); - final var object34 = new javafx.scene.image.ImageView(); - controller.setImageView(object34); - object34.setFitHeight(150.0); - object34.setFitWidth(200.0); - object34.setPickOnBounds(true); - object34.setPreserveRatio(true); - javafx.scene.layout.GridPane.setRowIndex(object34, 4); - final var object35 = new javafx.scene.control.Label(); - controller.setLabel(object35); - object35.setAccessibleHelp("TTTTT"); - object35.setAccessibleText("TTT"); - object35.setBlendMode(javafx.scene.effect.BlendMode.ADD); - object35.setCache(true); - object35.setCacheHint(javafx.scene.CacheHint.QUALITY); - object35.setDepthTest(javafx.scene.DepthTest.ENABLE); - object35.setMnemonicParsing(true); - object35.setMouseTransparent(true); - object35.setText(bundle.getString("include.label")); - javafx.scene.layout.GridPane.setColumnIndex(object35, 1); - javafx.scene.layout.GridPane.setRowIndex(object35, 4); - final var object36 = new javafx.scene.control.ListView(); - controller.setListView(object36); - object36.setFixedCellSize(20.0); - object36.setNodeOrientation(javafx.geometry.NodeOrientation.RIGHT_TO_LEFT); - object36.setOrientation(javafx.geometry.Orientation.HORIZONTAL); - object36.setPrefHeight(200.0); - object36.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setRowIndex(object36, 5); - final var object37 = new javafx.scene.media.MediaView(); - controller.setMediaView(object37); - object37.setFitHeight(200.0); - object37.setFitWidth(200.0); - javafx.scene.layout.GridPane.setColumnIndex(object37, 1); - javafx.scene.layout.GridPane.setColumnSpan(object37, 2); - javafx.scene.layout.GridPane.setRowIndex(object37, 5); - javafx.scene.layout.GridPane.setRowSpan(object37, 2); - final var object38 = new javafx.scene.control.MenuBar(); - controller.setMenuBar(object38); - javafx.scene.layout.GridPane.setHalignment(object38, javafx.geometry.HPos.RIGHT); - javafx.scene.layout.GridPane.setHgrow(object38, javafx.scene.layout.Priority.ALWAYS); - javafx.scene.layout.GridPane.setRowIndex(object38, 7); - javafx.scene.layout.GridPane.setValignment(object38, javafx.geometry.VPos.BASELINE); - javafx.scene.layout.GridPane.setVgrow(object38, javafx.scene.layout.Priority.SOMETIMES); - final var object39 = new javafx.scene.control.Menu(); - controller.setMenu1(object39); - object39.setMnemonicParsing(false); - object39.setText("File"); - final var object40 = new javafx.scene.control.MenuItem(); - controller.setMenuItem1(object40); - object40.setMnemonicParsing(false); - object40.setText("Close"); - object39.getItems().addAll(object40); - final var object41 = new javafx.scene.control.Menu(); - object41.setMnemonicParsing(false); - object41.setText("Edit"); - final var object42 = new javafx.scene.control.MenuItem(); - object42.setMnemonicParsing(false); - object42.setText("Delete"); - object41.getItems().addAll(object42); - final var object43 = new javafx.scene.control.Menu(); - object43.setMnemonicParsing(false); - object43.setText("Help"); - final var object44 = new javafx.scene.control.MenuItem(); - object44.setMnemonicParsing(false); - object44.setText("About"); - object43.getItems().addAll(object44); - object38.getMenus().addAll(object39, object41, object43); - final var object45 = new javafx.scene.control.MenuButton(); - controller.setMenuButton(object45); - object45.setMnemonicParsing(false); - object45.setText("MenuButton"); - javafx.scene.layout.GridPane.setColumnIndex(object45, 1); - javafx.scene.layout.GridPane.setRowIndex(object45, 7); - final var object46 = new javafx.scene.control.MenuItem(); - object46.setMnemonicParsing(false); - object46.setText("Action 1"); - final var object47 = new javafx.scene.control.MenuItem(); - object47.setMnemonicParsing(false); - object47.setText("Action 2"); - object45.getItems().addAll(object46, object47); - final var object48 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); - javafx.scene.layout.GridPane.setMargin(object45, object48); - final var object49 = new javafx.scene.control.Pagination(); - controller.setPagination(object49); - object49.setPrefHeight(200.0); - object49.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setRowIndex(object49, 8); - final var object50 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); - object49.setPadding(object50); - final var object51 = new javafx.scene.control.PasswordField(); - controller.setPasswordField(object51); - object51.setMaxHeight(6.0); - object51.setMaxWidth(5.0); - object51.setMinHeight(2.0); - object51.setMinWidth(1.0); - object51.setPrefColumnCount(7); - object51.setPrefHeight(4.0); - object51.setPrefWidth(3.0); - javafx.scene.layout.GridPane.setColumnIndex(object51, 1); - javafx.scene.layout.GridPane.setRowIndex(object51, 8); - final var object52 = new javafx.scene.control.ProgressBar(); - controller.setProgressBar(object52); - object52.setLayoutX(10.0); - object52.setLayoutY(20.0); - object52.setPrefWidth(200.0); - object52.setProgress(0.0); - javafx.scene.layout.GridPane.setRowIndex(object52, 9); - final var object53 = new javafx.scene.control.ProgressIndicator(); - controller.setProgressIndicator(object53); - object53.setProgress(0.0); - object53.setRotate(2.0); - javafx.scene.layout.GridPane.setColumnIndex(object53, 1); - javafx.scene.layout.GridPane.setRowIndex(object53, 9); - final var object54 = new javafx.geometry.Point3D(4.0, 5.0, 6.0); - object53.setRotationAxis(object54); - final var object55 = new javafx.scene.control.RadioButton(); - controller.setRadioButton(object55); - object55.setMnemonicParsing(false); - object55.setScaleX(7.0); - object55.setScaleY(2.0); - object55.setScaleZ(3.0); - object55.setText("RadioButton"); - object55.setTranslateX(4.0); - object55.setTranslateY(5.0); - object55.setTranslateZ(6.0); - javafx.scene.layout.GridPane.setRowIndex(object55, 10); - final var object56 = new javafx.scene.control.ScrollBar(); - controller.setScrollBarH(object56); - javafx.scene.layout.GridPane.setColumnIndex(object56, 1); - javafx.scene.layout.GridPane.setRowIndex(object56, 10); - final var object57 = new javafx.scene.control.ScrollBar(); - controller.setScrollBarV(object57); - object57.setOrientation(javafx.geometry.Orientation.VERTICAL); - javafx.scene.layout.GridPane.setRowIndex(object57, 11); - final var object58 = new javafx.scene.control.Separator(); - controller.setSeparatorH(object58); - object58.setOnDragDetected(controller::dragDetected); - object58.setOnDragDone(controller::dragDone); - object58.setOnDragDropped(controller::dragDropped); - object58.setOnDragEntered(controller::dragEntered); - object58.setOnDragExited(controller::dragExited); - object58.setOnDragOver(controller::dragOver); - object58.setOnMouseDragEntered(controller::mouseDragEntered); - object58.setOnMouseDragExited(controller::mouseDragExited); - object58.setOnMouseDragOver(controller::mouseDragOver); - object58.setOnMouseDragReleased(controller::mouseDragReleased); - object58.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setColumnIndex(object58, 1); - javafx.scene.layout.GridPane.setRowIndex(object58, 11); - final var object59 = new javafx.scene.control.Separator(); - controller.setSeparatorV(object59); - object59.setOrientation(javafx.geometry.Orientation.VERTICAL); - object59.setPrefHeight(200.0); - javafx.scene.layout.GridPane.setRowIndex(object59, 12); - final var object60 = new javafx.scene.control.Slider(); - controller.setSliderH(object60); - object60.setOnContextMenuRequested(controller::contextMenuRequested); - object60.setOnMouseClicked(e -> controller.mouseClicked()); - object60.setOnMouseDragged(controller::mouseDragged); - object60.setOnMouseEntered(controller::mouseEntered); - object60.setOnMouseExited(controller::mouseExited); - object60.setOnMouseMoved(controller::mouseMoved); - object60.setOnMousePressed(controller::mousePressed); - object60.setOnMouseReleased(controller::mouseReleased); - object60.setOnScroll(controller::onScroll); - object60.setOnScrollFinished(controller::onScrollFinished); - object60.setOnScrollStarted(controller::onScrollStarted); - javafx.scene.layout.GridPane.setColumnIndex(object60, 1); - javafx.scene.layout.GridPane.setRowIndex(object60, 12); - final var object61 = new javafx.scene.control.Slider(); - controller.setSliderV(object61); - object61.setOnZoom(controller::onZoom); - object61.setOnZoomFinished(controller::onZoomFinished); - object61.setOnZoomStarted(controller::onZoomStarted); - object61.setOrientation(javafx.geometry.Orientation.VERTICAL); - javafx.scene.layout.GridPane.setRowIndex(object61, 13); - final var object62 = new javafx.scene.control.Spinner(); - controller.setSpinner(object62); - javafx.scene.layout.GridPane.setColumnIndex(object62, 1); - javafx.scene.layout.GridPane.setRowIndex(object62, 13); - final var object63 = new javafx.scene.control.SplitMenuButton(); - controller.setSplitMenuButton(object63); - object63.setMnemonicParsing(false); - object63.setText("SplitMenuButton"); - javafx.scene.layout.GridPane.setRowIndex(object63, 14); - final var object64 = new javafx.scene.control.MenuItem(); - controller.setItem1(object64); - object64.setMnemonicParsing(false); - object64.setText("Action 1"); - final var object65 = new javafx.scene.control.MenuItem(); - controller.setItem2(object65); - object65.setMnemonicParsing(false); - object65.setText("Action 2"); - object63.getItems().addAll(object64, object65); - final var object66 = new javafx.scene.control.TableView(); - controller.setTableView(object66); - object66.setPrefHeight(200.0); - object66.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setColumnIndex(object66, 1); - javafx.scene.layout.GridPane.setRowIndex(object66, 14); - final var object67 = new javafx.scene.control.TableColumn(); - controller.setTableColumn1(object67); - object67.setPrefWidth(75.0); - object67.setText("C1"); - final var object68 = new javafx.scene.control.TableColumn(); - controller.setTableColumn2(object68); - object68.setPrefWidth(75.0); - object68.setText("C2"); - object66.getColumns().addAll(object67, object68); - final var object69 = new javafx.scene.control.TextArea(); - controller.setTextArea(object69); - object69.setPrefHeight(200.0); - object69.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setRowIndex(object69, 15); - final var object70 = new javafx.scene.control.TextField(); - controller.setTextField(object70); - javafx.scene.layout.GridPane.setColumnIndex(object70, 1); - javafx.scene.layout.GridPane.setRowIndex(object70, 15); - final var object71 = new javafx.scene.control.ToggleButton(); - object71.setMnemonicParsing(false); - object71.setOnAction(controller::onAction); - object71.setOnRotate(controller::onRotate); - object71.setOnRotationFinished(controller::onRotationFinished); - object71.setOnRotationStarted(controller::onRotationStarted); - object71.setText("ToggleButton"); - javafx.scene.layout.GridPane.setRowIndex(object71, 16); - final var object72 = new javafx.scene.control.TreeTableView>(); - controller.setTreeTableView(object72); - object72.setPrefHeight(200.0); - object72.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setColumnIndex(object72, 1); - javafx.scene.layout.GridPane.setRowIndex(object72, 16); - final var object73 = new javafx.scene.control.TreeTableColumn, String>(); - controller.setTreeTableColumn1(object73); - object73.setOnEditCancel(controller::onEditCancel); - object73.setOnEditCommit(controller::onEditCommit); - object73.setOnEditStart(controller::onEditStart); - object73.setPrefWidth(75.0); - object73.setText("C1"); - final var object74 = new javafx.scene.control.TreeTableColumn, Integer>(); - controller.setTreeTableColumn2(object74); - object74.setPrefWidth(75.0); - object74.setSortType(javafx.scene.control.TreeTableColumn.SortType.DESCENDING); - object74.setText("C2"); - object72.getColumns().addAll(object73, object74); - final var object75 = new javafx.scene.control.TreeView(); - controller.setTreeView(object75); - object75.setOnSwipeDown(controller::onSwipeDown); - object75.setOnSwipeLeft(controller::onSwipeLeft); - object75.setOnSwipeRight(controller::onSwipeRight); - object75.setOnSwipeUp(controller::onSwipeUp); - object75.setPrefHeight(200.0); - object75.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setRowIndex(object75, 17); - final var object76 = new javafx.scene.web.WebView(); - controller.setWebView(object76); - object76.setOnTouchMoved(controller::onTouchMoved); - object76.setOnTouchPressed(controller::onTouchPressed); - object76.setOnTouchReleased(controller::onTouchReleased); - object76.setOnTouchStationary(controller::onTouchStationary); - object76.setPrefHeight(200.0); - object76.setPrefWidth(200.0); - javafx.scene.layout.GridPane.setColumnIndex(object76, 1); - javafx.scene.layout.GridPane.setRowIndex(object76, 17); - object0.getChildren().addAll(object22, object23, object24, object25, object28, object31, object32, object33, object34, object35, object36, object37, object38, object45, object49, object51, object52, object53, object55, object56, object57, object58, object59, object60, object61, object62, object63, object66, object69, object70, object71, object72, object75, object76); - controller.initialize(); - loaded = true; - return object0; - } - - - /** - * @return The controller - */ - public com.github.gtache.fxml.compiler.loader.IncludeController controller() { - if (loaded) { - return controller; - } else { - throw new IllegalStateException("Not loaded"); - } - } -} \ No newline at end of file diff --git a/loader/src/test/java/com/github/gtache/fxml/compiler/loader/SettersTestView.java b/loader/src/test/java/com/github/gtache/fxml/compiler/loader/SettersTestView.java deleted file mode 100644 index 679356c..0000000 --- a/loader/src/test/java/com/github/gtache/fxml/compiler/loader/SettersTestView.java +++ /dev/null @@ -1,198 +0,0 @@ -package com.github.gtache.fxml.compiler.loader; - -import java.util.HashMap; -import java.util.Map; -import java.util.ResourceBundle; - - -/** - * Generated code, not thread-safe - */ -public final class SettersTestView { - - private final Map, Object> controllersMap; - private final Map, ResourceBundle> resourceBundlesMap; - private final Map> includeControllersMap; - private boolean loaded; - private com.github.gtache.fxml.compiler.loader.TestController controller; - - /** - * Instantiates a new SettersTestView with no nested controllers and no resource bundle - * - * @param controller The controller - */ - public SettersTestView(final com.github.gtache.fxml.compiler.loader.TestController controller) { - this(Map.of(com.github.gtache.fxml.compiler.loader.TestController.class, controller), Map.of(), Map.of()); - } - - /** - * Instantiates a new SettersTestView with no nested controllers - * - * @param controller The controller - * @param resourceBundle The resource bundle - */ - public SettersTestView(final com.github.gtache.fxml.compiler.loader.TestController controller, final ResourceBundle resourceBundle) { - this(Map.of(com.github.gtache.fxml.compiler.loader.TestController.class, controller), Map.of(), Map.of(com.github.gtache.fxml.compiler.loader.TestController.class, resourceBundle)); - } - - /** - * Instantiates a new SettersTestView with nested controllers and no resource bundle - * - * @param controllersMap The map of controller class to controller - * @param includeControllersMap The map of source to controller class - */ - public SettersTestView(final Map, Object> controllersMap, final Map> includeControllersMap) { - this(controllersMap, includeControllersMap, Map.of()); - } - - /** - * Instantiates a new SettersTestView with nested controllers - * - * @param controllersMap The map of controller class to controller - * @param includeControllersMap The map of source to controller class - * @param resourceBundlesMap The map of controller class to resource bundle - */ - public SettersTestView(final Map, Object> controllersMap, final Map> includeControllersMap, final Map, ResourceBundle> resourceBundlesMap) { - this.controllersMap = Map.copyOf(controllersMap); - this.includeControllersMap = Map.copyOf(includeControllersMap); - this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); - } - - public javafx.scene.Parent load() { - if (loaded) { - throw new IllegalStateException("Already loaded"); - } - final var bundle = resourceBundlesMap.get(com.github.gtache.fxml.compiler.loader.TestController.class); - controller = (com.github.gtache.fxml.compiler.loader.TestController) controllersMap.get(com.github.gtache.fxml.compiler.loader.TestController.class); - final var object0 = new javafx.scene.layout.BorderPane(); - final var object1 = new javafx.scene.layout.VBox(); - javafx.scene.layout.BorderPane.setAlignment(object1, javafx.geometry.Pos.CENTER); - final var object2 = new javafx.scene.layout.HBox(); - object2.setAlignment(javafx.geometry.Pos.CENTER); - object2.setSpacing(10.0); - final var object3 = new javafx.scene.control.Slider(); - controller.setPlaySlider(object3); - javafx.scene.layout.HBox.setHgrow(object3, javafx.scene.layout.Priority.ALWAYS); - final var object4 = new javafx.geometry.Insets(0, 0, 0, 10.0); - object3.setPadding(object4); - final var object5 = new javafx.scene.control.Label(); - controller.setPlayLabel(object5); - object5.setText("Label"); - final var object6 = new javafx.geometry.Insets(0, 10.0, 0, 0); - object5.setPadding(object6); - object2.getChildren().addAll(object3, object5); - final var object7 = new javafx.geometry.Insets(10.0, 0, 0, 0); - object2.setPadding(object7); - final var object8 = new javafx.scene.layout.HBox(); - object8.setAlignment(javafx.geometry.Pos.CENTER); - object8.setSpacing(10.0); - final var object9 = new javafx.scene.control.Button(); - controller.setPlayButton(object9); - object9.setMnemonicParsing(false); - object9.setOnAction(controller::playPressed); - final var object10 = new javafx.geometry.Insets(0, 20.0, 0, 0); - javafx.scene.layout.HBox.setMargin(object9, object10); - final var object11 = new javafx.scene.control.Label(); - object11.setText(bundle.getString("media.volume.label")); - final var object12 = new javafx.scene.control.Slider(); - controller.setVolumeSlider(object12); - object12.setValue(100); - final var object13 = new javafx.scene.control.Label(); - controller.setVolumeValueLabel(object13); - object13.setText("Label"); - final var class0 = includeControllersMap.get("includeView.fxml"); - final var map0 = new HashMap<>(resourceBundlesMap); - final var bundle0 = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.loader.IncludeBundle"); - map0.put(class0, bundle0); - final var view0 = new com.github.gtache.fxml.compiler.loader.SettersIncludeView(controllersMap, includeControllersMap, map0); - final var object14 = view0.load(); - final var controller0 = view0.controller(); - controller.setIncludeController(controller0); - object8.getChildren().addAll(object9, object11, object12, object13, object14); - final var object15 = new javafx.geometry.Insets(10.0, 10.0, 10.0, 10.0); - object8.setPadding(object15); - object1.getChildren().addAll(object2, object8); - object0.setBottom(object1); - final var object16 = new javafx.scene.layout.VBox(); - controller.setVbox(object16); - final var object17 = new javafx.scene.control.ToolBar(); - controller.setToolBar(object17); - final var object18 = new javafx.scene.control.TitledPane(); - controller.setTitledPane(object18); - final var object19 = new javafx.scene.layout.TilePane(); - controller.setTilePane(object19); - final var object20 = new javafx.scene.text.TextFlow(); - controller.setTextFlow(object20); - final var object21 = new javafx.scene.control.TabPane(); - controller.setTabPane(object21); - final var object22 = new javafx.scene.control.Tab(); - controller.setTab(object22); - final var object23 = new javafx.scene.layout.StackPane(); - controller.setStackPane(object23); - final var object24 = new javafx.scene.control.SplitPane(); - controller.setSplitPane(object24); - final var object25 = new javafx.scene.control.ScrollPane(); - controller.setScrollPane(object25); - final var object26 = new javafx.scene.layout.Pane(); - controller.setPane(object26); - final var object27 = new javafx.scene.layout.HBox(); - controller.setHbox(object27); - final var object28 = new javafx.scene.Group(); - controller.setGroup(object28); - final var object29 = new javafx.scene.layout.GridPane(); - controller.setGridPane(object29); - final var object30 = new javafx.scene.layout.ColumnConstraints(); - controller.setColumnConstraints(object30); - object30.setHgrow(javafx.scene.layout.Priority.SOMETIMES); - object30.setMinWidth(10.0); - object29.getColumnConstraints().addAll(object30); - final var object31 = new javafx.scene.layout.RowConstraints(); - object31.setMinHeight(10.0); - object31.setVgrow(javafx.scene.layout.Priority.SOMETIMES); - object29.getRowConstraints().addAll(object31); - final var object32 = new javafx.scene.layout.FlowPane(); - controller.setFlowPane(object32); - final var object33 = new javafx.scene.control.DialogPane(); - controller.setDialogPane(object33); - final var object34 = new javafx.scene.control.ButtonBar(); - controller.setButtonBar(object34); - final var object35 = new javafx.scene.layout.AnchorPane(); - controller.setAnchorPane(object35); - final var object36 = new javafx.scene.control.Label(); - object36.setManaged(false); - object35.getChildren().addAll(object36); - object34.getButtons().addAll(object35); - object33.setContent(object34); - object32.getChildren().addAll(object33); - object29.getChildren().addAll(object32); - object28.getChildren().addAll(object29); - object27.getChildren().addAll(object28); - object26.getChildren().addAll(object27); - object25.setContent(object26); - object24.getItems().addAll(object25); - object23.getChildren().addAll(object24); - object22.setContent(object23); - object21.getTabs().addAll(object22); - object20.getChildren().addAll(object21); - object19.getChildren().addAll(object20); - object18.setContent(object19); - object17.getItems().addAll(object18); - object16.getChildren().addAll(object17); - object0.setCenter(object16); - controller.initialize(); - loaded = true; - return object0; - } - - - /** - * @return The controller - */ - public com.github.gtache.fxml.compiler.loader.TestController controller() { - if (loaded) { - return controller; - } else { - throw new IllegalStateException("Not loaded"); - } - } -} \ No newline at end of file diff --git a/loader/src/test/java/com/github/gtache/fxml/compiler/loader/TestApp.java b/loader/src/test/java/com/github/gtache/fxml/compiler/loader/TestApp.java deleted file mode 100644 index 6610398..0000000 --- a/loader/src/test/java/com/github/gtache/fxml/compiler/loader/TestApp.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.github.gtache.fxml.compiler.loader; - -import com.github.gtache.fxml.compiler.impl.ControllerFieldInjectionTypes; -import com.github.gtache.fxml.compiler.impl.ControllerInfoImpl; -import com.github.gtache.fxml.compiler.impl.ControllerInjectionImpl; -import com.github.gtache.fxml.compiler.impl.ControllerMethodsInjectionType; -import com.github.gtache.fxml.compiler.impl.GenerationParametersImpl; -import com.github.gtache.fxml.compiler.impl.GenerationRequestImpl; -import com.github.gtache.fxml.compiler.impl.GeneratorImpl; -import com.github.gtache.fxml.compiler.impl.ResourceBundleInjectionImpl; -import com.github.gtache.fxml.compiler.impl.ResourceBundleInjectionTypes; -import com.github.gtache.fxml.compiler.parsing.listener.ParsingLoadListener; -import javafx.application.Application; -import javafx.application.Platform; -import javafx.fxml.FXMLLoader; -import javafx.stage.Stage; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.ResourceBundle; - -public class TestApp extends Application { - @Override - public void start(final Stage primaryStage) throws Exception { - final var loader = new FXMLLoader(getClass().getResource("testView.fxml")); - final var listener = new ParsingLoadListener(); - loader.setLoadListener(listener); - loader.setResources(ResourceBundle.getBundle("com.github.gtache.fxml.compiler.loader.TestBundle")); - loader.load(); - final var genericTypes = new HashMap>(); - genericTypes.put("choiceBox", List.of("String")); - genericTypes.put("listView", List.of("javafx.scene.control.Label")); - genericTypes.put("spinner", List.of("Double")); - genericTypes.put("tableView", List.of("javafx.scene.control.TextArea")); - genericTypes.put("treeView", List.of("String")); - genericTypes.put("treeTableView", List.of("javafx.scene.control.TreeItem")); - genericTypes.put("treeTableColumn1", List.of("javafx.scene.control.TreeItem", "String")); - genericTypes.put("treeTableColumn2", List.of("javafx.scene.control.TreeItem", "Integer")); - genericTypes.put("tableColumn1", List.of("javafx.scene.control.TextArea", "Float")); - genericTypes.put("tableColumn2", List.of("javafx.scene.control.TextArea", "String")); - final var includeControllerInfo = new ControllerInfoImpl(Map.of("keyPressed", false, "mouseClicked", false), - genericTypes); - final var parameters = new GenerationParametersImpl(Map.of( - "com.github.gtache.fxml.compiler.loader.IncludeController", new ControllerInjectionImpl(ControllerFieldInjectionTypes.REFLECTION, ControllerMethodsInjectionType.REFLECTION, - "com.github.gtache.fxml.compiler.loader.IncludeController"), - "com.github.gtache.fxml.compiler.loader.TestController", new ControllerInjectionImpl(ControllerFieldInjectionTypes.REFLECTION, ControllerMethodsInjectionType.REFLECTION, - "com.github.gtache.fxml.compiler.loader.TestController")), - Map.of("includeView.fxml", "com.github.gtache.fxml.compiler.loader.ReflectionIncludeView"), - Map.of("includeView.fxml", "com.github.gtache.fxml.compiler.loader.IncludeController"), - new ResourceBundleInjectionImpl(ResourceBundleInjectionTypes.CONSTRUCTOR, "com.github.gtache.fxml.compiler.loader.TestBundle")); - final var request = new GenerationRequestImpl(parameters, includeControllerInfo, listener.root(), "com.github.gtache.fxml.compiler.loader.ReflectionTestView"); - System.out.println(new GeneratorImpl().generate(request)); - Platform.exit(); - } -} diff --git a/loader/src/test/java/com/github/gtache/fxml/compiler/parsing/listener/LoadController.java b/loader/src/test/java/com/github/gtache/fxml/compiler/parsing/listener/LoadController.java new file mode 100644 index 0000000..94d044c --- /dev/null +++ b/loader/src/test/java/com/github/gtache/fxml/compiler/parsing/listener/LoadController.java @@ -0,0 +1,17 @@ +package com.github.gtache.fxml.compiler.parsing.listener; + +import javafx.fxml.FXML; +import javafx.scene.control.Label; +import javafx.scene.control.Slider; + +public class LoadController { + @FXML + private Slider playSlider; + @FXML + private Label playLabel; + + @FXML + private void mouseClicked() { + + } +} diff --git a/loader/src/test/java/com/github/gtache/fxml/compiler/parsing/listener/TestParsingLoadListener.java b/loader/src/test/java/com/github/gtache/fxml/compiler/parsing/listener/TestParsingLoadListener.java new file mode 100644 index 0000000..b035c8a --- /dev/null +++ b/loader/src/test/java/com/github/gtache/fxml/compiler/parsing/listener/TestParsingLoadListener.java @@ -0,0 +1,273 @@ +package com.github.gtache.fxml.compiler.parsing.listener; + +import com.github.gtache.fxml.compiler.parsing.impl.ParsedIncludeImpl; +import com.github.gtache.fxml.compiler.parsing.impl.ParsedObjectImpl; +import com.github.gtache.fxml.compiler.parsing.impl.ParsedPropertyImpl; +import javafx.application.Platform; +import javafx.event.EventHandler; +import javafx.fxml.FXMLLoader; +import javafx.geometry.Insets; +import javafx.scene.control.Label; +import javafx.scene.control.Slider; +import javafx.scene.layout.BorderPane; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.Test; + +import java.io.IOException; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.SequencedMap; +import java.util.concurrent.CompletableFuture; + +import static org.junit.jupiter.api.Assertions.*; + +class TestParsingLoadListener { + + private final ParsingLoadListener listener; + + TestParsingLoadListener() { + this.listener = new ParsingLoadListener(); + } + + @BeforeAll + static void beforeAll() { + try { + Platform.startup(() -> { + + }); + } catch (final IllegalStateException ignored) { + + } + } + + @Test + void testRealCase() { + final var expected = new ParsedObjectImpl(BorderPane.class, + newLinkedHashMap("fx:controller", new ParsedPropertyImpl("fx:controller", null, "com.github.gtache.fxml.compiler.parsing.listener.LoadController")), + newLinkedHashMap(new ParsedPropertyImpl("bottom", null, null), + List.of(new ParsedObjectImpl(VBox.class, + newLinkedHashMap("alignment", new ParsedPropertyImpl("alignment", BorderPane.class, "CENTER")), + newLinkedHashMap(new ParsedPropertyImpl("children", null, null), List.of( + new ParsedObjectImpl(Slider.class, + newLinkedHashMap("fx:id", new ParsedPropertyImpl("fx:id", null, "playSlider"), "hgrow", new ParsedPropertyImpl("hgrow", HBox.class, "ALWAYS")), + newLinkedHashMap(new ParsedPropertyImpl("padding", null, null), + List.of(new ParsedObjectImpl(Insets.class, + newLinkedHashMap("left", new ParsedPropertyImpl("left", null, "10.0")), + newLinkedHashMap())))), + new ParsedObjectImpl(Label.class, + newLinkedHashMap("fx:id", new ParsedPropertyImpl("fx:id", null, "playLabel"), "text", new ParsedPropertyImpl("text", null, "Label"), "onMouseClicked", new ParsedPropertyImpl("onMouseClicked", EventHandler.class, "#mouseClicked")), + newLinkedHashMap(new ParsedPropertyImpl("padding", null, null), + List.of(new ParsedObjectImpl(Insets.class, + newLinkedHashMap("right", new ParsedPropertyImpl("right", null, "10.0")), + newLinkedHashMap())))), + new ParsedIncludeImpl( + newLinkedHashMap("source", new ParsedPropertyImpl("source", null, "includedView.fxml"), "resources", new ParsedPropertyImpl("resources", null, "com/github/gtache/fxml/compiler/parsing/listener/IncludedBundle"), "fx:id", new ParsedPropertyImpl("fx:id", null, "id"))) + )))), + new ParsedPropertyImpl("center", null, null), + List.of(new ParsedObjectImpl(VBox.class, newLinkedHashMap("fx:id", new ParsedPropertyImpl("fx:id", null, "vbox")), newLinkedHashMap())) + )); + final var actual = CompletableFuture.supplyAsync(() -> { + final var loader = new FXMLLoader(TestParsingLoadListener.class.getResource("loadView.fxml")); + loader.setLoadListener(listener); + try { + loader.load(); + } catch (final IOException e) { + throw new RuntimeException(e); + } + return listener.root(); + }, Platform::runLater).join(); + assertEquals(expected, actual); + } + + private static SequencedMap newLinkedHashMap() { + return new LinkedHashMap(); + } + + private static SequencedMap newLinkedHashMap(final K k1, final V v1) { + final var map = new LinkedHashMap(); + map.put(k1, v1); + return map; + } + + private static SequencedMap newLinkedHashMap(final K k1, final V v1, final K k2, final V v2) { + final var map = new LinkedHashMap(); + map.put(k1, v1); + map.put(k2, v2); + return map; + } + + private static SequencedMap newLinkedHashMap(final K k1, final V v1, final K k2, final V v2, final K k3, final V v3) { + final var map = new LinkedHashMap(); + map.put(k1, v1); + map.put(k2, v2); + map.put(k3, v3); + return map; + } + + @Test + void testRootNullObjects() { + assertThrows(IllegalStateException.class, listener::root); + } + + @Test + void testRootOneObject() { + listener.beginInstanceDeclarationElement(String.class); + listener.endElement(""); + final var expected = new ParsedObjectImpl(String.class, new LinkedHashMap<>(), new LinkedHashMap<>()); + assertEquals(expected, listener.root()); + } + + @Test + void testRootTwoObjects() { + listener.beginInstanceDeclarationElement(String.class); + listener.endElement(""); + listener.beginInstanceDeclarationElement(String.class); + listener.endElement(""); + assertThrows(IllegalStateException.class, listener::root); + } + + @Test + void testReadImportProcessingInstruction() { + listener.beginInstanceDeclarationElement(String.class); + listener.beginPropertyElement("name", null); + listener.beginInstanceDeclarationElement(String.class); + final var element = "element"; + listener.endElement(element); + listener.readImportProcessingInstruction("test"); + listener.endElement(element); + assertThrows(IllegalStateException.class, () -> listener.endElement("other")); + } + + @Test + void testReadLanguageProcessingInstruction() { + listener.beginInstanceDeclarationElement(String.class); + listener.beginPropertyElement("name", null); + listener.beginInstanceDeclarationElement(String.class); + final var element = "element"; + listener.endElement(element); + listener.readLanguageProcessingInstruction("test"); + listener.endElement(element); + assertThrows(IllegalStateException.class, () -> listener.endElement("other")); + } + + @Test + void testReadComment() { + listener.beginInstanceDeclarationElement(String.class); + listener.beginPropertyElement("name", null); + listener.beginInstanceDeclarationElement(String.class); + final var element = "element"; + listener.endElement(element); + listener.readComment("test"); + listener.endElement(element); + assertDoesNotThrow(() -> listener.endElement("other")); + assertDoesNotThrow(listener::root); + } + + @Test + void testBeginUnknownTypeElement() { + assertThrows(IllegalArgumentException.class, () -> listener.beginUnknownTypeElement("")); + } + + @Test + void testInclude() { + listener.beginInstanceDeclarationElement(Object.class); + listener.beginIncludeElement(); + listener.readInternalAttribute("source", "s"); + listener.readInternalAttribute("p", "v"); + listener.endElement("String"); + final var root = listener.root(); + final var expected = new ParsedIncludeImpl(new LinkedHashMap<>(Map.of("source", + new ParsedPropertyImpl("source", null, "s"), "p", new ParsedPropertyImpl("p", null, "v")))); + assertEquals(expected, root); + } + + @Test + void testBeginNestedIncludeElement() { + listener.beginIncludeElement(); + assertThrows(IllegalStateException.class, listener::beginIncludeElement); + } + + @Test + void testBeginReferenceElement() { + assertThrows(UnsupportedOperationException.class, listener::beginReferenceElement); + } + + @Test + void testBeginCopyElement() { + assertThrows(UnsupportedOperationException.class, listener::beginCopyElement); + } + + @Test + void testBeginRootElement() { + assertThrows(UnsupportedOperationException.class, listener::beginRootElement); + } + + @Test + void testBeginPropertyElementInclude() { + listener.beginIncludeElement(); + assertThrows(IllegalStateException.class, () -> listener.beginPropertyElement("", null)); + } + + @Test + void testBeginUnknownStaticPropertyElement() { + assertThrows(IllegalArgumentException.class, () -> listener.beginUnknownStaticPropertyElement("")); + } + + @Test + void testBeginScriptElement() { + assertThrows(UnsupportedOperationException.class, listener::beginScriptElement); + } + + @Test + void testBeginDefineElement() { + assertThrows(UnsupportedOperationException.class, listener::beginDefineElement); + } + + @Test + void testReadInternalAttributeNull() { + assertThrows(IllegalStateException.class, () -> listener.readInternalAttribute("name", "value")); + } + + @Test + void testReadPropertyAttributeNull() { + assertThrows(IllegalStateException.class, () -> listener.readPropertyAttribute("name", null, "value")); + } + + @Test + void testReadPropertyAttributeIsInclude() { + listener.beginIncludeElement(); + assertThrows(IllegalStateException.class, () -> listener.readPropertyAttribute("name", null, "value")); + } + + @Test + void testReadUnknownStaticPropertyAttribute() { + assertThrows(IllegalArgumentException.class, () -> listener.readUnknownStaticPropertyAttribute("", "")); + } + + @Test + void testReadEventHandlerAttributeNull() { + assertThrows(IllegalStateException.class, () -> listener.readEventHandlerAttribute("name", "value")); + } + + @Test + void testReadEventHandlerAttributeInclude() { + listener.beginIncludeElement(); + assertThrows(IllegalStateException.class, () -> listener.readEventHandlerAttribute("name", "value")); + } + + @Test + void testEndPropertyNull() { + listener.beginInstanceDeclarationElement(String.class); + listener.beginInstanceDeclarationElement(String.class); + listener.endElement(""); + assertThrows(IllegalStateException.class, () -> listener.endElement("")); + } + + @Test + void testEndElementNull() { + assertThrows(IllegalStateException.class, () -> listener.endElement("")); + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/ControlsBundle.properties b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/ControlsBundle.properties new file mode 120000 index 0000000..0224a88 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/ControlsBundle.properties @@ -0,0 +1 @@ +../../../../../../../../../../core/src/test/resources/com/github/gtache/fxml/compiler/impl/ControlsBundle.properties \ No newline at end of file diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/IncludesBundle.properties b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/IncludesBundle.properties new file mode 120000 index 0000000..f1df677 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/IncludesBundle.properties @@ -0,0 +1 @@ +../../../../../../../../../../core/src/test/resources/com/github/gtache/fxml/compiler/impl/IncludesBundle.properties \ No newline at end of file diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/controlsView.fxml b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/controlsView.fxml new file mode 120000 index 0000000..a4a6d57 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/controlsView.fxml @@ -0,0 +1 @@ +../../../../../../../../../../core/src/test/resources/com/github/gtache/fxml/compiler/impl/controlsView.fxml \ No newline at end of file diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-assign-reference-constructor.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-assign-reference-constructor.txt new file mode 100644 index 0000000..a58a5ac --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-assign-reference-constructor.txt @@ -0,0 +1,425 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; + + +/** + * Generated code, not thread-safe + */ +public final class ControlsController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.ControlsController controller; + + /** + * Instantiates a new ControlsController with no nested controllers and no resource bundle + * @param controller The controller + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of()); + } + + /** + * Instantiates a new ControlsController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, resourceBundle)); + } + + /** + * Instantiates a new ControlsController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public ControlsController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = resourceBundlesMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + controller = (com.github.gtache.fxml.compiler.impl.ControlsController) controllersMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + final var object0 = new javafx.scene.layout.GridPane(); + controller.gridPane = object0; + object0.setOnInputMethodTextChanged(controller::inputMethodTextChanged); + object0.setOnKeyPressed(e -> controller.keyPressed()); + object0.setOnKeyReleased(controller::keyReleased); + object0.setOnKeyTyped(controller::keyTyped); + final var object1 = new javafx.scene.layout.RowConstraints(); + final var object2 = new javafx.scene.layout.RowConstraints(); + final var object3 = new javafx.scene.layout.RowConstraints(); + final var object4 = new javafx.scene.layout.RowConstraints(); + final var object5 = new javafx.scene.layout.RowConstraints(); + final var object6 = new javafx.scene.layout.RowConstraints(); + final var object7 = new javafx.scene.layout.RowConstraints(); + final var object8 = new javafx.scene.layout.RowConstraints(); + final var object9 = new javafx.scene.layout.RowConstraints(); + final var object10 = new javafx.scene.layout.RowConstraints(); + final var object11 = new javafx.scene.layout.RowConstraints(); + final var object12 = new javafx.scene.layout.RowConstraints(); + final var object13 = new javafx.scene.layout.RowConstraints(); + final var object14 = new javafx.scene.layout.RowConstraints(); + final var object15 = new javafx.scene.layout.RowConstraints(); + final var object16 = new javafx.scene.layout.RowConstraints(); + final var object17 = new javafx.scene.layout.RowConstraints(); + final var object18 = new javafx.scene.layout.RowConstraints(); + object0.getRowConstraints().addAll(object1, object2, object3, object4, object5, object6, object7, object8, object9, object10, object11, object12, object13, object14, object15, object16, object17, object18); + final var object19 = new javafx.scene.layout.ColumnConstraints(); + final var object20 = new javafx.scene.layout.ColumnConstraints(); + final var object21 = new javafx.scene.layout.ColumnConstraints(); + object21.setMinWidth(10.0); + object21.setPrefWidth(100.0); + object0.getColumnConstraints().addAll(object19, object20, object21); + final var object22 = new javafx.scene.control.Button(); + controller.button = object22; + object22.setMnemonicParsing(false); + object22.setText("Button"); + final var object23 = new javafx.scene.control.CheckBox(); + controller.checkBox = object23; + object23.setIndeterminate(true); + object23.setMnemonicParsing(false); + object23.setText("CheckBox"); + javafx.scene.layout.GridPane.setColumnIndex(object23, 1); + final var object24 = new javafx.scene.control.ChoiceBox(); + controller.choiceBox = object24; + object24.setCacheShape(false); + object24.setCenterShape(false); + object24.setDisable(true); + object24.setFocusTraversable(false); + object24.setPrefWidth(150.0); + object24.setScaleShape(false); + object24.setVisible(false); + javafx.scene.layout.GridPane.setRowIndex(object24, 1); + final var object25 = new javafx.scene.control.ColorPicker(); + controller.colorPicker = object25; + object25.setNodeOrientation(javafx.geometry.NodeOrientation.LEFT_TO_RIGHT); + object25.setOpacity(0.5); + javafx.scene.layout.GridPane.setColumnIndex(object25, 1); + javafx.scene.layout.GridPane.setRowIndex(object25, 1); + final var object26 = new javafx.scene.paint.Color(0.7894737124443054, 0.08771929889917374, 0.08771929889917374, 1); + controller.color = object26; + object25.setValue(object26); + final var object27 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object25.setOpaqueInsets(object27); + final var object28 = new javafx.scene.control.ComboBox(); + controller.comboBox = object28; + object28.setEditable(true); + object28.setPrefWidth(150.0); + object28.setPromptText("Text"); + object28.setVisibleRowCount(5); + javafx.scene.layout.GridPane.setRowIndex(object28, 2); + final var object29 = javafx.scene.Cursor.CLOSED_HAND; + object28.setCursor(object29); + final var object30 = new javafx.scene.effect.Bloom(); + object28.setEffect(object30); + final var object31 = new javafx.scene.control.DatePicker(); + controller.datePicker = object31; + object31.setShowWeekNumbers(true); + object31.setStyle("-fx-background-color: #ffffff;"); + javafx.scene.layout.GridPane.setColumnIndex(object31, 1); + javafx.scene.layout.GridPane.setRowIndex(object31, 2); + final var object32 = new javafx.scene.web.HTMLEditor(); + controller.htmlEditor = object32; + object32.setHtmlText(""); + object32.setPrefHeight(200.0); + object32.setPrefWidth(506.0); + object32.getStyleClass().addAll("clazz"); + object32.getStylesheets().addAll("@style.css"); + javafx.scene.layout.GridPane.setRowIndex(object32, 3); + final var object33 = new javafx.scene.control.Hyperlink(); + controller.hyperlink = object33; + object33.setText("Hyperlink"); + javafx.scene.layout.GridPane.setColumnIndex(object33, 1); + javafx.scene.layout.GridPane.setRowIndex(object33, 3); + final var object34 = new javafx.scene.image.ImageView(); + controller.imageView = object34; + object34.setFitHeight(150.0); + object34.setFitWidth(200.0); + object34.setPickOnBounds(true); + object34.setPreserveRatio(true); + javafx.scene.layout.GridPane.setRowIndex(object34, 4); + final var object35 = new javafx.scene.control.Label(); + controller.label = object35; + object35.setAccessibleHelp("TTTTT"); + object35.setAccessibleText("TTT"); + object35.setBlendMode(javafx.scene.effect.BlendMode.ADD); + object35.setCache(true); + object35.setCacheHint(javafx.scene.CacheHint.QUALITY); + object35.setDepthTest(javafx.scene.DepthTest.ENABLE); + object35.setMnemonicParsing(true); + object35.setMouseTransparent(true); + object35.setText(bundle.getString("include.label")); + javafx.scene.layout.GridPane.setColumnIndex(object35, 1); + javafx.scene.layout.GridPane.setRowIndex(object35, 4); + final var object36 = new javafx.scene.control.ListView(); + controller.listView = object36; + object36.setFixedCellSize(20.0); + object36.setNodeOrientation(javafx.geometry.NodeOrientation.RIGHT_TO_LEFT); + object36.setOrientation(javafx.geometry.Orientation.HORIZONTAL); + object36.setPrefHeight(200.0); + object36.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object36, 5); + final var object37 = new javafx.scene.media.MediaView(); + controller.mediaView = object37; + object37.setFitHeight(200.0); + object37.setFitWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object37, 1); + javafx.scene.layout.GridPane.setColumnSpan(object37, 2); + javafx.scene.layout.GridPane.setRowIndex(object37, 5); + javafx.scene.layout.GridPane.setRowSpan(object37, 2); + final var object38 = new javafx.scene.control.MenuBar(); + controller.menuBar = object38; + javafx.scene.layout.GridPane.setHalignment(object38, javafx.geometry.HPos.RIGHT); + javafx.scene.layout.GridPane.setHgrow(object38, javafx.scene.layout.Priority.ALWAYS); + javafx.scene.layout.GridPane.setRowIndex(object38, 7); + javafx.scene.layout.GridPane.setValignment(object38, javafx.geometry.VPos.BASELINE); + javafx.scene.layout.GridPane.setVgrow(object38, javafx.scene.layout.Priority.SOMETIMES); + final var object39 = new javafx.scene.control.Menu(); + controller.menu1 = object39; + object39.setMnemonicParsing(false); + object39.setText("File"); + final var object40 = new javafx.scene.control.MenuItem(); + controller.menuItem1 = object40; + object40.setMnemonicParsing(false); + object40.setText("Close"); + object39.getItems().addAll(object40); + final var object41 = new javafx.scene.control.Menu(); + object41.setMnemonicParsing(false); + object41.setText("Edit"); + final var object42 = new javafx.scene.control.MenuItem(); + object42.setMnemonicParsing(false); + object42.setText("Delete"); + object41.getItems().addAll(object42); + final var object43 = new javafx.scene.control.Menu(); + object43.setMnemonicParsing(false); + object43.setText("Help"); + final var object44 = new javafx.scene.control.MenuItem(); + object44.setMnemonicParsing(false); + object44.setText("About"); + object43.getItems().addAll(object44); + object38.getMenus().addAll(object39, object41, object43); + final var object45 = new javafx.scene.control.MenuButton(); + controller.menuButton = object45; + object45.setMnemonicParsing(false); + object45.setText("MenuButton"); + javafx.scene.layout.GridPane.setColumnIndex(object45, 1); + javafx.scene.layout.GridPane.setRowIndex(object45, 7); + final var object46 = new javafx.scene.control.MenuItem(); + object46.setMnemonicParsing(false); + object46.setText("Action 1"); + final var object47 = new javafx.scene.control.MenuItem(); + object47.setMnemonicParsing(false); + object47.setText("Action 2"); + object45.getItems().addAll(object46, object47); + final var object48 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + javafx.scene.layout.GridPane.setMargin(object45, object48); + final var object49 = new javafx.scene.control.Pagination(); + controller.pagination = object49; + object49.setPrefHeight(200.0); + object49.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object49, 8); + final var object50 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object49.setPadding(object50); + final var object51 = new javafx.scene.control.PasswordField(); + controller.passwordField = object51; + object51.setMaxHeight(6.0); + object51.setMaxWidth(5.0); + object51.setMinHeight(2.0); + object51.setMinWidth(1.0); + object51.setPrefColumnCount(7); + object51.setPrefHeight(4.0); + object51.setPrefWidth(3.0); + javafx.scene.layout.GridPane.setColumnIndex(object51, 1); + javafx.scene.layout.GridPane.setRowIndex(object51, 8); + final var object52 = new javafx.scene.control.ProgressBar(); + controller.progressBar = object52; + object52.setLayoutX(10.0); + object52.setLayoutY(20.0); + object52.setPrefWidth(200.0); + object52.setProgress(0.0); + javafx.scene.layout.GridPane.setRowIndex(object52, 9); + final var object53 = new javafx.scene.control.ProgressIndicator(); + controller.progressIndicator = object53; + object53.setProgress(0.0); + object53.setRotate(2.0); + javafx.scene.layout.GridPane.setColumnIndex(object53, 1); + javafx.scene.layout.GridPane.setRowIndex(object53, 9); + final var object54 = new javafx.geometry.Point3D(4.0, 5.0, 6.0); + object53.setRotationAxis(object54); + final var object55 = new javafx.scene.control.RadioButton(); + controller.radioButton = object55; + object55.setMnemonicParsing(false); + object55.setScaleX(7.0); + object55.setScaleY(2.0); + object55.setScaleZ(3.0); + object55.setText("RadioButton"); + object55.setTranslateX(4.0); + object55.setTranslateY(5.0); + object55.setTranslateZ(6.0); + javafx.scene.layout.GridPane.setRowIndex(object55, 10); + final var object56 = new javafx.scene.control.ScrollBar(); + controller.scrollBarH = object56; + javafx.scene.layout.GridPane.setColumnIndex(object56, 1); + javafx.scene.layout.GridPane.setRowIndex(object56, 10); + final var object57 = new javafx.scene.control.ScrollBar(); + controller.scrollBarV = object57; + object57.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object57, 11); + final var object58 = new javafx.scene.control.Separator(); + controller.separatorH = object58; + object58.setOnDragDetected(controller::dragDetected); + object58.setOnDragDone(controller::dragDone); + object58.setOnDragDropped(controller::dragDropped); + object58.setOnDragEntered(controller::dragEntered); + object58.setOnDragExited(controller::dragExited); + object58.setOnDragOver(controller::dragOver); + object58.setOnMouseDragEntered(controller::mouseDragEntered); + object58.setOnMouseDragExited(controller::mouseDragExited); + object58.setOnMouseDragOver(controller::mouseDragOver); + object58.setOnMouseDragReleased(controller::mouseDragReleased); + object58.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object58, 1); + javafx.scene.layout.GridPane.setRowIndex(object58, 11); + final var object59 = new javafx.scene.control.Separator(); + controller.separatorV = object59; + object59.setOrientation(javafx.geometry.Orientation.VERTICAL); + object59.setPrefHeight(200.0); + javafx.scene.layout.GridPane.setRowIndex(object59, 12); + final var object60 = new javafx.scene.control.Slider(); + controller.sliderH = object60; + object60.setOnContextMenuRequested(controller::contextMenuRequested); + object60.setOnMouseClicked(e -> controller.mouseClicked()); + object60.setOnMouseDragged(controller::mouseDragged); + object60.setOnMouseEntered(controller::mouseEntered); + object60.setOnMouseExited(controller::mouseExited); + object60.setOnMouseMoved(controller::mouseMoved); + object60.setOnMousePressed(controller::mousePressed); + object60.setOnMouseReleased(controller::mouseReleased); + object60.setOnScroll(controller::onScroll); + object60.setOnScrollFinished(controller::onScrollFinished); + object60.setOnScrollStarted(controller::onScrollStarted); + javafx.scene.layout.GridPane.setColumnIndex(object60, 1); + javafx.scene.layout.GridPane.setRowIndex(object60, 12); + final var object61 = new javafx.scene.control.Slider(); + controller.sliderV = object61; + object61.setOnZoom(controller::onZoom); + object61.setOnZoomFinished(controller::onZoomFinished); + object61.setOnZoomStarted(controller::onZoomStarted); + object61.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object61, 13); + final var object62 = new javafx.scene.control.Spinner(); + controller.spinner = object62; + javafx.scene.layout.GridPane.setColumnIndex(object62, 1); + javafx.scene.layout.GridPane.setRowIndex(object62, 13); + final var object63 = new javafx.scene.control.SplitMenuButton(); + controller.splitMenuButton = object63; + object63.setMnemonicParsing(false); + object63.setText("SplitMenuButton"); + javafx.scene.layout.GridPane.setRowIndex(object63, 14); + final var object64 = new javafx.scene.control.MenuItem(); + controller.item1 = object64; + object64.setMnemonicParsing(false); + object64.setText("Action 1"); + final var object65 = new javafx.scene.control.MenuItem(); + controller.item2 = object65; + object65.setMnemonicParsing(false); + object65.setText("Action 2"); + object63.getItems().addAll(object64, object65); + final var object66 = new javafx.scene.control.TableView(); + controller.tableView = object66; + object66.setPrefHeight(200.0); + object66.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object66, 1); + javafx.scene.layout.GridPane.setRowIndex(object66, 14); + final var object67 = new javafx.scene.control.TableColumn(); + controller.tableColumn1 = object67; + object67.setPrefWidth(75.0); + object67.setText("C1"); + final var object68 = new javafx.scene.control.TableColumn(); + controller.tableColumn2 = object68; + object68.setPrefWidth(75.0); + object68.setText("C2"); + object66.getColumns().addAll(object67, object68); + final var object69 = new javafx.scene.control.TextArea(); + controller.textArea = object69; + object69.setPrefHeight(200.0); + object69.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object69, 15); + final var object70 = new javafx.scene.control.TextField(); + controller.textField = object70; + javafx.scene.layout.GridPane.setColumnIndex(object70, 1); + javafx.scene.layout.GridPane.setRowIndex(object70, 15); + final var object71 = new javafx.scene.control.ToggleButton(); + object71.setMnemonicParsing(false); + object71.setOnAction(controller::onAction); + object71.setOnRotate(controller::onRotate); + object71.setOnRotationFinished(controller::onRotationFinished); + object71.setOnRotationStarted(controller::onRotationStarted); + object71.setText("ToggleButton"); + javafx.scene.layout.GridPane.setRowIndex(object71, 16); + final var object72 = new javafx.scene.control.TreeTableView>(); + controller.treeTableView = object72; + object72.setPrefHeight(200.0); + object72.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object72, 1); + javafx.scene.layout.GridPane.setRowIndex(object72, 16); + final var object73 = new javafx.scene.control.TreeTableColumn, String>(); + controller.treeTableColumn1 = object73; + object73.setOnEditCancel(controller::onEditCancel); + object73.setOnEditCommit(controller::onEditCommit); + object73.setOnEditStart(controller::onEditStart); + object73.setPrefWidth(75.0); + object73.setText("C1"); + final var object74 = new javafx.scene.control.TreeTableColumn, Integer>(); + controller.treeTableColumn2 = object74; + object74.setPrefWidth(75.0); + object74.setSortType(javafx.scene.control.TreeTableColumn.SortType.DESCENDING); + object74.setText("C2"); + object72.getColumns().addAll(object73, object74); + final var object75 = new javafx.scene.control.TreeView(); + controller.treeView = object75; + object75.setOnSwipeDown(controller::onSwipeDown); + object75.setOnSwipeLeft(controller::onSwipeLeft); + object75.setOnSwipeRight(controller::onSwipeRight); + object75.setOnSwipeUp(controller::onSwipeUp); + object75.setPrefHeight(200.0); + object75.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object75, 17); + final var object76 = new javafx.scene.web.WebView(); + controller.webView = object76; + object76.setOnTouchMoved(controller::onTouchMoved); + object76.setOnTouchPressed(controller::onTouchPressed); + object76.setOnTouchReleased(controller::onTouchReleased); + object76.setOnTouchStationary(controller::onTouchStationary); + object76.setPrefHeight(200.0); + object76.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object76, 1); + javafx.scene.layout.GridPane.setRowIndex(object76, 17); + object0.getChildren().addAll(object22, object23, object24, object25, object28, object31, object32, object33, object34, object35, object36, object37, object38, object45, object49, object51, object52, object53, object55, object56, object57, object58, object59, object60, object61, object62, object63, object66, object69, object70, object71, object72, object75, object76); + controller.initialize(); + loaded = true; + return object0; +} + + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.ControlsController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-assign-reference-getbundle.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-assign-reference-getbundle.txt new file mode 100644 index 0000000..fa1aa39 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-assign-reference-getbundle.txt @@ -0,0 +1,425 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; + + +/** + * Generated code, not thread-safe + */ +public final class ControlsController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.ControlsController controller; + + /** + * Instantiates a new ControlsController with no nested controllers and no resource bundle + * @param controller The controller + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of()); + } + + /** + * Instantiates a new ControlsController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, resourceBundle)); + } + + /** + * Instantiates a new ControlsController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public ControlsController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + controller = (com.github.gtache.fxml.compiler.impl.ControlsController) controllersMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + final var object0 = new javafx.scene.layout.GridPane(); + controller.gridPane = object0; + object0.setOnInputMethodTextChanged(controller::inputMethodTextChanged); + object0.setOnKeyPressed(e -> controller.keyPressed()); + object0.setOnKeyReleased(controller::keyReleased); + object0.setOnKeyTyped(controller::keyTyped); + final var object1 = new javafx.scene.layout.RowConstraints(); + final var object2 = new javafx.scene.layout.RowConstraints(); + final var object3 = new javafx.scene.layout.RowConstraints(); + final var object4 = new javafx.scene.layout.RowConstraints(); + final var object5 = new javafx.scene.layout.RowConstraints(); + final var object6 = new javafx.scene.layout.RowConstraints(); + final var object7 = new javafx.scene.layout.RowConstraints(); + final var object8 = new javafx.scene.layout.RowConstraints(); + final var object9 = new javafx.scene.layout.RowConstraints(); + final var object10 = new javafx.scene.layout.RowConstraints(); + final var object11 = new javafx.scene.layout.RowConstraints(); + final var object12 = new javafx.scene.layout.RowConstraints(); + final var object13 = new javafx.scene.layout.RowConstraints(); + final var object14 = new javafx.scene.layout.RowConstraints(); + final var object15 = new javafx.scene.layout.RowConstraints(); + final var object16 = new javafx.scene.layout.RowConstraints(); + final var object17 = new javafx.scene.layout.RowConstraints(); + final var object18 = new javafx.scene.layout.RowConstraints(); + object0.getRowConstraints().addAll(object1, object2, object3, object4, object5, object6, object7, object8, object9, object10, object11, object12, object13, object14, object15, object16, object17, object18); + final var object19 = new javafx.scene.layout.ColumnConstraints(); + final var object20 = new javafx.scene.layout.ColumnConstraints(); + final var object21 = new javafx.scene.layout.ColumnConstraints(); + object21.setMinWidth(10.0); + object21.setPrefWidth(100.0); + object0.getColumnConstraints().addAll(object19, object20, object21); + final var object22 = new javafx.scene.control.Button(); + controller.button = object22; + object22.setMnemonicParsing(false); + object22.setText("Button"); + final var object23 = new javafx.scene.control.CheckBox(); + controller.checkBox = object23; + object23.setIndeterminate(true); + object23.setMnemonicParsing(false); + object23.setText("CheckBox"); + javafx.scene.layout.GridPane.setColumnIndex(object23, 1); + final var object24 = new javafx.scene.control.ChoiceBox(); + controller.choiceBox = object24; + object24.setCacheShape(false); + object24.setCenterShape(false); + object24.setDisable(true); + object24.setFocusTraversable(false); + object24.setPrefWidth(150.0); + object24.setScaleShape(false); + object24.setVisible(false); + javafx.scene.layout.GridPane.setRowIndex(object24, 1); + final var object25 = new javafx.scene.control.ColorPicker(); + controller.colorPicker = object25; + object25.setNodeOrientation(javafx.geometry.NodeOrientation.LEFT_TO_RIGHT); + object25.setOpacity(0.5); + javafx.scene.layout.GridPane.setColumnIndex(object25, 1); + javafx.scene.layout.GridPane.setRowIndex(object25, 1); + final var object26 = new javafx.scene.paint.Color(0.7894737124443054, 0.08771929889917374, 0.08771929889917374, 1); + controller.color = object26; + object25.setValue(object26); + final var object27 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object25.setOpaqueInsets(object27); + final var object28 = new javafx.scene.control.ComboBox(); + controller.comboBox = object28; + object28.setEditable(true); + object28.setPrefWidth(150.0); + object28.setPromptText("Text"); + object28.setVisibleRowCount(5); + javafx.scene.layout.GridPane.setRowIndex(object28, 2); + final var object29 = javafx.scene.Cursor.CLOSED_HAND; + object28.setCursor(object29); + final var object30 = new javafx.scene.effect.Bloom(); + object28.setEffect(object30); + final var object31 = new javafx.scene.control.DatePicker(); + controller.datePicker = object31; + object31.setShowWeekNumbers(true); + object31.setStyle("-fx-background-color: #ffffff;"); + javafx.scene.layout.GridPane.setColumnIndex(object31, 1); + javafx.scene.layout.GridPane.setRowIndex(object31, 2); + final var object32 = new javafx.scene.web.HTMLEditor(); + controller.htmlEditor = object32; + object32.setHtmlText(""); + object32.setPrefHeight(200.0); + object32.setPrefWidth(506.0); + object32.getStyleClass().addAll("clazz"); + object32.getStylesheets().addAll("@style.css"); + javafx.scene.layout.GridPane.setRowIndex(object32, 3); + final var object33 = new javafx.scene.control.Hyperlink(); + controller.hyperlink = object33; + object33.setText("Hyperlink"); + javafx.scene.layout.GridPane.setColumnIndex(object33, 1); + javafx.scene.layout.GridPane.setRowIndex(object33, 3); + final var object34 = new javafx.scene.image.ImageView(); + controller.imageView = object34; + object34.setFitHeight(150.0); + object34.setFitWidth(200.0); + object34.setPickOnBounds(true); + object34.setPreserveRatio(true); + javafx.scene.layout.GridPane.setRowIndex(object34, 4); + final var object35 = new javafx.scene.control.Label(); + controller.label = object35; + object35.setAccessibleHelp("TTTTT"); + object35.setAccessibleText("TTT"); + object35.setBlendMode(javafx.scene.effect.BlendMode.ADD); + object35.setCache(true); + object35.setCacheHint(javafx.scene.CacheHint.QUALITY); + object35.setDepthTest(javafx.scene.DepthTest.ENABLE); + object35.setMnemonicParsing(true); + object35.setMouseTransparent(true); + object35.setText(bundle.getString("include.label")); + javafx.scene.layout.GridPane.setColumnIndex(object35, 1); + javafx.scene.layout.GridPane.setRowIndex(object35, 4); + final var object36 = new javafx.scene.control.ListView(); + controller.listView = object36; + object36.setFixedCellSize(20.0); + object36.setNodeOrientation(javafx.geometry.NodeOrientation.RIGHT_TO_LEFT); + object36.setOrientation(javafx.geometry.Orientation.HORIZONTAL); + object36.setPrefHeight(200.0); + object36.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object36, 5); + final var object37 = new javafx.scene.media.MediaView(); + controller.mediaView = object37; + object37.setFitHeight(200.0); + object37.setFitWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object37, 1); + javafx.scene.layout.GridPane.setColumnSpan(object37, 2); + javafx.scene.layout.GridPane.setRowIndex(object37, 5); + javafx.scene.layout.GridPane.setRowSpan(object37, 2); + final var object38 = new javafx.scene.control.MenuBar(); + controller.menuBar = object38; + javafx.scene.layout.GridPane.setHalignment(object38, javafx.geometry.HPos.RIGHT); + javafx.scene.layout.GridPane.setHgrow(object38, javafx.scene.layout.Priority.ALWAYS); + javafx.scene.layout.GridPane.setRowIndex(object38, 7); + javafx.scene.layout.GridPane.setValignment(object38, javafx.geometry.VPos.BASELINE); + javafx.scene.layout.GridPane.setVgrow(object38, javafx.scene.layout.Priority.SOMETIMES); + final var object39 = new javafx.scene.control.Menu(); + controller.menu1 = object39; + object39.setMnemonicParsing(false); + object39.setText("File"); + final var object40 = new javafx.scene.control.MenuItem(); + controller.menuItem1 = object40; + object40.setMnemonicParsing(false); + object40.setText("Close"); + object39.getItems().addAll(object40); + final var object41 = new javafx.scene.control.Menu(); + object41.setMnemonicParsing(false); + object41.setText("Edit"); + final var object42 = new javafx.scene.control.MenuItem(); + object42.setMnemonicParsing(false); + object42.setText("Delete"); + object41.getItems().addAll(object42); + final var object43 = new javafx.scene.control.Menu(); + object43.setMnemonicParsing(false); + object43.setText("Help"); + final var object44 = new javafx.scene.control.MenuItem(); + object44.setMnemonicParsing(false); + object44.setText("About"); + object43.getItems().addAll(object44); + object38.getMenus().addAll(object39, object41, object43); + final var object45 = new javafx.scene.control.MenuButton(); + controller.menuButton = object45; + object45.setMnemonicParsing(false); + object45.setText("MenuButton"); + javafx.scene.layout.GridPane.setColumnIndex(object45, 1); + javafx.scene.layout.GridPane.setRowIndex(object45, 7); + final var object46 = new javafx.scene.control.MenuItem(); + object46.setMnemonicParsing(false); + object46.setText("Action 1"); + final var object47 = new javafx.scene.control.MenuItem(); + object47.setMnemonicParsing(false); + object47.setText("Action 2"); + object45.getItems().addAll(object46, object47); + final var object48 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + javafx.scene.layout.GridPane.setMargin(object45, object48); + final var object49 = new javafx.scene.control.Pagination(); + controller.pagination = object49; + object49.setPrefHeight(200.0); + object49.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object49, 8); + final var object50 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object49.setPadding(object50); + final var object51 = new javafx.scene.control.PasswordField(); + controller.passwordField = object51; + object51.setMaxHeight(6.0); + object51.setMaxWidth(5.0); + object51.setMinHeight(2.0); + object51.setMinWidth(1.0); + object51.setPrefColumnCount(7); + object51.setPrefHeight(4.0); + object51.setPrefWidth(3.0); + javafx.scene.layout.GridPane.setColumnIndex(object51, 1); + javafx.scene.layout.GridPane.setRowIndex(object51, 8); + final var object52 = new javafx.scene.control.ProgressBar(); + controller.progressBar = object52; + object52.setLayoutX(10.0); + object52.setLayoutY(20.0); + object52.setPrefWidth(200.0); + object52.setProgress(0.0); + javafx.scene.layout.GridPane.setRowIndex(object52, 9); + final var object53 = new javafx.scene.control.ProgressIndicator(); + controller.progressIndicator = object53; + object53.setProgress(0.0); + object53.setRotate(2.0); + javafx.scene.layout.GridPane.setColumnIndex(object53, 1); + javafx.scene.layout.GridPane.setRowIndex(object53, 9); + final var object54 = new javafx.geometry.Point3D(4.0, 5.0, 6.0); + object53.setRotationAxis(object54); + final var object55 = new javafx.scene.control.RadioButton(); + controller.radioButton = object55; + object55.setMnemonicParsing(false); + object55.setScaleX(7.0); + object55.setScaleY(2.0); + object55.setScaleZ(3.0); + object55.setText("RadioButton"); + object55.setTranslateX(4.0); + object55.setTranslateY(5.0); + object55.setTranslateZ(6.0); + javafx.scene.layout.GridPane.setRowIndex(object55, 10); + final var object56 = new javafx.scene.control.ScrollBar(); + controller.scrollBarH = object56; + javafx.scene.layout.GridPane.setColumnIndex(object56, 1); + javafx.scene.layout.GridPane.setRowIndex(object56, 10); + final var object57 = new javafx.scene.control.ScrollBar(); + controller.scrollBarV = object57; + object57.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object57, 11); + final var object58 = new javafx.scene.control.Separator(); + controller.separatorH = object58; + object58.setOnDragDetected(controller::dragDetected); + object58.setOnDragDone(controller::dragDone); + object58.setOnDragDropped(controller::dragDropped); + object58.setOnDragEntered(controller::dragEntered); + object58.setOnDragExited(controller::dragExited); + object58.setOnDragOver(controller::dragOver); + object58.setOnMouseDragEntered(controller::mouseDragEntered); + object58.setOnMouseDragExited(controller::mouseDragExited); + object58.setOnMouseDragOver(controller::mouseDragOver); + object58.setOnMouseDragReleased(controller::mouseDragReleased); + object58.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object58, 1); + javafx.scene.layout.GridPane.setRowIndex(object58, 11); + final var object59 = new javafx.scene.control.Separator(); + controller.separatorV = object59; + object59.setOrientation(javafx.geometry.Orientation.VERTICAL); + object59.setPrefHeight(200.0); + javafx.scene.layout.GridPane.setRowIndex(object59, 12); + final var object60 = new javafx.scene.control.Slider(); + controller.sliderH = object60; + object60.setOnContextMenuRequested(controller::contextMenuRequested); + object60.setOnMouseClicked(e -> controller.mouseClicked()); + object60.setOnMouseDragged(controller::mouseDragged); + object60.setOnMouseEntered(controller::mouseEntered); + object60.setOnMouseExited(controller::mouseExited); + object60.setOnMouseMoved(controller::mouseMoved); + object60.setOnMousePressed(controller::mousePressed); + object60.setOnMouseReleased(controller::mouseReleased); + object60.setOnScroll(controller::onScroll); + object60.setOnScrollFinished(controller::onScrollFinished); + object60.setOnScrollStarted(controller::onScrollStarted); + javafx.scene.layout.GridPane.setColumnIndex(object60, 1); + javafx.scene.layout.GridPane.setRowIndex(object60, 12); + final var object61 = new javafx.scene.control.Slider(); + controller.sliderV = object61; + object61.setOnZoom(controller::onZoom); + object61.setOnZoomFinished(controller::onZoomFinished); + object61.setOnZoomStarted(controller::onZoomStarted); + object61.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object61, 13); + final var object62 = new javafx.scene.control.Spinner(); + controller.spinner = object62; + javafx.scene.layout.GridPane.setColumnIndex(object62, 1); + javafx.scene.layout.GridPane.setRowIndex(object62, 13); + final var object63 = new javafx.scene.control.SplitMenuButton(); + controller.splitMenuButton = object63; + object63.setMnemonicParsing(false); + object63.setText("SplitMenuButton"); + javafx.scene.layout.GridPane.setRowIndex(object63, 14); + final var object64 = new javafx.scene.control.MenuItem(); + controller.item1 = object64; + object64.setMnemonicParsing(false); + object64.setText("Action 1"); + final var object65 = new javafx.scene.control.MenuItem(); + controller.item2 = object65; + object65.setMnemonicParsing(false); + object65.setText("Action 2"); + object63.getItems().addAll(object64, object65); + final var object66 = new javafx.scene.control.TableView(); + controller.tableView = object66; + object66.setPrefHeight(200.0); + object66.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object66, 1); + javafx.scene.layout.GridPane.setRowIndex(object66, 14); + final var object67 = new javafx.scene.control.TableColumn(); + controller.tableColumn1 = object67; + object67.setPrefWidth(75.0); + object67.setText("C1"); + final var object68 = new javafx.scene.control.TableColumn(); + controller.tableColumn2 = object68; + object68.setPrefWidth(75.0); + object68.setText("C2"); + object66.getColumns().addAll(object67, object68); + final var object69 = new javafx.scene.control.TextArea(); + controller.textArea = object69; + object69.setPrefHeight(200.0); + object69.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object69, 15); + final var object70 = new javafx.scene.control.TextField(); + controller.textField = object70; + javafx.scene.layout.GridPane.setColumnIndex(object70, 1); + javafx.scene.layout.GridPane.setRowIndex(object70, 15); + final var object71 = new javafx.scene.control.ToggleButton(); + object71.setMnemonicParsing(false); + object71.setOnAction(controller::onAction); + object71.setOnRotate(controller::onRotate); + object71.setOnRotationFinished(controller::onRotationFinished); + object71.setOnRotationStarted(controller::onRotationStarted); + object71.setText("ToggleButton"); + javafx.scene.layout.GridPane.setRowIndex(object71, 16); + final var object72 = new javafx.scene.control.TreeTableView>(); + controller.treeTableView = object72; + object72.setPrefHeight(200.0); + object72.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object72, 1); + javafx.scene.layout.GridPane.setRowIndex(object72, 16); + final var object73 = new javafx.scene.control.TreeTableColumn, String>(); + controller.treeTableColumn1 = object73; + object73.setOnEditCancel(controller::onEditCancel); + object73.setOnEditCommit(controller::onEditCommit); + object73.setOnEditStart(controller::onEditStart); + object73.setPrefWidth(75.0); + object73.setText("C1"); + final var object74 = new javafx.scene.control.TreeTableColumn, Integer>(); + controller.treeTableColumn2 = object74; + object74.setPrefWidth(75.0); + object74.setSortType(javafx.scene.control.TreeTableColumn.SortType.DESCENDING); + object74.setText("C2"); + object72.getColumns().addAll(object73, object74); + final var object75 = new javafx.scene.control.TreeView(); + controller.treeView = object75; + object75.setOnSwipeDown(controller::onSwipeDown); + object75.setOnSwipeLeft(controller::onSwipeLeft); + object75.setOnSwipeRight(controller::onSwipeRight); + object75.setOnSwipeUp(controller::onSwipeUp); + object75.setPrefHeight(200.0); + object75.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object75, 17); + final var object76 = new javafx.scene.web.WebView(); + controller.webView = object76; + object76.setOnTouchMoved(controller::onTouchMoved); + object76.setOnTouchPressed(controller::onTouchPressed); + object76.setOnTouchReleased(controller::onTouchReleased); + object76.setOnTouchStationary(controller::onTouchStationary); + object76.setPrefHeight(200.0); + object76.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object76, 1); + javafx.scene.layout.GridPane.setRowIndex(object76, 17); + object0.getChildren().addAll(object22, object23, object24, object25, object28, object31, object32, object33, object34, object35, object36, object37, object38, object45, object49, object51, object52, object53, object55, object56, object57, object58, object59, object60, object61, object62, object63, object66, object69, object70, object71, object72, object75, object76); + controller.initialize(); + loaded = true; + return object0; +} + + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.ControlsController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-assign-reference-getter.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-assign-reference-getter.txt new file mode 100644 index 0000000..81b8de3 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-assign-reference-getter.txt @@ -0,0 +1,424 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; + + +/** + * Generated code, not thread-safe + */ +public final class ControlsController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.ControlsController controller; + + /** + * Instantiates a new ControlsController with no nested controllers and no resource bundle + * @param controller The controller + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of()); + } + + /** + * Instantiates a new ControlsController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, resourceBundle)); + } + + /** + * Instantiates a new ControlsController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public ControlsController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + controller = (com.github.gtache.fxml.compiler.impl.ControlsController) controllersMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + final var object0 = new javafx.scene.layout.GridPane(); + controller.gridPane = object0; + object0.setOnInputMethodTextChanged(controller::inputMethodTextChanged); + object0.setOnKeyPressed(e -> controller.keyPressed()); + object0.setOnKeyReleased(controller::keyReleased); + object0.setOnKeyTyped(controller::keyTyped); + final var object1 = new javafx.scene.layout.RowConstraints(); + final var object2 = new javafx.scene.layout.RowConstraints(); + final var object3 = new javafx.scene.layout.RowConstraints(); + final var object4 = new javafx.scene.layout.RowConstraints(); + final var object5 = new javafx.scene.layout.RowConstraints(); + final var object6 = new javafx.scene.layout.RowConstraints(); + final var object7 = new javafx.scene.layout.RowConstraints(); + final var object8 = new javafx.scene.layout.RowConstraints(); + final var object9 = new javafx.scene.layout.RowConstraints(); + final var object10 = new javafx.scene.layout.RowConstraints(); + final var object11 = new javafx.scene.layout.RowConstraints(); + final var object12 = new javafx.scene.layout.RowConstraints(); + final var object13 = new javafx.scene.layout.RowConstraints(); + final var object14 = new javafx.scene.layout.RowConstraints(); + final var object15 = new javafx.scene.layout.RowConstraints(); + final var object16 = new javafx.scene.layout.RowConstraints(); + final var object17 = new javafx.scene.layout.RowConstraints(); + final var object18 = new javafx.scene.layout.RowConstraints(); + object0.getRowConstraints().addAll(object1, object2, object3, object4, object5, object6, object7, object8, object9, object10, object11, object12, object13, object14, object15, object16, object17, object18); + final var object19 = new javafx.scene.layout.ColumnConstraints(); + final var object20 = new javafx.scene.layout.ColumnConstraints(); + final var object21 = new javafx.scene.layout.ColumnConstraints(); + object21.setMinWidth(10.0); + object21.setPrefWidth(100.0); + object0.getColumnConstraints().addAll(object19, object20, object21); + final var object22 = new javafx.scene.control.Button(); + controller.button = object22; + object22.setMnemonicParsing(false); + object22.setText("Button"); + final var object23 = new javafx.scene.control.CheckBox(); + controller.checkBox = object23; + object23.setIndeterminate(true); + object23.setMnemonicParsing(false); + object23.setText("CheckBox"); + javafx.scene.layout.GridPane.setColumnIndex(object23, 1); + final var object24 = new javafx.scene.control.ChoiceBox(); + controller.choiceBox = object24; + object24.setCacheShape(false); + object24.setCenterShape(false); + object24.setDisable(true); + object24.setFocusTraversable(false); + object24.setPrefWidth(150.0); + object24.setScaleShape(false); + object24.setVisible(false); + javafx.scene.layout.GridPane.setRowIndex(object24, 1); + final var object25 = new javafx.scene.control.ColorPicker(); + controller.colorPicker = object25; + object25.setNodeOrientation(javafx.geometry.NodeOrientation.LEFT_TO_RIGHT); + object25.setOpacity(0.5); + javafx.scene.layout.GridPane.setColumnIndex(object25, 1); + javafx.scene.layout.GridPane.setRowIndex(object25, 1); + final var object26 = new javafx.scene.paint.Color(0.7894737124443054, 0.08771929889917374, 0.08771929889917374, 1); + controller.color = object26; + object25.setValue(object26); + final var object27 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object25.setOpaqueInsets(object27); + final var object28 = new javafx.scene.control.ComboBox(); + controller.comboBox = object28; + object28.setEditable(true); + object28.setPrefWidth(150.0); + object28.setPromptText("Text"); + object28.setVisibleRowCount(5); + javafx.scene.layout.GridPane.setRowIndex(object28, 2); + final var object29 = javafx.scene.Cursor.CLOSED_HAND; + object28.setCursor(object29); + final var object30 = new javafx.scene.effect.Bloom(); + object28.setEffect(object30); + final var object31 = new javafx.scene.control.DatePicker(); + controller.datePicker = object31; + object31.setShowWeekNumbers(true); + object31.setStyle("-fx-background-color: #ffffff;"); + javafx.scene.layout.GridPane.setColumnIndex(object31, 1); + javafx.scene.layout.GridPane.setRowIndex(object31, 2); + final var object32 = new javafx.scene.web.HTMLEditor(); + controller.htmlEditor = object32; + object32.setHtmlText(""); + object32.setPrefHeight(200.0); + object32.setPrefWidth(506.0); + object32.getStyleClass().addAll("clazz"); + object32.getStylesheets().addAll("@style.css"); + javafx.scene.layout.GridPane.setRowIndex(object32, 3); + final var object33 = new javafx.scene.control.Hyperlink(); + controller.hyperlink = object33; + object33.setText("Hyperlink"); + javafx.scene.layout.GridPane.setColumnIndex(object33, 1); + javafx.scene.layout.GridPane.setRowIndex(object33, 3); + final var object34 = new javafx.scene.image.ImageView(); + controller.imageView = object34; + object34.setFitHeight(150.0); + object34.setFitWidth(200.0); + object34.setPickOnBounds(true); + object34.setPreserveRatio(true); + javafx.scene.layout.GridPane.setRowIndex(object34, 4); + final var object35 = new javafx.scene.control.Label(); + controller.label = object35; + object35.setAccessibleHelp("TTTTT"); + object35.setAccessibleText("TTT"); + object35.setBlendMode(javafx.scene.effect.BlendMode.ADD); + object35.setCache(true); + object35.setCacheHint(javafx.scene.CacheHint.QUALITY); + object35.setDepthTest(javafx.scene.DepthTest.ENABLE); + object35.setMnemonicParsing(true); + object35.setMouseTransparent(true); + object35.setText(controller.resources().getString("include.label")); + javafx.scene.layout.GridPane.setColumnIndex(object35, 1); + javafx.scene.layout.GridPane.setRowIndex(object35, 4); + final var object36 = new javafx.scene.control.ListView(); + controller.listView = object36; + object36.setFixedCellSize(20.0); + object36.setNodeOrientation(javafx.geometry.NodeOrientation.RIGHT_TO_LEFT); + object36.setOrientation(javafx.geometry.Orientation.HORIZONTAL); + object36.setPrefHeight(200.0); + object36.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object36, 5); + final var object37 = new javafx.scene.media.MediaView(); + controller.mediaView = object37; + object37.setFitHeight(200.0); + object37.setFitWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object37, 1); + javafx.scene.layout.GridPane.setColumnSpan(object37, 2); + javafx.scene.layout.GridPane.setRowIndex(object37, 5); + javafx.scene.layout.GridPane.setRowSpan(object37, 2); + final var object38 = new javafx.scene.control.MenuBar(); + controller.menuBar = object38; + javafx.scene.layout.GridPane.setHalignment(object38, javafx.geometry.HPos.RIGHT); + javafx.scene.layout.GridPane.setHgrow(object38, javafx.scene.layout.Priority.ALWAYS); + javafx.scene.layout.GridPane.setRowIndex(object38, 7); + javafx.scene.layout.GridPane.setValignment(object38, javafx.geometry.VPos.BASELINE); + javafx.scene.layout.GridPane.setVgrow(object38, javafx.scene.layout.Priority.SOMETIMES); + final var object39 = new javafx.scene.control.Menu(); + controller.menu1 = object39; + object39.setMnemonicParsing(false); + object39.setText("File"); + final var object40 = new javafx.scene.control.MenuItem(); + controller.menuItem1 = object40; + object40.setMnemonicParsing(false); + object40.setText("Close"); + object39.getItems().addAll(object40); + final var object41 = new javafx.scene.control.Menu(); + object41.setMnemonicParsing(false); + object41.setText("Edit"); + final var object42 = new javafx.scene.control.MenuItem(); + object42.setMnemonicParsing(false); + object42.setText("Delete"); + object41.getItems().addAll(object42); + final var object43 = new javafx.scene.control.Menu(); + object43.setMnemonicParsing(false); + object43.setText("Help"); + final var object44 = new javafx.scene.control.MenuItem(); + object44.setMnemonicParsing(false); + object44.setText("About"); + object43.getItems().addAll(object44); + object38.getMenus().addAll(object39, object41, object43); + final var object45 = new javafx.scene.control.MenuButton(); + controller.menuButton = object45; + object45.setMnemonicParsing(false); + object45.setText("MenuButton"); + javafx.scene.layout.GridPane.setColumnIndex(object45, 1); + javafx.scene.layout.GridPane.setRowIndex(object45, 7); + final var object46 = new javafx.scene.control.MenuItem(); + object46.setMnemonicParsing(false); + object46.setText("Action 1"); + final var object47 = new javafx.scene.control.MenuItem(); + object47.setMnemonicParsing(false); + object47.setText("Action 2"); + object45.getItems().addAll(object46, object47); + final var object48 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + javafx.scene.layout.GridPane.setMargin(object45, object48); + final var object49 = new javafx.scene.control.Pagination(); + controller.pagination = object49; + object49.setPrefHeight(200.0); + object49.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object49, 8); + final var object50 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object49.setPadding(object50); + final var object51 = new javafx.scene.control.PasswordField(); + controller.passwordField = object51; + object51.setMaxHeight(6.0); + object51.setMaxWidth(5.0); + object51.setMinHeight(2.0); + object51.setMinWidth(1.0); + object51.setPrefColumnCount(7); + object51.setPrefHeight(4.0); + object51.setPrefWidth(3.0); + javafx.scene.layout.GridPane.setColumnIndex(object51, 1); + javafx.scene.layout.GridPane.setRowIndex(object51, 8); + final var object52 = new javafx.scene.control.ProgressBar(); + controller.progressBar = object52; + object52.setLayoutX(10.0); + object52.setLayoutY(20.0); + object52.setPrefWidth(200.0); + object52.setProgress(0.0); + javafx.scene.layout.GridPane.setRowIndex(object52, 9); + final var object53 = new javafx.scene.control.ProgressIndicator(); + controller.progressIndicator = object53; + object53.setProgress(0.0); + object53.setRotate(2.0); + javafx.scene.layout.GridPane.setColumnIndex(object53, 1); + javafx.scene.layout.GridPane.setRowIndex(object53, 9); + final var object54 = new javafx.geometry.Point3D(4.0, 5.0, 6.0); + object53.setRotationAxis(object54); + final var object55 = new javafx.scene.control.RadioButton(); + controller.radioButton = object55; + object55.setMnemonicParsing(false); + object55.setScaleX(7.0); + object55.setScaleY(2.0); + object55.setScaleZ(3.0); + object55.setText("RadioButton"); + object55.setTranslateX(4.0); + object55.setTranslateY(5.0); + object55.setTranslateZ(6.0); + javafx.scene.layout.GridPane.setRowIndex(object55, 10); + final var object56 = new javafx.scene.control.ScrollBar(); + controller.scrollBarH = object56; + javafx.scene.layout.GridPane.setColumnIndex(object56, 1); + javafx.scene.layout.GridPane.setRowIndex(object56, 10); + final var object57 = new javafx.scene.control.ScrollBar(); + controller.scrollBarV = object57; + object57.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object57, 11); + final var object58 = new javafx.scene.control.Separator(); + controller.separatorH = object58; + object58.setOnDragDetected(controller::dragDetected); + object58.setOnDragDone(controller::dragDone); + object58.setOnDragDropped(controller::dragDropped); + object58.setOnDragEntered(controller::dragEntered); + object58.setOnDragExited(controller::dragExited); + object58.setOnDragOver(controller::dragOver); + object58.setOnMouseDragEntered(controller::mouseDragEntered); + object58.setOnMouseDragExited(controller::mouseDragExited); + object58.setOnMouseDragOver(controller::mouseDragOver); + object58.setOnMouseDragReleased(controller::mouseDragReleased); + object58.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object58, 1); + javafx.scene.layout.GridPane.setRowIndex(object58, 11); + final var object59 = new javafx.scene.control.Separator(); + controller.separatorV = object59; + object59.setOrientation(javafx.geometry.Orientation.VERTICAL); + object59.setPrefHeight(200.0); + javafx.scene.layout.GridPane.setRowIndex(object59, 12); + final var object60 = new javafx.scene.control.Slider(); + controller.sliderH = object60; + object60.setOnContextMenuRequested(controller::contextMenuRequested); + object60.setOnMouseClicked(e -> controller.mouseClicked()); + object60.setOnMouseDragged(controller::mouseDragged); + object60.setOnMouseEntered(controller::mouseEntered); + object60.setOnMouseExited(controller::mouseExited); + object60.setOnMouseMoved(controller::mouseMoved); + object60.setOnMousePressed(controller::mousePressed); + object60.setOnMouseReleased(controller::mouseReleased); + object60.setOnScroll(controller::onScroll); + object60.setOnScrollFinished(controller::onScrollFinished); + object60.setOnScrollStarted(controller::onScrollStarted); + javafx.scene.layout.GridPane.setColumnIndex(object60, 1); + javafx.scene.layout.GridPane.setRowIndex(object60, 12); + final var object61 = new javafx.scene.control.Slider(); + controller.sliderV = object61; + object61.setOnZoom(controller::onZoom); + object61.setOnZoomFinished(controller::onZoomFinished); + object61.setOnZoomStarted(controller::onZoomStarted); + object61.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object61, 13); + final var object62 = new javafx.scene.control.Spinner(); + controller.spinner = object62; + javafx.scene.layout.GridPane.setColumnIndex(object62, 1); + javafx.scene.layout.GridPane.setRowIndex(object62, 13); + final var object63 = new javafx.scene.control.SplitMenuButton(); + controller.splitMenuButton = object63; + object63.setMnemonicParsing(false); + object63.setText("SplitMenuButton"); + javafx.scene.layout.GridPane.setRowIndex(object63, 14); + final var object64 = new javafx.scene.control.MenuItem(); + controller.item1 = object64; + object64.setMnemonicParsing(false); + object64.setText("Action 1"); + final var object65 = new javafx.scene.control.MenuItem(); + controller.item2 = object65; + object65.setMnemonicParsing(false); + object65.setText("Action 2"); + object63.getItems().addAll(object64, object65); + final var object66 = new javafx.scene.control.TableView(); + controller.tableView = object66; + object66.setPrefHeight(200.0); + object66.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object66, 1); + javafx.scene.layout.GridPane.setRowIndex(object66, 14); + final var object67 = new javafx.scene.control.TableColumn(); + controller.tableColumn1 = object67; + object67.setPrefWidth(75.0); + object67.setText("C1"); + final var object68 = new javafx.scene.control.TableColumn(); + controller.tableColumn2 = object68; + object68.setPrefWidth(75.0); + object68.setText("C2"); + object66.getColumns().addAll(object67, object68); + final var object69 = new javafx.scene.control.TextArea(); + controller.textArea = object69; + object69.setPrefHeight(200.0); + object69.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object69, 15); + final var object70 = new javafx.scene.control.TextField(); + controller.textField = object70; + javafx.scene.layout.GridPane.setColumnIndex(object70, 1); + javafx.scene.layout.GridPane.setRowIndex(object70, 15); + final var object71 = new javafx.scene.control.ToggleButton(); + object71.setMnemonicParsing(false); + object71.setOnAction(controller::onAction); + object71.setOnRotate(controller::onRotate); + object71.setOnRotationFinished(controller::onRotationFinished); + object71.setOnRotationStarted(controller::onRotationStarted); + object71.setText("ToggleButton"); + javafx.scene.layout.GridPane.setRowIndex(object71, 16); + final var object72 = new javafx.scene.control.TreeTableView>(); + controller.treeTableView = object72; + object72.setPrefHeight(200.0); + object72.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object72, 1); + javafx.scene.layout.GridPane.setRowIndex(object72, 16); + final var object73 = new javafx.scene.control.TreeTableColumn, String>(); + controller.treeTableColumn1 = object73; + object73.setOnEditCancel(controller::onEditCancel); + object73.setOnEditCommit(controller::onEditCommit); + object73.setOnEditStart(controller::onEditStart); + object73.setPrefWidth(75.0); + object73.setText("C1"); + final var object74 = new javafx.scene.control.TreeTableColumn, Integer>(); + controller.treeTableColumn2 = object74; + object74.setPrefWidth(75.0); + object74.setSortType(javafx.scene.control.TreeTableColumn.SortType.DESCENDING); + object74.setText("C2"); + object72.getColumns().addAll(object73, object74); + final var object75 = new javafx.scene.control.TreeView(); + controller.treeView = object75; + object75.setOnSwipeDown(controller::onSwipeDown); + object75.setOnSwipeLeft(controller::onSwipeLeft); + object75.setOnSwipeRight(controller::onSwipeRight); + object75.setOnSwipeUp(controller::onSwipeUp); + object75.setPrefHeight(200.0); + object75.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object75, 17); + final var object76 = new javafx.scene.web.WebView(); + controller.webView = object76; + object76.setOnTouchMoved(controller::onTouchMoved); + object76.setOnTouchPressed(controller::onTouchPressed); + object76.setOnTouchReleased(controller::onTouchReleased); + object76.setOnTouchStationary(controller::onTouchStationary); + object76.setPrefHeight(200.0); + object76.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object76, 1); + javafx.scene.layout.GridPane.setRowIndex(object76, 17); + object0.getChildren().addAll(object22, object23, object24, object25, object28, object31, object32, object33, object34, object35, object36, object37, object38, object45, object49, object51, object52, object53, object55, object56, object57, object58, object59, object60, object61, object62, object63, object66, object69, object70, object71, object72, object75, object76); + controller.initialize(); + loaded = true; + return object0; +} + + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.ControlsController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-assign-reflection-constructor.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-assign-reflection-constructor.txt new file mode 100644 index 0000000..1d21add --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-assign-reflection-constructor.txt @@ -0,0 +1,469 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import javafx.event.Event; +import java.lang.reflect.Method; + + +/** + * Generated code, not thread-safe + */ +public final class ControlsController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.ControlsController controller; + + /** + * Instantiates a new ControlsController with no nested controllers and no resource bundle + * @param controller The controller + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of()); + } + + /** + * Instantiates a new ControlsController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, resourceBundle)); + } + + /** + * Instantiates a new ControlsController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public ControlsController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = resourceBundlesMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + controller = (com.github.gtache.fxml.compiler.impl.ControlsController) controllersMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + final var object0 = new javafx.scene.layout.GridPane(); + controller.gridPane = object0; + object0.setOnInputMethodTextChanged(e -> callMethod("inputMethodTextChanged", e)); + object0.setOnKeyPressed(e -> callMethod("keyPressed", e)); + object0.setOnKeyReleased(e -> callMethod("keyReleased", e)); + object0.setOnKeyTyped(e -> callMethod("keyTyped", e)); + final var object1 = new javafx.scene.layout.RowConstraints(); + final var object2 = new javafx.scene.layout.RowConstraints(); + final var object3 = new javafx.scene.layout.RowConstraints(); + final var object4 = new javafx.scene.layout.RowConstraints(); + final var object5 = new javafx.scene.layout.RowConstraints(); + final var object6 = new javafx.scene.layout.RowConstraints(); + final var object7 = new javafx.scene.layout.RowConstraints(); + final var object8 = new javafx.scene.layout.RowConstraints(); + final var object9 = new javafx.scene.layout.RowConstraints(); + final var object10 = new javafx.scene.layout.RowConstraints(); + final var object11 = new javafx.scene.layout.RowConstraints(); + final var object12 = new javafx.scene.layout.RowConstraints(); + final var object13 = new javafx.scene.layout.RowConstraints(); + final var object14 = new javafx.scene.layout.RowConstraints(); + final var object15 = new javafx.scene.layout.RowConstraints(); + final var object16 = new javafx.scene.layout.RowConstraints(); + final var object17 = new javafx.scene.layout.RowConstraints(); + final var object18 = new javafx.scene.layout.RowConstraints(); + object0.getRowConstraints().addAll(object1, object2, object3, object4, object5, object6, object7, object8, object9, object10, object11, object12, object13, object14, object15, object16, object17, object18); + final var object19 = new javafx.scene.layout.ColumnConstraints(); + final var object20 = new javafx.scene.layout.ColumnConstraints(); + final var object21 = new javafx.scene.layout.ColumnConstraints(); + object21.setMinWidth(10.0); + object21.setPrefWidth(100.0); + object0.getColumnConstraints().addAll(object19, object20, object21); + final var object22 = new javafx.scene.control.Button(); + controller.button = object22; + object22.setMnemonicParsing(false); + object22.setText("Button"); + final var object23 = new javafx.scene.control.CheckBox(); + controller.checkBox = object23; + object23.setIndeterminate(true); + object23.setMnemonicParsing(false); + object23.setText("CheckBox"); + javafx.scene.layout.GridPane.setColumnIndex(object23, 1); + final var object24 = new javafx.scene.control.ChoiceBox(); + controller.choiceBox = object24; + object24.setCacheShape(false); + object24.setCenterShape(false); + object24.setDisable(true); + object24.setFocusTraversable(false); + object24.setPrefWidth(150.0); + object24.setScaleShape(false); + object24.setVisible(false); + javafx.scene.layout.GridPane.setRowIndex(object24, 1); + final var object25 = new javafx.scene.control.ColorPicker(); + controller.colorPicker = object25; + object25.setNodeOrientation(javafx.geometry.NodeOrientation.LEFT_TO_RIGHT); + object25.setOpacity(0.5); + javafx.scene.layout.GridPane.setColumnIndex(object25, 1); + javafx.scene.layout.GridPane.setRowIndex(object25, 1); + final var object26 = new javafx.scene.paint.Color(0.7894737124443054, 0.08771929889917374, 0.08771929889917374, 1); + controller.color = object26; + object25.setValue(object26); + final var object27 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object25.setOpaqueInsets(object27); + final var object28 = new javafx.scene.control.ComboBox(); + controller.comboBox = object28; + object28.setEditable(true); + object28.setPrefWidth(150.0); + object28.setPromptText("Text"); + object28.setVisibleRowCount(5); + javafx.scene.layout.GridPane.setRowIndex(object28, 2); + final var object29 = javafx.scene.Cursor.CLOSED_HAND; + object28.setCursor(object29); + final var object30 = new javafx.scene.effect.Bloom(); + object28.setEffect(object30); + final var object31 = new javafx.scene.control.DatePicker(); + controller.datePicker = object31; + object31.setShowWeekNumbers(true); + object31.setStyle("-fx-background-color: #ffffff;"); + javafx.scene.layout.GridPane.setColumnIndex(object31, 1); + javafx.scene.layout.GridPane.setRowIndex(object31, 2); + final var object32 = new javafx.scene.web.HTMLEditor(); + controller.htmlEditor = object32; + object32.setHtmlText(""); + object32.setPrefHeight(200.0); + object32.setPrefWidth(506.0); + object32.getStyleClass().addAll("clazz"); + object32.getStylesheets().addAll("@style.css"); + javafx.scene.layout.GridPane.setRowIndex(object32, 3); + final var object33 = new javafx.scene.control.Hyperlink(); + controller.hyperlink = object33; + object33.setText("Hyperlink"); + javafx.scene.layout.GridPane.setColumnIndex(object33, 1); + javafx.scene.layout.GridPane.setRowIndex(object33, 3); + final var object34 = new javafx.scene.image.ImageView(); + controller.imageView = object34; + object34.setFitHeight(150.0); + object34.setFitWidth(200.0); + object34.setPickOnBounds(true); + object34.setPreserveRatio(true); + javafx.scene.layout.GridPane.setRowIndex(object34, 4); + final var object35 = new javafx.scene.control.Label(); + controller.label = object35; + object35.setAccessibleHelp("TTTTT"); + object35.setAccessibleText("TTT"); + object35.setBlendMode(javafx.scene.effect.BlendMode.ADD); + object35.setCache(true); + object35.setCacheHint(javafx.scene.CacheHint.QUALITY); + object35.setDepthTest(javafx.scene.DepthTest.ENABLE); + object35.setMnemonicParsing(true); + object35.setMouseTransparent(true); + object35.setText(bundle.getString("include.label")); + javafx.scene.layout.GridPane.setColumnIndex(object35, 1); + javafx.scene.layout.GridPane.setRowIndex(object35, 4); + final var object36 = new javafx.scene.control.ListView(); + controller.listView = object36; + object36.setFixedCellSize(20.0); + object36.setNodeOrientation(javafx.geometry.NodeOrientation.RIGHT_TO_LEFT); + object36.setOrientation(javafx.geometry.Orientation.HORIZONTAL); + object36.setPrefHeight(200.0); + object36.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object36, 5); + final var object37 = new javafx.scene.media.MediaView(); + controller.mediaView = object37; + object37.setFitHeight(200.0); + object37.setFitWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object37, 1); + javafx.scene.layout.GridPane.setColumnSpan(object37, 2); + javafx.scene.layout.GridPane.setRowIndex(object37, 5); + javafx.scene.layout.GridPane.setRowSpan(object37, 2); + final var object38 = new javafx.scene.control.MenuBar(); + controller.menuBar = object38; + javafx.scene.layout.GridPane.setHalignment(object38, javafx.geometry.HPos.RIGHT); + javafx.scene.layout.GridPane.setHgrow(object38, javafx.scene.layout.Priority.ALWAYS); + javafx.scene.layout.GridPane.setRowIndex(object38, 7); + javafx.scene.layout.GridPane.setValignment(object38, javafx.geometry.VPos.BASELINE); + javafx.scene.layout.GridPane.setVgrow(object38, javafx.scene.layout.Priority.SOMETIMES); + final var object39 = new javafx.scene.control.Menu(); + controller.menu1 = object39; + object39.setMnemonicParsing(false); + object39.setText("File"); + final var object40 = new javafx.scene.control.MenuItem(); + controller.menuItem1 = object40; + object40.setMnemonicParsing(false); + object40.setText("Close"); + object39.getItems().addAll(object40); + final var object41 = new javafx.scene.control.Menu(); + object41.setMnemonicParsing(false); + object41.setText("Edit"); + final var object42 = new javafx.scene.control.MenuItem(); + object42.setMnemonicParsing(false); + object42.setText("Delete"); + object41.getItems().addAll(object42); + final var object43 = new javafx.scene.control.Menu(); + object43.setMnemonicParsing(false); + object43.setText("Help"); + final var object44 = new javafx.scene.control.MenuItem(); + object44.setMnemonicParsing(false); + object44.setText("About"); + object43.getItems().addAll(object44); + object38.getMenus().addAll(object39, object41, object43); + final var object45 = new javafx.scene.control.MenuButton(); + controller.menuButton = object45; + object45.setMnemonicParsing(false); + object45.setText("MenuButton"); + javafx.scene.layout.GridPane.setColumnIndex(object45, 1); + javafx.scene.layout.GridPane.setRowIndex(object45, 7); + final var object46 = new javafx.scene.control.MenuItem(); + object46.setMnemonicParsing(false); + object46.setText("Action 1"); + final var object47 = new javafx.scene.control.MenuItem(); + object47.setMnemonicParsing(false); + object47.setText("Action 2"); + object45.getItems().addAll(object46, object47); + final var object48 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + javafx.scene.layout.GridPane.setMargin(object45, object48); + final var object49 = new javafx.scene.control.Pagination(); + controller.pagination = object49; + object49.setPrefHeight(200.0); + object49.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object49, 8); + final var object50 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object49.setPadding(object50); + final var object51 = new javafx.scene.control.PasswordField(); + controller.passwordField = object51; + object51.setMaxHeight(6.0); + object51.setMaxWidth(5.0); + object51.setMinHeight(2.0); + object51.setMinWidth(1.0); + object51.setPrefColumnCount(7); + object51.setPrefHeight(4.0); + object51.setPrefWidth(3.0); + javafx.scene.layout.GridPane.setColumnIndex(object51, 1); + javafx.scene.layout.GridPane.setRowIndex(object51, 8); + final var object52 = new javafx.scene.control.ProgressBar(); + controller.progressBar = object52; + object52.setLayoutX(10.0); + object52.setLayoutY(20.0); + object52.setPrefWidth(200.0); + object52.setProgress(0.0); + javafx.scene.layout.GridPane.setRowIndex(object52, 9); + final var object53 = new javafx.scene.control.ProgressIndicator(); + controller.progressIndicator = object53; + object53.setProgress(0.0); + object53.setRotate(2.0); + javafx.scene.layout.GridPane.setColumnIndex(object53, 1); + javafx.scene.layout.GridPane.setRowIndex(object53, 9); + final var object54 = new javafx.geometry.Point3D(4.0, 5.0, 6.0); + object53.setRotationAxis(object54); + final var object55 = new javafx.scene.control.RadioButton(); + controller.radioButton = object55; + object55.setMnemonicParsing(false); + object55.setScaleX(7.0); + object55.setScaleY(2.0); + object55.setScaleZ(3.0); + object55.setText("RadioButton"); + object55.setTranslateX(4.0); + object55.setTranslateY(5.0); + object55.setTranslateZ(6.0); + javafx.scene.layout.GridPane.setRowIndex(object55, 10); + final var object56 = new javafx.scene.control.ScrollBar(); + controller.scrollBarH = object56; + javafx.scene.layout.GridPane.setColumnIndex(object56, 1); + javafx.scene.layout.GridPane.setRowIndex(object56, 10); + final var object57 = new javafx.scene.control.ScrollBar(); + controller.scrollBarV = object57; + object57.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object57, 11); + final var object58 = new javafx.scene.control.Separator(); + controller.separatorH = object58; + object58.setOnDragDetected(e -> callMethod("dragDetected", e)); + object58.setOnDragDone(e -> callMethod("dragDone", e)); + object58.setOnDragDropped(e -> callMethod("dragDropped", e)); + object58.setOnDragEntered(e -> callMethod("dragEntered", e)); + object58.setOnDragExited(e -> callMethod("dragExited", e)); + object58.setOnDragOver(e -> callMethod("dragOver", e)); + object58.setOnMouseDragEntered(e -> callMethod("mouseDragEntered", e)); + object58.setOnMouseDragExited(e -> callMethod("mouseDragExited", e)); + object58.setOnMouseDragOver(e -> callMethod("mouseDragOver", e)); + object58.setOnMouseDragReleased(e -> callMethod("mouseDragReleased", e)); + object58.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object58, 1); + javafx.scene.layout.GridPane.setRowIndex(object58, 11); + final var object59 = new javafx.scene.control.Separator(); + controller.separatorV = object59; + object59.setOrientation(javafx.geometry.Orientation.VERTICAL); + object59.setPrefHeight(200.0); + javafx.scene.layout.GridPane.setRowIndex(object59, 12); + final var object60 = new javafx.scene.control.Slider(); + controller.sliderH = object60; + object60.setOnContextMenuRequested(e -> callMethod("contextMenuRequested", e)); + object60.setOnMouseClicked(e -> callMethod("mouseClicked", e)); + object60.setOnMouseDragged(e -> callMethod("mouseDragged", e)); + object60.setOnMouseEntered(e -> callMethod("mouseEntered", e)); + object60.setOnMouseExited(e -> callMethod("mouseExited", e)); + object60.setOnMouseMoved(e -> callMethod("mouseMoved", e)); + object60.setOnMousePressed(e -> callMethod("mousePressed", e)); + object60.setOnMouseReleased(e -> callMethod("mouseReleased", e)); + object60.setOnScroll(e -> callMethod("onScroll", e)); + object60.setOnScrollFinished(e -> callMethod("onScrollFinished", e)); + object60.setOnScrollStarted(e -> callMethod("onScrollStarted", e)); + javafx.scene.layout.GridPane.setColumnIndex(object60, 1); + javafx.scene.layout.GridPane.setRowIndex(object60, 12); + final var object61 = new javafx.scene.control.Slider(); + controller.sliderV = object61; + object61.setOnZoom(e -> callMethod("onZoom", e)); + object61.setOnZoomFinished(e -> callMethod("onZoomFinished", e)); + object61.setOnZoomStarted(e -> callMethod("onZoomStarted", e)); + object61.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object61, 13); + final var object62 = new javafx.scene.control.Spinner(); + controller.spinner = object62; + javafx.scene.layout.GridPane.setColumnIndex(object62, 1); + javafx.scene.layout.GridPane.setRowIndex(object62, 13); + final var object63 = new javafx.scene.control.SplitMenuButton(); + controller.splitMenuButton = object63; + object63.setMnemonicParsing(false); + object63.setText("SplitMenuButton"); + javafx.scene.layout.GridPane.setRowIndex(object63, 14); + final var object64 = new javafx.scene.control.MenuItem(); + controller.item1 = object64; + object64.setMnemonicParsing(false); + object64.setText("Action 1"); + final var object65 = new javafx.scene.control.MenuItem(); + controller.item2 = object65; + object65.setMnemonicParsing(false); + object65.setText("Action 2"); + object63.getItems().addAll(object64, object65); + final var object66 = new javafx.scene.control.TableView(); + controller.tableView = object66; + object66.setPrefHeight(200.0); + object66.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object66, 1); + javafx.scene.layout.GridPane.setRowIndex(object66, 14); + final var object67 = new javafx.scene.control.TableColumn(); + controller.tableColumn1 = object67; + object67.setPrefWidth(75.0); + object67.setText("C1"); + final var object68 = new javafx.scene.control.TableColumn(); + controller.tableColumn2 = object68; + object68.setPrefWidth(75.0); + object68.setText("C2"); + object66.getColumns().addAll(object67, object68); + final var object69 = new javafx.scene.control.TextArea(); + controller.textArea = object69; + object69.setPrefHeight(200.0); + object69.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object69, 15); + final var object70 = new javafx.scene.control.TextField(); + controller.textField = object70; + javafx.scene.layout.GridPane.setColumnIndex(object70, 1); + javafx.scene.layout.GridPane.setRowIndex(object70, 15); + final var object71 = new javafx.scene.control.ToggleButton(); + object71.setMnemonicParsing(false); + object71.setOnAction(e -> callMethod("onAction", e)); + object71.setOnRotate(e -> callMethod("onRotate", e)); + object71.setOnRotationFinished(e -> callMethod("onRotationFinished", e)); + object71.setOnRotationStarted(e -> callMethod("onRotationStarted", e)); + object71.setText("ToggleButton"); + javafx.scene.layout.GridPane.setRowIndex(object71, 16); + final var object72 = new javafx.scene.control.TreeTableView>(); + controller.treeTableView = object72; + object72.setPrefHeight(200.0); + object72.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object72, 1); + javafx.scene.layout.GridPane.setRowIndex(object72, 16); + final var object73 = new javafx.scene.control.TreeTableColumn, String>(); + controller.treeTableColumn1 = object73; + object73.setOnEditCancel(e -> callMethod("onEditCancel", e)); + object73.setOnEditCommit(e -> callMethod("onEditCommit", e)); + object73.setOnEditStart(e -> callMethod("onEditStart", e)); + object73.setPrefWidth(75.0); + object73.setText("C1"); + final var object74 = new javafx.scene.control.TreeTableColumn, Integer>(); + controller.treeTableColumn2 = object74; + object74.setPrefWidth(75.0); + object74.setSortType(javafx.scene.control.TreeTableColumn.SortType.DESCENDING); + object74.setText("C2"); + object72.getColumns().addAll(object73, object74); + final var object75 = new javafx.scene.control.TreeView(); + controller.treeView = object75; + object75.setOnSwipeDown(e -> callMethod("onSwipeDown", e)); + object75.setOnSwipeLeft(e -> callMethod("onSwipeLeft", e)); + object75.setOnSwipeRight(e -> callMethod("onSwipeRight", e)); + object75.setOnSwipeUp(e -> callMethod("onSwipeUp", e)); + object75.setPrefHeight(200.0); + object75.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object75, 17); + final var object76 = new javafx.scene.web.WebView(); + controller.webView = object76; + object76.setOnTouchMoved(e -> callMethod("onTouchMoved", e)); + object76.setOnTouchPressed(e -> callMethod("onTouchPressed", e)); + object76.setOnTouchReleased(e -> callMethod("onTouchReleased", e)); + object76.setOnTouchStationary(e -> callMethod("onTouchStationary", e)); + object76.setPrefHeight(200.0); + object76.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object76, 1); + javafx.scene.layout.GridPane.setRowIndex(object76, 17); + object0.getChildren().addAll(object22, object23, object24, object25, object28, object31, object32, object33, object34, object35, object36, object37, object38, object45, object49, object51, object52, object53, object55, object56, object57, object58, object59, object60, object61, object62, object63, object66, object69, object70, object71, object72, object75, object76); + try { + final var initialize = controller.getClass().getDeclaredMethod("initialize"); + initialize.setAccessible(true); + initialize.invoke(controller); + } catch (final InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection", e); + } catch (final NoSuchMethodException ignored) { + } + loaded = true; + return object0; +} + + private void callMethod(final String methodName, final T event) { + try { + final Method method; + final var methods = Arrays.stream(controller.getClass().getDeclaredMethods()) + .filter(m -> m.getName().equals(methodName)).toList(); + if (methods.size() > 1) { + final var eventMethods = methods.stream().filter(m -> + m.getParameterCount() == 1 && Event.class.isAssignableFrom(m.getParameterTypes()[0])).toList(); + if (eventMethods.size() == 1) { + method = eventMethods.getFirst(); + } else { + final var emptyMethods = methods.stream().filter(m -> m.getParameterCount() == 0).toList(); + if (emptyMethods.size() == 1) { + method = emptyMethods.getFirst(); + } else { + throw new IllegalArgumentException("Multiple matching methods for " + methodName); + } + } + } else if (methods.size() == 1) { + method = methods.getFirst(); + } else { + throw new IllegalArgumentException("No matching method for " + methodName); + } + method.setAccessible(true); + if (method.getParameterCount() == 0) { + method.invoke(controller); + } else { + method.invoke(controller, event); + } + } catch (final IllegalAccessException | InvocationTargetException ex) { + throw new RuntimeException("Error using reflection on " + methodName, ex); + } +} + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.ControlsController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-assign-reflection-getbundle.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-assign-reflection-getbundle.txt new file mode 100644 index 0000000..55a5da4 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-assign-reflection-getbundle.txt @@ -0,0 +1,469 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import javafx.event.Event; +import java.lang.reflect.Method; + + +/** + * Generated code, not thread-safe + */ +public final class ControlsController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.ControlsController controller; + + /** + * Instantiates a new ControlsController with no nested controllers and no resource bundle + * @param controller The controller + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of()); + } + + /** + * Instantiates a new ControlsController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, resourceBundle)); + } + + /** + * Instantiates a new ControlsController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public ControlsController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + controller = (com.github.gtache.fxml.compiler.impl.ControlsController) controllersMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + final var object0 = new javafx.scene.layout.GridPane(); + controller.gridPane = object0; + object0.setOnInputMethodTextChanged(e -> callMethod("inputMethodTextChanged", e)); + object0.setOnKeyPressed(e -> callMethod("keyPressed", e)); + object0.setOnKeyReleased(e -> callMethod("keyReleased", e)); + object0.setOnKeyTyped(e -> callMethod("keyTyped", e)); + final var object1 = new javafx.scene.layout.RowConstraints(); + final var object2 = new javafx.scene.layout.RowConstraints(); + final var object3 = new javafx.scene.layout.RowConstraints(); + final var object4 = new javafx.scene.layout.RowConstraints(); + final var object5 = new javafx.scene.layout.RowConstraints(); + final var object6 = new javafx.scene.layout.RowConstraints(); + final var object7 = new javafx.scene.layout.RowConstraints(); + final var object8 = new javafx.scene.layout.RowConstraints(); + final var object9 = new javafx.scene.layout.RowConstraints(); + final var object10 = new javafx.scene.layout.RowConstraints(); + final var object11 = new javafx.scene.layout.RowConstraints(); + final var object12 = new javafx.scene.layout.RowConstraints(); + final var object13 = new javafx.scene.layout.RowConstraints(); + final var object14 = new javafx.scene.layout.RowConstraints(); + final var object15 = new javafx.scene.layout.RowConstraints(); + final var object16 = new javafx.scene.layout.RowConstraints(); + final var object17 = new javafx.scene.layout.RowConstraints(); + final var object18 = new javafx.scene.layout.RowConstraints(); + object0.getRowConstraints().addAll(object1, object2, object3, object4, object5, object6, object7, object8, object9, object10, object11, object12, object13, object14, object15, object16, object17, object18); + final var object19 = new javafx.scene.layout.ColumnConstraints(); + final var object20 = new javafx.scene.layout.ColumnConstraints(); + final var object21 = new javafx.scene.layout.ColumnConstraints(); + object21.setMinWidth(10.0); + object21.setPrefWidth(100.0); + object0.getColumnConstraints().addAll(object19, object20, object21); + final var object22 = new javafx.scene.control.Button(); + controller.button = object22; + object22.setMnemonicParsing(false); + object22.setText("Button"); + final var object23 = new javafx.scene.control.CheckBox(); + controller.checkBox = object23; + object23.setIndeterminate(true); + object23.setMnemonicParsing(false); + object23.setText("CheckBox"); + javafx.scene.layout.GridPane.setColumnIndex(object23, 1); + final var object24 = new javafx.scene.control.ChoiceBox(); + controller.choiceBox = object24; + object24.setCacheShape(false); + object24.setCenterShape(false); + object24.setDisable(true); + object24.setFocusTraversable(false); + object24.setPrefWidth(150.0); + object24.setScaleShape(false); + object24.setVisible(false); + javafx.scene.layout.GridPane.setRowIndex(object24, 1); + final var object25 = new javafx.scene.control.ColorPicker(); + controller.colorPicker = object25; + object25.setNodeOrientation(javafx.geometry.NodeOrientation.LEFT_TO_RIGHT); + object25.setOpacity(0.5); + javafx.scene.layout.GridPane.setColumnIndex(object25, 1); + javafx.scene.layout.GridPane.setRowIndex(object25, 1); + final var object26 = new javafx.scene.paint.Color(0.7894737124443054, 0.08771929889917374, 0.08771929889917374, 1); + controller.color = object26; + object25.setValue(object26); + final var object27 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object25.setOpaqueInsets(object27); + final var object28 = new javafx.scene.control.ComboBox(); + controller.comboBox = object28; + object28.setEditable(true); + object28.setPrefWidth(150.0); + object28.setPromptText("Text"); + object28.setVisibleRowCount(5); + javafx.scene.layout.GridPane.setRowIndex(object28, 2); + final var object29 = javafx.scene.Cursor.CLOSED_HAND; + object28.setCursor(object29); + final var object30 = new javafx.scene.effect.Bloom(); + object28.setEffect(object30); + final var object31 = new javafx.scene.control.DatePicker(); + controller.datePicker = object31; + object31.setShowWeekNumbers(true); + object31.setStyle("-fx-background-color: #ffffff;"); + javafx.scene.layout.GridPane.setColumnIndex(object31, 1); + javafx.scene.layout.GridPane.setRowIndex(object31, 2); + final var object32 = new javafx.scene.web.HTMLEditor(); + controller.htmlEditor = object32; + object32.setHtmlText(""); + object32.setPrefHeight(200.0); + object32.setPrefWidth(506.0); + object32.getStyleClass().addAll("clazz"); + object32.getStylesheets().addAll("@style.css"); + javafx.scene.layout.GridPane.setRowIndex(object32, 3); + final var object33 = new javafx.scene.control.Hyperlink(); + controller.hyperlink = object33; + object33.setText("Hyperlink"); + javafx.scene.layout.GridPane.setColumnIndex(object33, 1); + javafx.scene.layout.GridPane.setRowIndex(object33, 3); + final var object34 = new javafx.scene.image.ImageView(); + controller.imageView = object34; + object34.setFitHeight(150.0); + object34.setFitWidth(200.0); + object34.setPickOnBounds(true); + object34.setPreserveRatio(true); + javafx.scene.layout.GridPane.setRowIndex(object34, 4); + final var object35 = new javafx.scene.control.Label(); + controller.label = object35; + object35.setAccessibleHelp("TTTTT"); + object35.setAccessibleText("TTT"); + object35.setBlendMode(javafx.scene.effect.BlendMode.ADD); + object35.setCache(true); + object35.setCacheHint(javafx.scene.CacheHint.QUALITY); + object35.setDepthTest(javafx.scene.DepthTest.ENABLE); + object35.setMnemonicParsing(true); + object35.setMouseTransparent(true); + object35.setText(bundle.getString("include.label")); + javafx.scene.layout.GridPane.setColumnIndex(object35, 1); + javafx.scene.layout.GridPane.setRowIndex(object35, 4); + final var object36 = new javafx.scene.control.ListView(); + controller.listView = object36; + object36.setFixedCellSize(20.0); + object36.setNodeOrientation(javafx.geometry.NodeOrientation.RIGHT_TO_LEFT); + object36.setOrientation(javafx.geometry.Orientation.HORIZONTAL); + object36.setPrefHeight(200.0); + object36.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object36, 5); + final var object37 = new javafx.scene.media.MediaView(); + controller.mediaView = object37; + object37.setFitHeight(200.0); + object37.setFitWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object37, 1); + javafx.scene.layout.GridPane.setColumnSpan(object37, 2); + javafx.scene.layout.GridPane.setRowIndex(object37, 5); + javafx.scene.layout.GridPane.setRowSpan(object37, 2); + final var object38 = new javafx.scene.control.MenuBar(); + controller.menuBar = object38; + javafx.scene.layout.GridPane.setHalignment(object38, javafx.geometry.HPos.RIGHT); + javafx.scene.layout.GridPane.setHgrow(object38, javafx.scene.layout.Priority.ALWAYS); + javafx.scene.layout.GridPane.setRowIndex(object38, 7); + javafx.scene.layout.GridPane.setValignment(object38, javafx.geometry.VPos.BASELINE); + javafx.scene.layout.GridPane.setVgrow(object38, javafx.scene.layout.Priority.SOMETIMES); + final var object39 = new javafx.scene.control.Menu(); + controller.menu1 = object39; + object39.setMnemonicParsing(false); + object39.setText("File"); + final var object40 = new javafx.scene.control.MenuItem(); + controller.menuItem1 = object40; + object40.setMnemonicParsing(false); + object40.setText("Close"); + object39.getItems().addAll(object40); + final var object41 = new javafx.scene.control.Menu(); + object41.setMnemonicParsing(false); + object41.setText("Edit"); + final var object42 = new javafx.scene.control.MenuItem(); + object42.setMnemonicParsing(false); + object42.setText("Delete"); + object41.getItems().addAll(object42); + final var object43 = new javafx.scene.control.Menu(); + object43.setMnemonicParsing(false); + object43.setText("Help"); + final var object44 = new javafx.scene.control.MenuItem(); + object44.setMnemonicParsing(false); + object44.setText("About"); + object43.getItems().addAll(object44); + object38.getMenus().addAll(object39, object41, object43); + final var object45 = new javafx.scene.control.MenuButton(); + controller.menuButton = object45; + object45.setMnemonicParsing(false); + object45.setText("MenuButton"); + javafx.scene.layout.GridPane.setColumnIndex(object45, 1); + javafx.scene.layout.GridPane.setRowIndex(object45, 7); + final var object46 = new javafx.scene.control.MenuItem(); + object46.setMnemonicParsing(false); + object46.setText("Action 1"); + final var object47 = new javafx.scene.control.MenuItem(); + object47.setMnemonicParsing(false); + object47.setText("Action 2"); + object45.getItems().addAll(object46, object47); + final var object48 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + javafx.scene.layout.GridPane.setMargin(object45, object48); + final var object49 = new javafx.scene.control.Pagination(); + controller.pagination = object49; + object49.setPrefHeight(200.0); + object49.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object49, 8); + final var object50 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object49.setPadding(object50); + final var object51 = new javafx.scene.control.PasswordField(); + controller.passwordField = object51; + object51.setMaxHeight(6.0); + object51.setMaxWidth(5.0); + object51.setMinHeight(2.0); + object51.setMinWidth(1.0); + object51.setPrefColumnCount(7); + object51.setPrefHeight(4.0); + object51.setPrefWidth(3.0); + javafx.scene.layout.GridPane.setColumnIndex(object51, 1); + javafx.scene.layout.GridPane.setRowIndex(object51, 8); + final var object52 = new javafx.scene.control.ProgressBar(); + controller.progressBar = object52; + object52.setLayoutX(10.0); + object52.setLayoutY(20.0); + object52.setPrefWidth(200.0); + object52.setProgress(0.0); + javafx.scene.layout.GridPane.setRowIndex(object52, 9); + final var object53 = new javafx.scene.control.ProgressIndicator(); + controller.progressIndicator = object53; + object53.setProgress(0.0); + object53.setRotate(2.0); + javafx.scene.layout.GridPane.setColumnIndex(object53, 1); + javafx.scene.layout.GridPane.setRowIndex(object53, 9); + final var object54 = new javafx.geometry.Point3D(4.0, 5.0, 6.0); + object53.setRotationAxis(object54); + final var object55 = new javafx.scene.control.RadioButton(); + controller.radioButton = object55; + object55.setMnemonicParsing(false); + object55.setScaleX(7.0); + object55.setScaleY(2.0); + object55.setScaleZ(3.0); + object55.setText("RadioButton"); + object55.setTranslateX(4.0); + object55.setTranslateY(5.0); + object55.setTranslateZ(6.0); + javafx.scene.layout.GridPane.setRowIndex(object55, 10); + final var object56 = new javafx.scene.control.ScrollBar(); + controller.scrollBarH = object56; + javafx.scene.layout.GridPane.setColumnIndex(object56, 1); + javafx.scene.layout.GridPane.setRowIndex(object56, 10); + final var object57 = new javafx.scene.control.ScrollBar(); + controller.scrollBarV = object57; + object57.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object57, 11); + final var object58 = new javafx.scene.control.Separator(); + controller.separatorH = object58; + object58.setOnDragDetected(e -> callMethod("dragDetected", e)); + object58.setOnDragDone(e -> callMethod("dragDone", e)); + object58.setOnDragDropped(e -> callMethod("dragDropped", e)); + object58.setOnDragEntered(e -> callMethod("dragEntered", e)); + object58.setOnDragExited(e -> callMethod("dragExited", e)); + object58.setOnDragOver(e -> callMethod("dragOver", e)); + object58.setOnMouseDragEntered(e -> callMethod("mouseDragEntered", e)); + object58.setOnMouseDragExited(e -> callMethod("mouseDragExited", e)); + object58.setOnMouseDragOver(e -> callMethod("mouseDragOver", e)); + object58.setOnMouseDragReleased(e -> callMethod("mouseDragReleased", e)); + object58.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object58, 1); + javafx.scene.layout.GridPane.setRowIndex(object58, 11); + final var object59 = new javafx.scene.control.Separator(); + controller.separatorV = object59; + object59.setOrientation(javafx.geometry.Orientation.VERTICAL); + object59.setPrefHeight(200.0); + javafx.scene.layout.GridPane.setRowIndex(object59, 12); + final var object60 = new javafx.scene.control.Slider(); + controller.sliderH = object60; + object60.setOnContextMenuRequested(e -> callMethod("contextMenuRequested", e)); + object60.setOnMouseClicked(e -> callMethod("mouseClicked", e)); + object60.setOnMouseDragged(e -> callMethod("mouseDragged", e)); + object60.setOnMouseEntered(e -> callMethod("mouseEntered", e)); + object60.setOnMouseExited(e -> callMethod("mouseExited", e)); + object60.setOnMouseMoved(e -> callMethod("mouseMoved", e)); + object60.setOnMousePressed(e -> callMethod("mousePressed", e)); + object60.setOnMouseReleased(e -> callMethod("mouseReleased", e)); + object60.setOnScroll(e -> callMethod("onScroll", e)); + object60.setOnScrollFinished(e -> callMethod("onScrollFinished", e)); + object60.setOnScrollStarted(e -> callMethod("onScrollStarted", e)); + javafx.scene.layout.GridPane.setColumnIndex(object60, 1); + javafx.scene.layout.GridPane.setRowIndex(object60, 12); + final var object61 = new javafx.scene.control.Slider(); + controller.sliderV = object61; + object61.setOnZoom(e -> callMethod("onZoom", e)); + object61.setOnZoomFinished(e -> callMethod("onZoomFinished", e)); + object61.setOnZoomStarted(e -> callMethod("onZoomStarted", e)); + object61.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object61, 13); + final var object62 = new javafx.scene.control.Spinner(); + controller.spinner = object62; + javafx.scene.layout.GridPane.setColumnIndex(object62, 1); + javafx.scene.layout.GridPane.setRowIndex(object62, 13); + final var object63 = new javafx.scene.control.SplitMenuButton(); + controller.splitMenuButton = object63; + object63.setMnemonicParsing(false); + object63.setText("SplitMenuButton"); + javafx.scene.layout.GridPane.setRowIndex(object63, 14); + final var object64 = new javafx.scene.control.MenuItem(); + controller.item1 = object64; + object64.setMnemonicParsing(false); + object64.setText("Action 1"); + final var object65 = new javafx.scene.control.MenuItem(); + controller.item2 = object65; + object65.setMnemonicParsing(false); + object65.setText("Action 2"); + object63.getItems().addAll(object64, object65); + final var object66 = new javafx.scene.control.TableView(); + controller.tableView = object66; + object66.setPrefHeight(200.0); + object66.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object66, 1); + javafx.scene.layout.GridPane.setRowIndex(object66, 14); + final var object67 = new javafx.scene.control.TableColumn(); + controller.tableColumn1 = object67; + object67.setPrefWidth(75.0); + object67.setText("C1"); + final var object68 = new javafx.scene.control.TableColumn(); + controller.tableColumn2 = object68; + object68.setPrefWidth(75.0); + object68.setText("C2"); + object66.getColumns().addAll(object67, object68); + final var object69 = new javafx.scene.control.TextArea(); + controller.textArea = object69; + object69.setPrefHeight(200.0); + object69.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object69, 15); + final var object70 = new javafx.scene.control.TextField(); + controller.textField = object70; + javafx.scene.layout.GridPane.setColumnIndex(object70, 1); + javafx.scene.layout.GridPane.setRowIndex(object70, 15); + final var object71 = new javafx.scene.control.ToggleButton(); + object71.setMnemonicParsing(false); + object71.setOnAction(e -> callMethod("onAction", e)); + object71.setOnRotate(e -> callMethod("onRotate", e)); + object71.setOnRotationFinished(e -> callMethod("onRotationFinished", e)); + object71.setOnRotationStarted(e -> callMethod("onRotationStarted", e)); + object71.setText("ToggleButton"); + javafx.scene.layout.GridPane.setRowIndex(object71, 16); + final var object72 = new javafx.scene.control.TreeTableView>(); + controller.treeTableView = object72; + object72.setPrefHeight(200.0); + object72.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object72, 1); + javafx.scene.layout.GridPane.setRowIndex(object72, 16); + final var object73 = new javafx.scene.control.TreeTableColumn, String>(); + controller.treeTableColumn1 = object73; + object73.setOnEditCancel(e -> callMethod("onEditCancel", e)); + object73.setOnEditCommit(e -> callMethod("onEditCommit", e)); + object73.setOnEditStart(e -> callMethod("onEditStart", e)); + object73.setPrefWidth(75.0); + object73.setText("C1"); + final var object74 = new javafx.scene.control.TreeTableColumn, Integer>(); + controller.treeTableColumn2 = object74; + object74.setPrefWidth(75.0); + object74.setSortType(javafx.scene.control.TreeTableColumn.SortType.DESCENDING); + object74.setText("C2"); + object72.getColumns().addAll(object73, object74); + final var object75 = new javafx.scene.control.TreeView(); + controller.treeView = object75; + object75.setOnSwipeDown(e -> callMethod("onSwipeDown", e)); + object75.setOnSwipeLeft(e -> callMethod("onSwipeLeft", e)); + object75.setOnSwipeRight(e -> callMethod("onSwipeRight", e)); + object75.setOnSwipeUp(e -> callMethod("onSwipeUp", e)); + object75.setPrefHeight(200.0); + object75.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object75, 17); + final var object76 = new javafx.scene.web.WebView(); + controller.webView = object76; + object76.setOnTouchMoved(e -> callMethod("onTouchMoved", e)); + object76.setOnTouchPressed(e -> callMethod("onTouchPressed", e)); + object76.setOnTouchReleased(e -> callMethod("onTouchReleased", e)); + object76.setOnTouchStationary(e -> callMethod("onTouchStationary", e)); + object76.setPrefHeight(200.0); + object76.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object76, 1); + javafx.scene.layout.GridPane.setRowIndex(object76, 17); + object0.getChildren().addAll(object22, object23, object24, object25, object28, object31, object32, object33, object34, object35, object36, object37, object38, object45, object49, object51, object52, object53, object55, object56, object57, object58, object59, object60, object61, object62, object63, object66, object69, object70, object71, object72, object75, object76); + try { + final var initialize = controller.getClass().getDeclaredMethod("initialize"); + initialize.setAccessible(true); + initialize.invoke(controller); + } catch (final InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection", e); + } catch (final NoSuchMethodException ignored) { + } + loaded = true; + return object0; +} + + private void callMethod(final String methodName, final T event) { + try { + final Method method; + final var methods = Arrays.stream(controller.getClass().getDeclaredMethods()) + .filter(m -> m.getName().equals(methodName)).toList(); + if (methods.size() > 1) { + final var eventMethods = methods.stream().filter(m -> + m.getParameterCount() == 1 && Event.class.isAssignableFrom(m.getParameterTypes()[0])).toList(); + if (eventMethods.size() == 1) { + method = eventMethods.getFirst(); + } else { + final var emptyMethods = methods.stream().filter(m -> m.getParameterCount() == 0).toList(); + if (emptyMethods.size() == 1) { + method = emptyMethods.getFirst(); + } else { + throw new IllegalArgumentException("Multiple matching methods for " + methodName); + } + } + } else if (methods.size() == 1) { + method = methods.getFirst(); + } else { + throw new IllegalArgumentException("No matching method for " + methodName); + } + method.setAccessible(true); + if (method.getParameterCount() == 0) { + method.invoke(controller); + } else { + method.invoke(controller, event); + } + } catch (final IllegalAccessException | InvocationTargetException ex) { + throw new RuntimeException("Error using reflection on " + methodName, ex); + } +} + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.ControlsController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-assign-reflection-getter.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-assign-reflection-getter.txt new file mode 100644 index 0000000..9732a42 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-assign-reflection-getter.txt @@ -0,0 +1,468 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import javafx.event.Event; +import java.lang.reflect.Method; + + +/** + * Generated code, not thread-safe + */ +public final class ControlsController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.ControlsController controller; + + /** + * Instantiates a new ControlsController with no nested controllers and no resource bundle + * @param controller The controller + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of()); + } + + /** + * Instantiates a new ControlsController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, resourceBundle)); + } + + /** + * Instantiates a new ControlsController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public ControlsController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + controller = (com.github.gtache.fxml.compiler.impl.ControlsController) controllersMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + final var object0 = new javafx.scene.layout.GridPane(); + controller.gridPane = object0; + object0.setOnInputMethodTextChanged(e -> callMethod("inputMethodTextChanged", e)); + object0.setOnKeyPressed(e -> callMethod("keyPressed", e)); + object0.setOnKeyReleased(e -> callMethod("keyReleased", e)); + object0.setOnKeyTyped(e -> callMethod("keyTyped", e)); + final var object1 = new javafx.scene.layout.RowConstraints(); + final var object2 = new javafx.scene.layout.RowConstraints(); + final var object3 = new javafx.scene.layout.RowConstraints(); + final var object4 = new javafx.scene.layout.RowConstraints(); + final var object5 = new javafx.scene.layout.RowConstraints(); + final var object6 = new javafx.scene.layout.RowConstraints(); + final var object7 = new javafx.scene.layout.RowConstraints(); + final var object8 = new javafx.scene.layout.RowConstraints(); + final var object9 = new javafx.scene.layout.RowConstraints(); + final var object10 = new javafx.scene.layout.RowConstraints(); + final var object11 = new javafx.scene.layout.RowConstraints(); + final var object12 = new javafx.scene.layout.RowConstraints(); + final var object13 = new javafx.scene.layout.RowConstraints(); + final var object14 = new javafx.scene.layout.RowConstraints(); + final var object15 = new javafx.scene.layout.RowConstraints(); + final var object16 = new javafx.scene.layout.RowConstraints(); + final var object17 = new javafx.scene.layout.RowConstraints(); + final var object18 = new javafx.scene.layout.RowConstraints(); + object0.getRowConstraints().addAll(object1, object2, object3, object4, object5, object6, object7, object8, object9, object10, object11, object12, object13, object14, object15, object16, object17, object18); + final var object19 = new javafx.scene.layout.ColumnConstraints(); + final var object20 = new javafx.scene.layout.ColumnConstraints(); + final var object21 = new javafx.scene.layout.ColumnConstraints(); + object21.setMinWidth(10.0); + object21.setPrefWidth(100.0); + object0.getColumnConstraints().addAll(object19, object20, object21); + final var object22 = new javafx.scene.control.Button(); + controller.button = object22; + object22.setMnemonicParsing(false); + object22.setText("Button"); + final var object23 = new javafx.scene.control.CheckBox(); + controller.checkBox = object23; + object23.setIndeterminate(true); + object23.setMnemonicParsing(false); + object23.setText("CheckBox"); + javafx.scene.layout.GridPane.setColumnIndex(object23, 1); + final var object24 = new javafx.scene.control.ChoiceBox(); + controller.choiceBox = object24; + object24.setCacheShape(false); + object24.setCenterShape(false); + object24.setDisable(true); + object24.setFocusTraversable(false); + object24.setPrefWidth(150.0); + object24.setScaleShape(false); + object24.setVisible(false); + javafx.scene.layout.GridPane.setRowIndex(object24, 1); + final var object25 = new javafx.scene.control.ColorPicker(); + controller.colorPicker = object25; + object25.setNodeOrientation(javafx.geometry.NodeOrientation.LEFT_TO_RIGHT); + object25.setOpacity(0.5); + javafx.scene.layout.GridPane.setColumnIndex(object25, 1); + javafx.scene.layout.GridPane.setRowIndex(object25, 1); + final var object26 = new javafx.scene.paint.Color(0.7894737124443054, 0.08771929889917374, 0.08771929889917374, 1); + controller.color = object26; + object25.setValue(object26); + final var object27 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object25.setOpaqueInsets(object27); + final var object28 = new javafx.scene.control.ComboBox(); + controller.comboBox = object28; + object28.setEditable(true); + object28.setPrefWidth(150.0); + object28.setPromptText("Text"); + object28.setVisibleRowCount(5); + javafx.scene.layout.GridPane.setRowIndex(object28, 2); + final var object29 = javafx.scene.Cursor.CLOSED_HAND; + object28.setCursor(object29); + final var object30 = new javafx.scene.effect.Bloom(); + object28.setEffect(object30); + final var object31 = new javafx.scene.control.DatePicker(); + controller.datePicker = object31; + object31.setShowWeekNumbers(true); + object31.setStyle("-fx-background-color: #ffffff;"); + javafx.scene.layout.GridPane.setColumnIndex(object31, 1); + javafx.scene.layout.GridPane.setRowIndex(object31, 2); + final var object32 = new javafx.scene.web.HTMLEditor(); + controller.htmlEditor = object32; + object32.setHtmlText(""); + object32.setPrefHeight(200.0); + object32.setPrefWidth(506.0); + object32.getStyleClass().addAll("clazz"); + object32.getStylesheets().addAll("@style.css"); + javafx.scene.layout.GridPane.setRowIndex(object32, 3); + final var object33 = new javafx.scene.control.Hyperlink(); + controller.hyperlink = object33; + object33.setText("Hyperlink"); + javafx.scene.layout.GridPane.setColumnIndex(object33, 1); + javafx.scene.layout.GridPane.setRowIndex(object33, 3); + final var object34 = new javafx.scene.image.ImageView(); + controller.imageView = object34; + object34.setFitHeight(150.0); + object34.setFitWidth(200.0); + object34.setPickOnBounds(true); + object34.setPreserveRatio(true); + javafx.scene.layout.GridPane.setRowIndex(object34, 4); + final var object35 = new javafx.scene.control.Label(); + controller.label = object35; + object35.setAccessibleHelp("TTTTT"); + object35.setAccessibleText("TTT"); + object35.setBlendMode(javafx.scene.effect.BlendMode.ADD); + object35.setCache(true); + object35.setCacheHint(javafx.scene.CacheHint.QUALITY); + object35.setDepthTest(javafx.scene.DepthTest.ENABLE); + object35.setMnemonicParsing(true); + object35.setMouseTransparent(true); + object35.setText(controller.resources().getString("include.label")); + javafx.scene.layout.GridPane.setColumnIndex(object35, 1); + javafx.scene.layout.GridPane.setRowIndex(object35, 4); + final var object36 = new javafx.scene.control.ListView(); + controller.listView = object36; + object36.setFixedCellSize(20.0); + object36.setNodeOrientation(javafx.geometry.NodeOrientation.RIGHT_TO_LEFT); + object36.setOrientation(javafx.geometry.Orientation.HORIZONTAL); + object36.setPrefHeight(200.0); + object36.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object36, 5); + final var object37 = new javafx.scene.media.MediaView(); + controller.mediaView = object37; + object37.setFitHeight(200.0); + object37.setFitWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object37, 1); + javafx.scene.layout.GridPane.setColumnSpan(object37, 2); + javafx.scene.layout.GridPane.setRowIndex(object37, 5); + javafx.scene.layout.GridPane.setRowSpan(object37, 2); + final var object38 = new javafx.scene.control.MenuBar(); + controller.menuBar = object38; + javafx.scene.layout.GridPane.setHalignment(object38, javafx.geometry.HPos.RIGHT); + javafx.scene.layout.GridPane.setHgrow(object38, javafx.scene.layout.Priority.ALWAYS); + javafx.scene.layout.GridPane.setRowIndex(object38, 7); + javafx.scene.layout.GridPane.setValignment(object38, javafx.geometry.VPos.BASELINE); + javafx.scene.layout.GridPane.setVgrow(object38, javafx.scene.layout.Priority.SOMETIMES); + final var object39 = new javafx.scene.control.Menu(); + controller.menu1 = object39; + object39.setMnemonicParsing(false); + object39.setText("File"); + final var object40 = new javafx.scene.control.MenuItem(); + controller.menuItem1 = object40; + object40.setMnemonicParsing(false); + object40.setText("Close"); + object39.getItems().addAll(object40); + final var object41 = new javafx.scene.control.Menu(); + object41.setMnemonicParsing(false); + object41.setText("Edit"); + final var object42 = new javafx.scene.control.MenuItem(); + object42.setMnemonicParsing(false); + object42.setText("Delete"); + object41.getItems().addAll(object42); + final var object43 = new javafx.scene.control.Menu(); + object43.setMnemonicParsing(false); + object43.setText("Help"); + final var object44 = new javafx.scene.control.MenuItem(); + object44.setMnemonicParsing(false); + object44.setText("About"); + object43.getItems().addAll(object44); + object38.getMenus().addAll(object39, object41, object43); + final var object45 = new javafx.scene.control.MenuButton(); + controller.menuButton = object45; + object45.setMnemonicParsing(false); + object45.setText("MenuButton"); + javafx.scene.layout.GridPane.setColumnIndex(object45, 1); + javafx.scene.layout.GridPane.setRowIndex(object45, 7); + final var object46 = new javafx.scene.control.MenuItem(); + object46.setMnemonicParsing(false); + object46.setText("Action 1"); + final var object47 = new javafx.scene.control.MenuItem(); + object47.setMnemonicParsing(false); + object47.setText("Action 2"); + object45.getItems().addAll(object46, object47); + final var object48 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + javafx.scene.layout.GridPane.setMargin(object45, object48); + final var object49 = new javafx.scene.control.Pagination(); + controller.pagination = object49; + object49.setPrefHeight(200.0); + object49.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object49, 8); + final var object50 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object49.setPadding(object50); + final var object51 = new javafx.scene.control.PasswordField(); + controller.passwordField = object51; + object51.setMaxHeight(6.0); + object51.setMaxWidth(5.0); + object51.setMinHeight(2.0); + object51.setMinWidth(1.0); + object51.setPrefColumnCount(7); + object51.setPrefHeight(4.0); + object51.setPrefWidth(3.0); + javafx.scene.layout.GridPane.setColumnIndex(object51, 1); + javafx.scene.layout.GridPane.setRowIndex(object51, 8); + final var object52 = new javafx.scene.control.ProgressBar(); + controller.progressBar = object52; + object52.setLayoutX(10.0); + object52.setLayoutY(20.0); + object52.setPrefWidth(200.0); + object52.setProgress(0.0); + javafx.scene.layout.GridPane.setRowIndex(object52, 9); + final var object53 = new javafx.scene.control.ProgressIndicator(); + controller.progressIndicator = object53; + object53.setProgress(0.0); + object53.setRotate(2.0); + javafx.scene.layout.GridPane.setColumnIndex(object53, 1); + javafx.scene.layout.GridPane.setRowIndex(object53, 9); + final var object54 = new javafx.geometry.Point3D(4.0, 5.0, 6.0); + object53.setRotationAxis(object54); + final var object55 = new javafx.scene.control.RadioButton(); + controller.radioButton = object55; + object55.setMnemonicParsing(false); + object55.setScaleX(7.0); + object55.setScaleY(2.0); + object55.setScaleZ(3.0); + object55.setText("RadioButton"); + object55.setTranslateX(4.0); + object55.setTranslateY(5.0); + object55.setTranslateZ(6.0); + javafx.scene.layout.GridPane.setRowIndex(object55, 10); + final var object56 = new javafx.scene.control.ScrollBar(); + controller.scrollBarH = object56; + javafx.scene.layout.GridPane.setColumnIndex(object56, 1); + javafx.scene.layout.GridPane.setRowIndex(object56, 10); + final var object57 = new javafx.scene.control.ScrollBar(); + controller.scrollBarV = object57; + object57.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object57, 11); + final var object58 = new javafx.scene.control.Separator(); + controller.separatorH = object58; + object58.setOnDragDetected(e -> callMethod("dragDetected", e)); + object58.setOnDragDone(e -> callMethod("dragDone", e)); + object58.setOnDragDropped(e -> callMethod("dragDropped", e)); + object58.setOnDragEntered(e -> callMethod("dragEntered", e)); + object58.setOnDragExited(e -> callMethod("dragExited", e)); + object58.setOnDragOver(e -> callMethod("dragOver", e)); + object58.setOnMouseDragEntered(e -> callMethod("mouseDragEntered", e)); + object58.setOnMouseDragExited(e -> callMethod("mouseDragExited", e)); + object58.setOnMouseDragOver(e -> callMethod("mouseDragOver", e)); + object58.setOnMouseDragReleased(e -> callMethod("mouseDragReleased", e)); + object58.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object58, 1); + javafx.scene.layout.GridPane.setRowIndex(object58, 11); + final var object59 = new javafx.scene.control.Separator(); + controller.separatorV = object59; + object59.setOrientation(javafx.geometry.Orientation.VERTICAL); + object59.setPrefHeight(200.0); + javafx.scene.layout.GridPane.setRowIndex(object59, 12); + final var object60 = new javafx.scene.control.Slider(); + controller.sliderH = object60; + object60.setOnContextMenuRequested(e -> callMethod("contextMenuRequested", e)); + object60.setOnMouseClicked(e -> callMethod("mouseClicked", e)); + object60.setOnMouseDragged(e -> callMethod("mouseDragged", e)); + object60.setOnMouseEntered(e -> callMethod("mouseEntered", e)); + object60.setOnMouseExited(e -> callMethod("mouseExited", e)); + object60.setOnMouseMoved(e -> callMethod("mouseMoved", e)); + object60.setOnMousePressed(e -> callMethod("mousePressed", e)); + object60.setOnMouseReleased(e -> callMethod("mouseReleased", e)); + object60.setOnScroll(e -> callMethod("onScroll", e)); + object60.setOnScrollFinished(e -> callMethod("onScrollFinished", e)); + object60.setOnScrollStarted(e -> callMethod("onScrollStarted", e)); + javafx.scene.layout.GridPane.setColumnIndex(object60, 1); + javafx.scene.layout.GridPane.setRowIndex(object60, 12); + final var object61 = new javafx.scene.control.Slider(); + controller.sliderV = object61; + object61.setOnZoom(e -> callMethod("onZoom", e)); + object61.setOnZoomFinished(e -> callMethod("onZoomFinished", e)); + object61.setOnZoomStarted(e -> callMethod("onZoomStarted", e)); + object61.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object61, 13); + final var object62 = new javafx.scene.control.Spinner(); + controller.spinner = object62; + javafx.scene.layout.GridPane.setColumnIndex(object62, 1); + javafx.scene.layout.GridPane.setRowIndex(object62, 13); + final var object63 = new javafx.scene.control.SplitMenuButton(); + controller.splitMenuButton = object63; + object63.setMnemonicParsing(false); + object63.setText("SplitMenuButton"); + javafx.scene.layout.GridPane.setRowIndex(object63, 14); + final var object64 = new javafx.scene.control.MenuItem(); + controller.item1 = object64; + object64.setMnemonicParsing(false); + object64.setText("Action 1"); + final var object65 = new javafx.scene.control.MenuItem(); + controller.item2 = object65; + object65.setMnemonicParsing(false); + object65.setText("Action 2"); + object63.getItems().addAll(object64, object65); + final var object66 = new javafx.scene.control.TableView(); + controller.tableView = object66; + object66.setPrefHeight(200.0); + object66.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object66, 1); + javafx.scene.layout.GridPane.setRowIndex(object66, 14); + final var object67 = new javafx.scene.control.TableColumn(); + controller.tableColumn1 = object67; + object67.setPrefWidth(75.0); + object67.setText("C1"); + final var object68 = new javafx.scene.control.TableColumn(); + controller.tableColumn2 = object68; + object68.setPrefWidth(75.0); + object68.setText("C2"); + object66.getColumns().addAll(object67, object68); + final var object69 = new javafx.scene.control.TextArea(); + controller.textArea = object69; + object69.setPrefHeight(200.0); + object69.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object69, 15); + final var object70 = new javafx.scene.control.TextField(); + controller.textField = object70; + javafx.scene.layout.GridPane.setColumnIndex(object70, 1); + javafx.scene.layout.GridPane.setRowIndex(object70, 15); + final var object71 = new javafx.scene.control.ToggleButton(); + object71.setMnemonicParsing(false); + object71.setOnAction(e -> callMethod("onAction", e)); + object71.setOnRotate(e -> callMethod("onRotate", e)); + object71.setOnRotationFinished(e -> callMethod("onRotationFinished", e)); + object71.setOnRotationStarted(e -> callMethod("onRotationStarted", e)); + object71.setText("ToggleButton"); + javafx.scene.layout.GridPane.setRowIndex(object71, 16); + final var object72 = new javafx.scene.control.TreeTableView>(); + controller.treeTableView = object72; + object72.setPrefHeight(200.0); + object72.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object72, 1); + javafx.scene.layout.GridPane.setRowIndex(object72, 16); + final var object73 = new javafx.scene.control.TreeTableColumn, String>(); + controller.treeTableColumn1 = object73; + object73.setOnEditCancel(e -> callMethod("onEditCancel", e)); + object73.setOnEditCommit(e -> callMethod("onEditCommit", e)); + object73.setOnEditStart(e -> callMethod("onEditStart", e)); + object73.setPrefWidth(75.0); + object73.setText("C1"); + final var object74 = new javafx.scene.control.TreeTableColumn, Integer>(); + controller.treeTableColumn2 = object74; + object74.setPrefWidth(75.0); + object74.setSortType(javafx.scene.control.TreeTableColumn.SortType.DESCENDING); + object74.setText("C2"); + object72.getColumns().addAll(object73, object74); + final var object75 = new javafx.scene.control.TreeView(); + controller.treeView = object75; + object75.setOnSwipeDown(e -> callMethod("onSwipeDown", e)); + object75.setOnSwipeLeft(e -> callMethod("onSwipeLeft", e)); + object75.setOnSwipeRight(e -> callMethod("onSwipeRight", e)); + object75.setOnSwipeUp(e -> callMethod("onSwipeUp", e)); + object75.setPrefHeight(200.0); + object75.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object75, 17); + final var object76 = new javafx.scene.web.WebView(); + controller.webView = object76; + object76.setOnTouchMoved(e -> callMethod("onTouchMoved", e)); + object76.setOnTouchPressed(e -> callMethod("onTouchPressed", e)); + object76.setOnTouchReleased(e -> callMethod("onTouchReleased", e)); + object76.setOnTouchStationary(e -> callMethod("onTouchStationary", e)); + object76.setPrefHeight(200.0); + object76.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object76, 1); + javafx.scene.layout.GridPane.setRowIndex(object76, 17); + object0.getChildren().addAll(object22, object23, object24, object25, object28, object31, object32, object33, object34, object35, object36, object37, object38, object45, object49, object51, object52, object53, object55, object56, object57, object58, object59, object60, object61, object62, object63, object66, object69, object70, object71, object72, object75, object76); + try { + final var initialize = controller.getClass().getDeclaredMethod("initialize"); + initialize.setAccessible(true); + initialize.invoke(controller); + } catch (final InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection", e); + } catch (final NoSuchMethodException ignored) { + } + loaded = true; + return object0; +} + + private void callMethod(final String methodName, final T event) { + try { + final Method method; + final var methods = Arrays.stream(controller.getClass().getDeclaredMethods()) + .filter(m -> m.getName().equals(methodName)).toList(); + if (methods.size() > 1) { + final var eventMethods = methods.stream().filter(m -> + m.getParameterCount() == 1 && Event.class.isAssignableFrom(m.getParameterTypes()[0])).toList(); + if (eventMethods.size() == 1) { + method = eventMethods.getFirst(); + } else { + final var emptyMethods = methods.stream().filter(m -> m.getParameterCount() == 0).toList(); + if (emptyMethods.size() == 1) { + method = emptyMethods.getFirst(); + } else { + throw new IllegalArgumentException("Multiple matching methods for " + methodName); + } + } + } else if (methods.size() == 1) { + method = methods.getFirst(); + } else { + throw new IllegalArgumentException("No matching method for " + methodName); + } + method.setAccessible(true); + if (method.getParameterCount() == 0) { + method.invoke(controller); + } else { + method.invoke(controller, event); + } + } catch (final IllegalAccessException | InvocationTargetException ex) { + throw new RuntimeException("Error using reflection on " + methodName, ex); + } +} + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.ControlsController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-factory-reference-constructor.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-factory-reference-constructor.txt new file mode 100644 index 0000000..28000ab --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-factory-reference-constructor.txt @@ -0,0 +1,428 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; +import com.github.gtache.fxml.compiler.ControllerFactory; + + +/** + * Generated code, not thread-safe + */ +public final class ControlsController { + + private final Map, ControllerFactory> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.ControlsController controller; + + /** + * Instantiates a new ControlsController with no nested controllers and no resource bundle + * @param controllerFactory The controller factory + */ + public ControlsController(final ControllerFactory controllerFactory) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controllerFactory), Map.of()); + } + + /** + * Instantiates a new ControlsController with no nested controllers + * @param controllerFactory The controller factory + * @param resourceBundle The resource bundle + */ + public ControlsController(final ControllerFactory controllerFactory, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controllerFactory), Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, resourceBundle)); + } + + /** + * Instantiates a new ControlsController with nested controllers + * @param controllersMap The map of controller class to controller factory + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public ControlsController(final Map, ControllerFactory> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = resourceBundlesMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + final var fieldMap = new HashMap(); + final var object0 = new javafx.scene.layout.GridPane(); + fieldMap.put("gridPane", object0); + final var object1 = new javafx.scene.layout.RowConstraints(); + final var object2 = new javafx.scene.layout.RowConstraints(); + final var object3 = new javafx.scene.layout.RowConstraints(); + final var object4 = new javafx.scene.layout.RowConstraints(); + final var object5 = new javafx.scene.layout.RowConstraints(); + final var object6 = new javafx.scene.layout.RowConstraints(); + final var object7 = new javafx.scene.layout.RowConstraints(); + final var object8 = new javafx.scene.layout.RowConstraints(); + final var object9 = new javafx.scene.layout.RowConstraints(); + final var object10 = new javafx.scene.layout.RowConstraints(); + final var object11 = new javafx.scene.layout.RowConstraints(); + final var object12 = new javafx.scene.layout.RowConstraints(); + final var object13 = new javafx.scene.layout.RowConstraints(); + final var object14 = new javafx.scene.layout.RowConstraints(); + final var object15 = new javafx.scene.layout.RowConstraints(); + final var object16 = new javafx.scene.layout.RowConstraints(); + final var object17 = new javafx.scene.layout.RowConstraints(); + final var object18 = new javafx.scene.layout.RowConstraints(); + object0.getRowConstraints().addAll(object1, object2, object3, object4, object5, object6, object7, object8, object9, object10, object11, object12, object13, object14, object15, object16, object17, object18); + final var object19 = new javafx.scene.layout.ColumnConstraints(); + final var object20 = new javafx.scene.layout.ColumnConstraints(); + final var object21 = new javafx.scene.layout.ColumnConstraints(); + object21.setMinWidth(10.0); + object21.setPrefWidth(100.0); + object0.getColumnConstraints().addAll(object19, object20, object21); + final var object22 = new javafx.scene.control.Button(); + fieldMap.put("button", object22); + object22.setMnemonicParsing(false); + object22.setText("Button"); + final var object23 = new javafx.scene.control.CheckBox(); + fieldMap.put("checkBox", object23); + object23.setIndeterminate(true); + object23.setMnemonicParsing(false); + object23.setText("CheckBox"); + javafx.scene.layout.GridPane.setColumnIndex(object23, 1); + final var object24 = new javafx.scene.control.ChoiceBox(); + fieldMap.put("choiceBox", object24); + object24.setCacheShape(false); + object24.setCenterShape(false); + object24.setDisable(true); + object24.setFocusTraversable(false); + object24.setPrefWidth(150.0); + object24.setScaleShape(false); + object24.setVisible(false); + javafx.scene.layout.GridPane.setRowIndex(object24, 1); + final var object25 = new javafx.scene.control.ColorPicker(); + fieldMap.put("colorPicker", object25); + object25.setNodeOrientation(javafx.geometry.NodeOrientation.LEFT_TO_RIGHT); + object25.setOpacity(0.5); + javafx.scene.layout.GridPane.setColumnIndex(object25, 1); + javafx.scene.layout.GridPane.setRowIndex(object25, 1); + final var object26 = new javafx.scene.paint.Color(0.7894737124443054, 0.08771929889917374, 0.08771929889917374, 1); + fieldMap.put("color", object26); + object25.setValue(object26); + final var object27 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object25.setOpaqueInsets(object27); + final var object28 = new javafx.scene.control.ComboBox(); + fieldMap.put("comboBox", object28); + object28.setEditable(true); + object28.setPrefWidth(150.0); + object28.setPromptText("Text"); + object28.setVisibleRowCount(5); + javafx.scene.layout.GridPane.setRowIndex(object28, 2); + final var object29 = javafx.scene.Cursor.CLOSED_HAND; + object28.setCursor(object29); + final var object30 = new javafx.scene.effect.Bloom(); + object28.setEffect(object30); + final var object31 = new javafx.scene.control.DatePicker(); + fieldMap.put("datePicker", object31); + object31.setShowWeekNumbers(true); + object31.setStyle("-fx-background-color: #ffffff;"); + javafx.scene.layout.GridPane.setColumnIndex(object31, 1); + javafx.scene.layout.GridPane.setRowIndex(object31, 2); + final var object32 = new javafx.scene.web.HTMLEditor(); + fieldMap.put("htmlEditor", object32); + object32.setHtmlText(""); + object32.setPrefHeight(200.0); + object32.setPrefWidth(506.0); + object32.getStyleClass().addAll("clazz"); + object32.getStylesheets().addAll("@style.css"); + javafx.scene.layout.GridPane.setRowIndex(object32, 3); + final var object33 = new javafx.scene.control.Hyperlink(); + fieldMap.put("hyperlink", object33); + object33.setText("Hyperlink"); + javafx.scene.layout.GridPane.setColumnIndex(object33, 1); + javafx.scene.layout.GridPane.setRowIndex(object33, 3); + final var object34 = new javafx.scene.image.ImageView(); + fieldMap.put("imageView", object34); + object34.setFitHeight(150.0); + object34.setFitWidth(200.0); + object34.setPickOnBounds(true); + object34.setPreserveRatio(true); + javafx.scene.layout.GridPane.setRowIndex(object34, 4); + final var object35 = new javafx.scene.control.Label(); + fieldMap.put("label", object35); + object35.setAccessibleHelp("TTTTT"); + object35.setAccessibleText("TTT"); + object35.setBlendMode(javafx.scene.effect.BlendMode.ADD); + object35.setCache(true); + object35.setCacheHint(javafx.scene.CacheHint.QUALITY); + object35.setDepthTest(javafx.scene.DepthTest.ENABLE); + object35.setMnemonicParsing(true); + object35.setMouseTransparent(true); + object35.setText(bundle.getString("include.label")); + javafx.scene.layout.GridPane.setColumnIndex(object35, 1); + javafx.scene.layout.GridPane.setRowIndex(object35, 4); + final var object36 = new javafx.scene.control.ListView(); + fieldMap.put("listView", object36); + object36.setFixedCellSize(20.0); + object36.setNodeOrientation(javafx.geometry.NodeOrientation.RIGHT_TO_LEFT); + object36.setOrientation(javafx.geometry.Orientation.HORIZONTAL); + object36.setPrefHeight(200.0); + object36.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object36, 5); + final var object37 = new javafx.scene.media.MediaView(); + fieldMap.put("mediaView", object37); + object37.setFitHeight(200.0); + object37.setFitWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object37, 1); + javafx.scene.layout.GridPane.setColumnSpan(object37, 2); + javafx.scene.layout.GridPane.setRowIndex(object37, 5); + javafx.scene.layout.GridPane.setRowSpan(object37, 2); + final var object38 = new javafx.scene.control.MenuBar(); + fieldMap.put("menuBar", object38); + javafx.scene.layout.GridPane.setHalignment(object38, javafx.geometry.HPos.RIGHT); + javafx.scene.layout.GridPane.setHgrow(object38, javafx.scene.layout.Priority.ALWAYS); + javafx.scene.layout.GridPane.setRowIndex(object38, 7); + javafx.scene.layout.GridPane.setValignment(object38, javafx.geometry.VPos.BASELINE); + javafx.scene.layout.GridPane.setVgrow(object38, javafx.scene.layout.Priority.SOMETIMES); + final var object39 = new javafx.scene.control.Menu(); + fieldMap.put("menu1", object39); + object39.setMnemonicParsing(false); + object39.setText("File"); + final var object40 = new javafx.scene.control.MenuItem(); + fieldMap.put("menuItem1", object40); + object40.setMnemonicParsing(false); + object40.setText("Close"); + object39.getItems().addAll(object40); + final var object41 = new javafx.scene.control.Menu(); + object41.setMnemonicParsing(false); + object41.setText("Edit"); + final var object42 = new javafx.scene.control.MenuItem(); + object42.setMnemonicParsing(false); + object42.setText("Delete"); + object41.getItems().addAll(object42); + final var object43 = new javafx.scene.control.Menu(); + object43.setMnemonicParsing(false); + object43.setText("Help"); + final var object44 = new javafx.scene.control.MenuItem(); + object44.setMnemonicParsing(false); + object44.setText("About"); + object43.getItems().addAll(object44); + object38.getMenus().addAll(object39, object41, object43); + final var object45 = new javafx.scene.control.MenuButton(); + fieldMap.put("menuButton", object45); + object45.setMnemonicParsing(false); + object45.setText("MenuButton"); + javafx.scene.layout.GridPane.setColumnIndex(object45, 1); + javafx.scene.layout.GridPane.setRowIndex(object45, 7); + final var object46 = new javafx.scene.control.MenuItem(); + object46.setMnemonicParsing(false); + object46.setText("Action 1"); + final var object47 = new javafx.scene.control.MenuItem(); + object47.setMnemonicParsing(false); + object47.setText("Action 2"); + object45.getItems().addAll(object46, object47); + final var object48 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + javafx.scene.layout.GridPane.setMargin(object45, object48); + final var object49 = new javafx.scene.control.Pagination(); + fieldMap.put("pagination", object49); + object49.setPrefHeight(200.0); + object49.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object49, 8); + final var object50 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object49.setPadding(object50); + final var object51 = new javafx.scene.control.PasswordField(); + fieldMap.put("passwordField", object51); + object51.setMaxHeight(6.0); + object51.setMaxWidth(5.0); + object51.setMinHeight(2.0); + object51.setMinWidth(1.0); + object51.setPrefColumnCount(7); + object51.setPrefHeight(4.0); + object51.setPrefWidth(3.0); + javafx.scene.layout.GridPane.setColumnIndex(object51, 1); + javafx.scene.layout.GridPane.setRowIndex(object51, 8); + final var object52 = new javafx.scene.control.ProgressBar(); + fieldMap.put("progressBar", object52); + object52.setLayoutX(10.0); + object52.setLayoutY(20.0); + object52.setPrefWidth(200.0); + object52.setProgress(0.0); + javafx.scene.layout.GridPane.setRowIndex(object52, 9); + final var object53 = new javafx.scene.control.ProgressIndicator(); + fieldMap.put("progressIndicator", object53); + object53.setProgress(0.0); + object53.setRotate(2.0); + javafx.scene.layout.GridPane.setColumnIndex(object53, 1); + javafx.scene.layout.GridPane.setRowIndex(object53, 9); + final var object54 = new javafx.geometry.Point3D(4.0, 5.0, 6.0); + object53.setRotationAxis(object54); + final var object55 = new javafx.scene.control.RadioButton(); + fieldMap.put("radioButton", object55); + object55.setMnemonicParsing(false); + object55.setScaleX(7.0); + object55.setScaleY(2.0); + object55.setScaleZ(3.0); + object55.setText("RadioButton"); + object55.setTranslateX(4.0); + object55.setTranslateY(5.0); + object55.setTranslateZ(6.0); + javafx.scene.layout.GridPane.setRowIndex(object55, 10); + final var object56 = new javafx.scene.control.ScrollBar(); + fieldMap.put("scrollBarH", object56); + javafx.scene.layout.GridPane.setColumnIndex(object56, 1); + javafx.scene.layout.GridPane.setRowIndex(object56, 10); + final var object57 = new javafx.scene.control.ScrollBar(); + fieldMap.put("scrollBarV", object57); + object57.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object57, 11); + final var object58 = new javafx.scene.control.Separator(); + fieldMap.put("separatorH", object58); + object58.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object58, 1); + javafx.scene.layout.GridPane.setRowIndex(object58, 11); + final var object59 = new javafx.scene.control.Separator(); + fieldMap.put("separatorV", object59); + object59.setOrientation(javafx.geometry.Orientation.VERTICAL); + object59.setPrefHeight(200.0); + javafx.scene.layout.GridPane.setRowIndex(object59, 12); + final var object60 = new javafx.scene.control.Slider(); + fieldMap.put("sliderH", object60); + javafx.scene.layout.GridPane.setColumnIndex(object60, 1); + javafx.scene.layout.GridPane.setRowIndex(object60, 12); + final var object61 = new javafx.scene.control.Slider(); + fieldMap.put("sliderV", object61); + object61.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object61, 13); + final var object62 = new javafx.scene.control.Spinner(); + fieldMap.put("spinner", object62); + javafx.scene.layout.GridPane.setColumnIndex(object62, 1); + javafx.scene.layout.GridPane.setRowIndex(object62, 13); + final var object63 = new javafx.scene.control.SplitMenuButton(); + fieldMap.put("splitMenuButton", object63); + object63.setMnemonicParsing(false); + object63.setText("SplitMenuButton"); + javafx.scene.layout.GridPane.setRowIndex(object63, 14); + final var object64 = new javafx.scene.control.MenuItem(); + fieldMap.put("item1", object64); + object64.setMnemonicParsing(false); + object64.setText("Action 1"); + final var object65 = new javafx.scene.control.MenuItem(); + fieldMap.put("item2", object65); + object65.setMnemonicParsing(false); + object65.setText("Action 2"); + object63.getItems().addAll(object64, object65); + final var object66 = new javafx.scene.control.TableView(); + fieldMap.put("tableView", object66); + object66.setPrefHeight(200.0); + object66.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object66, 1); + javafx.scene.layout.GridPane.setRowIndex(object66, 14); + final var object67 = new javafx.scene.control.TableColumn(); + fieldMap.put("tableColumn1", object67); + object67.setPrefWidth(75.0); + object67.setText("C1"); + final var object68 = new javafx.scene.control.TableColumn(); + fieldMap.put("tableColumn2", object68); + object68.setPrefWidth(75.0); + object68.setText("C2"); + object66.getColumns().addAll(object67, object68); + final var object69 = new javafx.scene.control.TextArea(); + fieldMap.put("textArea", object69); + object69.setPrefHeight(200.0); + object69.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object69, 15); + final var object70 = new javafx.scene.control.TextField(); + fieldMap.put("textField", object70); + javafx.scene.layout.GridPane.setColumnIndex(object70, 1); + javafx.scene.layout.GridPane.setRowIndex(object70, 15); + final var object71 = new javafx.scene.control.ToggleButton(); + object71.setMnemonicParsing(false); + object71.setText("ToggleButton"); + javafx.scene.layout.GridPane.setRowIndex(object71, 16); + final var object72 = new javafx.scene.control.TreeTableView>(); + fieldMap.put("treeTableView", object72); + object72.setPrefHeight(200.0); + object72.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object72, 1); + javafx.scene.layout.GridPane.setRowIndex(object72, 16); + final var object73 = new javafx.scene.control.TreeTableColumn, String>(); + fieldMap.put("treeTableColumn1", object73); + object73.setPrefWidth(75.0); + object73.setText("C1"); + final var object74 = new javafx.scene.control.TreeTableColumn, Integer>(); + fieldMap.put("treeTableColumn2", object74); + object74.setPrefWidth(75.0); + object74.setSortType(javafx.scene.control.TreeTableColumn.SortType.DESCENDING); + object74.setText("C2"); + object72.getColumns().addAll(object73, object74); + final var object75 = new javafx.scene.control.TreeView(); + fieldMap.put("treeView", object75); + object75.setPrefHeight(200.0); + object75.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object75, 17); + final var object76 = new javafx.scene.web.WebView(); + fieldMap.put("webView", object76); + object76.setPrefHeight(200.0); + object76.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object76, 1); + javafx.scene.layout.GridPane.setRowIndex(object76, 17); + object0.getChildren().addAll(object22, object23, object24, object25, object28, object31, object32, object33, object34, object35, object36, object37, object38, object45, object49, object51, object52, object53, object55, object56, object57, object58, object59, object60, object61, object62, object63, object66, object69, object70, object71, object72, object75, object76); + final var controllerFactory = controllersMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + controller = (com.github.gtache.fxml.compiler.impl.ControlsController) controllerFactory.create(fieldMap); + object0.setOnInputMethodTextChanged(controller::inputMethodTextChanged); + object0.setOnKeyPressed(e -> controller.keyPressed()); + object0.setOnKeyReleased(controller::keyReleased); + object0.setOnKeyTyped(controller::keyTyped); + object58.setOnDragDetected(controller::dragDetected); + object58.setOnDragDone(controller::dragDone); + object58.setOnDragDropped(controller::dragDropped); + object58.setOnDragEntered(controller::dragEntered); + object58.setOnDragExited(controller::dragExited); + object58.setOnDragOver(controller::dragOver); + object58.setOnMouseDragEntered(controller::mouseDragEntered); + object58.setOnMouseDragExited(controller::mouseDragExited); + object58.setOnMouseDragOver(controller::mouseDragOver); + object58.setOnMouseDragReleased(controller::mouseDragReleased); + object60.setOnContextMenuRequested(controller::contextMenuRequested); + object60.setOnMouseClicked(e -> controller.mouseClicked()); + object60.setOnMouseDragged(controller::mouseDragged); + object60.setOnMouseEntered(controller::mouseEntered); + object60.setOnMouseExited(controller::mouseExited); + object60.setOnMouseMoved(controller::mouseMoved); + object60.setOnMousePressed(controller::mousePressed); + object60.setOnMouseReleased(controller::mouseReleased); + object60.setOnScroll(controller::onScroll); + object60.setOnScrollFinished(controller::onScrollFinished); + object60.setOnScrollStarted(controller::onScrollStarted); + object61.setOnZoom(controller::onZoom); + object61.setOnZoomFinished(controller::onZoomFinished); + object61.setOnZoomStarted(controller::onZoomStarted); + object71.setOnAction(controller::onAction); + object71.setOnRotate(controller::onRotate); + object71.setOnRotationFinished(controller::onRotationFinished); + object71.setOnRotationStarted(controller::onRotationStarted); + object73.setOnEditCancel(controller::onEditCancel); + object73.setOnEditCommit(controller::onEditCommit); + object73.setOnEditStart(controller::onEditStart); + object75.setOnSwipeDown(controller::onSwipeDown); + object75.setOnSwipeLeft(controller::onSwipeLeft); + object75.setOnSwipeRight(controller::onSwipeRight); + object75.setOnSwipeUp(controller::onSwipeUp); + object76.setOnTouchMoved(controller::onTouchMoved); + object76.setOnTouchPressed(controller::onTouchPressed); + object76.setOnTouchReleased(controller::onTouchReleased); + object76.setOnTouchStationary(controller::onTouchStationary); + controller.initialize(); + loaded = true; + return object0; +} + + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.ControlsController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-factory-reference-getbundle.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-factory-reference-getbundle.txt new file mode 100644 index 0000000..cebc5f5 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-factory-reference-getbundle.txt @@ -0,0 +1,428 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; +import com.github.gtache.fxml.compiler.ControllerFactory; + + +/** + * Generated code, not thread-safe + */ +public final class ControlsController { + + private final Map, ControllerFactory> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.ControlsController controller; + + /** + * Instantiates a new ControlsController with no nested controllers and no resource bundle + * @param controllerFactory The controller factory + */ + public ControlsController(final ControllerFactory controllerFactory) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controllerFactory), Map.of()); + } + + /** + * Instantiates a new ControlsController with no nested controllers + * @param controllerFactory The controller factory + * @param resourceBundle The resource bundle + */ + public ControlsController(final ControllerFactory controllerFactory, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controllerFactory), Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, resourceBundle)); + } + + /** + * Instantiates a new ControlsController with nested controllers + * @param controllersMap The map of controller class to controller factory + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public ControlsController(final Map, ControllerFactory> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + final var fieldMap = new HashMap(); + final var object0 = new javafx.scene.layout.GridPane(); + fieldMap.put("gridPane", object0); + final var object1 = new javafx.scene.layout.RowConstraints(); + final var object2 = new javafx.scene.layout.RowConstraints(); + final var object3 = new javafx.scene.layout.RowConstraints(); + final var object4 = new javafx.scene.layout.RowConstraints(); + final var object5 = new javafx.scene.layout.RowConstraints(); + final var object6 = new javafx.scene.layout.RowConstraints(); + final var object7 = new javafx.scene.layout.RowConstraints(); + final var object8 = new javafx.scene.layout.RowConstraints(); + final var object9 = new javafx.scene.layout.RowConstraints(); + final var object10 = new javafx.scene.layout.RowConstraints(); + final var object11 = new javafx.scene.layout.RowConstraints(); + final var object12 = new javafx.scene.layout.RowConstraints(); + final var object13 = new javafx.scene.layout.RowConstraints(); + final var object14 = new javafx.scene.layout.RowConstraints(); + final var object15 = new javafx.scene.layout.RowConstraints(); + final var object16 = new javafx.scene.layout.RowConstraints(); + final var object17 = new javafx.scene.layout.RowConstraints(); + final var object18 = new javafx.scene.layout.RowConstraints(); + object0.getRowConstraints().addAll(object1, object2, object3, object4, object5, object6, object7, object8, object9, object10, object11, object12, object13, object14, object15, object16, object17, object18); + final var object19 = new javafx.scene.layout.ColumnConstraints(); + final var object20 = new javafx.scene.layout.ColumnConstraints(); + final var object21 = new javafx.scene.layout.ColumnConstraints(); + object21.setMinWidth(10.0); + object21.setPrefWidth(100.0); + object0.getColumnConstraints().addAll(object19, object20, object21); + final var object22 = new javafx.scene.control.Button(); + fieldMap.put("button", object22); + object22.setMnemonicParsing(false); + object22.setText("Button"); + final var object23 = new javafx.scene.control.CheckBox(); + fieldMap.put("checkBox", object23); + object23.setIndeterminate(true); + object23.setMnemonicParsing(false); + object23.setText("CheckBox"); + javafx.scene.layout.GridPane.setColumnIndex(object23, 1); + final var object24 = new javafx.scene.control.ChoiceBox(); + fieldMap.put("choiceBox", object24); + object24.setCacheShape(false); + object24.setCenterShape(false); + object24.setDisable(true); + object24.setFocusTraversable(false); + object24.setPrefWidth(150.0); + object24.setScaleShape(false); + object24.setVisible(false); + javafx.scene.layout.GridPane.setRowIndex(object24, 1); + final var object25 = new javafx.scene.control.ColorPicker(); + fieldMap.put("colorPicker", object25); + object25.setNodeOrientation(javafx.geometry.NodeOrientation.LEFT_TO_RIGHT); + object25.setOpacity(0.5); + javafx.scene.layout.GridPane.setColumnIndex(object25, 1); + javafx.scene.layout.GridPane.setRowIndex(object25, 1); + final var object26 = new javafx.scene.paint.Color(0.7894737124443054, 0.08771929889917374, 0.08771929889917374, 1); + fieldMap.put("color", object26); + object25.setValue(object26); + final var object27 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object25.setOpaqueInsets(object27); + final var object28 = new javafx.scene.control.ComboBox(); + fieldMap.put("comboBox", object28); + object28.setEditable(true); + object28.setPrefWidth(150.0); + object28.setPromptText("Text"); + object28.setVisibleRowCount(5); + javafx.scene.layout.GridPane.setRowIndex(object28, 2); + final var object29 = javafx.scene.Cursor.CLOSED_HAND; + object28.setCursor(object29); + final var object30 = new javafx.scene.effect.Bloom(); + object28.setEffect(object30); + final var object31 = new javafx.scene.control.DatePicker(); + fieldMap.put("datePicker", object31); + object31.setShowWeekNumbers(true); + object31.setStyle("-fx-background-color: #ffffff;"); + javafx.scene.layout.GridPane.setColumnIndex(object31, 1); + javafx.scene.layout.GridPane.setRowIndex(object31, 2); + final var object32 = new javafx.scene.web.HTMLEditor(); + fieldMap.put("htmlEditor", object32); + object32.setHtmlText(""); + object32.setPrefHeight(200.0); + object32.setPrefWidth(506.0); + object32.getStyleClass().addAll("clazz"); + object32.getStylesheets().addAll("@style.css"); + javafx.scene.layout.GridPane.setRowIndex(object32, 3); + final var object33 = new javafx.scene.control.Hyperlink(); + fieldMap.put("hyperlink", object33); + object33.setText("Hyperlink"); + javafx.scene.layout.GridPane.setColumnIndex(object33, 1); + javafx.scene.layout.GridPane.setRowIndex(object33, 3); + final var object34 = new javafx.scene.image.ImageView(); + fieldMap.put("imageView", object34); + object34.setFitHeight(150.0); + object34.setFitWidth(200.0); + object34.setPickOnBounds(true); + object34.setPreserveRatio(true); + javafx.scene.layout.GridPane.setRowIndex(object34, 4); + final var object35 = new javafx.scene.control.Label(); + fieldMap.put("label", object35); + object35.setAccessibleHelp("TTTTT"); + object35.setAccessibleText("TTT"); + object35.setBlendMode(javafx.scene.effect.BlendMode.ADD); + object35.setCache(true); + object35.setCacheHint(javafx.scene.CacheHint.QUALITY); + object35.setDepthTest(javafx.scene.DepthTest.ENABLE); + object35.setMnemonicParsing(true); + object35.setMouseTransparent(true); + object35.setText(bundle.getString("include.label")); + javafx.scene.layout.GridPane.setColumnIndex(object35, 1); + javafx.scene.layout.GridPane.setRowIndex(object35, 4); + final var object36 = new javafx.scene.control.ListView(); + fieldMap.put("listView", object36); + object36.setFixedCellSize(20.0); + object36.setNodeOrientation(javafx.geometry.NodeOrientation.RIGHT_TO_LEFT); + object36.setOrientation(javafx.geometry.Orientation.HORIZONTAL); + object36.setPrefHeight(200.0); + object36.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object36, 5); + final var object37 = new javafx.scene.media.MediaView(); + fieldMap.put("mediaView", object37); + object37.setFitHeight(200.0); + object37.setFitWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object37, 1); + javafx.scene.layout.GridPane.setColumnSpan(object37, 2); + javafx.scene.layout.GridPane.setRowIndex(object37, 5); + javafx.scene.layout.GridPane.setRowSpan(object37, 2); + final var object38 = new javafx.scene.control.MenuBar(); + fieldMap.put("menuBar", object38); + javafx.scene.layout.GridPane.setHalignment(object38, javafx.geometry.HPos.RIGHT); + javafx.scene.layout.GridPane.setHgrow(object38, javafx.scene.layout.Priority.ALWAYS); + javafx.scene.layout.GridPane.setRowIndex(object38, 7); + javafx.scene.layout.GridPane.setValignment(object38, javafx.geometry.VPos.BASELINE); + javafx.scene.layout.GridPane.setVgrow(object38, javafx.scene.layout.Priority.SOMETIMES); + final var object39 = new javafx.scene.control.Menu(); + fieldMap.put("menu1", object39); + object39.setMnemonicParsing(false); + object39.setText("File"); + final var object40 = new javafx.scene.control.MenuItem(); + fieldMap.put("menuItem1", object40); + object40.setMnemonicParsing(false); + object40.setText("Close"); + object39.getItems().addAll(object40); + final var object41 = new javafx.scene.control.Menu(); + object41.setMnemonicParsing(false); + object41.setText("Edit"); + final var object42 = new javafx.scene.control.MenuItem(); + object42.setMnemonicParsing(false); + object42.setText("Delete"); + object41.getItems().addAll(object42); + final var object43 = new javafx.scene.control.Menu(); + object43.setMnemonicParsing(false); + object43.setText("Help"); + final var object44 = new javafx.scene.control.MenuItem(); + object44.setMnemonicParsing(false); + object44.setText("About"); + object43.getItems().addAll(object44); + object38.getMenus().addAll(object39, object41, object43); + final var object45 = new javafx.scene.control.MenuButton(); + fieldMap.put("menuButton", object45); + object45.setMnemonicParsing(false); + object45.setText("MenuButton"); + javafx.scene.layout.GridPane.setColumnIndex(object45, 1); + javafx.scene.layout.GridPane.setRowIndex(object45, 7); + final var object46 = new javafx.scene.control.MenuItem(); + object46.setMnemonicParsing(false); + object46.setText("Action 1"); + final var object47 = new javafx.scene.control.MenuItem(); + object47.setMnemonicParsing(false); + object47.setText("Action 2"); + object45.getItems().addAll(object46, object47); + final var object48 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + javafx.scene.layout.GridPane.setMargin(object45, object48); + final var object49 = new javafx.scene.control.Pagination(); + fieldMap.put("pagination", object49); + object49.setPrefHeight(200.0); + object49.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object49, 8); + final var object50 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object49.setPadding(object50); + final var object51 = new javafx.scene.control.PasswordField(); + fieldMap.put("passwordField", object51); + object51.setMaxHeight(6.0); + object51.setMaxWidth(5.0); + object51.setMinHeight(2.0); + object51.setMinWidth(1.0); + object51.setPrefColumnCount(7); + object51.setPrefHeight(4.0); + object51.setPrefWidth(3.0); + javafx.scene.layout.GridPane.setColumnIndex(object51, 1); + javafx.scene.layout.GridPane.setRowIndex(object51, 8); + final var object52 = new javafx.scene.control.ProgressBar(); + fieldMap.put("progressBar", object52); + object52.setLayoutX(10.0); + object52.setLayoutY(20.0); + object52.setPrefWidth(200.0); + object52.setProgress(0.0); + javafx.scene.layout.GridPane.setRowIndex(object52, 9); + final var object53 = new javafx.scene.control.ProgressIndicator(); + fieldMap.put("progressIndicator", object53); + object53.setProgress(0.0); + object53.setRotate(2.0); + javafx.scene.layout.GridPane.setColumnIndex(object53, 1); + javafx.scene.layout.GridPane.setRowIndex(object53, 9); + final var object54 = new javafx.geometry.Point3D(4.0, 5.0, 6.0); + object53.setRotationAxis(object54); + final var object55 = new javafx.scene.control.RadioButton(); + fieldMap.put("radioButton", object55); + object55.setMnemonicParsing(false); + object55.setScaleX(7.0); + object55.setScaleY(2.0); + object55.setScaleZ(3.0); + object55.setText("RadioButton"); + object55.setTranslateX(4.0); + object55.setTranslateY(5.0); + object55.setTranslateZ(6.0); + javafx.scene.layout.GridPane.setRowIndex(object55, 10); + final var object56 = new javafx.scene.control.ScrollBar(); + fieldMap.put("scrollBarH", object56); + javafx.scene.layout.GridPane.setColumnIndex(object56, 1); + javafx.scene.layout.GridPane.setRowIndex(object56, 10); + final var object57 = new javafx.scene.control.ScrollBar(); + fieldMap.put("scrollBarV", object57); + object57.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object57, 11); + final var object58 = new javafx.scene.control.Separator(); + fieldMap.put("separatorH", object58); + object58.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object58, 1); + javafx.scene.layout.GridPane.setRowIndex(object58, 11); + final var object59 = new javafx.scene.control.Separator(); + fieldMap.put("separatorV", object59); + object59.setOrientation(javafx.geometry.Orientation.VERTICAL); + object59.setPrefHeight(200.0); + javafx.scene.layout.GridPane.setRowIndex(object59, 12); + final var object60 = new javafx.scene.control.Slider(); + fieldMap.put("sliderH", object60); + javafx.scene.layout.GridPane.setColumnIndex(object60, 1); + javafx.scene.layout.GridPane.setRowIndex(object60, 12); + final var object61 = new javafx.scene.control.Slider(); + fieldMap.put("sliderV", object61); + object61.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object61, 13); + final var object62 = new javafx.scene.control.Spinner(); + fieldMap.put("spinner", object62); + javafx.scene.layout.GridPane.setColumnIndex(object62, 1); + javafx.scene.layout.GridPane.setRowIndex(object62, 13); + final var object63 = new javafx.scene.control.SplitMenuButton(); + fieldMap.put("splitMenuButton", object63); + object63.setMnemonicParsing(false); + object63.setText("SplitMenuButton"); + javafx.scene.layout.GridPane.setRowIndex(object63, 14); + final var object64 = new javafx.scene.control.MenuItem(); + fieldMap.put("item1", object64); + object64.setMnemonicParsing(false); + object64.setText("Action 1"); + final var object65 = new javafx.scene.control.MenuItem(); + fieldMap.put("item2", object65); + object65.setMnemonicParsing(false); + object65.setText("Action 2"); + object63.getItems().addAll(object64, object65); + final var object66 = new javafx.scene.control.TableView(); + fieldMap.put("tableView", object66); + object66.setPrefHeight(200.0); + object66.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object66, 1); + javafx.scene.layout.GridPane.setRowIndex(object66, 14); + final var object67 = new javafx.scene.control.TableColumn(); + fieldMap.put("tableColumn1", object67); + object67.setPrefWidth(75.0); + object67.setText("C1"); + final var object68 = new javafx.scene.control.TableColumn(); + fieldMap.put("tableColumn2", object68); + object68.setPrefWidth(75.0); + object68.setText("C2"); + object66.getColumns().addAll(object67, object68); + final var object69 = new javafx.scene.control.TextArea(); + fieldMap.put("textArea", object69); + object69.setPrefHeight(200.0); + object69.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object69, 15); + final var object70 = new javafx.scene.control.TextField(); + fieldMap.put("textField", object70); + javafx.scene.layout.GridPane.setColumnIndex(object70, 1); + javafx.scene.layout.GridPane.setRowIndex(object70, 15); + final var object71 = new javafx.scene.control.ToggleButton(); + object71.setMnemonicParsing(false); + object71.setText("ToggleButton"); + javafx.scene.layout.GridPane.setRowIndex(object71, 16); + final var object72 = new javafx.scene.control.TreeTableView>(); + fieldMap.put("treeTableView", object72); + object72.setPrefHeight(200.0); + object72.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object72, 1); + javafx.scene.layout.GridPane.setRowIndex(object72, 16); + final var object73 = new javafx.scene.control.TreeTableColumn, String>(); + fieldMap.put("treeTableColumn1", object73); + object73.setPrefWidth(75.0); + object73.setText("C1"); + final var object74 = new javafx.scene.control.TreeTableColumn, Integer>(); + fieldMap.put("treeTableColumn2", object74); + object74.setPrefWidth(75.0); + object74.setSortType(javafx.scene.control.TreeTableColumn.SortType.DESCENDING); + object74.setText("C2"); + object72.getColumns().addAll(object73, object74); + final var object75 = new javafx.scene.control.TreeView(); + fieldMap.put("treeView", object75); + object75.setPrefHeight(200.0); + object75.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object75, 17); + final var object76 = new javafx.scene.web.WebView(); + fieldMap.put("webView", object76); + object76.setPrefHeight(200.0); + object76.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object76, 1); + javafx.scene.layout.GridPane.setRowIndex(object76, 17); + object0.getChildren().addAll(object22, object23, object24, object25, object28, object31, object32, object33, object34, object35, object36, object37, object38, object45, object49, object51, object52, object53, object55, object56, object57, object58, object59, object60, object61, object62, object63, object66, object69, object70, object71, object72, object75, object76); + final var controllerFactory = controllersMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + controller = (com.github.gtache.fxml.compiler.impl.ControlsController) controllerFactory.create(fieldMap); + object0.setOnInputMethodTextChanged(controller::inputMethodTextChanged); + object0.setOnKeyPressed(e -> controller.keyPressed()); + object0.setOnKeyReleased(controller::keyReleased); + object0.setOnKeyTyped(controller::keyTyped); + object58.setOnDragDetected(controller::dragDetected); + object58.setOnDragDone(controller::dragDone); + object58.setOnDragDropped(controller::dragDropped); + object58.setOnDragEntered(controller::dragEntered); + object58.setOnDragExited(controller::dragExited); + object58.setOnDragOver(controller::dragOver); + object58.setOnMouseDragEntered(controller::mouseDragEntered); + object58.setOnMouseDragExited(controller::mouseDragExited); + object58.setOnMouseDragOver(controller::mouseDragOver); + object58.setOnMouseDragReleased(controller::mouseDragReleased); + object60.setOnContextMenuRequested(controller::contextMenuRequested); + object60.setOnMouseClicked(e -> controller.mouseClicked()); + object60.setOnMouseDragged(controller::mouseDragged); + object60.setOnMouseEntered(controller::mouseEntered); + object60.setOnMouseExited(controller::mouseExited); + object60.setOnMouseMoved(controller::mouseMoved); + object60.setOnMousePressed(controller::mousePressed); + object60.setOnMouseReleased(controller::mouseReleased); + object60.setOnScroll(controller::onScroll); + object60.setOnScrollFinished(controller::onScrollFinished); + object60.setOnScrollStarted(controller::onScrollStarted); + object61.setOnZoom(controller::onZoom); + object61.setOnZoomFinished(controller::onZoomFinished); + object61.setOnZoomStarted(controller::onZoomStarted); + object71.setOnAction(controller::onAction); + object71.setOnRotate(controller::onRotate); + object71.setOnRotationFinished(controller::onRotationFinished); + object71.setOnRotationStarted(controller::onRotationStarted); + object73.setOnEditCancel(controller::onEditCancel); + object73.setOnEditCommit(controller::onEditCommit); + object73.setOnEditStart(controller::onEditStart); + object75.setOnSwipeDown(controller::onSwipeDown); + object75.setOnSwipeLeft(controller::onSwipeLeft); + object75.setOnSwipeRight(controller::onSwipeRight); + object75.setOnSwipeUp(controller::onSwipeUp); + object76.setOnTouchMoved(controller::onTouchMoved); + object76.setOnTouchPressed(controller::onTouchPressed); + object76.setOnTouchReleased(controller::onTouchReleased); + object76.setOnTouchStationary(controller::onTouchStationary); + controller.initialize(); + loaded = true; + return object0; +} + + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.ControlsController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-factory-reference-getter.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-factory-reference-getter.txt new file mode 100644 index 0000000..b9d5928 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-factory-reference-getter.txt @@ -0,0 +1,427 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; +import com.github.gtache.fxml.compiler.ControllerFactory; + + +/** + * Generated code, not thread-safe + */ +public final class ControlsController { + + private final Map, ControllerFactory> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.ControlsController controller; + + /** + * Instantiates a new ControlsController with no nested controllers and no resource bundle + * @param controllerFactory The controller factory + */ + public ControlsController(final ControllerFactory controllerFactory) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controllerFactory), Map.of()); + } + + /** + * Instantiates a new ControlsController with no nested controllers + * @param controllerFactory The controller factory + * @param resourceBundle The resource bundle + */ + public ControlsController(final ControllerFactory controllerFactory, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controllerFactory), Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, resourceBundle)); + } + + /** + * Instantiates a new ControlsController with nested controllers + * @param controllersMap The map of controller class to controller factory + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public ControlsController(final Map, ControllerFactory> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var fieldMap = new HashMap(); + final var object0 = new javafx.scene.layout.GridPane(); + fieldMap.put("gridPane", object0); + final var object1 = new javafx.scene.layout.RowConstraints(); + final var object2 = new javafx.scene.layout.RowConstraints(); + final var object3 = new javafx.scene.layout.RowConstraints(); + final var object4 = new javafx.scene.layout.RowConstraints(); + final var object5 = new javafx.scene.layout.RowConstraints(); + final var object6 = new javafx.scene.layout.RowConstraints(); + final var object7 = new javafx.scene.layout.RowConstraints(); + final var object8 = new javafx.scene.layout.RowConstraints(); + final var object9 = new javafx.scene.layout.RowConstraints(); + final var object10 = new javafx.scene.layout.RowConstraints(); + final var object11 = new javafx.scene.layout.RowConstraints(); + final var object12 = new javafx.scene.layout.RowConstraints(); + final var object13 = new javafx.scene.layout.RowConstraints(); + final var object14 = new javafx.scene.layout.RowConstraints(); + final var object15 = new javafx.scene.layout.RowConstraints(); + final var object16 = new javafx.scene.layout.RowConstraints(); + final var object17 = new javafx.scene.layout.RowConstraints(); + final var object18 = new javafx.scene.layout.RowConstraints(); + object0.getRowConstraints().addAll(object1, object2, object3, object4, object5, object6, object7, object8, object9, object10, object11, object12, object13, object14, object15, object16, object17, object18); + final var object19 = new javafx.scene.layout.ColumnConstraints(); + final var object20 = new javafx.scene.layout.ColumnConstraints(); + final var object21 = new javafx.scene.layout.ColumnConstraints(); + object21.setMinWidth(10.0); + object21.setPrefWidth(100.0); + object0.getColumnConstraints().addAll(object19, object20, object21); + final var object22 = new javafx.scene.control.Button(); + fieldMap.put("button", object22); + object22.setMnemonicParsing(false); + object22.setText("Button"); + final var object23 = new javafx.scene.control.CheckBox(); + fieldMap.put("checkBox", object23); + object23.setIndeterminate(true); + object23.setMnemonicParsing(false); + object23.setText("CheckBox"); + javafx.scene.layout.GridPane.setColumnIndex(object23, 1); + final var object24 = new javafx.scene.control.ChoiceBox(); + fieldMap.put("choiceBox", object24); + object24.setCacheShape(false); + object24.setCenterShape(false); + object24.setDisable(true); + object24.setFocusTraversable(false); + object24.setPrefWidth(150.0); + object24.setScaleShape(false); + object24.setVisible(false); + javafx.scene.layout.GridPane.setRowIndex(object24, 1); + final var object25 = new javafx.scene.control.ColorPicker(); + fieldMap.put("colorPicker", object25); + object25.setNodeOrientation(javafx.geometry.NodeOrientation.LEFT_TO_RIGHT); + object25.setOpacity(0.5); + javafx.scene.layout.GridPane.setColumnIndex(object25, 1); + javafx.scene.layout.GridPane.setRowIndex(object25, 1); + final var object26 = new javafx.scene.paint.Color(0.7894737124443054, 0.08771929889917374, 0.08771929889917374, 1); + fieldMap.put("color", object26); + object25.setValue(object26); + final var object27 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object25.setOpaqueInsets(object27); + final var object28 = new javafx.scene.control.ComboBox(); + fieldMap.put("comboBox", object28); + object28.setEditable(true); + object28.setPrefWidth(150.0); + object28.setPromptText("Text"); + object28.setVisibleRowCount(5); + javafx.scene.layout.GridPane.setRowIndex(object28, 2); + final var object29 = javafx.scene.Cursor.CLOSED_HAND; + object28.setCursor(object29); + final var object30 = new javafx.scene.effect.Bloom(); + object28.setEffect(object30); + final var object31 = new javafx.scene.control.DatePicker(); + fieldMap.put("datePicker", object31); + object31.setShowWeekNumbers(true); + object31.setStyle("-fx-background-color: #ffffff;"); + javafx.scene.layout.GridPane.setColumnIndex(object31, 1); + javafx.scene.layout.GridPane.setRowIndex(object31, 2); + final var object32 = new javafx.scene.web.HTMLEditor(); + fieldMap.put("htmlEditor", object32); + object32.setHtmlText(""); + object32.setPrefHeight(200.0); + object32.setPrefWidth(506.0); + object32.getStyleClass().addAll("clazz"); + object32.getStylesheets().addAll("@style.css"); + javafx.scene.layout.GridPane.setRowIndex(object32, 3); + final var object33 = new javafx.scene.control.Hyperlink(); + fieldMap.put("hyperlink", object33); + object33.setText("Hyperlink"); + javafx.scene.layout.GridPane.setColumnIndex(object33, 1); + javafx.scene.layout.GridPane.setRowIndex(object33, 3); + final var object34 = new javafx.scene.image.ImageView(); + fieldMap.put("imageView", object34); + object34.setFitHeight(150.0); + object34.setFitWidth(200.0); + object34.setPickOnBounds(true); + object34.setPreserveRatio(true); + javafx.scene.layout.GridPane.setRowIndex(object34, 4); + final var object35 = new javafx.scene.control.Label(); + fieldMap.put("label", object35); + object35.setAccessibleHelp("TTTTT"); + object35.setAccessibleText("TTT"); + object35.setBlendMode(javafx.scene.effect.BlendMode.ADD); + object35.setCache(true); + object35.setCacheHint(javafx.scene.CacheHint.QUALITY); + object35.setDepthTest(javafx.scene.DepthTest.ENABLE); + object35.setMnemonicParsing(true); + object35.setMouseTransparent(true); + javafx.scene.layout.GridPane.setColumnIndex(object35, 1); + javafx.scene.layout.GridPane.setRowIndex(object35, 4); + final var object36 = new javafx.scene.control.ListView(); + fieldMap.put("listView", object36); + object36.setFixedCellSize(20.0); + object36.setNodeOrientation(javafx.geometry.NodeOrientation.RIGHT_TO_LEFT); + object36.setOrientation(javafx.geometry.Orientation.HORIZONTAL); + object36.setPrefHeight(200.0); + object36.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object36, 5); + final var object37 = new javafx.scene.media.MediaView(); + fieldMap.put("mediaView", object37); + object37.setFitHeight(200.0); + object37.setFitWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object37, 1); + javafx.scene.layout.GridPane.setColumnSpan(object37, 2); + javafx.scene.layout.GridPane.setRowIndex(object37, 5); + javafx.scene.layout.GridPane.setRowSpan(object37, 2); + final var object38 = new javafx.scene.control.MenuBar(); + fieldMap.put("menuBar", object38); + javafx.scene.layout.GridPane.setHalignment(object38, javafx.geometry.HPos.RIGHT); + javafx.scene.layout.GridPane.setHgrow(object38, javafx.scene.layout.Priority.ALWAYS); + javafx.scene.layout.GridPane.setRowIndex(object38, 7); + javafx.scene.layout.GridPane.setValignment(object38, javafx.geometry.VPos.BASELINE); + javafx.scene.layout.GridPane.setVgrow(object38, javafx.scene.layout.Priority.SOMETIMES); + final var object39 = new javafx.scene.control.Menu(); + fieldMap.put("menu1", object39); + object39.setMnemonicParsing(false); + object39.setText("File"); + final var object40 = new javafx.scene.control.MenuItem(); + fieldMap.put("menuItem1", object40); + object40.setMnemonicParsing(false); + object40.setText("Close"); + object39.getItems().addAll(object40); + final var object41 = new javafx.scene.control.Menu(); + object41.setMnemonicParsing(false); + object41.setText("Edit"); + final var object42 = new javafx.scene.control.MenuItem(); + object42.setMnemonicParsing(false); + object42.setText("Delete"); + object41.getItems().addAll(object42); + final var object43 = new javafx.scene.control.Menu(); + object43.setMnemonicParsing(false); + object43.setText("Help"); + final var object44 = new javafx.scene.control.MenuItem(); + object44.setMnemonicParsing(false); + object44.setText("About"); + object43.getItems().addAll(object44); + object38.getMenus().addAll(object39, object41, object43); + final var object45 = new javafx.scene.control.MenuButton(); + fieldMap.put("menuButton", object45); + object45.setMnemonicParsing(false); + object45.setText("MenuButton"); + javafx.scene.layout.GridPane.setColumnIndex(object45, 1); + javafx.scene.layout.GridPane.setRowIndex(object45, 7); + final var object46 = new javafx.scene.control.MenuItem(); + object46.setMnemonicParsing(false); + object46.setText("Action 1"); + final var object47 = new javafx.scene.control.MenuItem(); + object47.setMnemonicParsing(false); + object47.setText("Action 2"); + object45.getItems().addAll(object46, object47); + final var object48 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + javafx.scene.layout.GridPane.setMargin(object45, object48); + final var object49 = new javafx.scene.control.Pagination(); + fieldMap.put("pagination", object49); + object49.setPrefHeight(200.0); + object49.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object49, 8); + final var object50 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object49.setPadding(object50); + final var object51 = new javafx.scene.control.PasswordField(); + fieldMap.put("passwordField", object51); + object51.setMaxHeight(6.0); + object51.setMaxWidth(5.0); + object51.setMinHeight(2.0); + object51.setMinWidth(1.0); + object51.setPrefColumnCount(7); + object51.setPrefHeight(4.0); + object51.setPrefWidth(3.0); + javafx.scene.layout.GridPane.setColumnIndex(object51, 1); + javafx.scene.layout.GridPane.setRowIndex(object51, 8); + final var object52 = new javafx.scene.control.ProgressBar(); + fieldMap.put("progressBar", object52); + object52.setLayoutX(10.0); + object52.setLayoutY(20.0); + object52.setPrefWidth(200.0); + object52.setProgress(0.0); + javafx.scene.layout.GridPane.setRowIndex(object52, 9); + final var object53 = new javafx.scene.control.ProgressIndicator(); + fieldMap.put("progressIndicator", object53); + object53.setProgress(0.0); + object53.setRotate(2.0); + javafx.scene.layout.GridPane.setColumnIndex(object53, 1); + javafx.scene.layout.GridPane.setRowIndex(object53, 9); + final var object54 = new javafx.geometry.Point3D(4.0, 5.0, 6.0); + object53.setRotationAxis(object54); + final var object55 = new javafx.scene.control.RadioButton(); + fieldMap.put("radioButton", object55); + object55.setMnemonicParsing(false); + object55.setScaleX(7.0); + object55.setScaleY(2.0); + object55.setScaleZ(3.0); + object55.setText("RadioButton"); + object55.setTranslateX(4.0); + object55.setTranslateY(5.0); + object55.setTranslateZ(6.0); + javafx.scene.layout.GridPane.setRowIndex(object55, 10); + final var object56 = new javafx.scene.control.ScrollBar(); + fieldMap.put("scrollBarH", object56); + javafx.scene.layout.GridPane.setColumnIndex(object56, 1); + javafx.scene.layout.GridPane.setRowIndex(object56, 10); + final var object57 = new javafx.scene.control.ScrollBar(); + fieldMap.put("scrollBarV", object57); + object57.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object57, 11); + final var object58 = new javafx.scene.control.Separator(); + fieldMap.put("separatorH", object58); + object58.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object58, 1); + javafx.scene.layout.GridPane.setRowIndex(object58, 11); + final var object59 = new javafx.scene.control.Separator(); + fieldMap.put("separatorV", object59); + object59.setOrientation(javafx.geometry.Orientation.VERTICAL); + object59.setPrefHeight(200.0); + javafx.scene.layout.GridPane.setRowIndex(object59, 12); + final var object60 = new javafx.scene.control.Slider(); + fieldMap.put("sliderH", object60); + javafx.scene.layout.GridPane.setColumnIndex(object60, 1); + javafx.scene.layout.GridPane.setRowIndex(object60, 12); + final var object61 = new javafx.scene.control.Slider(); + fieldMap.put("sliderV", object61); + object61.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object61, 13); + final var object62 = new javafx.scene.control.Spinner(); + fieldMap.put("spinner", object62); + javafx.scene.layout.GridPane.setColumnIndex(object62, 1); + javafx.scene.layout.GridPane.setRowIndex(object62, 13); + final var object63 = new javafx.scene.control.SplitMenuButton(); + fieldMap.put("splitMenuButton", object63); + object63.setMnemonicParsing(false); + object63.setText("SplitMenuButton"); + javafx.scene.layout.GridPane.setRowIndex(object63, 14); + final var object64 = new javafx.scene.control.MenuItem(); + fieldMap.put("item1", object64); + object64.setMnemonicParsing(false); + object64.setText("Action 1"); + final var object65 = new javafx.scene.control.MenuItem(); + fieldMap.put("item2", object65); + object65.setMnemonicParsing(false); + object65.setText("Action 2"); + object63.getItems().addAll(object64, object65); + final var object66 = new javafx.scene.control.TableView(); + fieldMap.put("tableView", object66); + object66.setPrefHeight(200.0); + object66.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object66, 1); + javafx.scene.layout.GridPane.setRowIndex(object66, 14); + final var object67 = new javafx.scene.control.TableColumn(); + fieldMap.put("tableColumn1", object67); + object67.setPrefWidth(75.0); + object67.setText("C1"); + final var object68 = new javafx.scene.control.TableColumn(); + fieldMap.put("tableColumn2", object68); + object68.setPrefWidth(75.0); + object68.setText("C2"); + object66.getColumns().addAll(object67, object68); + final var object69 = new javafx.scene.control.TextArea(); + fieldMap.put("textArea", object69); + object69.setPrefHeight(200.0); + object69.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object69, 15); + final var object70 = new javafx.scene.control.TextField(); + fieldMap.put("textField", object70); + javafx.scene.layout.GridPane.setColumnIndex(object70, 1); + javafx.scene.layout.GridPane.setRowIndex(object70, 15); + final var object71 = new javafx.scene.control.ToggleButton(); + object71.setMnemonicParsing(false); + object71.setText("ToggleButton"); + javafx.scene.layout.GridPane.setRowIndex(object71, 16); + final var object72 = new javafx.scene.control.TreeTableView>(); + fieldMap.put("treeTableView", object72); + object72.setPrefHeight(200.0); + object72.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object72, 1); + javafx.scene.layout.GridPane.setRowIndex(object72, 16); + final var object73 = new javafx.scene.control.TreeTableColumn, String>(); + fieldMap.put("treeTableColumn1", object73); + object73.setPrefWidth(75.0); + object73.setText("C1"); + final var object74 = new javafx.scene.control.TreeTableColumn, Integer>(); + fieldMap.put("treeTableColumn2", object74); + object74.setPrefWidth(75.0); + object74.setSortType(javafx.scene.control.TreeTableColumn.SortType.DESCENDING); + object74.setText("C2"); + object72.getColumns().addAll(object73, object74); + final var object75 = new javafx.scene.control.TreeView(); + fieldMap.put("treeView", object75); + object75.setPrefHeight(200.0); + object75.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object75, 17); + final var object76 = new javafx.scene.web.WebView(); + fieldMap.put("webView", object76); + object76.setPrefHeight(200.0); + object76.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object76, 1); + javafx.scene.layout.GridPane.setRowIndex(object76, 17); + object0.getChildren().addAll(object22, object23, object24, object25, object28, object31, object32, object33, object34, object35, object36, object37, object38, object45, object49, object51, object52, object53, object55, object56, object57, object58, object59, object60, object61, object62, object63, object66, object69, object70, object71, object72, object75, object76); + final var controllerFactory = controllersMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + controller = (com.github.gtache.fxml.compiler.impl.ControlsController) controllerFactory.create(fieldMap); + object0.setOnInputMethodTextChanged(controller::inputMethodTextChanged); + object0.setOnKeyPressed(e -> controller.keyPressed()); + object0.setOnKeyReleased(controller::keyReleased); + object0.setOnKeyTyped(controller::keyTyped); + object35.setText(controller.resources().getString("include.label")); + object58.setOnDragDetected(controller::dragDetected); + object58.setOnDragDone(controller::dragDone); + object58.setOnDragDropped(controller::dragDropped); + object58.setOnDragEntered(controller::dragEntered); + object58.setOnDragExited(controller::dragExited); + object58.setOnDragOver(controller::dragOver); + object58.setOnMouseDragEntered(controller::mouseDragEntered); + object58.setOnMouseDragExited(controller::mouseDragExited); + object58.setOnMouseDragOver(controller::mouseDragOver); + object58.setOnMouseDragReleased(controller::mouseDragReleased); + object60.setOnContextMenuRequested(controller::contextMenuRequested); + object60.setOnMouseClicked(e -> controller.mouseClicked()); + object60.setOnMouseDragged(controller::mouseDragged); + object60.setOnMouseEntered(controller::mouseEntered); + object60.setOnMouseExited(controller::mouseExited); + object60.setOnMouseMoved(controller::mouseMoved); + object60.setOnMousePressed(controller::mousePressed); + object60.setOnMouseReleased(controller::mouseReleased); + object60.setOnScroll(controller::onScroll); + object60.setOnScrollFinished(controller::onScrollFinished); + object60.setOnScrollStarted(controller::onScrollStarted); + object61.setOnZoom(controller::onZoom); + object61.setOnZoomFinished(controller::onZoomFinished); + object61.setOnZoomStarted(controller::onZoomStarted); + object71.setOnAction(controller::onAction); + object71.setOnRotate(controller::onRotate); + object71.setOnRotationFinished(controller::onRotationFinished); + object71.setOnRotationStarted(controller::onRotationStarted); + object73.setOnEditCancel(controller::onEditCancel); + object73.setOnEditCommit(controller::onEditCommit); + object73.setOnEditStart(controller::onEditStart); + object75.setOnSwipeDown(controller::onSwipeDown); + object75.setOnSwipeLeft(controller::onSwipeLeft); + object75.setOnSwipeRight(controller::onSwipeRight); + object75.setOnSwipeUp(controller::onSwipeUp); + object76.setOnTouchMoved(controller::onTouchMoved); + object76.setOnTouchPressed(controller::onTouchPressed); + object76.setOnTouchReleased(controller::onTouchReleased); + object76.setOnTouchStationary(controller::onTouchStationary); + controller.initialize(); + loaded = true; + return object0; +} + + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.ControlsController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-factory-reflection-constructor.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-factory-reflection-constructor.txt new file mode 100644 index 0000000..34e3bcf --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-factory-reflection-constructor.txt @@ -0,0 +1,472 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; +import com.github.gtache.fxml.compiler.ControllerFactory; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import javafx.event.Event; +import java.lang.reflect.Method; + + +/** + * Generated code, not thread-safe + */ +public final class ControlsController { + + private final Map, ControllerFactory> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.ControlsController controller; + + /** + * Instantiates a new ControlsController with no nested controllers and no resource bundle + * @param controllerFactory The controller factory + */ + public ControlsController(final ControllerFactory controllerFactory) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controllerFactory), Map.of()); + } + + /** + * Instantiates a new ControlsController with no nested controllers + * @param controllerFactory The controller factory + * @param resourceBundle The resource bundle + */ + public ControlsController(final ControllerFactory controllerFactory, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controllerFactory), Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, resourceBundle)); + } + + /** + * Instantiates a new ControlsController with nested controllers + * @param controllersMap The map of controller class to controller factory + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public ControlsController(final Map, ControllerFactory> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = resourceBundlesMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + final var fieldMap = new HashMap(); + final var object0 = new javafx.scene.layout.GridPane(); + fieldMap.put("gridPane", object0); + final var object1 = new javafx.scene.layout.RowConstraints(); + final var object2 = new javafx.scene.layout.RowConstraints(); + final var object3 = new javafx.scene.layout.RowConstraints(); + final var object4 = new javafx.scene.layout.RowConstraints(); + final var object5 = new javafx.scene.layout.RowConstraints(); + final var object6 = new javafx.scene.layout.RowConstraints(); + final var object7 = new javafx.scene.layout.RowConstraints(); + final var object8 = new javafx.scene.layout.RowConstraints(); + final var object9 = new javafx.scene.layout.RowConstraints(); + final var object10 = new javafx.scene.layout.RowConstraints(); + final var object11 = new javafx.scene.layout.RowConstraints(); + final var object12 = new javafx.scene.layout.RowConstraints(); + final var object13 = new javafx.scene.layout.RowConstraints(); + final var object14 = new javafx.scene.layout.RowConstraints(); + final var object15 = new javafx.scene.layout.RowConstraints(); + final var object16 = new javafx.scene.layout.RowConstraints(); + final var object17 = new javafx.scene.layout.RowConstraints(); + final var object18 = new javafx.scene.layout.RowConstraints(); + object0.getRowConstraints().addAll(object1, object2, object3, object4, object5, object6, object7, object8, object9, object10, object11, object12, object13, object14, object15, object16, object17, object18); + final var object19 = new javafx.scene.layout.ColumnConstraints(); + final var object20 = new javafx.scene.layout.ColumnConstraints(); + final var object21 = new javafx.scene.layout.ColumnConstraints(); + object21.setMinWidth(10.0); + object21.setPrefWidth(100.0); + object0.getColumnConstraints().addAll(object19, object20, object21); + final var object22 = new javafx.scene.control.Button(); + fieldMap.put("button", object22); + object22.setMnemonicParsing(false); + object22.setText("Button"); + final var object23 = new javafx.scene.control.CheckBox(); + fieldMap.put("checkBox", object23); + object23.setIndeterminate(true); + object23.setMnemonicParsing(false); + object23.setText("CheckBox"); + javafx.scene.layout.GridPane.setColumnIndex(object23, 1); + final var object24 = new javafx.scene.control.ChoiceBox(); + fieldMap.put("choiceBox", object24); + object24.setCacheShape(false); + object24.setCenterShape(false); + object24.setDisable(true); + object24.setFocusTraversable(false); + object24.setPrefWidth(150.0); + object24.setScaleShape(false); + object24.setVisible(false); + javafx.scene.layout.GridPane.setRowIndex(object24, 1); + final var object25 = new javafx.scene.control.ColorPicker(); + fieldMap.put("colorPicker", object25); + object25.setNodeOrientation(javafx.geometry.NodeOrientation.LEFT_TO_RIGHT); + object25.setOpacity(0.5); + javafx.scene.layout.GridPane.setColumnIndex(object25, 1); + javafx.scene.layout.GridPane.setRowIndex(object25, 1); + final var object26 = new javafx.scene.paint.Color(0.7894737124443054, 0.08771929889917374, 0.08771929889917374, 1); + fieldMap.put("color", object26); + object25.setValue(object26); + final var object27 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object25.setOpaqueInsets(object27); + final var object28 = new javafx.scene.control.ComboBox(); + fieldMap.put("comboBox", object28); + object28.setEditable(true); + object28.setPrefWidth(150.0); + object28.setPromptText("Text"); + object28.setVisibleRowCount(5); + javafx.scene.layout.GridPane.setRowIndex(object28, 2); + final var object29 = javafx.scene.Cursor.CLOSED_HAND; + object28.setCursor(object29); + final var object30 = new javafx.scene.effect.Bloom(); + object28.setEffect(object30); + final var object31 = new javafx.scene.control.DatePicker(); + fieldMap.put("datePicker", object31); + object31.setShowWeekNumbers(true); + object31.setStyle("-fx-background-color: #ffffff;"); + javafx.scene.layout.GridPane.setColumnIndex(object31, 1); + javafx.scene.layout.GridPane.setRowIndex(object31, 2); + final var object32 = new javafx.scene.web.HTMLEditor(); + fieldMap.put("htmlEditor", object32); + object32.setHtmlText(""); + object32.setPrefHeight(200.0); + object32.setPrefWidth(506.0); + object32.getStyleClass().addAll("clazz"); + object32.getStylesheets().addAll("@style.css"); + javafx.scene.layout.GridPane.setRowIndex(object32, 3); + final var object33 = new javafx.scene.control.Hyperlink(); + fieldMap.put("hyperlink", object33); + object33.setText("Hyperlink"); + javafx.scene.layout.GridPane.setColumnIndex(object33, 1); + javafx.scene.layout.GridPane.setRowIndex(object33, 3); + final var object34 = new javafx.scene.image.ImageView(); + fieldMap.put("imageView", object34); + object34.setFitHeight(150.0); + object34.setFitWidth(200.0); + object34.setPickOnBounds(true); + object34.setPreserveRatio(true); + javafx.scene.layout.GridPane.setRowIndex(object34, 4); + final var object35 = new javafx.scene.control.Label(); + fieldMap.put("label", object35); + object35.setAccessibleHelp("TTTTT"); + object35.setAccessibleText("TTT"); + object35.setBlendMode(javafx.scene.effect.BlendMode.ADD); + object35.setCache(true); + object35.setCacheHint(javafx.scene.CacheHint.QUALITY); + object35.setDepthTest(javafx.scene.DepthTest.ENABLE); + object35.setMnemonicParsing(true); + object35.setMouseTransparent(true); + object35.setText(bundle.getString("include.label")); + javafx.scene.layout.GridPane.setColumnIndex(object35, 1); + javafx.scene.layout.GridPane.setRowIndex(object35, 4); + final var object36 = new javafx.scene.control.ListView(); + fieldMap.put("listView", object36); + object36.setFixedCellSize(20.0); + object36.setNodeOrientation(javafx.geometry.NodeOrientation.RIGHT_TO_LEFT); + object36.setOrientation(javafx.geometry.Orientation.HORIZONTAL); + object36.setPrefHeight(200.0); + object36.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object36, 5); + final var object37 = new javafx.scene.media.MediaView(); + fieldMap.put("mediaView", object37); + object37.setFitHeight(200.0); + object37.setFitWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object37, 1); + javafx.scene.layout.GridPane.setColumnSpan(object37, 2); + javafx.scene.layout.GridPane.setRowIndex(object37, 5); + javafx.scene.layout.GridPane.setRowSpan(object37, 2); + final var object38 = new javafx.scene.control.MenuBar(); + fieldMap.put("menuBar", object38); + javafx.scene.layout.GridPane.setHalignment(object38, javafx.geometry.HPos.RIGHT); + javafx.scene.layout.GridPane.setHgrow(object38, javafx.scene.layout.Priority.ALWAYS); + javafx.scene.layout.GridPane.setRowIndex(object38, 7); + javafx.scene.layout.GridPane.setValignment(object38, javafx.geometry.VPos.BASELINE); + javafx.scene.layout.GridPane.setVgrow(object38, javafx.scene.layout.Priority.SOMETIMES); + final var object39 = new javafx.scene.control.Menu(); + fieldMap.put("menu1", object39); + object39.setMnemonicParsing(false); + object39.setText("File"); + final var object40 = new javafx.scene.control.MenuItem(); + fieldMap.put("menuItem1", object40); + object40.setMnemonicParsing(false); + object40.setText("Close"); + object39.getItems().addAll(object40); + final var object41 = new javafx.scene.control.Menu(); + object41.setMnemonicParsing(false); + object41.setText("Edit"); + final var object42 = new javafx.scene.control.MenuItem(); + object42.setMnemonicParsing(false); + object42.setText("Delete"); + object41.getItems().addAll(object42); + final var object43 = new javafx.scene.control.Menu(); + object43.setMnemonicParsing(false); + object43.setText("Help"); + final var object44 = new javafx.scene.control.MenuItem(); + object44.setMnemonicParsing(false); + object44.setText("About"); + object43.getItems().addAll(object44); + object38.getMenus().addAll(object39, object41, object43); + final var object45 = new javafx.scene.control.MenuButton(); + fieldMap.put("menuButton", object45); + object45.setMnemonicParsing(false); + object45.setText("MenuButton"); + javafx.scene.layout.GridPane.setColumnIndex(object45, 1); + javafx.scene.layout.GridPane.setRowIndex(object45, 7); + final var object46 = new javafx.scene.control.MenuItem(); + object46.setMnemonicParsing(false); + object46.setText("Action 1"); + final var object47 = new javafx.scene.control.MenuItem(); + object47.setMnemonicParsing(false); + object47.setText("Action 2"); + object45.getItems().addAll(object46, object47); + final var object48 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + javafx.scene.layout.GridPane.setMargin(object45, object48); + final var object49 = new javafx.scene.control.Pagination(); + fieldMap.put("pagination", object49); + object49.setPrefHeight(200.0); + object49.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object49, 8); + final var object50 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object49.setPadding(object50); + final var object51 = new javafx.scene.control.PasswordField(); + fieldMap.put("passwordField", object51); + object51.setMaxHeight(6.0); + object51.setMaxWidth(5.0); + object51.setMinHeight(2.0); + object51.setMinWidth(1.0); + object51.setPrefColumnCount(7); + object51.setPrefHeight(4.0); + object51.setPrefWidth(3.0); + javafx.scene.layout.GridPane.setColumnIndex(object51, 1); + javafx.scene.layout.GridPane.setRowIndex(object51, 8); + final var object52 = new javafx.scene.control.ProgressBar(); + fieldMap.put("progressBar", object52); + object52.setLayoutX(10.0); + object52.setLayoutY(20.0); + object52.setPrefWidth(200.0); + object52.setProgress(0.0); + javafx.scene.layout.GridPane.setRowIndex(object52, 9); + final var object53 = new javafx.scene.control.ProgressIndicator(); + fieldMap.put("progressIndicator", object53); + object53.setProgress(0.0); + object53.setRotate(2.0); + javafx.scene.layout.GridPane.setColumnIndex(object53, 1); + javafx.scene.layout.GridPane.setRowIndex(object53, 9); + final var object54 = new javafx.geometry.Point3D(4.0, 5.0, 6.0); + object53.setRotationAxis(object54); + final var object55 = new javafx.scene.control.RadioButton(); + fieldMap.put("radioButton", object55); + object55.setMnemonicParsing(false); + object55.setScaleX(7.0); + object55.setScaleY(2.0); + object55.setScaleZ(3.0); + object55.setText("RadioButton"); + object55.setTranslateX(4.0); + object55.setTranslateY(5.0); + object55.setTranslateZ(6.0); + javafx.scene.layout.GridPane.setRowIndex(object55, 10); + final var object56 = new javafx.scene.control.ScrollBar(); + fieldMap.put("scrollBarH", object56); + javafx.scene.layout.GridPane.setColumnIndex(object56, 1); + javafx.scene.layout.GridPane.setRowIndex(object56, 10); + final var object57 = new javafx.scene.control.ScrollBar(); + fieldMap.put("scrollBarV", object57); + object57.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object57, 11); + final var object58 = new javafx.scene.control.Separator(); + fieldMap.put("separatorH", object58); + object58.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object58, 1); + javafx.scene.layout.GridPane.setRowIndex(object58, 11); + final var object59 = new javafx.scene.control.Separator(); + fieldMap.put("separatorV", object59); + object59.setOrientation(javafx.geometry.Orientation.VERTICAL); + object59.setPrefHeight(200.0); + javafx.scene.layout.GridPane.setRowIndex(object59, 12); + final var object60 = new javafx.scene.control.Slider(); + fieldMap.put("sliderH", object60); + javafx.scene.layout.GridPane.setColumnIndex(object60, 1); + javafx.scene.layout.GridPane.setRowIndex(object60, 12); + final var object61 = new javafx.scene.control.Slider(); + fieldMap.put("sliderV", object61); + object61.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object61, 13); + final var object62 = new javafx.scene.control.Spinner(); + fieldMap.put("spinner", object62); + javafx.scene.layout.GridPane.setColumnIndex(object62, 1); + javafx.scene.layout.GridPane.setRowIndex(object62, 13); + final var object63 = new javafx.scene.control.SplitMenuButton(); + fieldMap.put("splitMenuButton", object63); + object63.setMnemonicParsing(false); + object63.setText("SplitMenuButton"); + javafx.scene.layout.GridPane.setRowIndex(object63, 14); + final var object64 = new javafx.scene.control.MenuItem(); + fieldMap.put("item1", object64); + object64.setMnemonicParsing(false); + object64.setText("Action 1"); + final var object65 = new javafx.scene.control.MenuItem(); + fieldMap.put("item2", object65); + object65.setMnemonicParsing(false); + object65.setText("Action 2"); + object63.getItems().addAll(object64, object65); + final var object66 = new javafx.scene.control.TableView(); + fieldMap.put("tableView", object66); + object66.setPrefHeight(200.0); + object66.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object66, 1); + javafx.scene.layout.GridPane.setRowIndex(object66, 14); + final var object67 = new javafx.scene.control.TableColumn(); + fieldMap.put("tableColumn1", object67); + object67.setPrefWidth(75.0); + object67.setText("C1"); + final var object68 = new javafx.scene.control.TableColumn(); + fieldMap.put("tableColumn2", object68); + object68.setPrefWidth(75.0); + object68.setText("C2"); + object66.getColumns().addAll(object67, object68); + final var object69 = new javafx.scene.control.TextArea(); + fieldMap.put("textArea", object69); + object69.setPrefHeight(200.0); + object69.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object69, 15); + final var object70 = new javafx.scene.control.TextField(); + fieldMap.put("textField", object70); + javafx.scene.layout.GridPane.setColumnIndex(object70, 1); + javafx.scene.layout.GridPane.setRowIndex(object70, 15); + final var object71 = new javafx.scene.control.ToggleButton(); + object71.setMnemonicParsing(false); + object71.setText("ToggleButton"); + javafx.scene.layout.GridPane.setRowIndex(object71, 16); + final var object72 = new javafx.scene.control.TreeTableView>(); + fieldMap.put("treeTableView", object72); + object72.setPrefHeight(200.0); + object72.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object72, 1); + javafx.scene.layout.GridPane.setRowIndex(object72, 16); + final var object73 = new javafx.scene.control.TreeTableColumn, String>(); + fieldMap.put("treeTableColumn1", object73); + object73.setPrefWidth(75.0); + object73.setText("C1"); + final var object74 = new javafx.scene.control.TreeTableColumn, Integer>(); + fieldMap.put("treeTableColumn2", object74); + object74.setPrefWidth(75.0); + object74.setSortType(javafx.scene.control.TreeTableColumn.SortType.DESCENDING); + object74.setText("C2"); + object72.getColumns().addAll(object73, object74); + final var object75 = new javafx.scene.control.TreeView(); + fieldMap.put("treeView", object75); + object75.setPrefHeight(200.0); + object75.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object75, 17); + final var object76 = new javafx.scene.web.WebView(); + fieldMap.put("webView", object76); + object76.setPrefHeight(200.0); + object76.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object76, 1); + javafx.scene.layout.GridPane.setRowIndex(object76, 17); + object0.getChildren().addAll(object22, object23, object24, object25, object28, object31, object32, object33, object34, object35, object36, object37, object38, object45, object49, object51, object52, object53, object55, object56, object57, object58, object59, object60, object61, object62, object63, object66, object69, object70, object71, object72, object75, object76); + final var controllerFactory = controllersMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + controller = (com.github.gtache.fxml.compiler.impl.ControlsController) controllerFactory.create(fieldMap); + object0.setOnInputMethodTextChanged(e -> callMethod("inputMethodTextChanged", e)); + object0.setOnKeyPressed(e -> callMethod("keyPressed", e)); + object0.setOnKeyReleased(e -> callMethod("keyReleased", e)); + object0.setOnKeyTyped(e -> callMethod("keyTyped", e)); + object58.setOnDragDetected(e -> callMethod("dragDetected", e)); + object58.setOnDragDone(e -> callMethod("dragDone", e)); + object58.setOnDragDropped(e -> callMethod("dragDropped", e)); + object58.setOnDragEntered(e -> callMethod("dragEntered", e)); + object58.setOnDragExited(e -> callMethod("dragExited", e)); + object58.setOnDragOver(e -> callMethod("dragOver", e)); + object58.setOnMouseDragEntered(e -> callMethod("mouseDragEntered", e)); + object58.setOnMouseDragExited(e -> callMethod("mouseDragExited", e)); + object58.setOnMouseDragOver(e -> callMethod("mouseDragOver", e)); + object58.setOnMouseDragReleased(e -> callMethod("mouseDragReleased", e)); + object60.setOnContextMenuRequested(e -> callMethod("contextMenuRequested", e)); + object60.setOnMouseClicked(e -> callMethod("mouseClicked", e)); + object60.setOnMouseDragged(e -> callMethod("mouseDragged", e)); + object60.setOnMouseEntered(e -> callMethod("mouseEntered", e)); + object60.setOnMouseExited(e -> callMethod("mouseExited", e)); + object60.setOnMouseMoved(e -> callMethod("mouseMoved", e)); + object60.setOnMousePressed(e -> callMethod("mousePressed", e)); + object60.setOnMouseReleased(e -> callMethod("mouseReleased", e)); + object60.setOnScroll(e -> callMethod("onScroll", e)); + object60.setOnScrollFinished(e -> callMethod("onScrollFinished", e)); + object60.setOnScrollStarted(e -> callMethod("onScrollStarted", e)); + object61.setOnZoom(e -> callMethod("onZoom", e)); + object61.setOnZoomFinished(e -> callMethod("onZoomFinished", e)); + object61.setOnZoomStarted(e -> callMethod("onZoomStarted", e)); + object71.setOnAction(e -> callMethod("onAction", e)); + object71.setOnRotate(e -> callMethod("onRotate", e)); + object71.setOnRotationFinished(e -> callMethod("onRotationFinished", e)); + object71.setOnRotationStarted(e -> callMethod("onRotationStarted", e)); + object73.setOnEditCancel(e -> callMethod("onEditCancel", e)); + object73.setOnEditCommit(e -> callMethod("onEditCommit", e)); + object73.setOnEditStart(e -> callMethod("onEditStart", e)); + object75.setOnSwipeDown(e -> callMethod("onSwipeDown", e)); + object75.setOnSwipeLeft(e -> callMethod("onSwipeLeft", e)); + object75.setOnSwipeRight(e -> callMethod("onSwipeRight", e)); + object75.setOnSwipeUp(e -> callMethod("onSwipeUp", e)); + object76.setOnTouchMoved(e -> callMethod("onTouchMoved", e)); + object76.setOnTouchPressed(e -> callMethod("onTouchPressed", e)); + object76.setOnTouchReleased(e -> callMethod("onTouchReleased", e)); + object76.setOnTouchStationary(e -> callMethod("onTouchStationary", e)); + try { + final var initialize = controller.getClass().getDeclaredMethod("initialize"); + initialize.setAccessible(true); + initialize.invoke(controller); + } catch (final InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection", e); + } catch (final NoSuchMethodException ignored) { + } + loaded = true; + return object0; +} + + private void callMethod(final String methodName, final T event) { + try { + final Method method; + final var methods = Arrays.stream(controller.getClass().getDeclaredMethods()) + .filter(m -> m.getName().equals(methodName)).toList(); + if (methods.size() > 1) { + final var eventMethods = methods.stream().filter(m -> + m.getParameterCount() == 1 && Event.class.isAssignableFrom(m.getParameterTypes()[0])).toList(); + if (eventMethods.size() == 1) { + method = eventMethods.getFirst(); + } else { + final var emptyMethods = methods.stream().filter(m -> m.getParameterCount() == 0).toList(); + if (emptyMethods.size() == 1) { + method = emptyMethods.getFirst(); + } else { + throw new IllegalArgumentException("Multiple matching methods for " + methodName); + } + } + } else if (methods.size() == 1) { + method = methods.getFirst(); + } else { + throw new IllegalArgumentException("No matching method for " + methodName); + } + method.setAccessible(true); + if (method.getParameterCount() == 0) { + method.invoke(controller); + } else { + method.invoke(controller, event); + } + } catch (final IllegalAccessException | InvocationTargetException ex) { + throw new RuntimeException("Error using reflection on " + methodName, ex); + } +} + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.ControlsController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-factory-reflection-getbundle.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-factory-reflection-getbundle.txt new file mode 100644 index 0000000..03f0bb5 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-factory-reflection-getbundle.txt @@ -0,0 +1,472 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; +import com.github.gtache.fxml.compiler.ControllerFactory; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import javafx.event.Event; +import java.lang.reflect.Method; + + +/** + * Generated code, not thread-safe + */ +public final class ControlsController { + + private final Map, ControllerFactory> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.ControlsController controller; + + /** + * Instantiates a new ControlsController with no nested controllers and no resource bundle + * @param controllerFactory The controller factory + */ + public ControlsController(final ControllerFactory controllerFactory) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controllerFactory), Map.of()); + } + + /** + * Instantiates a new ControlsController with no nested controllers + * @param controllerFactory The controller factory + * @param resourceBundle The resource bundle + */ + public ControlsController(final ControllerFactory controllerFactory, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controllerFactory), Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, resourceBundle)); + } + + /** + * Instantiates a new ControlsController with nested controllers + * @param controllersMap The map of controller class to controller factory + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public ControlsController(final Map, ControllerFactory> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + final var fieldMap = new HashMap(); + final var object0 = new javafx.scene.layout.GridPane(); + fieldMap.put("gridPane", object0); + final var object1 = new javafx.scene.layout.RowConstraints(); + final var object2 = new javafx.scene.layout.RowConstraints(); + final var object3 = new javafx.scene.layout.RowConstraints(); + final var object4 = new javafx.scene.layout.RowConstraints(); + final var object5 = new javafx.scene.layout.RowConstraints(); + final var object6 = new javafx.scene.layout.RowConstraints(); + final var object7 = new javafx.scene.layout.RowConstraints(); + final var object8 = new javafx.scene.layout.RowConstraints(); + final var object9 = new javafx.scene.layout.RowConstraints(); + final var object10 = new javafx.scene.layout.RowConstraints(); + final var object11 = new javafx.scene.layout.RowConstraints(); + final var object12 = new javafx.scene.layout.RowConstraints(); + final var object13 = new javafx.scene.layout.RowConstraints(); + final var object14 = new javafx.scene.layout.RowConstraints(); + final var object15 = new javafx.scene.layout.RowConstraints(); + final var object16 = new javafx.scene.layout.RowConstraints(); + final var object17 = new javafx.scene.layout.RowConstraints(); + final var object18 = new javafx.scene.layout.RowConstraints(); + object0.getRowConstraints().addAll(object1, object2, object3, object4, object5, object6, object7, object8, object9, object10, object11, object12, object13, object14, object15, object16, object17, object18); + final var object19 = new javafx.scene.layout.ColumnConstraints(); + final var object20 = new javafx.scene.layout.ColumnConstraints(); + final var object21 = new javafx.scene.layout.ColumnConstraints(); + object21.setMinWidth(10.0); + object21.setPrefWidth(100.0); + object0.getColumnConstraints().addAll(object19, object20, object21); + final var object22 = new javafx.scene.control.Button(); + fieldMap.put("button", object22); + object22.setMnemonicParsing(false); + object22.setText("Button"); + final var object23 = new javafx.scene.control.CheckBox(); + fieldMap.put("checkBox", object23); + object23.setIndeterminate(true); + object23.setMnemonicParsing(false); + object23.setText("CheckBox"); + javafx.scene.layout.GridPane.setColumnIndex(object23, 1); + final var object24 = new javafx.scene.control.ChoiceBox(); + fieldMap.put("choiceBox", object24); + object24.setCacheShape(false); + object24.setCenterShape(false); + object24.setDisable(true); + object24.setFocusTraversable(false); + object24.setPrefWidth(150.0); + object24.setScaleShape(false); + object24.setVisible(false); + javafx.scene.layout.GridPane.setRowIndex(object24, 1); + final var object25 = new javafx.scene.control.ColorPicker(); + fieldMap.put("colorPicker", object25); + object25.setNodeOrientation(javafx.geometry.NodeOrientation.LEFT_TO_RIGHT); + object25.setOpacity(0.5); + javafx.scene.layout.GridPane.setColumnIndex(object25, 1); + javafx.scene.layout.GridPane.setRowIndex(object25, 1); + final var object26 = new javafx.scene.paint.Color(0.7894737124443054, 0.08771929889917374, 0.08771929889917374, 1); + fieldMap.put("color", object26); + object25.setValue(object26); + final var object27 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object25.setOpaqueInsets(object27); + final var object28 = new javafx.scene.control.ComboBox(); + fieldMap.put("comboBox", object28); + object28.setEditable(true); + object28.setPrefWidth(150.0); + object28.setPromptText("Text"); + object28.setVisibleRowCount(5); + javafx.scene.layout.GridPane.setRowIndex(object28, 2); + final var object29 = javafx.scene.Cursor.CLOSED_HAND; + object28.setCursor(object29); + final var object30 = new javafx.scene.effect.Bloom(); + object28.setEffect(object30); + final var object31 = new javafx.scene.control.DatePicker(); + fieldMap.put("datePicker", object31); + object31.setShowWeekNumbers(true); + object31.setStyle("-fx-background-color: #ffffff;"); + javafx.scene.layout.GridPane.setColumnIndex(object31, 1); + javafx.scene.layout.GridPane.setRowIndex(object31, 2); + final var object32 = new javafx.scene.web.HTMLEditor(); + fieldMap.put("htmlEditor", object32); + object32.setHtmlText(""); + object32.setPrefHeight(200.0); + object32.setPrefWidth(506.0); + object32.getStyleClass().addAll("clazz"); + object32.getStylesheets().addAll("@style.css"); + javafx.scene.layout.GridPane.setRowIndex(object32, 3); + final var object33 = new javafx.scene.control.Hyperlink(); + fieldMap.put("hyperlink", object33); + object33.setText("Hyperlink"); + javafx.scene.layout.GridPane.setColumnIndex(object33, 1); + javafx.scene.layout.GridPane.setRowIndex(object33, 3); + final var object34 = new javafx.scene.image.ImageView(); + fieldMap.put("imageView", object34); + object34.setFitHeight(150.0); + object34.setFitWidth(200.0); + object34.setPickOnBounds(true); + object34.setPreserveRatio(true); + javafx.scene.layout.GridPane.setRowIndex(object34, 4); + final var object35 = new javafx.scene.control.Label(); + fieldMap.put("label", object35); + object35.setAccessibleHelp("TTTTT"); + object35.setAccessibleText("TTT"); + object35.setBlendMode(javafx.scene.effect.BlendMode.ADD); + object35.setCache(true); + object35.setCacheHint(javafx.scene.CacheHint.QUALITY); + object35.setDepthTest(javafx.scene.DepthTest.ENABLE); + object35.setMnemonicParsing(true); + object35.setMouseTransparent(true); + object35.setText(bundle.getString("include.label")); + javafx.scene.layout.GridPane.setColumnIndex(object35, 1); + javafx.scene.layout.GridPane.setRowIndex(object35, 4); + final var object36 = new javafx.scene.control.ListView(); + fieldMap.put("listView", object36); + object36.setFixedCellSize(20.0); + object36.setNodeOrientation(javafx.geometry.NodeOrientation.RIGHT_TO_LEFT); + object36.setOrientation(javafx.geometry.Orientation.HORIZONTAL); + object36.setPrefHeight(200.0); + object36.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object36, 5); + final var object37 = new javafx.scene.media.MediaView(); + fieldMap.put("mediaView", object37); + object37.setFitHeight(200.0); + object37.setFitWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object37, 1); + javafx.scene.layout.GridPane.setColumnSpan(object37, 2); + javafx.scene.layout.GridPane.setRowIndex(object37, 5); + javafx.scene.layout.GridPane.setRowSpan(object37, 2); + final var object38 = new javafx.scene.control.MenuBar(); + fieldMap.put("menuBar", object38); + javafx.scene.layout.GridPane.setHalignment(object38, javafx.geometry.HPos.RIGHT); + javafx.scene.layout.GridPane.setHgrow(object38, javafx.scene.layout.Priority.ALWAYS); + javafx.scene.layout.GridPane.setRowIndex(object38, 7); + javafx.scene.layout.GridPane.setValignment(object38, javafx.geometry.VPos.BASELINE); + javafx.scene.layout.GridPane.setVgrow(object38, javafx.scene.layout.Priority.SOMETIMES); + final var object39 = new javafx.scene.control.Menu(); + fieldMap.put("menu1", object39); + object39.setMnemonicParsing(false); + object39.setText("File"); + final var object40 = new javafx.scene.control.MenuItem(); + fieldMap.put("menuItem1", object40); + object40.setMnemonicParsing(false); + object40.setText("Close"); + object39.getItems().addAll(object40); + final var object41 = new javafx.scene.control.Menu(); + object41.setMnemonicParsing(false); + object41.setText("Edit"); + final var object42 = new javafx.scene.control.MenuItem(); + object42.setMnemonicParsing(false); + object42.setText("Delete"); + object41.getItems().addAll(object42); + final var object43 = new javafx.scene.control.Menu(); + object43.setMnemonicParsing(false); + object43.setText("Help"); + final var object44 = new javafx.scene.control.MenuItem(); + object44.setMnemonicParsing(false); + object44.setText("About"); + object43.getItems().addAll(object44); + object38.getMenus().addAll(object39, object41, object43); + final var object45 = new javafx.scene.control.MenuButton(); + fieldMap.put("menuButton", object45); + object45.setMnemonicParsing(false); + object45.setText("MenuButton"); + javafx.scene.layout.GridPane.setColumnIndex(object45, 1); + javafx.scene.layout.GridPane.setRowIndex(object45, 7); + final var object46 = new javafx.scene.control.MenuItem(); + object46.setMnemonicParsing(false); + object46.setText("Action 1"); + final var object47 = new javafx.scene.control.MenuItem(); + object47.setMnemonicParsing(false); + object47.setText("Action 2"); + object45.getItems().addAll(object46, object47); + final var object48 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + javafx.scene.layout.GridPane.setMargin(object45, object48); + final var object49 = new javafx.scene.control.Pagination(); + fieldMap.put("pagination", object49); + object49.setPrefHeight(200.0); + object49.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object49, 8); + final var object50 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object49.setPadding(object50); + final var object51 = new javafx.scene.control.PasswordField(); + fieldMap.put("passwordField", object51); + object51.setMaxHeight(6.0); + object51.setMaxWidth(5.0); + object51.setMinHeight(2.0); + object51.setMinWidth(1.0); + object51.setPrefColumnCount(7); + object51.setPrefHeight(4.0); + object51.setPrefWidth(3.0); + javafx.scene.layout.GridPane.setColumnIndex(object51, 1); + javafx.scene.layout.GridPane.setRowIndex(object51, 8); + final var object52 = new javafx.scene.control.ProgressBar(); + fieldMap.put("progressBar", object52); + object52.setLayoutX(10.0); + object52.setLayoutY(20.0); + object52.setPrefWidth(200.0); + object52.setProgress(0.0); + javafx.scene.layout.GridPane.setRowIndex(object52, 9); + final var object53 = new javafx.scene.control.ProgressIndicator(); + fieldMap.put("progressIndicator", object53); + object53.setProgress(0.0); + object53.setRotate(2.0); + javafx.scene.layout.GridPane.setColumnIndex(object53, 1); + javafx.scene.layout.GridPane.setRowIndex(object53, 9); + final var object54 = new javafx.geometry.Point3D(4.0, 5.0, 6.0); + object53.setRotationAxis(object54); + final var object55 = new javafx.scene.control.RadioButton(); + fieldMap.put("radioButton", object55); + object55.setMnemonicParsing(false); + object55.setScaleX(7.0); + object55.setScaleY(2.0); + object55.setScaleZ(3.0); + object55.setText("RadioButton"); + object55.setTranslateX(4.0); + object55.setTranslateY(5.0); + object55.setTranslateZ(6.0); + javafx.scene.layout.GridPane.setRowIndex(object55, 10); + final var object56 = new javafx.scene.control.ScrollBar(); + fieldMap.put("scrollBarH", object56); + javafx.scene.layout.GridPane.setColumnIndex(object56, 1); + javafx.scene.layout.GridPane.setRowIndex(object56, 10); + final var object57 = new javafx.scene.control.ScrollBar(); + fieldMap.put("scrollBarV", object57); + object57.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object57, 11); + final var object58 = new javafx.scene.control.Separator(); + fieldMap.put("separatorH", object58); + object58.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object58, 1); + javafx.scene.layout.GridPane.setRowIndex(object58, 11); + final var object59 = new javafx.scene.control.Separator(); + fieldMap.put("separatorV", object59); + object59.setOrientation(javafx.geometry.Orientation.VERTICAL); + object59.setPrefHeight(200.0); + javafx.scene.layout.GridPane.setRowIndex(object59, 12); + final var object60 = new javafx.scene.control.Slider(); + fieldMap.put("sliderH", object60); + javafx.scene.layout.GridPane.setColumnIndex(object60, 1); + javafx.scene.layout.GridPane.setRowIndex(object60, 12); + final var object61 = new javafx.scene.control.Slider(); + fieldMap.put("sliderV", object61); + object61.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object61, 13); + final var object62 = new javafx.scene.control.Spinner(); + fieldMap.put("spinner", object62); + javafx.scene.layout.GridPane.setColumnIndex(object62, 1); + javafx.scene.layout.GridPane.setRowIndex(object62, 13); + final var object63 = new javafx.scene.control.SplitMenuButton(); + fieldMap.put("splitMenuButton", object63); + object63.setMnemonicParsing(false); + object63.setText("SplitMenuButton"); + javafx.scene.layout.GridPane.setRowIndex(object63, 14); + final var object64 = new javafx.scene.control.MenuItem(); + fieldMap.put("item1", object64); + object64.setMnemonicParsing(false); + object64.setText("Action 1"); + final var object65 = new javafx.scene.control.MenuItem(); + fieldMap.put("item2", object65); + object65.setMnemonicParsing(false); + object65.setText("Action 2"); + object63.getItems().addAll(object64, object65); + final var object66 = new javafx.scene.control.TableView(); + fieldMap.put("tableView", object66); + object66.setPrefHeight(200.0); + object66.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object66, 1); + javafx.scene.layout.GridPane.setRowIndex(object66, 14); + final var object67 = new javafx.scene.control.TableColumn(); + fieldMap.put("tableColumn1", object67); + object67.setPrefWidth(75.0); + object67.setText("C1"); + final var object68 = new javafx.scene.control.TableColumn(); + fieldMap.put("tableColumn2", object68); + object68.setPrefWidth(75.0); + object68.setText("C2"); + object66.getColumns().addAll(object67, object68); + final var object69 = new javafx.scene.control.TextArea(); + fieldMap.put("textArea", object69); + object69.setPrefHeight(200.0); + object69.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object69, 15); + final var object70 = new javafx.scene.control.TextField(); + fieldMap.put("textField", object70); + javafx.scene.layout.GridPane.setColumnIndex(object70, 1); + javafx.scene.layout.GridPane.setRowIndex(object70, 15); + final var object71 = new javafx.scene.control.ToggleButton(); + object71.setMnemonicParsing(false); + object71.setText("ToggleButton"); + javafx.scene.layout.GridPane.setRowIndex(object71, 16); + final var object72 = new javafx.scene.control.TreeTableView>(); + fieldMap.put("treeTableView", object72); + object72.setPrefHeight(200.0); + object72.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object72, 1); + javafx.scene.layout.GridPane.setRowIndex(object72, 16); + final var object73 = new javafx.scene.control.TreeTableColumn, String>(); + fieldMap.put("treeTableColumn1", object73); + object73.setPrefWidth(75.0); + object73.setText("C1"); + final var object74 = new javafx.scene.control.TreeTableColumn, Integer>(); + fieldMap.put("treeTableColumn2", object74); + object74.setPrefWidth(75.0); + object74.setSortType(javafx.scene.control.TreeTableColumn.SortType.DESCENDING); + object74.setText("C2"); + object72.getColumns().addAll(object73, object74); + final var object75 = new javafx.scene.control.TreeView(); + fieldMap.put("treeView", object75); + object75.setPrefHeight(200.0); + object75.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object75, 17); + final var object76 = new javafx.scene.web.WebView(); + fieldMap.put("webView", object76); + object76.setPrefHeight(200.0); + object76.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object76, 1); + javafx.scene.layout.GridPane.setRowIndex(object76, 17); + object0.getChildren().addAll(object22, object23, object24, object25, object28, object31, object32, object33, object34, object35, object36, object37, object38, object45, object49, object51, object52, object53, object55, object56, object57, object58, object59, object60, object61, object62, object63, object66, object69, object70, object71, object72, object75, object76); + final var controllerFactory = controllersMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + controller = (com.github.gtache.fxml.compiler.impl.ControlsController) controllerFactory.create(fieldMap); + object0.setOnInputMethodTextChanged(e -> callMethod("inputMethodTextChanged", e)); + object0.setOnKeyPressed(e -> callMethod("keyPressed", e)); + object0.setOnKeyReleased(e -> callMethod("keyReleased", e)); + object0.setOnKeyTyped(e -> callMethod("keyTyped", e)); + object58.setOnDragDetected(e -> callMethod("dragDetected", e)); + object58.setOnDragDone(e -> callMethod("dragDone", e)); + object58.setOnDragDropped(e -> callMethod("dragDropped", e)); + object58.setOnDragEntered(e -> callMethod("dragEntered", e)); + object58.setOnDragExited(e -> callMethod("dragExited", e)); + object58.setOnDragOver(e -> callMethod("dragOver", e)); + object58.setOnMouseDragEntered(e -> callMethod("mouseDragEntered", e)); + object58.setOnMouseDragExited(e -> callMethod("mouseDragExited", e)); + object58.setOnMouseDragOver(e -> callMethod("mouseDragOver", e)); + object58.setOnMouseDragReleased(e -> callMethod("mouseDragReleased", e)); + object60.setOnContextMenuRequested(e -> callMethod("contextMenuRequested", e)); + object60.setOnMouseClicked(e -> callMethod("mouseClicked", e)); + object60.setOnMouseDragged(e -> callMethod("mouseDragged", e)); + object60.setOnMouseEntered(e -> callMethod("mouseEntered", e)); + object60.setOnMouseExited(e -> callMethod("mouseExited", e)); + object60.setOnMouseMoved(e -> callMethod("mouseMoved", e)); + object60.setOnMousePressed(e -> callMethod("mousePressed", e)); + object60.setOnMouseReleased(e -> callMethod("mouseReleased", e)); + object60.setOnScroll(e -> callMethod("onScroll", e)); + object60.setOnScrollFinished(e -> callMethod("onScrollFinished", e)); + object60.setOnScrollStarted(e -> callMethod("onScrollStarted", e)); + object61.setOnZoom(e -> callMethod("onZoom", e)); + object61.setOnZoomFinished(e -> callMethod("onZoomFinished", e)); + object61.setOnZoomStarted(e -> callMethod("onZoomStarted", e)); + object71.setOnAction(e -> callMethod("onAction", e)); + object71.setOnRotate(e -> callMethod("onRotate", e)); + object71.setOnRotationFinished(e -> callMethod("onRotationFinished", e)); + object71.setOnRotationStarted(e -> callMethod("onRotationStarted", e)); + object73.setOnEditCancel(e -> callMethod("onEditCancel", e)); + object73.setOnEditCommit(e -> callMethod("onEditCommit", e)); + object73.setOnEditStart(e -> callMethod("onEditStart", e)); + object75.setOnSwipeDown(e -> callMethod("onSwipeDown", e)); + object75.setOnSwipeLeft(e -> callMethod("onSwipeLeft", e)); + object75.setOnSwipeRight(e -> callMethod("onSwipeRight", e)); + object75.setOnSwipeUp(e -> callMethod("onSwipeUp", e)); + object76.setOnTouchMoved(e -> callMethod("onTouchMoved", e)); + object76.setOnTouchPressed(e -> callMethod("onTouchPressed", e)); + object76.setOnTouchReleased(e -> callMethod("onTouchReleased", e)); + object76.setOnTouchStationary(e -> callMethod("onTouchStationary", e)); + try { + final var initialize = controller.getClass().getDeclaredMethod("initialize"); + initialize.setAccessible(true); + initialize.invoke(controller); + } catch (final InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection", e); + } catch (final NoSuchMethodException ignored) { + } + loaded = true; + return object0; +} + + private void callMethod(final String methodName, final T event) { + try { + final Method method; + final var methods = Arrays.stream(controller.getClass().getDeclaredMethods()) + .filter(m -> m.getName().equals(methodName)).toList(); + if (methods.size() > 1) { + final var eventMethods = methods.stream().filter(m -> + m.getParameterCount() == 1 && Event.class.isAssignableFrom(m.getParameterTypes()[0])).toList(); + if (eventMethods.size() == 1) { + method = eventMethods.getFirst(); + } else { + final var emptyMethods = methods.stream().filter(m -> m.getParameterCount() == 0).toList(); + if (emptyMethods.size() == 1) { + method = emptyMethods.getFirst(); + } else { + throw new IllegalArgumentException("Multiple matching methods for " + methodName); + } + } + } else if (methods.size() == 1) { + method = methods.getFirst(); + } else { + throw new IllegalArgumentException("No matching method for " + methodName); + } + method.setAccessible(true); + if (method.getParameterCount() == 0) { + method.invoke(controller); + } else { + method.invoke(controller, event); + } + } catch (final IllegalAccessException | InvocationTargetException ex) { + throw new RuntimeException("Error using reflection on " + methodName, ex); + } +} + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.ControlsController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-factory-reflection-getter.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-factory-reflection-getter.txt new file mode 100644 index 0000000..c6afa0c --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-factory-reflection-getter.txt @@ -0,0 +1,471 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; +import com.github.gtache.fxml.compiler.ControllerFactory; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import javafx.event.Event; +import java.lang.reflect.Method; + + +/** + * Generated code, not thread-safe + */ +public final class ControlsController { + + private final Map, ControllerFactory> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.ControlsController controller; + + /** + * Instantiates a new ControlsController with no nested controllers and no resource bundle + * @param controllerFactory The controller factory + */ + public ControlsController(final ControllerFactory controllerFactory) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controllerFactory), Map.of()); + } + + /** + * Instantiates a new ControlsController with no nested controllers + * @param controllerFactory The controller factory + * @param resourceBundle The resource bundle + */ + public ControlsController(final ControllerFactory controllerFactory, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controllerFactory), Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, resourceBundle)); + } + + /** + * Instantiates a new ControlsController with nested controllers + * @param controllersMap The map of controller class to controller factory + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public ControlsController(final Map, ControllerFactory> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var fieldMap = new HashMap(); + final var object0 = new javafx.scene.layout.GridPane(); + fieldMap.put("gridPane", object0); + final var object1 = new javafx.scene.layout.RowConstraints(); + final var object2 = new javafx.scene.layout.RowConstraints(); + final var object3 = new javafx.scene.layout.RowConstraints(); + final var object4 = new javafx.scene.layout.RowConstraints(); + final var object5 = new javafx.scene.layout.RowConstraints(); + final var object6 = new javafx.scene.layout.RowConstraints(); + final var object7 = new javafx.scene.layout.RowConstraints(); + final var object8 = new javafx.scene.layout.RowConstraints(); + final var object9 = new javafx.scene.layout.RowConstraints(); + final var object10 = new javafx.scene.layout.RowConstraints(); + final var object11 = new javafx.scene.layout.RowConstraints(); + final var object12 = new javafx.scene.layout.RowConstraints(); + final var object13 = new javafx.scene.layout.RowConstraints(); + final var object14 = new javafx.scene.layout.RowConstraints(); + final var object15 = new javafx.scene.layout.RowConstraints(); + final var object16 = new javafx.scene.layout.RowConstraints(); + final var object17 = new javafx.scene.layout.RowConstraints(); + final var object18 = new javafx.scene.layout.RowConstraints(); + object0.getRowConstraints().addAll(object1, object2, object3, object4, object5, object6, object7, object8, object9, object10, object11, object12, object13, object14, object15, object16, object17, object18); + final var object19 = new javafx.scene.layout.ColumnConstraints(); + final var object20 = new javafx.scene.layout.ColumnConstraints(); + final var object21 = new javafx.scene.layout.ColumnConstraints(); + object21.setMinWidth(10.0); + object21.setPrefWidth(100.0); + object0.getColumnConstraints().addAll(object19, object20, object21); + final var object22 = new javafx.scene.control.Button(); + fieldMap.put("button", object22); + object22.setMnemonicParsing(false); + object22.setText("Button"); + final var object23 = new javafx.scene.control.CheckBox(); + fieldMap.put("checkBox", object23); + object23.setIndeterminate(true); + object23.setMnemonicParsing(false); + object23.setText("CheckBox"); + javafx.scene.layout.GridPane.setColumnIndex(object23, 1); + final var object24 = new javafx.scene.control.ChoiceBox(); + fieldMap.put("choiceBox", object24); + object24.setCacheShape(false); + object24.setCenterShape(false); + object24.setDisable(true); + object24.setFocusTraversable(false); + object24.setPrefWidth(150.0); + object24.setScaleShape(false); + object24.setVisible(false); + javafx.scene.layout.GridPane.setRowIndex(object24, 1); + final var object25 = new javafx.scene.control.ColorPicker(); + fieldMap.put("colorPicker", object25); + object25.setNodeOrientation(javafx.geometry.NodeOrientation.LEFT_TO_RIGHT); + object25.setOpacity(0.5); + javafx.scene.layout.GridPane.setColumnIndex(object25, 1); + javafx.scene.layout.GridPane.setRowIndex(object25, 1); + final var object26 = new javafx.scene.paint.Color(0.7894737124443054, 0.08771929889917374, 0.08771929889917374, 1); + fieldMap.put("color", object26); + object25.setValue(object26); + final var object27 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object25.setOpaqueInsets(object27); + final var object28 = new javafx.scene.control.ComboBox(); + fieldMap.put("comboBox", object28); + object28.setEditable(true); + object28.setPrefWidth(150.0); + object28.setPromptText("Text"); + object28.setVisibleRowCount(5); + javafx.scene.layout.GridPane.setRowIndex(object28, 2); + final var object29 = javafx.scene.Cursor.CLOSED_HAND; + object28.setCursor(object29); + final var object30 = new javafx.scene.effect.Bloom(); + object28.setEffect(object30); + final var object31 = new javafx.scene.control.DatePicker(); + fieldMap.put("datePicker", object31); + object31.setShowWeekNumbers(true); + object31.setStyle("-fx-background-color: #ffffff;"); + javafx.scene.layout.GridPane.setColumnIndex(object31, 1); + javafx.scene.layout.GridPane.setRowIndex(object31, 2); + final var object32 = new javafx.scene.web.HTMLEditor(); + fieldMap.put("htmlEditor", object32); + object32.setHtmlText(""); + object32.setPrefHeight(200.0); + object32.setPrefWidth(506.0); + object32.getStyleClass().addAll("clazz"); + object32.getStylesheets().addAll("@style.css"); + javafx.scene.layout.GridPane.setRowIndex(object32, 3); + final var object33 = new javafx.scene.control.Hyperlink(); + fieldMap.put("hyperlink", object33); + object33.setText("Hyperlink"); + javafx.scene.layout.GridPane.setColumnIndex(object33, 1); + javafx.scene.layout.GridPane.setRowIndex(object33, 3); + final var object34 = new javafx.scene.image.ImageView(); + fieldMap.put("imageView", object34); + object34.setFitHeight(150.0); + object34.setFitWidth(200.0); + object34.setPickOnBounds(true); + object34.setPreserveRatio(true); + javafx.scene.layout.GridPane.setRowIndex(object34, 4); + final var object35 = new javafx.scene.control.Label(); + fieldMap.put("label", object35); + object35.setAccessibleHelp("TTTTT"); + object35.setAccessibleText("TTT"); + object35.setBlendMode(javafx.scene.effect.BlendMode.ADD); + object35.setCache(true); + object35.setCacheHint(javafx.scene.CacheHint.QUALITY); + object35.setDepthTest(javafx.scene.DepthTest.ENABLE); + object35.setMnemonicParsing(true); + object35.setMouseTransparent(true); + javafx.scene.layout.GridPane.setColumnIndex(object35, 1); + javafx.scene.layout.GridPane.setRowIndex(object35, 4); + final var object36 = new javafx.scene.control.ListView(); + fieldMap.put("listView", object36); + object36.setFixedCellSize(20.0); + object36.setNodeOrientation(javafx.geometry.NodeOrientation.RIGHT_TO_LEFT); + object36.setOrientation(javafx.geometry.Orientation.HORIZONTAL); + object36.setPrefHeight(200.0); + object36.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object36, 5); + final var object37 = new javafx.scene.media.MediaView(); + fieldMap.put("mediaView", object37); + object37.setFitHeight(200.0); + object37.setFitWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object37, 1); + javafx.scene.layout.GridPane.setColumnSpan(object37, 2); + javafx.scene.layout.GridPane.setRowIndex(object37, 5); + javafx.scene.layout.GridPane.setRowSpan(object37, 2); + final var object38 = new javafx.scene.control.MenuBar(); + fieldMap.put("menuBar", object38); + javafx.scene.layout.GridPane.setHalignment(object38, javafx.geometry.HPos.RIGHT); + javafx.scene.layout.GridPane.setHgrow(object38, javafx.scene.layout.Priority.ALWAYS); + javafx.scene.layout.GridPane.setRowIndex(object38, 7); + javafx.scene.layout.GridPane.setValignment(object38, javafx.geometry.VPos.BASELINE); + javafx.scene.layout.GridPane.setVgrow(object38, javafx.scene.layout.Priority.SOMETIMES); + final var object39 = new javafx.scene.control.Menu(); + fieldMap.put("menu1", object39); + object39.setMnemonicParsing(false); + object39.setText("File"); + final var object40 = new javafx.scene.control.MenuItem(); + fieldMap.put("menuItem1", object40); + object40.setMnemonicParsing(false); + object40.setText("Close"); + object39.getItems().addAll(object40); + final var object41 = new javafx.scene.control.Menu(); + object41.setMnemonicParsing(false); + object41.setText("Edit"); + final var object42 = new javafx.scene.control.MenuItem(); + object42.setMnemonicParsing(false); + object42.setText("Delete"); + object41.getItems().addAll(object42); + final var object43 = new javafx.scene.control.Menu(); + object43.setMnemonicParsing(false); + object43.setText("Help"); + final var object44 = new javafx.scene.control.MenuItem(); + object44.setMnemonicParsing(false); + object44.setText("About"); + object43.getItems().addAll(object44); + object38.getMenus().addAll(object39, object41, object43); + final var object45 = new javafx.scene.control.MenuButton(); + fieldMap.put("menuButton", object45); + object45.setMnemonicParsing(false); + object45.setText("MenuButton"); + javafx.scene.layout.GridPane.setColumnIndex(object45, 1); + javafx.scene.layout.GridPane.setRowIndex(object45, 7); + final var object46 = new javafx.scene.control.MenuItem(); + object46.setMnemonicParsing(false); + object46.setText("Action 1"); + final var object47 = new javafx.scene.control.MenuItem(); + object47.setMnemonicParsing(false); + object47.setText("Action 2"); + object45.getItems().addAll(object46, object47); + final var object48 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + javafx.scene.layout.GridPane.setMargin(object45, object48); + final var object49 = new javafx.scene.control.Pagination(); + fieldMap.put("pagination", object49); + object49.setPrefHeight(200.0); + object49.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object49, 8); + final var object50 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object49.setPadding(object50); + final var object51 = new javafx.scene.control.PasswordField(); + fieldMap.put("passwordField", object51); + object51.setMaxHeight(6.0); + object51.setMaxWidth(5.0); + object51.setMinHeight(2.0); + object51.setMinWidth(1.0); + object51.setPrefColumnCount(7); + object51.setPrefHeight(4.0); + object51.setPrefWidth(3.0); + javafx.scene.layout.GridPane.setColumnIndex(object51, 1); + javafx.scene.layout.GridPane.setRowIndex(object51, 8); + final var object52 = new javafx.scene.control.ProgressBar(); + fieldMap.put("progressBar", object52); + object52.setLayoutX(10.0); + object52.setLayoutY(20.0); + object52.setPrefWidth(200.0); + object52.setProgress(0.0); + javafx.scene.layout.GridPane.setRowIndex(object52, 9); + final var object53 = new javafx.scene.control.ProgressIndicator(); + fieldMap.put("progressIndicator", object53); + object53.setProgress(0.0); + object53.setRotate(2.0); + javafx.scene.layout.GridPane.setColumnIndex(object53, 1); + javafx.scene.layout.GridPane.setRowIndex(object53, 9); + final var object54 = new javafx.geometry.Point3D(4.0, 5.0, 6.0); + object53.setRotationAxis(object54); + final var object55 = new javafx.scene.control.RadioButton(); + fieldMap.put("radioButton", object55); + object55.setMnemonicParsing(false); + object55.setScaleX(7.0); + object55.setScaleY(2.0); + object55.setScaleZ(3.0); + object55.setText("RadioButton"); + object55.setTranslateX(4.0); + object55.setTranslateY(5.0); + object55.setTranslateZ(6.0); + javafx.scene.layout.GridPane.setRowIndex(object55, 10); + final var object56 = new javafx.scene.control.ScrollBar(); + fieldMap.put("scrollBarH", object56); + javafx.scene.layout.GridPane.setColumnIndex(object56, 1); + javafx.scene.layout.GridPane.setRowIndex(object56, 10); + final var object57 = new javafx.scene.control.ScrollBar(); + fieldMap.put("scrollBarV", object57); + object57.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object57, 11); + final var object58 = new javafx.scene.control.Separator(); + fieldMap.put("separatorH", object58); + object58.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object58, 1); + javafx.scene.layout.GridPane.setRowIndex(object58, 11); + final var object59 = new javafx.scene.control.Separator(); + fieldMap.put("separatorV", object59); + object59.setOrientation(javafx.geometry.Orientation.VERTICAL); + object59.setPrefHeight(200.0); + javafx.scene.layout.GridPane.setRowIndex(object59, 12); + final var object60 = new javafx.scene.control.Slider(); + fieldMap.put("sliderH", object60); + javafx.scene.layout.GridPane.setColumnIndex(object60, 1); + javafx.scene.layout.GridPane.setRowIndex(object60, 12); + final var object61 = new javafx.scene.control.Slider(); + fieldMap.put("sliderV", object61); + object61.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object61, 13); + final var object62 = new javafx.scene.control.Spinner(); + fieldMap.put("spinner", object62); + javafx.scene.layout.GridPane.setColumnIndex(object62, 1); + javafx.scene.layout.GridPane.setRowIndex(object62, 13); + final var object63 = new javafx.scene.control.SplitMenuButton(); + fieldMap.put("splitMenuButton", object63); + object63.setMnemonicParsing(false); + object63.setText("SplitMenuButton"); + javafx.scene.layout.GridPane.setRowIndex(object63, 14); + final var object64 = new javafx.scene.control.MenuItem(); + fieldMap.put("item1", object64); + object64.setMnemonicParsing(false); + object64.setText("Action 1"); + final var object65 = new javafx.scene.control.MenuItem(); + fieldMap.put("item2", object65); + object65.setMnemonicParsing(false); + object65.setText("Action 2"); + object63.getItems().addAll(object64, object65); + final var object66 = new javafx.scene.control.TableView(); + fieldMap.put("tableView", object66); + object66.setPrefHeight(200.0); + object66.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object66, 1); + javafx.scene.layout.GridPane.setRowIndex(object66, 14); + final var object67 = new javafx.scene.control.TableColumn(); + fieldMap.put("tableColumn1", object67); + object67.setPrefWidth(75.0); + object67.setText("C1"); + final var object68 = new javafx.scene.control.TableColumn(); + fieldMap.put("tableColumn2", object68); + object68.setPrefWidth(75.0); + object68.setText("C2"); + object66.getColumns().addAll(object67, object68); + final var object69 = new javafx.scene.control.TextArea(); + fieldMap.put("textArea", object69); + object69.setPrefHeight(200.0); + object69.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object69, 15); + final var object70 = new javafx.scene.control.TextField(); + fieldMap.put("textField", object70); + javafx.scene.layout.GridPane.setColumnIndex(object70, 1); + javafx.scene.layout.GridPane.setRowIndex(object70, 15); + final var object71 = new javafx.scene.control.ToggleButton(); + object71.setMnemonicParsing(false); + object71.setText("ToggleButton"); + javafx.scene.layout.GridPane.setRowIndex(object71, 16); + final var object72 = new javafx.scene.control.TreeTableView>(); + fieldMap.put("treeTableView", object72); + object72.setPrefHeight(200.0); + object72.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object72, 1); + javafx.scene.layout.GridPane.setRowIndex(object72, 16); + final var object73 = new javafx.scene.control.TreeTableColumn, String>(); + fieldMap.put("treeTableColumn1", object73); + object73.setPrefWidth(75.0); + object73.setText("C1"); + final var object74 = new javafx.scene.control.TreeTableColumn, Integer>(); + fieldMap.put("treeTableColumn2", object74); + object74.setPrefWidth(75.0); + object74.setSortType(javafx.scene.control.TreeTableColumn.SortType.DESCENDING); + object74.setText("C2"); + object72.getColumns().addAll(object73, object74); + final var object75 = new javafx.scene.control.TreeView(); + fieldMap.put("treeView", object75); + object75.setPrefHeight(200.0); + object75.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object75, 17); + final var object76 = new javafx.scene.web.WebView(); + fieldMap.put("webView", object76); + object76.setPrefHeight(200.0); + object76.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object76, 1); + javafx.scene.layout.GridPane.setRowIndex(object76, 17); + object0.getChildren().addAll(object22, object23, object24, object25, object28, object31, object32, object33, object34, object35, object36, object37, object38, object45, object49, object51, object52, object53, object55, object56, object57, object58, object59, object60, object61, object62, object63, object66, object69, object70, object71, object72, object75, object76); + final var controllerFactory = controllersMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + controller = (com.github.gtache.fxml.compiler.impl.ControlsController) controllerFactory.create(fieldMap); + object0.setOnInputMethodTextChanged(e -> callMethod("inputMethodTextChanged", e)); + object0.setOnKeyPressed(e -> callMethod("keyPressed", e)); + object0.setOnKeyReleased(e -> callMethod("keyReleased", e)); + object0.setOnKeyTyped(e -> callMethod("keyTyped", e)); + object35.setText(controller.resources().getString("include.label")); + object58.setOnDragDetected(e -> callMethod("dragDetected", e)); + object58.setOnDragDone(e -> callMethod("dragDone", e)); + object58.setOnDragDropped(e -> callMethod("dragDropped", e)); + object58.setOnDragEntered(e -> callMethod("dragEntered", e)); + object58.setOnDragExited(e -> callMethod("dragExited", e)); + object58.setOnDragOver(e -> callMethod("dragOver", e)); + object58.setOnMouseDragEntered(e -> callMethod("mouseDragEntered", e)); + object58.setOnMouseDragExited(e -> callMethod("mouseDragExited", e)); + object58.setOnMouseDragOver(e -> callMethod("mouseDragOver", e)); + object58.setOnMouseDragReleased(e -> callMethod("mouseDragReleased", e)); + object60.setOnContextMenuRequested(e -> callMethod("contextMenuRequested", e)); + object60.setOnMouseClicked(e -> callMethod("mouseClicked", e)); + object60.setOnMouseDragged(e -> callMethod("mouseDragged", e)); + object60.setOnMouseEntered(e -> callMethod("mouseEntered", e)); + object60.setOnMouseExited(e -> callMethod("mouseExited", e)); + object60.setOnMouseMoved(e -> callMethod("mouseMoved", e)); + object60.setOnMousePressed(e -> callMethod("mousePressed", e)); + object60.setOnMouseReleased(e -> callMethod("mouseReleased", e)); + object60.setOnScroll(e -> callMethod("onScroll", e)); + object60.setOnScrollFinished(e -> callMethod("onScrollFinished", e)); + object60.setOnScrollStarted(e -> callMethod("onScrollStarted", e)); + object61.setOnZoom(e -> callMethod("onZoom", e)); + object61.setOnZoomFinished(e -> callMethod("onZoomFinished", e)); + object61.setOnZoomStarted(e -> callMethod("onZoomStarted", e)); + object71.setOnAction(e -> callMethod("onAction", e)); + object71.setOnRotate(e -> callMethod("onRotate", e)); + object71.setOnRotationFinished(e -> callMethod("onRotationFinished", e)); + object71.setOnRotationStarted(e -> callMethod("onRotationStarted", e)); + object73.setOnEditCancel(e -> callMethod("onEditCancel", e)); + object73.setOnEditCommit(e -> callMethod("onEditCommit", e)); + object73.setOnEditStart(e -> callMethod("onEditStart", e)); + object75.setOnSwipeDown(e -> callMethod("onSwipeDown", e)); + object75.setOnSwipeLeft(e -> callMethod("onSwipeLeft", e)); + object75.setOnSwipeRight(e -> callMethod("onSwipeRight", e)); + object75.setOnSwipeUp(e -> callMethod("onSwipeUp", e)); + object76.setOnTouchMoved(e -> callMethod("onTouchMoved", e)); + object76.setOnTouchPressed(e -> callMethod("onTouchPressed", e)); + object76.setOnTouchReleased(e -> callMethod("onTouchReleased", e)); + object76.setOnTouchStationary(e -> callMethod("onTouchStationary", e)); + try { + final var initialize = controller.getClass().getDeclaredMethod("initialize"); + initialize.setAccessible(true); + initialize.invoke(controller); + } catch (final InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection", e); + } catch (final NoSuchMethodException ignored) { + } + loaded = true; + return object0; +} + + private void callMethod(final String methodName, final T event) { + try { + final Method method; + final var methods = Arrays.stream(controller.getClass().getDeclaredMethods()) + .filter(m -> m.getName().equals(methodName)).toList(); + if (methods.size() > 1) { + final var eventMethods = methods.stream().filter(m -> + m.getParameterCount() == 1 && Event.class.isAssignableFrom(m.getParameterTypes()[0])).toList(); + if (eventMethods.size() == 1) { + method = eventMethods.getFirst(); + } else { + final var emptyMethods = methods.stream().filter(m -> m.getParameterCount() == 0).toList(); + if (emptyMethods.size() == 1) { + method = emptyMethods.getFirst(); + } else { + throw new IllegalArgumentException("Multiple matching methods for " + methodName); + } + } + } else if (methods.size() == 1) { + method = methods.getFirst(); + } else { + throw new IllegalArgumentException("No matching method for " + methodName); + } + method.setAccessible(true); + if (method.getParameterCount() == 0) { + method.invoke(controller); + } else { + method.invoke(controller, event); + } + } catch (final IllegalAccessException | InvocationTargetException ex) { + throw new RuntimeException("Error using reflection on " + methodName, ex); + } +} + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.ControlsController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-reflection-reference-constructor.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-reflection-reference-constructor.txt new file mode 100644 index 0000000..57cc538 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-reflection-reference-constructor.txt @@ -0,0 +1,434 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; + + +/** + * Generated code, not thread-safe + */ +public final class ControlsController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.ControlsController controller; + + /** + * Instantiates a new ControlsController with no nested controllers and no resource bundle + * @param controller The controller + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of()); + } + + /** + * Instantiates a new ControlsController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, resourceBundle)); + } + + /** + * Instantiates a new ControlsController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public ControlsController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = resourceBundlesMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + controller = (com.github.gtache.fxml.compiler.impl.ControlsController) controllersMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + final var object0 = new javafx.scene.layout.GridPane(); + injectField("gridPane", object0); + object0.setOnInputMethodTextChanged(controller::inputMethodTextChanged); + object0.setOnKeyPressed(e -> controller.keyPressed()); + object0.setOnKeyReleased(controller::keyReleased); + object0.setOnKeyTyped(controller::keyTyped); + final var object1 = new javafx.scene.layout.RowConstraints(); + final var object2 = new javafx.scene.layout.RowConstraints(); + final var object3 = new javafx.scene.layout.RowConstraints(); + final var object4 = new javafx.scene.layout.RowConstraints(); + final var object5 = new javafx.scene.layout.RowConstraints(); + final var object6 = new javafx.scene.layout.RowConstraints(); + final var object7 = new javafx.scene.layout.RowConstraints(); + final var object8 = new javafx.scene.layout.RowConstraints(); + final var object9 = new javafx.scene.layout.RowConstraints(); + final var object10 = new javafx.scene.layout.RowConstraints(); + final var object11 = new javafx.scene.layout.RowConstraints(); + final var object12 = new javafx.scene.layout.RowConstraints(); + final var object13 = new javafx.scene.layout.RowConstraints(); + final var object14 = new javafx.scene.layout.RowConstraints(); + final var object15 = new javafx.scene.layout.RowConstraints(); + final var object16 = new javafx.scene.layout.RowConstraints(); + final var object17 = new javafx.scene.layout.RowConstraints(); + final var object18 = new javafx.scene.layout.RowConstraints(); + object0.getRowConstraints().addAll(object1, object2, object3, object4, object5, object6, object7, object8, object9, object10, object11, object12, object13, object14, object15, object16, object17, object18); + final var object19 = new javafx.scene.layout.ColumnConstraints(); + final var object20 = new javafx.scene.layout.ColumnConstraints(); + final var object21 = new javafx.scene.layout.ColumnConstraints(); + object21.setMinWidth(10.0); + object21.setPrefWidth(100.0); + object0.getColumnConstraints().addAll(object19, object20, object21); + final var object22 = new javafx.scene.control.Button(); + injectField("button", object22); + object22.setMnemonicParsing(false); + object22.setText("Button"); + final var object23 = new javafx.scene.control.CheckBox(); + injectField("checkBox", object23); + object23.setIndeterminate(true); + object23.setMnemonicParsing(false); + object23.setText("CheckBox"); + javafx.scene.layout.GridPane.setColumnIndex(object23, 1); + final var object24 = new javafx.scene.control.ChoiceBox(); + injectField("choiceBox", object24); + object24.setCacheShape(false); + object24.setCenterShape(false); + object24.setDisable(true); + object24.setFocusTraversable(false); + object24.setPrefWidth(150.0); + object24.setScaleShape(false); + object24.setVisible(false); + javafx.scene.layout.GridPane.setRowIndex(object24, 1); + final var object25 = new javafx.scene.control.ColorPicker(); + injectField("colorPicker", object25); + object25.setNodeOrientation(javafx.geometry.NodeOrientation.LEFT_TO_RIGHT); + object25.setOpacity(0.5); + javafx.scene.layout.GridPane.setColumnIndex(object25, 1); + javafx.scene.layout.GridPane.setRowIndex(object25, 1); + final var object26 = new javafx.scene.paint.Color(0.7894737124443054, 0.08771929889917374, 0.08771929889917374, 1); + injectField("color", object26); + object25.setValue(object26); + final var object27 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object25.setOpaqueInsets(object27); + final var object28 = new javafx.scene.control.ComboBox(); + injectField("comboBox", object28); + object28.setEditable(true); + object28.setPrefWidth(150.0); + object28.setPromptText("Text"); + object28.setVisibleRowCount(5); + javafx.scene.layout.GridPane.setRowIndex(object28, 2); + final var object29 = javafx.scene.Cursor.CLOSED_HAND; + object28.setCursor(object29); + final var object30 = new javafx.scene.effect.Bloom(); + object28.setEffect(object30); + final var object31 = new javafx.scene.control.DatePicker(); + injectField("datePicker", object31); + object31.setShowWeekNumbers(true); + object31.setStyle("-fx-background-color: #ffffff;"); + javafx.scene.layout.GridPane.setColumnIndex(object31, 1); + javafx.scene.layout.GridPane.setRowIndex(object31, 2); + final var object32 = new javafx.scene.web.HTMLEditor(); + injectField("htmlEditor", object32); + object32.setHtmlText(""); + object32.setPrefHeight(200.0); + object32.setPrefWidth(506.0); + object32.getStyleClass().addAll("clazz"); + object32.getStylesheets().addAll("@style.css"); + javafx.scene.layout.GridPane.setRowIndex(object32, 3); + final var object33 = new javafx.scene.control.Hyperlink(); + injectField("hyperlink", object33); + object33.setText("Hyperlink"); + javafx.scene.layout.GridPane.setColumnIndex(object33, 1); + javafx.scene.layout.GridPane.setRowIndex(object33, 3); + final var object34 = new javafx.scene.image.ImageView(); + injectField("imageView", object34); + object34.setFitHeight(150.0); + object34.setFitWidth(200.0); + object34.setPickOnBounds(true); + object34.setPreserveRatio(true); + javafx.scene.layout.GridPane.setRowIndex(object34, 4); + final var object35 = new javafx.scene.control.Label(); + injectField("label", object35); + object35.setAccessibleHelp("TTTTT"); + object35.setAccessibleText("TTT"); + object35.setBlendMode(javafx.scene.effect.BlendMode.ADD); + object35.setCache(true); + object35.setCacheHint(javafx.scene.CacheHint.QUALITY); + object35.setDepthTest(javafx.scene.DepthTest.ENABLE); + object35.setMnemonicParsing(true); + object35.setMouseTransparent(true); + object35.setText(bundle.getString("include.label")); + javafx.scene.layout.GridPane.setColumnIndex(object35, 1); + javafx.scene.layout.GridPane.setRowIndex(object35, 4); + final var object36 = new javafx.scene.control.ListView(); + injectField("listView", object36); + object36.setFixedCellSize(20.0); + object36.setNodeOrientation(javafx.geometry.NodeOrientation.RIGHT_TO_LEFT); + object36.setOrientation(javafx.geometry.Orientation.HORIZONTAL); + object36.setPrefHeight(200.0); + object36.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object36, 5); + final var object37 = new javafx.scene.media.MediaView(); + injectField("mediaView", object37); + object37.setFitHeight(200.0); + object37.setFitWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object37, 1); + javafx.scene.layout.GridPane.setColumnSpan(object37, 2); + javafx.scene.layout.GridPane.setRowIndex(object37, 5); + javafx.scene.layout.GridPane.setRowSpan(object37, 2); + final var object38 = new javafx.scene.control.MenuBar(); + injectField("menuBar", object38); + javafx.scene.layout.GridPane.setHalignment(object38, javafx.geometry.HPos.RIGHT); + javafx.scene.layout.GridPane.setHgrow(object38, javafx.scene.layout.Priority.ALWAYS); + javafx.scene.layout.GridPane.setRowIndex(object38, 7); + javafx.scene.layout.GridPane.setValignment(object38, javafx.geometry.VPos.BASELINE); + javafx.scene.layout.GridPane.setVgrow(object38, javafx.scene.layout.Priority.SOMETIMES); + final var object39 = new javafx.scene.control.Menu(); + injectField("menu1", object39); + object39.setMnemonicParsing(false); + object39.setText("File"); + final var object40 = new javafx.scene.control.MenuItem(); + injectField("menuItem1", object40); + object40.setMnemonicParsing(false); + object40.setText("Close"); + object39.getItems().addAll(object40); + final var object41 = new javafx.scene.control.Menu(); + object41.setMnemonicParsing(false); + object41.setText("Edit"); + final var object42 = new javafx.scene.control.MenuItem(); + object42.setMnemonicParsing(false); + object42.setText("Delete"); + object41.getItems().addAll(object42); + final var object43 = new javafx.scene.control.Menu(); + object43.setMnemonicParsing(false); + object43.setText("Help"); + final var object44 = new javafx.scene.control.MenuItem(); + object44.setMnemonicParsing(false); + object44.setText("About"); + object43.getItems().addAll(object44); + object38.getMenus().addAll(object39, object41, object43); + final var object45 = new javafx.scene.control.MenuButton(); + injectField("menuButton", object45); + object45.setMnemonicParsing(false); + object45.setText("MenuButton"); + javafx.scene.layout.GridPane.setColumnIndex(object45, 1); + javafx.scene.layout.GridPane.setRowIndex(object45, 7); + final var object46 = new javafx.scene.control.MenuItem(); + object46.setMnemonicParsing(false); + object46.setText("Action 1"); + final var object47 = new javafx.scene.control.MenuItem(); + object47.setMnemonicParsing(false); + object47.setText("Action 2"); + object45.getItems().addAll(object46, object47); + final var object48 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + javafx.scene.layout.GridPane.setMargin(object45, object48); + final var object49 = new javafx.scene.control.Pagination(); + injectField("pagination", object49); + object49.setPrefHeight(200.0); + object49.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object49, 8); + final var object50 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object49.setPadding(object50); + final var object51 = new javafx.scene.control.PasswordField(); + injectField("passwordField", object51); + object51.setMaxHeight(6.0); + object51.setMaxWidth(5.0); + object51.setMinHeight(2.0); + object51.setMinWidth(1.0); + object51.setPrefColumnCount(7); + object51.setPrefHeight(4.0); + object51.setPrefWidth(3.0); + javafx.scene.layout.GridPane.setColumnIndex(object51, 1); + javafx.scene.layout.GridPane.setRowIndex(object51, 8); + final var object52 = new javafx.scene.control.ProgressBar(); + injectField("progressBar", object52); + object52.setLayoutX(10.0); + object52.setLayoutY(20.0); + object52.setPrefWidth(200.0); + object52.setProgress(0.0); + javafx.scene.layout.GridPane.setRowIndex(object52, 9); + final var object53 = new javafx.scene.control.ProgressIndicator(); + injectField("progressIndicator", object53); + object53.setProgress(0.0); + object53.setRotate(2.0); + javafx.scene.layout.GridPane.setColumnIndex(object53, 1); + javafx.scene.layout.GridPane.setRowIndex(object53, 9); + final var object54 = new javafx.geometry.Point3D(4.0, 5.0, 6.0); + object53.setRotationAxis(object54); + final var object55 = new javafx.scene.control.RadioButton(); + injectField("radioButton", object55); + object55.setMnemonicParsing(false); + object55.setScaleX(7.0); + object55.setScaleY(2.0); + object55.setScaleZ(3.0); + object55.setText("RadioButton"); + object55.setTranslateX(4.0); + object55.setTranslateY(5.0); + object55.setTranslateZ(6.0); + javafx.scene.layout.GridPane.setRowIndex(object55, 10); + final var object56 = new javafx.scene.control.ScrollBar(); + injectField("scrollBarH", object56); + javafx.scene.layout.GridPane.setColumnIndex(object56, 1); + javafx.scene.layout.GridPane.setRowIndex(object56, 10); + final var object57 = new javafx.scene.control.ScrollBar(); + injectField("scrollBarV", object57); + object57.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object57, 11); + final var object58 = new javafx.scene.control.Separator(); + injectField("separatorH", object58); + object58.setOnDragDetected(controller::dragDetected); + object58.setOnDragDone(controller::dragDone); + object58.setOnDragDropped(controller::dragDropped); + object58.setOnDragEntered(controller::dragEntered); + object58.setOnDragExited(controller::dragExited); + object58.setOnDragOver(controller::dragOver); + object58.setOnMouseDragEntered(controller::mouseDragEntered); + object58.setOnMouseDragExited(controller::mouseDragExited); + object58.setOnMouseDragOver(controller::mouseDragOver); + object58.setOnMouseDragReleased(controller::mouseDragReleased); + object58.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object58, 1); + javafx.scene.layout.GridPane.setRowIndex(object58, 11); + final var object59 = new javafx.scene.control.Separator(); + injectField("separatorV", object59); + object59.setOrientation(javafx.geometry.Orientation.VERTICAL); + object59.setPrefHeight(200.0); + javafx.scene.layout.GridPane.setRowIndex(object59, 12); + final var object60 = new javafx.scene.control.Slider(); + injectField("sliderH", object60); + object60.setOnContextMenuRequested(controller::contextMenuRequested); + object60.setOnMouseClicked(e -> controller.mouseClicked()); + object60.setOnMouseDragged(controller::mouseDragged); + object60.setOnMouseEntered(controller::mouseEntered); + object60.setOnMouseExited(controller::mouseExited); + object60.setOnMouseMoved(controller::mouseMoved); + object60.setOnMousePressed(controller::mousePressed); + object60.setOnMouseReleased(controller::mouseReleased); + object60.setOnScroll(controller::onScroll); + object60.setOnScrollFinished(controller::onScrollFinished); + object60.setOnScrollStarted(controller::onScrollStarted); + javafx.scene.layout.GridPane.setColumnIndex(object60, 1); + javafx.scene.layout.GridPane.setRowIndex(object60, 12); + final var object61 = new javafx.scene.control.Slider(); + injectField("sliderV", object61); + object61.setOnZoom(controller::onZoom); + object61.setOnZoomFinished(controller::onZoomFinished); + object61.setOnZoomStarted(controller::onZoomStarted); + object61.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object61, 13); + final var object62 = new javafx.scene.control.Spinner(); + injectField("spinner", object62); + javafx.scene.layout.GridPane.setColumnIndex(object62, 1); + javafx.scene.layout.GridPane.setRowIndex(object62, 13); + final var object63 = new javafx.scene.control.SplitMenuButton(); + injectField("splitMenuButton", object63); + object63.setMnemonicParsing(false); + object63.setText("SplitMenuButton"); + javafx.scene.layout.GridPane.setRowIndex(object63, 14); + final var object64 = new javafx.scene.control.MenuItem(); + injectField("item1", object64); + object64.setMnemonicParsing(false); + object64.setText("Action 1"); + final var object65 = new javafx.scene.control.MenuItem(); + injectField("item2", object65); + object65.setMnemonicParsing(false); + object65.setText("Action 2"); + object63.getItems().addAll(object64, object65); + final var object66 = new javafx.scene.control.TableView(); + injectField("tableView", object66); + object66.setPrefHeight(200.0); + object66.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object66, 1); + javafx.scene.layout.GridPane.setRowIndex(object66, 14); + final var object67 = new javafx.scene.control.TableColumn(); + injectField("tableColumn1", object67); + object67.setPrefWidth(75.0); + object67.setText("C1"); + final var object68 = new javafx.scene.control.TableColumn(); + injectField("tableColumn2", object68); + object68.setPrefWidth(75.0); + object68.setText("C2"); + object66.getColumns().addAll(object67, object68); + final var object69 = new javafx.scene.control.TextArea(); + injectField("textArea", object69); + object69.setPrefHeight(200.0); + object69.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object69, 15); + final var object70 = new javafx.scene.control.TextField(); + injectField("textField", object70); + javafx.scene.layout.GridPane.setColumnIndex(object70, 1); + javafx.scene.layout.GridPane.setRowIndex(object70, 15); + final var object71 = new javafx.scene.control.ToggleButton(); + object71.setMnemonicParsing(false); + object71.setOnAction(controller::onAction); + object71.setOnRotate(controller::onRotate); + object71.setOnRotationFinished(controller::onRotationFinished); + object71.setOnRotationStarted(controller::onRotationStarted); + object71.setText("ToggleButton"); + javafx.scene.layout.GridPane.setRowIndex(object71, 16); + final var object72 = new javafx.scene.control.TreeTableView>(); + injectField("treeTableView", object72); + object72.setPrefHeight(200.0); + object72.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object72, 1); + javafx.scene.layout.GridPane.setRowIndex(object72, 16); + final var object73 = new javafx.scene.control.TreeTableColumn, String>(); + injectField("treeTableColumn1", object73); + object73.setOnEditCancel(controller::onEditCancel); + object73.setOnEditCommit(controller::onEditCommit); + object73.setOnEditStart(controller::onEditStart); + object73.setPrefWidth(75.0); + object73.setText("C1"); + final var object74 = new javafx.scene.control.TreeTableColumn, Integer>(); + injectField("treeTableColumn2", object74); + object74.setPrefWidth(75.0); + object74.setSortType(javafx.scene.control.TreeTableColumn.SortType.DESCENDING); + object74.setText("C2"); + object72.getColumns().addAll(object73, object74); + final var object75 = new javafx.scene.control.TreeView(); + injectField("treeView", object75); + object75.setOnSwipeDown(controller::onSwipeDown); + object75.setOnSwipeLeft(controller::onSwipeLeft); + object75.setOnSwipeRight(controller::onSwipeRight); + object75.setOnSwipeUp(controller::onSwipeUp); + object75.setPrefHeight(200.0); + object75.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object75, 17); + final var object76 = new javafx.scene.web.WebView(); + injectField("webView", object76); + object76.setOnTouchMoved(controller::onTouchMoved); + object76.setOnTouchPressed(controller::onTouchPressed); + object76.setOnTouchReleased(controller::onTouchReleased); + object76.setOnTouchStationary(controller::onTouchStationary); + object76.setPrefHeight(200.0); + object76.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object76, 1); + javafx.scene.layout.GridPane.setRowIndex(object76, 17); + object0.getChildren().addAll(object22, object23, object24, object25, object28, object31, object32, object33, object34, object35, object36, object37, object38, object45, object49, object51, object52, object53, object55, object56, object57, object58, object59, object60, object61, object62, object63, object66, object69, object70, object71, object72, object75, object76); + controller.initialize(); + loaded = true; + return object0; +} + + private void injectField(final String fieldName, final T object) { + try { + final var field = controller.getClass().getDeclaredField(fieldName); + field.setAccessible(true); + field.set(controller, object); + } catch (final NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection on " + fieldName, e); + } +} + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.ControlsController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-reflection-reference-getbundle.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-reflection-reference-getbundle.txt new file mode 100644 index 0000000..ecec6c8 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-reflection-reference-getbundle.txt @@ -0,0 +1,434 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; + + +/** + * Generated code, not thread-safe + */ +public final class ControlsController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.ControlsController controller; + + /** + * Instantiates a new ControlsController with no nested controllers and no resource bundle + * @param controller The controller + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of()); + } + + /** + * Instantiates a new ControlsController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, resourceBundle)); + } + + /** + * Instantiates a new ControlsController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public ControlsController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + controller = (com.github.gtache.fxml.compiler.impl.ControlsController) controllersMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + final var object0 = new javafx.scene.layout.GridPane(); + injectField("gridPane", object0); + object0.setOnInputMethodTextChanged(controller::inputMethodTextChanged); + object0.setOnKeyPressed(e -> controller.keyPressed()); + object0.setOnKeyReleased(controller::keyReleased); + object0.setOnKeyTyped(controller::keyTyped); + final var object1 = new javafx.scene.layout.RowConstraints(); + final var object2 = new javafx.scene.layout.RowConstraints(); + final var object3 = new javafx.scene.layout.RowConstraints(); + final var object4 = new javafx.scene.layout.RowConstraints(); + final var object5 = new javafx.scene.layout.RowConstraints(); + final var object6 = new javafx.scene.layout.RowConstraints(); + final var object7 = new javafx.scene.layout.RowConstraints(); + final var object8 = new javafx.scene.layout.RowConstraints(); + final var object9 = new javafx.scene.layout.RowConstraints(); + final var object10 = new javafx.scene.layout.RowConstraints(); + final var object11 = new javafx.scene.layout.RowConstraints(); + final var object12 = new javafx.scene.layout.RowConstraints(); + final var object13 = new javafx.scene.layout.RowConstraints(); + final var object14 = new javafx.scene.layout.RowConstraints(); + final var object15 = new javafx.scene.layout.RowConstraints(); + final var object16 = new javafx.scene.layout.RowConstraints(); + final var object17 = new javafx.scene.layout.RowConstraints(); + final var object18 = new javafx.scene.layout.RowConstraints(); + object0.getRowConstraints().addAll(object1, object2, object3, object4, object5, object6, object7, object8, object9, object10, object11, object12, object13, object14, object15, object16, object17, object18); + final var object19 = new javafx.scene.layout.ColumnConstraints(); + final var object20 = new javafx.scene.layout.ColumnConstraints(); + final var object21 = new javafx.scene.layout.ColumnConstraints(); + object21.setMinWidth(10.0); + object21.setPrefWidth(100.0); + object0.getColumnConstraints().addAll(object19, object20, object21); + final var object22 = new javafx.scene.control.Button(); + injectField("button", object22); + object22.setMnemonicParsing(false); + object22.setText("Button"); + final var object23 = new javafx.scene.control.CheckBox(); + injectField("checkBox", object23); + object23.setIndeterminate(true); + object23.setMnemonicParsing(false); + object23.setText("CheckBox"); + javafx.scene.layout.GridPane.setColumnIndex(object23, 1); + final var object24 = new javafx.scene.control.ChoiceBox(); + injectField("choiceBox", object24); + object24.setCacheShape(false); + object24.setCenterShape(false); + object24.setDisable(true); + object24.setFocusTraversable(false); + object24.setPrefWidth(150.0); + object24.setScaleShape(false); + object24.setVisible(false); + javafx.scene.layout.GridPane.setRowIndex(object24, 1); + final var object25 = new javafx.scene.control.ColorPicker(); + injectField("colorPicker", object25); + object25.setNodeOrientation(javafx.geometry.NodeOrientation.LEFT_TO_RIGHT); + object25.setOpacity(0.5); + javafx.scene.layout.GridPane.setColumnIndex(object25, 1); + javafx.scene.layout.GridPane.setRowIndex(object25, 1); + final var object26 = new javafx.scene.paint.Color(0.7894737124443054, 0.08771929889917374, 0.08771929889917374, 1); + injectField("color", object26); + object25.setValue(object26); + final var object27 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object25.setOpaqueInsets(object27); + final var object28 = new javafx.scene.control.ComboBox(); + injectField("comboBox", object28); + object28.setEditable(true); + object28.setPrefWidth(150.0); + object28.setPromptText("Text"); + object28.setVisibleRowCount(5); + javafx.scene.layout.GridPane.setRowIndex(object28, 2); + final var object29 = javafx.scene.Cursor.CLOSED_HAND; + object28.setCursor(object29); + final var object30 = new javafx.scene.effect.Bloom(); + object28.setEffect(object30); + final var object31 = new javafx.scene.control.DatePicker(); + injectField("datePicker", object31); + object31.setShowWeekNumbers(true); + object31.setStyle("-fx-background-color: #ffffff;"); + javafx.scene.layout.GridPane.setColumnIndex(object31, 1); + javafx.scene.layout.GridPane.setRowIndex(object31, 2); + final var object32 = new javafx.scene.web.HTMLEditor(); + injectField("htmlEditor", object32); + object32.setHtmlText(""); + object32.setPrefHeight(200.0); + object32.setPrefWidth(506.0); + object32.getStyleClass().addAll("clazz"); + object32.getStylesheets().addAll("@style.css"); + javafx.scene.layout.GridPane.setRowIndex(object32, 3); + final var object33 = new javafx.scene.control.Hyperlink(); + injectField("hyperlink", object33); + object33.setText("Hyperlink"); + javafx.scene.layout.GridPane.setColumnIndex(object33, 1); + javafx.scene.layout.GridPane.setRowIndex(object33, 3); + final var object34 = new javafx.scene.image.ImageView(); + injectField("imageView", object34); + object34.setFitHeight(150.0); + object34.setFitWidth(200.0); + object34.setPickOnBounds(true); + object34.setPreserveRatio(true); + javafx.scene.layout.GridPane.setRowIndex(object34, 4); + final var object35 = new javafx.scene.control.Label(); + injectField("label", object35); + object35.setAccessibleHelp("TTTTT"); + object35.setAccessibleText("TTT"); + object35.setBlendMode(javafx.scene.effect.BlendMode.ADD); + object35.setCache(true); + object35.setCacheHint(javafx.scene.CacheHint.QUALITY); + object35.setDepthTest(javafx.scene.DepthTest.ENABLE); + object35.setMnemonicParsing(true); + object35.setMouseTransparent(true); + object35.setText(bundle.getString("include.label")); + javafx.scene.layout.GridPane.setColumnIndex(object35, 1); + javafx.scene.layout.GridPane.setRowIndex(object35, 4); + final var object36 = new javafx.scene.control.ListView(); + injectField("listView", object36); + object36.setFixedCellSize(20.0); + object36.setNodeOrientation(javafx.geometry.NodeOrientation.RIGHT_TO_LEFT); + object36.setOrientation(javafx.geometry.Orientation.HORIZONTAL); + object36.setPrefHeight(200.0); + object36.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object36, 5); + final var object37 = new javafx.scene.media.MediaView(); + injectField("mediaView", object37); + object37.setFitHeight(200.0); + object37.setFitWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object37, 1); + javafx.scene.layout.GridPane.setColumnSpan(object37, 2); + javafx.scene.layout.GridPane.setRowIndex(object37, 5); + javafx.scene.layout.GridPane.setRowSpan(object37, 2); + final var object38 = new javafx.scene.control.MenuBar(); + injectField("menuBar", object38); + javafx.scene.layout.GridPane.setHalignment(object38, javafx.geometry.HPos.RIGHT); + javafx.scene.layout.GridPane.setHgrow(object38, javafx.scene.layout.Priority.ALWAYS); + javafx.scene.layout.GridPane.setRowIndex(object38, 7); + javafx.scene.layout.GridPane.setValignment(object38, javafx.geometry.VPos.BASELINE); + javafx.scene.layout.GridPane.setVgrow(object38, javafx.scene.layout.Priority.SOMETIMES); + final var object39 = new javafx.scene.control.Menu(); + injectField("menu1", object39); + object39.setMnemonicParsing(false); + object39.setText("File"); + final var object40 = new javafx.scene.control.MenuItem(); + injectField("menuItem1", object40); + object40.setMnemonicParsing(false); + object40.setText("Close"); + object39.getItems().addAll(object40); + final var object41 = new javafx.scene.control.Menu(); + object41.setMnemonicParsing(false); + object41.setText("Edit"); + final var object42 = new javafx.scene.control.MenuItem(); + object42.setMnemonicParsing(false); + object42.setText("Delete"); + object41.getItems().addAll(object42); + final var object43 = new javafx.scene.control.Menu(); + object43.setMnemonicParsing(false); + object43.setText("Help"); + final var object44 = new javafx.scene.control.MenuItem(); + object44.setMnemonicParsing(false); + object44.setText("About"); + object43.getItems().addAll(object44); + object38.getMenus().addAll(object39, object41, object43); + final var object45 = new javafx.scene.control.MenuButton(); + injectField("menuButton", object45); + object45.setMnemonicParsing(false); + object45.setText("MenuButton"); + javafx.scene.layout.GridPane.setColumnIndex(object45, 1); + javafx.scene.layout.GridPane.setRowIndex(object45, 7); + final var object46 = new javafx.scene.control.MenuItem(); + object46.setMnemonicParsing(false); + object46.setText("Action 1"); + final var object47 = new javafx.scene.control.MenuItem(); + object47.setMnemonicParsing(false); + object47.setText("Action 2"); + object45.getItems().addAll(object46, object47); + final var object48 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + javafx.scene.layout.GridPane.setMargin(object45, object48); + final var object49 = new javafx.scene.control.Pagination(); + injectField("pagination", object49); + object49.setPrefHeight(200.0); + object49.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object49, 8); + final var object50 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object49.setPadding(object50); + final var object51 = new javafx.scene.control.PasswordField(); + injectField("passwordField", object51); + object51.setMaxHeight(6.0); + object51.setMaxWidth(5.0); + object51.setMinHeight(2.0); + object51.setMinWidth(1.0); + object51.setPrefColumnCount(7); + object51.setPrefHeight(4.0); + object51.setPrefWidth(3.0); + javafx.scene.layout.GridPane.setColumnIndex(object51, 1); + javafx.scene.layout.GridPane.setRowIndex(object51, 8); + final var object52 = new javafx.scene.control.ProgressBar(); + injectField("progressBar", object52); + object52.setLayoutX(10.0); + object52.setLayoutY(20.0); + object52.setPrefWidth(200.0); + object52.setProgress(0.0); + javafx.scene.layout.GridPane.setRowIndex(object52, 9); + final var object53 = new javafx.scene.control.ProgressIndicator(); + injectField("progressIndicator", object53); + object53.setProgress(0.0); + object53.setRotate(2.0); + javafx.scene.layout.GridPane.setColumnIndex(object53, 1); + javafx.scene.layout.GridPane.setRowIndex(object53, 9); + final var object54 = new javafx.geometry.Point3D(4.0, 5.0, 6.0); + object53.setRotationAxis(object54); + final var object55 = new javafx.scene.control.RadioButton(); + injectField("radioButton", object55); + object55.setMnemonicParsing(false); + object55.setScaleX(7.0); + object55.setScaleY(2.0); + object55.setScaleZ(3.0); + object55.setText("RadioButton"); + object55.setTranslateX(4.0); + object55.setTranslateY(5.0); + object55.setTranslateZ(6.0); + javafx.scene.layout.GridPane.setRowIndex(object55, 10); + final var object56 = new javafx.scene.control.ScrollBar(); + injectField("scrollBarH", object56); + javafx.scene.layout.GridPane.setColumnIndex(object56, 1); + javafx.scene.layout.GridPane.setRowIndex(object56, 10); + final var object57 = new javafx.scene.control.ScrollBar(); + injectField("scrollBarV", object57); + object57.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object57, 11); + final var object58 = new javafx.scene.control.Separator(); + injectField("separatorH", object58); + object58.setOnDragDetected(controller::dragDetected); + object58.setOnDragDone(controller::dragDone); + object58.setOnDragDropped(controller::dragDropped); + object58.setOnDragEntered(controller::dragEntered); + object58.setOnDragExited(controller::dragExited); + object58.setOnDragOver(controller::dragOver); + object58.setOnMouseDragEntered(controller::mouseDragEntered); + object58.setOnMouseDragExited(controller::mouseDragExited); + object58.setOnMouseDragOver(controller::mouseDragOver); + object58.setOnMouseDragReleased(controller::mouseDragReleased); + object58.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object58, 1); + javafx.scene.layout.GridPane.setRowIndex(object58, 11); + final var object59 = new javafx.scene.control.Separator(); + injectField("separatorV", object59); + object59.setOrientation(javafx.geometry.Orientation.VERTICAL); + object59.setPrefHeight(200.0); + javafx.scene.layout.GridPane.setRowIndex(object59, 12); + final var object60 = new javafx.scene.control.Slider(); + injectField("sliderH", object60); + object60.setOnContextMenuRequested(controller::contextMenuRequested); + object60.setOnMouseClicked(e -> controller.mouseClicked()); + object60.setOnMouseDragged(controller::mouseDragged); + object60.setOnMouseEntered(controller::mouseEntered); + object60.setOnMouseExited(controller::mouseExited); + object60.setOnMouseMoved(controller::mouseMoved); + object60.setOnMousePressed(controller::mousePressed); + object60.setOnMouseReleased(controller::mouseReleased); + object60.setOnScroll(controller::onScroll); + object60.setOnScrollFinished(controller::onScrollFinished); + object60.setOnScrollStarted(controller::onScrollStarted); + javafx.scene.layout.GridPane.setColumnIndex(object60, 1); + javafx.scene.layout.GridPane.setRowIndex(object60, 12); + final var object61 = new javafx.scene.control.Slider(); + injectField("sliderV", object61); + object61.setOnZoom(controller::onZoom); + object61.setOnZoomFinished(controller::onZoomFinished); + object61.setOnZoomStarted(controller::onZoomStarted); + object61.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object61, 13); + final var object62 = new javafx.scene.control.Spinner(); + injectField("spinner", object62); + javafx.scene.layout.GridPane.setColumnIndex(object62, 1); + javafx.scene.layout.GridPane.setRowIndex(object62, 13); + final var object63 = new javafx.scene.control.SplitMenuButton(); + injectField("splitMenuButton", object63); + object63.setMnemonicParsing(false); + object63.setText("SplitMenuButton"); + javafx.scene.layout.GridPane.setRowIndex(object63, 14); + final var object64 = new javafx.scene.control.MenuItem(); + injectField("item1", object64); + object64.setMnemonicParsing(false); + object64.setText("Action 1"); + final var object65 = new javafx.scene.control.MenuItem(); + injectField("item2", object65); + object65.setMnemonicParsing(false); + object65.setText("Action 2"); + object63.getItems().addAll(object64, object65); + final var object66 = new javafx.scene.control.TableView(); + injectField("tableView", object66); + object66.setPrefHeight(200.0); + object66.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object66, 1); + javafx.scene.layout.GridPane.setRowIndex(object66, 14); + final var object67 = new javafx.scene.control.TableColumn(); + injectField("tableColumn1", object67); + object67.setPrefWidth(75.0); + object67.setText("C1"); + final var object68 = new javafx.scene.control.TableColumn(); + injectField("tableColumn2", object68); + object68.setPrefWidth(75.0); + object68.setText("C2"); + object66.getColumns().addAll(object67, object68); + final var object69 = new javafx.scene.control.TextArea(); + injectField("textArea", object69); + object69.setPrefHeight(200.0); + object69.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object69, 15); + final var object70 = new javafx.scene.control.TextField(); + injectField("textField", object70); + javafx.scene.layout.GridPane.setColumnIndex(object70, 1); + javafx.scene.layout.GridPane.setRowIndex(object70, 15); + final var object71 = new javafx.scene.control.ToggleButton(); + object71.setMnemonicParsing(false); + object71.setOnAction(controller::onAction); + object71.setOnRotate(controller::onRotate); + object71.setOnRotationFinished(controller::onRotationFinished); + object71.setOnRotationStarted(controller::onRotationStarted); + object71.setText("ToggleButton"); + javafx.scene.layout.GridPane.setRowIndex(object71, 16); + final var object72 = new javafx.scene.control.TreeTableView>(); + injectField("treeTableView", object72); + object72.setPrefHeight(200.0); + object72.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object72, 1); + javafx.scene.layout.GridPane.setRowIndex(object72, 16); + final var object73 = new javafx.scene.control.TreeTableColumn, String>(); + injectField("treeTableColumn1", object73); + object73.setOnEditCancel(controller::onEditCancel); + object73.setOnEditCommit(controller::onEditCommit); + object73.setOnEditStart(controller::onEditStart); + object73.setPrefWidth(75.0); + object73.setText("C1"); + final var object74 = new javafx.scene.control.TreeTableColumn, Integer>(); + injectField("treeTableColumn2", object74); + object74.setPrefWidth(75.0); + object74.setSortType(javafx.scene.control.TreeTableColumn.SortType.DESCENDING); + object74.setText("C2"); + object72.getColumns().addAll(object73, object74); + final var object75 = new javafx.scene.control.TreeView(); + injectField("treeView", object75); + object75.setOnSwipeDown(controller::onSwipeDown); + object75.setOnSwipeLeft(controller::onSwipeLeft); + object75.setOnSwipeRight(controller::onSwipeRight); + object75.setOnSwipeUp(controller::onSwipeUp); + object75.setPrefHeight(200.0); + object75.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object75, 17); + final var object76 = new javafx.scene.web.WebView(); + injectField("webView", object76); + object76.setOnTouchMoved(controller::onTouchMoved); + object76.setOnTouchPressed(controller::onTouchPressed); + object76.setOnTouchReleased(controller::onTouchReleased); + object76.setOnTouchStationary(controller::onTouchStationary); + object76.setPrefHeight(200.0); + object76.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object76, 1); + javafx.scene.layout.GridPane.setRowIndex(object76, 17); + object0.getChildren().addAll(object22, object23, object24, object25, object28, object31, object32, object33, object34, object35, object36, object37, object38, object45, object49, object51, object52, object53, object55, object56, object57, object58, object59, object60, object61, object62, object63, object66, object69, object70, object71, object72, object75, object76); + controller.initialize(); + loaded = true; + return object0; +} + + private void injectField(final String fieldName, final T object) { + try { + final var field = controller.getClass().getDeclaredField(fieldName); + field.setAccessible(true); + field.set(controller, object); + } catch (final NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection on " + fieldName, e); + } +} + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.ControlsController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-reflection-reference-getter.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-reflection-reference-getter.txt new file mode 100644 index 0000000..14cacdf --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-reflection-reference-getter.txt @@ -0,0 +1,433 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; + + +/** + * Generated code, not thread-safe + */ +public final class ControlsController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.ControlsController controller; + + /** + * Instantiates a new ControlsController with no nested controllers and no resource bundle + * @param controller The controller + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of()); + } + + /** + * Instantiates a new ControlsController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, resourceBundle)); + } + + /** + * Instantiates a new ControlsController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public ControlsController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + controller = (com.github.gtache.fxml.compiler.impl.ControlsController) controllersMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + final var object0 = new javafx.scene.layout.GridPane(); + injectField("gridPane", object0); + object0.setOnInputMethodTextChanged(controller::inputMethodTextChanged); + object0.setOnKeyPressed(e -> controller.keyPressed()); + object0.setOnKeyReleased(controller::keyReleased); + object0.setOnKeyTyped(controller::keyTyped); + final var object1 = new javafx.scene.layout.RowConstraints(); + final var object2 = new javafx.scene.layout.RowConstraints(); + final var object3 = new javafx.scene.layout.RowConstraints(); + final var object4 = new javafx.scene.layout.RowConstraints(); + final var object5 = new javafx.scene.layout.RowConstraints(); + final var object6 = new javafx.scene.layout.RowConstraints(); + final var object7 = new javafx.scene.layout.RowConstraints(); + final var object8 = new javafx.scene.layout.RowConstraints(); + final var object9 = new javafx.scene.layout.RowConstraints(); + final var object10 = new javafx.scene.layout.RowConstraints(); + final var object11 = new javafx.scene.layout.RowConstraints(); + final var object12 = new javafx.scene.layout.RowConstraints(); + final var object13 = new javafx.scene.layout.RowConstraints(); + final var object14 = new javafx.scene.layout.RowConstraints(); + final var object15 = new javafx.scene.layout.RowConstraints(); + final var object16 = new javafx.scene.layout.RowConstraints(); + final var object17 = new javafx.scene.layout.RowConstraints(); + final var object18 = new javafx.scene.layout.RowConstraints(); + object0.getRowConstraints().addAll(object1, object2, object3, object4, object5, object6, object7, object8, object9, object10, object11, object12, object13, object14, object15, object16, object17, object18); + final var object19 = new javafx.scene.layout.ColumnConstraints(); + final var object20 = new javafx.scene.layout.ColumnConstraints(); + final var object21 = new javafx.scene.layout.ColumnConstraints(); + object21.setMinWidth(10.0); + object21.setPrefWidth(100.0); + object0.getColumnConstraints().addAll(object19, object20, object21); + final var object22 = new javafx.scene.control.Button(); + injectField("button", object22); + object22.setMnemonicParsing(false); + object22.setText("Button"); + final var object23 = new javafx.scene.control.CheckBox(); + injectField("checkBox", object23); + object23.setIndeterminate(true); + object23.setMnemonicParsing(false); + object23.setText("CheckBox"); + javafx.scene.layout.GridPane.setColumnIndex(object23, 1); + final var object24 = new javafx.scene.control.ChoiceBox(); + injectField("choiceBox", object24); + object24.setCacheShape(false); + object24.setCenterShape(false); + object24.setDisable(true); + object24.setFocusTraversable(false); + object24.setPrefWidth(150.0); + object24.setScaleShape(false); + object24.setVisible(false); + javafx.scene.layout.GridPane.setRowIndex(object24, 1); + final var object25 = new javafx.scene.control.ColorPicker(); + injectField("colorPicker", object25); + object25.setNodeOrientation(javafx.geometry.NodeOrientation.LEFT_TO_RIGHT); + object25.setOpacity(0.5); + javafx.scene.layout.GridPane.setColumnIndex(object25, 1); + javafx.scene.layout.GridPane.setRowIndex(object25, 1); + final var object26 = new javafx.scene.paint.Color(0.7894737124443054, 0.08771929889917374, 0.08771929889917374, 1); + injectField("color", object26); + object25.setValue(object26); + final var object27 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object25.setOpaqueInsets(object27); + final var object28 = new javafx.scene.control.ComboBox(); + injectField("comboBox", object28); + object28.setEditable(true); + object28.setPrefWidth(150.0); + object28.setPromptText("Text"); + object28.setVisibleRowCount(5); + javafx.scene.layout.GridPane.setRowIndex(object28, 2); + final var object29 = javafx.scene.Cursor.CLOSED_HAND; + object28.setCursor(object29); + final var object30 = new javafx.scene.effect.Bloom(); + object28.setEffect(object30); + final var object31 = new javafx.scene.control.DatePicker(); + injectField("datePicker", object31); + object31.setShowWeekNumbers(true); + object31.setStyle("-fx-background-color: #ffffff;"); + javafx.scene.layout.GridPane.setColumnIndex(object31, 1); + javafx.scene.layout.GridPane.setRowIndex(object31, 2); + final var object32 = new javafx.scene.web.HTMLEditor(); + injectField("htmlEditor", object32); + object32.setHtmlText(""); + object32.setPrefHeight(200.0); + object32.setPrefWidth(506.0); + object32.getStyleClass().addAll("clazz"); + object32.getStylesheets().addAll("@style.css"); + javafx.scene.layout.GridPane.setRowIndex(object32, 3); + final var object33 = new javafx.scene.control.Hyperlink(); + injectField("hyperlink", object33); + object33.setText("Hyperlink"); + javafx.scene.layout.GridPane.setColumnIndex(object33, 1); + javafx.scene.layout.GridPane.setRowIndex(object33, 3); + final var object34 = new javafx.scene.image.ImageView(); + injectField("imageView", object34); + object34.setFitHeight(150.0); + object34.setFitWidth(200.0); + object34.setPickOnBounds(true); + object34.setPreserveRatio(true); + javafx.scene.layout.GridPane.setRowIndex(object34, 4); + final var object35 = new javafx.scene.control.Label(); + injectField("label", object35); + object35.setAccessibleHelp("TTTTT"); + object35.setAccessibleText("TTT"); + object35.setBlendMode(javafx.scene.effect.BlendMode.ADD); + object35.setCache(true); + object35.setCacheHint(javafx.scene.CacheHint.QUALITY); + object35.setDepthTest(javafx.scene.DepthTest.ENABLE); + object35.setMnemonicParsing(true); + object35.setMouseTransparent(true); + object35.setText(controller.resources().getString("include.label")); + javafx.scene.layout.GridPane.setColumnIndex(object35, 1); + javafx.scene.layout.GridPane.setRowIndex(object35, 4); + final var object36 = new javafx.scene.control.ListView(); + injectField("listView", object36); + object36.setFixedCellSize(20.0); + object36.setNodeOrientation(javafx.geometry.NodeOrientation.RIGHT_TO_LEFT); + object36.setOrientation(javafx.geometry.Orientation.HORIZONTAL); + object36.setPrefHeight(200.0); + object36.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object36, 5); + final var object37 = new javafx.scene.media.MediaView(); + injectField("mediaView", object37); + object37.setFitHeight(200.0); + object37.setFitWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object37, 1); + javafx.scene.layout.GridPane.setColumnSpan(object37, 2); + javafx.scene.layout.GridPane.setRowIndex(object37, 5); + javafx.scene.layout.GridPane.setRowSpan(object37, 2); + final var object38 = new javafx.scene.control.MenuBar(); + injectField("menuBar", object38); + javafx.scene.layout.GridPane.setHalignment(object38, javafx.geometry.HPos.RIGHT); + javafx.scene.layout.GridPane.setHgrow(object38, javafx.scene.layout.Priority.ALWAYS); + javafx.scene.layout.GridPane.setRowIndex(object38, 7); + javafx.scene.layout.GridPane.setValignment(object38, javafx.geometry.VPos.BASELINE); + javafx.scene.layout.GridPane.setVgrow(object38, javafx.scene.layout.Priority.SOMETIMES); + final var object39 = new javafx.scene.control.Menu(); + injectField("menu1", object39); + object39.setMnemonicParsing(false); + object39.setText("File"); + final var object40 = new javafx.scene.control.MenuItem(); + injectField("menuItem1", object40); + object40.setMnemonicParsing(false); + object40.setText("Close"); + object39.getItems().addAll(object40); + final var object41 = new javafx.scene.control.Menu(); + object41.setMnemonicParsing(false); + object41.setText("Edit"); + final var object42 = new javafx.scene.control.MenuItem(); + object42.setMnemonicParsing(false); + object42.setText("Delete"); + object41.getItems().addAll(object42); + final var object43 = new javafx.scene.control.Menu(); + object43.setMnemonicParsing(false); + object43.setText("Help"); + final var object44 = new javafx.scene.control.MenuItem(); + object44.setMnemonicParsing(false); + object44.setText("About"); + object43.getItems().addAll(object44); + object38.getMenus().addAll(object39, object41, object43); + final var object45 = new javafx.scene.control.MenuButton(); + injectField("menuButton", object45); + object45.setMnemonicParsing(false); + object45.setText("MenuButton"); + javafx.scene.layout.GridPane.setColumnIndex(object45, 1); + javafx.scene.layout.GridPane.setRowIndex(object45, 7); + final var object46 = new javafx.scene.control.MenuItem(); + object46.setMnemonicParsing(false); + object46.setText("Action 1"); + final var object47 = new javafx.scene.control.MenuItem(); + object47.setMnemonicParsing(false); + object47.setText("Action 2"); + object45.getItems().addAll(object46, object47); + final var object48 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + javafx.scene.layout.GridPane.setMargin(object45, object48); + final var object49 = new javafx.scene.control.Pagination(); + injectField("pagination", object49); + object49.setPrefHeight(200.0); + object49.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object49, 8); + final var object50 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object49.setPadding(object50); + final var object51 = new javafx.scene.control.PasswordField(); + injectField("passwordField", object51); + object51.setMaxHeight(6.0); + object51.setMaxWidth(5.0); + object51.setMinHeight(2.0); + object51.setMinWidth(1.0); + object51.setPrefColumnCount(7); + object51.setPrefHeight(4.0); + object51.setPrefWidth(3.0); + javafx.scene.layout.GridPane.setColumnIndex(object51, 1); + javafx.scene.layout.GridPane.setRowIndex(object51, 8); + final var object52 = new javafx.scene.control.ProgressBar(); + injectField("progressBar", object52); + object52.setLayoutX(10.0); + object52.setLayoutY(20.0); + object52.setPrefWidth(200.0); + object52.setProgress(0.0); + javafx.scene.layout.GridPane.setRowIndex(object52, 9); + final var object53 = new javafx.scene.control.ProgressIndicator(); + injectField("progressIndicator", object53); + object53.setProgress(0.0); + object53.setRotate(2.0); + javafx.scene.layout.GridPane.setColumnIndex(object53, 1); + javafx.scene.layout.GridPane.setRowIndex(object53, 9); + final var object54 = new javafx.geometry.Point3D(4.0, 5.0, 6.0); + object53.setRotationAxis(object54); + final var object55 = new javafx.scene.control.RadioButton(); + injectField("radioButton", object55); + object55.setMnemonicParsing(false); + object55.setScaleX(7.0); + object55.setScaleY(2.0); + object55.setScaleZ(3.0); + object55.setText("RadioButton"); + object55.setTranslateX(4.0); + object55.setTranslateY(5.0); + object55.setTranslateZ(6.0); + javafx.scene.layout.GridPane.setRowIndex(object55, 10); + final var object56 = new javafx.scene.control.ScrollBar(); + injectField("scrollBarH", object56); + javafx.scene.layout.GridPane.setColumnIndex(object56, 1); + javafx.scene.layout.GridPane.setRowIndex(object56, 10); + final var object57 = new javafx.scene.control.ScrollBar(); + injectField("scrollBarV", object57); + object57.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object57, 11); + final var object58 = new javafx.scene.control.Separator(); + injectField("separatorH", object58); + object58.setOnDragDetected(controller::dragDetected); + object58.setOnDragDone(controller::dragDone); + object58.setOnDragDropped(controller::dragDropped); + object58.setOnDragEntered(controller::dragEntered); + object58.setOnDragExited(controller::dragExited); + object58.setOnDragOver(controller::dragOver); + object58.setOnMouseDragEntered(controller::mouseDragEntered); + object58.setOnMouseDragExited(controller::mouseDragExited); + object58.setOnMouseDragOver(controller::mouseDragOver); + object58.setOnMouseDragReleased(controller::mouseDragReleased); + object58.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object58, 1); + javafx.scene.layout.GridPane.setRowIndex(object58, 11); + final var object59 = new javafx.scene.control.Separator(); + injectField("separatorV", object59); + object59.setOrientation(javafx.geometry.Orientation.VERTICAL); + object59.setPrefHeight(200.0); + javafx.scene.layout.GridPane.setRowIndex(object59, 12); + final var object60 = new javafx.scene.control.Slider(); + injectField("sliderH", object60); + object60.setOnContextMenuRequested(controller::contextMenuRequested); + object60.setOnMouseClicked(e -> controller.mouseClicked()); + object60.setOnMouseDragged(controller::mouseDragged); + object60.setOnMouseEntered(controller::mouseEntered); + object60.setOnMouseExited(controller::mouseExited); + object60.setOnMouseMoved(controller::mouseMoved); + object60.setOnMousePressed(controller::mousePressed); + object60.setOnMouseReleased(controller::mouseReleased); + object60.setOnScroll(controller::onScroll); + object60.setOnScrollFinished(controller::onScrollFinished); + object60.setOnScrollStarted(controller::onScrollStarted); + javafx.scene.layout.GridPane.setColumnIndex(object60, 1); + javafx.scene.layout.GridPane.setRowIndex(object60, 12); + final var object61 = new javafx.scene.control.Slider(); + injectField("sliderV", object61); + object61.setOnZoom(controller::onZoom); + object61.setOnZoomFinished(controller::onZoomFinished); + object61.setOnZoomStarted(controller::onZoomStarted); + object61.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object61, 13); + final var object62 = new javafx.scene.control.Spinner(); + injectField("spinner", object62); + javafx.scene.layout.GridPane.setColumnIndex(object62, 1); + javafx.scene.layout.GridPane.setRowIndex(object62, 13); + final var object63 = new javafx.scene.control.SplitMenuButton(); + injectField("splitMenuButton", object63); + object63.setMnemonicParsing(false); + object63.setText("SplitMenuButton"); + javafx.scene.layout.GridPane.setRowIndex(object63, 14); + final var object64 = new javafx.scene.control.MenuItem(); + injectField("item1", object64); + object64.setMnemonicParsing(false); + object64.setText("Action 1"); + final var object65 = new javafx.scene.control.MenuItem(); + injectField("item2", object65); + object65.setMnemonicParsing(false); + object65.setText("Action 2"); + object63.getItems().addAll(object64, object65); + final var object66 = new javafx.scene.control.TableView(); + injectField("tableView", object66); + object66.setPrefHeight(200.0); + object66.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object66, 1); + javafx.scene.layout.GridPane.setRowIndex(object66, 14); + final var object67 = new javafx.scene.control.TableColumn(); + injectField("tableColumn1", object67); + object67.setPrefWidth(75.0); + object67.setText("C1"); + final var object68 = new javafx.scene.control.TableColumn(); + injectField("tableColumn2", object68); + object68.setPrefWidth(75.0); + object68.setText("C2"); + object66.getColumns().addAll(object67, object68); + final var object69 = new javafx.scene.control.TextArea(); + injectField("textArea", object69); + object69.setPrefHeight(200.0); + object69.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object69, 15); + final var object70 = new javafx.scene.control.TextField(); + injectField("textField", object70); + javafx.scene.layout.GridPane.setColumnIndex(object70, 1); + javafx.scene.layout.GridPane.setRowIndex(object70, 15); + final var object71 = new javafx.scene.control.ToggleButton(); + object71.setMnemonicParsing(false); + object71.setOnAction(controller::onAction); + object71.setOnRotate(controller::onRotate); + object71.setOnRotationFinished(controller::onRotationFinished); + object71.setOnRotationStarted(controller::onRotationStarted); + object71.setText("ToggleButton"); + javafx.scene.layout.GridPane.setRowIndex(object71, 16); + final var object72 = new javafx.scene.control.TreeTableView>(); + injectField("treeTableView", object72); + object72.setPrefHeight(200.0); + object72.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object72, 1); + javafx.scene.layout.GridPane.setRowIndex(object72, 16); + final var object73 = new javafx.scene.control.TreeTableColumn, String>(); + injectField("treeTableColumn1", object73); + object73.setOnEditCancel(controller::onEditCancel); + object73.setOnEditCommit(controller::onEditCommit); + object73.setOnEditStart(controller::onEditStart); + object73.setPrefWidth(75.0); + object73.setText("C1"); + final var object74 = new javafx.scene.control.TreeTableColumn, Integer>(); + injectField("treeTableColumn2", object74); + object74.setPrefWidth(75.0); + object74.setSortType(javafx.scene.control.TreeTableColumn.SortType.DESCENDING); + object74.setText("C2"); + object72.getColumns().addAll(object73, object74); + final var object75 = new javafx.scene.control.TreeView(); + injectField("treeView", object75); + object75.setOnSwipeDown(controller::onSwipeDown); + object75.setOnSwipeLeft(controller::onSwipeLeft); + object75.setOnSwipeRight(controller::onSwipeRight); + object75.setOnSwipeUp(controller::onSwipeUp); + object75.setPrefHeight(200.0); + object75.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object75, 17); + final var object76 = new javafx.scene.web.WebView(); + injectField("webView", object76); + object76.setOnTouchMoved(controller::onTouchMoved); + object76.setOnTouchPressed(controller::onTouchPressed); + object76.setOnTouchReleased(controller::onTouchReleased); + object76.setOnTouchStationary(controller::onTouchStationary); + object76.setPrefHeight(200.0); + object76.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object76, 1); + javafx.scene.layout.GridPane.setRowIndex(object76, 17); + object0.getChildren().addAll(object22, object23, object24, object25, object28, object31, object32, object33, object34, object35, object36, object37, object38, object45, object49, object51, object52, object53, object55, object56, object57, object58, object59, object60, object61, object62, object63, object66, object69, object70, object71, object72, object75, object76); + controller.initialize(); + loaded = true; + return object0; +} + + private void injectField(final String fieldName, final T object) { + try { + final var field = controller.getClass().getDeclaredField(fieldName); + field.setAccessible(true); + field.set(controller, object); + } catch (final NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection on " + fieldName, e); + } +} + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.ControlsController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-reflection-reflection-constructor.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-reflection-reflection-constructor.txt new file mode 100644 index 0000000..47994dc --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-reflection-reflection-constructor.txt @@ -0,0 +1,478 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import javafx.event.Event; +import java.lang.reflect.Method; + + +/** + * Generated code, not thread-safe + */ +public final class ControlsController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.ControlsController controller; + + /** + * Instantiates a new ControlsController with no nested controllers and no resource bundle + * @param controller The controller + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of()); + } + + /** + * Instantiates a new ControlsController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, resourceBundle)); + } + + /** + * Instantiates a new ControlsController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public ControlsController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = resourceBundlesMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + controller = (com.github.gtache.fxml.compiler.impl.ControlsController) controllersMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + final var object0 = new javafx.scene.layout.GridPane(); + injectField("gridPane", object0); + object0.setOnInputMethodTextChanged(e -> callMethod("inputMethodTextChanged", e)); + object0.setOnKeyPressed(e -> callMethod("keyPressed", e)); + object0.setOnKeyReleased(e -> callMethod("keyReleased", e)); + object0.setOnKeyTyped(e -> callMethod("keyTyped", e)); + final var object1 = new javafx.scene.layout.RowConstraints(); + final var object2 = new javafx.scene.layout.RowConstraints(); + final var object3 = new javafx.scene.layout.RowConstraints(); + final var object4 = new javafx.scene.layout.RowConstraints(); + final var object5 = new javafx.scene.layout.RowConstraints(); + final var object6 = new javafx.scene.layout.RowConstraints(); + final var object7 = new javafx.scene.layout.RowConstraints(); + final var object8 = new javafx.scene.layout.RowConstraints(); + final var object9 = new javafx.scene.layout.RowConstraints(); + final var object10 = new javafx.scene.layout.RowConstraints(); + final var object11 = new javafx.scene.layout.RowConstraints(); + final var object12 = new javafx.scene.layout.RowConstraints(); + final var object13 = new javafx.scene.layout.RowConstraints(); + final var object14 = new javafx.scene.layout.RowConstraints(); + final var object15 = new javafx.scene.layout.RowConstraints(); + final var object16 = new javafx.scene.layout.RowConstraints(); + final var object17 = new javafx.scene.layout.RowConstraints(); + final var object18 = new javafx.scene.layout.RowConstraints(); + object0.getRowConstraints().addAll(object1, object2, object3, object4, object5, object6, object7, object8, object9, object10, object11, object12, object13, object14, object15, object16, object17, object18); + final var object19 = new javafx.scene.layout.ColumnConstraints(); + final var object20 = new javafx.scene.layout.ColumnConstraints(); + final var object21 = new javafx.scene.layout.ColumnConstraints(); + object21.setMinWidth(10.0); + object21.setPrefWidth(100.0); + object0.getColumnConstraints().addAll(object19, object20, object21); + final var object22 = new javafx.scene.control.Button(); + injectField("button", object22); + object22.setMnemonicParsing(false); + object22.setText("Button"); + final var object23 = new javafx.scene.control.CheckBox(); + injectField("checkBox", object23); + object23.setIndeterminate(true); + object23.setMnemonicParsing(false); + object23.setText("CheckBox"); + javafx.scene.layout.GridPane.setColumnIndex(object23, 1); + final var object24 = new javafx.scene.control.ChoiceBox(); + injectField("choiceBox", object24); + object24.setCacheShape(false); + object24.setCenterShape(false); + object24.setDisable(true); + object24.setFocusTraversable(false); + object24.setPrefWidth(150.0); + object24.setScaleShape(false); + object24.setVisible(false); + javafx.scene.layout.GridPane.setRowIndex(object24, 1); + final var object25 = new javafx.scene.control.ColorPicker(); + injectField("colorPicker", object25); + object25.setNodeOrientation(javafx.geometry.NodeOrientation.LEFT_TO_RIGHT); + object25.setOpacity(0.5); + javafx.scene.layout.GridPane.setColumnIndex(object25, 1); + javafx.scene.layout.GridPane.setRowIndex(object25, 1); + final var object26 = new javafx.scene.paint.Color(0.7894737124443054, 0.08771929889917374, 0.08771929889917374, 1); + injectField("color", object26); + object25.setValue(object26); + final var object27 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object25.setOpaqueInsets(object27); + final var object28 = new javafx.scene.control.ComboBox(); + injectField("comboBox", object28); + object28.setEditable(true); + object28.setPrefWidth(150.0); + object28.setPromptText("Text"); + object28.setVisibleRowCount(5); + javafx.scene.layout.GridPane.setRowIndex(object28, 2); + final var object29 = javafx.scene.Cursor.CLOSED_HAND; + object28.setCursor(object29); + final var object30 = new javafx.scene.effect.Bloom(); + object28.setEffect(object30); + final var object31 = new javafx.scene.control.DatePicker(); + injectField("datePicker", object31); + object31.setShowWeekNumbers(true); + object31.setStyle("-fx-background-color: #ffffff;"); + javafx.scene.layout.GridPane.setColumnIndex(object31, 1); + javafx.scene.layout.GridPane.setRowIndex(object31, 2); + final var object32 = new javafx.scene.web.HTMLEditor(); + injectField("htmlEditor", object32); + object32.setHtmlText(""); + object32.setPrefHeight(200.0); + object32.setPrefWidth(506.0); + object32.getStyleClass().addAll("clazz"); + object32.getStylesheets().addAll("@style.css"); + javafx.scene.layout.GridPane.setRowIndex(object32, 3); + final var object33 = new javafx.scene.control.Hyperlink(); + injectField("hyperlink", object33); + object33.setText("Hyperlink"); + javafx.scene.layout.GridPane.setColumnIndex(object33, 1); + javafx.scene.layout.GridPane.setRowIndex(object33, 3); + final var object34 = new javafx.scene.image.ImageView(); + injectField("imageView", object34); + object34.setFitHeight(150.0); + object34.setFitWidth(200.0); + object34.setPickOnBounds(true); + object34.setPreserveRatio(true); + javafx.scene.layout.GridPane.setRowIndex(object34, 4); + final var object35 = new javafx.scene.control.Label(); + injectField("label", object35); + object35.setAccessibleHelp("TTTTT"); + object35.setAccessibleText("TTT"); + object35.setBlendMode(javafx.scene.effect.BlendMode.ADD); + object35.setCache(true); + object35.setCacheHint(javafx.scene.CacheHint.QUALITY); + object35.setDepthTest(javafx.scene.DepthTest.ENABLE); + object35.setMnemonicParsing(true); + object35.setMouseTransparent(true); + object35.setText(bundle.getString("include.label")); + javafx.scene.layout.GridPane.setColumnIndex(object35, 1); + javafx.scene.layout.GridPane.setRowIndex(object35, 4); + final var object36 = new javafx.scene.control.ListView(); + injectField("listView", object36); + object36.setFixedCellSize(20.0); + object36.setNodeOrientation(javafx.geometry.NodeOrientation.RIGHT_TO_LEFT); + object36.setOrientation(javafx.geometry.Orientation.HORIZONTAL); + object36.setPrefHeight(200.0); + object36.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object36, 5); + final var object37 = new javafx.scene.media.MediaView(); + injectField("mediaView", object37); + object37.setFitHeight(200.0); + object37.setFitWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object37, 1); + javafx.scene.layout.GridPane.setColumnSpan(object37, 2); + javafx.scene.layout.GridPane.setRowIndex(object37, 5); + javafx.scene.layout.GridPane.setRowSpan(object37, 2); + final var object38 = new javafx.scene.control.MenuBar(); + injectField("menuBar", object38); + javafx.scene.layout.GridPane.setHalignment(object38, javafx.geometry.HPos.RIGHT); + javafx.scene.layout.GridPane.setHgrow(object38, javafx.scene.layout.Priority.ALWAYS); + javafx.scene.layout.GridPane.setRowIndex(object38, 7); + javafx.scene.layout.GridPane.setValignment(object38, javafx.geometry.VPos.BASELINE); + javafx.scene.layout.GridPane.setVgrow(object38, javafx.scene.layout.Priority.SOMETIMES); + final var object39 = new javafx.scene.control.Menu(); + injectField("menu1", object39); + object39.setMnemonicParsing(false); + object39.setText("File"); + final var object40 = new javafx.scene.control.MenuItem(); + injectField("menuItem1", object40); + object40.setMnemonicParsing(false); + object40.setText("Close"); + object39.getItems().addAll(object40); + final var object41 = new javafx.scene.control.Menu(); + object41.setMnemonicParsing(false); + object41.setText("Edit"); + final var object42 = new javafx.scene.control.MenuItem(); + object42.setMnemonicParsing(false); + object42.setText("Delete"); + object41.getItems().addAll(object42); + final var object43 = new javafx.scene.control.Menu(); + object43.setMnemonicParsing(false); + object43.setText("Help"); + final var object44 = new javafx.scene.control.MenuItem(); + object44.setMnemonicParsing(false); + object44.setText("About"); + object43.getItems().addAll(object44); + object38.getMenus().addAll(object39, object41, object43); + final var object45 = new javafx.scene.control.MenuButton(); + injectField("menuButton", object45); + object45.setMnemonicParsing(false); + object45.setText("MenuButton"); + javafx.scene.layout.GridPane.setColumnIndex(object45, 1); + javafx.scene.layout.GridPane.setRowIndex(object45, 7); + final var object46 = new javafx.scene.control.MenuItem(); + object46.setMnemonicParsing(false); + object46.setText("Action 1"); + final var object47 = new javafx.scene.control.MenuItem(); + object47.setMnemonicParsing(false); + object47.setText("Action 2"); + object45.getItems().addAll(object46, object47); + final var object48 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + javafx.scene.layout.GridPane.setMargin(object45, object48); + final var object49 = new javafx.scene.control.Pagination(); + injectField("pagination", object49); + object49.setPrefHeight(200.0); + object49.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object49, 8); + final var object50 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object49.setPadding(object50); + final var object51 = new javafx.scene.control.PasswordField(); + injectField("passwordField", object51); + object51.setMaxHeight(6.0); + object51.setMaxWidth(5.0); + object51.setMinHeight(2.0); + object51.setMinWidth(1.0); + object51.setPrefColumnCount(7); + object51.setPrefHeight(4.0); + object51.setPrefWidth(3.0); + javafx.scene.layout.GridPane.setColumnIndex(object51, 1); + javafx.scene.layout.GridPane.setRowIndex(object51, 8); + final var object52 = new javafx.scene.control.ProgressBar(); + injectField("progressBar", object52); + object52.setLayoutX(10.0); + object52.setLayoutY(20.0); + object52.setPrefWidth(200.0); + object52.setProgress(0.0); + javafx.scene.layout.GridPane.setRowIndex(object52, 9); + final var object53 = new javafx.scene.control.ProgressIndicator(); + injectField("progressIndicator", object53); + object53.setProgress(0.0); + object53.setRotate(2.0); + javafx.scene.layout.GridPane.setColumnIndex(object53, 1); + javafx.scene.layout.GridPane.setRowIndex(object53, 9); + final var object54 = new javafx.geometry.Point3D(4.0, 5.0, 6.0); + object53.setRotationAxis(object54); + final var object55 = new javafx.scene.control.RadioButton(); + injectField("radioButton", object55); + object55.setMnemonicParsing(false); + object55.setScaleX(7.0); + object55.setScaleY(2.0); + object55.setScaleZ(3.0); + object55.setText("RadioButton"); + object55.setTranslateX(4.0); + object55.setTranslateY(5.0); + object55.setTranslateZ(6.0); + javafx.scene.layout.GridPane.setRowIndex(object55, 10); + final var object56 = new javafx.scene.control.ScrollBar(); + injectField("scrollBarH", object56); + javafx.scene.layout.GridPane.setColumnIndex(object56, 1); + javafx.scene.layout.GridPane.setRowIndex(object56, 10); + final var object57 = new javafx.scene.control.ScrollBar(); + injectField("scrollBarV", object57); + object57.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object57, 11); + final var object58 = new javafx.scene.control.Separator(); + injectField("separatorH", object58); + object58.setOnDragDetected(e -> callMethod("dragDetected", e)); + object58.setOnDragDone(e -> callMethod("dragDone", e)); + object58.setOnDragDropped(e -> callMethod("dragDropped", e)); + object58.setOnDragEntered(e -> callMethod("dragEntered", e)); + object58.setOnDragExited(e -> callMethod("dragExited", e)); + object58.setOnDragOver(e -> callMethod("dragOver", e)); + object58.setOnMouseDragEntered(e -> callMethod("mouseDragEntered", e)); + object58.setOnMouseDragExited(e -> callMethod("mouseDragExited", e)); + object58.setOnMouseDragOver(e -> callMethod("mouseDragOver", e)); + object58.setOnMouseDragReleased(e -> callMethod("mouseDragReleased", e)); + object58.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object58, 1); + javafx.scene.layout.GridPane.setRowIndex(object58, 11); + final var object59 = new javafx.scene.control.Separator(); + injectField("separatorV", object59); + object59.setOrientation(javafx.geometry.Orientation.VERTICAL); + object59.setPrefHeight(200.0); + javafx.scene.layout.GridPane.setRowIndex(object59, 12); + final var object60 = new javafx.scene.control.Slider(); + injectField("sliderH", object60); + object60.setOnContextMenuRequested(e -> callMethod("contextMenuRequested", e)); + object60.setOnMouseClicked(e -> callMethod("mouseClicked", e)); + object60.setOnMouseDragged(e -> callMethod("mouseDragged", e)); + object60.setOnMouseEntered(e -> callMethod("mouseEntered", e)); + object60.setOnMouseExited(e -> callMethod("mouseExited", e)); + object60.setOnMouseMoved(e -> callMethod("mouseMoved", e)); + object60.setOnMousePressed(e -> callMethod("mousePressed", e)); + object60.setOnMouseReleased(e -> callMethod("mouseReleased", e)); + object60.setOnScroll(e -> callMethod("onScroll", e)); + object60.setOnScrollFinished(e -> callMethod("onScrollFinished", e)); + object60.setOnScrollStarted(e -> callMethod("onScrollStarted", e)); + javafx.scene.layout.GridPane.setColumnIndex(object60, 1); + javafx.scene.layout.GridPane.setRowIndex(object60, 12); + final var object61 = new javafx.scene.control.Slider(); + injectField("sliderV", object61); + object61.setOnZoom(e -> callMethod("onZoom", e)); + object61.setOnZoomFinished(e -> callMethod("onZoomFinished", e)); + object61.setOnZoomStarted(e -> callMethod("onZoomStarted", e)); + object61.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object61, 13); + final var object62 = new javafx.scene.control.Spinner(); + injectField("spinner", object62); + javafx.scene.layout.GridPane.setColumnIndex(object62, 1); + javafx.scene.layout.GridPane.setRowIndex(object62, 13); + final var object63 = new javafx.scene.control.SplitMenuButton(); + injectField("splitMenuButton", object63); + object63.setMnemonicParsing(false); + object63.setText("SplitMenuButton"); + javafx.scene.layout.GridPane.setRowIndex(object63, 14); + final var object64 = new javafx.scene.control.MenuItem(); + injectField("item1", object64); + object64.setMnemonicParsing(false); + object64.setText("Action 1"); + final var object65 = new javafx.scene.control.MenuItem(); + injectField("item2", object65); + object65.setMnemonicParsing(false); + object65.setText("Action 2"); + object63.getItems().addAll(object64, object65); + final var object66 = new javafx.scene.control.TableView(); + injectField("tableView", object66); + object66.setPrefHeight(200.0); + object66.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object66, 1); + javafx.scene.layout.GridPane.setRowIndex(object66, 14); + final var object67 = new javafx.scene.control.TableColumn(); + injectField("tableColumn1", object67); + object67.setPrefWidth(75.0); + object67.setText("C1"); + final var object68 = new javafx.scene.control.TableColumn(); + injectField("tableColumn2", object68); + object68.setPrefWidth(75.0); + object68.setText("C2"); + object66.getColumns().addAll(object67, object68); + final var object69 = new javafx.scene.control.TextArea(); + injectField("textArea", object69); + object69.setPrefHeight(200.0); + object69.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object69, 15); + final var object70 = new javafx.scene.control.TextField(); + injectField("textField", object70); + javafx.scene.layout.GridPane.setColumnIndex(object70, 1); + javafx.scene.layout.GridPane.setRowIndex(object70, 15); + final var object71 = new javafx.scene.control.ToggleButton(); + object71.setMnemonicParsing(false); + object71.setOnAction(e -> callMethod("onAction", e)); + object71.setOnRotate(e -> callMethod("onRotate", e)); + object71.setOnRotationFinished(e -> callMethod("onRotationFinished", e)); + object71.setOnRotationStarted(e -> callMethod("onRotationStarted", e)); + object71.setText("ToggleButton"); + javafx.scene.layout.GridPane.setRowIndex(object71, 16); + final var object72 = new javafx.scene.control.TreeTableView>(); + injectField("treeTableView", object72); + object72.setPrefHeight(200.0); + object72.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object72, 1); + javafx.scene.layout.GridPane.setRowIndex(object72, 16); + final var object73 = new javafx.scene.control.TreeTableColumn, String>(); + injectField("treeTableColumn1", object73); + object73.setOnEditCancel(e -> callMethod("onEditCancel", e)); + object73.setOnEditCommit(e -> callMethod("onEditCommit", e)); + object73.setOnEditStart(e -> callMethod("onEditStart", e)); + object73.setPrefWidth(75.0); + object73.setText("C1"); + final var object74 = new javafx.scene.control.TreeTableColumn, Integer>(); + injectField("treeTableColumn2", object74); + object74.setPrefWidth(75.0); + object74.setSortType(javafx.scene.control.TreeTableColumn.SortType.DESCENDING); + object74.setText("C2"); + object72.getColumns().addAll(object73, object74); + final var object75 = new javafx.scene.control.TreeView(); + injectField("treeView", object75); + object75.setOnSwipeDown(e -> callMethod("onSwipeDown", e)); + object75.setOnSwipeLeft(e -> callMethod("onSwipeLeft", e)); + object75.setOnSwipeRight(e -> callMethod("onSwipeRight", e)); + object75.setOnSwipeUp(e -> callMethod("onSwipeUp", e)); + object75.setPrefHeight(200.0); + object75.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object75, 17); + final var object76 = new javafx.scene.web.WebView(); + injectField("webView", object76); + object76.setOnTouchMoved(e -> callMethod("onTouchMoved", e)); + object76.setOnTouchPressed(e -> callMethod("onTouchPressed", e)); + object76.setOnTouchReleased(e -> callMethod("onTouchReleased", e)); + object76.setOnTouchStationary(e -> callMethod("onTouchStationary", e)); + object76.setPrefHeight(200.0); + object76.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object76, 1); + javafx.scene.layout.GridPane.setRowIndex(object76, 17); + object0.getChildren().addAll(object22, object23, object24, object25, object28, object31, object32, object33, object34, object35, object36, object37, object38, object45, object49, object51, object52, object53, object55, object56, object57, object58, object59, object60, object61, object62, object63, object66, object69, object70, object71, object72, object75, object76); + try { + final var initialize = controller.getClass().getDeclaredMethod("initialize"); + initialize.setAccessible(true); + initialize.invoke(controller); + } catch (final InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection", e); + } catch (final NoSuchMethodException ignored) { + } + loaded = true; + return object0; +} + + private void callMethod(final String methodName, final T event) { + try { + final Method method; + final var methods = Arrays.stream(controller.getClass().getDeclaredMethods()) + .filter(m -> m.getName().equals(methodName)).toList(); + if (methods.size() > 1) { + final var eventMethods = methods.stream().filter(m -> + m.getParameterCount() == 1 && Event.class.isAssignableFrom(m.getParameterTypes()[0])).toList(); + if (eventMethods.size() == 1) { + method = eventMethods.getFirst(); + } else { + final var emptyMethods = methods.stream().filter(m -> m.getParameterCount() == 0).toList(); + if (emptyMethods.size() == 1) { + method = emptyMethods.getFirst(); + } else { + throw new IllegalArgumentException("Multiple matching methods for " + methodName); + } + } + } else if (methods.size() == 1) { + method = methods.getFirst(); + } else { + throw new IllegalArgumentException("No matching method for " + methodName); + } + method.setAccessible(true); + if (method.getParameterCount() == 0) { + method.invoke(controller); + } else { + method.invoke(controller, event); + } + } catch (final IllegalAccessException | InvocationTargetException ex) { + throw new RuntimeException("Error using reflection on " + methodName, ex); + } +} +private void injectField(final String fieldName, final T object) { + try { + final var field = controller.getClass().getDeclaredField(fieldName); + field.setAccessible(true); + field.set(controller, object); + } catch (final NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection on " + fieldName, e); + } +} + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.ControlsController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-reflection-reflection-getbundle.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-reflection-reflection-getbundle.txt new file mode 100644 index 0000000..85dd8c2 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-reflection-reflection-getbundle.txt @@ -0,0 +1,478 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import javafx.event.Event; +import java.lang.reflect.Method; + + +/** + * Generated code, not thread-safe + */ +public final class ControlsController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.ControlsController controller; + + /** + * Instantiates a new ControlsController with no nested controllers and no resource bundle + * @param controller The controller + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of()); + } + + /** + * Instantiates a new ControlsController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, resourceBundle)); + } + + /** + * Instantiates a new ControlsController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public ControlsController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + controller = (com.github.gtache.fxml.compiler.impl.ControlsController) controllersMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + final var object0 = new javafx.scene.layout.GridPane(); + injectField("gridPane", object0); + object0.setOnInputMethodTextChanged(e -> callMethod("inputMethodTextChanged", e)); + object0.setOnKeyPressed(e -> callMethod("keyPressed", e)); + object0.setOnKeyReleased(e -> callMethod("keyReleased", e)); + object0.setOnKeyTyped(e -> callMethod("keyTyped", e)); + final var object1 = new javafx.scene.layout.RowConstraints(); + final var object2 = new javafx.scene.layout.RowConstraints(); + final var object3 = new javafx.scene.layout.RowConstraints(); + final var object4 = new javafx.scene.layout.RowConstraints(); + final var object5 = new javafx.scene.layout.RowConstraints(); + final var object6 = new javafx.scene.layout.RowConstraints(); + final var object7 = new javafx.scene.layout.RowConstraints(); + final var object8 = new javafx.scene.layout.RowConstraints(); + final var object9 = new javafx.scene.layout.RowConstraints(); + final var object10 = new javafx.scene.layout.RowConstraints(); + final var object11 = new javafx.scene.layout.RowConstraints(); + final var object12 = new javafx.scene.layout.RowConstraints(); + final var object13 = new javafx.scene.layout.RowConstraints(); + final var object14 = new javafx.scene.layout.RowConstraints(); + final var object15 = new javafx.scene.layout.RowConstraints(); + final var object16 = new javafx.scene.layout.RowConstraints(); + final var object17 = new javafx.scene.layout.RowConstraints(); + final var object18 = new javafx.scene.layout.RowConstraints(); + object0.getRowConstraints().addAll(object1, object2, object3, object4, object5, object6, object7, object8, object9, object10, object11, object12, object13, object14, object15, object16, object17, object18); + final var object19 = new javafx.scene.layout.ColumnConstraints(); + final var object20 = new javafx.scene.layout.ColumnConstraints(); + final var object21 = new javafx.scene.layout.ColumnConstraints(); + object21.setMinWidth(10.0); + object21.setPrefWidth(100.0); + object0.getColumnConstraints().addAll(object19, object20, object21); + final var object22 = new javafx.scene.control.Button(); + injectField("button", object22); + object22.setMnemonicParsing(false); + object22.setText("Button"); + final var object23 = new javafx.scene.control.CheckBox(); + injectField("checkBox", object23); + object23.setIndeterminate(true); + object23.setMnemonicParsing(false); + object23.setText("CheckBox"); + javafx.scene.layout.GridPane.setColumnIndex(object23, 1); + final var object24 = new javafx.scene.control.ChoiceBox(); + injectField("choiceBox", object24); + object24.setCacheShape(false); + object24.setCenterShape(false); + object24.setDisable(true); + object24.setFocusTraversable(false); + object24.setPrefWidth(150.0); + object24.setScaleShape(false); + object24.setVisible(false); + javafx.scene.layout.GridPane.setRowIndex(object24, 1); + final var object25 = new javafx.scene.control.ColorPicker(); + injectField("colorPicker", object25); + object25.setNodeOrientation(javafx.geometry.NodeOrientation.LEFT_TO_RIGHT); + object25.setOpacity(0.5); + javafx.scene.layout.GridPane.setColumnIndex(object25, 1); + javafx.scene.layout.GridPane.setRowIndex(object25, 1); + final var object26 = new javafx.scene.paint.Color(0.7894737124443054, 0.08771929889917374, 0.08771929889917374, 1); + injectField("color", object26); + object25.setValue(object26); + final var object27 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object25.setOpaqueInsets(object27); + final var object28 = new javafx.scene.control.ComboBox(); + injectField("comboBox", object28); + object28.setEditable(true); + object28.setPrefWidth(150.0); + object28.setPromptText("Text"); + object28.setVisibleRowCount(5); + javafx.scene.layout.GridPane.setRowIndex(object28, 2); + final var object29 = javafx.scene.Cursor.CLOSED_HAND; + object28.setCursor(object29); + final var object30 = new javafx.scene.effect.Bloom(); + object28.setEffect(object30); + final var object31 = new javafx.scene.control.DatePicker(); + injectField("datePicker", object31); + object31.setShowWeekNumbers(true); + object31.setStyle("-fx-background-color: #ffffff;"); + javafx.scene.layout.GridPane.setColumnIndex(object31, 1); + javafx.scene.layout.GridPane.setRowIndex(object31, 2); + final var object32 = new javafx.scene.web.HTMLEditor(); + injectField("htmlEditor", object32); + object32.setHtmlText(""); + object32.setPrefHeight(200.0); + object32.setPrefWidth(506.0); + object32.getStyleClass().addAll("clazz"); + object32.getStylesheets().addAll("@style.css"); + javafx.scene.layout.GridPane.setRowIndex(object32, 3); + final var object33 = new javafx.scene.control.Hyperlink(); + injectField("hyperlink", object33); + object33.setText("Hyperlink"); + javafx.scene.layout.GridPane.setColumnIndex(object33, 1); + javafx.scene.layout.GridPane.setRowIndex(object33, 3); + final var object34 = new javafx.scene.image.ImageView(); + injectField("imageView", object34); + object34.setFitHeight(150.0); + object34.setFitWidth(200.0); + object34.setPickOnBounds(true); + object34.setPreserveRatio(true); + javafx.scene.layout.GridPane.setRowIndex(object34, 4); + final var object35 = new javafx.scene.control.Label(); + injectField("label", object35); + object35.setAccessibleHelp("TTTTT"); + object35.setAccessibleText("TTT"); + object35.setBlendMode(javafx.scene.effect.BlendMode.ADD); + object35.setCache(true); + object35.setCacheHint(javafx.scene.CacheHint.QUALITY); + object35.setDepthTest(javafx.scene.DepthTest.ENABLE); + object35.setMnemonicParsing(true); + object35.setMouseTransparent(true); + object35.setText(bundle.getString("include.label")); + javafx.scene.layout.GridPane.setColumnIndex(object35, 1); + javafx.scene.layout.GridPane.setRowIndex(object35, 4); + final var object36 = new javafx.scene.control.ListView(); + injectField("listView", object36); + object36.setFixedCellSize(20.0); + object36.setNodeOrientation(javafx.geometry.NodeOrientation.RIGHT_TO_LEFT); + object36.setOrientation(javafx.geometry.Orientation.HORIZONTAL); + object36.setPrefHeight(200.0); + object36.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object36, 5); + final var object37 = new javafx.scene.media.MediaView(); + injectField("mediaView", object37); + object37.setFitHeight(200.0); + object37.setFitWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object37, 1); + javafx.scene.layout.GridPane.setColumnSpan(object37, 2); + javafx.scene.layout.GridPane.setRowIndex(object37, 5); + javafx.scene.layout.GridPane.setRowSpan(object37, 2); + final var object38 = new javafx.scene.control.MenuBar(); + injectField("menuBar", object38); + javafx.scene.layout.GridPane.setHalignment(object38, javafx.geometry.HPos.RIGHT); + javafx.scene.layout.GridPane.setHgrow(object38, javafx.scene.layout.Priority.ALWAYS); + javafx.scene.layout.GridPane.setRowIndex(object38, 7); + javafx.scene.layout.GridPane.setValignment(object38, javafx.geometry.VPos.BASELINE); + javafx.scene.layout.GridPane.setVgrow(object38, javafx.scene.layout.Priority.SOMETIMES); + final var object39 = new javafx.scene.control.Menu(); + injectField("menu1", object39); + object39.setMnemonicParsing(false); + object39.setText("File"); + final var object40 = new javafx.scene.control.MenuItem(); + injectField("menuItem1", object40); + object40.setMnemonicParsing(false); + object40.setText("Close"); + object39.getItems().addAll(object40); + final var object41 = new javafx.scene.control.Menu(); + object41.setMnemonicParsing(false); + object41.setText("Edit"); + final var object42 = new javafx.scene.control.MenuItem(); + object42.setMnemonicParsing(false); + object42.setText("Delete"); + object41.getItems().addAll(object42); + final var object43 = new javafx.scene.control.Menu(); + object43.setMnemonicParsing(false); + object43.setText("Help"); + final var object44 = new javafx.scene.control.MenuItem(); + object44.setMnemonicParsing(false); + object44.setText("About"); + object43.getItems().addAll(object44); + object38.getMenus().addAll(object39, object41, object43); + final var object45 = new javafx.scene.control.MenuButton(); + injectField("menuButton", object45); + object45.setMnemonicParsing(false); + object45.setText("MenuButton"); + javafx.scene.layout.GridPane.setColumnIndex(object45, 1); + javafx.scene.layout.GridPane.setRowIndex(object45, 7); + final var object46 = new javafx.scene.control.MenuItem(); + object46.setMnemonicParsing(false); + object46.setText("Action 1"); + final var object47 = new javafx.scene.control.MenuItem(); + object47.setMnemonicParsing(false); + object47.setText("Action 2"); + object45.getItems().addAll(object46, object47); + final var object48 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + javafx.scene.layout.GridPane.setMargin(object45, object48); + final var object49 = new javafx.scene.control.Pagination(); + injectField("pagination", object49); + object49.setPrefHeight(200.0); + object49.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object49, 8); + final var object50 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object49.setPadding(object50); + final var object51 = new javafx.scene.control.PasswordField(); + injectField("passwordField", object51); + object51.setMaxHeight(6.0); + object51.setMaxWidth(5.0); + object51.setMinHeight(2.0); + object51.setMinWidth(1.0); + object51.setPrefColumnCount(7); + object51.setPrefHeight(4.0); + object51.setPrefWidth(3.0); + javafx.scene.layout.GridPane.setColumnIndex(object51, 1); + javafx.scene.layout.GridPane.setRowIndex(object51, 8); + final var object52 = new javafx.scene.control.ProgressBar(); + injectField("progressBar", object52); + object52.setLayoutX(10.0); + object52.setLayoutY(20.0); + object52.setPrefWidth(200.0); + object52.setProgress(0.0); + javafx.scene.layout.GridPane.setRowIndex(object52, 9); + final var object53 = new javafx.scene.control.ProgressIndicator(); + injectField("progressIndicator", object53); + object53.setProgress(0.0); + object53.setRotate(2.0); + javafx.scene.layout.GridPane.setColumnIndex(object53, 1); + javafx.scene.layout.GridPane.setRowIndex(object53, 9); + final var object54 = new javafx.geometry.Point3D(4.0, 5.0, 6.0); + object53.setRotationAxis(object54); + final var object55 = new javafx.scene.control.RadioButton(); + injectField("radioButton", object55); + object55.setMnemonicParsing(false); + object55.setScaleX(7.0); + object55.setScaleY(2.0); + object55.setScaleZ(3.0); + object55.setText("RadioButton"); + object55.setTranslateX(4.0); + object55.setTranslateY(5.0); + object55.setTranslateZ(6.0); + javafx.scene.layout.GridPane.setRowIndex(object55, 10); + final var object56 = new javafx.scene.control.ScrollBar(); + injectField("scrollBarH", object56); + javafx.scene.layout.GridPane.setColumnIndex(object56, 1); + javafx.scene.layout.GridPane.setRowIndex(object56, 10); + final var object57 = new javafx.scene.control.ScrollBar(); + injectField("scrollBarV", object57); + object57.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object57, 11); + final var object58 = new javafx.scene.control.Separator(); + injectField("separatorH", object58); + object58.setOnDragDetected(e -> callMethod("dragDetected", e)); + object58.setOnDragDone(e -> callMethod("dragDone", e)); + object58.setOnDragDropped(e -> callMethod("dragDropped", e)); + object58.setOnDragEntered(e -> callMethod("dragEntered", e)); + object58.setOnDragExited(e -> callMethod("dragExited", e)); + object58.setOnDragOver(e -> callMethod("dragOver", e)); + object58.setOnMouseDragEntered(e -> callMethod("mouseDragEntered", e)); + object58.setOnMouseDragExited(e -> callMethod("mouseDragExited", e)); + object58.setOnMouseDragOver(e -> callMethod("mouseDragOver", e)); + object58.setOnMouseDragReleased(e -> callMethod("mouseDragReleased", e)); + object58.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object58, 1); + javafx.scene.layout.GridPane.setRowIndex(object58, 11); + final var object59 = new javafx.scene.control.Separator(); + injectField("separatorV", object59); + object59.setOrientation(javafx.geometry.Orientation.VERTICAL); + object59.setPrefHeight(200.0); + javafx.scene.layout.GridPane.setRowIndex(object59, 12); + final var object60 = new javafx.scene.control.Slider(); + injectField("sliderH", object60); + object60.setOnContextMenuRequested(e -> callMethod("contextMenuRequested", e)); + object60.setOnMouseClicked(e -> callMethod("mouseClicked", e)); + object60.setOnMouseDragged(e -> callMethod("mouseDragged", e)); + object60.setOnMouseEntered(e -> callMethod("mouseEntered", e)); + object60.setOnMouseExited(e -> callMethod("mouseExited", e)); + object60.setOnMouseMoved(e -> callMethod("mouseMoved", e)); + object60.setOnMousePressed(e -> callMethod("mousePressed", e)); + object60.setOnMouseReleased(e -> callMethod("mouseReleased", e)); + object60.setOnScroll(e -> callMethod("onScroll", e)); + object60.setOnScrollFinished(e -> callMethod("onScrollFinished", e)); + object60.setOnScrollStarted(e -> callMethod("onScrollStarted", e)); + javafx.scene.layout.GridPane.setColumnIndex(object60, 1); + javafx.scene.layout.GridPane.setRowIndex(object60, 12); + final var object61 = new javafx.scene.control.Slider(); + injectField("sliderV", object61); + object61.setOnZoom(e -> callMethod("onZoom", e)); + object61.setOnZoomFinished(e -> callMethod("onZoomFinished", e)); + object61.setOnZoomStarted(e -> callMethod("onZoomStarted", e)); + object61.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object61, 13); + final var object62 = new javafx.scene.control.Spinner(); + injectField("spinner", object62); + javafx.scene.layout.GridPane.setColumnIndex(object62, 1); + javafx.scene.layout.GridPane.setRowIndex(object62, 13); + final var object63 = new javafx.scene.control.SplitMenuButton(); + injectField("splitMenuButton", object63); + object63.setMnemonicParsing(false); + object63.setText("SplitMenuButton"); + javafx.scene.layout.GridPane.setRowIndex(object63, 14); + final var object64 = new javafx.scene.control.MenuItem(); + injectField("item1", object64); + object64.setMnemonicParsing(false); + object64.setText("Action 1"); + final var object65 = new javafx.scene.control.MenuItem(); + injectField("item2", object65); + object65.setMnemonicParsing(false); + object65.setText("Action 2"); + object63.getItems().addAll(object64, object65); + final var object66 = new javafx.scene.control.TableView(); + injectField("tableView", object66); + object66.setPrefHeight(200.0); + object66.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object66, 1); + javafx.scene.layout.GridPane.setRowIndex(object66, 14); + final var object67 = new javafx.scene.control.TableColumn(); + injectField("tableColumn1", object67); + object67.setPrefWidth(75.0); + object67.setText("C1"); + final var object68 = new javafx.scene.control.TableColumn(); + injectField("tableColumn2", object68); + object68.setPrefWidth(75.0); + object68.setText("C2"); + object66.getColumns().addAll(object67, object68); + final var object69 = new javafx.scene.control.TextArea(); + injectField("textArea", object69); + object69.setPrefHeight(200.0); + object69.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object69, 15); + final var object70 = new javafx.scene.control.TextField(); + injectField("textField", object70); + javafx.scene.layout.GridPane.setColumnIndex(object70, 1); + javafx.scene.layout.GridPane.setRowIndex(object70, 15); + final var object71 = new javafx.scene.control.ToggleButton(); + object71.setMnemonicParsing(false); + object71.setOnAction(e -> callMethod("onAction", e)); + object71.setOnRotate(e -> callMethod("onRotate", e)); + object71.setOnRotationFinished(e -> callMethod("onRotationFinished", e)); + object71.setOnRotationStarted(e -> callMethod("onRotationStarted", e)); + object71.setText("ToggleButton"); + javafx.scene.layout.GridPane.setRowIndex(object71, 16); + final var object72 = new javafx.scene.control.TreeTableView>(); + injectField("treeTableView", object72); + object72.setPrefHeight(200.0); + object72.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object72, 1); + javafx.scene.layout.GridPane.setRowIndex(object72, 16); + final var object73 = new javafx.scene.control.TreeTableColumn, String>(); + injectField("treeTableColumn1", object73); + object73.setOnEditCancel(e -> callMethod("onEditCancel", e)); + object73.setOnEditCommit(e -> callMethod("onEditCommit", e)); + object73.setOnEditStart(e -> callMethod("onEditStart", e)); + object73.setPrefWidth(75.0); + object73.setText("C1"); + final var object74 = new javafx.scene.control.TreeTableColumn, Integer>(); + injectField("treeTableColumn2", object74); + object74.setPrefWidth(75.0); + object74.setSortType(javafx.scene.control.TreeTableColumn.SortType.DESCENDING); + object74.setText("C2"); + object72.getColumns().addAll(object73, object74); + final var object75 = new javafx.scene.control.TreeView(); + injectField("treeView", object75); + object75.setOnSwipeDown(e -> callMethod("onSwipeDown", e)); + object75.setOnSwipeLeft(e -> callMethod("onSwipeLeft", e)); + object75.setOnSwipeRight(e -> callMethod("onSwipeRight", e)); + object75.setOnSwipeUp(e -> callMethod("onSwipeUp", e)); + object75.setPrefHeight(200.0); + object75.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object75, 17); + final var object76 = new javafx.scene.web.WebView(); + injectField("webView", object76); + object76.setOnTouchMoved(e -> callMethod("onTouchMoved", e)); + object76.setOnTouchPressed(e -> callMethod("onTouchPressed", e)); + object76.setOnTouchReleased(e -> callMethod("onTouchReleased", e)); + object76.setOnTouchStationary(e -> callMethod("onTouchStationary", e)); + object76.setPrefHeight(200.0); + object76.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object76, 1); + javafx.scene.layout.GridPane.setRowIndex(object76, 17); + object0.getChildren().addAll(object22, object23, object24, object25, object28, object31, object32, object33, object34, object35, object36, object37, object38, object45, object49, object51, object52, object53, object55, object56, object57, object58, object59, object60, object61, object62, object63, object66, object69, object70, object71, object72, object75, object76); + try { + final var initialize = controller.getClass().getDeclaredMethod("initialize"); + initialize.setAccessible(true); + initialize.invoke(controller); + } catch (final InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection", e); + } catch (final NoSuchMethodException ignored) { + } + loaded = true; + return object0; +} + + private void callMethod(final String methodName, final T event) { + try { + final Method method; + final var methods = Arrays.stream(controller.getClass().getDeclaredMethods()) + .filter(m -> m.getName().equals(methodName)).toList(); + if (methods.size() > 1) { + final var eventMethods = methods.stream().filter(m -> + m.getParameterCount() == 1 && Event.class.isAssignableFrom(m.getParameterTypes()[0])).toList(); + if (eventMethods.size() == 1) { + method = eventMethods.getFirst(); + } else { + final var emptyMethods = methods.stream().filter(m -> m.getParameterCount() == 0).toList(); + if (emptyMethods.size() == 1) { + method = emptyMethods.getFirst(); + } else { + throw new IllegalArgumentException("Multiple matching methods for " + methodName); + } + } + } else if (methods.size() == 1) { + method = methods.getFirst(); + } else { + throw new IllegalArgumentException("No matching method for " + methodName); + } + method.setAccessible(true); + if (method.getParameterCount() == 0) { + method.invoke(controller); + } else { + method.invoke(controller, event); + } + } catch (final IllegalAccessException | InvocationTargetException ex) { + throw new RuntimeException("Error using reflection on " + methodName, ex); + } +} +private void injectField(final String fieldName, final T object) { + try { + final var field = controller.getClass().getDeclaredField(fieldName); + field.setAccessible(true); + field.set(controller, object); + } catch (final NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection on " + fieldName, e); + } +} + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.ControlsController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-reflection-reflection-getter.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-reflection-reflection-getter.txt new file mode 100644 index 0000000..b7748d1 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-reflection-reflection-getter.txt @@ -0,0 +1,477 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import javafx.event.Event; +import java.lang.reflect.Method; + + +/** + * Generated code, not thread-safe + */ +public final class ControlsController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.ControlsController controller; + + /** + * Instantiates a new ControlsController with no nested controllers and no resource bundle + * @param controller The controller + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of()); + } + + /** + * Instantiates a new ControlsController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, resourceBundle)); + } + + /** + * Instantiates a new ControlsController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public ControlsController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + controller = (com.github.gtache.fxml.compiler.impl.ControlsController) controllersMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + final var object0 = new javafx.scene.layout.GridPane(); + injectField("gridPane", object0); + object0.setOnInputMethodTextChanged(e -> callMethod("inputMethodTextChanged", e)); + object0.setOnKeyPressed(e -> callMethod("keyPressed", e)); + object0.setOnKeyReleased(e -> callMethod("keyReleased", e)); + object0.setOnKeyTyped(e -> callMethod("keyTyped", e)); + final var object1 = new javafx.scene.layout.RowConstraints(); + final var object2 = new javafx.scene.layout.RowConstraints(); + final var object3 = new javafx.scene.layout.RowConstraints(); + final var object4 = new javafx.scene.layout.RowConstraints(); + final var object5 = new javafx.scene.layout.RowConstraints(); + final var object6 = new javafx.scene.layout.RowConstraints(); + final var object7 = new javafx.scene.layout.RowConstraints(); + final var object8 = new javafx.scene.layout.RowConstraints(); + final var object9 = new javafx.scene.layout.RowConstraints(); + final var object10 = new javafx.scene.layout.RowConstraints(); + final var object11 = new javafx.scene.layout.RowConstraints(); + final var object12 = new javafx.scene.layout.RowConstraints(); + final var object13 = new javafx.scene.layout.RowConstraints(); + final var object14 = new javafx.scene.layout.RowConstraints(); + final var object15 = new javafx.scene.layout.RowConstraints(); + final var object16 = new javafx.scene.layout.RowConstraints(); + final var object17 = new javafx.scene.layout.RowConstraints(); + final var object18 = new javafx.scene.layout.RowConstraints(); + object0.getRowConstraints().addAll(object1, object2, object3, object4, object5, object6, object7, object8, object9, object10, object11, object12, object13, object14, object15, object16, object17, object18); + final var object19 = new javafx.scene.layout.ColumnConstraints(); + final var object20 = new javafx.scene.layout.ColumnConstraints(); + final var object21 = new javafx.scene.layout.ColumnConstraints(); + object21.setMinWidth(10.0); + object21.setPrefWidth(100.0); + object0.getColumnConstraints().addAll(object19, object20, object21); + final var object22 = new javafx.scene.control.Button(); + injectField("button", object22); + object22.setMnemonicParsing(false); + object22.setText("Button"); + final var object23 = new javafx.scene.control.CheckBox(); + injectField("checkBox", object23); + object23.setIndeterminate(true); + object23.setMnemonicParsing(false); + object23.setText("CheckBox"); + javafx.scene.layout.GridPane.setColumnIndex(object23, 1); + final var object24 = new javafx.scene.control.ChoiceBox(); + injectField("choiceBox", object24); + object24.setCacheShape(false); + object24.setCenterShape(false); + object24.setDisable(true); + object24.setFocusTraversable(false); + object24.setPrefWidth(150.0); + object24.setScaleShape(false); + object24.setVisible(false); + javafx.scene.layout.GridPane.setRowIndex(object24, 1); + final var object25 = new javafx.scene.control.ColorPicker(); + injectField("colorPicker", object25); + object25.setNodeOrientation(javafx.geometry.NodeOrientation.LEFT_TO_RIGHT); + object25.setOpacity(0.5); + javafx.scene.layout.GridPane.setColumnIndex(object25, 1); + javafx.scene.layout.GridPane.setRowIndex(object25, 1); + final var object26 = new javafx.scene.paint.Color(0.7894737124443054, 0.08771929889917374, 0.08771929889917374, 1); + injectField("color", object26); + object25.setValue(object26); + final var object27 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object25.setOpaqueInsets(object27); + final var object28 = new javafx.scene.control.ComboBox(); + injectField("comboBox", object28); + object28.setEditable(true); + object28.setPrefWidth(150.0); + object28.setPromptText("Text"); + object28.setVisibleRowCount(5); + javafx.scene.layout.GridPane.setRowIndex(object28, 2); + final var object29 = javafx.scene.Cursor.CLOSED_HAND; + object28.setCursor(object29); + final var object30 = new javafx.scene.effect.Bloom(); + object28.setEffect(object30); + final var object31 = new javafx.scene.control.DatePicker(); + injectField("datePicker", object31); + object31.setShowWeekNumbers(true); + object31.setStyle("-fx-background-color: #ffffff;"); + javafx.scene.layout.GridPane.setColumnIndex(object31, 1); + javafx.scene.layout.GridPane.setRowIndex(object31, 2); + final var object32 = new javafx.scene.web.HTMLEditor(); + injectField("htmlEditor", object32); + object32.setHtmlText(""); + object32.setPrefHeight(200.0); + object32.setPrefWidth(506.0); + object32.getStyleClass().addAll("clazz"); + object32.getStylesheets().addAll("@style.css"); + javafx.scene.layout.GridPane.setRowIndex(object32, 3); + final var object33 = new javafx.scene.control.Hyperlink(); + injectField("hyperlink", object33); + object33.setText("Hyperlink"); + javafx.scene.layout.GridPane.setColumnIndex(object33, 1); + javafx.scene.layout.GridPane.setRowIndex(object33, 3); + final var object34 = new javafx.scene.image.ImageView(); + injectField("imageView", object34); + object34.setFitHeight(150.0); + object34.setFitWidth(200.0); + object34.setPickOnBounds(true); + object34.setPreserveRatio(true); + javafx.scene.layout.GridPane.setRowIndex(object34, 4); + final var object35 = new javafx.scene.control.Label(); + injectField("label", object35); + object35.setAccessibleHelp("TTTTT"); + object35.setAccessibleText("TTT"); + object35.setBlendMode(javafx.scene.effect.BlendMode.ADD); + object35.setCache(true); + object35.setCacheHint(javafx.scene.CacheHint.QUALITY); + object35.setDepthTest(javafx.scene.DepthTest.ENABLE); + object35.setMnemonicParsing(true); + object35.setMouseTransparent(true); + object35.setText(controller.resources().getString("include.label")); + javafx.scene.layout.GridPane.setColumnIndex(object35, 1); + javafx.scene.layout.GridPane.setRowIndex(object35, 4); + final var object36 = new javafx.scene.control.ListView(); + injectField("listView", object36); + object36.setFixedCellSize(20.0); + object36.setNodeOrientation(javafx.geometry.NodeOrientation.RIGHT_TO_LEFT); + object36.setOrientation(javafx.geometry.Orientation.HORIZONTAL); + object36.setPrefHeight(200.0); + object36.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object36, 5); + final var object37 = new javafx.scene.media.MediaView(); + injectField("mediaView", object37); + object37.setFitHeight(200.0); + object37.setFitWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object37, 1); + javafx.scene.layout.GridPane.setColumnSpan(object37, 2); + javafx.scene.layout.GridPane.setRowIndex(object37, 5); + javafx.scene.layout.GridPane.setRowSpan(object37, 2); + final var object38 = new javafx.scene.control.MenuBar(); + injectField("menuBar", object38); + javafx.scene.layout.GridPane.setHalignment(object38, javafx.geometry.HPos.RIGHT); + javafx.scene.layout.GridPane.setHgrow(object38, javafx.scene.layout.Priority.ALWAYS); + javafx.scene.layout.GridPane.setRowIndex(object38, 7); + javafx.scene.layout.GridPane.setValignment(object38, javafx.geometry.VPos.BASELINE); + javafx.scene.layout.GridPane.setVgrow(object38, javafx.scene.layout.Priority.SOMETIMES); + final var object39 = new javafx.scene.control.Menu(); + injectField("menu1", object39); + object39.setMnemonicParsing(false); + object39.setText("File"); + final var object40 = new javafx.scene.control.MenuItem(); + injectField("menuItem1", object40); + object40.setMnemonicParsing(false); + object40.setText("Close"); + object39.getItems().addAll(object40); + final var object41 = new javafx.scene.control.Menu(); + object41.setMnemonicParsing(false); + object41.setText("Edit"); + final var object42 = new javafx.scene.control.MenuItem(); + object42.setMnemonicParsing(false); + object42.setText("Delete"); + object41.getItems().addAll(object42); + final var object43 = new javafx.scene.control.Menu(); + object43.setMnemonicParsing(false); + object43.setText("Help"); + final var object44 = new javafx.scene.control.MenuItem(); + object44.setMnemonicParsing(false); + object44.setText("About"); + object43.getItems().addAll(object44); + object38.getMenus().addAll(object39, object41, object43); + final var object45 = new javafx.scene.control.MenuButton(); + injectField("menuButton", object45); + object45.setMnemonicParsing(false); + object45.setText("MenuButton"); + javafx.scene.layout.GridPane.setColumnIndex(object45, 1); + javafx.scene.layout.GridPane.setRowIndex(object45, 7); + final var object46 = new javafx.scene.control.MenuItem(); + object46.setMnemonicParsing(false); + object46.setText("Action 1"); + final var object47 = new javafx.scene.control.MenuItem(); + object47.setMnemonicParsing(false); + object47.setText("Action 2"); + object45.getItems().addAll(object46, object47); + final var object48 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + javafx.scene.layout.GridPane.setMargin(object45, object48); + final var object49 = new javafx.scene.control.Pagination(); + injectField("pagination", object49); + object49.setPrefHeight(200.0); + object49.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object49, 8); + final var object50 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object49.setPadding(object50); + final var object51 = new javafx.scene.control.PasswordField(); + injectField("passwordField", object51); + object51.setMaxHeight(6.0); + object51.setMaxWidth(5.0); + object51.setMinHeight(2.0); + object51.setMinWidth(1.0); + object51.setPrefColumnCount(7); + object51.setPrefHeight(4.0); + object51.setPrefWidth(3.0); + javafx.scene.layout.GridPane.setColumnIndex(object51, 1); + javafx.scene.layout.GridPane.setRowIndex(object51, 8); + final var object52 = new javafx.scene.control.ProgressBar(); + injectField("progressBar", object52); + object52.setLayoutX(10.0); + object52.setLayoutY(20.0); + object52.setPrefWidth(200.0); + object52.setProgress(0.0); + javafx.scene.layout.GridPane.setRowIndex(object52, 9); + final var object53 = new javafx.scene.control.ProgressIndicator(); + injectField("progressIndicator", object53); + object53.setProgress(0.0); + object53.setRotate(2.0); + javafx.scene.layout.GridPane.setColumnIndex(object53, 1); + javafx.scene.layout.GridPane.setRowIndex(object53, 9); + final var object54 = new javafx.geometry.Point3D(4.0, 5.0, 6.0); + object53.setRotationAxis(object54); + final var object55 = new javafx.scene.control.RadioButton(); + injectField("radioButton", object55); + object55.setMnemonicParsing(false); + object55.setScaleX(7.0); + object55.setScaleY(2.0); + object55.setScaleZ(3.0); + object55.setText("RadioButton"); + object55.setTranslateX(4.0); + object55.setTranslateY(5.0); + object55.setTranslateZ(6.0); + javafx.scene.layout.GridPane.setRowIndex(object55, 10); + final var object56 = new javafx.scene.control.ScrollBar(); + injectField("scrollBarH", object56); + javafx.scene.layout.GridPane.setColumnIndex(object56, 1); + javafx.scene.layout.GridPane.setRowIndex(object56, 10); + final var object57 = new javafx.scene.control.ScrollBar(); + injectField("scrollBarV", object57); + object57.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object57, 11); + final var object58 = new javafx.scene.control.Separator(); + injectField("separatorH", object58); + object58.setOnDragDetected(e -> callMethod("dragDetected", e)); + object58.setOnDragDone(e -> callMethod("dragDone", e)); + object58.setOnDragDropped(e -> callMethod("dragDropped", e)); + object58.setOnDragEntered(e -> callMethod("dragEntered", e)); + object58.setOnDragExited(e -> callMethod("dragExited", e)); + object58.setOnDragOver(e -> callMethod("dragOver", e)); + object58.setOnMouseDragEntered(e -> callMethod("mouseDragEntered", e)); + object58.setOnMouseDragExited(e -> callMethod("mouseDragExited", e)); + object58.setOnMouseDragOver(e -> callMethod("mouseDragOver", e)); + object58.setOnMouseDragReleased(e -> callMethod("mouseDragReleased", e)); + object58.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object58, 1); + javafx.scene.layout.GridPane.setRowIndex(object58, 11); + final var object59 = new javafx.scene.control.Separator(); + injectField("separatorV", object59); + object59.setOrientation(javafx.geometry.Orientation.VERTICAL); + object59.setPrefHeight(200.0); + javafx.scene.layout.GridPane.setRowIndex(object59, 12); + final var object60 = new javafx.scene.control.Slider(); + injectField("sliderH", object60); + object60.setOnContextMenuRequested(e -> callMethod("contextMenuRequested", e)); + object60.setOnMouseClicked(e -> callMethod("mouseClicked", e)); + object60.setOnMouseDragged(e -> callMethod("mouseDragged", e)); + object60.setOnMouseEntered(e -> callMethod("mouseEntered", e)); + object60.setOnMouseExited(e -> callMethod("mouseExited", e)); + object60.setOnMouseMoved(e -> callMethod("mouseMoved", e)); + object60.setOnMousePressed(e -> callMethod("mousePressed", e)); + object60.setOnMouseReleased(e -> callMethod("mouseReleased", e)); + object60.setOnScroll(e -> callMethod("onScroll", e)); + object60.setOnScrollFinished(e -> callMethod("onScrollFinished", e)); + object60.setOnScrollStarted(e -> callMethod("onScrollStarted", e)); + javafx.scene.layout.GridPane.setColumnIndex(object60, 1); + javafx.scene.layout.GridPane.setRowIndex(object60, 12); + final var object61 = new javafx.scene.control.Slider(); + injectField("sliderV", object61); + object61.setOnZoom(e -> callMethod("onZoom", e)); + object61.setOnZoomFinished(e -> callMethod("onZoomFinished", e)); + object61.setOnZoomStarted(e -> callMethod("onZoomStarted", e)); + object61.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object61, 13); + final var object62 = new javafx.scene.control.Spinner(); + injectField("spinner", object62); + javafx.scene.layout.GridPane.setColumnIndex(object62, 1); + javafx.scene.layout.GridPane.setRowIndex(object62, 13); + final var object63 = new javafx.scene.control.SplitMenuButton(); + injectField("splitMenuButton", object63); + object63.setMnemonicParsing(false); + object63.setText("SplitMenuButton"); + javafx.scene.layout.GridPane.setRowIndex(object63, 14); + final var object64 = new javafx.scene.control.MenuItem(); + injectField("item1", object64); + object64.setMnemonicParsing(false); + object64.setText("Action 1"); + final var object65 = new javafx.scene.control.MenuItem(); + injectField("item2", object65); + object65.setMnemonicParsing(false); + object65.setText("Action 2"); + object63.getItems().addAll(object64, object65); + final var object66 = new javafx.scene.control.TableView(); + injectField("tableView", object66); + object66.setPrefHeight(200.0); + object66.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object66, 1); + javafx.scene.layout.GridPane.setRowIndex(object66, 14); + final var object67 = new javafx.scene.control.TableColumn(); + injectField("tableColumn1", object67); + object67.setPrefWidth(75.0); + object67.setText("C1"); + final var object68 = new javafx.scene.control.TableColumn(); + injectField("tableColumn2", object68); + object68.setPrefWidth(75.0); + object68.setText("C2"); + object66.getColumns().addAll(object67, object68); + final var object69 = new javafx.scene.control.TextArea(); + injectField("textArea", object69); + object69.setPrefHeight(200.0); + object69.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object69, 15); + final var object70 = new javafx.scene.control.TextField(); + injectField("textField", object70); + javafx.scene.layout.GridPane.setColumnIndex(object70, 1); + javafx.scene.layout.GridPane.setRowIndex(object70, 15); + final var object71 = new javafx.scene.control.ToggleButton(); + object71.setMnemonicParsing(false); + object71.setOnAction(e -> callMethod("onAction", e)); + object71.setOnRotate(e -> callMethod("onRotate", e)); + object71.setOnRotationFinished(e -> callMethod("onRotationFinished", e)); + object71.setOnRotationStarted(e -> callMethod("onRotationStarted", e)); + object71.setText("ToggleButton"); + javafx.scene.layout.GridPane.setRowIndex(object71, 16); + final var object72 = new javafx.scene.control.TreeTableView>(); + injectField("treeTableView", object72); + object72.setPrefHeight(200.0); + object72.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object72, 1); + javafx.scene.layout.GridPane.setRowIndex(object72, 16); + final var object73 = new javafx.scene.control.TreeTableColumn, String>(); + injectField("treeTableColumn1", object73); + object73.setOnEditCancel(e -> callMethod("onEditCancel", e)); + object73.setOnEditCommit(e -> callMethod("onEditCommit", e)); + object73.setOnEditStart(e -> callMethod("onEditStart", e)); + object73.setPrefWidth(75.0); + object73.setText("C1"); + final var object74 = new javafx.scene.control.TreeTableColumn, Integer>(); + injectField("treeTableColumn2", object74); + object74.setPrefWidth(75.0); + object74.setSortType(javafx.scene.control.TreeTableColumn.SortType.DESCENDING); + object74.setText("C2"); + object72.getColumns().addAll(object73, object74); + final var object75 = new javafx.scene.control.TreeView(); + injectField("treeView", object75); + object75.setOnSwipeDown(e -> callMethod("onSwipeDown", e)); + object75.setOnSwipeLeft(e -> callMethod("onSwipeLeft", e)); + object75.setOnSwipeRight(e -> callMethod("onSwipeRight", e)); + object75.setOnSwipeUp(e -> callMethod("onSwipeUp", e)); + object75.setPrefHeight(200.0); + object75.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object75, 17); + final var object76 = new javafx.scene.web.WebView(); + injectField("webView", object76); + object76.setOnTouchMoved(e -> callMethod("onTouchMoved", e)); + object76.setOnTouchPressed(e -> callMethod("onTouchPressed", e)); + object76.setOnTouchReleased(e -> callMethod("onTouchReleased", e)); + object76.setOnTouchStationary(e -> callMethod("onTouchStationary", e)); + object76.setPrefHeight(200.0); + object76.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object76, 1); + javafx.scene.layout.GridPane.setRowIndex(object76, 17); + object0.getChildren().addAll(object22, object23, object24, object25, object28, object31, object32, object33, object34, object35, object36, object37, object38, object45, object49, object51, object52, object53, object55, object56, object57, object58, object59, object60, object61, object62, object63, object66, object69, object70, object71, object72, object75, object76); + try { + final var initialize = controller.getClass().getDeclaredMethod("initialize"); + initialize.setAccessible(true); + initialize.invoke(controller); + } catch (final InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection", e); + } catch (final NoSuchMethodException ignored) { + } + loaded = true; + return object0; +} + + private void callMethod(final String methodName, final T event) { + try { + final Method method; + final var methods = Arrays.stream(controller.getClass().getDeclaredMethods()) + .filter(m -> m.getName().equals(methodName)).toList(); + if (methods.size() > 1) { + final var eventMethods = methods.stream().filter(m -> + m.getParameterCount() == 1 && Event.class.isAssignableFrom(m.getParameterTypes()[0])).toList(); + if (eventMethods.size() == 1) { + method = eventMethods.getFirst(); + } else { + final var emptyMethods = methods.stream().filter(m -> m.getParameterCount() == 0).toList(); + if (emptyMethods.size() == 1) { + method = emptyMethods.getFirst(); + } else { + throw new IllegalArgumentException("Multiple matching methods for " + methodName); + } + } + } else if (methods.size() == 1) { + method = methods.getFirst(); + } else { + throw new IllegalArgumentException("No matching method for " + methodName); + } + method.setAccessible(true); + if (method.getParameterCount() == 0) { + method.invoke(controller); + } else { + method.invoke(controller, event); + } + } catch (final IllegalAccessException | InvocationTargetException ex) { + throw new RuntimeException("Error using reflection on " + methodName, ex); + } +} +private void injectField(final String fieldName, final T object) { + try { + final var field = controller.getClass().getDeclaredField(fieldName); + field.setAccessible(true); + field.set(controller, object); + } catch (final NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection on " + fieldName, e); + } +} + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.ControlsController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-setters-reference-constructor.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-setters-reference-constructor.txt new file mode 100644 index 0000000..d16ef5b --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-setters-reference-constructor.txt @@ -0,0 +1,425 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; + + +/** + * Generated code, not thread-safe + */ +public final class ControlsController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.ControlsController controller; + + /** + * Instantiates a new ControlsController with no nested controllers and no resource bundle + * @param controller The controller + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of()); + } + + /** + * Instantiates a new ControlsController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, resourceBundle)); + } + + /** + * Instantiates a new ControlsController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public ControlsController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = resourceBundlesMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + controller = (com.github.gtache.fxml.compiler.impl.ControlsController) controllersMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + final var object0 = new javafx.scene.layout.GridPane(); + controller.setGridPane(object0); + object0.setOnInputMethodTextChanged(controller::inputMethodTextChanged); + object0.setOnKeyPressed(e -> controller.keyPressed()); + object0.setOnKeyReleased(controller::keyReleased); + object0.setOnKeyTyped(controller::keyTyped); + final var object1 = new javafx.scene.layout.RowConstraints(); + final var object2 = new javafx.scene.layout.RowConstraints(); + final var object3 = new javafx.scene.layout.RowConstraints(); + final var object4 = new javafx.scene.layout.RowConstraints(); + final var object5 = new javafx.scene.layout.RowConstraints(); + final var object6 = new javafx.scene.layout.RowConstraints(); + final var object7 = new javafx.scene.layout.RowConstraints(); + final var object8 = new javafx.scene.layout.RowConstraints(); + final var object9 = new javafx.scene.layout.RowConstraints(); + final var object10 = new javafx.scene.layout.RowConstraints(); + final var object11 = new javafx.scene.layout.RowConstraints(); + final var object12 = new javafx.scene.layout.RowConstraints(); + final var object13 = new javafx.scene.layout.RowConstraints(); + final var object14 = new javafx.scene.layout.RowConstraints(); + final var object15 = new javafx.scene.layout.RowConstraints(); + final var object16 = new javafx.scene.layout.RowConstraints(); + final var object17 = new javafx.scene.layout.RowConstraints(); + final var object18 = new javafx.scene.layout.RowConstraints(); + object0.getRowConstraints().addAll(object1, object2, object3, object4, object5, object6, object7, object8, object9, object10, object11, object12, object13, object14, object15, object16, object17, object18); + final var object19 = new javafx.scene.layout.ColumnConstraints(); + final var object20 = new javafx.scene.layout.ColumnConstraints(); + final var object21 = new javafx.scene.layout.ColumnConstraints(); + object21.setMinWidth(10.0); + object21.setPrefWidth(100.0); + object0.getColumnConstraints().addAll(object19, object20, object21); + final var object22 = new javafx.scene.control.Button(); + controller.setButton(object22); + object22.setMnemonicParsing(false); + object22.setText("Button"); + final var object23 = new javafx.scene.control.CheckBox(); + controller.setCheckBox(object23); + object23.setIndeterminate(true); + object23.setMnemonicParsing(false); + object23.setText("CheckBox"); + javafx.scene.layout.GridPane.setColumnIndex(object23, 1); + final var object24 = new javafx.scene.control.ChoiceBox(); + controller.setChoiceBox(object24); + object24.setCacheShape(false); + object24.setCenterShape(false); + object24.setDisable(true); + object24.setFocusTraversable(false); + object24.setPrefWidth(150.0); + object24.setScaleShape(false); + object24.setVisible(false); + javafx.scene.layout.GridPane.setRowIndex(object24, 1); + final var object25 = new javafx.scene.control.ColorPicker(); + controller.setColorPicker(object25); + object25.setNodeOrientation(javafx.geometry.NodeOrientation.LEFT_TO_RIGHT); + object25.setOpacity(0.5); + javafx.scene.layout.GridPane.setColumnIndex(object25, 1); + javafx.scene.layout.GridPane.setRowIndex(object25, 1); + final var object26 = new javafx.scene.paint.Color(0.7894737124443054, 0.08771929889917374, 0.08771929889917374, 1); + controller.setColor(object26); + object25.setValue(object26); + final var object27 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object25.setOpaqueInsets(object27); + final var object28 = new javafx.scene.control.ComboBox(); + controller.setComboBox(object28); + object28.setEditable(true); + object28.setPrefWidth(150.0); + object28.setPromptText("Text"); + object28.setVisibleRowCount(5); + javafx.scene.layout.GridPane.setRowIndex(object28, 2); + final var object29 = javafx.scene.Cursor.CLOSED_HAND; + object28.setCursor(object29); + final var object30 = new javafx.scene.effect.Bloom(); + object28.setEffect(object30); + final var object31 = new javafx.scene.control.DatePicker(); + controller.setDatePicker(object31); + object31.setShowWeekNumbers(true); + object31.setStyle("-fx-background-color: #ffffff;"); + javafx.scene.layout.GridPane.setColumnIndex(object31, 1); + javafx.scene.layout.GridPane.setRowIndex(object31, 2); + final var object32 = new javafx.scene.web.HTMLEditor(); + controller.setHtmlEditor(object32); + object32.setHtmlText(""); + object32.setPrefHeight(200.0); + object32.setPrefWidth(506.0); + object32.getStyleClass().addAll("clazz"); + object32.getStylesheets().addAll("@style.css"); + javafx.scene.layout.GridPane.setRowIndex(object32, 3); + final var object33 = new javafx.scene.control.Hyperlink(); + controller.setHyperlink(object33); + object33.setText("Hyperlink"); + javafx.scene.layout.GridPane.setColumnIndex(object33, 1); + javafx.scene.layout.GridPane.setRowIndex(object33, 3); + final var object34 = new javafx.scene.image.ImageView(); + controller.setImageView(object34); + object34.setFitHeight(150.0); + object34.setFitWidth(200.0); + object34.setPickOnBounds(true); + object34.setPreserveRatio(true); + javafx.scene.layout.GridPane.setRowIndex(object34, 4); + final var object35 = new javafx.scene.control.Label(); + controller.setLabel(object35); + object35.setAccessibleHelp("TTTTT"); + object35.setAccessibleText("TTT"); + object35.setBlendMode(javafx.scene.effect.BlendMode.ADD); + object35.setCache(true); + object35.setCacheHint(javafx.scene.CacheHint.QUALITY); + object35.setDepthTest(javafx.scene.DepthTest.ENABLE); + object35.setMnemonicParsing(true); + object35.setMouseTransparent(true); + object35.setText(bundle.getString("include.label")); + javafx.scene.layout.GridPane.setColumnIndex(object35, 1); + javafx.scene.layout.GridPane.setRowIndex(object35, 4); + final var object36 = new javafx.scene.control.ListView(); + controller.setListView(object36); + object36.setFixedCellSize(20.0); + object36.setNodeOrientation(javafx.geometry.NodeOrientation.RIGHT_TO_LEFT); + object36.setOrientation(javafx.geometry.Orientation.HORIZONTAL); + object36.setPrefHeight(200.0); + object36.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object36, 5); + final var object37 = new javafx.scene.media.MediaView(); + controller.setMediaView(object37); + object37.setFitHeight(200.0); + object37.setFitWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object37, 1); + javafx.scene.layout.GridPane.setColumnSpan(object37, 2); + javafx.scene.layout.GridPane.setRowIndex(object37, 5); + javafx.scene.layout.GridPane.setRowSpan(object37, 2); + final var object38 = new javafx.scene.control.MenuBar(); + controller.setMenuBar(object38); + javafx.scene.layout.GridPane.setHalignment(object38, javafx.geometry.HPos.RIGHT); + javafx.scene.layout.GridPane.setHgrow(object38, javafx.scene.layout.Priority.ALWAYS); + javafx.scene.layout.GridPane.setRowIndex(object38, 7); + javafx.scene.layout.GridPane.setValignment(object38, javafx.geometry.VPos.BASELINE); + javafx.scene.layout.GridPane.setVgrow(object38, javafx.scene.layout.Priority.SOMETIMES); + final var object39 = new javafx.scene.control.Menu(); + controller.setMenu1(object39); + object39.setMnemonicParsing(false); + object39.setText("File"); + final var object40 = new javafx.scene.control.MenuItem(); + controller.setMenuItem1(object40); + object40.setMnemonicParsing(false); + object40.setText("Close"); + object39.getItems().addAll(object40); + final var object41 = new javafx.scene.control.Menu(); + object41.setMnemonicParsing(false); + object41.setText("Edit"); + final var object42 = new javafx.scene.control.MenuItem(); + object42.setMnemonicParsing(false); + object42.setText("Delete"); + object41.getItems().addAll(object42); + final var object43 = new javafx.scene.control.Menu(); + object43.setMnemonicParsing(false); + object43.setText("Help"); + final var object44 = new javafx.scene.control.MenuItem(); + object44.setMnemonicParsing(false); + object44.setText("About"); + object43.getItems().addAll(object44); + object38.getMenus().addAll(object39, object41, object43); + final var object45 = new javafx.scene.control.MenuButton(); + controller.setMenuButton(object45); + object45.setMnemonicParsing(false); + object45.setText("MenuButton"); + javafx.scene.layout.GridPane.setColumnIndex(object45, 1); + javafx.scene.layout.GridPane.setRowIndex(object45, 7); + final var object46 = new javafx.scene.control.MenuItem(); + object46.setMnemonicParsing(false); + object46.setText("Action 1"); + final var object47 = new javafx.scene.control.MenuItem(); + object47.setMnemonicParsing(false); + object47.setText("Action 2"); + object45.getItems().addAll(object46, object47); + final var object48 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + javafx.scene.layout.GridPane.setMargin(object45, object48); + final var object49 = new javafx.scene.control.Pagination(); + controller.setPagination(object49); + object49.setPrefHeight(200.0); + object49.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object49, 8); + final var object50 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object49.setPadding(object50); + final var object51 = new javafx.scene.control.PasswordField(); + controller.setPasswordField(object51); + object51.setMaxHeight(6.0); + object51.setMaxWidth(5.0); + object51.setMinHeight(2.0); + object51.setMinWidth(1.0); + object51.setPrefColumnCount(7); + object51.setPrefHeight(4.0); + object51.setPrefWidth(3.0); + javafx.scene.layout.GridPane.setColumnIndex(object51, 1); + javafx.scene.layout.GridPane.setRowIndex(object51, 8); + final var object52 = new javafx.scene.control.ProgressBar(); + controller.setProgressBar(object52); + object52.setLayoutX(10.0); + object52.setLayoutY(20.0); + object52.setPrefWidth(200.0); + object52.setProgress(0.0); + javafx.scene.layout.GridPane.setRowIndex(object52, 9); + final var object53 = new javafx.scene.control.ProgressIndicator(); + controller.setProgressIndicator(object53); + object53.setProgress(0.0); + object53.setRotate(2.0); + javafx.scene.layout.GridPane.setColumnIndex(object53, 1); + javafx.scene.layout.GridPane.setRowIndex(object53, 9); + final var object54 = new javafx.geometry.Point3D(4.0, 5.0, 6.0); + object53.setRotationAxis(object54); + final var object55 = new javafx.scene.control.RadioButton(); + controller.setRadioButton(object55); + object55.setMnemonicParsing(false); + object55.setScaleX(7.0); + object55.setScaleY(2.0); + object55.setScaleZ(3.0); + object55.setText("RadioButton"); + object55.setTranslateX(4.0); + object55.setTranslateY(5.0); + object55.setTranslateZ(6.0); + javafx.scene.layout.GridPane.setRowIndex(object55, 10); + final var object56 = new javafx.scene.control.ScrollBar(); + controller.setScrollBarH(object56); + javafx.scene.layout.GridPane.setColumnIndex(object56, 1); + javafx.scene.layout.GridPane.setRowIndex(object56, 10); + final var object57 = new javafx.scene.control.ScrollBar(); + controller.setScrollBarV(object57); + object57.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object57, 11); + final var object58 = new javafx.scene.control.Separator(); + controller.setSeparatorH(object58); + object58.setOnDragDetected(controller::dragDetected); + object58.setOnDragDone(controller::dragDone); + object58.setOnDragDropped(controller::dragDropped); + object58.setOnDragEntered(controller::dragEntered); + object58.setOnDragExited(controller::dragExited); + object58.setOnDragOver(controller::dragOver); + object58.setOnMouseDragEntered(controller::mouseDragEntered); + object58.setOnMouseDragExited(controller::mouseDragExited); + object58.setOnMouseDragOver(controller::mouseDragOver); + object58.setOnMouseDragReleased(controller::mouseDragReleased); + object58.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object58, 1); + javafx.scene.layout.GridPane.setRowIndex(object58, 11); + final var object59 = new javafx.scene.control.Separator(); + controller.setSeparatorV(object59); + object59.setOrientation(javafx.geometry.Orientation.VERTICAL); + object59.setPrefHeight(200.0); + javafx.scene.layout.GridPane.setRowIndex(object59, 12); + final var object60 = new javafx.scene.control.Slider(); + controller.setSliderH(object60); + object60.setOnContextMenuRequested(controller::contextMenuRequested); + object60.setOnMouseClicked(e -> controller.mouseClicked()); + object60.setOnMouseDragged(controller::mouseDragged); + object60.setOnMouseEntered(controller::mouseEntered); + object60.setOnMouseExited(controller::mouseExited); + object60.setOnMouseMoved(controller::mouseMoved); + object60.setOnMousePressed(controller::mousePressed); + object60.setOnMouseReleased(controller::mouseReleased); + object60.setOnScroll(controller::onScroll); + object60.setOnScrollFinished(controller::onScrollFinished); + object60.setOnScrollStarted(controller::onScrollStarted); + javafx.scene.layout.GridPane.setColumnIndex(object60, 1); + javafx.scene.layout.GridPane.setRowIndex(object60, 12); + final var object61 = new javafx.scene.control.Slider(); + controller.setSliderV(object61); + object61.setOnZoom(controller::onZoom); + object61.setOnZoomFinished(controller::onZoomFinished); + object61.setOnZoomStarted(controller::onZoomStarted); + object61.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object61, 13); + final var object62 = new javafx.scene.control.Spinner(); + controller.setSpinner(object62); + javafx.scene.layout.GridPane.setColumnIndex(object62, 1); + javafx.scene.layout.GridPane.setRowIndex(object62, 13); + final var object63 = new javafx.scene.control.SplitMenuButton(); + controller.setSplitMenuButton(object63); + object63.setMnemonicParsing(false); + object63.setText("SplitMenuButton"); + javafx.scene.layout.GridPane.setRowIndex(object63, 14); + final var object64 = new javafx.scene.control.MenuItem(); + controller.setItem1(object64); + object64.setMnemonicParsing(false); + object64.setText("Action 1"); + final var object65 = new javafx.scene.control.MenuItem(); + controller.setItem2(object65); + object65.setMnemonicParsing(false); + object65.setText("Action 2"); + object63.getItems().addAll(object64, object65); + final var object66 = new javafx.scene.control.TableView(); + controller.setTableView(object66); + object66.setPrefHeight(200.0); + object66.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object66, 1); + javafx.scene.layout.GridPane.setRowIndex(object66, 14); + final var object67 = new javafx.scene.control.TableColumn(); + controller.setTableColumn1(object67); + object67.setPrefWidth(75.0); + object67.setText("C1"); + final var object68 = new javafx.scene.control.TableColumn(); + controller.setTableColumn2(object68); + object68.setPrefWidth(75.0); + object68.setText("C2"); + object66.getColumns().addAll(object67, object68); + final var object69 = new javafx.scene.control.TextArea(); + controller.setTextArea(object69); + object69.setPrefHeight(200.0); + object69.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object69, 15); + final var object70 = new javafx.scene.control.TextField(); + controller.setTextField(object70); + javafx.scene.layout.GridPane.setColumnIndex(object70, 1); + javafx.scene.layout.GridPane.setRowIndex(object70, 15); + final var object71 = new javafx.scene.control.ToggleButton(); + object71.setMnemonicParsing(false); + object71.setOnAction(controller::onAction); + object71.setOnRotate(controller::onRotate); + object71.setOnRotationFinished(controller::onRotationFinished); + object71.setOnRotationStarted(controller::onRotationStarted); + object71.setText("ToggleButton"); + javafx.scene.layout.GridPane.setRowIndex(object71, 16); + final var object72 = new javafx.scene.control.TreeTableView>(); + controller.setTreeTableView(object72); + object72.setPrefHeight(200.0); + object72.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object72, 1); + javafx.scene.layout.GridPane.setRowIndex(object72, 16); + final var object73 = new javafx.scene.control.TreeTableColumn, String>(); + controller.setTreeTableColumn1(object73); + object73.setOnEditCancel(controller::onEditCancel); + object73.setOnEditCommit(controller::onEditCommit); + object73.setOnEditStart(controller::onEditStart); + object73.setPrefWidth(75.0); + object73.setText("C1"); + final var object74 = new javafx.scene.control.TreeTableColumn, Integer>(); + controller.setTreeTableColumn2(object74); + object74.setPrefWidth(75.0); + object74.setSortType(javafx.scene.control.TreeTableColumn.SortType.DESCENDING); + object74.setText("C2"); + object72.getColumns().addAll(object73, object74); + final var object75 = new javafx.scene.control.TreeView(); + controller.setTreeView(object75); + object75.setOnSwipeDown(controller::onSwipeDown); + object75.setOnSwipeLeft(controller::onSwipeLeft); + object75.setOnSwipeRight(controller::onSwipeRight); + object75.setOnSwipeUp(controller::onSwipeUp); + object75.setPrefHeight(200.0); + object75.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object75, 17); + final var object76 = new javafx.scene.web.WebView(); + controller.setWebView(object76); + object76.setOnTouchMoved(controller::onTouchMoved); + object76.setOnTouchPressed(controller::onTouchPressed); + object76.setOnTouchReleased(controller::onTouchReleased); + object76.setOnTouchStationary(controller::onTouchStationary); + object76.setPrefHeight(200.0); + object76.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object76, 1); + javafx.scene.layout.GridPane.setRowIndex(object76, 17); + object0.getChildren().addAll(object22, object23, object24, object25, object28, object31, object32, object33, object34, object35, object36, object37, object38, object45, object49, object51, object52, object53, object55, object56, object57, object58, object59, object60, object61, object62, object63, object66, object69, object70, object71, object72, object75, object76); + controller.initialize(); + loaded = true; + return object0; +} + + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.ControlsController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-setters-reference-getbundle.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-setters-reference-getbundle.txt new file mode 100644 index 0000000..d1f85ce --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-setters-reference-getbundle.txt @@ -0,0 +1,425 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; + + +/** + * Generated code, not thread-safe + */ +public final class ControlsController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.ControlsController controller; + + /** + * Instantiates a new ControlsController with no nested controllers and no resource bundle + * @param controller The controller + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of()); + } + + /** + * Instantiates a new ControlsController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, resourceBundle)); + } + + /** + * Instantiates a new ControlsController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public ControlsController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + controller = (com.github.gtache.fxml.compiler.impl.ControlsController) controllersMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + final var object0 = new javafx.scene.layout.GridPane(); + controller.setGridPane(object0); + object0.setOnInputMethodTextChanged(controller::inputMethodTextChanged); + object0.setOnKeyPressed(e -> controller.keyPressed()); + object0.setOnKeyReleased(controller::keyReleased); + object0.setOnKeyTyped(controller::keyTyped); + final var object1 = new javafx.scene.layout.RowConstraints(); + final var object2 = new javafx.scene.layout.RowConstraints(); + final var object3 = new javafx.scene.layout.RowConstraints(); + final var object4 = new javafx.scene.layout.RowConstraints(); + final var object5 = new javafx.scene.layout.RowConstraints(); + final var object6 = new javafx.scene.layout.RowConstraints(); + final var object7 = new javafx.scene.layout.RowConstraints(); + final var object8 = new javafx.scene.layout.RowConstraints(); + final var object9 = new javafx.scene.layout.RowConstraints(); + final var object10 = new javafx.scene.layout.RowConstraints(); + final var object11 = new javafx.scene.layout.RowConstraints(); + final var object12 = new javafx.scene.layout.RowConstraints(); + final var object13 = new javafx.scene.layout.RowConstraints(); + final var object14 = new javafx.scene.layout.RowConstraints(); + final var object15 = new javafx.scene.layout.RowConstraints(); + final var object16 = new javafx.scene.layout.RowConstraints(); + final var object17 = new javafx.scene.layout.RowConstraints(); + final var object18 = new javafx.scene.layout.RowConstraints(); + object0.getRowConstraints().addAll(object1, object2, object3, object4, object5, object6, object7, object8, object9, object10, object11, object12, object13, object14, object15, object16, object17, object18); + final var object19 = new javafx.scene.layout.ColumnConstraints(); + final var object20 = new javafx.scene.layout.ColumnConstraints(); + final var object21 = new javafx.scene.layout.ColumnConstraints(); + object21.setMinWidth(10.0); + object21.setPrefWidth(100.0); + object0.getColumnConstraints().addAll(object19, object20, object21); + final var object22 = new javafx.scene.control.Button(); + controller.setButton(object22); + object22.setMnemonicParsing(false); + object22.setText("Button"); + final var object23 = new javafx.scene.control.CheckBox(); + controller.setCheckBox(object23); + object23.setIndeterminate(true); + object23.setMnemonicParsing(false); + object23.setText("CheckBox"); + javafx.scene.layout.GridPane.setColumnIndex(object23, 1); + final var object24 = new javafx.scene.control.ChoiceBox(); + controller.setChoiceBox(object24); + object24.setCacheShape(false); + object24.setCenterShape(false); + object24.setDisable(true); + object24.setFocusTraversable(false); + object24.setPrefWidth(150.0); + object24.setScaleShape(false); + object24.setVisible(false); + javafx.scene.layout.GridPane.setRowIndex(object24, 1); + final var object25 = new javafx.scene.control.ColorPicker(); + controller.setColorPicker(object25); + object25.setNodeOrientation(javafx.geometry.NodeOrientation.LEFT_TO_RIGHT); + object25.setOpacity(0.5); + javafx.scene.layout.GridPane.setColumnIndex(object25, 1); + javafx.scene.layout.GridPane.setRowIndex(object25, 1); + final var object26 = new javafx.scene.paint.Color(0.7894737124443054, 0.08771929889917374, 0.08771929889917374, 1); + controller.setColor(object26); + object25.setValue(object26); + final var object27 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object25.setOpaqueInsets(object27); + final var object28 = new javafx.scene.control.ComboBox(); + controller.setComboBox(object28); + object28.setEditable(true); + object28.setPrefWidth(150.0); + object28.setPromptText("Text"); + object28.setVisibleRowCount(5); + javafx.scene.layout.GridPane.setRowIndex(object28, 2); + final var object29 = javafx.scene.Cursor.CLOSED_HAND; + object28.setCursor(object29); + final var object30 = new javafx.scene.effect.Bloom(); + object28.setEffect(object30); + final var object31 = new javafx.scene.control.DatePicker(); + controller.setDatePicker(object31); + object31.setShowWeekNumbers(true); + object31.setStyle("-fx-background-color: #ffffff;"); + javafx.scene.layout.GridPane.setColumnIndex(object31, 1); + javafx.scene.layout.GridPane.setRowIndex(object31, 2); + final var object32 = new javafx.scene.web.HTMLEditor(); + controller.setHtmlEditor(object32); + object32.setHtmlText(""); + object32.setPrefHeight(200.0); + object32.setPrefWidth(506.0); + object32.getStyleClass().addAll("clazz"); + object32.getStylesheets().addAll("@style.css"); + javafx.scene.layout.GridPane.setRowIndex(object32, 3); + final var object33 = new javafx.scene.control.Hyperlink(); + controller.setHyperlink(object33); + object33.setText("Hyperlink"); + javafx.scene.layout.GridPane.setColumnIndex(object33, 1); + javafx.scene.layout.GridPane.setRowIndex(object33, 3); + final var object34 = new javafx.scene.image.ImageView(); + controller.setImageView(object34); + object34.setFitHeight(150.0); + object34.setFitWidth(200.0); + object34.setPickOnBounds(true); + object34.setPreserveRatio(true); + javafx.scene.layout.GridPane.setRowIndex(object34, 4); + final var object35 = new javafx.scene.control.Label(); + controller.setLabel(object35); + object35.setAccessibleHelp("TTTTT"); + object35.setAccessibleText("TTT"); + object35.setBlendMode(javafx.scene.effect.BlendMode.ADD); + object35.setCache(true); + object35.setCacheHint(javafx.scene.CacheHint.QUALITY); + object35.setDepthTest(javafx.scene.DepthTest.ENABLE); + object35.setMnemonicParsing(true); + object35.setMouseTransparent(true); + object35.setText(bundle.getString("include.label")); + javafx.scene.layout.GridPane.setColumnIndex(object35, 1); + javafx.scene.layout.GridPane.setRowIndex(object35, 4); + final var object36 = new javafx.scene.control.ListView(); + controller.setListView(object36); + object36.setFixedCellSize(20.0); + object36.setNodeOrientation(javafx.geometry.NodeOrientation.RIGHT_TO_LEFT); + object36.setOrientation(javafx.geometry.Orientation.HORIZONTAL); + object36.setPrefHeight(200.0); + object36.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object36, 5); + final var object37 = new javafx.scene.media.MediaView(); + controller.setMediaView(object37); + object37.setFitHeight(200.0); + object37.setFitWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object37, 1); + javafx.scene.layout.GridPane.setColumnSpan(object37, 2); + javafx.scene.layout.GridPane.setRowIndex(object37, 5); + javafx.scene.layout.GridPane.setRowSpan(object37, 2); + final var object38 = new javafx.scene.control.MenuBar(); + controller.setMenuBar(object38); + javafx.scene.layout.GridPane.setHalignment(object38, javafx.geometry.HPos.RIGHT); + javafx.scene.layout.GridPane.setHgrow(object38, javafx.scene.layout.Priority.ALWAYS); + javafx.scene.layout.GridPane.setRowIndex(object38, 7); + javafx.scene.layout.GridPane.setValignment(object38, javafx.geometry.VPos.BASELINE); + javafx.scene.layout.GridPane.setVgrow(object38, javafx.scene.layout.Priority.SOMETIMES); + final var object39 = new javafx.scene.control.Menu(); + controller.setMenu1(object39); + object39.setMnemonicParsing(false); + object39.setText("File"); + final var object40 = new javafx.scene.control.MenuItem(); + controller.setMenuItem1(object40); + object40.setMnemonicParsing(false); + object40.setText("Close"); + object39.getItems().addAll(object40); + final var object41 = new javafx.scene.control.Menu(); + object41.setMnemonicParsing(false); + object41.setText("Edit"); + final var object42 = new javafx.scene.control.MenuItem(); + object42.setMnemonicParsing(false); + object42.setText("Delete"); + object41.getItems().addAll(object42); + final var object43 = new javafx.scene.control.Menu(); + object43.setMnemonicParsing(false); + object43.setText("Help"); + final var object44 = new javafx.scene.control.MenuItem(); + object44.setMnemonicParsing(false); + object44.setText("About"); + object43.getItems().addAll(object44); + object38.getMenus().addAll(object39, object41, object43); + final var object45 = new javafx.scene.control.MenuButton(); + controller.setMenuButton(object45); + object45.setMnemonicParsing(false); + object45.setText("MenuButton"); + javafx.scene.layout.GridPane.setColumnIndex(object45, 1); + javafx.scene.layout.GridPane.setRowIndex(object45, 7); + final var object46 = new javafx.scene.control.MenuItem(); + object46.setMnemonicParsing(false); + object46.setText("Action 1"); + final var object47 = new javafx.scene.control.MenuItem(); + object47.setMnemonicParsing(false); + object47.setText("Action 2"); + object45.getItems().addAll(object46, object47); + final var object48 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + javafx.scene.layout.GridPane.setMargin(object45, object48); + final var object49 = new javafx.scene.control.Pagination(); + controller.setPagination(object49); + object49.setPrefHeight(200.0); + object49.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object49, 8); + final var object50 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object49.setPadding(object50); + final var object51 = new javafx.scene.control.PasswordField(); + controller.setPasswordField(object51); + object51.setMaxHeight(6.0); + object51.setMaxWidth(5.0); + object51.setMinHeight(2.0); + object51.setMinWidth(1.0); + object51.setPrefColumnCount(7); + object51.setPrefHeight(4.0); + object51.setPrefWidth(3.0); + javafx.scene.layout.GridPane.setColumnIndex(object51, 1); + javafx.scene.layout.GridPane.setRowIndex(object51, 8); + final var object52 = new javafx.scene.control.ProgressBar(); + controller.setProgressBar(object52); + object52.setLayoutX(10.0); + object52.setLayoutY(20.0); + object52.setPrefWidth(200.0); + object52.setProgress(0.0); + javafx.scene.layout.GridPane.setRowIndex(object52, 9); + final var object53 = new javafx.scene.control.ProgressIndicator(); + controller.setProgressIndicator(object53); + object53.setProgress(0.0); + object53.setRotate(2.0); + javafx.scene.layout.GridPane.setColumnIndex(object53, 1); + javafx.scene.layout.GridPane.setRowIndex(object53, 9); + final var object54 = new javafx.geometry.Point3D(4.0, 5.0, 6.0); + object53.setRotationAxis(object54); + final var object55 = new javafx.scene.control.RadioButton(); + controller.setRadioButton(object55); + object55.setMnemonicParsing(false); + object55.setScaleX(7.0); + object55.setScaleY(2.0); + object55.setScaleZ(3.0); + object55.setText("RadioButton"); + object55.setTranslateX(4.0); + object55.setTranslateY(5.0); + object55.setTranslateZ(6.0); + javafx.scene.layout.GridPane.setRowIndex(object55, 10); + final var object56 = new javafx.scene.control.ScrollBar(); + controller.setScrollBarH(object56); + javafx.scene.layout.GridPane.setColumnIndex(object56, 1); + javafx.scene.layout.GridPane.setRowIndex(object56, 10); + final var object57 = new javafx.scene.control.ScrollBar(); + controller.setScrollBarV(object57); + object57.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object57, 11); + final var object58 = new javafx.scene.control.Separator(); + controller.setSeparatorH(object58); + object58.setOnDragDetected(controller::dragDetected); + object58.setOnDragDone(controller::dragDone); + object58.setOnDragDropped(controller::dragDropped); + object58.setOnDragEntered(controller::dragEntered); + object58.setOnDragExited(controller::dragExited); + object58.setOnDragOver(controller::dragOver); + object58.setOnMouseDragEntered(controller::mouseDragEntered); + object58.setOnMouseDragExited(controller::mouseDragExited); + object58.setOnMouseDragOver(controller::mouseDragOver); + object58.setOnMouseDragReleased(controller::mouseDragReleased); + object58.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object58, 1); + javafx.scene.layout.GridPane.setRowIndex(object58, 11); + final var object59 = new javafx.scene.control.Separator(); + controller.setSeparatorV(object59); + object59.setOrientation(javafx.geometry.Orientation.VERTICAL); + object59.setPrefHeight(200.0); + javafx.scene.layout.GridPane.setRowIndex(object59, 12); + final var object60 = new javafx.scene.control.Slider(); + controller.setSliderH(object60); + object60.setOnContextMenuRequested(controller::contextMenuRequested); + object60.setOnMouseClicked(e -> controller.mouseClicked()); + object60.setOnMouseDragged(controller::mouseDragged); + object60.setOnMouseEntered(controller::mouseEntered); + object60.setOnMouseExited(controller::mouseExited); + object60.setOnMouseMoved(controller::mouseMoved); + object60.setOnMousePressed(controller::mousePressed); + object60.setOnMouseReleased(controller::mouseReleased); + object60.setOnScroll(controller::onScroll); + object60.setOnScrollFinished(controller::onScrollFinished); + object60.setOnScrollStarted(controller::onScrollStarted); + javafx.scene.layout.GridPane.setColumnIndex(object60, 1); + javafx.scene.layout.GridPane.setRowIndex(object60, 12); + final var object61 = new javafx.scene.control.Slider(); + controller.setSliderV(object61); + object61.setOnZoom(controller::onZoom); + object61.setOnZoomFinished(controller::onZoomFinished); + object61.setOnZoomStarted(controller::onZoomStarted); + object61.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object61, 13); + final var object62 = new javafx.scene.control.Spinner(); + controller.setSpinner(object62); + javafx.scene.layout.GridPane.setColumnIndex(object62, 1); + javafx.scene.layout.GridPane.setRowIndex(object62, 13); + final var object63 = new javafx.scene.control.SplitMenuButton(); + controller.setSplitMenuButton(object63); + object63.setMnemonicParsing(false); + object63.setText("SplitMenuButton"); + javafx.scene.layout.GridPane.setRowIndex(object63, 14); + final var object64 = new javafx.scene.control.MenuItem(); + controller.setItem1(object64); + object64.setMnemonicParsing(false); + object64.setText("Action 1"); + final var object65 = new javafx.scene.control.MenuItem(); + controller.setItem2(object65); + object65.setMnemonicParsing(false); + object65.setText("Action 2"); + object63.getItems().addAll(object64, object65); + final var object66 = new javafx.scene.control.TableView(); + controller.setTableView(object66); + object66.setPrefHeight(200.0); + object66.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object66, 1); + javafx.scene.layout.GridPane.setRowIndex(object66, 14); + final var object67 = new javafx.scene.control.TableColumn(); + controller.setTableColumn1(object67); + object67.setPrefWidth(75.0); + object67.setText("C1"); + final var object68 = new javafx.scene.control.TableColumn(); + controller.setTableColumn2(object68); + object68.setPrefWidth(75.0); + object68.setText("C2"); + object66.getColumns().addAll(object67, object68); + final var object69 = new javafx.scene.control.TextArea(); + controller.setTextArea(object69); + object69.setPrefHeight(200.0); + object69.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object69, 15); + final var object70 = new javafx.scene.control.TextField(); + controller.setTextField(object70); + javafx.scene.layout.GridPane.setColumnIndex(object70, 1); + javafx.scene.layout.GridPane.setRowIndex(object70, 15); + final var object71 = new javafx.scene.control.ToggleButton(); + object71.setMnemonicParsing(false); + object71.setOnAction(controller::onAction); + object71.setOnRotate(controller::onRotate); + object71.setOnRotationFinished(controller::onRotationFinished); + object71.setOnRotationStarted(controller::onRotationStarted); + object71.setText("ToggleButton"); + javafx.scene.layout.GridPane.setRowIndex(object71, 16); + final var object72 = new javafx.scene.control.TreeTableView>(); + controller.setTreeTableView(object72); + object72.setPrefHeight(200.0); + object72.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object72, 1); + javafx.scene.layout.GridPane.setRowIndex(object72, 16); + final var object73 = new javafx.scene.control.TreeTableColumn, String>(); + controller.setTreeTableColumn1(object73); + object73.setOnEditCancel(controller::onEditCancel); + object73.setOnEditCommit(controller::onEditCommit); + object73.setOnEditStart(controller::onEditStart); + object73.setPrefWidth(75.0); + object73.setText("C1"); + final var object74 = new javafx.scene.control.TreeTableColumn, Integer>(); + controller.setTreeTableColumn2(object74); + object74.setPrefWidth(75.0); + object74.setSortType(javafx.scene.control.TreeTableColumn.SortType.DESCENDING); + object74.setText("C2"); + object72.getColumns().addAll(object73, object74); + final var object75 = new javafx.scene.control.TreeView(); + controller.setTreeView(object75); + object75.setOnSwipeDown(controller::onSwipeDown); + object75.setOnSwipeLeft(controller::onSwipeLeft); + object75.setOnSwipeRight(controller::onSwipeRight); + object75.setOnSwipeUp(controller::onSwipeUp); + object75.setPrefHeight(200.0); + object75.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object75, 17); + final var object76 = new javafx.scene.web.WebView(); + controller.setWebView(object76); + object76.setOnTouchMoved(controller::onTouchMoved); + object76.setOnTouchPressed(controller::onTouchPressed); + object76.setOnTouchReleased(controller::onTouchReleased); + object76.setOnTouchStationary(controller::onTouchStationary); + object76.setPrefHeight(200.0); + object76.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object76, 1); + javafx.scene.layout.GridPane.setRowIndex(object76, 17); + object0.getChildren().addAll(object22, object23, object24, object25, object28, object31, object32, object33, object34, object35, object36, object37, object38, object45, object49, object51, object52, object53, object55, object56, object57, object58, object59, object60, object61, object62, object63, object66, object69, object70, object71, object72, object75, object76); + controller.initialize(); + loaded = true; + return object0; +} + + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.ControlsController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-setters-reference-getter.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-setters-reference-getter.txt new file mode 100644 index 0000000..1c56295 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-setters-reference-getter.txt @@ -0,0 +1,424 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; + + +/** + * Generated code, not thread-safe + */ +public final class ControlsController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.ControlsController controller; + + /** + * Instantiates a new ControlsController with no nested controllers and no resource bundle + * @param controller The controller + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of()); + } + + /** + * Instantiates a new ControlsController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, resourceBundle)); + } + + /** + * Instantiates a new ControlsController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public ControlsController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + controller = (com.github.gtache.fxml.compiler.impl.ControlsController) controllersMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + final var object0 = new javafx.scene.layout.GridPane(); + controller.setGridPane(object0); + object0.setOnInputMethodTextChanged(controller::inputMethodTextChanged); + object0.setOnKeyPressed(e -> controller.keyPressed()); + object0.setOnKeyReleased(controller::keyReleased); + object0.setOnKeyTyped(controller::keyTyped); + final var object1 = new javafx.scene.layout.RowConstraints(); + final var object2 = new javafx.scene.layout.RowConstraints(); + final var object3 = new javafx.scene.layout.RowConstraints(); + final var object4 = new javafx.scene.layout.RowConstraints(); + final var object5 = new javafx.scene.layout.RowConstraints(); + final var object6 = new javafx.scene.layout.RowConstraints(); + final var object7 = new javafx.scene.layout.RowConstraints(); + final var object8 = new javafx.scene.layout.RowConstraints(); + final var object9 = new javafx.scene.layout.RowConstraints(); + final var object10 = new javafx.scene.layout.RowConstraints(); + final var object11 = new javafx.scene.layout.RowConstraints(); + final var object12 = new javafx.scene.layout.RowConstraints(); + final var object13 = new javafx.scene.layout.RowConstraints(); + final var object14 = new javafx.scene.layout.RowConstraints(); + final var object15 = new javafx.scene.layout.RowConstraints(); + final var object16 = new javafx.scene.layout.RowConstraints(); + final var object17 = new javafx.scene.layout.RowConstraints(); + final var object18 = new javafx.scene.layout.RowConstraints(); + object0.getRowConstraints().addAll(object1, object2, object3, object4, object5, object6, object7, object8, object9, object10, object11, object12, object13, object14, object15, object16, object17, object18); + final var object19 = new javafx.scene.layout.ColumnConstraints(); + final var object20 = new javafx.scene.layout.ColumnConstraints(); + final var object21 = new javafx.scene.layout.ColumnConstraints(); + object21.setMinWidth(10.0); + object21.setPrefWidth(100.0); + object0.getColumnConstraints().addAll(object19, object20, object21); + final var object22 = new javafx.scene.control.Button(); + controller.setButton(object22); + object22.setMnemonicParsing(false); + object22.setText("Button"); + final var object23 = new javafx.scene.control.CheckBox(); + controller.setCheckBox(object23); + object23.setIndeterminate(true); + object23.setMnemonicParsing(false); + object23.setText("CheckBox"); + javafx.scene.layout.GridPane.setColumnIndex(object23, 1); + final var object24 = new javafx.scene.control.ChoiceBox(); + controller.setChoiceBox(object24); + object24.setCacheShape(false); + object24.setCenterShape(false); + object24.setDisable(true); + object24.setFocusTraversable(false); + object24.setPrefWidth(150.0); + object24.setScaleShape(false); + object24.setVisible(false); + javafx.scene.layout.GridPane.setRowIndex(object24, 1); + final var object25 = new javafx.scene.control.ColorPicker(); + controller.setColorPicker(object25); + object25.setNodeOrientation(javafx.geometry.NodeOrientation.LEFT_TO_RIGHT); + object25.setOpacity(0.5); + javafx.scene.layout.GridPane.setColumnIndex(object25, 1); + javafx.scene.layout.GridPane.setRowIndex(object25, 1); + final var object26 = new javafx.scene.paint.Color(0.7894737124443054, 0.08771929889917374, 0.08771929889917374, 1); + controller.setColor(object26); + object25.setValue(object26); + final var object27 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object25.setOpaqueInsets(object27); + final var object28 = new javafx.scene.control.ComboBox(); + controller.setComboBox(object28); + object28.setEditable(true); + object28.setPrefWidth(150.0); + object28.setPromptText("Text"); + object28.setVisibleRowCount(5); + javafx.scene.layout.GridPane.setRowIndex(object28, 2); + final var object29 = javafx.scene.Cursor.CLOSED_HAND; + object28.setCursor(object29); + final var object30 = new javafx.scene.effect.Bloom(); + object28.setEffect(object30); + final var object31 = new javafx.scene.control.DatePicker(); + controller.setDatePicker(object31); + object31.setShowWeekNumbers(true); + object31.setStyle("-fx-background-color: #ffffff;"); + javafx.scene.layout.GridPane.setColumnIndex(object31, 1); + javafx.scene.layout.GridPane.setRowIndex(object31, 2); + final var object32 = new javafx.scene.web.HTMLEditor(); + controller.setHtmlEditor(object32); + object32.setHtmlText(""); + object32.setPrefHeight(200.0); + object32.setPrefWidth(506.0); + object32.getStyleClass().addAll("clazz"); + object32.getStylesheets().addAll("@style.css"); + javafx.scene.layout.GridPane.setRowIndex(object32, 3); + final var object33 = new javafx.scene.control.Hyperlink(); + controller.setHyperlink(object33); + object33.setText("Hyperlink"); + javafx.scene.layout.GridPane.setColumnIndex(object33, 1); + javafx.scene.layout.GridPane.setRowIndex(object33, 3); + final var object34 = new javafx.scene.image.ImageView(); + controller.setImageView(object34); + object34.setFitHeight(150.0); + object34.setFitWidth(200.0); + object34.setPickOnBounds(true); + object34.setPreserveRatio(true); + javafx.scene.layout.GridPane.setRowIndex(object34, 4); + final var object35 = new javafx.scene.control.Label(); + controller.setLabel(object35); + object35.setAccessibleHelp("TTTTT"); + object35.setAccessibleText("TTT"); + object35.setBlendMode(javafx.scene.effect.BlendMode.ADD); + object35.setCache(true); + object35.setCacheHint(javafx.scene.CacheHint.QUALITY); + object35.setDepthTest(javafx.scene.DepthTest.ENABLE); + object35.setMnemonicParsing(true); + object35.setMouseTransparent(true); + object35.setText(controller.resources().getString("include.label")); + javafx.scene.layout.GridPane.setColumnIndex(object35, 1); + javafx.scene.layout.GridPane.setRowIndex(object35, 4); + final var object36 = new javafx.scene.control.ListView(); + controller.setListView(object36); + object36.setFixedCellSize(20.0); + object36.setNodeOrientation(javafx.geometry.NodeOrientation.RIGHT_TO_LEFT); + object36.setOrientation(javafx.geometry.Orientation.HORIZONTAL); + object36.setPrefHeight(200.0); + object36.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object36, 5); + final var object37 = new javafx.scene.media.MediaView(); + controller.setMediaView(object37); + object37.setFitHeight(200.0); + object37.setFitWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object37, 1); + javafx.scene.layout.GridPane.setColumnSpan(object37, 2); + javafx.scene.layout.GridPane.setRowIndex(object37, 5); + javafx.scene.layout.GridPane.setRowSpan(object37, 2); + final var object38 = new javafx.scene.control.MenuBar(); + controller.setMenuBar(object38); + javafx.scene.layout.GridPane.setHalignment(object38, javafx.geometry.HPos.RIGHT); + javafx.scene.layout.GridPane.setHgrow(object38, javafx.scene.layout.Priority.ALWAYS); + javafx.scene.layout.GridPane.setRowIndex(object38, 7); + javafx.scene.layout.GridPane.setValignment(object38, javafx.geometry.VPos.BASELINE); + javafx.scene.layout.GridPane.setVgrow(object38, javafx.scene.layout.Priority.SOMETIMES); + final var object39 = new javafx.scene.control.Menu(); + controller.setMenu1(object39); + object39.setMnemonicParsing(false); + object39.setText("File"); + final var object40 = new javafx.scene.control.MenuItem(); + controller.setMenuItem1(object40); + object40.setMnemonicParsing(false); + object40.setText("Close"); + object39.getItems().addAll(object40); + final var object41 = new javafx.scene.control.Menu(); + object41.setMnemonicParsing(false); + object41.setText("Edit"); + final var object42 = new javafx.scene.control.MenuItem(); + object42.setMnemonicParsing(false); + object42.setText("Delete"); + object41.getItems().addAll(object42); + final var object43 = new javafx.scene.control.Menu(); + object43.setMnemonicParsing(false); + object43.setText("Help"); + final var object44 = new javafx.scene.control.MenuItem(); + object44.setMnemonicParsing(false); + object44.setText("About"); + object43.getItems().addAll(object44); + object38.getMenus().addAll(object39, object41, object43); + final var object45 = new javafx.scene.control.MenuButton(); + controller.setMenuButton(object45); + object45.setMnemonicParsing(false); + object45.setText("MenuButton"); + javafx.scene.layout.GridPane.setColumnIndex(object45, 1); + javafx.scene.layout.GridPane.setRowIndex(object45, 7); + final var object46 = new javafx.scene.control.MenuItem(); + object46.setMnemonicParsing(false); + object46.setText("Action 1"); + final var object47 = new javafx.scene.control.MenuItem(); + object47.setMnemonicParsing(false); + object47.setText("Action 2"); + object45.getItems().addAll(object46, object47); + final var object48 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + javafx.scene.layout.GridPane.setMargin(object45, object48); + final var object49 = new javafx.scene.control.Pagination(); + controller.setPagination(object49); + object49.setPrefHeight(200.0); + object49.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object49, 8); + final var object50 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object49.setPadding(object50); + final var object51 = new javafx.scene.control.PasswordField(); + controller.setPasswordField(object51); + object51.setMaxHeight(6.0); + object51.setMaxWidth(5.0); + object51.setMinHeight(2.0); + object51.setMinWidth(1.0); + object51.setPrefColumnCount(7); + object51.setPrefHeight(4.0); + object51.setPrefWidth(3.0); + javafx.scene.layout.GridPane.setColumnIndex(object51, 1); + javafx.scene.layout.GridPane.setRowIndex(object51, 8); + final var object52 = new javafx.scene.control.ProgressBar(); + controller.setProgressBar(object52); + object52.setLayoutX(10.0); + object52.setLayoutY(20.0); + object52.setPrefWidth(200.0); + object52.setProgress(0.0); + javafx.scene.layout.GridPane.setRowIndex(object52, 9); + final var object53 = new javafx.scene.control.ProgressIndicator(); + controller.setProgressIndicator(object53); + object53.setProgress(0.0); + object53.setRotate(2.0); + javafx.scene.layout.GridPane.setColumnIndex(object53, 1); + javafx.scene.layout.GridPane.setRowIndex(object53, 9); + final var object54 = new javafx.geometry.Point3D(4.0, 5.0, 6.0); + object53.setRotationAxis(object54); + final var object55 = new javafx.scene.control.RadioButton(); + controller.setRadioButton(object55); + object55.setMnemonicParsing(false); + object55.setScaleX(7.0); + object55.setScaleY(2.0); + object55.setScaleZ(3.0); + object55.setText("RadioButton"); + object55.setTranslateX(4.0); + object55.setTranslateY(5.0); + object55.setTranslateZ(6.0); + javafx.scene.layout.GridPane.setRowIndex(object55, 10); + final var object56 = new javafx.scene.control.ScrollBar(); + controller.setScrollBarH(object56); + javafx.scene.layout.GridPane.setColumnIndex(object56, 1); + javafx.scene.layout.GridPane.setRowIndex(object56, 10); + final var object57 = new javafx.scene.control.ScrollBar(); + controller.setScrollBarV(object57); + object57.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object57, 11); + final var object58 = new javafx.scene.control.Separator(); + controller.setSeparatorH(object58); + object58.setOnDragDetected(controller::dragDetected); + object58.setOnDragDone(controller::dragDone); + object58.setOnDragDropped(controller::dragDropped); + object58.setOnDragEntered(controller::dragEntered); + object58.setOnDragExited(controller::dragExited); + object58.setOnDragOver(controller::dragOver); + object58.setOnMouseDragEntered(controller::mouseDragEntered); + object58.setOnMouseDragExited(controller::mouseDragExited); + object58.setOnMouseDragOver(controller::mouseDragOver); + object58.setOnMouseDragReleased(controller::mouseDragReleased); + object58.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object58, 1); + javafx.scene.layout.GridPane.setRowIndex(object58, 11); + final var object59 = new javafx.scene.control.Separator(); + controller.setSeparatorV(object59); + object59.setOrientation(javafx.geometry.Orientation.VERTICAL); + object59.setPrefHeight(200.0); + javafx.scene.layout.GridPane.setRowIndex(object59, 12); + final var object60 = new javafx.scene.control.Slider(); + controller.setSliderH(object60); + object60.setOnContextMenuRequested(controller::contextMenuRequested); + object60.setOnMouseClicked(e -> controller.mouseClicked()); + object60.setOnMouseDragged(controller::mouseDragged); + object60.setOnMouseEntered(controller::mouseEntered); + object60.setOnMouseExited(controller::mouseExited); + object60.setOnMouseMoved(controller::mouseMoved); + object60.setOnMousePressed(controller::mousePressed); + object60.setOnMouseReleased(controller::mouseReleased); + object60.setOnScroll(controller::onScroll); + object60.setOnScrollFinished(controller::onScrollFinished); + object60.setOnScrollStarted(controller::onScrollStarted); + javafx.scene.layout.GridPane.setColumnIndex(object60, 1); + javafx.scene.layout.GridPane.setRowIndex(object60, 12); + final var object61 = new javafx.scene.control.Slider(); + controller.setSliderV(object61); + object61.setOnZoom(controller::onZoom); + object61.setOnZoomFinished(controller::onZoomFinished); + object61.setOnZoomStarted(controller::onZoomStarted); + object61.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object61, 13); + final var object62 = new javafx.scene.control.Spinner(); + controller.setSpinner(object62); + javafx.scene.layout.GridPane.setColumnIndex(object62, 1); + javafx.scene.layout.GridPane.setRowIndex(object62, 13); + final var object63 = new javafx.scene.control.SplitMenuButton(); + controller.setSplitMenuButton(object63); + object63.setMnemonicParsing(false); + object63.setText("SplitMenuButton"); + javafx.scene.layout.GridPane.setRowIndex(object63, 14); + final var object64 = new javafx.scene.control.MenuItem(); + controller.setItem1(object64); + object64.setMnemonicParsing(false); + object64.setText("Action 1"); + final var object65 = new javafx.scene.control.MenuItem(); + controller.setItem2(object65); + object65.setMnemonicParsing(false); + object65.setText("Action 2"); + object63.getItems().addAll(object64, object65); + final var object66 = new javafx.scene.control.TableView(); + controller.setTableView(object66); + object66.setPrefHeight(200.0); + object66.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object66, 1); + javafx.scene.layout.GridPane.setRowIndex(object66, 14); + final var object67 = new javafx.scene.control.TableColumn(); + controller.setTableColumn1(object67); + object67.setPrefWidth(75.0); + object67.setText("C1"); + final var object68 = new javafx.scene.control.TableColumn(); + controller.setTableColumn2(object68); + object68.setPrefWidth(75.0); + object68.setText("C2"); + object66.getColumns().addAll(object67, object68); + final var object69 = new javafx.scene.control.TextArea(); + controller.setTextArea(object69); + object69.setPrefHeight(200.0); + object69.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object69, 15); + final var object70 = new javafx.scene.control.TextField(); + controller.setTextField(object70); + javafx.scene.layout.GridPane.setColumnIndex(object70, 1); + javafx.scene.layout.GridPane.setRowIndex(object70, 15); + final var object71 = new javafx.scene.control.ToggleButton(); + object71.setMnemonicParsing(false); + object71.setOnAction(controller::onAction); + object71.setOnRotate(controller::onRotate); + object71.setOnRotationFinished(controller::onRotationFinished); + object71.setOnRotationStarted(controller::onRotationStarted); + object71.setText("ToggleButton"); + javafx.scene.layout.GridPane.setRowIndex(object71, 16); + final var object72 = new javafx.scene.control.TreeTableView>(); + controller.setTreeTableView(object72); + object72.setPrefHeight(200.0); + object72.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object72, 1); + javafx.scene.layout.GridPane.setRowIndex(object72, 16); + final var object73 = new javafx.scene.control.TreeTableColumn, String>(); + controller.setTreeTableColumn1(object73); + object73.setOnEditCancel(controller::onEditCancel); + object73.setOnEditCommit(controller::onEditCommit); + object73.setOnEditStart(controller::onEditStart); + object73.setPrefWidth(75.0); + object73.setText("C1"); + final var object74 = new javafx.scene.control.TreeTableColumn, Integer>(); + controller.setTreeTableColumn2(object74); + object74.setPrefWidth(75.0); + object74.setSortType(javafx.scene.control.TreeTableColumn.SortType.DESCENDING); + object74.setText("C2"); + object72.getColumns().addAll(object73, object74); + final var object75 = new javafx.scene.control.TreeView(); + controller.setTreeView(object75); + object75.setOnSwipeDown(controller::onSwipeDown); + object75.setOnSwipeLeft(controller::onSwipeLeft); + object75.setOnSwipeRight(controller::onSwipeRight); + object75.setOnSwipeUp(controller::onSwipeUp); + object75.setPrefHeight(200.0); + object75.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object75, 17); + final var object76 = new javafx.scene.web.WebView(); + controller.setWebView(object76); + object76.setOnTouchMoved(controller::onTouchMoved); + object76.setOnTouchPressed(controller::onTouchPressed); + object76.setOnTouchReleased(controller::onTouchReleased); + object76.setOnTouchStationary(controller::onTouchStationary); + object76.setPrefHeight(200.0); + object76.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object76, 1); + javafx.scene.layout.GridPane.setRowIndex(object76, 17); + object0.getChildren().addAll(object22, object23, object24, object25, object28, object31, object32, object33, object34, object35, object36, object37, object38, object45, object49, object51, object52, object53, object55, object56, object57, object58, object59, object60, object61, object62, object63, object66, object69, object70, object71, object72, object75, object76); + controller.initialize(); + loaded = true; + return object0; +} + + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.ControlsController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-setters-reflection-constructor.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-setters-reflection-constructor.txt new file mode 100644 index 0000000..198e309 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-setters-reflection-constructor.txt @@ -0,0 +1,469 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import javafx.event.Event; +import java.lang.reflect.Method; + + +/** + * Generated code, not thread-safe + */ +public final class ControlsController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.ControlsController controller; + + /** + * Instantiates a new ControlsController with no nested controllers and no resource bundle + * @param controller The controller + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of()); + } + + /** + * Instantiates a new ControlsController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, resourceBundle)); + } + + /** + * Instantiates a new ControlsController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public ControlsController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = resourceBundlesMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + controller = (com.github.gtache.fxml.compiler.impl.ControlsController) controllersMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + final var object0 = new javafx.scene.layout.GridPane(); + controller.setGridPane(object0); + object0.setOnInputMethodTextChanged(e -> callMethod("inputMethodTextChanged", e)); + object0.setOnKeyPressed(e -> callMethod("keyPressed", e)); + object0.setOnKeyReleased(e -> callMethod("keyReleased", e)); + object0.setOnKeyTyped(e -> callMethod("keyTyped", e)); + final var object1 = new javafx.scene.layout.RowConstraints(); + final var object2 = new javafx.scene.layout.RowConstraints(); + final var object3 = new javafx.scene.layout.RowConstraints(); + final var object4 = new javafx.scene.layout.RowConstraints(); + final var object5 = new javafx.scene.layout.RowConstraints(); + final var object6 = new javafx.scene.layout.RowConstraints(); + final var object7 = new javafx.scene.layout.RowConstraints(); + final var object8 = new javafx.scene.layout.RowConstraints(); + final var object9 = new javafx.scene.layout.RowConstraints(); + final var object10 = new javafx.scene.layout.RowConstraints(); + final var object11 = new javafx.scene.layout.RowConstraints(); + final var object12 = new javafx.scene.layout.RowConstraints(); + final var object13 = new javafx.scene.layout.RowConstraints(); + final var object14 = new javafx.scene.layout.RowConstraints(); + final var object15 = new javafx.scene.layout.RowConstraints(); + final var object16 = new javafx.scene.layout.RowConstraints(); + final var object17 = new javafx.scene.layout.RowConstraints(); + final var object18 = new javafx.scene.layout.RowConstraints(); + object0.getRowConstraints().addAll(object1, object2, object3, object4, object5, object6, object7, object8, object9, object10, object11, object12, object13, object14, object15, object16, object17, object18); + final var object19 = new javafx.scene.layout.ColumnConstraints(); + final var object20 = new javafx.scene.layout.ColumnConstraints(); + final var object21 = new javafx.scene.layout.ColumnConstraints(); + object21.setMinWidth(10.0); + object21.setPrefWidth(100.0); + object0.getColumnConstraints().addAll(object19, object20, object21); + final var object22 = new javafx.scene.control.Button(); + controller.setButton(object22); + object22.setMnemonicParsing(false); + object22.setText("Button"); + final var object23 = new javafx.scene.control.CheckBox(); + controller.setCheckBox(object23); + object23.setIndeterminate(true); + object23.setMnemonicParsing(false); + object23.setText("CheckBox"); + javafx.scene.layout.GridPane.setColumnIndex(object23, 1); + final var object24 = new javafx.scene.control.ChoiceBox(); + controller.setChoiceBox(object24); + object24.setCacheShape(false); + object24.setCenterShape(false); + object24.setDisable(true); + object24.setFocusTraversable(false); + object24.setPrefWidth(150.0); + object24.setScaleShape(false); + object24.setVisible(false); + javafx.scene.layout.GridPane.setRowIndex(object24, 1); + final var object25 = new javafx.scene.control.ColorPicker(); + controller.setColorPicker(object25); + object25.setNodeOrientation(javafx.geometry.NodeOrientation.LEFT_TO_RIGHT); + object25.setOpacity(0.5); + javafx.scene.layout.GridPane.setColumnIndex(object25, 1); + javafx.scene.layout.GridPane.setRowIndex(object25, 1); + final var object26 = new javafx.scene.paint.Color(0.7894737124443054, 0.08771929889917374, 0.08771929889917374, 1); + controller.setColor(object26); + object25.setValue(object26); + final var object27 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object25.setOpaqueInsets(object27); + final var object28 = new javafx.scene.control.ComboBox(); + controller.setComboBox(object28); + object28.setEditable(true); + object28.setPrefWidth(150.0); + object28.setPromptText("Text"); + object28.setVisibleRowCount(5); + javafx.scene.layout.GridPane.setRowIndex(object28, 2); + final var object29 = javafx.scene.Cursor.CLOSED_HAND; + object28.setCursor(object29); + final var object30 = new javafx.scene.effect.Bloom(); + object28.setEffect(object30); + final var object31 = new javafx.scene.control.DatePicker(); + controller.setDatePicker(object31); + object31.setShowWeekNumbers(true); + object31.setStyle("-fx-background-color: #ffffff;"); + javafx.scene.layout.GridPane.setColumnIndex(object31, 1); + javafx.scene.layout.GridPane.setRowIndex(object31, 2); + final var object32 = new javafx.scene.web.HTMLEditor(); + controller.setHtmlEditor(object32); + object32.setHtmlText(""); + object32.setPrefHeight(200.0); + object32.setPrefWidth(506.0); + object32.getStyleClass().addAll("clazz"); + object32.getStylesheets().addAll("@style.css"); + javafx.scene.layout.GridPane.setRowIndex(object32, 3); + final var object33 = new javafx.scene.control.Hyperlink(); + controller.setHyperlink(object33); + object33.setText("Hyperlink"); + javafx.scene.layout.GridPane.setColumnIndex(object33, 1); + javafx.scene.layout.GridPane.setRowIndex(object33, 3); + final var object34 = new javafx.scene.image.ImageView(); + controller.setImageView(object34); + object34.setFitHeight(150.0); + object34.setFitWidth(200.0); + object34.setPickOnBounds(true); + object34.setPreserveRatio(true); + javafx.scene.layout.GridPane.setRowIndex(object34, 4); + final var object35 = new javafx.scene.control.Label(); + controller.setLabel(object35); + object35.setAccessibleHelp("TTTTT"); + object35.setAccessibleText("TTT"); + object35.setBlendMode(javafx.scene.effect.BlendMode.ADD); + object35.setCache(true); + object35.setCacheHint(javafx.scene.CacheHint.QUALITY); + object35.setDepthTest(javafx.scene.DepthTest.ENABLE); + object35.setMnemonicParsing(true); + object35.setMouseTransparent(true); + object35.setText(bundle.getString("include.label")); + javafx.scene.layout.GridPane.setColumnIndex(object35, 1); + javafx.scene.layout.GridPane.setRowIndex(object35, 4); + final var object36 = new javafx.scene.control.ListView(); + controller.setListView(object36); + object36.setFixedCellSize(20.0); + object36.setNodeOrientation(javafx.geometry.NodeOrientation.RIGHT_TO_LEFT); + object36.setOrientation(javafx.geometry.Orientation.HORIZONTAL); + object36.setPrefHeight(200.0); + object36.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object36, 5); + final var object37 = new javafx.scene.media.MediaView(); + controller.setMediaView(object37); + object37.setFitHeight(200.0); + object37.setFitWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object37, 1); + javafx.scene.layout.GridPane.setColumnSpan(object37, 2); + javafx.scene.layout.GridPane.setRowIndex(object37, 5); + javafx.scene.layout.GridPane.setRowSpan(object37, 2); + final var object38 = new javafx.scene.control.MenuBar(); + controller.setMenuBar(object38); + javafx.scene.layout.GridPane.setHalignment(object38, javafx.geometry.HPos.RIGHT); + javafx.scene.layout.GridPane.setHgrow(object38, javafx.scene.layout.Priority.ALWAYS); + javafx.scene.layout.GridPane.setRowIndex(object38, 7); + javafx.scene.layout.GridPane.setValignment(object38, javafx.geometry.VPos.BASELINE); + javafx.scene.layout.GridPane.setVgrow(object38, javafx.scene.layout.Priority.SOMETIMES); + final var object39 = new javafx.scene.control.Menu(); + controller.setMenu1(object39); + object39.setMnemonicParsing(false); + object39.setText("File"); + final var object40 = new javafx.scene.control.MenuItem(); + controller.setMenuItem1(object40); + object40.setMnemonicParsing(false); + object40.setText("Close"); + object39.getItems().addAll(object40); + final var object41 = new javafx.scene.control.Menu(); + object41.setMnemonicParsing(false); + object41.setText("Edit"); + final var object42 = new javafx.scene.control.MenuItem(); + object42.setMnemonicParsing(false); + object42.setText("Delete"); + object41.getItems().addAll(object42); + final var object43 = new javafx.scene.control.Menu(); + object43.setMnemonicParsing(false); + object43.setText("Help"); + final var object44 = new javafx.scene.control.MenuItem(); + object44.setMnemonicParsing(false); + object44.setText("About"); + object43.getItems().addAll(object44); + object38.getMenus().addAll(object39, object41, object43); + final var object45 = new javafx.scene.control.MenuButton(); + controller.setMenuButton(object45); + object45.setMnemonicParsing(false); + object45.setText("MenuButton"); + javafx.scene.layout.GridPane.setColumnIndex(object45, 1); + javafx.scene.layout.GridPane.setRowIndex(object45, 7); + final var object46 = new javafx.scene.control.MenuItem(); + object46.setMnemonicParsing(false); + object46.setText("Action 1"); + final var object47 = new javafx.scene.control.MenuItem(); + object47.setMnemonicParsing(false); + object47.setText("Action 2"); + object45.getItems().addAll(object46, object47); + final var object48 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + javafx.scene.layout.GridPane.setMargin(object45, object48); + final var object49 = new javafx.scene.control.Pagination(); + controller.setPagination(object49); + object49.setPrefHeight(200.0); + object49.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object49, 8); + final var object50 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object49.setPadding(object50); + final var object51 = new javafx.scene.control.PasswordField(); + controller.setPasswordField(object51); + object51.setMaxHeight(6.0); + object51.setMaxWidth(5.0); + object51.setMinHeight(2.0); + object51.setMinWidth(1.0); + object51.setPrefColumnCount(7); + object51.setPrefHeight(4.0); + object51.setPrefWidth(3.0); + javafx.scene.layout.GridPane.setColumnIndex(object51, 1); + javafx.scene.layout.GridPane.setRowIndex(object51, 8); + final var object52 = new javafx.scene.control.ProgressBar(); + controller.setProgressBar(object52); + object52.setLayoutX(10.0); + object52.setLayoutY(20.0); + object52.setPrefWidth(200.0); + object52.setProgress(0.0); + javafx.scene.layout.GridPane.setRowIndex(object52, 9); + final var object53 = new javafx.scene.control.ProgressIndicator(); + controller.setProgressIndicator(object53); + object53.setProgress(0.0); + object53.setRotate(2.0); + javafx.scene.layout.GridPane.setColumnIndex(object53, 1); + javafx.scene.layout.GridPane.setRowIndex(object53, 9); + final var object54 = new javafx.geometry.Point3D(4.0, 5.0, 6.0); + object53.setRotationAxis(object54); + final var object55 = new javafx.scene.control.RadioButton(); + controller.setRadioButton(object55); + object55.setMnemonicParsing(false); + object55.setScaleX(7.0); + object55.setScaleY(2.0); + object55.setScaleZ(3.0); + object55.setText("RadioButton"); + object55.setTranslateX(4.0); + object55.setTranslateY(5.0); + object55.setTranslateZ(6.0); + javafx.scene.layout.GridPane.setRowIndex(object55, 10); + final var object56 = new javafx.scene.control.ScrollBar(); + controller.setScrollBarH(object56); + javafx.scene.layout.GridPane.setColumnIndex(object56, 1); + javafx.scene.layout.GridPane.setRowIndex(object56, 10); + final var object57 = new javafx.scene.control.ScrollBar(); + controller.setScrollBarV(object57); + object57.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object57, 11); + final var object58 = new javafx.scene.control.Separator(); + controller.setSeparatorH(object58); + object58.setOnDragDetected(e -> callMethod("dragDetected", e)); + object58.setOnDragDone(e -> callMethod("dragDone", e)); + object58.setOnDragDropped(e -> callMethod("dragDropped", e)); + object58.setOnDragEntered(e -> callMethod("dragEntered", e)); + object58.setOnDragExited(e -> callMethod("dragExited", e)); + object58.setOnDragOver(e -> callMethod("dragOver", e)); + object58.setOnMouseDragEntered(e -> callMethod("mouseDragEntered", e)); + object58.setOnMouseDragExited(e -> callMethod("mouseDragExited", e)); + object58.setOnMouseDragOver(e -> callMethod("mouseDragOver", e)); + object58.setOnMouseDragReleased(e -> callMethod("mouseDragReleased", e)); + object58.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object58, 1); + javafx.scene.layout.GridPane.setRowIndex(object58, 11); + final var object59 = new javafx.scene.control.Separator(); + controller.setSeparatorV(object59); + object59.setOrientation(javafx.geometry.Orientation.VERTICAL); + object59.setPrefHeight(200.0); + javafx.scene.layout.GridPane.setRowIndex(object59, 12); + final var object60 = new javafx.scene.control.Slider(); + controller.setSliderH(object60); + object60.setOnContextMenuRequested(e -> callMethod("contextMenuRequested", e)); + object60.setOnMouseClicked(e -> callMethod("mouseClicked", e)); + object60.setOnMouseDragged(e -> callMethod("mouseDragged", e)); + object60.setOnMouseEntered(e -> callMethod("mouseEntered", e)); + object60.setOnMouseExited(e -> callMethod("mouseExited", e)); + object60.setOnMouseMoved(e -> callMethod("mouseMoved", e)); + object60.setOnMousePressed(e -> callMethod("mousePressed", e)); + object60.setOnMouseReleased(e -> callMethod("mouseReleased", e)); + object60.setOnScroll(e -> callMethod("onScroll", e)); + object60.setOnScrollFinished(e -> callMethod("onScrollFinished", e)); + object60.setOnScrollStarted(e -> callMethod("onScrollStarted", e)); + javafx.scene.layout.GridPane.setColumnIndex(object60, 1); + javafx.scene.layout.GridPane.setRowIndex(object60, 12); + final var object61 = new javafx.scene.control.Slider(); + controller.setSliderV(object61); + object61.setOnZoom(e -> callMethod("onZoom", e)); + object61.setOnZoomFinished(e -> callMethod("onZoomFinished", e)); + object61.setOnZoomStarted(e -> callMethod("onZoomStarted", e)); + object61.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object61, 13); + final var object62 = new javafx.scene.control.Spinner(); + controller.setSpinner(object62); + javafx.scene.layout.GridPane.setColumnIndex(object62, 1); + javafx.scene.layout.GridPane.setRowIndex(object62, 13); + final var object63 = new javafx.scene.control.SplitMenuButton(); + controller.setSplitMenuButton(object63); + object63.setMnemonicParsing(false); + object63.setText("SplitMenuButton"); + javafx.scene.layout.GridPane.setRowIndex(object63, 14); + final var object64 = new javafx.scene.control.MenuItem(); + controller.setItem1(object64); + object64.setMnemonicParsing(false); + object64.setText("Action 1"); + final var object65 = new javafx.scene.control.MenuItem(); + controller.setItem2(object65); + object65.setMnemonicParsing(false); + object65.setText("Action 2"); + object63.getItems().addAll(object64, object65); + final var object66 = new javafx.scene.control.TableView(); + controller.setTableView(object66); + object66.setPrefHeight(200.0); + object66.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object66, 1); + javafx.scene.layout.GridPane.setRowIndex(object66, 14); + final var object67 = new javafx.scene.control.TableColumn(); + controller.setTableColumn1(object67); + object67.setPrefWidth(75.0); + object67.setText("C1"); + final var object68 = new javafx.scene.control.TableColumn(); + controller.setTableColumn2(object68); + object68.setPrefWidth(75.0); + object68.setText("C2"); + object66.getColumns().addAll(object67, object68); + final var object69 = new javafx.scene.control.TextArea(); + controller.setTextArea(object69); + object69.setPrefHeight(200.0); + object69.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object69, 15); + final var object70 = new javafx.scene.control.TextField(); + controller.setTextField(object70); + javafx.scene.layout.GridPane.setColumnIndex(object70, 1); + javafx.scene.layout.GridPane.setRowIndex(object70, 15); + final var object71 = new javafx.scene.control.ToggleButton(); + object71.setMnemonicParsing(false); + object71.setOnAction(e -> callMethod("onAction", e)); + object71.setOnRotate(e -> callMethod("onRotate", e)); + object71.setOnRotationFinished(e -> callMethod("onRotationFinished", e)); + object71.setOnRotationStarted(e -> callMethod("onRotationStarted", e)); + object71.setText("ToggleButton"); + javafx.scene.layout.GridPane.setRowIndex(object71, 16); + final var object72 = new javafx.scene.control.TreeTableView>(); + controller.setTreeTableView(object72); + object72.setPrefHeight(200.0); + object72.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object72, 1); + javafx.scene.layout.GridPane.setRowIndex(object72, 16); + final var object73 = new javafx.scene.control.TreeTableColumn, String>(); + controller.setTreeTableColumn1(object73); + object73.setOnEditCancel(e -> callMethod("onEditCancel", e)); + object73.setOnEditCommit(e -> callMethod("onEditCommit", e)); + object73.setOnEditStart(e -> callMethod("onEditStart", e)); + object73.setPrefWidth(75.0); + object73.setText("C1"); + final var object74 = new javafx.scene.control.TreeTableColumn, Integer>(); + controller.setTreeTableColumn2(object74); + object74.setPrefWidth(75.0); + object74.setSortType(javafx.scene.control.TreeTableColumn.SortType.DESCENDING); + object74.setText("C2"); + object72.getColumns().addAll(object73, object74); + final var object75 = new javafx.scene.control.TreeView(); + controller.setTreeView(object75); + object75.setOnSwipeDown(e -> callMethod("onSwipeDown", e)); + object75.setOnSwipeLeft(e -> callMethod("onSwipeLeft", e)); + object75.setOnSwipeRight(e -> callMethod("onSwipeRight", e)); + object75.setOnSwipeUp(e -> callMethod("onSwipeUp", e)); + object75.setPrefHeight(200.0); + object75.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object75, 17); + final var object76 = new javafx.scene.web.WebView(); + controller.setWebView(object76); + object76.setOnTouchMoved(e -> callMethod("onTouchMoved", e)); + object76.setOnTouchPressed(e -> callMethod("onTouchPressed", e)); + object76.setOnTouchReleased(e -> callMethod("onTouchReleased", e)); + object76.setOnTouchStationary(e -> callMethod("onTouchStationary", e)); + object76.setPrefHeight(200.0); + object76.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object76, 1); + javafx.scene.layout.GridPane.setRowIndex(object76, 17); + object0.getChildren().addAll(object22, object23, object24, object25, object28, object31, object32, object33, object34, object35, object36, object37, object38, object45, object49, object51, object52, object53, object55, object56, object57, object58, object59, object60, object61, object62, object63, object66, object69, object70, object71, object72, object75, object76); + try { + final var initialize = controller.getClass().getDeclaredMethod("initialize"); + initialize.setAccessible(true); + initialize.invoke(controller); + } catch (final InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection", e); + } catch (final NoSuchMethodException ignored) { + } + loaded = true; + return object0; +} + + private void callMethod(final String methodName, final T event) { + try { + final Method method; + final var methods = Arrays.stream(controller.getClass().getDeclaredMethods()) + .filter(m -> m.getName().equals(methodName)).toList(); + if (methods.size() > 1) { + final var eventMethods = methods.stream().filter(m -> + m.getParameterCount() == 1 && Event.class.isAssignableFrom(m.getParameterTypes()[0])).toList(); + if (eventMethods.size() == 1) { + method = eventMethods.getFirst(); + } else { + final var emptyMethods = methods.stream().filter(m -> m.getParameterCount() == 0).toList(); + if (emptyMethods.size() == 1) { + method = emptyMethods.getFirst(); + } else { + throw new IllegalArgumentException("Multiple matching methods for " + methodName); + } + } + } else if (methods.size() == 1) { + method = methods.getFirst(); + } else { + throw new IllegalArgumentException("No matching method for " + methodName); + } + method.setAccessible(true); + if (method.getParameterCount() == 0) { + method.invoke(controller); + } else { + method.invoke(controller, event); + } + } catch (final IllegalAccessException | InvocationTargetException ex) { + throw new RuntimeException("Error using reflection on " + methodName, ex); + } +} + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.ControlsController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-setters-reflection-getbundle.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-setters-reflection-getbundle.txt new file mode 100644 index 0000000..ac73886 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-setters-reflection-getbundle.txt @@ -0,0 +1,469 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import javafx.event.Event; +import java.lang.reflect.Method; + + +/** + * Generated code, not thread-safe + */ +public final class ControlsController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.ControlsController controller; + + /** + * Instantiates a new ControlsController with no nested controllers and no resource bundle + * @param controller The controller + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of()); + } + + /** + * Instantiates a new ControlsController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, resourceBundle)); + } + + /** + * Instantiates a new ControlsController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public ControlsController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + controller = (com.github.gtache.fxml.compiler.impl.ControlsController) controllersMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + final var object0 = new javafx.scene.layout.GridPane(); + controller.setGridPane(object0); + object0.setOnInputMethodTextChanged(e -> callMethod("inputMethodTextChanged", e)); + object0.setOnKeyPressed(e -> callMethod("keyPressed", e)); + object0.setOnKeyReleased(e -> callMethod("keyReleased", e)); + object0.setOnKeyTyped(e -> callMethod("keyTyped", e)); + final var object1 = new javafx.scene.layout.RowConstraints(); + final var object2 = new javafx.scene.layout.RowConstraints(); + final var object3 = new javafx.scene.layout.RowConstraints(); + final var object4 = new javafx.scene.layout.RowConstraints(); + final var object5 = new javafx.scene.layout.RowConstraints(); + final var object6 = new javafx.scene.layout.RowConstraints(); + final var object7 = new javafx.scene.layout.RowConstraints(); + final var object8 = new javafx.scene.layout.RowConstraints(); + final var object9 = new javafx.scene.layout.RowConstraints(); + final var object10 = new javafx.scene.layout.RowConstraints(); + final var object11 = new javafx.scene.layout.RowConstraints(); + final var object12 = new javafx.scene.layout.RowConstraints(); + final var object13 = new javafx.scene.layout.RowConstraints(); + final var object14 = new javafx.scene.layout.RowConstraints(); + final var object15 = new javafx.scene.layout.RowConstraints(); + final var object16 = new javafx.scene.layout.RowConstraints(); + final var object17 = new javafx.scene.layout.RowConstraints(); + final var object18 = new javafx.scene.layout.RowConstraints(); + object0.getRowConstraints().addAll(object1, object2, object3, object4, object5, object6, object7, object8, object9, object10, object11, object12, object13, object14, object15, object16, object17, object18); + final var object19 = new javafx.scene.layout.ColumnConstraints(); + final var object20 = new javafx.scene.layout.ColumnConstraints(); + final var object21 = new javafx.scene.layout.ColumnConstraints(); + object21.setMinWidth(10.0); + object21.setPrefWidth(100.0); + object0.getColumnConstraints().addAll(object19, object20, object21); + final var object22 = new javafx.scene.control.Button(); + controller.setButton(object22); + object22.setMnemonicParsing(false); + object22.setText("Button"); + final var object23 = new javafx.scene.control.CheckBox(); + controller.setCheckBox(object23); + object23.setIndeterminate(true); + object23.setMnemonicParsing(false); + object23.setText("CheckBox"); + javafx.scene.layout.GridPane.setColumnIndex(object23, 1); + final var object24 = new javafx.scene.control.ChoiceBox(); + controller.setChoiceBox(object24); + object24.setCacheShape(false); + object24.setCenterShape(false); + object24.setDisable(true); + object24.setFocusTraversable(false); + object24.setPrefWidth(150.0); + object24.setScaleShape(false); + object24.setVisible(false); + javafx.scene.layout.GridPane.setRowIndex(object24, 1); + final var object25 = new javafx.scene.control.ColorPicker(); + controller.setColorPicker(object25); + object25.setNodeOrientation(javafx.geometry.NodeOrientation.LEFT_TO_RIGHT); + object25.setOpacity(0.5); + javafx.scene.layout.GridPane.setColumnIndex(object25, 1); + javafx.scene.layout.GridPane.setRowIndex(object25, 1); + final var object26 = new javafx.scene.paint.Color(0.7894737124443054, 0.08771929889917374, 0.08771929889917374, 1); + controller.setColor(object26); + object25.setValue(object26); + final var object27 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object25.setOpaqueInsets(object27); + final var object28 = new javafx.scene.control.ComboBox(); + controller.setComboBox(object28); + object28.setEditable(true); + object28.setPrefWidth(150.0); + object28.setPromptText("Text"); + object28.setVisibleRowCount(5); + javafx.scene.layout.GridPane.setRowIndex(object28, 2); + final var object29 = javafx.scene.Cursor.CLOSED_HAND; + object28.setCursor(object29); + final var object30 = new javafx.scene.effect.Bloom(); + object28.setEffect(object30); + final var object31 = new javafx.scene.control.DatePicker(); + controller.setDatePicker(object31); + object31.setShowWeekNumbers(true); + object31.setStyle("-fx-background-color: #ffffff;"); + javafx.scene.layout.GridPane.setColumnIndex(object31, 1); + javafx.scene.layout.GridPane.setRowIndex(object31, 2); + final var object32 = new javafx.scene.web.HTMLEditor(); + controller.setHtmlEditor(object32); + object32.setHtmlText(""); + object32.setPrefHeight(200.0); + object32.setPrefWidth(506.0); + object32.getStyleClass().addAll("clazz"); + object32.getStylesheets().addAll("@style.css"); + javafx.scene.layout.GridPane.setRowIndex(object32, 3); + final var object33 = new javafx.scene.control.Hyperlink(); + controller.setHyperlink(object33); + object33.setText("Hyperlink"); + javafx.scene.layout.GridPane.setColumnIndex(object33, 1); + javafx.scene.layout.GridPane.setRowIndex(object33, 3); + final var object34 = new javafx.scene.image.ImageView(); + controller.setImageView(object34); + object34.setFitHeight(150.0); + object34.setFitWidth(200.0); + object34.setPickOnBounds(true); + object34.setPreserveRatio(true); + javafx.scene.layout.GridPane.setRowIndex(object34, 4); + final var object35 = new javafx.scene.control.Label(); + controller.setLabel(object35); + object35.setAccessibleHelp("TTTTT"); + object35.setAccessibleText("TTT"); + object35.setBlendMode(javafx.scene.effect.BlendMode.ADD); + object35.setCache(true); + object35.setCacheHint(javafx.scene.CacheHint.QUALITY); + object35.setDepthTest(javafx.scene.DepthTest.ENABLE); + object35.setMnemonicParsing(true); + object35.setMouseTransparent(true); + object35.setText(bundle.getString("include.label")); + javafx.scene.layout.GridPane.setColumnIndex(object35, 1); + javafx.scene.layout.GridPane.setRowIndex(object35, 4); + final var object36 = new javafx.scene.control.ListView(); + controller.setListView(object36); + object36.setFixedCellSize(20.0); + object36.setNodeOrientation(javafx.geometry.NodeOrientation.RIGHT_TO_LEFT); + object36.setOrientation(javafx.geometry.Orientation.HORIZONTAL); + object36.setPrefHeight(200.0); + object36.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object36, 5); + final var object37 = new javafx.scene.media.MediaView(); + controller.setMediaView(object37); + object37.setFitHeight(200.0); + object37.setFitWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object37, 1); + javafx.scene.layout.GridPane.setColumnSpan(object37, 2); + javafx.scene.layout.GridPane.setRowIndex(object37, 5); + javafx.scene.layout.GridPane.setRowSpan(object37, 2); + final var object38 = new javafx.scene.control.MenuBar(); + controller.setMenuBar(object38); + javafx.scene.layout.GridPane.setHalignment(object38, javafx.geometry.HPos.RIGHT); + javafx.scene.layout.GridPane.setHgrow(object38, javafx.scene.layout.Priority.ALWAYS); + javafx.scene.layout.GridPane.setRowIndex(object38, 7); + javafx.scene.layout.GridPane.setValignment(object38, javafx.geometry.VPos.BASELINE); + javafx.scene.layout.GridPane.setVgrow(object38, javafx.scene.layout.Priority.SOMETIMES); + final var object39 = new javafx.scene.control.Menu(); + controller.setMenu1(object39); + object39.setMnemonicParsing(false); + object39.setText("File"); + final var object40 = new javafx.scene.control.MenuItem(); + controller.setMenuItem1(object40); + object40.setMnemonicParsing(false); + object40.setText("Close"); + object39.getItems().addAll(object40); + final var object41 = new javafx.scene.control.Menu(); + object41.setMnemonicParsing(false); + object41.setText("Edit"); + final var object42 = new javafx.scene.control.MenuItem(); + object42.setMnemonicParsing(false); + object42.setText("Delete"); + object41.getItems().addAll(object42); + final var object43 = new javafx.scene.control.Menu(); + object43.setMnemonicParsing(false); + object43.setText("Help"); + final var object44 = new javafx.scene.control.MenuItem(); + object44.setMnemonicParsing(false); + object44.setText("About"); + object43.getItems().addAll(object44); + object38.getMenus().addAll(object39, object41, object43); + final var object45 = new javafx.scene.control.MenuButton(); + controller.setMenuButton(object45); + object45.setMnemonicParsing(false); + object45.setText("MenuButton"); + javafx.scene.layout.GridPane.setColumnIndex(object45, 1); + javafx.scene.layout.GridPane.setRowIndex(object45, 7); + final var object46 = new javafx.scene.control.MenuItem(); + object46.setMnemonicParsing(false); + object46.setText("Action 1"); + final var object47 = new javafx.scene.control.MenuItem(); + object47.setMnemonicParsing(false); + object47.setText("Action 2"); + object45.getItems().addAll(object46, object47); + final var object48 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + javafx.scene.layout.GridPane.setMargin(object45, object48); + final var object49 = new javafx.scene.control.Pagination(); + controller.setPagination(object49); + object49.setPrefHeight(200.0); + object49.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object49, 8); + final var object50 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object49.setPadding(object50); + final var object51 = new javafx.scene.control.PasswordField(); + controller.setPasswordField(object51); + object51.setMaxHeight(6.0); + object51.setMaxWidth(5.0); + object51.setMinHeight(2.0); + object51.setMinWidth(1.0); + object51.setPrefColumnCount(7); + object51.setPrefHeight(4.0); + object51.setPrefWidth(3.0); + javafx.scene.layout.GridPane.setColumnIndex(object51, 1); + javafx.scene.layout.GridPane.setRowIndex(object51, 8); + final var object52 = new javafx.scene.control.ProgressBar(); + controller.setProgressBar(object52); + object52.setLayoutX(10.0); + object52.setLayoutY(20.0); + object52.setPrefWidth(200.0); + object52.setProgress(0.0); + javafx.scene.layout.GridPane.setRowIndex(object52, 9); + final var object53 = new javafx.scene.control.ProgressIndicator(); + controller.setProgressIndicator(object53); + object53.setProgress(0.0); + object53.setRotate(2.0); + javafx.scene.layout.GridPane.setColumnIndex(object53, 1); + javafx.scene.layout.GridPane.setRowIndex(object53, 9); + final var object54 = new javafx.geometry.Point3D(4.0, 5.0, 6.0); + object53.setRotationAxis(object54); + final var object55 = new javafx.scene.control.RadioButton(); + controller.setRadioButton(object55); + object55.setMnemonicParsing(false); + object55.setScaleX(7.0); + object55.setScaleY(2.0); + object55.setScaleZ(3.0); + object55.setText("RadioButton"); + object55.setTranslateX(4.0); + object55.setTranslateY(5.0); + object55.setTranslateZ(6.0); + javafx.scene.layout.GridPane.setRowIndex(object55, 10); + final var object56 = new javafx.scene.control.ScrollBar(); + controller.setScrollBarH(object56); + javafx.scene.layout.GridPane.setColumnIndex(object56, 1); + javafx.scene.layout.GridPane.setRowIndex(object56, 10); + final var object57 = new javafx.scene.control.ScrollBar(); + controller.setScrollBarV(object57); + object57.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object57, 11); + final var object58 = new javafx.scene.control.Separator(); + controller.setSeparatorH(object58); + object58.setOnDragDetected(e -> callMethod("dragDetected", e)); + object58.setOnDragDone(e -> callMethod("dragDone", e)); + object58.setOnDragDropped(e -> callMethod("dragDropped", e)); + object58.setOnDragEntered(e -> callMethod("dragEntered", e)); + object58.setOnDragExited(e -> callMethod("dragExited", e)); + object58.setOnDragOver(e -> callMethod("dragOver", e)); + object58.setOnMouseDragEntered(e -> callMethod("mouseDragEntered", e)); + object58.setOnMouseDragExited(e -> callMethod("mouseDragExited", e)); + object58.setOnMouseDragOver(e -> callMethod("mouseDragOver", e)); + object58.setOnMouseDragReleased(e -> callMethod("mouseDragReleased", e)); + object58.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object58, 1); + javafx.scene.layout.GridPane.setRowIndex(object58, 11); + final var object59 = new javafx.scene.control.Separator(); + controller.setSeparatorV(object59); + object59.setOrientation(javafx.geometry.Orientation.VERTICAL); + object59.setPrefHeight(200.0); + javafx.scene.layout.GridPane.setRowIndex(object59, 12); + final var object60 = new javafx.scene.control.Slider(); + controller.setSliderH(object60); + object60.setOnContextMenuRequested(e -> callMethod("contextMenuRequested", e)); + object60.setOnMouseClicked(e -> callMethod("mouseClicked", e)); + object60.setOnMouseDragged(e -> callMethod("mouseDragged", e)); + object60.setOnMouseEntered(e -> callMethod("mouseEntered", e)); + object60.setOnMouseExited(e -> callMethod("mouseExited", e)); + object60.setOnMouseMoved(e -> callMethod("mouseMoved", e)); + object60.setOnMousePressed(e -> callMethod("mousePressed", e)); + object60.setOnMouseReleased(e -> callMethod("mouseReleased", e)); + object60.setOnScroll(e -> callMethod("onScroll", e)); + object60.setOnScrollFinished(e -> callMethod("onScrollFinished", e)); + object60.setOnScrollStarted(e -> callMethod("onScrollStarted", e)); + javafx.scene.layout.GridPane.setColumnIndex(object60, 1); + javafx.scene.layout.GridPane.setRowIndex(object60, 12); + final var object61 = new javafx.scene.control.Slider(); + controller.setSliderV(object61); + object61.setOnZoom(e -> callMethod("onZoom", e)); + object61.setOnZoomFinished(e -> callMethod("onZoomFinished", e)); + object61.setOnZoomStarted(e -> callMethod("onZoomStarted", e)); + object61.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object61, 13); + final var object62 = new javafx.scene.control.Spinner(); + controller.setSpinner(object62); + javafx.scene.layout.GridPane.setColumnIndex(object62, 1); + javafx.scene.layout.GridPane.setRowIndex(object62, 13); + final var object63 = new javafx.scene.control.SplitMenuButton(); + controller.setSplitMenuButton(object63); + object63.setMnemonicParsing(false); + object63.setText("SplitMenuButton"); + javafx.scene.layout.GridPane.setRowIndex(object63, 14); + final var object64 = new javafx.scene.control.MenuItem(); + controller.setItem1(object64); + object64.setMnemonicParsing(false); + object64.setText("Action 1"); + final var object65 = new javafx.scene.control.MenuItem(); + controller.setItem2(object65); + object65.setMnemonicParsing(false); + object65.setText("Action 2"); + object63.getItems().addAll(object64, object65); + final var object66 = new javafx.scene.control.TableView(); + controller.setTableView(object66); + object66.setPrefHeight(200.0); + object66.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object66, 1); + javafx.scene.layout.GridPane.setRowIndex(object66, 14); + final var object67 = new javafx.scene.control.TableColumn(); + controller.setTableColumn1(object67); + object67.setPrefWidth(75.0); + object67.setText("C1"); + final var object68 = new javafx.scene.control.TableColumn(); + controller.setTableColumn2(object68); + object68.setPrefWidth(75.0); + object68.setText("C2"); + object66.getColumns().addAll(object67, object68); + final var object69 = new javafx.scene.control.TextArea(); + controller.setTextArea(object69); + object69.setPrefHeight(200.0); + object69.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object69, 15); + final var object70 = new javafx.scene.control.TextField(); + controller.setTextField(object70); + javafx.scene.layout.GridPane.setColumnIndex(object70, 1); + javafx.scene.layout.GridPane.setRowIndex(object70, 15); + final var object71 = new javafx.scene.control.ToggleButton(); + object71.setMnemonicParsing(false); + object71.setOnAction(e -> callMethod("onAction", e)); + object71.setOnRotate(e -> callMethod("onRotate", e)); + object71.setOnRotationFinished(e -> callMethod("onRotationFinished", e)); + object71.setOnRotationStarted(e -> callMethod("onRotationStarted", e)); + object71.setText("ToggleButton"); + javafx.scene.layout.GridPane.setRowIndex(object71, 16); + final var object72 = new javafx.scene.control.TreeTableView>(); + controller.setTreeTableView(object72); + object72.setPrefHeight(200.0); + object72.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object72, 1); + javafx.scene.layout.GridPane.setRowIndex(object72, 16); + final var object73 = new javafx.scene.control.TreeTableColumn, String>(); + controller.setTreeTableColumn1(object73); + object73.setOnEditCancel(e -> callMethod("onEditCancel", e)); + object73.setOnEditCommit(e -> callMethod("onEditCommit", e)); + object73.setOnEditStart(e -> callMethod("onEditStart", e)); + object73.setPrefWidth(75.0); + object73.setText("C1"); + final var object74 = new javafx.scene.control.TreeTableColumn, Integer>(); + controller.setTreeTableColumn2(object74); + object74.setPrefWidth(75.0); + object74.setSortType(javafx.scene.control.TreeTableColumn.SortType.DESCENDING); + object74.setText("C2"); + object72.getColumns().addAll(object73, object74); + final var object75 = new javafx.scene.control.TreeView(); + controller.setTreeView(object75); + object75.setOnSwipeDown(e -> callMethod("onSwipeDown", e)); + object75.setOnSwipeLeft(e -> callMethod("onSwipeLeft", e)); + object75.setOnSwipeRight(e -> callMethod("onSwipeRight", e)); + object75.setOnSwipeUp(e -> callMethod("onSwipeUp", e)); + object75.setPrefHeight(200.0); + object75.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object75, 17); + final var object76 = new javafx.scene.web.WebView(); + controller.setWebView(object76); + object76.setOnTouchMoved(e -> callMethod("onTouchMoved", e)); + object76.setOnTouchPressed(e -> callMethod("onTouchPressed", e)); + object76.setOnTouchReleased(e -> callMethod("onTouchReleased", e)); + object76.setOnTouchStationary(e -> callMethod("onTouchStationary", e)); + object76.setPrefHeight(200.0); + object76.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object76, 1); + javafx.scene.layout.GridPane.setRowIndex(object76, 17); + object0.getChildren().addAll(object22, object23, object24, object25, object28, object31, object32, object33, object34, object35, object36, object37, object38, object45, object49, object51, object52, object53, object55, object56, object57, object58, object59, object60, object61, object62, object63, object66, object69, object70, object71, object72, object75, object76); + try { + final var initialize = controller.getClass().getDeclaredMethod("initialize"); + initialize.setAccessible(true); + initialize.invoke(controller); + } catch (final InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection", e); + } catch (final NoSuchMethodException ignored) { + } + loaded = true; + return object0; +} + + private void callMethod(final String methodName, final T event) { + try { + final Method method; + final var methods = Arrays.stream(controller.getClass().getDeclaredMethods()) + .filter(m -> m.getName().equals(methodName)).toList(); + if (methods.size() > 1) { + final var eventMethods = methods.stream().filter(m -> + m.getParameterCount() == 1 && Event.class.isAssignableFrom(m.getParameterTypes()[0])).toList(); + if (eventMethods.size() == 1) { + method = eventMethods.getFirst(); + } else { + final var emptyMethods = methods.stream().filter(m -> m.getParameterCount() == 0).toList(); + if (emptyMethods.size() == 1) { + method = emptyMethods.getFirst(); + } else { + throw new IllegalArgumentException("Multiple matching methods for " + methodName); + } + } + } else if (methods.size() == 1) { + method = methods.getFirst(); + } else { + throw new IllegalArgumentException("No matching method for " + methodName); + } + method.setAccessible(true); + if (method.getParameterCount() == 0) { + method.invoke(controller); + } else { + method.invoke(controller, event); + } + } catch (final IllegalAccessException | InvocationTargetException ex) { + throw new RuntimeException("Error using reflection on " + methodName, ex); + } +} + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.ControlsController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-setters-reflection-getter.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-setters-reflection-getter.txt new file mode 100644 index 0000000..33760c9 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-controls-setters-reflection-getter.txt @@ -0,0 +1,468 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import javafx.event.Event; +import java.lang.reflect.Method; + + +/** + * Generated code, not thread-safe + */ +public final class ControlsController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.ControlsController controller; + + /** + * Instantiates a new ControlsController with no nested controllers and no resource bundle + * @param controller The controller + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of()); + } + + /** + * Instantiates a new ControlsController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public ControlsController(final com.github.gtache.fxml.compiler.impl.ControlsController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.ControlsController.class, resourceBundle)); + } + + /** + * Instantiates a new ControlsController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public ControlsController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + controller = (com.github.gtache.fxml.compiler.impl.ControlsController) controllersMap.get(com.github.gtache.fxml.compiler.impl.ControlsController.class); + final var object0 = new javafx.scene.layout.GridPane(); + controller.setGridPane(object0); + object0.setOnInputMethodTextChanged(e -> callMethod("inputMethodTextChanged", e)); + object0.setOnKeyPressed(e -> callMethod("keyPressed", e)); + object0.setOnKeyReleased(e -> callMethod("keyReleased", e)); + object0.setOnKeyTyped(e -> callMethod("keyTyped", e)); + final var object1 = new javafx.scene.layout.RowConstraints(); + final var object2 = new javafx.scene.layout.RowConstraints(); + final var object3 = new javafx.scene.layout.RowConstraints(); + final var object4 = new javafx.scene.layout.RowConstraints(); + final var object5 = new javafx.scene.layout.RowConstraints(); + final var object6 = new javafx.scene.layout.RowConstraints(); + final var object7 = new javafx.scene.layout.RowConstraints(); + final var object8 = new javafx.scene.layout.RowConstraints(); + final var object9 = new javafx.scene.layout.RowConstraints(); + final var object10 = new javafx.scene.layout.RowConstraints(); + final var object11 = new javafx.scene.layout.RowConstraints(); + final var object12 = new javafx.scene.layout.RowConstraints(); + final var object13 = new javafx.scene.layout.RowConstraints(); + final var object14 = new javafx.scene.layout.RowConstraints(); + final var object15 = new javafx.scene.layout.RowConstraints(); + final var object16 = new javafx.scene.layout.RowConstraints(); + final var object17 = new javafx.scene.layout.RowConstraints(); + final var object18 = new javafx.scene.layout.RowConstraints(); + object0.getRowConstraints().addAll(object1, object2, object3, object4, object5, object6, object7, object8, object9, object10, object11, object12, object13, object14, object15, object16, object17, object18); + final var object19 = new javafx.scene.layout.ColumnConstraints(); + final var object20 = new javafx.scene.layout.ColumnConstraints(); + final var object21 = new javafx.scene.layout.ColumnConstraints(); + object21.setMinWidth(10.0); + object21.setPrefWidth(100.0); + object0.getColumnConstraints().addAll(object19, object20, object21); + final var object22 = new javafx.scene.control.Button(); + controller.setButton(object22); + object22.setMnemonicParsing(false); + object22.setText("Button"); + final var object23 = new javafx.scene.control.CheckBox(); + controller.setCheckBox(object23); + object23.setIndeterminate(true); + object23.setMnemonicParsing(false); + object23.setText("CheckBox"); + javafx.scene.layout.GridPane.setColumnIndex(object23, 1); + final var object24 = new javafx.scene.control.ChoiceBox(); + controller.setChoiceBox(object24); + object24.setCacheShape(false); + object24.setCenterShape(false); + object24.setDisable(true); + object24.setFocusTraversable(false); + object24.setPrefWidth(150.0); + object24.setScaleShape(false); + object24.setVisible(false); + javafx.scene.layout.GridPane.setRowIndex(object24, 1); + final var object25 = new javafx.scene.control.ColorPicker(); + controller.setColorPicker(object25); + object25.setNodeOrientation(javafx.geometry.NodeOrientation.LEFT_TO_RIGHT); + object25.setOpacity(0.5); + javafx.scene.layout.GridPane.setColumnIndex(object25, 1); + javafx.scene.layout.GridPane.setRowIndex(object25, 1); + final var object26 = new javafx.scene.paint.Color(0.7894737124443054, 0.08771929889917374, 0.08771929889917374, 1); + controller.setColor(object26); + object25.setValue(object26); + final var object27 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object25.setOpaqueInsets(object27); + final var object28 = new javafx.scene.control.ComboBox(); + controller.setComboBox(object28); + object28.setEditable(true); + object28.setPrefWidth(150.0); + object28.setPromptText("Text"); + object28.setVisibleRowCount(5); + javafx.scene.layout.GridPane.setRowIndex(object28, 2); + final var object29 = javafx.scene.Cursor.CLOSED_HAND; + object28.setCursor(object29); + final var object30 = new javafx.scene.effect.Bloom(); + object28.setEffect(object30); + final var object31 = new javafx.scene.control.DatePicker(); + controller.setDatePicker(object31); + object31.setShowWeekNumbers(true); + object31.setStyle("-fx-background-color: #ffffff;"); + javafx.scene.layout.GridPane.setColumnIndex(object31, 1); + javafx.scene.layout.GridPane.setRowIndex(object31, 2); + final var object32 = new javafx.scene.web.HTMLEditor(); + controller.setHtmlEditor(object32); + object32.setHtmlText(""); + object32.setPrefHeight(200.0); + object32.setPrefWidth(506.0); + object32.getStyleClass().addAll("clazz"); + object32.getStylesheets().addAll("@style.css"); + javafx.scene.layout.GridPane.setRowIndex(object32, 3); + final var object33 = new javafx.scene.control.Hyperlink(); + controller.setHyperlink(object33); + object33.setText("Hyperlink"); + javafx.scene.layout.GridPane.setColumnIndex(object33, 1); + javafx.scene.layout.GridPane.setRowIndex(object33, 3); + final var object34 = new javafx.scene.image.ImageView(); + controller.setImageView(object34); + object34.setFitHeight(150.0); + object34.setFitWidth(200.0); + object34.setPickOnBounds(true); + object34.setPreserveRatio(true); + javafx.scene.layout.GridPane.setRowIndex(object34, 4); + final var object35 = new javafx.scene.control.Label(); + controller.setLabel(object35); + object35.setAccessibleHelp("TTTTT"); + object35.setAccessibleText("TTT"); + object35.setBlendMode(javafx.scene.effect.BlendMode.ADD); + object35.setCache(true); + object35.setCacheHint(javafx.scene.CacheHint.QUALITY); + object35.setDepthTest(javafx.scene.DepthTest.ENABLE); + object35.setMnemonicParsing(true); + object35.setMouseTransparent(true); + object35.setText(controller.resources().getString("include.label")); + javafx.scene.layout.GridPane.setColumnIndex(object35, 1); + javafx.scene.layout.GridPane.setRowIndex(object35, 4); + final var object36 = new javafx.scene.control.ListView(); + controller.setListView(object36); + object36.setFixedCellSize(20.0); + object36.setNodeOrientation(javafx.geometry.NodeOrientation.RIGHT_TO_LEFT); + object36.setOrientation(javafx.geometry.Orientation.HORIZONTAL); + object36.setPrefHeight(200.0); + object36.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object36, 5); + final var object37 = new javafx.scene.media.MediaView(); + controller.setMediaView(object37); + object37.setFitHeight(200.0); + object37.setFitWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object37, 1); + javafx.scene.layout.GridPane.setColumnSpan(object37, 2); + javafx.scene.layout.GridPane.setRowIndex(object37, 5); + javafx.scene.layout.GridPane.setRowSpan(object37, 2); + final var object38 = new javafx.scene.control.MenuBar(); + controller.setMenuBar(object38); + javafx.scene.layout.GridPane.setHalignment(object38, javafx.geometry.HPos.RIGHT); + javafx.scene.layout.GridPane.setHgrow(object38, javafx.scene.layout.Priority.ALWAYS); + javafx.scene.layout.GridPane.setRowIndex(object38, 7); + javafx.scene.layout.GridPane.setValignment(object38, javafx.geometry.VPos.BASELINE); + javafx.scene.layout.GridPane.setVgrow(object38, javafx.scene.layout.Priority.SOMETIMES); + final var object39 = new javafx.scene.control.Menu(); + controller.setMenu1(object39); + object39.setMnemonicParsing(false); + object39.setText("File"); + final var object40 = new javafx.scene.control.MenuItem(); + controller.setMenuItem1(object40); + object40.setMnemonicParsing(false); + object40.setText("Close"); + object39.getItems().addAll(object40); + final var object41 = new javafx.scene.control.Menu(); + object41.setMnemonicParsing(false); + object41.setText("Edit"); + final var object42 = new javafx.scene.control.MenuItem(); + object42.setMnemonicParsing(false); + object42.setText("Delete"); + object41.getItems().addAll(object42); + final var object43 = new javafx.scene.control.Menu(); + object43.setMnemonicParsing(false); + object43.setText("Help"); + final var object44 = new javafx.scene.control.MenuItem(); + object44.setMnemonicParsing(false); + object44.setText("About"); + object43.getItems().addAll(object44); + object38.getMenus().addAll(object39, object41, object43); + final var object45 = new javafx.scene.control.MenuButton(); + controller.setMenuButton(object45); + object45.setMnemonicParsing(false); + object45.setText("MenuButton"); + javafx.scene.layout.GridPane.setColumnIndex(object45, 1); + javafx.scene.layout.GridPane.setRowIndex(object45, 7); + final var object46 = new javafx.scene.control.MenuItem(); + object46.setMnemonicParsing(false); + object46.setText("Action 1"); + final var object47 = new javafx.scene.control.MenuItem(); + object47.setMnemonicParsing(false); + object47.setText("Action 2"); + object45.getItems().addAll(object46, object47); + final var object48 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + javafx.scene.layout.GridPane.setMargin(object45, object48); + final var object49 = new javafx.scene.control.Pagination(); + controller.setPagination(object49); + object49.setPrefHeight(200.0); + object49.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object49, 8); + final var object50 = new javafx.geometry.Insets(5.0, 4.0, 3.0, 2.0); + object49.setPadding(object50); + final var object51 = new javafx.scene.control.PasswordField(); + controller.setPasswordField(object51); + object51.setMaxHeight(6.0); + object51.setMaxWidth(5.0); + object51.setMinHeight(2.0); + object51.setMinWidth(1.0); + object51.setPrefColumnCount(7); + object51.setPrefHeight(4.0); + object51.setPrefWidth(3.0); + javafx.scene.layout.GridPane.setColumnIndex(object51, 1); + javafx.scene.layout.GridPane.setRowIndex(object51, 8); + final var object52 = new javafx.scene.control.ProgressBar(); + controller.setProgressBar(object52); + object52.setLayoutX(10.0); + object52.setLayoutY(20.0); + object52.setPrefWidth(200.0); + object52.setProgress(0.0); + javafx.scene.layout.GridPane.setRowIndex(object52, 9); + final var object53 = new javafx.scene.control.ProgressIndicator(); + controller.setProgressIndicator(object53); + object53.setProgress(0.0); + object53.setRotate(2.0); + javafx.scene.layout.GridPane.setColumnIndex(object53, 1); + javafx.scene.layout.GridPane.setRowIndex(object53, 9); + final var object54 = new javafx.geometry.Point3D(4.0, 5.0, 6.0); + object53.setRotationAxis(object54); + final var object55 = new javafx.scene.control.RadioButton(); + controller.setRadioButton(object55); + object55.setMnemonicParsing(false); + object55.setScaleX(7.0); + object55.setScaleY(2.0); + object55.setScaleZ(3.0); + object55.setText("RadioButton"); + object55.setTranslateX(4.0); + object55.setTranslateY(5.0); + object55.setTranslateZ(6.0); + javafx.scene.layout.GridPane.setRowIndex(object55, 10); + final var object56 = new javafx.scene.control.ScrollBar(); + controller.setScrollBarH(object56); + javafx.scene.layout.GridPane.setColumnIndex(object56, 1); + javafx.scene.layout.GridPane.setRowIndex(object56, 10); + final var object57 = new javafx.scene.control.ScrollBar(); + controller.setScrollBarV(object57); + object57.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object57, 11); + final var object58 = new javafx.scene.control.Separator(); + controller.setSeparatorH(object58); + object58.setOnDragDetected(e -> callMethod("dragDetected", e)); + object58.setOnDragDone(e -> callMethod("dragDone", e)); + object58.setOnDragDropped(e -> callMethod("dragDropped", e)); + object58.setOnDragEntered(e -> callMethod("dragEntered", e)); + object58.setOnDragExited(e -> callMethod("dragExited", e)); + object58.setOnDragOver(e -> callMethod("dragOver", e)); + object58.setOnMouseDragEntered(e -> callMethod("mouseDragEntered", e)); + object58.setOnMouseDragExited(e -> callMethod("mouseDragExited", e)); + object58.setOnMouseDragOver(e -> callMethod("mouseDragOver", e)); + object58.setOnMouseDragReleased(e -> callMethod("mouseDragReleased", e)); + object58.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object58, 1); + javafx.scene.layout.GridPane.setRowIndex(object58, 11); + final var object59 = new javafx.scene.control.Separator(); + controller.setSeparatorV(object59); + object59.setOrientation(javafx.geometry.Orientation.VERTICAL); + object59.setPrefHeight(200.0); + javafx.scene.layout.GridPane.setRowIndex(object59, 12); + final var object60 = new javafx.scene.control.Slider(); + controller.setSliderH(object60); + object60.setOnContextMenuRequested(e -> callMethod("contextMenuRequested", e)); + object60.setOnMouseClicked(e -> callMethod("mouseClicked", e)); + object60.setOnMouseDragged(e -> callMethod("mouseDragged", e)); + object60.setOnMouseEntered(e -> callMethod("mouseEntered", e)); + object60.setOnMouseExited(e -> callMethod("mouseExited", e)); + object60.setOnMouseMoved(e -> callMethod("mouseMoved", e)); + object60.setOnMousePressed(e -> callMethod("mousePressed", e)); + object60.setOnMouseReleased(e -> callMethod("mouseReleased", e)); + object60.setOnScroll(e -> callMethod("onScroll", e)); + object60.setOnScrollFinished(e -> callMethod("onScrollFinished", e)); + object60.setOnScrollStarted(e -> callMethod("onScrollStarted", e)); + javafx.scene.layout.GridPane.setColumnIndex(object60, 1); + javafx.scene.layout.GridPane.setRowIndex(object60, 12); + final var object61 = new javafx.scene.control.Slider(); + controller.setSliderV(object61); + object61.setOnZoom(e -> callMethod("onZoom", e)); + object61.setOnZoomFinished(e -> callMethod("onZoomFinished", e)); + object61.setOnZoomStarted(e -> callMethod("onZoomStarted", e)); + object61.setOrientation(javafx.geometry.Orientation.VERTICAL); + javafx.scene.layout.GridPane.setRowIndex(object61, 13); + final var object62 = new javafx.scene.control.Spinner(); + controller.setSpinner(object62); + javafx.scene.layout.GridPane.setColumnIndex(object62, 1); + javafx.scene.layout.GridPane.setRowIndex(object62, 13); + final var object63 = new javafx.scene.control.SplitMenuButton(); + controller.setSplitMenuButton(object63); + object63.setMnemonicParsing(false); + object63.setText("SplitMenuButton"); + javafx.scene.layout.GridPane.setRowIndex(object63, 14); + final var object64 = new javafx.scene.control.MenuItem(); + controller.setItem1(object64); + object64.setMnemonicParsing(false); + object64.setText("Action 1"); + final var object65 = new javafx.scene.control.MenuItem(); + controller.setItem2(object65); + object65.setMnemonicParsing(false); + object65.setText("Action 2"); + object63.getItems().addAll(object64, object65); + final var object66 = new javafx.scene.control.TableView(); + controller.setTableView(object66); + object66.setPrefHeight(200.0); + object66.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object66, 1); + javafx.scene.layout.GridPane.setRowIndex(object66, 14); + final var object67 = new javafx.scene.control.TableColumn(); + controller.setTableColumn1(object67); + object67.setPrefWidth(75.0); + object67.setText("C1"); + final var object68 = new javafx.scene.control.TableColumn(); + controller.setTableColumn2(object68); + object68.setPrefWidth(75.0); + object68.setText("C2"); + object66.getColumns().addAll(object67, object68); + final var object69 = new javafx.scene.control.TextArea(); + controller.setTextArea(object69); + object69.setPrefHeight(200.0); + object69.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object69, 15); + final var object70 = new javafx.scene.control.TextField(); + controller.setTextField(object70); + javafx.scene.layout.GridPane.setColumnIndex(object70, 1); + javafx.scene.layout.GridPane.setRowIndex(object70, 15); + final var object71 = new javafx.scene.control.ToggleButton(); + object71.setMnemonicParsing(false); + object71.setOnAction(e -> callMethod("onAction", e)); + object71.setOnRotate(e -> callMethod("onRotate", e)); + object71.setOnRotationFinished(e -> callMethod("onRotationFinished", e)); + object71.setOnRotationStarted(e -> callMethod("onRotationStarted", e)); + object71.setText("ToggleButton"); + javafx.scene.layout.GridPane.setRowIndex(object71, 16); + final var object72 = new javafx.scene.control.TreeTableView>(); + controller.setTreeTableView(object72); + object72.setPrefHeight(200.0); + object72.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object72, 1); + javafx.scene.layout.GridPane.setRowIndex(object72, 16); + final var object73 = new javafx.scene.control.TreeTableColumn, String>(); + controller.setTreeTableColumn1(object73); + object73.setOnEditCancel(e -> callMethod("onEditCancel", e)); + object73.setOnEditCommit(e -> callMethod("onEditCommit", e)); + object73.setOnEditStart(e -> callMethod("onEditStart", e)); + object73.setPrefWidth(75.0); + object73.setText("C1"); + final var object74 = new javafx.scene.control.TreeTableColumn, Integer>(); + controller.setTreeTableColumn2(object74); + object74.setPrefWidth(75.0); + object74.setSortType(javafx.scene.control.TreeTableColumn.SortType.DESCENDING); + object74.setText("C2"); + object72.getColumns().addAll(object73, object74); + final var object75 = new javafx.scene.control.TreeView(); + controller.setTreeView(object75); + object75.setOnSwipeDown(e -> callMethod("onSwipeDown", e)); + object75.setOnSwipeLeft(e -> callMethod("onSwipeLeft", e)); + object75.setOnSwipeRight(e -> callMethod("onSwipeRight", e)); + object75.setOnSwipeUp(e -> callMethod("onSwipeUp", e)); + object75.setPrefHeight(200.0); + object75.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setRowIndex(object75, 17); + final var object76 = new javafx.scene.web.WebView(); + controller.setWebView(object76); + object76.setOnTouchMoved(e -> callMethod("onTouchMoved", e)); + object76.setOnTouchPressed(e -> callMethod("onTouchPressed", e)); + object76.setOnTouchReleased(e -> callMethod("onTouchReleased", e)); + object76.setOnTouchStationary(e -> callMethod("onTouchStationary", e)); + object76.setPrefHeight(200.0); + object76.setPrefWidth(200.0); + javafx.scene.layout.GridPane.setColumnIndex(object76, 1); + javafx.scene.layout.GridPane.setRowIndex(object76, 17); + object0.getChildren().addAll(object22, object23, object24, object25, object28, object31, object32, object33, object34, object35, object36, object37, object38, object45, object49, object51, object52, object53, object55, object56, object57, object58, object59, object60, object61, object62, object63, object66, object69, object70, object71, object72, object75, object76); + try { + final var initialize = controller.getClass().getDeclaredMethod("initialize"); + initialize.setAccessible(true); + initialize.invoke(controller); + } catch (final InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection", e); + } catch (final NoSuchMethodException ignored) { + } + loaded = true; + return object0; +} + + private void callMethod(final String methodName, final T event) { + try { + final Method method; + final var methods = Arrays.stream(controller.getClass().getDeclaredMethods()) + .filter(m -> m.getName().equals(methodName)).toList(); + if (methods.size() > 1) { + final var eventMethods = methods.stream().filter(m -> + m.getParameterCount() == 1 && Event.class.isAssignableFrom(m.getParameterTypes()[0])).toList(); + if (eventMethods.size() == 1) { + method = eventMethods.getFirst(); + } else { + final var emptyMethods = methods.stream().filter(m -> m.getParameterCount() == 0).toList(); + if (emptyMethods.size() == 1) { + method = emptyMethods.getFirst(); + } else { + throw new IllegalArgumentException("Multiple matching methods for " + methodName); + } + } + } else if (methods.size() == 1) { + method = methods.getFirst(); + } else { + throw new IllegalArgumentException("No matching method for " + methodName); + } + method.setAccessible(true); + if (method.getParameterCount() == 0) { + method.invoke(controller); + } else { + method.invoke(controller, event); + } + } catch (final IllegalAccessException | InvocationTargetException ex) { + throw new RuntimeException("Error using reflection on " + methodName, ex); + } +} + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.ControlsController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-assign-reference-constructor.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-assign-reference-constructor.txt new file mode 100644 index 0000000..8b34ae9 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-assign-reference-constructor.txt @@ -0,0 +1,182 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; + + +/** + * Generated code, not thread-safe + */ +public final class IncludesController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.IncludesController controller; + + /** + * Instantiates a new IncludesController with no nested controllers and no resource bundle + * @param controller The controller + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of()); + } + + /** + * Instantiates a new IncludesController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, resourceBundle)); + } + + /** + * Instantiates a new IncludesController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public IncludesController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = resourceBundlesMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + controller = (com.github.gtache.fxml.compiler.impl.IncludesController) controllersMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + final var object0 = new javafx.scene.layout.BorderPane(); + final var object1 = new javafx.scene.layout.VBox(); + javafx.scene.layout.BorderPane.setAlignment(object1, javafx.geometry.Pos.CENTER); + final var object2 = new javafx.scene.layout.HBox(); + object2.setAlignment(javafx.geometry.Pos.CENTER); + object2.setSpacing(10.0); + final var object3 = new javafx.scene.control.Slider(); + controller.playSlider = object3; + javafx.scene.layout.HBox.setHgrow(object3, javafx.scene.layout.Priority.ALWAYS); + final var object4 = new javafx.geometry.Insets(0, 0, 0, 10.0); + object3.setPadding(object4); + final var object5 = new javafx.scene.control.Label(); + controller.playLabel = object5; + object5.setText("Label"); + final var object6 = new javafx.geometry.Insets(0, 10.0, 0, 0); + object5.setPadding(object6); + object2.getChildren().addAll(object3, object5); + final var object7 = new javafx.geometry.Insets(10.0, 0, 0, 0); + object2.setPadding(object7); + final var object8 = new javafx.scene.layout.HBox(); + object8.setAlignment(javafx.geometry.Pos.CENTER); + object8.setSpacing(10.0); + final var object9 = new javafx.scene.control.Button(); + controller.playButton = object9; + object9.setMnemonicParsing(false); + object9.setOnAction(controller::playPressed); + final var object10 = new javafx.geometry.Insets(0, 20.0, 0, 0); + javafx.scene.layout.HBox.setMargin(object9, object10); + final var object11 = new javafx.scene.control.Label(); + object11.setText(bundle.getString("media.volume.label")); + final var object12 = new javafx.scene.control.Slider(); + controller.volumeSlider = object12; + object12.setValue(100); + final var object13 = new javafx.scene.control.Label(); + controller.volumeValueLabel = object13; + object13.setText("Label"); + final var map0 = new HashMap<>(resourceBundlesMap); + final var bundle0 = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + map0.put(com.github.gtache.fxml.compiler.impl.ControlsController, bundle0); + final var view0 = new com.github.gtache.fxml.compiler.impl.ControlsView(controllersMap, map0); + final var object14 = view0.load(); + final var controller0 = view0.controller(); + controller.controlsController = controller0; + object8.getChildren().addAll(object9, object11, object12, object13, object14); + final var object15 = new javafx.geometry.Insets(10.0, 10.0, 10.0, 10.0); + object8.setPadding(object15); + object1.getChildren().addAll(object2, object8); + object0.setBottom(object1); + final var object16 = new javafx.scene.layout.VBox(); + controller.vbox = object16; + final var object17 = new javafx.scene.control.ToolBar(); + controller.toolBar = object17; + final var object18 = new javafx.scene.control.TitledPane(); + controller.titledPane = object18; + final var object19 = new javafx.scene.layout.TilePane(); + controller.tilePane = object19; + final var object20 = new javafx.scene.text.TextFlow(); + controller.textFlow = object20; + final var object21 = new javafx.scene.control.TabPane(); + controller.tabPane = object21; + final var object22 = new javafx.scene.control.Tab(); + controller.tab = object22; + final var object23 = new javafx.scene.layout.StackPane(); + controller.stackPane = object23; + final var object24 = new javafx.scene.control.SplitPane(); + controller.splitPane = object24; + final var object25 = new javafx.scene.control.ScrollPane(); + controller.scrollPane = object25; + final var object26 = new javafx.scene.layout.Pane(); + controller.pane = object26; + final var object27 = new javafx.scene.layout.HBox(); + controller.hbox = object27; + final var object28 = new javafx.scene.Group(); + controller.group = object28; + final var object29 = new javafx.scene.layout.GridPane(); + controller.gridPane = object29; + final var object30 = new javafx.scene.layout.ColumnConstraints(); + controller.columnConstraints = object30; + object30.setHgrow(javafx.scene.layout.Priority.SOMETIMES); + object30.setMinWidth(10.0); + object29.getColumnConstraints().addAll(object30); + final var object31 = new javafx.scene.layout.RowConstraints(); + object31.setMinHeight(10.0); + object31.setVgrow(javafx.scene.layout.Priority.SOMETIMES); + object29.getRowConstraints().addAll(object31); + final var object32 = new javafx.scene.layout.FlowPane(); + controller.flowPane = object32; + final var object33 = new javafx.scene.control.DialogPane(); + controller.dialogPane = object33; + final var object34 = new javafx.scene.control.ButtonBar(); + controller.buttonBar = object34; + final var object35 = new javafx.scene.layout.AnchorPane(); + controller.anchorPane = object35; + final var object36 = new javafx.scene.control.Label(); + object36.setManaged(false); + object35.getChildren().addAll(object36); + object34.getButtons().addAll(object35); + object33.setContent(object34); + object32.getChildren().addAll(object33); + object29.getChildren().addAll(object32); + object28.getChildren().addAll(object29); + object27.getChildren().addAll(object28); + object26.getChildren().addAll(object27); + object25.setContent(object26); + object24.getItems().addAll(object25); + object23.getChildren().addAll(object24); + object22.setContent(object23); + object21.getTabs().addAll(object22); + object20.getChildren().addAll(object21); + object19.getChildren().addAll(object20); + object18.setContent(object19); + object17.getItems().addAll(object18); + object16.getChildren().addAll(object17); + object0.setCenter(object16); + controller.initialize(); + loaded = true; + return object0; +} + + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.IncludesController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-assign-reference-getbundle.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-assign-reference-getbundle.txt new file mode 100644 index 0000000..ed4d62d --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-assign-reference-getbundle.txt @@ -0,0 +1,182 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; + + +/** + * Generated code, not thread-safe + */ +public final class IncludesController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.IncludesController controller; + + /** + * Instantiates a new IncludesController with no nested controllers and no resource bundle + * @param controller The controller + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of()); + } + + /** + * Instantiates a new IncludesController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, resourceBundle)); + } + + /** + * Instantiates a new IncludesController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public IncludesController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.IncludesBundle"); + controller = (com.github.gtache.fxml.compiler.impl.IncludesController) controllersMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + final var object0 = new javafx.scene.layout.BorderPane(); + final var object1 = new javafx.scene.layout.VBox(); + javafx.scene.layout.BorderPane.setAlignment(object1, javafx.geometry.Pos.CENTER); + final var object2 = new javafx.scene.layout.HBox(); + object2.setAlignment(javafx.geometry.Pos.CENTER); + object2.setSpacing(10.0); + final var object3 = new javafx.scene.control.Slider(); + controller.playSlider = object3; + javafx.scene.layout.HBox.setHgrow(object3, javafx.scene.layout.Priority.ALWAYS); + final var object4 = new javafx.geometry.Insets(0, 0, 0, 10.0); + object3.setPadding(object4); + final var object5 = new javafx.scene.control.Label(); + controller.playLabel = object5; + object5.setText("Label"); + final var object6 = new javafx.geometry.Insets(0, 10.0, 0, 0); + object5.setPadding(object6); + object2.getChildren().addAll(object3, object5); + final var object7 = new javafx.geometry.Insets(10.0, 0, 0, 0); + object2.setPadding(object7); + final var object8 = new javafx.scene.layout.HBox(); + object8.setAlignment(javafx.geometry.Pos.CENTER); + object8.setSpacing(10.0); + final var object9 = new javafx.scene.control.Button(); + controller.playButton = object9; + object9.setMnemonicParsing(false); + object9.setOnAction(controller::playPressed); + final var object10 = new javafx.geometry.Insets(0, 20.0, 0, 0); + javafx.scene.layout.HBox.setMargin(object9, object10); + final var object11 = new javafx.scene.control.Label(); + object11.setText(bundle.getString("media.volume.label")); + final var object12 = new javafx.scene.control.Slider(); + controller.volumeSlider = object12; + object12.setValue(100); + final var object13 = new javafx.scene.control.Label(); + controller.volumeValueLabel = object13; + object13.setText("Label"); + final var map0 = new HashMap<>(resourceBundlesMap); + final var bundle0 = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + map0.put(com.github.gtache.fxml.compiler.impl.ControlsController, bundle0); + final var view0 = new com.github.gtache.fxml.compiler.impl.ControlsView(controllersMap, map0); + final var object14 = view0.load(); + final var controller0 = view0.controller(); + controller.controlsController = controller0; + object8.getChildren().addAll(object9, object11, object12, object13, object14); + final var object15 = new javafx.geometry.Insets(10.0, 10.0, 10.0, 10.0); + object8.setPadding(object15); + object1.getChildren().addAll(object2, object8); + object0.setBottom(object1); + final var object16 = new javafx.scene.layout.VBox(); + controller.vbox = object16; + final var object17 = new javafx.scene.control.ToolBar(); + controller.toolBar = object17; + final var object18 = new javafx.scene.control.TitledPane(); + controller.titledPane = object18; + final var object19 = new javafx.scene.layout.TilePane(); + controller.tilePane = object19; + final var object20 = new javafx.scene.text.TextFlow(); + controller.textFlow = object20; + final var object21 = new javafx.scene.control.TabPane(); + controller.tabPane = object21; + final var object22 = new javafx.scene.control.Tab(); + controller.tab = object22; + final var object23 = new javafx.scene.layout.StackPane(); + controller.stackPane = object23; + final var object24 = new javafx.scene.control.SplitPane(); + controller.splitPane = object24; + final var object25 = new javafx.scene.control.ScrollPane(); + controller.scrollPane = object25; + final var object26 = new javafx.scene.layout.Pane(); + controller.pane = object26; + final var object27 = new javafx.scene.layout.HBox(); + controller.hbox = object27; + final var object28 = new javafx.scene.Group(); + controller.group = object28; + final var object29 = new javafx.scene.layout.GridPane(); + controller.gridPane = object29; + final var object30 = new javafx.scene.layout.ColumnConstraints(); + controller.columnConstraints = object30; + object30.setHgrow(javafx.scene.layout.Priority.SOMETIMES); + object30.setMinWidth(10.0); + object29.getColumnConstraints().addAll(object30); + final var object31 = new javafx.scene.layout.RowConstraints(); + object31.setMinHeight(10.0); + object31.setVgrow(javafx.scene.layout.Priority.SOMETIMES); + object29.getRowConstraints().addAll(object31); + final var object32 = new javafx.scene.layout.FlowPane(); + controller.flowPane = object32; + final var object33 = new javafx.scene.control.DialogPane(); + controller.dialogPane = object33; + final var object34 = new javafx.scene.control.ButtonBar(); + controller.buttonBar = object34; + final var object35 = new javafx.scene.layout.AnchorPane(); + controller.anchorPane = object35; + final var object36 = new javafx.scene.control.Label(); + object36.setManaged(false); + object35.getChildren().addAll(object36); + object34.getButtons().addAll(object35); + object33.setContent(object34); + object32.getChildren().addAll(object33); + object29.getChildren().addAll(object32); + object28.getChildren().addAll(object29); + object27.getChildren().addAll(object28); + object26.getChildren().addAll(object27); + object25.setContent(object26); + object24.getItems().addAll(object25); + object23.getChildren().addAll(object24); + object22.setContent(object23); + object21.getTabs().addAll(object22); + object20.getChildren().addAll(object21); + object19.getChildren().addAll(object20); + object18.setContent(object19); + object17.getItems().addAll(object18); + object16.getChildren().addAll(object17); + object0.setCenter(object16); + controller.initialize(); + loaded = true; + return object0; +} + + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.IncludesController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-assign-reference-getter.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-assign-reference-getter.txt new file mode 100644 index 0000000..3eb58a1 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-assign-reference-getter.txt @@ -0,0 +1,181 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; + + +/** + * Generated code, not thread-safe + */ +public final class IncludesController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.IncludesController controller; + + /** + * Instantiates a new IncludesController with no nested controllers and no resource bundle + * @param controller The controller + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of()); + } + + /** + * Instantiates a new IncludesController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, resourceBundle)); + } + + /** + * Instantiates a new IncludesController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public IncludesController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + controller = (com.github.gtache.fxml.compiler.impl.IncludesController) controllersMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + final var object0 = new javafx.scene.layout.BorderPane(); + final var object1 = new javafx.scene.layout.VBox(); + javafx.scene.layout.BorderPane.setAlignment(object1, javafx.geometry.Pos.CENTER); + final var object2 = new javafx.scene.layout.HBox(); + object2.setAlignment(javafx.geometry.Pos.CENTER); + object2.setSpacing(10.0); + final var object3 = new javafx.scene.control.Slider(); + controller.playSlider = object3; + javafx.scene.layout.HBox.setHgrow(object3, javafx.scene.layout.Priority.ALWAYS); + final var object4 = new javafx.geometry.Insets(0, 0, 0, 10.0); + object3.setPadding(object4); + final var object5 = new javafx.scene.control.Label(); + controller.playLabel = object5; + object5.setText("Label"); + final var object6 = new javafx.geometry.Insets(0, 10.0, 0, 0); + object5.setPadding(object6); + object2.getChildren().addAll(object3, object5); + final var object7 = new javafx.geometry.Insets(10.0, 0, 0, 0); + object2.setPadding(object7); + final var object8 = new javafx.scene.layout.HBox(); + object8.setAlignment(javafx.geometry.Pos.CENTER); + object8.setSpacing(10.0); + final var object9 = new javafx.scene.control.Button(); + controller.playButton = object9; + object9.setMnemonicParsing(false); + object9.setOnAction(controller::playPressed); + final var object10 = new javafx.geometry.Insets(0, 20.0, 0, 0); + javafx.scene.layout.HBox.setMargin(object9, object10); + final var object11 = new javafx.scene.control.Label(); + object11.setText(controller.resources().getString("media.volume.label")); + final var object12 = new javafx.scene.control.Slider(); + controller.volumeSlider = object12; + object12.setValue(100); + final var object13 = new javafx.scene.control.Label(); + controller.volumeValueLabel = object13; + object13.setText("Label"); + final var map0 = new HashMap<>(resourceBundlesMap); + final var bundle0 = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + map0.put(com.github.gtache.fxml.compiler.impl.ControlsController, bundle0); + final var view0 = new com.github.gtache.fxml.compiler.impl.ControlsView(controllersMap, map0); + final var object14 = view0.load(); + final var controller0 = view0.controller(); + controller.controlsController = controller0; + object8.getChildren().addAll(object9, object11, object12, object13, object14); + final var object15 = new javafx.geometry.Insets(10.0, 10.0, 10.0, 10.0); + object8.setPadding(object15); + object1.getChildren().addAll(object2, object8); + object0.setBottom(object1); + final var object16 = new javafx.scene.layout.VBox(); + controller.vbox = object16; + final var object17 = new javafx.scene.control.ToolBar(); + controller.toolBar = object17; + final var object18 = new javafx.scene.control.TitledPane(); + controller.titledPane = object18; + final var object19 = new javafx.scene.layout.TilePane(); + controller.tilePane = object19; + final var object20 = new javafx.scene.text.TextFlow(); + controller.textFlow = object20; + final var object21 = new javafx.scene.control.TabPane(); + controller.tabPane = object21; + final var object22 = new javafx.scene.control.Tab(); + controller.tab = object22; + final var object23 = new javafx.scene.layout.StackPane(); + controller.stackPane = object23; + final var object24 = new javafx.scene.control.SplitPane(); + controller.splitPane = object24; + final var object25 = new javafx.scene.control.ScrollPane(); + controller.scrollPane = object25; + final var object26 = new javafx.scene.layout.Pane(); + controller.pane = object26; + final var object27 = new javafx.scene.layout.HBox(); + controller.hbox = object27; + final var object28 = new javafx.scene.Group(); + controller.group = object28; + final var object29 = new javafx.scene.layout.GridPane(); + controller.gridPane = object29; + final var object30 = new javafx.scene.layout.ColumnConstraints(); + controller.columnConstraints = object30; + object30.setHgrow(javafx.scene.layout.Priority.SOMETIMES); + object30.setMinWidth(10.0); + object29.getColumnConstraints().addAll(object30); + final var object31 = new javafx.scene.layout.RowConstraints(); + object31.setMinHeight(10.0); + object31.setVgrow(javafx.scene.layout.Priority.SOMETIMES); + object29.getRowConstraints().addAll(object31); + final var object32 = new javafx.scene.layout.FlowPane(); + controller.flowPane = object32; + final var object33 = new javafx.scene.control.DialogPane(); + controller.dialogPane = object33; + final var object34 = new javafx.scene.control.ButtonBar(); + controller.buttonBar = object34; + final var object35 = new javafx.scene.layout.AnchorPane(); + controller.anchorPane = object35; + final var object36 = new javafx.scene.control.Label(); + object36.setManaged(false); + object35.getChildren().addAll(object36); + object34.getButtons().addAll(object35); + object33.setContent(object34); + object32.getChildren().addAll(object33); + object29.getChildren().addAll(object32); + object28.getChildren().addAll(object29); + object27.getChildren().addAll(object28); + object26.getChildren().addAll(object27); + object25.setContent(object26); + object24.getItems().addAll(object25); + object23.getChildren().addAll(object24); + object22.setContent(object23); + object21.getTabs().addAll(object22); + object20.getChildren().addAll(object21); + object19.getChildren().addAll(object20); + object18.setContent(object19); + object17.getItems().addAll(object18); + object16.getChildren().addAll(object17); + object0.setCenter(object16); + controller.initialize(); + loaded = true; + return object0; +} + + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.IncludesController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-assign-reflection-constructor.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-assign-reflection-constructor.txt new file mode 100644 index 0000000..75e09b1 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-assign-reflection-constructor.txt @@ -0,0 +1,226 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import javafx.event.Event; +import java.lang.reflect.Method; + + +/** + * Generated code, not thread-safe + */ +public final class IncludesController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.IncludesController controller; + + /** + * Instantiates a new IncludesController with no nested controllers and no resource bundle + * @param controller The controller + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of()); + } + + /** + * Instantiates a new IncludesController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, resourceBundle)); + } + + /** + * Instantiates a new IncludesController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public IncludesController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = resourceBundlesMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + controller = (com.github.gtache.fxml.compiler.impl.IncludesController) controllersMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + final var object0 = new javafx.scene.layout.BorderPane(); + final var object1 = new javafx.scene.layout.VBox(); + javafx.scene.layout.BorderPane.setAlignment(object1, javafx.geometry.Pos.CENTER); + final var object2 = new javafx.scene.layout.HBox(); + object2.setAlignment(javafx.geometry.Pos.CENTER); + object2.setSpacing(10.0); + final var object3 = new javafx.scene.control.Slider(); + controller.playSlider = object3; + javafx.scene.layout.HBox.setHgrow(object3, javafx.scene.layout.Priority.ALWAYS); + final var object4 = new javafx.geometry.Insets(0, 0, 0, 10.0); + object3.setPadding(object4); + final var object5 = new javafx.scene.control.Label(); + controller.playLabel = object5; + object5.setText("Label"); + final var object6 = new javafx.geometry.Insets(0, 10.0, 0, 0); + object5.setPadding(object6); + object2.getChildren().addAll(object3, object5); + final var object7 = new javafx.geometry.Insets(10.0, 0, 0, 0); + object2.setPadding(object7); + final var object8 = new javafx.scene.layout.HBox(); + object8.setAlignment(javafx.geometry.Pos.CENTER); + object8.setSpacing(10.0); + final var object9 = new javafx.scene.control.Button(); + controller.playButton = object9; + object9.setMnemonicParsing(false); + object9.setOnAction(e -> callMethod("playPressed", e)); + final var object10 = new javafx.geometry.Insets(0, 20.0, 0, 0); + javafx.scene.layout.HBox.setMargin(object9, object10); + final var object11 = new javafx.scene.control.Label(); + object11.setText(bundle.getString("media.volume.label")); + final var object12 = new javafx.scene.control.Slider(); + controller.volumeSlider = object12; + object12.setValue(100); + final var object13 = new javafx.scene.control.Label(); + controller.volumeValueLabel = object13; + object13.setText("Label"); + final var map0 = new HashMap<>(resourceBundlesMap); + final var bundle0 = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + map0.put(com.github.gtache.fxml.compiler.impl.ControlsController, bundle0); + final var view0 = new com.github.gtache.fxml.compiler.impl.ControlsView(controllersMap, map0); + final var object14 = view0.load(); + final var controller0 = view0.controller(); + controller.controlsController = controller0; + object8.getChildren().addAll(object9, object11, object12, object13, object14); + final var object15 = new javafx.geometry.Insets(10.0, 10.0, 10.0, 10.0); + object8.setPadding(object15); + object1.getChildren().addAll(object2, object8); + object0.setBottom(object1); + final var object16 = new javafx.scene.layout.VBox(); + controller.vbox = object16; + final var object17 = new javafx.scene.control.ToolBar(); + controller.toolBar = object17; + final var object18 = new javafx.scene.control.TitledPane(); + controller.titledPane = object18; + final var object19 = new javafx.scene.layout.TilePane(); + controller.tilePane = object19; + final var object20 = new javafx.scene.text.TextFlow(); + controller.textFlow = object20; + final var object21 = new javafx.scene.control.TabPane(); + controller.tabPane = object21; + final var object22 = new javafx.scene.control.Tab(); + controller.tab = object22; + final var object23 = new javafx.scene.layout.StackPane(); + controller.stackPane = object23; + final var object24 = new javafx.scene.control.SplitPane(); + controller.splitPane = object24; + final var object25 = new javafx.scene.control.ScrollPane(); + controller.scrollPane = object25; + final var object26 = new javafx.scene.layout.Pane(); + controller.pane = object26; + final var object27 = new javafx.scene.layout.HBox(); + controller.hbox = object27; + final var object28 = new javafx.scene.Group(); + controller.group = object28; + final var object29 = new javafx.scene.layout.GridPane(); + controller.gridPane = object29; + final var object30 = new javafx.scene.layout.ColumnConstraints(); + controller.columnConstraints = object30; + object30.setHgrow(javafx.scene.layout.Priority.SOMETIMES); + object30.setMinWidth(10.0); + object29.getColumnConstraints().addAll(object30); + final var object31 = new javafx.scene.layout.RowConstraints(); + object31.setMinHeight(10.0); + object31.setVgrow(javafx.scene.layout.Priority.SOMETIMES); + object29.getRowConstraints().addAll(object31); + final var object32 = new javafx.scene.layout.FlowPane(); + controller.flowPane = object32; + final var object33 = new javafx.scene.control.DialogPane(); + controller.dialogPane = object33; + final var object34 = new javafx.scene.control.ButtonBar(); + controller.buttonBar = object34; + final var object35 = new javafx.scene.layout.AnchorPane(); + controller.anchorPane = object35; + final var object36 = new javafx.scene.control.Label(); + object36.setManaged(false); + object35.getChildren().addAll(object36); + object34.getButtons().addAll(object35); + object33.setContent(object34); + object32.getChildren().addAll(object33); + object29.getChildren().addAll(object32); + object28.getChildren().addAll(object29); + object27.getChildren().addAll(object28); + object26.getChildren().addAll(object27); + object25.setContent(object26); + object24.getItems().addAll(object25); + object23.getChildren().addAll(object24); + object22.setContent(object23); + object21.getTabs().addAll(object22); + object20.getChildren().addAll(object21); + object19.getChildren().addAll(object20); + object18.setContent(object19); + object17.getItems().addAll(object18); + object16.getChildren().addAll(object17); + object0.setCenter(object16); + try { + final var initialize = controller.getClass().getDeclaredMethod("initialize"); + initialize.setAccessible(true); + initialize.invoke(controller); + } catch (final InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection", e); + } catch (final NoSuchMethodException ignored) { + } + loaded = true; + return object0; +} + + private void callMethod(final String methodName, final T event) { + try { + final Method method; + final var methods = Arrays.stream(controller.getClass().getDeclaredMethods()) + .filter(m -> m.getName().equals(methodName)).toList(); + if (methods.size() > 1) { + final var eventMethods = methods.stream().filter(m -> + m.getParameterCount() == 1 && Event.class.isAssignableFrom(m.getParameterTypes()[0])).toList(); + if (eventMethods.size() == 1) { + method = eventMethods.getFirst(); + } else { + final var emptyMethods = methods.stream().filter(m -> m.getParameterCount() == 0).toList(); + if (emptyMethods.size() == 1) { + method = emptyMethods.getFirst(); + } else { + throw new IllegalArgumentException("Multiple matching methods for " + methodName); + } + } + } else if (methods.size() == 1) { + method = methods.getFirst(); + } else { + throw new IllegalArgumentException("No matching method for " + methodName); + } + method.setAccessible(true); + if (method.getParameterCount() == 0) { + method.invoke(controller); + } else { + method.invoke(controller, event); + } + } catch (final IllegalAccessException | InvocationTargetException ex) { + throw new RuntimeException("Error using reflection on " + methodName, ex); + } +} + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.IncludesController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-assign-reflection-getbundle.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-assign-reflection-getbundle.txt new file mode 100644 index 0000000..ae583fa --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-assign-reflection-getbundle.txt @@ -0,0 +1,226 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import javafx.event.Event; +import java.lang.reflect.Method; + + +/** + * Generated code, not thread-safe + */ +public final class IncludesController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.IncludesController controller; + + /** + * Instantiates a new IncludesController with no nested controllers and no resource bundle + * @param controller The controller + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of()); + } + + /** + * Instantiates a new IncludesController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, resourceBundle)); + } + + /** + * Instantiates a new IncludesController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public IncludesController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.IncludesBundle"); + controller = (com.github.gtache.fxml.compiler.impl.IncludesController) controllersMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + final var object0 = new javafx.scene.layout.BorderPane(); + final var object1 = new javafx.scene.layout.VBox(); + javafx.scene.layout.BorderPane.setAlignment(object1, javafx.geometry.Pos.CENTER); + final var object2 = new javafx.scene.layout.HBox(); + object2.setAlignment(javafx.geometry.Pos.CENTER); + object2.setSpacing(10.0); + final var object3 = new javafx.scene.control.Slider(); + controller.playSlider = object3; + javafx.scene.layout.HBox.setHgrow(object3, javafx.scene.layout.Priority.ALWAYS); + final var object4 = new javafx.geometry.Insets(0, 0, 0, 10.0); + object3.setPadding(object4); + final var object5 = new javafx.scene.control.Label(); + controller.playLabel = object5; + object5.setText("Label"); + final var object6 = new javafx.geometry.Insets(0, 10.0, 0, 0); + object5.setPadding(object6); + object2.getChildren().addAll(object3, object5); + final var object7 = new javafx.geometry.Insets(10.0, 0, 0, 0); + object2.setPadding(object7); + final var object8 = new javafx.scene.layout.HBox(); + object8.setAlignment(javafx.geometry.Pos.CENTER); + object8.setSpacing(10.0); + final var object9 = new javafx.scene.control.Button(); + controller.playButton = object9; + object9.setMnemonicParsing(false); + object9.setOnAction(e -> callMethod("playPressed", e)); + final var object10 = new javafx.geometry.Insets(0, 20.0, 0, 0); + javafx.scene.layout.HBox.setMargin(object9, object10); + final var object11 = new javafx.scene.control.Label(); + object11.setText(bundle.getString("media.volume.label")); + final var object12 = new javafx.scene.control.Slider(); + controller.volumeSlider = object12; + object12.setValue(100); + final var object13 = new javafx.scene.control.Label(); + controller.volumeValueLabel = object13; + object13.setText("Label"); + final var map0 = new HashMap<>(resourceBundlesMap); + final var bundle0 = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + map0.put(com.github.gtache.fxml.compiler.impl.ControlsController, bundle0); + final var view0 = new com.github.gtache.fxml.compiler.impl.ControlsView(controllersMap, map0); + final var object14 = view0.load(); + final var controller0 = view0.controller(); + controller.controlsController = controller0; + object8.getChildren().addAll(object9, object11, object12, object13, object14); + final var object15 = new javafx.geometry.Insets(10.0, 10.0, 10.0, 10.0); + object8.setPadding(object15); + object1.getChildren().addAll(object2, object8); + object0.setBottom(object1); + final var object16 = new javafx.scene.layout.VBox(); + controller.vbox = object16; + final var object17 = new javafx.scene.control.ToolBar(); + controller.toolBar = object17; + final var object18 = new javafx.scene.control.TitledPane(); + controller.titledPane = object18; + final var object19 = new javafx.scene.layout.TilePane(); + controller.tilePane = object19; + final var object20 = new javafx.scene.text.TextFlow(); + controller.textFlow = object20; + final var object21 = new javafx.scene.control.TabPane(); + controller.tabPane = object21; + final var object22 = new javafx.scene.control.Tab(); + controller.tab = object22; + final var object23 = new javafx.scene.layout.StackPane(); + controller.stackPane = object23; + final var object24 = new javafx.scene.control.SplitPane(); + controller.splitPane = object24; + final var object25 = new javafx.scene.control.ScrollPane(); + controller.scrollPane = object25; + final var object26 = new javafx.scene.layout.Pane(); + controller.pane = object26; + final var object27 = new javafx.scene.layout.HBox(); + controller.hbox = object27; + final var object28 = new javafx.scene.Group(); + controller.group = object28; + final var object29 = new javafx.scene.layout.GridPane(); + controller.gridPane = object29; + final var object30 = new javafx.scene.layout.ColumnConstraints(); + controller.columnConstraints = object30; + object30.setHgrow(javafx.scene.layout.Priority.SOMETIMES); + object30.setMinWidth(10.0); + object29.getColumnConstraints().addAll(object30); + final var object31 = new javafx.scene.layout.RowConstraints(); + object31.setMinHeight(10.0); + object31.setVgrow(javafx.scene.layout.Priority.SOMETIMES); + object29.getRowConstraints().addAll(object31); + final var object32 = new javafx.scene.layout.FlowPane(); + controller.flowPane = object32; + final var object33 = new javafx.scene.control.DialogPane(); + controller.dialogPane = object33; + final var object34 = new javafx.scene.control.ButtonBar(); + controller.buttonBar = object34; + final var object35 = new javafx.scene.layout.AnchorPane(); + controller.anchorPane = object35; + final var object36 = new javafx.scene.control.Label(); + object36.setManaged(false); + object35.getChildren().addAll(object36); + object34.getButtons().addAll(object35); + object33.setContent(object34); + object32.getChildren().addAll(object33); + object29.getChildren().addAll(object32); + object28.getChildren().addAll(object29); + object27.getChildren().addAll(object28); + object26.getChildren().addAll(object27); + object25.setContent(object26); + object24.getItems().addAll(object25); + object23.getChildren().addAll(object24); + object22.setContent(object23); + object21.getTabs().addAll(object22); + object20.getChildren().addAll(object21); + object19.getChildren().addAll(object20); + object18.setContent(object19); + object17.getItems().addAll(object18); + object16.getChildren().addAll(object17); + object0.setCenter(object16); + try { + final var initialize = controller.getClass().getDeclaredMethod("initialize"); + initialize.setAccessible(true); + initialize.invoke(controller); + } catch (final InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection", e); + } catch (final NoSuchMethodException ignored) { + } + loaded = true; + return object0; +} + + private void callMethod(final String methodName, final T event) { + try { + final Method method; + final var methods = Arrays.stream(controller.getClass().getDeclaredMethods()) + .filter(m -> m.getName().equals(methodName)).toList(); + if (methods.size() > 1) { + final var eventMethods = methods.stream().filter(m -> + m.getParameterCount() == 1 && Event.class.isAssignableFrom(m.getParameterTypes()[0])).toList(); + if (eventMethods.size() == 1) { + method = eventMethods.getFirst(); + } else { + final var emptyMethods = methods.stream().filter(m -> m.getParameterCount() == 0).toList(); + if (emptyMethods.size() == 1) { + method = emptyMethods.getFirst(); + } else { + throw new IllegalArgumentException("Multiple matching methods for " + methodName); + } + } + } else if (methods.size() == 1) { + method = methods.getFirst(); + } else { + throw new IllegalArgumentException("No matching method for " + methodName); + } + method.setAccessible(true); + if (method.getParameterCount() == 0) { + method.invoke(controller); + } else { + method.invoke(controller, event); + } + } catch (final IllegalAccessException | InvocationTargetException ex) { + throw new RuntimeException("Error using reflection on " + methodName, ex); + } +} + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.IncludesController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-assign-reflection-getter.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-assign-reflection-getter.txt new file mode 100644 index 0000000..75fb01d --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-assign-reflection-getter.txt @@ -0,0 +1,225 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import javafx.event.Event; +import java.lang.reflect.Method; + + +/** + * Generated code, not thread-safe + */ +public final class IncludesController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.IncludesController controller; + + /** + * Instantiates a new IncludesController with no nested controllers and no resource bundle + * @param controller The controller + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of()); + } + + /** + * Instantiates a new IncludesController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, resourceBundle)); + } + + /** + * Instantiates a new IncludesController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public IncludesController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + controller = (com.github.gtache.fxml.compiler.impl.IncludesController) controllersMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + final var object0 = new javafx.scene.layout.BorderPane(); + final var object1 = new javafx.scene.layout.VBox(); + javafx.scene.layout.BorderPane.setAlignment(object1, javafx.geometry.Pos.CENTER); + final var object2 = new javafx.scene.layout.HBox(); + object2.setAlignment(javafx.geometry.Pos.CENTER); + object2.setSpacing(10.0); + final var object3 = new javafx.scene.control.Slider(); + controller.playSlider = object3; + javafx.scene.layout.HBox.setHgrow(object3, javafx.scene.layout.Priority.ALWAYS); + final var object4 = new javafx.geometry.Insets(0, 0, 0, 10.0); + object3.setPadding(object4); + final var object5 = new javafx.scene.control.Label(); + controller.playLabel = object5; + object5.setText("Label"); + final var object6 = new javafx.geometry.Insets(0, 10.0, 0, 0); + object5.setPadding(object6); + object2.getChildren().addAll(object3, object5); + final var object7 = new javafx.geometry.Insets(10.0, 0, 0, 0); + object2.setPadding(object7); + final var object8 = new javafx.scene.layout.HBox(); + object8.setAlignment(javafx.geometry.Pos.CENTER); + object8.setSpacing(10.0); + final var object9 = new javafx.scene.control.Button(); + controller.playButton = object9; + object9.setMnemonicParsing(false); + object9.setOnAction(e -> callMethod("playPressed", e)); + final var object10 = new javafx.geometry.Insets(0, 20.0, 0, 0); + javafx.scene.layout.HBox.setMargin(object9, object10); + final var object11 = new javafx.scene.control.Label(); + object11.setText(controller.resources().getString("media.volume.label")); + final var object12 = new javafx.scene.control.Slider(); + controller.volumeSlider = object12; + object12.setValue(100); + final var object13 = new javafx.scene.control.Label(); + controller.volumeValueLabel = object13; + object13.setText("Label"); + final var map0 = new HashMap<>(resourceBundlesMap); + final var bundle0 = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + map0.put(com.github.gtache.fxml.compiler.impl.ControlsController, bundle0); + final var view0 = new com.github.gtache.fxml.compiler.impl.ControlsView(controllersMap, map0); + final var object14 = view0.load(); + final var controller0 = view0.controller(); + controller.controlsController = controller0; + object8.getChildren().addAll(object9, object11, object12, object13, object14); + final var object15 = new javafx.geometry.Insets(10.0, 10.0, 10.0, 10.0); + object8.setPadding(object15); + object1.getChildren().addAll(object2, object8); + object0.setBottom(object1); + final var object16 = new javafx.scene.layout.VBox(); + controller.vbox = object16; + final var object17 = new javafx.scene.control.ToolBar(); + controller.toolBar = object17; + final var object18 = new javafx.scene.control.TitledPane(); + controller.titledPane = object18; + final var object19 = new javafx.scene.layout.TilePane(); + controller.tilePane = object19; + final var object20 = new javafx.scene.text.TextFlow(); + controller.textFlow = object20; + final var object21 = new javafx.scene.control.TabPane(); + controller.tabPane = object21; + final var object22 = new javafx.scene.control.Tab(); + controller.tab = object22; + final var object23 = new javafx.scene.layout.StackPane(); + controller.stackPane = object23; + final var object24 = new javafx.scene.control.SplitPane(); + controller.splitPane = object24; + final var object25 = new javafx.scene.control.ScrollPane(); + controller.scrollPane = object25; + final var object26 = new javafx.scene.layout.Pane(); + controller.pane = object26; + final var object27 = new javafx.scene.layout.HBox(); + controller.hbox = object27; + final var object28 = new javafx.scene.Group(); + controller.group = object28; + final var object29 = new javafx.scene.layout.GridPane(); + controller.gridPane = object29; + final var object30 = new javafx.scene.layout.ColumnConstraints(); + controller.columnConstraints = object30; + object30.setHgrow(javafx.scene.layout.Priority.SOMETIMES); + object30.setMinWidth(10.0); + object29.getColumnConstraints().addAll(object30); + final var object31 = new javafx.scene.layout.RowConstraints(); + object31.setMinHeight(10.0); + object31.setVgrow(javafx.scene.layout.Priority.SOMETIMES); + object29.getRowConstraints().addAll(object31); + final var object32 = new javafx.scene.layout.FlowPane(); + controller.flowPane = object32; + final var object33 = new javafx.scene.control.DialogPane(); + controller.dialogPane = object33; + final var object34 = new javafx.scene.control.ButtonBar(); + controller.buttonBar = object34; + final var object35 = new javafx.scene.layout.AnchorPane(); + controller.anchorPane = object35; + final var object36 = new javafx.scene.control.Label(); + object36.setManaged(false); + object35.getChildren().addAll(object36); + object34.getButtons().addAll(object35); + object33.setContent(object34); + object32.getChildren().addAll(object33); + object29.getChildren().addAll(object32); + object28.getChildren().addAll(object29); + object27.getChildren().addAll(object28); + object26.getChildren().addAll(object27); + object25.setContent(object26); + object24.getItems().addAll(object25); + object23.getChildren().addAll(object24); + object22.setContent(object23); + object21.getTabs().addAll(object22); + object20.getChildren().addAll(object21); + object19.getChildren().addAll(object20); + object18.setContent(object19); + object17.getItems().addAll(object18); + object16.getChildren().addAll(object17); + object0.setCenter(object16); + try { + final var initialize = controller.getClass().getDeclaredMethod("initialize"); + initialize.setAccessible(true); + initialize.invoke(controller); + } catch (final InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection", e); + } catch (final NoSuchMethodException ignored) { + } + loaded = true; + return object0; +} + + private void callMethod(final String methodName, final T event) { + try { + final Method method; + final var methods = Arrays.stream(controller.getClass().getDeclaredMethods()) + .filter(m -> m.getName().equals(methodName)).toList(); + if (methods.size() > 1) { + final var eventMethods = methods.stream().filter(m -> + m.getParameterCount() == 1 && Event.class.isAssignableFrom(m.getParameterTypes()[0])).toList(); + if (eventMethods.size() == 1) { + method = eventMethods.getFirst(); + } else { + final var emptyMethods = methods.stream().filter(m -> m.getParameterCount() == 0).toList(); + if (emptyMethods.size() == 1) { + method = emptyMethods.getFirst(); + } else { + throw new IllegalArgumentException("Multiple matching methods for " + methodName); + } + } + } else if (methods.size() == 1) { + method = methods.getFirst(); + } else { + throw new IllegalArgumentException("No matching method for " + methodName); + } + method.setAccessible(true); + if (method.getParameterCount() == 0) { + method.invoke(controller); + } else { + method.invoke(controller, event); + } + } catch (final IllegalAccessException | InvocationTargetException ex) { + throw new RuntimeException("Error using reflection on " + methodName, ex); + } +} + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.IncludesController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-factory-reference-constructor.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-factory-reference-constructor.txt new file mode 100644 index 0000000..7332d07 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-factory-reference-constructor.txt @@ -0,0 +1,185 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; +import com.github.gtache.fxml.compiler.ControllerFactory; + + +/** + * Generated code, not thread-safe + */ +public final class IncludesController { + + private final Map, ControllerFactory> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.IncludesController controller; + + /** + * Instantiates a new IncludesController with no nested controllers and no resource bundle + * @param controllerFactory The controller factory + */ + public IncludesController(final ControllerFactory controllerFactory) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controllerFactory), Map.of()); + } + + /** + * Instantiates a new IncludesController with no nested controllers + * @param controllerFactory The controller factory + * @param resourceBundle The resource bundle + */ + public IncludesController(final ControllerFactory controllerFactory, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controllerFactory), Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, resourceBundle)); + } + + /** + * Instantiates a new IncludesController with nested controllers + * @param controllersMap The map of controller class to controller factory + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public IncludesController(final Map, ControllerFactory> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = resourceBundlesMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + final var fieldMap = new HashMap(); + final var object0 = new javafx.scene.layout.BorderPane(); + final var object1 = new javafx.scene.layout.VBox(); + javafx.scene.layout.BorderPane.setAlignment(object1, javafx.geometry.Pos.CENTER); + final var object2 = new javafx.scene.layout.HBox(); + object2.setAlignment(javafx.geometry.Pos.CENTER); + object2.setSpacing(10.0); + final var object3 = new javafx.scene.control.Slider(); + fieldMap.put("playSlider", object3); + javafx.scene.layout.HBox.setHgrow(object3, javafx.scene.layout.Priority.ALWAYS); + final var object4 = new javafx.geometry.Insets(0, 0, 0, 10.0); + object3.setPadding(object4); + final var object5 = new javafx.scene.control.Label(); + fieldMap.put("playLabel", object5); + object5.setText("Label"); + final var object6 = new javafx.geometry.Insets(0, 10.0, 0, 0); + object5.setPadding(object6); + object2.getChildren().addAll(object3, object5); + final var object7 = new javafx.geometry.Insets(10.0, 0, 0, 0); + object2.setPadding(object7); + final var object8 = new javafx.scene.layout.HBox(); + object8.setAlignment(javafx.geometry.Pos.CENTER); + object8.setSpacing(10.0); + final var object9 = new javafx.scene.control.Button(); + fieldMap.put("playButton", object9); + object9.setMnemonicParsing(false); + final var object10 = new javafx.geometry.Insets(0, 20.0, 0, 0); + javafx.scene.layout.HBox.setMargin(object9, object10); + final var object11 = new javafx.scene.control.Label(); + object11.setText(bundle.getString("media.volume.label")); + final var object12 = new javafx.scene.control.Slider(); + fieldMap.put("volumeSlider", object12); + object12.setValue(100); + final var object13 = new javafx.scene.control.Label(); + fieldMap.put("volumeValueLabel", object13); + object13.setText("Label"); + final var map0 = new HashMap<>(resourceBundlesMap); + final var bundle0 = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + map0.put(com.github.gtache.fxml.compiler.impl.ControlsController, bundle0); + final var view0 = new com.github.gtache.fxml.compiler.impl.ControlsView(controllersMap, map0); + final var object14 = view0.load(); + final var controller0 = view0.controller(); + fieldMap.put("controlsController", controller0); + object8.getChildren().addAll(object9, object11, object12, object13, object14); + final var object15 = new javafx.geometry.Insets(10.0, 10.0, 10.0, 10.0); + object8.setPadding(object15); + object1.getChildren().addAll(object2, object8); + object0.setBottom(object1); + final var object16 = new javafx.scene.layout.VBox(); + fieldMap.put("vbox", object16); + final var object17 = new javafx.scene.control.ToolBar(); + fieldMap.put("toolBar", object17); + final var object18 = new javafx.scene.control.TitledPane(); + fieldMap.put("titledPane", object18); + final var object19 = new javafx.scene.layout.TilePane(); + fieldMap.put("tilePane", object19); + final var object20 = new javafx.scene.text.TextFlow(); + fieldMap.put("textFlow", object20); + final var object21 = new javafx.scene.control.TabPane(); + fieldMap.put("tabPane", object21); + final var object22 = new javafx.scene.control.Tab(); + fieldMap.put("tab", object22); + final var object23 = new javafx.scene.layout.StackPane(); + fieldMap.put("stackPane", object23); + final var object24 = new javafx.scene.control.SplitPane(); + fieldMap.put("splitPane", object24); + final var object25 = new javafx.scene.control.ScrollPane(); + fieldMap.put("scrollPane", object25); + final var object26 = new javafx.scene.layout.Pane(); + fieldMap.put("pane", object26); + final var object27 = new javafx.scene.layout.HBox(); + fieldMap.put("hbox", object27); + final var object28 = new javafx.scene.Group(); + fieldMap.put("group", object28); + final var object29 = new javafx.scene.layout.GridPane(); + fieldMap.put("gridPane", object29); + final var object30 = new javafx.scene.layout.ColumnConstraints(); + fieldMap.put("columnConstraints", object30); + object30.setHgrow(javafx.scene.layout.Priority.SOMETIMES); + object30.setMinWidth(10.0); + object29.getColumnConstraints().addAll(object30); + final var object31 = new javafx.scene.layout.RowConstraints(); + object31.setMinHeight(10.0); + object31.setVgrow(javafx.scene.layout.Priority.SOMETIMES); + object29.getRowConstraints().addAll(object31); + final var object32 = new javafx.scene.layout.FlowPane(); + fieldMap.put("flowPane", object32); + final var object33 = new javafx.scene.control.DialogPane(); + fieldMap.put("dialogPane", object33); + final var object34 = new javafx.scene.control.ButtonBar(); + fieldMap.put("buttonBar", object34); + final var object35 = new javafx.scene.layout.AnchorPane(); + fieldMap.put("anchorPane", object35); + final var object36 = new javafx.scene.control.Label(); + object36.setManaged(false); + object35.getChildren().addAll(object36); + object34.getButtons().addAll(object35); + object33.setContent(object34); + object32.getChildren().addAll(object33); + object29.getChildren().addAll(object32); + object28.getChildren().addAll(object29); + object27.getChildren().addAll(object28); + object26.getChildren().addAll(object27); + object25.setContent(object26); + object24.getItems().addAll(object25); + object23.getChildren().addAll(object24); + object22.setContent(object23); + object21.getTabs().addAll(object22); + object20.getChildren().addAll(object21); + object19.getChildren().addAll(object20); + object18.setContent(object19); + object17.getItems().addAll(object18); + object16.getChildren().addAll(object17); + object0.setCenter(object16); + final var controllerFactory = controllersMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + controller = (com.github.gtache.fxml.compiler.impl.IncludesController) controllerFactory.create(fieldMap); + object9.setOnAction(controller::playPressed); + controller.initialize(); + loaded = true; + return object0; +} + + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.IncludesController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-factory-reference-getbundle.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-factory-reference-getbundle.txt new file mode 100644 index 0000000..93051ce --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-factory-reference-getbundle.txt @@ -0,0 +1,185 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; +import com.github.gtache.fxml.compiler.ControllerFactory; + + +/** + * Generated code, not thread-safe + */ +public final class IncludesController { + + private final Map, ControllerFactory> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.IncludesController controller; + + /** + * Instantiates a new IncludesController with no nested controllers and no resource bundle + * @param controllerFactory The controller factory + */ + public IncludesController(final ControllerFactory controllerFactory) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controllerFactory), Map.of()); + } + + /** + * Instantiates a new IncludesController with no nested controllers + * @param controllerFactory The controller factory + * @param resourceBundle The resource bundle + */ + public IncludesController(final ControllerFactory controllerFactory, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controllerFactory), Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, resourceBundle)); + } + + /** + * Instantiates a new IncludesController with nested controllers + * @param controllersMap The map of controller class to controller factory + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public IncludesController(final Map, ControllerFactory> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.IncludesBundle"); + final var fieldMap = new HashMap(); + final var object0 = new javafx.scene.layout.BorderPane(); + final var object1 = new javafx.scene.layout.VBox(); + javafx.scene.layout.BorderPane.setAlignment(object1, javafx.geometry.Pos.CENTER); + final var object2 = new javafx.scene.layout.HBox(); + object2.setAlignment(javafx.geometry.Pos.CENTER); + object2.setSpacing(10.0); + final var object3 = new javafx.scene.control.Slider(); + fieldMap.put("playSlider", object3); + javafx.scene.layout.HBox.setHgrow(object3, javafx.scene.layout.Priority.ALWAYS); + final var object4 = new javafx.geometry.Insets(0, 0, 0, 10.0); + object3.setPadding(object4); + final var object5 = new javafx.scene.control.Label(); + fieldMap.put("playLabel", object5); + object5.setText("Label"); + final var object6 = new javafx.geometry.Insets(0, 10.0, 0, 0); + object5.setPadding(object6); + object2.getChildren().addAll(object3, object5); + final var object7 = new javafx.geometry.Insets(10.0, 0, 0, 0); + object2.setPadding(object7); + final var object8 = new javafx.scene.layout.HBox(); + object8.setAlignment(javafx.geometry.Pos.CENTER); + object8.setSpacing(10.0); + final var object9 = new javafx.scene.control.Button(); + fieldMap.put("playButton", object9); + object9.setMnemonicParsing(false); + final var object10 = new javafx.geometry.Insets(0, 20.0, 0, 0); + javafx.scene.layout.HBox.setMargin(object9, object10); + final var object11 = new javafx.scene.control.Label(); + object11.setText(bundle.getString("media.volume.label")); + final var object12 = new javafx.scene.control.Slider(); + fieldMap.put("volumeSlider", object12); + object12.setValue(100); + final var object13 = new javafx.scene.control.Label(); + fieldMap.put("volumeValueLabel", object13); + object13.setText("Label"); + final var map0 = new HashMap<>(resourceBundlesMap); + final var bundle0 = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + map0.put(com.github.gtache.fxml.compiler.impl.ControlsController, bundle0); + final var view0 = new com.github.gtache.fxml.compiler.impl.ControlsView(controllersMap, map0); + final var object14 = view0.load(); + final var controller0 = view0.controller(); + fieldMap.put("controlsController", controller0); + object8.getChildren().addAll(object9, object11, object12, object13, object14); + final var object15 = new javafx.geometry.Insets(10.0, 10.0, 10.0, 10.0); + object8.setPadding(object15); + object1.getChildren().addAll(object2, object8); + object0.setBottom(object1); + final var object16 = new javafx.scene.layout.VBox(); + fieldMap.put("vbox", object16); + final var object17 = new javafx.scene.control.ToolBar(); + fieldMap.put("toolBar", object17); + final var object18 = new javafx.scene.control.TitledPane(); + fieldMap.put("titledPane", object18); + final var object19 = new javafx.scene.layout.TilePane(); + fieldMap.put("tilePane", object19); + final var object20 = new javafx.scene.text.TextFlow(); + fieldMap.put("textFlow", object20); + final var object21 = new javafx.scene.control.TabPane(); + fieldMap.put("tabPane", object21); + final var object22 = new javafx.scene.control.Tab(); + fieldMap.put("tab", object22); + final var object23 = new javafx.scene.layout.StackPane(); + fieldMap.put("stackPane", object23); + final var object24 = new javafx.scene.control.SplitPane(); + fieldMap.put("splitPane", object24); + final var object25 = new javafx.scene.control.ScrollPane(); + fieldMap.put("scrollPane", object25); + final var object26 = new javafx.scene.layout.Pane(); + fieldMap.put("pane", object26); + final var object27 = new javafx.scene.layout.HBox(); + fieldMap.put("hbox", object27); + final var object28 = new javafx.scene.Group(); + fieldMap.put("group", object28); + final var object29 = new javafx.scene.layout.GridPane(); + fieldMap.put("gridPane", object29); + final var object30 = new javafx.scene.layout.ColumnConstraints(); + fieldMap.put("columnConstraints", object30); + object30.setHgrow(javafx.scene.layout.Priority.SOMETIMES); + object30.setMinWidth(10.0); + object29.getColumnConstraints().addAll(object30); + final var object31 = new javafx.scene.layout.RowConstraints(); + object31.setMinHeight(10.0); + object31.setVgrow(javafx.scene.layout.Priority.SOMETIMES); + object29.getRowConstraints().addAll(object31); + final var object32 = new javafx.scene.layout.FlowPane(); + fieldMap.put("flowPane", object32); + final var object33 = new javafx.scene.control.DialogPane(); + fieldMap.put("dialogPane", object33); + final var object34 = new javafx.scene.control.ButtonBar(); + fieldMap.put("buttonBar", object34); + final var object35 = new javafx.scene.layout.AnchorPane(); + fieldMap.put("anchorPane", object35); + final var object36 = new javafx.scene.control.Label(); + object36.setManaged(false); + object35.getChildren().addAll(object36); + object34.getButtons().addAll(object35); + object33.setContent(object34); + object32.getChildren().addAll(object33); + object29.getChildren().addAll(object32); + object28.getChildren().addAll(object29); + object27.getChildren().addAll(object28); + object26.getChildren().addAll(object27); + object25.setContent(object26); + object24.getItems().addAll(object25); + object23.getChildren().addAll(object24); + object22.setContent(object23); + object21.getTabs().addAll(object22); + object20.getChildren().addAll(object21); + object19.getChildren().addAll(object20); + object18.setContent(object19); + object17.getItems().addAll(object18); + object16.getChildren().addAll(object17); + object0.setCenter(object16); + final var controllerFactory = controllersMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + controller = (com.github.gtache.fxml.compiler.impl.IncludesController) controllerFactory.create(fieldMap); + object9.setOnAction(controller::playPressed); + controller.initialize(); + loaded = true; + return object0; +} + + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.IncludesController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-factory-reference-getter.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-factory-reference-getter.txt new file mode 100644 index 0000000..bf3b063 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-factory-reference-getter.txt @@ -0,0 +1,184 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; +import com.github.gtache.fxml.compiler.ControllerFactory; + + +/** + * Generated code, not thread-safe + */ +public final class IncludesController { + + private final Map, ControllerFactory> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.IncludesController controller; + + /** + * Instantiates a new IncludesController with no nested controllers and no resource bundle + * @param controllerFactory The controller factory + */ + public IncludesController(final ControllerFactory controllerFactory) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controllerFactory), Map.of()); + } + + /** + * Instantiates a new IncludesController with no nested controllers + * @param controllerFactory The controller factory + * @param resourceBundle The resource bundle + */ + public IncludesController(final ControllerFactory controllerFactory, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controllerFactory), Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, resourceBundle)); + } + + /** + * Instantiates a new IncludesController with nested controllers + * @param controllersMap The map of controller class to controller factory + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public IncludesController(final Map, ControllerFactory> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var fieldMap = new HashMap(); + final var object0 = new javafx.scene.layout.BorderPane(); + final var object1 = new javafx.scene.layout.VBox(); + javafx.scene.layout.BorderPane.setAlignment(object1, javafx.geometry.Pos.CENTER); + final var object2 = new javafx.scene.layout.HBox(); + object2.setAlignment(javafx.geometry.Pos.CENTER); + object2.setSpacing(10.0); + final var object3 = new javafx.scene.control.Slider(); + fieldMap.put("playSlider", object3); + javafx.scene.layout.HBox.setHgrow(object3, javafx.scene.layout.Priority.ALWAYS); + final var object4 = new javafx.geometry.Insets(0, 0, 0, 10.0); + object3.setPadding(object4); + final var object5 = new javafx.scene.control.Label(); + fieldMap.put("playLabel", object5); + object5.setText("Label"); + final var object6 = new javafx.geometry.Insets(0, 10.0, 0, 0); + object5.setPadding(object6); + object2.getChildren().addAll(object3, object5); + final var object7 = new javafx.geometry.Insets(10.0, 0, 0, 0); + object2.setPadding(object7); + final var object8 = new javafx.scene.layout.HBox(); + object8.setAlignment(javafx.geometry.Pos.CENTER); + object8.setSpacing(10.0); + final var object9 = new javafx.scene.control.Button(); + fieldMap.put("playButton", object9); + object9.setMnemonicParsing(false); + final var object10 = new javafx.geometry.Insets(0, 20.0, 0, 0); + javafx.scene.layout.HBox.setMargin(object9, object10); + final var object11 = new javafx.scene.control.Label(); + final var object12 = new javafx.scene.control.Slider(); + fieldMap.put("volumeSlider", object12); + object12.setValue(100); + final var object13 = new javafx.scene.control.Label(); + fieldMap.put("volumeValueLabel", object13); + object13.setText("Label"); + final var map0 = new HashMap<>(resourceBundlesMap); + final var bundle0 = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + map0.put(com.github.gtache.fxml.compiler.impl.ControlsController, bundle0); + final var view0 = new com.github.gtache.fxml.compiler.impl.ControlsView(controllersMap, map0); + final var object14 = view0.load(); + final var controller0 = view0.controller(); + fieldMap.put("controlsController", controller0); + object8.getChildren().addAll(object9, object11, object12, object13, object14); + final var object15 = new javafx.geometry.Insets(10.0, 10.0, 10.0, 10.0); + object8.setPadding(object15); + object1.getChildren().addAll(object2, object8); + object0.setBottom(object1); + final var object16 = new javafx.scene.layout.VBox(); + fieldMap.put("vbox", object16); + final var object17 = new javafx.scene.control.ToolBar(); + fieldMap.put("toolBar", object17); + final var object18 = new javafx.scene.control.TitledPane(); + fieldMap.put("titledPane", object18); + final var object19 = new javafx.scene.layout.TilePane(); + fieldMap.put("tilePane", object19); + final var object20 = new javafx.scene.text.TextFlow(); + fieldMap.put("textFlow", object20); + final var object21 = new javafx.scene.control.TabPane(); + fieldMap.put("tabPane", object21); + final var object22 = new javafx.scene.control.Tab(); + fieldMap.put("tab", object22); + final var object23 = new javafx.scene.layout.StackPane(); + fieldMap.put("stackPane", object23); + final var object24 = new javafx.scene.control.SplitPane(); + fieldMap.put("splitPane", object24); + final var object25 = new javafx.scene.control.ScrollPane(); + fieldMap.put("scrollPane", object25); + final var object26 = new javafx.scene.layout.Pane(); + fieldMap.put("pane", object26); + final var object27 = new javafx.scene.layout.HBox(); + fieldMap.put("hbox", object27); + final var object28 = new javafx.scene.Group(); + fieldMap.put("group", object28); + final var object29 = new javafx.scene.layout.GridPane(); + fieldMap.put("gridPane", object29); + final var object30 = new javafx.scene.layout.ColumnConstraints(); + fieldMap.put("columnConstraints", object30); + object30.setHgrow(javafx.scene.layout.Priority.SOMETIMES); + object30.setMinWidth(10.0); + object29.getColumnConstraints().addAll(object30); + final var object31 = new javafx.scene.layout.RowConstraints(); + object31.setMinHeight(10.0); + object31.setVgrow(javafx.scene.layout.Priority.SOMETIMES); + object29.getRowConstraints().addAll(object31); + final var object32 = new javafx.scene.layout.FlowPane(); + fieldMap.put("flowPane", object32); + final var object33 = new javafx.scene.control.DialogPane(); + fieldMap.put("dialogPane", object33); + final var object34 = new javafx.scene.control.ButtonBar(); + fieldMap.put("buttonBar", object34); + final var object35 = new javafx.scene.layout.AnchorPane(); + fieldMap.put("anchorPane", object35); + final var object36 = new javafx.scene.control.Label(); + object36.setManaged(false); + object35.getChildren().addAll(object36); + object34.getButtons().addAll(object35); + object33.setContent(object34); + object32.getChildren().addAll(object33); + object29.getChildren().addAll(object32); + object28.getChildren().addAll(object29); + object27.getChildren().addAll(object28); + object26.getChildren().addAll(object27); + object25.setContent(object26); + object24.getItems().addAll(object25); + object23.getChildren().addAll(object24); + object22.setContent(object23); + object21.getTabs().addAll(object22); + object20.getChildren().addAll(object21); + object19.getChildren().addAll(object20); + object18.setContent(object19); + object17.getItems().addAll(object18); + object16.getChildren().addAll(object17); + object0.setCenter(object16); + final var controllerFactory = controllersMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + controller = (com.github.gtache.fxml.compiler.impl.IncludesController) controllerFactory.create(fieldMap); + object9.setOnAction(controller::playPressed); + object11.setText(controller.resources().getString("media.volume.label")); + controller.initialize(); + loaded = true; + return object0; +} + + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.IncludesController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-factory-reflection-constructor.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-factory-reflection-constructor.txt new file mode 100644 index 0000000..3defcc6 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-factory-reflection-constructor.txt @@ -0,0 +1,229 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; +import com.github.gtache.fxml.compiler.ControllerFactory; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import javafx.event.Event; +import java.lang.reflect.Method; + + +/** + * Generated code, not thread-safe + */ +public final class IncludesController { + + private final Map, ControllerFactory> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.IncludesController controller; + + /** + * Instantiates a new IncludesController with no nested controllers and no resource bundle + * @param controllerFactory The controller factory + */ + public IncludesController(final ControllerFactory controllerFactory) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controllerFactory), Map.of()); + } + + /** + * Instantiates a new IncludesController with no nested controllers + * @param controllerFactory The controller factory + * @param resourceBundle The resource bundle + */ + public IncludesController(final ControllerFactory controllerFactory, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controllerFactory), Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, resourceBundle)); + } + + /** + * Instantiates a new IncludesController with nested controllers + * @param controllersMap The map of controller class to controller factory + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public IncludesController(final Map, ControllerFactory> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = resourceBundlesMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + final var fieldMap = new HashMap(); + final var object0 = new javafx.scene.layout.BorderPane(); + final var object1 = new javafx.scene.layout.VBox(); + javafx.scene.layout.BorderPane.setAlignment(object1, javafx.geometry.Pos.CENTER); + final var object2 = new javafx.scene.layout.HBox(); + object2.setAlignment(javafx.geometry.Pos.CENTER); + object2.setSpacing(10.0); + final var object3 = new javafx.scene.control.Slider(); + fieldMap.put("playSlider", object3); + javafx.scene.layout.HBox.setHgrow(object3, javafx.scene.layout.Priority.ALWAYS); + final var object4 = new javafx.geometry.Insets(0, 0, 0, 10.0); + object3.setPadding(object4); + final var object5 = new javafx.scene.control.Label(); + fieldMap.put("playLabel", object5); + object5.setText("Label"); + final var object6 = new javafx.geometry.Insets(0, 10.0, 0, 0); + object5.setPadding(object6); + object2.getChildren().addAll(object3, object5); + final var object7 = new javafx.geometry.Insets(10.0, 0, 0, 0); + object2.setPadding(object7); + final var object8 = new javafx.scene.layout.HBox(); + object8.setAlignment(javafx.geometry.Pos.CENTER); + object8.setSpacing(10.0); + final var object9 = new javafx.scene.control.Button(); + fieldMap.put("playButton", object9); + object9.setMnemonicParsing(false); + final var object10 = new javafx.geometry.Insets(0, 20.0, 0, 0); + javafx.scene.layout.HBox.setMargin(object9, object10); + final var object11 = new javafx.scene.control.Label(); + object11.setText(bundle.getString("media.volume.label")); + final var object12 = new javafx.scene.control.Slider(); + fieldMap.put("volumeSlider", object12); + object12.setValue(100); + final var object13 = new javafx.scene.control.Label(); + fieldMap.put("volumeValueLabel", object13); + object13.setText("Label"); + final var map0 = new HashMap<>(resourceBundlesMap); + final var bundle0 = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + map0.put(com.github.gtache.fxml.compiler.impl.ControlsController, bundle0); + final var view0 = new com.github.gtache.fxml.compiler.impl.ControlsView(controllersMap, map0); + final var object14 = view0.load(); + final var controller0 = view0.controller(); + fieldMap.put("controlsController", controller0); + object8.getChildren().addAll(object9, object11, object12, object13, object14); + final var object15 = new javafx.geometry.Insets(10.0, 10.0, 10.0, 10.0); + object8.setPadding(object15); + object1.getChildren().addAll(object2, object8); + object0.setBottom(object1); + final var object16 = new javafx.scene.layout.VBox(); + fieldMap.put("vbox", object16); + final var object17 = new javafx.scene.control.ToolBar(); + fieldMap.put("toolBar", object17); + final var object18 = new javafx.scene.control.TitledPane(); + fieldMap.put("titledPane", object18); + final var object19 = new javafx.scene.layout.TilePane(); + fieldMap.put("tilePane", object19); + final var object20 = new javafx.scene.text.TextFlow(); + fieldMap.put("textFlow", object20); + final var object21 = new javafx.scene.control.TabPane(); + fieldMap.put("tabPane", object21); + final var object22 = new javafx.scene.control.Tab(); + fieldMap.put("tab", object22); + final var object23 = new javafx.scene.layout.StackPane(); + fieldMap.put("stackPane", object23); + final var object24 = new javafx.scene.control.SplitPane(); + fieldMap.put("splitPane", object24); + final var object25 = new javafx.scene.control.ScrollPane(); + fieldMap.put("scrollPane", object25); + final var object26 = new javafx.scene.layout.Pane(); + fieldMap.put("pane", object26); + final var object27 = new javafx.scene.layout.HBox(); + fieldMap.put("hbox", object27); + final var object28 = new javafx.scene.Group(); + fieldMap.put("group", object28); + final var object29 = new javafx.scene.layout.GridPane(); + fieldMap.put("gridPane", object29); + final var object30 = new javafx.scene.layout.ColumnConstraints(); + fieldMap.put("columnConstraints", object30); + object30.setHgrow(javafx.scene.layout.Priority.SOMETIMES); + object30.setMinWidth(10.0); + object29.getColumnConstraints().addAll(object30); + final var object31 = new javafx.scene.layout.RowConstraints(); + object31.setMinHeight(10.0); + object31.setVgrow(javafx.scene.layout.Priority.SOMETIMES); + object29.getRowConstraints().addAll(object31); + final var object32 = new javafx.scene.layout.FlowPane(); + fieldMap.put("flowPane", object32); + final var object33 = new javafx.scene.control.DialogPane(); + fieldMap.put("dialogPane", object33); + final var object34 = new javafx.scene.control.ButtonBar(); + fieldMap.put("buttonBar", object34); + final var object35 = new javafx.scene.layout.AnchorPane(); + fieldMap.put("anchorPane", object35); + final var object36 = new javafx.scene.control.Label(); + object36.setManaged(false); + object35.getChildren().addAll(object36); + object34.getButtons().addAll(object35); + object33.setContent(object34); + object32.getChildren().addAll(object33); + object29.getChildren().addAll(object32); + object28.getChildren().addAll(object29); + object27.getChildren().addAll(object28); + object26.getChildren().addAll(object27); + object25.setContent(object26); + object24.getItems().addAll(object25); + object23.getChildren().addAll(object24); + object22.setContent(object23); + object21.getTabs().addAll(object22); + object20.getChildren().addAll(object21); + object19.getChildren().addAll(object20); + object18.setContent(object19); + object17.getItems().addAll(object18); + object16.getChildren().addAll(object17); + object0.setCenter(object16); + final var controllerFactory = controllersMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + controller = (com.github.gtache.fxml.compiler.impl.IncludesController) controllerFactory.create(fieldMap); + object9.setOnAction(e -> callMethod("playPressed", e)); + try { + final var initialize = controller.getClass().getDeclaredMethod("initialize"); + initialize.setAccessible(true); + initialize.invoke(controller); + } catch (final InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection", e); + } catch (final NoSuchMethodException ignored) { + } + loaded = true; + return object0; +} + + private void callMethod(final String methodName, final T event) { + try { + final Method method; + final var methods = Arrays.stream(controller.getClass().getDeclaredMethods()) + .filter(m -> m.getName().equals(methodName)).toList(); + if (methods.size() > 1) { + final var eventMethods = methods.stream().filter(m -> + m.getParameterCount() == 1 && Event.class.isAssignableFrom(m.getParameterTypes()[0])).toList(); + if (eventMethods.size() == 1) { + method = eventMethods.getFirst(); + } else { + final var emptyMethods = methods.stream().filter(m -> m.getParameterCount() == 0).toList(); + if (emptyMethods.size() == 1) { + method = emptyMethods.getFirst(); + } else { + throw new IllegalArgumentException("Multiple matching methods for " + methodName); + } + } + } else if (methods.size() == 1) { + method = methods.getFirst(); + } else { + throw new IllegalArgumentException("No matching method for " + methodName); + } + method.setAccessible(true); + if (method.getParameterCount() == 0) { + method.invoke(controller); + } else { + method.invoke(controller, event); + } + } catch (final IllegalAccessException | InvocationTargetException ex) { + throw new RuntimeException("Error using reflection on " + methodName, ex); + } +} + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.IncludesController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-factory-reflection-getbundle.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-factory-reflection-getbundle.txt new file mode 100644 index 0000000..5249b74 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-factory-reflection-getbundle.txt @@ -0,0 +1,229 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; +import com.github.gtache.fxml.compiler.ControllerFactory; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import javafx.event.Event; +import java.lang.reflect.Method; + + +/** + * Generated code, not thread-safe + */ +public final class IncludesController { + + private final Map, ControllerFactory> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.IncludesController controller; + + /** + * Instantiates a new IncludesController with no nested controllers and no resource bundle + * @param controllerFactory The controller factory + */ + public IncludesController(final ControllerFactory controllerFactory) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controllerFactory), Map.of()); + } + + /** + * Instantiates a new IncludesController with no nested controllers + * @param controllerFactory The controller factory + * @param resourceBundle The resource bundle + */ + public IncludesController(final ControllerFactory controllerFactory, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controllerFactory), Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, resourceBundle)); + } + + /** + * Instantiates a new IncludesController with nested controllers + * @param controllersMap The map of controller class to controller factory + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public IncludesController(final Map, ControllerFactory> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.IncludesBundle"); + final var fieldMap = new HashMap(); + final var object0 = new javafx.scene.layout.BorderPane(); + final var object1 = new javafx.scene.layout.VBox(); + javafx.scene.layout.BorderPane.setAlignment(object1, javafx.geometry.Pos.CENTER); + final var object2 = new javafx.scene.layout.HBox(); + object2.setAlignment(javafx.geometry.Pos.CENTER); + object2.setSpacing(10.0); + final var object3 = new javafx.scene.control.Slider(); + fieldMap.put("playSlider", object3); + javafx.scene.layout.HBox.setHgrow(object3, javafx.scene.layout.Priority.ALWAYS); + final var object4 = new javafx.geometry.Insets(0, 0, 0, 10.0); + object3.setPadding(object4); + final var object5 = new javafx.scene.control.Label(); + fieldMap.put("playLabel", object5); + object5.setText("Label"); + final var object6 = new javafx.geometry.Insets(0, 10.0, 0, 0); + object5.setPadding(object6); + object2.getChildren().addAll(object3, object5); + final var object7 = new javafx.geometry.Insets(10.0, 0, 0, 0); + object2.setPadding(object7); + final var object8 = new javafx.scene.layout.HBox(); + object8.setAlignment(javafx.geometry.Pos.CENTER); + object8.setSpacing(10.0); + final var object9 = new javafx.scene.control.Button(); + fieldMap.put("playButton", object9); + object9.setMnemonicParsing(false); + final var object10 = new javafx.geometry.Insets(0, 20.0, 0, 0); + javafx.scene.layout.HBox.setMargin(object9, object10); + final var object11 = new javafx.scene.control.Label(); + object11.setText(bundle.getString("media.volume.label")); + final var object12 = new javafx.scene.control.Slider(); + fieldMap.put("volumeSlider", object12); + object12.setValue(100); + final var object13 = new javafx.scene.control.Label(); + fieldMap.put("volumeValueLabel", object13); + object13.setText("Label"); + final var map0 = new HashMap<>(resourceBundlesMap); + final var bundle0 = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + map0.put(com.github.gtache.fxml.compiler.impl.ControlsController, bundle0); + final var view0 = new com.github.gtache.fxml.compiler.impl.ControlsView(controllersMap, map0); + final var object14 = view0.load(); + final var controller0 = view0.controller(); + fieldMap.put("controlsController", controller0); + object8.getChildren().addAll(object9, object11, object12, object13, object14); + final var object15 = new javafx.geometry.Insets(10.0, 10.0, 10.0, 10.0); + object8.setPadding(object15); + object1.getChildren().addAll(object2, object8); + object0.setBottom(object1); + final var object16 = new javafx.scene.layout.VBox(); + fieldMap.put("vbox", object16); + final var object17 = new javafx.scene.control.ToolBar(); + fieldMap.put("toolBar", object17); + final var object18 = new javafx.scene.control.TitledPane(); + fieldMap.put("titledPane", object18); + final var object19 = new javafx.scene.layout.TilePane(); + fieldMap.put("tilePane", object19); + final var object20 = new javafx.scene.text.TextFlow(); + fieldMap.put("textFlow", object20); + final var object21 = new javafx.scene.control.TabPane(); + fieldMap.put("tabPane", object21); + final var object22 = new javafx.scene.control.Tab(); + fieldMap.put("tab", object22); + final var object23 = new javafx.scene.layout.StackPane(); + fieldMap.put("stackPane", object23); + final var object24 = new javafx.scene.control.SplitPane(); + fieldMap.put("splitPane", object24); + final var object25 = new javafx.scene.control.ScrollPane(); + fieldMap.put("scrollPane", object25); + final var object26 = new javafx.scene.layout.Pane(); + fieldMap.put("pane", object26); + final var object27 = new javafx.scene.layout.HBox(); + fieldMap.put("hbox", object27); + final var object28 = new javafx.scene.Group(); + fieldMap.put("group", object28); + final var object29 = new javafx.scene.layout.GridPane(); + fieldMap.put("gridPane", object29); + final var object30 = new javafx.scene.layout.ColumnConstraints(); + fieldMap.put("columnConstraints", object30); + object30.setHgrow(javafx.scene.layout.Priority.SOMETIMES); + object30.setMinWidth(10.0); + object29.getColumnConstraints().addAll(object30); + final var object31 = new javafx.scene.layout.RowConstraints(); + object31.setMinHeight(10.0); + object31.setVgrow(javafx.scene.layout.Priority.SOMETIMES); + object29.getRowConstraints().addAll(object31); + final var object32 = new javafx.scene.layout.FlowPane(); + fieldMap.put("flowPane", object32); + final var object33 = new javafx.scene.control.DialogPane(); + fieldMap.put("dialogPane", object33); + final var object34 = new javafx.scene.control.ButtonBar(); + fieldMap.put("buttonBar", object34); + final var object35 = new javafx.scene.layout.AnchorPane(); + fieldMap.put("anchorPane", object35); + final var object36 = new javafx.scene.control.Label(); + object36.setManaged(false); + object35.getChildren().addAll(object36); + object34.getButtons().addAll(object35); + object33.setContent(object34); + object32.getChildren().addAll(object33); + object29.getChildren().addAll(object32); + object28.getChildren().addAll(object29); + object27.getChildren().addAll(object28); + object26.getChildren().addAll(object27); + object25.setContent(object26); + object24.getItems().addAll(object25); + object23.getChildren().addAll(object24); + object22.setContent(object23); + object21.getTabs().addAll(object22); + object20.getChildren().addAll(object21); + object19.getChildren().addAll(object20); + object18.setContent(object19); + object17.getItems().addAll(object18); + object16.getChildren().addAll(object17); + object0.setCenter(object16); + final var controllerFactory = controllersMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + controller = (com.github.gtache.fxml.compiler.impl.IncludesController) controllerFactory.create(fieldMap); + object9.setOnAction(e -> callMethod("playPressed", e)); + try { + final var initialize = controller.getClass().getDeclaredMethod("initialize"); + initialize.setAccessible(true); + initialize.invoke(controller); + } catch (final InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection", e); + } catch (final NoSuchMethodException ignored) { + } + loaded = true; + return object0; +} + + private void callMethod(final String methodName, final T event) { + try { + final Method method; + final var methods = Arrays.stream(controller.getClass().getDeclaredMethods()) + .filter(m -> m.getName().equals(methodName)).toList(); + if (methods.size() > 1) { + final var eventMethods = methods.stream().filter(m -> + m.getParameterCount() == 1 && Event.class.isAssignableFrom(m.getParameterTypes()[0])).toList(); + if (eventMethods.size() == 1) { + method = eventMethods.getFirst(); + } else { + final var emptyMethods = methods.stream().filter(m -> m.getParameterCount() == 0).toList(); + if (emptyMethods.size() == 1) { + method = emptyMethods.getFirst(); + } else { + throw new IllegalArgumentException("Multiple matching methods for " + methodName); + } + } + } else if (methods.size() == 1) { + method = methods.getFirst(); + } else { + throw new IllegalArgumentException("No matching method for " + methodName); + } + method.setAccessible(true); + if (method.getParameterCount() == 0) { + method.invoke(controller); + } else { + method.invoke(controller, event); + } + } catch (final IllegalAccessException | InvocationTargetException ex) { + throw new RuntimeException("Error using reflection on " + methodName, ex); + } +} + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.IncludesController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-factory-reflection-getter.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-factory-reflection-getter.txt new file mode 100644 index 0000000..3064169 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-factory-reflection-getter.txt @@ -0,0 +1,228 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; +import com.github.gtache.fxml.compiler.ControllerFactory; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import javafx.event.Event; +import java.lang.reflect.Method; + + +/** + * Generated code, not thread-safe + */ +public final class IncludesController { + + private final Map, ControllerFactory> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.IncludesController controller; + + /** + * Instantiates a new IncludesController with no nested controllers and no resource bundle + * @param controllerFactory The controller factory + */ + public IncludesController(final ControllerFactory controllerFactory) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controllerFactory), Map.of()); + } + + /** + * Instantiates a new IncludesController with no nested controllers + * @param controllerFactory The controller factory + * @param resourceBundle The resource bundle + */ + public IncludesController(final ControllerFactory controllerFactory, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controllerFactory), Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, resourceBundle)); + } + + /** + * Instantiates a new IncludesController with nested controllers + * @param controllersMap The map of controller class to controller factory + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public IncludesController(final Map, ControllerFactory> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var fieldMap = new HashMap(); + final var object0 = new javafx.scene.layout.BorderPane(); + final var object1 = new javafx.scene.layout.VBox(); + javafx.scene.layout.BorderPane.setAlignment(object1, javafx.geometry.Pos.CENTER); + final var object2 = new javafx.scene.layout.HBox(); + object2.setAlignment(javafx.geometry.Pos.CENTER); + object2.setSpacing(10.0); + final var object3 = new javafx.scene.control.Slider(); + fieldMap.put("playSlider", object3); + javafx.scene.layout.HBox.setHgrow(object3, javafx.scene.layout.Priority.ALWAYS); + final var object4 = new javafx.geometry.Insets(0, 0, 0, 10.0); + object3.setPadding(object4); + final var object5 = new javafx.scene.control.Label(); + fieldMap.put("playLabel", object5); + object5.setText("Label"); + final var object6 = new javafx.geometry.Insets(0, 10.0, 0, 0); + object5.setPadding(object6); + object2.getChildren().addAll(object3, object5); + final var object7 = new javafx.geometry.Insets(10.0, 0, 0, 0); + object2.setPadding(object7); + final var object8 = new javafx.scene.layout.HBox(); + object8.setAlignment(javafx.geometry.Pos.CENTER); + object8.setSpacing(10.0); + final var object9 = new javafx.scene.control.Button(); + fieldMap.put("playButton", object9); + object9.setMnemonicParsing(false); + final var object10 = new javafx.geometry.Insets(0, 20.0, 0, 0); + javafx.scene.layout.HBox.setMargin(object9, object10); + final var object11 = new javafx.scene.control.Label(); + final var object12 = new javafx.scene.control.Slider(); + fieldMap.put("volumeSlider", object12); + object12.setValue(100); + final var object13 = new javafx.scene.control.Label(); + fieldMap.put("volumeValueLabel", object13); + object13.setText("Label"); + final var map0 = new HashMap<>(resourceBundlesMap); + final var bundle0 = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + map0.put(com.github.gtache.fxml.compiler.impl.ControlsController, bundle0); + final var view0 = new com.github.gtache.fxml.compiler.impl.ControlsView(controllersMap, map0); + final var object14 = view0.load(); + final var controller0 = view0.controller(); + fieldMap.put("controlsController", controller0); + object8.getChildren().addAll(object9, object11, object12, object13, object14); + final var object15 = new javafx.geometry.Insets(10.0, 10.0, 10.0, 10.0); + object8.setPadding(object15); + object1.getChildren().addAll(object2, object8); + object0.setBottom(object1); + final var object16 = new javafx.scene.layout.VBox(); + fieldMap.put("vbox", object16); + final var object17 = new javafx.scene.control.ToolBar(); + fieldMap.put("toolBar", object17); + final var object18 = new javafx.scene.control.TitledPane(); + fieldMap.put("titledPane", object18); + final var object19 = new javafx.scene.layout.TilePane(); + fieldMap.put("tilePane", object19); + final var object20 = new javafx.scene.text.TextFlow(); + fieldMap.put("textFlow", object20); + final var object21 = new javafx.scene.control.TabPane(); + fieldMap.put("tabPane", object21); + final var object22 = new javafx.scene.control.Tab(); + fieldMap.put("tab", object22); + final var object23 = new javafx.scene.layout.StackPane(); + fieldMap.put("stackPane", object23); + final var object24 = new javafx.scene.control.SplitPane(); + fieldMap.put("splitPane", object24); + final var object25 = new javafx.scene.control.ScrollPane(); + fieldMap.put("scrollPane", object25); + final var object26 = new javafx.scene.layout.Pane(); + fieldMap.put("pane", object26); + final var object27 = new javafx.scene.layout.HBox(); + fieldMap.put("hbox", object27); + final var object28 = new javafx.scene.Group(); + fieldMap.put("group", object28); + final var object29 = new javafx.scene.layout.GridPane(); + fieldMap.put("gridPane", object29); + final var object30 = new javafx.scene.layout.ColumnConstraints(); + fieldMap.put("columnConstraints", object30); + object30.setHgrow(javafx.scene.layout.Priority.SOMETIMES); + object30.setMinWidth(10.0); + object29.getColumnConstraints().addAll(object30); + final var object31 = new javafx.scene.layout.RowConstraints(); + object31.setMinHeight(10.0); + object31.setVgrow(javafx.scene.layout.Priority.SOMETIMES); + object29.getRowConstraints().addAll(object31); + final var object32 = new javafx.scene.layout.FlowPane(); + fieldMap.put("flowPane", object32); + final var object33 = new javafx.scene.control.DialogPane(); + fieldMap.put("dialogPane", object33); + final var object34 = new javafx.scene.control.ButtonBar(); + fieldMap.put("buttonBar", object34); + final var object35 = new javafx.scene.layout.AnchorPane(); + fieldMap.put("anchorPane", object35); + final var object36 = new javafx.scene.control.Label(); + object36.setManaged(false); + object35.getChildren().addAll(object36); + object34.getButtons().addAll(object35); + object33.setContent(object34); + object32.getChildren().addAll(object33); + object29.getChildren().addAll(object32); + object28.getChildren().addAll(object29); + object27.getChildren().addAll(object28); + object26.getChildren().addAll(object27); + object25.setContent(object26); + object24.getItems().addAll(object25); + object23.getChildren().addAll(object24); + object22.setContent(object23); + object21.getTabs().addAll(object22); + object20.getChildren().addAll(object21); + object19.getChildren().addAll(object20); + object18.setContent(object19); + object17.getItems().addAll(object18); + object16.getChildren().addAll(object17); + object0.setCenter(object16); + final var controllerFactory = controllersMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + controller = (com.github.gtache.fxml.compiler.impl.IncludesController) controllerFactory.create(fieldMap); + object9.setOnAction(e -> callMethod("playPressed", e)); + object11.setText(controller.resources().getString("media.volume.label")); + try { + final var initialize = controller.getClass().getDeclaredMethod("initialize"); + initialize.setAccessible(true); + initialize.invoke(controller); + } catch (final InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection", e); + } catch (final NoSuchMethodException ignored) { + } + loaded = true; + return object0; +} + + private void callMethod(final String methodName, final T event) { + try { + final Method method; + final var methods = Arrays.stream(controller.getClass().getDeclaredMethods()) + .filter(m -> m.getName().equals(methodName)).toList(); + if (methods.size() > 1) { + final var eventMethods = methods.stream().filter(m -> + m.getParameterCount() == 1 && Event.class.isAssignableFrom(m.getParameterTypes()[0])).toList(); + if (eventMethods.size() == 1) { + method = eventMethods.getFirst(); + } else { + final var emptyMethods = methods.stream().filter(m -> m.getParameterCount() == 0).toList(); + if (emptyMethods.size() == 1) { + method = emptyMethods.getFirst(); + } else { + throw new IllegalArgumentException("Multiple matching methods for " + methodName); + } + } + } else if (methods.size() == 1) { + method = methods.getFirst(); + } else { + throw new IllegalArgumentException("No matching method for " + methodName); + } + method.setAccessible(true); + if (method.getParameterCount() == 0) { + method.invoke(controller); + } else { + method.invoke(controller, event); + } + } catch (final IllegalAccessException | InvocationTargetException ex) { + throw new RuntimeException("Error using reflection on " + methodName, ex); + } +} + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.IncludesController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-reflection-reference-constructor.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-reflection-reference-constructor.txt new file mode 100644 index 0000000..0e1bd4e --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-reflection-reference-constructor.txt @@ -0,0 +1,191 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; + + +/** + * Generated code, not thread-safe + */ +public final class IncludesController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.IncludesController controller; + + /** + * Instantiates a new IncludesController with no nested controllers and no resource bundle + * @param controller The controller + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of()); + } + + /** + * Instantiates a new IncludesController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, resourceBundle)); + } + + /** + * Instantiates a new IncludesController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public IncludesController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = resourceBundlesMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + controller = (com.github.gtache.fxml.compiler.impl.IncludesController) controllersMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + final var object0 = new javafx.scene.layout.BorderPane(); + final var object1 = new javafx.scene.layout.VBox(); + javafx.scene.layout.BorderPane.setAlignment(object1, javafx.geometry.Pos.CENTER); + final var object2 = new javafx.scene.layout.HBox(); + object2.setAlignment(javafx.geometry.Pos.CENTER); + object2.setSpacing(10.0); + final var object3 = new javafx.scene.control.Slider(); + injectField("playSlider", object3); + javafx.scene.layout.HBox.setHgrow(object3, javafx.scene.layout.Priority.ALWAYS); + final var object4 = new javafx.geometry.Insets(0, 0, 0, 10.0); + object3.setPadding(object4); + final var object5 = new javafx.scene.control.Label(); + injectField("playLabel", object5); + object5.setText("Label"); + final var object6 = new javafx.geometry.Insets(0, 10.0, 0, 0); + object5.setPadding(object6); + object2.getChildren().addAll(object3, object5); + final var object7 = new javafx.geometry.Insets(10.0, 0, 0, 0); + object2.setPadding(object7); + final var object8 = new javafx.scene.layout.HBox(); + object8.setAlignment(javafx.geometry.Pos.CENTER); + object8.setSpacing(10.0); + final var object9 = new javafx.scene.control.Button(); + injectField("playButton", object9); + object9.setMnemonicParsing(false); + object9.setOnAction(controller::playPressed); + final var object10 = new javafx.geometry.Insets(0, 20.0, 0, 0); + javafx.scene.layout.HBox.setMargin(object9, object10); + final var object11 = new javafx.scene.control.Label(); + object11.setText(bundle.getString("media.volume.label")); + final var object12 = new javafx.scene.control.Slider(); + injectField("volumeSlider", object12); + object12.setValue(100); + final var object13 = new javafx.scene.control.Label(); + injectField("volumeValueLabel", object13); + object13.setText("Label"); + final var map0 = new HashMap<>(resourceBundlesMap); + final var bundle0 = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + map0.put(com.github.gtache.fxml.compiler.impl.ControlsController, bundle0); + final var view0 = new com.github.gtache.fxml.compiler.impl.ControlsView(controllersMap, map0); + final var object14 = view0.load(); + final var controller0 = view0.controller(); + injectField("controlsController", controller0); + object8.getChildren().addAll(object9, object11, object12, object13, object14); + final var object15 = new javafx.geometry.Insets(10.0, 10.0, 10.0, 10.0); + object8.setPadding(object15); + object1.getChildren().addAll(object2, object8); + object0.setBottom(object1); + final var object16 = new javafx.scene.layout.VBox(); + injectField("vbox", object16); + final var object17 = new javafx.scene.control.ToolBar(); + injectField("toolBar", object17); + final var object18 = new javafx.scene.control.TitledPane(); + injectField("titledPane", object18); + final var object19 = new javafx.scene.layout.TilePane(); + injectField("tilePane", object19); + final var object20 = new javafx.scene.text.TextFlow(); + injectField("textFlow", object20); + final var object21 = new javafx.scene.control.TabPane(); + injectField("tabPane", object21); + final var object22 = new javafx.scene.control.Tab(); + injectField("tab", object22); + final var object23 = new javafx.scene.layout.StackPane(); + injectField("stackPane", object23); + final var object24 = new javafx.scene.control.SplitPane(); + injectField("splitPane", object24); + final var object25 = new javafx.scene.control.ScrollPane(); + injectField("scrollPane", object25); + final var object26 = new javafx.scene.layout.Pane(); + injectField("pane", object26); + final var object27 = new javafx.scene.layout.HBox(); + injectField("hbox", object27); + final var object28 = new javafx.scene.Group(); + injectField("group", object28); + final var object29 = new javafx.scene.layout.GridPane(); + injectField("gridPane", object29); + final var object30 = new javafx.scene.layout.ColumnConstraints(); + injectField("columnConstraints", object30); + object30.setHgrow(javafx.scene.layout.Priority.SOMETIMES); + object30.setMinWidth(10.0); + object29.getColumnConstraints().addAll(object30); + final var object31 = new javafx.scene.layout.RowConstraints(); + object31.setMinHeight(10.0); + object31.setVgrow(javafx.scene.layout.Priority.SOMETIMES); + object29.getRowConstraints().addAll(object31); + final var object32 = new javafx.scene.layout.FlowPane(); + injectField("flowPane", object32); + final var object33 = new javafx.scene.control.DialogPane(); + injectField("dialogPane", object33); + final var object34 = new javafx.scene.control.ButtonBar(); + injectField("buttonBar", object34); + final var object35 = new javafx.scene.layout.AnchorPane(); + injectField("anchorPane", object35); + final var object36 = new javafx.scene.control.Label(); + object36.setManaged(false); + object35.getChildren().addAll(object36); + object34.getButtons().addAll(object35); + object33.setContent(object34); + object32.getChildren().addAll(object33); + object29.getChildren().addAll(object32); + object28.getChildren().addAll(object29); + object27.getChildren().addAll(object28); + object26.getChildren().addAll(object27); + object25.setContent(object26); + object24.getItems().addAll(object25); + object23.getChildren().addAll(object24); + object22.setContent(object23); + object21.getTabs().addAll(object22); + object20.getChildren().addAll(object21); + object19.getChildren().addAll(object20); + object18.setContent(object19); + object17.getItems().addAll(object18); + object16.getChildren().addAll(object17); + object0.setCenter(object16); + controller.initialize(); + loaded = true; + return object0; +} + + private void injectField(final String fieldName, final T object) { + try { + final var field = controller.getClass().getDeclaredField(fieldName); + field.setAccessible(true); + field.set(controller, object); + } catch (final NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection on " + fieldName, e); + } +} + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.IncludesController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-reflection-reference-getbundle.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-reflection-reference-getbundle.txt new file mode 100644 index 0000000..bf21835 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-reflection-reference-getbundle.txt @@ -0,0 +1,191 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; + + +/** + * Generated code, not thread-safe + */ +public final class IncludesController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.IncludesController controller; + + /** + * Instantiates a new IncludesController with no nested controllers and no resource bundle + * @param controller The controller + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of()); + } + + /** + * Instantiates a new IncludesController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, resourceBundle)); + } + + /** + * Instantiates a new IncludesController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public IncludesController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.IncludesBundle"); + controller = (com.github.gtache.fxml.compiler.impl.IncludesController) controllersMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + final var object0 = new javafx.scene.layout.BorderPane(); + final var object1 = new javafx.scene.layout.VBox(); + javafx.scene.layout.BorderPane.setAlignment(object1, javafx.geometry.Pos.CENTER); + final var object2 = new javafx.scene.layout.HBox(); + object2.setAlignment(javafx.geometry.Pos.CENTER); + object2.setSpacing(10.0); + final var object3 = new javafx.scene.control.Slider(); + injectField("playSlider", object3); + javafx.scene.layout.HBox.setHgrow(object3, javafx.scene.layout.Priority.ALWAYS); + final var object4 = new javafx.geometry.Insets(0, 0, 0, 10.0); + object3.setPadding(object4); + final var object5 = new javafx.scene.control.Label(); + injectField("playLabel", object5); + object5.setText("Label"); + final var object6 = new javafx.geometry.Insets(0, 10.0, 0, 0); + object5.setPadding(object6); + object2.getChildren().addAll(object3, object5); + final var object7 = new javafx.geometry.Insets(10.0, 0, 0, 0); + object2.setPadding(object7); + final var object8 = new javafx.scene.layout.HBox(); + object8.setAlignment(javafx.geometry.Pos.CENTER); + object8.setSpacing(10.0); + final var object9 = new javafx.scene.control.Button(); + injectField("playButton", object9); + object9.setMnemonicParsing(false); + object9.setOnAction(controller::playPressed); + final var object10 = new javafx.geometry.Insets(0, 20.0, 0, 0); + javafx.scene.layout.HBox.setMargin(object9, object10); + final var object11 = new javafx.scene.control.Label(); + object11.setText(bundle.getString("media.volume.label")); + final var object12 = new javafx.scene.control.Slider(); + injectField("volumeSlider", object12); + object12.setValue(100); + final var object13 = new javafx.scene.control.Label(); + injectField("volumeValueLabel", object13); + object13.setText("Label"); + final var map0 = new HashMap<>(resourceBundlesMap); + final var bundle0 = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + map0.put(com.github.gtache.fxml.compiler.impl.ControlsController, bundle0); + final var view0 = new com.github.gtache.fxml.compiler.impl.ControlsView(controllersMap, map0); + final var object14 = view0.load(); + final var controller0 = view0.controller(); + injectField("controlsController", controller0); + object8.getChildren().addAll(object9, object11, object12, object13, object14); + final var object15 = new javafx.geometry.Insets(10.0, 10.0, 10.0, 10.0); + object8.setPadding(object15); + object1.getChildren().addAll(object2, object8); + object0.setBottom(object1); + final var object16 = new javafx.scene.layout.VBox(); + injectField("vbox", object16); + final var object17 = new javafx.scene.control.ToolBar(); + injectField("toolBar", object17); + final var object18 = new javafx.scene.control.TitledPane(); + injectField("titledPane", object18); + final var object19 = new javafx.scene.layout.TilePane(); + injectField("tilePane", object19); + final var object20 = new javafx.scene.text.TextFlow(); + injectField("textFlow", object20); + final var object21 = new javafx.scene.control.TabPane(); + injectField("tabPane", object21); + final var object22 = new javafx.scene.control.Tab(); + injectField("tab", object22); + final var object23 = new javafx.scene.layout.StackPane(); + injectField("stackPane", object23); + final var object24 = new javafx.scene.control.SplitPane(); + injectField("splitPane", object24); + final var object25 = new javafx.scene.control.ScrollPane(); + injectField("scrollPane", object25); + final var object26 = new javafx.scene.layout.Pane(); + injectField("pane", object26); + final var object27 = new javafx.scene.layout.HBox(); + injectField("hbox", object27); + final var object28 = new javafx.scene.Group(); + injectField("group", object28); + final var object29 = new javafx.scene.layout.GridPane(); + injectField("gridPane", object29); + final var object30 = new javafx.scene.layout.ColumnConstraints(); + injectField("columnConstraints", object30); + object30.setHgrow(javafx.scene.layout.Priority.SOMETIMES); + object30.setMinWidth(10.0); + object29.getColumnConstraints().addAll(object30); + final var object31 = new javafx.scene.layout.RowConstraints(); + object31.setMinHeight(10.0); + object31.setVgrow(javafx.scene.layout.Priority.SOMETIMES); + object29.getRowConstraints().addAll(object31); + final var object32 = new javafx.scene.layout.FlowPane(); + injectField("flowPane", object32); + final var object33 = new javafx.scene.control.DialogPane(); + injectField("dialogPane", object33); + final var object34 = new javafx.scene.control.ButtonBar(); + injectField("buttonBar", object34); + final var object35 = new javafx.scene.layout.AnchorPane(); + injectField("anchorPane", object35); + final var object36 = new javafx.scene.control.Label(); + object36.setManaged(false); + object35.getChildren().addAll(object36); + object34.getButtons().addAll(object35); + object33.setContent(object34); + object32.getChildren().addAll(object33); + object29.getChildren().addAll(object32); + object28.getChildren().addAll(object29); + object27.getChildren().addAll(object28); + object26.getChildren().addAll(object27); + object25.setContent(object26); + object24.getItems().addAll(object25); + object23.getChildren().addAll(object24); + object22.setContent(object23); + object21.getTabs().addAll(object22); + object20.getChildren().addAll(object21); + object19.getChildren().addAll(object20); + object18.setContent(object19); + object17.getItems().addAll(object18); + object16.getChildren().addAll(object17); + object0.setCenter(object16); + controller.initialize(); + loaded = true; + return object0; +} + + private void injectField(final String fieldName, final T object) { + try { + final var field = controller.getClass().getDeclaredField(fieldName); + field.setAccessible(true); + field.set(controller, object); + } catch (final NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection on " + fieldName, e); + } +} + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.IncludesController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-reflection-reference-getter.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-reflection-reference-getter.txt new file mode 100644 index 0000000..ebeb2b6 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-reflection-reference-getter.txt @@ -0,0 +1,190 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; + + +/** + * Generated code, not thread-safe + */ +public final class IncludesController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.IncludesController controller; + + /** + * Instantiates a new IncludesController with no nested controllers and no resource bundle + * @param controller The controller + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of()); + } + + /** + * Instantiates a new IncludesController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, resourceBundle)); + } + + /** + * Instantiates a new IncludesController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public IncludesController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + controller = (com.github.gtache.fxml.compiler.impl.IncludesController) controllersMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + final var object0 = new javafx.scene.layout.BorderPane(); + final var object1 = new javafx.scene.layout.VBox(); + javafx.scene.layout.BorderPane.setAlignment(object1, javafx.geometry.Pos.CENTER); + final var object2 = new javafx.scene.layout.HBox(); + object2.setAlignment(javafx.geometry.Pos.CENTER); + object2.setSpacing(10.0); + final var object3 = new javafx.scene.control.Slider(); + injectField("playSlider", object3); + javafx.scene.layout.HBox.setHgrow(object3, javafx.scene.layout.Priority.ALWAYS); + final var object4 = new javafx.geometry.Insets(0, 0, 0, 10.0); + object3.setPadding(object4); + final var object5 = new javafx.scene.control.Label(); + injectField("playLabel", object5); + object5.setText("Label"); + final var object6 = new javafx.geometry.Insets(0, 10.0, 0, 0); + object5.setPadding(object6); + object2.getChildren().addAll(object3, object5); + final var object7 = new javafx.geometry.Insets(10.0, 0, 0, 0); + object2.setPadding(object7); + final var object8 = new javafx.scene.layout.HBox(); + object8.setAlignment(javafx.geometry.Pos.CENTER); + object8.setSpacing(10.0); + final var object9 = new javafx.scene.control.Button(); + injectField("playButton", object9); + object9.setMnemonicParsing(false); + object9.setOnAction(controller::playPressed); + final var object10 = new javafx.geometry.Insets(0, 20.0, 0, 0); + javafx.scene.layout.HBox.setMargin(object9, object10); + final var object11 = new javafx.scene.control.Label(); + object11.setText(controller.resources().getString("media.volume.label")); + final var object12 = new javafx.scene.control.Slider(); + injectField("volumeSlider", object12); + object12.setValue(100); + final var object13 = new javafx.scene.control.Label(); + injectField("volumeValueLabel", object13); + object13.setText("Label"); + final var map0 = new HashMap<>(resourceBundlesMap); + final var bundle0 = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + map0.put(com.github.gtache.fxml.compiler.impl.ControlsController, bundle0); + final var view0 = new com.github.gtache.fxml.compiler.impl.ControlsView(controllersMap, map0); + final var object14 = view0.load(); + final var controller0 = view0.controller(); + injectField("controlsController", controller0); + object8.getChildren().addAll(object9, object11, object12, object13, object14); + final var object15 = new javafx.geometry.Insets(10.0, 10.0, 10.0, 10.0); + object8.setPadding(object15); + object1.getChildren().addAll(object2, object8); + object0.setBottom(object1); + final var object16 = new javafx.scene.layout.VBox(); + injectField("vbox", object16); + final var object17 = new javafx.scene.control.ToolBar(); + injectField("toolBar", object17); + final var object18 = new javafx.scene.control.TitledPane(); + injectField("titledPane", object18); + final var object19 = new javafx.scene.layout.TilePane(); + injectField("tilePane", object19); + final var object20 = new javafx.scene.text.TextFlow(); + injectField("textFlow", object20); + final var object21 = new javafx.scene.control.TabPane(); + injectField("tabPane", object21); + final var object22 = new javafx.scene.control.Tab(); + injectField("tab", object22); + final var object23 = new javafx.scene.layout.StackPane(); + injectField("stackPane", object23); + final var object24 = new javafx.scene.control.SplitPane(); + injectField("splitPane", object24); + final var object25 = new javafx.scene.control.ScrollPane(); + injectField("scrollPane", object25); + final var object26 = new javafx.scene.layout.Pane(); + injectField("pane", object26); + final var object27 = new javafx.scene.layout.HBox(); + injectField("hbox", object27); + final var object28 = new javafx.scene.Group(); + injectField("group", object28); + final var object29 = new javafx.scene.layout.GridPane(); + injectField("gridPane", object29); + final var object30 = new javafx.scene.layout.ColumnConstraints(); + injectField("columnConstraints", object30); + object30.setHgrow(javafx.scene.layout.Priority.SOMETIMES); + object30.setMinWidth(10.0); + object29.getColumnConstraints().addAll(object30); + final var object31 = new javafx.scene.layout.RowConstraints(); + object31.setMinHeight(10.0); + object31.setVgrow(javafx.scene.layout.Priority.SOMETIMES); + object29.getRowConstraints().addAll(object31); + final var object32 = new javafx.scene.layout.FlowPane(); + injectField("flowPane", object32); + final var object33 = new javafx.scene.control.DialogPane(); + injectField("dialogPane", object33); + final var object34 = new javafx.scene.control.ButtonBar(); + injectField("buttonBar", object34); + final var object35 = new javafx.scene.layout.AnchorPane(); + injectField("anchorPane", object35); + final var object36 = new javafx.scene.control.Label(); + object36.setManaged(false); + object35.getChildren().addAll(object36); + object34.getButtons().addAll(object35); + object33.setContent(object34); + object32.getChildren().addAll(object33); + object29.getChildren().addAll(object32); + object28.getChildren().addAll(object29); + object27.getChildren().addAll(object28); + object26.getChildren().addAll(object27); + object25.setContent(object26); + object24.getItems().addAll(object25); + object23.getChildren().addAll(object24); + object22.setContent(object23); + object21.getTabs().addAll(object22); + object20.getChildren().addAll(object21); + object19.getChildren().addAll(object20); + object18.setContent(object19); + object17.getItems().addAll(object18); + object16.getChildren().addAll(object17); + object0.setCenter(object16); + controller.initialize(); + loaded = true; + return object0; +} + + private void injectField(final String fieldName, final T object) { + try { + final var field = controller.getClass().getDeclaredField(fieldName); + field.setAccessible(true); + field.set(controller, object); + } catch (final NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection on " + fieldName, e); + } +} + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.IncludesController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-reflection-reflection-constructor.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-reflection-reflection-constructor.txt new file mode 100644 index 0000000..d37428a --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-reflection-reflection-constructor.txt @@ -0,0 +1,235 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import javafx.event.Event; +import java.lang.reflect.Method; + + +/** + * Generated code, not thread-safe + */ +public final class IncludesController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.IncludesController controller; + + /** + * Instantiates a new IncludesController with no nested controllers and no resource bundle + * @param controller The controller + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of()); + } + + /** + * Instantiates a new IncludesController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, resourceBundle)); + } + + /** + * Instantiates a new IncludesController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public IncludesController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = resourceBundlesMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + controller = (com.github.gtache.fxml.compiler.impl.IncludesController) controllersMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + final var object0 = new javafx.scene.layout.BorderPane(); + final var object1 = new javafx.scene.layout.VBox(); + javafx.scene.layout.BorderPane.setAlignment(object1, javafx.geometry.Pos.CENTER); + final var object2 = new javafx.scene.layout.HBox(); + object2.setAlignment(javafx.geometry.Pos.CENTER); + object2.setSpacing(10.0); + final var object3 = new javafx.scene.control.Slider(); + injectField("playSlider", object3); + javafx.scene.layout.HBox.setHgrow(object3, javafx.scene.layout.Priority.ALWAYS); + final var object4 = new javafx.geometry.Insets(0, 0, 0, 10.0); + object3.setPadding(object4); + final var object5 = new javafx.scene.control.Label(); + injectField("playLabel", object5); + object5.setText("Label"); + final var object6 = new javafx.geometry.Insets(0, 10.0, 0, 0); + object5.setPadding(object6); + object2.getChildren().addAll(object3, object5); + final var object7 = new javafx.geometry.Insets(10.0, 0, 0, 0); + object2.setPadding(object7); + final var object8 = new javafx.scene.layout.HBox(); + object8.setAlignment(javafx.geometry.Pos.CENTER); + object8.setSpacing(10.0); + final var object9 = new javafx.scene.control.Button(); + injectField("playButton", object9); + object9.setMnemonicParsing(false); + object9.setOnAction(e -> callMethod("playPressed", e)); + final var object10 = new javafx.geometry.Insets(0, 20.0, 0, 0); + javafx.scene.layout.HBox.setMargin(object9, object10); + final var object11 = new javafx.scene.control.Label(); + object11.setText(bundle.getString("media.volume.label")); + final var object12 = new javafx.scene.control.Slider(); + injectField("volumeSlider", object12); + object12.setValue(100); + final var object13 = new javafx.scene.control.Label(); + injectField("volumeValueLabel", object13); + object13.setText("Label"); + final var map0 = new HashMap<>(resourceBundlesMap); + final var bundle0 = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + map0.put(com.github.gtache.fxml.compiler.impl.ControlsController, bundle0); + final var view0 = new com.github.gtache.fxml.compiler.impl.ControlsView(controllersMap, map0); + final var object14 = view0.load(); + final var controller0 = view0.controller(); + injectField("controlsController", controller0); + object8.getChildren().addAll(object9, object11, object12, object13, object14); + final var object15 = new javafx.geometry.Insets(10.0, 10.0, 10.0, 10.0); + object8.setPadding(object15); + object1.getChildren().addAll(object2, object8); + object0.setBottom(object1); + final var object16 = new javafx.scene.layout.VBox(); + injectField("vbox", object16); + final var object17 = new javafx.scene.control.ToolBar(); + injectField("toolBar", object17); + final var object18 = new javafx.scene.control.TitledPane(); + injectField("titledPane", object18); + final var object19 = new javafx.scene.layout.TilePane(); + injectField("tilePane", object19); + final var object20 = new javafx.scene.text.TextFlow(); + injectField("textFlow", object20); + final var object21 = new javafx.scene.control.TabPane(); + injectField("tabPane", object21); + final var object22 = new javafx.scene.control.Tab(); + injectField("tab", object22); + final var object23 = new javafx.scene.layout.StackPane(); + injectField("stackPane", object23); + final var object24 = new javafx.scene.control.SplitPane(); + injectField("splitPane", object24); + final var object25 = new javafx.scene.control.ScrollPane(); + injectField("scrollPane", object25); + final var object26 = new javafx.scene.layout.Pane(); + injectField("pane", object26); + final var object27 = new javafx.scene.layout.HBox(); + injectField("hbox", object27); + final var object28 = new javafx.scene.Group(); + injectField("group", object28); + final var object29 = new javafx.scene.layout.GridPane(); + injectField("gridPane", object29); + final var object30 = new javafx.scene.layout.ColumnConstraints(); + injectField("columnConstraints", object30); + object30.setHgrow(javafx.scene.layout.Priority.SOMETIMES); + object30.setMinWidth(10.0); + object29.getColumnConstraints().addAll(object30); + final var object31 = new javafx.scene.layout.RowConstraints(); + object31.setMinHeight(10.0); + object31.setVgrow(javafx.scene.layout.Priority.SOMETIMES); + object29.getRowConstraints().addAll(object31); + final var object32 = new javafx.scene.layout.FlowPane(); + injectField("flowPane", object32); + final var object33 = new javafx.scene.control.DialogPane(); + injectField("dialogPane", object33); + final var object34 = new javafx.scene.control.ButtonBar(); + injectField("buttonBar", object34); + final var object35 = new javafx.scene.layout.AnchorPane(); + injectField("anchorPane", object35); + final var object36 = new javafx.scene.control.Label(); + object36.setManaged(false); + object35.getChildren().addAll(object36); + object34.getButtons().addAll(object35); + object33.setContent(object34); + object32.getChildren().addAll(object33); + object29.getChildren().addAll(object32); + object28.getChildren().addAll(object29); + object27.getChildren().addAll(object28); + object26.getChildren().addAll(object27); + object25.setContent(object26); + object24.getItems().addAll(object25); + object23.getChildren().addAll(object24); + object22.setContent(object23); + object21.getTabs().addAll(object22); + object20.getChildren().addAll(object21); + object19.getChildren().addAll(object20); + object18.setContent(object19); + object17.getItems().addAll(object18); + object16.getChildren().addAll(object17); + object0.setCenter(object16); + try { + final var initialize = controller.getClass().getDeclaredMethod("initialize"); + initialize.setAccessible(true); + initialize.invoke(controller); + } catch (final InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection", e); + } catch (final NoSuchMethodException ignored) { + } + loaded = true; + return object0; +} + + private void callMethod(final String methodName, final T event) { + try { + final Method method; + final var methods = Arrays.stream(controller.getClass().getDeclaredMethods()) + .filter(m -> m.getName().equals(methodName)).toList(); + if (methods.size() > 1) { + final var eventMethods = methods.stream().filter(m -> + m.getParameterCount() == 1 && Event.class.isAssignableFrom(m.getParameterTypes()[0])).toList(); + if (eventMethods.size() == 1) { + method = eventMethods.getFirst(); + } else { + final var emptyMethods = methods.stream().filter(m -> m.getParameterCount() == 0).toList(); + if (emptyMethods.size() == 1) { + method = emptyMethods.getFirst(); + } else { + throw new IllegalArgumentException("Multiple matching methods for " + methodName); + } + } + } else if (methods.size() == 1) { + method = methods.getFirst(); + } else { + throw new IllegalArgumentException("No matching method for " + methodName); + } + method.setAccessible(true); + if (method.getParameterCount() == 0) { + method.invoke(controller); + } else { + method.invoke(controller, event); + } + } catch (final IllegalAccessException | InvocationTargetException ex) { + throw new RuntimeException("Error using reflection on " + methodName, ex); + } +} +private void injectField(final String fieldName, final T object) { + try { + final var field = controller.getClass().getDeclaredField(fieldName); + field.setAccessible(true); + field.set(controller, object); + } catch (final NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection on " + fieldName, e); + } +} + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.IncludesController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-reflection-reflection-getbundle.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-reflection-reflection-getbundle.txt new file mode 100644 index 0000000..f51d579 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-reflection-reflection-getbundle.txt @@ -0,0 +1,235 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import javafx.event.Event; +import java.lang.reflect.Method; + + +/** + * Generated code, not thread-safe + */ +public final class IncludesController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.IncludesController controller; + + /** + * Instantiates a new IncludesController with no nested controllers and no resource bundle + * @param controller The controller + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of()); + } + + /** + * Instantiates a new IncludesController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, resourceBundle)); + } + + /** + * Instantiates a new IncludesController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public IncludesController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.IncludesBundle"); + controller = (com.github.gtache.fxml.compiler.impl.IncludesController) controllersMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + final var object0 = new javafx.scene.layout.BorderPane(); + final var object1 = new javafx.scene.layout.VBox(); + javafx.scene.layout.BorderPane.setAlignment(object1, javafx.geometry.Pos.CENTER); + final var object2 = new javafx.scene.layout.HBox(); + object2.setAlignment(javafx.geometry.Pos.CENTER); + object2.setSpacing(10.0); + final var object3 = new javafx.scene.control.Slider(); + injectField("playSlider", object3); + javafx.scene.layout.HBox.setHgrow(object3, javafx.scene.layout.Priority.ALWAYS); + final var object4 = new javafx.geometry.Insets(0, 0, 0, 10.0); + object3.setPadding(object4); + final var object5 = new javafx.scene.control.Label(); + injectField("playLabel", object5); + object5.setText("Label"); + final var object6 = new javafx.geometry.Insets(0, 10.0, 0, 0); + object5.setPadding(object6); + object2.getChildren().addAll(object3, object5); + final var object7 = new javafx.geometry.Insets(10.0, 0, 0, 0); + object2.setPadding(object7); + final var object8 = new javafx.scene.layout.HBox(); + object8.setAlignment(javafx.geometry.Pos.CENTER); + object8.setSpacing(10.0); + final var object9 = new javafx.scene.control.Button(); + injectField("playButton", object9); + object9.setMnemonicParsing(false); + object9.setOnAction(e -> callMethod("playPressed", e)); + final var object10 = new javafx.geometry.Insets(0, 20.0, 0, 0); + javafx.scene.layout.HBox.setMargin(object9, object10); + final var object11 = new javafx.scene.control.Label(); + object11.setText(bundle.getString("media.volume.label")); + final var object12 = new javafx.scene.control.Slider(); + injectField("volumeSlider", object12); + object12.setValue(100); + final var object13 = new javafx.scene.control.Label(); + injectField("volumeValueLabel", object13); + object13.setText("Label"); + final var map0 = new HashMap<>(resourceBundlesMap); + final var bundle0 = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + map0.put(com.github.gtache.fxml.compiler.impl.ControlsController, bundle0); + final var view0 = new com.github.gtache.fxml.compiler.impl.ControlsView(controllersMap, map0); + final var object14 = view0.load(); + final var controller0 = view0.controller(); + injectField("controlsController", controller0); + object8.getChildren().addAll(object9, object11, object12, object13, object14); + final var object15 = new javafx.geometry.Insets(10.0, 10.0, 10.0, 10.0); + object8.setPadding(object15); + object1.getChildren().addAll(object2, object8); + object0.setBottom(object1); + final var object16 = new javafx.scene.layout.VBox(); + injectField("vbox", object16); + final var object17 = new javafx.scene.control.ToolBar(); + injectField("toolBar", object17); + final var object18 = new javafx.scene.control.TitledPane(); + injectField("titledPane", object18); + final var object19 = new javafx.scene.layout.TilePane(); + injectField("tilePane", object19); + final var object20 = new javafx.scene.text.TextFlow(); + injectField("textFlow", object20); + final var object21 = new javafx.scene.control.TabPane(); + injectField("tabPane", object21); + final var object22 = new javafx.scene.control.Tab(); + injectField("tab", object22); + final var object23 = new javafx.scene.layout.StackPane(); + injectField("stackPane", object23); + final var object24 = new javafx.scene.control.SplitPane(); + injectField("splitPane", object24); + final var object25 = new javafx.scene.control.ScrollPane(); + injectField("scrollPane", object25); + final var object26 = new javafx.scene.layout.Pane(); + injectField("pane", object26); + final var object27 = new javafx.scene.layout.HBox(); + injectField("hbox", object27); + final var object28 = new javafx.scene.Group(); + injectField("group", object28); + final var object29 = new javafx.scene.layout.GridPane(); + injectField("gridPane", object29); + final var object30 = new javafx.scene.layout.ColumnConstraints(); + injectField("columnConstraints", object30); + object30.setHgrow(javafx.scene.layout.Priority.SOMETIMES); + object30.setMinWidth(10.0); + object29.getColumnConstraints().addAll(object30); + final var object31 = new javafx.scene.layout.RowConstraints(); + object31.setMinHeight(10.0); + object31.setVgrow(javafx.scene.layout.Priority.SOMETIMES); + object29.getRowConstraints().addAll(object31); + final var object32 = new javafx.scene.layout.FlowPane(); + injectField("flowPane", object32); + final var object33 = new javafx.scene.control.DialogPane(); + injectField("dialogPane", object33); + final var object34 = new javafx.scene.control.ButtonBar(); + injectField("buttonBar", object34); + final var object35 = new javafx.scene.layout.AnchorPane(); + injectField("anchorPane", object35); + final var object36 = new javafx.scene.control.Label(); + object36.setManaged(false); + object35.getChildren().addAll(object36); + object34.getButtons().addAll(object35); + object33.setContent(object34); + object32.getChildren().addAll(object33); + object29.getChildren().addAll(object32); + object28.getChildren().addAll(object29); + object27.getChildren().addAll(object28); + object26.getChildren().addAll(object27); + object25.setContent(object26); + object24.getItems().addAll(object25); + object23.getChildren().addAll(object24); + object22.setContent(object23); + object21.getTabs().addAll(object22); + object20.getChildren().addAll(object21); + object19.getChildren().addAll(object20); + object18.setContent(object19); + object17.getItems().addAll(object18); + object16.getChildren().addAll(object17); + object0.setCenter(object16); + try { + final var initialize = controller.getClass().getDeclaredMethod("initialize"); + initialize.setAccessible(true); + initialize.invoke(controller); + } catch (final InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection", e); + } catch (final NoSuchMethodException ignored) { + } + loaded = true; + return object0; +} + + private void callMethod(final String methodName, final T event) { + try { + final Method method; + final var methods = Arrays.stream(controller.getClass().getDeclaredMethods()) + .filter(m -> m.getName().equals(methodName)).toList(); + if (methods.size() > 1) { + final var eventMethods = methods.stream().filter(m -> + m.getParameterCount() == 1 && Event.class.isAssignableFrom(m.getParameterTypes()[0])).toList(); + if (eventMethods.size() == 1) { + method = eventMethods.getFirst(); + } else { + final var emptyMethods = methods.stream().filter(m -> m.getParameterCount() == 0).toList(); + if (emptyMethods.size() == 1) { + method = emptyMethods.getFirst(); + } else { + throw new IllegalArgumentException("Multiple matching methods for " + methodName); + } + } + } else if (methods.size() == 1) { + method = methods.getFirst(); + } else { + throw new IllegalArgumentException("No matching method for " + methodName); + } + method.setAccessible(true); + if (method.getParameterCount() == 0) { + method.invoke(controller); + } else { + method.invoke(controller, event); + } + } catch (final IllegalAccessException | InvocationTargetException ex) { + throw new RuntimeException("Error using reflection on " + methodName, ex); + } +} +private void injectField(final String fieldName, final T object) { + try { + final var field = controller.getClass().getDeclaredField(fieldName); + field.setAccessible(true); + field.set(controller, object); + } catch (final NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection on " + fieldName, e); + } +} + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.IncludesController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-reflection-reflection-getter.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-reflection-reflection-getter.txt new file mode 100644 index 0000000..b0dfb9f --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-reflection-reflection-getter.txt @@ -0,0 +1,234 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import javafx.event.Event; +import java.lang.reflect.Method; + + +/** + * Generated code, not thread-safe + */ +public final class IncludesController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.IncludesController controller; + + /** + * Instantiates a new IncludesController with no nested controllers and no resource bundle + * @param controller The controller + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of()); + } + + /** + * Instantiates a new IncludesController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, resourceBundle)); + } + + /** + * Instantiates a new IncludesController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public IncludesController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + controller = (com.github.gtache.fxml.compiler.impl.IncludesController) controllersMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + final var object0 = new javafx.scene.layout.BorderPane(); + final var object1 = new javafx.scene.layout.VBox(); + javafx.scene.layout.BorderPane.setAlignment(object1, javafx.geometry.Pos.CENTER); + final var object2 = new javafx.scene.layout.HBox(); + object2.setAlignment(javafx.geometry.Pos.CENTER); + object2.setSpacing(10.0); + final var object3 = new javafx.scene.control.Slider(); + injectField("playSlider", object3); + javafx.scene.layout.HBox.setHgrow(object3, javafx.scene.layout.Priority.ALWAYS); + final var object4 = new javafx.geometry.Insets(0, 0, 0, 10.0); + object3.setPadding(object4); + final var object5 = new javafx.scene.control.Label(); + injectField("playLabel", object5); + object5.setText("Label"); + final var object6 = new javafx.geometry.Insets(0, 10.0, 0, 0); + object5.setPadding(object6); + object2.getChildren().addAll(object3, object5); + final var object7 = new javafx.geometry.Insets(10.0, 0, 0, 0); + object2.setPadding(object7); + final var object8 = new javafx.scene.layout.HBox(); + object8.setAlignment(javafx.geometry.Pos.CENTER); + object8.setSpacing(10.0); + final var object9 = new javafx.scene.control.Button(); + injectField("playButton", object9); + object9.setMnemonicParsing(false); + object9.setOnAction(e -> callMethod("playPressed", e)); + final var object10 = new javafx.geometry.Insets(0, 20.0, 0, 0); + javafx.scene.layout.HBox.setMargin(object9, object10); + final var object11 = new javafx.scene.control.Label(); + object11.setText(controller.resources().getString("media.volume.label")); + final var object12 = new javafx.scene.control.Slider(); + injectField("volumeSlider", object12); + object12.setValue(100); + final var object13 = new javafx.scene.control.Label(); + injectField("volumeValueLabel", object13); + object13.setText("Label"); + final var map0 = new HashMap<>(resourceBundlesMap); + final var bundle0 = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + map0.put(com.github.gtache.fxml.compiler.impl.ControlsController, bundle0); + final var view0 = new com.github.gtache.fxml.compiler.impl.ControlsView(controllersMap, map0); + final var object14 = view0.load(); + final var controller0 = view0.controller(); + injectField("controlsController", controller0); + object8.getChildren().addAll(object9, object11, object12, object13, object14); + final var object15 = new javafx.geometry.Insets(10.0, 10.0, 10.0, 10.0); + object8.setPadding(object15); + object1.getChildren().addAll(object2, object8); + object0.setBottom(object1); + final var object16 = new javafx.scene.layout.VBox(); + injectField("vbox", object16); + final var object17 = new javafx.scene.control.ToolBar(); + injectField("toolBar", object17); + final var object18 = new javafx.scene.control.TitledPane(); + injectField("titledPane", object18); + final var object19 = new javafx.scene.layout.TilePane(); + injectField("tilePane", object19); + final var object20 = new javafx.scene.text.TextFlow(); + injectField("textFlow", object20); + final var object21 = new javafx.scene.control.TabPane(); + injectField("tabPane", object21); + final var object22 = new javafx.scene.control.Tab(); + injectField("tab", object22); + final var object23 = new javafx.scene.layout.StackPane(); + injectField("stackPane", object23); + final var object24 = new javafx.scene.control.SplitPane(); + injectField("splitPane", object24); + final var object25 = new javafx.scene.control.ScrollPane(); + injectField("scrollPane", object25); + final var object26 = new javafx.scene.layout.Pane(); + injectField("pane", object26); + final var object27 = new javafx.scene.layout.HBox(); + injectField("hbox", object27); + final var object28 = new javafx.scene.Group(); + injectField("group", object28); + final var object29 = new javafx.scene.layout.GridPane(); + injectField("gridPane", object29); + final var object30 = new javafx.scene.layout.ColumnConstraints(); + injectField("columnConstraints", object30); + object30.setHgrow(javafx.scene.layout.Priority.SOMETIMES); + object30.setMinWidth(10.0); + object29.getColumnConstraints().addAll(object30); + final var object31 = new javafx.scene.layout.RowConstraints(); + object31.setMinHeight(10.0); + object31.setVgrow(javafx.scene.layout.Priority.SOMETIMES); + object29.getRowConstraints().addAll(object31); + final var object32 = new javafx.scene.layout.FlowPane(); + injectField("flowPane", object32); + final var object33 = new javafx.scene.control.DialogPane(); + injectField("dialogPane", object33); + final var object34 = new javafx.scene.control.ButtonBar(); + injectField("buttonBar", object34); + final var object35 = new javafx.scene.layout.AnchorPane(); + injectField("anchorPane", object35); + final var object36 = new javafx.scene.control.Label(); + object36.setManaged(false); + object35.getChildren().addAll(object36); + object34.getButtons().addAll(object35); + object33.setContent(object34); + object32.getChildren().addAll(object33); + object29.getChildren().addAll(object32); + object28.getChildren().addAll(object29); + object27.getChildren().addAll(object28); + object26.getChildren().addAll(object27); + object25.setContent(object26); + object24.getItems().addAll(object25); + object23.getChildren().addAll(object24); + object22.setContent(object23); + object21.getTabs().addAll(object22); + object20.getChildren().addAll(object21); + object19.getChildren().addAll(object20); + object18.setContent(object19); + object17.getItems().addAll(object18); + object16.getChildren().addAll(object17); + object0.setCenter(object16); + try { + final var initialize = controller.getClass().getDeclaredMethod("initialize"); + initialize.setAccessible(true); + initialize.invoke(controller); + } catch (final InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection", e); + } catch (final NoSuchMethodException ignored) { + } + loaded = true; + return object0; +} + + private void callMethod(final String methodName, final T event) { + try { + final Method method; + final var methods = Arrays.stream(controller.getClass().getDeclaredMethods()) + .filter(m -> m.getName().equals(methodName)).toList(); + if (methods.size() > 1) { + final var eventMethods = methods.stream().filter(m -> + m.getParameterCount() == 1 && Event.class.isAssignableFrom(m.getParameterTypes()[0])).toList(); + if (eventMethods.size() == 1) { + method = eventMethods.getFirst(); + } else { + final var emptyMethods = methods.stream().filter(m -> m.getParameterCount() == 0).toList(); + if (emptyMethods.size() == 1) { + method = emptyMethods.getFirst(); + } else { + throw new IllegalArgumentException("Multiple matching methods for " + methodName); + } + } + } else if (methods.size() == 1) { + method = methods.getFirst(); + } else { + throw new IllegalArgumentException("No matching method for " + methodName); + } + method.setAccessible(true); + if (method.getParameterCount() == 0) { + method.invoke(controller); + } else { + method.invoke(controller, event); + } + } catch (final IllegalAccessException | InvocationTargetException ex) { + throw new RuntimeException("Error using reflection on " + methodName, ex); + } +} +private void injectField(final String fieldName, final T object) { + try { + final var field = controller.getClass().getDeclaredField(fieldName); + field.setAccessible(true); + field.set(controller, object); + } catch (final NoSuchFieldException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection on " + fieldName, e); + } +} + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.IncludesController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-setters-reference-constructor.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-setters-reference-constructor.txt new file mode 100644 index 0000000..0ca7307 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-setters-reference-constructor.txt @@ -0,0 +1,182 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; + + +/** + * Generated code, not thread-safe + */ +public final class IncludesController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.IncludesController controller; + + /** + * Instantiates a new IncludesController with no nested controllers and no resource bundle + * @param controller The controller + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of()); + } + + /** + * Instantiates a new IncludesController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, resourceBundle)); + } + + /** + * Instantiates a new IncludesController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public IncludesController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = resourceBundlesMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + controller = (com.github.gtache.fxml.compiler.impl.IncludesController) controllersMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + final var object0 = new javafx.scene.layout.BorderPane(); + final var object1 = new javafx.scene.layout.VBox(); + javafx.scene.layout.BorderPane.setAlignment(object1, javafx.geometry.Pos.CENTER); + final var object2 = new javafx.scene.layout.HBox(); + object2.setAlignment(javafx.geometry.Pos.CENTER); + object2.setSpacing(10.0); + final var object3 = new javafx.scene.control.Slider(); + controller.setPlaySlider(object3); + javafx.scene.layout.HBox.setHgrow(object3, javafx.scene.layout.Priority.ALWAYS); + final var object4 = new javafx.geometry.Insets(0, 0, 0, 10.0); + object3.setPadding(object4); + final var object5 = new javafx.scene.control.Label(); + controller.setPlayLabel(object5); + object5.setText("Label"); + final var object6 = new javafx.geometry.Insets(0, 10.0, 0, 0); + object5.setPadding(object6); + object2.getChildren().addAll(object3, object5); + final var object7 = new javafx.geometry.Insets(10.0, 0, 0, 0); + object2.setPadding(object7); + final var object8 = new javafx.scene.layout.HBox(); + object8.setAlignment(javafx.geometry.Pos.CENTER); + object8.setSpacing(10.0); + final var object9 = new javafx.scene.control.Button(); + controller.setPlayButton(object9); + object9.setMnemonicParsing(false); + object9.setOnAction(controller::playPressed); + final var object10 = new javafx.geometry.Insets(0, 20.0, 0, 0); + javafx.scene.layout.HBox.setMargin(object9, object10); + final var object11 = new javafx.scene.control.Label(); + object11.setText(bundle.getString("media.volume.label")); + final var object12 = new javafx.scene.control.Slider(); + controller.setVolumeSlider(object12); + object12.setValue(100); + final var object13 = new javafx.scene.control.Label(); + controller.setVolumeValueLabel(object13); + object13.setText("Label"); + final var map0 = new HashMap<>(resourceBundlesMap); + final var bundle0 = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + map0.put(com.github.gtache.fxml.compiler.impl.ControlsController, bundle0); + final var view0 = new com.github.gtache.fxml.compiler.impl.ControlsView(controllersMap, map0); + final var object14 = view0.load(); + final var controller0 = view0.controller(); + controller.setControlsController(controller0); + object8.getChildren().addAll(object9, object11, object12, object13, object14); + final var object15 = new javafx.geometry.Insets(10.0, 10.0, 10.0, 10.0); + object8.setPadding(object15); + object1.getChildren().addAll(object2, object8); + object0.setBottom(object1); + final var object16 = new javafx.scene.layout.VBox(); + controller.setVbox(object16); + final var object17 = new javafx.scene.control.ToolBar(); + controller.setToolBar(object17); + final var object18 = new javafx.scene.control.TitledPane(); + controller.setTitledPane(object18); + final var object19 = new javafx.scene.layout.TilePane(); + controller.setTilePane(object19); + final var object20 = new javafx.scene.text.TextFlow(); + controller.setTextFlow(object20); + final var object21 = new javafx.scene.control.TabPane(); + controller.setTabPane(object21); + final var object22 = new javafx.scene.control.Tab(); + controller.setTab(object22); + final var object23 = new javafx.scene.layout.StackPane(); + controller.setStackPane(object23); + final var object24 = new javafx.scene.control.SplitPane(); + controller.setSplitPane(object24); + final var object25 = new javafx.scene.control.ScrollPane(); + controller.setScrollPane(object25); + final var object26 = new javafx.scene.layout.Pane(); + controller.setPane(object26); + final var object27 = new javafx.scene.layout.HBox(); + controller.setHbox(object27); + final var object28 = new javafx.scene.Group(); + controller.setGroup(object28); + final var object29 = new javafx.scene.layout.GridPane(); + controller.setGridPane(object29); + final var object30 = new javafx.scene.layout.ColumnConstraints(); + controller.setColumnConstraints(object30); + object30.setHgrow(javafx.scene.layout.Priority.SOMETIMES); + object30.setMinWidth(10.0); + object29.getColumnConstraints().addAll(object30); + final var object31 = new javafx.scene.layout.RowConstraints(); + object31.setMinHeight(10.0); + object31.setVgrow(javafx.scene.layout.Priority.SOMETIMES); + object29.getRowConstraints().addAll(object31); + final var object32 = new javafx.scene.layout.FlowPane(); + controller.setFlowPane(object32); + final var object33 = new javafx.scene.control.DialogPane(); + controller.setDialogPane(object33); + final var object34 = new javafx.scene.control.ButtonBar(); + controller.setButtonBar(object34); + final var object35 = new javafx.scene.layout.AnchorPane(); + controller.setAnchorPane(object35); + final var object36 = new javafx.scene.control.Label(); + object36.setManaged(false); + object35.getChildren().addAll(object36); + object34.getButtons().addAll(object35); + object33.setContent(object34); + object32.getChildren().addAll(object33); + object29.getChildren().addAll(object32); + object28.getChildren().addAll(object29); + object27.getChildren().addAll(object28); + object26.getChildren().addAll(object27); + object25.setContent(object26); + object24.getItems().addAll(object25); + object23.getChildren().addAll(object24); + object22.setContent(object23); + object21.getTabs().addAll(object22); + object20.getChildren().addAll(object21); + object19.getChildren().addAll(object20); + object18.setContent(object19); + object17.getItems().addAll(object18); + object16.getChildren().addAll(object17); + object0.setCenter(object16); + controller.initialize(); + loaded = true; + return object0; +} + + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.IncludesController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-setters-reference-getbundle.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-setters-reference-getbundle.txt new file mode 100644 index 0000000..f7a2dfd --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-setters-reference-getbundle.txt @@ -0,0 +1,182 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; + + +/** + * Generated code, not thread-safe + */ +public final class IncludesController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.IncludesController controller; + + /** + * Instantiates a new IncludesController with no nested controllers and no resource bundle + * @param controller The controller + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of()); + } + + /** + * Instantiates a new IncludesController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, resourceBundle)); + } + + /** + * Instantiates a new IncludesController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public IncludesController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.IncludesBundle"); + controller = (com.github.gtache.fxml.compiler.impl.IncludesController) controllersMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + final var object0 = new javafx.scene.layout.BorderPane(); + final var object1 = new javafx.scene.layout.VBox(); + javafx.scene.layout.BorderPane.setAlignment(object1, javafx.geometry.Pos.CENTER); + final var object2 = new javafx.scene.layout.HBox(); + object2.setAlignment(javafx.geometry.Pos.CENTER); + object2.setSpacing(10.0); + final var object3 = new javafx.scene.control.Slider(); + controller.setPlaySlider(object3); + javafx.scene.layout.HBox.setHgrow(object3, javafx.scene.layout.Priority.ALWAYS); + final var object4 = new javafx.geometry.Insets(0, 0, 0, 10.0); + object3.setPadding(object4); + final var object5 = new javafx.scene.control.Label(); + controller.setPlayLabel(object5); + object5.setText("Label"); + final var object6 = new javafx.geometry.Insets(0, 10.0, 0, 0); + object5.setPadding(object6); + object2.getChildren().addAll(object3, object5); + final var object7 = new javafx.geometry.Insets(10.0, 0, 0, 0); + object2.setPadding(object7); + final var object8 = new javafx.scene.layout.HBox(); + object8.setAlignment(javafx.geometry.Pos.CENTER); + object8.setSpacing(10.0); + final var object9 = new javafx.scene.control.Button(); + controller.setPlayButton(object9); + object9.setMnemonicParsing(false); + object9.setOnAction(controller::playPressed); + final var object10 = new javafx.geometry.Insets(0, 20.0, 0, 0); + javafx.scene.layout.HBox.setMargin(object9, object10); + final var object11 = new javafx.scene.control.Label(); + object11.setText(bundle.getString("media.volume.label")); + final var object12 = new javafx.scene.control.Slider(); + controller.setVolumeSlider(object12); + object12.setValue(100); + final var object13 = new javafx.scene.control.Label(); + controller.setVolumeValueLabel(object13); + object13.setText("Label"); + final var map0 = new HashMap<>(resourceBundlesMap); + final var bundle0 = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + map0.put(com.github.gtache.fxml.compiler.impl.ControlsController, bundle0); + final var view0 = new com.github.gtache.fxml.compiler.impl.ControlsView(controllersMap, map0); + final var object14 = view0.load(); + final var controller0 = view0.controller(); + controller.setControlsController(controller0); + object8.getChildren().addAll(object9, object11, object12, object13, object14); + final var object15 = new javafx.geometry.Insets(10.0, 10.0, 10.0, 10.0); + object8.setPadding(object15); + object1.getChildren().addAll(object2, object8); + object0.setBottom(object1); + final var object16 = new javafx.scene.layout.VBox(); + controller.setVbox(object16); + final var object17 = new javafx.scene.control.ToolBar(); + controller.setToolBar(object17); + final var object18 = new javafx.scene.control.TitledPane(); + controller.setTitledPane(object18); + final var object19 = new javafx.scene.layout.TilePane(); + controller.setTilePane(object19); + final var object20 = new javafx.scene.text.TextFlow(); + controller.setTextFlow(object20); + final var object21 = new javafx.scene.control.TabPane(); + controller.setTabPane(object21); + final var object22 = new javafx.scene.control.Tab(); + controller.setTab(object22); + final var object23 = new javafx.scene.layout.StackPane(); + controller.setStackPane(object23); + final var object24 = new javafx.scene.control.SplitPane(); + controller.setSplitPane(object24); + final var object25 = new javafx.scene.control.ScrollPane(); + controller.setScrollPane(object25); + final var object26 = new javafx.scene.layout.Pane(); + controller.setPane(object26); + final var object27 = new javafx.scene.layout.HBox(); + controller.setHbox(object27); + final var object28 = new javafx.scene.Group(); + controller.setGroup(object28); + final var object29 = new javafx.scene.layout.GridPane(); + controller.setGridPane(object29); + final var object30 = new javafx.scene.layout.ColumnConstraints(); + controller.setColumnConstraints(object30); + object30.setHgrow(javafx.scene.layout.Priority.SOMETIMES); + object30.setMinWidth(10.0); + object29.getColumnConstraints().addAll(object30); + final var object31 = new javafx.scene.layout.RowConstraints(); + object31.setMinHeight(10.0); + object31.setVgrow(javafx.scene.layout.Priority.SOMETIMES); + object29.getRowConstraints().addAll(object31); + final var object32 = new javafx.scene.layout.FlowPane(); + controller.setFlowPane(object32); + final var object33 = new javafx.scene.control.DialogPane(); + controller.setDialogPane(object33); + final var object34 = new javafx.scene.control.ButtonBar(); + controller.setButtonBar(object34); + final var object35 = new javafx.scene.layout.AnchorPane(); + controller.setAnchorPane(object35); + final var object36 = new javafx.scene.control.Label(); + object36.setManaged(false); + object35.getChildren().addAll(object36); + object34.getButtons().addAll(object35); + object33.setContent(object34); + object32.getChildren().addAll(object33); + object29.getChildren().addAll(object32); + object28.getChildren().addAll(object29); + object27.getChildren().addAll(object28); + object26.getChildren().addAll(object27); + object25.setContent(object26); + object24.getItems().addAll(object25); + object23.getChildren().addAll(object24); + object22.setContent(object23); + object21.getTabs().addAll(object22); + object20.getChildren().addAll(object21); + object19.getChildren().addAll(object20); + object18.setContent(object19); + object17.getItems().addAll(object18); + object16.getChildren().addAll(object17); + object0.setCenter(object16); + controller.initialize(); + loaded = true; + return object0; +} + + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.IncludesController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-setters-reference-getter.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-setters-reference-getter.txt new file mode 100644 index 0000000..eafa584 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-setters-reference-getter.txt @@ -0,0 +1,181 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; + + +/** + * Generated code, not thread-safe + */ +public final class IncludesController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.IncludesController controller; + + /** + * Instantiates a new IncludesController with no nested controllers and no resource bundle + * @param controller The controller + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of()); + } + + /** + * Instantiates a new IncludesController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, resourceBundle)); + } + + /** + * Instantiates a new IncludesController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public IncludesController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + controller = (com.github.gtache.fxml.compiler.impl.IncludesController) controllersMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + final var object0 = new javafx.scene.layout.BorderPane(); + final var object1 = new javafx.scene.layout.VBox(); + javafx.scene.layout.BorderPane.setAlignment(object1, javafx.geometry.Pos.CENTER); + final var object2 = new javafx.scene.layout.HBox(); + object2.setAlignment(javafx.geometry.Pos.CENTER); + object2.setSpacing(10.0); + final var object3 = new javafx.scene.control.Slider(); + controller.setPlaySlider(object3); + javafx.scene.layout.HBox.setHgrow(object3, javafx.scene.layout.Priority.ALWAYS); + final var object4 = new javafx.geometry.Insets(0, 0, 0, 10.0); + object3.setPadding(object4); + final var object5 = new javafx.scene.control.Label(); + controller.setPlayLabel(object5); + object5.setText("Label"); + final var object6 = new javafx.geometry.Insets(0, 10.0, 0, 0); + object5.setPadding(object6); + object2.getChildren().addAll(object3, object5); + final var object7 = new javafx.geometry.Insets(10.0, 0, 0, 0); + object2.setPadding(object7); + final var object8 = new javafx.scene.layout.HBox(); + object8.setAlignment(javafx.geometry.Pos.CENTER); + object8.setSpacing(10.0); + final var object9 = new javafx.scene.control.Button(); + controller.setPlayButton(object9); + object9.setMnemonicParsing(false); + object9.setOnAction(controller::playPressed); + final var object10 = new javafx.geometry.Insets(0, 20.0, 0, 0); + javafx.scene.layout.HBox.setMargin(object9, object10); + final var object11 = new javafx.scene.control.Label(); + object11.setText(controller.resources().getString("media.volume.label")); + final var object12 = new javafx.scene.control.Slider(); + controller.setVolumeSlider(object12); + object12.setValue(100); + final var object13 = new javafx.scene.control.Label(); + controller.setVolumeValueLabel(object13); + object13.setText("Label"); + final var map0 = new HashMap<>(resourceBundlesMap); + final var bundle0 = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + map0.put(com.github.gtache.fxml.compiler.impl.ControlsController, bundle0); + final var view0 = new com.github.gtache.fxml.compiler.impl.ControlsView(controllersMap, map0); + final var object14 = view0.load(); + final var controller0 = view0.controller(); + controller.setControlsController(controller0); + object8.getChildren().addAll(object9, object11, object12, object13, object14); + final var object15 = new javafx.geometry.Insets(10.0, 10.0, 10.0, 10.0); + object8.setPadding(object15); + object1.getChildren().addAll(object2, object8); + object0.setBottom(object1); + final var object16 = new javafx.scene.layout.VBox(); + controller.setVbox(object16); + final var object17 = new javafx.scene.control.ToolBar(); + controller.setToolBar(object17); + final var object18 = new javafx.scene.control.TitledPane(); + controller.setTitledPane(object18); + final var object19 = new javafx.scene.layout.TilePane(); + controller.setTilePane(object19); + final var object20 = new javafx.scene.text.TextFlow(); + controller.setTextFlow(object20); + final var object21 = new javafx.scene.control.TabPane(); + controller.setTabPane(object21); + final var object22 = new javafx.scene.control.Tab(); + controller.setTab(object22); + final var object23 = new javafx.scene.layout.StackPane(); + controller.setStackPane(object23); + final var object24 = new javafx.scene.control.SplitPane(); + controller.setSplitPane(object24); + final var object25 = new javafx.scene.control.ScrollPane(); + controller.setScrollPane(object25); + final var object26 = new javafx.scene.layout.Pane(); + controller.setPane(object26); + final var object27 = new javafx.scene.layout.HBox(); + controller.setHbox(object27); + final var object28 = new javafx.scene.Group(); + controller.setGroup(object28); + final var object29 = new javafx.scene.layout.GridPane(); + controller.setGridPane(object29); + final var object30 = new javafx.scene.layout.ColumnConstraints(); + controller.setColumnConstraints(object30); + object30.setHgrow(javafx.scene.layout.Priority.SOMETIMES); + object30.setMinWidth(10.0); + object29.getColumnConstraints().addAll(object30); + final var object31 = new javafx.scene.layout.RowConstraints(); + object31.setMinHeight(10.0); + object31.setVgrow(javafx.scene.layout.Priority.SOMETIMES); + object29.getRowConstraints().addAll(object31); + final var object32 = new javafx.scene.layout.FlowPane(); + controller.setFlowPane(object32); + final var object33 = new javafx.scene.control.DialogPane(); + controller.setDialogPane(object33); + final var object34 = new javafx.scene.control.ButtonBar(); + controller.setButtonBar(object34); + final var object35 = new javafx.scene.layout.AnchorPane(); + controller.setAnchorPane(object35); + final var object36 = new javafx.scene.control.Label(); + object36.setManaged(false); + object35.getChildren().addAll(object36); + object34.getButtons().addAll(object35); + object33.setContent(object34); + object32.getChildren().addAll(object33); + object29.getChildren().addAll(object32); + object28.getChildren().addAll(object29); + object27.getChildren().addAll(object28); + object26.getChildren().addAll(object27); + object25.setContent(object26); + object24.getItems().addAll(object25); + object23.getChildren().addAll(object24); + object22.setContent(object23); + object21.getTabs().addAll(object22); + object20.getChildren().addAll(object21); + object19.getChildren().addAll(object20); + object18.setContent(object19); + object17.getItems().addAll(object18); + object16.getChildren().addAll(object17); + object0.setCenter(object16); + controller.initialize(); + loaded = true; + return object0; +} + + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.IncludesController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-setters-reflection-constructor.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-setters-reflection-constructor.txt new file mode 100644 index 0000000..1ef0f15 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-setters-reflection-constructor.txt @@ -0,0 +1,226 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import javafx.event.Event; +import java.lang.reflect.Method; + + +/** + * Generated code, not thread-safe + */ +public final class IncludesController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.IncludesController controller; + + /** + * Instantiates a new IncludesController with no nested controllers and no resource bundle + * @param controller The controller + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of()); + } + + /** + * Instantiates a new IncludesController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, resourceBundle)); + } + + /** + * Instantiates a new IncludesController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public IncludesController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = resourceBundlesMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + controller = (com.github.gtache.fxml.compiler.impl.IncludesController) controllersMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + final var object0 = new javafx.scene.layout.BorderPane(); + final var object1 = new javafx.scene.layout.VBox(); + javafx.scene.layout.BorderPane.setAlignment(object1, javafx.geometry.Pos.CENTER); + final var object2 = new javafx.scene.layout.HBox(); + object2.setAlignment(javafx.geometry.Pos.CENTER); + object2.setSpacing(10.0); + final var object3 = new javafx.scene.control.Slider(); + controller.setPlaySlider(object3); + javafx.scene.layout.HBox.setHgrow(object3, javafx.scene.layout.Priority.ALWAYS); + final var object4 = new javafx.geometry.Insets(0, 0, 0, 10.0); + object3.setPadding(object4); + final var object5 = new javafx.scene.control.Label(); + controller.setPlayLabel(object5); + object5.setText("Label"); + final var object6 = new javafx.geometry.Insets(0, 10.0, 0, 0); + object5.setPadding(object6); + object2.getChildren().addAll(object3, object5); + final var object7 = new javafx.geometry.Insets(10.0, 0, 0, 0); + object2.setPadding(object7); + final var object8 = new javafx.scene.layout.HBox(); + object8.setAlignment(javafx.geometry.Pos.CENTER); + object8.setSpacing(10.0); + final var object9 = new javafx.scene.control.Button(); + controller.setPlayButton(object9); + object9.setMnemonicParsing(false); + object9.setOnAction(e -> callMethod("playPressed", e)); + final var object10 = new javafx.geometry.Insets(0, 20.0, 0, 0); + javafx.scene.layout.HBox.setMargin(object9, object10); + final var object11 = new javafx.scene.control.Label(); + object11.setText(bundle.getString("media.volume.label")); + final var object12 = new javafx.scene.control.Slider(); + controller.setVolumeSlider(object12); + object12.setValue(100); + final var object13 = new javafx.scene.control.Label(); + controller.setVolumeValueLabel(object13); + object13.setText("Label"); + final var map0 = new HashMap<>(resourceBundlesMap); + final var bundle0 = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + map0.put(com.github.gtache.fxml.compiler.impl.ControlsController, bundle0); + final var view0 = new com.github.gtache.fxml.compiler.impl.ControlsView(controllersMap, map0); + final var object14 = view0.load(); + final var controller0 = view0.controller(); + controller.setControlsController(controller0); + object8.getChildren().addAll(object9, object11, object12, object13, object14); + final var object15 = new javafx.geometry.Insets(10.0, 10.0, 10.0, 10.0); + object8.setPadding(object15); + object1.getChildren().addAll(object2, object8); + object0.setBottom(object1); + final var object16 = new javafx.scene.layout.VBox(); + controller.setVbox(object16); + final var object17 = new javafx.scene.control.ToolBar(); + controller.setToolBar(object17); + final var object18 = new javafx.scene.control.TitledPane(); + controller.setTitledPane(object18); + final var object19 = new javafx.scene.layout.TilePane(); + controller.setTilePane(object19); + final var object20 = new javafx.scene.text.TextFlow(); + controller.setTextFlow(object20); + final var object21 = new javafx.scene.control.TabPane(); + controller.setTabPane(object21); + final var object22 = new javafx.scene.control.Tab(); + controller.setTab(object22); + final var object23 = new javafx.scene.layout.StackPane(); + controller.setStackPane(object23); + final var object24 = new javafx.scene.control.SplitPane(); + controller.setSplitPane(object24); + final var object25 = new javafx.scene.control.ScrollPane(); + controller.setScrollPane(object25); + final var object26 = new javafx.scene.layout.Pane(); + controller.setPane(object26); + final var object27 = new javafx.scene.layout.HBox(); + controller.setHbox(object27); + final var object28 = new javafx.scene.Group(); + controller.setGroup(object28); + final var object29 = new javafx.scene.layout.GridPane(); + controller.setGridPane(object29); + final var object30 = new javafx.scene.layout.ColumnConstraints(); + controller.setColumnConstraints(object30); + object30.setHgrow(javafx.scene.layout.Priority.SOMETIMES); + object30.setMinWidth(10.0); + object29.getColumnConstraints().addAll(object30); + final var object31 = new javafx.scene.layout.RowConstraints(); + object31.setMinHeight(10.0); + object31.setVgrow(javafx.scene.layout.Priority.SOMETIMES); + object29.getRowConstraints().addAll(object31); + final var object32 = new javafx.scene.layout.FlowPane(); + controller.setFlowPane(object32); + final var object33 = new javafx.scene.control.DialogPane(); + controller.setDialogPane(object33); + final var object34 = new javafx.scene.control.ButtonBar(); + controller.setButtonBar(object34); + final var object35 = new javafx.scene.layout.AnchorPane(); + controller.setAnchorPane(object35); + final var object36 = new javafx.scene.control.Label(); + object36.setManaged(false); + object35.getChildren().addAll(object36); + object34.getButtons().addAll(object35); + object33.setContent(object34); + object32.getChildren().addAll(object33); + object29.getChildren().addAll(object32); + object28.getChildren().addAll(object29); + object27.getChildren().addAll(object28); + object26.getChildren().addAll(object27); + object25.setContent(object26); + object24.getItems().addAll(object25); + object23.getChildren().addAll(object24); + object22.setContent(object23); + object21.getTabs().addAll(object22); + object20.getChildren().addAll(object21); + object19.getChildren().addAll(object20); + object18.setContent(object19); + object17.getItems().addAll(object18); + object16.getChildren().addAll(object17); + object0.setCenter(object16); + try { + final var initialize = controller.getClass().getDeclaredMethod("initialize"); + initialize.setAccessible(true); + initialize.invoke(controller); + } catch (final InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection", e); + } catch (final NoSuchMethodException ignored) { + } + loaded = true; + return object0; +} + + private void callMethod(final String methodName, final T event) { + try { + final Method method; + final var methods = Arrays.stream(controller.getClass().getDeclaredMethods()) + .filter(m -> m.getName().equals(methodName)).toList(); + if (methods.size() > 1) { + final var eventMethods = methods.stream().filter(m -> + m.getParameterCount() == 1 && Event.class.isAssignableFrom(m.getParameterTypes()[0])).toList(); + if (eventMethods.size() == 1) { + method = eventMethods.getFirst(); + } else { + final var emptyMethods = methods.stream().filter(m -> m.getParameterCount() == 0).toList(); + if (emptyMethods.size() == 1) { + method = emptyMethods.getFirst(); + } else { + throw new IllegalArgumentException("Multiple matching methods for " + methodName); + } + } + } else if (methods.size() == 1) { + method = methods.getFirst(); + } else { + throw new IllegalArgumentException("No matching method for " + methodName); + } + method.setAccessible(true); + if (method.getParameterCount() == 0) { + method.invoke(controller); + } else { + method.invoke(controller, event); + } + } catch (final IllegalAccessException | InvocationTargetException ex) { + throw new RuntimeException("Error using reflection on " + methodName, ex); + } +} + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.IncludesController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-setters-reflection-getbundle.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-setters-reflection-getbundle.txt new file mode 100644 index 0000000..fb16e6a --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-setters-reflection-getbundle.txt @@ -0,0 +1,226 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import javafx.event.Event; +import java.lang.reflect.Method; + + +/** + * Generated code, not thread-safe + */ +public final class IncludesController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.IncludesController controller; + + /** + * Instantiates a new IncludesController with no nested controllers and no resource bundle + * @param controller The controller + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of()); + } + + /** + * Instantiates a new IncludesController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, resourceBundle)); + } + + /** + * Instantiates a new IncludesController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public IncludesController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + final var bundle = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.IncludesBundle"); + controller = (com.github.gtache.fxml.compiler.impl.IncludesController) controllersMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + final var object0 = new javafx.scene.layout.BorderPane(); + final var object1 = new javafx.scene.layout.VBox(); + javafx.scene.layout.BorderPane.setAlignment(object1, javafx.geometry.Pos.CENTER); + final var object2 = new javafx.scene.layout.HBox(); + object2.setAlignment(javafx.geometry.Pos.CENTER); + object2.setSpacing(10.0); + final var object3 = new javafx.scene.control.Slider(); + controller.setPlaySlider(object3); + javafx.scene.layout.HBox.setHgrow(object3, javafx.scene.layout.Priority.ALWAYS); + final var object4 = new javafx.geometry.Insets(0, 0, 0, 10.0); + object3.setPadding(object4); + final var object5 = new javafx.scene.control.Label(); + controller.setPlayLabel(object5); + object5.setText("Label"); + final var object6 = new javafx.geometry.Insets(0, 10.0, 0, 0); + object5.setPadding(object6); + object2.getChildren().addAll(object3, object5); + final var object7 = new javafx.geometry.Insets(10.0, 0, 0, 0); + object2.setPadding(object7); + final var object8 = new javafx.scene.layout.HBox(); + object8.setAlignment(javafx.geometry.Pos.CENTER); + object8.setSpacing(10.0); + final var object9 = new javafx.scene.control.Button(); + controller.setPlayButton(object9); + object9.setMnemonicParsing(false); + object9.setOnAction(e -> callMethod("playPressed", e)); + final var object10 = new javafx.geometry.Insets(0, 20.0, 0, 0); + javafx.scene.layout.HBox.setMargin(object9, object10); + final var object11 = new javafx.scene.control.Label(); + object11.setText(bundle.getString("media.volume.label")); + final var object12 = new javafx.scene.control.Slider(); + controller.setVolumeSlider(object12); + object12.setValue(100); + final var object13 = new javafx.scene.control.Label(); + controller.setVolumeValueLabel(object13); + object13.setText("Label"); + final var map0 = new HashMap<>(resourceBundlesMap); + final var bundle0 = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + map0.put(com.github.gtache.fxml.compiler.impl.ControlsController, bundle0); + final var view0 = new com.github.gtache.fxml.compiler.impl.ControlsView(controllersMap, map0); + final var object14 = view0.load(); + final var controller0 = view0.controller(); + controller.setControlsController(controller0); + object8.getChildren().addAll(object9, object11, object12, object13, object14); + final var object15 = new javafx.geometry.Insets(10.0, 10.0, 10.0, 10.0); + object8.setPadding(object15); + object1.getChildren().addAll(object2, object8); + object0.setBottom(object1); + final var object16 = new javafx.scene.layout.VBox(); + controller.setVbox(object16); + final var object17 = new javafx.scene.control.ToolBar(); + controller.setToolBar(object17); + final var object18 = new javafx.scene.control.TitledPane(); + controller.setTitledPane(object18); + final var object19 = new javafx.scene.layout.TilePane(); + controller.setTilePane(object19); + final var object20 = new javafx.scene.text.TextFlow(); + controller.setTextFlow(object20); + final var object21 = new javafx.scene.control.TabPane(); + controller.setTabPane(object21); + final var object22 = new javafx.scene.control.Tab(); + controller.setTab(object22); + final var object23 = new javafx.scene.layout.StackPane(); + controller.setStackPane(object23); + final var object24 = new javafx.scene.control.SplitPane(); + controller.setSplitPane(object24); + final var object25 = new javafx.scene.control.ScrollPane(); + controller.setScrollPane(object25); + final var object26 = new javafx.scene.layout.Pane(); + controller.setPane(object26); + final var object27 = new javafx.scene.layout.HBox(); + controller.setHbox(object27); + final var object28 = new javafx.scene.Group(); + controller.setGroup(object28); + final var object29 = new javafx.scene.layout.GridPane(); + controller.setGridPane(object29); + final var object30 = new javafx.scene.layout.ColumnConstraints(); + controller.setColumnConstraints(object30); + object30.setHgrow(javafx.scene.layout.Priority.SOMETIMES); + object30.setMinWidth(10.0); + object29.getColumnConstraints().addAll(object30); + final var object31 = new javafx.scene.layout.RowConstraints(); + object31.setMinHeight(10.0); + object31.setVgrow(javafx.scene.layout.Priority.SOMETIMES); + object29.getRowConstraints().addAll(object31); + final var object32 = new javafx.scene.layout.FlowPane(); + controller.setFlowPane(object32); + final var object33 = new javafx.scene.control.DialogPane(); + controller.setDialogPane(object33); + final var object34 = new javafx.scene.control.ButtonBar(); + controller.setButtonBar(object34); + final var object35 = new javafx.scene.layout.AnchorPane(); + controller.setAnchorPane(object35); + final var object36 = new javafx.scene.control.Label(); + object36.setManaged(false); + object35.getChildren().addAll(object36); + object34.getButtons().addAll(object35); + object33.setContent(object34); + object32.getChildren().addAll(object33); + object29.getChildren().addAll(object32); + object28.getChildren().addAll(object29); + object27.getChildren().addAll(object28); + object26.getChildren().addAll(object27); + object25.setContent(object26); + object24.getItems().addAll(object25); + object23.getChildren().addAll(object24); + object22.setContent(object23); + object21.getTabs().addAll(object22); + object20.getChildren().addAll(object21); + object19.getChildren().addAll(object20); + object18.setContent(object19); + object17.getItems().addAll(object18); + object16.getChildren().addAll(object17); + object0.setCenter(object16); + try { + final var initialize = controller.getClass().getDeclaredMethod("initialize"); + initialize.setAccessible(true); + initialize.invoke(controller); + } catch (final InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection", e); + } catch (final NoSuchMethodException ignored) { + } + loaded = true; + return object0; +} + + private void callMethod(final String methodName, final T event) { + try { + final Method method; + final var methods = Arrays.stream(controller.getClass().getDeclaredMethods()) + .filter(m -> m.getName().equals(methodName)).toList(); + if (methods.size() > 1) { + final var eventMethods = methods.stream().filter(m -> + m.getParameterCount() == 1 && Event.class.isAssignableFrom(m.getParameterTypes()[0])).toList(); + if (eventMethods.size() == 1) { + method = eventMethods.getFirst(); + } else { + final var emptyMethods = methods.stream().filter(m -> m.getParameterCount() == 0).toList(); + if (emptyMethods.size() == 1) { + method = emptyMethods.getFirst(); + } else { + throw new IllegalArgumentException("Multiple matching methods for " + methodName); + } + } + } else if (methods.size() == 1) { + method = methods.getFirst(); + } else { + throw new IllegalArgumentException("No matching method for " + methodName); + } + method.setAccessible(true); + if (method.getParameterCount() == 0) { + method.invoke(controller); + } else { + method.invoke(controller, event); + } + } catch (final IllegalAccessException | InvocationTargetException ex) { + throw new RuntimeException("Error using reflection on " + methodName, ex); + } +} + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.IncludesController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-setters-reflection-getter.txt b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-setters-reflection-getter.txt new file mode 100644 index 0000000..7a118e3 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/expected-includes-setters-reflection-getter.txt @@ -0,0 +1,225 @@ +package com.github.gtache.fxml.compiler.impl; + +import java.util.Map; +import java.util.ResourceBundle; +import java.util.HashMap; +import java.lang.reflect.InvocationTargetException; +import java.util.Arrays; +import javafx.event.Event; +import java.lang.reflect.Method; + + +/** + * Generated code, not thread-safe + */ +public final class IncludesController { + + private final Map, Object> controllersMap; + private final Map, ResourceBundle> resourceBundlesMap; + private boolean loaded; + private com.github.gtache.fxml.compiler.impl.IncludesController controller; + + /** + * Instantiates a new IncludesController with no nested controllers and no resource bundle + * @param controller The controller + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of()); + } + + /** + * Instantiates a new IncludesController with no nested controllers + * @param controller The controller + * @param resourceBundle The resource bundle + */ + public IncludesController(final com.github.gtache.fxml.compiler.impl.IncludesController controller, final ResourceBundle resourceBundle) { + this(Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, controller), Map.of(com.github.gtache.fxml.compiler.impl.IncludesController.class, resourceBundle)); + } + + /** + * Instantiates a new IncludesController with nested controllers + * @param controllersMap The map of controller class to controller + * @param resourceBundlesMap The map of controller class to resource bundle + */ + public IncludesController(final Map, Object> controllersMap, final Map, ResourceBundle> resourceBundlesMap) { + this.controllersMap = Map.copyOf(controllersMap); + this.resourceBundlesMap = Map.copyOf(resourceBundlesMap); + } + + public javafx.scene.Parent load() { + if (loaded) { + throw new IllegalStateException("Already loaded"); + } + controller = (com.github.gtache.fxml.compiler.impl.IncludesController) controllersMap.get(com.github.gtache.fxml.compiler.impl.IncludesController.class); + final var object0 = new javafx.scene.layout.BorderPane(); + final var object1 = new javafx.scene.layout.VBox(); + javafx.scene.layout.BorderPane.setAlignment(object1, javafx.geometry.Pos.CENTER); + final var object2 = new javafx.scene.layout.HBox(); + object2.setAlignment(javafx.geometry.Pos.CENTER); + object2.setSpacing(10.0); + final var object3 = new javafx.scene.control.Slider(); + controller.setPlaySlider(object3); + javafx.scene.layout.HBox.setHgrow(object3, javafx.scene.layout.Priority.ALWAYS); + final var object4 = new javafx.geometry.Insets(0, 0, 0, 10.0); + object3.setPadding(object4); + final var object5 = new javafx.scene.control.Label(); + controller.setPlayLabel(object5); + object5.setText("Label"); + final var object6 = new javafx.geometry.Insets(0, 10.0, 0, 0); + object5.setPadding(object6); + object2.getChildren().addAll(object3, object5); + final var object7 = new javafx.geometry.Insets(10.0, 0, 0, 0); + object2.setPadding(object7); + final var object8 = new javafx.scene.layout.HBox(); + object8.setAlignment(javafx.geometry.Pos.CENTER); + object8.setSpacing(10.0); + final var object9 = new javafx.scene.control.Button(); + controller.setPlayButton(object9); + object9.setMnemonicParsing(false); + object9.setOnAction(e -> callMethod("playPressed", e)); + final var object10 = new javafx.geometry.Insets(0, 20.0, 0, 0); + javafx.scene.layout.HBox.setMargin(object9, object10); + final var object11 = new javafx.scene.control.Label(); + object11.setText(controller.resources().getString("media.volume.label")); + final var object12 = new javafx.scene.control.Slider(); + controller.setVolumeSlider(object12); + object12.setValue(100); + final var object13 = new javafx.scene.control.Label(); + controller.setVolumeValueLabel(object13); + object13.setText("Label"); + final var map0 = new HashMap<>(resourceBundlesMap); + final var bundle0 = ResourceBundle.getBundle("com.github.gtache.fxml.compiler.impl.ControlsBundle"); + map0.put(com.github.gtache.fxml.compiler.impl.ControlsController, bundle0); + final var view0 = new com.github.gtache.fxml.compiler.impl.ControlsView(controllersMap, map0); + final var object14 = view0.load(); + final var controller0 = view0.controller(); + controller.setControlsController(controller0); + object8.getChildren().addAll(object9, object11, object12, object13, object14); + final var object15 = new javafx.geometry.Insets(10.0, 10.0, 10.0, 10.0); + object8.setPadding(object15); + object1.getChildren().addAll(object2, object8); + object0.setBottom(object1); + final var object16 = new javafx.scene.layout.VBox(); + controller.setVbox(object16); + final var object17 = new javafx.scene.control.ToolBar(); + controller.setToolBar(object17); + final var object18 = new javafx.scene.control.TitledPane(); + controller.setTitledPane(object18); + final var object19 = new javafx.scene.layout.TilePane(); + controller.setTilePane(object19); + final var object20 = new javafx.scene.text.TextFlow(); + controller.setTextFlow(object20); + final var object21 = new javafx.scene.control.TabPane(); + controller.setTabPane(object21); + final var object22 = new javafx.scene.control.Tab(); + controller.setTab(object22); + final var object23 = new javafx.scene.layout.StackPane(); + controller.setStackPane(object23); + final var object24 = new javafx.scene.control.SplitPane(); + controller.setSplitPane(object24); + final var object25 = new javafx.scene.control.ScrollPane(); + controller.setScrollPane(object25); + final var object26 = new javafx.scene.layout.Pane(); + controller.setPane(object26); + final var object27 = new javafx.scene.layout.HBox(); + controller.setHbox(object27); + final var object28 = new javafx.scene.Group(); + controller.setGroup(object28); + final var object29 = new javafx.scene.layout.GridPane(); + controller.setGridPane(object29); + final var object30 = new javafx.scene.layout.ColumnConstraints(); + controller.setColumnConstraints(object30); + object30.setHgrow(javafx.scene.layout.Priority.SOMETIMES); + object30.setMinWidth(10.0); + object29.getColumnConstraints().addAll(object30); + final var object31 = new javafx.scene.layout.RowConstraints(); + object31.setMinHeight(10.0); + object31.setVgrow(javafx.scene.layout.Priority.SOMETIMES); + object29.getRowConstraints().addAll(object31); + final var object32 = new javafx.scene.layout.FlowPane(); + controller.setFlowPane(object32); + final var object33 = new javafx.scene.control.DialogPane(); + controller.setDialogPane(object33); + final var object34 = new javafx.scene.control.ButtonBar(); + controller.setButtonBar(object34); + final var object35 = new javafx.scene.layout.AnchorPane(); + controller.setAnchorPane(object35); + final var object36 = new javafx.scene.control.Label(); + object36.setManaged(false); + object35.getChildren().addAll(object36); + object34.getButtons().addAll(object35); + object33.setContent(object34); + object32.getChildren().addAll(object33); + object29.getChildren().addAll(object32); + object28.getChildren().addAll(object29); + object27.getChildren().addAll(object28); + object26.getChildren().addAll(object27); + object25.setContent(object26); + object24.getItems().addAll(object25); + object23.getChildren().addAll(object24); + object22.setContent(object23); + object21.getTabs().addAll(object22); + object20.getChildren().addAll(object21); + object19.getChildren().addAll(object20); + object18.setContent(object19); + object17.getItems().addAll(object18); + object16.getChildren().addAll(object17); + object0.setCenter(object16); + try { + final var initialize = controller.getClass().getDeclaredMethod("initialize"); + initialize.setAccessible(true); + initialize.invoke(controller); + } catch (final InvocationTargetException | IllegalAccessException e) { + throw new RuntimeException("Error using reflection", e); + } catch (final NoSuchMethodException ignored) { + } + loaded = true; + return object0; +} + + private void callMethod(final String methodName, final T event) { + try { + final Method method; + final var methods = Arrays.stream(controller.getClass().getDeclaredMethods()) + .filter(m -> m.getName().equals(methodName)).toList(); + if (methods.size() > 1) { + final var eventMethods = methods.stream().filter(m -> + m.getParameterCount() == 1 && Event.class.isAssignableFrom(m.getParameterTypes()[0])).toList(); + if (eventMethods.size() == 1) { + method = eventMethods.getFirst(); + } else { + final var emptyMethods = methods.stream().filter(m -> m.getParameterCount() == 0).toList(); + if (emptyMethods.size() == 1) { + method = emptyMethods.getFirst(); + } else { + throw new IllegalArgumentException("Multiple matching methods for " + methodName); + } + } + } else if (methods.size() == 1) { + method = methods.getFirst(); + } else { + throw new IllegalArgumentException("No matching method for " + methodName); + } + method.setAccessible(true); + if (method.getParameterCount() == 0) { + method.invoke(controller); + } else { + method.invoke(controller, event); + } + } catch (final IllegalAccessException | InvocationTargetException ex) { + throw new RuntimeException("Error using reflection on " + methodName, ex); + } +} + + + /** + * @return The controller + */ + public com.github.gtache.fxml.compiler.impl.IncludesController controller() { + if (loaded) { + return controller; + } else { + throw new IllegalStateException("Not loaded"); + } + } +} diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/includesView.fxml b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/includesView.fxml new file mode 120000 index 0000000..1430c1d --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/includesView.fxml @@ -0,0 +1 @@ +../../../../../../../../../../core/src/test/resources/com/github/gtache/fxml/compiler/impl/includesView.fxml \ No newline at end of file diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/style.css b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/style.css new file mode 120000 index 0000000..dfd8001 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/impl/style.css @@ -0,0 +1 @@ +../../../../../../../../../../core/src/test/resources/com/github/gtache/fxml/compiler/impl/style.css \ No newline at end of file diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/parsing/listener/IncludedBundle.properties b/loader/src/test/resources/com/github/gtache/fxml/compiler/parsing/listener/IncludedBundle.properties new file mode 100644 index 0000000..e69de29 diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/parsing/listener/includedView.fxml b/loader/src/test/resources/com/github/gtache/fxml/compiler/parsing/listener/includedView.fxml new file mode 100644 index 0000000..8f95ad1 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/parsing/listener/includedView.fxml @@ -0,0 +1,6 @@ + + + + + diff --git a/loader/src/test/resources/com/github/gtache/fxml/compiler/parsing/listener/loadView.fxml b/loader/src/test/resources/com/github/gtache/fxml/compiler/parsing/listener/loadView.fxml new file mode 100644 index 0000000..18e6e28 --- /dev/null +++ b/loader/src/test/resources/com/github/gtache/fxml/compiler/parsing/listener/loadView.fxml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+