From 1f91e28bb25c41088ad26139d13c92f99bb56406 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Mon, 30 May 2022 00:33:24 +0200 Subject: [PATCH 01/39] Remove unused imports --- swing/src/net/sf/openrocket/gui/main/SimulationPanel.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java b/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java index 05c7b04ff..20130cb1f 100644 --- a/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java @@ -6,8 +6,6 @@ import java.awt.Component; import java.awt.Toolkit; import java.awt.datatransfer.Clipboard; import java.awt.datatransfer.DataFlavor; -import java.awt.datatransfer.FlavorEvent; -import java.awt.datatransfer.FlavorListener; import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.Transferable; import java.awt.datatransfer.UnsupportedFlavorException; @@ -21,12 +19,10 @@ import java.util.Arrays; import java.util.Comparator; import javax.swing.AbstractAction; -import javax.swing.Action; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComponent; import javax.swing.JLabel; -import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JPopupMenu; @@ -38,7 +34,6 @@ import javax.swing.SwingUtilities; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import javax.swing.table.DefaultTableCellRenderer; -import javax.swing.text.DefaultEditorKit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; From 3b6f9144963a23c32cd39c0b78f068937dc7bdf5 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Mon, 30 May 2022 13:17:59 +0200 Subject: [PATCH 02/39] Implement more right-click actions in simulation table --- core/resources/l10n/messages.properties | 5 + .../openrocket/gui/main/SimulationPanel.java | 347 +++++++++++------- 2 files changed, 221 insertions(+), 131 deletions(-) diff --git a/core/resources/l10n/messages.properties b/core/resources/l10n/messages.properties index 3366c7044..521279b03 100644 --- a/core/resources/l10n/messages.properties +++ b/core/resources/l10n/messages.properties @@ -485,6 +485,11 @@ simpanel.but.ttip.newsimulation = Add a new simulation simpanel.but.ttip.editsim = Edit the selected simulation simpanel.but.ttip.runsimu = Re-run the selected simulations simpanel.but.ttip.deletesim = Delete the selected simulations +simpanel.pop.edit = Edit +simpanel.pop.plot = Plot / Export +simpanel.pop.run = Run +simpanel.pop.delete = Delete +simpanel.pop.duplicate = Duplicate simpanel.checkbox.donotask = Do not ask me again simpanel.lbl.defpref = You can change the default operation in the preferences. simpanel.dlg.lbl.DeleteSim1 = Delete the selected simulations? diff --git a/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java b/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java index 20130cb1f..a2a346caa 100644 --- a/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java @@ -15,6 +15,7 @@ import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.IOException; +import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; @@ -137,17 +138,7 @@ public class SimulationPanel extends JPanel { editButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - int[] selection = simulationTable.getSelectedRows(); - if (selection.length == 0) { - return; - } - - Simulation[] sims = new Simulation[selection.length]; - for (int i = 0; i < selection.length; i++) { - selection[i] = simulationTable.convertRowIndexToModel(selection[i]); - sims[i] = document.getSimulation(selection[i]); - } - openDialog(false, sims); + editSimulationAction(); } }); this.add(editButton, "gapright para"); @@ -159,21 +150,7 @@ public class SimulationPanel extends JPanel { runButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - int[] selection = simulationTable.getSelectedRows(); - if (selection.length == 0) { - return; - } - Simulation[] sims = new Simulation[selection.length]; - for (int i = 0; i < selection.length; i++) { - selection[i] = simulationTable.convertRowIndexToModel(selection[i]); - sims[i] = document.getSimulation(selection[i]); - } - - long t = System.currentTimeMillis(); - new SimulationRunDialog(SwingUtilities.getWindowAncestor( - SimulationPanel.this), document, sims).setVisible(true); - log.info("Running simulations took " + (System.currentTimeMillis() - t) + " ms"); - fireMaintainSelection(); + runSimulationAction(); } }); this.add(runButton, "gapright para"); @@ -185,50 +162,7 @@ public class SimulationPanel extends JPanel { deleteButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - int[] selection = simulationTable.getSelectedRows(); - if (selection.length == 0) { - return; - } - // Verify deletion - boolean verify = Application.getPreferences().getBoolean(Preferences.CONFIRM_DELETE_SIMULATION, true); - if (verify) { - - JPanel panel = new JPanel(new MigLayout()); - //// Do not ask me again - JCheckBox dontAsk = new JCheckBox(trans.get("simpanel.checkbox.donotask")); - panel.add(dontAsk, "wrap"); - //// You can change the default operation in the preferences. - panel.add(new StyledLabel(trans.get("simpanel.lbl.defpref"), -2)); - - int ret = JOptionPane.showConfirmDialog(SimulationPanel.this, - new Object[] { - //// Delete the selected simulations? - trans.get("simpanel.dlg.lbl.DeleteSim1"), - //// This operation cannot be undone. - trans.get("simpanel.dlg.lbl.DeleteSim2"), - "", - panel }, - //// Delete simulations - trans.get("simpanel.dlg.lbl.DeleteSim3"), - JOptionPane.OK_CANCEL_OPTION, - JOptionPane.WARNING_MESSAGE); - if (ret != JOptionPane.OK_OPTION) - return; - - if (dontAsk.isSelected()) { - Application.getPreferences().putBoolean(Preferences.CONFIRM_DELETE_SIMULATION, false); - } - } - - // Delete simulations - for (int i = 0; i < selection.length; i++) { - selection[i] = simulationTable.convertRowIndexToModel(selection[i]); - } - Arrays.sort(selection); - for (int i = selection.length - 1; i >= 0; i--) { - document.removeSimulation(selection[i]); - } - simulationTableModel.fireTableDataChanged(); + deleteSimulationAction(); } }); this.add(deleteButton, "gapright para"); @@ -239,26 +173,7 @@ public class SimulationPanel extends JPanel { plotButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - int selected = simulationTable.getSelectedRow(); - if (selected < 0) { - return; - } - selected = simulationTable.convertRowIndexToModel(selected); - simulationTable.clearSelection(); - simulationTable.addRowSelectionInterval(selected, selected); - - - Simulation sim = document.getSimulations().get(selected); - - if (!sim.hasSimulationData()) { - new SimulationRunDialog(SwingUtilities.getWindowAncestor( - SimulationPanel.this), document, sim).setVisible(true); - } - - fireMaintainSelection(); - - openDialog(true, sim); - + plotSimulationAction(); } }); this.add(plotButton, "wrap para"); @@ -537,7 +452,13 @@ public class SimulationPanel extends JPanel { simulationTableModel.setColumnWidths(simulationTable.getColumnModel()); pm = new JPopupMenu(); - pm.add(new CopyAction(simulationTable)); + pm.add(new EditSimulationAction()); + pm.add(new DuplicateSimulationAction()); + pm.add(new DeleteSimulationAction()); + pm.addSeparator(); + pm.add(new RunSimulationAction()); + pm.add(new PlotSimulationAction()); + // Mouse listener to act on double-clicks simulationTable.addMouseListener(new MouseAdapter() { @@ -561,6 +482,10 @@ public class SimulationPanel extends JPanel { openDialog(document.getSimulations().get(selected)); } } else if (e.getButton() == MouseEvent.BUTTON3 && e.getClickCount() == 1){ + int selectedRow = simulationTable.getSelectedRow(); + if (selectedRow < 0) { + return; + } doPopup(e); } } @@ -603,6 +528,159 @@ public class SimulationPanel extends JPanel { updateButtonStates(); } + private void plotSimulationAction() { + int selected = simulationTable.getSelectedRow(); + if (selected < 0) { + return; + } + selected = simulationTable.convertRowIndexToModel(selected); + simulationTable.clearSelection(); + simulationTable.addRowSelectionInterval(selected, selected); + + + Simulation sim = document.getSimulations().get(selected); + + if (!sim.hasSimulationData()) { + new SimulationRunDialog(SwingUtilities.getWindowAncestor( + SimulationPanel.this), document, sim).setVisible(true); + } + + fireMaintainSelection(); + + openDialog(true, sim); + } + + private void deleteSimulationAction() { + int[] selection = simulationTable.getSelectedRows(); + if (selection.length == 0) { + return; + } + // Verify deletion + boolean verify = Application.getPreferences().getBoolean(Preferences.CONFIRM_DELETE_SIMULATION, true); + if (verify) { + + JPanel panel = new JPanel(new MigLayout()); + //// Do not ask me again + JCheckBox dontAsk = new JCheckBox(trans.get("simpanel.checkbox.donotask")); + panel.add(dontAsk, "wrap"); + //// You can change the default operation in the preferences. + panel.add(new StyledLabel(trans.get("simpanel.lbl.defpref"), -2)); + + int ret = JOptionPane.showConfirmDialog(SimulationPanel.this, + new Object[] { + //// Delete the selected simulations? + trans.get("simpanel.dlg.lbl.DeleteSim1"), + //// This operation cannot be undone. + trans.get("simpanel.dlg.lbl.DeleteSim2"), + "", + panel }, + //// Delete simulations + trans.get("simpanel.dlg.lbl.DeleteSim3"), + JOptionPane.OK_CANCEL_OPTION, + JOptionPane.WARNING_MESSAGE); + if (ret != JOptionPane.OK_OPTION) + return; + + if (dontAsk.isSelected()) { + Application.getPreferences().putBoolean(Preferences.CONFIRM_DELETE_SIMULATION, false); + } + } + + // Delete simulations + for (int i = 0; i < selection.length; i++) { + selection[i] = simulationTable.convertRowIndexToModel(selection[i]); + } + Arrays.sort(selection); + for (int i = selection.length - 1; i >= 0; i--) { + document.removeSimulation(selection[i]); + } + simulationTableModel.fireTableDataChanged(); + } + + private void runSimulationAction() { + Simulation[] sims = getSelectedSimulations(); + if (sims == null) return; + + long t = System.currentTimeMillis(); + new SimulationRunDialog(SwingUtilities.getWindowAncestor( + SimulationPanel.this), document, sims).setVisible(true); + log.info("Running simulations took " + (System.currentTimeMillis() - t) + " ms"); + fireMaintainSelection(); + } + + private void editSimulationAction() { + Simulation[] sims = getSelectedSimulations(); + if (sims == null) return; + + openDialog(false, sims); + } + + private Simulation[] getSelectedSimulations() { + int[] selection = simulationTable.getSelectedRows(); + if (selection.length == 0) { + return null; + } + + Simulation[] sims = new Simulation[selection.length]; + for (int i = 0; i < selection.length; i++) { + selection[i] = simulationTable.convertRowIndexToModel(selection[i]); + sims[i] = document.getSimulation(selection[i]); + } + return sims; + } + + + private void copySimulationAction() { + int numCols=simulationTable.getColumnCount(); + int numRows=simulationTable.getSelectedRowCount(); + int[] rowsSelected=simulationTable.getSelectedRows(); + + if (numRows!=rowsSelected[rowsSelected.length-1]-rowsSelected[0]+1 || numRows!=rowsSelected.length) { + + JOptionPane.showMessageDialog(null, "Invalid Copy Selection", "Invalid Copy Selection", JOptionPane.ERROR_MESSAGE); + return; + } + + StringBuilder excelStr =new StringBuilder(); + for (int k = 1; k < numCols; k++) { + excelStr.append(simulationTable.getColumnName(k)); + if (k < numCols-1) { + excelStr.append("\t"); + } + } + excelStr.append("\n"); + for (int i = 0; i < numRows; i++) { + for (int j = 1; j < numCols; j++) { + excelStr.append(simulationTable.getValueAt(rowsSelected[i], j)); + if (j < numCols-1) { + excelStr.append("\t"); + } + } + excelStr.append("\n"); + } + + StringSelection sel = new StringSelection(excelStr.toString()); + + Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard(); + cb.setContents(sel, sel); + } + + private void duplicateSimulationAction() { + Simulation[] sims = getSelectedSimulations(); + if (sims == null) return; + + for (Simulation s: sims) { + Simulation copy = s.duplicateSimulation(document.getRocket()); + String name = copy.getName(); + if (name.matches(OpenRocketDocument.SIMULATION_NAME_PREFIX + "[0-9]+ *")) { + copy.setName(document.getNextSimulationName()); + } + document.addSimulation(copy); + } + simulationTable.getSelectionModel().setSelectionInterval(simulationTable.getRowCount()-sims.length,simulationTable.getRowCount()-1); + + } + protected void doPopup(MouseEvent e) { pm.show(e.getComponent(), e.getX(), e.getY()); } @@ -695,53 +773,60 @@ public class SimulationPanel extends JPanel { simulationTable.addRowSelectionInterval(row, row); } } - - class CopyAction extends AbstractAction { - private JTable table; + class EditSimulationAction extends AbstractAction { + public EditSimulationAction() { + putValue(NAME, trans.get("simpanel.pop.edit")); + } - public CopyAction(JTable table) { - this.table = table; - putValue(NAME, "Copy"); + @Override + public void actionPerformed(ActionEvent e) { + editSimulationAction(); + } + } + + class RunSimulationAction extends AbstractAction { + public RunSimulationAction() { + putValue(NAME, trans.get("simpanel.pop.run")); + } + + @Override + public void actionPerformed(ActionEvent e) { + runSimulationAction(); + } + } + + class DeleteSimulationAction extends AbstractAction { + public DeleteSimulationAction() { + putValue(NAME, trans.get("simpanel.pop.delete")); + } + + @Override + public void actionPerformed(ActionEvent e) { + deleteSimulationAction(); + } + } + + class PlotSimulationAction extends AbstractAction { + public PlotSimulationAction() { + putValue(NAME, trans.get("simpanel.pop.plot")); + } + + @Override + public void actionPerformed(ActionEvent e) { + plotSimulationAction(); + } + } + + class DuplicateSimulationAction extends AbstractAction { + public DuplicateSimulationAction() { + putValue(NAME, trans.get("simpanel.pop.duplicate")); } @Override public void actionPerformed(ActionEvent e) { - - int numCols=table.getColumnCount(); - int numRows=table.getSelectedRowCount(); - int[] rowsSelected=table.getSelectedRows(); - - if (numRows!=rowsSelected[rowsSelected.length-1]-rowsSelected[0]+1 || numRows!=rowsSelected.length ) { - - JOptionPane.showMessageDialog(null, "Invalid Copy Selection", "Invalid Copy Selection", JOptionPane.ERROR_MESSAGE); - return; - } - - StringBuffer excelStr=new StringBuffer(); - for (int k=1; k Date: Mon, 30 May 2022 14:56:19 +0200 Subject: [PATCH 03/39] Fix ttip text on copy action --- swing/src/net/sf/openrocket/gui/main/RocketActions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swing/src/net/sf/openrocket/gui/main/RocketActions.java b/swing/src/net/sf/openrocket/gui/main/RocketActions.java index d945d653d..77f19a41d 100644 --- a/swing/src/net/sf/openrocket/gui/main/RocketActions.java +++ b/swing/src/net/sf/openrocket/gui/main/RocketActions.java @@ -646,7 +646,7 @@ public class RocketActions { this.putValue(MNEMONIC_KEY, KeyEvent.VK_C); this.putValue(ACCELERATOR_KEY, COPY_KEY_STROKE); //// Copy this component (and subcomponents) to the clipboard. - this.putValue(SHORT_DESCRIPTION, trans.get("RocketActions.CopyAct.Copy")); + this.putValue(SHORT_DESCRIPTION, trans.get("RocketActions.CopyAct.ttip.Copy")); this.putValue(SMALL_ICON, Icons.EDIT_COPY); clipboardChanged(); } From 5d80a3a167cd20d266ba4e73745aba47ae1dea79 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Mon, 30 May 2022 15:05:06 +0200 Subject: [PATCH 04/39] Clean up on aisle 5 --- .../sf/openrocket/gui/main/SimulationPanel.java | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java b/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java index a2a346caa..15f775d3b 100644 --- a/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java @@ -464,11 +464,12 @@ public class SimulationPanel extends JPanel { simulationTable.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { + int selectedRow = simulationTable.getSelectedRow(); + if (selectedRow < 0) { + return; + } + if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 2) { - int selectedRow = simulationTable.getSelectedRow(); - if (selectedRow < 0) { - return; - } int selected = simulationTable.convertRowIndexToModel(selectedRow); int column = simulationTable.columnAtPoint(e.getPoint()); @@ -481,11 +482,7 @@ public class SimulationPanel extends JPanel { openDialog(document.getSimulations().get(selected)); } - } else if (e.getButton() == MouseEvent.BUTTON3 && e.getClickCount() == 1){ - int selectedRow = simulationTable.getSelectedRow(); - if (selectedRow < 0) { - return; - } + } else if (e.getButton() == MouseEvent.BUTTON3 && e.getClickCount() == 1) { doPopup(e); } } From b4c56163e54189910db27064e716489cc47b1492 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Mon, 30 May 2022 20:39:39 +0200 Subject: [PATCH 05/39] Add right-click actions to componentTree --- core/resources/l10n/messages.properties | 2 + core/resources/pix/icons/edit-copy.png | Bin 730 -> 1895 bytes core/resources/pix/icons/edit-duplicate.png | Bin 0 -> 2195 bytes core/resources/pix/icons/edit-edit.png | Bin 0 -> 4438 bytes .../gui/figure3d/photo/PhotoFrame.java | 2 +- .../sf/openrocket/gui/main/BasicFrame.java | 34 +++++- .../sf/openrocket/gui/main/RocketActions.java | 107 ++++++++++++++++-- .../src/net/sf/openrocket/gui/util/Icons.java | 2 + 8 files changed, 133 insertions(+), 14 deletions(-) create mode 100644 core/resources/pix/icons/edit-duplicate.png create mode 100644 core/resources/pix/icons/edit-edit.png diff --git a/core/resources/l10n/messages.properties b/core/resources/l10n/messages.properties index 521279b03..cd4eb8f97 100644 --- a/core/resources/l10n/messages.properties +++ b/core/resources/l10n/messages.properties @@ -33,6 +33,8 @@ RocketActions.CopyAct.Copy = Copy RocketActions.CopyAct.ttip.Copy = Copy this component (and subcomponents) to the clipboard. RocketActions.PasteAct.Paste = Paste RocketActions.PasteAct.ttip.Paste = Paste the component or simulation on the clipboard to the design. +RocketActions.DuplicateAct.Duplicate = Duplicate +RocketActions.DuplicateAct.ttip.Duplicate = Duplicate this component (and subcomponents). RocketActions.EditAct.Edit = Edit RocketActions.EditAct.ttip.Edit = Edit the selected component. RocketActions.NewStageAct.Newstage = New stage diff --git a/core/resources/pix/icons/edit-copy.png b/core/resources/pix/icons/edit-copy.png index b7c938a999b0e8490cf7d69ed9a6fd42ad580731..28ac512bdab4c217db61f816485cb4224b6b5c32 100644 GIT binary patch literal 1895 zcmbVN3v3f*9KXF}56}UdcEi~7mcd}O_h@VBK?mJh=%yXBG}+`axm~aA(f00kcUvD5 z*rsHR23Mzv*6J&n3brlW1xa97>yZe2= z|Nr-YU28@8ym9Hd=@0~sE45pl;GU_RsZW8cdSHkGw=}{2ngl@^6O}Uo+PGN-LCFKG zt4gkNyh74^P)oV_8b%uq3IGj3vu1|{iuN-yT*G)-&W!xn*@eKY+l*8i9GF8WVSKDT zDl!YAdPRbi)urd-YvVzR=9IP->HGG|H zMu4v)B7#DkmXl(E0wF`glz`$|Oc6B^{ z|AspL`A-Hwa2<}gjmP>D48~1JvaKG-hy~=aXvq~37}Uu~e4R)$wtC=Zo}xw|OGJi} zdC|r5fzeb|jJgaHIxPVgI4GLs6cJM&*}_;UnK2_EZ-fTJH9Fjdn@EG6)DwjmPGZ;y z)WN%1PvlXkL8HSIsNO{4`a+EO0}9Hy+G%?sxys{qsc@bQcwPVjiXEl%gQ*tOU{(iS@(+rZ%<;u<&plkQA-d zw;7?8#4>Iq_L_a-2#nB%d<-D{hjfp?B;F&3D3P&vLA3ruL7~8XRO!VLCFoy84u5;3 zZ%5%^7%0p590CvVNyczse2HLA{hW5}9t0)kmRc>Y8Eb>@zwFPlWUcDjedpGOThq} zAT8~O_kLM+VN7P_B;A2a+VZnkk4D@3OST=p-*O=Z@k9GB-o4dh+%kP%?WfgKQUhFz zHsfM{cXv}D{QAo5#@~{L2Gw78ww(QbQ*sl$w4Jsr)PBDBCVo5R6G%J9)uf)et~aB) zyD)X>p7ptN7Dw4Pvx(ECM-vk}7Oe2D@jaY;dGEG+&TBsuCp;@8W;J|qCK7t@o3=D@ zL0a3fH+;|EpEh{-_LcOqHs{*<@x50g zO|4@Kd-iPn_2Pm0yzSZ{qZ6{iKKwa<~S4F<=4z zVFV)s12Ypd(~(n`&I1Gx3j;{)k6#RIe0)x2@t#tiMluYp!5HKmQ@@KR{(%91K9a|NjLDAeR3i=d-dg{`>j+$M3&?feQbl z>ShFCMuy)&;lCgZG6;x&gA4|$1qdJ(9&XM$5nf(PW=1BN17~h9ym;}P;TO~;VB3If z2NM+rBMn)GUw^+KhWvvX_Tk%q27mx!i3@P7s!Vcc{{yuB|C$p~?=gLR1VV)$P~kcZ*^^S2B? zfB#`%VPS`B24NHz|X1w}JZ@E24Ohz(Nl0~mT=e*Fjgn*r*77zPOe1P}|d%^+L>t7FHH!W{?67E}#uSL1vIGKu0k_qmh-9je(hsje&!kje!vu z28@3o26J!%*+9Jj0mQQ7=*5Rgf0)!jSs0i(AUjTDfaP!|hIb!7GdzF&k>Sz%KR{cV o!Q%gc;l>C|`)5v`y9W?p03+98#-LdpAOHXW07*qoM6N<$f@qU0RR910 diff --git a/core/resources/pix/icons/edit-duplicate.png b/core/resources/pix/icons/edit-duplicate.png new file mode 100644 index 0000000000000000000000000000000000000000..c0211635793661ad6d11cde079a65465221dc27e GIT binary patch literal 2195 zcmbVM3s4kg9A8ls-*7LvXHq(3!2m&=TdMDwsH~~WpMJa+JagxGGBSw)dWn@Vs8ai}P&o8*xEZd7AHTY!Jc~n(q zaXb(R=mWG~^1E@8VHljCaEihp0#l~@R4$15l!O)r8&G(^D6696Lp4UuDHW(z9rW59 zgjWvJ`jk+jV9M|yC*!1^(1L0L3VawR7x?p=#04G)`M?W&ssgcO7%O`uRZ=|CBdEil z{~-XAYqy6r9_q#G4NE9$Y9S0Gl#qv_6~}ZL;8{SC3j91sErd1`v}j~D#Sb`D@;f9c zzok^;S}da!t*6i-c8(W)S`dk?wg4Na0;>+zjlu{Lqe%zJuto!GpppoZC5UFIT@pms z^wv-#MiUN-U@3;B%}E6H01Dei;8gBE!2-{^B)^w~A&Xwl4RG1#)}i4Gd#Fv?8Qn1KdPj59e6n1$htW&xZw zriE7dBHGjyEXQlzZq@NxnSr1Sy%rymk0(+N?GJbWBz;Wro7EM`r3N@ZNOr^AJwbcn zkFu|Dg^xG?WW{WD)!O_++wuRI52c3pa6UJH0~FV3;o#b!X)X-@@0vAzYc-Tw;BeAu z%kYqe58*Kle304?hj8Rdxd=fb#B^J-!?MJ?+@9umsn5K1uhlQ3&mMWl@afK|$k|mR zd#op-6OWsUPM{+rx2C4H(?=x9bsNx$3vD*X2~RfHx$Pn~yR7W|r46e+T;$bS3w?d9 zGU2=DmroebufFom#XpB#Vy;g(+GpG5$>YzgU0OY>`>MWEp93ElZXTcG?!2n(i)Ajq zzv6tGTg8(BcsJ) zV#5Mcp#Py$Oj&8h`trQW#ceuoYTt2)x0Wd@xcf(4?4CRKFMgYlvM{@?wem(!Fmuuv zYS;U=zEPVtY%G6w&%9R~MrBQ`$5Z0cK$pYiSF3l{FI|88-uyKq60=SmJeDyR8;TT1 z&&<4k`J3M&yj{=iYm6agn!lFU)zmDG7`XVe@|hbmR=md|jysJftz<0!)wOo~)i`AG z>&KN}UGWzN_Zx_p=6RzGKlV&<5w&^P|`jq|5bhd%JS-C z`BQEtUM|1N?m-rm7J)-&quZgq&gu6~>we*O)&BVXXBFe7y#e3slB036hp+m%uDUR8 z$S1p#pu2Pgml literal 0 HcmV?d00001 diff --git a/core/resources/pix/icons/edit-edit.png b/core/resources/pix/icons/edit-edit.png new file mode 100644 index 0000000000000000000000000000000000000000..44310b471b9af757e11ecde985a6711d87066ee7 GIT binary patch literal 4438 zcmbVP2|QH&yFZi?Su2TR8kAyIW0_&>YbY<%n@TZeVK9rCVNe*9FzqBtQIV~(MGB=X zuWT*Il3huXvXku|ZTG$R{_nm2|Nr+n%kMnT_xEhS=XuUK(GGj9B*YZN005A%u{L)E z@6s!$=o;{v2_>`ee5@0|DoQ3L?QY-wg@4je}-Q;3a)nGOo8qXR?3Q2<~a zea*>(;Pg=rKhr&FY8%Cmvt>GN5`{RL3it%tP1%dUjT7>+#v@S~^eulS zb3P9mbJ8SlMkr8JeV|uehtMt6tq@!=SflhZ(P^Okyp_dQKvYXe{d8PT!0Q7p+Z&w#;A=iv@cv>PL4>jWe&sfoBM$>o^mNVc zIJBKucjBY)L(vZuO6}^`RY0uPDu8e4Z_bx$oEgCC7vuEb>UH3b7iKIgEC`~`2$nA! zJShM3K}5$h!caa!q>Zmq%-0VHQ?8G6hzi$p228C_+MPFpYo6Tiuv#rwrpR>D zNaUf6Q8+P@o??$g8?3}%NqDLqicm7W`l?`P)1+L7z|iV1WciT%TCGYSB)q!9G%rAN zODw4_&;5>Y_EUvCojV&!!lv9++KvfFmqUA3D~9WDKaac&QPqTM?u?Vo5?w3Wa6agtHXok5VDn7xqUQJF$Bg(ImR5?+3xKgNJQ8v1Adt$7Mby%vNqXKPR zX59VQW^KbysPWzP+6G=7k8Zov^p#Gfn9A*v|$X_^XnlA6Kb=Oi{KunyY zac0Wa)TEm(>FXV78=&Gzee3Vkz(=cwP&{HrTdm0 zfgNTY8n|l=b6(o1Cbh{+lY71qzgYw+FXGK2h*iBPS@}KHYpO%4w^ZY+HFm_(swds6 zwKmmD)CUb>2T6nao8n{cin&^(=9{J+N;~-eQLXs?tgOte2gAZG$6Lf&Ze<iVqSF|vqIG&v^7+3Rr9CmEkS#nStr_Zlmil$P7$tMtR2b zp$n*n1n(rD(yHRFfac0_)k<=vO~mtHr>tGAm=^9;TKdPsTATv;f zi8T|aWVPH>D5x_D1=QhCW>@ z4XYcZ!hwd5^&gj-4%jiTEwLk~){mV&qBV-kOEOJ*gDcbzX8Zfb>+9mAN)n1yAC0gc zR!}$<#c7>_d*%m}TQ}X?>C#hzE!ow1ws>)vF>rk}?&Jt;zXtuF*fS%*WqKT16e5 zv3tlScYm%yF>JL&;kWMVXgk-J`Zf3K@Yi%1Nf}!e zoXWuq;wn;>kE6$yaWB*epTPQWAA2% zW*^Pw1%^x%H7Z)O_NebE#`hc#>0YoE=gN^a^&UF--EixBW$x~7*Z;KgT)2bD88^-7 zxaq==|+0nr^7SI23Bz}C)-1<0kf$DBH9yyBskbgwc zMlns1$sF(Grnr;7X5;%|IS=5SL7DEBRipI#^jdn^rKgwfzO^r6b}r@Z zE*$=|aGzh3WY@M&ywa{+9f84@TklnO1(n$PhqkG-b9l`1?m>luD>1>T!PxohZ!BB= zL+Tcb9`8-Rmpa-M@^PtqmCRb)@R8w9Qo~A`-o}b?5*4RpC6CNE&Xl~dyjopmpLF|T z1N}s>_ND2QpQReBu9vjSbiWEV99pOnU)tR0 z7sR{%c*u9GQtg55UkDE3fs60s*PZX1{YG}CC!h7x=jpooJ?sc-m^yU$Mg4WBR(wu! zS>LgNXZA}C8V?3Lhaci+rn~gl@q)g@j7oOZ70--^G%k*<)limImNRlZMi_IR@ojh! zZ=^ego4GzR@%dAb?A$w(C%MaWM)}KQzA0aKP0*@Rp1LibA9xu}T<-IJF^E?TfFCn7 zbet4?L+BrME}iW=kmFinNwQjdwAOX+!k^#v%(pDHY8`!W?&KMKNbDSSfj*}HnYXr^ z)58minnUVcpTDq>Hy-;wz37EWvhrT?Ub}@2s}d#_PFMM*fuETWlC`5f00iv-0R9O8 z_y&^rLjd511b|^T0Kg>xz-Cs`qdyEl#yXbuK@I?jZ&*2nfGbJz03foJMsVgj+uPwt zOgfxMX1Y`00dy9K1^@%202YztP2ob^DIPQi9{Q!^2^2yj@7?ntVhI|Yl>grJdV6as}tptNCV6b`M8Luo^P4k)OPO{U@; z%`Jaw1E26vPcD~*Lm+rO9-OBIXRK%x<7Gz>(*IDrf87CQa63J%x8A9UkqK>i_` zLkMJ15RMcM(~nJ}Sonixs;qd!!kMutL@tv}U^0DvZI#0>lObp=I2xjEPbAS8D^BeC z+Y*X7kxRit!F@x+kSLfIih#o6v@tjgS_6r~A(20z_DnL38u)jpHcSgiKqGNTJ@C*# zqW=>LrVW|MCH}u)G6_dzvgt(7Wg4C6K|!z>9#F{dK;q1pK1?>K7_?67?{pjR=Zwvy z(tJS1|M*G!ZmzvO&W6F^5*Z|ljX53)h6hfgk#QKZE}Be4Q($Nvq&5tLBx%9ib+A+z zNsEfsqL8WDM2z;Y_2x{H-%1kvT2KBL*Y9J~z%nHI{M&L?igP7F2USB+nqD{-pf6%MHl*-dpbAxN;KtWRnd$a zxpzx-^<@uSUra8jFg8=&b{Us+)cJAnIu%f5#CFNK?!>OyBgUHLgW<~uwInZilz(3P l!p2`n 0) { - + } else if (sims != null && sims.length > 0) { Simulation[] simsCopy = new Simulation[sims.length]; for (int i=0; i < sims.length; i++) { simsCopy[i] = sims[i].copy(); } + OpenRocketClipboard.setClipboard(simsCopy); parentFrame.selectTab(BasicFrame.SIMULATION_TAB); } @@ -765,9 +783,81 @@ public class RocketActions { (OpenRocketClipboard.getClipboardSimulations() != null)); } } - - - + + + /** + * Action that duplicates the selected component. + */ + private class DuplicateAction extends RocketAction { + private static final long serialVersionUID = 1L; + + public DuplicateAction() { + //// Copy + this.putValue(NAME, trans.get("RocketActions.DuplicateAct.Duplicate")); + this.putValue(MNEMONIC_KEY, KeyEvent.VK_D); + this.putValue(ACCELERATOR_KEY, DUPLICATE_KEY_STROKE); + //// Copy this component (and subcomponents) to the clipboard. + this.putValue(SHORT_DESCRIPTION, trans.get("RocketActions.DuplicateAct.ttip.Duplicate")); + this.putValue(SMALL_ICON, Icons.EDIT_DUPLICATE); + clipboardChanged(); + } + + @Override + public void actionPerformed(ActionEvent e) { + List components = selectionModel.getSelectedComponents(); + if (components != null) { + components = new ArrayList<>(components); + fillInMissingSelections(components); + + components.sort(Comparator.comparing(c -> c.getParent() != null ? -c.getParent().getChildPosition(c) : 0)); + } + Simulation[] sims = selectionModel.getSelectedSimulations(); + + if (isCopyable(components)) { + List duplicateComponents = new LinkedList<>(copyComponentsMaintainParent(components)); + + List> positions = new LinkedList<>(); + for (RocketComponent component : duplicateComponents) { + positions.add(getPastePosition(component)); + } + + if (duplicateComponents.size() == 1) { + document.addUndoPosition("Duplicate " + duplicateComponents.get(0).getComponentName()); + } else { + document.addUndoPosition("Duplicate components"); + } + + for (int i = 0; i < duplicateComponents.size(); i++) { + positions.get(i).getU().addChild(duplicateComponents.get(i), positions.get(i).getV()); + } + + selectionModel.setSelectedComponents(duplicateComponents); + } else if (sims != null && sims.length > 0) { + ArrayList copySims = new ArrayList(); + + for (Simulation s: sims) { + Simulation copy = s.duplicateSimulation(rocket); + String name = copy.getName(); + if (name.matches(OpenRocketDocument.SIMULATION_NAME_PREFIX + "[0-9]+ *")) { + copy.setName(document.getNextSimulationName()); + } + document.addSimulation(copy); + copySims.add(copy); + } + // TODO: undo + selectionModel.setSelectedSimulations(copySims.toArray(new Simulation[0])); + + parentFrame.selectTab(BasicFrame.SIMULATION_TAB); + } + } + + @Override + public void clipboardChanged() { + this.setEnabled(isCopyable(selectionModel.getSelectedComponent()) || + isSimulationSelected()); + } + + } @@ -782,6 +872,7 @@ public class RocketActions { this.putValue(NAME, trans.get("RocketActions.EditAct.Edit")); //// Edit the selected component. this.putValue(SHORT_DESCRIPTION, trans.get("RocketActions.EditAct.ttip.Edit")); + this.putValue(SMALL_ICON, Icons.EDIT_EDIT); clipboardChanged(); } diff --git a/swing/src/net/sf/openrocket/gui/util/Icons.java b/swing/src/net/sf/openrocket/gui/util/Icons.java index be095f1c1..ebbfe4345 100644 --- a/swing/src/net/sf/openrocket/gui/util/Icons.java +++ b/swing/src/net/sf/openrocket/gui/util/Icons.java @@ -58,9 +58,11 @@ public class Icons { public static final Icon FILE_QUIT = loadImageIcon("pix/icons/application-exit.png", "Quit OpenRocket"); public static final Icon EDIT_UNDO = loadImageIcon("pix/icons/edit-undo.png", trans.get("Icons.Undo")); public static final Icon EDIT_REDO = loadImageIcon("pix/icons/edit-redo.png", trans.get("Icons.Redo")); + public static final Icon EDIT_EDIT = loadImageIcon("pix/icons/edit-edit.png", "Edit"); public static final Icon EDIT_CUT = loadImageIcon("pix/icons/edit-cut.png", "Cut"); public static final Icon EDIT_COPY = loadImageIcon("pix/icons/edit-copy.png", "Copy"); public static final Icon EDIT_PASTE = loadImageIcon("pix/icons/edit-paste.png", "Paste"); + public static final Icon EDIT_DUPLICATE = loadImageIcon("pix/icons/edit-duplicate.png", "Duplicate"); public static final Icon EDIT_DELETE = loadImageIcon("pix/icons/edit-delete.png", "Delete"); public static final Icon EDIT_SCALE = loadImageIcon("pix/icons/edit-scale.png", "Scale"); From 8d6b8a0d794614791752c69329b39dc4521c4480 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Mon, 30 May 2022 20:43:58 +0200 Subject: [PATCH 06/39] Add short-cut for edit component --- swing/src/net/sf/openrocket/gui/main/RocketActions.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/swing/src/net/sf/openrocket/gui/main/RocketActions.java b/swing/src/net/sf/openrocket/gui/main/RocketActions.java index 6094397aa..f56e01ee6 100644 --- a/swing/src/net/sf/openrocket/gui/main/RocketActions.java +++ b/swing/src/net/sf/openrocket/gui/main/RocketActions.java @@ -49,9 +49,10 @@ public class RocketActions { Toolkit.getDefaultToolkit().getMenuShortcutKeyMaskEx()); public static final KeyStroke PASTE_KEY_STROKE = KeyStroke.getKeyStroke(KeyEvent.VK_V, Toolkit.getDefaultToolkit().getMenuShortcutKeyMaskEx()); - public static final KeyStroke DUPLICATE_KEY_STROKE = KeyStroke.getKeyStroke(KeyEvent.VK_D, Toolkit.getDefaultToolkit().getMenuShortcutKeyMaskEx()); + public static final KeyStroke EDIT_KEY_STROKE = KeyStroke.getKeyStroke(KeyEvent.VK_E, + Toolkit.getDefaultToolkit().getMenuShortcutKeyMaskEx()); private final OpenRocketDocument document; private final Rocket rocket; @@ -92,6 +93,8 @@ public class RocketActions { this.editAction = new EditAction(); this.editActionNoIcon = new EditAction(); this.editActionNoIcon.putValue(Action.SMALL_ICON, null); + this.editActionNoIcon.putValue(Action.MNEMONIC_KEY, null); + this.editActionNoIcon.putValue(Action.ACCELERATOR_KEY, null); this.newStageAction = new NewStageAction(); this.moveUpAction = new MoveUpAction(); this.moveDownAction = new MoveDownAction(); @@ -870,6 +873,8 @@ public class RocketActions { public EditAction() { //// Edit this.putValue(NAME, trans.get("RocketActions.EditAct.Edit")); + this.putValue(MNEMONIC_KEY, KeyEvent.VK_E); + this.putValue(ACCELERATOR_KEY, EDIT_KEY_STROKE); //// Edit the selected component. this.putValue(SHORT_DESCRIPTION, trans.get("RocketActions.EditAct.ttip.Edit")); this.putValue(SMALL_ICON, Icons.EDIT_EDIT); From 1a0cc5e0575531fc779cf8d65875706df95ef919 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Mon, 30 May 2022 20:44:11 +0200 Subject: [PATCH 07/39] Add edit action to application ribbon --- swing/src/net/sf/openrocket/gui/main/BasicFrame.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java index 51dc03623..3af688496 100644 --- a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java +++ b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java @@ -706,6 +706,9 @@ public class BasicFrame extends JFrame { menu.addSeparator(); + item = new JMenuItem(actions.getEditAction()); + menu.add(item); + item = new JMenuItem(actions.getCutAction()); menu.add(item); From 3ceefa0ba4eebd9915b986596456d6e5c5e7b1fa Mon Sep 17 00:00:00 2001 From: SiboVG Date: Mon, 30 May 2022 20:55:16 +0200 Subject: [PATCH 08/39] Move scale translations This commit will make sense in the next commit --- core/resources/l10n/messages.properties | 4 ++-- core/resources/l10n/messages_cs.properties | 4 ++-- core/resources/l10n/messages_de.properties | 4 ++-- core/resources/l10n/messages_es.properties | 4 ++-- core/resources/l10n/messages_fr.properties | 4 ++-- core/resources/l10n/messages_it.properties | 4 ++-- core/resources/l10n/messages_ja.properties | 4 ++-- core/resources/l10n/messages_nl.properties | 4 ++-- core/resources/l10n/messages_pl.properties | 4 ++-- core/resources/l10n/messages_pt.properties | 4 ++-- core/resources/l10n/messages_ru.properties | 4 ++-- core/resources/l10n/messages_uk_UA.properties | 4 ++-- core/resources/l10n/messages_zh_CN.properties | 4 ++-- 13 files changed, 26 insertions(+), 26 deletions(-) diff --git a/core/resources/l10n/messages.properties b/core/resources/l10n/messages.properties index cd4eb8f97..e8be838ca 100644 --- a/core/resources/l10n/messages.properties +++ b/core/resources/l10n/messages.properties @@ -37,6 +37,8 @@ RocketActions.DuplicateAct.Duplicate = Duplicate RocketActions.DuplicateAct.ttip.Duplicate = Duplicate this component (and subcomponents). RocketActions.EditAct.Edit = Edit RocketActions.EditAct.ttip.Edit = Edit the selected component. +RocketActions.ScaleAct.Scale = Scale +RocketActions.ScaleAct.ttip.Scale = Scale parts of the rocket design RocketActions.NewStageAct.Newstage = New stage RocketActions.NewStageAct.ttip.Newstage = Add a new stage to the rocket design. RocketActions.MoveUpAct.Moveup = Move up @@ -1332,8 +1334,6 @@ main.menu.edit.cut = Cut main.menu.edit.copy = Copy main.menu.edit.paste = Paste main.menu.edit.delete = Delete -main.menu.edit.resize = Scale\u2026 -main.menu.edit.resize.desc = Scale parts of the rocket design main.menu.edit.editpreset= Edit Component Preset File main.menu.edit.preferences = Preferences main.menu.edit.preferences.desc = Setup the application preferences diff --git a/core/resources/l10n/messages_cs.properties b/core/resources/l10n/messages_cs.properties index 3c5eab213..4774f8db0 100644 --- a/core/resources/l10n/messages_cs.properties +++ b/core/resources/l10n/messages_cs.properties @@ -35,6 +35,8 @@ RocketActions.PasteAct.Paste = Paste RocketActions.PasteAct.ttip.Paste = Paste the component or simulation on the clipboard to the design. RocketActions.EditAct.Edit = Edit RocketActions.EditAct.ttip.Edit = Edituj vybranou komponentu. +RocketActions.ScaleAct.Scale = Merítko +RocketActions.ScaleAct.ttip.Scale = Merítko cástí návrhu rakety RocketActions.NewStageAct.Newstage = Nový stupen RocketActions.NewStageAct.ttip.Newstage = Pridej nový stupen rakety. RocketActions.ActBoosterstage = Urychlovací stupen @@ -1001,8 +1003,6 @@ main.menu.edit.cut = Vyjmout main.menu.edit.copy = Kopírovat main.menu.edit.paste = Vlo\u017Eit main.menu.edit.delete = Smazat -main.menu.edit.resize = Merítko... -main.menu.edit.resize.desc = Merítko cástí návrhu rakety main.menu.edit.preferences = Nastavení main.menu.edit.preferences.desc = Nastavení aplikace diff --git a/core/resources/l10n/messages_de.properties b/core/resources/l10n/messages_de.properties index 8b417f436..17365216a 100644 --- a/core/resources/l10n/messages_de.properties +++ b/core/resources/l10n/messages_de.properties @@ -35,6 +35,8 @@ RocketActions.PasteAct.Paste = Einf RocketActions.PasteAct.ttip.Paste = Fügt die Komponente oder Simulation aus der Zwischenablage in das Design ein. RocketActions.EditAct.Edit = Bearbeiten RocketActions.EditAct.ttip.Edit = Die ausgewählte Komponente bearbeiten. +RocketActions.ScaleAct.Scale = Skalieren +RocketActions.ScaleAct.ttip.Scale = Teile des Raketendesigns skalieren RocketActions.NewStageAct.Newstage = Neue Stufe RocketActions.NewStageAct.ttip.Newstage = Fügt eine neue Stufe in das Raketendesign ein. RocketActions.ActBoosterstage = Booster-Stufe @@ -1058,8 +1060,6 @@ main.menu.edit.cut = Ausschneiden main.menu.edit.copy = Kopieren main.menu.edit.paste = Einfügen main.menu.edit.delete = Löschen -main.menu.edit.resize = Skalieren... -main.menu.edit.resize.desc = Teile des Raketendesigns skalieren main.menu.edit.preferences = Einstellungen main.menu.edit.preferences.desc = Einstellungen der Anwenung ändern diff --git a/core/resources/l10n/messages_es.properties b/core/resources/l10n/messages_es.properties index ae4f9fe3b..f060f8e70 100644 --- a/core/resources/l10n/messages_es.properties +++ b/core/resources/l10n/messages_es.properties @@ -802,6 +802,8 @@ RocketActions.DelSimuAct.Delete = Borrar RocketActions.DelSimuAct.ttip.Delete = Borrar la simulaci\u00f3n seleccionada RocketActions.EditAct.Edit = Editar componente RocketActions.EditAct.ttip.Edit = Editar valores del componente seleccionado +RocketActions.ScaleAct.Scale = Dimensionar +RocketActions.ScaleAct.ttip.Scale = Dimensionar las partes del dise\u00f1o del cohete RocketActions.MoveDownAct.Movedown = Mover hacia abajo RocketActions.MoveDownAct.ttip.Movedown = Mover este componente hacia abajo RocketActions.MoveUpAct.Moveup = Mover hacia arriba @@ -1450,8 +1452,6 @@ main.menu.edit.preferences = Preferencias main.menu.edit.preferences.desc = Configurar las preferencias de la aplicaci\u00f3n main.menu.edit.redo = Rehacer main.menu.edit.redo.desc = Rehacer la operaci\u00f3n anterior -main.menu.edit.resize = Dimensionar... -main.menu.edit.resize.desc = Dimensionar las partes del dise\u00f1o del cohete main.menu.edit.undo = Deshacer main.menu.edit.undo.desc = Deshacer la operaci\u00f3n anterior ! "main" prefix is used for the main application dialog diff --git a/core/resources/l10n/messages_fr.properties b/core/resources/l10n/messages_fr.properties index 1c823e355..15d4745d5 100644 --- a/core/resources/l10n/messages_fr.properties +++ b/core/resources/l10n/messages_fr.properties @@ -793,6 +793,8 @@ RocketActions.DelSimuAct.Delete = Effacer RocketActions.DelSimuAct.ttip.Delete = Effacer la simulation s\u00E9lectionn\u00E9e. RocketActions.EditAct.Edit = Modifier RocketActions.EditAct.ttip.Edit = Modifier la pi\u00E8ce s\u00E9lectionn\u00E9e. +RocketActions.ScaleAct.Scale = Redimensionner +RocketActions.ScaleAct.ttip.Scale = Redimensionner certaines parties de la fus\u00E9e RocketActions.MoveDownAct.Movedown = Descendre RocketActions.MoveDownAct.ttip.Movedown = Descendre la pi\u00E8ce. RocketActions.MoveUpAct.Moveup = Monter @@ -1444,8 +1446,6 @@ main.menu.edit.preferences = Pr\u00E9f\u00E9rences main.menu.edit.preferences.desc = Configure les pr\u00E9f\u00E9rences de l'application main.menu.edit.redo = Refaire modification main.menu.edit.redo.desc = Refaire l'op\u00E9ration precedente qui avait \u00E9t\u00E9 d\u00E9faite -main.menu.edit.resize = Redimensionner... -main.menu.edit.resize.desc = Redimensionner certaines parties de la fus\u00E9e main.menu.edit.undo = Annuler modification main.menu.edit.undo.desc = Annuler l'op\u00E9ration pr\u00E9c\u00E9dente ! "main" prefix is used for the main application dialog diff --git a/core/resources/l10n/messages_it.properties b/core/resources/l10n/messages_it.properties index 49bddf05d..1464c4334 100644 --- a/core/resources/l10n/messages_it.properties +++ b/core/resources/l10n/messages_it.properties @@ -35,6 +35,8 @@ RocketActions.PasteAct.Paste = Incolla RocketActions.PasteAct.ttip.Paste = Incolla il componente o la simulazione dagli appunti al disegno. RocketActions.EditAct.Edit = Modifica RocketActions.EditAct.ttip.Edit = Modifica il componente selezionato. +RocketActions.ScaleAct.Scale = Scala +RocketActions.ScaleAct.ttip.Scale = Scala parti del razzo RocketActions.NewStageAct.Newstage = Nuovo stadio RocketActions.NewStageAct.ttip.Newstage = Aggiungi un nuovo stadio al disegno del razzo. RocketActions.ActBoosterstage = Stadio Booster @@ -1062,8 +1064,6 @@ main.menu.edit.cut = Taglia main.menu.edit.copy = Copia main.menu.edit.paste = Incolla main.menu.edit.delete = Cancella -main.menu.edit.resize = Scala... -main.menu.edit.resize.desc = Scala parti del razzo main.menu.edit.preferences = Preferenze main.menu.edit.preferences.desc = Imposta le preferenze dell'applicazione diff --git a/core/resources/l10n/messages_ja.properties b/core/resources/l10n/messages_ja.properties index 2810500a9..a3c4417c7 100644 --- a/core/resources/l10n/messages_ja.properties +++ b/core/resources/l10n/messages_ja.properties @@ -31,6 +31,8 @@ RocketActions.PasteAct.Paste = \u8CBC\u308A\u4ED8\u3051 RocketActions.PasteAct.ttip.Paste = \u90E8\u54C1\u3084\u30B7\u30DF\u30E5\u30EC\u30FC\u30B7\u30E7\u30F3\u3092\u8CBC\u308A\u4ED8\u3051 RocketActions.EditAct.Edit = \u7DE8\u96C6 RocketActions.EditAct.ttip.Edit = \u9078\u629E\u3057\u305F\u90E8\u54C1\u306E\u7DE8\u96C6 +RocketActions.ScaleAct.Scale = \u62E1\u5927\u7E2E\u5C0F +RocketActions.ScaleAct.ttip.Scale = \u90E8\u54C1\u306E\u5927\u304D\u3055\u3092\u8CB7\u3048\u308B RocketActions.NewStageAct.Newstage = \u65B0\u3057\u3044\u30B9\u30C6\u30FC\u30B8 RocketActions.NewStageAct.ttip.Newstage = \u30ED\u30B1\u30C3\u30C8\u306B\u65B0\u3057\u3044\u30B9\u30C6\u30FC\u30B8\u3092\u8FFD\u52A0\u3059\u308B RocketActions.ActBoosterstage = \u30D6\u30FC\u30B9\u30BF\u30FC\u30B9\u30C6\u30FC\u30B8 @@ -1093,8 +1095,6 @@ main.menu.edit.cut = \u5207\u308A\u53D6\u308A main.menu.edit.copy = \u30B3\u30D4\u30FC main.menu.edit.paste = \u8CBC\u308A\u4ED8\u3051 main.menu.edit.delete = \u524A\u9664 -main.menu.edit.resize = \u62E1\u5927\u7E2E\u5C0F... -main.menu.edit.resize.desc = \u90E8\u54C1\u306E\u5927\u304D\u3055\u3092\u8CB7\u3048\u308B main.menu.edit.editpreset = Component Preset File\u306E\u7DE8\u96C6 main.menu.edit.preferences = \u8A2D\u5B9A main.menu.edit.preferences.desc = \u30A2\u30D7\u30EA\u306E\u8A2D\u5B9A\u3092\u30BB\u30C3\u30C8\u30A2\u30C3\u30D7 diff --git a/core/resources/l10n/messages_nl.properties b/core/resources/l10n/messages_nl.properties index 1977c2887..2d07bcd8b 100644 --- a/core/resources/l10n/messages_nl.properties +++ b/core/resources/l10n/messages_nl.properties @@ -37,6 +37,8 @@ RocketActions.PasteAct.Paste = Plak RocketActions.PasteAct.ttip.Paste = Plak dit onderdeel of simulatie van het klembord naar het ontwerp. RocketActions.EditAct.Edit = Bewerk RocketActions.EditAct.ttip.Edit = Pas geselecteerd onderdeel aan. +RocketActions.ScaleAct.Scale = Herschaal +RocketActions.ScaleAct.ttip.Scale = Herschaal delen van het raketontwerp RocketActions.NewStageAct.Newstage = Nieuwe trap RocketActions.NewStageAct.ttip.Newstage = Voeg nieuwe trap toe aan het raketontwerp. RocketActions.MoveUpAct.Moveup = Beweeg omhoog @@ -1270,8 +1272,6 @@ main.menu.edit.cut = Knop main.menu.edit.copy = Kopieer main.menu.edit.paste = Plak main.menu.edit.delete = Verwijder -main.menu.edit.resize = Schaal... -main.menu.edit.resize.desc = Schaal delen van het raketontwerp main.menu.edit.editpreset= Bewerk Component Preset bestand main.menu.edit.preferences = Voorkeuren main.menu.edit.preferences.desc = Stel de programma voorkeuren in diff --git a/core/resources/l10n/messages_pl.properties b/core/resources/l10n/messages_pl.properties index cb69f9fb1..f604eba6c 100644 --- a/core/resources/l10n/messages_pl.properties +++ b/core/resources/l10n/messages_pl.properties @@ -35,6 +35,8 @@ RocketActions.PasteAct.ttip.Paste = Wklej wybran\u0105 cz\u0119\u015B\u0107 lub symulacj\u0119 ze schowka do projektu. RocketActions.EditAct.Edit = Edycja RocketActions.EditAct.ttip.Edit = Edytuj zaznaczon\u0105 cz\u0119\u015B\u0107. + RocketActions.ScaleAct.Scale = Skaluj + RocketActions.ScaleAct.ttip.Scale = Skaluj cz\u0119\u015Bci modelu rakiety RocketActions.NewStageAct.Newstage = Nowy stopie\u0144 RocketActions.NewStageAct.ttip.Newstage = Dodaj stopie\u0144 do projektu rakiety. RocketActions.ActBoosterstage = Stopie\u0144 startowy rakiety @@ -1003,8 +1005,6 @@ update.dlg.latestVersion = Korzystasz z najnowszej wersji OpenRocket: %s. main.menu.edit.copy = Kopiuj main.menu.edit.paste = Wklej main.menu.edit.delete = Usu\u0144 - main.menu.edit.resize = Skaluj... - main.menu.edit.resize.desc = Skaluj cz\u0119\u015Bci modelu rakiety... main.menu.edit.preferences = Ustawienia main.menu.edit.preferences.desc = Edytuj ustawienia programu diff --git a/core/resources/l10n/messages_pt.properties b/core/resources/l10n/messages_pt.properties index 5320d3511..4e351f451 100644 --- a/core/resources/l10n/messages_pt.properties +++ b/core/resources/l10n/messages_pt.properties @@ -778,6 +778,8 @@ RocketActions.DelSimuAct.Delete = Excluir RocketActions.DelSimuAct.ttip.Delete = Excluir a simula\u00e7\u00e3o selecionada. RocketActions.EditAct.Edit = Editar RocketActions.EditAct.ttip.Edit = Edite o componente selecionado. +RocketActions.ScaleAct.Scale = Escala... +RocketActions.ScaleAct.ttip.Scale = Escalar partes do projeto do foguete RocketActions.MoveDownAct.Movedown = Mover para baixo RocketActions.MoveDownAct.ttip.Movedown = Mover este componente para baixo. RocketActions.MoveUpAct.Moveup = Mover para cima @@ -1406,8 +1408,6 @@ main.menu.edit.preferences = Prefer\u00eancias main.menu.edit.preferences.desc = Configurar as prefer\u00eancias do aplicativo main.menu.edit.redo = Refazer main.menu.edit.redo.desc = Refazer a opera\u00e7\u00e3o previamente desfeita -main.menu.edit.resize = Escala... -main.menu.edit.resize.desc = Escalar partes do projeto do foguete main.menu.edit.undo = Desfazer main.menu.edit.undo.desc = Desfazer a opera\u00e7\u00e3o anterior # "main" prefix is used for the main application dialog diff --git a/core/resources/l10n/messages_ru.properties b/core/resources/l10n/messages_ru.properties index 87ec528fc..78d6a17f3 100644 --- a/core/resources/l10n/messages_ru.properties +++ b/core/resources/l10n/messages_ru.properties @@ -35,6 +35,8 @@ RocketActions.PasteAct.Paste = \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c RocketActions.PasteAct.ttip.Paste = \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0438\u043b\u0438 \u0440\u0430\u0441\u0447\u0435\u0442 \u0438\u0437 \u0431\u0443\u0444\u0435\u0440\u0430 \u043e\u0431\u043c\u0435\u043d\u0430. RocketActions.EditAct.Edit = \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c RocketActions.EditAct.ttip.Edit = \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442. +RocketActions.ScaleAct.Scale = \u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c +RocketActions.ScaleAct.ttip.Scale = \u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u0438 \u0441\u0445\u0435\u043c\u044b RocketActions.NewStageAct.Newstage = \u041d\u043e\u0432\u0430\u044f \u0441\u0442\u0443\u043f\u0435\u043d\u044c RocketActions.NewStageAct.ttip.Newstage = \u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0441\u0442\u0443\u043f\u0435\u043d\u044c \u0432 \u0441\u0445\u0435\u043c\u0443. RocketActions.ActBoosterstage = \u0420\u0430\u0437\u0433\u043e\u043d\u043d\u0430\u044f \u0441\u0442\u0443\u043f\u0435\u043d\u044c @@ -1165,8 +1167,6 @@ main.menu.edit.cut = \u0412\u044b\u0440\u0435\u0437\u0430\u0442\u044c main.menu.edit.copy = \u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c main.menu.edit.paste = \u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c main.menu.edit.delete = \u0423\u0434\u0430\u043b\u0438\u0442\u044c -main.menu.edit.resize = \u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c... -main.menu.edit.resize.desc = \u041c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u0438 \u0441\u0445\u0435\u043c\u044b main.menu.edit.editprese = \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0444\u0430\u0439\u043b \u0437\u0430\u0433\u043e\u0442\u043e\u0432\u043a\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430 main.menu.edit.preferences = \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 main.menu.edit.preferences.desc = \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f diff --git a/core/resources/l10n/messages_uk_UA.properties b/core/resources/l10n/messages_uk_UA.properties index b31e062da..e2d8ce260 100644 --- a/core/resources/l10n/messages_uk_UA.properties +++ b/core/resources/l10n/messages_uk_UA.properties @@ -37,6 +37,8 @@ RocketActions.PasteAct.Paste = Paste RocketActions.PasteAct.ttip.Paste = Paste the component or simulation on the clipboard to the design. RocketActions.EditAct.Edit = Edit RocketActions.EditAct.ttip.Edit = Edit the selected component. +RocketActions.ScaleAct.Scale = Scale +RocketActions.ScaleAct.ttip.Scale = Scale parts of the rocket design RocketActions.NewStageAct.Newstage = New stage RocketActions.NewStageAct.ttip.Newstage = Add a new stage to the rocket design. RocketActions.ActBoosterstage = Booster stage @@ -1171,8 +1173,6 @@ main.menu.edit.cut = Cut main.menu.edit.copy = Copy main.menu.edit.paste = Paste main.menu.edit.delete = Delete -main.menu.edit.resize = Scale... -main.menu.edit.resize.desc = Scale parts of the rocket design main.menu.edit.editpreset= Edit Component Preset File main.menu.edit.preferences = Preferences main.menu.edit.preferences.desc = Setup the application preferences diff --git a/core/resources/l10n/messages_zh_CN.properties b/core/resources/l10n/messages_zh_CN.properties index d3d211751..7575edc39 100644 --- a/core/resources/l10n/messages_zh_CN.properties +++ b/core/resources/l10n/messages_zh_CN.properties @@ -867,6 +867,8 @@ RocketActions.DelSimuAct.Delete = \u5220\u9664 RocketActions.DelSimuAct.ttip.Delete = \u5220\u9664\u9009\u5B9A\u4EFF\u771F RocketActions.EditAct.Edit = \u7F16\u8F91 RocketActions.EditAct.ttip.Edit = \u7F16\u8F91\u9009\u4E2D\u7EC4\u4EF6 +RocketActions.ScaleAct.Scale = \u7F29\u653E +RocketActions.ScaleAct.ttip.Scale = \u7F29\u653E\u706B\u7BAD\u8BBE\u8BA1\u7A3F RocketActions.MoveDownAct.Movedown = \u5411\u4E0B\u79FB\u52A8 RocketActions.MoveDownAct.ttip.Movedown = \u5411\u4E0B\u79FB\u52A8\u8BE5\u90E8\u4EF6 RocketActions.MoveUpAct.Moveup = \u5411\u4E0A\u79FB\u52A8 @@ -1529,8 +1531,6 @@ main.menu.edit.preferences = \u9996\u9009\u9879 main.menu.edit.preferences.desc = \u4FEE\u6539\u5E94\u7528\u7A0B\u5E8F\u9996\u9009\u9879 main.menu.edit.redo = \u91CD\u505A main.menu.edit.redo.desc = \u91CD\u505A\u64CD\u4F5C -main.menu.edit.resize = \u7F29\u653E... -main.menu.edit.resize.desc = \u7F29\u653E\u706B\u7BAD\u8BBE\u8BA1\u7A3F main.menu.edit.undo = \u64A4\u9500 main.menu.edit.undo.desc = \u64A4\u9500\u64CD\u4F5C ! "main" prefix is used for the main application dialog From 8c3e67642fe8bdb29718b256d3039caf97223bbd Mon Sep 17 00:00:00 2001 From: SiboVG Date: Mon, 30 May 2022 21:05:28 +0200 Subject: [PATCH 09/39] Move scale action to RocketActions --- .../sf/openrocket/gui/main/BasicFrame.java | 14 +------ .../sf/openrocket/gui/main/RocketActions.java | 39 ++++++++++++++++++- 2 files changed, 39 insertions(+), 14 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java index 3af688496..18be6838c 100644 --- a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java +++ b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java @@ -726,19 +726,7 @@ public class BasicFrame extends JFrame { menu.addSeparator(); - - item = new JMenuItem(trans.get("main.menu.edit.resize")); - item.setIcon(Icons.EDIT_SCALE); - item.getAccessibleContext().setAccessibleDescription(trans.get("main.menu.edit.resize.desc")); - item.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - log.info(Markers.USER_MARKER, "Scale... selected"); - ScaleDialog dialog = new ScaleDialog(document, getSelectedComponents(), BasicFrame.this); - dialog.setVisible(true); - dialog.dispose(); - } - }); + item = new JMenuItem(actions.getScaleAction()); menu.add(item); diff --git a/swing/src/net/sf/openrocket/gui/main/RocketActions.java b/swing/src/net/sf/openrocket/gui/main/RocketActions.java index f56e01ee6..bf98f7b28 100644 --- a/swing/src/net/sf/openrocket/gui/main/RocketActions.java +++ b/swing/src/net/sf/openrocket/gui/main/RocketActions.java @@ -21,8 +21,10 @@ import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.document.Simulation; import net.sf.openrocket.gui.components.StyledLabel; import net.sf.openrocket.gui.configdialog.ComponentConfigDialog; +import net.sf.openrocket.gui.dialogs.ScaleDialog; import net.sf.openrocket.gui.util.Icons; import net.sf.openrocket.l10n.Translator; +import net.sf.openrocket.logging.Markers; import net.sf.openrocket.rocketcomponent.ComponentChangeEvent; import net.sf.openrocket.rocketcomponent.ComponentChangeListener; import net.sf.openrocket.rocketcomponent.ParallelStage; @@ -32,7 +34,8 @@ import net.sf.openrocket.rocketcomponent.AxialStage; import net.sf.openrocket.startup.Application; import net.sf.openrocket.startup.Preferences; import net.sf.openrocket.util.Pair; - +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** @@ -69,10 +72,12 @@ public class RocketActions { private final RocketAction duplicateAction; private final RocketAction editAction; private final RocketAction editActionNoIcon; + private final RocketAction scaleAction; private final RocketAction newStageAction; private final RocketAction moveUpAction; private final RocketAction moveDownAction; private static final Translator trans = Application.getTranslator(); + private static final Logger log = LoggerFactory.getLogger(RocketActions.class); public RocketActions(OpenRocketDocument document, DocumentSelectionModel selectionModel, @@ -92,6 +97,7 @@ public class RocketActions { this.duplicateAction = new DuplicateAction(); this.editAction = new EditAction(); this.editActionNoIcon = new EditAction(); + this.scaleAction = new ScaleAction(); this.editActionNoIcon.putValue(Action.SMALL_ICON, null); this.editActionNoIcon.putValue(Action.MNEMONIC_KEY, null); this.editActionNoIcon.putValue(Action.ACCELERATOR_KEY, null); @@ -129,6 +135,7 @@ public class RocketActions { duplicateAction.clipboardChanged(); editAction.clipboardChanged(); editActionNoIcon.clipboardChanged(); + scaleAction.clipboardChanged(); newStageAction.clipboardChanged(); moveUpAction.clipboardChanged(); moveDownAction.clipboardChanged(); @@ -172,6 +179,10 @@ public class RocketActions { public Action getEditActionNoIcon() { return editActionNoIcon; } + + public Action getScaleAction() { + return scaleAction; + } public Action getNewStageAction() { return newStageAction; @@ -924,7 +935,33 @@ public class RocketActions { } } + /** + * Action to scale the currently selected component. + */ + private class ScaleAction extends RocketAction { + private static final long serialVersionUID = 1L; + public ScaleAction() { + //// Scale + this.putValue(NAME, trans.get("RocketActions.ScaleAct.Scale")); + this.putValue(SHORT_DESCRIPTION, trans.get("RocketActions.ScaleAct.ttip.Scale")); + this.putValue(SMALL_ICON, Icons.EDIT_SCALE); + clipboardChanged(); + } + + @Override + public void actionPerformed(ActionEvent e) { + log.info(Markers.USER_MARKER, "Scale... selected"); + ScaleDialog dialog = new ScaleDialog(document, selectionModel.getSelectedComponents(), null); + dialog.setVisible(true); + dialog.dispose(); + } + + @Override + public void clipboardChanged() { + this.setEnabled(true); + } + } From fce3ced05907533c61f9b0ed9044883ae5254cda Mon Sep 17 00:00:00 2001 From: SiboVG Date: Mon, 30 May 2022 21:05:41 +0200 Subject: [PATCH 10/39] Add scale action to componentTree popup --- swing/src/net/sf/openrocket/gui/main/BasicFrame.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java index 18be6838c..18db163b7 100644 --- a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java +++ b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java @@ -177,6 +177,8 @@ public class BasicFrame extends JFrame { popupMenu.add(actions.getPasteAction()); popupMenu.add(actions.getDuplicateAction()); popupMenu.add(actions.getDeleteAction()); + popupMenu.addSeparator(); + popupMenu.add(actions.getScaleAction()); log.debug("Constructing the BasicFrame UI"); From 5b90986a8e839703dcc1e59fbcb4c28973c7fa54 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Mon, 30 May 2022 21:30:00 +0200 Subject: [PATCH 11/39] Remove redundant import --- swing/src/net/sf/openrocket/gui/main/SimulationPanel.java | 1 - 1 file changed, 1 deletion(-) diff --git a/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java b/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java index 15f775d3b..19fd89b93 100644 --- a/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java @@ -15,7 +15,6 @@ import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.IOException; -import java.util.ArrayList; import java.util.Arrays; import java.util.Comparator; From 203d4e8b2ae0031692751cc72d2b05544df50930 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Mon, 30 May 2022 21:41:08 +0200 Subject: [PATCH 12/39] Implement edit action for simulations --- .../sf/openrocket/gui/main/BasicFrame.java | 2 +- .../sf/openrocket/gui/main/RocketActions.java | 32 +++++++++++++------ .../openrocket/gui/main/SimulationPanel.java | 2 +- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java index 18db163b7..81aa0130b 100644 --- a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java +++ b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java @@ -708,7 +708,7 @@ public class BasicFrame extends JFrame { menu.addSeparator(); - item = new JMenuItem(actions.getEditAction()); + item = new JMenuItem(actions.getEditAction(simulationPanel)); menu.add(item); item = new JMenuItem(actions.getCutAction()); diff --git a/swing/src/net/sf/openrocket/gui/main/RocketActions.java b/swing/src/net/sf/openrocket/gui/main/RocketActions.java index bf98f7b28..7f8bbc0f8 100644 --- a/swing/src/net/sf/openrocket/gui/main/RocketActions.java +++ b/swing/src/net/sf/openrocket/gui/main/RocketActions.java @@ -175,6 +175,10 @@ public class RocketActions { public Action getEditAction() { return editAction; } + public Action getEditAction(SimulationPanel simulationPanel) { + ((EditAction) editAction).setSimulationPanel(simulationPanel); + return editAction; + } public Action getEditActionNoIcon() { return editActionNoIcon; @@ -880,6 +884,7 @@ public class RocketActions { */ private class EditAction extends RocketAction { private static final long serialVersionUID = 1L; + private SimulationPanel simulationPanel = null; public EditAction() { //// Edit @@ -892,28 +897,35 @@ public class RocketActions { clipboardChanged(); } + public void setSimulationPanel(SimulationPanel simulationPanel) { + this.simulationPanel = simulationPanel; + } + @Override public void actionPerformed(ActionEvent e) { List components = selectionModel.getSelectedComponents(); - if (!checkAllClassesEqual(components)) - return; + Simulation[] sims = selectionModel.getSelectedSimulations(); - // Do nothing if the config dialog is already visible - if (ComponentConfigDialog.isDialogVisible()) - return; + if ((components != null) && (components.size() > 0) && checkAllClassesEqual(components)) { + // Do nothing if the config dialog is already visible + if (ComponentConfigDialog.isDialogVisible()) + return; - List listeners = null; - if (components.size() > 1) { - listeners = components.subList(1, components.size()); + List listeners = null; + if (components.size() > 1) { + listeners = components.subList(1, components.size()); + } + ComponentConfigDialog.showDialog(parentFrame, document, components.get(0), listeners); + } else if (sims != null && sims.length > 0 && (simulationPanel != null)) { + simulationPanel.editSimulationAction(); } - ComponentConfigDialog.showDialog(parentFrame, document, components.get(0), listeners); } @Override public void clipboardChanged() { List components = selectionModel.getSelectedComponents(); - this.setEnabled(checkAllClassesEqual(components)); + this.setEnabled(checkAllClassesEqual(components) || isSimulationSelected()); } /** diff --git a/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java b/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java index 19fd89b93..8b1733f68 100644 --- a/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java @@ -604,7 +604,7 @@ public class SimulationPanel extends JPanel { fireMaintainSelection(); } - private void editSimulationAction() { + public void editSimulationAction() { Simulation[] sims = getSelectedSimulations(); if (sims == null) return; From c69455545c27a25a83fb2ad951beb828a6abf74d Mon Sep 17 00:00:00 2001 From: SiboVG Date: Mon, 30 May 2022 22:14:24 +0200 Subject: [PATCH 13/39] Clean up code --- .../src/net/sf/openrocket/gui/main/BasicFrame.java | 4 ++-- .../net/sf/openrocket/gui/main/RocketActions.java | 13 +++---------- 2 files changed, 5 insertions(+), 12 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java index 81aa0130b..242916e44 100644 --- a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java +++ b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java @@ -167,7 +167,7 @@ public class BasicFrame extends JFrame { selectionModel.attachComponentTreeSelectionModel(componentSelectionModel); selectionModel.attachSimulationListSelectionModel(simulationSelectionModel); - actions = new RocketActions(document, selectionModel, this); + actions = new RocketActions(document, selectionModel, this, simulationPanel); // Populate the popup menu popupMenu = new JPopupMenu(); @@ -708,7 +708,7 @@ public class BasicFrame extends JFrame { menu.addSeparator(); - item = new JMenuItem(actions.getEditAction(simulationPanel)); + item = new JMenuItem(actions.getEditAction()); menu.add(item); item = new JMenuItem(actions.getCutAction()); diff --git a/swing/src/net/sf/openrocket/gui/main/RocketActions.java b/swing/src/net/sf/openrocket/gui/main/RocketActions.java index 7f8bbc0f8..0bc11a5a3 100644 --- a/swing/src/net/sf/openrocket/gui/main/RocketActions.java +++ b/swing/src/net/sf/openrocket/gui/main/RocketActions.java @@ -61,6 +61,7 @@ public class RocketActions { private final Rocket rocket; private final BasicFrame parentFrame; private final DocumentSelectionModel selectionModel; + private final SimulationPanel simulationPanel; private final RocketAction deleteComponentAction; @@ -81,11 +82,12 @@ public class RocketActions { public RocketActions(OpenRocketDocument document, DocumentSelectionModel selectionModel, - BasicFrame parentFrame) { + BasicFrame parentFrame, SimulationPanel simulationPanel) { this.document = document; this.rocket = document.getRocket(); this.selectionModel = selectionModel; this.parentFrame = parentFrame; + this.simulationPanel = simulationPanel; // Add action also to updateActions() this.deleteAction = new DeleteAction(); @@ -175,10 +177,6 @@ public class RocketActions { public Action getEditAction() { return editAction; } - public Action getEditAction(SimulationPanel simulationPanel) { - ((EditAction) editAction).setSimulationPanel(simulationPanel); - return editAction; - } public Action getEditActionNoIcon() { return editActionNoIcon; @@ -884,7 +882,6 @@ public class RocketActions { */ private class EditAction extends RocketAction { private static final long serialVersionUID = 1L; - private SimulationPanel simulationPanel = null; public EditAction() { //// Edit @@ -897,10 +894,6 @@ public class RocketActions { clipboardChanged(); } - public void setSimulationPanel(SimulationPanel simulationPanel) { - this.simulationPanel = simulationPanel; - } - @Override public void actionPerformed(ActionEvent e) { List components = selectionModel.getSelectedComponents(); From 2ab1bee92cc3344fa009cc801899ee53df76c625 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Mon, 30 May 2022 22:38:26 +0200 Subject: [PATCH 14/39] Add icons for simulation popup actions --- core/resources/pix/icons/sim-plot.png | Bin 0 -> 1745 bytes core/resources/pix/icons/sim-run.png | Bin 0 -> 1563 bytes .../sf/openrocket/gui/main/SimulationPanel.java | 11 +++++++++++ swing/src/net/sf/openrocket/gui/util/Icons.java | 3 +++ 4 files changed, 14 insertions(+) create mode 100644 core/resources/pix/icons/sim-plot.png create mode 100644 core/resources/pix/icons/sim-run.png diff --git a/core/resources/pix/icons/sim-plot.png b/core/resources/pix/icons/sim-plot.png new file mode 100644 index 0000000000000000000000000000000000000000..32f27ca7b4890bd32c584e02b4e58a830ce500f6 GIT binary patch literal 1745 zcmbVNTZr6L7)}>!wc~=KmPJKF+68;b5JlJ`(P1K6hUzXsbGE5`XFAOtS57G)oooGNOF>V z|M!3Y<@`B3KDN7m<82!mhUqUB@)PuaV|-qBExq3L%Oyx}*ZYMBLxxG*9G~l$=bj&6 znDu9!QaLIcdjKMC5?aK>$)@X5G{fv1YWfh(;D|MG#qo6R=Xc)cSjW=22UJ5e{2Z=2 zh4}za&X1MQ{0!18ZfF;~vk54HizCQ3-I^DIrp~o^0bR$h1&(b&q8XhVjvcaPW1P*A z0JE8-#3NA@*^HJnMLTO^P29oCqAUrLEJ!LZOF&kEq_UlZqy7TR1{3-FI^O7$&Q+tx z2ZGROG?EP^NrH+XX__X8vLMSmMeyOA7r`d)g`2w!c^sm^@gs+LY|IEvQjc_wYHbJM z`aN1N>?De&OlU%1kdk5?R10XK9?q`^wU%=W3Alz`>_s8PNEIxNlkSeU>esRsy;%u<<~<7j-43owjGP$Hz(E!B8e zGAk=dnZ4V9$noMJwyrS2c^F}xqji&cQQ{S;BxyiRft0*mlz=FEWXFXSEcjl9V|$4NIZ`75bxhSMEft0Vie4B& z58+~7=V;VP$FTs+$dYO+60h18;!`LC`D|LTc`GYst&}8b879kWz$UCUHkh3hwd&|yK0_z&&5pv3QkDNHP_h_llbAz zs^+k*J^&EK{jGB-E-bdV&TD6t46H4JHf^JdDd`o;-G+t4jv6q)!xfsXH8hlPIr$-+ zy|VbVmG8geS8c$n6W>WKszR@V>BtngI2<7!E$zYx|E^i<+ln#Nh11yQpDE^tOW7w+9$mWitaw9i@Xkr!-LS9knaAE(?k~Um5S#Enx#Rfg zvE2vWKKaMH)8^;`f9}AahYxM}`orIL^?mc!<5OGRp;JGdJ9Ux$=*Ts-g%74LEikvd zuz34>Uk*I&a_f)&cx3;yFqMG$^HT@a(*XDf_HFw# Vu`FwEo{xVz#gVc6YxnLu_!pJ?H2VMm literal 0 HcmV?d00001 diff --git a/core/resources/pix/icons/sim-run.png b/core/resources/pix/icons/sim-run.png new file mode 100644 index 0000000000000000000000000000000000000000..495d6d432a0aad9ca6ac4f37c1e9e0d02da3aebb GIT binary patch literal 1563 zcmbVMTWB0r7#BMUGO1Ka=f1Pa96N2-Y?@uoY?pM=tswU7nX|h?cIHfH zCfVJ9Hl`qmwu*#4gxUtQSV4-u2`yNv_MuP_T0!3=s1*^#_C=wnXZB{4dh5W+RuN1k_q43hFM}(Gp$9~< zTCECIRUm#zlyzMfB}G&eo+9|5?uM|&yTMSKA&CRz+g@lBmyH-` zK$eFke4vVA~eZu&U}>EY2fj#rYV*MSe6sqVc0@yb#kgrBH|$+vk%6%|y9vpSS+!`MthP zy9-usnb@BDVpECuSCNgqRejrr(_s)TJ9CJBbS4>g>G<;LoH}vl zHHFT&PtwUmZuH2hD@JBbV&lc1wxr;i?#<6H9NujY#uhicFz{{nN9$@`ncag=e7zNjp``{9+zZ(gteT0i;A>8 Date: Tue, 31 May 2022 03:07:04 +0200 Subject: [PATCH 15/39] Implement right-click popup in rocket view --- .../sf/openrocket/gui/main/BasicFrame.java | 2 +- .../gui/scalefigure/RocketPanel.java | 24 ++++++++++++------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java index 242916e44..a79560033 100644 --- a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java +++ b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java @@ -911,7 +911,7 @@ public class BasicFrame extends JFrame { this.setJMenuBar(menubar); } - protected void doComponentTreePopup(MouseEvent e) { + public void doComponentTreePopup(MouseEvent e) { popupMenu.show(e.getComponent(), e.getX(), e.getY()); } diff --git a/swing/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java b/swing/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java index 551944835..750a251dc 100644 --- a/swing/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java +++ b/swing/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java @@ -510,16 +510,24 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change public static final int CYCLE_SELECTION_MODIFIER = InputEvent.SHIFT_DOWN_MASK; private void handleMouseClick(MouseEvent event) { - if (event.getButton() != MouseEvent.BUTTON1) - return; - Point p0 = event.getPoint(); - Point p1 = scrollPane.getViewport().getViewPosition(); - int x = p0.x + p1.x; - int y = p0.y + p1.y; + if (event.getButton() == MouseEvent.BUTTON1) { + // Get the component that is clicked on + Point p0 = event.getPoint(); + Point p1 = scrollPane.getViewport().getViewPosition(); + int x = p0.x + p1.x; + int y = p0.y + p1.y; - RocketComponent[] clicked = figure.getComponentsByPoint(x, y); + RocketComponent[] clicked = figure.getComponentsByPoint(x, y); - handleComponentClick(clicked, event); + handleComponentClick(clicked, event); + } else if (event.getButton() == MouseEvent.BUTTON3) { + List selectedComponents = Arrays.stream(selectionModel.getSelectionPaths()) + .map(c -> (RocketComponent) c.getLastPathComponent()).collect(Collectors.toList()); + + if (selectedComponents.size() == 0) return; + + basicFrame.doComponentTreePopup(event); + } } private void handleComponentClick(RocketComponent[] clicked, MouseEvent event) { From e5ec38f22776d51683d8c9231cce4be7e760d4f9 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Tue, 31 May 2022 03:59:29 +0200 Subject: [PATCH 16/39] Fix error in component duplication --- .../sf/openrocket/gui/main/RocketActions.java | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/main/RocketActions.java b/swing/src/net/sf/openrocket/gui/main/RocketActions.java index 0bc11a5a3..6e389d1b5 100644 --- a/swing/src/net/sf/openrocket/gui/main/RocketActions.java +++ b/swing/src/net/sf/openrocket/gui/main/RocketActions.java @@ -830,24 +830,35 @@ public class RocketActions { Simulation[] sims = selectionModel.getSelectedSimulations(); if (isCopyable(components)) { - List duplicateComponents = new LinkedList<>(copyComponentsMaintainParent(components)); + ComponentConfigDialog.disposeDialog(); + List copiedComponents = new LinkedList<>(copyComponentsMaintainParent(components)); + + OpenRocketClipboard.setClipboard(copiedComponents); + + copiedComponents = new LinkedList<>(OpenRocketClipboard.getClipboardComponents()); + List pasted = new LinkedList<>(); + for (RocketComponent component : copiedComponents) { + pasted.add(component.copy()); + } List> positions = new LinkedList<>(); - for (RocketComponent component : duplicateComponents) { + for (RocketComponent component : pasted) { positions.add(getPastePosition(component)); } - if (duplicateComponents.size() == 1) { - document.addUndoPosition("Duplicate " + duplicateComponents.get(0).getComponentName()); + if (pasted.size() == 1) { + document.addUndoPosition("Duplicate " + pasted.get(0).getComponentName()); } else { document.addUndoPosition("Duplicate components"); } - for (int i = 0; i < duplicateComponents.size(); i++) { - positions.get(i).getU().addChild(duplicateComponents.get(i), positions.get(i).getV()); + for (int i = 0; i < pasted.size(); i++) { + positions.get(i).getU().addChild(pasted.get(i), positions.get(i).getV()); } - selectionModel.setSelectedComponents(duplicateComponents); + selectionModel.setSelectedComponents(pasted); + + parentFrame.selectTab(BasicFrame.COMPONENT_TAB); } else if (sims != null && sims.length > 0) { ArrayList copySims = new ArrayList(); From 76bc575ff4e603ddaac5e05b6e05d5a8e3b1b0ad Mon Sep 17 00:00:00 2001 From: SiboVG Date: Tue, 31 May 2022 14:21:00 +0200 Subject: [PATCH 17/39] Set scale to component scale when an item is selected + extra cleanup --- .../openrocket/gui/dialogs/ScaleDialog.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/dialogs/ScaleDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/ScaleDialog.java index baea99547..235ad81a6 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/ScaleDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/ScaleDialog.java @@ -345,17 +345,22 @@ public class ScaleDialog extends JDialog { selectionOption.setToolTipText(tip); panel.add(selectionOption, "growx, wrap para*2"); + // Select the 'scale component / scale selection and all subcomponents' if a component is selected + if (selection != null && selection.size() > 0) { + selectionOption.setSelectedIndex(1); + } + // Change the offset checkbox to false when 'Scale selection' is selection and only one component is selected, // since this is a common action. - selectionOption.addItemListener(new ItemListener() { + ItemListener listener = new ItemListener() { @Override public void itemStateChanged(ItemEvent e) { - if (SCALE_SELECTION.equals(selectionOption.getSelectedItem()) && (selection != null) && - (selection.size() == 1) && (scaleOffsets != null)) { - scaleOffsets.setSelected(false); - } + if (scaleOffsets == null) return; + + scaleOffsets.setSelected(!SCALE_SELECTION.equals(selectionOption.getSelectedItem())); } - }); + }; + selectionOption.addItemListener(listener); // Scale multiplier @@ -424,7 +429,7 @@ public class ScaleDialog extends JDialog { // Scale offsets scaleOffsets = new JCheckBox(trans.get("checkbox.scaleOffsets")); scaleOffsets.setToolTipText(trans.get("checkbox.scaleOffsets.ttip")); - scaleOffsets.setSelected(true); + listener.itemStateChanged(null); // Triggers the selection state of scaleOffsets panel.add(scaleOffsets, "span, wrap para*3"); @@ -457,7 +462,7 @@ public class ScaleDialog extends JDialog { }); panel.add(cancel, "right, gap para"); - + GUIUtil.setDisposableDialogOptions(this, scale); } From f7a61cb72bf1577981ec34daedec72b4ab3e1515 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Tue, 31 May 2022 22:52:52 +0200 Subject: [PATCH 18/39] Remove redundant import --- swing/src/net/sf/openrocket/gui/main/BasicFrame.java | 1 - 1 file changed, 1 deletion(-) diff --git a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java index a79560033..58f73b47d 100644 --- a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java +++ b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java @@ -51,7 +51,6 @@ import net.sf.openrocket.gui.dialogs.DecalNotFoundDialog; import net.sf.openrocket.gui.dialogs.DetailDialog; import net.sf.openrocket.gui.dialogs.LicenseDialog; import net.sf.openrocket.gui.dialogs.PrintDialog; -import net.sf.openrocket.gui.dialogs.ScaleDialog; import net.sf.openrocket.gui.dialogs.SwingWorkerDialog; import net.sf.openrocket.gui.dialogs.WarningDialog; import net.sf.openrocket.gui.dialogs.optimization.GeneralOptimizationDialog; From 8d3e67bfb120b6e79ec4fa1c5aaf86a53ee0eb15 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Tue, 31 May 2022 23:00:40 +0200 Subject: [PATCH 19/39] Rename 'copy configuration' to 'duplicate configuration' --- core/resources/l10n/messages.properties | 2 +- core/resources/l10n/messages_es.properties | 2 +- core/resources/l10n/messages_fr.properties | 2 +- core/resources/l10n/messages_nl.properties | 2 +- core/resources/l10n/messages_pt.properties | 2 +- core/resources/l10n/messages_uk_UA.properties | 2 +- .../FlightConfigurationPanel.java | 34 +++++++++---------- 7 files changed, 22 insertions(+), 24 deletions(-) diff --git a/core/resources/l10n/messages.properties b/core/resources/l10n/messages.properties index 85b9d601c..6023ef641 100644 --- a/core/resources/l10n/messages.properties +++ b/core/resources/l10n/messages.properties @@ -191,7 +191,7 @@ edtmotorconfdlg.col.configuration = Configuration edtmotorconfdlg.but.Removeconfiguration = Remove Configuration edtmotorconfdlg.but.Renameconfiguration = Rename Configuration edtmotorconfdlg.but.Newconfiguration = New Configuration -edtmotorconfdlg.but.Copyconfiguration = Copy Configuration +edtmotorconfdlg.but.Duplicateconfiguration = Duplicate Configuration edtmotorconfdlg.title.Editmotorconf = Edit Flight configurations edtmotorconfdlg.title.Renameconf = Rename Flight Configuration edtmotorconfdlg.title.Selectdeploymentconf = Select Deployment Configuration diff --git a/core/resources/l10n/messages_es.properties b/core/resources/l10n/messages_es.properties index 44b524abb..61318e768 100644 --- a/core/resources/l10n/messages_es.properties +++ b/core/resources/l10n/messages_es.properties @@ -1382,7 +1382,7 @@ dlg.but.close = Cerrar ! Common labels used in buttons of dialog windows dlg.but.ok = OK -edtmotorconfdlg.but.Copyconfiguration = Copiar +edtmotorconfdlg.but.Duplicateconfiguration = Duplicar edtmotorconfdlg.but.Newconfiguration = Nueva configuraci\u00f3n ! Edit Motor configuration dialog edtmotorconfdlg.but.Removeconfiguration = Quitar configuraci\u00f3n diff --git a/core/resources/l10n/messages_fr.properties b/core/resources/l10n/messages_fr.properties index 045406135..4b371f405 100644 --- a/core/resources/l10n/messages_fr.properties +++ b/core/resources/l10n/messages_fr.properties @@ -1377,7 +1377,7 @@ dlg.but.close = Fermer ! Common labels used in buttons of dialog windows dlg.but.ok = Accepter -edtmotorconfdlg.but.Copyconfiguration = Copier +edtmotorconfdlg.but.Duplicateconfiguration = Dupliquer edtmotorconfdlg.but.Newconfiguration = Nouvelle configuration edtmotorconfdlg.but.Removeconfiguration = Supprimer la configuration edtmotorconfdlg.but.Renameconfiguration = Renommer diff --git a/core/resources/l10n/messages_nl.properties b/core/resources/l10n/messages_nl.properties index ba73e4b30..4d2ea8ae2 100644 --- a/core/resources/l10n/messages_nl.properties +++ b/core/resources/l10n/messages_nl.properties @@ -181,7 +181,7 @@ edtmotorconfdlg.col.configuration = Configuratie edtmotorconfdlg.but.Removeconfiguration = Verwijder Configuratie edtmotorconfdlg.but.Renameconfiguration = Hernoem Configuratie edtmotorconfdlg.but.Newconfiguration = Nieuwe Configuratie -edtmotorconfdlg.but.Copyconfiguration = Kopieer Configuratie +edtmotorconfdlg.but.Duplicateconfiguration = Dupliceer Configuratie edtmotorconfdlg.title.Editmotorconf = Pas Vluchtconfiguratie Aan edtmotorconfdlg.title.Renameconf = Hernoem Vluchtconfiguratie edtmotorconfdlg.title.Selectdeploymentconf = Selecteer Ontplooiingconfiguratie diff --git a/core/resources/l10n/messages_pt.properties b/core/resources/l10n/messages_pt.properties index 1dba087eb..bf6db32c0 100644 --- a/core/resources/l10n/messages_pt.properties +++ b/core/resources/l10n/messages_pt.properties @@ -1340,7 +1340,7 @@ dlg.but.close = Fechar # Common labels used in buttons of dialog windows dlg.but.ok = Ok -edtmotorconfdlg.but.Copyconfiguration = Copiar +edtmotorconfdlg.but.Duplicateconfiguration = Duplikat edtmotorconfdlg.but.Newconfiguration = Nova configura\u00e7\u00e3o edtmotorconfdlg.but.Removeconfiguration = Remover configura\u00e7\u00e3o edtmotorconfdlg.but.Renameconfiguration = Renomear diff --git a/core/resources/l10n/messages_uk_UA.properties b/core/resources/l10n/messages_uk_UA.properties index 29c9ae3cd..8e012cbfe 100644 --- a/core/resources/l10n/messages_uk_UA.properties +++ b/core/resources/l10n/messages_uk_UA.properties @@ -183,7 +183,7 @@ edtmotorconfdlg.col.configuration = Configuration edtmotorconfdlg.but.Removeconfiguration = Remove Configuration edtmotorconfdlg.but.Renameconfiguration = Rename Configuration edtmotorconfdlg.but.Newconfiguration = New Configuration -edtmotorconfdlg.but.Copyconfiguration = Copy Configuration +edtmotorconfdlg.but.Duplicateconfiguration = Duplicate Configuration edtmotorconfdlg.title.Editmotorconf = Edit Flight configurations edtmotorconfdlg.title.Renameconf = Rename Flight Configuration edtmotorconfdlg.title.Selectdeploymentconf = Select Deployment Configuration 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 e6c306b3d..e03225cd8 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurationPanel.java @@ -3,7 +3,6 @@ package net.sf.openrocket.gui.main.flightconfigpanel; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.EventObject; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -31,7 +30,6 @@ import net.sf.openrocket.rocketcomponent.RocketComponent; import net.sf.openrocket.rocketvisitors.ListComponents; import net.sf.openrocket.rocketvisitors.ListMotorMounts; import net.sf.openrocket.startup.Application; -import net.sf.openrocket.util.ArrayList; import net.sf.openrocket.util.StateChangeListener; import net.sf.openrocket.gui.widgets.SelectColorButton; @@ -43,7 +41,7 @@ public class FlightConfigurationPanel extends JPanel implements StateChangeListe private final Rocket rocket; private final BasicFrame basicFrame; - private final JButton newConfButton, renameConfButton, removeConfButton, copyConfButton; + private final JButton newConfButton, renameConfButton, removeConfButton, duplicateConfButton; private final JTabbedPane tabs; private final MotorConfigurationPanel motorConfigurationPanel; @@ -83,7 +81,7 @@ public class FlightConfigurationPanel extends JPanel implements StateChangeListe newConfButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - newOrCopyConfigAction(false); + newOrDuplicateConfigAction(false); } }); @@ -110,14 +108,14 @@ public class FlightConfigurationPanel extends JPanel implements StateChangeListe }); this.add(removeConfButton,"gapright para"); - copyConfButton = new SelectColorButton(trans.get("edtmotorconfdlg.but.Copyconfiguration")); - copyConfButton.addActionListener(new ActionListener() { + duplicateConfButton = new SelectColorButton(trans.get("edtmotorconfdlg.but.Duplicateconfiguration")); + duplicateConfButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - newOrCopyConfigAction(true); + newOrDuplicateConfigAction(true); } }); - this.add(copyConfButton, "wrap"); + this.add(duplicateConfButton, "wrap"); tabs.addChangeListener(new ChangeListener() { @Override @@ -143,11 +141,11 @@ public class FlightConfigurationPanel extends JPanel implements StateChangeListe } /** - * Action for when the new configuration or copy configuration button is pressed. - * @param copy if True, then copy configuration operation, if False then create a new configuration + * Action for when the new configuration or duplicate configuration button is pressed. + * @param duplicate if True, then duplicate configuration operation, if False then create a new configuration */ - private void newOrCopyConfigAction(boolean copy) { - addOrCopyConfiguration(copy); + private void newOrDuplicateConfigAction(boolean duplicate) { + addOrDuplicateConfiguration(duplicate); configurationChanged(ComponentChangeEvent.MOTOR_CHANGE); stateChanged(null); switch (tabs.getSelectedIndex()) { @@ -165,15 +163,15 @@ public class FlightConfigurationPanel extends JPanel implements StateChangeListe } /** - * either create or copy configuration + * either create or duplicate configuration * set new configuration as current * create simulation for new configuration */ - private void addOrCopyConfiguration(boolean copy) { + private void addOrDuplicateConfiguration(boolean duplicate) { final Map newConfigs = new LinkedHashMap<>(); - // create or copy configuration - if (copy) { + // create or duplicate configuration + if (duplicate) { List oldIds = getSelectedConfigurationIds(); if (oldIds == null || oldIds.size() == 0) return; @@ -248,10 +246,10 @@ public class FlightConfigurationPanel extends JPanel implements StateChangeListe private void updateButtonState() { FlightConfigurationId currentId = rocket.getSelectedConfiguration().getFlightConfigurationID(); - // Enable the remove/rename/copy buttons only when a configuration is selected. + // Enable the remove/rename/duplicate buttons only when a configuration is selected. removeConfButton.setEnabled(currentId.isValid()); renameConfButton.setEnabled(currentId.isValid()); - copyConfButton.setEnabled(currentId.isValid()); + duplicateConfButton.setEnabled(currentId.isValid()); // Count the number of motor mounts int motorMountCount = rocket.accept(new ListMotorMounts()).size(); From 49658600b77eee04d9abf98a49110ae307a7f52f Mon Sep 17 00:00:00 2001 From: SiboVG Date: Tue, 31 May 2022 23:05:26 +0200 Subject: [PATCH 20/39] Clean up code --- swing/src/net/sf/openrocket/gui/main/BasicFrame.java | 4 +++- .../src/net/sf/openrocket/gui/main/RocketActions.java | 10 ---------- 2 files changed, 3 insertions(+), 11 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java index 58f73b47d..5ead81809 100644 --- a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java +++ b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java @@ -351,7 +351,9 @@ public class BasicFrame extends JFrame { button = new SelectColorButton(actions.getMoveDownAction()); panel.add(button, "sizegroup buttons, aligny 0%"); - button = new SelectColorButton(actions.getEditActionNoIcon()); + button = new SelectColorButton(actions.getEditAction()); + button.setIcon(null); + button.setMnemonic(0); panel.add(button, "sizegroup buttons"); button = new SelectColorButton(actions.getDeleteAction()); diff --git a/swing/src/net/sf/openrocket/gui/main/RocketActions.java b/swing/src/net/sf/openrocket/gui/main/RocketActions.java index 6e389d1b5..c976a3993 100644 --- a/swing/src/net/sf/openrocket/gui/main/RocketActions.java +++ b/swing/src/net/sf/openrocket/gui/main/RocketActions.java @@ -72,7 +72,6 @@ public class RocketActions { private final RocketAction pasteAction; private final RocketAction duplicateAction; private final RocketAction editAction; - private final RocketAction editActionNoIcon; private final RocketAction scaleAction; private final RocketAction newStageAction; private final RocketAction moveUpAction; @@ -98,11 +97,7 @@ public class RocketActions { this.pasteAction = new PasteAction(); this.duplicateAction = new DuplicateAction(); this.editAction = new EditAction(); - this.editActionNoIcon = new EditAction(); this.scaleAction = new ScaleAction(); - this.editActionNoIcon.putValue(Action.SMALL_ICON, null); - this.editActionNoIcon.putValue(Action.MNEMONIC_KEY, null); - this.editActionNoIcon.putValue(Action.ACCELERATOR_KEY, null); this.newStageAction = new NewStageAction(); this.moveUpAction = new MoveUpAction(); this.moveDownAction = new MoveDownAction(); @@ -136,7 +131,6 @@ public class RocketActions { pasteAction.clipboardChanged(); duplicateAction.clipboardChanged(); editAction.clipboardChanged(); - editActionNoIcon.clipboardChanged(); scaleAction.clipboardChanged(); newStageAction.clipboardChanged(); moveUpAction.clipboardChanged(); @@ -178,10 +172,6 @@ public class RocketActions { return editAction; } - public Action getEditActionNoIcon() { - return editActionNoIcon; - } - public Action getScaleAction() { return scaleAction; } From 9e7a48261eb4f73c7b5c994c9c3d71ba7e06a450 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Tue, 31 May 2022 23:19:44 +0200 Subject: [PATCH 21/39] Add duplicate button to design tab --- swing/src/net/sf/openrocket/gui/main/BasicFrame.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java index 5ead81809..f5b09c622 100644 --- a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java +++ b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java @@ -354,6 +354,11 @@ public class BasicFrame extends JFrame { button = new SelectColorButton(actions.getEditAction()); button.setIcon(null); button.setMnemonic(0); + panel.add(button, "sizegroup buttons, gaptop 20%"); + + button = new SelectColorButton(actions.getDuplicateAction()); + button.setIcon(null); + button.setMnemonic(0); panel.add(button, "sizegroup buttons"); button = new SelectColorButton(actions.getDeleteAction()); From e79aa9d73905d9d0abad02e75e79798ad0506fd3 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Wed, 1 Jun 2022 03:01:22 +0200 Subject: [PATCH 22/39] Add right-click actions for motor config --- .../FlightConfigurationPanel.java | 141 +++++++++++++----- .../MotorConfigurationPanel.java | 133 ++++++++++++----- 2 files changed, 197 insertions(+), 77 deletions(-) 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 e03225cd8..578723e56 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurationPanel.java @@ -2,13 +2,16 @@ package net.sf.openrocket.gui.main.flightconfigpanel; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.MouseEvent; import java.util.EventObject; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import javax.swing.AbstractAction; import javax.swing.JButton; import javax.swing.JPanel; +import javax.swing.JPopupMenu; import javax.swing.JTabbedPane; import javax.swing.SwingUtilities; import javax.swing.event.ChangeEvent; @@ -48,6 +51,12 @@ public class FlightConfigurationPanel extends JPanel implements StateChangeListe private final RecoveryConfigurationPanel recoveryConfigurationPanel; private final SeparationConfigurationPanel separationConfigurationPanel; + private final JPopupMenu popupMenuConfig; + private final AbstractAction newConfigAction; + private final AbstractAction renameConfigAction; + private final AbstractAction removeConfigAction; + private final AbstractAction duplicateConfigAction; + private final static int MOTOR_TAB_INDEX = 0; private final static int RECOVERY_TAB_INDEX = 1; private final static int SEPARATION_TAB_INDEX = 2; @@ -59,8 +68,17 @@ public class FlightConfigurationPanel extends JPanel implements StateChangeListe this.document = doc; this.rocket = doc.getRocket(); this.rocket.addChangeListener(this); - - //JPanel panel = new JPanel(new MigLayout("fill","[grow][][][][][grow]")); + + // Populate the popup menu + popupMenuConfig = new JPopupMenu(); + newConfigAction = new NewConfigAction(); + renameConfigAction = new RenameConfigAction(); + removeConfigAction = new RemoveConfigAction(); + duplicateConfigAction = new DuplicateConfigAction(); + popupMenuConfig.add(newConfigAction); + popupMenuConfig.add(renameConfigAction); + popupMenuConfig.add(removeConfigAction); + popupMenuConfig.add(duplicateConfigAction); //// Tabs for advanced view. tabs = new JTabbedPane(); @@ -77,44 +95,20 @@ public class FlightConfigurationPanel extends JPanel implements StateChangeListe separationConfigurationPanel = new SeparationConfigurationPanel(this, rocket); tabs.add(trans.get("edtmotorconfdlg.lbl.Stagetab"), separationConfigurationPanel); - newConfButton = new SelectColorButton(trans.get("edtmotorconfdlg.but.Newconfiguration")); - newConfButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - newOrDuplicateConfigAction(false); - } - - }); - + //// New configuration + newConfButton = new SelectColorButton(newConfigAction); this.add(newConfButton,"skip 1,gapright para"); - - renameConfButton = new SelectColorButton(trans.get("edtmotorconfdlg.but.Renameconfiguration")); - renameConfButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - renameConfiguration(); - configurationChanged(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); - } - }); + + //// Rename configuration + renameConfButton = new SelectColorButton(renameConfigAction); this.add(renameConfButton,"gapright para"); - - removeConfButton = new SelectColorButton(trans.get("edtmotorconfdlg.but.Removeconfiguration")); - removeConfButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - removeConfiguration(); - configurationChanged(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); - } - }); + + //// Remove configuration + removeConfButton = new SelectColorButton(removeConfigAction); this.add(removeConfButton,"gapright para"); - - duplicateConfButton = new SelectColorButton(trans.get("edtmotorconfdlg.but.Duplicateconfiguration")); - duplicateConfButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - newOrDuplicateConfigAction(true); - } - }); + + //// Duplicate configuration + duplicateConfButton = new SelectColorButton(duplicateConfigAction); this.add(duplicateConfButton, "wrap"); tabs.addChangeListener(new ChangeListener() { @@ -150,7 +144,7 @@ public class FlightConfigurationPanel extends JPanel implements StateChangeListe stateChanged(null); switch (tabs.getSelectedIndex()) { case MOTOR_TAB_INDEX: - motorConfigurationPanel.selectMotor(); + motorConfigurationPanel.selectMotorAction(); break; case RECOVERY_TAB_INDEX: recoveryConfigurationPanel.selectDeployment(); @@ -215,7 +209,7 @@ public class FlightConfigurationPanel extends JPanel implements StateChangeListe rocket.setSelectedConfiguration((FlightConfigurationId) newConfigs.keySet().toArray()[0]); } - private void renameConfiguration() { + private void renameConfigurationAction() { List fcIds = getSelectedConfigurationIds(); if (fcIds == null) return; FlightConfigurationId initFcId = fcIds.get(0); @@ -224,9 +218,10 @@ public class FlightConfigurationPanel extends JPanel implements StateChangeListe for (int i = 1; i < fcIds.size(); i++) { rocket.getFlightConfiguration(fcIds.get(i)).setName(newName); } + configurationChanged(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); } - private void removeConfiguration() { + private void removeConfigurationAction() { List fcIds = getSelectedConfigurationIds(); if (fcIds == null || fcIds.size() == 0) return; @@ -237,7 +232,27 @@ public class FlightConfigurationPanel extends JPanel implements StateChangeListe configurationChanged(ComponentChangeEvent.NONFUNCTIONAL_CHANGE); } - + + public void doPopupConfig(MouseEvent e) { + popupMenuConfig.show(e.getComponent(), e.getX(), e.getY()); + } + + public AbstractAction getNewConfigAction() { + return newConfigAction; + } + + public AbstractAction getRenameConfigAction() { + return renameConfigAction; + } + + public AbstractAction getRemoveConfigAction() { + return removeConfigAction; + } + + public AbstractAction getDuplicateConfigAction() { + return duplicateConfigAction; + } + private void configurationChanged(int cce) { motorConfigurationPanel.fireTableDataChanged(cce); recoveryConfigurationPanel.fireTableDataChanged(cce); @@ -308,4 +323,48 @@ public class FlightConfigurationPanel extends JPanel implements StateChangeListe recoveryConfigurationPanel.synchronizeConfigurationSelection(); separationConfigurationPanel.synchronizeConfigurationSelection(); } + + private class NewConfigAction extends AbstractAction { + public NewConfigAction() { + putValue(NAME, trans.get("edtmotorconfdlg.but.Newconfiguration")); + } + + @Override + public void actionPerformed(ActionEvent e) { + newOrDuplicateConfigAction(false); + } + } + + private class RenameConfigAction extends AbstractAction { + public RenameConfigAction() { + putValue(NAME, trans.get("edtmotorconfdlg.but.Renameconfiguration")); + } + + @Override + public void actionPerformed(ActionEvent e) { + renameConfigurationAction(); + } + } + + private class RemoveConfigAction extends AbstractAction { + public RemoveConfigAction() { + putValue(NAME, trans.get("edtmotorconfdlg.but.Removeconfiguration")); + } + + @Override + public void actionPerformed(ActionEvent e) { + removeConfigurationAction(); + } + } + + private class DuplicateConfigAction extends AbstractAction { + public DuplicateConfigAction() { + putValue(NAME, trans.get("edtmotorconfdlg.but.Duplicateconfiguration")); + } + + @Override + public void actionPerformed(ActionEvent e) { + newOrDuplicateConfigAction(true); + } + } } 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 0cac6bca9..3a6f698d1 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/MotorConfigurationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/MotorConfigurationPanel.java @@ -3,7 +3,6 @@ package net.sf.openrocket.gui.main.flightconfigpanel; import java.awt.CardLayout; import java.awt.Dimension; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.KeyEvent; @@ -19,6 +18,7 @@ import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JLabel; import javax.swing.JPanel; +import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.KeyStroke; @@ -62,6 +62,16 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel private final MotorChooserDialog motorChooserDialog; protected FlightConfigurableTableModel configurationTableModel; + private final JPopupMenu popupMenuFull; // popup menu containing all the options + private final AbstractAction selectMotorAction; + private final AbstractAction removeMotorAction; + private final AbstractAction selectIgnitionAction; + private final AbstractAction resetIgnitionAction; + private final AbstractAction renameConfigAction; + private final AbstractAction removeConfigAction; + private final AbstractAction duplicateConfigAction; + + MotorConfigurationPanel(final FlightConfigurationPanel flightConfigurationPanel, Rocket rocket) { super(flightConfigurationPanel, rocket); @@ -82,6 +92,26 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel cards = new JPanel(new CardLayout()); this.add(cards, "pushy"); + // Get all the actions + selectMotorAction = new SelectMotorAction(); + removeMotorAction = new RemoveMotorAction(); + selectIgnitionAction = new SelectIgnitionAction(); + resetIgnitionAction = new ResetIgnitionAction(); + renameConfigAction = flightConfigurationPanel.getRenameConfigAction(); + removeConfigAction = flightConfigurationPanel.getRemoveConfigAction(); + duplicateConfigAction = flightConfigurationPanel.getDuplicateConfigAction(); + + // Populate the popup menu + popupMenuFull = new JPopupMenu(); + popupMenuFull.add(selectMotorAction); + popupMenuFull.add(removeMotorAction); + popupMenuFull.add(selectIgnitionAction); + popupMenuFull.add(resetIgnitionAction); + popupMenuFull.addSeparator(); + popupMenuFull.add(renameConfigAction); + popupMenuFull.add(removeConfigAction); + popupMenuFull.add(duplicateConfigAction); + JLabel helpText = new JLabel(trans.get("MotorConfigurationPanel.lbl.nomotors")); cards.add(helpText, HELP_LABEL ); @@ -93,43 +123,19 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel configurationPanel.add(scroll, "spanx, grow, pushy, wrap"); //// Select motor - selectMotorButton = new SelectColorButton(trans.get("MotorConfigurationPanel.btn.selectMotor")); - selectMotorButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - selectMotor(); - } - }); + selectMotorButton = new SelectColorButton(selectMotorAction); configurationPanel.add(selectMotorButton, "split, align right, sizegroup button"); //// Remove motor button - removeMotorButton = new SelectColorButton(trans.get("MotorConfigurationPanel.btn.removeMotor")); - removeMotorButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - removeMotor(); - } - }); + removeMotorButton = new SelectColorButton(removeMotorAction); configurationPanel.add(removeMotorButton, "sizegroup button"); //// Select Ignition button - selectIgnitionButton = new SelectColorButton(trans.get("MotorConfigurationPanel.btn.selectIgnition")); - selectIgnitionButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - selectIgnition(); - } - }); + selectIgnitionButton = new SelectColorButton(selectIgnitionAction); configurationPanel.add(selectIgnitionButton, "sizegroup button"); //// Reset Ignition button - resetIgnitionButton = new SelectColorButton(trans.get("MotorConfigurationPanel.btn.resetIgnition")); - resetIgnitionButton.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent e) { - resetIgnition(); - } - }); + resetIgnitionButton = new SelectColorButton(resetIgnitionAction); configurationPanel.add(resetIgnitionButton, "sizegroup button, wrap"); cards.add(configurationPanel, TABLE_LABEL ); @@ -142,7 +148,7 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel table.getActionMap().put("Enter", new AbstractAction() { @Override public void actionPerformed(ActionEvent ae) { - selectMotor(); + selectMotorAction(); } }); @@ -199,9 +205,16 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel public void mouseClicked(MouseEvent e) { updateButtonState(); int selectedColumn = table.getSelectedColumn(); - if (e.getClickCount() == 2) { + + if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 2) { if (selectedColumn > 0) { - selectMotor(); + selectMotorAction(); + } + } else if (e.getButton() == MouseEvent.BUTTON3 && e.getClickCount() == 1) { + if (selectedColumn > 0) { + doPopupFull(e); + } else { + flightConfigurationPanel.doPopupConfig(e); } } } @@ -234,6 +247,10 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel }); } + private void doPopupFull(MouseEvent e) { + popupMenuFull.show(e.getComponent(), e.getX(), e.getY()); + } + public void updateComponentSelection(ListSelectionEvent e) { if (e.getValueIsAdjusting()) { return; @@ -268,7 +285,7 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel } } - public void selectMotor() { + public void selectMotorAction() { List mounts = getSelectedComponents(); List fcIds = getSelectedConfigurationIds(); if ((mounts == null) || (fcIds == null) || mounts.size() == 0 || fcIds.size() == 0) { @@ -315,7 +332,7 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel } } - private void removeMotor() { + private void removeMotorAction() { List mounts = getSelectedComponents(); List fcIds = getSelectedConfigurationIds(); if ((mounts == null) || (fcIds == null) || mounts.size() == 0 || fcIds.size() == 0) { @@ -331,7 +348,7 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel fireTableDataChanged(ComponentChangeEvent.MOTOR_CHANGE); } - private void selectIgnition() { + private void selectIgnitionAction() { List mounts = getSelectedComponents(); List fcIds = getSelectedConfigurationIds(); if ((mounts == null) || (fcIds == null) || mounts.size() == 0 || fcIds.size() == 0) { @@ -380,7 +397,7 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel } - private void resetIgnition() { + private void resetIgnitionAction() { List mounts = getSelectedComponents(); List fcIds = getSelectedConfigurationIds(); if ((mounts == null) || (fcIds == null) || mounts.size() == 0 || fcIds.size() == 0) { @@ -408,6 +425,50 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel } + private class SelectMotorAction extends AbstractAction { + public SelectMotorAction() { + putValue(NAME, trans.get("MotorConfigurationPanel.btn.selectMotor")); + } + + @Override + public void actionPerformed(ActionEvent e) { + selectMotorAction(); + } + } + + private class RemoveMotorAction extends AbstractAction { + public RemoveMotorAction() { + putValue(NAME, trans.get("MotorConfigurationPanel.btn.removeMotor")); + } + + @Override + public void actionPerformed(ActionEvent e) { + removeMotorAction(); + } + } + + private class SelectIgnitionAction extends AbstractAction { + public SelectIgnitionAction() { + putValue(NAME, trans.get("MotorConfigurationPanel.btn.selectIgnition")); + } + + @Override + public void actionPerformed(ActionEvent e) { + selectIgnitionAction(); + } + } + + private class ResetIgnitionAction extends AbstractAction { + public ResetIgnitionAction() { + putValue(NAME, trans.get("MotorConfigurationPanel.btn.resetIgnition")); + } + + @Override + public void actionPerformed(ActionEvent e) { + resetIgnitionAction(); + } + } + private class MotorTableCellRenderer extends FlightConfigurablePanel.FlightConfigurableCellRenderer { @Override From da1d112efbb80b088e31caa6fca9a66150c20d03 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Wed, 1 Jun 2022 03:07:46 +0200 Subject: [PATCH 23/39] Change reset recovery button text From 'Reset to default' to 'Reset deployment' --- core/resources/l10n/messages.properties | 2 +- core/resources/l10n/messages_es.properties | 2 +- core/resources/l10n/messages_fr.properties | 2 +- core/resources/l10n/messages_nl.properties | 2 +- core/resources/l10n/messages_pt.properties | 2 +- core/resources/l10n/messages_uk_UA.properties | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/resources/l10n/messages.properties b/core/resources/l10n/messages.properties index 6023ef641..191f8c698 100644 --- a/core/resources/l10n/messages.properties +++ b/core/resources/l10n/messages.properties @@ -207,7 +207,7 @@ edtmotorconfdlg.tbl.None = None edtmotorconfdlg.tbl.Motorheader = Motor edtmotorconfdlg.tbl.Mountheader = Motor Mount edtmotorconfdlg.tbl.Ignitionheader = Ignition -edtmotorconfdlg.but.Resetdeployment = Reset to default +edtmotorconfdlg.but.Resetdeployment = Reset deployment edtmotorconfdlg.but.Selectdeployment = Select deployment edtmotorconfdlg.tbl.Recoveryheader = Recovery Device edtmotorconfdlg.tbl.Deploymentheader = Deployment diff --git a/core/resources/l10n/messages_es.properties b/core/resources/l10n/messages_es.properties index 61318e768..144ccc2fc 100644 --- a/core/resources/l10n/messages_es.properties +++ b/core/resources/l10n/messages_es.properties @@ -1387,7 +1387,7 @@ edtmotorconfdlg.but.Newconfiguration = Nueva configuraci\u00f3n ! Edit Motor configuration dialog edtmotorconfdlg.but.Removeconfiguration = Quitar configuraci\u00f3n edtmotorconfdlg.but.Renameconfiguration = Renombrar configuraci\u00f3n -edtmotorconfdlg.but.Resetdeployment = Reiniciar valor por defecto +edtmotorconfdlg.but.Resetdeployment = Reiniciar despliegue edtmotorconfdlg.but.Resetseparation = Reiniciar valor por defecto edtmotorconfdlg.but.Selectdeployment = Seleccionar despliegue edtmotorconfdlg.but.Selectseparation = Seleccionar separaci\u00f3n diff --git a/core/resources/l10n/messages_fr.properties b/core/resources/l10n/messages_fr.properties index 4b371f405..ce07b7ce3 100644 --- a/core/resources/l10n/messages_fr.properties +++ b/core/resources/l10n/messages_fr.properties @@ -1381,7 +1381,7 @@ edtmotorconfdlg.but.Duplicateconfiguration = Dupliquer edtmotorconfdlg.but.Newconfiguration = Nouvelle configuration edtmotorconfdlg.but.Removeconfiguration = Supprimer la configuration edtmotorconfdlg.but.Renameconfiguration = Renommer -edtmotorconfdlg.but.Resetdeployment = R\u00E9initialiser \u00E0 la valeur par d\u00E9faut +edtmotorconfdlg.but.Resetdeployment = R\u00E9initialiserle d\u00E9ploiement edtmotorconfdlg.but.Resetseparation = R\u00E9initialiser \u00E0 la valeur par d\u00E9faut edtmotorconfdlg.but.Selectdeployment = Choisir le d\u00E9ploiement edtmotorconfdlg.but.Selectseparation = Choisir la s\u00E9paration diff --git a/core/resources/l10n/messages_nl.properties b/core/resources/l10n/messages_nl.properties index 4d2ea8ae2..d023b7872 100644 --- a/core/resources/l10n/messages_nl.properties +++ b/core/resources/l10n/messages_nl.properties @@ -197,7 +197,7 @@ edtmotorconfdlg.tbl.None = Geen edtmotorconfdlg.tbl.Motorheader = Motor edtmotorconfdlg.tbl.Mountheader = Motorbevestiging edtmotorconfdlg.tbl.Ignitionheader = Ontsteking -edtmotorconfdlg.but.Resetdeployment = Herstel naar standaard +edtmotorconfdlg.but.Resetdeployment = Herstel ontplooiing edtmotorconfdlg.but.Selectdeployment = Selecteer ontplooiing edtmotorconfdlg.tbl.Recoveryheader = Herstelapparaat edtmotorconfdlg.tbl.Deploymentheader = Ontplooiing diff --git a/core/resources/l10n/messages_pt.properties b/core/resources/l10n/messages_pt.properties index bf6db32c0..5cb793503 100644 --- a/core/resources/l10n/messages_pt.properties +++ b/core/resources/l10n/messages_pt.properties @@ -1344,7 +1344,7 @@ edtmotorconfdlg.but.Duplicateconfiguration = Duplikat edtmotorconfdlg.but.Newconfiguration = Nova configura\u00e7\u00e3o edtmotorconfdlg.but.Removeconfiguration = Remover configura\u00e7\u00e3o edtmotorconfdlg.but.Renameconfiguration = Renomear -edtmotorconfdlg.but.Resetdeployment = Retornar aos padr\u00f5es +edtmotorconfdlg.but.Resetdeployment = Retornar o lan\u00e7amento edtmotorconfdlg.but.Resetseparation = Retornar aos padr\u00f5es edtmotorconfdlg.but.Selectdeployment = Selecionar o lan\u00e7amento edtmotorconfdlg.but.Selectseparation = Selecionar a separa\u00e7\u00e3o diff --git a/core/resources/l10n/messages_uk_UA.properties b/core/resources/l10n/messages_uk_UA.properties index 8e012cbfe..9b5683efa 100644 --- a/core/resources/l10n/messages_uk_UA.properties +++ b/core/resources/l10n/messages_uk_UA.properties @@ -199,7 +199,7 @@ edtmotorconfdlg.tbl.None = None edtmotorconfdlg.tbl.Motorheader = Motor edtmotorconfdlg.tbl.Mountheader = Motor Mount edtmotorconfdlg.tbl.Ignitionheader = Ignition -edtmotorconfdlg.but.Resetdeployment = Reset to default +edtmotorconfdlg.but.Resetdeployment = Reset deployment edtmotorconfdlg.but.Selectdeployment = Select deployment edtmotorconfdlg.tbl.Recoveryheader = Recovery Device edtmotorconfdlg.tbl.Deploymentheader = Deployment From 509ef101b82cfee6f32285f4b50c4b7e422c7d42 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Wed, 1 Jun 2022 03:11:02 +0200 Subject: [PATCH 24/39] Change reset separation button text From 'Reset to default' to 'Reset separation' --- core/resources/l10n/messages.properties | 2 +- core/resources/l10n/messages_es.properties | 2 +- core/resources/l10n/messages_fr.properties | 2 +- core/resources/l10n/messages_nl.properties | 2 +- core/resources/l10n/messages_pt.properties | 2 +- core/resources/l10n/messages_uk_UA.properties | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/core/resources/l10n/messages.properties b/core/resources/l10n/messages.properties index 191f8c698..1df581652 100644 --- a/core/resources/l10n/messages.properties +++ b/core/resources/l10n/messages.properties @@ -211,7 +211,7 @@ edtmotorconfdlg.but.Resetdeployment = Reset deployment edtmotorconfdlg.but.Selectdeployment = Select deployment edtmotorconfdlg.tbl.Recoveryheader = Recovery Device edtmotorconfdlg.tbl.Deploymentheader = Deployment -edtmotorconfdlg.but.Resetseparation = Reset to default +edtmotorconfdlg.but.Resetseparation = Reset separation edtmotorconfdlg.but.Selectseparation = Select separation edtmotorconfdlg.tbl.Stageheader = Stage edtmotorconfdlg.tbl.Separationheader = Separation diff --git a/core/resources/l10n/messages_es.properties b/core/resources/l10n/messages_es.properties index 144ccc2fc..9d0e5b2c3 100644 --- a/core/resources/l10n/messages_es.properties +++ b/core/resources/l10n/messages_es.properties @@ -1388,7 +1388,7 @@ edtmotorconfdlg.but.Newconfiguration = Nueva configuraci\u00f3n edtmotorconfdlg.but.Removeconfiguration = Quitar configuraci\u00f3n edtmotorconfdlg.but.Renameconfiguration = Renombrar configuraci\u00f3n edtmotorconfdlg.but.Resetdeployment = Reiniciar despliegue -edtmotorconfdlg.but.Resetseparation = Reiniciar valor por defecto +edtmotorconfdlg.but.Resetseparation = Reiniciar separaci\u00f3n edtmotorconfdlg.but.Selectdeployment = Seleccionar despliegue edtmotorconfdlg.but.Selectseparation = Seleccionar separaci\u00f3n edtmotorconfdlg.col.configuration = Configuraci\u00f3n diff --git a/core/resources/l10n/messages_fr.properties b/core/resources/l10n/messages_fr.properties index ce07b7ce3..ab7fb5544 100644 --- a/core/resources/l10n/messages_fr.properties +++ b/core/resources/l10n/messages_fr.properties @@ -1382,7 +1382,7 @@ edtmotorconfdlg.but.Newconfiguration = Nouvelle configuration edtmotorconfdlg.but.Removeconfiguration = Supprimer la configuration edtmotorconfdlg.but.Renameconfiguration = Renommer edtmotorconfdlg.but.Resetdeployment = R\u00E9initialiserle d\u00E9ploiement -edtmotorconfdlg.but.Resetseparation = R\u00E9initialiser \u00E0 la valeur par d\u00E9faut +edtmotorconfdlg.but.Resetseparation = R\u00E9initialiser la s\u00E9paration edtmotorconfdlg.but.Selectdeployment = Choisir le d\u00E9ploiement edtmotorconfdlg.but.Selectseparation = Choisir la s\u00E9paration edtmotorconfdlg.col.configuration = Configuration diff --git a/core/resources/l10n/messages_nl.properties b/core/resources/l10n/messages_nl.properties index d023b7872..557859b8a 100644 --- a/core/resources/l10n/messages_nl.properties +++ b/core/resources/l10n/messages_nl.properties @@ -201,7 +201,7 @@ edtmotorconfdlg.but.Resetdeployment = Herstel ontplooiing edtmotorconfdlg.but.Selectdeployment = Selecteer ontplooiing edtmotorconfdlg.tbl.Recoveryheader = Herstelapparaat edtmotorconfdlg.tbl.Deploymentheader = Ontplooiing -edtmotorconfdlg.but.Resetseparation = Herstel naar standaard +edtmotorconfdlg.but.Resetseparation = Herstel afscheiding edtmotorconfdlg.but.Selectseparation = Selecteer afscheiding edtmotorconfdlg.tbl.Stageheader = Trap edtmotorconfdlg.tbl.Separationheader = Afscheiding diff --git a/core/resources/l10n/messages_pt.properties b/core/resources/l10n/messages_pt.properties index 5cb793503..c40699812 100644 --- a/core/resources/l10n/messages_pt.properties +++ b/core/resources/l10n/messages_pt.properties @@ -1345,7 +1345,7 @@ edtmotorconfdlg.but.Newconfiguration = Nova configura\u00e7\u00e3o edtmotorconfdlg.but.Removeconfiguration = Remover configura\u00e7\u00e3o edtmotorconfdlg.but.Renameconfiguration = Renomear edtmotorconfdlg.but.Resetdeployment = Retornar o lan\u00e7amento -edtmotorconfdlg.but.Resetseparation = Retornar aos padr\u00f5es +edtmotorconfdlg.but.Resetseparation = Retornar a separa\u00e7\u00e3o edtmotorconfdlg.but.Selectdeployment = Selecionar o lan\u00e7amento edtmotorconfdlg.but.Selectseparation = Selecionar a separa\u00e7\u00e3o edtmotorconfdlg.lbl.Configname = Nome de configura\u00e7\u00e3o: diff --git a/core/resources/l10n/messages_uk_UA.properties b/core/resources/l10n/messages_uk_UA.properties index 9b5683efa..8a06a77ef 100644 --- a/core/resources/l10n/messages_uk_UA.properties +++ b/core/resources/l10n/messages_uk_UA.properties @@ -203,7 +203,7 @@ edtmotorconfdlg.but.Resetdeployment = Reset deployment edtmotorconfdlg.but.Selectdeployment = Select deployment edtmotorconfdlg.tbl.Recoveryheader = Recovery Device edtmotorconfdlg.tbl.Deploymentheader = Deployment -edtmotorconfdlg.but.Resetseparation = Reset to default +edtmotorconfdlg.but.Resetseparation = Reset separation edtmotorconfdlg.but.Selectseparation = Select separation edtmotorconfdlg.tbl.Stageheader = Stage edtmotorconfdlg.tbl.Separationheader = Separation From 84e7c951e649ff3463bf6708734a926887a83fee Mon Sep 17 00:00:00 2001 From: SiboVG Date: Wed, 1 Jun 2022 03:17:59 +0200 Subject: [PATCH 25/39] Code cleanup --- .../sf/openrocket/gui/main/RocketActions.java | 2 +- .../openrocket/gui/main/SimulationPanel.java | 28 +++++++++---------- .../FlightConfigurationPanel.java | 3 +- .../MotorConfigurationPanel.java | 20 ++++++------- 4 files changed, 26 insertions(+), 27 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/main/RocketActions.java b/swing/src/net/sf/openrocket/gui/main/RocketActions.java index c976a3993..83fb0cb92 100644 --- a/swing/src/net/sf/openrocket/gui/main/RocketActions.java +++ b/swing/src/net/sf/openrocket/gui/main/RocketActions.java @@ -911,7 +911,7 @@ public class RocketActions { } ComponentConfigDialog.showDialog(parentFrame, document, components.get(0), listeners); } else if (sims != null && sims.length > 0 && (simulationPanel != null)) { - simulationPanel.editSimulationAction(); + simulationPanel.editSimulation(); } } diff --git a/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java b/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java index fde27aa50..7dbcb1521 100644 --- a/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java @@ -137,7 +137,7 @@ public class SimulationPanel extends JPanel { editButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - editSimulationAction(); + editSimulation(); } }); this.add(editButton, "gapright para"); @@ -149,7 +149,7 @@ public class SimulationPanel extends JPanel { runButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - runSimulationAction(); + runSimulation(); } }); this.add(runButton, "gapright para"); @@ -161,7 +161,7 @@ public class SimulationPanel extends JPanel { deleteButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - deleteSimulationAction(); + deleteSimulation(); } }); this.add(deleteButton, "gapright para"); @@ -172,7 +172,7 @@ public class SimulationPanel extends JPanel { plotButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - plotSimulationAction(); + plotSimulation(); } }); this.add(plotButton, "wrap para"); @@ -524,7 +524,7 @@ public class SimulationPanel extends JPanel { updateButtonStates(); } - private void plotSimulationAction() { + private void plotSimulation() { int selected = simulationTable.getSelectedRow(); if (selected < 0) { return; @@ -546,7 +546,7 @@ public class SimulationPanel extends JPanel { openDialog(true, sim); } - private void deleteSimulationAction() { + private void deleteSimulation() { int[] selection = simulationTable.getSelectedRows(); if (selection.length == 0) { return; @@ -593,7 +593,7 @@ public class SimulationPanel extends JPanel { simulationTableModel.fireTableDataChanged(); } - private void runSimulationAction() { + private void runSimulation() { Simulation[] sims = getSelectedSimulations(); if (sims == null) return; @@ -604,7 +604,7 @@ public class SimulationPanel extends JPanel { fireMaintainSelection(); } - public void editSimulationAction() { + public void editSimulation() { Simulation[] sims = getSelectedSimulations(); if (sims == null) return; @@ -661,7 +661,7 @@ public class SimulationPanel extends JPanel { cb.setContents(sel, sel); } - private void duplicateSimulationAction() { + private void duplicateSimulation() { Simulation[] sims = getSelectedSimulations(); if (sims == null) return; @@ -780,7 +780,7 @@ public class SimulationPanel extends JPanel { @Override public void actionPerformed(ActionEvent e) { - editSimulationAction(); + editSimulation(); } } @@ -792,7 +792,7 @@ public class SimulationPanel extends JPanel { @Override public void actionPerformed(ActionEvent e) { - runSimulationAction(); + runSimulation(); } } @@ -806,7 +806,7 @@ public class SimulationPanel extends JPanel { @Override public void actionPerformed(ActionEvent e) { - deleteSimulationAction(); + deleteSimulation(); } } @@ -818,7 +818,7 @@ public class SimulationPanel extends JPanel { @Override public void actionPerformed(ActionEvent e) { - plotSimulationAction(); + plotSimulation(); } } @@ -832,7 +832,7 @@ public class SimulationPanel extends JPanel { @Override public void actionPerformed(ActionEvent e) { - duplicateSimulationAction(); + duplicateSimulation(); } } 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 578723e56..2e37fb14d 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/FlightConfigurationPanel.java @@ -1,7 +1,6 @@ package net.sf.openrocket.gui.main.flightconfigpanel; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.awt.event.MouseEvent; import java.util.EventObject; import java.util.LinkedHashMap; @@ -144,7 +143,7 @@ public class FlightConfigurationPanel extends JPanel implements StateChangeListe stateChanged(null); switch (tabs.getSelectedIndex()) { case MOTOR_TAB_INDEX: - motorConfigurationPanel.selectMotorAction(); + motorConfigurationPanel.selectMotor(); break; case RECOVERY_TAB_INDEX: recoveryConfigurationPanel.selectDeployment(); 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 3a6f698d1..f98cceaab 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/MotorConfigurationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/MotorConfigurationPanel.java @@ -148,7 +148,7 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel table.getActionMap().put("Enter", new AbstractAction() { @Override public void actionPerformed(ActionEvent ae) { - selectMotorAction(); + selectMotor(); } }); @@ -208,7 +208,7 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 2) { if (selectedColumn > 0) { - selectMotorAction(); + selectMotor(); } } else if (e.getButton() == MouseEvent.BUTTON3 && e.getClickCount() == 1) { if (selectedColumn > 0) { @@ -285,7 +285,7 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel } } - public void selectMotorAction() { + public void selectMotor() { List mounts = getSelectedComponents(); List fcIds = getSelectedConfigurationIds(); if ((mounts == null) || (fcIds == null) || mounts.size() == 0 || fcIds.size() == 0) { @@ -332,7 +332,7 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel } } - private void removeMotorAction() { + private void removeMotor() { List mounts = getSelectedComponents(); List fcIds = getSelectedConfigurationIds(); if ((mounts == null) || (fcIds == null) || mounts.size() == 0 || fcIds.size() == 0) { @@ -348,7 +348,7 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel fireTableDataChanged(ComponentChangeEvent.MOTOR_CHANGE); } - private void selectIgnitionAction() { + private void selectIgnition() { List mounts = getSelectedComponents(); List fcIds = getSelectedConfigurationIds(); if ((mounts == null) || (fcIds == null) || mounts.size() == 0 || fcIds.size() == 0) { @@ -397,7 +397,7 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel } - private void resetIgnitionAction() { + private void resetIgnition() { List mounts = getSelectedComponents(); List fcIds = getSelectedConfigurationIds(); if ((mounts == null) || (fcIds == null) || mounts.size() == 0 || fcIds.size() == 0) { @@ -432,7 +432,7 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel @Override public void actionPerformed(ActionEvent e) { - selectMotorAction(); + selectMotor(); } } @@ -443,7 +443,7 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel @Override public void actionPerformed(ActionEvent e) { - removeMotorAction(); + removeMotor(); } } @@ -454,7 +454,7 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel @Override public void actionPerformed(ActionEvent e) { - selectIgnitionAction(); + selectIgnition(); } } @@ -465,7 +465,7 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel @Override public void actionPerformed(ActionEvent e) { - resetIgnitionAction(); + resetIgnition(); } } From c62320931f104ee7e4f610ad86a491614840fd80 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Wed, 1 Jun 2022 03:23:12 +0200 Subject: [PATCH 26/39] Add right-click actions to recovery table --- .../RecoveryConfigurationPanel.java | 80 ++++++++++++++----- 1 file changed, 62 insertions(+), 18 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/RecoveryConfigurationPanel.java b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/RecoveryConfigurationPanel.java index dceb85424..4011ca488 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/RecoveryConfigurationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/RecoveryConfigurationPanel.java @@ -1,7 +1,6 @@ package net.sf.openrocket.gui.main.flightconfigpanel; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; @@ -12,6 +11,7 @@ import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JLabel; +import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.KeyStroke; @@ -36,6 +36,13 @@ public class RecoveryConfigurationPanel extends FlightConfigurablePanel 0) { + selectDeployment(); + } + } else if (e.getButton() == MouseEvent.BUTTON3 && e.getClickCount() == 1) { + if (selectedColumn > 0) { + doPopupFull(e); + } else { + flightConfigurationPanel.doPopupConfig(e); + } } } }); @@ -185,6 +204,10 @@ public class RecoveryConfigurationPanel extends FlightConfigurablePanel Date: Wed, 1 Jun 2022 03:29:21 +0200 Subject: [PATCH 27/39] Add right-click actions to separation table --- .../SeparationConfigurationPanel.java | 87 ++++++++++++++----- 1 file changed, 66 insertions(+), 21 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/SeparationConfigurationPanel.java b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/SeparationConfigurationPanel.java index e49e363e6..564c1446b 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/SeparationConfigurationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/SeparationConfigurationPanel.java @@ -1,7 +1,6 @@ package net.sf.openrocket.gui.main.flightconfigpanel; import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; import java.awt.event.KeyEvent; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; @@ -12,6 +11,7 @@ import javax.swing.JButton; import javax.swing.JComponent; import javax.swing.JDialog; import javax.swing.JLabel; +import javax.swing.JPopupMenu; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.KeyStroke; @@ -39,6 +39,13 @@ public class SeparationConfigurationPanel extends FlightConfigurablePanel separationTableModel; private final JButton selectSeparationButton; private final JButton resetDeploymentButton; + + private final JPopupMenu popupMenuFull; // popup menu containing all the options + private final AbstractAction selectSeparationAction; + private final AbstractAction resetSeparationAction; + private final AbstractAction renameConfigAction; + private final AbstractAction removeConfigAction; + private final AbstractAction duplicateConfigAction; SeparationConfigurationPanel(FlightConfigurationPanel flightConfigurationPanel, Rocket rocket) { @@ -46,27 +53,31 @@ public class SeparationConfigurationPanel extends FlightConfigurablePanel 0) { + selectSeparation(); + } + } else if (e.getButton() == MouseEvent.BUTTON3 && e.getClickCount() == 1) { + if (selectedColumn > 0) { + doPopupFull(e); + } else { + flightConfigurationPanel.doPopupConfig(e); + } } } }); @@ -192,6 +212,11 @@ public class SeparationConfigurationPanel extends FlightConfigurablePanel Date: Wed, 1 Jun 2022 03:35:15 +0200 Subject: [PATCH 28/39] Code cleanup --- .../MotorConfigurationPanel.java | 21 +++++++------------ .../RecoveryConfigurationPanel.java | 16 +++++--------- .../SeparationConfigurationPanel.java | 20 +++++++----------- 3 files changed, 19 insertions(+), 38 deletions(-) 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 f98cceaab..ca3f0c227 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/MotorConfigurationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/MotorConfigurationPanel.java @@ -63,13 +63,6 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel protected FlightConfigurableTableModel configurationTableModel; private final JPopupMenu popupMenuFull; // popup menu containing all the options - private final AbstractAction selectMotorAction; - private final AbstractAction removeMotorAction; - private final AbstractAction selectIgnitionAction; - private final AbstractAction resetIgnitionAction; - private final AbstractAction renameConfigAction; - private final AbstractAction removeConfigAction; - private final AbstractAction duplicateConfigAction; MotorConfigurationPanel(final FlightConfigurationPanel flightConfigurationPanel, Rocket rocket) { @@ -93,13 +86,13 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel this.add(cards, "pushy"); // Get all the actions - selectMotorAction = new SelectMotorAction(); - removeMotorAction = new RemoveMotorAction(); - selectIgnitionAction = new SelectIgnitionAction(); - resetIgnitionAction = new ResetIgnitionAction(); - renameConfigAction = flightConfigurationPanel.getRenameConfigAction(); - removeConfigAction = flightConfigurationPanel.getRemoveConfigAction(); - duplicateConfigAction = flightConfigurationPanel.getDuplicateConfigAction(); + AbstractAction selectMotorAction = new SelectMotorAction(); + AbstractAction removeMotorAction = new RemoveMotorAction(); + AbstractAction selectIgnitionAction = new SelectIgnitionAction(); + AbstractAction resetIgnitionAction = new ResetIgnitionAction(); + AbstractAction renameConfigAction = flightConfigurationPanel.getRenameConfigAction(); + AbstractAction removeConfigAction = flightConfigurationPanel.getRemoveConfigAction(); + AbstractAction duplicateConfigAction = flightConfigurationPanel.getDuplicateConfigAction(); // Populate the popup menu popupMenuFull = new JPopupMenu(); diff --git a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/RecoveryConfigurationPanel.java b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/RecoveryConfigurationPanel.java index 4011ca488..a6cdf3e01 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/RecoveryConfigurationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/RecoveryConfigurationPanel.java @@ -35,13 +35,7 @@ public class RecoveryConfigurationPanel extends FlightConfigurablePanel recoveryTableModel; private final JButton selectDeploymentButton; private final JButton resetDeploymentButton; - private final JPopupMenu popupMenuFull; // popup menu containing all the options - private final AbstractAction selectDeploymentAction; - private final AbstractAction resetDeploymentAction; - private final AbstractAction renameConfigAction; - private final AbstractAction removeConfigAction; - private final AbstractAction duplicateConfigAction; RecoveryConfigurationPanel(FlightConfigurationPanel flightConfigurationPanel, Rocket rocket) { @@ -51,11 +45,11 @@ public class RecoveryConfigurationPanel extends FlightConfigurablePanel separationTableModel; private final JButton selectSeparationButton; private final JButton resetDeploymentButton; - private final JPopupMenu popupMenuFull; // popup menu containing all the options - private final AbstractAction selectSeparationAction; - private final AbstractAction resetSeparationAction; - private final AbstractAction renameConfigAction; - private final AbstractAction removeConfigAction; - private final AbstractAction duplicateConfigAction; - - + + SeparationConfigurationPanel(FlightConfigurationPanel flightConfigurationPanel, Rocket rocket) { super(flightConfigurationPanel,rocket); @@ -55,11 +49,11 @@ public class SeparationConfigurationPanel extends FlightConfigurablePanel Date: Wed, 1 Jun 2022 03:37:09 +0200 Subject: [PATCH 29/39] Add extra popup separator for motor config --- .../gui/main/flightconfigpanel/MotorConfigurationPanel.java | 1 + 1 file changed, 1 insertion(+) 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 ca3f0c227..3d0488199 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/MotorConfigurationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/MotorConfigurationPanel.java @@ -98,6 +98,7 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel popupMenuFull = new JPopupMenu(); popupMenuFull.add(selectMotorAction); popupMenuFull.add(removeMotorAction); + popupMenuFull.addSeparator(); popupMenuFull.add(selectIgnitionAction); popupMenuFull.add(resetIgnitionAction); popupMenuFull.addSeparator(); From 78aaeed1b53646c11eace185022bfe80a619d286 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Wed, 1 Jun 2022 03:43:02 +0200 Subject: [PATCH 30/39] Add small gap between buttons in motor config --- .../gui/main/flightconfigpanel/MotorConfigurationPanel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 3d0488199..339833e64 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/MotorConfigurationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/MotorConfigurationPanel.java @@ -126,7 +126,7 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel //// Select Ignition button selectIgnitionButton = new SelectColorButton(selectIgnitionAction); - configurationPanel.add(selectIgnitionButton, "sizegroup button"); + configurationPanel.add(selectIgnitionButton, "sizegroup button, gapleft para"); //// Reset Ignition button resetIgnitionButton = new SelectColorButton(resetIgnitionAction); From 7b54af26233583e4af038e15a72e18891d8aa3cc Mon Sep 17 00:00:00 2001 From: SiboVG Date: Wed, 1 Jun 2022 04:50:36 +0200 Subject: [PATCH 31/39] Fix selection issue in motor, recovery and stage table --- .../MotorConfigurationPanel.java | 19 ++++++++++++++- .../RecoveryConfigurationPanel.java | 23 ++++++++++++++++++- .../SeparationConfigurationPanel.java | 23 ++++++++++++++++++- 3 files changed, 62 insertions(+), 3 deletions(-) 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 339833e64..9d7a798ad 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/MotorConfigurationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/MotorConfigurationPanel.java @@ -194,10 +194,27 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel configurationTable.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); configurationTable.setDefaultRenderer(Object.class, new MotorTableCellRenderer()); + ListSelectionListener listener = new ListSelectionListener() { + private int previousRow = -1; + private int previousColumn = -1; + + @Override + public void valueChanged(ListSelectionEvent event) { + if (table != null && (configurationTable.getSelectedRow() != previousRow || + configurationTable.getSelectedColumn() != previousColumn)) { + updateButtonState(); + previousRow = configurationTable.getSelectedRow(); + previousColumn = configurationTable.getSelectedColumn(); + } + } + }; + + configurationTable.getSelectionModel().addListSelectionListener(listener); + configurationTable.getColumnModel().getSelectionModel().addListSelectionListener(listener); + configurationTable.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { - updateButtonState(); int selectedColumn = table.getSelectedColumn(); if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 2) { diff --git a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/RecoveryConfigurationPanel.java b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/RecoveryConfigurationPanel.java index a6cdf3e01..6f355e340 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/RecoveryConfigurationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/RecoveryConfigurationPanel.java @@ -17,6 +17,8 @@ import javax.swing.JTable; import javax.swing.KeyStroke; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; import net.sf.openrocket.formatting.RocketDescriptor; import net.sf.openrocket.gui.dialogs.flightconfiguration.DeploymentSelectionDialog; @@ -89,10 +91,28 @@ public class RecoveryConfigurationPanel extends FlightConfigurablePanel { final RocketComponent source = cce.getSource(); if(source instanceof FlightConfigurableComponent) { diff --git a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/SeparationConfigurationPanel.java b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/SeparationConfigurationPanel.java index 9d81bbf59..ba9a96281 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/SeparationConfigurationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/SeparationConfigurationPanel.java @@ -17,6 +17,8 @@ import javax.swing.JTable; import javax.swing.KeyStroke; import javax.swing.ListSelectionModel; import javax.swing.SwingUtilities; +import javax.swing.event.ListSelectionEvent; +import javax.swing.event.ListSelectionListener; import net.sf.openrocket.formatting.RocketDescriptor; import net.sf.openrocket.gui.dialogs.flightconfiguration.SeparationSelectionDialog; @@ -109,10 +111,28 @@ public class SeparationConfigurationPanel extends FlightConfigurablePanel Date: Wed, 1 Jun 2022 20:17:21 +0200 Subject: [PATCH 32/39] Scale entire rocket when rocket or stage selected --- .../net/sf/openrocket/gui/dialogs/ScaleDialog.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/swing/src/net/sf/openrocket/gui/dialogs/ScaleDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/ScaleDialog.java index 235ad81a6..df7a0717d 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/ScaleDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/ScaleDialog.java @@ -347,7 +347,16 @@ public class ScaleDialog extends JDialog { // Select the 'scale component / scale selection and all subcomponents' if a component is selected if (selection != null && selection.size() > 0) { - selectionOption.setSelectedIndex(1); + boolean entireRocket = false; // Flag to scale entire rocket + for (RocketComponent component : selection) { + if (component instanceof Rocket || (component instanceof AxialStage && !(component instanceof ParallelStage))) { + entireRocket = true; + break; + } + } + if (!entireRocket) { + selectionOption.setSelectedIndex(1); + } } // Change the offset checkbox to false when 'Scale selection' is selection and only one component is selected, From 34b2a0a2213bb527bfa7be5d108da97054d450d8 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Wed, 1 Jun 2022 22:09:03 +0200 Subject: [PATCH 33/39] Add click action for right-click --- .../sf/openrocket/gui/main/BasicFrame.java | 7 +++ .../MotorConfigurationPanel.java | 16 ++++++ .../RecoveryConfigurationPanel.java | 16 ++++++ .../SeparationConfigurationPanel.java | 16 ++++++ .../gui/scalefigure/RocketPanel.java | 53 ++++++++++++------- 5 files changed, 89 insertions(+), 19 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java index f5b09c622..880713cfa 100644 --- a/swing/src/net/sf/openrocket/gui/main/BasicFrame.java +++ b/swing/src/net/sf/openrocket/gui/main/BasicFrame.java @@ -304,8 +304,15 @@ public class BasicFrame extends JFrame { ComponentConfigDialog.showDialog(BasicFrame.this, BasicFrame.this.document, c); } else if ((e.getButton() == MouseEvent.BUTTON3) && (e.getClickCount() == 1)) { + if (!tree.isPathSelected(selPath)) { + // Select new path + tree.setSelectionPath(selPath); + } + doComponentTreePopup(e); } + } else { + tree.clearSelection(); } } }; 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 9d7a798ad..6050f84f6 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/MotorConfigurationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/MotorConfigurationPanel.java @@ -222,6 +222,22 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel selectMotor(); } } else if (e.getButton() == MouseEvent.BUTTON3 && e.getClickCount() == 1) { + // Get the row and column of the selected cell + int r = configurationTable.rowAtPoint(e.getPoint()); + int c = configurationTable.columnAtPoint(e.getPoint()); + + // Select new cell + if (!configurationTable.isCellSelected(r, c)) { + if (r >= 0 && r < configurationTable.getRowCount() && + c >= 0 && c < configurationTable.getColumnCount()) { + configurationTable.setRowSelectionInterval(r, r); + configurationTable.setColumnSelectionInterval(c, c); + } else { + configurationTable.clearSelection(); + return; + } + } + if (selectedColumn > 0) { doPopupFull(e); } else { diff --git a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/RecoveryConfigurationPanel.java b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/RecoveryConfigurationPanel.java index 6f355e340..bcd37bba9 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/RecoveryConfigurationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/RecoveryConfigurationPanel.java @@ -120,6 +120,22 @@ public class RecoveryConfigurationPanel extends FlightConfigurablePanel= 0 && r < recoveryTable.getRowCount() && + c >= 0 && c < recoveryTable.getColumnCount()) { + recoveryTable.setRowSelectionInterval(r, r); + recoveryTable.setColumnSelectionInterval(c, c); + } else { + recoveryTable.clearSelection(); + return; + } + } + if (selectedColumn > 0) { doPopupFull(e); } else { diff --git a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/SeparationConfigurationPanel.java b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/SeparationConfigurationPanel.java index ba9a96281..de4c05831 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/SeparationConfigurationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/SeparationConfigurationPanel.java @@ -140,6 +140,22 @@ public class SeparationConfigurationPanel extends FlightConfigurablePanel= 0 && r < separationTable.getRowCount() && + c >= 0 && c < separationTable.getColumnCount()) { + separationTable.setRowSelectionInterval(r, r); + separationTable.setColumnSelectionInterval(c, c); + } else { + separationTable.clearSelection(); + return; + } + } + if (selectedColumn > 0) { doPopupFull(e); } else { diff --git a/swing/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java b/swing/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java index f3250aa7b..01f57a6a4 100644 --- a/swing/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java +++ b/swing/src/net/sf/openrocket/gui/scalefigure/RocketPanel.java @@ -554,33 +554,48 @@ public class RocketPanel extends JPanel implements TreeSelectionListener, Change public static final int CYCLE_SELECTION_MODIFIER = InputEvent.SHIFT_DOWN_MASK; private void handleMouseClick(MouseEvent event) { - if (event.getButton() == MouseEvent.BUTTON1) { - // Get the component that is clicked on - Point p0 = event.getPoint(); - Point p1 = scrollPane.getViewport().getViewPosition(); - int x = p0.x + p1.x; - int y = p0.y + p1.y; + // Get the component that is clicked on + Point p0 = event.getPoint(); + Point p1 = scrollPane.getViewport().getViewPosition(); + int x = p0.x + p1.x; + int y = p0.y + p1.y; - RocketComponent[] clicked = figure.getComponentsByPoint(x, y); + RocketComponent[] clicked = figure.getComponentsByPoint(x, y); - handleComponentClick(clicked, event); - } else if (event.getButton() == MouseEvent.BUTTON3) { - List selectedComponents = Arrays.stream(selectionModel.getSelectionPaths()) - .map(c -> (RocketComponent) c.getLastPathComponent()).collect(Collectors.toList()); - - if (selectedComponents.size() == 0) return; - - basicFrame.doComponentTreePopup(event); - } - } - - private void handleComponentClick(RocketComponent[] clicked, MouseEvent event) { // If no component is clicked, do nothing if (clicked.length == 0) { selectionModel.setSelectionPath(null); return; } + if (event.getButton() == MouseEvent.BUTTON1) { + handleComponentClick(clicked, event); + } else if (event.getButton() == MouseEvent.BUTTON3) { + List selectedComponents = Arrays.stream(selectionModel.getSelectionPaths()) + .map(c -> (RocketComponent) c.getLastPathComponent()).collect(Collectors.toList()); + + boolean newClick = true; + for (RocketComponent component : clicked) { + if (selectedComponents.contains(component)) { + newClick = false; + break; + } + } + + if (newClick) { + for (RocketComponent rocketComponent : clicked) { + if (!selectedComponents.contains(rocketComponent)) { + TreePath path = ComponentTreeModel.makeTreePath(rocketComponent); + selectionModel.setSelectionPath(path); + } + } + } + + basicFrame.doComponentTreePopup(event); + } + } + + private void handleComponentClick(RocketComponent[] clicked, MouseEvent event) { List selectedComponents = Arrays.stream(selectionModel.getSelectionPaths()) .map(c -> (RocketComponent) c.getLastPathComponent()).collect(Collectors.toList()); From 95aedeaaf34517fe7666c16fea6bfcf3fa563656 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Wed, 1 Jun 2022 23:51:15 +0200 Subject: [PATCH 34/39] Clean up copyComponentsMaintainParent --- .../sf/openrocket/gui/main/RocketActions.java | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/main/RocketActions.java b/swing/src/net/sf/openrocket/gui/main/RocketActions.java index 83fb0cb92..ff1d94593 100644 --- a/swing/src/net/sf/openrocket/gui/main/RocketActions.java +++ b/swing/src/net/sf/openrocket/gui/main/RocketActions.java @@ -267,20 +267,10 @@ public class RocketActions { for (int i = 0; i < components.size(); i++) { if (components.contains(components.get(i).getParent())) { - RocketComponent oldChild = components.get(i); - RocketComponent oldParent = oldChild.getParent(); + RocketComponent originalParent = components.get(i).getParent(); + int originalParentIdx = components.indexOf(originalParent); - int index = components.indexOf(oldParent); - int childPos = oldParent.getChildPosition(oldChild); - - RocketComponent newChild = result.get(i); - RocketComponent newParent = result.get(index); - - // Add the newly copied child to the parent - newParent.addChild(newChild, childPos); - - // Remove the old child from the parent - newParent.removeChild(oldChild); + result.get(originalParentIdx).addChild(result.get(i)); } } From 8f2201ba9b80c6a2cad21ce260b7132b643843dd Mon Sep 17 00:00:00 2001 From: SiboVG Date: Thu, 2 Jun 2022 00:44:10 +0200 Subject: [PATCH 35/39] Fix duplication NullPointException --- .../sf/openrocket/gui/main/RocketActions.java | 24 +++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/main/RocketActions.java b/swing/src/net/sf/openrocket/gui/main/RocketActions.java index ff1d94593..61a864c2c 100644 --- a/swing/src/net/sf/openrocket/gui/main/RocketActions.java +++ b/swing/src/net/sf/openrocket/gui/main/RocketActions.java @@ -5,6 +5,7 @@ import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.KeyEvent; import java.util.ArrayList; +import java.util.Collections; import java.util.Comparator; import java.util.LinkedList; import java.util.List; @@ -802,41 +803,40 @@ public class RocketActions { public void actionPerformed(ActionEvent e) { List components = selectionModel.getSelectedComponents(); if (components != null) { + components.sort(Comparator.comparing(c -> c.getParent() != null ? c.getParent().getChildPosition(c) : 0)); components = new ArrayList<>(components); fillInMissingSelections(components); - - components.sort(Comparator.comparing(c -> c.getParent() != null ? -c.getParent().getChildPosition(c) : 0)); } Simulation[] sims = selectionModel.getSelectedSimulations(); if (isCopyable(components)) { ComponentConfigDialog.disposeDialog(); - List copiedComponents = new LinkedList<>(copyComponentsMaintainParent(components)); + List copiedComponents = copyComponentsMaintainParent(components); OpenRocketClipboard.setClipboard(copiedComponents); - copiedComponents = new LinkedList<>(OpenRocketClipboard.getClipboardComponents()); - List pasted = new LinkedList<>(); + + List duplicateComponents = new LinkedList<>(); for (RocketComponent component : copiedComponents) { - pasted.add(component.copy()); + duplicateComponents.add(component.copy()); } List> positions = new LinkedList<>(); - for (RocketComponent component : pasted) { + for (RocketComponent component : duplicateComponents) { positions.add(getPastePosition(component)); } - if (pasted.size() == 1) { - document.addUndoPosition("Duplicate " + pasted.get(0).getComponentName()); + if (duplicateComponents.size() == 1) { + document.addUndoPosition("Duplicate " + duplicateComponents.get(0).getComponentName()); } else { document.addUndoPosition("Duplicate components"); } - for (int i = 0; i < pasted.size(); i++) { - positions.get(i).getU().addChild(pasted.get(i), positions.get(i).getV()); + for (int i = 0; i < duplicateComponents.size(); i++) { + positions.get(i).getU().addChild(duplicateComponents.get(i), positions.get(i).getV()); } - selectionModel.setSelectedComponents(pasted); + selectionModel.setSelectedComponents(duplicateComponents); parentFrame.selectTab(BasicFrame.COMPONENT_TAB); } else if (sims != null && sims.length > 0) { From 749047a7914f3838da861a3c27e797867caa82f1 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Thu, 2 Jun 2022 00:48:05 +0200 Subject: [PATCH 36/39] Fix popup not correct column --- .../gui/main/flightconfigpanel/MotorConfigurationPanel.java | 2 +- .../gui/main/flightconfigpanel/RecoveryConfigurationPanel.java | 2 +- .../main/flightconfigpanel/SeparationConfigurationPanel.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) 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 6050f84f6..f2e6a3f27 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/MotorConfigurationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/MotorConfigurationPanel.java @@ -238,7 +238,7 @@ public class MotorConfigurationPanel extends FlightConfigurablePanel } } - if (selectedColumn > 0) { + if (c > 0) { doPopupFull(e); } else { flightConfigurationPanel.doPopupConfig(e); diff --git a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/RecoveryConfigurationPanel.java b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/RecoveryConfigurationPanel.java index bcd37bba9..fb174692a 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/RecoveryConfigurationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/RecoveryConfigurationPanel.java @@ -136,7 +136,7 @@ public class RecoveryConfigurationPanel extends FlightConfigurablePanel 0) { + if (c > 0) { doPopupFull(e); } else { flightConfigurationPanel.doPopupConfig(e); diff --git a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/SeparationConfigurationPanel.java b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/SeparationConfigurationPanel.java index de4c05831..6ae182dcd 100644 --- a/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/SeparationConfigurationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/flightconfigpanel/SeparationConfigurationPanel.java @@ -156,7 +156,7 @@ public class SeparationConfigurationPanel extends FlightConfigurablePanel 0) { + if (c > 0) { doPopupFull(e); } else { flightConfigurationPanel.doPopupConfig(e); From fd4c647b36440f5dcf97be937c0ea6e4360b99bc Mon Sep 17 00:00:00 2001 From: SiboVG Date: Thu, 2 Jun 2022 01:10:43 +0200 Subject: [PATCH 37/39] Add right-click select to simulation panel --- .../sf/openrocket/gui/main/SimulationPanel.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java b/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java index 7dbcb1521..f8ac84ec5 100644 --- a/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java +++ b/swing/src/net/sf/openrocket/gui/main/SimulationPanel.java @@ -464,9 +464,6 @@ public class SimulationPanel extends JPanel { @Override public void mouseClicked(MouseEvent e) { int selectedRow = simulationTable.getSelectedRow(); - if (selectedRow < 0) { - return; - } if (e.getButton() == MouseEvent.BUTTON1 && e.getClickCount() == 2) { int selected = simulationTable.convertRowIndexToModel(selectedRow); @@ -475,13 +472,24 @@ public class SimulationPanel extends JPanel { if (column == 0) { SimulationWarningDialog.showWarningDialog(SimulationPanel.this, document.getSimulations().get(selected)); } else { - simulationTable.clearSelection(); simulationTable.addRowSelectionInterval(selectedRow, selectedRow); openDialog(document.getSimulations().get(selected)); } } else if (e.getButton() == MouseEvent.BUTTON3 && e.getClickCount() == 1) { + // Get the row that the right-click action happened on + int r = simulationTable.rowAtPoint(e.getPoint()); + + // Select new row + if (!simulationTable.isRowSelected(r)) { + if (r >= 0 && r < simulationTable.getRowCount()) { + simulationTable.setRowSelectionInterval(r, r); + } else { + return; + } + } + doPopup(e); } } From 5b482ccdab20a63e54915fe84dc2434cb5152b32 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Thu, 2 Jun 2022 01:24:58 +0200 Subject: [PATCH 38/39] Add undo for sim duplicate --- swing/src/net/sf/openrocket/gui/main/RocketActions.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/swing/src/net/sf/openrocket/gui/main/RocketActions.java b/swing/src/net/sf/openrocket/gui/main/RocketActions.java index 61a864c2c..ca3e49a5e 100644 --- a/swing/src/net/sf/openrocket/gui/main/RocketActions.java +++ b/swing/src/net/sf/openrocket/gui/main/RocketActions.java @@ -842,6 +842,13 @@ public class RocketActions { } else if (sims != null && sims.length > 0) { ArrayList copySims = new ArrayList(); + // TODO: the undoing doesn't do anything... + if (sims.length == 1) { + document.addUndoPosition("Duplicate " + sims[0].getName()); + } else { + document.addUndoPosition("Duplicate simulations"); + } + for (Simulation s: sims) { Simulation copy = s.duplicateSimulation(rocket); String name = copy.getName(); @@ -851,7 +858,7 @@ public class RocketActions { document.addSimulation(copy); copySims.add(copy); } - // TODO: undo + selectionModel.setSelectedSimulations(copySims.toArray(new Simulation[0])); parentFrame.selectTab(BasicFrame.SIMULATION_TAB); From ce4172524b766439145f23c6b2717b6ce5c84bb2 Mon Sep 17 00:00:00 2001 From: SiboVG Date: Thu, 2 Jun 2022 01:31:57 +0200 Subject: [PATCH 39/39] Fix scale issue for stage and rocket --- swing/src/net/sf/openrocket/gui/dialogs/ScaleDialog.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/swing/src/net/sf/openrocket/gui/dialogs/ScaleDialog.java b/swing/src/net/sf/openrocket/gui/dialogs/ScaleDialog.java index df7a0717d..ad53576e6 100644 --- a/swing/src/net/sf/openrocket/gui/dialogs/ScaleDialog.java +++ b/swing/src/net/sf/openrocket/gui/dialogs/ScaleDialog.java @@ -585,7 +585,7 @@ public class ScaleDialog extends JDialog { */ private void scaleChildren(RocketComponent component, List scaledComponents, double mul, boolean scaleMass) { for (RocketComponent child : component.getChildren()) { - if (!scaledComponents.contains(component)) { + if (!scaledComponents.contains(child)) { scale(child, mul, scaleMass, scaleOffsets.isSelected()); scaledComponents.add(child); scaleChildren(child, scaledComponents, mul, scaleMass);