diff --git a/core/src/net/sf/openrocket/rocketcomponent/AxialStage.java b/core/src/net/sf/openrocket/rocketcomponent/AxialStage.java index 4db208072..fd657b3f4 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/AxialStage.java +++ b/core/src/net/sf/openrocket/rocketcomponent/AxialStage.java @@ -192,5 +192,44 @@ public class AxialStage extends ComponentAssembly implements FlightConfigurableC } - + public StageSeparationConfiguration getSeparationConfiguration() { + FlightConfiguration flConfig = getRocket().getSelectedConfiguration(); + StageSeparationConfiguration sepConfig = getSeparationConfigurations().get(flConfig.getId()); + // to ensure the configuration is distinct, and we're not modifying the default + if ((sepConfig == getSeparationConfigurations().getDefault()) + && (flConfig.getId() != FlightConfigurationId.DEFAULT_VALUE_FCID)) { + sepConfig = new StageSeparationConfiguration(); + getSeparationConfigurations().set(flConfig.getId(), sepConfig); + } + return sepConfig; + } + + @Override + public boolean addConfigListener(RocketComponent listener) { + boolean success = super.addConfigListener(listener); + if (listener instanceof AxialStage) { + StageSeparationConfiguration thisConfig = getSeparationConfiguration(); + StageSeparationConfiguration listenerConfig = ((AxialStage) listener).getSeparationConfiguration(); + success = success && thisConfig.addConfigListener(listenerConfig); + return success; + } + return false; + } + + @Override + public void removeConfigListener(RocketComponent listener) { + super.removeConfigListener(listener); + if (listener instanceof AxialStage) { + StageSeparationConfiguration thisConfig = getSeparationConfiguration(); + StageSeparationConfiguration listenerConfig = ((AxialStage) listener).getSeparationConfiguration(); + thisConfig.removeConfigListener(listenerConfig); + } + } + + @Override + public void clearConfigListeners() { + super.clearConfigListeners(); + StageSeparationConfiguration thisConfig = getSeparationConfiguration(); + thisConfig.clearConfigListeners(); + } } diff --git a/core/src/net/sf/openrocket/rocketcomponent/StageSeparationConfiguration.java b/core/src/net/sf/openrocket/rocketcomponent/StageSeparationConfiguration.java index adf2bc873..31ee0c893 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/StageSeparationConfiguration.java +++ b/core/src/net/sf/openrocket/rocketcomponent/StageSeparationConfiguration.java @@ -5,6 +5,8 @@ import net.sf.openrocket.simulation.FlightEvent; import net.sf.openrocket.startup.Application; import net.sf.openrocket.util.MathUtil; +import java.util.LinkedList; +import java.util.List; import java.util.Objects; public class StageSeparationConfiguration implements FlightConfigurableParameter { @@ -98,12 +100,18 @@ public class StageSeparationConfiguration implements FlightConfigurableParameter private SeparationEvent separationEvent = SeparationEvent.UPPER_IGNITION; private double separationDelay = 0; + + private final List configListeners = new LinkedList<>(); public SeparationEvent getSeparationEvent() { return separationEvent; } public void setSeparationEvent(SeparationEvent separationEvent) { + for (StageSeparationConfiguration listener : configListeners) { + listener.setSeparationEvent(separationEvent); + } + if (separationEvent == null) { throw new NullPointerException("separationEvent is null"); } @@ -119,6 +127,10 @@ public class StageSeparationConfiguration implements FlightConfigurableParameter } public void setSeparationDelay(double separationDelay) { + for (StageSeparationConfiguration listener : configListeners) { + listener.setSeparationDelay(separationDelay); + } + if (MathUtil.equals(this.separationDelay, separationDelay)) { return; } @@ -168,5 +180,30 @@ public class StageSeparationConfiguration implements FlightConfigurableParameter @Override public void update(){ } + + /** + * Add a new config listener that will undergo the same configuration changes as this configuration. + * @param listener new config listener + * @return true if listener was successfully added, false if not + */ + public boolean addConfigListener(StageSeparationConfiguration listener) { + if (listener == null) { + return false; + } + configListeners.add(listener); + return true; + } + + public void removeConfigListener(StageSeparationConfiguration listener) { + configListeners.remove(listener); + } + + public void clearConfigListeners() { + configListeners.clear(); + } + + public List getConfigListeners() { + return configListeners; + } } diff --git a/swing/src/net/sf/openrocket/gui/configdialog/AxialStageConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/AxialStageConfig.java index 7c7de6431..477b7406f 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/AxialStageConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/AxialStageConfig.java @@ -42,14 +42,8 @@ public class AxialStageConfig extends ComponentAssemblyConfig { // Select separation event panel.add(new StyledLabel(trans.get("StageConfig.separation.lbl.title") + " " + CommonStrings.dagger, Style.BOLD), "spanx, wrap rel"); - - FlightConfiguration flConfig = stage.getRocket().getSelectedConfiguration(); - StageSeparationConfiguration sepConfig = stage.getSeparationConfigurations().get(flConfig.getId()); - // to ensure the configuration is distinct, and we're not modifying the default - if( sepConfig == stage.getSeparationConfigurations().getDefault() ){ - sepConfig = new StageSeparationConfiguration(); - stage.getSeparationConfigurations().set( flConfig.getId(), sepConfig ); - } + + StageSeparationConfiguration sepConfig = stage.getSeparationConfiguration(); JComboBox combo = new JComboBox( new EnumModel( sepConfig, "SeparationEvent", SeparationEvent.values()));