Ensure exit on main window close with System.exit.
[sw/motorsim] / gui / com / billkuker / rocketry / motorsim / visual / workbench / MotorWorkbench.java
index 5e9652f1ed4f4e59a07ce53cddc8059fb8180297..f4b2a20e17d0c6ebc11d2f91f93f7f393893b2aa 100644 (file)
@@ -1,14 +1,11 @@
 package com.billkuker.rocketry.motorsim.visual.workbench;\r
 \r
-import java.awt.BorderLayout;\r
-import java.awt.FileDialog;\r
+import java.awt.Image;\r
+import java.awt.Toolkit;\r
 import java.awt.event.ActionEvent;\r
 import java.awt.event.ActionListener;\r
-import java.io.File;\r
-import java.io.FileInputStream;\r
-import java.io.FileOutputStream;\r
-import java.util.HashMap;\r
-import java.util.Vector;\r
+import java.awt.event.WindowEvent;\r
+import java.awt.event.WindowListener;\r
 \r
 import javax.swing.ButtonGroup;\r
 import javax.swing.JFrame;\r
@@ -16,74 +13,119 @@ import javax.swing.JMenu;
 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.JSeparator;\r
-import javax.swing.JTabbedPane;\r
-import javax.swing.WindowConstants;\r
 \r
-import com.billkuker.rocketry.motorsim.Burn;\r
-import com.billkuker.rocketry.motorsim.Fuel;\r
-import com.billkuker.rocketry.motorsim.Motor;\r
 import com.billkuker.rocketry.motorsim.RocketScience.UnitPreference;\r
-import com.billkuker.rocketry.motorsim.fuel.FuelResolver;\r
-import com.billkuker.rocketry.motorsim.io.ENGExporter;\r
-import com.billkuker.rocketry.motorsim.io.MotorIO;\r
+import com.billkuker.rocketry.motorsim.debug.DebugFrame;\r
+import com.billkuker.rocketry.motorsim.fuel.FuelsEditor;\r
+import com.billkuker.rocketry.motorsim.visual.RememberJFrame;\r
 \r
-import fuel.FuelsEditor;\r
 \r
-public class MotorWorkbench extends JFrame {\r
+public class MotorWorkbench extends RememberJFrame {\r
+       public static final String version = "2.0 BETA3";\r
+       public static final String name = "MotorSim " + version;\r
        private static final long serialVersionUID = 1L;\r
        \r
-       private JPanel top;\r
-       private JTabbedPane motors;\r
-       private MultiBurnChart mb;\r
+       private MultiMotorThrustChart mb;\r
        private JFrame allBurns;\r
        \r
-       private JFrame fuelEditorFrame = new JFrame(){\r
+       private SettingsEditor settings = new SettingsEditor(this);\r
+       \r
+       private About about = new About(this);\r
+       \r
+       private JFrame fuelEditorFrame = new RememberJFrame(800,600){\r
                private static final long serialVersionUID = 1L;\r
                {\r
-                       setSize(1024, 768);\r
+                       setIconImage(getIcon());\r
+                       setSize(800, 600);\r
                        add(fuelEditor = new FuelsEditor(this));\r
                        JMenuBar b;\r
                        setJMenuBar(b = new JMenuBar());\r
                        b.add(fuelEditor.getMenu());\r
-                       setTitle("MotorSim - Fuel Editor");\r
+                       setTitle(name + " - Fuel Editor");\r
                }\r
        };\r
        private FuelsEditor fuelEditor;\r
+       \r
+       private MotorsEditor motorsEditor;\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
+       public static Image getIcon(){\r
+               return Toolkit.getDefaultToolkit().getImage(MotorWorkbench.class.getResource("icon.png"));\r
+       }\r
        \r
        public MotorWorkbench() {\r
-               setTitle("MotorSim 1.0 RC1");\r
+               super(1024, 768);\r
+               setTitle(name);\r
+               setIconImage(getIcon());\r
+\r
+               motorsEditor = new MotorsEditor(this);\r
+               setContentPane(motorsEditor);\r
+               \r
                addMenu();\r
-               setSize(1024, 768);\r
-               top = new JPanel(new BorderLayout());\r
-               setContentPane(top);\r
                \r
-               mb = new MultiBurnChart();\r
+               mb = new MultiMotorThrustChart();\r
                allBurns = new JFrame();\r
                allBurns.setTitle("All Burns");\r
                allBurns.setSize(800, 600);\r
-               setDefaultCloseOperation(WindowConstants.HIDE_ON_CLOSE);\r
                allBurns.add(mb);\r
 \r
-               motors = new JTabbedPane();\r
-               \r
-               top.add(motors, BorderLayout.CENTER);\r
-               \r
-               for ( Fuel f : FuelResolver.getFuelMap().values() ){\r
-                       addFuel(f);\r
-               }\r
-\r
-               setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);\r
-               setVisible(true);\r
+               setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);\r
+\r
+               addWindowListener(new WindowListener() {\r
+                       \r
+                       @Override\r
+                       public void windowOpened(WindowEvent e) {}\r
+                       \r
+                       @Override\r
+                       public void windowIconified(WindowEvent e) {}\r
+                       \r
+                       @Override\r
+                       public void windowDeiconified(WindowEvent e) {}\r
+                       \r
+                       @Override\r
+                       public void windowDeactivated(WindowEvent e) {}\r
+                       \r
+                       @Override\r
+                       public void windowClosing(WindowEvent e) {\r
+                               maybeQuit();\r
+                       }\r
+                       \r
+                       @Override\r
+                       public void windowClosed(WindowEvent e) {}\r
+                       \r
+                       @Override\r
+                       public void windowActivated(WindowEvent e) {}\r
+               });\r
 \r
        }\r
+       \r
+       private void maybeQuit(){\r
+               if (motorsEditor.hasDirty()) {\r
+                       int response = JOptionPane\r
+                                       .showConfirmDialog(\r
+                                                       MotorWorkbench.this,\r
+                                                       "There are unsaved Motors.\nExit Anyway?",\r
+                                                       "Confirm",\r
+                                                       JOptionPane.YES_NO_OPTION);\r
+                       if (response == JOptionPane.NO_OPTION) {\r
+                               return;\r
+                       }\r
+               }\r
+               if (fuelEditor.hasDirty()) {\r
+                       int response = JOptionPane\r
+                                       .showConfirmDialog(\r
+                                                       MotorWorkbench.this,\r
+                                                       "There are unsaved Fuels.\nExit Anyway?",\r
+                                                       "Confirm",\r
+                                                       JOptionPane.YES_NO_OPTION);\r
+                       if (response == JOptionPane.NO_OPTION) {\r
+                               return;\r
+                       }\r
+               }\r
+               MotorWorkbench.this.dispose();\r
+               System.exit(0);\r
+       }\r
 \r
        private void addMenu() {\r
 \r
@@ -91,153 +133,21 @@ public class MotorWorkbench extends JFrame {
                        private static final long serialVersionUID = 1L;\r
 \r
                        {\r
-                               add(new JMenu("File") {\r
+                               JMenu file = motorsEditor.getMenu();\r
+                               file.add(new JSeparator());\r
+                               file.add(new JMenuItem("Quit") {\r
                                        private static final long serialVersionUID = 1L;\r
-\r
                                        {\r
-                                               add(new JMenuItem("New Motor") {\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(), 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 FileDialog fd = new FileDialog(MotorWorkbench.this, "Open Motor", FileDialog.LOAD);\r
-                                                                               fd.setVisible(true);\r
-                                                                               if ( fd.getFile() != null ) {\r
-                                                                                       File file = new File(fd.getDirectory() + fd.getFile());\r
-                                                                                       if (f2e.get(file) != null) {\r
-                                                                                               motors.setSelectedComponent(f2e\r
-                                                                                                               .get(file));\r
-                                                                                               return;\r
-                                                                                       }\r
-                                                                                       try {\r
-                                                                                               Motor m = MotorIO\r
-                                                                                                               .readMotor(new FileInputStream(file));\r
-                                                                                               addMotor(m, file);\r
-                                                                                               \r
-                                                                                       } catch (Exception e) {\r
-                                                                                               JOptionPane.showMessageDialog(\r
-                                                                                                               MotorWorkbench.this, e\r
-                                                                                                                               .getMessage());\r
-                                                                                       }\r
-                                                                               }\r
-                                                                       }\r
-                                                               });\r
-                                                       }\r
-                                               });\r
-                                               \r
-                                               add(new JSeparator());\r
-                                               \r
-                                               add(new JMenuItem("Close Motor") {\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
-                                                                               motors.remove(e);\r
-                                                                               f2e.remove(e2f.get(e));\r
-                                                                               e2f.remove(e);\r
-                                                                               m2e.remove(e.getMotor());\r
-                                                                               mb.removeBurn(e.burn);\r
-                                                                       }\r
-                                                               });\r
-                                                       }\r
-                                               });\r
-                                               \r
-                                               add(new JMenuItem("Save Motor") {\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 Motor As...") {\r
-                                                       private static final long serialVersionUID = 1L;\r
-                                                       {\r
-                                                               addActionListener(new ActionListener() {\r
-                                                                       @Override\r
-                                                                       public void actionPerformed(ActionEvent arg0) {\r
-\r
-                                                                               final FileDialog fd = new FileDialog(MotorWorkbench.this, "Save Motor As", FileDialog.SAVE);\r
-                                                                               fd.setVisible(true);\r
-                                                                               if (fd.getFile() != null ) {\r
-                                                                                       File file = new File(fd.getDirectory() + fd.getFile());\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
-                                               add(new JSeparator());\r
-                                               add(new JMenuItem("Export .ENG"){\r
-                                                       private static final long serialVersionUID = 1L;\r
-\r
-                                                       {\r
-                                                               addActionListener(new ActionListener() {\r
-                                                                       @Override\r
-                                                                       public void actionPerformed(ActionEvent arg0) {\r
-\r
-                                                                               final FileDialog fd = new FileDialog(MotorWorkbench.this, "Export .ENG File", FileDialog.SAVE);\r
-                                                                               fd.setFile("motorsim.eng");\r
-                                                                               fd.setVisible(true);\r
-                                                                               if (fd.getFile() != null ) {\r
-                                                                                       File file = new File(fd.getDirectory() + fd.getFile());\r
-                                                                                       Vector<Burn> bb = new Vector<Burn>();\r
-                                                                                       for( MotorEditor me : m2e.values() )\r
-                                                                                               bb.add(me.burn);\r
-                                                                                       try{\r
-                                                                                               ENGExporter.export(bb, file);\r
-                                                                                       } catch ( Exception e ){\r
-                                                                                               e.printStackTrace();\r
-                                                                                       }\r
-                                                                               }\r
-                                                                       }\r
-                                                               });\r
+                                               addActionListener(new ActionListener() {\r
+                                                       @Override\r
+                                                       public void actionPerformed(ActionEvent e) {\r
+                                                               maybeQuit();\r
                                                        }\r
                                                });\r
                                        }\r
                                });\r
+                               add(file);\r
+                               \r
                                add(new JMenu("Settings") {\r
                                        private static final long serialVersionUID = 1L;\r
                                        {\r
@@ -264,24 +174,36 @@ public class MotorWorkbench extends JFrame {
                                                });\r
                                                add(sci);\r
                                                add(nonsci);\r
+                                               \r
+                                               add(new JSeparator());\r
+                                               add(new JMenuItem("Simulation Settings"){\r
+                                                       private static final long serialVersionUID = 1L;\r
+                                                       {\r
+                                                               addActionListener(new ActionListener() {\r
+                                                                       @Override\r
+                                                                       public void actionPerformed(ActionEvent e) {\r
+                                                                               settings.setVisible(true);\r
+                                                                       }\r
+                                                               });\r
+                                                       }\r
+                                               });\r
                                        }\r
                                });\r
                                add(new JMenu("View") {\r
                                        private static final long serialVersionUID = 1L;\r
                                        {\r
-                                               add(new JMenuItem("All Motors Graph") {\r
+                                               add(new JMenuItem("Detach \"All Motors\" tabs") {\r
                                                        private static final long serialVersionUID = 1L;\r
                                                        {\r
                                                                addActionListener(new ActionListener() {\r
                                                                        @Override\r
                                                                        public void actionPerformed(ActionEvent arg0) {\r
-                                                                               allBurns.setVisible(true);\r
-                                                                               allBurns.toFront();\r
+                                                                               motorsEditor.detach();\r
                                                                        }\r
                                                                });\r
                                                        }\r
                                                });\r
-                                               add(new JMenuItem("Fuel Editor") {\r
+                                               add(new JMenuItem("Show Fuel Editor") {\r
                                                        private static final long serialVersionUID = 1L;\r
                                                        {\r
                                                                addActionListener(new ActionListener() {\r
@@ -295,40 +217,39 @@ public class MotorWorkbench extends JFrame {
                                                });\r
                                        }\r
                                });\r
+                               add(new JMenu("Help"){\r
+                                       private static final long serialVersionUID = 1L;\r
+                                       {\r
+                                               add(new JMenuItem("About") {\r
+                                                       private static final long serialVersionUID = 1L;\r
+                                                       {\r
+                                                               addActionListener(new ActionListener() {\r
+                                                                       @Override\r
+                                                                       public void actionPerformed(ActionEvent e) {\r
+                                                                               about.setVisible(true);\r
+                                                                       }\r
+                                                               });\r
+                                                       }\r
+                                               });\r
+                                               add(new JMenuItem("Debug") {\r
+                                                       private static final long serialVersionUID = 1L;\r
+                                                       {\r
+                                                               addActionListener(new ActionListener() {\r
+                                                                       @Override\r
+                                                                       public void actionPerformed(ActionEvent e) {\r
+                                                                               new DebugFrame();\r
+                                                                       }\r
+                                                               });\r
+                                                       }\r
+                                               });\r
+                                       }\r
+                               });\r
                        }\r
                });\r
        }\r
-       \r
-       private void addFuel(Fuel f){\r
-               for ( MotorEditor e : m2e.values() )\r
-                       e.addFuel(f);\r
-       }\r
-       \r
 \r
-       private void save(Motor m, File f) {\r
-               try {\r
-                       FileOutputStream fo;\r
-                       MotorIO.writeMotor(m, fo = new FileOutputStream(f));\r
-                       fo.close();\r
-               } catch (Throwable t) {\r
-                       JOptionPane.showMessageDialog(MotorWorkbench.this, t.getMessage());\r
-               }\r
-       }\r
+       \r
 \r
-       public void addMotor(Motor m, File f) {\r
-               MotorEditor e = new MotorEditor(m, FuelResolver.getFuelMap().values());\r
-               e.addBurnWatcher(mb);\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(title, e);\r
-       }\r
 \r
        \r
 }\r