Added menus
authorBill Kuker <bkuker@billkuker.com>
Wed, 15 Jul 2009 22:24:02 +0000 (22:24 +0000)
committerBill Kuker <bkuker@billkuker.com>
Wed, 15 Jul 2009 22:24:02 +0000 (22:24 +0000)
src/com/billkuker/rocketry/motorsim/visual/workbench/MotorEditor.java
src/com/billkuker/rocketry/motorsim/visual/workbench/MotorWorkbench.java
src/com/billkuker/rocketry/motorsim/visual/workbench/WorkbenchTreeModel.java

index 126871b2b8c4d77c93279c72babf0c20ccc76cea..ba20926252454e443006ffc77d7e160d6fc00a55 100644 (file)
@@ -68,9 +68,11 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener,
        private static final int FUEL_TAB = 3;\r
        private static final int BURN_TAB = 4;\r
 \r
+       @SuppressWarnings("unchecked")\r
        private Class[] grainTypes = { CoredCylindricalGrain.class, Finocyl.class,\r
                        Moonburner.class, RodAndTubeGrain.class };\r
 \r
+       @SuppressWarnings("unchecked")\r
        private Class[] fuelTypes = { KNSB.class, KNSU.class, KNER.class,\r
                        KNDX.class, EditableFuel.class };\r
 \r
@@ -102,6 +104,7 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener,
        }\r
 \r
        private class BurnTab extends JPanel {\r
+               private static final long serialVersionUID = 1L;\r
                public BurnTab() {\r
                        setLayout(new BorderLayout());\r
                        setName("Burn");\r
@@ -252,6 +255,10 @@ public class MotorEditor extends JTabbedPane implements PropertyChangeListener,
                add(text, XML_TAB);\r
                setMotor(m, true);\r
        }\r
+       \r
+       public Motor getMotor(){\r
+               return motor;\r
+       }\r
 \r
        private void reText() {\r
                try {\r
index 9027d8d46070734838ebf8cf1c4984f4f660bc14..9882fec45f8a67c0daad2e93fab8b5ca259dad9d 100644 (file)
@@ -4,16 +4,21 @@ import java.awt.BorderLayout;
 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
@@ -28,6 +33,7 @@ import javax.swing.tree.TreeSelectionModel;
 \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
@@ -38,6 +44,9 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener {
        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
@@ -71,26 +80,140 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener {
                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
@@ -112,24 +235,41 @@ public class MotorWorkbench extends JFrame implements TreeSelectionListener {
                });\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
index 1bb769e1e4944663f4d9e1b9320e6c45237cd5c0..4d84457fe92aa52654b8b264140440ed6c4d8659 100644 (file)
@@ -2,9 +2,11 @@ package com.billkuker.rocketry.motorsim.visual.workbench;
 
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
+import java.util.Enumeration;
 
 import javax.swing.tree.DefaultMutableTreeNode;
 import javax.swing.tree.DefaultTreeModel;
+import javax.swing.tree.TreeNode;
 
 import com.billkuker.rocketry.motorsim.Motor;
 import com.billkuker.rocketry.motorsim.MotorPart;
@@ -92,11 +94,28 @@ public class WorkbenchTreeModel extends DefaultTreeModel {
                super(new DefaultMutableTreeNode(), true);
        }
        
+       @Override
+       public DefaultMutableTreeNode getRoot(){
+               return (DefaultMutableTreeNode)super.getRoot();
+       }
+       
        public void addMotor(Motor m){
-               DefaultMutableTreeNode root = (DefaultMutableTreeNode)getRoot();
+               DefaultMutableTreeNode root = getRoot();
                root.add(new MotorNode(m));
                nodesWereInserted(root, new int[]{root.getChildCount()-1});
                
        }
+       
+       public void removeMotor(Motor m){
+               Enumeration<TreeNode> e = getRoot().children();
+               while ( e.hasMoreElements() ){
+                       TreeNode n = e.nextElement();
+                       if ( n instanceof MotorNode ){
+                               if ( ((MotorNode)n).getUserObject() == m ){
+                                       removeNodeFromParent((MotorNode)n);
+                               }
+                       }
+               }
+       }
 
 }