Class BoundPropertyObject
- java.lang.Object
-
- com.globalmentor.beans.BoundPropertyObject
-
- All Implemented Interfaces:
PropertyBindable
,PropertyConstrainable
- Direct Known Subclasses:
AbstractTask
,BoundPropertyResource
,DefaultModifiable
,DefaultURIAccessible
public class BoundPropertyObject extends java.lang.Object implements PropertyBindable, PropertyConstrainable
An object that automatically supports bound and constrained properties.Property change support is only created when needed; if no property change listeners are added, the property change support will never be created or invoked, even when firing property change events.
Vetoable change support is only created when needed; if no vetoable change listeners are added, the vetoable change support will never be created or invoked, even when firing vetoable change events.
This class was modeled in part from the property support of
Component
.This implementation creates generic-aware property value change events.
- Author:
- Garret Wilson
- See Also:
PropertyChangeSupport
,GenericPropertyChangeEvent
,GenericPropertyChangeListener
-
-
Field Summary
Fields Modifier and Type Field Description protected static java.beans.PropertyChangeListener[]
NO_PROPERTY_CHANGE_LISTENERS
A convenience static empty array of property change listeners.protected static java.beans.VetoableChangeListener[]
NO_VETOABLE_CHANGE_LISTENERS
A convenience static empty array of vetoable change listeners.
-
Constructor Summary
Constructors Constructor Description BoundPropertyObject()
Default constructor.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
addPropertyChangeListener(java.beans.PropertyChangeListener listener)
Adds a property change listener to the listener list.void
addPropertyChangeListener(java.lang.String propertyName, java.beans.PropertyChangeListener listener)
Add a property change listener for a specific property.void
addVetoableChangeListener(java.beans.VetoableChangeListener listener)
Adds a vetoable listener to the listener list.void
addVetoableChangeListener(java.lang.String propertyName, java.beans.VetoableChangeListener listener)
Adds a vetoable change listener for a specific property.protected PostponedPropertyChangeEvent
createPostponedPropertyChangeEvent(java.beans.PropertyChangeEvent propertyChangeEvent)
Creates an object representing a postponement of firing the property change event.protected void
firePropertyChange(java.beans.PropertyChangeEvent propertyChangeEvent)
Reports that a bound property has changed.protected void
firePropertyChange(java.lang.String propertyName, boolean oldValue, boolean newValue)
Reports that a bound boolean property has changed, reporting old and new values of typeBoolean
.protected void
firePropertyChange(java.lang.String propertyName, int oldValue, int newValue)
Reports that a bound integer property has changed, reporting old and new values of typeInteger
.protected void
firePropertyChange(java.lang.String propertyName, long oldValue, long newValue)
Reports that a bound long property has changed, reporting old and new values of typeLong
.protected <V> void
firePropertyChange(java.lang.String propertyName, V oldValue, V newValue)
Reports that a bound property has changed.void
fireVetoableChange(java.beans.PropertyChangeEvent propertyChangeEvent)
Fires a vetoable property update to any registered listeners.protected void
fireVetoableChange(java.lang.String propertyName, boolean oldValue, boolean newValue)
Reports that an integer vetoable property updtae to any registered listeners, reporting old and new values of typeBoolean
.protected void
fireVetoableChange(java.lang.String propertyName, int oldValue, int newValue)
Reports that an integer vetoable property updtae to any registered listeners, reporting old and new values of typeInteger
.<V> void
fireVetoableChange(java.lang.String propertyName, V oldValue, V newValue)
Reports a vetoable property update to any registered listeners.protected java.beans.PropertyChangeListener
getForwardPropertyChangeListener()
java.beans.PropertyChangeListener[]
getPropertyChangeListeners()
Returns an array of all the listeners that were added to the withaddPropertyChangeListener(PropertyChangeListener)
.java.beans.PropertyChangeListener[]
getPropertyChangeListeners(java.lang.String propertyName)
Returns an array of all the listeners which have been associated with the named property.protected java.beans.PropertyChangeSupport
getPropertyChangeSupport()
protected java.beans.PropertyChangeListener
getRepeatPropertyChangeListener()
protected java.beans.VetoableChangeListener
getRepeatVetoableChangeListener()
java.beans.VetoableChangeListener[]
getVetoableChangeListeners()
Returns the list of vetoable change listeners.java.beans.VetoableChangeListener[]
getVetoableChangeListeners(java.lang.String propertyName)
Returns an array of all the listeners which have been associated with the named property.protected java.beans.VetoableChangeSupport
getVetoableChangeSupport()
boolean
hasPropertyChangeListeners(java.lang.String propertyName)
Checks if there are any listeners for a specific property, including those registered on all properties.boolean
hasVetoableChangeListeners(java.lang.String propertyName)
Checks if there are any vetoable change listeners for a specific property, including those registered on all properties.void
removePropertyChangeListener(java.beans.PropertyChangeListener listener)
Remove a property change listener from the listener list.void
removePropertyChangeListener(java.lang.String propertyName, java.beans.PropertyChangeListener listener)
Remove a property change listener for a specific property.void
removeVetoableChangeListener(java.beans.VetoableChangeListener listener)
Removes a vetoable change listener from the listener list.void
removeVetoableChangeListener(java.lang.String propertyName, java.beans.VetoableChangeListener listener)
Removes a vetoable change listener for a specific property.
-
-
-
Field Detail
-
NO_PROPERTY_CHANGE_LISTENERS
protected static final java.beans.PropertyChangeListener[] NO_PROPERTY_CHANGE_LISTENERS
A convenience static empty array of property change listeners.
-
NO_VETOABLE_CHANGE_LISTENERS
protected static final java.beans.VetoableChangeListener[] NO_VETOABLE_CHANGE_LISTENERS
A convenience static empty array of vetoable change listeners.
-
-
Method Detail
-
getPropertyChangeSupport
protected java.beans.PropertyChangeSupport getPropertyChangeSupport()
- Returns:
- Support for property change event management, creating support if necessary.
-
getVetoableChangeSupport
protected java.beans.VetoableChangeSupport getVetoableChangeSupport()
- Returns:
- Support for vetoable change management, creating support if necessary.
-
getRepeatPropertyChangeListener
protected java.beans.PropertyChangeListener getRepeatPropertyChangeListener()
- Returns:
- A property change listener to repeat copies of events received, using this object as the source.
-
getForwardPropertyChangeListener
protected java.beans.PropertyChangeListener getForwardPropertyChangeListener()
- Returns:
- A lazily-created property change listener to forward along events received unmodified.
-
getRepeatVetoableChangeListener
protected java.beans.VetoableChangeListener getRepeatVetoableChangeListener()
- Returns:
- A vetoable change listener to repeat copies of events received, using this object as the source.
-
addPropertyChangeListener
public void addPropertyChangeListener(java.beans.PropertyChangeListener listener)
Adds a property change listener to the listener list. The listener is registered for all properties.If the listener is
null
, no exception is thrown and no action is performed.- Specified by:
addPropertyChangeListener
in interfacePropertyBindable
- Parameters:
listener
- ThePropertyChangeListener
to be added.- See Also:
PropertyChangeEvent
-
removePropertyChangeListener
public void removePropertyChangeListener(java.beans.PropertyChangeListener listener)
Remove a property change listener from the listener list. This removes aPropertyChangeListener
that was registered for all properties.If the listener is
null
, no exception is thrown and no action is performed.- Specified by:
removePropertyChangeListener
in interfacePropertyBindable
- Parameters:
listener
- ThePropertyChangeListener
to be removed.
-
addPropertyChangeListener
public void addPropertyChangeListener(java.lang.String propertyName, java.beans.PropertyChangeListener listener)
Add a property change listener for a specific property. The listener will be invoked only when a call tofirePropertyChange(String, Object, Object)
names that specific property.If the listener is
null
, no exception is thrown and no action is performed.- Specified by:
addPropertyChangeListener
in interfacePropertyBindable
- Parameters:
propertyName
- The name of the property to listen on.listener
- ThePropertyChangeListener
to be added.
-
removePropertyChangeListener
public void removePropertyChangeListener(java.lang.String propertyName, java.beans.PropertyChangeListener listener)
Remove a property change listener for a specific property.If the listener is
null
, no exception is thrown and no action is performed.- Specified by:
removePropertyChangeListener
in interfacePropertyBindable
- Parameters:
propertyName
- The name of the property that was listened on.listener
- ThePropertyChangeListener
to be removed
-
getPropertyChangeListeners
public java.beans.PropertyChangeListener[] getPropertyChangeListeners()
Returns an array of all the listeners that were added to the withaddPropertyChangeListener(PropertyChangeListener)
. If some listeners have been added with a named property, then the returned array will be a mixture ofPropertyChangeListener
s andPropertyChangeListenerProxy
s. If the calling method is interested in distinguishing the listeners then it must test each element to see if it's aPropertyChangeListenerProxy
, perform the cast, and examine the parameter.- Specified by:
getPropertyChangeListeners
in interfacePropertyBindable
- Returns:
- all of the
PropertyChangeListener
s added or an empty array if no listeners have been added - See Also:
PropertyChangeListenerProxy
-
getPropertyChangeListeners
public java.beans.PropertyChangeListener[] getPropertyChangeListeners(java.lang.String propertyName)
Returns an array of all the listeners which have been associated with the named property.- Specified by:
getPropertyChangeListeners
in interfacePropertyBindable
- Parameters:
propertyName
- The name of the property.- Returns:
- All of the
PropertyChangeListener
s associated with the named property; if no such listeners have been added or ifpropertyName
isnull
, an empty array is returned
-
hasPropertyChangeListeners
public boolean hasPropertyChangeListeners(java.lang.String propertyName)
Checks if there are any listeners for a specific property, including those registered on all properties. IfpropertyName
isnull
, this method only checks for listeners registered on all properties.- Specified by:
hasPropertyChangeListeners
in interfacePropertyBindable
- Parameters:
propertyName
- The property name.- Returns:
true
if there are one or more listeners for the given property.
-
firePropertyChange
protected <V> void firePropertyChange(java.lang.String propertyName, V oldValue, V newValue)
Reports that a bound property has changed. This method can be called when a bound property has changed and it will send the appropriate property change event to any registered property change listeners. No event is fired if old and new are bothnull
or are both non-null
and equal according to theObject.equals(java.lang.Object)
method. No event is fired if no listeners are registered for the given property. This method delegates actual firing of the event tofirePropertyChange(PropertyChangeEvent)
.- Type Parameters:
V
- The type of the property values.- Parameters:
propertyName
- The name of the property being changed.oldValue
- The old property value.newValue
- The new property value.- See Also:
firePropertyChange(PropertyChangeEvent)
,hasPropertyChangeListeners(String)
,GenericPropertyChangeEvent
,GenericPropertyChangeListener
-
firePropertyChange
protected void firePropertyChange(java.lang.String propertyName, int oldValue, int newValue)
Reports that a bound integer property has changed, reporting old and new values of typeInteger
. No event is fired if the values are equal, or if no event is fired if no listeners are registered for the given property. This method delegates actual firing of the event tofirePropertyChange(String, Object, Object)
.- Parameters:
propertyName
- The name of the property being changed.oldValue
- The old property value.newValue
- The new property value.
-
firePropertyChange
protected void firePropertyChange(java.lang.String propertyName, long oldValue, long newValue)
Reports that a bound long property has changed, reporting old and new values of typeLong
. No event is fired if the values are equal, or if no event is fired if no listeners are registered for the given property. This method delegates actual firing of the event tofirePropertyChange(String, Object, Object)
.- Parameters:
propertyName
- The name of the property being changed.oldValue
- The old property value.newValue
- The new property value.
-
firePropertyChange
protected void firePropertyChange(java.lang.String propertyName, boolean oldValue, boolean newValue)
Reports that a bound boolean property has changed, reporting old and new values of typeBoolean
. No event is fired if the values are equal, or if no event is fired if no listeners are registered for the given property. This method delegates actual firing of the event tofirePropertyChange(String, Object, Object)
.- Parameters:
propertyName
- The name of the property being changed.oldValue
- The old property value.newValue
- The new property value.
-
firePropertyChange
protected void firePropertyChange(java.beans.PropertyChangeEvent propertyChangeEvent)
Reports that a bound property has changed. This method does the actual delegation to the property change support.- Parameters:
propertyChangeEvent
- The event to fire.
-
createPostponedPropertyChangeEvent
protected PostponedPropertyChangeEvent createPostponedPropertyChangeEvent(java.beans.PropertyChangeEvent propertyChangeEvent)
Creates an object representing a postponement of firing the property change event.- Parameters:
propertyChangeEvent
- The property change event the firing of which to postpone.- Returns:
- A newly created postponed property change event.
-
addVetoableChangeListener
public void addVetoableChangeListener(java.beans.VetoableChangeListener listener)
Adds a vetoable listener to the listener list. The listener is registered for all properties.The same listener object may be added more than once, and will be called as many times as it is added.
If
listener
isnull
, no exception is thrown and no action is taken.- Specified by:
addVetoableChangeListener
in interfacePropertyConstrainable
- Parameters:
listener
- TheVetoableChangeListener
to be added.
-
removeVetoableChangeListener
public void removeVetoableChangeListener(java.beans.VetoableChangeListener listener)
Removes a vetoable change listener from the listener list. This removes a VetoableChangeListener that was registered for all properties.If
listener
was added more than once to the same event source, it will be notified one less time after being removed.If
listener
isnull
, or was never added, no exception is thrown and no action is taken.- Specified by:
removeVetoableChangeListener
in interfacePropertyConstrainable
- Parameters:
listener
- TheVetoableChangeListener
to be removed
-
addVetoableChangeListener
public void addVetoableChangeListener(java.lang.String propertyName, java.beans.VetoableChangeListener listener)
Adds a vetoable change listener for a specific property. The listener will be invoked only when a call tofireVetoableChange(String, int, int)
names that specific property.The same listener object may be added more than once. For each property, the listener will be invoked the number of times it was added for that property.
If
propertyName
orlistener
isnull
, no exception is thrown and no action is taken.- Specified by:
addVetoableChangeListener
in interfacePropertyConstrainable
- Parameters:
propertyName
- The name of the property to listen on.listener
- TheVetoableChangeListener
to be added.
-
removeVetoableChangeListener
public void removeVetoableChangeListener(java.lang.String propertyName, java.beans.VetoableChangeListener listener)
Removes a vetoable change listener for a specific property.If
listener
was added more than once to the same event source for the specified property, it will be notified one less time after being removed.If
propertyName
isnull
, no exception is thrown and no action is taken.If
listener
isnull
, or was never added for the specified property, no exception is thrown and no action is taken.- Specified by:
removeVetoableChangeListener
in interfacePropertyConstrainable
- Parameters:
propertyName
- The name of the property that was listened on.listener
- TheVetoableChangeListener
to be removed.
-
getVetoableChangeListeners
public java.beans.VetoableChangeListener[] getVetoableChangeListeners()
Returns the list of vetoable change listeners. If named vetoable change listeners were added, thenVetoableChangeListenerProxy
wrappers will returned.- Specified by:
getVetoableChangeListeners
in interfacePropertyConstrainable
- Returns:
- All added vetoable change listeners, including vetoable change listener proxys if named vetoable change listeners were added.
-
getVetoableChangeListeners
public java.beans.VetoableChangeListener[] getVetoableChangeListeners(java.lang.String propertyName)
Returns an array of all the listeners which have been associated with the named property.- Specified by:
getVetoableChangeListeners
in interfacePropertyConstrainable
- Parameters:
propertyName
- The name of the property being listened to.- Returns:
- All the
VetoableChangeListeners
associated with the named property; if no such listeners have been added, or ifpropertyName
isnull
, an empty array is returned.
-
hasVetoableChangeListeners
public boolean hasVetoableChangeListeners(java.lang.String propertyName)
Checks if there are any vetoable change listeners for a specific property, including those registered on all properties. IfpropertyName
isnull
, this method only checks for listeners registered on all properties.- Specified by:
hasVetoableChangeListeners
in interfacePropertyConstrainable
- Parameters:
propertyName
- The property name.- Returns:
true
if there are one or more listeners for the given property.
-
fireVetoableChange
public <V> void fireVetoableChange(java.lang.String propertyName, V oldValue, V newValue) throws java.beans.PropertyVetoException
Reports a vetoable property update to any registered listeners. If any veotable change listeners vetos the change, then a new event will be fired reverting all the listeners to the old value, after which thePropertyVetoException
will be rethrown. No event is fired if old and new are equal and non-null
. This method delegates actual firing of the event tofireVetoableChange(PropertyChangeEvent)
.- Type Parameters:
V
- The type of the property values.- Parameters:
propertyName
- The name of the property that is about to change.oldValue
- The old value of the property.newValue
- The new value of the property.- Throws:
java.beans.PropertyVetoException
- if the recipient wishes the property change to be rolled back.- See Also:
fireVetoableChange(PropertyChangeEvent)
,hasVetoableChangeListeners(String)
,GenericPropertyChangeEvent
,GenericVetoableChangeListener
-
fireVetoableChange
protected void fireVetoableChange(java.lang.String propertyName, int oldValue, int newValue) throws java.beans.PropertyVetoException
Reports that an integer vetoable property updtae to any registered listeners, reporting old and new values of typeInteger
. No event is fired if the values are equal, or if no event is fired if no listeners are registered for the given property. This method delegates actual firing of the event tofireVetoableChange(String, Object, Object)
.- Parameters:
propertyName
- The name of the property that is about to change.oldValue
- The old property value.newValue
- The new property value.- Throws:
java.beans.PropertyVetoException
- if the recipient wishes the property change to be rolled back.
-
fireVetoableChange
protected void fireVetoableChange(java.lang.String propertyName, boolean oldValue, boolean newValue) throws java.beans.PropertyVetoException
Reports that an integer vetoable property updtae to any registered listeners, reporting old and new values of typeBoolean
. No event is fired if the values are equal, or if no event is fired if no listeners are registered for the given property. This method delegates actual firing of the event tofireVetoableChange(String, Object, Object)
.- Parameters:
propertyName
- The name of the property that is about to change.oldValue
- The old property value.newValue
- The new property value.- Throws:
java.beans.PropertyVetoException
- if the recipient wishes the property change to be rolled back.
-
fireVetoableChange
public void fireVetoableChange(java.beans.PropertyChangeEvent propertyChangeEvent) throws java.beans.PropertyVetoException
Fires a vetoable property update to any registered listeners. If any veotable change listeners vetos the change, then a new event will be fired reverting all the listeners to the old value, after which thePropertyVetoException
will be rethrown. No event is fired if old and new are equal and non-null
. This method does the actual delegation to the vetoable change support.- Parameters:
propertyChangeEvent
- The event to fire.- Throws:
java.beans.PropertyVetoException
- if the recipient wishes the property change to be rolled back.
-
-