diff --git a/core/resources/l10n/messages.properties b/core/resources/l10n/messages.properties
index c5929d0bb..b8969fd8b 100644
--- a/core/resources/l10n/messages.properties
+++ b/core/resources/l10n/messages.properties
@@ -930,6 +930,12 @@ RocketCompCfg.checkbox.OverrideSubcomponents = Override for all subcomponents
RocketCompCfg.checkbox.OverrideSubcomponents.Mass.ttip = Overrides the aggregate mass of this component
and its subcomponents with the mass of this component.
RocketCompCfg.checkbox.OverrideSubcomponents.CG.ttip = Overrides the center of gravity (CG) of this component
and its subcomponents with the CG of this component.
RocketCompCfg.checkbox.OverrideSubcomponents.CD.ttip = Overrides the coefficient of drag (CD) of this component
and its subcomponents with the CD of this component.
+RocketCompCfg.lbl.MassOverriddenBy = Mass overridden by %s
+RocketCompCfg.lbl.CGOverriddenBy = CG overridden by %s
+RocketCompCfg.lbl.CDOverriddenBy = CD overridden by %s
+RocketCompCfg.lbl.MassOverriddenBy.ttip = The mass of this component is determined by the mass override value of %s
+RocketCompCfg.lbl.CGOverriddenBy.ttip = The CG of this component is determined by the CG override value of %s
+RocketCompCfg.lbl.CDOverriddenBy.ttip = The CD of this component is determined by the CD override value of %s
RocketCompCfg.lbl.longB1 = The overridden mass and center of gravity does not include motors.
RocketCompCfg.lbl.longB2 = The center of gravity is measured from the front end of the
RocketCompCfg.lbl.Commentsonthe = Comments on the
diff --git a/core/src/net/sf/openrocket/rocketcomponent/ComponentChangeEvent.java b/core/src/net/sf/openrocket/rocketcomponent/ComponentChangeEvent.java
index f74798f6a..b1aaf1777 100644
--- a/core/src/net/sf/openrocket/rocketcomponent/ComponentChangeEvent.java
+++ b/core/src/net/sf/openrocket/rocketcomponent/ComponentChangeEvent.java
@@ -14,8 +14,9 @@ public class ComponentChangeEvent extends EventObject {
UNDO( 16, "UNDO"),
MOTOR( 32, "Motor"),
EVENT( 64, "Event"),
- TEXTURE ( 128, "Texture")
- , GRAPHIC( 256, "Configuration")
+ TEXTURE ( 128, "Texture"),
+ GRAPHIC( 256, "Configuration"),
+ TREE_CHILDREN( 512, "TREE_CHILDREN"),
;
protected int value;
@@ -45,6 +46,8 @@ public class ComponentChangeEvent extends EventObject {
/** A change that affects the rocket tree structure */
public static final int TREE_CHANGE = TYPE.TREE.value;
+ /** A change that affects the children's tree structure */
+ public static final int TREE_CHANGE_CHILDREN = TYPE.TREE_CHILDREN.value;
/** A change caused by undo/redo. */
public static final int UNDO_CHANGE = TYPE.UNDO.value;
/** A change in the motor configurations or names */
@@ -124,6 +127,9 @@ public class ComponentChangeEvent extends EventObject {
public boolean isTreeChange() {
return TYPE.TREE.matches(this.type);
}
+ public boolean isTreeChildrenChange() {
+ return TYPE.TREE_CHILDREN.matches(this.type);
+ }
public boolean isUndoChange() {
return TYPE.UNDO.matches(this.type);
@@ -150,6 +156,8 @@ public class ComponentChangeEvent extends EventObject {
s += ",aero";
if (isTreeChange())
s += ",tree";
+ if (isTreeChildrenChange())
+ s += ",treechild";
if (isUndoChange())
s += ",undo";
if (isMotorChange())
diff --git a/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java b/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java
index 0c3e2364b..5f362cf61 100644
--- a/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java
+++ b/core/src/net/sf/openrocket/rocketcomponent/RocketComponent.java
@@ -819,7 +819,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
updateChildrenMassOverriddenBy();
- fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
+ fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE | ComponentChangeEvent.TREE_CHANGE_CHILDREN);
}
/**
@@ -857,7 +857,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
updateChildrenCGOverriddenBy();
- fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
+ fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE | ComponentChangeEvent.TREE_CHANGE_CHILDREN);
}
/**
@@ -897,7 +897,7 @@ public abstract class RocketComponent implements ChangeSource, Cloneable, Iterab
overrideSubcomponentsCD(override);
- fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE);
+ fireComponentChangeEvent(ComponentChangeEvent.BOTH_CHANGE | ComponentChangeEvent.TREE_CHANGE_CHILDREN);
}
/**
diff --git a/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeModel.java b/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeModel.java
index b33089118..5506cc3ce 100644
--- a/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeModel.java
+++ b/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeModel.java
@@ -90,9 +90,9 @@ public class ComponentTreeModel implements TreeModel, ComponentChangeListener {
private void fireTreeNodeChanged(RocketComponent node) {
TreeModelEvent e = new TreeModelEvent(this, makeTreePath(node), null, null);
- Object[] l = listeners.toArray();
- for (int i = 0; i < l.length; i++)
- ((TreeModelListener) l[i]).treeNodesChanged(e);
+ for (TreeModelListener listener : listeners) {
+ listener.treeNodesChanged(e);
+ }
}
@@ -147,7 +147,12 @@ public class ComponentTreeModel implements TreeModel, ComponentChangeListener {
// TODO: LOW: Could this be performed better?
expandAll();
}
- } else {
+ } else if (e.isTreeChildrenChange()) {
+ for (RocketComponent c : e.getSource().getAllChildren()) {
+ fireTreeNodeChanged(c);
+ }
+ }
+ else {
fireTreeNodeChanged(e.getSource());
}
}
diff --git a/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeRenderer.java b/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeRenderer.java
index ccd0e6ee4..0f66f24e2 100644
--- a/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeRenderer.java
+++ b/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeRenderer.java
@@ -49,23 +49,31 @@ public class ComponentTreeRenderer extends DefaultTreeCellRenderer {
} else {
setIcon(ComponentIcons.getSmallIcon(value.getClass()));
}
- if (c.isMassOverridden() || c.isCGOverridden() || c.isCDOverridden()) {
+ if (c.isMassOverridden() || c.getMassOverriddenBy() != null ||
+ c.isCGOverridden() || c.getCGOverriddenBy() != null ||
+ c.isCDOverridden() || c.getCDOverriddenBy() != null) {
JPanel p = new JPanel();
p.setLayout(new FlowLayout(FlowLayout.LEFT, 1, 1));
p.setBackground(UIManager.getColor("Tree.textBackground"));
p.setForeground(UIManager.getColor("Tree.textForeground"));
p.add(comp/* , BorderLayout.WEST */);
- if (c.isMassOverridden()) {
+ if (c.getMassOverriddenBy() != null) {
+ p.add(new JLabel(Icons.MASS_OVERRIDE_SUBCOMPONENT));
+ } else if (c.isMassOverridden()) {
p.add(new JLabel(Icons.MASS_OVERRIDE));
}
- if (c.isCGOverridden()) {
+ if (c.getCGOverriddenBy() != null) {
+ p.add(new JLabel(Icons.CG_OVERRIDE_SUBCOMPONENT));
+ } else if (c.isCGOverridden()) {
p.add(new JLabel(Icons.CG_OVERRIDE));
}
- if (c.isCDOverridden()) {
+ if (c.getCDOverriddenBy() != null) {
+ p.add(new JLabel(Icons.CD_OVERRIDE_SUBCOMPONENT));
+ } else if (c.isCDOverridden()) {
p.add(new JLabel(Icons.CD_OVERRIDE));
}
-
+ // Make sure the tooltip also works on the override icons
if (components != null && components.size() > 1 && components.contains(c)) {
p.setToolTipText(getToolTipMultipleComponents(components));
} else {