From 4e1c0f15fbad89dc4d203838c0d5df1a34182114 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Tue, 8 Nov 2022 16:51:15 +0100 Subject: [PATCH] [#1631] Show subcomponent overridden icon When a component's parent has the subcomponent overridden icon enabled, that component will now also have a dedicated icon, indicating that it's mass has been overridden --- core/resources/l10n/messages.properties | 6 ++++++ .../rocketcomponent/ComponentChangeEvent.java | 12 ++++++++++-- .../rocketcomponent/RocketComponent.java | 6 +++--- .../main/componenttree/ComponentTreeModel.java | 13 +++++++++---- .../componenttree/ComponentTreeRenderer.java | 18 +++++++++++++----- 5 files changed, 41 insertions(+), 14 deletions(-) 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 {