diff --git a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java index ee9b99b6f..1cd414091 100644 --- a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java +++ b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java @@ -1694,6 +1694,11 @@ public class BasicFrame extends JFrame { this.selectionModel.setSelectedComponent(component); } + public void setSelectedComponents(List components) { + this.selectionModel.setSelectedComponents(components); + } + + public void stateChanged(ChangeEvent e) { JTabbedPane tabSource = (JTabbedPane) e.getSource(); int tab = tabSource.getSelectedIndex(); diff --git a/swing/src/net/sf/openrocket/gui/main/DocumentSelectionModel.java b/swing/src/net/sf/openrocket/gui/main/DocumentSelectionModel.java index 409620cb9..e69997c36 100644 --- a/swing/src/net/sf/openrocket/gui/main/DocumentSelectionModel.java +++ b/swing/src/net/sf/openrocket/gui/main/DocumentSelectionModel.java @@ -2,6 +2,7 @@ package net.sf.openrocket.gui.main; import java.util.ArrayList; import java.util.Arrays; +import java.util.LinkedList; import java.util.List; import javax.swing.ListSelectionModel; @@ -29,7 +30,7 @@ public class DocumentSelectionModel { private final OpenRocketDocument document; - private RocketComponent componentSelection = null; + private final List componentSelection = new LinkedList<>(); private Simulation[] simulationSelection = NO_SIMULATION; private TreeSelectionModel componentTreeSelectionModel = null; @@ -72,23 +73,33 @@ public class DocumentSelectionModel { /** * Return the currently selected rocket component. Returns null - * if no rocket component is selected. + * if no rocket component is selected. If there is more than one component selected, + * the first selected component is returned. * * @return the currently selected rocket component, or null. */ public RocketComponent getSelectedComponent() { - return componentSelection; + if (componentSelection == null || componentSelection.size() == 0) return null; + return componentSelection.get(0); } public void setSelectedComponent(RocketComponent component) { - componentSelection = component; + componentSelection.clear(); + componentSelection.add(component); clearSimulationSelection(); TreePath path = ComponentTreeModel.makeTreePath(component); componentTreeSelectionModel.setSelectionPath(path); } + public void setSelectedComponents(List components) { + componentSelection.clear(); + componentSelection.addAll(components); + clearSimulationSelection(); + List paths = ComponentTreeModel.makeTreePaths(components); + componentTreeSelectionModel.setSelectionPaths(paths.toArray(new TreePath[0])); + } @@ -131,10 +142,10 @@ public class DocumentSelectionModel { public void clearComponentSelection() { - if (componentSelection == null) + if (componentSelection == null || componentSelection.size() == 0) return; - componentSelection = null; + componentSelection.clear(); if (componentTreeSelectionModel != null) componentTreeSelectionModel.clearSelection(); @@ -168,12 +179,13 @@ public class DocumentSelectionModel { public void valueChanged(TreeSelectionEvent e) { TreePath path = componentTreeSelectionModel.getSelectionPath(); if (path == null) { - componentSelection = null; + componentSelection.clear(); fireDocumentSelection(DocumentSelectionListener.COMPONENT_SELECTION_CHANGE); return; } - - componentSelection = (RocketComponent)path.getLastPathComponent(); + + componentSelection.clear(); + componentSelection.add((RocketComponent)path.getLastPathComponent()); clearSimulationSelection(); fireDocumentSelection(DocumentSelectionListener.COMPONENT_SELECTION_CHANGE); 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 b8a602869..b71c93c59 100644 --- a/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeModel.java +++ b/swing/src/net/sf/openrocket/gui/main/componenttree/ComponentTreeModel.java @@ -199,6 +199,21 @@ public class ComponentTreeModel implements TreeModel, ComponentChangeListener { return new TreePath(list.toArray()); } + + /** + * Return TreePaths corresponding to the specified rocket components. + * + * @param components the rocket components + * @return a list of TreePaths corresponding to the different RocketComponents (one path for each component) + */ + public static List makeTreePaths(List components) { + List result = new LinkedList<>(); + + for (RocketComponent component : components) { + result.add(makeTreePath(component)); + } + return result; + } /** diff --git a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurationPanel.java b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurationPanel.java index a14390d16..ce1a3115e 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurationPanel.java @@ -297,6 +297,10 @@ public class FlightConfigurationPanel extends JPanel implements StateChangeListe this.basicFrame.setSelectedComponent(component); } + public void setSelectedComponents(List components) { + this.basicFrame.setSelectedComponents(components); + } + @Override public void stateChanged(EventObject e) { updateButtonState(); diff --git a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/MotorConfigurationPanel.java b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/MotorConfigurationPanel.java index 81d3e1df0..b96d05cd3 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/MotorConfigurationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/MotorConfigurationPanel.java @@ -45,6 +45,7 @@ import net.sf.openrocket.rocketcomponent.MotorMount; import net.sf.openrocket.rocketcomponent.Rocket; import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.unit.UnitGroup; +import net.sf.openrocket.util.ArrayList; import net.sf.openrocket.util.Chars; @SuppressWarnings("serial") @@ -237,10 +238,16 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel if (e.getValueIsAdjusting()) { return; } - MotorMount mount = getSelectedComponent(); - if (mount instanceof RocketComponent) { - flightConfigurationPanel.setSelectedComponent((RocketComponent) mount); + List mounts = getSelectedComponents(); + if (mounts == null || mounts.size() == 0) return; + List components = new ArrayList<>(); + for (MotorMount mount : mounts) { + if (mount instanceof RocketComponent) { + components.add((RocketComponent) mount); + } } + + flightConfigurationPanel.setSelectedComponents(components); } protected void updateButtonState() {