package net.sf.openrocket.util;
import java.util.EventListener;
import java.util.EventObject;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Abstract implementation of a ChangeSource. Can either be extended
* or used as a helper object.
*
* @author Sampo Niskanen <sampo.niskanen@iki.fi>
*/
public class AbstractChangeSource implements ChangeSource {
private static final Logger log = LoggerFactory.getLogger(AbstractChangeSource.class);
private final List<EventListener> listeners = new ArrayList<EventListener>();
@Override
public final void addChangeListener(StateChangeListener listener) {
listeners.add(listener);
log.trace("Adding change listeners, listener count is now " + listeners.size());
}
@Override
public final void removeChangeListener(StateChangeListener listener) {
listeners.remove(listener);
log.trace("Removing change listeners, listener count is now " + listeners.size());
}
/**
* execute a change event from any listeners that are triggered by it
*/
public void fireChangeEvent(Object source) {
EventObject event = new EventObject(source);
// Copy the list before iterating to prevent concurrent modification exceptions.
EventListener[] list = listeners.toArray(new EventListener[0]);
for (EventListener l : list) {
if (l instanceof StateChangeListener) {
((StateChangeListener) l).stateChanged(event);
}
}
}
/**
* Fire a change event to all listeners.
*/
protected void fireChangeEvent() {
fireChangeEvent(this);
}
}