import java.awt.Dimension;\r
import java.awt.event.ActionEvent;\r
import java.awt.event.ActionListener;\r
+import java.io.File;\r
import java.util.HashMap;\r
\r
import javax.swing.ButtonGroup;\r
import javax.swing.JButton;\r
+import javax.swing.JFileChooser;\r
import javax.swing.JFrame;\r
import javax.swing.JMenu;\r
import javax.swing.JMenuBar;\r
+import javax.swing.JMenuItem;\r
+import javax.swing.JOptionPane;\r
import javax.swing.JPanel;\r
import javax.swing.JRadioButtonMenuItem;\r
import javax.swing.JScrollPane;\r
+import javax.swing.JSeparator;\r
import javax.swing.JSplitPane;\r
import javax.swing.JTabbedPane;\r
import javax.swing.JToolBar;\r
\r
import com.billkuker.rocketry.motorsim.Motor;\r
import com.billkuker.rocketry.motorsim.RocketScience.UnitPreference;\r
+import com.billkuker.rocketry.motorsim.io.MotorIO;\r
\r
public class MotorWorkbench extends JFrame implements TreeSelectionListener {\r
private static final long serialVersionUID = 1L;\r
private JToolBar bar;\r
private WorkbenchTreeModel tm;\r
\r
+ private HashMap<MotorEditor, File> e2f = new HashMap<MotorEditor, File>();\r
+ private HashMap<File, MotorEditor> f2e = new HashMap<File, MotorEditor>();\r
+\r
private HashMap<Motor, MotorEditor> m2e = new HashMap<Motor, MotorEditor>();\r
\r
public MotorWorkbench() {\r
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);\r
setVisible(true);\r
\r
- Motor mot = MotorEditor.defaultMotor();\r
- addMotor(mot);\r
- // mot = MotorEditor.defaultMotor();\r
- // addMotor(mot);\r
-\r
}\r
\r
private void addMenu() {\r
\r
-\r
setJMenuBar(new JMenuBar() {\r
+ private static final long serialVersionUID = 1L;\r
+\r
{\r
add(new JMenu("File") {\r
+ private static final long serialVersionUID = 1L;\r
+\r
+ {\r
+ add(new JMenuItem("New") {\r
+ private static final long serialVersionUID = 1L;\r
+ {\r
+ addActionListener(new ActionListener() {\r
+\r
+ @Override\r
+ public void actionPerformed(ActionEvent arg0) {\r
+ addMotor(MotorEditor.defaultMotor(),\r
+ null);\r
+ }\r
+ });\r
+\r
+ }\r
+ });\r
+ add(new JMenuItem("Open...") {\r
+ private static final long serialVersionUID = 1L;\r
+ {\r
+ addActionListener(new ActionListener() {\r
+ @Override\r
+ public void actionPerformed(ActionEvent arg0) {\r
+\r
+ final JFileChooser fc = new JFileChooser();\r
+ int returnVal = fc\r
+ .showOpenDialog(MotorWorkbench.this);\r
+ if (returnVal == JFileChooser.APPROVE_OPTION) {\r
+ File file = fc.getSelectedFile();\r
+ if (f2e.get(file) != null) {\r
+ motors.setSelectedComponent(f2e\r
+ .get(file));\r
+ return;\r
+ }\r
+ try {\r
+ Motor m = MotorIO\r
+ .readMotor(file);\r
+ addMotor(m, file);\r
+ } catch (Exception e) {\r
+ JOptionPane.showMessageDialog(\r
+ MotorWorkbench.this, e\r
+ .getMessage());\r
+ }\r
+ }\r
+ }\r
+ });\r
+ }\r
+ });\r
+ add(new JMenuItem("Close") {\r
+ private static final long serialVersionUID = 1L;\r
+ {\r
+ addActionListener(new ActionListener() {\r
+ @Override\r
+ public void actionPerformed(ActionEvent ev) {\r
+ MotorEditor e = (MotorEditor) motors\r
+ .getSelectedComponent();\r
+ tm.removeMotor(e.getMotor());\r
+ motors.remove(e);\r
+ f2e.remove(e2f.get(e));\r
+ e2f.remove(e);\r
+ m2e.remove(e.getMotor());\r
+ }\r
+ });\r
+ }\r
+ });\r
+ add(new JSeparator());\r
+ add(new JMenuItem("Save") {\r
+ private static final long serialVersionUID = 1L;\r
+ {\r
+ addActionListener(new ActionListener() {\r
+ @Override\r
+ public void actionPerformed(ActionEvent e) {\r
+ MotorEditor m = (MotorEditor) motors\r
+ .getSelectedComponent();\r
+ File f = e2f.get(m);\r
+ if (f != null)\r
+ save(m.getMotor(), f);\r
+\r
+ }\r
+ });\r
+ }\r
+ });\r
+ add(new JMenuItem("Save As...") {\r
+ private static final long serialVersionUID = 1L;\r
+ {\r
+ addActionListener(new ActionListener() {\r
+ @Override\r
+ public void actionPerformed(ActionEvent arg0) {\r
+\r
+ final JFileChooser fc = new JFileChooser();\r
+ int returnVal = fc\r
+ .showSaveDialog(MotorWorkbench.this);\r
+ if (returnVal == JFileChooser.APPROVE_OPTION) {\r
+ File file = fc.getSelectedFile();\r
+ MotorEditor m = (MotorEditor) motors\r
+ .getSelectedComponent();\r
+ try {\r
+ save(m.getMotor(), file);\r
+ e2f.put(m, file);\r
+ f2e.put(file, m);\r
+ motors.setTitleAt(motors\r
+ .getSelectedIndex(),\r
+ file.getName());\r
+ // TODO Set tab title\r
+ } catch (Exception e) {\r
+ JOptionPane.showMessageDialog(\r
+ MotorWorkbench.this, e\r
+ .getMessage());\r
+ }\r
+ }\r
+ }\r
+ });\r
+ }\r
+ });\r
\r
+ }\r
});\r
add(new JMenu("Settings") {\r
+ private static final long serialVersionUID = 1L;\r
{\r
ButtonGroup units = new ButtonGroup();\r
- JRadioButtonMenuItem sci = new JRadioButtonMenuItem("SI");\r
- JRadioButtonMenuItem nonsci = new JRadioButtonMenuItem("NonSI");\r
+ JRadioButtonMenuItem sci = new JRadioButtonMenuItem(\r
+ "SI");\r
+ JRadioButtonMenuItem nonsci = new JRadioButtonMenuItem(\r
+ "NonSI");\r
units.add(sci);\r
units.add(nonsci);\r
sci.setSelected(true);\r
});\r
}\r
\r
- public void addMotor(Motor m) {\r
+ private void save(Motor m, File f) {\r
+ try {\r
+ MotorIO.writeMotor(m, f);\r
+ } catch (Throwable t) {\r
+ JOptionPane.showMessageDialog(MotorWorkbench.this, t.getMessage());\r
+ }\r
+ }\r
+\r
+ public void addMotor(Motor m, File f) {\r
tm.addMotor(m);\r
MotorEditor e = new MotorEditor(m);\r
+ String title;\r
+ if (f == null) {\r
+ title = "New Motor";\r
+ } else {\r
+ title = f.getName();\r
+ e2f.put(e, f);\r
+ f2e.put(f, e);\r
+ }\r
m2e.put(m, e);\r
- motors.addTab("Motor", e);\r
+ motors.addTab(title, e);\r
}\r
\r
public static void main(String args[]) throws Exception {\r
- \r
+\r
try {\r
System.setProperty("apple.laf.useScreenMenuBar", "true");\r
- System.setProperty("com.apple.mrj.application.apple.menu.about.name",\r
- "MotorWorkbench");\r
+ System.setProperty(\r
+ "com.apple.mrj.application.apple.menu.about.name",\r
+ "MotorWorkbench");\r
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());\r
} catch (Exception e1) {\r
e1.printStackTrace();\r
}\r
- new MotorWorkbench().show();\r
+ new MotorWorkbench().setVisible(true);\r
}\r
\r
@Override\r