diff --git a/swing/src/net/sf/openrocket/gui/adaptors/BooleanModel.java b/swing/src/net/sf/openrocket/gui/adaptors/BooleanModel.java index 915313994..ae5ad9288 100644 --- a/swing/src/net/sf/openrocket/gui/adaptors/BooleanModel.java +++ b/swing/src/net/sf/openrocket/gui/adaptors/BooleanModel.java @@ -6,10 +6,13 @@ 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 java.util.List; import javax.swing.AbstractAction; +import javax.swing.event.ChangeEvent; +import javax.swing.event.ChangeListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -40,7 +43,7 @@ import net.sf.openrocket.util.StateChangeListener; * * @author Sampo Niskanen */ -public class BooleanModel extends AbstractAction implements StateChangeListener, Invalidatable { +public class BooleanModel extends AbstractAction implements StateChangeListener, ChangeSource, Invalidatable { private static final long serialVersionUID = -7299680391506320196L; private static final Logger log = LoggerFactory.getLogger(BooleanModel.class); @@ -67,6 +70,7 @@ public class BooleanModel extends AbstractAction implements StateChangeListener, private boolean oldEnabled; private Invalidator invalidator = new Invalidator(this); + private final ArrayList listeners = new ArrayList<>(); /** @@ -272,6 +276,15 @@ public class BooleanModel extends AbstractAction implements StateChangeListener, oldEnabled = e; setEnabled(e); } + + for (EventListener listener : listeners) { + if (listener instanceof StateChangeListener) { + ((StateChangeListener) listener).stateChanged(event); + } else if (listener instanceof ChangeListener) { + ChangeEvent cevent = new ChangeEvent(this); + ((ChangeListener) listener).stateChanged(cevent); + } + } } @@ -294,6 +307,15 @@ public class BooleanModel extends AbstractAction implements StateChangeListener, updateEnableStatus(); firing--; } + + for (EventListener listener : listeners) { + if (listener instanceof StateChangeListener) { + ((StateChangeListener) listener).stateChanged(e); + } else if (listener instanceof ChangeListener) { + ChangeEvent cevent = new ChangeEvent(this); + ((ChangeListener) listener).stateChanged(cevent); + } + } } @@ -302,6 +324,34 @@ public class BooleanModel extends AbstractAction implements StateChangeListener, checkState(true); super.addPropertyChangeListener(listener); } + + /** + * Add a listener to the model. Adds the model as a listener to the value source if this + * is the first listener. + * @param listener Listener to add. + */ + @Override + public void addChangeListener(StateChangeListener listener) { + checkState(true); + + if (listeners.add(listener)) { + log.trace(this + " adding listener (total " + listeners.size() + "): " + listener); + } + } + + /** + * Remove a listener from the model. Removes the model from being a listener to the Component + * if this was the last listener of the model. + * @param listener Listener to remove. + */ + @Override + public void removeChangeListener(StateChangeListener listener) { + checkState(false); + + if (listeners.remove(listener)) { + log.trace(this + " removing listener (total " + listeners.size() + "): " + listener); + } + } /** @@ -320,6 +370,10 @@ public class BooleanModel extends AbstractAction implements StateChangeListener, this.removePropertyChangeListener(l); } } + if (!this.listeners.isEmpty()) { + log.warn("Invalidating " + this + " while still having listeners " + this.listeners); + } + this.listeners.clear(); if (source != null) { source.removeChangeListener(this); }