From 161120855c6990e11e6bc4580fdaaf7138136ef8 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Thu, 17 Feb 2022 16:38:51 +0100 Subject: [PATCH] [fixes #358] Fix some issues --- .../rocketcomponent/ExternalComponent.java | 12 ++--- .../configdialog/ComponentConfigDialog.java | 46 +++++++++++++++---- .../sf/openrocket/gui/main/BasicFrame.java | 20 ++++++-- .../sf/openrocket/gui/main/RocketActions.java | 12 +++-- 4 files changed, 67 insertions(+), 23 deletions(-) diff --git a/core/src/net/sf/openrocket/rocketcomponent/ExternalComponent.java b/core/src/net/sf/openrocket/rocketcomponent/ExternalComponent.java index 764853c09..0e6741725 100644 --- a/core/src/net/sf/openrocket/rocketcomponent/ExternalComponent.java +++ b/core/src/net/sf/openrocket/rocketcomponent/ExternalComponent.java @@ -108,18 +108,18 @@ public abstract class ExternalComponent extends RocketComponent { throw new IllegalArgumentException("ExternalComponent requires a bulk material" + " type=" + mat.getType()); } - - if (material.equals(mat)) - return; - material = mat; - clearPreset(); - fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); for (RocketComponent listener : configListeners) { if (listener instanceof ExternalComponent) { ((ExternalComponent) listener).setMaterial(mat); } } + + if (material.equals(mat)) + return; + material = mat; + clearPreset(); + fireComponentChangeEvent(ComponentChangeEvent.MASS_CHANGE); } public Finish getFinish() { diff --git a/swing/src/net/sf/openrocket/gui/configdialog/ComponentConfigDialog.java b/swing/src/net/sf/openrocket/gui/configdialog/ComponentConfigDialog.java index 4c1a740bf..88575ca03 100644 --- a/swing/src/net/sf/openrocket/gui/configdialog/ComponentConfigDialog.java +++ b/swing/src/net/sf/openrocket/gui/configdialog/ComponentConfigDialog.java @@ -6,6 +6,7 @@ import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; +import java.util.List; import javax.swing.JDialog; @@ -42,7 +43,8 @@ public class ComponentConfigDialog extends JDialog implements ComponentChangeLis private final Window parent; private static final Translator trans = Application.getTranslator(); - private ComponentConfigDialog(Window parent, OpenRocketDocument document, RocketComponent component) { + private ComponentConfigDialog(Window parent, OpenRocketDocument document, RocketComponent component, + List listeners) { super(parent); this.parent = parent; @@ -61,9 +63,22 @@ public class ComponentConfigDialog extends JDialog implements ComponentChangeLis configurator.invalidate(); document.getRocket().removeComponentChangeListener(ComponentConfigDialog.this); ComponentConfigDialog.this.dispose(); + component.clearConfigListeners(); } public void windowClosing(WindowEvent e){} + + @Override + public void windowOpened(WindowEvent e) { + super.windowOpened(e); + // Add config listeners + component.clearConfigListeners(); + if (listeners != null) { + for (RocketComponent listener : listeners) { + component.addConfigListener(listener); + } + } + } }); } @@ -188,23 +203,41 @@ public class ComponentConfigDialog extends JDialog implements ComponentChangeLis * * @param document the document to configure. * @param component the component to configure. + * @param listeners config listeners for the component */ public static void showDialog(Window parent, OpenRocketDocument document, - RocketComponent component) { + RocketComponent component, List listeners) { if (dialog != null) dialog.dispose(); - - dialog = new ComponentConfigDialog(parent, document, component); + + dialog = new ComponentConfigDialog(parent, document, component, listeners); dialog.setVisible(true); ////Modify document.addUndoPosition(trans.get("ComponentCfgDlg.Modify") + " " + component.getComponentName()); } + + /** + * A singleton configuration dialog. Will create and show a new dialog if one has not + * previously been used, or update the dialog and show it if a previous one exists. + * + * @param document the document to configure. + * @param component the component to configure. + */ + public static void showDialog(Window parent, OpenRocketDocument document, + RocketComponent component) { + ComponentConfigDialog.showDialog(parent, document, component, null); + } + /* package */ + static void showDialog(RocketComponent component, List listeners) { + showDialog(dialog.parent, dialog.document, component, listeners); + } + /* package */ static void showDialog(RocketComponent component) { - showDialog(dialog.parent, dialog.document, component); + ComponentConfigDialog.showDialog(component, null); } /** @@ -213,9 +246,6 @@ public class ComponentConfigDialog extends JDialog implements ComponentChangeLis public static void hideDialog() { if (dialog != null) { dialog.setVisible(false); - if (dialog.component != null) { - dialog.component.clearConfigListeners(); - } } } diff --git a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java index 885fc1d85..766c77b21 100644 --- a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java +++ b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java @@ -335,16 +335,26 @@ public class BasicFrame extends JFrame { @Override public void valueChanged(TreeSelectionEvent e) { // Scroll tree to the selected item - TreePath path = componentSelectionModel.getSelectionPath(); - if (path == null) + TreePath[] paths = componentSelectionModel.getSelectionPaths(); + if (paths == null || paths.length == 0) return; - tree.scrollPathToVisible(path); + + for (TreePath path : paths) { + tree.scrollPathToVisible(path); + } if (!ComponentConfigDialog.isDialogVisible()) return; - RocketComponent c = (RocketComponent) path.getLastPathComponent(); + RocketComponent c = (RocketComponent) paths[0].getLastPathComponent(); + List listeners = new ArrayList<>(); + for (int i = 1; i < paths.length; i++) { + RocketComponent listener = (RocketComponent) paths[i].getLastPathComponent(); + if (listener.getClass().equals(c.getClass())) { + listeners.add((RocketComponent) paths[i].getLastPathComponent()); + } + } ComponentConfigDialog.showDialog(BasicFrame.this, - BasicFrame.this.document, c); + BasicFrame.this.document, c, listeners); } }); diff --git a/swing/src/net/sf/openrocket/gui/main/RocketActions.java b/swing/src/net/sf/openrocket/gui/main/RocketActions.java index 228fcc112..3da0af09e 100644 --- a/swing/src/net/sf/openrocket/gui/main/RocketActions.java +++ b/swing/src/net/sf/openrocket/gui/main/RocketActions.java @@ -790,11 +790,15 @@ public class RocketActions { if (!checkAllClassesEqual(components)) return; - for (int i = 1; i < components.size(); i++) { - components.get(0).addConfigListener(components.get(i)); - } + // Do nothing if the config dialog is already visible + if (ComponentConfigDialog.isDialogVisible()) + return; - ComponentConfigDialog.showDialog(parentFrame, document, components.get(0)); + List listeners = null; + if (components.size() > 1) { + listeners = components.subList(1, components.size()); + } + ComponentConfigDialog.showDialog(parentFrame, document, components.get(0), listeners); } @Override