From a0dbb942dfbd05a10d6c4d131ed8aabf0aa1a648 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Tue, 15 Nov 2022 04:16:24 +0100 Subject: [PATCH] [#1818] Update extension menu 'copy extension' after extension change --- .../simulation/SimulationOptionsPanel.java | 101 +++++++++++------- 1 file changed, 64 insertions(+), 37 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/simulation/SimulationOptionsPanel.java b/swing/src/net/sf/openrocket/gui/simulation/SimulationOptionsPanel.java index 0ee297b2b..b0ca3a4cc 100644 --- a/swing/src/net/sf/openrocket/gui/simulation/SimulationOptionsPanel.java +++ b/swing/src/net/sf/openrocket/gui/simulation/SimulationOptionsPanel.java @@ -60,6 +60,8 @@ class SimulationOptionsPanel extends JPanel { final Simulation simulation; private JPanel currentExtensions; + final JPopupMenu extensionMenu; + JMenu extensionMenuCopyExtension; SimulationOptionsPanel(OpenRocketDocument document, final Simulation simulation) { super(new MigLayout("fill")); @@ -195,10 +197,10 @@ class SimulationOptionsPanel extends JPanel { final JButton addExtension = new SelectColorButton(trans.get("simedtdlg.SimExt.add")); - final JPopupMenu menu = getExtensionMenu(); + this.extensionMenu = getExtensionMenu(); addExtension.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ev) { - menu.show(addExtension, 5, addExtension.getBounds().height); + extensionMenu.show(addExtension, 5, addExtension.getBounds().height); } }); sub.add(addExtension, "growx, wrap 0"); @@ -217,7 +219,8 @@ class SimulationOptionsPanel extends JPanel { }); JPopupMenu basemenu = new JPopupMenu(); - + + //// Use code / Launch conditions for (final SimulationExtensionProvider provider : extensions) { List ids = provider.getIds(); for (final String id : ids) { @@ -241,40 +244,58 @@ class SimulationOptionsPanel extends JPanel { } } } - - JMenu copyMenu = null; - for (Simulation sim : document.getSimulations()) { - if (!sim.getSimulationExtensions().isEmpty()) { - JMenu menu = new JMenu(sim.getName()); - for (final SimulationExtension ext : sim.getSimulationExtensions()) { - JMenuItem item = new JMenuItem(ext.getName()); - item.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent arg0) { - SimulationExtension e = ext.clone(); - simulation.getSimulationExtensions().add(e); - updateCurrentExtensions(); - SwingSimulationExtensionConfigurator configurator = findConfigurator(e); - if (configurator != null) { - configurator.configure(e, simulation, SwingUtilities.windowForComponent(SimulationOptionsPanel.this)); - } - } - }); - menu.add(item); - } - - if (copyMenu == null) { - copyMenu = new JMenu(trans.get("simedtdlg.SimExt.copyExtension")); - } - copyMenu.add(menu); - } - } - if (copyMenu != null) { - basemenu.add(copyMenu); - } + + //// Copy extension + updateExtensionMenuCopyExtension(basemenu); return basemenu; } + + /** + * Updates the contents of the "Copy extension" menu item in the extension menu. + * @param extensionMenu extension menu to add the "Copy extension" menu item to + */ + private void updateExtensionMenuCopyExtension(JPopupMenu extensionMenu) { + if (extensionMenu == null) { + return; + } + if (this.extensionMenuCopyExtension != null) { + extensionMenu.remove(this.extensionMenuCopyExtension); + } + + this.extensionMenuCopyExtension = null; + for (Simulation sim : document.getSimulations()) { + if (sim.getSimulationExtensions().isEmpty()) { + continue; + } + + JMenu menu = new JMenu(sim.getName()); + for (final SimulationExtension ext : sim.getSimulationExtensions()) { + JMenuItem item = new JMenuItem(ext.getName()); + item.addActionListener(new ActionListener() { + @Override + public void actionPerformed(ActionEvent arg0) { + SimulationExtension e = ext.clone(); + simulation.getSimulationExtensions().add(e); + updateCurrentExtensions(); + SwingSimulationExtensionConfigurator configurator = findConfigurator(e); + if (configurator != null) { + configurator.configure(e, simulation, SwingUtilities.windowForComponent(SimulationOptionsPanel.this)); + } + } + }); + menu.add(item); + } + + if (this.extensionMenuCopyExtension == null) { + this.extensionMenuCopyExtension = new JMenu(trans.get("simedtdlg.SimExt.copyExtension")); + } + this.extensionMenuCopyExtension.add(menu); + } + if (this.extensionMenuCopyExtension != null) { + extensionMenu.add(this.extensionMenuCopyExtension); + } + } private JComponent findMenu(MenuElement menu, List menuItems) { for (int i = 0; i < menuItems.size() - 1; i++) { @@ -312,6 +333,9 @@ class SimulationOptionsPanel extends JPanel { currentExtensions.add(new SimulationExtensionPanel(e), "growx, wrap"); } } + + updateExtensionMenuCopyExtension(this.extensionMenu); + // Both needed: this.revalidate(); this.repaint(); @@ -334,7 +358,8 @@ class SimulationOptionsPanel extends JPanel { JButton button; this.add(new JPanel(), "spanx, split, growx, right"); - + + // Configure if (findConfigurator(extension) != null) { button = new SelectColorButton(Icons.CONFIGURE); button.addActionListener(new ActionListener() { @@ -347,7 +372,8 @@ class SimulationOptionsPanel extends JPanel { }); this.add(button, "right"); } - + + // Help if (extension.getDescription() != null) { button = new SelectColorButton(Icons.HELP); button.addActionListener(new ActionListener() { @@ -374,7 +400,8 @@ class SimulationOptionsPanel extends JPanel { }); this.add(button, "right"); } - + + // Delete button = new SelectColorButton(Icons.EDIT_DELETE); button.addActionListener(new ActionListener() { @Override