From a210661ccde1f108b5b17d1583b3cd8d788dfeb6 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Sat, 30 Jul 2022 02:46:38 +0200 Subject: [PATCH] Synchronize table selection across motors, recovery & stage --- .../gui/main/FlightConfigurationPanel.java | 29 +++++++++++++++---- .../FlightConfigurablePanel.java | 25 +++++++++++++++- 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/main/FlightConfigurationPanel.java b/swing/src/net/sf/openrocket/gui/main/FlightConfigurationPanel.java index 60f0372d7..393a2f224 100644 --- a/swing/src/net/sf/openrocket/gui/main/FlightConfigurationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/FlightConfigurationPanel.java @@ -20,6 +20,7 @@ import net.miginfocom.swing.MigLayout; import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.document.Simulation; import net.sf.openrocket.gui.dialogs.flightconfiguration.RenameConfigDialog; +import net.sf.openrocket.gui.main.flightconfigpanel.FlightConfigurablePanel; import net.sf.openrocket.gui.main.flightconfigpanel.MotorConfigurationPanel; import net.sf.openrocket.gui.main.flightconfigpanel.RecoveryConfigurationPanel; import net.sf.openrocket.gui.main.flightconfigpanel.SeparationConfigurationPanel; @@ -113,23 +114,29 @@ public class FlightConfigurationPanel extends JPanel implements StateChangeListe this.add(duplicateConfButton, "wrap"); tabs.addChangeListener(new ChangeListener() { + private FlightConfigurablePanel previousPanel = null; @Override public void stateChanged(ChangeEvent e) { // Trigger a selection of the motor/recovery/configuration item + FlightConfigurablePanel panel = null; switch (tabs.getSelectedIndex()) { case MOTOR_TAB_INDEX: - motorConfigurationPanel.updateButtonState(); - motorConfigurationPanel.takeTheSpotlight(); + panel = motorConfigurationPanel; break; case RECOVERY_TAB_INDEX: - recoveryConfigurationPanel.updateButtonState(); - motorConfigurationPanel.takeTheSpotlight(); + panel = recoveryConfigurationPanel; break; case SEPARATION_TAB_INDEX: - separationConfigurationPanel.updateButtonState(); - motorConfigurationPanel.takeTheSpotlight(); + panel = separationConfigurationPanel; break; } + + // Update the panel selection, focus, and button state + if (panel == null) return; + synchronizePanelSelection(previousPanel, panel); + panel.updateButtonState(); + panel.takeTheSpotlight(); + previousPanel = panel; } }); @@ -300,6 +307,16 @@ public class FlightConfigurationPanel extends JPanel implements StateChangeListe } + private void synchronizePanelSelection(FlightConfigurablePanel source, FlightConfigurablePanel target) { + if (source == null || target == null) return; + List fids = source.getSelectedConfigurationIds(); + if (fids == null || fids.isEmpty()) { + target.clearSelection(); + } else { + target.setSelectedConfigurationIds(fids); + } + } + private List getSelectedConfigurationIds() { switch (tabs.getSelectedIndex()) { case MOTOR_TAB_INDEX: diff --git a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurablePanel.java b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurablePanel.java index d6677e0e0..160490d1d 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurablePanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurablePanel.java @@ -175,7 +175,7 @@ public abstract class FlightConfigurablePanel fids) { + if (fids == null || fids.isEmpty() || table.getColumnCount() == 0) return; + + for (FlightConfigurationId id : fids) { + if (id == FlightConfigurationId.DEFAULT_VALUE_FCID) continue; + for (int rowNum = 0; rowNum < table.getRowCount(); rowNum++) { + FlightConfigurationId rowFCID = rocket.getId(rowNum ); + if (rowFCID.equals(id) && !table.isRowSelected(rowNum)) { + table.changeSelection(rowNum, 1, false, false); + } + } + } + } + protected abstract class FlightConfigurableCellRenderer extends DefaultTableCellRenderer { @Override