diff --git a/modules/graphics/src/main/java/javafx/scene/Node.java b/modules/graphics/src/main/java/javafx/scene/Node.java --- a/modules/graphics/src/main/java/javafx/scene/Node.java +++ b/modules/graphics/src/main/java/javafx/scene/Node.java @@ -76,6 +76,7 @@ import javafx.geometry.Point3D; import javafx.geometry.Rectangle2D; import javafx.scene.accessibility.Accessible; +import javafx.scene.accessibility.AccessibleEvent; import javafx.scene.accessibility.Action; import javafx.scene.accessibility.Attribute; import javafx.scene.accessibility.Role; @@ -381,7 +382,26 @@ */ @IDProperty("id") public abstract class Node implements EventTarget, Styleable { - + + public final ObjectProperty> onGetAttributeProperty() { return onGetAttribute; } + public final void setOnGetAttribute(EventHandler value) { onGetAttributeProperty().set(value); } + public final EventHandler getOnGetAttribute() { return onGetAttributeProperty().get(); } + private ObjectProperty> onGetAttribute = new ObjectPropertyBase>() { + @Override protected void invalidated() { + setEventHandler(AccessibleEvent.GET_ATTRIBUTE, get()); + } + + @Override + public Object getBean() { + return this; + } + + @Override + public String getName() { + return "onGetAttribute"; + } + }; + static { PerformanceTracker.logEvent("Node class loaded"); } @@ -2326,6 +2346,10 @@ // PerformanceTracker.logEvent("Node.postinit " + // "for [{this}, id=\"{id}\"] finished"); //} + addEventHandler(AccessibleEvent.GET_ATTRIBUTE, e -> { + e.setResult(accGetAttribute(e.getAttribute(), e.getParameters())); + e.consume(); + }); } /*************************************************************************** @@ -9231,7 +9255,9 @@ if (accessible == null) { accessible = new Accessible() { @Override public Object getAttribute(Attribute attribute, Object... parameters) { - return accGetAttribute(attribute, parameters); + AccessibleEvent event = new AccessibleEvent(AccessibleEvent.GET_ATTRIBUTE, attribute, parameters); + Event.fireEvent(Node.this, event); + return event.getResult(); } @Override public void executeAction(Action action, Object... parameters) { accExecuteAction(action, parameters); diff --git a/modules/graphics/src/main/java/javafx/scene/accessibility/AccessibleEvent.java b/modules/graphics/src/main/java/javafx/scene/accessibility/AccessibleEvent.java new file mode 100644 --- /dev/null +++ b/modules/graphics/src/main/java/javafx/scene/accessibility/AccessibleEvent.java @@ -0,0 +1,62 @@ +package javafx.scene.accessibility; + +import javafx.beans.NamedArg; +import javafx.event.Event; +import javafx.event.EventTarget; +import javafx.event.EventType; + +//TODO - missing annotations and generics + +public class AccessibleEvent extends Event { + public static final EventType GET_ATTRIBUTE = new EventType(Event.ANY, "GET_ATTRIBUTE"); + + public AccessibleEvent(EventType type, Attribute attribute, Object [] parameters) { + super(type); + this.attribute = attribute; + this.parameters = parameters; + } + + Attribute attribute; + public Attribute getAttribute () { + return attribute; + } + + Object [] parameters; + public Object [] getParameters() { + return parameters; + } + + private static class Result implements Cloneable { + Object value; + + @Override + public Result clone() { + try { + return (Result) super.clone(); + } catch (CloneNotSupportedException e) { + // FAIL SILENTLY - won't happen + return null; + } + } + } + Result result = new Result (); + + public Object getResult() { + return result.value; + } + public void setResult(Object result) { + this.result.value = result; + } + //TODO - are these methods needed + + @Override + public AccessibleEvent copyFor(Object newSource, EventTarget newTarget) { + return (AccessibleEvent) super.copyFor(newSource, newTarget); + } + + @Override + public EventType getEventType() { + return (EventType) super.getEventType(); + } + +} \ No newline at end of file