/*
* Copyright (C) 2006-2016 DLR, Germany
*
* All rights reserved
*
* http://www.rcenvironment.de/
*/
package de.rcenvironment.core.component.model.spi;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeListenerProxy;
import java.beans.PropertyChangeSupport;
/**
* Base class elements that implements property change support.
*
* @author Heinrich Wendel
* @author Doreen Seider
*/
public abstract class PropertiesChangeSupport {
/** Delegate used to implement property-change-support. */
private transient PropertyChangeSupport pcsDelegate = new PropertyChangeSupport(this);
/**
* Adds a new PropertyChangeListener.
* @param listener The PropertyChangeListener.
*/
public synchronized void addPropertyChangeListener(PropertyChangeListener listener) {
pcsDelegate.addPropertyChangeListener(listener);
}
/**
* Report a property change to registered listeners.
* @param property the programmatic name of the property that changed
*/
public void firePropertyChange(String property) {
if (pcsDelegate.hasListeners(property)) {
pcsDelegate.firePropertyChange(property, null, null);
}
}
/**
* Report a property change to registered listeners.
* @param property the programmatic name of the property that changed
* @param newValue the new value.
*/
public void firePropertyChange(String property, Object newValue) {
if (pcsDelegate.hasListeners(property)) {
pcsDelegate.firePropertyChange(property, null, newValue);
}
}
/**
* Report a property change to registered listeners.
* @param property the programmatic name of the property that changed
* @param oldValue the old value
* @param newValue the new value
*/
public void firePropertyChange(String property, Object oldValue, Object newValue) {
if (pcsDelegate.hasListeners(property)) {
final PropertyChangeEvent event = new PropertyChangeEvent(this, property, oldValue, newValue);
/*
* Custom implementation required, as some PropertyChangeEvents might be ommited by
* PropertyChangeSupport if oldValue and newValue are equal to each other (compared via
* the equal-function), which might be an undesired behaviour.
*/
// code adopted from JavaDoc of PropertyChangeSupport
PropertyChangeListener[] listeners = pcsDelegate.getPropertyChangeListeners();
for (int i = 0; i < listeners.length; i++) {
if (listeners[i] instanceof PropertyChangeListenerProxy) {
PropertyChangeListenerProxy proxy =
(PropertyChangeListenerProxy) listeners[i];
if (proxy.getPropertyName().equals(property)) {
listeners[i].propertyChange(event);
}
} else {
listeners[i].propertyChange(event);
}
}
}
}
/**
* Remove a PropertyChangeListener from this component.
* @param listener a PropertyChangeListener instance
*/
public synchronized void removePropertyChangeListener(PropertyChangeListener listener) {
pcsDelegate.removePropertyChangeListener(listener);
}
protected PropertyChangeListener[] getPropertyChangeListeners() {
return pcsDelegate.getPropertyChangeListeners();
}
}