From 47731a41fc57e9d8f6f2c1658d0f2a19a53b0219 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Wed, 22 Mar 2023 22:12:14 +0100 Subject: [PATCH 1/2] Add ChangeListener to BooleanModel --- .../openrocket/gui/adaptors/BooleanModel.java | 56 ++++++++++++++++++- 1 file changed, 55 insertions(+), 1 deletion(-) 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); } From 4257bb2777fa9a43cebf12ff2d9229e2a72431d1 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Wed, 22 Mar 2023 22:28:21 +0100 Subject: [PATCH 2/2] [#2104] Display ISAA values in temp & pressure fields --- .../simulation/SimulationOptions.java | 14 +++++++ .../sf/openrocket/startup/Preferences.java | 14 +++++++ .../preferences/LaunchPreferencesPanel.java | 29 ++++++++++---- .../simulation/SimulationConditionsPanel.java | 39 ++++++++++++------- 4 files changed, 74 insertions(+), 22 deletions(-) diff --git a/core/src/net/sf/openrocket/simulation/SimulationOptions.java b/core/src/net/sf/openrocket/simulation/SimulationOptions.java index f19815e85..31bd9ff8e 100644 --- a/core/src/net/sf/openrocket/simulation/SimulationOptions.java +++ b/core/src/net/sf/openrocket/simulation/SimulationOptions.java @@ -213,6 +213,13 @@ public class SimulationOptions implements ChangeSource, Cloneable { if (MathUtil.equals(this.launchAltitude, altitude)) return; this.launchAltitude = altitude; + + // Update the launch temperature and pressure if using ISA + if (useISA) { + setLaunchTemperature(ISA_ATMOSPHERIC_MODEL.getConditions(getLaunchAltitude()).getTemperature()); + setLaunchPressure(ISA_ATMOSPHERIC_MODEL.getConditions(getLaunchAltitude()).getPressure()); + } + fireChangeEvent(); } @@ -265,6 +272,13 @@ public class SimulationOptions implements ChangeSource, Cloneable { if (isa == useISA) return; useISA = isa; + + // Update the launch temperature and pressure + if (isa) { + setLaunchTemperature(ISA_ATMOSPHERIC_MODEL.getConditions(getLaunchAltitude()).getTemperature()); + setLaunchPressure(ISA_ATMOSPHERIC_MODEL.getConditions(getLaunchAltitude()).getPressure()); + } + fireChangeEvent(); } diff --git a/core/src/net/sf/openrocket/startup/Preferences.java b/core/src/net/sf/openrocket/startup/Preferences.java index 32325bb5e..eac3b3642 100644 --- a/core/src/net/sf/openrocket/startup/Preferences.java +++ b/core/src/net/sf/openrocket/startup/Preferences.java @@ -349,6 +349,13 @@ public abstract class Preferences implements ChangeSource { if (MathUtil.equals(this.getDouble(LAUNCH_ALTITUDE, 0), altitude)) return; this.putDouble(LAUNCH_ALTITUDE, altitude); + + // Update the launch temperature and pressure if using ISA + if (getISAAtmosphere()) { + setLaunchTemperature(ISA_ATMOSPHERIC_MODEL.getConditions(getLaunchAltitude()).getTemperature()); + setLaunchPressure(ISA_ATMOSPHERIC_MODEL.getConditions(getLaunchAltitude()).getPressure()); + } + fireChangeEvent(); } @@ -443,6 +450,13 @@ public abstract class Preferences implements ChangeSource { return; } this.putBoolean(LAUNCH_USE_ISA, isa); + + // Update the launch temperature and pressure + if (isa) { + setLaunchTemperature(ISA_ATMOSPHERIC_MODEL.getConditions(getLaunchAltitude()).getTemperature()); + setLaunchPressure(ISA_ATMOSPHERIC_MODEL.getConditions(getLaunchAltitude()).getPressure()); + } + fireChangeEvent(); } diff --git a/swing/src/net/sf/openrocket/gui/dialogs/preferences/LaunchPreferencesPanel.java b/swing/src/net/sf/openrocket/gui/dialogs/preferences/LaunchPreferencesPanel.java index 961c1f8ce..459c6f747 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/preferences/LaunchPreferencesPanel.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/preferences/LaunchPreferencesPanel.java @@ -3,6 +3,7 @@ package net.sf.openrocket.gui.dialogs.preferences; import java.awt.LayoutManager; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; +import java.util.EventObject; import javax.swing.BorderFactory; import javax.swing.JCheckBox; @@ -26,6 +27,7 @@ import net.sf.openrocket.models.atmosphere.ExtendedISAModel; import net.sf.openrocket.simulation.SimulationOptions; import net.sf.openrocket.unit.UnitGroup; import net.sf.openrocket.util.Chars; +import net.sf.openrocket.util.StateChangeListener; public class LaunchPreferencesPanel extends PreferencesPanel { @@ -50,6 +52,8 @@ public class LaunchPreferencesPanel extends PreferencesPanel { UnitSelector unit; BasicSlider slider; DoubleModel m; + DoubleModel temperatureModel; + DoubleModel pressureModel; JSpinner spin; // Wind settings: Average wind speed, turbulence intensity, std. @@ -215,20 +219,20 @@ public class LaunchPreferencesPanel extends PreferencesPanel { isa.addEnableComponent(label, false); sub.add(label); - m = new DoubleModel(preferences, "LaunchTemperature", + temperatureModel = new DoubleModel(preferences, "LaunchTemperature", UnitGroup.UNITS_TEMPERATURE, 0); - spin = new JSpinner(m.getSpinnerModel()); + spin = new JSpinner(temperatureModel.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); spin.setToolTipText(tip); isa.addEnableComponent(spin, false); sub.add(spin, "growx"); - unit = new UnitSelector(m); + unit = new UnitSelector(temperatureModel); unit.setToolTipText(tip); isa.addEnableComponent(unit, false); sub.add(unit, "growx"); - slider = new BasicSlider(m.getSliderModel(253.15, 308.15)); // -20 ... + slider = new BasicSlider(temperatureModel.getSliderModel(253.15, 308.15)); // -20 ... // 35 slider.setToolTipText(tip); isa.addEnableComponent(slider, false); @@ -242,24 +246,33 @@ public class LaunchPreferencesPanel extends PreferencesPanel { isa.addEnableComponent(label, false); sub.add(label); - m = new DoubleModel(preferences, "LaunchPressure", + pressureModel = new DoubleModel(preferences, "LaunchPressure", UnitGroup.UNITS_PRESSURE, 0); - spin = new JSpinner(m.getSpinnerModel()); + spin = new JSpinner(pressureModel.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); spin.setToolTipText(tip); isa.addEnableComponent(spin, false); sub.add(spin, "growx"); - unit = new UnitSelector(m); + unit = new UnitSelector(pressureModel); unit.setToolTipText(tip); isa.addEnableComponent(unit, false); sub.add(unit, "growx"); - slider = new BasicSlider(m.getSliderModel(0.950e5, 1.050e5)); + slider = new BasicSlider(pressureModel.getSliderModel(0.950e5, 1.050e5)); slider.setToolTipText(tip); isa.addEnableComponent(slider, false); sub.add(slider, "w 75lp, wrap"); + isa.addChangeListener(new StateChangeListener() { + @Override + public void stateChanged(EventObject e) { + temperatureModel.stateChanged(e); + pressureModel.stateChanged(e); + } + }); + + // // Launch site preferences sub = new JPanel(new MigLayout("fill, gap rel unrel", "[grow][65lp!][30lp!][75lp!]", "")); diff --git a/swing/src/net/sf/openrocket/gui/simulation/SimulationConditionsPanel.java b/swing/src/net/sf/openrocket/gui/simulation/SimulationConditionsPanel.java index 5be321a49..9d11d2010 100644 --- a/swing/src/net/sf/openrocket/gui/simulation/SimulationConditionsPanel.java +++ b/swing/src/net/sf/openrocket/gui/simulation/SimulationConditionsPanel.java @@ -2,6 +2,7 @@ package net.sf.openrocket.gui.simulation; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.util.EventObject; import javax.swing.BorderFactory; import javax.swing.JButton; @@ -27,6 +28,7 @@ import net.sf.openrocket.startup.Application; import net.sf.openrocket.unit.UnitGroup; import net.sf.openrocket.util.Chars; import net.sf.openrocket.gui.widgets.SelectColorButton; +import net.sf.openrocket.util.StateChangeListener; public class SimulationConditionsPanel extends JPanel { private static final Translator trans = Application.getTranslator(); @@ -43,6 +45,8 @@ public class SimulationConditionsPanel extends JPanel { BasicSlider slider; DoubleModel m; JSpinner spin; + DoubleModel temperatureModel; + DoubleModel pressureModel; //// Wind settings: Average wind speed, turbulence intensity, std. deviation, and direction sub = new JPanel(new MigLayout("fill, gap rel unrel", @@ -197,20 +201,20 @@ public class SimulationConditionsPanel extends JPanel { label.setToolTipText(tip); isa.addEnableComponent(label, false); sub.add(label); + + temperatureModel = new DoubleModel(conditions, "LaunchTemperature", UnitGroup.UNITS_TEMPERATURE, 0); - m = new DoubleModel(conditions, "LaunchTemperature", UnitGroup.UNITS_TEMPERATURE, 0); - - spin = new JSpinner(m.getSpinnerModel()); + spin = new JSpinner(temperatureModel.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); spin.setToolTipText(tip); isa.addEnableComponent(spin, false); sub.add(spin, "growx"); - unit = new UnitSelector(m); + unit = new UnitSelector(temperatureModel); unit.setToolTipText(tip); isa.addEnableComponent(unit, false); sub.add(unit, "growx"); - slider = new BasicSlider(m.getSliderModel(253.15, 308.15)); // -20 ... 35 + slider = new BasicSlider(temperatureModel.getSliderModel(253.15, 308.15)); // -20 ... 35 slider.setToolTipText(tip); isa.addEnableComponent(slider, false); sub.add(slider, "w 75lp, wrap"); @@ -224,28 +228,35 @@ public class SimulationConditionsPanel extends JPanel { label.setToolTipText(tip); isa.addEnableComponent(label, false); sub.add(label); + + pressureModel = new DoubleModel(conditions, "LaunchPressure", UnitGroup.UNITS_PRESSURE, 0); - m = new DoubleModel(conditions, "LaunchPressure", UnitGroup.UNITS_PRESSURE, 0); - - spin = new JSpinner(m.getSpinnerModel()); + spin = new JSpinner(pressureModel.getSpinnerModel()); spin.setEditor(new SpinnerEditor(spin)); spin.setToolTipText(tip); isa.addEnableComponent(spin, false); sub.add(spin, "growx"); - unit = new UnitSelector(m); + unit = new UnitSelector(pressureModel); unit.setToolTipText(tip); isa.addEnableComponent(unit, false); sub.add(unit, "growx"); - slider = new BasicSlider(m.getSliderModel(0.950e5, 1.050e5)); + slider = new BasicSlider(pressureModel.getSliderModel(0.950e5, 1.050e5)); slider.setToolTipText(tip); isa.addEnableComponent(slider, false); sub.add(slider, "w 75lp, wrap"); + + + isa.addChangeListener(new StateChangeListener() { + @Override + public void stateChanged(EventObject e) { + temperatureModel.stateChanged(e); + pressureModel.stateChanged(e); + } + }); - - - - + + //// Launch site conditions sub = new JPanel(new MigLayout("fill, gap rel unrel", "[grow][65lp!][30lp!][75lp!]", ""));