package org.erikaredmark.util;
import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
/*********************************************************************************************************************
*
* Generic class designed to be subclassed by clients. This class will impose the Java bean 'property change' model onto
* the child object thus allowing it to be easily used with JFace data binding. Any java objects, such as the
* <code>ProjectTaskManager</code>, whose state is to be represented visually to the user should subclass this class.
* <p/>
* The class is not abstract, in the event the client would rather use the Decorator pattern instead of subclassing.
* @author TJS
* <p/>
* The interface is intended to make it easy to clarify to clients that an object responds to the property change
* protocol, although generally it is recommended to subclass or decorate <code>ObersvableModel</code> as it implements
* the core features.
*
********************************************************************************************************************/
public class ObservableModel implements IObservableModel {
private PropertyChangeSupport changeSupport =
new PropertyChangeSupport(this);
boolean suspended = false;
/*********************************************************************************************************************
*
* To be used by clients: Allows them to register a property change listener
*
* {@inheritDoc}
*
* @param listener
*
********************************************************************************************************************/
@Override
public void addPropertyChangeListener(PropertyChangeListener listener) {
changeSupport.addPropertyChangeListener(listener);
}
/*********************************************************************************************************************
*
* {@inheritDoc}
*
* To be used by clients: Allows them to remove a property change listener
*
* @param listener
*
********************************************************************************************************************/
@Override
public void removePropertyChangeListener(PropertyChangeListener listener) {
changeSupport.removePropertyChangeListener(listener);
}
/*********************************************************************************************************************
*
* {@inheritDoc}
*
********************************************************************************************************************/
@Override
public void addPropertyChangeListener(String propertyName,
PropertyChangeListener listener) {
changeSupport.addPropertyChangeListener(propertyName, listener);
}
/*********************************************************************************************************************
*
* {@inheritDoc}
*
********************************************************************************************************************/
@Override
public void removePropertyChangeListener(String propertyName,
PropertyChangeListener listener) {
changeSupport.removePropertyChangeListener(propertyName, listener);
}
/*********************************************************************************************************************
*
* {@inheritDoc}
*
********************************************************************************************************************/
@Override
public void firePropertyChange(String propertyName,
Object oldValue,
Object newValue) {
if (suspended == true) {
return;
}
changeSupport.firePropertyChange(propertyName, oldValue, newValue);
}
/*********************************************************************************************************************
*
* {@inheritDoc}
*
********************************************************************************************************************/
@Override
public void suspendPropertyChangeEvents() {
if (suspended == true) {
throw new IllegalStateException("suspend already called");
}
this.suspended = true;
}
/*********************************************************************************************************************
*
* {@inheritDoc}
*
********************************************************************************************************************/
@Override
public void resumePropertyChangeEvents() {
if (suspended == false) {
throw new IllegalStateException("observable not suspended");
}
this.suspended = false;
}
}