Add ChangeListener to BooleanModel

This commit is contained in:
SiboVG 2023-03-22 22:12:14 +01:00
parent f4f6200662
commit 47731a41fc

View File

@ -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 <sampo.niskanen@iki.fi>
*/
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<EventListener> 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);
}