diff --git a/pmd-ui/src/main/java/net/sourceforge/pmd/util/fxdesigner/Designer.java b/pmd-ui/src/main/java/net/sourceforge/pmd/util/fxdesigner/Designer.java index b4705ac693..021ebdd8c6 100644 --- a/pmd-ui/src/main/java/net/sourceforge/pmd/util/fxdesigner/Designer.java +++ b/pmd-ui/src/main/java/net/sourceforge/pmd/util/fxdesigner/Designer.java @@ -10,10 +10,13 @@ import java.util.List; import java.util.Objects; import java.util.stream.Collectors; +import org.apache.commons.lang3.ArrayUtils; + import net.sourceforge.pmd.PMDVersion; import net.sourceforge.pmd.util.fxdesigner.app.DesignerRoot; import net.sourceforge.pmd.util.fxdesigner.util.DesignerUtil; +import com.sun.javafx.fxml.builder.ProxyBuilder; import javafx.application.Application; import javafx.collections.ObservableList; import javafx.fxml.FXMLLoader; @@ -58,6 +61,19 @@ public class Designer extends Application { XPathPanelController xpathPanelController = new XPathPanelController(mainController); SourceEditorController sourceEditorController = new SourceEditorController(mainController); + loader.setBuilderFactory(type -> { + + boolean needsRoot = Arrays.stream(type.getConstructors()).anyMatch(it -> ArrayUtils.contains(it.getParameterTypes(), DesignerRoot.class)); + + if (needsRoot) { + ProxyBuilder builder = new ProxyBuilder<>(type); + builder.put("designerRoot", owner); + return builder; + } else { + return null; //use default + } + }); + loader.setControllerFactory(type -> { if (type == MainDesignerController.class) { return mainController; diff --git a/pmd-ui/src/main/java/net/sourceforge/pmd/util/fxdesigner/SourceEditorController.java b/pmd-ui/src/main/java/net/sourceforge/pmd/util/fxdesigner/SourceEditorController.java index 58a5a94741..66a88a7721 100644 --- a/pmd-ui/src/main/java/net/sourceforge/pmd/util/fxdesigner/SourceEditorController.java +++ b/pmd-ui/src/main/java/net/sourceforge/pmd/util/fxdesigner/SourceEditorController.java @@ -78,16 +78,11 @@ public class SourceEditorController extends AbstractController implements NodeSelectionSource { private DesignerRoot designerRoot; - public AstTreeView() { + public AstTreeView(@NamedArg("designerRoot") DesignerRoot root) { + designerRoot = root; + EventSource eventSink = new EventSource<>(); selectionEvents = eventSink.suppressible(); @@ -58,6 +61,8 @@ public class AstTreeView extends TreeView implements NodeSelectionSource { eventSink.push(n); } })); + + initNodeSelectionHandling(); } @@ -141,8 +146,4 @@ public class AstTreeView extends TreeView implements NodeSelectionSource { } - public void setDesignerRoot(DesignerRoot designerRoot) { - this.designerRoot = designerRoot; - initNodeSelectionHandling(); - } } diff --git a/pmd-ui/src/main/java/net/sourceforge/pmd/util/fxdesigner/util/controls/NodeEditionCodeArea.java b/pmd-ui/src/main/java/net/sourceforge/pmd/util/fxdesigner/util/controls/NodeEditionCodeArea.java index 612952aaef..d39d5e4f66 100644 --- a/pmd-ui/src/main/java/net/sourceforge/pmd/util/fxdesigner/util/controls/NodeEditionCodeArea.java +++ b/pmd-ui/src/main/java/net/sourceforge/pmd/util/fxdesigner/util/controls/NodeEditionCodeArea.java @@ -31,10 +31,10 @@ import net.sourceforge.pmd.util.fxdesigner.app.NodeSelectionSource; import net.sourceforge.pmd.util.fxdesigner.util.DesignerUtil; import net.sourceforge.pmd.util.fxdesigner.util.codearea.AvailableSyntaxHighlighters; import net.sourceforge.pmd.util.fxdesigner.util.codearea.HighlightLayerCodeArea; -import net.sourceforge.pmd.util.fxdesigner.util.codearea.HighlightLayerCodeArea.LayerId; import net.sourceforge.pmd.util.fxdesigner.util.controls.NodeEditionCodeArea.StyleLayerIds; import javafx.application.Platform; +import javafx.beans.NamedArg; import javafx.css.PseudoClass; @@ -52,14 +52,18 @@ public class NodeEditionCodeArea extends HighlightLayerCodeArea i private DesignerRoot designerRoot; - public NodeEditionCodeArea() { + public NodeEditionCodeArea(@NamedArg("designerRoot") DesignerRoot root) { super(StyleLayerIds.class); + this.designerRoot = root; + setParagraphGraphicFactory(lineNumberFactory()); currentRuleResultsProperty().values().subscribe(this::highlightXPathResults); currentErrorNodesProperty().values().subscribe(this::highlightErrorNodes); currentNameOccurrences.values().subscribe(this::highlightNameOccurrences); + + initNodeSelectionHandling(); } /** Scroll the editor to a node and makes it visible. */ @@ -184,12 +188,6 @@ public class NodeEditionCodeArea extends HighlightLayerCodeArea i } - public void setDesignerRoot(DesignerRoot designerRoot) { - this.designerRoot = designerRoot; - initNodeSelectionHandling(); - } - - public void updateSyntaxHighlighter(Language language) { setSyntaxHighlighter(AvailableSyntaxHighlighters.getHighlighterForLanguage(language).orElse(null)); }