Reduce dependency on swing ChangeListener and ChangeEvent classes. Changed the inter...
authorkruland2607 <kruland2607@180e2498-e6e9-4542-8430-84ac67f01cd8>
Mon, 5 Dec 2011 18:49:49 +0000 (18:49 +0000)
committerkruland2607 <kruland2607@180e2498-e6e9-4542-8430-84ac67f01cd8>
Mon, 5 Dec 2011 18:49:49 +0000 (18:49 +0000)
git-svn-id: https://openrocket.svn.sourceforge.net/svnroot/openrocket/trunk@214 180e2498-e6e9-4542-8430-84ac67f01cd8

15 files changed:
src/net/sf/openrocket/aerodynamics/FlightConditions.java
src/net/sf/openrocket/document/Simulation.java
src/net/sf/openrocket/gui/adaptors/DoubleModel.java
src/net/sf/openrocket/gui/adaptors/MotorConfigurationModel.java
src/net/sf/openrocket/gui/scalefigure/AbstractScaleFigure.java
src/net/sf/openrocket/gui/scalefigure/RocketPanel.java
src/net/sf/openrocket/optimization/rocketoptimization/modifiers/AbstractSimulationModifier.java
src/net/sf/openrocket/rocketcomponent/ComponentChangeEvent.java
src/net/sf/openrocket/rocketcomponent/Configuration.java
src/net/sf/openrocket/rocketcomponent/Rocket.java
src/net/sf/openrocket/rocketcomponent/RocketComponent.java
src/net/sf/openrocket/simulation/SimulationOptions.java
src/net/sf/openrocket/util/AbstractChangeSource.java
src/net/sf/openrocket/util/ChangeSource.java
src/net/sf/openrocket/util/StateChangeListener.java [new file with mode: 0644]

index 45b9d20f4a213ce861b8d9ed273cbd13ec41ec94..0b079e682211fbeabd7d51f46f5a7771fd69b622 100644 (file)
@@ -1,11 +1,10 @@
 package net.sf.openrocket.aerodynamics;
 
 import java.util.ArrayList;
+import java.util.EventListener;
+import java.util.EventObject;
 import java.util.List;
 
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-
 import net.sf.openrocket.models.atmosphere.AtmosphericConditions;
 import net.sf.openrocket.rocketcomponent.Configuration;
 import net.sf.openrocket.util.BugException;
@@ -13,6 +12,7 @@ import net.sf.openrocket.util.ChangeSource;
 import net.sf.openrocket.util.Coordinate;
 import net.sf.openrocket.util.MathUtil;
 import net.sf.openrocket.util.Monitorable;
+import net.sf.openrocket.util.StateChangeListener;
 import net.sf.openrocket.util.UniqueID;
 
 /**
@@ -23,8 +23,8 @@ import net.sf.openrocket.util.UniqueID;
  */
 public class FlightConditions implements Cloneable, ChangeSource, Monitorable {
        
-       private List<ChangeListener> listenerList = new ArrayList<ChangeListener>();
-       private ChangeEvent event = new ChangeEvent(this);
+       private List<EventListener> listenerList = new ArrayList<EventListener>();
+       private EventObject event = new EventObject(this);
        
 
        /** Reference length used in calculations. */
@@ -409,8 +409,8 @@ public class FlightConditions implements Cloneable, ChangeSource, Monitorable {
        public FlightConditions clone() {
                try {
                        FlightConditions cond = (FlightConditions) super.clone();
-                       cond.listenerList = new ArrayList<ChangeListener>();
-                       cond.event = new ChangeEvent(cond);
+                       cond.listenerList = new ArrayList<EventListener>();
+                       cond.event = new EventObject(cond);
                        cond.atmosphericConditions = atmosphericConditions.clone();
                        return cond;
                } catch (CloneNotSupportedException e) {
@@ -445,20 +445,23 @@ public class FlightConditions implements Cloneable, ChangeSource, Monitorable {
        
        
        @Override
-       public void addChangeListener(ChangeListener listener) {
+       public void addChangeListener(EventListener listener) {
                listenerList.add(0, listener);
        }
        
        @Override
-       public void removeChangeListener(ChangeListener listener) {
+       public void removeChangeListener(EventListener listener) {
                listenerList.remove(listener);
        }
        
        protected void fireChangeEvent() {
                modID = UniqueID.next();
-               ChangeListener[] listeners = listenerList.toArray(new ChangeListener[0]);
-               for (ChangeListener l : listeners) {
-                       l.stateChanged(event);
+               // Copy the list before iterating to prevent concurrent modification exceptions.
+               EventListener[] listeners = listenerList.toArray(new EventListener[0]);
+               for (EventListener l : listeners) {
+                       if ( l instanceof StateChangeListener ) {
+                               ((StateChangeListener)l).stateChanged(event);
+                       }
                }
        }
 }
index 3c1e2c01a0157fa285a60c79761d86eb5ea293f0..74d3ab28ed517b03f9d2163f95b999f47054ffde 100644 (file)
@@ -1,10 +1,9 @@
 package net.sf.openrocket.document;
 
+import java.util.EventListener;
+import java.util.EventObject;
 import java.util.List;
 
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-
 import net.sf.openrocket.aerodynamics.AerodynamicCalculator;
 import net.sf.openrocket.aerodynamics.BarrowmanCalculator;
 import net.sf.openrocket.aerodynamics.WarningSet;
@@ -28,6 +27,7 @@ import net.sf.openrocket.util.ArrayList;
 import net.sf.openrocket.util.BugException;
 import net.sf.openrocket.util.ChangeSource;
 import net.sf.openrocket.util.SafetyMutex;
+import net.sf.openrocket.util.StateChangeListener;
 
 /**
  * A class defining a simulation, its conditions and simulated data.
@@ -79,7 +79,7 @@ public class Simulation implements ChangeSource, Cloneable {
 
 
        /** Listeners for this object */
-       private List<ChangeListener> listeners = new ArrayList<ChangeListener>();
+       private List<EventListener> listeners = new ArrayList<EventListener>();
        
 
        /** The conditions actually used in the previous simulation, or null */
@@ -386,7 +386,7 @@ public class Simulation implements ChangeSource, Cloneable {
                        copy.status = Status.NOT_SIMULATED;
                        copy.options = this.options.clone();
                        copy.simulationListeners = this.simulationListeners.clone();
-                       copy.listeners = new ArrayList<ChangeListener>();
+                       copy.listeners = new ArrayList<EventListener>();
                        copy.simulatedConditions = null;
                        copy.simulatedMotors = null;
                        copy.simulatedData = null;
@@ -429,34 +429,37 @@ public class Simulation implements ChangeSource, Cloneable {
        
 
        @Override
-       public void addChangeListener(ChangeListener listener) {
+       public void addChangeListener(EventListener listener) {
                mutex.verify();
                listeners.add(listener);
        }
        
        @Override
-       public void removeChangeListener(ChangeListener listener) {
+       public void removeChangeListener(EventListener listener) {
                mutex.verify();
                listeners.remove(listener);
        }
        
        protected void fireChangeEvent() {
-               ChangeListener[] ls = listeners.toArray(new ChangeListener[0]);
-               ChangeEvent e = new ChangeEvent(this);
-               for (ChangeListener l : ls) {
-                       l.stateChanged(e);
+               EventObject e = new EventObject(this);
+               // Copy the list before iterating to prevent concurrent modification exceptions.
+               EventListener[] ls = listeners.toArray(new EventListener[0]);
+               for (EventListener l : ls) {
+                       if ( l instanceof StateChangeListener ) {
+                               ((StateChangeListener)l).stateChanged(e);
+                       }
                }
        }
        
        
 
 
-       private class ConditionListener implements ChangeListener {
+       private class ConditionListener implements StateChangeListener {
                
                private Status oldStatus = null;
                
                @Override
-               public void stateChanged(ChangeEvent e) {
+               public void stateChanged(EventObject e) {
                        if (getStatus() != oldStatus) {
                                oldStatus = getStatus();
                                fireChangeEvent();
index 3b4e0dae208d3e0f1a19bc6dd49a5bf55ceb9405..3b5174593300acabe87537def8497afd7ae83855 100644 (file)
@@ -6,13 +6,14 @@ import java.beans.PropertyChangeListener;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
+import java.util.EventListener;
+import java.util.EventObject;
 
 import javax.swing.AbstractAction;
 import javax.swing.Action;
 import javax.swing.BoundedRangeModel;
 import javax.swing.SpinnerModel;
 import javax.swing.SpinnerNumberModel;
-import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
 
 import net.sf.openrocket.logging.LogHelper;
@@ -26,6 +27,7 @@ import net.sf.openrocket.util.Invalidator;
 import net.sf.openrocket.util.MathUtil;
 import net.sf.openrocket.util.MemoryManagement;
 import net.sf.openrocket.util.Reflection;
+import net.sf.openrocket.util.StateChangeListener;
 
 
 /**
@@ -42,7 +44,7 @@ import net.sf.openrocket.util.Reflection;
  * @author Sampo Niskanen <sampo.niskanen@iki.fi>
  */
 
-public class DoubleModel implements ChangeListener, ChangeSource, Invalidatable {
+public class DoubleModel implements StateChangeListener, ChangeSource, Invalidatable {
        private static final LogHelper log = Application.getLogger();
        
 
@@ -147,7 +149,7 @@ public class DoubleModel implements ChangeListener, ChangeSource, Invalidatable
 
        ////////////  JSlider model  ////////////
        
-       private class ValueSliderModel implements BoundedRangeModel, ChangeListener, Invalidatable {
+       private class ValueSliderModel implements BoundedRangeModel, StateChangeListener, Invalidatable {
                private static final int MAX = 1000;
                
                /*
@@ -361,7 +363,7 @@ public class DoubleModel implements ChangeListener, ChangeSource, Invalidatable
                }
                
                @Override
-               public void stateChanged(ChangeEvent e) {
+               public void stateChanged(EventObject e) {
                        // Min or max range has changed.
                        // Fire if not already firing
                        if (firing == 0)
@@ -392,7 +394,7 @@ public class DoubleModel implements ChangeListener, ChangeSource, Invalidatable
 
        ////////////  Action model  ////////////
        
-       private class AutomaticActionModel extends AbstractAction implements ChangeListener, Invalidatable {
+       private class AutomaticActionModel extends AbstractAction implements StateChangeListener, Invalidatable {
                private boolean oldValue = false;
                
                public AutomaticActionModel() {
@@ -453,7 +455,7 @@ public class DoubleModel implements ChangeListener, ChangeSource, Invalidatable
                
                // If the value has changed, generate an event to the listeners
                @Override
-               public void stateChanged(ChangeEvent e) {
+               public void stateChanged(EventObject e) {
                        boolean newValue = isAutomatic();
                        if (oldValue == newValue)
                                return;
@@ -507,7 +509,7 @@ public class DoubleModel implements ChangeListener, ChangeSource, Invalidatable
        private final Method getAutoMethod;
        private final Method setAutoMethod;
        
-       private final ArrayList<ChangeListener> listeners = new ArrayList<ChangeListener>();
+       private final ArrayList<EventListener> listeners = new ArrayList<EventListener>();
        
        private final UnitGroup units;
        private Unit currentUnit;
@@ -815,7 +817,7 @@ public class DoubleModel implements ChangeListener, ChangeSource, Invalidatable
         * @param l Listener to add.
         */
        @Override
-       public void addChangeListener(ChangeListener l) {
+       public void addChangeListener(EventListener l) {
                checkState(true);
                
                if (listeners.isEmpty()) {
@@ -836,7 +838,7 @@ public class DoubleModel implements ChangeListener, ChangeSource, Invalidatable
         * @param l Listener to remove.
         */
        @Override
-       public void removeChangeListener(ChangeListener l) {
+       public void removeChangeListener(EventListener l) {
                checkState(false);
                
                listeners.remove(l);
@@ -888,11 +890,15 @@ public class DoubleModel implements ChangeListener, ChangeSource, Invalidatable
        protected void fireStateChanged() {
                checkState(true);
                
-               Object[] l = listeners.toArray();
-               ChangeEvent event = new ChangeEvent(this);
+               EventObject event = new EventObject(this);
                firing++;
-               for (int i = 0; i < l.length; i++)
-                       ((ChangeListener) l[i]).stateChanged(event);
+               // Copy the list before iterating to prevent concurrent modification exceptions.
+               EventListener[] ls = listeners.toArray(new EventListener[0]);
+               for (EventListener l : ls) {
+                       if ( l instanceof StateChangeListener ) {
+                               ((StateChangeListener)l).stateChanged(event);
+                       }
+               }
                firing--;
        }
        
@@ -901,7 +907,7 @@ public class DoubleModel implements ChangeListener, ChangeSource, Invalidatable
         * it has, updates lastValue and generates ChangeEvents for all listeners of the model.
         */
        @Override
-       public void stateChanged(ChangeEvent e) {
+       public void stateChanged(EventObject e) {
                checkState(true);
                
                double v = getValue();
index d2b2a9fcd0e476370d959e00911bbca4740299c7..57852699e2a2ff48a2c16efd96981e56d5092a7d 100644 (file)
@@ -1,13 +1,12 @@
 package net.sf.openrocket.gui.adaptors;
 
 
+import java.util.EventObject;
 import java.util.HashMap;
 import java.util.Map;
 
 import javax.swing.ComboBoxModel;
 import javax.swing.SwingUtilities;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
 import javax.swing.event.EventListenerList;
 import javax.swing.event.ListDataEvent;
 import javax.swing.event.ListDataListener;
@@ -19,8 +18,9 @@ import net.sf.openrocket.rocketcomponent.ComponentChangeEvent;
 import net.sf.openrocket.rocketcomponent.Configuration;
 import net.sf.openrocket.rocketcomponent.Rocket;
 import net.sf.openrocket.startup.Application;
+import net.sf.openrocket.util.StateChangeListener;
 
-public class MotorConfigurationModel implements ComboBoxModel, ChangeListener {
+public class MotorConfigurationModel implements ComboBoxModel, StateChangeListener {
        private static final Translator trans = Application.getTranslator();
 
        private static final String EDIT = trans.get("MotorCfgModel.Editcfg");
@@ -121,7 +121,7 @@ public class MotorConfigurationModel implements ComboBoxModel, ChangeListener {
         
        
        @Override
-       public void stateChanged(ChangeEvent e) {
+       public void stateChanged(EventObject e) {
                if (e instanceof ComponentChangeEvent) {
                        // Ignore unnecessary changes
                        if (!((ComponentChangeEvent)e).isMotorChange())
index 63d2f469838b03b5fb6c06c13ff385fb7b4e075e..02fbac586aae866138f37c015b981e2ad5c70302 100644 (file)
@@ -2,14 +2,15 @@ package net.sf.openrocket.gui.scalefigure;
 
 import java.awt.Color;
 import java.awt.Dimension;
+import java.util.EventListener;
+import java.util.EventObject;
 import java.util.LinkedList;
 import java.util.List;
 
 import javax.swing.JPanel;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
 
 import net.sf.openrocket.util.Prefs;
+import net.sf.openrocket.util.StateChangeListener;
 
 
 public abstract class AbstractScaleFigure extends JPanel implements ScaleFigure {
@@ -27,7 +28,7 @@ public abstract class AbstractScaleFigure extends JPanel implements ScaleFigure
        protected int borderPixelsWidth = DEFAULT_BORDER_PIXELS_WIDTH;
        protected int borderPixelsHeight = DEFAULT_BORDER_PIXELS_HEIGHT;
        
-       protected final List<ChangeListener> listeners = new LinkedList<ChangeListener>();
+       protected final List<EventListener> listeners = new LinkedList<EventListener>();
        
        
        public AbstractScaleFigure() {
@@ -106,23 +107,26 @@ public abstract class AbstractScaleFigure extends JPanel implements ScaleFigure
        
        
        @Override
-       public void addChangeListener(ChangeListener listener) {
+       public void addChangeListener(EventListener listener) {
                listeners.add(0, listener);
        }
        
        @Override
-       public void removeChangeListener(ChangeListener listener) {
+       public void removeChangeListener(EventListener listener) {
                listeners.remove(listener);
        }
        
-       private ChangeEvent changeEvent = null;
+       private EventObject changeEvent = null;
        
        protected void fireChangeEvent() {
-               ChangeListener[] list = listeners.toArray(new ChangeListener[0]);
-               for (ChangeListener l : list) {
-                       if (changeEvent == null)
-                               changeEvent = new ChangeEvent(this);
-                       l.stateChanged(changeEvent);
+               if (changeEvent == null)
+                       changeEvent = new EventObject(this);
+               // 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(changeEvent);
+                       }
                }
        }
        
index 8381313c4e5bddd6d2cf73b5daf1b086690422c8..f9e2efd6b02078c8ae254cd8b571b03620324929 100644 (file)
@@ -9,6 +9,8 @@ import java.awt.event.InputEvent;
 import java.awt.event.MouseEvent;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.EventListener;
+import java.util.EventObject;
 import java.util.List;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
@@ -23,8 +25,6 @@ import javax.swing.JSlider;
 import javax.swing.JToggleButton;
 import javax.swing.JViewport;
 import javax.swing.SwingUtilities;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
 import javax.swing.event.TreeSelectionEvent;
 import javax.swing.event.TreeSelectionListener;
 import javax.swing.tree.TreePath;
@@ -68,6 +68,7 @@ import net.sf.openrocket.util.Chars;
 import net.sf.openrocket.util.Coordinate;
 import net.sf.openrocket.util.MathUtil;
 import net.sf.openrocket.util.Prefs;
+import net.sf.openrocket.util.StateChangeListener;
 
 /**
  * A JPanel that contains a RocketFigure and buttons to manipulate the figure. 
@@ -110,7 +111,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
 
        private SimulationWorker backgroundSimulationWorker = null;
        
-       private List<ChangeListener> listeners = new ArrayList<ChangeListener>();
+       private List<EventListener> listeners = new ArrayList<EventListener>();
        
 
        /**
@@ -158,9 +159,9 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
                
                createPanel();
                
-               configuration.addChangeListener(new ChangeListener() {
+               configuration.addChangeListener(new StateChangeListener() {
                        @Override
-                       public void stateChanged(ChangeEvent e) {
+                       public void stateChanged(EventObject e) {
                                System.out.println("Configuration changed, calling updateFigure");
                                updateExtras();
                                figure.updateFigure();
@@ -374,20 +375,21 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
        
 
        @Override
-       public void addChangeListener(ChangeListener listener) {
+       public void addChangeListener(EventListener listener) {
                listeners.add(0, listener);
        }
        
        @Override
-       public void removeChangeListener(ChangeListener listener) {
+       public void removeChangeListener(EventListener listener) {
                listeners.remove(listener);
        }
        
        protected void fireChangeEvent() {
-               ChangeEvent e = new ChangeEvent(this);
-               ChangeListener[] list = listeners.toArray(new ChangeListener[0]);
-               for (ChangeListener l : list) {
-                       l.stateChanged(e);
+               EventObject e = new EventObject(this);
+               for (EventListener l : listeners) {
+                       if ( l instanceof StateChangeListener ) {
+                               ((StateChangeListener)l).stateChanged(e);
+                       }
                }
        }
        
@@ -711,7 +713,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
         * 
         * @author Sampo Niskanen <sampo.niskanen@iki.fi>
         */
-       private class FigureTypeAction extends AbstractAction implements ChangeListener {
+       private class FigureTypeAction extends AbstractAction implements StateChangeListener {
                private final int type;
                
                public FigureTypeAction(int type) {
@@ -732,7 +734,7 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change
                }
                
                @Override
-               public void stateChanged(ChangeEvent e) {
+               public void stateChanged(EventObject e) {
                        putValue(Action.SELECTED_KEY, figure.getType() == type);
                }
        }
index 46c167d480978f90630d172c26588ab2d97e9686..1d8c0fd1894c4ac7445f31232b7a29ec06dae7ba 100644 (file)
@@ -1,16 +1,16 @@
 package net.sf.openrocket.optimization.rocketoptimization.modifiers;
 
 import java.util.ArrayList;
+import java.util.EventListener;
+import java.util.EventObject;
 import java.util.List;
 
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-
 import net.sf.openrocket.document.Simulation;
 import net.sf.openrocket.optimization.general.OptimizationException;
 import net.sf.openrocket.optimization.rocketoptimization.SimulationModifier;
 import net.sf.openrocket.unit.UnitGroup;
 import net.sf.openrocket.util.MathUtil;
+import net.sf.openrocket.util.StateChangeListener;
 
 /**
  * An abstract implementation of the SimulationModifier interface.  An implementation
@@ -29,7 +29,7 @@ public abstract class AbstractSimulationModifier implements SimulationModifier {
        private double minValue = 0.0;
        private double maxValue = 1.0;
        
-       private final List<ChangeListener> listeners = new ArrayList<ChangeListener>();
+       private final List<EventListener> listeners = new ArrayList<EventListener>();
        
        
        /**
@@ -148,12 +148,12 @@ public abstract class AbstractSimulationModifier implements SimulationModifier {
        
        
        @Override
-       public void addChangeListener(ChangeListener listener) {
+       public void addChangeListener(EventListener listener) {
                listeners.add(listener);
        }
        
        @Override
-       public void removeChangeListener(ChangeListener listener) {
+       public void removeChangeListener(EventListener listener) {
                listeners.remove(listener);
        }
        
@@ -162,10 +162,13 @@ public abstract class AbstractSimulationModifier implements SimulationModifier {
         * Fire a change event to the listeners.
         */
        protected void fireChangeEvent() {
-               ChangeListener[] array = listeners.toArray(new ChangeListener[0]);
-               ChangeEvent event = new ChangeEvent(this);
-               for (ChangeListener l : array) {
-                       l.stateChanged(event);
+               EventObject event = new EventObject(this);
+               // 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);
+                       }
                }
        }
        
index 60123e87656c730040f2e3dfdec15438fd3f41b4..5a2a2e24f1072bf9145cba2498528b8099b31682 100644 (file)
@@ -1,8 +1,8 @@
 package net.sf.openrocket.rocketcomponent;
 
-import javax.swing.event.ChangeEvent;
+import java.util.EventObject;
 
-public class ComponentChangeEvent extends ChangeEvent {
+public class ComponentChangeEvent extends EventObject {
        private static final long serialVersionUID = 1L;
        
 
index 404e84c326657df89d3669e0ae33ef2e1e8d120c..4a76df71589180e0d2c802fae4598a90b0a2e336 100644 (file)
@@ -3,20 +3,19 @@ package net.sf.openrocket.rocketcomponent;
 import java.util.BitSet;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.EventListener;
+import java.util.EventObject;
 import java.util.Iterator;
 import java.util.List;
 import java.util.NoSuchElementException;
 
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-import javax.swing.event.EventListenerList;
-
 import net.sf.openrocket.util.ArrayList;
 import net.sf.openrocket.util.BugException;
 import net.sf.openrocket.util.ChangeSource;
 import net.sf.openrocket.util.Coordinate;
 import net.sf.openrocket.util.MathUtil;
 import net.sf.openrocket.util.Monitorable;
+import net.sf.openrocket.util.StateChangeListener;
 
 
 /**
@@ -34,7 +33,7 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi
        
        private String motorConfiguration = null;
        
-       private EventListenerList listenerList = new EventListenerList();
+       private List<EventListener> listenerList = new ArrayList<EventListener>();
        
 
        /* Cached data */
@@ -199,26 +198,27 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi
        ////////////////  Listeners  ////////////////
        
        @Override
-       public void addChangeListener(ChangeListener listener) {
-               listenerList.add(ChangeListener.class, listener);
+       public void addChangeListener(EventListener listener) {
+               listenerList.add(listener);
        }
        
        @Override
-       public void removeChangeListener(ChangeListener listener) {
-               listenerList.remove(ChangeListener.class, listener);
+       public void removeChangeListener(EventListener listener) {
+               listenerList.remove(listener);
        }
        
        protected void fireChangeEvent() {
-               Object[] listeners = listenerList.getListenerList();
-               ChangeEvent e = new ChangeEvent(this);
+               EventObject e = new EventObject(this);
                
                this.modID++;
                boundsModID = -1;
                refLengthModID = -1;
-               
-               for (int i = listeners.length - 2; i >= 0; i -= 2) {
-                       if (listeners[i] == ChangeListener.class) {
-                               ((ChangeListener) listeners[i + 1]).stateChanged(e);
+
+               // Copy the list before iterating to prevent concurrent modification exceptions.
+               EventListener[] listeners = listenerList.toArray(new EventListener[0]);
+               for (EventListener l : listeners) {
+                       if ( l instanceof StateChangeListener ) {
+                               ((StateChangeListener)l).stateChanged(e);
                        }
                }
        }
@@ -340,7 +340,7 @@ public class Configuration implements Cloneable, ChangeSource, ComponentChangeLi
        public Configuration clone() {
                try {
                        Configuration config = (Configuration) super.clone();
-                       config.listenerList = new EventListenerList();
+                       config.listenerList = new ArrayList<EventListener>();
                        config.stages = (BitSet) this.stages.clone();
                        config.cachedBounds = new ArrayList<Coordinate>();
                        config.boundsModID = -1;
index 4115c87b6f43551e728d1877ff12544eedd604b1..d9dac38adecd313c961ff16242a29ae988d22561 100644 (file)
@@ -2,15 +2,13 @@ package net.sf.openrocket.rocketcomponent;
 
 import java.util.Collection;
 import java.util.Collections;
+import java.util.EventListener;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.UUID;
 
-import javax.swing.event.ChangeListener;
-import javax.swing.event.EventListenerList;
-
 import net.sf.openrocket.gui.main.ExceptionHandler;
 import net.sf.openrocket.l10n.Translator;
 import net.sf.openrocket.logging.LogHelper;
@@ -20,6 +18,7 @@ import net.sf.openrocket.util.ArrayList;
 import net.sf.openrocket.util.Chars;
 import net.sf.openrocket.util.Coordinate;
 import net.sf.openrocket.util.MathUtil;
+import net.sf.openrocket.util.StateChangeListener;
 import net.sf.openrocket.util.UniqueID;
 
 
@@ -43,7 +42,7 @@ public class Rocket extends RocketComponent {
        /**
         * List of component change listeners.
         */
-       private EventListenerList listenerList = new EventListenerList();
+       private List<EventListener> listenerList = new ArrayList<EventListener>();
        
        /**
         * When freezeList != null, events are not dispatched but stored in the list.
@@ -341,46 +340,48 @@ public class Rocket extends RocketComponent {
         */
        public void resetListeners() {
                //              System.out.println("RESETTING LISTENER LIST of Rocket "+this);
-               listenerList = new EventListenerList();
+               listenerList = new ArrayList<EventListener>();
        }
        
        
        public void printListeners() {
-               System.out.println("" + this + " has " + listenerList.getListenerCount() + " listeners:");
-               Object[] list = listenerList.getListenerList();
-               for (int i = 1; i < list.length; i += 2)
-                       System.out.println("  " + ((i + 1) / 2) + ": " + list[i]);
+               System.out.println("" + this + " has " + listenerList.size() + " listeners:");
+               int i =0;
+               for( EventListener l : listenerList ) {
+                       System.out.println("  " + (i) + ": " + l);
+                       i++;
+               }
        }
        
        @Override
        public void addComponentChangeListener(ComponentChangeListener l) {
                checkState();
-               listenerList.add(ComponentChangeListener.class, l);
+               listenerList.add(l);
                log.verbose("Added ComponentChangeListener " + l + ", current number of listeners is " +
-                               listenerList.getListenerCount());
+                               listenerList.size());
        }
        
        @Override
        public void removeComponentChangeListener(ComponentChangeListener l) {
-               listenerList.remove(ComponentChangeListener.class, l);
+               listenerList.remove(l);
                log.verbose("Removed ComponentChangeListener " + l + ", current number of listeners is " +
-                               listenerList.getListenerCount());
+                               listenerList.size());
        }
        
        
        @Override
-       public void addChangeListener(ChangeListener l) {
+       public void addChangeListener(EventListener l) {
                checkState();
-               listenerList.add(ChangeListener.class, l);
+               listenerList.add(l);
                log.verbose("Added ChangeListener " + l + ", current number of listeners is " +
-                               listenerList.getListenerCount());
+                               listenerList.size());
        }
        
        @Override
-       public void removeChangeListener(ChangeListener l) {
-               listenerList.remove(ChangeListener.class, l);
+       public void removeChangeListener(EventListener l) {
+               listenerList.remove(l);
                log.verbose("Removed ChangeListener " + l + ", current number of listeners is " +
-                               listenerList.getListenerCount());
+                               listenerList.size());
        }
        
        
@@ -419,12 +420,11 @@ public class Rocket extends RocketComponent {
                        }
                        
                        // Notify all listeners
-                       Object[] listeners = listenerList.getListenerList();
-                       for (int i = listeners.length - 2; i >= 0; i -= 2) {
-                               if (listeners[i] == ComponentChangeListener.class) {
-                                       ((ComponentChangeListener) listeners[i + 1]).componentChanged(e);
-                               } else if (listeners[i] == ChangeListener.class) {
-                                       ((ChangeListener) listeners[i + 1]).stateChanged(e);
+                       for ( EventListener l : listenerList ) {
+                               if ( l instanceof ComponentChangeListener ) {
+                                       ((ComponentChangeListener) l ).componentChanged(e);
+                               } else if ( l instanceof StateChangeListener ) {
+                                       ((StateChangeListener) l ).stateChanged(e);
                                }
                        }
                } finally {
index bde01f655c13ad117ed5496f385d72c2851064f1..fee3593f40d394e761c4631183869e88832d274f 100644 (file)
@@ -1,5 +1,14 @@
 package net.sf.openrocket.rocketcomponent;
 
+import java.awt.Color;
+import java.util.ArrayDeque;
+import java.util.Collection;
+import java.util.Deque;
+import java.util.EventListener;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+
 import net.sf.openrocket.l10n.Translator;
 import net.sf.openrocket.logging.LogHelper;
 import net.sf.openrocket.preset.ComponentPreset;
@@ -14,15 +23,6 @@ import net.sf.openrocket.util.MathUtil;
 import net.sf.openrocket.util.SafetyMutex;
 import net.sf.openrocket.util.UniqueID;
 
-import javax.swing.event.ChangeListener;
-import java.awt.*;
-import java.util.ArrayDeque;
-import java.util.Collection;
-import java.util.Deque;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-
 
 public abstract class RocketComponent implements ChangeSource, Cloneable, Iterable<RocketComponent> {
        private static final LogHelper log = Application.getLogger();
@@ -1470,7 +1470,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
         * @throws IllegalStateException - if the root component is not a <code>Rocket</code>
         */
        @Override
-       public void addChangeListener(ChangeListener l) {
+       public void addChangeListener(EventListener l) {
                checkState();
                getRocket().addChangeListener(l);
        }
@@ -1484,7 +1484,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
         * @param l  Listener to remove
         */
        @Override
-       public void removeChangeListener(ChangeListener l) {
+       public void removeChangeListener(EventListener l) {
                if (this.parent != null) {
                        getRoot().removeChangeListener(l);
                }
index e6e8f821a61293880c26119700bffda94aca6223..7734ec5dac778921b32d17eae70fdc0bbe5dded8 100644 (file)
@@ -1,12 +1,11 @@
 package net.sf.openrocket.simulation;
 
 import java.util.ArrayList;
+import java.util.EventListener;
+import java.util.EventObject;
 import java.util.List;
 import java.util.Random;
 
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-
 import net.sf.openrocket.aerodynamics.BarrowmanCalculator;
 import net.sf.openrocket.masscalc.BasicMassCalculator;
 import net.sf.openrocket.models.atmosphere.AtmosphericModel;
@@ -19,6 +18,7 @@ import net.sf.openrocket.util.BugException;
 import net.sf.openrocket.util.ChangeSource;
 import net.sf.openrocket.util.GeodeticComputationStrategy;
 import net.sf.openrocket.util.MathUtil;
+import net.sf.openrocket.util.StateChangeListener;
 import net.sf.openrocket.util.Utils;
 import net.sf.openrocket.util.WorldCoordinate;
 
@@ -85,7 +85,7 @@ public class SimulationOptions implements ChangeSource, Cloneable {
        private boolean calculateExtras = true;
        
 
-       private List<ChangeListener> listeners = new ArrayList<ChangeListener>();
+       private List<EventListener> listeners = new ArrayList<EventListener>();
        
        
 
@@ -386,7 +386,7 @@ public class SimulationOptions implements ChangeSource, Cloneable {
        public SimulationOptions clone() {
                try {
                        SimulationOptions copy = (SimulationOptions) super.clone();
-                       copy.listeners = new ArrayList<ChangeListener>();
+                       copy.listeners = new ArrayList<EventListener>();
                        return copy;
                } catch (CloneNotSupportedException e) {
                        throw new BugException(e);
@@ -477,22 +477,25 @@ public class SimulationOptions implements ChangeSource, Cloneable {
        }
        
        @Override
-       public void addChangeListener(ChangeListener listener) {
+       public void addChangeListener(EventListener listener) {
                listeners.add(listener);
        }
        
        @Override
-       public void removeChangeListener(ChangeListener listener) {
+       public void removeChangeListener(EventListener listener) {
                listeners.remove(listener);
        }
        
-       private final ChangeEvent event = new ChangeEvent(this);
+       private final EventObject event = new EventObject(this);
        
        private void fireChangeEvent() {
-               ChangeListener[] array = listeners.toArray(new ChangeListener[0]);
                
-               for (int i = array.length - 1; i >= 0; i--) {
-                       array[i].stateChanged(event);
+               // 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);
+                       }
                }
        }
        
index 14109da0d4e4e51487be6a9189b38c798462aaa7..57664aed387382e1616eeed25e173b40d21d6545 100644 (file)
@@ -1,10 +1,9 @@
 package net.sf.openrocket.util;
 
+import java.util.EventListener;
+import java.util.EventObject;
 import java.util.List;
 
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-
 import net.sf.openrocket.logging.LogHelper;
 import net.sf.openrocket.startup.Application;
 
@@ -16,19 +15,19 @@ import net.sf.openrocket.startup.Application;
 public abstract class AbstractChangeSource implements ChangeSource {
        private static final LogHelper log = Application.getLogger();
        
-       private final List<ChangeListener> listeners = new ArrayList<ChangeListener>();
+       private final List<EventListener> listeners = new ArrayList<EventListener>();
        
-       private final ChangeEvent event = new ChangeEvent(this);
+       private final EventObject event = new EventObject(this);
        
        
        @Override
-       public final void addChangeListener(ChangeListener listener) {
+       public final void addChangeListener(EventListener listener) {
                listeners.add(listener);
                log.verbose(1, "Adding change listeners, listener count is now " + listeners.size());
        }
        
        @Override
-       public final void removeChangeListener(ChangeListener listener) {
+       public final void removeChangeListener(EventListener listener) {
                listeners.remove(listener);
                log.verbose(1, "Removing change listeners, listener count is now " + listeners.size());
        }
@@ -38,10 +37,12 @@ public abstract class AbstractChangeSource implements ChangeSource {
         * Fire a change event to all listeners.
         */
        protected void fireChangeEvent() {
-               ChangeListener[] array = listeners.toArray(new ChangeListener[0]);
-               
-               for (ChangeListener l : array) {
-                       l.stateChanged(event);
+               // 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);
+                       }
                }
        }
 }
index 5d166cd549eb179f2b4fc4f743e0ad16323736bf..f6669ef3aa26e66807512abd04e8fad2710358f3 100644 (file)
@@ -1,6 +1,6 @@
 package net.sf.openrocket.util;
 
-import javax.swing.event.ChangeListener;
+import java.util.EventListener;
 
 /**
  * An interface defining an object firing ChangeEvents.  Why isn't this included in the Java API??
@@ -9,7 +9,7 @@ import javax.swing.event.ChangeListener;
  */
 public interface ChangeSource {
 
-       public void addChangeListener(ChangeListener listener);
-       public void removeChangeListener(ChangeListener listener);
+       public void addChangeListener(EventListener listener);
+       public void removeChangeListener(EventListener listener);
        
 }
diff --git a/src/net/sf/openrocket/util/StateChangeListener.java b/src/net/sf/openrocket/util/StateChangeListener.java
new file mode 100644 (file)
index 0000000..2d5e5df
--- /dev/null
@@ -0,0 +1,10 @@
+package net.sf.openrocket.util;\r
+\r
+import java.util.EventListener;\r
+import java.util.EventObject;\r
+\r
+public interface StateChangeListener extends EventListener {\r
+\r
+       public void stateChanged( EventObject e );\r
+\r
+}\r