create changelog entry
[debian/openrocket] / core / src / net / sf / openrocket / util / AbstractChangeSource.java
1 package net.sf.openrocket.util;
2
3 import java.util.EventListener;
4 import java.util.EventObject;
5 import java.util.List;
6
7 import net.sf.openrocket.logging.LogHelper;
8 import net.sf.openrocket.startup.Application;
9
10 /**
11  * Abstract implementation of a ChangeSource.
12  * 
13  * @author Sampo Niskanen <sampo.niskanen@iki.fi>
14  */
15 public abstract class AbstractChangeSource implements ChangeSource {
16         private static final LogHelper log = Application.getLogger();
17         
18         private final List<EventListener> listeners = new ArrayList<EventListener>();
19         
20         private final EventObject event = new EventObject(this);
21         
22         
23         @Override
24         public final void addChangeListener(EventListener listener) {
25                 listeners.add(listener);
26                 log.verbose(1, "Adding change listeners, listener count is now " + listeners.size());
27         }
28         
29         @Override
30         public final void removeChangeListener(EventListener listener) {
31                 listeners.remove(listener);
32                 log.verbose(1, "Removing change listeners, listener count is now " + listeners.size());
33         }
34         
35         
36         /**
37          * Fire a change event to all listeners.
38          */
39         protected void fireChangeEvent() {
40                 // Copy the list before iterating to prevent concurrent modification exceptions.
41                 EventListener[] list = listeners.toArray(new EventListener[0]);
42                 for (EventListener l : list) {
43                         if ( l instanceof StateChangeListener ) {
44                                 ((StateChangeListener)l).stateChanged(event);
45                         }
46                 }
47         }
48 }