From 1702a28d6273fecbab3ff5acda01d91f58973cba Mon Sep 17 00:00:00 2001 From: SiboVG Date: Wed, 2 Nov 2022 18:03:23 +0100 Subject: [PATCH 1/2] [#1781] Support multi-component parameter additions --- .../GeneralOptimizationDialog.java | 60 +++++++++++-------- 1 file changed, 34 insertions(+), 26 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/dialogs/optimization/GeneralOptimizationDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/optimization/GeneralOptimizationDialog.java index 59ce8c45a..f92b53d81 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/optimization/GeneralOptimizationDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/optimization/GeneralOptimizationDialog.java @@ -17,6 +17,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashMap; import java.util.LinkedList; import java.util.List; @@ -264,9 +265,9 @@ public class GeneralOptimizationDialog extends JDialog { addButton = new SelectColorButton(Chars.LEFT_ARROW + " " + trans.get("btn.add") + " "); addButton.setToolTipText(trans.get("btn.add.ttip")); addButton.addActionListener(e -> { - SimulationModifier mod = getSelectedAvailableModifier(); - if (mod != null) { - addModifier(mod); + List mods = getSelectedAvailableModifiers(); + if (mods.size() > 0) { + addModifiers(mods); clearHistory(); } else { log.error("Attempting to add simulation modifier when none is selected"); @@ -328,9 +329,9 @@ public class GeneralOptimizationDialog extends JDialog { @Override public void mousePressed(MouseEvent e) { if (e.getClickCount() == 2) { - SimulationModifier mod = getSelectedAvailableModifier(); - if (mod != null) { - addModifier(mod); + List mods = getSelectedAvailableModifiers(); + if (mods.size() == 1) { + addModifiers(mods); clearHistory(); } else { log.info(Markers.USER_MARKER, "Double-clicked non-available option"); @@ -1027,15 +1028,20 @@ public class GeneralOptimizationDialog extends JDialog { } - private void addModifier(SimulationModifier mod) { - if (!selectedModifiers.contains(mod)) { + private void addModifiers(List mods) { + if (mods == null || mods.size() == 0) { + return; + } + for (SimulationModifier mod : mods) { + if (selectedModifiers.contains(mod)) { + log.info(Markers.USER_MARKER, "Attempting to add an already existing simulation modifier " + mod); + continue; + } log.info(Markers.USER_MARKER, "Adding simulation modifier " + mod); selectedModifiers.add(mod); - selectedModifierTableModel.fireTableDataChanged(); - availableModifierTree.repaint(); - } else { - log.info(Markers.USER_MARKER, "Attempting to add an already existing simulation modifier " + mod); } + selectedModifierTableModel.fireTableDataChanged(); + availableModifierTree.repaint(); } private void removeModifier(SimulationModifier mod) { @@ -1069,8 +1075,8 @@ public class GeneralOptimizationDialog extends JDialog { } // "Add" button - SimulationModifier mod = getSelectedAvailableModifier(); - state = (mod != null && !selectedModifiers.contains(mod)); + List mods = getSelectedAvailableModifiers(); + state = (mods.size() > 0 && !new HashSet<>(selectedModifiers).containsAll(mods)); log.debug("addButton enabled: " + state); addButton.setEnabled(state); @@ -1122,9 +1128,9 @@ public class GeneralOptimizationDialog extends JDialog { } // Update description text - mod = getSelectedModifier(); - if (mod != null) { - selectedModifierDescription.setText(mod.getDescription()); + SimulationModifier selectedMod = getSelectedModifier(); + if (selectedMod != null) { + selectedModifierDescription.setText(selectedMod.getDescription()); } else { selectedModifierDescription.setText(""); } @@ -1221,18 +1227,20 @@ public class GeneralOptimizationDialog extends JDialog { } /** - * Return the currently selected available simulation modifier from the modifier tree, - * or null if none selected. + * Return the currently selected available simulation modifier from the modifier tree. */ - private SimulationModifier getSelectedAvailableModifier() { - TreePath treepath = availableModifierTree.getSelectionPath(); - if (treepath != null) { - Object o = ((DefaultMutableTreeNode) treepath.getLastPathComponent()).getUserObject(); - if (o instanceof SimulationModifier) { - return (SimulationModifier) o; + private List getSelectedAvailableModifiers() { + List result = new ArrayList<>(); + TreePath[] treepaths = availableModifierTree.getSelectionPaths(); + if (treepaths != null) { + for (TreePath treepath : treepaths) { + Object obj = ((DefaultMutableTreeNode) treepath.getLastPathComponent()).getUserObject(); + if (obj instanceof SimulationModifier) { + result.add((SimulationModifier) obj); + } } } - return null; + return result; } /** From 55bc26ab89c0a1c6a2cd646d1690fb59d78047be Mon Sep 17 00:00:00 2001 From: SiboVG Date: Wed, 2 Nov 2022 18:14:10 +0100 Subject: [PATCH 2/2] [#1781] Support multi-component parameter deletions --- .../GeneralOptimizationDialog.java | 43 +++++++++++-------- 1 file changed, 24 insertions(+), 19 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/dialogs/optimization/GeneralOptimizationDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/optimization/GeneralOptimizationDialog.java index f92b53d81..c963ae877 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/optimization/GeneralOptimizationDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/optimization/GeneralOptimizationDialog.java @@ -219,7 +219,7 @@ public class GeneralOptimizationDialog extends JDialog { selectedModifierTable.setDefaultRenderer(Double.class, new DoubleCellRenderer()); selectedModifierTable.setRowSelectionAllowed(true); selectedModifierTable.setColumnSelectionAllowed(false); - selectedModifierTable.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); + selectedModifierTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); // Make sure spinner editor fits into the cell height selectedModifierTable.setRowHeight(new JSpinner().getPreferredSize().height - 4); @@ -282,8 +282,8 @@ public class GeneralOptimizationDialog extends JDialog { removeButton = new SelectColorButton(" " + trans.get("btn.delete") + " " + Chars.RIGHT_ARROW); removeButton.setToolTipText(trans.get("btn.delete.ttip")); removeButton.addActionListener(e -> { - SimulationModifier mod = getSelectedModifier(); - if (mod == null) { + List mods = getSelectedModifiers(); + if (mods.size() == 0) { log.error("Attempting to remove simulation modifier when none is selected"); return; } @@ -292,7 +292,7 @@ public class GeneralOptimizationDialog extends JDialog { selectedModifierTable.getCellEditor().stopCellEditing(); } - removeModifier(mod); + removeModifiers(mods); clearHistory(); }); disableComponents.add(removeButton); @@ -1044,9 +1044,14 @@ public class GeneralOptimizationDialog extends JDialog { availableModifierTree.repaint(); } - private void removeModifier(SimulationModifier mod) { - log.info(Markers.USER_MARKER, "Removing simulation modifier " + mod); - selectedModifiers.remove(mod); + private void removeModifiers(List mods) { + if (mods == null || mods.size() == 0) { + return; + } + log.info(Markers.USER_MARKER, "Removing simulation modifiers " + mods); + for (SimulationModifier mod : mods) { + selectedModifiers.remove(mod); + } selectedModifierTableModel.fireTableDataChanged(); availableModifierTree.repaint(); } @@ -1128,9 +1133,9 @@ public class GeneralOptimizationDialog extends JDialog { } // Update description text - SimulationModifier selectedMod = getSelectedModifier(); - if (selectedMod != null) { - selectedModifierDescription.setText(selectedMod.getDescription()); + List selectedMods = getSelectedModifiers(); + if (selectedMods.size() == 1) { + selectedModifierDescription.setText(selectedMods.get(0).getDescription()); } else { selectedModifierDescription.setText(""); } @@ -1265,17 +1270,17 @@ public class GeneralOptimizationDialog extends JDialog { } /** - * Return the currently selected simulation modifier from the table, - * or null if none selected. - * @return the selected modifier or null. + * Return the currently selected simulation modifiers from the table. + * @return the selected modifier. */ - private SimulationModifier getSelectedModifier() { - int row = selectedModifierTable.getSelectedRow(); - if (row < 0) { - return null; + private List getSelectedModifiers() { + List result = new ArrayList<>(); + int[] rows = selectedModifierTable.getSelectedRows(); + for (int row : rows) { + int idx = selectedModifierTable.convertRowIndexToModel(row); + result.add(selectedModifiers.get(idx)); } - row = selectedModifierTable.convertRowIndexToModel(row); - return selectedModifiers.get(row); + return result; } /**