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 PropertyChangeListenerProxys. 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 PropertyChangeListeners 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 PropertyChangeListeners 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]); + } }