diff --git a/core/src/main/java/org/piccolo2d/PNode.java b/core/src/main/java/org/piccolo2d/PNode.java index 8f6b250..d89aca2 100644 --- a/core/src/main/java/org/piccolo2d/PNode.java +++ b/core/src/main/java/org/piccolo2d/PNode.java @@ -1198,7 +1198,7 @@ * registered for all properties. See the fields in PNode and subclasses * that start with PROPERTY_ to find out which properties exist. * - * @param listener The PropertyChangeListener to be added + * @param listener the PropertyChangeListener to be added */ public void addPropertyChangeListener(final PropertyChangeListener listener) { if (changeSupport == null) { @@ -1214,7 +1214,7 @@ * PROPERTY_ to find out which properties are supported. * * @param propertyName The name of the property to listen on. - * @param listener The PropertyChangeListener to be added + * @param listener the PropertyChangeListener to be added */ public void addPropertyChangeListener(final String propertyName, final PropertyChangeListener listener) { if (listener == null) { @@ -1230,7 +1230,7 @@ * Remove a PropertyChangeListener from the listener list. This removes a * PropertyChangeListener that was registered for all properties. * - * @param listener The PropertyChangeListener to be removed + * @param listener the PropertyChangeListener to be removed */ public void removePropertyChangeListener(final PropertyChangeListener listener) { if (changeSupport != null) { @@ -1241,8 +1241,8 @@ /** * Remove a PropertyChangeListener for a specific property. * - * @param propertyName The name of the property that was listened on. - * @param listener The PropertyChangeListener to be removed + * @param propertyName the name of the property that was listened on. + * @param listener the PropertyChangeListener to be removed */ public void removePropertyChangeListener(final String propertyName, final PropertyChangeListener listener) { if (listener == null) { @@ -1255,6 +1255,58 @@ } /** + * Return an array of all the property change listeners added to this node. + *
+ * If some listeners have been added with a named property, then
+ * the returned array will be a mixture of PropertyChangeListeners
+ * and PropertyChangeListenerProxy
s. If the calling
+ * method is interested in distinguishing the listeners then it must
+ * test each element to see if it is a PropertyChangeListenerProxy
,
+ * perform the cast, and examine the parameter.
+ *
+ *
+ * PropertyChangeListener[] listeners = bean.getPropertyChangeListeners(); + * for (int i = 0; i < listeners.length; i++) { + * if (listeners[i] instanceof PropertyChangeListenerProxy) { + * PropertyChangeListenerProxy proxy = (PropertyChangeListenerProxy) listeners[i]; + * if (proxy.getPropertyName().equals("foo")) { + * // proxy is a PropertyChangeListener which was associated + * // with the property named "foo" + * } + * } + * } + *+ * + * @since 3.0.1 + * @return all of the
PropertyChangeListener
s added or an
+ * empty array if no listeners have been added
+ */
+ public PropertyChangeListener[] getPropertyChangeListeners() {
+ if (changeSupport == null) {
+ return new PropertyChangeListener[0];
+ }
+ return changeSupport.getPropertyChangeListeners();
+ }
+
+ /**
+ * Return an array of all the property change listeners which have been
+ * associated with the named property.
+ *
+ * @since 3.0.1
+ * @param propertyName the name of the property being listened to
+ * @return all of the PropertyChangeListener
s associated with
+ * the named property. If no such listeners have been added,
+ * or if propertyName
is null, an empty array is
+ * returned.
+ */
+ public PropertyChangeListener[] getPropertyChangeListeners(final String propertyName) {
+ if (changeSupport == null) {
+ return new PropertyChangeListener[0];
+ }
+ return changeSupport.getPropertyChangeListeners(propertyName);
+ }
+
+ /**
* Return the propertyChangeParentMask that determines which property change
* events are forwared to this nodes parent so that its property change
* listeners will also be notified.
diff --git a/core/src/test/java/org/piccolo2d/PNodeTest.java b/core/src/test/java/org/piccolo2d/PNodeTest.java
index 07f877b..9db6672 100644
--- a/core/src/test/java/org/piccolo2d/PNodeTest.java
+++ b/core/src/test/java/org/piccolo2d/PNodeTest.java
@@ -37,6 +37,7 @@
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
@@ -1577,4 +1578,38 @@
final PPickPath path = canvas.getCamera().pick(5, 5, 5);
assertSame(node1, path.getPickedNode());
}
+
+ public void testGetPropertyChangeListenersEmpty() {
+ PropertyChangeListener[] listeners = node.getPropertyChangeListeners();
+ assertNotNull(listeners);
+ assertEquals(0, listeners.length);
+ }
+
+ public void testGetPropertyChangeListeners() {
+ node.addPropertyChangeListener(mockListener);
+ PropertyChangeListener[] listeners = node.getPropertyChangeListeners();
+ assertNotNull(listeners);
+ assertEquals(1, listeners.length);
+ assertEquals(mockListener, listeners[0]);
+ }
+
+ public void testGetPropertyChangeListenersStringNull() {
+ PropertyChangeListener[] listeners = node.getPropertyChangeListeners(null);
+ assertNotNull(listeners);
+ assertEquals(0, listeners.length);
+ }
+
+ public void testGetPropertyChangeListenersStringEmpty() {
+ PropertyChangeListener[] listeners = node.getPropertyChangeListeners("foo");
+ assertNotNull(listeners);
+ assertEquals(0, listeners.length);
+ }
+
+ public void testGetPropertyChangeListenersString() {
+ node.addPropertyChangeListener("foo", mockListener);
+ PropertyChangeListener[] listeners = node.getPropertyChangeListeners("foo");
+ assertNotNull(listeners);
+ assertEquals(1, listeners.length);
+ assertEquals(mockListener, listeners[0]);
+ }
}