From e653e8fda1157a7c513723162dfaf5c25d5a1246 Mon Sep 17 00:00:00 2001 From: mkpaz Date: Thu, 10 Oct 2024 16:22:56 +0400 Subject: [PATCH] Initial --- .gitignore | 218 ++++ .screenshots/environment.png | Bin 0 -> 136598 bytes .screenshots/events.png | Bin 0 -> 359491 bytes .screenshots/inspector.png | Bin 0 -> 169428 bytes .screenshots/stylesheets.png | Bin 0 -> 49387 bytes LICENSE | 21 + README.md | 45 + connector/pom.xml | 42 + .../connector/AttributeListener.java | 89 ++ .../java/devtoolsfx/connector/BoundsPane.java | 287 ++++++ .../java/devtoolsfx/connector/Connector.java | 121 +++ .../connector/ConnectorOptions.java | 72 ++ .../main/java/devtoolsfx/connector/Env.java | 35 + .../connector/HighlightOptions.java | 19 + .../devtoolsfx/connector/InspectPane.java | 122 +++ .../java/devtoolsfx/connector/KeyValue.java | 41 + .../devtoolsfx/connector/LocalConnector.java | 339 +++++++ .../devtoolsfx/connector/LocalElement.java | 243 +++++ .../java/devtoolsfx/connector/LocalEnv.java | 99 ++ .../devtoolsfx/connector/WindowMonitor.java | 596 +++++++++++ .../devtoolsfx/connector/package-info.java | 5 + .../devtoolsfx/event/AttributeListEvent.java | 39 + .../event/AttributeUpdatedEvent.java | 36 + .../java/devtoolsfx/event/ConnectorEvent.java | 28 + .../java/devtoolsfx/event/ElementEvent.java | 11 + .../main/java/devtoolsfx/event/EventBus.java | 81 ++ .../java/devtoolsfx/event/EventSource.java | 18 + .../java/devtoolsfx/event/ExceptionEvent.java | 44 + .../java/devtoolsfx/event/JavaFXEvent.java | 33 + .../java/devtoolsfx/event/MousePosEvent.java | 43 + .../java/devtoolsfx/event/NodeAddedEvent.java | 31 + .../devtoolsfx/event/NodeRemovedEvent.java | 27 + .../devtoolsfx/event/NodeSelectedEvent.java | 29 + .../devtoolsfx/event/NodeStyleClassEvent.java | 25 + .../devtoolsfx/event/NodeVisibilityEvent.java | 24 + .../devtoolsfx/event/RootChangedEvent.java | 28 + .../devtoolsfx/event/WindowClosedEvent.java | 17 + .../event/WindowPropertiesEvent.java | 38 + .../java/devtoolsfx/scenegraph/ClassInfo.java | 9 + .../java/devtoolsfx/scenegraph/Element.java | 87 ++ .../devtoolsfx/scenegraph/NodeProperties.java | 54 + .../java/devtoolsfx/scenegraph/Vertex.java | 29 + .../scenegraph/WindowProperties.java | 73 ++ .../scenegraph/attributes/Attribute.java | 166 ++++ .../attributes/AttributeCategory.java | 42 + .../scenegraph/attributes/Clip.java | 10 + .../scenegraph/attributes/ControlTracker.java | 127 +++ .../attributes/GridPaneTracker.java | 133 +++ .../attributes/ImageViewTracker.java | 101 ++ .../scenegraph/attributes/LabeledTracker.java | 178 ++++ .../scenegraph/attributes/NodeTracker.java | 500 ++++++++++ .../scenegraph/attributes/ParentTracker.java | 86 ++ .../attributes/PropertyListener.java | 82 ++ .../attributes/ReflectiveTracker.java | 206 ++++ .../scenegraph/attributes/RegionTracker.java | 168 ++++ .../scenegraph/attributes/SceneTracker.java | 234 +++++ .../scenegraph/attributes/ShapeTracker.java | 157 +++ .../scenegraph/attributes/TextTracker.java | 171 ++++ .../scenegraph/attributes/Tracker.java | 239 +++++ .../scenegraph/attributes/WindowTracker.java | 154 +++ .../scenegraph/attributes/package-info.java | 7 + .../java/devtoolsfx/util/ClassInfoCache.java | 38 + .../main/java/devtoolsfx/util/SceneUtils.java | 377 +++++++ connector/src/main/java/module-info.java | 11 + demo/pom.xml | 46 + demo/src/main/java/devtoolsfx/Launcher.java | 83 ++ demo/src/main/java/module-info.java | 8 + demo/src/main/resources/demo.css | 3 + gui/pom.xml | 22 + gui/src/main/java/devtoolsfx/gui/GUI.java | 108 ++ .../main/java/devtoolsfx/gui/Preferences.java | 235 +++++ .../main/java/devtoolsfx/gui/ToolPane.java | 380 +++++++ .../gui/controls/ColorIndicator.java | 16 + .../java/devtoolsfx/gui/controls/Dialog.java | 49 + .../devtoolsfx/gui/controls/FilterField.java | 76 ++ .../gui/controls/FilterableTreeItem.java | 49 + .../java/devtoolsfx/gui/controls/TabLine.java | 69 ++ .../gui/controls/TextInputContextMenu.java | 72 ++ .../devtoolsfx/gui/controls/TextView.java | 37 + .../devtoolsfx/gui/env/EnvironmentTab.java | 241 +++++ .../devtoolsfx/gui/eventlog/EventLogTab.java | 239 +++++ .../java/devtoolsfx/gui/eventlog/Log.java | 89 ++ .../gui/eventlog/OptionsMenuButton.java | 93 ++ .../gui/inspector/AttributeCellContent.java | 85 ++ .../gui/inspector/AttributeDetailsPane.java | 147 +++ .../gui/inspector/AttributePane.java | 118 +++ .../gui/inspector/AttributeTreeItem.java | 89 ++ .../gui/inspector/AttributeTreeTable.java | 323 ++++++ .../gui/inspector/ExpandCollapse.java | 74 ++ .../gui/inspector/InspectorTab.java | 134 +++ .../gui/inspector/SceneGraphPane.java | 120 +++ .../gui/inspector/SceneGraphTree.java | 528 ++++++++++ .../gui/inspector/SceneGraphTreeCell.java | 63 ++ .../gui/inspector/SceneGraphTreeItem.java | 68 ++ .../devtoolsfx/gui/inspector/SearchField.java | 160 +++ .../gui/preferences/PreferencesTab.java | 154 +++ .../java/devtoolsfx/gui/style/Stylesheet.java | 24 + .../devtoolsfx/gui/style/StylesheetTab.java | 161 +++ .../gui/style/StylesheetTreeCell.java | 86 ++ .../gui/style/StylesheetTreeItem.java | 34 + .../devtoolsfx/gui/util/DummyElement.java | 73 ++ .../java/devtoolsfx/gui/util/Formatters.java | 179 ++++ .../java/devtoolsfx/gui/util/GUIHelpers.java | 66 ++ gui/src/main/java/module-info.java | 8 + gui/src/main/resources/index.css | 929 ++++++++++++++++++ pom.xml | 82 ++ 106 files changed, 12005 insertions(+) create mode 100755 .gitignore create mode 100644 .screenshots/environment.png create mode 100644 .screenshots/events.png create mode 100644 .screenshots/inspector.png create mode 100644 .screenshots/stylesheets.png create mode 100755 LICENSE create mode 100644 README.md create mode 100644 connector/pom.xml create mode 100644 connector/src/main/java/devtoolsfx/connector/AttributeListener.java create mode 100644 connector/src/main/java/devtoolsfx/connector/BoundsPane.java create mode 100644 connector/src/main/java/devtoolsfx/connector/Connector.java create mode 100644 connector/src/main/java/devtoolsfx/connector/ConnectorOptions.java create mode 100644 connector/src/main/java/devtoolsfx/connector/Env.java create mode 100644 connector/src/main/java/devtoolsfx/connector/HighlightOptions.java create mode 100644 connector/src/main/java/devtoolsfx/connector/InspectPane.java create mode 100644 connector/src/main/java/devtoolsfx/connector/KeyValue.java create mode 100644 connector/src/main/java/devtoolsfx/connector/LocalConnector.java create mode 100644 connector/src/main/java/devtoolsfx/connector/LocalElement.java create mode 100644 connector/src/main/java/devtoolsfx/connector/LocalEnv.java create mode 100644 connector/src/main/java/devtoolsfx/connector/WindowMonitor.java create mode 100644 connector/src/main/java/devtoolsfx/connector/package-info.java create mode 100644 connector/src/main/java/devtoolsfx/event/AttributeListEvent.java create mode 100644 connector/src/main/java/devtoolsfx/event/AttributeUpdatedEvent.java create mode 100644 connector/src/main/java/devtoolsfx/event/ConnectorEvent.java create mode 100644 connector/src/main/java/devtoolsfx/event/ElementEvent.java create mode 100644 connector/src/main/java/devtoolsfx/event/EventBus.java create mode 100644 connector/src/main/java/devtoolsfx/event/EventSource.java create mode 100644 connector/src/main/java/devtoolsfx/event/ExceptionEvent.java create mode 100644 connector/src/main/java/devtoolsfx/event/JavaFXEvent.java create mode 100644 connector/src/main/java/devtoolsfx/event/MousePosEvent.java create mode 100644 connector/src/main/java/devtoolsfx/event/NodeAddedEvent.java create mode 100644 connector/src/main/java/devtoolsfx/event/NodeRemovedEvent.java create mode 100644 connector/src/main/java/devtoolsfx/event/NodeSelectedEvent.java create mode 100644 connector/src/main/java/devtoolsfx/event/NodeStyleClassEvent.java create mode 100644 connector/src/main/java/devtoolsfx/event/NodeVisibilityEvent.java create mode 100644 connector/src/main/java/devtoolsfx/event/RootChangedEvent.java create mode 100644 connector/src/main/java/devtoolsfx/event/WindowClosedEvent.java create mode 100644 connector/src/main/java/devtoolsfx/event/WindowPropertiesEvent.java create mode 100644 connector/src/main/java/devtoolsfx/scenegraph/ClassInfo.java create mode 100644 connector/src/main/java/devtoolsfx/scenegraph/Element.java create mode 100644 connector/src/main/java/devtoolsfx/scenegraph/NodeProperties.java create mode 100644 connector/src/main/java/devtoolsfx/scenegraph/Vertex.java create mode 100644 connector/src/main/java/devtoolsfx/scenegraph/WindowProperties.java create mode 100644 connector/src/main/java/devtoolsfx/scenegraph/attributes/Attribute.java create mode 100644 connector/src/main/java/devtoolsfx/scenegraph/attributes/AttributeCategory.java create mode 100644 connector/src/main/java/devtoolsfx/scenegraph/attributes/Clip.java create mode 100644 connector/src/main/java/devtoolsfx/scenegraph/attributes/ControlTracker.java create mode 100644 connector/src/main/java/devtoolsfx/scenegraph/attributes/GridPaneTracker.java create mode 100644 connector/src/main/java/devtoolsfx/scenegraph/attributes/ImageViewTracker.java create mode 100644 connector/src/main/java/devtoolsfx/scenegraph/attributes/LabeledTracker.java create mode 100644 connector/src/main/java/devtoolsfx/scenegraph/attributes/NodeTracker.java create mode 100644 connector/src/main/java/devtoolsfx/scenegraph/attributes/ParentTracker.java create mode 100644 connector/src/main/java/devtoolsfx/scenegraph/attributes/PropertyListener.java create mode 100644 connector/src/main/java/devtoolsfx/scenegraph/attributes/ReflectiveTracker.java create mode 100644 connector/src/main/java/devtoolsfx/scenegraph/attributes/RegionTracker.java create mode 100644 connector/src/main/java/devtoolsfx/scenegraph/attributes/SceneTracker.java create mode 100644 connector/src/main/java/devtoolsfx/scenegraph/attributes/ShapeTracker.java create mode 100644 connector/src/main/java/devtoolsfx/scenegraph/attributes/TextTracker.java create mode 100644 connector/src/main/java/devtoolsfx/scenegraph/attributes/Tracker.java create mode 100644 connector/src/main/java/devtoolsfx/scenegraph/attributes/WindowTracker.java create mode 100644 connector/src/main/java/devtoolsfx/scenegraph/attributes/package-info.java create mode 100644 connector/src/main/java/devtoolsfx/util/ClassInfoCache.java create mode 100644 connector/src/main/java/devtoolsfx/util/SceneUtils.java create mode 100755 connector/src/main/java/module-info.java create mode 100644 demo/pom.xml create mode 100755 demo/src/main/java/devtoolsfx/Launcher.java create mode 100644 demo/src/main/java/module-info.java create mode 100644 demo/src/main/resources/demo.css create mode 100644 gui/pom.xml create mode 100644 gui/src/main/java/devtoolsfx/gui/GUI.java create mode 100644 gui/src/main/java/devtoolsfx/gui/Preferences.java create mode 100644 gui/src/main/java/devtoolsfx/gui/ToolPane.java create mode 100644 gui/src/main/java/devtoolsfx/gui/controls/ColorIndicator.java create mode 100644 gui/src/main/java/devtoolsfx/gui/controls/Dialog.java create mode 100644 gui/src/main/java/devtoolsfx/gui/controls/FilterField.java create mode 100644 gui/src/main/java/devtoolsfx/gui/controls/FilterableTreeItem.java create mode 100644 gui/src/main/java/devtoolsfx/gui/controls/TabLine.java create mode 100644 gui/src/main/java/devtoolsfx/gui/controls/TextInputContextMenu.java create mode 100644 gui/src/main/java/devtoolsfx/gui/controls/TextView.java create mode 100644 gui/src/main/java/devtoolsfx/gui/env/EnvironmentTab.java create mode 100644 gui/src/main/java/devtoolsfx/gui/eventlog/EventLogTab.java create mode 100644 gui/src/main/java/devtoolsfx/gui/eventlog/Log.java create mode 100644 gui/src/main/java/devtoolsfx/gui/eventlog/OptionsMenuButton.java create mode 100644 gui/src/main/java/devtoolsfx/gui/inspector/AttributeCellContent.java create mode 100644 gui/src/main/java/devtoolsfx/gui/inspector/AttributeDetailsPane.java create mode 100644 gui/src/main/java/devtoolsfx/gui/inspector/AttributePane.java create mode 100644 gui/src/main/java/devtoolsfx/gui/inspector/AttributeTreeItem.java create mode 100644 gui/src/main/java/devtoolsfx/gui/inspector/AttributeTreeTable.java create mode 100644 gui/src/main/java/devtoolsfx/gui/inspector/ExpandCollapse.java create mode 100644 gui/src/main/java/devtoolsfx/gui/inspector/InspectorTab.java create mode 100644 gui/src/main/java/devtoolsfx/gui/inspector/SceneGraphPane.java create mode 100644 gui/src/main/java/devtoolsfx/gui/inspector/SceneGraphTree.java create mode 100644 gui/src/main/java/devtoolsfx/gui/inspector/SceneGraphTreeCell.java create mode 100644 gui/src/main/java/devtoolsfx/gui/inspector/SceneGraphTreeItem.java create mode 100644 gui/src/main/java/devtoolsfx/gui/inspector/SearchField.java create mode 100644 gui/src/main/java/devtoolsfx/gui/preferences/PreferencesTab.java create mode 100644 gui/src/main/java/devtoolsfx/gui/style/Stylesheet.java create mode 100644 gui/src/main/java/devtoolsfx/gui/style/StylesheetTab.java create mode 100644 gui/src/main/java/devtoolsfx/gui/style/StylesheetTreeCell.java create mode 100644 gui/src/main/java/devtoolsfx/gui/style/StylesheetTreeItem.java create mode 100644 gui/src/main/java/devtoolsfx/gui/util/DummyElement.java create mode 100644 gui/src/main/java/devtoolsfx/gui/util/Formatters.java create mode 100644 gui/src/main/java/devtoolsfx/gui/util/GUIHelpers.java create mode 100755 gui/src/main/java/module-info.java create mode 100644 gui/src/main/resources/index.css create mode 100644 pom.xml diff --git a/.gitignore b/.gitignore new file mode 100755 index 0000000..c1b16ba --- /dev/null +++ b/.gitignore @@ -0,0 +1,218 @@ +# Created by https://www.toptal.com/developers/gitignore/api/linux,maven,eclipse,windows,intellij+all +# Edit at https://www.toptal.com/developers/gitignore?templates=linux,maven,eclipse,windows,intellij+all + +### Eclipse ### +.metadata +bin/ +tmp/ +*.tmp +*.bak +*.swp +*~.nib +local.properties +.settings/ +.loadpath +.recommenders + +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# PyDev specific (Python IDE for Eclipse) +*.pydevproject + +# CDT-specific (C/C++ Development Tooling) +.cproject + +# CDT- autotools +.autotools + +# Java annotation processor (APT) +.factorypath + +# PDT-specific (PHP Development Tools) +.buildpath + +# sbteclipse plugin +.target + +# Tern plugin +.tern-project + +# TeXlipse plugin +.texlipse + +# STS (Spring Tool Suite) +.springBeans + +# Code Recommenders +.recommenders/ + +# Annotation Processing +.apt_generated/ +.apt_generated_test/ + +# Scala IDE specific (Scala & Java development for Eclipse) +.cache-main +.scala_dependencies +.worksheet + +# Uncomment this line if you wish to ignore the project description file. +# Typically, this file would be tracked if it contains build/dependency configurations: +#.project + +### Eclipse Patch ### +# Spring Boot Tooling +.sts4-cache/ + +### Intellij+all ### +# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider +# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 + +# User-specific stuff +.idea/**/workspace.xml +.idea/**/tasks.xml +.idea/**/usage.statistics.xml +.idea/**/dictionaries +.idea/**/shelf + +# AWS User-specific +.idea/**/aws.xml + +# Generated files +.idea/**/contentModel.xml + +# Sensitive or high-churn files +.idea/**/dataSources/ +.idea/**/dataSources.ids +.idea/**/dataSources.local.xml +.idea/**/sqlDataSources.xml +.idea/**/dynamic.xml +.idea/**/uiDesigner.xml +.idea/**/dbnavigator.xml + +# Gradle +.idea/**/gradle.xml +.idea/**/libraries + +# Gradle and Maven with auto-import +# When using Gradle or Maven with auto-import, you should exclude module files, +# since they will be recreated, and may cause churn. Uncomment if using +# auto-import. +# .idea/artifacts +# .idea/compiler.xml +# .idea/jarRepositories.xml +# .idea/modules.xml +# .idea/*.iml +# .idea/modules +# *.iml +# *.ipr + +# CMake +cmake-build-*/ + +# Mongo Explorer plugin +.idea/**/mongoSettings.xml + +# File-based project format +*.iws + +# IntelliJ +out/ + +# mpeltonen/sbt-idea plugin +.idea_modules/ + +# JIRA plugin +atlassian-ide-plugin.xml + +# Cursive Clojure plugin +.idea/replstate.xml + +# SonarLint plugin +.idea/sonarlint/ + +# Crashlytics plugin (for Android Studio and IntelliJ) +com_crashlytics_export_strings.xml +crashlytics.properties +crashlytics-build.properties +fabric.properties + +# Editor-based Rest Client +.idea/httpRequests + +# Android studio 3.1+ serialized cache file +.idea/caches/build_file_checksums.ser + +### Intellij+all Patch ### +# Ignore everything but code style settings and run configurations +# that are supposed to be shared within teams. + +.idea/* + +!.idea/codeStyles +!.idea/runConfigurations + +### Linux ### +*~ + +# temporary files which can be created if a process still has a handle open of a deleted file +.fuse_hidden* + +# KDE directory preferences +.directory + +# Linux trash folder which might appear on any partition or disk +.Trash-* + +# .nfs files are created when an open file is removed but is still being accessed +.nfs* + +### Maven ### +target/ +pom.xml.tag +pom.xml.releaseBackup +pom.xml.versionsBackup +pom.xml.next +release.properties +dependency-reduced-pom.xml +buildNumber.properties +.mvn/timing.properties +# https://github.com/takari/maven-wrapper#usage-without-binary-jar +.mvn/wrapper/maven-wrapper.jar + +# Eclipse m2e generated files +# Eclipse Core +.project +# JDT-specific (Eclipse Java Development Tools) +.classpath + +### Windows ### +# Windows thumbnail cache files +Thumbs.db +Thumbs.db:encryptable +ehthumbs.db +ehthumbs_vista.db + +# Dump file +*.stackdump + +# Folder config file +[Dd]esktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msix +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# End of https://www.toptal.com/developers/gitignore/api/linux,maven,eclipse,windows,intellij+all diff --git a/.screenshots/environment.png b/.screenshots/environment.png new file mode 100644 index 0000000000000000000000000000000000000000..5a719a8fe49950cdb893878367132863da6d62a0 GIT binary patch literal 136598 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

0sa~nwPTnNTxMXd`T1jFl0eH;NLGxNrazE4 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

  • Y_ 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

    #b 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 %PN8RBIc)eM!Xb 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

    pZ_T9RKn)5x<;2gvO02aghoVE-XOvg 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%0AvDBsoNN28X9iBBF*F#b$0o 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

    $RQ=HOs}~y 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 literal 0 HcmV?d00001 diff --git a/.screenshots/stylesheets.png b/.screenshots/stylesheets.png new file mode 100644 index 0000000000000000000000000000000000000000..66c3064a395b8a25f9af658654a3744f5b6c27ac GIT binary patch literal 49387 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

    gj6$LT53D!IQJ+H+1? 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 q=yv2LGTqsF*KGg!`j!6$ZlWHXsnQ%S +inspector +

    + +Find more screenshots [here](https://github.com/mkpaz/devtoolsfx/tree/master/.screenshots). + +## Getting started + +Maven: + +```xml + + + io.github.mkpaz + devtoolsfx-gui + TBD + +``` + +Gradle: + +```groovy +dependencies { + implementation 'io.github.mkpaz:devtoolsfx-gui:TBD' +} +``` + +After the primary stage is shown, you can launch the dev tools GUI at any time with: + +```java +primaryStage.setOnShown( + e -> GUI.openToolStage(primaryStage, getHostServices()) +); +``` + +Check the `devtoolsfx.gui.GUI` class for additional ways to launch the dev tools, such as embedding it at the top or +bottom. Also, refer to the demo for a more detailed example. diff --git a/connector/pom.xml b/connector/pom.xml new file mode 100644 index 0000000..eb4cc68 --- /dev/null +++ b/connector/pom.xml @@ -0,0 +1,42 @@ + + + 4.0.0 + + io.github.mkpaz + devtoolsfx + 1.0-SNAPSHOT + + + devtoolsfx-connector + + + + org.openjfx + javafx-controls + + + org.jspecify + jspecify + + + + org.junit.jupiter + junit-jupiter-api + + + org.junit.jupiter + junit-jupiter-engine + + + org.junit.jupiter + junit-jupiter-params + + + org.assertj + assertj-core + + + + diff --git a/connector/src/main/java/devtoolsfx/connector/AttributeListener.java b/connector/src/main/java/devtoolsfx/connector/AttributeListener.java new file mode 100644 index 0000000..8880ecb --- /dev/null +++ b/connector/src/main/java/devtoolsfx/connector/AttributeListener.java @@ -0,0 +1,89 @@ +package devtoolsfx.connector; + +import devtoolsfx.event.EventBus; +import devtoolsfx.event.EventSource; +import devtoolsfx.scenegraph.attributes.AttributeCategory; +import devtoolsfx.scenegraph.attributes.Tracker; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.lang.System.Logger; +import java.lang.System.Logger.Level; +import java.util.Arrays; +import java.util.EnumMap; +import java.util.stream.Collectors; + +/** + * Listens for all types of attributes for the given target. + */ +@NullMarked +final class AttributeListener { + + private static final Logger LOGGER = System.getLogger(AttributeListener.class.getName()); + + private final EnumMap trackers; + private @Nullable Object target; + + public AttributeListener(EventBus eventBus, + EventSource eventSource) { + trackers = Arrays.stream(AttributeCategory.values()) + .map(category -> AttributeCategory.createTracker(category, eventBus, eventSource)) + .collect(Collectors.toMap( + Tracker::getCategory, + tracker -> tracker, + (l, r) -> { + LOGGER.log(Level.WARNING, "duplicate keys " + l.getCategory() + " and " + r.getCategory()); + return l; + }, + () -> new EnumMap<>(AttributeCategory.class) + )); + } + + /** + * Replaces the currently tracked target with a new one. + */ + public void setTarget(@Nullable Object candidate) { + if (candidate != null && candidate == target) { + return; + } + + target = candidate; + setTargetToAllTrackers(); + } + + /** + * Reloads (reads again) all attributes. + */ + public void reload() { + trackers.values().forEach(Tracker::reload); + } + + /** + * Reloads (reads again) all attributes in the specified category. + */ + public void reloadCategory(AttributeCategory category) { + trackers.get(category).reload(); + } + + /** + * Reloads (reads again) the specified attribute from the given category. + */ + public void reloadAttribute(AttributeCategory category, String property) { + trackers.get(category).reload(property); + } + + /////////////////////////////////////////////////////////////////////////// + + /** + * Reloads (reads again) all attributes in all trackers (categories). + */ + private void setTargetToAllTrackers() { + for (var tracker : trackers.values()) { + if (tracker.accepts(target)) { + tracker.setTarget(target); + } else { + tracker.reset(); + } + } + } +} diff --git a/connector/src/main/java/devtoolsfx/connector/BoundsPane.java b/connector/src/main/java/devtoolsfx/connector/BoundsPane.java new file mode 100644 index 0000000..0a94883 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/connector/BoundsPane.java @@ -0,0 +1,287 @@ +package devtoolsfx.connector; + +import devtoolsfx.util.SceneUtils; +import javafx.geometry.BoundingBox; +import javafx.geometry.Bounds; +import javafx.geometry.Point2D; +import javafx.scene.Node; +import javafx.scene.Parent; +import javafx.scene.paint.Color; +import javafx.scene.shape.Line; +import javafx.scene.shape.Rectangle; +import javafx.scene.shape.StrokeType; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import static java.lang.System.Logger; +import static java.lang.System.Logger.Level; + +/** + * Contains the logic to implement highlighting of arbitrary nodes within the given parent node. + * See {@link #attach(Parent)}. There are three types of nodes: a colored rectangle to + * highlight layoutBounds, a stroked rectangle to highlight boundsInParent, and a line + * to highlight the baselineOffset. + */ +@NullMarked +final class BoundsPane { + + private static final Logger LOGGER = System.getLogger(BoundsPane.class.getName()); + + private final Rectangle boundsInParentRect = createBoundsInParentRect(); + private final Rectangle layoutBoundsRect = createLayoutBoundsRect(); + private final Line baselineStroke = createBaselineStroke(); + private @Nullable Parent parent; + + public BoundsPane() { + // pass + } + + /** + * Attaches the overlay to the given parent node. When attached, the BoundsPane is able + * to display highlighting nodes above the parent node in the parent coordinate system. + * Use {@link #toggleLayoutBoundsDisplay(Node)}, {@link #toggleBoundsInParentDisplay(Node)} + * and {@link #toggleBaselineDisplay} to highlight any descendant nodes of the parent. + */ + public void attach(@Nullable Parent candidate) { + if (parent != null) { + detach(); + } + + // find parent we can use to hang bounds rectangles + parent = SceneUtils.findNearestPane(candidate); + + if (parent == null) { + if (candidate != null) { + LOGGER.log(Level.WARNING, "Could not find writable parent to add overlay nodes, overlay is disabled"); + } + + toggleLayoutBoundsDisplay(null); + toggleBoundsInParentDisplay(null); + toggleBaselineDisplay(null); + } else { + SceneUtils.addToNode(parent, boundsInParentRect); + SceneUtils.addToNode(parent, layoutBoundsRect); + SceneUtils.addToNode(parent, baselineStroke); + } + } + + /** + * Removes the overlay highlighting nodes. + */ + public void detach() { + if (parent != null) { + SceneUtils.removeFromNode(parent, boundsInParentRect); + SceneUtils.removeFromNode(parent, layoutBoundsRect); + SceneUtils.removeFromNode(parent, baselineStroke); + parent = null; + } + } + + /** + * Updates the properties of the layoutBounds rectangle to set or remove the highlight + * for the specified target node. If the target node is null the current selection will + * be removed. + */ + public void toggleLayoutBoundsDisplay(@Nullable Node target) { + if (target == null || parent == null) { + hideRect(layoutBoundsRect); + return; + } + + Bounds bounds = calcRelativeBounds(target, true); + if (bounds == null || !isFinite(bounds)) { + hideRect(layoutBoundsRect); + } else { + resizeRelocateRect(layoutBoundsRect, bounds); + layoutBoundsRect.setVisible(true); + } + } + + /** + * Updates the properties of the boundsInParent rectangle to set or remove the highlight + * for the specified target node. If the target node is null the current selection will + * be removed. + */ + public void toggleBoundsInParentDisplay(@Nullable Node target) { + if (target == null || parent == null) { + hideRect(boundsInParentRect); + return; + } + + Bounds bounds = calcRelativeBounds(target, false); + if (bounds == null || !isFinite(bounds)) { + hideRect(boundsInParentRect); + } else { + resizeRelocateRect(boundsInParentRect, bounds); + boundsInParentRect.setVisible(true); + } + } + + /** + * Updates the baseline stroke properties to set or remove the baseline offset highlighting + * for the specified target node. If the target node is null the current selection will be removed. + */ + public void toggleBaselineDisplay(@Nullable Node target) { + // protect from the Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, Double.NaN + if (parent == null || target == null || target.getBaselineOffset() == Node.BASELINE_OFFSET_SAME_AS_HEIGHT) { + hideStroke(baselineStroke); + return; + } + + Bounds b = target.getLayoutBounds(); + Point2D scenePos = target.localToScene(b.getMinX(), b.getMinY() + target.getBaselineOffset()); + Point2D localPos = parent.sceneToLocal(scenePos); + + // No jokes: if one of the coordinates is not finite, it will (silently) break the rendering. + // The overlay rectangle will be "frozen" and will only "unfreeze" after a window resize. + if (!isFinite(localPos)) { + hideStroke(baselineStroke); + return; + } + + baselineStroke.setStartX(localPos.getX()); + baselineStroke.setEndX(localPos.getX() + b.getWidth()); + baselineStroke.setStartY(localPos.getY()); + baselineStroke.setEndY(localPos.getY()); + baselineStroke.setVisible(true); + } + + /** + * Calculates the bounds of the node relative to the current parent node. + * + * @param layoutBounds calculate for the layoutBounds, if false boundsInParent will be used + */ + public @Nullable Bounds calcRelativeBounds(Node node, boolean layoutBounds) { + if (parent == null) { + return null; + } + + var bounds = node.getBoundsInParent(); + double layoutX = 0, layoutY = 0; + if (layoutBounds) { + bounds = node.getLayoutBounds(); + layoutX = node.getLayoutX(); + layoutY = node.getLayoutY(); + } + + if (node.getParent() == null) { + // no parent, so the node is root + return new BoundingBox( + bounds.getMinX() + layoutX + 1, bounds.getMinY() + layoutY + 1, + bounds.getWidth() - 2, bounds.getHeight() - 2 + ); + } else { + Point2D scenePos = node.getParent().localToScene(bounds.getMinX(), bounds.getMinY()); + Point2D parentPos = parent.sceneToLocal(scenePos); + return new BoundingBox( + parentPos.getX() + layoutX, parentPos.getY() + layoutY, + bounds.getWidth(), bounds.getHeight() + ); + } + } + + /////////////////////////////////////////////////////////////////////////// + + /** + * Creates a {@link Rectangle} that will be used in the overlay to highlight + * the {@link Node#boundsInParentProperty()} of a selected node. + */ + private Rectangle createBoundsInParentRect() { + var r = new Rectangle(); + r.setId(ConnectorOptions.AUX_NODE_ID_PREFIX + "layoutBoundsRect"); + r.setFill(null); + r.setStroke(Color.GREEN); + r.setStrokeType(StrokeType.INSIDE); + r.setOpacity(0.8); + r.getStrokeDashArray().addAll(3.0, 3.0); + r.setStrokeWidth(1); + r.setManaged(false); + r.setMouseTransparent(true); + return r; + } + + /** + * Creates a {@link Rectangle} that will be used in the overlay to highlight + * the {@link Node#layoutBoundsProperty()} of a selected node. + */ + private Rectangle createLayoutBoundsRect() { + var r = new Rectangle(); + r.setId(ConnectorOptions.AUX_NODE_ID_PREFIX + "boundsInParentRect"); + r.setFill(Color.YELLOW); + r.setOpacity(0.5); + r.setManaged(false); + r.setMouseTransparent(true); + return r; + } + + /** + * Creates a {@link Line} that will be used in the overlay to highlight + * the {@link Node#getBaselineOffset()} of a selected node. + */ + private Line createBaselineStroke() { + var l = new Line(); + l.setId(ConnectorOptions.AUX_NODE_ID_PREFIX + "baselineLine"); + l.setStroke(Color.RED); + l.setOpacity(.75); + l.setStrokeWidth(1); + l.setManaged(false); + return l; + } + + /** + * Hides the given line. + */ + private void hideStroke(Line line) { + line.setStartX(0); + line.setEndX(0); + line.setStartY(0); + line.setEndY(0); + line.setVisible(false); + } + + /** + * Hides the given rectangle. + */ + private void hideRect(Rectangle rect) { + rect.setX(0); + rect.setY(0); + rect.setWidth(0); + rect.setHeight(0); + rect.setVisible(false); + } + + /** + * Resizes and relocates the specified rectangle according to the provided bounds. + */ + private void resizeRelocateRect(Rectangle rect, Bounds bounds) { + rect.setX(bounds.getMinX()); + rect.setY(bounds.getMinY()); + rect.setWidth(bounds.getWidth()); + rect.setHeight(bounds.getHeight()); + } + + /** + * Ensures that all point coordinates are finite double values. + */ + private boolean isFinite(Point2D point) { + return isFinite(point.getX()) && isFinite(point.getY()); + } + + /** + * Ensures that all bounds values are finite double values. + */ + @SuppressWarnings("BooleanMethodIsAlwaysInverted") + private boolean isFinite(Bounds bounds) { + return isFinite(bounds.getMinX()) + && isFinite(bounds.getMinY()) + && isFinite(bounds.getWidth()) + && isFinite(bounds.getHeight()); + } + + /** + * Ensures that double is finite (not Infinity or NaN). + */ + private boolean isFinite(double d) { + return Double.isFinite(d) && !Double.isNaN(d); + } +} diff --git a/connector/src/main/java/devtoolsfx/connector/Connector.java b/connector/src/main/java/devtoolsfx/connector/Connector.java new file mode 100644 index 0000000..7ba81c0 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/connector/Connector.java @@ -0,0 +1,121 @@ +package devtoolsfx.connector; + +import devtoolsfx.event.EventBus; +import devtoolsfx.event.EventSource; +import devtoolsfx.scenegraph.Element; +import devtoolsfx.scenegraph.WindowProperties; +import devtoolsfx.scenegraph.attributes.AttributeCategory; +import javafx.application.Application; +import javafx.beans.property.ReadOnlyBooleanProperty; +import javafx.scene.Parent; +import javafx.scene.control.Control; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.List; +import java.util.Map; + +/** + * The connector serves as the main entry point for application monitoring. It accepts + * the target app's primary stage and tracks and reports its state and changes via the + * {@link EventBus}. The client should subscribe to EventBus events to react to these changes. + */ +@NullMarked +public interface Connector { + + /** + * Starts the connector, which monitors and reports on all existing and new application windows. + */ + void start(); + + /** + * The opposite of {@link #start()}. + */ + void stop(); + + /** + * Returns the start/stop state of the connector. + */ + ReadOnlyBooleanProperty startedProperty(); + + /** + * Returns the {@link EventBus} to react to the connector events. + */ + EventBus getEventBus(); + + /** + * Returns the list of event sources for all currently monitored objects. + */ + List getEventSources(); + + /** + * Returns the connector options. + */ + ConnectorOptions getOptions(); + + /** + * Returns the interface for accessing system or platform information + * about the monitored application. + */ + Env getEnv(); + + /** + * Selects and starts monitoring the attributes of the window and scene. + * This method is mutually exclusive with {@link #selectNode(int, Element, HighlightOptions)}. + */ + void selectWindow(int uid); + + /** + * Selects and starts monitoring the node attributes and visual highlights of the + * specified element's bounds, if possible. This method is mutually exclusive with + * {@link #selectWindow(int)}. + */ + void selectNode(int uid, Element element, @Nullable HighlightOptions opts); + + /** + * The opposite of {@link #selectNode(int, Element, HighlightOptions)}. + * + * @param uid see {@link EventSource#uid()} + */ + void clearSelection(int uid); + + /** + * Reloads the attributes of the selected element, if any. If no property is specified, + * all category attributes will be reloaded. If no category is specified, all element + * attributes across all categories will be reloaded. + */ + void reloadSelectedAttributes(int uid, @Nullable AttributeCategory category, @Nullable String property); + + /** + * Hides the specified window. + * + * @param uid see {@link EventSource#uid()} + */ + void hideWindow(int uid); + + /** + * Returns the list of nodes (elements) with custom stylesheets, specifically those + * for which {@link Parent#getStylesheets()} or {@link Control#getStylesheets()} is not empty. + * + * @param uid see {@link EventSource#uid()} + */ + Map.@Nullable Entry> getStyledElements(int uid); + + /** + * Returns the {@link Application#getUserAgentStylesheet()} for the monitored application. + */ + String getUserAgentStylesheet(); + + /** + * Reads and returns the content of the file resource at the specified URI. + */ + @Nullable + String getResource(int uid, String uri); + + /** + * Returns the owner class name for the given property. + * This method addresses the issue of finding the superclass that owns the property. + */ + @Nullable + String getDeclaringClass(String className, String property); +} diff --git a/connector/src/main/java/devtoolsfx/connector/ConnectorOptions.java b/connector/src/main/java/devtoolsfx/connector/ConnectorOptions.java new file mode 100644 index 0000000..8ee79a9 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/connector/ConnectorOptions.java @@ -0,0 +1,72 @@ +package devtoolsfx.connector; + +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.SimpleBooleanProperty; +import javafx.stage.PopupWindow; +import org.jspecify.annotations.NullMarked; + +/** + * Contains all the supported {@link Connector} options. + * Every option is observable, so they are applied at runtime immediately. + */ +@NullMarked +public final class ConnectorOptions { + + public static final String AUX_NODE_ID_PREFIX = "devtoolsfx."; + + private final BooleanProperty ignoreMouseTransparent = new SimpleBooleanProperty(false); + private final BooleanProperty inspectMode = new SimpleBooleanProperty(false); + private final BooleanProperty preventPopupAutoHide = new SimpleBooleanProperty(false); + + public ConnectorOptions() { + // pass + } + + /** + * Enables the option to ignore mouse-transparent nodes when hovering, + * e.g., in inspect mode. + */ + BooleanProperty ignoreMouseTransparentProperty() { + return ignoreMouseTransparent; + } + + public boolean isIgnoreMouseTransparent() { + return ignoreMouseTransparent.get(); + } + + public void setIgnoreMouseTransparent(boolean ignoreMouseTransparent) { + this.ignoreMouseTransparent.set(ignoreMouseTransparent); + } + + /** + * Toggles the connector inspect mode. When enabled, the connector will display + * the {@link InspectPane} containing short information above any hovered node. + */ + BooleanProperty inspectModeProperty() { + return inspectMode; + } + + public boolean isInspectMode() { + return inspectMode.get(); + } + + public void setInspectMode(boolean inspectMode) { + this.inspectMode.set(inspectMode); + } + + /** + * Disables the {@link PopupWindow#autoHideProperty()} when the popup window appears. + * This allows inspection of the popup window content without accidentally hiding the window. + */ + BooleanProperty preventPopupAutoHideProperty() { + return preventPopupAutoHide; + } + + public boolean isPreventPopupAutoHide() { + return preventPopupAutoHide.get(); + } + + public void setPreventPopupAutoHide(boolean preventPopupAutoHide) { + this.preventPopupAutoHide.set(preventPopupAutoHide); + } +} diff --git a/connector/src/main/java/devtoolsfx/connector/Env.java b/connector/src/main/java/devtoolsfx/connector/Env.java new file mode 100644 index 0000000..04d055d --- /dev/null +++ b/connector/src/main/java/devtoolsfx/connector/Env.java @@ -0,0 +1,35 @@ +package devtoolsfx.connector; + +import java.util.List; + +/** + * Provides system information about the monitored JavaFX application, + * including system properties, environment variables, platform preferences, and more. + */ +public interface Env { + + /** + * Returns the list of system properties for the JavaFX JVM process. + */ + List getSystemProperties(); + + /** + * Returns the list of env variables for the JavaFX JVM process. + */ + List getEnvVariables(); + + /** + * Returns the list of conditional features for the monitored JavaFX application. + */ + List getConditionalFeatures(); + + /** + * Returns the list of platform preferences for the monitored JavaFX application. + */ + List getPlatformPreferences(); + + /** + * Returns the list of optional platform preferences for the monitored JavaFX application. + */ + List getOtherPlatformProperties(); +} diff --git a/connector/src/main/java/devtoolsfx/connector/HighlightOptions.java b/connector/src/main/java/devtoolsfx/connector/HighlightOptions.java new file mode 100644 index 0000000..f1c091f --- /dev/null +++ b/connector/src/main/java/devtoolsfx/connector/HighlightOptions.java @@ -0,0 +1,19 @@ +package devtoolsfx.connector; + +import org.jspecify.annotations.NullMarked; + +/** + * Contains the highlighting options to apply when selecting a node. + */ +@NullMarked +public record HighlightOptions(boolean showLayoutBounds, + boolean showBoundsInParent, + boolean showBaseline) { + + /** + * Returns default {@link HighlightOptions}. + */ + public static HighlightOptions defaults() { + return new HighlightOptions(true, true, false); + } +} diff --git a/connector/src/main/java/devtoolsfx/connector/InspectPane.java b/connector/src/main/java/devtoolsfx/connector/InspectPane.java new file mode 100644 index 0000000..9b72dc8 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/connector/InspectPane.java @@ -0,0 +1,122 @@ +package devtoolsfx.connector; + +import devtoolsfx.util.ClassInfoCache; + +import java.text.DecimalFormat; + +import javafx.geometry.Bounds; +import javafx.geometry.Point2D; +import javafx.scene.Group; +import javafx.scene.Node; +import javafx.scene.control.Tooltip; +import javafx.scene.paint.Color; +import javafx.scene.shape.Rectangle; +import javafx.scene.shape.Shape; +import org.jspecify.annotations.NullMarked; + +import static javafx.stage.PopupWindow.AnchorLocation; + +/** + * The pane that is meant to be displayed above the hovered node. + * It visually highlights the node as well as displays the tooltip with short node information. + */ +@NullMarked +final class InspectPane extends Group { + + private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("0.0"); + + private final Rectangle rootBounds = new Rectangle(); + private final Rectangle viewportBounds = new Rectangle(); + private final Tooltip tooltip = new Tooltip(); + + public InspectPane() { + super(); + + setManaged(false); + setId(ConnectorOptions.AUX_NODE_ID_PREFIX + "inspectPane"); + + tooltip.setId(ConnectorOptions.AUX_NODE_ID_PREFIX + "inspectPaneTooltip"); + tooltip.setAnchorLocation(AnchorLocation.CONTENT_BOTTOM_RIGHT); + } + + /** + * Shows the pane. + * + * @param node the target node + * @param boundsInParent the node's bounds relative to the {@link BoundsPane} + * @param rootWidth the width of the scene's root + * @param rootHeight the height of the scene's root + */ + public void show(Node node, Bounds boundsInParent, double rootWidth, double rootHeight) { + if (tooltip.isShowing()) { + hide(); + } + + rootBounds.setWidth(rootWidth); + rootBounds.setHeight(rootHeight); + + double nodeWidth = boundsInParent.getMaxX() - boundsInParent.getMinX(); + double nodeHeight = boundsInParent.getMaxY() - boundsInParent.getMinY(); + + viewportBounds.setLayoutX(boundsInParent.getMinX()); + viewportBounds.setLayoutY(boundsInParent.getMinY()); + viewportBounds.setWidth(nodeWidth); + viewportBounds.setHeight(nodeHeight); + + // for some reason stage width may not be equal to the root node width, + // so we introduce some delta to compensate + if (rootWidth - nodeWidth < 2 && rootHeight - nodeHeight < 2) { + viewportBounds.setWidth(0); + viewportBounds.setHeight(0); + } + + var curtain = Shape.subtract(rootBounds, viewportBounds); + curtain.setMouseTransparent(false); + curtain.setFill(Color.GREEN); + curtain.setOpacity(0.5); + + getChildren().add(curtain); + + Point2D screenXY = node.localToScreen( + node.getBoundsInLocal().getMinX(), + node.getBoundsInLocal().getMinY() + ); + + var header = ClassInfoCache.get(node).simpleClassName(); + if (node.getId() != null) { + header += " id=\"" + node.getId() + "\""; + } + var styleClass = node.getStyleClass(); + if (!styleClass.isEmpty()) { + header += " class=\"" + String.join(" ", styleClass) + "\""; + } + + var text = """ + %s + x: %s y: %s + width: %s height: %s + """.formatted( + header, + DECIMAL_FORMAT.format(boundsInParent.getMinX()), + DECIMAL_FORMAT.format(boundsInParent.getMinY()), + DECIMAL_FORMAT.format(nodeWidth), + DECIMAL_FORMAT.format(nodeHeight) + ); + + tooltip.setText(text); + tooltip.show(node.getScene().getWindow(), screenXY.getX(), screenXY.getY()); + } + + /** + * The opposite of {@link #show(Node, Bounds, double, double)}. + */ + public void hide() { + try { + getChildren().clear(); + tooltip.hide(); + } catch (Exception ignored) { + // UnsupportedOperationException when closing the monitored + // window without disabling the inspect mode + } + } +} diff --git a/connector/src/main/java/devtoolsfx/connector/KeyValue.java b/connector/src/main/java/devtoolsfx/connector/KeyValue.java new file mode 100644 index 0000000..4c3836c --- /dev/null +++ b/connector/src/main/java/devtoolsfx/connector/KeyValue.java @@ -0,0 +1,41 @@ +package devtoolsfx.connector; + +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.Comparator; +import java.util.Map; + +/** + * Represents a simple key-value pair of strings. + */ +@NullMarked +public record KeyValue(String key, @Nullable String value) implements Comparable { + + public static final Comparator COMPARATOR = Comparator.comparing(KeyValue::key); + + @Override + public boolean equals(Object target) { + if (this == target) return true; + if (!(target instanceof KeyValue keyValue)) return false; + + return key.equals(keyValue.key); + } + + @Override + public int hashCode() { + return key.hashCode(); + } + + public static KeyValue of(Map.Entry entry) { + return new KeyValue( + String.valueOf(entry.getKey()), + String.valueOf(entry.getValue()) + ); + } + + @Override + public int compareTo(KeyValue other) { + return COMPARATOR.compare(this, other); + } +} diff --git a/connector/src/main/java/devtoolsfx/connector/LocalConnector.java b/connector/src/main/java/devtoolsfx/connector/LocalConnector.java new file mode 100644 index 0000000..466cf51 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/connector/LocalConnector.java @@ -0,0 +1,339 @@ +package devtoolsfx.connector; + +import devtoolsfx.event.EventBus; +import devtoolsfx.event.EventSource; +import devtoolsfx.event.ExceptionEvent; +import devtoolsfx.event.WindowClosedEvent; +import devtoolsfx.scenegraph.Element; +import devtoolsfx.scenegraph.WindowProperties; +import devtoolsfx.scenegraph.attributes.AttributeCategory; +import devtoolsfx.util.SceneUtils; +import javafx.application.Application; +import javafx.beans.property.ReadOnlyBooleanProperty; +import javafx.beans.property.ReadOnlyBooleanWrapper; +import javafx.collections.ListChangeListener; +import javafx.scene.control.PopupControl; +import javafx.stage.PopupWindow; +import javafx.stage.Stage; +import javafx.stage.Window; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.lang.System.Logger; +import java.lang.System.Logger.Level; +import java.net.URI; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.*; + +/** + * Implements the {@link Connector} interface for local (this JVM process) nodes. + * Also see {@link LocalElement}. + */ +@NullMarked +public final class LocalConnector implements Connector { + + private static final Logger LOGGER = System.getLogger(LocalConnector.class.getName()); + + private final String application; + private final ConnectorOptions opts; + private final EventBus eventBus = new EventBus(); + private final Env env = new LocalEnv(); + + private final Map monitors = new HashMap<>(); + + private final ListChangeListener windowListChangeListener = this::onWindowListChanged; + private final ReadOnlyBooleanWrapper started = new ReadOnlyBooleanWrapper(); + + /** + * See {@link LocalConnector#(Stage, ConnectorOptions , String)}. + */ + public LocalConnector(Stage primaryStage) { + this(primaryStage, null, null); + } + + /** + * See {@link LocalConnector#(Stage, ConnectorOptions , String)}. + */ + public LocalConnector(Stage primaryStage, @Nullable String application) { + this(primaryStage, application, null); + } + + /** + * Creates a new connector. + * Only one connector per app should be created. + * + * @param primaryStage the target app's primary stage + * @param application the target app's name that will be reported in events, + * see {@link EventSource#application()} + * @param opts the connector options + */ + public LocalConnector(Stage primaryStage, + @Nullable String application, + @Nullable ConnectorOptions opts) { + Objects.requireNonNull(primaryStage, "primary stage must not be null"); + + this.application = Objects.requireNonNullElse(application, "app-" + primaryStage.hashCode()); + this.opts = Objects.requireNonNullElse(opts, new ConnectorOptions()); + + monitors.put(uidOf(primaryStage), createMonitor(primaryStage, application, true)); + + this.opts.inspectModeProperty().addListener((obs, old, val) -> { + if (!val) { + // prevents ConcurrentModificationException + new ArrayList<>(monitors.values()).forEach(monitor -> monitor.setInspectMode(false)); + } + }); + } + + @Override + public void start() { + started.set(true); + + monitors.forEach((hash, monitor) -> monitor.start()); + Window.getWindows().addListener(windowListChangeListener); + LOGGER.log(Level.INFO, "LocalConnector started"); + } + + @Override + public void stop() { + started.set(false); + + monitors.forEach((hash, monitor) -> monitor.stop()); + Window.getWindows().removeListener(windowListChangeListener); + LOGGER.log(Level.INFO, "LocalConnector stopped"); + } + + @Override + public ReadOnlyBooleanProperty startedProperty() { + return started.getReadOnlyProperty(); + } + + @Override + public EventBus getEventBus() { + return eventBus; + } + + @Override + public List getEventSources() { + return monitors.values().stream().map(WindowMonitor::getEventSource).toList(); + } + + @Override + public ConnectorOptions getOptions() { + return opts; + } + + @Override + public Env getEnv() { + return env; + } + + @Override + public void selectWindow(int uid) { + var monitor = monitors.get(uid); + if (monitor != null) { + monitor.selectWindow(); + } else { + LOGGER.log(Level.WARNING, "Unable to select window: unknown window UID"); + } + } + + @Override + public void selectNode(int uid, Element element, @Nullable HighlightOptions opts) { + var monitor = monitors.get(uid); + if (monitor != null && element.isNodeElement()) { + var node = element instanceof LocalElement local ? local.unwrap() : monitor.findNode(element.getUID()); + if (node != null) { + monitor.selectNode(node, Objects.requireNonNullElse(opts, HighlightOptions.defaults())); + } else { + LOGGER.log(Level.WARNING, "Unable to select element: unknown node"); + } + } else { + LOGGER.log(Level.WARNING, "Unable to select element: unknown window UID"); + } + } + + @Override + public void clearSelection(int uid) { + var monitor = monitors.get(uid); + if (monitor != null) { + monitor.clearSelection(); + } else { + LOGGER.log(Level.WARNING, "Unable to clear selection: unknown window UID"); + } + } + + @Override + public void reloadSelectedAttributes(int uid, + @Nullable AttributeCategory category, + @Nullable String property) { + var monitor = monitors.get(uid); + if (monitor != null) { + monitor.reloadSelectedAttributes(category, property); + } else { + LOGGER.log(Level.WARNING, "Unable to reload attributes: unknown window UID"); + } + } + + @Override + public void hideWindow(int uid) { + var monitor = monitors.get(uid); + if (monitor != null) { + monitor.hideWindow(); + } + } + + @Override + public Map.@Nullable Entry> getStyledElements(int uid) { + var monitor = monitors.get(uid); + if (monitor != null) { + return monitor.getStyledElements(); + } + return null; + } + + @Override + public String getUserAgentStylesheet() { + var uas = Application.getUserAgentStylesheet(); + // not optimal, but there's no API to obtain platform's UA stylesheets URLs, + // for the reference, they're in the StyleManager#platformUserAgentStylesheetContainers + return Objects.requireNonNullElse(uas, Application.STYLESHEET_MODENA); + } + + @Override + public @Nullable String getResource(int uid, String uri) { + // security check to avoid reading an arbitrary file + var monitor = monitors.get(uid); + if (monitor == null || !monitor.containsStylesheet(uri)) { + return null; + } + + String content = null; + try { + content = Files.readString( + Paths.get(URI.create(uri).getPath()) + ); + } catch (Exception e) { + eventBus.fire(ExceptionEvent.of(monitor.getEventSource(), e)); + } + + return content; + } + + @Override + public @Nullable String getDeclaringClass(String canonicalName, String property) { + try { + Class cls = getDeclaringClass(Class.forName(canonicalName), property); + return cls != null ? cls.getCanonicalName() : null; + } catch (ClassNotFoundException e) { + return null; + } + } + + private @Nullable Class getDeclaringClass(Class cls, String method) { + try { + cls.getDeclaredMethod(method); + return cls; + } catch (NoSuchMethodException e) { + Class superClass = cls.getSuperclass(); + if (superClass != null) { + return getDeclaringClass(superClass, method); + } + } + + return null; + } + + /////////////////////////////////////////////////////////////////////////// + + /** + * Instantiates a new {@link WindowMonitor}. + */ + private WindowMonitor createMonitor(Window window, + @Nullable String application, + boolean isPrimaryStage) { + + int uid = uidOf(window); + + var app = application; + if (app == null && window instanceof Stage stage) { + app = stage.getTitle(); + } + if (app == null) { + app = "unknown#" + uid; + } + + var eventSource = new EventSource(app, uid, isPrimaryStage); + return new WindowMonitor(window, opts, eventBus, eventSource); + } + + /** + * Handles reported {@link Window#getWindows()} list changes. + */ + private void onWindowListChanged(ListChangeListener.Change change) { + while (change.next()) { + new ArrayList<>(change.getAddedSubList()).forEach(this::handleWindowAdd); + new ArrayList<>(change.getRemoved()).forEach(this::handleWindowRemove); + } + } + + // package-private for unit tests + void handleWindowAdd(Window window) { + int uid = uidOf(window); + + // ignore auxiliary tooltips (inspect mode) and context menus + if (window instanceof PopupControl popup && ( + // context menu with ID || menu button with ID + SceneUtils.isAuxiliaryNode(popup) || SceneUtils.isAuxiliaryNode(popup.getOwnerNode())) + ) { + return; + } + + // ignore any other auxiliary windows + if (window.getScene() != null && SceneUtils.isAuxiliaryNode(window.getScene().getRoot())) { + return; + } + + // guard block, should never happen + if (monitors.containsKey(uid)) { + LOGGER.log(Level.ERROR, "Attempting to add a new window that already has a bound monitor object"); + monitors.remove(uid); + handleWindowAdd(window); + } + + var monitor = createMonitor(window, application, false); + monitor.setInspectMode(opts.isInspectMode()); + + if (window instanceof PopupWindow popup) { + try { + if (opts.isPreventPopupAutoHide()) { + popup.setAutoHide(false); + } + } catch (Exception ignored) { + // some resource contention when autoHide=true + } + } + + monitors.put(uid, monitor); + monitor.start(); + } + + // package-private for unit tests + void handleWindowRemove(Window window) { + var uid = uidOf(window); + var monitor = monitors.get(uid); + if (monitor != null) { + monitor.stop(); + monitors.remove(uid); + eventBus.fire(new WindowClosedEvent(monitor.getEventSource())); + } + } + + /** + * Returns unique window ID. + */ + private int uidOf(Window window) { + return window.hashCode(); + } +} diff --git a/connector/src/main/java/devtoolsfx/connector/LocalElement.java b/connector/src/main/java/devtoolsfx/connector/LocalElement.java new file mode 100644 index 0000000..78735eb --- /dev/null +++ b/connector/src/main/java/devtoolsfx/connector/LocalElement.java @@ -0,0 +1,243 @@ +package devtoolsfx.connector; + +import devtoolsfx.event.EventSource; +import devtoolsfx.scenegraph.*; +import devtoolsfx.util.ClassInfoCache; +import devtoolsfx.util.SceneUtils; +import javafx.scene.Node; +import javafx.stage.Window; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +/** + * The {@link Element} implementation that directly wraps a link to the scene graph + * node and must not leak the JVM process (e.g. by transferring it via the network). + */ +@NullMarked +public final class LocalElement implements Element { + + private final int uid; + private final ClassInfo classInfo; + private final Vertex vertex; + private final @Nullable NodeProperties nodeProperties; + private final @Nullable WindowProperties windowProperties; + private final @Nullable Node node; + + private LocalElement(int uid, + ClassInfo classInfo, + Vertex vertex, + @Nullable NodeProperties nodeProperties, + @Nullable WindowProperties windowProperties, + @Nullable Node node) { + this.uid = uid; + this.classInfo = Objects.requireNonNull(classInfo, "class info must not be null"); + this.vertex = Objects.requireNonNull(vertex, "vertex must not be null"); + + if (nodeProperties != null && windowProperties != null) { + throw new IllegalArgumentException( + "Either nodeProperties or windowProperties must be null, as it signifies the type of the element" + ); + } + + if (nodeProperties == null && windowProperties == null) { + throw new IllegalArgumentException( + "Either nodeProperties or windowProperties must be specified, as it signifies the type of the element" + ); + } + + this.nodeProperties = nodeProperties; + this.windowProperties = windowProperties; + this.node = node; + } + + @Override + public int getUID() { + return uid; + } + + @Override + public ClassInfo getClassInfo() { + return classInfo; + } + + @Override + public @Nullable Element getParent() { + return vertex.getParent(); + } + + @Override + public List getChildren() { + return vertex.getChildren(); + } + + @Override + public boolean hasChildren() { + return vertex.hasChildren(); + } + + @Override + public @Nullable NodeProperties getNodeProperties() { + return nodeProperties; + } + + @Override + public @Nullable WindowProperties getWindowProperties() { + return windowProperties; + } + + @Override + public boolean isWindowElement() { + return windowProperties != null; + } + + @Override + public boolean isNodeElement() { + return nodeProperties != null; + } + + @Override + public boolean equals(Object other) { + if (this == other) { + return true; + } + if (!(other instanceof LocalElement that)) { + return false; + } + + return uid == that.uid; + } + + @Override + public int hashCode() { + return uid; + } + + @Override + public String toString() { + return "LocalElement{" + + "uid=" + uid + + ", classInfo=" + classInfo + + ", vertex=" + vertex + + ", nodeProperties=" + nodeProperties + + ", windowProperties=" + windowProperties + + ", node=" + node + + '}'; + } + + /** + * If the element is a wrapper around {@link Node}, unwraps the target node. + */ + public @Nullable Node unwrap() { + return node; + } + + /////////////////////////////////////////////////////////////////////////// + + /** + * Creates a new Element from the target JavaFX node. + */ + public static Element of(Node node) { + Objects.requireNonNull(node, "node cannot be null"); + + return new LocalElement( + node.hashCode(), + ClassInfoCache.get(node), + new NodeVertex(node), + NodeProperties.of(node), + null, + node + ); + } + + /** + * Creates a new Element for the given window. + */ + public static Element of(Window window, EventSource eventSource, @Nullable Element root) { + Objects.requireNonNull(window, "window cannot be null"); + + return new LocalElement( + eventSource.uid(), + ClassInfoCache.get(window), + new WindowVertex(root), + null, + WindowProperties.of(window, eventSource.isPrimaryStage()), + null + ); + } + + /** + * See {@link LocalElement#of(Window, EventSource, Element)}. + */ + public static Element of(Window window, EventSource eventSource) { + Objects.requireNonNull(window, "window cannot be null"); + + Element root = null; + if (window.getScene() != null && window.getScene().getRoot() != null) { + root = LocalElement.of(window.getScene().getRoot()); + } + + return LocalElement.of(window, eventSource, root); + } + + /////////////////////////////////////////////////////////////////////////// + + @NullMarked + static final class NodeVertex implements Vertex { + + private final Node node; + + public NodeVertex(Node node) { + this.node = node; + } + + @Override + public @Nullable Element getParent() { + if (node.getParent() != null) { + return of(node.getParent()); + } + return null; + } + + @Override + public List getChildren() { + return SceneUtils.getChildren(node) + .stream() + .map(LocalElement::of) + .collect(Collectors.toList()); + } + + @Override + public boolean hasChildren() { + return SceneUtils.getChildren(node).isEmpty(); + } + } + + @NullMarked + static final class WindowVertex implements Vertex { + + private final @Nullable Element root; + + public WindowVertex(@Nullable Element root) { + this.root = root; + } + + @Override + public @Nullable Element getParent() { + return null; + } + + @Override + public List getChildren() { + return root != null ? List.of(root) : List.of(); + } + + @Override + public boolean hasChildren() { + return root != null; + } + } +} diff --git a/connector/src/main/java/devtoolsfx/connector/LocalEnv.java b/connector/src/main/java/devtoolsfx/connector/LocalEnv.java new file mode 100644 index 0000000..b5a3e43 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/connector/LocalEnv.java @@ -0,0 +1,99 @@ +package devtoolsfx.connector; + +import javafx.application.ConditionalFeature; +import javafx.application.Platform; +import javafx.scene.input.KeyCode; +import javafx.scene.paint.Color; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.Arrays; +import java.util.List; +import java.util.Optional; +import java.util.stream.Stream; + +@NullMarked +public final class LocalEnv implements Env { + + @Override + public List getSystemProperties() { + return System.getProperties().entrySet().stream() + .map(KeyValue::of) + .toList(); + } + + @Override + public List getEnvVariables() { + return System.getenv().entrySet().stream() + .map(KeyValue::of) + .toList(); + } + + @Override + public List getConditionalFeatures() { + return Arrays.stream(ConditionalFeature.values()) + .map(cf -> new KeyValue( + "ConditionalFeature." + cf.toString(), + String.valueOf(Platform.isSupported(cf))) + ) + .toList(); + } + + @Override + public List getPlatformPreferences() { + var preferences = Platform.getPreferences(); + + var staticPreferences = Stream.of( + new KeyValue("Preferences.colorScheme", String.valueOf(preferences.getColorScheme())), + new KeyValue("Preferences.accentColor", colorToHexString(preferences.getAccentColor())), + new KeyValue("Preferences.backgroundColor", colorToHexString(preferences.getBackgroundColor())), + new KeyValue("Preferences.foregroundColor", colorToHexString(preferences.getForegroundColor())) + ); + + var uiPreferences = preferences.entrySet().stream().map(entry -> { + if (entry.getValue() instanceof Color color) { + return new KeyValue(entry.getKey(), colorToHexString(color)); + } + + return KeyValue.of(entry); + }); + + return Stream.concat(staticPreferences, uiPreferences).toList(); + } + + @Override + public List getOtherPlatformProperties() { + return List.of( + new KeyValue("accessibilityActive", String.valueOf(Platform.isAccessibilityActive())), + new KeyValue("implicitExit", String.valueOf(Platform.isImplicitExit())), + new KeyValue("keyLocked.CAPS", unwrap(Platform.isKeyLocked(KeyCode.CAPS))), + new KeyValue("keyLocked.NUM_LOCK", unwrap(Platform.isKeyLocked(KeyCode.NUM_LOCK))) + ); + } + + @SuppressWarnings("OptionalUsedAsFieldOrParameterType") + private String unwrap(Optional opt) { + return String.valueOf(opt.isPresent() && opt.get()); + } + + private static String colorToHexString(@Nullable Color color) { + if (color == null) { + return ""; + } + + if (color.getOpacity() == 1) { + return String.format("#%02X%02X%02X", + (int) (color.getRed() * 255), + (int) (color.getGreen() * 255), + (int) (color.getBlue() * 255) + ).toUpperCase(); + } + + return String.format("#%02X%02X%02X%02X", + (int) (color.getRed() * 255), + (int) (color.getGreen() * 255), + (int) (color.getBlue() * 255), + (int) (color.getOpacity() * 255) + ).toUpperCase(); + } +} diff --git a/connector/src/main/java/devtoolsfx/connector/WindowMonitor.java b/connector/src/main/java/devtoolsfx/connector/WindowMonitor.java new file mode 100644 index 0000000..ee3cd95 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/connector/WindowMonitor.java @@ -0,0 +1,596 @@ +package devtoolsfx.connector; + +import devtoolsfx.event.*; +import devtoolsfx.scenegraph.Element; +import devtoolsfx.scenegraph.WindowProperties; +import devtoolsfx.scenegraph.attributes.AttributeCategory; +import devtoolsfx.util.SceneUtils; +import javafx.beans.InvalidationListener; +import javafx.beans.Observable; +import javafx.beans.property.Property; +import javafx.beans.value.ChangeListener; +import javafx.collections.ListChangeListener; +import javafx.collections.ObservableList; +import javafx.event.Event; +import javafx.event.EventHandler; +import javafx.scene.Node; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.scene.control.Tooltip; +import javafx.scene.input.MouseEvent; +import javafx.stage.Window; +import javafx.util.Subscription; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.*; + +@NullMarked +final class WindowMonitor { + + private final Window window; + private final ConnectorOptions connectorOpts; + private final EventBus eventBus; + private final EventSource eventSource; + + // highlighting + private final BoundsPane boundsPane; + private final InspectPane inspectPane; + private @Nullable Node hoveredNode; + private @Nullable Node selectedNode; + private HighlightOptions highlightOpts = HighlightOptions.defaults(); + + // attributes + private final AttributeListener attributeListener; + + private boolean started; + private final Map stylesClassSubs = new HashMap<>(); + + /** + * Creates a new WindowMonitor instance. Monitors are not reusable; each instance must + * be connected to a different {@link Window}. + * + * @param window the monitored window + * @param connectorOpts options for {@link LocalConnector} + * @param eventBus the event bus instance to track monitor events + * @param eventSource the event source to be included in all emitted events + */ + public WindowMonitor(Window window, + ConnectorOptions connectorOpts, + EventBus eventBus, + EventSource eventSource) { + this.window = window; + this.connectorOpts = connectorOpts; + this.eventBus = eventBus; + this.eventSource = eventSource; + + this.boundsPane = new BoundsPane(); + this.inspectPane = new InspectPane(); + + this.attributeListener = new AttributeListener(eventBus, eventSource); + + connectorOpts.inspectModeProperty().addListener((obs, old, val) -> refreshRoot()); + } + + /////////////////////////////////////////////////////////////////////////// + // Public API // + /////////////////////////////////////////////////////////////////////////// + + /** + * Starts the monitor. + */ + public void start() { + started = true; + + window.xProperty().addListener(windowPropertyReportListener); + window.yProperty().addListener(windowPropertyReportListener); + window.widthProperty().addListener(windowPropertyReportListener); + window.heightProperty().addListener(windowPropertyReportListener); + window.focusedProperty().addListener(windowPropertyReportListener); + window.sceneProperty().addListener(sceneChangeListener); + + changeScene(null, window.getScene()); + fire(WindowPropertiesEvent.of(eventSource, window)); + } + + /** + * Stops the monitor. + */ + public void stop() { + started = false; + + window.xProperty().removeListener(windowPropertyReportListener); + window.yProperty().removeListener(windowPropertyReportListener); + window.widthProperty().removeListener(windowPropertyReportListener); + window.heightProperty().removeListener(windowPropertyReportListener); + window.focusedProperty().removeListener(windowPropertyReportListener); + window.sceneProperty().removeListener(sceneChangeListener); + + changeScene(getScene(), null); + + // cleanup resources + clearSelection(); + inspectPane.hide(); + } + + /** + * Returns the {@link EventBus} to react to the monitor events. + */ + public EventBus getEventBus() { + return eventBus; + } + + /** + * Returns the event source that is included in all emitted events by the monitor. + */ + public EventSource getEventSource() { + return eventSource; + } + + /** + * See {@link Connector#selectWindow(int)}. + */ + public void selectWindow() { + if (selectedNode != null) { + clearSelection(); + } + attributeListener.setTarget(window); + } + + /** + * See {@link Connector#selectNode(int, Element, HighlightOptions)}. + */ + public void selectNode(@Nullable Node node, @Nullable HighlightOptions opts) { + Node prevNode = selectedNode; + if (prevNode != null) { + prevNode.boundsInParentProperty().removeListener(selectedNodeBoundsListener); + prevNode.layoutBoundsProperty().removeListener(selectedNodeBoundsListener); + } + + if (node == null) { + clearSelection(); + return; + } + + highlightOpts = Objects.requireNonNullElse(opts, HighlightOptions.defaults()); + selectedNode = node; + + selectedNode.boundsInParentProperty().addListener(selectedNodeBoundsListener); + selectedNode.layoutBoundsProperty().addListener(selectedNodeBoundsListener); + + boundsPane.toggleLayoutBoundsDisplay(highlightOpts.showLayoutBounds() ? selectedNode : null); + boundsPane.toggleBoundsInParentDisplay(highlightOpts.showBoundsInParent() ? selectedNode : null); + boundsPane.toggleBaselineDisplay(highlightOpts.showBaseline() ? selectedNode : null); + + attributeListener.setTarget(selectedNode); + } + + /** + * The opposite of {@link #selectNode(Node, HighlightOptions)}. + */ + public void clearSelection() { + selectedNode = null; + attributeListener.setTarget(null); + highlightOpts = HighlightOptions.defaults(); + boundsPane.detach(); + } + + /** + * Returns a scene graph node with the given hash code. + */ + public @Nullable Node findNode(int hashCode) { + if (getRoot() == null) { + return null; + } + + return SceneUtils.findNode(getRoot(), hashCode); + } + + /** + * Sets the inspect mode on the monitored object to on or off. + */ + public void setInspectMode(boolean enabled) { + if (!enabled) { + inspectPane.hide(); + } + } + + /** + * Hides the monitored window. + */ + public void hideWindow() { + window.hide(); + } + + /** + * See {@link Connector#getStyledElements(int)}. + */ + public Map.@Nullable Entry> getStyledElements() { + List result = new ArrayList<>(); + if (getRoot() != null) { + SceneUtils.collectNodesWithStyleSheets(getRoot(), result); + } + + WindowProperties props = null; + if (getScene() != null) { + props = WindowProperties.of(window, eventSource.isPrimaryStage()); + } + + return props != null ? new AbstractMap.SimpleEntry<>(props, result) : null; + } + + /** + * Ensures that at least one scene graph node references the given stylesheet URI. + */ + public boolean containsStylesheet(String uri) { + if (getScene() != null && ( + Objects.equals(getScene().getUserAgentStylesheet(), uri) || getScene().getStylesheets().contains(uri)) + ) { + return true; + } + + return getRoot() != null && SceneUtils.containsStylesheet(getRoot(), uri); + } + + /** + * See {@link Connector#reloadSelectedAttributes(int, AttributeCategory, String)}. + */ + public void reloadSelectedAttributes(@Nullable AttributeCategory category, @Nullable String property) { + if (category != null && property != null) { + attributeListener.reloadAttribute(category, property); + return; + } + + if (category != null) { + attributeListener.reloadCategory(category); + return; + } + + attributeListener.reload(); + } + + /** + * Retrieves the scene of the monitored window. + */ + public @Nullable Scene getScene() { + return window.getScene(); + } + + /** + * Retrieves the scene root of the monitored window. + */ + public @Nullable Parent getRoot() { + return getScene() != null ? getScene().getRoot() : null; + } + + /////////////////////////////////////////////////////////////////////////// + // Listeners // + /////////////////////////////////////////////////////////////////////////// + + /** + * Called when the scene's root {@link Parent} node changes. + */ + private final ChangeListener sceneRootChangeListener = (obs, old, val) -> changeRoot(old, val); + + /** + * Called when the window's Scene value changes. + */ + private final ChangeListener sceneChangeListener = (obs, old, val) -> changeScene(old, val); + + /** + * Called when any of the window's properties change. + */ + private final InvalidationListener windowPropertyReportListener = obs -> onWindowPropertyChanged(); + + private void onWindowPropertyChanged() { + fire(WindowPropertiesEvent.of(eventSource, window)); + } + + /** + * Handles mouse move events to highlight a hovered node. + */ + private final EventHandler mouseMoveHighlightFilter = this::onMouseHover; + + private void onMouseHover(MouseEvent event) { + highlightHoveredNode(event); + } + + /** + * Handles mouse move events to select a clicked node. + */ + private final EventHandler mousePressSelectFilter = this::onMousePressed; + + private void onMousePressed(MouseEvent event) { + Node node = getHoveredNode(event); + if (node != null && connectorOpts.isInspectMode()) { + fire(new NodeSelectedEvent(eventSource, LocalElement.of(node))); + } + } + + /** + * Reports mouse coordinates via the event bus. + */ + private final EventHandler mousePosReportFilter = this::onMouseMoved; + + private void onMouseMoved(MouseEvent event) { + fire(MousePosEvent.of(eventSource, event)); + } + + /** + * Listens to the node's children list and handles changes accordingly. + */ + private final ListChangeListener nodeChildrenListener = this::onNodeChildrenChanged; + + private void onNodeChildrenChanged(ListChangeListener.Change change) { + while (change.next()) { + for (var dead : change.getRemoved()) { + removeNodeBranchListenersAndNotify(dead); + } + for (var alive : change.getAddedSubList()) { + addNodeBranchListenersAndNotify(alive); + } + } + } + + /** + * Tracks the node's visibility state. + */ + private final ChangeListener nodeVisibilityChangeListener = this::onNodeVisibilityChanged; + + @SuppressWarnings("unchecked") + private void onNodeVisibilityChanged(Observable obs, Boolean wasVisible, Boolean nowVisible) { + var node = (Node) ((Property) obs).getBean(); + fire(new NodeVisibilityEvent(eventSource, LocalElement.of(node), nowVisible)); + } + + /** + * Reports all {@link Event#ANY} events for the node via the event bus. + */ + private final EventHandler nodeEventLogFilter = this::onNodeAnyEvent; + + private void onNodeAnyEvent(Event event) { + fire(new JavaFXEvent( + eventSource, LocalElement.of((Node) event.getSource()), event.getEventType(), String.valueOf(event) + )); + } + + /** + * Updates the selected node highlighting when its bounds change due to resizing. + */ + private final InvalidationListener selectedNodeBoundsListener = new InvalidationListener() { + private boolean recursive; // prevent stack overflow + + @Override + public void invalidated(Observable obs) { + if (!recursive) { + recursive = true; + boundsPane.toggleLayoutBoundsDisplay(highlightOpts.showLayoutBounds() ? selectedNode : null); + boundsPane.toggleBoundsInParentDisplay(highlightOpts.showBoundsInParent() ? selectedNode : null); + recursive = false; + } + } + }; + + /** + * Changes the monitored {@link Scene}. + */ + private void changeScene(@Nullable Scene oldScene, @Nullable Scene newScene) { + // unsubscribe + Parent oldRoot = null; + if (oldScene != null) { + SceneUtils.removeListener(oldScene, Scene::rootProperty, sceneRootChangeListener); + SceneUtils.removeEventFilter(oldScene, MouseEvent.MOUSE_MOVED, mouseMoveHighlightFilter); + oldRoot = oldScene.getRoot(); + } + + // subscribe + Parent newRoot = null; + if (newScene != null) { + SceneUtils.addListener(newScene, Scene::rootProperty, sceneRootChangeListener); + SceneUtils.addEventFilter(newScene, MouseEvent.MOUSE_MOVED, mouseMoveHighlightFilter); + newRoot = newScene.getRoot(); + } + + changeRoot(oldRoot, newRoot); + } + + /** + * Changes the monitored {@link Parent} root node. + */ + private void changeRoot(@Nullable Parent oldRoot, @Nullable Parent newRoot, boolean force) { + // For alerts when we close the dialog, JavaFX caches the stage for reuse and changes + // the dialog pane to an empty root node. Thus, despite being stopped by the connector, + // the stage can continue to generate events, which can break the UI. That's why we first + // have to check that the monitor is still active. + if (!started) { + return; + } + + if (!force && oldRoot == newRoot) { + return; + } + + if (oldRoot != null) { + removeNodeBranchListeners(oldRoot); + SceneUtils.removeEventFilter(oldRoot, MouseEvent.MOUSE_MOVED, mouseMoveHighlightFilter); + SceneUtils.removeEventFilter(oldRoot, MouseEvent.MOUSE_MOVED, mousePosReportFilter); + SceneUtils.removeEventFilter(oldRoot, MouseEvent.MOUSE_PRESSED, mousePressSelectFilter); + SceneUtils.removeFromNode(oldRoot, inspectPane); + } + + if (newRoot != null) { + addNodeBranchListeners(newRoot); + SceneUtils.addEventFilter(newRoot, MouseEvent.MOUSE_MOVED, mouseMoveHighlightFilter); + SceneUtils.addEventFilter(newRoot, MouseEvent.MOUSE_MOVED, mousePosReportFilter); + SceneUtils.addEventFilter(newRoot, MouseEvent.MOUSE_PRESSED, mousePressSelectFilter); + SceneUtils.addToNode(newRoot, inspectPane); + } + + boundsPane.attach(newRoot); + notifyRootChanged(newRoot); + } + + /** + * See {@link #changeRoot(Parent, Parent, boolean)}. + */ + private void changeRoot(@Nullable Parent oldRoot, @Nullable Parent newRoot) { + changeRoot(oldRoot, newRoot, false); + } + + /** + * See {@link #changeRoot(Parent, Parent, boolean)}. + */ + private void refreshRoot() { + changeRoot(getRoot(), getRoot(), true); + } + + /////////////////////////////////////////////////////////////////////////// + // Operations with tracked scene graph node // + /////////////////////////////////////////////////////////////////////////// + + /** + * Notifies the {@link LocalConnector} client that this scene's root node + * has been changed, so they can update the UI accordingly. + */ + public void notifyRootChanged(@Nullable Parent root) { + var windowElement = LocalElement.of(window, eventSource, root != null ? LocalElement.of(root) : null); + fire(new RootChangedEvent(eventSource, windowElement)); + } + + /** + * Adds a set of listeners to the entire branch starting from the + * specified node to respond to state changes. + */ + private void addNodeBranchListeners(Node node) { + if (SceneUtils.isAuxiliaryNode(node)) { + return; + } + + node.visibleProperty().removeListener(nodeVisibilityChangeListener); + node.visibleProperty().addListener(nodeVisibilityChangeListener); + + node.removeEventFilter(Event.ANY, nodeEventLogFilter); + node.addEventFilter(Event.ANY, nodeEventLogFilter); + + stylesClassSubs.put(node.hashCode(), node.getStyleClass().subscribe(() -> fire(new NodeStyleClassEvent( + eventSource, LocalElement.of(node), Collections.unmodifiableList(node.getStyleClass()) + )))); + + ObservableList children = SceneUtils.getChildren(node); + children.removeListener(nodeChildrenListener); + children.addListener(nodeChildrenListener); + + for (var child : children) { + addNodeBranchListeners(child); + } + } + + /** + * The opposite of {@link #addNodeBranchListeners(Node)}. + *

    + * When we are removing a node: + * - if it's a real node removal removeVisibilityListener is true + * - if it's a visibility remove we should remove the visibility listeners + * of its children because the visibility is reduced by their parent + */ + private void removeNodeBranchListeners(Node node) { + ObservableList children = SceneUtils.getChildren(node); + for (var child : children) { + removeNodeBranchListeners(child); + } + children.removeListener(nodeChildrenListener); + + node.visibleProperty().removeListener(nodeVisibilityChangeListener); + + node.removeEventFilter(Event.ANY, nodeEventLogFilter); + + var subscription = stylesClassSubs.get(node.hashCode()); + if (subscription != null) { + subscription.unsubscribe(); + } + } + + /** + * Adds a set of listeners to respond to node state changes and emits a {@code node added} event. + */ + private void addNodeBranchListenersAndNotify(Node node) { + if (!SceneUtils.isAuxiliaryNode(node)) { + addNodeBranchListeners(node); + fire(NodeAddedEvent.of(eventSource, LocalElement.of(node))); + } + } + + /** + * Removes the set of listeners that was added to respond to node state changes and emits + * a {@code node removed} event. + */ + private void removeNodeBranchListenersAndNotify(Node node) { + if (!SceneUtils.isAuxiliaryNode(node)) { + removeNodeBranchListeners(node); + fire(new NodeRemovedEvent(eventSource, LocalElement.of(node))); + } + } + + /////////////////////////////////////////////////////////////////////////// + // Highlighting // + /////////////////////////////////////////////////////////////////////////// + + /** + * Returns the hovered node inside the scene based on the {@link MouseEvent} coordinates. + */ + private @Nullable Node getHoveredNode(MouseEvent event) { + if (getRoot() == null) { + return null; + } + return SceneUtils.findHoveredNode( + getRoot(), event.getX(), event.getY(), connectorOpts.isIgnoreMouseTransparent() + ); + } + + /** + * Highlights a hovered node based on the {@link MouseEvent} coordinates. + */ + private void highlightHoveredNode(MouseEvent event) { + if (!connectorOpts.isInspectMode()) { + return; + } + + Node node = getHoveredNode(event); + if (node != null && hoveredNode == node) { + return; + } + + hoveredNode = node; + if (hoveredNode != null) { + if (SceneUtils.isAuxiliaryNode(hoveredNode)) { + return; + } + + if (SceneUtils.getWindow(hoveredNode) instanceof Tooltip tooltip + && SceneUtils.isAuxiliaryNode(tooltip)) { + return; + } + + var nodeBounds = boundsPane.calcRelativeBounds(hoveredNode, false); + if (nodeBounds != null) { + inspectPane.show(hoveredNode, nodeBounds, window.getWidth(), window.getHeight()); + } + return; + } + + inspectPane.hide(); + } + + /////////////////////////////////////////////////////////////////////////// + // Utility Methods // + /////////////////////////////////////////////////////////////////////////// + + /** + * Fires the given event via the event bus when the monitor is started. + */ + private void fire(T event) { + if (started) { + eventBus.fire(event); + } + } +} diff --git a/connector/src/main/java/devtoolsfx/connector/package-info.java b/connector/src/main/java/devtoolsfx/connector/package-info.java new file mode 100644 index 0000000..09c1607 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/connector/package-info.java @@ -0,0 +1,5 @@ +/** + * The package contains the API for monitoring target node scene-graph changes. + */ + +package devtoolsfx.connector; diff --git a/connector/src/main/java/devtoolsfx/event/AttributeListEvent.java b/connector/src/main/java/devtoolsfx/event/AttributeListEvent.java new file mode 100644 index 0000000..b0d700e --- /dev/null +++ b/connector/src/main/java/devtoolsfx/event/AttributeListEvent.java @@ -0,0 +1,39 @@ +package devtoolsfx.event; + +import devtoolsfx.scenegraph.Element; +import devtoolsfx.scenegraph.attributes.Attribute; +import devtoolsfx.scenegraph.attributes.AttributeCategory; +import org.jspecify.annotations.NullMarked; + +import java.util.List; +import java.util.stream.Collectors; + +/** + * Notifies about detected attribute changes in a specific {@link AttributeCategory}. + * + * @param eventSource the event source + * @param element the element whose attributes have been changed + * @param category the attribute category + * @param attributes the list of changed attributes + */ +@NullMarked +public record AttributeListEvent(EventSource eventSource, + Element element, + AttributeCategory category, + List> attributes) implements ConnectorEvent, ElementEvent { + + @Override + public Element getElement() { + return element; + } + + @Override + public String toLogString() { + return "source=" + eventSource.toLogString() + + " | class=" + element.getSimpleClassName() + + " | category=" + category + + " | attributes=[" + + attributes.stream().map(Attribute::toLogString).collect(Collectors.joining("; ")) + + "]"; + } +} diff --git a/connector/src/main/java/devtoolsfx/event/AttributeUpdatedEvent.java b/connector/src/main/java/devtoolsfx/event/AttributeUpdatedEvent.java new file mode 100644 index 0000000..20879af --- /dev/null +++ b/connector/src/main/java/devtoolsfx/event/AttributeUpdatedEvent.java @@ -0,0 +1,36 @@ +package devtoolsfx.event; + +import devtoolsfx.scenegraph.Element; +import devtoolsfx.scenegraph.attributes.Attribute; +import devtoolsfx.scenegraph.attributes.AttributeCategory; +import org.jspecify.annotations.NullMarked; + +/** + * Notifies about a single attribute change in a specific category. + * The difference from the {@link AttributeListEvent} is semantic, + * differentiating category changes from a single attribute update. + * + * @param eventSource the event source + * @param element the element whose attributes have been changed + * @param category the attribute category + * @param attribute the changed attribute + */ +@NullMarked +public record AttributeUpdatedEvent(EventSource eventSource, + Element element, + AttributeCategory category, + Attribute attribute) implements ConnectorEvent, ElementEvent { + + @Override + public Element getElement() { + return element; + } + + @Override + public String toLogString() { + return "source=" + eventSource.toLogString() + + " | class=" + element.getSimpleClassName() + + " | category: " + category + + " | attribute: " + attribute.toLogString(); + } +} diff --git a/connector/src/main/java/devtoolsfx/event/ConnectorEvent.java b/connector/src/main/java/devtoolsfx/event/ConnectorEvent.java new file mode 100644 index 0000000..71ba9f0 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/event/ConnectorEvent.java @@ -0,0 +1,28 @@ +package devtoolsfx.event; + +import devtoolsfx.connector.Connector; +import org.jspecify.annotations.NullMarked; + +/** + * The base sealed interface for all {@link Connector} events. + */ +@NullMarked +public sealed interface ConnectorEvent permits + AttributeListEvent, + AttributeUpdatedEvent, + ExceptionEvent, + JavaFXEvent, + MousePosEvent, + NodeAddedEvent, + NodeRemovedEvent, + NodeSelectedEvent, + NodeStyleClassEvent, + NodeVisibilityEvent, + RootChangedEvent, + WindowClosedEvent, + WindowPropertiesEvent { + + EventSource eventSource(); + + String toLogString(); +} diff --git a/connector/src/main/java/devtoolsfx/event/ElementEvent.java b/connector/src/main/java/devtoolsfx/event/ElementEvent.java new file mode 100644 index 0000000..7531187 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/event/ElementEvent.java @@ -0,0 +1,11 @@ +package devtoolsfx.event; + +import devtoolsfx.scenegraph.Element; + +/** + * Signifies that the event has been triggered by an element and provides access to that element. + */ +public interface ElementEvent { + + Element getElement(); +} diff --git a/connector/src/main/java/devtoolsfx/event/EventBus.java b/connector/src/main/java/devtoolsfx/event/EventBus.java new file mode 100644 index 0000000..8bb3a1d --- /dev/null +++ b/connector/src/main/java/devtoolsfx/event/EventBus.java @@ -0,0 +1,81 @@ +package devtoolsfx.event; + +import devtoolsfx.connector.LocalConnector; +import javafx.application.Platform; +import org.jspecify.annotations.NullMarked; + +import java.lang.System.Logger; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArraySet; +import java.util.function.Consumer; + +import static java.lang.System.Logger.Level; + +/** + * A straightforward event bus implementation. Events are published in channels + * distinguished by event type. It must only be called from the FXThread. + */ +@NullMarked +public final class EventBus { + + private static final Logger LOGGER = System.getLogger(LocalConnector.class.getName()); + + private final Map, Set>> subscribers = new ConcurrentHashMap<>(); + + /** + * Creates new {@link EventBus} instance. + * If you want to use global event bus go with singleton method instead. + */ + public EventBus() { + // pass + } + + /** + * Subscribe to an event type. + */ + public void subscribe(Class eventType, Consumer subscriber) { + Set> eventSubscribers = getOrCreateSubscribers(eventType); + eventSubscribers.add(subscriber); + } + + /** + * Unsubscribe from all event types. + */ + public void unsubscribe(Consumer subscriber) { + subscribers.values().forEach(eventSubscribers -> eventSubscribers.remove(subscriber)); + } + + /** + * Publish an event to all subscribers. The event is published to all consumers + * which subscribed to this event type or any super class. + */ + @SuppressWarnings("unchecked") + public void fire(E event) { + Class eventType = event.getClass(); + subscribers.keySet().stream() + .filter(type -> type.isAssignableFrom(eventType)) + .flatMap(type -> subscribers.get(type).stream()) + .forEach(subscriber -> fire(event, (Consumer) subscriber)); + } + + /////////////////////////////////////////////////////////////////////////// + + private Set> getOrCreateSubscribers(Class eventType) { + return subscribers.computeIfAbsent(eventType, k -> new CopyOnWriteArraySet<>()); + } + + private void fire(E event, Consumer subscriber) { + try { + if (Platform.isFxApplicationThread()) { + subscriber.accept(event); + } else { + LOGGER.log(Level.WARNING, "Calling the event bus not from the FX thread"); + Platform.runLater(() -> subscriber.accept(event)); + } + } catch (Exception e) { + LOGGER.log(Level.ERROR, e.getMessage()); + } + } +} diff --git a/connector/src/main/java/devtoolsfx/event/EventSource.java b/connector/src/main/java/devtoolsfx/event/EventSource.java new file mode 100644 index 0000000..2f6c022 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/event/EventSource.java @@ -0,0 +1,18 @@ +package devtoolsfx.event; + +import org.jspecify.annotations.NullMarked; + +/** + * Refers to the source window that emitted an event. + * + * @param application the name of the application + * @param uid the ID of the window (stage) + * @param isPrimaryStage true if the source window is the primary stage; false otherwise + */ +@NullMarked +public record EventSource(String application, int uid, boolean isPrimaryStage) { + + public String toLogString() { + return application + "#" + uid; + } +} diff --git a/connector/src/main/java/devtoolsfx/event/ExceptionEvent.java b/connector/src/main/java/devtoolsfx/event/ExceptionEvent.java new file mode 100644 index 0000000..0cc4f8a --- /dev/null +++ b/connector/src/main/java/devtoolsfx/event/ExceptionEvent.java @@ -0,0 +1,44 @@ +package devtoolsfx.event; + +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.io.PrintWriter; +import java.io.StringWriter; + +/** + * Notifies about an exception that occurred during monitoring. + * + * @param eventSource the source of the event + * @param className the name of the exception class + * @param stackTrace the stack trace of the exception + * @param message the exception message + */ +@NullMarked +public record ExceptionEvent(EventSource eventSource, + String className, + String stackTrace, + @Nullable String message) implements ConnectorEvent { + + private static final StringWriter STRING_WRITER = new StringWriter(); + private static final PrintWriter PRINT_WRITER = new PrintWriter(STRING_WRITER); + + @Override + public String toLogString() { + return "source=" + eventSource.toLogString() + + " | class=" + className + + " | message=" + message; + } + + public static ExceptionEvent of(EventSource eventSource, Exception exception) { + PRINT_WRITER.flush(); + exception.printStackTrace(PRINT_WRITER); + + return new ExceptionEvent( + eventSource, + exception.getClass().getSimpleName(), + STRING_WRITER.toString(), + exception.getMessage() + ); + } +} diff --git a/connector/src/main/java/devtoolsfx/event/JavaFXEvent.java b/connector/src/main/java/devtoolsfx/event/JavaFXEvent.java new file mode 100644 index 0000000..c1add39 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/event/JavaFXEvent.java @@ -0,0 +1,33 @@ +package devtoolsfx.event; + +import devtoolsfx.scenegraph.Element; +import javafx.event.Event; +import javafx.event.EventType; +import org.jspecify.annotations.NullMarked; + +/** + * A wrapper for {@link javafx.event.Event} to dispatch JavaFX events via the connector event bus. + * + * @param eventSource the source of the event + * @param element the node (element) that triggered the event + * @param eventType the type of JavaFX event + * @param value the event as a string, or any other payload in a human-readable format + */ +@NullMarked +public record JavaFXEvent(EventSource eventSource, + Element element, + EventType eventType, + String value) implements ConnectorEvent, ElementEvent { + + @Override + public Element getElement() { + return element; + } + + @Override + public String toLogString() { + return "source=" + eventSource.toLogString() + + " | type=" + eventType + + " | value=" + value; + } +} diff --git a/connector/src/main/java/devtoolsfx/event/MousePosEvent.java b/connector/src/main/java/devtoolsfx/event/MousePosEvent.java new file mode 100644 index 0000000..2bfdc54 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/event/MousePosEvent.java @@ -0,0 +1,43 @@ +package devtoolsfx.event; + +import devtoolsfx.connector.LocalElement; +import devtoolsfx.scenegraph.Element; +import javafx.scene.Node; +import javafx.scene.input.MouseEvent; +import org.jspecify.annotations.NullMarked; + +/** + * Notifies about changes in the mouse position. + * The position should (and must) be given in the scene's coordinates (not in local node coordinates). + * + * @param eventSource the event source + * @param element the element whose mouse position has changed + * @param x the x coordinate + * @param y the y coordinate + */ +@NullMarked +public record MousePosEvent(EventSource eventSource, + Element element, + double x, + double y) implements ConnectorEvent, ElementEvent { + + @Override + public Element getElement() { + return element; + } + + @Override + public String toLogString() { + return "source=" + eventSource.toLogString() + + " | class=" + element.getSimpleClassName() + + " | x=" + x + " y=" + y; + } + + public static MousePosEvent of(EventSource eventSource, MouseEvent mouseEvent) { + return new MousePosEvent(eventSource, + LocalElement.of((Node) mouseEvent.getSource()), + mouseEvent.getSceneX(), + mouseEvent.getSceneY() + ); + } +} diff --git a/connector/src/main/java/devtoolsfx/event/NodeAddedEvent.java b/connector/src/main/java/devtoolsfx/event/NodeAddedEvent.java new file mode 100644 index 0000000..be1b401 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/event/NodeAddedEvent.java @@ -0,0 +1,31 @@ +package devtoolsfx.event; + +import devtoolsfx.scenegraph.Element; +import org.jspecify.annotations.NullMarked; + +/** + * Notifies about the added scene graph node element. + * + * @param eventSource the event source + * @param element the element used to access the properties of the added node + */ +@NullMarked +public record NodeAddedEvent(EventSource eventSource, + Element element) implements ConnectorEvent, ElementEvent { + + @Override + public Element getElement() { + return element; + } + + @Override + public String toLogString() { + return "source=" + eventSource.toLogString() + + " | class=" + element.getSimpleClassName() + + " | properties=" + (element.isWindowElement() ? element.getWindowProperties() : element.getNodeProperties()); + } + + public static NodeAddedEvent of(EventSource eventSource, Element element) { + return new NodeAddedEvent(eventSource, element); + } +} diff --git a/connector/src/main/java/devtoolsfx/event/NodeRemovedEvent.java b/connector/src/main/java/devtoolsfx/event/NodeRemovedEvent.java new file mode 100644 index 0000000..3933ffd --- /dev/null +++ b/connector/src/main/java/devtoolsfx/event/NodeRemovedEvent.java @@ -0,0 +1,27 @@ +package devtoolsfx.event; + +import devtoolsfx.scenegraph.Element; +import org.jspecify.annotations.NullMarked; + +/** + * Notifies about the removed scene graph node element. + * + * @param eventSource the event source + * @param element the element used to access the properties of the removed node + */ +@NullMarked +public record NodeRemovedEvent(EventSource eventSource, + Element element) implements ConnectorEvent, ElementEvent { + + @Override + public Element getElement() { + return element; + } + + @Override + public String toLogString() { + return "source=" + eventSource.toLogString() + + " | class=" + element.getSimpleClassName() + + " | properties=" + (element.isWindowElement() ? element.getWindowProperties() : element.getNodeProperties()); + } +} diff --git a/connector/src/main/java/devtoolsfx/event/NodeSelectedEvent.java b/connector/src/main/java/devtoolsfx/event/NodeSelectedEvent.java new file mode 100644 index 0000000..bb01fe1 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/event/NodeSelectedEvent.java @@ -0,0 +1,29 @@ +package devtoolsfx.event; + +import devtoolsfx.scenegraph.Element; +import org.jspecify.annotations.NullMarked; + +/** + * Notifies about the selected scene graph node element. + * Selection is not something that is supported by the scene graph API, but an + * abstraction for the currently inspected node. + * + * @param eventSource the event source + * @param element the element used to access the properties of the selected node + */ +@NullMarked +public record NodeSelectedEvent(EventSource eventSource, + Element element) implements ConnectorEvent, ElementEvent { + + @Override + public Element getElement() { + return element; + } + + @Override + public String toLogString() { + return "source=" + eventSource.toLogString() + + " | class=" + element.getSimpleClassName() + + " | properties=" + (element.isWindowElement() ? element.getWindowProperties() : element.getNodeProperties()); + } +} diff --git a/connector/src/main/java/devtoolsfx/event/NodeStyleClassEvent.java b/connector/src/main/java/devtoolsfx/event/NodeStyleClassEvent.java new file mode 100644 index 0000000..7de5019 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/event/NodeStyleClassEvent.java @@ -0,0 +1,25 @@ +package devtoolsfx.event; + +import devtoolsfx.scenegraph.Element; +import org.jspecify.annotations.NullMarked; + +import java.util.List; + +/** + * Notifies about changes to the node's style class list. + * + * @param eventSource the source of the event + * @param element the element whose style class list has changed + * @param styleClass the new style class list + */ +@NullMarked +public record NodeStyleClassEvent(EventSource eventSource, + Element element, + List styleClass) implements ConnectorEvent { + @Override + public String toLogString() { + return "source=" + eventSource.toLogString() + + " | class=" + element.getSimpleClassName() + + " | styleClass=" + styleClass; + } +} diff --git a/connector/src/main/java/devtoolsfx/event/NodeVisibilityEvent.java b/connector/src/main/java/devtoolsfx/event/NodeVisibilityEvent.java new file mode 100644 index 0000000..0ffbe5c --- /dev/null +++ b/connector/src/main/java/devtoolsfx/event/NodeVisibilityEvent.java @@ -0,0 +1,24 @@ +package devtoolsfx.event; + +import devtoolsfx.scenegraph.Element; +import org.jspecify.annotations.NullMarked; + +/** + * Notifies about node visibility state changes. + * + * @param eventSource the source of the event + * @param element the element whose visibility state has changed + * @param visible the new visibility state + */ +@NullMarked +public record NodeVisibilityEvent(EventSource eventSource, + Element element, + boolean visible) implements ConnectorEvent { + + @Override + public String toLogString() { + return "source=" + eventSource.toLogString() + + " | class=" + element.getSimpleClassName() + + " | visible=" + visible; + } +} diff --git a/connector/src/main/java/devtoolsfx/event/RootChangedEvent.java b/connector/src/main/java/devtoolsfx/event/RootChangedEvent.java new file mode 100644 index 0000000..cc49cbe --- /dev/null +++ b/connector/src/main/java/devtoolsfx/event/RootChangedEvent.java @@ -0,0 +1,28 @@ +package devtoolsfx.event; + +import devtoolsfx.scenegraph.Element; +import org.jspecify.annotations.NullMarked; + +/** + * Notifies about changes to the window's scene or the scene's root, + * including situations when a new window (and thus a new scene and root) is added. + * + * @param eventSource the event source + * @param element the element used to access the properties of the scene's root node + */ +@NullMarked +public record RootChangedEvent(EventSource eventSource, + Element element) implements ConnectorEvent, ElementEvent { + + @Override + public Element getElement() { + return element; + } + + @Override + public String toLogString() { + return "source=" + eventSource.toLogString() + + " | class=" + element.getSimpleClassName() + + " | properties=" + (element.isWindowElement() ? element.getWindowProperties() : element.getNodeProperties()); + } +} diff --git a/connector/src/main/java/devtoolsfx/event/WindowClosedEvent.java b/connector/src/main/java/devtoolsfx/event/WindowClosedEvent.java new file mode 100644 index 0000000..3574d58 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/event/WindowClosedEvent.java @@ -0,0 +1,17 @@ +package devtoolsfx.event; + +import org.jspecify.annotations.NullMarked; + +/** + * Notifies that the window has been closed. + * + * @param eventSource the event source + */ +@NullMarked +public record WindowClosedEvent(EventSource eventSource) implements ConnectorEvent { + + @Override + public String toLogString() { + return "source=" + eventSource.toLogString(); + } +} diff --git a/connector/src/main/java/devtoolsfx/event/WindowPropertiesEvent.java b/connector/src/main/java/devtoolsfx/event/WindowPropertiesEvent.java new file mode 100644 index 0000000..12b79c7 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/event/WindowPropertiesEvent.java @@ -0,0 +1,38 @@ +package devtoolsfx.event; + +import javafx.geometry.Dimension2D; +import javafx.geometry.Point2D; +import javafx.stage.Window; +import org.jspecify.annotations.NullMarked; + +/** + * Notifies about changes to the window properties. + * + * @param eventSource the event source + * @param position the window's position on the screen + * @param size the window's size + * @param focused whether the window is focused + */ +@NullMarked +public record WindowPropertiesEvent(EventSource eventSource, + Point2D position, + Dimension2D size, + boolean focused) implements ConnectorEvent { + + @Override + public String toLogString() { + return "source=" + eventSource.toLogString() + + " | x=" + position.getX() + " y=" + position.getY() + + " | width=" + size.getWidth() + " height=" + size.getHeight() + + " | focused=" + focused; + } + + public static WindowPropertiesEvent of(EventSource eventSource, Window window) { + return new WindowPropertiesEvent( + eventSource, + new Point2D(window.getX(), window.getY()), + new Dimension2D(window.getWidth(), window.getHeight()), + window.isFocused() + ); + } +} diff --git a/connector/src/main/java/devtoolsfx/scenegraph/ClassInfo.java b/connector/src/main/java/devtoolsfx/scenegraph/ClassInfo.java new file mode 100644 index 0000000..9ea1637 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/scenegraph/ClassInfo.java @@ -0,0 +1,9 @@ +package devtoolsfx.scenegraph; + +/** + * Represents the short information about an arbitrary {@link Class} name. + */ +public record ClassInfo(String module, + String className, + String simpleClassName) { +} diff --git a/connector/src/main/java/devtoolsfx/scenegraph/Element.java b/connector/src/main/java/devtoolsfx/scenegraph/Element.java new file mode 100644 index 0000000..a1d22ba --- /dev/null +++ b/connector/src/main/java/devtoolsfx/scenegraph/Element.java @@ -0,0 +1,87 @@ +package devtoolsfx.scenegraph; + +import java.util.List; + +import javafx.scene.Node; +import javafx.stage.Window; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +/** + * An element represents an arbitrary item in the scene graph hierarchy + * and essentially serves as a local or remote wrapper around {@link Node} + * or {@link Window}. + *

    + * While it is not directly enforced, an implementation must override + * {@code hashCode()} and {@code equals()} to function properly. + */ +@NullMarked +public interface Element { + + /** + * Returns the unique element ID (generally, its hash code). + */ + int getUID(); + + /** + * Returns full information about the type of the wrapped scene graph node. + */ + ClassInfo getClassInfo(); + + /** + * Returns the parent element, or null if this element is the root. + */ + @Nullable + Element getParent(); + + /** + * Returns a list of the children of this element. + */ + List getChildren(); + + /** + * Checks whether this element has any children. + */ + boolean hasChildren(); + + /** + * Returns the properties of the wrapped node. If the element does not wrap + * a {@link Node} but a {@link Window}, it returns null. + */ + @Nullable + NodeProperties getNodeProperties(); + + /** + * Returns the properties of the wrapped window. If the element does not wrap + * a {@link Window} but a {@link Node}, it returns null. + */ + @Nullable + WindowProperties getWindowProperties(); + + /** + * Checks whether the element is a wrapper around {@link Node}. + */ + boolean isNodeElement(); + + /** + * Checks whether the element is a wrapper around {@link Window}. + */ + boolean isWindowElement(); + + /** + * Returns whether the element wraps an auxiliary node. + */ + default boolean isAuxiliaryElement() { + // all auxiliary nodes must have an ID that starts with a common prefix, + // for normal javaFX nodes ID isn't mandatory (and rarely used) + var props = getNodeProperties(); + return props != null && props.isAuxiliaryElement(); + } + + /** + * Returns the simple class name of the wrapped scene graph node. + */ + default String getSimpleClassName() { + return getClassInfo().simpleClassName(); + } +} diff --git a/connector/src/main/java/devtoolsfx/scenegraph/NodeProperties.java b/connector/src/main/java/devtoolsfx/scenegraph/NodeProperties.java new file mode 100644 index 0000000..e99936c --- /dev/null +++ b/connector/src/main/java/devtoolsfx/scenegraph/NodeProperties.java @@ -0,0 +1,54 @@ +package devtoolsfx.scenegraph; + +import devtoolsfx.connector.ConnectorOptions; +import devtoolsfx.util.SceneUtils; +import javafx.scene.Group; +import javafx.scene.Node; +import javafx.scene.control.Control; +import javafx.scene.layout.Pane; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.Collections; +import java.util.List; + +/** + * Represents a selective set of node properties. + * + * @param id the {@link Node#getId()} of the node + * @param styleClass the {@link Node#getStyleClass()} of the node + * @param stylesheets the list of stylesheets for the node + * @param isControl whether the node is a JavaFX {@link Control} + * @param isPane whether the node is a JavaFX {@link Pane} or {@link Group} + * @param isVisible whether the node is visible + */ +@NullMarked +public record NodeProperties(@Nullable String id, + List styleClass, + List stylesheets, + @Nullable String userAgentStylesheet, + boolean isControl, + boolean isPane, + boolean isVisible) { + + /** + * See {@link Element#isAuxiliaryElement()}. + */ + public boolean isAuxiliaryElement() { + // all auxiliary nodes must have an ID that starts with a common prefix, + // for normal javaFX nodes ID isn't mandatory (and rarely used) + return id != null && id.startsWith(ConnectorOptions.AUX_NODE_ID_PREFIX); + } + + public static NodeProperties of(Node node) { + return new NodeProperties( + node.getId(), + Collections.unmodifiableList(node.getStyleClass()), + SceneUtils.getStylesheets(node), + SceneUtils.getUserAgentStylesheet(node), + node instanceof Control, + node instanceof Pane || node instanceof Group, + node.isVisible() + ); + } +} diff --git a/connector/src/main/java/devtoolsfx/scenegraph/Vertex.java b/connector/src/main/java/devtoolsfx/scenegraph/Vertex.java new file mode 100644 index 0000000..7715a2d --- /dev/null +++ b/connector/src/main/java/devtoolsfx/scenegraph/Vertex.java @@ -0,0 +1,29 @@ +package devtoolsfx.scenegraph; + +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.List; + +/** + * Represents a vertex in the scene graph tree. + */ +@NullMarked +public interface Vertex { + + /** + * Returns the parent element, if any. + */ + @Nullable + Element getParent(); + + /** + * Returns the list of child elements. + */ + List getChildren(); + + /** + * Returns whether the vertex has any child elements. + */ + boolean hasChildren(); +} diff --git a/connector/src/main/java/devtoolsfx/scenegraph/WindowProperties.java b/connector/src/main/java/devtoolsfx/scenegraph/WindowProperties.java new file mode 100644 index 0000000..aa460fc --- /dev/null +++ b/connector/src/main/java/devtoolsfx/scenegraph/WindowProperties.java @@ -0,0 +1,73 @@ +package devtoolsfx.scenegraph; + +import javafx.scene.Scene; +import javafx.scene.control.DialogPane; +import javafx.stage.Modality; +import javafx.stage.PopupWindow; +import javafx.stage.Stage; +import javafx.stage.Window; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.Collections; +import java.util.List; + +/** + * Represents a selective set of window properties. + * + * @param windowType the type of the window + * @param sceneStylesheets the list of stylesheets for the scene + * @param isPrimaryStage whether the window is the primary stage + * @param windowTitle the title of the window + * @param ownerClassName the class name of the window owner's node + */ +@NullMarked +public record WindowProperties(WindowType windowType, + List sceneStylesheets, + @Nullable String userAgentStylesheet, + boolean isPrimaryStage, + @Nullable String windowTitle, + @Nullable String ownerClassName) { + + public enum WindowType { + STAGE, MODAL, POPUP, ALERT + } + + public static WindowProperties of(Window window, boolean isPrimaryStage) { + var type = WindowType.STAGE; + String windowTitle = null; + String ownerClassName = null; + Scene scene = window.getScene(); + + if (window instanceof PopupWindow popup) { + type = WindowType.POPUP; + if (popup.getOwnerNode() != null) { + ownerClassName = popup.getOwnerNode().getClass().getSimpleName(); + } + } + + if (window instanceof Stage stage) { + if (stage.getModality() == Modality.WINDOW_MODAL || stage.getModality() == Modality.APPLICATION_MODAL) { + type = WindowType.MODAL; + } + + // alert can be modal or not modal + if (scene != null && scene.getRoot() instanceof DialogPane) { + type = WindowType.ALERT; + } + + windowTitle = stage.getTitle(); + } + + List stylesheets = window.getScene() != null + ? Collections.unmodifiableList(window.getScene().getStylesheets()) + : List.of(); + + String uas = null; + if (scene != null && scene.getUserAgentStylesheet() != null && !scene.getUserAgentStylesheet().isEmpty()) { + uas = scene.getUserAgentStylesheet(); + } + + return new WindowProperties(type, stylesheets, uas, isPrimaryStage, windowTitle, ownerClassName); + } +} diff --git a/connector/src/main/java/devtoolsfx/scenegraph/attributes/Attribute.java b/connector/src/main/java/devtoolsfx/scenegraph/attributes/Attribute.java new file mode 100644 index 0000000..a8d3617 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/scenegraph/attributes/Attribute.java @@ -0,0 +1,166 @@ +package devtoolsfx.scenegraph.attributes; + +import javafx.beans.property.Property; +import javafx.beans.value.ObservableValue; +import javafx.geometry.Bounds; +import javafx.geometry.Insets; +import javafx.scene.effect.Effect; +import javafx.scene.image.Image; +import javafx.scene.layout.Background; +import javafx.scene.layout.Border; +import javafx.scene.layout.ColumnConstraints; +import javafx.scene.layout.RowConstraints; +import javafx.scene.paint.Color; +import javafx.scene.text.Font; +import javafx.scene.transform.Transform; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.List; +import java.util.Map; + +/** + * Encapsulates summary information about an observable object property or field. + * + * @param name the unique attribute name (label) + * @param value the value of a property, field, or any other payload + * @param field the observable property or field name, can be null + * @param cssProperty the corresponding CSS property name, if styleable + * @param observableType the type of the observable property + * @param displayHint a hint to assist in displaying the property value + * @param valueState whether the property value has been changed + * @param validValues the set (or range) of valid property values + */ +@NullMarked +public record Attribute( + String name, + @Nullable V value, + @Nullable String field, + @Nullable String cssProperty, + ObservableType observableType, + DisplayHint displayHint, + ValueState valueState, + List validValues) { + + public Attribute(String name, + @Nullable V value, + @Nullable String field, + ObservableType observableType, + DisplayHint displayHint, + ValueState valueState) { + this(name, value, field, null, observableType, displayHint, valueState, List.of()); + } + + public Attribute(String name, + @Nullable V value, + @Nullable String field, + @Nullable String cssProperty, + ObservableType observableType, + DisplayHint displayHint, + ValueState valueState) { + this(name, value, field, cssProperty, observableType, displayHint, valueState, List.of()); + } + + @Override + public boolean equals(Object target) { + if (this == target) { + return true; + } + if (target == null || getClass() != target.getClass()) { + return false; + } + + Attribute attribute = (Attribute) target; + return name.equals(attribute.name); + } + + @Override + public int hashCode() { + return name.hashCode(); + } + + public String toLogString() { + return "Attribute:" + + " name=" + name + + " value=" + value + + " field=" + field + + " valueState=" + valueState; + } + + /////////////////////////////////////////////////////////////////////////// + + /** + * Provides a hint for displaying the attribute value. + */ + public enum DisplayHint { + + BACKGROUND(Background.class), + BOOLEAN(Boolean.class), + BORDER(Border.class), + BOUNDS(Bounds.class), + CLIP(Clip.class), + COLOR(Color.class), + COLUMN_CONSTRAINTS(ColumnConstraints.class), + EFFECT(Effect.class), + ENUM(Enum.class), + FONT(Font.class), + IMAGE(Image.class), + INSETS(Insets.class), + NUMERIC(Double.class), + OBJECT(Object.class), + PROPERTIES(Map.class), + ROW_CONSTRAINTS(RowConstraints.class), + TEXT(String.class), + TRANSFORMS(Transform.class); + + private final Class valueType; + + DisplayHint(Class valueType) { + this.valueType = valueType; + } + + public Class valueType() { + return valueType; + } + } + + /** + * Represents the observable type of property. + */ + public enum ObservableType { + READ_WRITE, + READ_ONLY, + BOUND, + LIST, + SET, + NOT_OBSERVABLE; + + public static > ObservableType of(T prop) { + if (prop instanceof Property p && p.isBound()) { + return ObservableType.BOUND; + } + + if (prop.getClass().getSimpleName().startsWith("ReadOnly")) { + return READ_ONLY; + } + + return READ_WRITE; + } + } + + /** + * Represents the state of an attribute value. + *

  • DEFAULT - indicates that the attribute value is in its default state
  • + *
  • CHANGED - indicates that the attribute value has been modified
  • + *
  • AUTO - indicates that the attribute value is auto-computed or constant
  • + */ + public enum ValueState { + DEFAULT, + CHANGED, + AUTO; + + public static ValueState defaultIf(boolean state) { + return state ? DEFAULT : CHANGED; + } + } +} diff --git a/connector/src/main/java/devtoolsfx/scenegraph/attributes/AttributeCategory.java b/connector/src/main/java/devtoolsfx/scenegraph/attributes/AttributeCategory.java new file mode 100644 index 0000000..81721ca --- /dev/null +++ b/connector/src/main/java/devtoolsfx/scenegraph/attributes/AttributeCategory.java @@ -0,0 +1,42 @@ +package devtoolsfx.scenegraph.attributes; + +import devtoolsfx.event.EventBus; +import devtoolsfx.event.EventSource; + +/** + * The attribute category corresponds to {@link Tracker} implementations; + * each of these is designed to work with one of the categories. + */ +public enum AttributeCategory { + CONTROL, + GRID_PANE, + LABELED, + IMAGE_VIEW, + NODE, + PARENT, + REFLECTIVE, + REGION, + SCENE, + SHAPE, + TEXT, + WINDOW; + + public static Tracker createTracker(AttributeCategory category, + EventBus eventBus, + EventSource eventSource) { + return switch (category) { + case CONTROL -> new ControlTracker(eventBus, eventSource); + case GRID_PANE -> new GridPaneTracker(eventBus, eventSource); + case LABELED -> new LabeledTracker(eventBus, eventSource); + case IMAGE_VIEW -> new ImageViewTracker(eventBus, eventSource); + case NODE -> new NodeTracker(eventBus, eventSource); + case PARENT -> new ParentTracker(eventBus, eventSource); + case REFLECTIVE -> new ReflectiveTracker(eventBus, eventSource); + case REGION -> new RegionTracker(eventBus, eventSource); + case SCENE -> new SceneTracker(eventBus, eventSource); + case SHAPE -> new ShapeTracker(eventBus, eventSource); + case TEXT -> new TextTracker(eventBus, eventSource); + case WINDOW -> new WindowTracker(eventBus, eventSource); + }; + } +} diff --git a/connector/src/main/java/devtoolsfx/scenegraph/attributes/Clip.java b/connector/src/main/java/devtoolsfx/scenegraph/attributes/Clip.java new file mode 100644 index 0000000..87810fb --- /dev/null +++ b/connector/src/main/java/devtoolsfx/scenegraph/attributes/Clip.java @@ -0,0 +1,10 @@ +package devtoolsfx.scenegraph.attributes; + +import javafx.geometry.Bounds; +import javafx.scene.Node; + +/** + * A wrapper to transfer {@link Node#clipProperty()} info. + */ +public record Clip(String className, Bounds bounds) { +} diff --git a/connector/src/main/java/devtoolsfx/scenegraph/attributes/ControlTracker.java b/connector/src/main/java/devtoolsfx/scenegraph/attributes/ControlTracker.java new file mode 100644 index 0000000..17def13 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/scenegraph/attributes/ControlTracker.java @@ -0,0 +1,127 @@ +package devtoolsfx.scenegraph.attributes; + +import devtoolsfx.event.EventBus; +import devtoolsfx.event.EventSource; +import devtoolsfx.scenegraph.attributes.Attribute.DisplayHint; +import devtoolsfx.scenegraph.attributes.Attribute.ObservableType; +import devtoolsfx.scenegraph.attributes.Attribute.ValueState; +import javafx.scene.control.Control; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.List; + +/** + * The {@link Tracker} implementation for the {@link Control} class. + */ +@NullMarked +public final class ControlTracker extends Tracker { + + public static final List SUPPORTED_PROPERTIES = List.of( + "skin", "minWidth", "minHeight", "prefWidth", "prefHeight", "maxWidth", "maxHeight", + "stylesheets", "userAgentStylesheet" + ); + + public ControlTracker(EventBus eventBus, EventSource eventSource) { + super(eventBus, eventSource, AttributeCategory.CONTROL); + } + + @Override + public void reload(String... properties) { + Control control = (Control) getTarget(); + if (control == null) { + return; + } + + reload(property -> read(control, property), SUPPORTED_PROPERTIES, properties); + } + + @Override + public boolean accepts(@Nullable Object target) { + return target instanceof Control; + } + + /////////////////////////////////////////////////////////////////////////// + + private @Nullable Attribute read(Control control, String property) { + return switch (property) { + case "skin" -> new Attribute<>( + "skin", + control.getSkin().getClass().getCanonicalName(), + "skin", + "-fx-skin", + ObservableType.of(control.skinProperty()), + DisplayHint.TEXT, + ValueState.AUTO + ); + case "minWidth" -> new Attribute<>( + "minWidth", + control.getMinWidth(), + "minWidthProperty", + ObservableType.of(control.minWidthProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(control.getMinWidth() == Control.USE_COMPUTED_SIZE) + ); + case "minHeight" -> new Attribute<>( + "minHeight", + control.getMinHeight(), + "minHeightProperty", + ObservableType.of(control.minHeightProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(control.getMinHeight() == Control.USE_COMPUTED_SIZE) + ); + case "prefWidth" -> new Attribute<>( + "prefWidth", + control.getPrefWidth(), + "prefWidthProperty", + ObservableType.of(control.prefWidthProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(control.getPrefWidth() == Control.USE_COMPUTED_SIZE) + ); + case "prefHeight" -> new Attribute<>( + "prefHeight", + control.getPrefHeight(), + "prefHeightProperty", + ObservableType.of(control.prefHeightProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(control.getPrefHeight() == Control.USE_COMPUTED_SIZE) + ); + case "maxWidth" -> new Attribute<>( + "maxWidth", + control.getMaxWidth(), + "maxWidthProperty", + ObservableType.of(control.maxWidthProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(control.getMaxWidth() == Control.USE_COMPUTED_SIZE) + ); + case "maxHeight" -> new Attribute<>( + "maxHeight", + control.getMaxHeight(), + "maxHeightProperty", + ObservableType.of(control.maxHeightProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(control.getMaxHeight() == Control.USE_COMPUTED_SIZE) + ); + case "stylesheets" -> { + String stylesheets = String.join("\n", control.getStylesheets()); + yield new Attribute<>( + "stylesheets", + stylesheets, + "getStylesheets", + ObservableType.LIST, + DisplayHint.TEXT, + ValueState.defaultIf(control.getStylesheets().isEmpty()) + ); + } + case "userAgentStylesheet" -> new Attribute<>( + "userAgentStylesheet", + control.getUserAgentStylesheet(), + "userAgentStylesheet", + ObservableType.NOT_OBSERVABLE, + DisplayHint.TEXT, + ValueState.defaultIf(control.getUserAgentStylesheet() == null) + ); + default -> null; + }; + } +} diff --git a/connector/src/main/java/devtoolsfx/scenegraph/attributes/GridPaneTracker.java b/connector/src/main/java/devtoolsfx/scenegraph/attributes/GridPaneTracker.java new file mode 100644 index 0000000..78fc196 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/scenegraph/attributes/GridPaneTracker.java @@ -0,0 +1,133 @@ +package devtoolsfx.scenegraph.attributes; + +import devtoolsfx.event.EventBus; +import devtoolsfx.event.EventSource; +import devtoolsfx.scenegraph.attributes.Attribute.DisplayHint; +import devtoolsfx.scenegraph.attributes.Attribute.ObservableType; +import devtoolsfx.scenegraph.attributes.Attribute.ValueState; +import javafx.collections.ListChangeListener; +import javafx.geometry.Pos; +import javafx.scene.layout.ColumnConstraints; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.RowConstraints; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.Collections; +import java.util.List; + +/** + * The {@link Tracker} implementation for the {@link GridPane} class. + */ +@NullMarked +public final class GridPaneTracker extends Tracker { + + public static final List SUPPORTED_PROPERTIES = List.of( + "hgap", "vgap", "alignment", "gridLinesVisible", "rowConstrains", "columnConstraints" + ); + + private final ListChangeListener rowListener = c -> reload("rowConstrains"); + private final ListChangeListener colListener = c -> reload("columnConstraints"); + + public GridPaneTracker(EventBus eventBus, EventSource eventSource) { + super(eventBus, eventSource, AttributeCategory.GRID_PANE); + } + + @Override + public void reload(String... properties) { + GridPane gridpane = (GridPane) getTarget(); + if (gridpane == null) { + return; + } + + reload(property -> read(gridpane, property), SUPPORTED_PROPERTIES, properties); + } + + @Override + public boolean accepts(@Nullable Object target) { + return target instanceof GridPane; + } + + @Override + public void setTarget(@Nullable Object target) { + if (getTarget() != null) { + GridPane old = (GridPane) getTarget(); + old.getRowConstraints().removeListener(rowListener); + old.getColumnConstraints().removeListener(colListener); + } + super.setTarget(target); + + GridPane grid = (GridPane) target; + if (grid != null) { + grid.getRowConstraints().addListener(rowListener); + grid.getColumnConstraints().addListener(colListener); + } + } + + @Override + protected void beforeResetTarget(Object target) { + GridPane grid = (GridPane) target; + grid.getRowConstraints().removeListener(rowListener); + grid.getColumnConstraints().removeListener(colListener); + } + + /////////////////////////////////////////////////////////////////////////// + + private @Nullable Attribute read(GridPane gridpane, String property) { + return switch (property) { + case "hgap" -> new Attribute<>( + "hgap", + gridpane.getHgap(), + "hgapProperty", + "-fx-hgap", + ObservableType.of(gridpane.hgapProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(gridpane.getHgap() == 0) + ); + case "vgap" -> new Attribute<>( + "vgap", + gridpane.getVgap(), + "vgapProperty", + "-fx-vgap", + ObservableType.of(gridpane.vgapProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(gridpane.getVgap() == 0) + ); + case "alignment" -> new Attribute<>( + "alignment", + gridpane.getAlignment(), + "alignmentProperty", + "-fx-alignment", + ObservableType.of(gridpane.alignmentProperty()), + DisplayHint.ENUM, + ValueState.defaultIf(gridpane.getAlignment() == null || gridpane.getAlignment() == Pos.TOP_LEFT) + ); + case "gridLinesVisible" -> new Attribute<>( + "gridLinesVisible", + gridpane.isGridLinesVisible(), + "gridLinesVisibleProperty", + "-fx-grid-lines-visible", + ObservableType.of(gridpane.gridLinesVisibleProperty()), + DisplayHint.BOOLEAN, + ValueState.defaultIf(!gridpane.isGridLinesVisible()) + ); + case "rowConstrains" -> new Attribute<>( + "rowConstrains", + Collections.unmodifiableList(gridpane.getRowConstraints()), + "getRowConstraints", + ObservableType.LIST, + DisplayHint.ROW_CONSTRAINTS, + ValueState.defaultIf(gridpane.getRowConstraints().isEmpty()) + ); + case "columnConstraints" -> new Attribute<>( + "columnConstraints", + Collections.unmodifiableList(gridpane.getColumnConstraints()), + "getColumnConstraints", + ObservableType.LIST, + DisplayHint.COLUMN_CONSTRAINTS, + ValueState.defaultIf(gridpane.getColumnConstraints().isEmpty()) + ); + default -> null; + }; + } +} diff --git a/connector/src/main/java/devtoolsfx/scenegraph/attributes/ImageViewTracker.java b/connector/src/main/java/devtoolsfx/scenegraph/attributes/ImageViewTracker.java new file mode 100644 index 0000000..a0f3818 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/scenegraph/attributes/ImageViewTracker.java @@ -0,0 +1,101 @@ +package devtoolsfx.scenegraph.attributes; + +import devtoolsfx.event.EventBus; +import devtoolsfx.event.EventSource; +import devtoolsfx.scenegraph.attributes.Attribute.DisplayHint; +import devtoolsfx.scenegraph.attributes.Attribute.ObservableType; +import devtoolsfx.scenegraph.attributes.Attribute.ValueState; +import javafx.scene.image.ImageView; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.List; +import java.util.Objects; + +/** + * The {@link Tracker} implementation for the {@link ImageView} class. + */ +@NullMarked +public final class ImageViewTracker extends Tracker { + + public static final List SUPPORTED_PROPERTIES = List.of( + "fitWidth", "fitHeight", "image", "preserveRatio", "smooth" + ); + + public ImageViewTracker(EventBus eventBus, EventSource eventSource) { + super(eventBus, eventSource, AttributeCategory.IMAGE_VIEW); + } + + @Override + public void reload(String... properties) { + ImageView imageView = (ImageView) getTarget(); + if (imageView == null) { + return; + } + + reload(property -> read(imageView, property), SUPPORTED_PROPERTIES, properties); + } + + @Override + public boolean accepts(@Nullable Object target) { + return target instanceof ImageView; + } + + /////////////////////////////////////////////////////////////////////////// + + private @Nullable Attribute read(ImageView imageView, String property) { + return switch (property) { + case "fitWidth" -> new Attribute<>( + "fitWidth", + imageView.getFitWidth(), + "fitWidthProperty", + "-fx-fit-width", + ObservableType.of(imageView.fitWidthProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(imageView.getFitWidth() == 0) + ); + case "fitHeight" -> new Attribute<>( + "fitHeight", + imageView.getFitHeight(), + "fitHeightProperty", + "-fx-fit-height", + ObservableType.of(imageView.fitHeightProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(imageView.getFitWidth() == 0) + ); + case "image" -> { + var image = imageView.getImage(); + yield new Attribute<>( + "image", + image != null + ? Objects.requireNonNullElse(image.getUrl(), String.valueOf(image)) + : null, + "imageProperty", + "-fx-image", + ObservableType.of(imageView.imageProperty()), + DisplayHint.TEXT, + ValueState.defaultIf(image == null) + ); + } + case "preserveRatio" -> new Attribute<>( + "preserveRatio", + imageView.isPreserveRatio(), + "preserveRatioProperty", + "-fx-preserve-ratio", + ObservableType.of(imageView.preserveRatioProperty()), + DisplayHint.BOOLEAN, + ValueState.defaultIf(!imageView.isPreserveRatio()) + ); + case "smooth" -> new Attribute<>( + "smooth", + imageView.isSmooth(), + "smoothProperty", + "-fx-smooth", + ObservableType.of(imageView.smoothProperty()), + DisplayHint.BOOLEAN, + ValueState.AUTO // platform-dependent, no API + ); + default -> null; + }; + } +} diff --git a/connector/src/main/java/devtoolsfx/scenegraph/attributes/LabeledTracker.java b/connector/src/main/java/devtoolsfx/scenegraph/attributes/LabeledTracker.java new file mode 100644 index 0000000..d462e84 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/scenegraph/attributes/LabeledTracker.java @@ -0,0 +1,178 @@ +package devtoolsfx.scenegraph.attributes; + +import devtoolsfx.event.EventBus; +import devtoolsfx.event.EventSource; +import devtoolsfx.scenegraph.attributes.Attribute.DisplayHint; +import devtoolsfx.scenegraph.attributes.Attribute.ObservableType; +import devtoolsfx.scenegraph.attributes.Attribute.ValueState; +import javafx.geometry.Insets; +import javafx.geometry.Pos; +import javafx.scene.control.ContentDisplay; +import javafx.scene.control.Labeled; +import javafx.scene.control.OverrunStyle; +import javafx.scene.paint.Color; +import javafx.scene.text.TextAlignment; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.List; + +/** + * The {@link Tracker} implementation for the {@link Labeled} class. + */ +@NullMarked +public final class LabeledTracker extends Tracker { + + public static final List SUPPORTED_PROPERTIES = List.of( + "text", "font", "textFill", "graphic", "graphicTextGap", "labelPadding", + "contentDisplay", "alignment", "textAlignment", + "textOverrun", "wrapText", "underline", "ellipsisString" + ); // label padding, text fill, ellipsis-string + + public LabeledTracker(EventBus eventBus, EventSource eventSource) { + super(eventBus, eventSource, AttributeCategory.LABELED); + } + + @Override + public void reload(String... properties) { + Labeled labeled = (Labeled) getTarget(); + if (labeled == null) { + return; + } + + reload(property -> read(labeled, property), SUPPORTED_PROPERTIES, properties); + } + + @Override + public boolean accepts(@Nullable Object target) { + return target instanceof Labeled; + } + + /////////////////////////////////////////////////////////////////////////// + + private @Nullable Attribute read(Labeled label, String property) { + return switch (property) { + case "text" -> new Attribute<>( + "text", + label.getText(), + "textProperty", + ObservableType.of(label.textProperty()), + DisplayHint.TEXT, + ValueState.defaultIf(label.getText() == null || label.getText().isEmpty()) + ); + case "font" -> new Attribute<>( + "font", + label.getFont(), + "fontProperty", + "-fx-font", + ObservableType.of(label.fontProperty()), + DisplayHint.FONT, + ValueState.defaultIf(label.getFont() == null) + ); + case "textFill" -> new Attribute<>( + "textFill", + label.getTextFill(), + "textFillProperty", + "-fx-text-fill", + ObservableType.of(label.textFillProperty()), + DisplayHint.COLOR, + ValueState.defaultIf(Color.BLACK.equals(label.getTextFill())) + ); + case "graphic" -> new Attribute<>( + "graphic", + label.getGraphic() != null ? label.getGraphic().getClass().getSimpleName() : null, + "graphicProperty", + "-fx-graphic", + ObservableType.of(label.graphicProperty()), + DisplayHint.TEXT, + ValueState.defaultIf(label.getGraphic() == null) + ); + case "graphicTextGap" -> new Attribute<>( + "graphicTextGap", + label.getGraphicTextGap(), + "graphicTextGapProperty", + "-fx-graphic-text-gap", + ObservableType.of(label.graphicTextGapProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(label.getGraphicTextGap() == 4) + ); + case "labelPadding" -> new Attribute<>( + "labelPadding", + label.getLabelPadding(), + "labelPaddingProperty", + "-fx-label-padding", + ObservableType.of(label.labelPaddingProperty()), + DisplayHint.INSETS, + ValueState.defaultIf(label.getLabelPadding() == null || Insets.EMPTY.equals(label.getLabelPadding())) + ); + case "contentDisplay" -> new Attribute<>( + "contentDisplay", + label.getContentDisplay(), + "contentDisplayProperty", + "-fx-content-display", + ObservableType.of(label.contentDisplayProperty()), + DisplayHint.ENUM, + ValueState.defaultIf(label.getContentDisplay() == null || label.getContentDisplay() == ContentDisplay.LEFT), + List.of(ContentDisplay.values()) + ); + case "alignment" -> new Attribute<>( + "alignment", + label.getAlignment(), + "alignmentProperty", + "-fx-alignment", + ObservableType.of(label.alignmentProperty()), + DisplayHint.ENUM, + ValueState.defaultIf(label.getAlignment() == null || label.getAlignment() == Pos.CENTER_LEFT), + List.of(Pos.values()) + ); + case "textAlignment" -> new Attribute<>( + "textAlignment", + label.getTextAlignment(), + "textAlignmentProperty", + "-fx-text-alignment", + ObservableType.of(label.textAlignmentProperty()), + DisplayHint.ENUM, + ValueState.defaultIf(label.getTextAlignment() == null || label.getTextAlignment() == TextAlignment.LEFT), + List.of(TextAlignment.values()) + ); + case "textOverrun" -> new Attribute<>( + "textOverrun", + label.getTextOverrun(), + "textOverrunProperty", + "-fx-text-overrun", + ObservableType.of(label.textOverrunProperty()), + DisplayHint.ENUM, + ValueState.defaultIf(label.getTextOverrun() == null || label.getTextOverrun() == OverrunStyle.ELLIPSIS), + List.of(OverrunStyle.values()) + ); + case "wrapText" -> new Attribute<>( + "wrapText", + label.isWrapText(), + "wrapTextProperty", + "-fx-wrap-text", + ObservableType.of(label.wrapTextProperty()), + DisplayHint.BOOLEAN, + ValueState.defaultIf(!label.isWrapText()) + ); + case "underline" -> new Attribute<>( + "underline", + label.isUnderline(), + "underlineProperty", + "-fx-underline", + ObservableType.of(label.underlineProperty()), + DisplayHint.BOOLEAN, + ValueState.defaultIf(!label.isUnderline()) + ); + case "ellipsisString" -> new Attribute<>( + "ellipsisString", + label.getEllipsisString(), + "ellipsisStringProperty", + "-fx-ellipsis-string", + ObservableType.of(label.ellipsisStringProperty()), + DisplayHint.TEXT, + ValueState.defaultIf("...".equals(label.getEllipsisString())) + ); + default -> null; + }; + } +} diff --git a/connector/src/main/java/devtoolsfx/scenegraph/attributes/NodeTracker.java b/connector/src/main/java/devtoolsfx/scenegraph/attributes/NodeTracker.java new file mode 100644 index 0000000..c79322c --- /dev/null +++ b/connector/src/main/java/devtoolsfx/scenegraph/attributes/NodeTracker.java @@ -0,0 +1,500 @@ +package devtoolsfx.scenegraph.attributes; + +import devtoolsfx.event.EventBus; +import devtoolsfx.event.EventSource; +import devtoolsfx.scenegraph.attributes.Attribute.DisplayHint; +import devtoolsfx.scenegraph.attributes.Attribute.ValueState; +import javafx.collections.ListChangeListener; +import javafx.css.PseudoClass; +import javafx.geometry.Insets; +import javafx.geometry.Orientation; +import javafx.scene.Node; +import javafx.scene.SubScene; +import javafx.scene.effect.BlendMode; +import javafx.scene.transform.Transform; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.*; +import java.util.stream.Collectors; + +import static devtoolsfx.scenegraph.attributes.Attribute.ObservableType; + +/** + * The {@link Tracker} implementation for the {@link Node} class. + */ +@NullMarked +public final class NodeTracker extends Tracker { + + public static final List SUPPORTED_PROPERTIES = List.of( + "className", "pseudoClass", "styleClass", "stylesheets", + "managed", "visible", "focusVisible", "focusWithin", "resizable", + "layoutBounds", "boundsInParent", "baselineOffset", "layoutConstraints", + "opacity", "viewOrder", "blendMode", "cursor", "effect", "clip", "rotate", "transforms", + "layoutX", "layoutY", "scaleX", "scaleY", "scaleZ", "translateX", "translateY", "translateZ", + "contentBias", "minWidth", "minHeight", "prefWidth", "prefHeight", "maxWidth", "maxHeight", + "userAgentStylesheet", "userData" + ); + public static final List SUB_SCENE_PROPERTIES = List.of("userAgentStylesheet"); + + private final ListChangeListener transformListener = c -> reload("transforms"); + + public NodeTracker(EventBus eventBus, EventSource eventSource) { + super(eventBus, eventSource, AttributeCategory.NODE); + } + + @Override + public void reload(String... properties) { + Node node = (Node) getTarget(); + if (node == null) { + return; + } + + var supportedProperties = new ArrayList<>(SUPPORTED_PROPERTIES); + if (!(node instanceof SubScene)) { + supportedProperties.removeAll(SUB_SCENE_PROPERTIES); + } + + reload(property -> read(node, property), supportedProperties, properties); + } + + @Override + public void setTarget(@Nullable Object target) { + Node old = (Node) getTarget(); + if (old != null) { + old.getTransforms().removeListener(transformListener); + } + + super.setTarget(target); + + if (target != null) { + ((Node) target).getTransforms().addListener(transformListener); + } + } + + @Override + public boolean accepts(@Nullable Object target) { + return target instanceof Node; + } + + @Override + protected void beforeResetTarget(Object target) { + ((Node) target).getTransforms().removeListener(transformListener); + } + + /////////////////////////////////////////////////////////////////////////// + + private @Nullable Attribute read(Node node, String property) { + var dimensions = Dimensions.of(node); + + return switch (property) { + case "className" -> new Attribute<>( + "className", + node.getClass().getName(), + null, + ObservableType.NOT_OBSERVABLE, + DisplayHint.TEXT, + ValueState.AUTO + ); + case "pseudoClass" -> { + String pseudoClass = node.getPseudoClassStates().stream() + .map(PseudoClass::getPseudoClassName) + .collect(Collectors.joining(" ")); + yield new Attribute<>( + "pseudoClass", + pseudoClass, + "getPseudoClassStates", + ObservableType.SET, + DisplayHint.TEXT, + ValueState.defaultIf(node.getPseudoClassStates().isEmpty()) + ); + } + case "styleClass" -> { + String styleClass = String.join(" ", node.getStyleClass()); + yield new Attribute<>( + "styleClass", + styleClass, + "getStyleClass", + ObservableType.LIST, + DisplayHint.TEXT, + ValueState.defaultIf(node.getStyleClass().isEmpty()) + ); + } + case "visible" -> new Attribute<>( + "visible", + node.isVisible(), + "visibleProperty", + "visibility", + ObservableType.of(node.visibleProperty()), + DisplayHint.BOOLEAN, + ValueState.defaultIf(node.isVisible()) + ); + case "managed" -> new Attribute<>( + "managed", + node.isManaged(), + "managedProperty", + "-fx-managed", + ObservableType.of(node.managedProperty()), + DisplayHint.BOOLEAN, + ValueState.defaultIf(node.isManaged()), + List.of() + ); + case "focusVisible" -> new Attribute<>( + "focusVisible", + node.isFocusVisible(), + "focusVisibleProperty", + ObservableType.READ_ONLY, + DisplayHint.BOOLEAN, + ValueState.defaultIf(!node.isFocusVisible()) + ); + case "focusWithin" -> new Attribute<>( + "focusWithin", + node.isFocusWithin(), + "focusWithinProperty", + ObservableType.READ_ONLY, + DisplayHint.BOOLEAN, + ValueState.defaultIf(!node.isFocusWithin()) + ); + case "resizable" -> new Attribute<>( + "resizable", + node.isResizable(), + null, + ObservableType.NOT_OBSERVABLE, + DisplayHint.BOOLEAN, + ValueState.AUTO + ); + case "layoutBounds" -> new Attribute<>( + "layoutBounds", + node.getLayoutBounds(), + "layoutBoundsProperty", + ObservableType.READ_ONLY, + DisplayHint.BOUNDS, + ValueState.AUTO + ); + case "boundsInParent" -> new Attribute<>( + "boundsInParent", + node.getBoundsInParent(), + "boundsInParentProperty", + ObservableType.READ_ONLY, + DisplayHint.BOUNDS, + ValueState.AUTO + ); + case "baselineOffset" -> new Attribute<>( + "baselineOffset", + node.getBaselineOffset(), + null, + ObservableType.NOT_OBSERVABLE, + DisplayHint.NUMERIC, + ValueState.AUTO + ); + case "layoutConstraints" -> { + Map properties = getLayoutConstraints(node); + yield new Attribute<>( + "layoutConstraints", + properties, + null, + ObservableType.NOT_OBSERVABLE, + DisplayHint.PROPERTIES, + ValueState.AUTO + ); + } + case "opacity" -> new Attribute<>( + "opacity", + node.getOpacity(), + "opacityProperty", + "-fx-opacity", + ObservableType.of(node.opacityProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(node.getOpacity() == 1.0), + List.of(0.0, 1.0) + ); + case "viewOrder" -> new Attribute<>( + "viewOrder", + node.getViewOrder(), + "viewOrderProperty", + "-fx-view-order", + ObservableType.of(node.viewOrderProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(node.getViewOrder() == 0) + ); + case "blendMode" -> new Attribute<>( + "blendMode", + node.getBlendMode(), + "blendModeProperty", + "-fx-blend-mode", + ObservableType.of(node.blendModeProperty()), + DisplayHint.ENUM, + ValueState.defaultIf(node.getBlendMode() == null), + List.of(BlendMode.values()) + ); + case "cursor" -> new Attribute<>( + "cursor", + node.getCursor() != null ? String.valueOf(node.getCursor()) : null, + "cursorProperty", + "-fx-cursor", + ObservableType.of(node.cursorProperty()), + DisplayHint.TEXT, + ValueState.defaultIf(node.getCursor() == null) + ); + case "effect" -> new Attribute<>( + "effect", + node.getEffect(), + "effectProperty", + "-fx-effect", + ObservableType.of(node.effectProperty()), + DisplayHint.EFFECT, + ValueState.defaultIf(node.getEffect() == null) + ); + case "clip" -> { + var clip = node.getClip(); + yield new Attribute<>( + "clip", + clip != null ? new Clip(clip.getClass().getSimpleName(), clip.getBoundsInLocal()) : null, + "clipProperty", + ObservableType.of(node.clipProperty()), + DisplayHint.CLIP, + ValueState.defaultIf(node.getClip() == null) + ); + } + case "rotate" -> new Attribute<>( + "rotate", + node.getRotate(), + "rotateProperty", + "-fx-rotate", + ObservableType.of(node.rotateProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(node.getRotate() == 0) + ); + case "transforms" -> new Attribute<>( + "transforms", + Collections.unmodifiableList(node.getTransforms()), + "getTransforms", + ObservableType.LIST, + DisplayHint.TRANSFORMS, + ValueState.defaultIf(node.getTransforms().isEmpty()) + ); + case "layoutX" -> new Attribute<>( + "layoutX", + node.getLayoutX(), + "layoutXProperty", + ObservableType.of(node.layoutXProperty()), + DisplayHint.NUMERIC, + ValueState.AUTO + ); + case "layoutY" -> new Attribute<>( + "layoutY", + node.getLayoutY(), + "layoutYProperty", + ObservableType.of(node.layoutYProperty()), + DisplayHint.NUMERIC, + ValueState.AUTO + ); + case "scaleX" -> new Attribute<>( + "scaleX", + node.getScaleX(), + "scaleXProperty", + "-fx-scale-x", + ObservableType.of(node.scaleXProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(node.getScaleX() == 1.0) + ); + case "scaleY" -> new Attribute<>( + "scaleY", + node.getScaleY(), + "scaleYProperty", + "-fx-scale-y", + ObservableType.of(node.scaleYProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(node.getScaleY() == 1.0) + ); + case "scaleZ" -> new Attribute<>( + "scaleZ", + node.getScaleZ(), + "scaleZProperty", + "-fx-scale-z", + ObservableType.of(node.scaleZProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(node.getScaleZ() == 1.0) + ); + case "translateX" -> new Attribute<>( + "translateX", + node.getTranslateX(), + "translateXProperty", + "-fx-translate-x", + ObservableType.of(node.translateXProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(node.getTranslateX() == 0) + ); + case "translateY" -> new Attribute<>( + "translateY", + node.getTranslateY(), + "translateYProperty", + "-fx-translate-y", + ObservableType.of(node.translateYProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(node.getTranslateY() == 0) + ); + case "translateZ" -> new Attribute<>( + "translateZ", + node.getTranslateZ(), + "translateZProperty", + "-fx-translate-z", + ObservableType.of(node.translateZProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(node.getTranslateZ() == 0) + ); + case "contentBias" -> new Attribute<>( + "contentBias", + node.getContentBias(), + null, + null, + ObservableType.NOT_OBSERVABLE, + DisplayHint.ENUM, + ValueState.defaultIf(node.getContentBias() == null), + List.of(Orientation.values()) + ); + case "minWidth" -> new Attribute<>( + "minWidth", + dimensions.minWidth(), + null, + ObservableType.NOT_OBSERVABLE, + DisplayHint.NUMERIC, + ValueState.AUTO + ); + case "minHeight" -> new Attribute<>( + "minHeight", + dimensions.minHeight(), + null, + ObservableType.NOT_OBSERVABLE, + DisplayHint.NUMERIC, + ValueState.AUTO + ); + case "prefWidth" -> new Attribute<>( + "prefWidth", + dimensions.prefWidth(), + null, + ObservableType.NOT_OBSERVABLE, + DisplayHint.NUMERIC, + ValueState.AUTO + ); + case "prefHeight" -> new Attribute<>( + "prefHeight", + dimensions.prefHeight(), + null, + ObservableType.NOT_OBSERVABLE, + DisplayHint.NUMERIC, + ValueState.AUTO + ); + case "maxWidth" -> new Attribute<>( + "maxWidth", + dimensions.maxWidth(), + null, + ObservableType.NOT_OBSERVABLE, + DisplayHint.NUMERIC, + ValueState.AUTO + ); + case "maxHeight" -> new Attribute<>( + "maxHeight", + dimensions.maxHeight(), + null, + ObservableType.NOT_OBSERVABLE, + DisplayHint.NUMERIC, + ValueState.AUTO + ); + case "userData" -> new Attribute<>( + "userData", + String.valueOf(node.getUserData()), + "userData", + ObservableType.NOT_OBSERVABLE, + DisplayHint.TEXT, + ValueState.defaultIf(node.getUserData() == null) + ); + // SubScene + case "stylesheets" -> { + if (node instanceof SubScene subScene) { + yield new Attribute<>( + "userAgentStylesheet", + subScene.getUserAgentStylesheet(), + "userAgentStylesheet", + ObservableType.of(subScene.userAgentStylesheetProperty()), + DisplayHint.TEXT, + ValueState.defaultIf(subScene.getUserAgentStylesheet() == null) + ); + } else { + yield null; + } + } + default -> null; + }; + } + + /** + * Attempts to obtain layout constraints from the full node properties map. + * See {@link Node#getProperties()} for more details. + */ + private Map getLayoutConstraints(Node node) { + if (!node.hasProperties()) { + return Map.of(); + } + + Map properties = new TreeMap<>(); + for (var entry : node.getProperties().entrySet()) { + if (entry.getKey() instanceof String key && (key.contains("pane-") || key.contains("box-"))) { + var value = entry.getValue(); + if (key.endsWith("margin")) { + properties.put(key, insetsToString((Insets) value)); + } else { + properties.put(key, String.valueOf(value)); + } + } + } + return properties; + } + + private String insetsToString(Insets insets) { + return insets.getTop() + " " + insets.getRight() + " " + insets.getBottom() + " " + insets.getLeft(); + } + + /** + * Abstracts the size calculation logic based on the value of {@link Node#getContentBias()}. + */ + private record Dimensions(double minWidth, + double minHeight, + double prefWidth, + double prefHeight, + double maxWidth, + double maxHeight) { + + public static Dimensions of(Node node) { + double minWidth, minHeight, prefWidth, prefHeight, maxWidth, maxHeight; + switch (node.getContentBias()) { + case HORIZONTAL -> { + minWidth = node.minWidth(-1); + minHeight = node.minHeight(minWidth); + prefWidth = node.prefWidth(-1); + prefHeight = node.prefHeight(prefWidth); + maxWidth = node.maxWidth(-1); + maxHeight = node.maxHeight(maxWidth); + } + case VERTICAL -> { + minHeight = node.minHeight(-1); + minWidth = node.minWidth(minHeight); + prefHeight = node.prefHeight(-1); + prefWidth = node.prefWidth(prefHeight); + maxHeight = node.maxHeight(-1); + maxWidth = node.maxWidth(maxHeight); + } + case null -> { + minWidth = node.minWidth(-1); + minHeight = node.minHeight(-1); + prefWidth = node.prefWidth(-1); + prefHeight = node.prefHeight(-1); + maxWidth = node.maxWidth(-1); + maxHeight = node.maxHeight(-1); + } + } + + return new Dimensions(minWidth, minHeight, prefWidth, prefHeight, maxWidth, maxHeight); + } + } +} diff --git a/connector/src/main/java/devtoolsfx/scenegraph/attributes/ParentTracker.java b/connector/src/main/java/devtoolsfx/scenegraph/attributes/ParentTracker.java new file mode 100644 index 0000000..ebf8e29 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/scenegraph/attributes/ParentTracker.java @@ -0,0 +1,86 @@ +package devtoolsfx.scenegraph.attributes; + +import devtoolsfx.event.EventBus; +import devtoolsfx.event.EventSource; +import devtoolsfx.scenegraph.attributes.Attribute.DisplayHint; +import devtoolsfx.scenegraph.attributes.Attribute.ObservableType; +import devtoolsfx.scenegraph.attributes.Attribute.ValueState; +import devtoolsfx.util.SceneUtils; +import javafx.scene.Parent; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.List; + +/** + * The {@link Tracker} implementation for the {@link Parent} class. + */ +@NullMarked +public final class ParentTracker extends Tracker { + + public static final List SUPPORTED_PROPERTIES = List.of( + "stylesheets", "needsLayout", "childCount", "branchCount" + ); + + public ParentTracker(EventBus eventBus, EventSource eventSource) { + super(eventBus, eventSource, AttributeCategory.PARENT); + } + + @Override + public void reload(String... properties) { + Parent parent = (Parent) getTarget(); + if (parent == null) { + return; + } + + reload(property -> read(parent, property), SUPPORTED_PROPERTIES, properties); + } + + @Override + public boolean accepts(@Nullable Object target) { + return target instanceof Parent; + } + + /////////////////////////////////////////////////////////////////////////// + + private @Nullable Attribute read(Parent parent, String property) { + return switch (property) { + case "stylesheets" -> { + String stylesheets = String.join("\n", parent.getStylesheets()); + yield new Attribute<>( + "stylesheets", + stylesheets, + "getStylesheets", + ObservableType.LIST, + DisplayHint.TEXT, + ValueState.AUTO + ); + } + case "needsLayout" -> new Attribute<>( + "needsLayout", + parent.isNeedsLayout(), + "needsLayoutProperty", + ObservableType.READ_ONLY, + DisplayHint.BOOLEAN, + ValueState.AUTO + ); + case "childCount" -> new Attribute<>( + "childCount", + SceneUtils.countChildren(parent), + null, + ObservableType.NOT_OBSERVABLE, + DisplayHint.NUMERIC, + ValueState.AUTO + ); + case "branchCount" -> new Attribute<>( + "branchCount", + SceneUtils.countNodesInBranch(parent), + null, + ObservableType.NOT_OBSERVABLE, + DisplayHint.NUMERIC, + ValueState.AUTO + ); + default -> null; + }; + } +} diff --git a/connector/src/main/java/devtoolsfx/scenegraph/attributes/PropertyListener.java b/connector/src/main/java/devtoolsfx/scenegraph/attributes/PropertyListener.java new file mode 100644 index 0000000..2900ee5 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/scenegraph/attributes/PropertyListener.java @@ -0,0 +1,82 @@ +package devtoolsfx.scenegraph.attributes; + +import javafx.beans.InvalidationListener; +import javafx.beans.value.ObservableValue; +import org.jspecify.annotations.NullMarked; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +/** + * The property listener accepts the target node, reflectively scans all its + * methods that return observable properties (which must end with the 'Property' suffix), + * and listens for changes to all found properties. + *

    + * When a change is detected, the {@link #onPropertyChanged} method is called. To use this class, + * the client should implement this abstract method and include the desired logic within it. + */ +@NullMarked +public abstract class PropertyListener { + + public static final String PROPERTY_SUFFIX = "Property"; + + private final Map, String> properties = new HashMap<>(); + private final InvalidationListener propertyListener = obs -> + onPropertyChanged(properties.get((ObservableValue) obs), (ObservableValue) obs); + + public PropertyListener() { + // pass + } + + /** + * This method is called when an observable property change is detected. + */ + protected abstract void onPropertyChanged(String propertyName, ObservableValue obs); + + /** + * Returns the map of observable properties that have been found and are being tracked. + */ + public Map, String> getProperties() { + return Collections.unmodifiableMap(properties); + } + + /** + * Sets the target to be tracked for property changes. + */ + public void use(Object target) throws InvocationTargetException, IllegalAccessException { + properties.clear(); + + // using reflection, locate all properties and their corresponding property references + for (Method method : target.getClass().getMethods()) { + if (!method.getName().endsWith(PROPERTY_SUFFIX)) { + continue; + } + + Class returnType = method.getReturnType(); + if (ObservableValue.class.isAssignableFrom(returnType)) { + method.setAccessible(true); + ObservableValue property = (ObservableValue) method.invoke(target); + + String propertyName = method.getName().substring(0, method.getName().lastIndexOf(PROPERTY_SUFFIX)); + properties.put(property, propertyName); + } + } + + for (ObservableValue obs : properties.keySet()) { + obs.addListener(propertyListener); + } + } + + /** + * Stops the listener from tracking property changes. + */ + public void release() { + for (ObservableValue obs : properties.keySet()) { + obs.removeListener(propertyListener); + } + properties.clear(); + } +} diff --git a/connector/src/main/java/devtoolsfx/scenegraph/attributes/ReflectiveTracker.java b/connector/src/main/java/devtoolsfx/scenegraph/attributes/ReflectiveTracker.java new file mode 100644 index 0000000..e57f43d --- /dev/null +++ b/connector/src/main/java/devtoolsfx/scenegraph/attributes/ReflectiveTracker.java @@ -0,0 +1,206 @@ +package devtoolsfx.scenegraph.attributes; + +import devtoolsfx.event.EventBus; +import devtoolsfx.event.EventSource; +import devtoolsfx.scenegraph.attributes.Attribute.DisplayHint; +import devtoolsfx.scenegraph.attributes.Attribute.ObservableType; +import devtoolsfx.scenegraph.attributes.Attribute.ValueState; +import javafx.beans.value.ObservableValue; +import javafx.beans.value.WritableValue; +import javafx.css.CssMetaData; +import javafx.css.StyleableProperty; +import javafx.scene.Node; +import javafx.scene.control.Tooltip; +import javafx.scene.image.Image; +import javafx.scene.layout.Background; +import javafx.scene.layout.Border; +import javafx.scene.paint.Color; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.TreeMap; + +/** + * The {@link Tracker} implementation that attempts to reflectively obtain all + * the properties of the target node. + */ +@NullMarked +public final class ReflectiveTracker extends Tracker { + + private final Map> orderedProperties = new TreeMap<>(); + private final Map, String> styleableProperties = new HashMap<>(); + + public ReflectiveTracker(EventBus eventBus, EventSource eventSource) { + super(eventBus, eventSource, AttributeCategory.REFLECTIVE); + } + + @Override + public void reload(String... properties) { + Object node = getTarget(); + if (node == null) { + return; + } + + reload(this::read, orderedProperties.keySet(), properties); + } + + @Override + public boolean accepts(@Nullable Object target) { + return target != null; + } + + @Override + protected void beforeSetTarget(Object target) { + scan(target); + } + + @Override + protected void beforeResetTarget(Object target) { + orderedProperties.clear(); + styleableProperties.clear(); + } + + /////////////////////////////////////////////////////////////////////////// + + @SuppressWarnings({"rawtypes", "unchecked", "ConstantValue"}) + private void scan(Object target) { + orderedProperties.clear(); + for (Map.Entry, String> entry : propertyListener.getProperties().entrySet()) { + // should never happen, but double check there no null values in observed properties + if (entry.getKey() != null && entry.getValue() != null) { + orderedProperties.put(entry.getValue(), entry.getKey()); + } + } + + styleableProperties.clear(); + if (target instanceof Node node) { + for (CssMetaData meta : node.getCssMetaData()) { + StyleableProperty styleable = meta.getStyleableProperty(node); + String name = meta.getProperty(); + if (styleable != null && name != null) { + styleableProperties.put(styleable, name); + } + } + } + } + + private Attribute read(String property) { + ObservableValue obs = orderedProperties.get(property); + Object value = obs.getValue(); // can be null and when it's null we won't get any DisplayHint... + + ObservableType obsType = ObservableType.of(obs); + String field = property + PropertyListener.PROPERTY_SUFFIX; + String styleable = obs instanceof WritableValue writable ? styleableProperties.get(writable) : null; + + // ValueState.NOT_APPLICABLE everywhere, because it's not possible to guess + // whether the observable property has default value or not + return switch (value) { + // primitive properties + case Boolean bool -> new Attribute<>( + property, + bool, + field, + styleable, + obsType, + DisplayHint.BOOLEAN, + ValueState.AUTO + ); + case Integer number -> new Attribute<>( + property, + number, + field, + styleable, + obsType, + DisplayHint.NUMERIC, + ValueState.AUTO + ); + case Double number -> new Attribute<>( + property, + number, + field, + styleable, + obsType, + DisplayHint.NUMERIC, + ValueState.AUTO + ); + case String str -> new Attribute<>( + property, + str, + field, + styleable, + obsType, + DisplayHint.TEXT, + ValueState.AUTO + ); + // object properties + case Enum enumeration -> new Attribute<>( + property, + enumeration, + field, + styleable, + obsType, + DisplayHint.ENUM, + ValueState.AUTO, + List.of(enumeration.getClass().getEnumConstants()) + ); + case Color color -> new Attribute<>( + property, + color, + field, + styleable, + obsType, + DisplayHint.COLOR, + ValueState.AUTO + ); + case Image image -> new Attribute<>( + property, + image, + field, + styleable, + obsType, + DisplayHint.IMAGE, + ValueState.AUTO + ); + case Background background -> new Attribute<>( + property, + background, + field, + styleable, + obsType, + DisplayHint.BACKGROUND, + ValueState.AUTO + ); + case Border border -> new Attribute<>( + property, + border, + field, + styleable, + obsType, + DisplayHint.BORDER, + ValueState.AUTO + ); + case Tooltip tooltip -> new Attribute<>( + property, + tooltip.getText(), + field, + styleable, + obsType, + DisplayHint.TEXT, + ValueState.AUTO + ); + // the remainder is ObjectProperty + case null, default -> new Attribute<>( + property, + String.valueOf(value), + field, + styleable, + obsType, + DisplayHint.OBJECT, + ValueState.AUTO + ); + }; + } +} diff --git a/connector/src/main/java/devtoolsfx/scenegraph/attributes/RegionTracker.java b/connector/src/main/java/devtoolsfx/scenegraph/attributes/RegionTracker.java new file mode 100644 index 0000000..aba5725 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/scenegraph/attributes/RegionTracker.java @@ -0,0 +1,168 @@ +package devtoolsfx.scenegraph.attributes; + +import devtoolsfx.event.EventBus; +import devtoolsfx.event.EventSource; +import devtoolsfx.scenegraph.attributes.Attribute.DisplayHint; +import devtoolsfx.scenegraph.attributes.Attribute.ObservableType; +import devtoolsfx.scenegraph.attributes.Attribute.ValueState; +import javafx.geometry.Insets; +import javafx.scene.control.Control; +import javafx.scene.layout.Region; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.List; + +/** + * The {@link Tracker} implementation for the {@link Region} class. + */ +@NullMarked +public final class RegionTracker extends Tracker { + + public static final List SUPPORTED_PROPERTIES = List.of( + "padding", "insets", "snapToPixel", "shape", "scaleShape", "centerShape", + "userAgentStylesheet", "minWidth", "minHeight", "prefWidth", "prefHeight", "maxWidth", "maxHeight" + ); + + public RegionTracker(EventBus eventBus, EventSource eventSource) { + super(eventBus, eventSource, AttributeCategory.REGION); + } + + @Override + public void reload(String... properties) { + Region region = (Region) getTarget(); + if (region == null) { + return; + } + + reload(property -> read(region, property), SUPPORTED_PROPERTIES, properties); + } + + @Override + public boolean accepts(@Nullable Object target) { + return target instanceof Region; + } + + /////////////////////////////////////////////////////////////////////////// + + private @Nullable Attribute read(Region region, String property) { + return switch (property) { + case "insets" -> new Attribute<>( + "insets", + region.getInsets(), + "insetsProperty", + ObservableType.READ_ONLY, + DisplayHint.INSETS, + ValueState.defaultIf(region.getInsets() == null || Insets.EMPTY.equals(region.getInsets())) + ); + case "padding" -> new Attribute<>( + "padding", + region.getPadding(), + "paddingProperty", + "-fx-padding", + ObservableType.of(region.paddingProperty()), + DisplayHint.INSETS, + ValueState.defaultIf(region.getPadding() == null || Insets.EMPTY.equals(region.getPadding())) + ); + case "snapToPixel" -> new Attribute<>( + "snapToPixel", + region.isSnapToPixel(), + "snapToPixelProperty", + "-fx-snap-to-pixel", + ObservableType.of(region.snapToPixelProperty()), + DisplayHint.BOOLEAN, + ValueState.defaultIf(region.isSnapToPixel()) + ); + case "shape" -> new Attribute<>( + "shape", + region.getShape() != null ? String.valueOf(region.getShape()) : null, + "shapeProperty", + "-fx-shape", + ObservableType.of(region.shapeProperty()), + DisplayHint.TEXT, + ValueState.defaultIf(region.getShape() == null) + ); + case "scaleShape" -> new Attribute<>( + "scaleShape", + region.isScaleShape(), + "scaleShapeProperty", + "-fx-scale-shape", + ObservableType.of(region.scaleShapeProperty()), + DisplayHint.BOOLEAN, + ValueState.defaultIf(region.isScaleShape()) + ); + case "centerShape" -> new Attribute<>( + "centerShape", + region.isCenterShape(), + "centerShapeProperty", + "-fx-position-shape", + ObservableType.of(region.centerShapeProperty()), + DisplayHint.BOOLEAN, + ValueState.defaultIf(region.isCenterShape()) + ); + case "userAgentStylesheet" -> new Attribute<>( + "userAgentStylesheet", + region.getUserAgentStylesheet(), + "userAgentStylesheet", + ObservableType.NOT_OBSERVABLE, + DisplayHint.TEXT, + ValueState.defaultIf(region.getUserAgentStylesheet() == null) + ); + case "minWidth" -> new Attribute<>( + "minWidth", + region.getMinWidth(), + "minWidthProperty", + "-fx-min-width", + ObservableType.of(region.minWidthProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(region.getMinWidth() == Control.USE_COMPUTED_SIZE) + ); + case "minHeight" -> new Attribute<>( + "minHeight", + region.getMinHeight(), + "minHeightProperty", + "-fx-min-height", + ObservableType.of(region.minHeightProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(region.getMinHeight() == Control.USE_COMPUTED_SIZE) + ); + case "prefWidth" -> new Attribute<>( + "prefWidth", + region.getPrefWidth(), + "prefWidthProperty", + "-fx-pref-width", + ObservableType.of(region.prefWidthProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(region.getPrefWidth() == Control.USE_COMPUTED_SIZE) + ); + case "prefHeight" -> new Attribute<>( + "prefHeight", + region.getPrefHeight(), + "prefHeightProperty", + "-fx-pref-height", + ObservableType.of(region.prefHeightProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(region.getPrefHeight() == Control.USE_COMPUTED_SIZE) + ); + case "maxWidth" -> new Attribute<>( + "maxWidth", + region.getMaxWidth(), + "maxWidthProperty", + "-fx-max-width", + ObservableType.of(region.maxWidthProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(region.getMaxWidth() == Control.USE_COMPUTED_SIZE) + ); + case "maxHeight" -> new Attribute<>( + "maxHeight", + region.getMaxHeight(), + "maxHeightProperty", + "-fx-max-height", + ObservableType.of(region.maxHeightProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(region.getMaxHeight() == Control.USE_COMPUTED_SIZE) + ); + default -> null; + }; + } +} diff --git a/connector/src/main/java/devtoolsfx/scenegraph/attributes/SceneTracker.java b/connector/src/main/java/devtoolsfx/scenegraph/attributes/SceneTracker.java new file mode 100644 index 0000000..0c55b94 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/scenegraph/attributes/SceneTracker.java @@ -0,0 +1,234 @@ +package devtoolsfx.scenegraph.attributes; + +import devtoolsfx.event.EventBus; +import devtoolsfx.event.EventSource; +import devtoolsfx.scenegraph.attributes.Attribute.DisplayHint; +import devtoolsfx.scenegraph.attributes.Attribute.ObservableType; +import devtoolsfx.scenegraph.attributes.Attribute.ValueState; +import javafx.beans.value.ObservableValue; +import javafx.scene.Scene; +import javafx.scene.control.Tooltip; +import javafx.scene.image.Image; +import javafx.scene.layout.Background; +import javafx.scene.layout.Border; +import javafx.scene.paint.Color; +import javafx.stage.Window; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeMap; +import java.util.stream.Collectors; +import java.util.stream.Stream; + +@NullMarked +public final class SceneTracker extends Tracker { + + public static final Set NON_REFLECTIVE_PROPERTIES = Set.of("stylesheets", "userData"); + + private final Map> orderedProperties = new TreeMap<>(); + + // Only one reflective tracker per target is allowed, and we already use one to obtain + // the window properties. However, the scene contains too many attributes to ignore, + // so this is the custom partially reflective implementation. + public SceneTracker(EventBus eventBus, EventSource eventSource) { + super(eventBus, eventSource, AttributeCategory.SCENE); + } + + @Override + public void reload(String... properties) { + Scene scene = (Scene) getTarget(); + if (scene == null) { + return; + } + + List supportedProperties = Stream.concat( + orderedProperties.keySet().stream(), + NON_REFLECTIVE_PROPERTIES.stream() + ).sorted().collect(Collectors.toList()); + + reload(property -> read(scene, property), supportedProperties, properties); + } + + @Override + public boolean accepts(@Nullable Object target) { + return target instanceof Window; + } + + /////////////////////////////////////////////////////////////////////////// + + @Override + protected void beforeSetTarget(Object target) { + scan(); + } + + @Override + protected void beforeResetTarget(Object target) { + orderedProperties.clear(); + } + + @Override + protected boolean doSetTarget(@Nullable Object candidate) { + if (candidate instanceof Window window) { + candidate = window.getScene(); + } + return super.doSetTarget(candidate); + } + + @SuppressWarnings({"ConstantValue"}) + private void scan() { + orderedProperties.clear(); + for (Map.Entry, String> entry : propertyListener.getProperties().entrySet()) { + if (entry.getKey() != null && entry.getValue() != null) { + orderedProperties.put(entry.getValue(), entry.getKey()); + } + } + } + + private @Nullable Attribute read(Scene scene, String property) { + if (NON_REFLECTIVE_PROPERTIES.contains(property)) { + return switch (property) { + case "stylesheets" -> { + String stylesheets = String.join("\n", scene.getStylesheets()); + yield new Attribute<>( + "stylesheets", + stylesheets, + "getStylesheets", + ObservableType.LIST, + DisplayHint.TEXT, + ValueState.defaultIf(scene.getStylesheets().isEmpty()) + ); + } + case "userData" -> new Attribute<>( + "userData", + String.valueOf(scene.getUserData()), + "userData", + ObservableType.NOT_OBSERVABLE, + DisplayHint.TEXT, + ValueState.defaultIf(scene.getUserData() == null) + ); + default -> null; + }; + } + + return read(property); + } + + private Attribute read(String property) { + ObservableValue obs = orderedProperties.get(property); + Object value = obs.getValue(); // can be null and when it's null we won't get any DisplayHint... + + ObservableType obsType = ObservableType.of(obs); + String field = property + PropertyListener.PROPERTY_SUFFIX; + + // ValueState.NOT_APPLICABLE everywhere, because it's not possible to guess + // whether the observable property has default value or not + return switch (value) { + // primitive properties + case Boolean bool -> new Attribute<>( + property, + bool, + field, + null, + obsType, + DisplayHint.BOOLEAN, + ValueState.AUTO + ); + case Integer number -> new Attribute<>( + property, + number, + field, + null, + obsType, + DisplayHint.NUMERIC, + ValueState.AUTO + ); + case Double number -> new Attribute<>( + property, + number, + field, + null, + obsType, + DisplayHint.NUMERIC, + ValueState.AUTO + ); + case String str -> new Attribute<>( + property, + str, + field, + null, + obsType, + DisplayHint.TEXT, + ValueState.AUTO + ); + // object properties + case Enum enumeration -> new Attribute<>( + property, + enumeration, + field, + null, + obsType, + DisplayHint.ENUM, + ValueState.AUTO, + List.of(enumeration.getClass().getEnumConstants()) + ); + case Color color -> new Attribute<>( + property, + color, + field, + null, + obsType, + DisplayHint.COLOR, + ValueState.AUTO + ); + case Image image -> new Attribute<>( + property, + image, + field, + null, + obsType, + DisplayHint.IMAGE, + ValueState.AUTO + ); + case Background background -> new Attribute<>( + property, + background, + field, + null, + obsType, + DisplayHint.BACKGROUND, + ValueState.AUTO + ); + case Border border -> new Attribute<>( + property, + border, + field, + null, + obsType, + DisplayHint.BORDER, + ValueState.AUTO + ); + case Tooltip tooltip -> new Attribute<>( + property, + tooltip.getText(), + field, + null, + obsType, + DisplayHint.TEXT, + ValueState.AUTO + ); + // the remainder is ObjectProperty + case null, default -> new Attribute<>( + property, + String.valueOf(value), + field, + null, + obsType, + DisplayHint.OBJECT, + ValueState.AUTO + ); + }; + } +} diff --git a/connector/src/main/java/devtoolsfx/scenegraph/attributes/ShapeTracker.java b/connector/src/main/java/devtoolsfx/scenegraph/attributes/ShapeTracker.java new file mode 100644 index 0000000..9f5470f --- /dev/null +++ b/connector/src/main/java/devtoolsfx/scenegraph/attributes/ShapeTracker.java @@ -0,0 +1,157 @@ +package devtoolsfx.scenegraph.attributes; + +import devtoolsfx.event.EventBus; +import devtoolsfx.event.EventSource; +import devtoolsfx.scenegraph.attributes.Attribute.DisplayHint; +import devtoolsfx.scenegraph.attributes.Attribute.ObservableType; +import devtoolsfx.scenegraph.attributes.Attribute.ValueState; +import javafx.scene.paint.Color; +import javafx.scene.shape.*; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.List; + +import static java.lang.System.Logger.Level; + +/** + * The {@link Tracker} implementation for the {@link Shape} class. + */ +@NullMarked +public final class ShapeTracker extends Tracker { + + private static final System.Logger LOGGER = System.getLogger(ReflectiveTracker.class.getName()); + + public static final List SUPPORTED_PROPERTIES = List.of( + "fill", "smooth", "stroke", "strokeType", "strokeWidth", "strokeDashArray", + "strokeDashOffset", "strokeLineCap", "strokeLineJoin", "strokeMiterLimit" + ); + + public ShapeTracker(EventBus eventBus, EventSource eventSource) { + super(eventBus, eventSource, AttributeCategory.SHAPE); + } + + @Override + public void reload(String... properties) { + Shape shape = (Shape) getTarget(); + if (shape == null) { + return; + } + + reload(property -> read(shape, property), SUPPORTED_PROPERTIES, properties); + } + + @Override + public boolean accepts(@Nullable Object target) { + return target instanceof Shape; + } + + /////////////////////////////////////////////////////////////////////////// + + private @Nullable Attribute read(Shape shape, String property) { + return switch (property) { + case "fill" -> { + if (shape.getFill() == null) { + LOGGER.log(Level.WARNING, "[Error] null shape fill for node: " + target); + } + + yield new Attribute<>( + "fill", + shape.getFill(), + "fillProperty", + "-fx-fill", + ObservableType.of(shape.fillProperty()), + DisplayHint.COLOR, + ValueState.defaultIf(Color.BLACK.equals(shape.getFill())) + ); + } + case "smooth" -> new Attribute<>( + "smooth", + shape.isSmooth(), + "smoothProperty", + "-fx-smooth", + ObservableType.of(shape.smoothProperty()), + DisplayHint.BOOLEAN, + ValueState.defaultIf(shape.isSmooth()) + ); + case "stroke" -> new Attribute<>( + "stroke", + shape.getStroke(), + "strokeProperty", + "-fx-stroke", + ObservableType.of(shape.strokeProperty()), + DisplayHint.COLOR, + ValueState.defaultIf((Color.BLACK.equals(shape.getFill()) && + (shape instanceof Line || shape instanceof Polyline || shape instanceof Path) + ) || shape.getStroke() == null) + ); + case "strokeType" -> new Attribute<>( + "strokeType", + shape.getStrokeType(), + "strokeTypeProperty", + "-fx-stroke-type", + ObservableType.of(shape.strokeTypeProperty()), + DisplayHint.ENUM, + ValueState.defaultIf(StrokeType.CENTERED.equals(shape.getStrokeType())), + List.of(StrokeType.values()) + ); + case "strokeWidth" -> new Attribute<>( + "strokeWidth", + shape.getStrokeWidth(), + "strokeWidthProperty", + "-fx-stroke-width", + ObservableType.of(shape.strokeWidthProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(shape.getStrokeWidth() == 1) + ); + case "strokeDashArray" -> new Attribute<>( + "strokeWidth", + shape.getStrokeDashArray(), + "getStrokeDashArray", + "-fx-stroke-dash-array", + ObservableType.LIST, + DisplayHint.OBJECT, + ValueState.defaultIf(shape.getStrokeDashArray().isEmpty()) + ); + case "strokeDashOffset" -> new Attribute<>( + "strokeDashOffset", + shape.getStrokeDashOffset(), + "strokeDashOffsetProperty", + "-fx-stroke-dash-offset", + ObservableType.of(shape.strokeDashOffsetProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(shape.getStrokeDashOffset() == 0) + ); + case "strokeLineCap" -> new Attribute<>( + "strokeLineCap", + shape.getStrokeLineCap(), + "strokeLineCapProperty", + "-fx-stroke-line-cap", + ObservableType.of(shape.strokeLineCapProperty()), + DisplayHint.ENUM, + ValueState.defaultIf(shape.getStrokeLineCap() == StrokeLineCap.SQUARE), + List.of(StrokeLineCap.values()) + ); + case "strokeLineJoin" -> new Attribute<>( + "strokeLineJoin", + shape.getStrokeLineJoin(), + "strokeLineJoinProperty", + "-fx-stroke-line-join", + ObservableType.of(shape.strokeLineJoinProperty()), + DisplayHint.ENUM, + ValueState.defaultIf(shape.getStrokeLineJoin() == StrokeLineJoin.MITER), + List.of(StrokeLineJoin.values()) + ); + case "strokeMiterLimit" -> new Attribute<>( + "strokeMiterLimit", + shape.getStrokeMiterLimit(), + "strokeMiterLimitProperty", + "-fx-stroke-miter-limit", + ObservableType.of(shape.strokeMiterLimitProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(shape.getStrokeMiterLimit() == 10) + ); + default -> null; + }; + } +} diff --git a/connector/src/main/java/devtoolsfx/scenegraph/attributes/TextTracker.java b/connector/src/main/java/devtoolsfx/scenegraph/attributes/TextTracker.java new file mode 100644 index 0000000..22c9cb9 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/scenegraph/attributes/TextTracker.java @@ -0,0 +1,171 @@ +package devtoolsfx.scenegraph.attributes; + +import devtoolsfx.event.EventBus; +import devtoolsfx.event.EventSource; +import devtoolsfx.scenegraph.attributes.Attribute.DisplayHint; +import devtoolsfx.scenegraph.attributes.Attribute.ObservableType; +import devtoolsfx.scenegraph.attributes.Attribute.ValueState; +import javafx.geometry.VPos; +import javafx.scene.text.FontSmoothingType; +import javafx.scene.text.Text; +import javafx.scene.text.TextAlignment; +import javafx.scene.text.TextBoundsType; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.List; + +/** + * The {@link Tracker} implementation for the {@link Text} class. + */ +@NullMarked +public final class TextTracker extends Tracker { + + public static final List SUPPORTED_PROPERTIES = List.of( + "text", "font", "textOrigin", "x", "y", "textAlignment", "boundsType", + "tabSize", "lineSpacing", "wrappingWidth", "underline", "strikethrough", "fontSmoothingType" + ); + + public TextTracker(EventBus eventBus, EventSource eventSource) { + super(eventBus, eventSource, AttributeCategory.TEXT); + } + + @Override + public void reload(String... properties) { + Text text = (Text) getTarget(); + if (text == null) { + return; + } + + reload(property -> read(text, property), SUPPORTED_PROPERTIES, properties); + } + + @Override + public boolean accepts(@Nullable Object target) { + return target instanceof Text; + } + + /////////////////////////////////////////////////////////////////////////// + + private @Nullable Attribute read(Text text, String property) { + return switch (property) { + case "text" -> new Attribute<>( + "text", + text.getText(), + "textProperty", + ObservableType.of(text.textProperty()), + DisplayHint.TEXT, + ValueState.defaultIf(text.getText() == null) + ); + case "font" -> new Attribute<>( + "font", + text.getFont(), + "fontProperty", + "-fx-font", + ObservableType.of(text.fontProperty()), + DisplayHint.FONT, + ValueState.defaultIf(text.getFont() == null) + ); + case "textOrigin" -> new Attribute<>( + "textOrigin", + text.getTextOrigin(), + "textOriginProperty", + "-fx-text-origin", + ObservableType.of(text.textOriginProperty()), + DisplayHint.ENUM, + ValueState.defaultIf(text.getTextOrigin() == null), + List.of(VPos.values()) + ); + case "x" -> new Attribute<>( + "x", + text.getX(), + "xProperty", + ObservableType.of(text.xProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(text.getX() == 0) + ); + case "y" -> new Attribute<>( + "y", + text.getY(), + "yProperty", + ObservableType.of(text.yProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(text.getY() == 0) + ); + case "textAlignment" -> new Attribute<>( + "textAlignment", + text.getTextAlignment(), + "textAlignmentProperty", + "-fx-text-alignment", + ObservableType.of(text.textAlignmentProperty()), + DisplayHint.ENUM, + ValueState.defaultIf(text.getTextAlignment() == TextAlignment.LEFT) + ); + case "boundsType" -> new Attribute<>( + "boundsType", + text.getBoundsType(), + "boundsTypeProperty", + "-fx-bounds-type", + ObservableType.of(text.boundsTypeProperty()), + DisplayHint.ENUM, + ValueState.defaultIf(text.getBoundsType() == TextBoundsType.LOGICAL), + List.of(TextBoundsType.values()) + ); + case "tabSize" -> new Attribute<>( + "tabSize", + text.getTabSize(), + "tabSizeProperty", + "-fx-tab-size", + ObservableType.of(text.tabSizeProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(text.getTabSize() == 8) + ); + case "lineSpacing" -> new Attribute<>( + "lineSpacing", + text.getLineSpacing(), + "lineSpacingProperty", + "-fx-line-spacing", + ObservableType.of(text.lineSpacingProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(text.getLineSpacing() == 0) + ); + case "wrappingWidth" -> new Attribute<>( + "wrappingWidth", + text.getWrappingWidth(), + "wrappingWidthProperty", + ObservableType.of(text.wrappingWidthProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(text.getWrappingWidth() == 0) + ); + case "underline" -> new Attribute<>( + "underline", + text.isUnderline(), + "underlineProperty", + "-fx-underline", + ObservableType.of(text.underlineProperty()), + DisplayHint.BOOLEAN, + Attribute.ValueState.defaultIf(!text.isUnderline()) + ); + case "strikethrough" -> new Attribute<>( + "strikethrough", + text.isStrikethrough(), + "strikethroughProperty", + "-fx-strikethrough", + ObservableType.of(text.strikethroughProperty()), + DisplayHint.BOOLEAN, + Attribute.ValueState.defaultIf(!text.isStrikethrough()) + ); + case "fontSmoothingType" -> new Attribute<>( + "fontSmoothingType", + text.getFontSmoothingType(), + "fontSmoothingTypeProperty", + "-fx-font-smoothing-type", + ObservableType.of(text.fontSmoothingTypeProperty()), + DisplayHint.ENUM, + ValueState.defaultIf(text.getFontSmoothingType() == FontSmoothingType.GRAY), + List.of(FontSmoothingType.values()) + ); + default -> null; + }; + } +} diff --git a/connector/src/main/java/devtoolsfx/scenegraph/attributes/Tracker.java b/connector/src/main/java/devtoolsfx/scenegraph/attributes/Tracker.java new file mode 100644 index 0000000..d2ec259 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/scenegraph/attributes/Tracker.java @@ -0,0 +1,239 @@ +package devtoolsfx.scenegraph.attributes; + +import devtoolsfx.connector.LocalElement; +import devtoolsfx.event.*; +import javafx.beans.value.ObservableValue; +import javafx.scene.Node; +import javafx.scene.Scene; +import javafx.stage.Window; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.lang.System.Logger; +import java.lang.reflect.InvocationTargetException; +import java.util.*; +import java.util.function.Function; + +/** + * The tracker is the base class for reading scene graph node properties and monitoring + * changes to those properties. Each individual property is wrapped in the corresponding + * {@link Attribute} instance, which provides additional information on how to work with + * the property. Any changes are emitted through the given {@link EventBus}. + *

    + * It is also designed (though not yet implemented) to include additional logic for changing + * the property values. + *

    + * There are several specific implementations for common types in the JavaFX scene graph + * hierarchy, as well as one generic implementation (the {@link ReflectiveTracker}), which + * tries to obtain all available node properties via reflection. + */ +@NullMarked +public abstract sealed class Tracker permits + ControlTracker, + GridPaneTracker, + LabeledTracker, + ImageViewTracker, + NodeTracker, + ParentTracker, + RegionTracker, + ReflectiveTracker, + SceneTracker, + ShapeTracker, + TextTracker, + WindowTracker { + + private static final Logger LOGGER = System.getLogger(Tracker.class.getName()); + + protected final PropertyListener propertyListener = new PropertyListener() { + @Override + protected void onPropertyChanged(String propertyName, ObservableValue obs) { + // emit property changes (won't work for observable collections) + reload(propertyName); + } + }; + + protected final EventBus eventBus; + protected final AttributeCategory category; + protected final EventSource eventSource; + protected @Nullable Object target; + + protected Tracker(EventBus eventBus, + EventSource eventSource, + AttributeCategory category) { + this.eventBus = eventBus; + this.eventSource = eventSource; + this.category = category; + } + + /** + * Returns the tracker category, which indicates the type of scene graph node + * with which this tracker works. + */ + public AttributeCategory getCategory() { + return category; + } + + /** + * Returns the target node that is being tracked. + */ + public @Nullable Object getTarget() { + return target; + } + + /** + * Sets or resets the target node to be tracked. + */ + public void setTarget(@Nullable Object target) { + if (target == null) { + reset(); + return; + } + + // reload (emit) all properties initially + if (doSetTarget(target)) { + reload(); + } + } + + /** + * Removes the tracked node, clears all listeners and emits the corresponding + * {@link AttributeListEvent}. This is the equivalent of {@code setTarget(null)}. + */ + public void reset() { + // keep direct link to avoid NPE, there's some contention + var t = target; + + if (t != null) { + beforeResetTarget(t); + doSetTarget(null); + fireAttributeListEvent(List.of()); + } + } + + /** + * Reads all specified properties from the target node and emits the corresponding + * events. If no arguments are passed, it reads and emits all properties of the target node. + */ + public abstract void reload(String... properties); + + /** + * Checks whether the given target can be accepted by the tracker implementation. + */ + public abstract boolean accepts(@Nullable Object target); + + /////////////////////////////////////////////////////////////////////////// + + /** + * Replaces the current target with a new one. + */ + protected boolean doSetTarget(@Nullable Object candidate) { + if (target == candidate) { + return false; + } + + Object old = target; + if (old != null) { + propertyListener.release(); + } + + if (candidate != null) { + try { + propertyListener.use(candidate); + } catch (InvocationTargetException | IllegalAccessException e) { + eventBus.fire(ExceptionEvent.of(eventSource, e)); + } + + // properties must be available prior to running this method + beforeSetTarget(candidate); + } + target = candidate; + + return true; + } + + /** + * If an implementation needs to refresh additional resources, it can include the logic here. + * This method will be called prior to setting the current target to a new value. + */ + protected void beforeSetTarget(Object target) { + // pass + } + + /** + * If an implementation uses additional resources, it can include the cleanup logic here. + * This method will be called prior to setting the current target to null. + */ + protected void beforeResetTarget(Object target) { + // pass + } + + /** + * A handy method to simplify reloading properties in implementations. + */ + protected void reload(Function> mapper, + Collection supportedProperties, + String... properties) { + if (properties.length == 0) { // hot path 1 + var attributes = new ArrayList>(properties.length); + for (var property : supportedProperties) { + Attribute attr = mapper.apply(property); + if (attr != null) { + attributes.add(attr); + } + } + fireAttributeListEvent(attributes); + } else if (properties.length == 1) { // hot path 2 + Attribute attr = mapper.apply(properties[0]); + if (attr != null) { + fireAttributeUpdatedEvent(attr); + } + } else { + Arrays.stream(properties) + .map(mapper) + .filter(Objects::nonNull) + .forEach(this::fireAttributeUpdatedEvent); + } + } + + /** + * Emits an {@link AttributeListEvent} based on the target type. + */ + protected void fireAttributeListEvent(List> attributes) { + if (target instanceof Node node) { + eventBus.fire( + new AttributeListEvent(eventSource, LocalElement.of(node), category, attributes) + ); + } else if (target instanceof Window window) { + eventBus.fire( + new AttributeListEvent(eventSource, LocalElement.of(window, eventSource), category, attributes) + ); + } else if (target instanceof Scene scene) { + eventBus.fire( + new AttributeListEvent(eventSource, LocalElement.of(scene.getWindow(), eventSource), category, attributes) + ); + } else if (target != null) { + LOGGER.log(Logger.Level.WARNING, "Unable to emit event: unknown object type '" + target.getClass() + "'"); + } + } + + /** + * Emits an {@link AttributeUpdatedEvent} based on the target type. + */ + protected void fireAttributeUpdatedEvent(Attribute attribute) { + if (target instanceof Node node) { + eventBus.fire( + new AttributeUpdatedEvent(eventSource, LocalElement.of(node), category, attribute) + ); + } else if (target instanceof Window window) { + eventBus.fire( + new AttributeUpdatedEvent(eventSource, LocalElement.of(window, eventSource), category, attribute) + ); + } else if (target instanceof Scene scene) { + eventBus.fire( + new AttributeUpdatedEvent(eventSource, LocalElement.of(scene.getWindow(), eventSource), category, attribute) + ); + } else if (target != null) { + LOGGER.log(Logger.Level.WARNING, "Unable to emit event: unknown object type '" + target.getClass() + "'"); + } + } +} diff --git a/connector/src/main/java/devtoolsfx/scenegraph/attributes/WindowTracker.java b/connector/src/main/java/devtoolsfx/scenegraph/attributes/WindowTracker.java new file mode 100644 index 0000000..c44c501 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/scenegraph/attributes/WindowTracker.java @@ -0,0 +1,154 @@ +package devtoolsfx.scenegraph.attributes; + +import devtoolsfx.event.EventBus; +import devtoolsfx.event.EventSource; +import devtoolsfx.scenegraph.attributes.Attribute.DisplayHint; +import devtoolsfx.scenegraph.attributes.Attribute.ObservableType; +import devtoolsfx.scenegraph.attributes.Attribute.ValueState; +import javafx.stage.Window; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.List; + +@NullMarked +public final class WindowTracker extends Tracker { + + public static final List SUPPORTED_PROPERTIES = List.of( + "width", "height", "x", "y", "opacity", "focused", "showing", + "outputScaleX", "outputScaleY", "renderScaleX", "renderScaleY", "forceIntegerRenderScale", "userData" + ); + + public WindowTracker(EventBus eventBus, EventSource eventSource) { + super(eventBus, eventSource, AttributeCategory.WINDOW); + } + + @Override + public void reload(String... properties) { + Window window = (Window) getTarget(); + if (window == null) { + return; + } + + reload(property -> read(window, property), SUPPORTED_PROPERTIES, properties); + } + + @Override + public boolean accepts(@Nullable Object target) { + return target instanceof Window; + } + + /////////////////////////////////////////////////////////////////////////// + + private @Nullable Attribute read(Window window, String property) { + return switch (property) { + case "width" -> new Attribute<>( + "width", + window.getWidth(), + "widthProperty", + ObservableType.of(window.widthProperty()), + DisplayHint.NUMERIC, + ValueState.AUTO + ); + case "height" -> new Attribute<>( + "height", + window.getHeight(), + "heightProperty", + ObservableType.of(window.heightProperty()), + DisplayHint.NUMERIC, + ValueState.AUTO + ); + case "x" -> new Attribute<>( + "x", + window.getX(), + "xProperty", + ObservableType.of(window.xProperty()), + DisplayHint.NUMERIC, + ValueState.AUTO + ); + case "y" -> new Attribute<>( + "y", + window.getY(), + "yProperty", + ObservableType.of(window.yProperty()), + DisplayHint.NUMERIC, + ValueState.AUTO + ); + case "opacity" -> new Attribute<>( + "opacity", + window.getOpacity(), + "opacityProperty", + null, + ObservableType.of(window.opacityProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(window.getOpacity() == 1.0), + List.of(0.0, 1.0) + ); + case "focused" -> new Attribute<>( + "focused", + window.isFocused(), + "focusedProperty", + ObservableType.of(window.focusedProperty()), + DisplayHint.BOOLEAN, + ValueState.defaultIf(!window.isFocused()) + ); + case "showing" -> new Attribute<>( + "showing", + window.isShowing(), + "showingProperty", + ObservableType.of(window.showingProperty()), + DisplayHint.BOOLEAN, + ValueState.defaultIf(!window.isShowing()) + ); + case "outputScaleX" -> new Attribute<>( + "outputScaleX", + window.getOutputScaleX(), + "outputScaleXProperty", + ObservableType.of(window.outputScaleXProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(window.getOutputScaleX() == 1.0) + ); + case "outputScaleY" -> new Attribute<>( + "outputScaleY", + window.getOutputScaleY(), + "outputScaleYProperty", + ObservableType.of(window.outputScaleYProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(window.getOutputScaleY() == 1.0) + ); + case "renderScaleX" -> new Attribute<>( + "renderScaleX", + window.getRenderScaleX(), + "renderScaleXProperty", + ObservableType.of(window.renderScaleXProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(window.getRenderScaleX() == 1.0) + ); + case "renderScaleY" -> new Attribute<>( + "renderScaleY", + window.getRenderScaleY(), + "renderScaleYProperty", + ObservableType.of(window.renderScaleYProperty()), + DisplayHint.NUMERIC, + ValueState.defaultIf(window.getRenderScaleY() == 1.0) + ); + case "forceIntegerRenderScale" -> new Attribute<>( + "forceIntegerRenderScale", + window.isForceIntegerRenderScale(), + "forceIntegerRenderScaleProperty", + ObservableType.of(window.forceIntegerRenderScaleProperty()), + DisplayHint.BOOLEAN, + ValueState.defaultIf(!window.isForceIntegerRenderScale()) + ); + case "userData" -> new Attribute<>( + "userData", + String.valueOf(window.getUserData()), + "userData", + ObservableType.NOT_OBSERVABLE, + DisplayHint.TEXT, + ValueState.defaultIf(window.getUserData() == null) + ); + default -> null; + }; + } +} diff --git a/connector/src/main/java/devtoolsfx/scenegraph/attributes/package-info.java b/connector/src/main/java/devtoolsfx/scenegraph/attributes/package-info.java new file mode 100644 index 0000000..6a97050 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/scenegraph/attributes/package-info.java @@ -0,0 +1,7 @@ +/** + * The package contains the API for all the supported library features and/or extensions: + * - cssfx - CSS monitoring and hot-reload + * - properties - obtaining node properties information + */ + +package devtoolsfx.scenegraph.attributes; diff --git a/connector/src/main/java/devtoolsfx/util/ClassInfoCache.java b/connector/src/main/java/devtoolsfx/util/ClassInfoCache.java new file mode 100644 index 0000000..4dc9844 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/util/ClassInfoCache.java @@ -0,0 +1,38 @@ +package devtoolsfx.util; + +import devtoolsfx.scenegraph.ClassInfo; + +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +public final class ClassInfoCache { + + private static final Map, ClassInfo> cache = new ConcurrentHashMap<>(); + + /** + * Returns the simple class name for the given object/ + */ + public static ClassInfo get(Object obj) { + ClassInfo info = cache.get(obj.getClass()); + if (info == null) { + Class cls = obj.getClass(); + String className = cls.getName(); + String simpleName = cls.getSimpleName(); + + // getSimpleName() for anonymous classes in Scala does not return empty string, + // instead it will contain some encoded name + while (simpleName.isEmpty() || simpleName.contains("anon$")) { + cls = cls.getSuperclass(); + className = cls.getName(); + simpleName = cls.getSimpleName(); + } + + info = new ClassInfo(cls.getModule().getName(), className, simpleName); + + cache.put(obj.getClass(), info); + return info; + } + + return info; + } +} diff --git a/connector/src/main/java/devtoolsfx/util/SceneUtils.java b/connector/src/main/java/devtoolsfx/util/SceneUtils.java new file mode 100644 index 0000000..b1b7070 --- /dev/null +++ b/connector/src/main/java/devtoolsfx/util/SceneUtils.java @@ -0,0 +1,377 @@ +package devtoolsfx.util; + +import devtoolsfx.connector.ConnectorOptions; +import devtoolsfx.connector.LocalElement; +import devtoolsfx.scenegraph.Element; +import javafx.beans.InvalidationListener; +import javafx.beans.value.ChangeListener; +import javafx.beans.value.ObservableValue; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.event.Event; +import javafx.event.EventHandler; +import javafx.event.EventType; +import javafx.geometry.Point2D; +import javafx.scene.*; +import javafx.scene.control.Control; +import javafx.scene.control.PopupControl; +import javafx.scene.layout.Pane; +import javafx.scene.layout.Region; +import javafx.stage.Window; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.lang.System.Logger.Level; +import java.util.Collections; +import java.util.List; +import java.util.Objects; +import java.util.function.Function; + +/** + * A set of utility methods to work with scene's nodes. + */ +@NullMarked +public final class SceneUtils { + + private static final System.Logger LOGGER = System.getLogger(SceneUtils.class.getName()); + + /** + * Returns the given node unique ID. Basically, it's just a hash code. + */ + public static int getUID(Node node) { + return node.hashCode(); + } + + /** + * Checks whether the given node is a normal application node or an auxiliary node. + */ + public static boolean isAuxiliaryNode(@Nullable Node node) { + return node != null + && node.getId() != null + && node.getId().startsWith(ConnectorOptions.AUX_NODE_ID_PREFIX); + } + + /** + * See {@link #isAuxiliaryNode(Node)}. + */ + public static boolean isAuxiliaryNode(@Nullable PopupControl popup) { + return popup != null + && popup.getId() != null + && popup.getId().startsWith(ConnectorOptions.AUX_NODE_ID_PREFIX); + } + + /** + * Returns the unmodifiable list of children of the given node or an empty list. + * This method handles the use case when the provided node is a {@link SubScene}. + */ + public static ObservableList getChildren(@Nullable Node node) { + return switch (node) { + case Parent parent -> parent.getChildrenUnmodifiable(); + case SubScene subScene -> subScene.getRoot().getChildrenUnmodifiable(); + case null, default -> FXCollections.emptyObservableList(); + }; + } + + /** + * Returns the count of children for the specified node. + */ + public static int countChildren(Node node) { + return (int) getChildren(node).stream().filter(c -> !isAuxiliaryNode(c)).count(); + } + + /** + * Returns the count of nodes in the branch, starting from and including the given node. + */ + public static int countNodesInBranch(Node branch) { + if (isAuxiliaryNode(branch)) { + return 0; + } + + int count = 1; + for (var child : getChildren(branch)) { + count += countNodesInBranch(child); + } + + return count; + } + + /** + * Searches for a scene graph node with the given hash code, starting from the specified node. + */ + public static @Nullable Node findNode(Node node, int hashCode) { + if (node.hashCode() == hashCode) { + return node; + } + + for (var child : SceneUtils.getChildren(node)) { + return findNode(child, hashCode); + } + + return null; + } + + /** + * Returns the nearest instance of the {@link Pane} class starting from the + * given parent no and down to its descendants. + */ + public static @Nullable Parent findNearestPane(@Nullable Parent parent) { + if (parent == null) { + return null; + } + + Parent fertile = (parent instanceof Group || parent instanceof Pane) ? parent : null; + if (fertile == null) { + for (Node child : parent.getChildrenUnmodifiable()) { + if (child instanceof Parent) { + fertile = findNearestPane((Parent) child); + } + } + } + + return fertile; + } + + /** + * Finds the hovered node in the target's children using the given coordinates. + */ + public static @Nullable Node findHoveredNode(@Nullable Node target, + double x, + double y, + boolean ignoreMouseTransparent) { + + if (target == null || SceneUtils.isAuxiliaryNode(target)) { + return null; + } + + List children = getChildren(target); + for (int i = children.size() - 1; i >= 0; i--) { + Node maybeHovered = findHoveredNode(children.get(i), x, y, ignoreMouseTransparent); + if (maybeHovered != null) { + return maybeHovered; + } + } + + Point2D localPoint = target.sceneToLocal(x, y); + boolean isNotMouseTransparent = ignoreMouseTransparent || !target.isMouseTransparent(); + + if (target.contains(localPoint) && isNotMouseTransparent && isBranchVisible(target)) { + return target; + } + + return null; + } + + /** + * Adds the given node to the given parent. If the parent is not of a container type, + * then adds it to the nearest pane in the parent's descendants. + */ + public static void addToNode(Parent parent, Node node) { + if (parent instanceof Group group) { + group.getChildren().add(node); + } else if (parent instanceof Pane pane) { + pane.getChildren().add(node); + } else { + var pane = findNearestPane(parent); + if (pane != null) { + addToNode(pane, node); + } + } + } + + /** + * The opposite of the {@link #addToNode(Parent, Node)}. + */ + public static void removeFromNode(Parent parent, Node node) { + if (parent instanceof Group group) { + group.getChildren().remove(node); + } else if (parent instanceof Pane pane) { + pane.getChildren().remove(node); + } else { + var pane = findNearestPane(parent); + if (pane != null) { + removeFromNode(pane, node); + } + } + } + + /** + * Returns the list of stylesheets for the specified node. + */ + public static List getStylesheets(Node node) { + return switch (node) { + case Control control -> Collections.unmodifiableList(control.getStylesheets()); + case Parent parent -> Collections.unmodifiableList(parent.getStylesheets()); + default -> List.of(); + }; + } + + /** + * Returns the user agent stylesheet for the specified node. + */ + public static @Nullable String getUserAgentStylesheet(Node node) { + String uas = switch (node) { + case Control control -> control.getUserAgentStylesheet(); + case Region region -> region.getUserAgentStylesheet(); + case SubScene subScene -> subScene.getUserAgentStylesheet(); + default -> null; + }; + + return uas != null && uas.isEmpty() ? null : uas; + } + + /** + * Checks that both the given node and all it ancestors are visible. + */ + public static boolean isBranchVisible(@Nullable Node node) { + // node is visible if it's null, because it means that all descendant are visible + // up to the common ancestor, which doesn't have a parent, so the recursion ended with null + return node == null || (node.isVisible() && isBranchVisible(node.getParent())); + } + + /** + * Returns the window to which the given node belongs, if any. + */ + public static @Nullable Window getWindow(Node node) { + if (node.getScene() != null && node.getScene().getWindow() != null) { + return node.getScene().getWindow(); + } + return null; + } + + /** + * Recursively collects the list of nodes for which {@link Parent#getStylesheets()} + * or {@link Control#getStylesheets()} is not empty. + */ + public static void collectNodesWithStyleSheets(Node node, List accumulator) { + var stylesheets = getStylesheets(node); + if (!stylesheets.isEmpty()) { + accumulator.add(LocalElement.of(node)); + } + + getChildren(node).forEach(child -> collectNodesWithStyleSheets(child, accumulator)); + } + + /** + * Determines if the specified node or any of its descendants contains + * the given stylesheet URI. + */ + public static boolean containsStylesheet(Node node, String uri) { + if (Objects.equals(getUserAgentStylesheet(node), uri)) { + return true; + } + + if (getStylesheets(node).contains(uri)) { + return true; + } + + for (Node child : getChildren(node)) { + return containsStylesheet(child, uri); + } + + return false; + } + + /** + * Null safe wrapper for calling the {@code addListener()} on a generic node. + */ + public static void addListener(@Nullable N node, + Function> obs, + InvalidationListener listener) { + if (node != null) { + obs.apply(node).addListener(listener); + } else { + LOGGER.log(Level.INFO, "node is null, this behavior is probably not expected"); + } + } + + /** + * Null safe wrapper for calling the {@code removeListener()} on a generic node. + */ + public static void removeListener(@Nullable N node, + Function> obs, + InvalidationListener listener) { + if (node != null) { + obs.apply(node).removeListener(listener); + } else { + LOGGER.log(Level.INFO, "node is null, this behavior is probably not expected"); + } + } + + /** + * Null safe wrapper for calling the {@code addListener()} on a generic node. + */ + public static void addListener(@Nullable N node, + Function> obs, + ChangeListener listener) { + if (node != null) { + obs.apply(node).addListener(listener); + } else { + LOGGER.log(Level.INFO, "node is null, this behavior is probably not expected"); + } + } + + /** + * Null safe wrapper for calling the {@code removeListener()} on a generic node. + */ + public static void removeListener(@Nullable N node, + Function> obs, + ChangeListener listener) { + if (node != null) { + obs.apply(node).addListener(listener); + } else { + LOGGER.log(Level.INFO, "node is null, this behavior is probably not expected"); + } + } + + /** + * Null safe wrapper for calling the {@code addEventFilter()} on a generic scene. + */ + public static void addEventFilter(@Nullable Scene scene, + EventType eventType, + EventHandler eventFilter) { + if (scene != null) { + scene.addEventFilter(eventType, eventFilter); + } else { + LOGGER.log(Level.INFO, "scene is null, this behavior is probably not expected"); + } + } + + /** + * Null safe wrapper for calling the {@code removeEventFilter()} on a generic scene. + */ + public static void removeEventFilter(@Nullable Scene scene, + EventType eventType, + EventHandler eventFilter) { + if (scene != null) { + scene.removeEventFilter(eventType, eventFilter); + } else { + LOGGER.log(Level.INFO, "scene is null, this behavior is probably not expected"); + } + } + + /** + * Null safe wrapper for calling the {@code addEventFilter()} on a generic parent. + */ + public static void addEventFilter(@Nullable Parent parent, + EventType eventType, + EventHandler eventFilter) { + if (parent != null) { + parent.addEventFilter(eventType, eventFilter); + } else { + LOGGER.log(Level.INFO, "parent is null, this behavior is probably not expected"); + } + } + + /** + * Null safe wrapper for calling the {@code removeEventFilter()} on a generic parent. + */ + public static void removeEventFilter(@Nullable Parent parent, + EventType eventType, + EventHandler eventFilter) { + if (parent != null) { + parent.removeEventFilter(eventType, eventFilter); + } else { + LOGGER.log(Level.INFO, "parent is null, this behavior is probably not expected"); + } + } +} diff --git a/connector/src/main/java/module-info.java b/connector/src/main/java/module-info.java new file mode 100755 index 0000000..9192b83 --- /dev/null +++ b/connector/src/main/java/module-info.java @@ -0,0 +1,11 @@ +module devtoolsfx.connector { + + requires javafx.controls; + requires static org.jspecify; + + exports devtoolsfx.connector; + exports devtoolsfx.event; + exports devtoolsfx.scenegraph; + exports devtoolsfx.scenegraph.attributes; + exports devtoolsfx.util; +} diff --git a/demo/pom.xml b/demo/pom.xml new file mode 100644 index 0000000..ca4e412 --- /dev/null +++ b/demo/pom.xml @@ -0,0 +1,46 @@ + + + 4.0.0 + + io.github.mkpaz + devtoolsfx + 1.0-SNAPSHOT + + + devtoolsfx-demo + + + + io.github.mkpaz + devtoolsfx-gui + ${project.version} + + + fr.brouillard.oss + cssfx + 11.4.0 + + + + + + + org.openjfx + javafx-maven-plugin + 0.0.8 + + + default-cli + + ${java.home}/bin/java + devtoolsfx.Launcher + + + + + + + + diff --git a/demo/src/main/java/devtoolsfx/Launcher.java b/demo/src/main/java/devtoolsfx/Launcher.java new file mode 100755 index 0000000..89f52e5 --- /dev/null +++ b/demo/src/main/java/devtoolsfx/Launcher.java @@ -0,0 +1,83 @@ +package devtoolsfx; + +import devtoolsfx.gui.GUI; +import fr.brouillard.oss.cssfx.CSSFX; +import javafx.application.Application; +import javafx.scene.Scene; +import javafx.scene.control.*; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; +import javafx.stage.Modality; +import javafx.stage.Stage; + +import java.util.Base64; +import java.util.Objects; +import java.util.Random; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static javafx.scene.control.Alert.AlertType; + +public class Launcher extends Application { + + static final String DATA_URI_PREFIX = "data:base64,"; + + public static void main(String[] args) { + launch(); + } + + @Override + public void start(Stage primaryStage) { + var root = new VBox(); + + var table = new TableView<>(); + table.getStylesheets().addAll(getResource("/demo.css")); + + var textArea = new TextArea(); + textArea.setVisible(false); + textArea.getStylesheets().add(toDataURI( + """ + .foo { + -fx-opacity: 1; + }""" + )); + + var infoDialogBtn = new Button("Info Dialog"); + infoDialogBtn.setOnAction(e -> { + Alert alert = new Alert(AlertType.CONFIRMATION, "Test", ButtonType.YES, ButtonType.NO); + alert.initModality(Modality.NONE); + alert.showAndWait(); + }); + + var testBtn = new Button("Test"); + testBtn.setOnAction(e -> { + textArea.setVisible(!textArea.isVisible()); + table.getStyleClass().add("foo-" + new Random().nextLong(100)); + }); + + root.getChildren().setAll( + table, + textArea, + new HBox(10, infoDialogBtn, testBtn) + ); + + var scene = new Scene(root, 800, 600); + scene.getStylesheets().add(getResource("/demo.css")); + primaryStage.setScene(scene); + primaryStage.setTitle("Demo"); + primaryStage.setOnShown(e -> GUI.openToolStage(primaryStage, getHostServices())); + primaryStage.show(); + + CSSFX.start(); + } + + static String getResource(String path) { + return Objects.requireNonNull(Launcher.class.getResource(path)).toString(); + } + + static String toDataURI(String css) { + if (css == null) { + throw new NullPointerException("CSS string cannot be null!"); + } + return DATA_URI_PREFIX + new String(Base64.getEncoder().encode(css.getBytes(UTF_8)), UTF_8); + } +} diff --git a/demo/src/main/java/module-info.java b/demo/src/main/java/module-info.java new file mode 100644 index 0000000..ab24472 --- /dev/null +++ b/demo/src/main/java/module-info.java @@ -0,0 +1,8 @@ +module devtoolsfx.demo { + + requires javafx.controls; + requires devtoolsfx.gui; + requires fr.brouillard.oss.cssfx; + + exports devtoolsfx; +} diff --git a/demo/src/main/resources/demo.css b/demo/src/main/resources/demo.css new file mode 100644 index 0000000..aa08bc5 --- /dev/null +++ b/demo/src/main/resources/demo.css @@ -0,0 +1,3 @@ +.foo { + -fx-padding: 10; +} diff --git a/gui/pom.xml b/gui/pom.xml new file mode 100644 index 0000000..1167189 --- /dev/null +++ b/gui/pom.xml @@ -0,0 +1,22 @@ + + + 4.0.0 + + io.github.mkpaz + devtoolsfx + 1.0-SNAPSHOT + + + devtoolsfx-gui + + + + io.github.mkpaz + devtoolsfx-connector + ${project.version} + + + + diff --git a/gui/src/main/java/devtoolsfx/gui/GUI.java b/gui/src/main/java/devtoolsfx/gui/GUI.java new file mode 100644 index 0000000..58ce446 --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/GUI.java @@ -0,0 +1,108 @@ +package devtoolsfx.gui; + +import devtoolsfx.connector.LocalConnector; +import javafx.application.HostServices; +import javafx.scene.Scene; +import javafx.stage.Stage; +import javafx.stage.WindowEvent; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.net.URL; +import java.util.Objects; + +/** + * The entry point for launching the dev tools GUI application. + */ +@NullMarked +public final class GUI { + + public static final String USER_AGENT_STYLESHEET = getResource("/index.css").toString(); + + public static final double DEFAULT_STAGE_WIDTH = 1024; + public static final double DEFAULT_STAGE_HEIGHT = 768; + + /** + * See @{@link #openToolStage(Stage, Preferences, String)}. + */ + public static void openToolStage(Stage primaryStage, HostServices hostServices) { + openToolStage(primaryStage, hostServices, null); + } + + /** + * See @{@link #openToolStage(Stage, Preferences, String)}. + */ + public static void openToolStage(Stage primaryStage, + HostServices hostServices, + @Nullable String applicationName) { + openToolStage(primaryStage, new Preferences(hostServices), applicationName); + } + + /** + * Starts the GUI in a separate window. + * + * @param primaryStage the primary stage of the monitored application + * @param preferences the initial GUI preferences + * @param applicationName the name of the monitored application + */ + public static void openToolStage(Stage primaryStage, + Preferences preferences, + @Nullable String applicationName) { + Objects.requireNonNull(primaryStage, "primaryStage can not be null"); + Objects.requireNonNull(preferences, "hostServices can not be null"); + + var toolPane = createToolPane(primaryStage, preferences, applicationName); + var scene = new Scene(toolPane, DEFAULT_STAGE_WIDTH, DEFAULT_STAGE_HEIGHT); + scene.setUserAgentStylesheet(USER_AGENT_STYLESHEET); + + var toolStage = new Stage(); + toolStage.setScene(scene); + toolStage.setTitle("devtoolsfx"); + toolStage.setOnShown(e -> toolPane.getConnector().start()); + + primaryStage.addEventHandler(WindowEvent.WINDOW_CLOSE_REQUEST, event -> toolStage.close()); + toolStage.show(); + } + + /** + * See @{@link #createToolPane(Stage, Preferences, String)}. + */ + public static ToolPane createToolPane(Stage primaryStage, HostServices hostServices) { + return createToolPane(primaryStage, hostServices, null); + } + + /** + * See @{@link #createToolPane(Stage, Preferences, String)}. + */ + public static ToolPane createToolPane(Stage primaryStage, + HostServices hostServices, + @Nullable String applicationName) { + return createToolPane(primaryStage, new Preferences(hostServices), applicationName); + } + + /** + * Creates the GUI tool pane to be displayed as embedded within the application window. + *

    + * The ToolPane requires its own independent user agent stylesheet. Use a Scene or SubScene to + * display it correctly. + * + * @param primaryStage the primary stage of the monitored application + * @param preferences the initial GUI preferences + * @param applicationName the name of the monitored application + */ + public static ToolPane createToolPane(Stage primaryStage, + Preferences preferences, + @Nullable String applicationName) { + Objects.requireNonNull(primaryStage, "primaryStage can not be null"); + Objects.requireNonNull(preferences, "preferences can not be null"); + + var connector = new LocalConnector(primaryStage, applicationName); + return new ToolPane(connector, preferences); + } + + /////////////////////////////////////////////////////////////////////////// + + private static URL getResource(String path) { + return Objects.requireNonNull(GUI.class.getResource(path)); + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/Preferences.java b/gui/src/main/java/devtoolsfx/gui/Preferences.java new file mode 100644 index 0000000..f3ea1fa --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/Preferences.java @@ -0,0 +1,235 @@ +package devtoolsfx.gui; + +import devtoolsfx.connector.Connector; +import devtoolsfx.connector.ConnectorOptions; +import devtoolsfx.connector.HighlightOptions; +import devtoolsfx.scenegraph.Element; +import javafx.application.HostServices; +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.IntegerProperty; +import javafx.beans.property.SimpleBooleanProperty; +import javafx.beans.property.SimpleIntegerProperty; +import javafx.scene.control.Control; +import javafx.scene.layout.Pane; +import javafx.stage.PopupWindow; +import org.jspecify.annotations.NullMarked; + +import java.util.Objects; + +@NullMarked +public class Preferences { + + public static final String JAVADOC_SEARCH_URI = "https://openjfx.io/javadoc/21/search.html"; + public static final String CSS_REFERENCE_BASE_URI = "https://openjfx.io/javadoc/22/javafx.graphics/javafx/scene/doc-files/cssref.html"; + public static final int MIN_EVENT_LOG_SIZE = 10; + public static final int MAX_EVENT_LOG_SIZE = 10_000_000; + public static final int DEFAULT_EVENT_LOG_SIZE = 10_000; + public static final boolean KEEP_ATTRIBUTES_SORT = true; + + protected final BooleanProperty autoRefreshSceneGraph = new SimpleBooleanProperty(true); + protected final BooleanProperty preventPopupAutoHide = new SimpleBooleanProperty(true); + protected final BooleanProperty collapseControls = new SimpleBooleanProperty(true); + protected final BooleanProperty collapsePanes = new SimpleBooleanProperty(false); + protected final BooleanProperty showLayoutBounds = new SimpleBooleanProperty(true); + protected final BooleanProperty showBoundsInParent = new SimpleBooleanProperty(true); + protected final BooleanProperty showBaseline = new SimpleBooleanProperty(true); + protected final BooleanProperty ignoreMouseTransparent = new SimpleBooleanProperty(false); + protected final BooleanProperty enableEventLog = new SimpleBooleanProperty(false); // non-UI + protected final IntegerProperty maxEventLogSize = new SimpleIntegerProperty(DEFAULT_EVENT_LOG_SIZE); + + protected final HostServices hostServices; + + public Preferences(HostServices hostServices) { + this.hostServices = Objects.requireNonNull(hostServices, "hostServices must not be null"); + } + + /** + * Returns the monitored application {@link HostServices}. + * This is necessary to display a URI in a web browser while avoiding + * a dependency on the {@code java.desktop} module. + */ + public HostServices getHostServices() { + return hostServices; + } + + /** + * Enables scene graph auto-refreshing. + */ + public BooleanProperty autoRefreshSceneGraphProperty() { + return autoRefreshSceneGraph; + } + + public boolean isAutoRefreshSceneGraph() { + return autoRefreshSceneGraph.get(); + } + + public void setAutoRefreshSceneGraph(boolean autoRefreshSceneGraph) { + this.autoRefreshSceneGraph.set(autoRefreshSceneGraph); + } + + /** + * Disables the {@link PopupWindow#autoHideProperty()} when the popup window appears. + * This allows inspection of the popup window content without accidentally hiding the window. + */ + public BooleanProperty preventPopupAutoHideProperty() { + return preventPopupAutoHide; + } + + public boolean isPreventPopupAutoHide() { + return preventPopupAutoHide.get(); + } + + public void setPreventPopupAutoHide(boolean preventPopupAutoHide) { + this.preventPopupAutoHide.set(preventPopupAutoHide); + } + + /** + * Enables collapsing of JavaFX {@link Control} type nodes by default. + */ + public BooleanProperty collapseControlsProperty() { + return collapseControls; + } + + public boolean isCollapseControls() { + return collapseControls.get(); + } + + public void setCollapseControls(boolean collapseControls) { + this.collapseControls.set(collapseControls); + } + + /** + * Enables collapsing of JavaFX {@link Pane} type nodes by default. + */ + public BooleanProperty collapsePanesProperty() { + return collapsePanes; + } + + public boolean getCollapsePanes() { + return collapsePanes.get(); + } + + public void setCollapsePanes(boolean collapsePanes) { + this.collapsePanes.set(collapsePanes); + } + + /** + * Enables highlighting the layoutBounds when selecting the element. + * See {@link Connector#selectNode(int, Element, HighlightOptions)}. + */ + public BooleanProperty showLayoutBoundsProperty() { + return showLayoutBounds; + } + + public boolean isShowLayoutBounds() { + return showLayoutBounds.get(); + } + + public void setShowLayoutBounds(boolean showLayoutBounds) { + this.showLayoutBounds.set(showLayoutBounds); + } + + /** + * Enables highlighting the boundInParent when selecting the element. + * See {@link Connector#selectNode(int, Element, HighlightOptions)}. + */ + public BooleanProperty showBoundsInParentProperty() { + return showBoundsInParent; + } + + public boolean isShowBoundsInParent() { + return showBoundsInParent.get(); + } + + public void setShowBoundsInParent(boolean showBoundsInParent) { + this.showBoundsInParent.set(showBoundsInParent); + } + + /** + * Enables highlighting the baselineOffset when selecting the element. + * See {@link Connector#selectNode(int, Element, HighlightOptions)}. + */ + public BooleanProperty showBaselineProperty() { + return showBaseline; + } + + public boolean isShowBaseline() { + return showBaseline.get(); + } + + public void setShowBaseline(boolean showBaseline) { + this.showBaseline.set(showBaseline); + } + + /** + * See {@link ConnectorOptions#isIgnoreMouseTransparent()}. + */ + public boolean isIgnoreMouseTransparent() { + return ignoreMouseTransparent.get(); + } + + public BooleanProperty ignoreMouseTransparentProperty() { + return ignoreMouseTransparent; + } + + public void setIgnoreMouseTransparent(boolean ignoreMouseTransparent) { + this.ignoreMouseTransparent.set(ignoreMouseTransparent); + } + + /** + * Enables or disables runtime event logging. + */ + public BooleanProperty enableEventLogProperty() { + return enableEventLog; + } + + public boolean isEnableEventLog() { + return enableEventLog.get(); + } + + public void setEnableEventLog(boolean enableEventLog) { + this.enableEventLog.set(enableEventLog); + } + + /** + * Sets the maximum size of the event log. + */ + public IntegerProperty maxEventLogSizeProperty() { + return maxEventLogSize; + } + + public int getMaxEventLogSize() { + return maxEventLogSize.get(); + } + + public void setMaxEventLogSize(int size) { + maxEventLogSize.set(size); + } + + @Override + public String toString() { + return "Preferences{" + + "autoRefreshSceneGraph=" + autoRefreshSceneGraph + + ", preventPopupAutoHide=" + preventPopupAutoHide + + ", collapseControls=" + collapseControls + + ", collapsePanes=" + collapsePanes + + ", showLayoutBounds=" + showLayoutBounds + + ", showBoundsInParent=" + showBoundsInParent + + ", showBaseline=" + showBaseline + + ", ignoreMouseTransparent=" + ignoreMouseTransparent + + ", enableEventLog=" + enableEventLog + + ", maxEventLogSize=" + maxEventLogSize + + ", hostServices=" + hostServices + + '}'; + } + + /////////////////////////////////////////////////////////////////////////// + + public HighlightOptions getHighlightOptions() { + return new HighlightOptions( + showLayoutBounds.get(), + showBoundsInParent.get(), + showBaseline.get() + ); + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/ToolPane.java b/gui/src/main/java/devtoolsfx/gui/ToolPane.java new file mode 100644 index 0000000..cc6ab92 --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/ToolPane.java @@ -0,0 +1,380 @@ +package devtoolsfx.gui; + +import devtoolsfx.connector.Connector; +import devtoolsfx.connector.ConnectorOptions; +import devtoolsfx.connector.Env; +import devtoolsfx.connector.HighlightOptions; +import devtoolsfx.event.*; +import devtoolsfx.gui.controls.TabLine; +import devtoolsfx.gui.env.EnvironmentTab; +import devtoolsfx.gui.eventlog.EventLogTab; +import devtoolsfx.gui.inspector.InspectorTab; +import devtoolsfx.gui.preferences.PreferencesTab; +import devtoolsfx.gui.style.StylesheetTab; +import devtoolsfx.gui.util.Formatters; +import devtoolsfx.scenegraph.Element; +import devtoolsfx.scenegraph.WindowProperties; +import devtoolsfx.scenegraph.attributes.AttributeCategory; +import javafx.animation.Animation; +import javafx.animation.KeyFrame; +import javafx.animation.Timeline; +import javafx.beans.value.ChangeListener; +import javafx.css.PseudoClass; +import javafx.scene.control.Button; +import javafx.scene.control.ContentDisplay; +import javafx.scene.layout.BorderPane; +import javafx.scene.layout.StackPane; +import javafx.util.Duration; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.lang.System.Logger; +import java.lang.System.Logger.Level; +import java.lang.Thread.UncaughtExceptionHandler; +import java.util.*; + +/** + * The embeddable development tools root node. + * It is also responsible for interacting with the {@link Connector}. + */ +@NullMarked +public final class ToolPane extends BorderPane { + + private static final Logger LOGGER = System.getLogger(ToolPane.class.getName()); + private static final PseudoClass ACTIVE = PseudoClass.getPseudoClass("active"); + + // we can't use close() because we are not in FXThread + private final Connector connector; + private final ConnectorAdapter connectorAdapter = new ConnectorAdapter(); + private final ConnectorOptions connectorOpts; + private final Preferences preferences; + private final Queue eventQueue = new ArrayDeque<>(); + + private final ChangeListener ignoreMouseTransparentListener; + private final ChangeListener preventPopupAutoHideListener; + private final Runnable refreshSelectionHandler; + + // tabs + private final TabLine tabLine = new TabLine( + InspectorTab.TAB_NAME, + EventLogTab.TAB_NAME, + StylesheetTab.TAB_NAME, + EnvironmentTab.TAB_NAME, + PreferencesTab.TAB_NAME + ); + private final StackPane tabs = new StackPane(); + private final InspectorTab inspectorTab; + private final EventLogTab eventLogTab; + private final StylesheetTab stylesheetTab; + private final EnvironmentTab environmentTab; + private final PreferencesTab preferencesTab; + private final Button inspectButton = new Button(); + + private long lastMousePos; + + public ToolPane(Connector connector, Preferences preferences) { + this.connector = Objects.requireNonNull(connector, "connector must not be null"); + this.preferences = Objects.requireNonNull(preferences, "preferences must not be null"); + this.connectorOpts = connector.getOptions(); + + // init after preferences, but before layout + inspectorTab = new InspectorTab(this); + eventLogTab = new EventLogTab(this); + stylesheetTab = new StylesheetTab(this); + environmentTab = new EnvironmentTab(this); + preferencesTab = new PreferencesTab(this); + + ignoreMouseTransparentListener = (obs, old, val) -> connectorOpts.setIgnoreMouseTransparent(val); + preventPopupAutoHideListener = (obs, old, val) -> connectorOpts.setPreventPopupAutoHide(val); + refreshSelectionHandler = () -> getConnector().refreshSelection(); + + createLayout(); + initListeners(); + + getStylesheets().add(GUI.USER_AGENT_STYLESHEET); + tabLine.selectTab(InspectorTab.TAB_NAME); + startListenToEvents(false); + } + + /** + * Returns the GUI preferences. + */ + public Preferences getPreferences() { + return preferences; + } + + /** + * Returns the selected scene graph tree element. + */ + public @Nullable Element getSelectedElement() { + return inspectorTab.getSelectedTreeElement(); + } + + /** + * Returns the wrapper that groups connector methods to avoid name conflicts + * and encapsulates the logic in a single location. + */ + public ConnectorAdapter getConnector() { + return connectorAdapter; + } + + public class ConnectorAdapter { + + /** + * See {@link Connector#start()}. + */ + public void start() { + connector.start(); + } + + /** + * See {@link Connector#stop()}}. + */ + public void stop() { + connector.start(); + } + + /** + * See {@link Connector#getEnv()}}. + */ + public Env getEnv() { + return connector.getEnv(); + } + + /** + * See {@link Connector#selectNode(int, Element, HighlightOptions)}}. + */ + public void selectElement(int uid, Element element) { + inspectorTab.clearAttributes(); + + if (element.isWindowElement()) { + connector.selectWindow(uid); + } + + if (element.isNodeElement()) { + connector.selectNode(uid, element, preferences.getHighlightOptions()); + } + } + + /** + * See {@link Connector#reloadSelectedAttributes(int, AttributeCategory, String)}}. + */ + public void reloadSelectedAttributes(@Nullable AttributeCategory category, @Nullable String property) { + Element selected = inspectorTab.getSelectedTreeElement(); + if (selected == null) { + return; + } + + int uid = inspectorTab.getWindow(selected); + if (uid == 0) { + return; + } + + connector.reloadSelectedAttributes(uid, category, property); + } + + /** + * See {@link Connector#clearSelection(int)}}. + */ + public void clearSelection(int uid) { + connector.clearSelection(uid); + } + + public void refreshSelection() { + Element selected = inspectorTab.getSelectedTreeElement(); + if (selected == null) { + return; + } + + int uid = inspectorTab.getWindow(selected); + if (uid == 0) { + return; + } + + selectElement(uid, selected); + } + + /** + * See {@link Connector#hideWindow(int)}}. + */ + public void hideWindow(int uid) { + connector.hideWindow(uid); + } + + /** + * Returns the identifiers of the currently monitored windows. + */ + public List getMonitorIdentifiers() { + return connector.getEventSources().stream().map(EventSource::uid).toList(); + } + + /** + * See {@link Connector#getStyledElements(int)}}. + */ + public Map.@Nullable Entry> getStyledElements(int uid) { + return connector.getStyledElements(uid); + } + + /** + * See {@link Connector#getUserAgentStylesheet()}}. + */ + public String getUserAgentStylesheet() { + return connector.getUserAgentStylesheet(); + } + + /** + * See {@link Connector#getResource(int, String)}}. + */ + public @Nullable String getResource(int uid, String uri) { + return connector.getResource(uid, uri); + } + + /** + * See {@link Connector#getDeclaringClass(String, String)}}. + */ + public @Nullable String getDeclaringClass(String className, String property) { + return connector.getDeclaringClass(className, property); + } + } + + /** + * Handles the GUI exceptions. + *

    + * Note: We can't use the {@link UncaughtExceptionHandler} because the embedded GUI operates + * in the FXThread and the target application may or want to set its own exception handler. + */ + public void handleException(Exception e) { + LOGGER.log(Level.WARNING, Formatters.exceptionToString(e)); + } + + /////////////////////////////////////////////////////////////////////////// + // UI construction // + /////////////////////////////////////////////////////////////////////////// + + private void createLayout() { + var icon = new StackPane(); + icon.getStyleClass().add("icon"); + inspectButton.setGraphic(icon); + + inspectButton.setContentDisplay(ContentDisplay.GRAPHIC_ONLY); + inspectButton.setId("inspect-button"); + + tabLine.getChildren().addFirst(inspectButton); + tabs.getChildren().setAll( + inspectorTab, + eventLogTab, + stylesheetTab, + environmentTab, + preferencesTab + ); + + setTop(tabLine); + setCenter(tabs); + } + + private void initListeners() { + preferences.ignoreMouseTransparentProperty().addListener(ignoreMouseTransparentListener); + connectorOpts.setIgnoreMouseTransparent(preferences.isIgnoreMouseTransparent()); + + preferences.preventPopupAutoHideProperty().addListener(preventPopupAutoHideListener); + connectorOpts.setPreventPopupAutoHide(preferences.isPreventPopupAutoHide()); + + preferences.showLayoutBoundsProperty().subscribe(refreshSelectionHandler); + preferences.showBoundsInParentProperty().subscribe(refreshSelectionHandler); + preferences.showBaselineProperty().subscribe(refreshSelectionHandler); + + tabLine.setOnTabSelect(tab -> { + switch (tab) { + case InspectorTab.TAB_NAME -> inspectorTab.toFront(); + case EventLogTab.TAB_NAME -> eventLogTab.toFront(); + case StylesheetTab.TAB_NAME -> { + stylesheetTab.toFront(); + stylesheetTab.update(); + } + case EnvironmentTab.TAB_NAME -> { + environmentTab.toFront(); + environmentTab.update(); + } + case PreferencesTab.TAB_NAME -> preferencesTab.toFront(); + } + }); + + inspectButton.setOnAction(e -> { + boolean enabled = !connectorOpts.isInspectMode(); + connectorOpts.setInspectMode(enabled); + inspectButton.pseudoClassStateChanged(ACTIVE, enabled); + }); + } + + /////////////////////////////////////////////////////////////////////////// + // Event Handling // + /////////////////////////////////////////////////////////////////////////// + + @SuppressWarnings("SameParameterValue") + private void startListenToEvents(boolean useQueue) { + if (useQueue) { + // Optionally, we can update the GUI on a separate queue, which adds a small delay. + // This is how it was implemented before and was left as an option. + Timeline eventDispatcher = new Timeline(new KeyFrame(Duration.millis(60), event -> { + // no need to synchronize + while (!eventQueue.isEmpty()) { + try { + dispatchEvent(eventQueue.poll()); + } catch (Exception e) { + handleException(e); + } + } + })); + + eventDispatcher.setCycleCount(Animation.INDEFINITE); + eventDispatcher.play(); + } + + connector.getEventBus().subscribe(ConnectorEvent.class, event -> { + if (event instanceof MousePosEvent) { + // traffic protection + if (System.currentTimeMillis() - lastMousePos < 500) { + return; + } + lastMousePos = System.currentTimeMillis(); + } + + if (useQueue) { + eventQueue.offer(event); + } else { + dispatchEvent(event); + } + }); + } + + private void dispatchEvent(ConnectorEvent connectorEvent) { + eventLogTab.offer(connectorEvent); + + switch (connectorEvent) { + case AttributeListEvent event -> inspectorTab.setAttributes( + event.category(), event.attributes() + ); + case AttributeUpdatedEvent event -> inspectorTab.updateAttribute( + event.category(), event.attribute() + ); + case NodeAddedEvent event -> inspectorTab.addTreeElement(event.element()); + case NodeRemovedEvent event -> inspectorTab.removeTreeElement(event.element()); + case NodeSelectedEvent event -> { + connectorOpts.setInspectMode(false); + inspectButton.pseudoClassStateChanged(ACTIVE, false); + inspectorTab.selectTreeElement(event.element()); + } + case NodeStyleClassEvent event -> inspectorTab.updateTreeElementStyleClass( + event.element(), event.styleClass() + ); + case NodeVisibilityEvent event -> inspectorTab.updateTreeElementVisibilityState( + event.element(), event.visible() + ); + case RootChangedEvent event -> inspectorTab.addOrUpdateWindow(event.element()); + case WindowClosedEvent event -> inspectorTab.removeWindow(event.eventSource().uid()); + default -> { + // if there's no specific event here, then it's just for logging + } + } + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/controls/ColorIndicator.java b/gui/src/main/java/devtoolsfx/gui/controls/ColorIndicator.java new file mode 100644 index 0000000..9eacd1b --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/controls/ColorIndicator.java @@ -0,0 +1,16 @@ +package devtoolsfx.gui.controls; + +import javafx.scene.paint.Color; +import javafx.scene.shape.Rectangle; + + +public final class ColorIndicator extends Rectangle { + + public ColorIndicator(Color color) { + super(); + getStyleClass().add("color-indicator"); + setFill(color); + setWidth(10); + setHeight(10); + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/controls/Dialog.java b/gui/src/main/java/devtoolsfx/gui/controls/Dialog.java new file mode 100644 index 0000000..22e845d --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/controls/Dialog.java @@ -0,0 +1,49 @@ +package devtoolsfx.gui.controls; + +import devtoolsfx.gui.GUI; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.stage.Modality; +import javafx.stage.Stage; +import org.jspecify.annotations.NullMarked; + +import java.util.Objects; + +/** + * A utility wrapper for modal dialogs. + */ +@NullMarked +public final class Dialog

    extends Stage { + + private static final double DEFAULT_WIDTH = 640; + private static final double DEFAULT_HEIGHT = 480; + + private final P root; + + public Dialog(P root) { + this(root, "", DEFAULT_WIDTH, DEFAULT_HEIGHT); + } + + public Dialog(P root, String title, double width, double height) { + super(); + + this.root = Objects.requireNonNull(root, "parent node cannot be null"); + createLayout(root, title, width, height); + } + + public P getRoot() { + return root; + } + + private void createLayout(P parent, String title, double width, double height) { + setTitle(title); + initModality(Modality.NONE); + + var scene = new Scene(parent); + scene.getStylesheets().add(GUI.USER_AGENT_STYLESHEET); + + setWidth(width); + setHeight(height); + setScene(scene); + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/controls/FilterField.java b/gui/src/main/java/devtoolsfx/gui/controls/FilterField.java new file mode 100644 index 0000000..23edff4 --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/controls/FilterField.java @@ -0,0 +1,76 @@ +package devtoolsfx.gui.controls; + +import javafx.geometry.Pos; +import javafx.scene.control.Button; +import javafx.scene.control.ContentDisplay; +import javafx.scene.control.TextField; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Priority; +import javafx.scene.layout.StackPane; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +@NullMarked +public final class FilterField extends HBox { + + private final TextField textField = new TextField(); + private final Button clearButton = new Button(); + + public FilterField() { + super(); + + createLayout(); + initListeners(); + } + + public String getText() { + return textField.getText() != null ? textField.getText().trim() : ""; + } + + public void setText(@Nullable String text) { + textField.setText(text != null ? text.trim() : ""); + } + + public void setPromptText(String text) { + textField.setPromptText(text); + } + + public void setOnTextChange(@Nullable Runnable handler) { + if (handler != null) { + textField.setOnKeyReleased(event -> handler.run()); + } + } + + public void setOnClearButtonClick(@Nullable Runnable handler) { + if (handler != null) { + clearButton.setOnMousePressed(event -> handler.run()); + } + } + + /////////////////////////////////////////////////////////////////////////// + + private void createLayout() { + textField.setMaxWidth(Double.MAX_VALUE); + HBox.setHgrow(textField, Priority.ALWAYS); + textField.setContextMenu(new TextInputContextMenu(textField)); + + var icon = new StackPane(); + icon.getStyleClass().add("icon"); + clearButton.setGraphic(icon); + + clearButton.getStyleClass().add("clear-button"); + clearButton.setContentDisplay(ContentDisplay.GRAPHIC_ONLY); + HBox.setHgrow(clearButton, Priority.NEVER); + clearButton.setVisible(false); + clearButton.setManaged(false); + + getStyleClass().add("filter-field"); + setAlignment(Pos.CENTER_LEFT); + getChildren().addAll(textField, clearButton); + } + + private void initListeners() { + clearButton.visibleProperty().bind(textField.textProperty().isEmpty().not()); + clearButton.managedProperty().bind(textField.textProperty().isEmpty()); + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/controls/FilterableTreeItem.java b/gui/src/main/java/devtoolsfx/gui/controls/FilterableTreeItem.java new file mode 100644 index 0000000..29f5f74 --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/controls/FilterableTreeItem.java @@ -0,0 +1,49 @@ +package devtoolsfx.gui.controls; + +import javafx.beans.binding.Bindings; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.collections.transformation.FilteredList; +import javafx.scene.control.TreeItem; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.Collections; +import java.util.List; +import java.util.function.Predicate; + +@NullMarked +public final class FilterableTreeItem extends TreeItem { + + private final ObservableList> sourceList = FXCollections.observableArrayList(); + private final FilteredList> filteredList = new FilteredList<>(sourceList); + + public FilterableTreeItem() { + this(null); + } + + public FilterableTreeItem(@Nullable T value) { + super(value); + Bindings.bindContent(getChildren(), filteredList); + } + + public void setItems(List> items) { + sourceList.setAll(items); + } + + public List> getChildrenUnmodifiable() { + return Collections.unmodifiableList(sourceList); + } + + public boolean isEmpty() { + return getChildren().isEmpty(); + } + + public void clear() { + sourceList.clear(); + } + + public void setFilterPredicate(@Nullable Predicate> predicate) { + filteredList.setPredicate(predicate); + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/controls/TabLine.java b/gui/src/main/java/devtoolsfx/gui/controls/TabLine.java new file mode 100644 index 0000000..2b42868 --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/controls/TabLine.java @@ -0,0 +1,69 @@ +package devtoolsfx.gui.controls; + +import javafx.beans.value.ChangeListener; +import javafx.scene.control.Toggle; +import javafx.scene.control.ToggleButton; +import javafx.scene.control.ToggleGroup; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Priority; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Objects; +import java.util.function.Consumer; + +@NullMarked +public final class TabLine extends HBox { + + private @Nullable Consumer selectionHandler; + + private final ToggleGroup group = new ToggleGroup(); + private final ChangeListener<@Nullable Toggle> selectionListener = (obs, old, val) -> { + if (val == null && old != null) { + old.setSelected(true); + return; + } + + if (selectionHandler != null && val != null && val.getUserData() instanceof String tab) { + selectionHandler.accept(tab); + } + }; + + public TabLine(String... tabs) { + super(); + + getStyleClass().add("tab-line"); + createLayout(tabs); + } + + public void selectTab(String tab) { + group.getToggles().stream() + .filter(t -> Objects.equals(t.getUserData(), tab) && !t.isSelected()) + .findFirst() + .ifPresent(t -> t.setSelected(true)); + } + + public void setOnTabSelect(@Nullable Consumer selectionHandler) { + this.selectionHandler = selectionHandler; + } + + /////////////////////////////////////////////////////////////////////////// + + private void createLayout(String... tabs) { + var buttons = new ArrayList(tabs.length); + for (var tab : tabs) { + var button = new ToggleButton(tab); + button.setMaxWidth(Double.MAX_VALUE); + button.setUserData(tab); + HBox.setHgrow(button, Priority.ALWAYS); + + buttons.add(button); + } + + group.getToggles().setAll(buttons); + group.selectedToggleProperty().addListener(selectionListener); + + getChildren().setAll(buttons); + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/controls/TextInputContextMenu.java b/gui/src/main/java/devtoolsfx/gui/controls/TextInputContextMenu.java new file mode 100644 index 0000000..4412421 --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/controls/TextInputContextMenu.java @@ -0,0 +1,72 @@ +package devtoolsfx.gui.controls; + +import devtoolsfx.connector.ConnectorOptions; +import javafx.scene.control.*; + +import java.util.function.Consumer; + +/** + * There is no API to modify the default text input context menu, so this serves as a replacement. + * However, it still lacks internationalization (i18n) support because it is not public. + */ +public class TextInputContextMenu extends ContextMenu { + + public TextInputContextMenu(TextInputControl control) { + super(); + + setId(ConnectorOptions.AUX_NODE_ID_PREFIX + "textInputContextMenu"); + createMenu(control); + } + + private void createMenu(TextInputControl control) { + var undo = menuItem("Undo", control, TextInputControl::undo); + undo.setDisable(true); + + var redo = menuItem("Redo", control, TextInputControl::redo); + redo.setDisable(true); + + var cut = menuItem("Cut", control, TextInputControl::cut); + cut.setDisable(true); + + var copy = menuItem("Copy", control, TextInputControl::copy); + copy.setDisable(true); + + var paste = menuItem("Paste", control, TextInputControl::paste); + + var selectAll = menuItem("Select All", control, TextInputControl::selectAll); + selectAll.setDisable(true); + + var delete = menuItem("Delete", control, this::deleteSelectedText); + delete.setDisable(true); + + control.undoableProperty().addListener((obs, old, val) -> undo.setDisable(!val)); + control.redoableProperty().addListener((obs, old, val) -> redo.setDisable(!val)); + control.selectionProperty().addListener((obs, old, val) -> { + cut.setDisable(val.getLength() == 0); + copy.setDisable(val.getLength() == 0); + delete.setDisable(val.getLength() == 0); + selectAll.setDisable(val.getLength() == val.getEnd()); + }); + + getItems().setAll(undo, redo, cut, copy, paste, delete, new SeparatorMenuItem(), selectAll); + } + + protected MenuItem menuItem(String text, TextInputControl control, Consumer action) { + var item = new MenuItem(text); + item.setOnAction(e -> action.accept(control)); + return item; + } + + protected void deleteSelectedText(TextInputControl control) { + IndexRange range = control.getSelection(); + if (range.getLength() == 0) { + return; + } + + String text = control.getText(); + String newText = text.substring(0, range.getStart()) + text.substring(range.getEnd()); + + control.setText(newText); + control.positionCaret(range.getStart()); + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/controls/TextView.java b/gui/src/main/java/devtoolsfx/gui/controls/TextView.java new file mode 100644 index 0000000..e6665ed --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/controls/TextView.java @@ -0,0 +1,37 @@ +package devtoolsfx.gui.controls; + +import devtoolsfx.connector.ConnectorOptions; +import javafx.scene.control.TextArea; +import javafx.scene.layout.Priority; +import javafx.scene.layout.VBox; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +/** + * A component for displaying text (monospace by default). + */ +@NullMarked +public class TextView extends VBox { + + private final TextArea textArea = new TextArea(); + + public TextView() { + super(); + + createLayout(); + } + + public void setText(@Nullable String text) { + textArea.setText(text); + } + + private void createLayout() { + textArea.setEditable(false); + textArea.setWrapText(true); + VBox.setVgrow(textArea, Priority.ALWAYS); + + getChildren().setAll(textArea); + setId(ConnectorOptions.AUX_NODE_ID_PREFIX + "textView"); + getStyleClass().add("text-view"); + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/env/EnvironmentTab.java b/gui/src/main/java/devtoolsfx/gui/env/EnvironmentTab.java new file mode 100644 index 0000000..75f4c88 --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/env/EnvironmentTab.java @@ -0,0 +1,241 @@ +package devtoolsfx.gui.env; + +import devtoolsfx.connector.ConnectorOptions; +import devtoolsfx.connector.Env; +import devtoolsfx.connector.KeyValue; +import devtoolsfx.gui.ToolPane; +import devtoolsfx.gui.controls.Dialog; +import devtoolsfx.gui.controls.FilterField; +import devtoolsfx.gui.controls.FilterableTreeItem; +import devtoolsfx.gui.controls.TextView; +import devtoolsfx.gui.util.GUIHelpers; +import javafx.beans.property.SimpleStringProperty; +import javafx.beans.value.ObservableValue; +import javafx.css.PseudoClass; +import javafx.scene.control.*; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyCodeCombination; +import javafx.scene.input.KeyCombination; +import javafx.scene.input.MouseButton; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Priority; +import javafx.scene.layout.Region; +import javafx.scene.layout.VBox; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.Collection; +import java.util.List; +import java.util.function.Function; +import java.util.stream.Stream; + +@NullMarked +public class EnvironmentTab extends VBox { + + public static final String TAB_NAME = "Environment"; + + private static final int MIN_FILTER_LENGTH = 3; + private static final PseudoClass GROUP = PseudoClass.getPseudoClass("group"); + private static final PseudoClass LEAF = PseudoClass.getPseudoClass("leaf"); + + private final FilterField filterField = new FilterField(); + private final TreeTableView kvTable = new TreeTableView<>(); + private final FilterableTreeItem treeRoot = new FilterableTreeItem<>(); + private final FilterableTreeItem platformRoot = new FilterableTreeItem<>( + new KeyValue("Platform", null) + ); + private final FilterableTreeItem propertiesRoot = new FilterableTreeItem<>( + new KeyValue("System Properties", null) + ); + private final FilterableTreeItem envVariablesRoot = new FilterableTreeItem<>( + new KeyValue("Environment Variables", null) + ); + private @Nullable Dialog textViewDialog = null; + + private final Env env; + + public EnvironmentTab(ToolPane toolPane) { + super(); + + this.env = toolPane.getConnector().getEnv(); + + createLayout(); + initListeners(); + } + + public void update() { + var platformProps = Stream.of( + env.getConditionalFeatures(), + env.getPlatformPreferences(), + env.getOtherPlatformProperties() + ) + .flatMap(Collection::stream) + .sorted() + .map(TreeItem::new) + .toList(); + platformRoot.setItems(platformProps); + + var systemProps = env.getSystemProperties().stream() + .sorted() + .map(TreeItem::new) + .toList(); + propertiesRoot.setItems(systemProps); + + var envVariables = env.getEnvVariables().stream() + .sorted() + .map(TreeItem::new) + .toList(); + envVariablesRoot.setItems(envVariables); + + setFilter(filterField.getText()); + } + + /////////////////////////////////////////////////////////////////////////// + + private void createLayout() { + filterField.setPromptText("filter"); + HBox.setHgrow(filterField, Priority.ALWAYS); + filterField.setMinHeight(Region.USE_PREF_SIZE); + filterField.setMaxHeight(Region.USE_PREF_SIZE); + + var filterBox = new HBox(filterField); + filterBox.getStyleClass().add("filter"); + filterBox.setFillHeight(true); + VBox.setVgrow(filterBox, Priority.NEVER); + + platformRoot.setExpanded(true); + propertiesRoot.setExpanded(true); + envVariablesRoot.setExpanded(true); + + treeRoot.setItems(List.of(platformRoot, propertiesRoot, envVariablesRoot)); + kvTable.setRoot(treeRoot); + kvTable.setShowRoot(false); + + createTableColumns(); + kvTable.setColumnResizePolicy(TreeTableView.CONSTRAINED_RESIZE_POLICY_FLEX_LAST_COLUMN); + kvTable.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); + kvTable.setContextMenu(createContextMenu()); + VBox.setVgrow(kvTable, Priority.ALWAYS); + + setId("environment-tab"); + getStyleClass().setAll("tab"); + getChildren().setAll(filterBox, kvTable); + } + + private void initListeners() { + filterField.setOnTextChange(() -> setFilter(filterField.getText())); + filterField.setOnClearButtonClick(() -> { + filterField.setText(null); + setFilter(null); + }); + + kvTable.setOnMouseClicked(event -> { + if (MouseButton.PRIMARY.equals(event.getButton()) && event.getClickCount() == 2 && !kvTable.getSelectionModel().isEmpty()) { + var item = kvTable.getSelectionModel().getSelectedItem(); + if (item.getValue().value() == null) { + return; + } + + var dialog = getOrCreateTextViewDialog(); + dialog.getRoot().setText(item.getValue().key() + "=" + item.getValue().value()); + dialog.show(); + dialog.toFront(); + } + }); + + kvTable.setOnKeyPressed(e -> { + if (new KeyCodeCombination(KeyCode.C, KeyCombination.CONTROL_ANY).match(e)) { + GUIHelpers.copySelectedRowsToClipboard(kvTable, kv -> kv.key() + "=" + kv.value()); + } + }); + } + + @SuppressWarnings("unchecked") + private void createTableColumns() { + var keyCol = new TreeTableColumn("Property"); + keyCol.setCellValueFactory(param -> columnMapper(param, KeyValue::key)); + keyCol.setCellFactory(c -> new TreeTableCell<>() { + { + getStyleClass().add("key-cell"); + } + + @Override + protected void updateItem(@Nullable String key, boolean empty) { + super.updateItem(key, empty); + + if (empty) { + setText(null); + return; + } + + pseudoClassStateChanged(LEAF, getTableRow().getTreeItem().isLeaf()); + getTableRow().pseudoClassStateChanged(GROUP, getTableRow().getTreeItem() instanceof FilterableTreeItem); + setText(key); + } + }); + keyCol.setSortable(false); + keyCol.setReorderable(false); + keyCol.setPrefWidth(30); + + var valueCol = new TreeTableColumn("Value"); + valueCol.setCellValueFactory(param -> columnMapper(param, KeyValue::value)); + valueCol.setSortable(false); + valueCol.setReorderable(false); + + kvTable.getColumns().setAll(keyCol, valueCol); + } + + private ContextMenu createContextMenu() { + var refresh = new MenuItem("Refresh"); + refresh.setOnAction(e -> update()); + + var contextMenu = new ContextMenu(); + contextMenu.setId(ConnectorOptions.AUX_NODE_ID_PREFIX + "envTableOptionsMenu"); + contextMenu.getItems().addAll(refresh); + + return contextMenu; + } + + private void setFilter(@Nullable String filter) { + if (filter != null && filter.length() >= MIN_FILTER_LENGTH) { + platformRoot.setFilterPredicate(item -> containsIgnoreCase(item.getValue().key(), filter)); + propertiesRoot.setFilterPredicate(item -> containsIgnoreCase(item.getValue().key(), filter)); + envVariablesRoot.setFilterPredicate(item -> containsIgnoreCase(item.getValue().key(), filter)); + } else { + platformRoot.setFilterPredicate(null); + propertiesRoot.setFilterPredicate(null); + envVariablesRoot.setFilterPredicate(null); + } + + refreshRootFilter(); + } + + private void refreshRootFilter() { + treeRoot.setFilterPredicate(null); + treeRoot.setFilterPredicate( + item -> item instanceof FilterableTreeItem filterable && !filterable.isEmpty() + ); + } + + private > ObservableValue<@Nullable String> columnMapper( + T cdf, Function mapper) { + + if (cdf.getValue() == null || cdf.getValue().getValue() == null) { + return new SimpleStringProperty(null); + } + + return new SimpleStringProperty(mapper.apply(cdf.getValue().getValue())); + } + + private Dialog getOrCreateTextViewDialog() { + if (textViewDialog == null) { + textViewDialog = new Dialog<>(new TextView(), "Details", 640, 480); + } + + return textViewDialog; + } + + private boolean containsIgnoreCase(@Nullable String str, @Nullable String subStr) { + return str != null && (subStr == null || str.toLowerCase().contains(subStr.toLowerCase())); + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/eventlog/EventLogTab.java b/gui/src/main/java/devtoolsfx/gui/eventlog/EventLogTab.java new file mode 100644 index 0000000..d4d9b8a --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/eventlog/EventLogTab.java @@ -0,0 +1,239 @@ +package devtoolsfx.gui.eventlog; + +import devtoolsfx.event.ConnectorEvent; +import devtoolsfx.gui.ToolPane; +import devtoolsfx.gui.controls.Dialog; +import devtoolsfx.gui.controls.FilterField; +import devtoolsfx.gui.controls.TextView; +import devtoolsfx.gui.util.Formatters; +import devtoolsfx.gui.util.GUIHelpers; +import javafx.css.PseudoClass; + +import javafx.scene.control.*; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyCodeCombination; +import javafx.scene.input.KeyCombination; +import javafx.scene.input.MouseButton; +import javafx.scene.layout.*; +import javafx.stage.FileChooser; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.function.Supplier; + +@NullMarked +public final class EventLogTab extends VBox { + + public static final String TAB_NAME = "Events"; + private static final PseudoClass STARTED = PseudoClass.getPseudoClass("started"); + private static final int MIN_FILTER_LENGTH = 3; + private static final int MAX_NUMBER_OF_LINES = 3; + + private final ToolPane toolPane; + private final Log log; + + private final ListView logView = new ListView<>(); + private final Button startStopButton = new Button(); + private final Button clearButton = new Button(); + private final Button exportButton = new Button(); + private final FilterField filterField = new FilterField(); + private final OptionsMenuButton optionsMenu = new OptionsMenuButton(e -> { + updateFilter(); + updateStatusLabel(); + }); + private final Label statusLabel = new Label(); + private @Nullable Dialog textViewDialog = null; + + public EventLogTab(ToolPane toolPane) { + super(); + + this.toolPane = toolPane; + this.log = new Log(toolPane.getPreferences().getMaxEventLogSize()); + + createLayout(); + initListeners(); + + updateFilter(); + updateStatusLabel(); + } + + public void offer(ConnectorEvent event) { + if (toolPane.getPreferences().isEnableEventLog()) { + log.add(Log.Entry.of(event)); + updateStatusLabel(); + } + } + + /////////////////////////////////////////////////////////////////////////// + + private void createLayout() { + Supplier iconGenerator = () -> { + var pane = new StackPane(); + pane.getStyleClass().add("icon"); + return pane; + }; + + startStopButton.setGraphic(iconGenerator.get()); + startStopButton.setContentDisplay(ContentDisplay.GRAPHIC_ONLY); + startStopButton.getStyleClass().add("start-stop-button"); + + clearButton.setGraphic(iconGenerator.get()); + clearButton.setContentDisplay(ContentDisplay.GRAPHIC_ONLY); + clearButton.getStyleClass().add("clear-button"); + + exportButton.setGraphic(iconGenerator.get()); + exportButton.setContentDisplay(ContentDisplay.GRAPHIC_ONLY); + exportButton.getStyleClass().add("export-button"); + + filterField.setPromptText("filter"); + HBox.setHgrow(filterField, Priority.ALWAYS); + filterField.setMinHeight(Region.USE_PREF_SIZE); + filterField.setMaxHeight(Region.USE_PREF_SIZE); + + var controlsBox = new HBox(); + controlsBox.getStyleClass().add("controls"); + controlsBox.getChildren().setAll(startStopButton, clearButton, exportButton, filterField, optionsMenu); + VBox.setVgrow(controlsBox, Priority.NEVER); + + logView.getStyleClass().add("log-view"); + logView.setItems(log.getFilteredEntries()); + logView.setCellFactory(c -> new ListCell<>() { + @Override + protected void updateItem(Log.Entry entry, boolean empty) { + super.updateItem(entry, empty); + setText(!empty + ? Formatters.limitNumberOfLines(entry.toLogString(), MAX_NUMBER_OF_LINES, "\n...") + : null + ); + } + }); + VBox.setVgrow(logView, Priority.ALWAYS); + + var statusBar = new HBox(statusLabel); + statusBar.getStyleClass().add("status-bar"); + VBox.setVgrow(statusBar, Priority.NEVER); + updateStatusLabel(); + + setId("event-log-tab"); + getStyleClass().setAll("tab"); + getChildren().setAll(controlsBox, logView, statusBar); + } + + private void initListeners() { + startStopButton.setOnAction(e -> { + boolean nextState = !toolPane.getPreferences().isEnableEventLog(); + toolPane.getPreferences().setEnableEventLog(nextState); + startStopButton.pseudoClassStateChanged(STARTED, nextState); + + updateFilter(); + updateStatusLabel(); + }); + + clearButton.setOnAction(e -> { + log.clear(); + + updateFilter(); + updateStatusLabel(); + }); + clearButton.disableProperty().bind(log.emptyProperty()); + + exportButton.disableProperty().bind(log.emptyProperty()); + exportButton.setOnAction(event -> { + var dialog = new FileChooser(); + dialog.setTitle("Save File"); + dialog.setInitialFileName("event-log.txt"); + dialog.setInitialDirectory(Paths.get(System.getProperty("user.home")).toFile()); + dialog.getExtensionFilters().addAll( + new FileChooser.ExtensionFilter("Text Files", "*.txt"), + new FileChooser.ExtensionFilter("All Files", "*.*") + ); + + var file = dialog.showSaveDialog(exportButton.getScene().getWindow()); + if (file != null) { + exportLog(file); + } + }); + + filterField.setOnTextChange(() -> { + updateFilter(); + updateStatusLabel(); + }); + filterField.setOnClearButtonClick(() -> filterField.setText("")); + + logView.setOnMouseClicked(event -> { + if (MouseButton.PRIMARY.equals(event.getButton()) && event.getClickCount() == 2 && !logView.getSelectionModel().isEmpty()) { + var entry = logView.getSelectionModel().getSelectedItem(); + var dialog = getOrCreateTextViewDialog(); + dialog.getRoot().setText(String.valueOf(entry)); + dialog.show(); + dialog.toFront(); + } + }); + logView.setOnKeyPressed(e -> { + if (new KeyCodeCombination(KeyCode.C, KeyCombination.CONTROL_ANY).match(e)) { + GUIHelpers.copySelectedRowsToClipboard(logView, Log.Entry::toLogString); + } + }); + + toolPane.getPreferences().maxEventLogSizeProperty().addListener( + (obs, old, val) -> log.setMaxSize((int) val) + ); + } + + @SuppressWarnings("RedundantIfStatement") + private void updateFilter() { + log.setFilterPredicate(entry -> { + if (!optionsMenu.isEventEnabled(entry.event())) { + return false; + } + + if (optionsMenu.isFilterSelectedOnly() && (toolPane.getSelectedElement() == null + || !entry.matches(toolPane.getSelectedElement()))) { + return false; + } + + var text = filterField.getText(); + if ((text.length() >= MIN_FILTER_LENGTH && !entry.matches(text))) { + return false; + } + + return true; + }); + } + + private void updateStatusLabel() { + int totalSize = log.getEntries().size(); + int filteredSize = log.getFilteredEntries().size(); + statusLabel.setText(filteredSize == totalSize + ? totalSize + " entries" + : filteredSize + "/" + totalSize + " entries" + ); + } + + private void exportLog(File file) { + var sb = new StringBuilder(); + for (var entry : new ArrayList<>(log.getFilteredEntries())) { + sb.append(entry.toLogString()); + sb.append("\n"); + } + + try { + Files.writeString(file.toPath(), sb.toString()); + } catch (IOException e) { + toolPane.handleException(e); + } + } + + private Dialog getOrCreateTextViewDialog() { + if (textViewDialog == null) { + textViewDialog = new Dialog<>(new TextView(), "Log Entry", 640, 480); + } + + return textViewDialog; + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/eventlog/Log.java b/gui/src/main/java/devtoolsfx/gui/eventlog/Log.java new file mode 100644 index 0000000..aee9fb5 --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/eventlog/Log.java @@ -0,0 +1,89 @@ +package devtoolsfx.gui.eventlog; + +import devtoolsfx.event.ConnectorEvent; +import devtoolsfx.event.ElementEvent; +import devtoolsfx.scenegraph.Element; +import javafx.beans.binding.Bindings; +import javafx.beans.binding.BooleanBinding; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.collections.transformation.FilteredList; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.LinkedList; +import java.util.Objects; +import java.util.function.Predicate; + +@NullMarked +final class Log { + + private static final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("HH:mm:ss.SSS"); + private static final int UNLIMITED = -1; + + private final ObservableList sourceList = FXCollections.observableList(new LinkedList<>()); + private final FilteredList filteredList = new FilteredList<>(sourceList); + private final BooleanBinding emptyProperty = Bindings.size(sourceList).isEqualTo(0); + + private int maxSize = UNLIMITED; + + public Log(int maxSize) { + setMaxSize(maxSize); + } + + void add(Entry entry) { + if (sourceList.size() == maxSize) { + sourceList.removeLast(); + } + sourceList.addFirst(entry); + } + + ObservableList getEntries() { + return sourceList; + } + + ObservableList getFilteredEntries() { + return filteredList; + } + + void setMaxSize(int maxSize) { + this.maxSize = maxSize <= 0 ? UNLIMITED : maxSize; + } + + BooleanBinding emptyProperty() { + return emptyProperty; + } + + void clear() { + sourceList.clear(); + } + + void setFilterPredicate(@Nullable Predicate predicate) { + filteredList.setPredicate(predicate); + } + + /////////////////////////////////////////////////////////////////////////// + + public record Entry(LocalDateTime timestamp, ConnectorEvent event) { + + public boolean matches(Element element) { + return event instanceof ElementEvent elementEvent && Objects.equals(elementEvent.getElement(), element); + } + + public boolean matches(String text) { + return toLogString().contains(text); + } + + public String toLogString() { + String date = DATE_FORMAT.format(timestamp()); + String eventClass = String.format("%-24s", event().getClass().getSimpleName() + ":"); + return date + " " + eventClass + event().toLogString(); + } + + public static Entry of(ConnectorEvent event) { + return new Entry(LocalDateTime.now(), event); + } + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/eventlog/OptionsMenuButton.java b/gui/src/main/java/devtoolsfx/gui/eventlog/OptionsMenuButton.java new file mode 100644 index 0000000..0657f3e --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/eventlog/OptionsMenuButton.java @@ -0,0 +1,93 @@ +package devtoolsfx.gui.eventlog; + +import devtoolsfx.connector.ConnectorOptions; +import devtoolsfx.event.ConnectorEvent; +import devtoolsfx.event.JavaFXEvent; +import devtoolsfx.event.MousePosEvent; +import devtoolsfx.event.WindowPropertiesEvent; +import javafx.event.ActionEvent; +import javafx.event.EventHandler; +import javafx.scene.control.CheckMenuItem; +import javafx.scene.control.MenuButton; +import javafx.scene.control.MenuItem; +import javafx.scene.control.SeparatorMenuItem; +import org.jspecify.annotations.NullMarked; + +import java.util.*; + +@NullMarked +final class OptionsMenuButton extends MenuButton { + + private static final Set> PREDISABLED_EVENTS = Set.of( + JavaFXEvent.class, + MousePosEvent.class, + WindowPropertiesEvent.class + ); + + private final CheckMenuItem selectedOnlyItem = new CheckMenuItem("For selected node only"); + private final Map, CheckMenuItem> eventItems = new HashMap<>(); + + OptionsMenuButton(EventHandler actionHandler) { + super("Options"); + + Objects.requireNonNull(actionHandler, "action handler must not be null"); + + setId(ConnectorOptions.AUX_NODE_ID_PREFIX + "eventLogOptionsMenu"); + createMenuItems(actionHandler); + } + + boolean isFilterSelectedOnly() { + return selectedOnlyItem.isSelected(); + } + + boolean isEventEnabled(T event) { + var item = eventItems.get(event.getClass()); + return item != null && item.isSelected(); + } + + /////////////////////////////////////////////////////////////////////////// + + private void createMenuItems(EventHandler actionHandler) { + selectedOnlyItem.setOnAction(actionHandler); + + getItems().addAll( + selectedOnlyItem, + new SeparatorMenuItem() + ); + + Arrays.stream(ConnectorEvent.class.getPermittedSubclasses()) + .sorted(Comparator.comparing(Class::getSimpleName)) + .forEach(cls -> getItems().add(createEventMenuItem(cls, actionHandler, eventItems))); + + var selectAll = new MenuItem("Select all events"); + selectAll.setOnAction(e -> { + eventItems.values().forEach(item -> item.setSelected(true)); + actionHandler.handle(e); + }); + + var deselectAll = new MenuItem("Deselect all events"); + deselectAll.setOnAction(e -> { + eventItems.values().forEach(item -> item.setSelected(false)); + actionHandler.handle(e); + }); + + getItems().addAll( + new SeparatorMenuItem(), + selectAll, + deselectAll + ); + } + + private MenuItem createEventMenuItem(Class cls, + EventHandler actionHandler, + Map, CheckMenuItem> registry) { + var item = new CheckMenuItem(cls.getSimpleName()); + item.setUserData(cls); + item.setOnAction(actionHandler); + item.setSelected(!PREDISABLED_EVENTS.contains(cls)); + + registry.put(cls, item); + + return item; + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/inspector/AttributeCellContent.java b/gui/src/main/java/devtoolsfx/gui/inspector/AttributeCellContent.java new file mode 100644 index 0000000..a9122b2 --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/inspector/AttributeCellContent.java @@ -0,0 +1,85 @@ +package devtoolsfx.gui.inspector; + +import devtoolsfx.gui.Preferences; +import devtoolsfx.scenegraph.attributes.Attribute; +import devtoolsfx.scenegraph.attributes.AttributeCategory; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.Objects; + +import static devtoolsfx.scenegraph.attributes.AttributeCategory.REFLECTIVE; + +@NullMarked +final class AttributeCellContent implements Comparable { + + private final @Nullable AttributeCategory category; + private final @Nullable Attribute attribute; + + private AttributeCellContent(@Nullable AttributeCategory category, + @Nullable Attribute attribute) { + this.category = category; + this.attribute = attribute; + } + + @Nullable + AttributeCategory getCategory() { + return category; + } + + @Nullable + Attribute getAttribute() { + return attribute; + } + + boolean isRoot() { + return category == null; + } + + boolean isGroup() { + return category != null && attribute == null; + } + + boolean matches(@Nullable String filter) { + return filter != null + && attribute != null + && attribute.name().toLowerCase().contains(filter.toLowerCase()); + } + + /////////////////////////////////////////////////////////////////////////// + + static AttributeCellContent forRoot() { + return new AttributeCellContent(null, null); + } + + static AttributeCellContent forGroup(AttributeCategory category) { + Objects.requireNonNull(category, "category must be specified"); + return new AttributeCellContent(category, null); + } + + static AttributeCellContent forValue(Attribute attribute) { + Objects.requireNonNull(attribute, "attribute must be specified"); + return new AttributeCellContent(null, attribute); + } + + @Override + public int compareTo(AttributeCellContent other) { + // reflective/summary attributes group should be the last one + if (isGroup() && other.isGroup() && other.getCategory() != null) { + if (getCategory() == REFLECTIVE) { + return 1; + } + return getCategory().compareTo(other.getCategory()); + } + + // all trackers (except reflective) sort attributes semantically, + // we can either keep this sorting or reset it to alphabetical order + if (getAttribute() != null && other.getAttribute() != null) { + return Preferences.KEEP_ATTRIBUTES_SORT + ? 0 + : getAttribute().name().compareTo(other.getAttribute().name()); + } + + return 0; + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/inspector/AttributeDetailsPane.java b/gui/src/main/java/devtoolsfx/gui/inspector/AttributeDetailsPane.java new file mode 100644 index 0000000..0ad892f --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/inspector/AttributeDetailsPane.java @@ -0,0 +1,147 @@ +package devtoolsfx.gui.inspector; + +import devtoolsfx.gui.Preferences; +import devtoolsfx.scenegraph.Element; +import javafx.css.PseudoClass; +import javafx.geometry.HPos; +import javafx.scene.control.Hyperlink; +import javafx.scene.control.Label; +import javafx.scene.control.ScrollPane; +import javafx.scene.control.Tooltip; +import javafx.scene.layout.ColumnConstraints; +import javafx.scene.layout.GridPane; +import javafx.scene.layout.Priority; +import javafx.scene.layout.Region; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.Objects; + +@NullMarked +final class AttributeDetailsPane extends ScrollPane { + + private static final PseudoClass EMPTY = PseudoClass.getPseudoClass("empty"); + private static final String EMPTY_VALUE = "-"; + private static final int MIN_NAME_WIDTH = 100; + + private final AttributePane pane; + + private final Hyperlink propertyTitleLink = new Hyperlink("Property"); + private final Label propertyLabel = new Label(); + private final Tooltip propertyTooltip = new Tooltip(); + + private final Hyperlink cssPropertyTitleLink = new Hyperlink("CSS property"); + private final Label cssPropertyLabel = new Label(); + private final Tooltip cssPropertyTooltip = new Tooltip(); + + private final Label defaultLabel = new Label(); + + AttributeDetailsPane(AttributePane pane) { + super(); + + this.pane = pane; + + setId("attribute-details-pane"); + createLayout(); + initListeners(); + } + + void setContent(@Nullable AttributeCellContent content) { + if (content != null && content.getAttribute() != null) { + var attr = content.getAttribute(); + + propertyTitleLink.setText(attr.name()); + toggleDocLink( + propertyTitleLink, + propertyTooltip, + createJavadocUri(Objects.requireNonNullElse(attr.field(), attr.name())) + ); + propertyLabel.setText(defaultIfEmpty(String.valueOf(attr.value()))); + + cssPropertyLabel.setText(defaultIfEmpty(attr.cssProperty())); + toggleDocLink(cssPropertyTitleLink, cssPropertyTooltip, createCSSReferenceUri(attr.cssProperty())); + + defaultLabel.setText(String.valueOf(attr.valueState())); + } + } + + /////////////////////////////////////////////////////////////////////////// + + private void createLayout() { + var grid = new GridPane(); + grid.getStyleClass().add("grid"); + grid.getColumnConstraints().setAll( + new ColumnConstraints(MIN_NAME_WIDTH, Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE, Priority.NEVER, HPos.LEFT, false), + new ColumnConstraints(Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE, Region.USE_COMPUTED_SIZE, Priority.ALWAYS, HPos.LEFT, true) + ); + + propertyLabel.setWrapText(true); + grid.add(propertyTitleLink, 0, 0); + grid.add(propertyLabel, 1, 0); + + cssPropertyLabel.setWrapText(true); + grid.add(cssPropertyTitleLink, 0, 1); + grid.add(cssPropertyLabel, 1, 1); + + defaultLabel.setWrapText(true); + grid.add(new Label("State"), 0, 2); + grid.add(defaultLabel, 1, 2); + + setContent(grid); + setVbarPolicy(ScrollBarPolicy.AS_NEEDED); + setHbarPolicy(ScrollBarPolicy.NEVER); + setFitToWidth(true); + setMaxHeight(10_000); + setPrefHeight(200); + } + + private void initListeners() { + propertyTitleLink.setOnAction(e -> openDocLink(propertyTitleLink)); + cssPropertyTitleLink.setOnAction(e -> openDocLink(cssPropertyTitleLink)); + } + + private @Nullable String createJavadocUri(String field) { + Element element = pane.getToolPane().getSelectedElement(); + if (element == null || !element.getClassInfo().module().startsWith("javafx.")) { + return null; + } + + String query = field; + String declaringClassName = pane.getToolPane().getConnector().getDeclaringClass( + element.getClassInfo().className(), field + ); + + if (declaringClassName != null) { + query = declaringClassName + "." + field; + } + + return Preferences.JAVADOC_SEARCH_URI + "?q=" + query; + } + + private @Nullable String createCSSReferenceUri(@Nullable String cssProperty) { + Element element = pane.getToolPane().getSelectedElement(); + if (element == null || cssProperty == null || !element.getClassInfo().module().startsWith("javafx.")) { + return null; + } + + return Preferences.CSS_REFERENCE_BASE_URI + "#" + element.getSimpleClassName().toLowerCase(); + } + + private void toggleDocLink(Hyperlink link, Tooltip tooltip, @Nullable String uri) { + link.setUserData(uri); + link.pseudoClassStateChanged(EMPTY, uri == null); + + tooltip.setText(uri); + link.setTooltip(uri != null ? tooltip : null); + } + + private void openDocLink(Hyperlink link) { + if (link.getUserData() != null && link.getUserData() instanceof String uri) { + pane.getToolPane().getPreferences().getHostServices().showDocument(uri); + } + } + + private String defaultIfEmpty(@Nullable String s) { + return s != null && !s.isBlank() ? s : EMPTY_VALUE; + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/inspector/AttributePane.java b/gui/src/main/java/devtoolsfx/gui/inspector/AttributePane.java new file mode 100644 index 0000000..1e90e0a --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/inspector/AttributePane.java @@ -0,0 +1,118 @@ +package devtoolsfx.gui.inspector; + +import devtoolsfx.gui.ToolPane; +import devtoolsfx.gui.controls.FilterField; +import devtoolsfx.scenegraph.attributes.Attribute; +import devtoolsfx.scenegraph.attributes.AttributeCategory; +import javafx.geometry.Orientation; +import javafx.scene.control.SplitPane; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Priority; +import javafx.scene.layout.Region; +import javafx.scene.layout.VBox; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.List; + +@NullMarked +final class AttributePane extends SplitPane { + + private static final int MIN_FILTER_LENGTH = 3; + + private final ToolPane toolPane; + private final AttributeTreeTable table = new AttributeTreeTable(); + private final FilterField filterField = new FilterField(); + private final AttributeDetailsPane details = new AttributeDetailsPane(this); + + AttributePane(ToolPane toolPane) { + super(); + + this.toolPane = toolPane; + + createLayout(); + initListeners(); + } + + void setAttributes(AttributeCategory category, List> attributes) { + table.setAttributes(category, attributes); + } + + void updateAttribute(AttributeCategory category, Attribute attribute) { + table.updateAttribute(category, attribute); + } + + void clearAttributes() { + table.clear(); + } + + void setFilter(@Nullable String filter) { + table.setFilter(filter); + if (filter == null || filter.isBlank()) { + filterField.setText(""); + } + } + + ToolPane getToolPane() { + return toolPane; + } + + /////////////////////////////////////////////////////////////////////////// + + private void createLayout() { + filterField.setPromptText("property name"); + HBox.setHgrow(filterField, Priority.ALWAYS); + // prevents field from changing height on SplitPane resize + filterField.setMinHeight(Region.USE_PREF_SIZE); + filterField.setMaxHeight(Region.USE_PREF_SIZE); + + var filterBox = new HBox(filterField); + filterBox.getStyleClass().add("filter"); + filterBox.setFillHeight(true); + VBox.setVgrow(filterBox, Priority.NEVER); + + var tableBox = new VBox(table, filterBox); + tableBox.getStyleClass().add("table-box"); + VBox.setVgrow(table, Priority.ALWAYS); + + setId("attribute-pane"); + getItems().setAll(tableBox); + setOrientation(Orientation.VERTICAL); + setDividerPositions(1); + setResizableWithParent(details, false); + } + + private void initListeners() { + filterField.setOnKeyReleased(event -> { + var text = filterField.getText(); + if (text.isEmpty() || text.length() >= MIN_FILTER_LENGTH) { + table.setFilter(text); + } + }); + + filterField.setOnClearButtonClick(() -> setFilter(null)); + + table.getSelectionModel().selectedItemProperty().addListener((obs, old, val) -> { + details.setContent(val != null ? val.getValue() : null); + if (val != null) { + if (!getItems().contains(details)) { + getItems().add(details); + setDividerPositions(0.8); + } + } else { + getItems().remove(details); + setDividerPositions(1.0); + } + }); + + table.setRefreshHandler(() -> { + String filter = table.getFilter(); + + toolPane.getConnector().reloadSelectedAttributes(null, null); + + if (filter != null) { + table.setFilter(filter); + } + }); + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/inspector/AttributeTreeItem.java b/gui/src/main/java/devtoolsfx/gui/inspector/AttributeTreeItem.java new file mode 100644 index 0000000..e9b6851 --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/inspector/AttributeTreeItem.java @@ -0,0 +1,89 @@ +package devtoolsfx.gui.inspector; + +import devtoolsfx.scenegraph.attributes.Attribute; +import devtoolsfx.scenegraph.attributes.AttributeCategory; +import javafx.beans.binding.Bindings; +import javafx.collections.FXCollections; +import javafx.collections.ObservableList; +import javafx.collections.transformation.FilteredList; +import javafx.collections.transformation.SortedList; +import javafx.scene.control.TreeItem; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.Objects; +import java.util.function.Predicate; + +@NullMarked +@SuppressWarnings("FieldCanBeLocal") +final class AttributeTreeItem extends TreeItem { + + private final ObservableList sourceList = FXCollections.observableArrayList(); + private final FilteredList filteredList = new FilteredList<>(sourceList); + private final SortedList sortedList = new SortedList<>( + filteredList, Comparator.comparing(TreeItem::getValue) + ); + + AttributeTreeItem(AttributeCellContent value) { + super(value); + Bindings.bindContent(getChildren(), sortedList); + } + + void addGroup(AttributeTreeItem group) { + sourceList.add(group); + } + + boolean isGroupOf(AttributeCategory category) { + return getValue().getCategory() != null && getValue().getCategory() == category; + } + + void setAttributes(List> attributes) { + List items = attributes.stream() + .map(AttributeCellContent::forValue) + .map(AttributeTreeItem::new) + .toList(); + sourceList.setAll(items); + } + + void updateAttribute(Attribute attribute) { + int index = -1; + for (int i = 0; i < sourceList.size(); i++) { + AttributeCellContent content = sourceList.get(i).getValue(); + if (content.getAttribute() != null && Objects.equals(content.getAttribute().name(), attribute.name())) { + index = i; + break; + } + } + + if (index > 0) { + sourceList.set(index, new AttributeTreeItem(AttributeCellContent.forValue(attribute))); + } + } + + List getChildrenUnmodifiable() { + return Collections.unmodifiableList(sourceList); + } + + void clear() { + sourceList.clear(); + } + + boolean isEmpty() { + return getChildren().isEmpty(); + } + + void setFilterText(@Nullable String filter) { + if (filter == null) { + setFilterPredicate(null); + } else { + setFilterPredicate(item -> item.getValue().matches(filter)); + } + } + + void setFilterPredicate(@Nullable Predicate predicate) { + filteredList.setPredicate(predicate); + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/inspector/AttributeTreeTable.java b/gui/src/main/java/devtoolsfx/gui/inspector/AttributeTreeTable.java new file mode 100644 index 0000000..941bec8 --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/inspector/AttributeTreeTable.java @@ -0,0 +1,323 @@ +package devtoolsfx.gui.inspector; + +import devtoolsfx.connector.ConnectorOptions; +import devtoolsfx.gui.controls.ColorIndicator; +import devtoolsfx.gui.util.Formatters; +import devtoolsfx.gui.util.GUIHelpers; +import devtoolsfx.scenegraph.attributes.Attribute; +import devtoolsfx.scenegraph.attributes.Attribute.DisplayHint; +import devtoolsfx.scenegraph.attributes.Attribute.ValueState; +import devtoolsfx.scenegraph.attributes.AttributeCategory; +import javafx.beans.property.SimpleObjectProperty; +import javafx.beans.value.ObservableValue; +import javafx.css.PseudoClass; +import javafx.geometry.Insets; +import javafx.scene.Node; +import javafx.scene.control.*; +import javafx.scene.control.TreeTableColumn.CellDataFeatures; +import javafx.scene.input.KeyCode; +import javafx.scene.input.KeyCodeCombination; +import javafx.scene.input.KeyCombination; +import javafx.scene.layout.Region; +import javafx.scene.paint.Color; +import javafx.util.Callback; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.text.DecimalFormat; +import java.util.List; +import java.util.Objects; + +@NullMarked +final class AttributeTreeTable extends TreeTableView { + + private static final DecimalFormat DECIMAL_FORMAT = new DecimalFormat("#.###"); + + private static final PseudoClass GROUP = PseudoClass.getPseudoClass("group"); + private static final PseudoClass DEFAULT = PseudoClass.getPseudoClass("default"); + private static final PseudoClass LEAF = PseudoClass.getPseudoClass("leaf"); + + private final AttributeTreeItem root = new AttributeTreeItem(AttributeCellContent.forRoot()); + + private @Nullable Runnable refreshHandler; + private @Nullable String filter; + + AttributeTreeTable() { + super(); + + createTableColumns(); + setColumnResizePolicy(CONSTRAINED_RESIZE_POLICY_FLEX_LAST_COLUMN); + getSelectionModel().setSelectionMode(SelectionMode.SINGLE); + setContextMenu(createContextMenu()); + + setId("attribute-tree-table"); + setRoot(root); + setShowRoot(false); + root.setExpanded(true); + + setOnKeyPressed(e -> { + if (new KeyCodeCombination(KeyCode.C, KeyCombination.CONTROL_ANY).match(e)) { + GUIHelpers.copySelectedRowsToClipboard(this, content -> + content.getAttribute() != null ? formatValueByText(content.getAttribute()).value() : "" + ); + } + }); + + refreshRootFilter(); + } + + void setAttributes(AttributeCategory category, + List> attributes) { + AttributeTreeItem group = findGroupByCategory(category); + if (group == null) { + group = new AttributeTreeItem(AttributeCellContent.forGroup(category)); + root.addGroup(group); + } + + group.setAttributes(attributes); + group.setExpanded(true); + + refreshRootFilter(); + } + + void updateAttribute(AttributeCategory category, + Attribute attribute) { + AttributeTreeItem group = findGroupByCategory(category); + if (group == null) { + return; + } + group.updateAttribute(attribute); + } + + void clear() { + filter = null; + root.clear(); + refreshRootFilter(); + } + + @Nullable + String getFilter() { + return filter; + } + + void setFilter(@Nullable String filter) { + this.filter = filter; + + // we have to obtain children from the source list, + // not from the filtered list + for (var group : root.getChildrenUnmodifiable()) { + group.setFilterText(filter); + } + + refreshRootFilter(); + } + + void setRefreshHandler(Runnable handler) { + this.refreshHandler = handler; + } + + /////////////////////////////////////////////////////////////////////////// + + private void createTableColumns() { + var propertyCol = new TreeTableColumn("Property"); + var valueCol = new TreeTableColumn("Value"); + + Callback, ObservableValue> + cellValueFactory = cdf -> new SimpleObjectProperty<>(cdf.getValue().getValue()); + + propertyCol.setCellValueFactory(cellValueFactory); + propertyCol.setCellFactory(c -> new TreeTableCell<>() { + final Label infoLabel = new Label(); + + { + getStyleClass().add("property-cell"); + setContentDisplay(ContentDisplay.RIGHT); + infoLabel.getStyleClass().add("info"); + } + + @Override + protected void updateItem(@Nullable AttributeCellContent content, boolean empty) { + super.updateItem(content, empty); + + if (empty || content == null) { + setGraphic(null); + infoLabel.setText(null); + setText(null); + getTableRow().pseudoClassStateChanged(GROUP, false); + return; + } + + String text = null; + + if (content.isGroup()) { + switch (content.getCategory()) { + case CONTROL -> text = "Control Properties"; + case GRID_PANE -> text = "GridPane Properties"; + case LABELED -> text = "Labeled Properties"; + case IMAGE_VIEW -> text = "Image Properties"; + case NODE -> text = "Node Properties"; + case PARENT -> text = "Parent Properties"; + case REGION -> text = "Region Properties"; + case SCENE -> text = "Scene Properties"; + case SHAPE -> text = "Shape Properties"; + case TEXT -> text = "Text Properties"; + case WINDOW -> text = "Window Properties"; + case REFLECTIVE -> text = "Reflective Properties"; + case null -> { + } + } + setGraphic(null); + infoLabel.setText(null); + } else if (content.getAttribute() != null) { + text = content.getAttribute().name(); + + var cssProperty = content.getAttribute().cssProperty(); + if (cssProperty != null && !cssProperty.isEmpty()) { + setGraphic(infoLabel); + infoLabel.setText("CSS"); + } else { + setGraphic(null); + infoLabel.setText(null); + } + } + + pseudoClassStateChanged(LEAF, getTableRow().getTreeItem().isLeaf()); + getTableRow().pseudoClassStateChanged(GROUP, content.isGroup()); + setText(text); + } + }); + propertyCol.setSortable(false); + propertyCol.setReorderable(false); + propertyCol.setMinWidth(200); + propertyCol.setPrefWidth(200); + propertyCol.setMaxWidth(300); + + valueCol.setCellValueFactory(cellValueFactory); + valueCol.setCellFactory(c -> new TreeTableCell<>() { + @Override + protected void updateItem(@Nullable AttributeCellContent content, boolean empty) { + super.updateItem(content, empty); + + if (empty || content == null || content.getAttribute() == null) { + setText(null); + setGraphic(null); + getTableRow().pseudoClassStateChanged(DEFAULT, false); + } else { + var cv = formatValueByText(content.getAttribute()); + setText(cv.value()); + getTableRow().pseudoClassStateChanged(DEFAULT, cv.isDefault()); + + setGraphic(getOptionalValueGraphic(content.getAttribute())); + } + } + }); + valueCol.setSortable(false); + valueCol.setReorderable(false); + + getColumns().add(propertyCol); + getColumns().add(valueCol); + } + + private ContextMenu createContextMenu() { + var refresh = new MenuItem("Refresh"); + refresh.setOnAction(e -> { + if (refreshHandler != null) { + refreshHandler.run(); + } + }); + + var contextMenu = new ContextMenu(); + contextMenu.setId(ConnectorOptions.AUX_NODE_ID_PREFIX + "attributeTableOptionsMenu"); + contextMenu.getItems().addAll(refresh); + + return contextMenu; + } + + private @Nullable AttributeTreeItem findGroupByCategory(AttributeCategory category) { + for (var child : root.getChildren()) { + if (child instanceof AttributeTreeItem item && item.isGroupOf(category)) { + return item; + } + } + return null; + } + + private void refreshRootFilter() { + // even though we're creating a new predicate instance each time, + // it won't work without setting it to null first + root.setFilterText(null); + root.setFilterPredicate(group -> !group.isEmpty()); + } + + private CellValue formatValueByText(Attribute attribute) { + var value = attribute.value(); + return switch (attribute.displayHint()) { + case COLOR -> { + if (value instanceof Color color) { + yield CellValue.of( + Formatters.colorToHexString(color) + "; " + Formatters.colorToRgbString(color), + attribute + ); + } + + yield CellValue.of(String.valueOf(value).toUpperCase(), attribute); + } + case INSETS -> { + if (value instanceof Insets insets && (Objects.equals(insets, Insets.EMPTY) + || (insets.getTop() == 0 && insets.getRight() == 0 && insets.getBottom() == 0 && insets.getLeft() == 0))) { + yield new CellValue("Insets.EMPTY", true); + } + yield CellValue.of(String.valueOf(value), attribute); + } + case NUMERIC -> { + boolean isDefault = attribute.valueState() == ValueState.DEFAULT + || (value instanceof Number num && num.doubleValue() == 0); + + if (value instanceof Double num) { + if (num == Region.USE_COMPUTED_SIZE) { + yield new CellValue("USE_COMPUTED_SIZE", true); + } + if (num == Region.USE_PREF_SIZE) { + yield new CellValue("USE_PREF_SIZE", true); + } + if (num == Double.MIN_VALUE) { + yield new CellValue("MIN_VALUE", true); + } + if (num == Double.MAX_VALUE) { + yield new CellValue("MAX_VALUE", true); + } + + yield new CellValue(DECIMAL_FORMAT.format(num), isDefault); + } + + yield new CellValue(String.valueOf(value), isDefault); + } + default -> { + if (value instanceof List list && list.isEmpty()) { + yield new CellValue("[]", true); + } + + var s = String.valueOf(value); + boolean isDefault = attribute.valueState() == ValueState.DEFAULT || s.isEmpty() || "null".equals(s); + yield new CellValue(s, isDefault); + } + }; + } + + private @Nullable Node getOptionalValueGraphic(Attribute attribute) { + if (attribute.displayHint() == DisplayHint.COLOR && attribute.value() instanceof Color color) { + return new ColorIndicator(color); + } + + return null; + } + + /////////////////////////////////////////////////////////////////////////// + + private record CellValue(String value, boolean isDefault) { + + public static CellValue of(String value, Attribute attribute) { + return new CellValue(value, attribute.valueState() == ValueState.DEFAULT); + } + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/inspector/ExpandCollapse.java b/gui/src/main/java/devtoolsfx/gui/inspector/ExpandCollapse.java new file mode 100644 index 0000000..7faa424 --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/inspector/ExpandCollapse.java @@ -0,0 +1,74 @@ +package devtoolsfx.gui.inspector; + +import devtoolsfx.scenegraph.Element; +import javafx.scene.control.TreeItem; +import org.jspecify.annotations.NullMarked; + +import java.util.HashSet; +import java.util.Set; +import java.util.function.Function; + +/** + * Accumulates expand/collapse logic for the tree items. + */ +@NullMarked +final class ExpandCollapse { + + private final Set expandItems = new HashSet<>(); + private final Set collapseItems = new HashSet<>(); + private final Function, T> fun; + + public ExpandCollapse(Function, T> fun) { + this.fun = fun; + } + + /** + * Toggles the expand/collapse state of the given item. If the item is already + * present, it will be removed; otherwise, it will be added to either the expanded + * or collapsed items, depending on the toggle flag. + */ + void toggle(TreeItem item, boolean expand) { + var t = fun.apply(item); + if (expand) { + if (expandItems.contains(t)) { + expandItems.remove(t); + } else { + expandItems.add(t); + } + } else { + if (collapseItems.contains(t)) { + collapseItems.remove(t); + } else { + collapseItems.add(t); + } + } + } + + /** + * Shortcut for {@link #toggle(TreeItem, boolean)}. + */ + void expand(TreeItem item) { + toggle(item, true); + } + + /** + * Shortcut for {@link #toggle(TreeItem, boolean)}. + */ + void collapse(TreeItem item) { + toggle(item, false); + } + + /** + * Checks whether the given item is present in the "expanded list". + */ + boolean isExpanded(TreeItem item) { + return expandItems.contains(fun.apply(item)); + } + + /** + * Checks whether the given item is present in the "collapsed list". + */ + boolean isCollapsed(TreeItem item) { + return collapseItems.contains(fun.apply(item)); + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/inspector/InspectorTab.java b/gui/src/main/java/devtoolsfx/gui/inspector/InspectorTab.java new file mode 100644 index 0000000..9f530dc --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/inspector/InspectorTab.java @@ -0,0 +1,134 @@ +package devtoolsfx.gui.inspector; + +import devtoolsfx.gui.ToolPane; +import devtoolsfx.scenegraph.Element; +import devtoolsfx.scenegraph.attributes.Attribute; +import devtoolsfx.scenegraph.attributes.AttributeCategory; +import javafx.scene.control.SplitPane; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.List; + +@NullMarked +public final class InspectorTab extends SplitPane { + + public static final String TAB_NAME = "Inspector"; + + private final SceneGraphPane sceneGraphPane; + private final AttributePane attributePane; + + public InspectorTab(ToolPane toolPane) { + super(); + + sceneGraphPane = new SceneGraphPane(toolPane); + attributePane = new AttributePane(toolPane); + + createLayout(); + } + + /** + * Adds or updates a window element in the scenegraph tree. + */ + public void addOrUpdateWindow(Element element) { + sceneGraphPane.addOrUpdateWindow(element); + } + + /** + * Removes window element from the scenegraph tree. + */ + public void removeWindow(int uid) { + sceneGraphPane.removeWindow(uid); + } + + /** + * Returns the UID of the window containing the specified element, or zero if not found. + */ + public int getWindow(Element element) { + return sceneGraphPane.getWindow(element); + } + + /** + * Adds a new node element to the scenegraph tree. + */ + public void addTreeElement(Element element) { + sceneGraphPane.addTreeElement(element); + } + + /** + * Adds node element from the scenegraph tree. + */ + public void removeTreeElement(Element element) { + sceneGraphPane.removeTreeElement(element); + } + + /** + * Returns the selected element from the scenegraph tree. + */ + @Nullable + public Element getSelectedTreeElement() { + return sceneGraphPane.getSelectedTreeElement(); + } + + /** + * Selects the specified element in the scenegraph tree. + */ + public void selectTreeElement(Element element) { + sceneGraphPane.selectTreeElement(element); + } + + /** + * Clears the scenegraph tree selection. + */ + @SuppressWarnings("unused") + public void clearTreeSelection() { + sceneGraphPane.clearTreeSelection(); + } + + /** + * Updates the specified element visibility state in the scenegraph tree. + */ + public void updateTreeElementVisibilityState(Element element, boolean visibility) { + sceneGraphPane.updateTreeElementVisibilityState(element, visibility); + } + + /** + * Updates the specified element style class list in the scenegraph tree. + */ + public void updateTreeElementStyleClass(Element element, List styleClass) { + sceneGraphPane.updateTreeElementStyleClass(element, styleClass); + } + + /** + * Sets (replaces) the list of displayed attributes. + */ + public void setAttributes(AttributeCategory category, List> attributes) { + attributePane.setAttributes(category, attributes); + } + + /** + * Updates a single attribute value. + */ + public void updateAttribute(AttributeCategory category, Attribute attribute) { + attributePane.updateAttribute(category, attribute); + } + + /** + * Clears the list of displayed attributes. + */ + public void clearAttributes() { + attributePane.clearAttributes(); + attributePane.setFilter(""); + } + + /////////////////////////////////////////////////////////////////////////// + + private void createLayout() { + setId("inspector-tab"); + getStyleClass().add("tab"); + setDividerPositions(0.4); + SplitPane.setResizableWithParent(sceneGraphPane, false); + + getItems().addAll(sceneGraphPane, attributePane); + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/inspector/SceneGraphPane.java b/gui/src/main/java/devtoolsfx/gui/inspector/SceneGraphPane.java new file mode 100644 index 0000000..9387c8c --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/inspector/SceneGraphPane.java @@ -0,0 +1,120 @@ +package devtoolsfx.gui.inspector; + +import devtoolsfx.gui.ToolPane; +import devtoolsfx.scenegraph.Element; +import javafx.scene.control.TreeItem; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Priority; +import javafx.scene.layout.VBox; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.List; + +@NullMarked +final class SceneGraphPane extends VBox { + + private final SearchField> searchField = new SearchField<>(); + private final SceneGraphTree tree; + + SceneGraphPane(ToolPane toolPane) { + super(); + + tree = new SceneGraphTree(toolPane); + + createLayout(); + initListeners(); + } + + void addOrUpdateWindow(Element element) { + tree.addOrUpdateWindow(element); + } + + void removeWindow(int uid) { + tree.removeWindow(uid); + } + + int getWindow(Element element) { + return tree.getWindow(element); + } + + void addTreeElement(Element element) { + tree.addElement(element); + } + + void removeTreeElement(Element element) { + tree.removeElement(element); + } + + @Nullable + Element getSelectedTreeElement() { + return tree.getSelectedElement(); + } + + void selectTreeElement(Element element) { + tree.selectElement(element); + } + + void clearTreeSelection() { + tree.getSelectionModel().clearSelection(); + } + + @SuppressWarnings("unused") + void updateTreeElementVisibilityState(Element element, boolean visibility) { + tree.updateTreeElement(element); + tree.refresh(); + } + + @SuppressWarnings("unused") + void updateTreeElementStyleClass(Element element, List styleClass) { + tree.updateTreeElement(element); + tree.refresh(); + } + + /////////////////////////////////////////////////////////////////////////// + + private void createLayout() { + HBox.setHgrow(searchField, Priority.ALWAYS); + + var filterBox = new HBox(searchField); + filterBox.getStyleClass().add("filter"); + + VBox.setVgrow(tree, Priority.ALWAYS); + + setId("scenegraph-pane"); + getChildren().setAll(tree, filterBox); + } + + private void initListeners() { + searchField.setOnTextChange(() -> { + var filter = searchField.getText(); + + if (filter.length() <= 3) { + clearSearchResult(); + return; + } + + List> result = tree.search(filter); + searchField.setNavigableResult(result); + + if (!result.isEmpty()) { + searchField.navigateNext(); + } + + tree.refresh(); + }); + + searchField.setNavigationHandler((position, item) -> tree.navigate(item)); + + searchField.setOnClearButtonClick(() -> { + searchField.setText(null); + clearSearchResult(); + }); + } + + private void clearSearchResult() { + tree.search(null); + searchField.setNavigableResult(null); + tree.refresh(); + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/inspector/SceneGraphTree.java b/gui/src/main/java/devtoolsfx/gui/inspector/SceneGraphTree.java new file mode 100644 index 0000000..8d19f13 --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/inspector/SceneGraphTree.java @@ -0,0 +1,528 @@ +package devtoolsfx.gui.inspector; + +import devtoolsfx.connector.Connector; +import devtoolsfx.connector.ConnectorOptions; +import devtoolsfx.gui.ToolPane; +import devtoolsfx.gui.Preferences; +import devtoolsfx.gui.util.DummyElement; +import devtoolsfx.scenegraph.Element; +import devtoolsfx.scenegraph.WindowProperties.WindowType; +import javafx.scene.control.*; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.lang.System.Logger; +import java.lang.System.Logger.Level; +import java.util.*; +import java.util.stream.Collectors; + +@NullMarked +final class SceneGraphTree extends TreeView { + + private static final Logger LOGGER = System.getLogger(SceneGraphTree.class.getName()); + + private final ToolPane toolPane; + private final TreeItem treeRoot; + private final Map> treeIndex = new HashMap<>(); + + private final ExpandCollapse forcedNodes = new ExpandCollapse<>( + item -> item.getValue().hashCode() + ); + private final ExpandCollapse forcedTypes = new ExpandCollapse<>( + item -> item.getValue().getSimpleClassName() + ); + + private @Nullable ContextMenu contextMenu; + private boolean blockSelection; + + SceneGraphTree(ToolPane toolPane) { + this.toolPane = toolPane; + + treeRoot = new SceneGraphTreeItem(new DummyElement("")); + treeRoot.setExpanded(true); + + setId("scene-graph-tree"); + setRoot(treeRoot); + setShowRoot(false); + setCellFactory(c -> new SceneGraphTreeCell()); + + initListeners(); + } + + /////////////////////////////////////////////////////////////////////////// + // Public API // + /////////////////////////////////////////////////////////////////////////// + + /** + * Adds a new window element or updates the existing one with a new root. + */ + void addOrUpdateWindow(Element element) { + if (!element.isWindowElement()) { + LOGGER.log(Level.WARNING, "Adding or updating a window is only possible with a window type of element"); + return; + } + + // clear selection if the currently selected item belongs to the replaced window branch + boolean clearSelection = false; + if (!getSelectionModel().isEmpty()) { + var window = findParentWindowItem(getSelectionModel().getSelectedItem()); + if (window != null && Objects.equals(window.getValue(), element)) { + clearSelection = true; + } + } + + blockSelection = true; + treeRoot.getChildren().removeIf(item -> + item.getValue().isWindowElement() && Objects.equals(item.getValue(), element) + ); + treeRoot.getChildren().add(createTreeBranch(element)); + blockSelection = false; + + if (clearSelection) { + clearConnectorSelection(); + } + } + + /** + * Removes the window element (the entire branch) from the tree. + */ + void removeWindow(int uid) { + blockSelection = true; + treeRoot.getChildren().removeIf( + item -> item.getValue().isWindowElement() && item.getValue().getUID() == uid + ); + blockSelection = false; + } + + /** + * Returns the UID of the window containing the specified element, or zero if not found. + */ + int getWindow(Element element) { + var item = treeIndex.get(element); + if (item == null) { + return 0; + } + + TreeItem window = findParentWindowItem(item); + return window != null ? window.getValue().getUID() : 0; + } + + /** + * Selects the specified element in the tree and scrolls to it. + */ + void selectElement(Element element) { + if (treeIndex.containsKey(element)) { + getSelectionModel().select(treeIndex.get(element)); + scrollTo(getSelectionModel().getSelectedIndex()); + } + } + + /** + * Returns the value of the selected tree item. + */ + @Nullable + Element getSelectedElement() { + var item = getSelectionModel().getSelectedItem(); + return item != null ? item.getValue() : null; + } + + /** + * Adds the given element to the tree. + */ + void addElement(Element element) { + blockSelection = true; + doAddElement(element); + blockSelection = false; + } + + /** + * Removes the given element to the tree. + */ + void removeElement(Element element) { + blockSelection = true; + doRemoveElement(element); + blockSelection = false; + } + + /** + * Updates the specified element. + */ + void updateTreeElement(Element element) { + var item = treeIndex.get(element); + if (item != null) { + item.setValue(element); + } + } + + /** + * Searches the tree items for the specified string. + */ + List> search(@Nullable String filter) { + // reset previous filter + treeIndex.forEach((element, item) -> { + if (item instanceof SceneGraphTreeItem sg) { + sg.setFiltered(false); + } + }); + + if (filter == null) { + return List.of(); + } + + return treeIndex.entrySet().stream() + .filter(e -> isMatchFilter(e.getKey(), filter)) + .map(e -> (SceneGraphTreeItem) e.getValue()) + .peek(item -> item.setFiltered(true)) + .sorted() + .collect(Collectors.toList()); + } + + /** + * Navigates the tree to the specified element, expanding the branch if needed + * and scrolling to the element's position. + */ + void navigate(TreeItem item) { + // getRow() returns _visible_ row index, so we have to expand branch first + expandBranchUpward(item); + + int index = getRow(item); + if (index > 0) { + scrollTo(index); + } + } + + /////////////////////////////////////////////////////////////////////////// + // Internal // + /////////////////////////////////////////////////////////////////////////// + + private void initListeners() { + getSelectionModel().selectedItemProperty().addListener((obs, old, val) -> { + if (blockSelection) { + return; + } + + if (val != null) { + selectConnectorElement(val); + } else { + clearConnectorSelection(); + } + }); + + setOnMousePressed(event -> { + if (contextMenu != null) { + contextMenu.hide(); + contextMenu = null; + } + if (event.isSecondaryButtonDown() && getSelectionModel().getSelectedItem() != null) { + contextMenu = createContextMenu(getSelectionModel().getSelectedItem()); + contextMenu.show(SceneGraphTree.this, event.getScreenX(), event.getScreenY()); + } + }); + } + + private ContextMenu createContextMenu(TreeItem item) { + boolean isLeaf = item.getChildren().isEmpty(); + Element element = item.getValue(); + + var contextMenu = new ContextMenu(); + contextMenu.setId(ConnectorOptions.AUX_NODE_ID_PREFIX + "sceneGraphTreeContextMenu"); + + var clearSelectionMenu = new MenuItem("Clear selection"); + clearSelectionMenu.setOnAction(e -> clearConnectorSelection()); + + var hidePopupsMenu = new MenuItem("Close popup windows"); + hidePopupsMenu.setOnAction(e -> closePopupWindows()); + + var expandNodeMenu = new CheckMenuItem("Keep expanded"); + expandNodeMenu.setOnAction(e -> forcedNodes.expand(item)); + expandNodeMenu.setSelected(forcedNodes.isExpanded(item)); + expandNodeMenu.setDisable(isLeaf); + + var collapseNodeMenu = new CheckMenuItem("Keep collapsed"); + collapseNodeMenu.setOnAction(e -> forcedNodes.collapse(item)); + collapseNodeMenu.setSelected(forcedNodes.isCollapsed(item)); + collapseNodeMenu.setDisable(isLeaf); + + var expandTypeMenu = new CheckMenuItem("Always expand " + element.getSimpleClassName()); + expandTypeMenu.setOnAction(e -> forcedTypes.expand(item)); + expandTypeMenu.setSelected(forcedTypes.isExpanded(item)); + + var collapseTypeMenu = new CheckMenuItem("Always collapse " + element.getSimpleClassName()); + collapseTypeMenu.setOnAction(e -> forcedTypes.collapse(item)); + collapseTypeMenu.setSelected(forcedTypes.isCollapsed(item)); + + contextMenu.getItems().addAll( + expandNodeMenu, + collapseNodeMenu, + expandTypeMenu, + collapseTypeMenu, + new SeparatorMenuItem(), + clearSelectionMenu, + hidePopupsMenu + ); + + return contextMenu; + } + + /** + * Notifies the {@link Connector} that the selected {@link Element} in the UI has been changed. + */ + private void selectConnectorElement(TreeItem item) { + TreeItem window = findParentWindowItem(item); + if (window != null) { + toolPane.getConnector().selectElement(window.getValue().getUID(), item.getValue()); + } + } + + /** + * See {@link #selectConnectorElement(TreeItem)}. + */ + private void clearConnectorSelection() { + var window = findParentWindowItem(getSelectionModel().getSelectedItem()); + if (window != null) { + getSelectionModel().clearSelection(); + toolPane.getConnector().clearSelection(window.getValue().getUID()); + } + } + + /** + * Creates a tree branch starting from the given {@link Element} and traversing + * deep down to its latest descendant. During this path, it sets the expanded flag + * for every tree item along the way. + */ + private TreeItem createTreeBranch(Element element) { + var branch = new SceneGraphTreeItem(element); + treeIndex.put(element, branch); + + // recursively create child tree items for the given node + var children = new ArrayList>(element.getChildren().size()); + for (var child : element.getChildren()) { + if (!child.isAuxiliaryElement()) { + children.add(createTreeBranch(child)); + } + } + + for (TreeItem child : children) { + branch.getChildren().add(child); + } + + // determine the tree item's expanded state, it's collapsed by default + if (!forcedNodes.isCollapsed(branch) && !forcedTypes.isCollapsed(branch)) { + boolean forceState = forcedNodes.isExpanded(branch) || forcedTypes.isExpanded(branch); + branch.setExpanded(isElementPreferToBeExpanded(element) || forceState); + } + + return branch; + } + + /** + * Finds and returns the closest window item for the given {@link TreeItem}. + * Returns {@code null} if not found. + */ + private @Nullable TreeItem findParentWindowItem(@Nullable TreeItem item) { + if (item == null) { + return null; + } + return item.getValue().isWindowElement() ? item : findParentWindowItem(item.getParent()); + } + + /** + * See {@link #addElement(Element)}. + */ + private void doAddElement(Element elementToAdd) { + if (elementToAdd.isAuxiliaryElement()) { + return; + } + + // get the parent node and if not, it's impossible to determine new node position + Element parentElement = elementToAdd.getParent(); + if (parentElement == null) { + LOGGER.log(Level.WARNING, "Unable to determine element position as it has no parent"); + return; + } + TreeItem parentItem = treeIndex.get(parentElement); + if (parentItem == null) { + LOGGER.log(Level.WARNING, "Unable to determine tree item position as it has no parent"); + return; + } + + // guard block, should never happen + if (containsElement(parentItem, elementToAdd)) { + LOGGER.log(Level.WARNING, "Unable to add element as it is already present"); + return; + } + + TreeItem selectedItem = getSelectionModel().getSelectedItem(); + TreeItem itemToAdd = createTreeBranch(elementToAdd); + List siblingElements = parentElement.getChildren(); + List> siblingItems = parentItem.getChildren(); + + // where we want to be + int targetPos = siblingElements.indexOf(elementToAdd); + + boolean posFound = false; + int prevPos = -1; + + // try to insert the tree item in its real position + for (int index = 0; index < siblingItems.size(); index++) { + var currentElement = siblingItems.get(index).getValue(); + int currentPos = siblingElements.indexOf(currentElement); + + // guard block, should never happen + if (prevPos > currentPos) { + LOGGER.log(Level.WARNING, String.format( + "Unexpected condition encountered while adding tree node: parent %s=%d, child %s=%d", + parentElement.getSimpleClassName(), prevPos, + currentElement.getSimpleClassName(), currentPos + )); + } + + if (targetPos > prevPos && targetPos < currentPos) { + parentItem.getChildren().add(index, itemToAdd); + posFound = true; + break; + } + + prevPos = currentPos; + } + + // if the target position is not found, add to the end + if (!posFound) { + parentItem.getChildren().add(itemToAdd); + } + + // restore selection + if (selectedItem != null) { + getSelectionModel().select(selectedItem); + } + } + + /** + * See {@link #removeElement(Element)}. + */ + private void doRemoveElement(Element elementToRemove) { + if (elementToRemove.isAuxiliaryElement()) { + return; + } + + var itemToRemove = treeIndex.get(elementToRemove); + if (itemToRemove == null) { + var className = elementToRemove.getSimpleClassName(); + LOGGER.log(Level.WARNING, "Trying to remove a non-existent tree item: " + className); + return; + } + + // preserve the selected item or clear the selection, if it's the very + // item that needs to be removed + TreeItem selectedItem = getSelectionModel().getSelectedItem(); + if (selectedItem != null && selectedItem.getValue() == elementToRemove) { + var window = findParentWindowItem(itemToRemove); + if (window != null) { + getSelectionModel().clearSelection(); + toolPane.getConnector().clearSelection(window.getValue().getUID()); + selectedItem = null; + } + } + + // do not use directly the list as it will suffer concurrent modifications + List> childrenToRemove = itemToRemove.getChildren(); + for (var child : new ArrayList<>(childrenToRemove)) { + // recursively remove the whole branch + doRemoveElement(child.getValue()); + } + + // finally, remove the target tree item itself + if (itemToRemove.getParent() != null) { + itemToRemove.getParent().getChildren().remove(itemToRemove); + } + treeIndex.remove(itemToRemove.getValue()); + + // restore selection + if (selectedItem != null) { + getSelectionModel().select(selectedItem); + } + } + + /** + * Checks whether the given tree item contains the specified element in its children list. + */ + private boolean containsElement(@Nullable TreeItem parentItem, Element element) { + if (parentItem == null) { + return false; + } + + for (TreeItem node : parentItem.getChildren()) { + if (Objects.equals(node.getValue(), element)) { + return true; + } + } + + return false; + } + + /** + * Checks the preferred expand/collapse state of the specified element. + */ + private boolean isElementPreferToBeExpanded(Element element) { + Preferences preferences = toolPane.getPreferences(); + boolean preferToBeExpanded = true; + + if (element.isNodeElement()) { + var props = element.getNodeProperties(); + if (props != null && props.isControl() && preferences.isCollapseControls()) { + preferToBeExpanded = false; + } + if (props != null && props.isPane() && preferences.getCollapsePanes()) { + preferToBeExpanded = false; + } + } + + return preferToBeExpanded; + } + + /** + * Expands the entire branch, starting from the specified node and continuing up to the root. + */ + private void expandBranchUpward(TreeItem item) { + var parent = item.getParent(); + if (parent != null) { + parent.setExpanded(true); + expandBranchUpward(parent); + } + } + + /** + * Checks whether the given element matches the filter. + */ + private boolean isMatchFilter(Element element, String filter) { + if (element.isWindowElement()) { + return false; + } + + var props = element.getNodeProperties(); + if (props == null) { + return false; + } + + return containsIgnoreCase(element.getSimpleClassName(), filter) + || containsIgnoreCase(props.id(), filter) + || props.styleClass().stream().anyMatch(styleClass -> containsIgnoreCase(styleClass, filter)); + } + + /** + * Requests the connector to close (hide) all popup windows. + */ + private void closePopupWindows() { + List windows = treeRoot.getChildren().stream() + .map(TreeItem::getValue) + .filter(e -> e.getWindowProperties() != null && e.getWindowProperties().windowType() == WindowType.POPUP) + .toList(); + + // prevents ConcurrentModificationException + windows.forEach(e -> toolPane.getConnector().hideWindow(e.getUID())); + } + + private boolean containsIgnoreCase(@Nullable String str, @Nullable String subStr) { + return str != null && (subStr == null || str.toLowerCase().contains(subStr.toLowerCase())); + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/inspector/SceneGraphTreeCell.java b/gui/src/main/java/devtoolsfx/gui/inspector/SceneGraphTreeCell.java new file mode 100644 index 0000000..7ffc0af --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/inspector/SceneGraphTreeCell.java @@ -0,0 +1,63 @@ +package devtoolsfx.gui.inspector; + +import devtoolsfx.gui.util.Formatters; +import devtoolsfx.scenegraph.Element; +import javafx.css.PseudoClass; +import javafx.scene.control.Label; +import javafx.scene.control.TreeCell; +import javafx.scene.control.TreeItem; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +@NullMarked +final class SceneGraphTreeCell extends TreeCell { + + static final PseudoClass HIDDEN = PseudoClass.getPseudoClass("hidden"); + static final PseudoClass FILTERED = PseudoClass.getPseudoClass("filtered"); + + private final Label label = new Label(); + + public SceneGraphTreeCell() { + super(); + } + + @Override + @SuppressWarnings("ConstantValue") + public void updateItem(Element element, boolean empty) { + super.updateItem(element, empty); + + if (empty || element == null) { + pseudoClassStateChanged(HIDDEN, false); + pseudoClassStateChanged(FILTERED, false); + + label.setText(null); + setText(null); + setGraphic(null); + + return; + } + + label.setText(Formatters.formatForTreeItem(element)); + setGraphic(label); + + pseudoClassStateChanged(HIDDEN, isHidden(element)); + pseudoClassStateChanged(FILTERED, isFiltered(getTreeItem())); + } + + private boolean isHidden(@Nullable Element element) { + if (element == null || !element.isNodeElement()) { + return false; + } + + var props = element.getNodeProperties(); + if (props != null && !props.isVisible()) { + return true; + } + + return isHidden(element.getParent()); + } + + private boolean isFiltered(@Nullable TreeItem item) { + return item instanceof SceneGraphTreeItem sg && sg.getFiltered(); + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/inspector/SceneGraphTreeItem.java b/gui/src/main/java/devtoolsfx/gui/inspector/SceneGraphTreeItem.java new file mode 100644 index 0000000..5a5b54d --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/inspector/SceneGraphTreeItem.java @@ -0,0 +1,68 @@ +package devtoolsfx.gui.inspector; + +import devtoolsfx.scenegraph.Element; +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.SimpleBooleanProperty; +import javafx.scene.control.TreeItem; +import org.jspecify.annotations.NullMarked; + +import java.util.ArrayList; +import java.util.List; + +@NullMarked +final class SceneGraphTreeItem extends TreeItem implements Comparable> { + + private final BooleanProperty filtered = new SimpleBooleanProperty(); + + SceneGraphTreeItem(Element value) { + super(value); + } + + boolean getFiltered() { + return filtered.get(); + } + + void setFiltered(boolean filtered) { + this.filtered.set(filtered); + } + + @Override + public int compareTo(TreeItem other) { + var thisPath = getPathIndices(this, new ArrayList<>()).reversed(); + var otherPath = getPathIndices(other, new ArrayList<>()).reversed(); + + // a guard block, should not happen if not comparing with root + if (thisPath.isEmpty() && !otherPath.isEmpty()) { + return -1; + } + if (otherPath.isEmpty() && !thisPath.isEmpty()) { + return 1; + } + + for (int i = 0; i <= Math.min(thisPath.size(), otherPath.size()) - 1; i++) { + // lesser number wins, because it's closer to the root + int result = Integer.compare(thisPath.get(i), otherPath.get(i)); + if (result != 0) { + return result; + } + } + + return 0; + } + + /** + * Returns a list of indices that represent the position of the given item in the tree. + * The list is in reverse order, from leaf to root. + */ + private List getPathIndices(TreeItem item, List accumulator) { + var parent = item.getParent(); + if (parent == null) { + return accumulator; + } + + accumulator.add(parent.getChildren().indexOf(item)); + getPathIndices(parent, accumulator); + + return accumulator; + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/inspector/SearchField.java b/gui/src/main/java/devtoolsfx/gui/inspector/SearchField.java new file mode 100644 index 0000000..0307f76 --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/inspector/SearchField.java @@ -0,0 +1,160 @@ +package devtoolsfx.gui.inspector; + +import devtoolsfx.gui.controls.TextInputContextMenu; +import javafx.geometry.Pos; +import javafx.scene.control.Button; +import javafx.scene.control.ContentDisplay; +import javafx.scene.control.TextField; +import javafx.scene.layout.*; +import javafx.scene.text.Text; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.List; +import java.util.Objects; +import java.util.function.BiConsumer; +import java.util.function.Supplier; + +@NullMarked +final class SearchField extends HBox { + + private final TextField textField = new TextField(); + private final HBox controlsBox = new HBox(); + private final Text hintText = new Text(); + private final Button clearButton = new Button("clear"); + private final Button upButton = new Button(); + private final Button downButton = new Button(); + + private List navigableResult = List.of(); + private int position = -1; + private @Nullable BiConsumer navigationHandler; + + SearchField() { + super(); + + setId("scene-graph-search-field"); + + createLayout(); + initListeners(); + } + + String getText() { + return textField.getText() != null ? textField.getText().trim() : ""; + } + + @SuppressWarnings("SameParameterValue") + void setText(@Nullable String text) { + textField.setText(text != null ? text.trim() : ""); + } + + void setOnTextChange(@Nullable Runnable handler) { + if (handler != null) { + textField.setOnKeyReleased(event -> handler.run()); + } + } + + void setOnClearButtonClick(@Nullable Runnable handler) { + if (handler != null) { + clearButton.setOnMousePressed(event -> handler.run()); + } + } + + void setNavigableResult(@Nullable List result) { + this.navigableResult = Objects.requireNonNullElse(result, List.of()); + + controlsBox.setVisible(!isFieldClear()); + controlsBox.setManaged(!isFieldClear()); + + position = -1; // ready to be incremented + upButton.setDisable(navigableResult.size() <= 1); + downButton.setDisable(navigableResult.size() <= 1); + + updateHintText(); + } + + void setNavigationHandler(@Nullable BiConsumer navigationHandler) { + this.navigationHandler = navigationHandler; + } + + void navigatePrevious() { + if (navigationHandler != null) { + position = position - 1; + if (position < 0) { + position = navigableResult.size() - 1; + } + + navigationHandler.accept(position, navigableResult.get(position)); + updateHintText(); + } + } + + void navigateNext() { + if (navigationHandler != null) { + position = position + 1; + if (position > navigableResult.size() - 1) { + position = 0; + } + + navigationHandler.accept(position, navigableResult.get(position)); + updateHintText(); + } + } + + /////////////////////////////////////////////////////////////////////////// + + private void createLayout() { + Supplier iconGenerator = () -> { + var pane = new StackPane(); + pane.getStyleClass().add("icon"); + return pane; + }; + + textField.setPromptText("id or styleClass or nodeName"); + textField.setMaxWidth(Double.MAX_VALUE); + HBox.setHgrow(textField, Priority.ALWAYS); + textField.setContextMenu(new TextInputContextMenu(textField)); + + clearButton.setGraphic(iconGenerator.get()); + clearButton.setContentDisplay(ContentDisplay.GRAPHIC_ONLY); + clearButton.getStyleClass().add("clear-button"); + + hintText.getStyleClass().add("hint"); + + upButton.setGraphic(iconGenerator.get()); + upButton.setContentDisplay(ContentDisplay.GRAPHIC_ONLY); + upButton.getStyleClass().addAll("arrow-button", "up-button"); + + downButton.setGraphic(iconGenerator.get()); + downButton.setContentDisplay(ContentDisplay.GRAPHIC_ONLY); + downButton.getStyleClass().addAll("arrow-button", "down-button"); + + controlsBox.getStyleClass().add("controls"); + controlsBox.getChildren().setAll(clearButton, hintText, upButton, downButton); + controlsBox.setAlignment(Pos.CENTER_RIGHT); + HBox.setHgrow(controlsBox, Priority.NEVER); + controlsBox.setVisible(false); + controlsBox.setManaged(false); + + setAlignment(Pos.CENTER_LEFT); + getChildren().addAll(textField, controlsBox); + } + + private void initListeners() { + upButton.setOnAction(e -> navigatePrevious()); + downButton.setOnAction(e -> navigateNext()); + clearButton.disableProperty().bind(textField.textProperty().isEmpty()); + } + + private void updateHintText() { + if (isFieldClear()) { + hintText.setText(""); + return; + } + + hintText.setText(String.format("%d of %d", position + 1, navigableResult.size())); + } + + private boolean isFieldClear() { + return (textField.getText() == null || textField.getText().isBlank()) && navigableResult.isEmpty(); + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/preferences/PreferencesTab.java b/gui/src/main/java/devtoolsfx/gui/preferences/PreferencesTab.java new file mode 100644 index 0000000..c4c18c9 --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/preferences/PreferencesTab.java @@ -0,0 +1,154 @@ +package devtoolsfx.gui.preferences; + +import devtoolsfx.gui.Preferences; +import devtoolsfx.gui.ToolPane; +import javafx.geometry.Pos; +import javafx.scene.Node; +import javafx.scene.control.CheckBox; +import javafx.scene.control.Label; +import javafx.scene.control.TextField; +import javafx.scene.layout.FlowPane; +import javafx.scene.layout.HBox; +import javafx.scene.layout.VBox; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +@NullMarked +public class PreferencesTab extends VBox { + + public static final String TAB_NAME = "Preferences"; + + private final ToolPane toolPane; + + public PreferencesTab(ToolPane toolPane) { + super(); + + this.toolPane = toolPane; + + createLayout(); + } + + /////////////////////////////////////////////////////////////////////////// + + private void createLayout() { + getChildren().setAll( + createSceneGraphGroup(), + createInspectionGroup(), + createEventLogGroup() + ); + + setId("preferences-tab"); + getStyleClass().setAll("tab"); + } + + private VBox createSceneGraphGroup() { + var autoRefreshToggle = new CheckBox("Refresh automatically"); + autoRefreshToggle.selectedProperty().bindBidirectional( + toolPane.getPreferences().autoRefreshSceneGraphProperty() + ); + autoRefreshToggle.setDisable(true); + + var preventAutoHideToggle = new CheckBox("Prevent auto-hide for popup windows"); + preventAutoHideToggle.selectedProperty().bindBidirectional( + toolPane.getPreferences().preventPopupAutoHideProperty() + ); + + var collapseControlsToggle = new CheckBox("Collapse controls"); + collapseControlsToggle.selectedProperty().bindBidirectional( + toolPane.getPreferences().collapseControlsProperty() + ); + + var collapsePanesToggle = new CheckBox("Collapse panes"); + collapsePanesToggle.selectedProperty().bindBidirectional( + toolPane.getPreferences().collapsePanesProperty() + ); + + var content = new FlowPane( + autoRefreshToggle, + preventAutoHideToggle, + collapseControlsToggle, + collapsePanesToggle + ); + + return createPreferencesGroup("Scene Graph", content); + } + + private VBox createInspectionGroup() { + var layoutBoundsToggle = new CheckBox("Highlight layout bounds"); + layoutBoundsToggle.selectedProperty().bindBidirectional( + toolPane.getPreferences().showLayoutBoundsProperty() + ); + + var boundsInParentToggle = new CheckBox("Highlight bounds in parent"); + boundsInParentToggle.selectedProperty().bindBidirectional( + toolPane.getPreferences().showBoundsInParentProperty() + ); + + var baselineToggle = new CheckBox("Highlight baseline offset"); + baselineToggle.selectedProperty().bindBidirectional( + toolPane.getPreferences().showBaselineProperty() + ); + + var mouseTransparentToggle = new CheckBox("Ignore mouse transparent"); + mouseTransparentToggle.selectedProperty().bindBidirectional( + toolPane.getPreferences().ignoreMouseTransparentProperty() + ); + + var content = new FlowPane( + layoutBoundsToggle, + boundsInParentToggle, + baselineToggle, + mouseTransparentToggle + ); + + return createPreferencesGroup("Inspection", content); + } + + private VBox createEventLogGroup() { + var maxSizeField = new TextField(String.valueOf( + toolPane.getPreferences().getMaxEventLogSize() + )); + maxSizeField.textProperty().addListener( + (obs, old, val) -> toolPane.getPreferences().setMaxEventLogSize(parseEventLogSize(val)) + ); + + var maxSizeBox = new HBox(new Label("Max log size"), maxSizeField); + maxSizeBox.setSpacing(8); + maxSizeBox.setAlignment(Pos.CENTER_LEFT); + + var content = new FlowPane( + maxSizeBox + ); + + return createPreferencesGroup("Event Log", content); + } + + private VBox createPreferencesGroup(String name, Node content) { + var header = new Label(name); + header.getStyleClass().add("header"); + + content.getStyleClass().add("content"); + + var group = new VBox(header, content); + group.getStyleClass().add("group"); + + return group; + } + + private int parseEventLogSize(@Nullable String text) { + int nextVal = Preferences.DEFAULT_EVENT_LOG_SIZE; + + if (text != null && !text.isBlank()) { + try { + nextVal = Integer.parseInt(text); + } catch (NumberFormatException ignored) { + } + } + + if (nextVal < Preferences.MIN_EVENT_LOG_SIZE || nextVal > Preferences.MAX_EVENT_LOG_SIZE) { + nextVal = Preferences.DEFAULT_EVENT_LOG_SIZE; + } + + return nextVal; + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/style/Stylesheet.java b/gui/src/main/java/devtoolsfx/gui/style/Stylesheet.java new file mode 100644 index 0000000..f2588da --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/style/Stylesheet.java @@ -0,0 +1,24 @@ +package devtoolsfx.gui.style; + +import java.util.Base64; + +import static java.nio.charset.StandardCharsets.UTF_8; + +/** + * A wrapper for the stylesheet URI that provides additional information + * and utility methods. + */ +record Stylesheet(String uri, boolean isUserAgentStylesheet) { + + public static final String DATA_URI_PREFIX = "data:base64,"; + + boolean isDataURI() { + return uri.startsWith(DATA_URI_PREFIX); + } + + String decodeFromDataURI() { + return new String(Base64.getDecoder().decode( + uri.substring(DATA_URI_PREFIX.length()).getBytes(UTF_8) + ), UTF_8); + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/style/StylesheetTab.java b/gui/src/main/java/devtoolsfx/gui/style/StylesheetTab.java new file mode 100644 index 0000000..fcf6355 --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/style/StylesheetTab.java @@ -0,0 +1,161 @@ +package devtoolsfx.gui.style; + +import devtoolsfx.connector.ConnectorOptions; +import devtoolsfx.gui.ToolPane; +import devtoolsfx.gui.controls.Dialog; +import devtoolsfx.gui.controls.TextView; +import devtoolsfx.gui.util.Formatters; +import devtoolsfx.scenegraph.Element; +import devtoolsfx.scenegraph.NodeProperties; +import devtoolsfx.scenegraph.WindowProperties; +import javafx.scene.control.ContextMenu; +import javafx.scene.control.Label; +import javafx.scene.control.MenuItem; +import javafx.scene.control.TreeView; +import javafx.scene.layout.Priority; +import javafx.scene.layout.StackPane; +import javafx.scene.layout.VBox; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.List; +import java.util.Map; + +@NullMarked +public final class StylesheetTab extends VBox { + + public static final String TAB_NAME = "Stylesheets"; + + static final int ROOT_UID = -1; + static final String ROOT_ITEM_NAME = "Application"; + + private final ToolPane toolPane; + private final TreeView treeView = new TreeView<>(); + + private @Nullable Dialog textViewDialog = null; + + public StylesheetTab(ToolPane toolPane) { + super(); + + this.toolPane = toolPane; + + createLayout(); + } + + public void update() { + var treeRoot = StylesheetTreeItem.of(ROOT_UID, getPlatformUserAgentStylesheet(), true); + treeRoot.setExpanded(true); + + for (int uid : toolPane.getConnector().getMonitorIdentifiers()) { + Map.@Nullable Entry> data = toolPane.getConnector().getStyledElements(uid); + if (data == null || (data.getKey().sceneStylesheets().isEmpty() && data.getValue().isEmpty())) { + continue; + } + + WindowProperties windowProps = data.getKey(); + var window = StylesheetTreeItem.of(uid, Formatters.formatForTreeItem(uid, windowProps)); + window.setExpanded(true); + + if (windowProps.userAgentStylesheet() != null || !windowProps.sceneStylesheets().isEmpty()) { + window.getChildren().add(createTreeItem( + uid, + "Scene", + windowProps.sceneStylesheets(), + windowProps.userAgentStylesheet() + )); + } + + for (Element element : data.getValue()) { + if (!element.isNodeElement() || element.getNodeProperties() == null) { + continue; + } + + NodeProperties nodeProps = element.getNodeProperties(); + window.getChildren().add(createTreeItem( + uid, + Formatters.formatForTreeItem(element.getSimpleClassName(), nodeProps), + nodeProps.stylesheets(), + nodeProps.userAgentStylesheet() + )); + } + + treeRoot.getChildren().add(window); + } + + treeView.setRoot(treeRoot); + treeView.setShowRoot(true); + } + + /////////////////////////////////////////////////////////////////////////// + + private void createLayout() { + treeView.setContextMenu(createContextMenu()); + treeView.setCellFactory(param -> + new StylesheetTreeCell( + this::getOrCreateTextViewDialog, + this::getSourceCode + ) + ); + VBox.setVgrow(treeView, Priority.ALWAYS); + + var hintIcon = new StackPane(); + hintIcon.getStyleClass().add("icon"); + + var hintLabel = new Label("user agent stylesheet", hintIcon); + hintLabel.getStyleClass().add("hint"); + + setId("stylesheet-tab"); + getStyleClass().setAll("tab"); + getChildren().setAll(treeView, hintLabel); + } + + private ContextMenu createContextMenu() { + var refresh = new MenuItem("Refresh"); + refresh.setOnAction(e -> update()); + + var contextMenu = new ContextMenu(); + contextMenu.setId(ConnectorOptions.AUX_NODE_ID_PREFIX + "stylesheetOptionsMenu"); + contextMenu.getItems().addAll(refresh); + + return contextMenu; + } + + private StylesheetTreeItem createTreeItem(int uid, + String name, + List stylesheets, + @Nullable String userAgentStyleSheet) { + var parent = StylesheetTreeItem.of(uid, name); + parent.setExpanded(true); + + if (userAgentStyleSheet != null) { + parent.getChildren().add(StylesheetTreeItem.of(uid, userAgentStyleSheet, true)); + } + + for (String uri : stylesheets) { + var child = StylesheetTreeItem.of(uid, uri, false); + parent.getChildren().add(child); + } + + return parent; + } + + private String getPlatformUserAgentStylesheet() { + return toolPane.getConnector().getUserAgentStylesheet(); + } + + private @Nullable String getSourceCode(int uid, Stylesheet stylesheet) { + if (stylesheet.isDataURI()) { + return stylesheet.decodeFromDataURI(); + } + + return toolPane.getConnector().getResource(uid, stylesheet.uri()); + } + + private Dialog getOrCreateTextViewDialog() { + if (textViewDialog == null) { + textViewDialog = new Dialog<>(new TextView(), "Source Code", 640, 480); + } + + return textViewDialog; + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/style/StylesheetTreeCell.java b/gui/src/main/java/devtoolsfx/gui/style/StylesheetTreeCell.java new file mode 100644 index 0000000..f8af906 --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/style/StylesheetTreeCell.java @@ -0,0 +1,86 @@ +package devtoolsfx.gui.style; + +import devtoolsfx.gui.controls.Dialog; +import devtoolsfx.gui.controls.TextView; +import devtoolsfx.gui.util.Formatters; +import javafx.css.PseudoClass; +import javafx.scene.control.TreeCell; +import javafx.scene.input.MouseButton; +import javafx.scene.layout.StackPane; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.Objects; +import java.util.function.BiFunction; +import java.util.function.Supplier; + +@NullMarked +final class StylesheetTreeCell extends TreeCell { + + private static final PseudoClass UA_STYLESHEET = PseudoClass.getPseudoClass("user-agent"); + private static final int MAX_NUMBER_OF_LINES = 3; + + private final StackPane icon = new StackPane(); + + public StylesheetTreeCell(Supplier> textViewDialog, + BiFunction sourceCodeProvider) { + super(); + + icon.getStyleClass().add("icon"); + + setOnMouseClicked(e -> { + if (e.getButton() == MouseButton.PRIMARY + && e.getClickCount() == 2 + && getTreeItem() instanceof StylesheetTreeItem item + && item.isLeaf() + && item.getStylesheet() != null) { + + Dialog dialog = textViewDialog.get(); + dialog.getRoot().setText(Objects.requireNonNullElse( + sourceCodeProvider.apply(item.getUid(), item.getStylesheet()), + "Unable to obtain the source code." + )); + dialog.show(); + dialog.toFront(); + } + }); + } + + @Override + protected void updateItem(String value, boolean empty) { + super.updateItem(value, empty); + + if (empty) { + setText(null); + setGraphic(null); + pseudoClassStateChanged(UA_STYLESHEET, false); + return; + } + + String text = value; + boolean isUserAgentStylesheet = false; + + if (getTreeItem() instanceof StylesheetTreeItem item && item.getStylesheet() != null) { + Stylesheet stylesheet = item.getStylesheet(); + text = stylesheet.uri(); + + if (item.getUid() == StylesheetTab.ROOT_UID) { + text = StylesheetTab.ROOT_ITEM_NAME + " [" + text + "]"; + } + + if (stylesheet.isDataURI()) { + text = Formatters.limitNumberOfLines(stylesheet.decodeFromDataURI(), MAX_NUMBER_OF_LINES, "\n..."); + } + + if (stylesheet.isUserAgentStylesheet()) { + isUserAgentStylesheet = true; + setGraphic(icon); + } else { + setGraphic(null); + } + } + + setText(text); + pseudoClassStateChanged(UA_STYLESHEET, isUserAgentStylesheet); + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/style/StylesheetTreeItem.java b/gui/src/main/java/devtoolsfx/gui/style/StylesheetTreeItem.java new file mode 100644 index 0000000..7a82056 --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/style/StylesheetTreeItem.java @@ -0,0 +1,34 @@ +package devtoolsfx.gui.style; + +import javafx.scene.control.TreeItem; +import org.jspecify.annotations.Nullable; + +final class StylesheetTreeItem extends TreeItem { + + private final int uid; + private final @Nullable Stylesheet stylesheet; + + public StylesheetTreeItem(int uid, String value, @Nullable Stylesheet stylesheet) { + super(value); + this.uid = uid; + this.stylesheet = stylesheet; + } + + int getUid() { + return uid; + } + + @Nullable Stylesheet getStylesheet() { + return stylesheet; + } + + /////////////////////////////////////////////////////////////////////////// + + public static StylesheetTreeItem of(int uid, String name) { + return new StylesheetTreeItem(uid, name, null); + } + + public static StylesheetTreeItem of(int uid, String uri, boolean isUserAgentStylesheet) { + return new StylesheetTreeItem(uid, uri, new Stylesheet(uri, isUserAgentStylesheet)); + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/util/DummyElement.java b/gui/src/main/java/devtoolsfx/gui/util/DummyElement.java new file mode 100644 index 0000000..0945c80 --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/util/DummyElement.java @@ -0,0 +1,73 @@ +package devtoolsfx.gui.util; + +import devtoolsfx.scenegraph.ClassInfo; +import devtoolsfx.scenegraph.Element; +import devtoolsfx.scenegraph.NodeProperties; +import devtoolsfx.scenegraph.WindowProperties; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.List; + +/** + * Dummy class to represent the root of a scene graph element tree. + */ +@NullMarked +public final class DummyElement implements Element { + + private final String name; + + public DummyElement(String name) { + this.name = name; + } + + @Override + public int getUID() { + return hashCode(); + } + + @Override + public ClassInfo getClassInfo() { + return new ClassInfo("", "", name); + } + + @Override + public String getSimpleClassName() { + return name; + } + + @Override + public @Nullable Element getParent() { + return null; + } + + @Override + public List getChildren() { + return List.of(); + } + + @Override + public boolean hasChildren() { + return false; + } + + @Override + public @Nullable NodeProperties getNodeProperties() { + return null; + } + + @Override + public @Nullable WindowProperties getWindowProperties() { + return null; + } + + @Override + public boolean isWindowElement() { + return false; + } + + @Override + public boolean isNodeElement() { + return false; + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/util/Formatters.java b/gui/src/main/java/devtoolsfx/gui/util/Formatters.java new file mode 100644 index 0000000..4540de1 --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/util/Formatters.java @@ -0,0 +1,179 @@ +package devtoolsfx.gui.util; + +import devtoolsfx.scenegraph.Element; +import devtoolsfx.scenegraph.NodeProperties; +import devtoolsfx.scenegraph.WindowProperties; +import javafx.scene.paint.Color; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.io.PrintWriter; +import java.io.StringWriter; + +@NullMarked +public final class Formatters { + + /** + * Returns the HEX string representation of the specified color. + */ + public static String colorToHexString(@Nullable Color color) { + if (color == null) { + return ""; + } + + if (color.getOpacity() == 1) { + return String.format("#%02X%02X%02X", + (int) (color.getRed() * 255), + (int) (color.getGreen() * 255), + (int) (color.getBlue() * 255) + ).toUpperCase(); + } + + return String.format("#%02X%02X%02X%02X", + (int) (color.getRed() * 255), + (int) (color.getGreen() * 255), + (int) (color.getBlue() * 255), + (int) (color.getOpacity() * 255) + ).toUpperCase(); + } + + /** + * Returns the RGBA string representation of the specified color. + */ + public static String colorToRgbString(@Nullable Color color) { + if (color == null) { + return ""; + } + + if (color.getOpacity() == 1) { + return "rgb(%d, %d, %d)".formatted( + (int) (color.getRed() * 255), + (int) (color.getGreen() * 255), + (int) (color.getBlue() * 255) + ); + } + + return "rgba(%d, %d, %d, %s)".formatted( + (int) (color.getRed() * 255), + (int) (color.getGreen() * 255), + (int) (color.getBlue() * 255), + color.getOpacity() % 1.0 != 0 + ? String.format("%s", color.getOpacity()) + : String.format("%.0f", color.getOpacity()) + ); + } + + /** + * Returns the conventional representation of the element for display in the scene graph tree. + */ + public static String formatForTreeItem(Element element) { + var text = element.getSimpleClassName(); + + if (element.isNodeElement()) { + var props = element.getNodeProperties(); + if (props != null) { + text = formatForTreeItem(element.getSimpleClassName(), props); + } + } + + if (element.isWindowElement()) { + var props = element.getWindowProperties(); + if (props != null) { + text = formatForTreeItem(element.getUID(), props); + } + } + + return text; + } + + /** + * See {@link #formatForTreeItem(Element)}. + */ + public static String formatForTreeItem(String className, NodeProperties props) { + var text = className; + + if (props.id() != null) { + text += " " + asPropertyString("id", props.id()); + } + + if (!props.styleClass().isEmpty()) { + text += " " + asPropertyString("class", String.join(" ", props.styleClass())); + } + + return text; + } + + /** + * See {@link #formatForTreeItem(Element)}. + */ + public static String formatForTreeItem(int uid, WindowProperties props) { + String text; + if (props.isPrimaryStage()) { + text = "Primary Stage"; + } else { + text = switch (props.windowType()) { + case STAGE -> "Stage" + ( + props.windowTitle() != null + ? " [" + asPropertyString("title", props.windowTitle()) + "]" + : "@" + uid + ); + case MODAL -> "Modal" + ( + props.windowTitle() != null + ? " [" + asPropertyString("title", props.windowTitle()) + "]" + : "@" + uid + ); + case ALERT -> "Alert" + ( + props.windowTitle() != null + ? " [" + asPropertyString("title", props.windowTitle()) + "]" + : "@" + uid + ); + case POPUP -> "Popup" + ( + props.ownerClassName() != null + ? " [" + asPropertyString("owner", props.ownerClassName()) + : "@" + uid + ); + }; + } + return text; + } + + /** + * Returns a string in the format {@code key="value"}. + */ + public static String asPropertyString(String key, String value) { + return key + "=\"" + value + "\""; + } + + /** + * Trims the specified string to a maximum of {@code count} lines. + * If the string exceeds this limit, it appends the {@code ellipsis} string. + */ + public static String limitNumberOfLines(String s, int count, String ellipsis) { + String[] lines = s.split("\n"); + + if (lines.length <= count) { + return s; + } else { + var sb = new StringBuilder(); + for (int i = 0; i < count; i++) { + sb.append(lines[i]); + if (i < count - 1) { + sb.append("\n"); + } + } + sb.append(ellipsis); + + return sb.toString(); + } + } + + /** + * Returns the stack trace of the exception as a string. + */ + public static String exceptionToString(Exception e) { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + e.printStackTrace(pw); + return sw.toString(); + } +} diff --git a/gui/src/main/java/devtoolsfx/gui/util/GUIHelpers.java b/gui/src/main/java/devtoolsfx/gui/util/GUIHelpers.java new file mode 100644 index 0000000..d787e77 --- /dev/null +++ b/gui/src/main/java/devtoolsfx/gui/util/GUIHelpers.java @@ -0,0 +1,66 @@ +package devtoolsfx.gui.util; + +import javafx.scene.control.ListView; +import javafx.scene.control.TreeItem; +import javafx.scene.control.TreeTableView; +import javafx.scene.input.Clipboard; +import javafx.scene.input.ClipboardContent; +import org.jspecify.annotations.NullMarked; +import org.jspecify.annotations.Nullable; + +import java.util.function.Function; + +@NullMarked +public final class GUIHelpers { + + /** + * Sets system clipboard content. + * Null value is ignored. + */ + public static void setClipboard(@Nullable String s) { + if (s == null) { + return; + } + + Clipboard clipboard = Clipboard.getSystemClipboard(); + ClipboardContent content = new ClipboardContent(); + content.putString(s); + clipboard.setContent(content); + } + + /** + * Copies selected items from the TreeTableView to the system clipboard. + */ + public static void copySelectedRowsToClipboard(TreeTableView table, + Function stringConverter) { + if (table.getSelectionModel().isEmpty()) { + return; + } + + var sb = new StringBuilder(); + for (TreeItem item : table.getSelectionModel().getSelectedItems()) { + sb.append(stringConverter.apply(item.getValue())); + sb.append('\n'); + } + + setClipboard(sb.toString()); + } + + /** + * Copies selected items from the ListView to the system clipboard. + */ + public static void copySelectedRowsToClipboard(ListView table, + Function stringConverter) { + if (table.getSelectionModel().isEmpty()) { + return; + } + + var sb = new StringBuilder(); + for (S value : table.getSelectionModel().getSelectedItems()) { + sb.append(stringConverter.apply(value)); + sb.append('\n'); + } + + setClipboard(sb.toString()); + } +} diff --git a/gui/src/main/java/module-info.java b/gui/src/main/java/module-info.java new file mode 100755 index 0000000..877400f --- /dev/null +++ b/gui/src/main/java/module-info.java @@ -0,0 +1,8 @@ +module devtoolsfx.gui { + + requires javafx.controls; + requires devtoolsfx.connector; + requires static org.jspecify; + + exports devtoolsfx.gui; +} diff --git a/gui/src/main/resources/index.css b/gui/src/main/resources/index.css new file mode 100644 index 0000000..4232f45 --- /dev/null +++ b/gui/src/main/resources/index.css @@ -0,0 +1,929 @@ +.root { + /* palette */ + -palette-color-bg: #ffffff; + -palette-color-bg-hover: #f5f5f5; + -palette-color-fg: #24292f; + -palette-color-fg-muted: #818e9e; + -palette-color-border: #d0d7de; + -palette-color-neutral: #edf2fa; + -palette-color-neutral-hover: #d2dff3; + -palette-color-accent: #0969da; + -palette-color-danger: #cf222e; + -palette-color-success: #1a7f37; + -palette-color-warning: #fff8c5; + + /* base */ + -fx-background-color: -palette-color-bg; + -fx-font-size: 13px; + + /* semantic colors */ + -color-cell-bg: -palette-color-bg; + -color-cell-fg: -palette-color-fg; + -color-cell-bg-selected: -palette-color-neutral; + -color-cell-fg-selected: -palette-color-fg; + -color-cell-bg-selected-focused: -palette-color-neutral; + -color-cell-fg-selected-focused: -palette-color-fg; + -color-cell-border: -palette-color-border; + -color-cell-disclosure: -palette-color-fg; + -color-cell-header-bg: -palette-color-neutral; + -color-cell-header-fg: -palette-color-fg; + + -color-split-divider: -palette-color-border; + -color-split-divider-pressed: -palette-color-accent; + -color-split-grabber: -palette-color-border; + -color-split-grabber-pressed: -palette-color-accent; + + -color-input-bg: -palette-color-bg; + -color-input-fg: -palette-color-fg; + -color-input-border: -palette-color-border; + -color-input-bg-focused: -palette-color-bg; + -color-input-border-focused: -palette-color-accent; + -color-input-bg-readonly: -palette-color-bg-hover; + -color-input-bg-highlight: -palette-color-neutral; + -color-input-fg-highlight: -palette-color-fg; + + -color-button-bg: -palette-color-bg; + -color-button-fg: -palette-color-fg; + -color-button-border: -palette-color-border; + -color-button-bg-hover: -palette-color-bg-hover; + -color-button-fg-hover: -palette-color-fg; + -color-button-border-hover: -palette-color-border; + -color-button-bg-focused: -palette-color-bg; + -color-button-fg-focused: -palette-color-fg; + -color-button-border-focused: -palette-color-border; + -color-button-bg-pressed: -palette-color-bg; + -color-button-fg-pressed: -color-button-fg; + -color-button-border-pressed: -palette-color-border; +} + +/****************************************************************************** +* JavaFX Controls / Theme +******************************************************************************/ + +.text { + -fx-font-smoothing-type: lcd; + -fx-bounds-type: logical_vertical_center; +} + +Text { + -fx-fill: -palette-color-fg; +} + +.label { + -fx-text-fill: -palette-color-fg; + -fx-font-weight: normal; +} +.label:disabled { + -fx-opacity: 0.4; +} + +.list-view { + -fx-border-color: -color-cell-border; + -fx-border-width: 1px; + -fx-border-radius: 0; +} +.list-view > .virtual-flow > .corner { + -fx-background-color: -color-cell-border; + -fx-opacity: 0.4; +} +.list-view .list-cell { + -fx-background-color: -color-cell-bg; + -fx-text-fill: -color-cell-fg; + -fx-padding: 4px; + -fx-cell-size: -1; + -fx-border-width: 0; +} + +.tree-view { + -fx-border-color: -color-cell-border; + -fx-border-width: 1px; + -fx-border-radius: 0; +} +.tree-view > .virtual-flow > .corner { + -fx-background-color: -color-cell-border; + -fx-opacity: 0.4; +} +.tree-cell { + -fx-background-color: -color-cell-bg; + -fx-text-fill: -color-cell-fg; + -fx-padding: 4px; + -fx-cell-size: -1; +} +.tree-cell > .tree-disclosure-node { + -fx-padding: 0.35em 0.5em 0 0.5em; + -fx-background-color: transparent; +} +.tree-cell > .tree-disclosure-node > .arrow, +.tree-table-row-cell > .tree-disclosure-node > .arrow { + -fx-shape: "M10 17l5-5-5-5v10z"; + -fx-scale-shape: false; + -fx-background-color: -color-cell-disclosure; + -fx-padding: 0.333333em; +} +.tree-cell:expanded > .tree-disclosure-node > .arrow, +.tree-table-row-cell:expanded > .tree-disclosure-node > .arrow { + -fx-shape: "M7 10l5 5 5-5z"; + -fx-scale-shape: false; +} + +.tree-table-view { + -fx-border-color: -color-cell-border; + -fx-border-width: 1px; + -fx-border-radius: 0; +} +.tree-table-view > .virtual-flow > .corner { + -fx-background-color: -color-cell-border; + -fx-opacity: 0.4; +} +.tree-table-view > .column-header-background { + -fx-background-color: -color-cell-border, -color-cell-header-bg; + -fx-background-insets: 0, 0 0 1 0; +} +.tree-table-view > .column-header-background .column-header { + -fx-size: 2em; + -fx-background-color: transparent; + -fx-background-insets: 0; + -fx-padding: 0; + -fx-font-weight: bold; + -fx-border-color: -color-cell-border; + -fx-border-width: 0 1 1 0; +} +.tree-table-view > .column-header-background .column-header .label { + -fx-text-fill: -color-cell-header-fg; + -fx-alignment: CENTER_LEFT; + -fx-padding: 0 4px 0 4px; +} +.tree-table-view > .column-header-background .column-header GridPane { + -fx-padding: 0 4px 0 0; +} +.tree-table-view > .column-header-background .column-header .arrow { + -fx-background-color: -color-cell-header-fg; + -fx-padding: 3px 4px 3px 4px; + -fx-shape: "M 0 0 h 7 l -3.5 4 z"; +} +.tree-table-view > .column-header-background > .filler { + -fx-background-color: transparent; + -fx-border-color: transparent; + -fx-border-width: 0; +} +.tree-table-view .column-resize-line { + -fx-padding: 0 1 0 1; + -fx-background-color: -palette-color-accent; +} +.tree-table-view .placeholder > .label { + -fx-font-size: 1.25em; +} +.tree-table-view .tree-table-row-cell { + -fx-cell-size: -1; + -fx-background-color: -color-cell-bg; + -fx-background-insets: 0; + -fx-padding: 0; + -fx-indent: 0; +} +.tree-table-view .tree-table-row-cell:empty { + -fx-background-color: transparent; + -fx-background-insets: 0; +} +.tree-table-view .tree-table-row-cell > .tree-disclosure-node { + -fx-padding: 0.5em; + -fx-background-color: transparent; +} +.tree-table-view .tree-table-row-cell > .tree-table-cell { + -fx-padding: 0; + -fx-text-fill: -color-cell-fg; + -fx-alignment: BASELINE_LEFT; +} + +.list-view > .virtual-flow > .clipped-container > .sheet > .list-cell:filled:selected, +.tree-view > .virtual-flow > .clipped-container > .sheet > .tree-cell:filled:selected, +.tree-table-view > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell:filled:selected { + -color-cell-fg: -color-cell-fg-selected; + -fx-background-color: -color-cell-bg-selected; +} +.list-view:focused > .virtual-flow > .clipped-container > .sheet > .list-cell:filled:selected, +.tree-table-view:focused > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell:filled:selected { + -color-cell-fg: -color-cell-fg-selected-focused; + -fx-background-color: -color-cell-bg-selected-focused; +} +.tree-table-view > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell .tree-table-cell:selected { + -fx-background-color: -color-cell-bg-selected; +} +.tree-table-view:focused > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell .tree-table-cell:selected { + -fx-background-color: -color-cell-bg-selected-focused; +} +.tree-table-view:constrained-resize > .virtual-flow > .clipped-container > .sheet > .tree-table-row-cell > .tree-table-cell:last-visible { + -fx-border-color: transparent; +} + +.scroll-bar { + -fx-background-color: -palette-color-bg; + -fx-opacity: 0.75; +} +.scroll-bar > .thumb { + -fx-background-color: -palette-color-border; + -fx-background-radius: 0; +} +.scroll-bar > .track { + -fx-background-color: transparent; + -fx-border-radius: 0; +} +.scroll-bar > .increment-button { + visibility: hidden; + -fx-managed: false; +} +.scroll-bar > .increment-button > .increment-arrow { + -fx-shape: " "; + -fx-padding: 0; +} +.scroll-bar > .decrement-button { + visibility: hidden; + -fx-managed: false; +} +.scroll-bar > .decrement-button > .decrement-arrow { + -fx-shape: " "; + -fx-padding: 0; +} +.scroll-bar:horizontal { + -fx-pref-height: 8px; +} +.scroll-bar:vertical { + -fx-pref-width: 8px; +} +.scroll-bar:hover, .scroll-bar:pressed, .scroll-bar:focused { + -fx-opacity: 1; +} + +.scroll-pane { + -fx-background-color: transparent; + -fx-background-insets: 0; + -fx-background-radius: 0; + -fx-padding: 0; +} +.scroll-pane > .viewport { + -fx-background-color: transparent; +} +.scroll-pane > .corner { + -fx-background-color: -palette-color-border; + -fx-opacity: 0.5; +} +.scroll-pane:disabled > .scroll-bar { + -fx-opacity: 0.25; +} + +.split-pane { + -fx-background-color: transparent; + -fx-background-insets: 0; + -fx-padding: 0; +} +.split-pane > .split-pane-divider { + -fx-background-color: -color-split-divider; + -fx-padding: 0 2px 0 2px; + -fx-opacity: 0.5; +} +.split-pane > .split-pane-divider > .horizontal-grabber { + -fx-background-color: -color-split-grabber; + -fx-padding: 10px 2px 10px 2px; +} +.split-pane > .split-pane-divider > .vertical-grabber { + -fx-background-color: -color-split-grabber; + -fx-padding: 2px 10px 2px 10px; +} +.split-pane > .split-pane-divider:pressed { + -fx-background-color: -color-split-divider-pressed; +} +.split-pane > .split-pane-divider:pressed > .horizontal-grabber, +.split-pane > .split-pane-divider:pressed > .vertical-grabber { + -fx-background-color: -color-split-grabber-pressed; +} +.split-pane > .split-pane-divider:hover { + -fx-opacity: 1; +} +.split-pane > .split-pane-divider:disabled { + -fx-opacity: 0.25; +} + +.check-box { + -fx-text-fill: -palette-color-fg; + -fx-label-padding: 2px 2px 0 6px; +} +.check-box > .box { + -fx-background-color: -palette-color-border, -palette-color-bg; + -fx-background-insets: 0, 1.5px; + -fx-background-radius: 4px, 3px; + -fx-padding: 3px 4px 3px 4px; + -fx-alignment: CENTER; +} +.check-box > .box > .mark { + -fx-background-color: -palette-color-bg; + -fx-shape: "M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"; + -fx-scale-shape: true; + -fx-min-height: 0.75em; + -fx-max-height: 0.75em; + -fx-min-width: 0.75em; + -fx-max-width: 0.75em; +} +.check-box > .box:hover, +.check-box:selected > .box:hover { + -fx-background-color: -palette-color-border, -palette-color-bg-hover; +} +.check-box:disabled { + -fx-opacity: 0.4; +} +.check-box:disabled > .box { + -fx-opacity: 0.4; +} +.check-box:selected > .box { + -fx-background-color: -palette-color-border, -palette-color-bg; +} +.check-box:selected > .box > .mark { + -fx-background-color: -palette-color-accent; +} + +.text-input { + -fx-background-color: -color-input-border, -color-input-bg; + -fx-background-insets: 0, 1px; + -fx-background-radius: 4px, 3px; + -fx-text-fill: -color-input-fg; + -fx-highlight-fill: -color-input-bg-highlight; + -fx-highlight-text-fill: -color-input-fg-highlight; + -fx-prompt-text-fill: -palette-color-fg-muted; + -fx-padding: 4px 8px 4px 8px; + -fx-cursor: text; +} +.text-input:focused { + -fx-background-color: -color-input-border-focused, -color-input-bg-focused; + -fx-prompt-text-fill: transparent; +} +.text-input:disabled { + -fx-opacity: 0.4; +} +.text-input:disabled > .scroll-pane { + -fx-opacity: 1; +} +.text-input:readonly { + -fx-background-color: -color-input-border, -color-input-bg-readonly; +} +.text-input:readonly:focused { + -fx-background-color: -color-input-border-focused, -color-input-bg-readonly; +} +.text-input .context-menu { + -fx-font-size: 13px; + -fx-font-weight: normal; +} +.text-input .context-menu .menu-item { + -fx-cursor: default; +} + +.text-area { + -fx-padding: 2px; + -fx-cursor: default; +} +.text-area .content { + -fx-cursor: text; + -fx-padding: 8px 12px 8px 12px; +} + +.menu-button { + -fx-background-color: -color-button-border, -color-button-bg; + -fx-background-insets: 0, 1px; + -fx-background-radius: 4px, 3px; + -fx-graphic-text-gap: 6px; + -fx-text-fill: -color-button-fg; + -fx-alignment: CENTER; + -fx-padding: 0; + -fx-alignment: CENTER_LEFT; +} +.menu-button:disabled { + -fx-opacity: 0.4; + -fx-effect: none; +} +.menu-button > .label { + -fx-padding: 4px 8px 4px 8px; + -fx-text-fill: -color-button-fg; +} +.menu-button > .arrow-button { + -fx-padding: 4px 8px 4px 0; +} +.menu-button > .arrow-button > .arrow { + -fx-shape: "M10 17l5-5-5-5v10z"; + -fx-scale-shape: false; + -fx-background-color: -color-button-fg; + -fx-min-width: 0.5em; +} +.menu-button:openvertically > .arrow-button > .arrow { + -fx-shape: "M7 10l5 5 5-5z"; + -fx-scale-shape: false; +} +.menu-button:hover { + -fx-background-color: -color-button-border-hover, -color-button-bg-hover; + -fx-opacity: 0.9; +} +.menu-button:hover > .label { + -fx-text-fill: -color-button-fg-hover; +} +.menu-button:hover > .arrow-button > .arrow { + -fx-background-color: -color-button-fg-hover; +} +.menu-button:focused { + -fx-background-color: -color-button-border-focused, -color-button-bg-focused; +} +.menu-button:focused > .label { + -fx-text-fill: -color-button-fg-focused; +} +.menu-button:focused > .arrow-button > .arrow { + -fx-background-color: -color-button-fg-focused; +} +.menu-button:armed, .menu-button:focused:armed { + -fx-background-color: -color-button-border-pressed, -color-button-bg-pressed; + -fx-text-fill: -color-button-fg-pressed; +} +.menu-button:armed > .label, .menu-button:focused:armed > .label { + -fx-text-fill: -color-button-fg-pressed; +} +.menu-button:armed > .arrow-button > .arrow, .menu-button:focused:armed > .arrow-button > .arrow { + -fx-background-color: -color-button-fg-pressed; +} +.menu-button:disabled > .label { + -fx-opacity: 1; +} + +.context-menu { + -fx-background-color: -palette-color-border, -palette-color-bg; + -fx-background-insets: 0, 1; + -fx-padding: 4px; + -fx-background-radius: 0; + -fx-effect: dropshadow(three-pass-box, -palette-color-border, 6px, 0.3, 0, 2); +} +.context-menu > .scroll-arrow { + -fx-padding: 0.5em; + -fx-background-color: transparent; +} +.context-menu > .scroll-arrow:hover { + -fx-background-color: -palette-color-fg; + -fx-text-fill: -color-fg-default; +} +.context-menu .separator:horizontal { + -fx-padding: 0.25em 0 0.25em 0; +} +.context-menu .separator:horizontal .line { + -fx-border-color: -palette-color-border transparent transparent transparent; + -fx-border-insets: 1px 0.5em 0 0.5em; +} + +.menu { + -fx-background-color: transparent; +} +.menu > .right-container > .arrow { + -fx-shape: "M10 6L8.59 7.41 13.17 12l-4.58 4.59L10 18l6-6z"; + -fx-scale-shape: false; + -fx-background-color: -palette-color-fg; +} +.menu-up-arrow { + -fx-shape: "M7 14l5-5 5 5z"; + -fx-scale-shape: true; + -fx-background-color: -palette-color-fg; + -fx-padding: 3px 4px 3px 4px; +} +.menu-down-arrow { + -fx-shape: "M7 10l5 5 5-5z"; + -fx-scale-shape: true; + -fx-background-color: -palette-color-fg; + -fx-padding: 3px 4px 3px 4px; +} +.menu-item { + -fx-background-color: -palette-color-bg; + -fx-padding: 4px; + -fx-background-radius: 5px; +} +.menu-item > .graphic-container { + -fx-padding: 0 6px 0 0; +} +.menu-item > .label { + -fx-padding: 0 1em 0 0; + -fx-text-fill: -palette-color-fg; +} +.menu-item > .left-container { + -fx-padding: 0 1em 0 0; +} +.menu-item > .right-container { + -fx-padding: 0 0 0 0.5em; +} +.menu-item:focused { + -fx-background-color: -palette-color-bg-hover, -palette-color-bg-hover; +} +.menu-item:focused > .label { + -fx-text-fill: -palette-color-fg; +} +.menu-item:focused > .right-container > .arrow { + -fx-background-color: -palette-color-fg; +} +.menu-item:focused .font-icon, .menu-item:focused .ikonli-font-icon { + -fx-fill: -palette-color-fg; +} +.menu-item:disabled { + -fx-opacity: 0.4; +} +.radio-menu-item:checked > .left-container > .radio, +.check-menu-item:checked > .left-container > .check { + -fx-shape: "M9 16.17L4.83 12l-1.42 1.41L9 19 21 7l-1.41-1.41z"; + -fx-scale-shape: true; + -fx-background-color: -palette-color-fg; + -fx-min-height: 0.75em; + -fx-min-width: 0.75em; + -fx-max-height: 0.75em; + -fx-max-width: 0.75em; +} +.radio-menu-item:hover:checked > .left-container > .radio, +.radio-menu-item:focused:checked > .left-container > .radio, +.check-menu-item:hover:checked > .left-container > .check, +.check-menu-item:focused:checked > .left-container > .check { + -fx-background-color: -palette-color-fg; +} + +.tooltip { + -fx-background-color: -palette-color-border, -palette-color-bg; + -fx-background-insets: 0, 1px; + -fx-background-radius: 4px, 3px; + -fx-text-fill: -palette-color-fg; + -fx-font-size: 13px; + -fx-font-weight: normal; + -fx-padding: 8px 12px 8px 12px; + -fx-opacity: 0.85; + -fx-effect: dropshadow(three-pass-box, -palette-color-border, 6px, 0.3, 0, 2); +} + +.hyperlink { + -fx-text-fill: -palette-color-accent; + -fx-underline: true; + -fx-cursor: hand; +} +.hyperlink:visited { + -fx-text-fill: -palette-color-accent; +} + +/****************************************************************************** +* Layout +******************************************************************************/ + +.tab { + -fx-background-color: -palette-color-bg; +} + +/****************************************************************************** +* Inspector +******************************************************************************/ + +#inspect-button { + -fx-padding: 4px 10px 4px 10px; +} +#inspect-button:hover { + -fx-cursor: hand; +} +#inspect-button .icon { + /* MaterialSymbols.SELECT_ALL */ + -fx-shape: "M294-294v-372h372v372H294Zm72-72h228v-228H366v228ZM216-216v72q-29.7 0-50.85-21.15Q144-186.3 144-216h72Zm-72-78v-72h72v72h-72Zm0-150v-72h72v72h-72Zm0-150v-72h72v72h-72Zm72-150h-72q0-29.7 21.15-50.85Q186.3-816 216-816v72Zm78 600v-72h72v72h-72Zm0-600v-72h72v72h-72Zm150 600v-72h72v72h-72Zm0-600v-72h72v72h-72Zm150 600v-72h72v72h-72Zm0-600v-72h72v72h-72Zm150 600v-72h72q0 30-21.15 51T744-144Zm0-150v-72h72v72h-72Zm0-150v-72h72v72h-72Zm0-150v-72h72v72h-72Zm0-150v-72q29.7 0 50.85 21.15Q816-773.7 816-744h-72Z"; -fx-min-width: 1em; + -fx-pref-width: 1em; + -fx-max-width: 1em; + -fx-min-height: 1em; + -fx-pref-height: 1em; + -fx-max-height: 1em; + -fx-background-color: -palette-color-fg; +} +#inspect-button:active .icon, +#inspect-button:hover .icon { + -fx-opacity: 1.0; + -fx-background-color: -palette-color-accent; +} + +#scenegraph-pane > .filter { + -fx-padding: 1px; +} +#scene-graph-tree { + -fx-border-width: 0 0 1 0; +} +#scene-graph-tree .tree-cell:hidden .label { + -fx-text-fill: -palette-color-fg-muted; +} +#scene-graph-tree .tree-cell .label { + -fx-padding: 0; +} +#scene-graph-tree .tree-cell:filtered .label { + -fx-background-color: -palette-color-warning; +} + +#scene-graph-search-field { + -fx-background-color: -palette-color-bg, -palette-color-bg; + -fx-background-insets: 0, 2; + -fx-padding: 2px; + -fx-spacing: 4px; + -fx-background-radius: 5px; +} +#scene-graph-search-field:focus-within { + -fx-background-color: -palette-color-accent, -palette-color-bg; +} +#scene-graph-search-field > .text-field { + -fx-background-color: -palette-color-bg; + -fx-background-color: transparent; + -fx-background-insets: 0; + -fx-background-radius: 3px; + -fx-text-fill: -palette-color-fg; + -fx-padding: 2px 6px 2px 6px; +} +#scene-graph-search-field > .controls { + -fx-spacing: 4px; + -fx-padding: 0 4px 0 0; + -fx-background-color: transparent; + -fx-background-radius: 5px; +} +#scene-graph-search-field > .controls > .button { + -fx-background-color: -palette-color-bg; + -fx-padding: 0; + -fx-background-insets: 0; + -fx-background-radius: 0; + -fx-graphic-text-gap: 0; + -fx-text-fill: -palette-color-fg; + -fx-cursor: hand; +} +#scene-graph-search-field > .controls > .clear-button > .icon { + /* MaterialSymbols.CANCEL */ + -fx-shape: "m339-288 141-141 141 141 51-51-141-141 141-141-51-51-141 141-141-141-51 51 141 141-141 141 51 51ZM480-96q-79 0-149-30t-122.5-82.5Q156-261 126-331T96-480q0-80 30-149.5t82.5-122Q261-804 331-834t149-30q80 0 149.5 30t122 82.5Q804-699 834-629.5T864-480q0 79-30 149t-82.5 122.5Q699-156 629.5-126T480-96Zm0-72q130 0 221-91t91-221q0-130-91-221t-221-91q-130 0-221 91t-91 221q0 130 91 221t221 91Zm0-312Z"; + -fx-min-width: 1em; + -fx-max-width: 1em; + -fx-min-height: 1em; + -fx-max-height: 1em; + -fx-background-color: -palette-color-fg; + -fx-opacity: 0.8; +} +#scene-graph-search-field > .controls > .up-button > .icon { + /* MaterialSymbols.KEYBOARD_ARROW_UP */ + -fx-shape: "M480-525 291-336l-51-51 240-240 240 240-51 51-189-189Z"; +} +#scene-graph-search-field > .controls > .down-button > .icon { + /* MaterialSymbols.KEYBOARD_ARROW_DOWN */ + -fx-shape: "M480-333 240-573l51-51 189 189 189-189 51 51-240 240Z"; +} +#scene-graph-search-field > .controls > .arrow-button > .icon { + -fx-min-width: 0.8em; + -fx-max-width: 0.8em; + -fx-min-height: 0.5em; + -fx-max-height: 0.5em; + -fx-background-color: -palette-color-fg; + -fx-opacity: 0.8; +} +#scene-graph-search-field > .controls > .arrow-button:pressed > .icon { + -fx-opacity: 1; +} +#scene-graph-search-field > .controls > .hint { + -fx-font-size: 0.8em; + -fx-text-fill: -palette-color-fg-muted; +} + +#attribute-pane .filter { + -fx-padding: 1px; +} +#attribute-tree-table { + -fx-border-width: 0 1 1 0; +} +#attribute-tree-table .tree-table-row-cell .property-cell { + -fx-font-weight: normal; +} +#attribute-tree-table .tree-table-row-cell .property-cell .info { + -fx-font-size: 0.6em; + -fx-font-weight: normal; + -fx-padding: 0 0 0.5em 0; +} +#attribute-tree-table .tree-table-row-cell > .tree-table-cell { + -fx-alignment: BASELINE_LEFT; +} +#attribute-tree-table .tree-table-row-cell:group .property-cell { + -fx-text-fill: -palette-color-fg; +} +#attribute-tree-table .tree-table-row-cell:default .tree-table-cell { + -fx-text-fill: -palette-color-fg-muted; +} +#attribute-tree-table .tree-table-row-cell:default .property-cell .info { + -fx-text-fill: -palette-color-fg-muted; +} + +#attribute-pane .table-box { + -fx-min-height: 100; +} +#attribute-details-pane { + -fx-min-height: 100; +} +#attribute-details-pane .grid { + -fx-hgap: 20px; + -fx-vgap: 10px; + -fx-padding: 10px 5px 10px 10px; +} +#attribute-details-pane .grid .hyperlink { + -fx-padding: 0; +} +#attribute-details-pane .grid .hyperlink:empty, +#attribute-details-pane .grid .hyperlink:visited:empty { + -fx-text-fill: -palette-color-fg; + -fx-underline: false; +} +#attribute-details-pane .label { + -fx-text-fill: -palette-color-fg; + -fx-font-weight: normal; +} + +/****************************************************************************** +* Event Log +******************************************************************************/ + +#event-log-tab > .log-view { + -fx-font-family: monospaced; +} +#event-log-tab > .controls { + -fx-spacing: 6px; + -fx-padding: 2px 4px 2px 8px; + -fx-alignment: CENTER_LEFT; +} +#event-log-tab > .controls > .button { + -fx-background-color: -palette-color-bg; + -fx-padding: 0 4px 0 0; + -fx-background-insets: 0; + -fx-background-radius: 0; + -fx-graphic-text-gap: 0; + -fx-text-fill: -palette-color-fg; + -fx-cursor: hand; + -fx-opacity: 0.8; +} +#event-log-tab > .controls > .button:disabled { + -fx-opacity: 0.4; +} +#event-log-tab > .controls > .button:hover { + -fx-opacity: 1.0; +} +#event-log-tab > .controls > .start-stop-button > .icon { + /* MaterialSymbols.RADIO_BUTTON_CHECKED */ + -fx-shape: "M480.23-288Q560-288 616-344.23q56-56.22 56-136Q672-560 615.77-616q-56.22-56-136-56Q400-672 344-615.77q-56 56.22-56 136Q288-400 344.23-344q56.22 56 136 56Zm.05 192Q401-96 331-126t-122.5-82.5Q156-261 126-330.96t-30-149.5Q96-560 126-629.5q30-69.5 82.5-122T330.96-834q69.96-30 149.5-30t149.04 30q69.5 30 122 82.5T834-629.28q30 69.73 30 149Q864-401 834-331t-82.5 122.5Q699-156 629.28-126q-69.73 30-149 30Zm-.28-72q130 0 221-91t91-221q0-130-91-221t-221-91q-130 0-221 91t-91 221q0 130 91 221t221 91Zm0-312Z"; + -fx-min-width: 1em; + -fx-max-width: 1em; + -fx-min-height: 1em; + -fx-max-height: 1em; + -fx-background-color: -palette-color-fg; +} +#event-log-tab > .controls > .start-stop-button:started > .icon { + /* MaterialSymbols.STOP_CIRCLE */ + -fx-shape: "M336-336h288v-288H336v288ZM480.28-96Q401-96 331-126t-122.5-82.5Q156-261 126-330.96t-30-149.5Q96-560 126-629.5q30-69.5 82.5-122T330.96-834q69.96-30 149.5-30t149.04 30q69.5 30 122 82.5T834-629.28q30 69.73 30 149Q864-401 834-331t-82.5 122.5Q699-156 629.28-126q-69.73 30-149 30Zm-.28-72q130 0 221-91t91-221q0-130-91-221t-221-91q-130 0-221 91t-91 221q0 130 91 221t221 91Zm0-312Z"; + -fx-background-color: -palette-color-danger; +} +#event-log-tab > .controls > .clear-button > .icon { + /* MaterialSymbols.HIDE_SOURCE */ + -fx-shape: "m768-91-72-72q-48.39 32-103.19 49Q538-97 480.49-97q-79.55 0-149.52-30Q261-157 208.5-209.5T126-331.97q-30-69.97-30-149.52 0-57.51 17-112.32 17-54.8 49-103.19l-72-73 51-51 678 679-51 51Zm-288-78q43.69 0 84.85-12Q606-193 643-216L215-644q-23 37-35 78.15-12 41.16-12 84.85 0 129.67 91.16 220.84Q350.33-169 480-169Zm318-97-53-52q22-37 34.5-78.15Q792-437.31 792-481q0-129.67-91.16-220.84Q609.67-793 480-793q-43 0-84.5 12T317-747l-53-52q48.39-32 103.19-49Q422-865 479.9-865q80.1 0 149.6 30t122 82.5Q804-700 834-630.5t30 149.6q0 57.9-17 112.36T798-266ZM536-531ZM432-427Z"; + -fx-min-width: 1em; + -fx-max-width: 1em; + -fx-min-height: 1em; + -fx-max-height: 1em; + -fx-background-color: -palette-color-fg; +} +#event-log-tab > .controls > .export-button > .icon { + /* MaterialSymbols.DOWNLOAD */ + -fx-shape: "M480-336 288-528l51-51 105 105v-342h72v342l105-105 51 51-192 192ZM263.72-192Q234-192 213-213.15T192-264v-72h72v72h432v-72h72v72q0 29.7-21.16 50.85Q725.68-192 695.96-192H263.72Z"; + -fx-min-width: 1em; + -fx-max-width: 1em; + -fx-min-height: 1em; + -fx-max-height: 1em; + -fx-background-color: -palette-color-fg; +} +#event-log-tab > .controls > .menu-button { + -fx-background-insets: 0; + -fx-background-radius: 0; +} +#event-log-tab > .status-bar { + -fx-padding: 2px 4px 2px 4px; + -fx-alignment: CENTER_RIGHT +} + +/****************************************************************************** +* Stylesheet +******************************************************************************/ + +#stylesheet-tab .hint { + -fx-padding: 2px 5px 2px 5px; + -fx-font-size: 0.9em; + -fx-graphic-text-gap: 4px; +} +#stylesheet-tab .tree-cell:user-agent .icon, +#stylesheet-tab .hint .icon { + /* MaterialSymbols.FLAG */ + -fx-shape: "M192-144v-672h336l24 96h216v384H528l-24-96H264v288h-72Zm300-431Zm92 167h112v-240H496l-24-96H264v240h296l24 96Z"; -fx-min-width: 0.9em; + -fx-max-width: 0.9em; + -fx-min-height: 0.9em; + -fx-max-height: 0.9em; + -fx-background-color: -palette-color-fg; +} + +/****************************************************************************** +* Environment +******************************************************************************/ + +#environment-tab .filter { + -fx-padding: 1px; +} +#environment-tab .tree-table-row-cell:group .key-cell { + -fx-text-fill: -palette-color-fg; +} + +/****************************************************************************** +* Preferences +******************************************************************************/ + +#preferences-tab .group { + -fx-padding: 1em; +} +#preferences-tab .group > .header { + -fx-font-size: 1.1em; +} +#preferences-tab .group > FlowPane.content { + -fx-hgap: 1em; + -fx-vgap: 1em; +} +#preferences-tab .group > .content { + -fx-padding: 1em 1em 0 1em; +} + +/****************************************************************************** +* Custom Controls +******************************************************************************/ + +.tab-line { + -fx-background-color: -palette-color-neutral; +} +.tab-line .toggle-button, +.tab-line .button { + -fx-background-color: -palette-color-neutral-hover, -palette-color-neutral; + -fx-padding: 4px; + -fx-background-insets: 0, 0 0 2 0; + -fx-background-radius: 0; + -fx-graphic-text-gap: 6; + -fx-text-fill: -palette-color-fg; +} +.tab-line .toggle-button:hover { + -fx-background-color: -palette-color-neutral-hover, -palette-color-neutral-hover; +} +.tab-line .toggle-button:selected { + -fx-background-color: -palette-color-accent, -palette-color-neutral; +} +.tab-line .toggle-button:hover:selected { + -fx-background-color: -palette-color-accent, -palette-color-neutral-hover; +} + +.filter-field { + -fx-background-color: -palette-color-bg, -palette-color-bg; + -fx-background-insets: 0, 2; + -fx-padding: 2px; + -fx-spacing: 4px; + -fx-background-radius: 5px; +} +.filter-field:focus-within { + -fx-background-color: -palette-color-accent, -palette-color-bg; +} +.filter-field > .text-field { + -fx-background-color: -palette-color-bg; + -fx-background-insets: 0; + -fx-background-radius: 3px; + -fx-text-fill: -palette-color-fg; + -fx-padding: 2px 6px 2px 6px; +} +.filter-field > .button { + -fx-background-color: -palette-color-bg; + -fx-padding: 0 4px 0 0; + -fx-background-insets: 0; + -fx-background-radius: 0; + -fx-graphic-text-gap: 0; + -fx-text-fill: -palette-color-fg; + -fx-cursor: hand; +} +.filter-field > .clear-button > .icon { + /* MaterialSymbols.CANCEL */ + -fx-shape: "m339-288 141-141 141 141 51-51-141-141 141-141-51-51-141 141-141-141-51 51 141 141-141 141 51 51ZM480-96q-79 0-149-30t-122.5-82.5Q156-261 126-331T96-480q0-80 30-149.5t82.5-122Q261-804 331-834t149-30q80 0 149.5 30t122 82.5Q804-699 834-629.5T864-480q0 79-30 149t-82.5 122.5Q699-156 629.5-126T480-96Zm0-72q130 0 221-91t91-221q0-130-91-221t-221-91q-130 0-221 91t-91 221q0 130 91 221t221 91Zm0-312Z"; + -fx-min-width: 1em; + -fx-max-width: 1em; + -fx-min-height: 1em; + -fx-max-height: 1em; + -fx-background-color: -palette-color-fg; + -fx-opacity: 0.8; +} + +.text-view { + -fx-padding: 0; +} +.text-view .text-area { + -fx-font-family: monospaced; + -fx-background-insets: 0; + -fx-background-radius: 0; + -fx-border: 0; +} + +.hyperlink:empty { + -fx-cursor: default; +} + +.color-indicator { + -fx-stroke-width: 0.5; + -fx-stroke: -palette-color-fg; +} diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..eed88db --- /dev/null +++ b/pom.xml @@ -0,0 +1,82 @@ + + + 4.0.0 + + io.github.mkpaz + devtoolsfx + 1.0-SNAPSHOT + pom + + connector + gui + demo + + + + UTF-8 + 21 + 21 + 21 + 22 + + + + + + org.openjfx + javafx-controls + ${javafxVersion} + + + + org.jspecify + jspecify + 1.0.0 + + + + org.junit.jupiter + junit-jupiter-api + 5.9.1 + + + org.junit.jupiter + junit-jupiter-engine + 5.9.1 + + + org.junit.jupiter + junit-jupiter-params + 5.9.1 + + + org.assertj + assertj-core + 3.23.1 + + + org.mockito + mockito-core + 4.8.1 + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.8.0 + + ${javaVersion} + + + + + + +