package net.sf.openrocket.gui.simulation; import java.awt.CardLayout; import java.awt.Window; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JDialog; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JTabbedPane; import javax.swing.JTextField; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import net.miginfocom.swing.MigLayout; import net.sf.openrocket.document.OpenRocketDocument; import net.sf.openrocket.document.Simulation; import net.sf.openrocket.gui.adaptors.FlightConfigurationModel; import net.sf.openrocket.gui.util.GUIUtil; import net.sf.openrocket.l10n.Translator; import net.sf.openrocket.rocketcomponent.Configuration; import net.sf.openrocket.simulation.SimulationOptions; import net.sf.openrocket.simulation.extension.SimulationExtension; import net.sf.openrocket.startup.Application; public class SimulationEditDialog extends JDialog { private final Window parentWindow; private final Simulation[] simulation; private final OpenRocketDocument document; private final SimulationOptions conditions; private final Configuration configuration; private static final Translator trans = Application.getTranslator(); JPanel cards; private final static String EDITMODE = "EDIT"; private final static String PLOTMODE = "PLOT"; public SimulationEditDialog(Window parent, final OpenRocketDocument document, Simulation... sims) { //// Edit simulation super(parent, trans.get("simedtdlg.title.Editsim"), JDialog.ModalityType.DOCUMENT_MODAL); this.document = document; this.parentWindow = parent; this.simulation = sims; this.conditions = simulation[0].getOptions(); configuration = simulation[0].getConfiguration(); this.cards = new JPanel(new CardLayout()); this.add(cards); buildEditCard(); buildPlotCard(); this.validate(); this.pack(); this.setLocationByPlatform(true); GUIUtil.setDisposableDialogOptions(this, null); } private boolean isSingleEdit() { return simulation.length == 1; } private boolean allowsPlotMode() { return simulation.length == 1 && simulation[0].hasSimulationData(); } public void setEditMode() { CardLayout cl = (CardLayout) (cards.getLayout()); cl.show(cards, EDITMODE); cards.validate(); } public void setPlotMode() { if (!allowsPlotMode()) { return; } CardLayout cl = (CardLayout) (cards.getLayout()); cl.show(cards, PLOTMODE); cards.validate(); } private void copyChangesToAllSims() { if (simulation.length > 1) { for (int i = 1; i < simulation.length; i++) { simulation[i].getOptions().copyConditionsFrom(simulation[0].getOptions()); simulation[i].getSimulationExtensions().clear(); for (SimulationExtension c : simulation[0].getSimulationExtensions()) { simulation[i].getSimulationExtensions().add(c.clone()); } } } } private void refreshView() { cards.removeAll(); buildEditCard(); buildPlotCard(); this.validate(); } private void buildEditCard() { JPanel simEditPanel = new JPanel(new MigLayout("fill")); if (isSingleEdit()) { JPanel panel = new JPanel(new MigLayout("fill, ins 0")); //// Simulation name: panel.add(new JLabel(trans.get("simedtdlg.lbl.Simname") + " "), "growx 0, gapright para"); final JTextField field = new JTextField(simulation[0].getName()); field.getDocument().addDocumentListener(new DocumentListener() { @Override public void changedUpdate(DocumentEvent e) { setText(); } @Override public void insertUpdate(DocumentEvent e) { setText(); } @Override public void removeUpdate(DocumentEvent e) { setText(); } private void setText() { String name = field.getText(); if (name == null || name.equals("")) return; //System.out.println("Setting name:" + name); simulation[0].setName(name); } }); panel.add(field, "growx, wrap"); //// Flight selector //// Flight configuration: JLabel label = new JLabel(trans.get("simedtdlg.lbl.Flightcfg")); //// Select the motor configuration to use. label.setToolTipText(trans.get("simedtdlg.lbl.ttip.Flightcfg")); panel.add(label, "growx 0, gapright para"); JComboBox combo = new JComboBox(new FlightConfigurationModel(configuration)); //// Select the motor configuration to use. combo.setToolTipText(trans.get("simedtdlg.combo.ttip.Flightcfg")); combo.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { conditions.setMotorConfigurationID(configuration.getFlightConfigurationID()); } }); panel.add(combo, "span"); panel.add(new JPanel(), "growx, wrap"); simEditPanel.add(panel, "growx, wrap"); } JTabbedPane tabbedPane = new JTabbedPane(); //// Launch conditions tabbedPane.addTab(trans.get("simedtdlg.tab.Launchcond"), new SimulationConditionsPanel(simulation[0])); //// Simulation options tabbedPane.addTab(trans.get("simedtdlg.tab.Simopt"), new SimulationOptionsPanel(document, simulation[0])); tabbedPane.setSelectedIndex(0); simEditPanel.add(tabbedPane, "spanx, grow, wrap"); //// Open Plot button JButton button = new JButton(trans.get("SimulationEditDialog.btn.plot") + " >>"); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { SimulationEditDialog.this.setPlotMode(); } }); simEditPanel.add(button, "spanx, split 3, align left"); if (allowsPlotMode()) { button.setVisible(true); } else { button.setVisible(false); } //// Run simulation button button = new JButton(trans.get("SimulationEditDialog.btn.simulateAndPlot")); if (!isSingleEdit()) { button.setText(trans.get("SimulationEditDialog.btn.simulate")); } button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { copyChangesToAllSims(); SimulationRunDialog.runSimulations(parentWindow, SimulationEditDialog.this.document, simulation); refreshView(); if (allowsPlotMode()) { setPlotMode(); } else { setVisible(false); } } }); simEditPanel.add(button, " align right, tag ok"); //// Close button JButton close = new JButton(trans.get("dlg.but.close")); close.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { copyChangesToAllSims(); SimulationEditDialog.this.dispose(); } }); simEditPanel.add(close, "tag ok"); cards.add(simEditPanel, EDITMODE); } private void buildPlotCard() { if (allowsPlotMode()) { JPanel plotExportPanel = new JPanel(new MigLayout("fill")); //// Simulation name: plotExportPanel.add(new JLabel(trans.get("simedtdlg.lbl.Simname") + " "), "span, split 2, shrink"); final JTextField field = new JTextField(simulation[0].getName()); field.setEditable(false); plotExportPanel.add(field, "shrinky, growx, wrap"); final JTabbedPane tabbedPane = new JTabbedPane(); //// Plot data final SimulationPlotPanel plotTab = new SimulationPlotPanel(simulation[0]); tabbedPane.addTab(trans.get("simedtdlg.tab.Plotdata"), plotTab); //// Export data final SimulationExportPanel exportTab = new SimulationExportPanel(simulation[0]); tabbedPane.addTab(trans.get("simedtdlg.tab.Exportdata"), exportTab); plotExportPanel.add(tabbedPane, "grow, wrap"); JButton button = new JButton("<< " + trans.get("SimulationEditDialog.btn.edit")); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { SimulationEditDialog.this.setEditMode(); } }); plotExportPanel.add(button, "spanx, split 3, align left"); final JButton ok = new JButton(trans.get("SimulationEditDialog.btn.plot")); tabbedPane.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { int selectedIndex = tabbedPane.getSelectedIndex(); switch (selectedIndex) { case 0: ok.setText(trans.get("SimulationEditDialog.btn.plot")); break; case 1: ok.setText(trans.get("SimulationEditDialog.btn.export")); break; } } }); ok.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // If the simulation is out of date, run the simulation. if (simulation[0].getStatus() != Simulation.Status.UPTODATE) { new SimulationRunDialog(SimulationEditDialog.this.parentWindow, document, simulation[0]).setVisible(true); } if (tabbedPane.getSelectedIndex() == 0) { JDialog plot = plotTab.doPlot(SimulationEditDialog.this.parentWindow); if (plot != null) { plot.setVisible(true); } } else { if (exportTab.doExport()) { SimulationEditDialog.this.dispose(); } } } }); plotExportPanel.add(ok, "tag ok, split 2"); //// Close button JButton close = new JButton(trans.get("dlg.but.close")); close.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { SimulationEditDialog.this.dispose(); } }); plotExportPanel.add(close, "tag cancel"); //plotExportPanel.validate(); cards.add(plotExportPanel, PLOTMODE); } } }