From e8a2fbf44975532de0a7e39c20fc462472358533 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Sat, 19 Feb 2022 01:37:08 +0100 Subject: [PATCH] [fixes #358] Move configListener's set-positions to front Moving it to the front ensures that the method doesn't exit before the listeners' methods are set (because of a return in the main component) + causes the fireComponentChangeEvent to be in the end --- .../rocketcomponent/BodyComponent.java | 10 +- .../openrocket/rocketcomponent/BodyTube.java | 68 ++++---- .../rocketcomponent/ComponentAssembly.java | 12 +- .../rocketcomponent/EllipticalFinSet.java | 22 +-- .../rocketcomponent/ExternalComponent.java | 10 +- .../sf/openrocket/rocketcomponent/FinSet.java | 139 +++++++-------- .../rocketcomponent/FreeformFinSet.java | 15 +- .../openrocket/rocketcomponent/InnerTube.java | 65 +++---- .../InsideColorComponentHandler.java | 20 +-- .../openrocket/rocketcomponent/LaunchLug.java | 62 +++---- .../rocketcomponent/MassComponent.java | 36 ++-- .../rocketcomponent/MassObject.java | 48 ++--- .../openrocket/rocketcomponent/Parachute.java | 60 +++---- .../rocketcomponent/ParallelStage.java | 60 +++---- .../sf/openrocket/rocketcomponent/PodSet.java | 52 +++--- .../rocketcomponent/RadiusRingComponent.java | 44 ++--- .../rocketcomponent/RailButton.java | 60 +++---- .../rocketcomponent/RecoveryDevice.java | 34 ++-- .../rocketcomponent/RingComponent.java | 69 ++++---- .../rocketcomponent/RocketComponent.java | 132 +++++++------- .../openrocket/rocketcomponent/ShockCord.java | 24 +-- .../sf/openrocket/rocketcomponent/Sleeve.java | 36 ++-- .../openrocket/rocketcomponent/Streamer.java | 52 +++--- .../rocketcomponent/StructuralComponent.java | 11 +- .../rocketcomponent/SymmetricComponent.java | 24 +-- .../ThicknessRingComponent.java | 30 ++-- .../rocketcomponent/Transition.java | 164 +++++++++--------- .../rocketcomponent/TrapezoidFinSet.java | 66 +++---- .../rocketcomponent/TubeFinSet.java | 90 +++++----- .../gui/configdialog/FinSetConfig.java | 5 +- 30 files changed, 769 insertions(+), 751 deletions(-) diff --git a/core/src/net/sf/openrocket/rocketcomponent/BodyComponent.java b/core/src/net/sf/openrocket/rocketcomponent/BodyComponent.java index e9712e133..4e0c7b1a4 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/BodyComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/BodyComponent.java @@ -65,16 +65,16 @@ public abstract class BodyComponent extends ExternalComponent { * clearPreset(). (BodyTube allows changing length without resetting the preset.) */ public void setLength(double length) { - if (this.length == length) - return; - this.length = Math.max(length, 0); - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof BodyComponent) { ((BodyComponent) listener).setLength(length); } } + + if (this.length == length) + return; + this.length = Math.max(length, 0); + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } @Override diff --git a/core/src/net/sf/openrocket/rocketcomponent/BodyTube.java b/core/src/net/sf/openrocket/rocketcomponent/BodyTube.java index 3dd2a420b..ee84e8014 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/BodyTube.java +++ b/core/src/net/sf/openrocket/rocketcomponent/BodyTube.java @@ -115,6 +115,12 @@ public class BodyTube extends SymmetricComponent implements BoxBounded, MotorMou */ @Override public void setOuterRadius(double radius) { + for (RocketComponent listener : configListeners) { + if (listener instanceof BodyTube) { + ((BodyTube) listener).setOuterRadius(radius); + } + } + if ((this.outerRadius == radius) && (autoRadius == false)) return; @@ -125,12 +131,6 @@ public class BodyTube extends SymmetricComponent implements BoxBounded, MotorMou this.thickness = this.outerRadius; fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); clearPreset(); - - for (RocketComponent listener : configListeners) { - if (listener instanceof BodyTube) { - ((BodyTube) listener).setOuterRadius(radius); - } - } } @@ -146,18 +146,18 @@ public class BodyTube extends SymmetricComponent implements BoxBounded, MotorMou * Sets whether the radius is selected automatically or not. */ public void setOuterRadiusAutomatic(boolean auto) { + for (RocketComponent listener : configListeners) { + if (listener instanceof BodyTube) { + ((BodyTube) listener).setOuterRadiusAutomatic(auto); + } + } + if (autoRadius == auto) return; autoRadius = auto; fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); clearPreset(); - - for (RocketComponent listener : configListeners) { - if (listener instanceof BodyTube) { - ((BodyTube) listener).setOuterRadiusAutomatic(auto); - } - } } @Override @@ -250,13 +250,13 @@ public class BodyTube extends SymmetricComponent implements BoxBounded, MotorMou @Override public void setInnerRadius(double r) { - setThickness(getOuterRadius() - r); - for (RocketComponent listener : configListeners) { if (listener instanceof BodyTube) { ((BodyTube) listener).setInnerRadius(r); } } + + setThickness(getOuterRadius() - r); } @@ -391,6 +391,16 @@ public class BodyTube extends SymmetricComponent implements BoxBounded, MotorMou @Override public void setMotorConfig(MotorConfiguration newMotorConfig, FlightConfigurationId fcid){ + for (RocketComponent listener : configListeners) { + if (listener instanceof BodyTube) { + if (newMotorConfig != null) { + BodyTube tube = (BodyTube) listener; + MotorConfiguration config = tube.getMotorConfig(fcid); + config.copyFrom(newMotorConfig); + } + } + } + if(null == newMotorConfig){ this.motors.set( fcid, null); }else{ @@ -402,16 +412,6 @@ public class BodyTube extends SymmetricComponent implements BoxBounded, MotorMou } this.isActingMount=true; - - for (RocketComponent listener : configListeners) { - if (listener instanceof BodyTube) { - if (newMotorConfig != null) { - BodyTube tube = (BodyTube) listener; - MotorConfiguration config = tube.getMotorConfig(fcid); - config.copyFrom(newMotorConfig); - } - } - } } @@ -432,16 +432,16 @@ public class BodyTube extends SymmetricComponent implements BoxBounded, MotorMou @Override public void setMotorMount(boolean _active){ - if (this.isActingMount == _active) - return; - this.isActingMount = _active; - fireComponentChangeEvent(ComponentChangeEvent.MOTOR_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof BodyTube) { ((BodyTube) listener).setMotorMount(_active); } } + + if (this.isActingMount == _active) + return; + this.isActingMount = _active; + fireComponentChangeEvent(ComponentChangeEvent.MOTOR_CHANGE); } @Override @@ -474,16 +474,16 @@ public class BodyTube extends SymmetricComponent implements BoxBounded, MotorMou @Override public void setMotorOverhang(double overhang) { - if (MathUtil.equals(this.overhang, overhang)) - return; - this.overhang = overhang; - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof BodyTube) { ((BodyTube) listener).setMotorOverhang(overhang); } } + + if (MathUtil.equals(this.overhang, overhang)) + return; + this.overhang = overhang; + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } diff --git a/core/src/net/sf/openrocket/rocketcomponent/ComponentAssembly.java b/core/src/net/sf/openrocket/rocketcomponent/ComponentAssembly.java index e70bd026e..ecdc0084c 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/ComponentAssembly.java +++ b/core/src/net/sf/openrocket/rocketcomponent/ComponentAssembly.java @@ -142,6 +142,12 @@ public abstract class ComponentAssembly extends RocketComponent implements Axial @Override public void setAxialMethod( final AxialMethod newMethod ) { + for (RocketComponent listener : configListeners) { + if (listener instanceof ComponentAssembly) { + ((ComponentAssembly) listener).setAxialMethod(newMethod); + } + } + if (null == this.parent) { throw new NullPointerException(" a Stage requires a parent before any positioning! "); } @@ -159,12 +165,6 @@ public abstract class ComponentAssembly extends RocketComponent implements Axial throw new BugException("Unrecognized subclass of Component Assembly. Please update this method."); } fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof ComponentAssembly) { - ((ComponentAssembly) listener).setAxialMethod(newMethod); - } - } } @Override diff --git a/core/src/net/sf/openrocket/rocketcomponent/EllipticalFinSet.java b/core/src/net/sf/openrocket/rocketcomponent/EllipticalFinSet.java index 2dcc9a4fc..cc4d54455 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/EllipticalFinSet.java +++ b/core/src/net/sf/openrocket/rocketcomponent/EllipticalFinSet.java @@ -60,31 +60,31 @@ public class EllipticalFinSet extends FinSet { } public void setHeight(double height) { - if (MathUtil.equals(this.height, height)) - return; - this.height = height; - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof EllipticalFinSet) { ((EllipticalFinSet) listener).setHeight(height); } } + + if (MathUtil.equals(this.height, height)) + return; + this.height = height; + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } public void setLength(double length) { - if (MathUtil.equals(this.length, length)) - return; - this.length = length; - validateFinTabLength(); - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof EllipticalFinSet) { ((EllipticalFinSet) listener).setLength(length); } } + + if (MathUtil.equals(this.length, length)) + return; + this.length = length; + validateFinTabLength(); + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } diff --git a/core/src/net/sf/openrocket/rocketcomponent/ExternalComponent.java b/core/src/net/sf/openrocket/rocketcomponent/ExternalComponent.java index 0e6741725..c97a04ce7 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/ExternalComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/ExternalComponent.java @@ -127,16 +127,16 @@ public abstract class ExternalComponent extends RocketComponent { } public void setFinish(Finish finish) { - if (this.finish == finish) - return; - this.finish = finish; - fireComponentChangeEvent(ComponentChangeEvent.AERODYNAMIC_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof ExternalComponent) { ((ExternalComponent) listener).setFinish(finish); } } + + if (this.finish == finish) + return; + this.finish = finish; + fireComponentChangeEvent(ComponentChangeEvent.AERODYNAMIC_CHANGE); } diff --git a/core/src/net/sf/openrocket/rocketcomponent/FinSet.java b/core/src/net/sf/openrocket/rocketcomponent/FinSet.java index be6018edd..a44fd13f7 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/FinSet.java +++ b/core/src/net/sf/openrocket/rocketcomponent/FinSet.java @@ -152,6 +152,12 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona * @param n The number of fins, greater of equal to one. */ public void setFinCount(int n) { + for (RocketComponent listener : configListeners) { + if (listener instanceof FinSet) { + ((FinSet) listener).setFinCount(n); + } + } + if (finCount == n) return; if (n < 1) @@ -163,12 +169,6 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona finRotationIncrement = Transformation.rotate_x(2 * Math.PI / finCount); fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof FinSet) { - ((FinSet) listener).setFinCount(n); - } - } } public Transformation getFinRotationTransformation() { @@ -193,13 +193,13 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona * @param r The base rotation in radians */ public void setBaseRotation(double r) { - setAngleOffset(r); - for (RocketComponent listener : configListeners) { if (listener instanceof FinSet) { ((FinSet) listener).setBaseRotation(r); } } + + setAngleOffset(r); } /** @@ -214,18 +214,18 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona * @param newCantRadians -- new cant angle, in radians */ public void setCantAngle(final double newCantRadians) { + for (RocketComponent listener : configListeners) { + if (listener instanceof FinSet) { + ((FinSet) listener).setCantAngle(newCantRadians); + } + } + final double clampedCant = MathUtil.clamp(newCantRadians, -MAX_CANT_RADIANS, MAX_CANT_RADIANS); if (MathUtil.equals(clampedCant, this.cantRadians)) return; this.cantRadians = clampedCant; fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof FinSet) { - ((FinSet) listener).setCantAngle(newCantRadians); - } - } } public Transformation getCantRotation() { @@ -244,16 +244,16 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona } public void setThickness(double r) { - if (thickness == r) - return; - thickness = Math.max(r, 0); - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof FinSet) { ((FinSet) listener).setThickness(r); } } + + if (thickness == r) + return; + thickness = Math.max(r, 0); + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } @@ -262,16 +262,16 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona } public void setCrossSection(CrossSection cs) { - if (crossSection == cs) - return; - crossSection = cs; - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof FinSet) { ((FinSet) listener).setCrossSection(cs); } } + + if (crossSection == cs) + return; + crossSection = cs; + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } public double getTabHeight() { @@ -295,6 +295,12 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona * */ public void setTabHeight(final double newTabHeight) { + for (RocketComponent listener : configListeners) { + if (listener instanceof FinSet) { + ((FinSet) listener).setTabHeight(newTabHeight); + } + } + if (MathUtil.equals(this.tabHeight, MathUtil.max(newTabHeight, 0))){ return; } @@ -302,12 +308,6 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona tabHeight = newTabHeight; validateFinTabHeight(); fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof FinSet) { - ((FinSet) listener).setTabHeight(newTabHeight); - } - } } @@ -319,6 +319,12 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona * set tab length */ public void setTabLength(final double lengthRequest) { + for (RocketComponent listener : configListeners) { + if (listener instanceof FinSet) { + ((FinSet) listener).setTabLength(lengthRequest); + } + } + if (MathUtil.equals(tabLength, MathUtil.max(lengthRequest, 0))) { return; } @@ -328,12 +334,6 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona updateTabPosition(); fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof FinSet) { - ((FinSet) listener).setTabLength(lengthRequest); - } - } } public void updateTabPosition(){ @@ -346,16 +346,16 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona * @param offsetRequest new requested tab offset */ public void setTabOffset( final double offsetRequest) { - tabOffset = offsetRequest; - updateTabPosition(); - - fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof FinSet) { ((FinSet) listener).setTabOffset(offsetRequest); } } + + tabOffset = offsetRequest; + updateTabPosition(); + + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } public AxialMethod getTabOffsetMethod() { @@ -367,16 +367,16 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona * it is merely a lens through which other modules may view the tab's position. */ public void setTabOffsetMethod(final AxialMethod newPositionMethod) { - this.tabOffsetMethod = newPositionMethod; - this.tabOffset = this.tabOffsetMethod.getAsOffset(tabPosition, tabLength, length); - - fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof FinSet) { ((FinSet) listener).setTabOffsetMethod(newPositionMethod); } } + + this.tabOffsetMethod = newPositionMethod; + this.tabOffset = this.tabOffsetMethod.getAsOffset(tabPosition, tabLength, length); + + fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); } /** @@ -1016,6 +1016,12 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona @Override public void setAngleOffset(final double angleRadians) { + for (RocketComponent listener : configListeners) { + if (listener instanceof FinSet) { + ((FinSet) listener).setAngleOffset(angleRadians); + } + } + final double reducedAngle = MathUtil.reducePi(angleRadians); if (MathUtil.equals(reducedAngle, firstFinOffsetRadians)) return; @@ -1028,12 +1034,6 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona } fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof FinSet) { - ((FinSet) listener).setAngleOffset(angleRadians); - } - } } @Override @@ -1060,15 +1060,15 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona @Override public void setAngleMethod(AngleMethod newAngleMethod ) { - mutex.verify(); - this.angleMethod = newAngleMethod; - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof FinSet) { ((FinSet) listener).setAngleMethod(newAngleMethod); } } + + mutex.verify(); + this.angleMethod = newAngleMethod; + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } @Override @@ -1094,12 +1094,13 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona @Override public void setInstanceCount(int newCount) { - setFinCount(newCount); for (RocketComponent listener : configListeners) { if (listener instanceof FinSet) { ((FinSet) listener).setInstanceCount(newCount); } } + + setFinCount(newCount); } @Override @@ -1146,6 +1147,12 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona } public void setFilletMaterial(Material mat) { + for (RocketComponent listener : configListeners) { + if (listener instanceof FinSet) { + ((FinSet) listener).setFilletMaterial(mat); + } + } + if (mat.getType() != Material.Type.BULK) { throw new IllegalArgumentException("ExternalComponent requires a bulk material" + " type=" + mat.getType()); @@ -1156,12 +1163,6 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona filletMaterial = mat; clearPreset(); fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof FinSet) { - ((FinSet) listener).setFilletMaterial(mat); - } - } } public double getFilletRadius() { @@ -1169,17 +1170,17 @@ public abstract class FinSet extends ExternalComponent implements AxialPositiona } public void setFilletRadius(double r) { - if (MathUtil.equals(filletRadius, r)) - return; - filletRadius = r; - clearPreset(); - fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof FinSet) { ((FinSet) listener).setFilletRadius(r); } } + + if (MathUtil.equals(filletRadius, r)) + return; + filletRadius = r; + clearPreset(); + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } /** diff --git a/core/src/net/sf/openrocket/rocketcomponent/FreeformFinSet.java b/core/src/net/sf/openrocket/rocketcomponent/FreeformFinSet.java index 81512ca8b..284f70550 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/FreeformFinSet.java +++ b/core/src/net/sf/openrocket/rocketcomponent/FreeformFinSet.java @@ -152,13 +152,13 @@ public class FreeformFinSet extends FinSet { /** maintained just for backwards compatibility: */ public void setPoints(Coordinate[] newPoints) { - setPoints(new ArrayList<>(Arrays.asList(newPoints))); - for (RocketComponent listener : configListeners) { if (listener instanceof FreeformFinSet) { ((FreeformFinSet) listener).setPoints(newPoints); } } + + setPoints(new ArrayList<>(Arrays.asList(newPoints))); } /** @@ -167,6 +167,11 @@ public class FreeformFinSet extends FinSet { * @param newPoints New points to set as the exposed edges of the fin */ public void setPoints( ArrayList newPoints) { + for (RocketComponent listener : configListeners) { + if (listener instanceof FreeformFinSet) { + ((FreeformFinSet) listener).setPoints(newPoints); + } + } final Coordinate delta = newPoints.get(0).multiply(-1); if( IGNORE_SMALLER_THAN < delta.length2()){ @@ -198,12 +203,6 @@ public class FreeformFinSet extends FinSet { } fireComponentChangeEvent(ComponentChangeEvent.AEROMASS_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof FreeformFinSet) { - ((FreeformFinSet) listener).setPoints(newPoints); - } - } } /** diff --git a/core/src/net/sf/openrocket/rocketcomponent/InnerTube.java b/core/src/net/sf/openrocket/rocketcomponent/InnerTube.java index 889b93526..a1935c0cf 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/InnerTube.java +++ b/core/src/net/sf/openrocket/rocketcomponent/InnerTube.java @@ -130,6 +130,12 @@ public class InnerTube extends ThicknessRingComponent implements AxialPositionab */ @Override public void setClusterConfiguration( final ClusterConfiguration cluster) { + for (RocketComponent listener : configListeners) { + if (listener instanceof InnerTube) { + ((InnerTube) listener).setClusterConfiguration(cluster); + } + } + if( cluster == this.cluster){ // no change return; @@ -137,12 +143,6 @@ public class InnerTube extends ThicknessRingComponent implements AxialPositionab this.cluster = cluster; fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } - - for (RocketComponent listener : configListeners) { - if (listener instanceof InnerTube) { - ((InnerTube) listener).setClusterConfiguration(cluster); - } - } } public BoundingBox getInstanceBoundingBox(){ @@ -189,16 +189,17 @@ public class InnerTube extends ThicknessRingComponent implements AxialPositionab */ public void setClusterScale(double scale) { scale = Math.max(scale, 0); - if (MathUtil.equals(clusterScale, scale)) - return; - clusterScale = scale; - fireComponentChangeEvent(new ComponentChangeEvent(this, ComponentChangeEvent.MASS_CHANGE)); for (RocketComponent listener : configListeners) { if (listener instanceof InnerTube) { ((InnerTube) listener).setClusterScale(scale); } } + + if (MathUtil.equals(clusterScale, scale)) + return; + clusterScale = scale; + fireComponentChangeEvent(new ComponentChangeEvent(this, ComponentChangeEvent.MASS_CHANGE)); } @@ -215,17 +216,17 @@ public class InnerTube extends ThicknessRingComponent implements AxialPositionab * @param rotation the clusterRotation to set */ public void setClusterRotation(double rotation) { - rotation = MathUtil.reducePi(rotation); - if (clusterRotation == rotation) - return; - this.clusterRotation = rotation; - fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof InnerTube) { ((InnerTube) listener).setClusterRotation(rotation); } } + + rotation = MathUtil.reducePi(rotation); + if (clusterRotation == rotation) + return; + this.clusterRotation = rotation; + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } @@ -304,6 +305,12 @@ public class InnerTube extends ThicknessRingComponent implements AxialPositionab @Override public void setMotorConfig( final MotorConfiguration newMotorConfig, final FlightConfigurationId fcid){ + for (RocketComponent listener : configListeners) { + if (listener instanceof InnerTube) { + ((InnerTube) listener).setMotorConfig(newMotorConfig, fcid); + } + } + if((null == newMotorConfig)){ this.motors.set( fcid, null); }else{ @@ -315,12 +322,6 @@ public class InnerTube extends ThicknessRingComponent implements AxialPositionab } this.isActingMount = true; - - for (RocketComponent listener : configListeners) { - if (listener instanceof InnerTube) { - ((InnerTube) listener).setMotorConfig(newMotorConfig, fcid); - } - } } @Override @@ -340,16 +341,16 @@ public class InnerTube extends ThicknessRingComponent implements AxialPositionab @Override public void setMotorMount(boolean _active){ - if (this.isActingMount == _active) - return; - this.isActingMount = _active; - fireComponentChangeEvent(ComponentChangeEvent.MOTOR_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof InnerTube) { ((InnerTube) listener).setMotorMount(_active); } } + + if (this.isActingMount == _active) + return; + this.isActingMount = _active; + fireComponentChangeEvent(ComponentChangeEvent.MOTOR_CHANGE); } @Override @@ -381,16 +382,16 @@ public class InnerTube extends ThicknessRingComponent implements AxialPositionab @Override public void setMotorOverhang(double overhang) { - if (MathUtil.equals(this.overhang, overhang)) - return; - this.overhang = overhang; - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof InnerTube) { ((InnerTube) listener).setMotorOverhang(overhang); } } + + if (MathUtil.equals(this.overhang, overhang)) + return; + this.overhang = overhang; + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } @Override diff --git a/core/src/net/sf/openrocket/rocketcomponent/InsideColorComponentHandler.java b/core/src/net/sf/openrocket/rocketcomponent/InsideColorComponentHandler.java index 19d5705dd..6feeb48b7 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/InsideColorComponentHandler.java +++ b/core/src/net/sf/openrocket/rocketcomponent/InsideColorComponentHandler.java @@ -38,6 +38,12 @@ public class InsideColorComponentHandler { * @param appearance the inner appearance to be set */ public void setInsideAppearance(Appearance appearance) { + for (RocketComponent listener : component.configListeners) { + if (listener instanceof InsideColorComponent) { + ((InsideColorComponent) listener).getInsideColorComponentHandler().setInsideAppearance(appearance); + } + } + this.insideAppearance = appearance; if (this.insideAppearance != null) { Decal d = this.insideAppearance.getTexture(); @@ -53,12 +59,6 @@ public class InsideColorComponentHandler { } } component.fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); - - for (RocketComponent listener : component.configListeners) { - if (listener instanceof InsideColorComponent) { - ((InsideColorComponent) listener).getInsideColorComponentHandler().setInsideAppearance(appearance); - } - } } /** @@ -78,13 +78,13 @@ public class InsideColorComponentHandler { * @param newState new edgesUseInsideAppearance value */ public void setEdgesSameAsInside(boolean newState) { - this.edgesSameAsInside = newState; - for (RocketComponent listener : component.configListeners) { if (listener instanceof InsideColorComponent) { ((InsideColorComponent) listener).getInsideColorComponentHandler().setEdgesSameAsInside(newState); } } + + this.edgesSameAsInside = newState; } /** @@ -103,13 +103,13 @@ public class InsideColorComponentHandler { * @param newState new separateInsideOutside value */ public void setSeparateInsideOutside(boolean newState) { - this.separateInsideOutside = newState; - for (RocketComponent listener : component.configListeners) { if (listener instanceof InsideColorComponent) { ((InsideColorComponent) listener).getInsideColorComponentHandler().setSeparateInsideOutside(newState); } } + + this.separateInsideOutside = newState; } public void copyFrom(InsideColorComponentHandler src) { diff --git a/core/src/net/sf/openrocket/rocketcomponent/LaunchLug.java b/core/src/net/sf/openrocket/rocketcomponent/LaunchLug.java index c314a3566..9541bb0cd 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/LaunchLug.java +++ b/core/src/net/sf/openrocket/rocketcomponent/LaunchLug.java @@ -49,18 +49,18 @@ public class LaunchLug extends ExternalComponent implements AnglePositionable, B @Override public void setOuterRadius(double radius) { + for (RocketComponent listener : configListeners) { + if (listener instanceof LaunchLug) { + ((LaunchLug) listener).setOuterRadius(radius); + } + } + if (MathUtil.equals(this.radius, radius)) return; this.radius = radius; this.thickness = Math.min(this.thickness, this.radius); clearPreset(); fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof LaunchLug) { - ((LaunchLug) listener).setOuterRadius(radius); - } - } } @Override @@ -70,13 +70,13 @@ public class LaunchLug extends ExternalComponent implements AnglePositionable, B @Override public void setInnerRadius(double innerRadius) { - setOuterRadius(innerRadius + thickness); - for (RocketComponent listener : configListeners) { if (listener instanceof LaunchLug) { ((LaunchLug) listener).setInnerRadius(innerRadius); } } + + setOuterRadius(innerRadius + thickness); } @Override @@ -85,17 +85,17 @@ public class LaunchLug extends ExternalComponent implements AnglePositionable, B } public void setThickness(double thickness) { - if (MathUtil.equals(this.thickness, thickness)) - return; - this.thickness = MathUtil.clamp(thickness, 0, radius); - clearPreset(); - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof LaunchLug) { ((LaunchLug) listener).setThickness(thickness); } } + + if (MathUtil.equals(this.thickness, thickness)) + return; + this.thickness = MathUtil.clamp(thickness, 0, radius); + clearPreset(); + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } @Override @@ -105,30 +105,30 @@ public class LaunchLug extends ExternalComponent implements AnglePositionable, B @Override public void setAngleOffset(double newAngleRadians) { - double clamped_rad = MathUtil.clamp( newAngleRadians, -Math.PI, Math.PI); - if (MathUtil.equals(this.angleOffsetRadians, clamped_rad)) - return; - this.angleOffsetRadians = clamped_rad; - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof LaunchLug) { ((LaunchLug) listener).setAngleOffset(newAngleRadians); } } + + double clamped_rad = MathUtil.clamp( newAngleRadians, -Math.PI, Math.PI); + if (MathUtil.equals(this.angleOffsetRadians, clamped_rad)) + return; + this.angleOffsetRadians = clamped_rad; + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } public void setLength(double length) { - if (MathUtil.equals(this.length, length)) - return; - this.length = length; - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof LaunchLug) { ((LaunchLug) listener).setLength(length); } } + + if (MathUtil.equals(this.length, length)) + return; + this.length = length; + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } @Override @@ -272,26 +272,26 @@ public class LaunchLug extends ExternalComponent implements AnglePositionable, B @Override public void setInstanceSeparation(final double _separation){ - this.instanceSeparation = _separation; - for (RocketComponent listener : configListeners) { if (listener instanceof LaunchLug) { ((LaunchLug) listener).setInstanceSeparation(_separation); } } + + this.instanceSeparation = _separation; } @Override public void setInstanceCount( final int newCount ){ - if( 0 < newCount ){ - this.instanceCount = newCount; - } - for (RocketComponent listener : configListeners) { if (listener instanceof LaunchLug) { ((LaunchLug) listener).setInstanceCount(newCount); } } + + if( 0 < newCount ){ + this.instanceCount = newCount; + } } @Override diff --git a/core/src/net/sf/openrocket/rocketcomponent/MassComponent.java b/core/src/net/sf/openrocket/rocketcomponent/MassComponent.java index 4c8e2accc..8ec3174ee 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/MassComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/MassComponent.java @@ -59,17 +59,17 @@ public class MassComponent extends MassObject { } public void setComponentMass(double mass) { - mass = Math.max(mass, 0); - if (MathUtil.equals(this.mass, mass)) - return; - this.mass = mass; - fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof MassComponent) { ((MassComponent) listener).setComponentMass(mass); } } + + mass = Math.max(mass, 0); + if (MathUtil.equals(this.mass, mass)) + return; + this.mass = mass; + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } @@ -81,17 +81,17 @@ public class MassComponent extends MassObject { } public void setDensity(double density) { - double m = density * getVolume(); - m = MathUtil.clamp(m, 0, 1000000); - if (Double.isNaN(m)) - m = 0; - setComponentMass(m); - for (RocketComponent listener : configListeners) { if (listener instanceof MassComponent) { ((MassComponent) listener).setDensity(density); } } + + double m = density * getVolume(); + m = MathUtil.clamp(m, 0, 1000000); + if (Double.isNaN(m)) + m = 0; + setComponentMass(m); } @@ -112,6 +112,12 @@ public class MassComponent extends MassObject { } public void setMassComponentType(MassComponent.MassComponentType compType) { + for (RocketComponent listener : configListeners) { + if (listener instanceof MassComponent) { + ((MassComponent) listener).setMassComponentType(compType); + } + } + mutex.verify(); if (this.massComponentType == compType) { return; @@ -119,12 +125,6 @@ public class MassComponent extends MassObject { checkState(); this.massComponentType = compType; fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof MassComponent) { - ((MassComponent) listener).setMassComponentType(compType); - } - } } @Override diff --git a/core/src/net/sf/openrocket/rocketcomponent/MassObject.java b/core/src/net/sf/openrocket/rocketcomponent/MassObject.java index 6830af80a..125d59279 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/MassObject.java +++ b/core/src/net/sf/openrocket/rocketcomponent/MassObject.java @@ -51,18 +51,18 @@ public abstract class MassObject extends InternalComponent { public void setLength(double length) { + for (RocketComponent listener : configListeners) { + if (listener instanceof MassObject) { + ((MassObject) listener).setLength(length); + } + } + length = Math.max(length, 0); if (MathUtil.equals(this.length, length)) { return; } this.length = length; fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof MassObject) { - ((MassObject) listener).setLength(length); - } - } } @@ -73,17 +73,18 @@ public abstract class MassObject extends InternalComponent { public final void setRadius(double radius) { radius = Math.max(radius, 0); - if (MathUtil.equals(this.radius, radius)) { - return; - } - this.radius = radius; - fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); for (RocketComponent listener : configListeners) { if (listener instanceof MassObject) { ((MassObject) listener).setRadius(radius); } } + + if (MathUtil.equals(this.radius, radius)) { + return; + } + this.radius = radius; + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } @@ -94,6 +95,13 @@ public abstract class MassObject extends InternalComponent { public final void setRadialPosition(double radialPosition) { radialPosition = Math.max(radialPosition, 0); + + for (RocketComponent listener : configListeners) { + if (listener instanceof MassObject) { + ((MassObject) listener).setRadialPosition(radialPosition); + } + } + if (MathUtil.equals(this.radialPosition, radialPosition)) { return; } @@ -101,12 +109,6 @@ public abstract class MassObject extends InternalComponent { shiftY = radialPosition * Math.cos(radialDirection); shiftZ = radialPosition * Math.sin(radialDirection); fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof MassObject) { - ((MassObject) listener).setRadialPosition(radialPosition); - } - } } public final double getRadialDirection() { @@ -114,6 +116,12 @@ public abstract class MassObject extends InternalComponent { } public final void setRadialDirection(double radialDirection) { + for (RocketComponent listener : configListeners) { + if (listener instanceof MassObject) { + ((MassObject) listener).setRadialDirection(radialDirection); + } + } + radialDirection = MathUtil.reducePi(radialDirection); if (MathUtil.equals(this.radialDirection, radialDirection)) { return; @@ -122,12 +130,6 @@ public abstract class MassObject extends InternalComponent { shiftY = radialPosition * Math.cos(radialDirection); shiftZ = radialPosition * Math.sin(radialDirection); fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof MassObject) { - ((MassObject) listener).setRadialDirection(radialDirection); - } - } } diff --git a/core/src/net/sf/openrocket/rocketcomponent/Parachute.java b/core/src/net/sf/openrocket/rocketcomponent/Parachute.java index a371fb863..55d634be7 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/Parachute.java +++ b/core/src/net/sf/openrocket/rocketcomponent/Parachute.java @@ -33,17 +33,17 @@ public class Parachute extends RecoveryDevice { } public void setDiameter(double d) { - if (MathUtil.equals(this.diameter, d)) - return; - this.diameter = d; - clearPreset(); - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof Parachute) { ((Parachute) listener).setDiameter(d); } } + + if (MathUtil.equals(this.diameter, d)) + return; + this.diameter = d; + clearPreset(); + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } @@ -52,6 +52,12 @@ public class Parachute extends RecoveryDevice { } public final void setLineMaterial(Material mat) { + for (RocketComponent listener : configListeners) { + if (listener instanceof Parachute) { + ((Parachute) listener).setLineMaterial(mat); + } + } + if (mat.getType() != Material.Type.LINE) { throw new IllegalArgumentException("Attempted to set non-line material " + mat); } @@ -62,12 +68,6 @@ public class Parachute extends RecoveryDevice { fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); else fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof Parachute) { - ((Parachute) listener).setLineMaterial(mat); - } - } } @@ -76,17 +76,17 @@ public class Parachute extends RecoveryDevice { } public final void setLineCount(int n) { - if (this.lineCount == n) - return; - this.lineCount = n; - clearPreset(); - fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof Parachute) { ((Parachute) listener).setLineCount(n); } } + + if (this.lineCount == n) + return; + this.lineCount = n; + clearPreset(); + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } public final double getLineLength() { @@ -94,6 +94,12 @@ public class Parachute extends RecoveryDevice { } public final void setLineLength(double length) { + for (RocketComponent listener : configListeners) { + if (listener instanceof Parachute) { + ((Parachute) listener).setLineLength(length); + } + } + if (MathUtil.equals(this.lineLength, length)) return; this.lineLength = length; @@ -101,12 +107,6 @@ public class Parachute extends RecoveryDevice { fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); else fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof Parachute) { - ((Parachute) listener).setLineLength(length); - } - } } @@ -121,17 +121,17 @@ public class Parachute extends RecoveryDevice { } public void setArea(double area) { - if (MathUtil.equals(getArea(), area)) - return; - diameter = MathUtil.safeSqrt(area / Math.PI) * 2; - clearPreset(); - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof Parachute) { ((Parachute) listener).setArea(area); } } + + if (MathUtil.equals(getArea(), area)) + return; + diameter = MathUtil.safeSqrt(area / Math.PI) * 2; + clearPreset(); + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } @Override diff --git a/core/src/net/sf/openrocket/rocketcomponent/ParallelStage.java b/core/src/net/sf/openrocket/rocketcomponent/ParallelStage.java index 3da070d34..eab90c87f 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/ParallelStage.java +++ b/core/src/net/sf/openrocket/rocketcomponent/ParallelStage.java @@ -117,6 +117,12 @@ public class ParallelStage extends AxialStage implements FlightConfigurableCompo @Override public void setInstanceCount( final int newCount ){ + for (RocketComponent listener : configListeners) { + if (listener instanceof ParallelStage) { + ((ParallelStage) listener).setInstanceCount(newCount); + } + } + mutex.verify(); if ( newCount < 1) { // there must be at least one instance.... @@ -126,12 +132,6 @@ public class ParallelStage extends AxialStage implements FlightConfigurableCompo this.instanceCount = newCount; this.angleSeparation = Math.PI * 2 / this.instanceCount; fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof ParallelStage) { - ((ParallelStage) listener).setInstanceCount(newCount); - } - } } @Override @@ -181,6 +181,12 @@ public class ParallelStage extends AxialStage implements FlightConfigurableCompo @Override public void setAxialMethod(final AxialMethod _newPosition) { + for (RocketComponent listener : configListeners) { + if (listener instanceof ParallelStage) { + ((ParallelStage) listener).setAxialMethod(_newPosition); + } + } + if (null == this.parent) { throw new NullPointerException(" a Stage requires a parent before any positioning! "); } @@ -188,40 +194,40 @@ public class ParallelStage extends AxialStage implements FlightConfigurableCompo super.setAxialMethod(_newPosition); fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof ParallelStage) { - ((ParallelStage) listener).setAxialMethod(_newPosition); - } - } } @Override public void setRadiusOffset(final double radius_m) { - setRadius( radiusMethod, radius_m ); - for (RocketComponent listener : configListeners) { if (listener instanceof ParallelStage) { ((ParallelStage) listener).setRadiusOffset(radius_m); } } + + setRadius( radiusMethod, radius_m ); } @Override public void setAngleOffset(final double angle_rad) { - mutex.verify(); - this.angleOffset_rad = MathUtil.reducePi( angle_rad); - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof ParallelStage) { ((ParallelStage) listener).setAngleOffset(angle_rad); } } + + mutex.verify(); + this.angleOffset_rad = MathUtil.reducePi( angle_rad); + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } @Override public void setRadius(RadiusMethod requestedMethod, double requestedRadius ) { + for (RocketComponent listener : configListeners) { + if (listener instanceof ParallelStage) { + ((ParallelStage) listener).setRadius(requestedMethod, requestedRadius); + } + } + mutex.verify(); RadiusMethod newMethod = requestedMethod; @@ -235,12 +241,6 @@ public class ParallelStage extends AxialStage implements FlightConfigurableCompo this.radiusOffset_m = newRadius; fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof ParallelStage) { - ((ParallelStage) listener).setRadius(requestedMethod, requestedRadius); - } - } } @Override @@ -250,15 +250,15 @@ public class ParallelStage extends AxialStage implements FlightConfigurableCompo @Override public void setAngleMethod(AngleMethod newAngleMethod ) { - mutex.verify(); - this.angleMethod = newAngleMethod; - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof ParallelStage) { ((ParallelStage) listener).setAngleMethod(newAngleMethod); } } + + mutex.verify(); + this.angleMethod = newAngleMethod; + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } @Override @@ -268,13 +268,13 @@ public class ParallelStage extends AxialStage implements FlightConfigurableCompo @Override public void setRadiusMethod(RadiusMethod newRadiusMethod) { - setRadius( newRadiusMethod, this.radiusOffset_m ); - for (RocketComponent listener : configListeners) { if (listener instanceof ParallelStage) { ((ParallelStage) listener).setRadiusMethod(newRadiusMethod); } } + + setRadius( newRadiusMethod, this.radiusOffset_m ); } diff --git a/core/src/net/sf/openrocket/rocketcomponent/PodSet.java b/core/src/net/sf/openrocket/rocketcomponent/PodSet.java index daf93b421..16aac04eb 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/PodSet.java +++ b/core/src/net/sf/openrocket/rocketcomponent/PodSet.java @@ -163,6 +163,12 @@ public class PodSet extends ComponentAssembly implements RingInstanceable { @Override public void setInstanceCount(int newCount ){ + for (RocketComponent listener : configListeners) { + if (listener instanceof PodSet) { + ((PodSet) listener).setInstanceCount(newCount); + } + } + mutex.verify(); if ( newCount < 1) { // there must be at least one instance.... @@ -172,12 +178,6 @@ public class PodSet extends ComponentAssembly implements RingInstanceable { this.instanceCount = newCount; this.angleSeparation = Math.PI * 2 / this.instanceCount; fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof PodSet) { - ((PodSet) listener).setInstanceCount(newCount); - } - } } @Override @@ -196,15 +196,15 @@ public class PodSet extends ComponentAssembly implements RingInstanceable { @Override public void setAngleOffset(double angle_rad) { - mutex.verify(); - this.angleOffset_rad = angle_rad; - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof PodSet) { ((PodSet) listener).setAngleOffset(angle_rad); } } + + mutex.verify(); + this.angleOffset_rad = angle_rad; + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } @Override @@ -218,6 +218,12 @@ public class PodSet extends ComponentAssembly implements RingInstanceable { @Override public void setRadiusOffset(double radius_m) { + for (RocketComponent listener : configListeners) { + if (listener instanceof PodSet) { + ((PodSet) listener).setRadiusOffset(radius_m); + } + } + mutex.verify(); if( this.radiusMethod.clampToZero() ) { this.radiusOffset_m = 0.0; @@ -225,12 +231,6 @@ public class PodSet extends ComponentAssembly implements RingInstanceable { this.radiusOffset_m = radius_m; } fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof PodSet) { - ((PodSet) listener).setRadiusOffset(radius_m); - } - } } @Override @@ -240,19 +240,25 @@ public class PodSet extends ComponentAssembly implements RingInstanceable { @Override public void setRadiusMethod(RadiusMethod newMethod ) { - mutex.verify(); - this.radiusMethod = newMethod; - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof PodSet) { ((PodSet) listener).setRadiusMethod(newMethod); } } + + mutex.verify(); + this.radiusMethod = newMethod; + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } @Override public void setRadius(RadiusMethod requestMethod, double requestRadius ) { + for (RocketComponent listener : configListeners) { + if (listener instanceof PodSet) { + ((PodSet) listener).setRadius(requestMethod, requestRadius); + } + } + mutex.verify(); RadiusMethod newMethod = requestMethod; @@ -265,12 +271,6 @@ public class PodSet extends ComponentAssembly implements RingInstanceable { this.radiusMethod = newMethod; this.radiusOffset_m = newRadius; fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof PodSet) { - ((PodSet) listener).setRadius(requestMethod, requestRadius); - } - } } } diff --git a/core/src/net/sf/openrocket/rocketcomponent/RadiusRingComponent.java b/core/src/net/sf/openrocket/rocketcomponent/RadiusRingComponent.java index 5c81026d0..75b58b3a9 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/RadiusRingComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/RadiusRingComponent.java @@ -51,6 +51,13 @@ public abstract class RadiusRingComponent extends RingComponent implements Coaxi @Override public void setOuterRadius(double r) { r = Math.max(r,0); + + for (RocketComponent listener : configListeners) { + if (listener instanceof RadiusRingComponent) { + ((RadiusRingComponent) listener).setOuterRadius(r); + } + } + if (MathUtil.equals(outerRadius, r) && !isOuterRadiusAutomatic()) return; @@ -63,12 +70,6 @@ public abstract class RadiusRingComponent extends RingComponent implements Coaxi clearPreset(); fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof RadiusRingComponent) { - ((RadiusRingComponent) listener).setOuterRadius(r); - } - } } @@ -79,6 +80,13 @@ public abstract class RadiusRingComponent extends RingComponent implements Coaxi @Override public void setInnerRadius(double r) { r = Math.max(r,0); + + for (RocketComponent listener : configListeners) { + if (listener instanceof RadiusRingComponent) { + ((RadiusRingComponent) listener).setInnerRadius(r); + } + } + if (MathUtil.equals(innerRadius, r)) return; @@ -91,12 +99,6 @@ public abstract class RadiusRingComponent extends RingComponent implements Coaxi clearPreset(); fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof RadiusRingComponent) { - ((RadiusRingComponent) listener).setInnerRadius(r); - } - } } @@ -106,16 +108,16 @@ public abstract class RadiusRingComponent extends RingComponent implements Coaxi } @Override public void setThickness(double thickness) { - double outer = getOuterRadius(); - - thickness = MathUtil.clamp(thickness, 0, outer); - setInnerRadius(outer - thickness); - for (RocketComponent listener : configListeners) { if (listener instanceof RadiusRingComponent) { ((RadiusRingComponent) listener).setThickness(thickness); } } + + double outer = getOuterRadius(); + + thickness = MathUtil.clamp(thickness, 0, outer); + setInnerRadius(outer - thickness); } @@ -137,15 +139,15 @@ public abstract class RadiusRingComponent extends RingComponent implements Coaxi @Override public void setInstanceCount( final int newCount ){ - if( 0 < newCount ){ - this.instanceCount = newCount; - } - for (RocketComponent listener : configListeners) { if (listener instanceof RadiusRingComponent) { ((RadiusRingComponent) listener).setInstanceCount(newCount); } } + + if( 0 < newCount ){ + this.instanceCount = newCount; + } } @Override diff --git a/core/src/net/sf/openrocket/rocketcomponent/RailButton.java b/core/src/net/sf/openrocket/rocketcomponent/RailButton.java index 311c76aed..9e1e96cac 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/RailButton.java +++ b/core/src/net/sf/openrocket/rocketcomponent/RailButton.java @@ -152,60 +152,60 @@ public class RailButton extends ExternalComponent implements AnglePositionable, public void setStandoff(double newStandoff){ - this.standoff_m = Math.max( newStandoff, RailButton.MINIMUM_STANDOFF ); - for (RocketComponent listener : configListeners) { if (listener instanceof RailButton) { ((RailButton) listener).setStandoff(newStandoff); } } + + this.standoff_m = Math.max( newStandoff, RailButton.MINIMUM_STANDOFF ); } public void setInnerDiameter(double newID ){ - this.innerDiameter_m = newID; - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof RailButton) { ((RailButton) listener).setInnerDiameter(newID); } } + + this.innerDiameter_m = newID; + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } public void setOuterDiameter(double newOD ){ - this.outerDiameter_m = newOD; - - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof RailButton) { ((RailButton) listener).setOuterDiameter(newOD); } } + + this.outerDiameter_m = newOD; + + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } public void setTotalHeight(double newHeight ) { - this.totalHeight_m = newHeight; - - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof RailButton) { ((RailButton) listener).setTotalHeight(newHeight); } } + + this.totalHeight_m = newHeight; + + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } public void setThickness(double newThickness ) { - this.flangeHeight_m = newThickness; - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof RailButton) { ((RailButton) listener).setThickness(newThickness); } } + + this.flangeHeight_m = newThickness; + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } @Override @@ -232,18 +232,18 @@ public class RailButton extends ExternalComponent implements AnglePositionable, @Override public void setAngleOffset(double angle_rad){ + for (RocketComponent listener : configListeners) { + if (listener instanceof RailButton) { + ((RailButton) listener).setAngleOffset(angle_rad); + } + } + double clamped_rad = MathUtil.clamp(angle_rad, -Math.PI, Math.PI); if (MathUtil.equals(this.angle_rad, clamped_rad)) return; this.angle_rad = clamped_rad; fireComponentChangeEvent(ComponentChangeEvent.AERODYNAMIC_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof RailButton) { - ((RailButton) listener).setAngleOffset(angle_rad); - } - } } @@ -319,28 +319,28 @@ public class RailButton extends ExternalComponent implements AnglePositionable, @Override public void setInstanceSeparation(double _separation){ - this.instanceSeparation = _separation; - fireComponentChangeEvent(ComponentChangeEvent.AERODYNAMIC_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof RailButton) { ((RailButton) listener).setInstanceSeparation(_separation); } } + + this.instanceSeparation = _separation; + fireComponentChangeEvent(ComponentChangeEvent.AERODYNAMIC_CHANGE); } @Override public void setInstanceCount(int newCount ){ - if( 0 < newCount ){ - this.instanceCount = newCount; - } - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof RailButton) { ((RailButton) listener).setInstanceCount(newCount); } } + + if( 0 < newCount ){ + this.instanceCount = newCount; + } + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } @Override diff --git a/core/src/net/sf/openrocket/rocketcomponent/RecoveryDevice.java b/core/src/net/sf/openrocket/rocketcomponent/RecoveryDevice.java index 0d4562fb2..ec3fe5542 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/RecoveryDevice.java +++ b/core/src/net/sf/openrocket/rocketcomponent/RecoveryDevice.java @@ -49,17 +49,17 @@ public abstract class RecoveryDevice extends MassObject implements FlightConfigu } public void setCD(double cd) { - if (MathUtil.equals(this.cd, cd) && !isCDAutomatic()) - return; - this.cd = cd; - this.cdAutomatic = false; - fireComponentChangeEvent(ComponentChangeEvent.AERODYNAMIC_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof RecoveryDevice) { ((RecoveryDevice) listener).setCD(cd); } } + + if (MathUtil.equals(this.cd, cd) && !isCDAutomatic()) + return; + this.cd = cd; + this.cdAutomatic = false; + fireComponentChangeEvent(ComponentChangeEvent.AERODYNAMIC_CHANGE); } @@ -68,16 +68,16 @@ public abstract class RecoveryDevice extends MassObject implements FlightConfigu } public void setCDAutomatic(boolean auto) { - if (cdAutomatic == auto) - return; - this.cdAutomatic = auto; - fireComponentChangeEvent(ComponentChangeEvent.AERODYNAMIC_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof RecoveryDevice) { ((RecoveryDevice) listener).setCDAutomatic(auto); } } + + if (cdAutomatic == auto) + return; + this.cdAutomatic = auto; + fireComponentChangeEvent(ComponentChangeEvent.AERODYNAMIC_CHANGE); } @@ -87,6 +87,12 @@ public abstract class RecoveryDevice extends MassObject implements FlightConfigu } public final void setMaterial(Material mat) { + for (RocketComponent listener : configListeners) { + if (listener instanceof RecoveryDevice) { + ((RecoveryDevice) listener).setMaterial(mat); + } + } + if (!(mat instanceof Material.Surface)) { throw new IllegalArgumentException("Attempted to set non-surface material " + mat); } @@ -95,12 +101,6 @@ public abstract class RecoveryDevice extends MassObject implements FlightConfigu this.material = (Material.Surface) mat; clearPreset(); fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof RecoveryDevice) { - ((RecoveryDevice) listener).setMaterial(mat); - } - } } public FlightConfigurableParameterSet getDeploymentConfigurations() { diff --git a/core/src/net/sf/openrocket/rocketcomponent/RingComponent.java b/core/src/net/sf/openrocket/rocketcomponent/RingComponent.java index 3d0b0d379..e514499ea 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/RingComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/RingComponent.java @@ -54,16 +54,16 @@ public abstract class RingComponent extends StructuralComponent implements BoxBo // Setter is protected, subclasses may make it public protected void setOuterRadiusAutomatic(boolean auto) { - if (auto == outerRadiusAutomatic) - return; - outerRadiusAutomatic = auto; - fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof RingComponent) { ((RingComponent) listener).setOuterRadiusAutomatic(auto); } } + + if (auto == outerRadiusAutomatic) + return; + outerRadiusAutomatic = auto; + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } @@ -73,34 +73,34 @@ public abstract class RingComponent extends StructuralComponent implements BoxBo // Setter is protected, subclasses may make it public protected void setInnerRadiusAutomatic(boolean auto) { - if (auto == innerRadiusAutomatic) - return; - innerRadiusAutomatic = auto; - fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof RingComponent) { ((RingComponent) listener).setInnerRadiusAutomatic(auto); } } + + if (auto == innerRadiusAutomatic) + return; + innerRadiusAutomatic = auto; + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } public final void setLength(double length) { + for (RocketComponent listener : configListeners) { + if (listener instanceof RingComponent) { + ((RingComponent) listener).setLength(length); + } + } + double l = Math.max(length, 0); if (this.length == l) return; this.length = l; fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof RingComponent) { - ((RingComponent) listener).setLength(length); - } - } } @@ -121,6 +121,12 @@ public abstract class RingComponent extends StructuralComponent implements BoxBo * @param dir the radial direction. */ public void setRadialDirection(double dir) { + for (RocketComponent listener : configListeners) { + if (listener instanceof RingComponent) { + ((RingComponent) listener).setRadialDirection(dir); + } + } + dir = MathUtil.reducePi(dir); if (radialDirection == dir) return; @@ -128,12 +134,6 @@ public abstract class RingComponent extends StructuralComponent implements BoxBo shiftY = radialPosition * Math.cos(radialDirection); shiftZ = radialPosition * Math.sin(radialDirection); fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof RingComponent) { - ((RingComponent) listener).setRadialDirection(dir); - } - } } public BoundingBox getInstanceBoundingBox(){ @@ -166,18 +166,19 @@ public abstract class RingComponent extends StructuralComponent implements BoxBo */ public void setRadialPosition(double pos) { pos = Math.max(pos, 0); - if (radialPosition == pos) - return; - radialPosition = pos; - shiftY = radialPosition * Math.cos(radialDirection); - shiftZ = radialPosition * Math.sin(radialDirection); - fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); for (RocketComponent listener : configListeners) { if (listener instanceof RingComponent) { ((RingComponent) listener).setRadialPosition(pos); } } + + if (radialPosition == pos) + return; + radialPosition = pos; + shiftY = radialPosition * Math.cos(radialDirection); + shiftZ = radialPosition * Math.sin(radialDirection); + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } @@ -190,6 +191,12 @@ public abstract class RingComponent extends StructuralComponent implements BoxBo } public void setRadialShift(double y, double z) { + for (RocketComponent listener : configListeners) { + if (listener instanceof RingComponent) { + ((RingComponent) listener).setRadialShift(y, z); + } + } + radialPosition = Math.hypot(y, z); radialDirection = Math.atan2(z, y); @@ -200,12 +207,6 @@ public abstract class RingComponent extends StructuralComponent implements BoxBo assert (MathUtil.equals(z, shiftZ)); fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof RingComponent) { - ((RingComponent) listener).setRadialShift(y, z); - } - } } @Override diff --git a/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java b/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java index 7dace55eb..266daec44 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java @@ -451,6 +451,10 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab * @param appearance */ public void setAppearance(Appearance appearance) { + for (RocketComponent listener : configListeners) { + listener.setAppearance(appearance); + } + this.appearance = appearance; if (this.appearance != null) { Decal d = this.appearance.getTexture(); @@ -465,12 +469,8 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab }); } } - // CHECK - should this be a TEXTURE_CHANGE and not NONFUNCTIONAL_CHANGE? - fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); - for (RocketComponent listener : configListeners) { - listener.setAppearance(appearance); - } + fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); } /** @@ -486,6 +486,10 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab * Set the color of the object to use in 2D figures. */ public final void setColor(Color c) { + for (RocketComponent listener : configListeners) { + listener.setColor(c); + } + if ((color == null && c == null) || (color != null && color.equals(c))) return; @@ -493,10 +497,6 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab checkState(); this.color = c; fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); - - for (RocketComponent listener : configListeners) { - listener.setColor(c); - } } @@ -506,15 +506,15 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab } public final void setLineStyle(LineStyle style) { + for (RocketComponent listener : configListeners) { + listener.setLineStyle(style); + } + if (this.lineStyle == style) return; checkState(); this.lineStyle = style; fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); - - for (RocketComponent listener : configListeners) { - listener.setLineStyle(style); - } } @@ -538,16 +538,16 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab * @param m the override mass */ public final void setOverrideMass(double m) { + for (RocketComponent listener : configListeners) { + listener.setOverrideMass(m); + } + if (MathUtil.equals(m, overrideMass)) return; checkState(); overrideMass = Math.max(m, 0); if (massOverridden) fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - - for (RocketComponent listener : configListeners) { - listener.setOverrideMass(m); - } } /** @@ -567,16 +567,18 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab * @param o whether the mass is overridden */ public final void setMassOverridden(boolean o) { + for (RocketComponent listener : configListeners) { + listener.setIgnoreComponentChange(false); + listener.setMassOverridden(o); + listener.setIgnoreComponentChange(false); + } + if (massOverridden == o) { return; } checkState(); massOverridden = o; fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - - for (RocketComponent listener : configListeners) { - listener.setMassOverridden(o); - } } @@ -609,6 +611,10 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab * @param x the x-coordinate of the override CG to set. */ public final void setOverrideCGX(double x) { + for (RocketComponent listener : configListeners) { + listener.setOverrideCGX(x); + } + if (MathUtil.equals(overrideCGX, x)) return; checkState(); @@ -617,10 +623,6 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); else fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); - - for (RocketComponent listener : configListeners) { - listener.setOverrideCGX(x); - } } /** @@ -639,16 +641,18 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab * @param o whether the CG is overridden */ public final void setCGOverridden(boolean o) { + for (RocketComponent listener : configListeners) { + listener.setIgnoreComponentChange(false); + listener.setCGOverridden(o); + listener.setIgnoreComponentChange(true); + } + if (cgOverridden == o) { return; } checkState(); cgOverridden = o; fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - - for (RocketComponent listener : configListeners) { - listener.setCGOverridden(o); - } } @@ -668,6 +672,10 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab * @param x the override CD to set. */ public final void setOverrideCD(double x) { + for (RocketComponent listener : configListeners) { + listener.setOverrideCD(x); + } + if (MathUtil.equals(overrideCD, x)) return; checkState(); @@ -676,10 +684,6 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); else fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); - - for (RocketComponent listener : configListeners) { - listener.setOverrideCD(x); - } } @@ -701,16 +705,16 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab * @param o whether the CD is overridden */ public final void setCDOverridden(boolean o) { + for (RocketComponent listener : configListeners) { + listener.setCDOverridden(o); + } + if(cdOverridden == o) { return; } checkState(); cdOverridden = o; fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - - for (RocketComponent listener : configListeners) { - listener.setCDOverridden(o); - } } @@ -738,16 +742,17 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab * @param override whether the mass and/or CG override overrides all subcomponent. */ public void setOverrideSubcomponents(boolean override) { + for (RocketComponent listener : configListeners) { + listener.setOverrideSubcomponents(override); + } + if (overrideSubcomponents == override) { return; } checkState(); overrideSubcomponents = override; - fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - for (RocketComponent listener : configListeners) { - listener.setOverrideSubcomponents(override); - } + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } /** @@ -787,6 +792,12 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab * the default name, currently the component name. */ public final void setName(String name) { + for (RocketComponent listener : configListeners) { + listener.setIgnoreComponentChange(false); + listener.setName(name); + listener.setIgnoreComponentChange(true); + } + if (this.name.equals(name)) { return; } @@ -795,11 +806,8 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab this.name = getComponentName(); else this.name = name; - fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); - for (RocketComponent listener : configListeners) { - listener.setName(name); - } + fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); } @@ -820,6 +828,10 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab * @param comment the comment of the component. */ public final void setComment(String comment) { + for (RocketComponent listener : configListeners) { + listener.setComment(comment); + } + if (this.comment.equals(comment)) return; checkState(); @@ -827,11 +839,8 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab this.comment = ""; else this.comment = comment; - fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); - for (RocketComponent listener : configListeners) { - listener.setComment(comment); - } + fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); } @@ -862,6 +871,10 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab * @param preset the preset component to load, or null to clear the preset. */ public final void loadPreset(ComponentPreset preset) { + for (RocketComponent listener : configListeners) { + listener.loadPreset(preset); + } + if (presetComponent == preset) { return; } @@ -895,7 +908,6 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab loadFromPreset(preset); this.presetComponent = preset; - fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); } finally { if (rocket != null) { @@ -903,9 +915,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab } } - for (RocketComponent listener : configListeners) { - listener.loadPreset(preset); - } + fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); } @@ -933,14 +943,14 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab * otherwise. */ public final void clearPreset() { + for (RocketComponent listener : configListeners) { + listener.clearPreset(); + } + if (presetComponent == null) return; presetComponent = null; fireComponentChangeEvent(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); - - for (RocketComponent listener : configListeners) { - listener.clearPreset(); - } } @@ -1004,6 +1014,10 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab * @param newAxialMethod the relative positioning. */ public void setAxialMethod(final AxialMethod newAxialMethod) { + for (RocketComponent listener : configListeners) { + listener.setAxialMethod(newAxialMethod); + } + if (newAxialMethod == this.axialMethod) { // no change. return; @@ -1016,10 +1030,6 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab // // this doesn't cause any physical change-- just how it's described. // fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - - for (RocketComponent listener : configListeners) { - listener.setAxialMethod(newAxialMethod); - } } /** diff --git a/core/src/net/sf/openrocket/rocketcomponent/ShockCord.java b/core/src/net/sf/openrocket/rocketcomponent/ShockCord.java index fe03b3da3..f48ca2aae 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/ShockCord.java +++ b/core/src/net/sf/openrocket/rocketcomponent/ShockCord.java @@ -26,18 +26,18 @@ public class ShockCord extends MassObject { } public void setMaterial(Material m) { + for (RocketComponent listener : configListeners) { + if (listener instanceof ShockCord) { + ((ShockCord) listener).setMaterial(m); + } + } + if (m.getType() != Material.Type.LINE) throw new BugException("Attempting to set non-linear material."); if (material.equals(m)) return; this.material = m; fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof ShockCord) { - ((ShockCord) listener).setMaterial(m); - } - } } @@ -46,17 +46,17 @@ public class ShockCord extends MassObject { } public void setCordLength(double length) { - length = MathUtil.max(length, 0); - if (MathUtil.equals(length, this.length)) - return; - this.cordLength = length; - fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof ShockCord) { ((ShockCord) listener).setCordLength(length); } } + + length = MathUtil.max(length, 0); + if (MathUtil.equals(length, this.length)) + return; + this.cordLength = length; + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } diff --git a/core/src/net/sf/openrocket/rocketcomponent/Sleeve.java b/core/src/net/sf/openrocket/rocketcomponent/Sleeve.java index 515b91236..8022e5f63 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/Sleeve.java +++ b/core/src/net/sf/openrocket/rocketcomponent/Sleeve.java @@ -35,6 +35,12 @@ public class Sleeve extends RingComponent { @Override public void setOuterRadius(double r) { + for (RocketComponent listener : configListeners) { + if (listener instanceof Sleeve) { + ((Sleeve) listener).setOuterRadius(r); + } + } + if (MathUtil.equals(getOuterRadius(), r)) return; @@ -42,12 +48,6 @@ public class Sleeve extends RingComponent { if (thickness > r) thickness = r; fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof Sleeve) { - ((Sleeve) listener).setOuterRadius(r); - } - } } @@ -68,17 +68,17 @@ public class Sleeve extends RingComponent { @Override public void setInnerRadius(double r) { - r = Math.max(r, 0); - if (MathUtil.equals(innerRadius, r)) - return; - innerRadius = r; - fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof Sleeve) { ((Sleeve) listener).setInnerRadius(r); } } + + r = Math.max(r, 0); + if (MathUtil.equals(innerRadius, r)) + return; + innerRadius = r; + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } @Override @@ -88,17 +88,17 @@ public class Sleeve extends RingComponent { @Override public void setThickness(double t) { - t = Math.max(t, 0); - if (MathUtil.equals(thickness, t)) - return; - thickness = t; - fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof Sleeve) { ((Sleeve) listener).setThickness(t); } } + + t = Math.max(t, 0); + if (MathUtil.equals(thickness, t)) + return; + thickness = t; + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } diff --git a/core/src/net/sf/openrocket/rocketcomponent/Streamer.java b/core/src/net/sf/openrocket/rocketcomponent/Streamer.java index 58f367dcc..caa7e990e 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/Streamer.java +++ b/core/src/net/sf/openrocket/rocketcomponent/Streamer.java @@ -31,17 +31,17 @@ public class Streamer extends RecoveryDevice { } public void setStripLength(double stripLength) { - if (MathUtil.equals(this.stripLength, stripLength)) - return; - this.stripLength = stripLength; - clearPreset(); - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof Streamer) { ((Streamer) listener).setStripLength(stripLength); } } + + if (MathUtil.equals(this.stripLength, stripLength)) + return; + this.stripLength = stripLength; + clearPreset(); + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } public double getStripWidth() { @@ -49,29 +49,29 @@ public class Streamer extends RecoveryDevice { } public void setStripWidth(double stripWidth) { + for (RocketComponent listener : configListeners) { + if (listener instanceof Streamer) { + ((Streamer) listener).setStripWidth(stripWidth); + } + } + if (MathUtil.equals(this.stripWidth, stripWidth)) return; this.stripWidth = stripWidth; this.length = stripWidth; clearPreset(); fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof Streamer) { - ((Streamer) listener).setStripWidth(stripWidth); - } - } } @Override public void setLength(double length) { - setStripWidth(length); - for (RocketComponent listener : configListeners) { if (listener instanceof Streamer) { ((Streamer) listener).setStripWidth(length); } } + + setStripWidth(length); } @@ -82,6 +82,12 @@ public class Streamer extends RecoveryDevice { } public void setAspectRatio(double ratio) { + for (RocketComponent listener : configListeners) { + if (listener instanceof Streamer) { + ((Streamer) listener).setAspectRatio(ratio); + } + } + if (MathUtil.equals(getAspectRatio(), ratio)) return; @@ -90,12 +96,6 @@ public class Streamer extends RecoveryDevice { stripWidth = MathUtil.safeSqrt(area / ratio); stripLength = ratio * stripWidth; fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof Streamer) { - ((Streamer) listener).setAspectRatio(ratio); - } - } } @@ -105,6 +105,12 @@ public class Streamer extends RecoveryDevice { } public void setArea(double area) { + for (RocketComponent listener : configListeners) { + if (listener instanceof Streamer) { + ((Streamer) listener).setArea(area); + } + } + if (MathUtil.equals(getArea(), area)) return; @@ -112,12 +118,6 @@ public class Streamer extends RecoveryDevice { stripWidth = MathUtil.safeSqrt(area / ratio); stripLength = ratio * stripWidth; fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof Streamer) { - ((Streamer) listener).setArea(area); - } - } } diff --git a/core/src/net/sf/openrocket/rocketcomponent/StructuralComponent.java b/core/src/net/sf/openrocket/rocketcomponent/StructuralComponent.java index a8eae373c..ce8fb3c34 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/StructuralComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/StructuralComponent.java @@ -46,16 +46,17 @@ public abstract class StructuralComponent extends InternalComponent { if (mat.getType() != Material.Type.BULK) { throw new IllegalArgumentException("Attempted to set non-bulk material "+mat); } - if (mat.equals(material)) - return; - this.material = mat; - clearPreset(); - fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); for (RocketComponent listener : configListeners) { if (listener instanceof StructuralComponent) { ((StructuralComponent) listener).setMaterial(mat); } } + + if (mat.equals(material)) + return; + this.material = mat; + clearPreset(); + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } } diff --git a/core/src/net/sf/openrocket/rocketcomponent/SymmetricComponent.java b/core/src/net/sf/openrocket/rocketcomponent/SymmetricComponent.java index 58d7fcd81..524f20973 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/SymmetricComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/SymmetricComponent.java @@ -112,18 +112,18 @@ public abstract class SymmetricComponent extends BodyComponent implements BoxBou * allowed, and will result in setting the thickness to the maximum radius. */ public void setThickness(double thickness) { + for (RocketComponent listener : configListeners) { + if (listener instanceof SymmetricComponent) { + ((SymmetricComponent) listener).setThickness(thickness); + } + } + if ((this.thickness == thickness) && !filled) return; this.thickness = MathUtil.clamp(thickness, 0, Math.max(getForeRadius(), getAftRadius())); filled = false; fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); clearPreset(); - - for (RocketComponent listener : configListeners) { - if (listener instanceof SymmetricComponent) { - ((SymmetricComponent) listener).setThickness(thickness); - } - } } @@ -145,17 +145,17 @@ public abstract class SymmetricComponent extends BodyComponent implements BoxBou * the wall thickness will have no effect. */ public void setFilled(boolean filled) { - if (this.filled == filled) - return; - this.filled = filled; - fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - clearPreset(); - for (RocketComponent listener : configListeners) { if (listener instanceof SymmetricComponent) { ((SymmetricComponent) listener).setFilled(filled); } } + + if (this.filled == filled) + return; + this.filled = filled; + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); + clearPreset(); } diff --git a/core/src/net/sf/openrocket/rocketcomponent/ThicknessRingComponent.java b/core/src/net/sf/openrocket/rocketcomponent/ThicknessRingComponent.java index ff6211742..908f28a84 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/ThicknessRingComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/ThicknessRingComponent.java @@ -52,6 +52,12 @@ public abstract class ThicknessRingComponent extends RingComponent { @Override public void setOuterRadius(double r) { + for (RocketComponent listener : configListeners) { + if (listener instanceof ThicknessRingComponent) { + ((ThicknessRingComponent) listener).setOuterRadius(r); + } + } + r = Math.max(r,0); if (MathUtil.equals(outerRadius, r) && !isOuterRadiusAutomatic()) return; @@ -65,12 +71,6 @@ public abstract class ThicknessRingComponent extends RingComponent { clearPreset(); fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof ThicknessRingComponent) { - ((ThicknessRingComponent) listener).setOuterRadius(r); - } - } } @@ -81,6 +81,12 @@ public abstract class ThicknessRingComponent extends RingComponent { } @Override public void setThickness(double thickness) { + for (RocketComponent listener : configListeners) { + if (listener instanceof ThicknessRingComponent) { + ((ThicknessRingComponent) listener).setThickness(thickness); + } + } + double outer = getOuterRadius(); thickness = MathUtil.clamp(thickness, 0, outer); @@ -92,12 +98,6 @@ public abstract class ThicknessRingComponent extends RingComponent { clearPreset(); fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof ThicknessRingComponent) { - ((ThicknessRingComponent) listener).setThickness(thickness); - } - } } @@ -107,14 +107,14 @@ public abstract class ThicknessRingComponent extends RingComponent { } @Override public void setInnerRadius(double r) { - r = Math.max(r,0); - setThickness(getOuterRadius() - r); - for (RocketComponent listener : configListeners) { if (listener instanceof ThicknessRingComponent) { ((ThicknessRingComponent) listener).setInnerRadius(r); } } + + r = Math.max(r,0); + setThickness(getOuterRadius() - r); } diff --git a/core/src/net/sf/openrocket/rocketcomponent/Transition.java b/core/src/net/sf/openrocket/rocketcomponent/Transition.java index 71cd5da4b..710cf55ec 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/Transition.java +++ b/core/src/net/sf/openrocket/rocketcomponent/Transition.java @@ -103,6 +103,12 @@ public class Transition extends SymmetricComponent implements InsideColorCompone } public void setForeRadius(double radius) { + for (RocketComponent listener : configListeners) { + if (listener instanceof Transition) { + ((Transition) listener).setForeRadius(radius); + } + } + if ((this.foreRadius == radius) && (autoForeRadius == false)) return; @@ -114,12 +120,6 @@ public class Transition extends SymmetricComponent implements InsideColorCompone clearPreset(); fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof Transition) { - ((Transition) listener).setForeRadius(radius); - } - } } @Override @@ -128,6 +128,12 @@ public class Transition extends SymmetricComponent implements InsideColorCompone } public void setForeRadiusAutomatic(boolean auto) { + for (RocketComponent listener : configListeners) { + if (listener instanceof Transition) { + ((Transition) listener).setForeRadiusAutomatic(auto); + } + } + if (autoForeRadius == auto) return; @@ -135,12 +141,6 @@ public class Transition extends SymmetricComponent implements InsideColorCompone clearPreset(); fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof Transition) { - ((Transition) listener).setForeRadiusAutomatic(auto); - } - } } @@ -171,6 +171,12 @@ public class Transition extends SymmetricComponent implements InsideColorCompone } public void setAftRadius(double radius) { + for (RocketComponent listener : configListeners) { + if (listener instanceof Transition) { + ((Transition) listener).setAftRadius(radius); + } + } + if ((this.aftRadius == radius) && (autoAftRadius2 == false)) return; @@ -182,12 +188,6 @@ public class Transition extends SymmetricComponent implements InsideColorCompone clearPreset(); fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof Transition) { - ((Transition) listener).setAftRadius(radius); - } - } } @Override @@ -196,6 +196,12 @@ public class Transition extends SymmetricComponent implements InsideColorCompone } public void setAftRadiusAutomatic(boolean auto) { + for (RocketComponent listener : configListeners) { + if (listener instanceof Transition) { + ((Transition) listener).setAftRadiusAutomatic(auto); + } + } + if (autoAftRadius2 == auto) return; @@ -203,12 +209,6 @@ public class Transition extends SymmetricComponent implements InsideColorCompone clearPreset(); fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof Transition) { - ((Transition) listener).setAftRadiusAutomatic(auto); - } - } } @@ -248,6 +248,12 @@ public class Transition extends SymmetricComponent implements InsideColorCompone } public void setType(Shape type) { + for (RocketComponent listener : configListeners) { + if (listener instanceof Transition) { + ((Transition) listener).setType(type); + } + } + if (type == null) { throw new IllegalArgumentException("setType called with null argument"); } @@ -257,12 +263,6 @@ public class Transition extends SymmetricComponent implements InsideColorCompone this.clipped = type.isClippable(); this.shapeParameter = type.defaultParameter(); fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof Transition) { - ((Transition) listener).setType(type); - } - } } public double getShapeParameter() { @@ -270,16 +270,16 @@ public class Transition extends SymmetricComponent implements InsideColorCompone } public void setShapeParameter(double n) { - if (shapeParameter == n) - return; - this.shapeParameter = MathUtil.clamp(n, type.minParameter(), type.maxParameter()); - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof Transition) { ((Transition) listener).setShapeParameter(n); } } + + if (shapeParameter == n) + return; + this.shapeParameter = MathUtil.clamp(n, type.minParameter(), type.maxParameter()); + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } public boolean isClipped() { @@ -289,16 +289,16 @@ public class Transition extends SymmetricComponent implements InsideColorCompone } public void setClipped(boolean c) { - if (clipped == c) - return; - clipped = c; - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof Transition) { ((Transition) listener).setClipped(c); } } + + if (clipped == c) + return; + clipped = c; + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } public boolean isClippedEnabled() { @@ -321,17 +321,17 @@ public class Transition extends SymmetricComponent implements InsideColorCompone } public void setForeShoulderRadius(double foreShoulderRadius) { - if (MathUtil.equals(this.foreShoulderRadius, foreShoulderRadius)) - return; - this.foreShoulderRadius = foreShoulderRadius; - clearPreset(); - fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof Transition) { ((Transition) listener).setForeShoulderRadius(foreShoulderRadius); } } + + if (MathUtil.equals(this.foreShoulderRadius, foreShoulderRadius)) + return; + this.foreShoulderRadius = foreShoulderRadius; + clearPreset(); + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } public double getForeShoulderThickness() { @@ -339,16 +339,16 @@ public class Transition extends SymmetricComponent implements InsideColorCompone } public void setForeShoulderThickness(double foreShoulderThickness) { - if (MathUtil.equals(this.foreShoulderThickness, foreShoulderThickness)) - return; - this.foreShoulderThickness = foreShoulderThickness; - fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof Transition) { ((Transition) listener).setForeShoulderThickness(foreShoulderThickness); } } + + if (MathUtil.equals(this.foreShoulderThickness, foreShoulderThickness)) + return; + this.foreShoulderThickness = foreShoulderThickness; + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } public double getForeShoulderLength() { @@ -356,16 +356,16 @@ public class Transition extends SymmetricComponent implements InsideColorCompone } public void setForeShoulderLength(double foreShoulderLength) { - if (MathUtil.equals(this.foreShoulderLength, foreShoulderLength)) - return; - this.foreShoulderLength = foreShoulderLength; - fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof Transition) { ((Transition) listener).setForeShoulderLength(foreShoulderLength); } } + + if (MathUtil.equals(this.foreShoulderLength, foreShoulderLength)) + return; + this.foreShoulderLength = foreShoulderLength; + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } public boolean isForeShoulderCapped() { @@ -373,16 +373,16 @@ public class Transition extends SymmetricComponent implements InsideColorCompone } public void setForeShoulderCapped(boolean capped) { - if (this.foreShoulderCapped == capped) - return; - this.foreShoulderCapped = capped; - fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof Transition) { ((Transition) listener).setForeShoulderCapped(capped); } } + + if (this.foreShoulderCapped == capped) + return; + this.foreShoulderCapped = capped; + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } @@ -393,17 +393,17 @@ public class Transition extends SymmetricComponent implements InsideColorCompone } public void setAftShoulderRadius(double aftShoulderRadius) { - if (MathUtil.equals(this.aftShoulderRadius, aftShoulderRadius)) - return; - this.aftShoulderRadius = aftShoulderRadius; - clearPreset(); - fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof Transition) { ((Transition) listener).setAftShoulderRadius(aftShoulderRadius); } } + + if (MathUtil.equals(this.aftShoulderRadius, aftShoulderRadius)) + return; + this.aftShoulderRadius = aftShoulderRadius; + clearPreset(); + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } public double getAftShoulderThickness() { @@ -411,16 +411,16 @@ public class Transition extends SymmetricComponent implements InsideColorCompone } public void setAftShoulderThickness(double aftShoulderThickness) { - if (MathUtil.equals(this.aftShoulderThickness, aftShoulderThickness)) - return; - this.aftShoulderThickness = aftShoulderThickness; - fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof Transition) { ((Transition) listener).setAftShoulderThickness(aftShoulderThickness); } } + + if (MathUtil.equals(this.aftShoulderThickness, aftShoulderThickness)) + return; + this.aftShoulderThickness = aftShoulderThickness; + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } public double getAftShoulderLength() { @@ -428,16 +428,16 @@ public class Transition extends SymmetricComponent implements InsideColorCompone } public void setAftShoulderLength(double aftShoulderLength) { - if (MathUtil.equals(this.aftShoulderLength, aftShoulderLength)) - return; - this.aftShoulderLength = aftShoulderLength; - fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof Transition) { ((Transition) listener).setAftShoulderLength(aftShoulderLength); } } + + if (MathUtil.equals(this.aftShoulderLength, aftShoulderLength)) + return; + this.aftShoulderLength = aftShoulderLength; + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } public boolean isAftShoulderCapped() { @@ -445,16 +445,16 @@ public class Transition extends SymmetricComponent implements InsideColorCompone } public void setAftShoulderCapped(boolean capped) { - if (this.aftShoulderCapped == capped) - return; - this.aftShoulderCapped = capped; - fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof Transition) { ((Transition) listener).setAftShoulderCapped(capped); } } + + if (this.aftShoulderCapped == capped) + return; + this.aftShoulderCapped = capped; + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } diff --git a/core/src/net/sf/openrocket/rocketcomponent/TrapezoidFinSet.java b/core/src/net/sf/openrocket/rocketcomponent/TrapezoidFinSet.java index 7c8dd9ec3..597049d7b 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/TrapezoidFinSet.java +++ b/core/src/net/sf/openrocket/rocketcomponent/TrapezoidFinSet.java @@ -57,6 +57,12 @@ public class TrapezoidFinSet extends FinSet { public void setFinShape(double rootChord, double tipChord, double sweep, double height, double thickness) { + for (RocketComponent listener : configListeners) { + if (listener instanceof TrapezoidFinSet) { + ((TrapezoidFinSet) listener).setFinShape(rootChord, tipChord, sweep, height, thickness); + } + } + if (this.length == rootChord && this.tipChord == tipChord && this.sweep == sweep && this.height == height && this.thickness == thickness) return; @@ -67,12 +73,6 @@ public class TrapezoidFinSet extends FinSet { this.thickness = thickness; fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof TrapezoidFinSet) { - ((TrapezoidFinSet) listener).setFinShape(rootChord, tipChord, sweep, height, thickness); - } - } } public double getRootChord() { @@ -80,18 +80,18 @@ public class TrapezoidFinSet extends FinSet { } public void setRootChord(double r) { + for (RocketComponent listener : configListeners) { + if (listener instanceof TrapezoidFinSet) { + ((TrapezoidFinSet) listener).setRootChord(r); + } + } + if (length == r) return; length = Math.max(r, 0); updateTabPosition(); fireComponentChangeEvent(ComponentChangeEvent.AEROMASS_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof TrapezoidFinSet) { - ((TrapezoidFinSet) listener).setRootChord(r); - } - } } public double getTipChord() { @@ -99,16 +99,16 @@ public class TrapezoidFinSet extends FinSet { } public void setTipChord(double r) { - if (tipChord == r) - return; - tipChord = Math.max(r, 0); - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof TrapezoidFinSet) { ((TrapezoidFinSet) listener).setTipChord(r); } } + + if (tipChord == r) + return; + tipChord = Math.max(r, 0); + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } /** @@ -122,16 +122,16 @@ public class TrapezoidFinSet extends FinSet { * Set the sweep length. */ public void setSweep(double r) { - if (sweep == r) - return; - sweep = r; - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof TrapezoidFinSet) { ((TrapezoidFinSet) listener).setSweep(r); } } + + if (sweep == r) + return; + sweep = r; + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } /** @@ -154,6 +154,12 @@ public class TrapezoidFinSet extends FinSet { * and the angle itself is not stored. */ public void setSweepAngle(double r) { + for (RocketComponent listener : configListeners) { + if (listener instanceof TrapezoidFinSet) { + ((TrapezoidFinSet) listener).setSweepAngle(r); + } + } + if (r > MAX_SWEEP_ANGLE) r = MAX_SWEEP_ANGLE; if (r < -MAX_SWEEP_ANGLE) @@ -162,12 +168,6 @@ public class TrapezoidFinSet extends FinSet { if (Double.isNaN(mySweep) || Double.isInfinite(mySweep)) return; setSweep(mySweep); - - for (RocketComponent listener : configListeners) { - if (listener instanceof TrapezoidFinSet) { - ((TrapezoidFinSet) listener).setSweepAngle(r); - } - } } public double getHeight() { @@ -175,16 +175,16 @@ public class TrapezoidFinSet extends FinSet { } public void setHeight(double r) { - if (height == r) - return; - height = Math.max(r, 0); - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof TrapezoidFinSet) { ((TrapezoidFinSet) listener).setHeight(r); } } + + if (height == r) + return; + height = Math.max(r, 0); + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } diff --git a/core/src/net/sf/openrocket/rocketcomponent/TubeFinSet.java b/core/src/net/sf/openrocket/rocketcomponent/TubeFinSet.java index a414bd49a..2292429a7 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/TubeFinSet.java +++ b/core/src/net/sf/openrocket/rocketcomponent/TubeFinSet.java @@ -61,16 +61,16 @@ public class TubeFinSet extends ExternalComponent implements AxialPositionable, } public void setLength(double length) { - if (MathUtil.equals(this.length, length)) - return; - this.length = length; - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof TubeFinSet) { ((TubeFinSet) listener).setLength(length); } } + + if (MathUtil.equals(this.length, length)) + return; + this.length = length; + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } @@ -122,6 +122,12 @@ public class TubeFinSet extends ExternalComponent implements AxialPositionable, * @param radius the outside radius in standard units */ public void setOuterRadius(double radius) { + for (RocketComponent listener : configListeners) { + if (listener instanceof TubeFinSet) { + ((TubeFinSet) listener).setOuterRadius(radius); + } + } + if ((this.outerRadius == radius) && (autoRadius == false)) return; @@ -132,30 +138,24 @@ public class TubeFinSet extends ExternalComponent implements AxialPositionable, this.thickness = this.outerRadius; fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); clearPreset(); - - for (RocketComponent listener : configListeners) { - if (listener instanceof TubeFinSet) { - ((TubeFinSet) listener).setOuterRadius(radius); - } - } } /** * Sets whether the radius is selected automatically or not. */ public void setOuterRadiusAutomatic(boolean auto) { + for (RocketComponent listener : configListeners) { + if (listener instanceof TubeFinSet) { + ((TubeFinSet) listener).setOuterRadiusAutomatic(auto); + } + } + if (autoRadius == auto) return; autoRadius = auto; fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); clearPreset(); - - for (RocketComponent listener : configListeners) { - if (listener instanceof TubeFinSet) { - ((TubeFinSet) listener).setOuterRadiusAutomatic(auto); - } - } } public double getInnerRadius() { @@ -163,13 +163,13 @@ public class TubeFinSet extends ExternalComponent implements AxialPositionable, } public void setInnerRadius(double r) { - setThickness(getOuterRadius() - r); - for (RocketComponent listener : configListeners) { if (listener instanceof TubeFinSet) { ((TubeFinSet) listener).setInnerRadius(r); } } + + setThickness(getOuterRadius() - r); } /** @@ -185,17 +185,17 @@ public class TubeFinSet extends ExternalComponent implements AxialPositionable, * allowed, and will result in setting the thickness to the maximum radius. */ public void setThickness(double thickness) { - if ((this.thickness == thickness)) - return; - this.thickness = MathUtil.clamp(thickness, 0, getOuterRadius()); - fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); - clearPreset(); - for (RocketComponent listener : configListeners) { if (listener instanceof TubeFinSet) { ((TubeFinSet) listener).setThickness(thickness); } } + + if ((this.thickness == thickness)) + return; + this.thickness = MathUtil.clamp(thickness, 0, getOuterRadius()); + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); + clearPreset(); } @@ -217,6 +217,12 @@ public class TubeFinSet extends ExternalComponent implements AxialPositionable, * @param n The number of fins, greater of equal to one. */ public void setFinCount(int n) { + for (RocketComponent listener : configListeners) { + if (listener instanceof TubeFinSet) { + ((TubeFinSet) listener).setFinCount(n); + } + } + if (fins == n) return; if (n < 1) @@ -226,12 +232,6 @@ public class TubeFinSet extends ExternalComponent implements AxialPositionable, fins = n; finRotation = Transformation.rotate_x(2 * Math.PI / fins); fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof TubeFinSet) { - ((TubeFinSet) listener).setFinCount(n); - } - } } /** @@ -251,13 +251,13 @@ public class TubeFinSet extends ExternalComponent implements AxialPositionable, * @param r The base rotation amount. */ public void setBaseRotation(double r) { - setAngleOffset(r); - for (RocketComponent listener : configListeners) { if (listener instanceof TubeFinSet) { ((TubeFinSet) listener).setBaseRotation(r); } } + + setAngleOffset(r); } public Transformation getBaseRotationTransformation() { @@ -397,13 +397,13 @@ public class TubeFinSet extends ExternalComponent implements AxialPositionable, @Override public void setInstanceCount(int newCount) { - setFinCount(newCount); - for (RocketComponent listener : configListeners) { if (listener instanceof TubeFinSet) { ((TubeFinSet) listener).setInstanceCount(newCount); } } + + setFinCount(newCount); } @Override @@ -425,6 +425,12 @@ public class TubeFinSet extends ExternalComponent implements AxialPositionable, @Override public void setAngleOffset(double angleRadians) { + for (RocketComponent listener : configListeners) { + if (listener instanceof TubeFinSet) { + ((TubeFinSet) listener).setAngleOffset(angleRadians); + } + } + final double reducedAngle = MathUtil.reducePi(angleRadians); if (MathUtil.equals(reducedAngle, firstFinOffsetRadians)) return; @@ -437,12 +443,6 @@ public class TubeFinSet extends ExternalComponent implements AxialPositionable, } fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - - for (RocketComponent listener : configListeners) { - if (listener instanceof TubeFinSet) { - ((TubeFinSet) listener).setAngleOffset(angleRadians); - } - } } @Override @@ -457,15 +457,15 @@ public class TubeFinSet extends ExternalComponent implements AxialPositionable, @Override public void setAngleMethod(AngleMethod newAngleMethod) { - mutex.verify(); - this.angleMethod = newAngleMethod; - fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); - for (RocketComponent listener : configListeners) { if (listener instanceof TubeFinSet) { ((TubeFinSet) listener).setAngleMethod(newAngleMethod); } } + + mutex.verify(); + this.angleMethod = newAngleMethod; + fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE); } @Override diff --git a/swing/src/net/sf/openrocket/gui/configdialog/FinSetConfig.java b/swing/src/net/sf/openrocket/gui/configdialog/FinSetConfig.java index 921ff611f..c375a0262 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/FinSetConfig.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/FinSetConfig.java @@ -81,8 +81,6 @@ public abstract class FinSetConfig extends RocketComponentConfig { public void run() { //// Convert fin set document.addUndoPosition(trans.get("FinSetConfig.Convertfinset")); - RocketComponent freeform = - FreeformFinSet.convertFinSet((FinSet) component); List listeners = new ArrayList<>(); for (RocketComponent listener : component.getConfigListeners()) { @@ -91,6 +89,9 @@ public abstract class FinSetConfig extends RocketComponentConfig { } } + RocketComponent freeform = + FreeformFinSet.convertFinSet((FinSet) component); + ComponentConfigDialog.showDialog(freeform, listeners); } });