/** * */ package cz.cuni.mff.peckam.java.origamist.utils; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.util.Hashtable; import java.util.LinkedList; import java.util.List; /** * The source of <code>PropertyChangeEvent</code>s. Provides basic support for it. * * @author Martin Pecka */ public class PropertyChangeSource { /** The source of the property changes. */ protected Object source = null; /** Listeners to property changes. */ protected Hashtable<String, List<PropertyChangeListener>> propertyChangeListeners = new Hashtable<String, List<PropertyChangeListener>>(); /** * The source of the changes will be <code>this</code>. */ public PropertyChangeSource() { this.source = this; } /** * @param source The source of the changes. */ public PropertyChangeSource(Object source) { this.source = source; } /** * Notify observers on the change of the <code>property</code>. * * The event is fired only if newValue and oldValue aren't the same. * * @param <T> Type of the property that has been changed. * @param property Name of the property that has been changed. * @param oldValue The old property value. * @param newValue The new property value. */ protected <T> void firePropertyChange(String property, T oldValue, T newValue) { if (oldValue == null) { if (newValue == null) return; } else if (oldValue.equals(newValue)) { return; } List<PropertyChangeListener> listeners = propertyChangeListeners.get(property); if (listeners == null) return; for (PropertyChangeListener l : listeners) l.propertyChange(new PropertyChangeEvent(this.source, property, oldValue, newValue)); } /** * Adds a listener of the changes of the given property. * * Multiple observers for a single property are allowed and will be notified in the order they were registered. * * @param property The property to listen its changes to. * @param listener The listener to be bound to the change event. */ public void addPropertyChangeListener(String property, PropertyChangeListener listener) { List<PropertyChangeListener> listeners = propertyChangeListeners.get(property); if (listeners == null) { listeners = new LinkedList<PropertyChangeListener>(); propertyChangeListeners.put(property, listeners); } listeners.add(listener); } /** * Removes the given listener from the list of observers on the changes of the given property. * * @param property The property to remove the listener from. * @param listener The listener to remove. */ public void removePropertyChangeListener(String property, PropertyChangeListener listener) { List<PropertyChangeListener> listeners = propertyChangeListeners.get(property); if (listeners == null) return; listeners.remove(listener); } /** * Removes all observers on the changes of the given property. * * @param property The property to remove observers from. */ public void removeAllPropertyChangeListeners(String property) { List<PropertyChangeListener> listeners = propertyChangeListeners.get(property); if (listeners == null) return; listeners.clear(); } }