Fix error when attempting actions on "extra" tabs
[sw/motorsim] / gui / com / billkuker / rocketry / motorsim / visual / MultiObjectEditor.java
index da90603f01d6168650bbda985ebb9c23a8aac999..b9740b440f6ce3fce2c9587d5dfee53731058f3b 100644 (file)
@@ -13,9 +13,11 @@ import java.util.Map;
 import java.util.Set;\r
 import java.util.Vector;\r
 \r
+import javax.swing.JComponent;\r
 import javax.swing.JMenu;\r
 import javax.swing.JMenuItem;\r
 import javax.swing.JOptionPane;\r
+import javax.swing.JSeparator;\r
 import javax.swing.JTabbedPane;\r
 \r
 import org.apache.log4j.Logger;\r
@@ -32,11 +34,11 @@ public abstract class MultiObjectEditor<OBJECT, EDITOR extends Component> extend
                public abstract String getName();\r
        }\r
        \r
-       private final Frame frame;\r
+       protected final Frame frame;\r
        \r
        private final String noun;\r
        \r
-       private Set<ObjectCreator> creators = new HashSet<ObjectCreator>();\r
+       private List<ObjectCreator> creators = new Vector<ObjectCreator>();\r
        \r
        private final Map<OBJECT, EDITOR> objectToEditor = new HashMap<OBJECT, EDITOR>();\r
        private final Map<EDITOR, OBJECT> editorToObject = new HashMap<EDITOR, OBJECT>();\r
@@ -51,6 +53,14 @@ public abstract class MultiObjectEditor<OBJECT, EDITOR extends Component> extend
                this.noun = " " + noun.trim();\r
        }\r
        \r
+       protected boolean has(OBJECT o){\r
+               return objectToEditor.containsKey(o);\r
+       }\r
+       \r
+       protected void objectAdded(OBJECT o, EDITOR e){}\r
+       \r
+       protected void objectRemoved(OBJECT o, EDITOR e){}\r
+       \r
        protected final void addCreator(ObjectCreator c){\r
                creators.add(c);\r
        }\r
@@ -71,9 +81,9 @@ public abstract class MultiObjectEditor<OBJECT, EDITOR extends Component> extend
                dirty.remove(o);\r
        }\r
        \r
-       public final JMenu getMenu(){\r
+       public JMenu getMenu(){\r
                JMenu ret = new JMenu("File");\r
-               for ( JMenuItem i : getMenuItems() )\r
+               for ( JComponent i : getMenuItems() )\r
                        ret.add(i);\r
                return ret;\r
        }\r
@@ -81,18 +91,19 @@ public abstract class MultiObjectEditor<OBJECT, EDITOR extends Component> extend
        private void menuNew(ObjectCreator c){\r
                add(c.newObject());\r
        }\r
-       \r
+\r
        @SuppressWarnings("unchecked")\r
-       public EDITOR getSelectedEditor(){\r
-               try {\r
-                       return (EDITOR)super.getSelectedComponent();\r
-               } catch ( ClassCastException e ){\r
-                       return null;\r
-               }\r
+       public EDITOR getSelectedEditor() {\r
+               EDITOR e = (EDITOR) super.getSelectedComponent();\r
+               if (editorToObject.containsKey(e))\r
+                       return e;\r
+               return null;\r
        }\r
-       \r
+\r
        private void close(){\r
                EDITOR e = getSelectedEditor();\r
+               if ( e == null )\r
+                       return;\r
                OBJECT o = editorToObject.get(e);\r
                File f = editorToFile.get(e);\r
                \r
@@ -109,11 +120,14 @@ public abstract class MultiObjectEditor<OBJECT, EDITOR extends Component> extend
                editorToObject.remove(e);\r
                fileToEditor.remove(f);\r
                editorToFile.remove(e);\r
+               objectRemoved(o, e);\r
                remove(e);\r
        }\r
        \r
        private void saveDialog(){\r
                EDITOR e = getSelectedEditor();\r
+               if ( e == null )\r
+                       return;\r
                if ( !editorToFile.containsKey(e) ){\r
                        log.debug("Editor has no file, saving as...");\r
                        saveAsDialog();\r
@@ -130,6 +144,8 @@ public abstract class MultiObjectEditor<OBJECT, EDITOR extends Component> extend
        }\r
        private void saveAsDialog(){\r
                EDITOR e = getSelectedEditor();\r
+               if ( e == null )\r
+                       return;\r
                final FileDialog fd = new FileDialog(frame, "Save" + noun + " As", FileDialog.SAVE);\r
                fd.setVisible(true);\r
                if (fd.getFile() != null ) {\r
@@ -169,34 +185,51 @@ public abstract class MultiObjectEditor<OBJECT, EDITOR extends Component> extend
                                editorToObject.put(e, o);\r
                                fileToEditor.put(file, e);\r
                                editorToFile.put(e, file);\r
-                               addTab(file.getName(), e);                                                                      \r
+                               addTab(file.getName(), e);      \r
+                               objectAdded(o, e);\r
                        } catch (Exception e) {\r
                                errorDialog(e);\r
                        }\r
                }\r
        }\r
        \r
-       public final List<JMenuItem> getMenuItems(){\r
-               List<JMenuItem> ret = new Vector<JMenuItem>();\r
-               ret.add(new JMenu("New"){\r
-                       private static final long serialVersionUID = 1L;\r
-                       {\r
-                               for (final ObjectCreator c : creators ){\r
-                                       add(new JMenuItem("New " + c.getName()){\r
-                                               private static final long serialVersionUID = 1L;\r
-                                               {\r
-                                                       addActionListener(new ActionListener() {\r
-                                                               @Override\r
-                                                               public void actionPerformed(ActionEvent ae) {\r
-                                                                       log.debug("New");\r
-                                                                       menuNew(c);\r
-                                                               }\r
-                                                       });\r
+       public final List<JComponent> getMenuItems(){\r
+               List<JComponent> ret = new Vector<JComponent>();\r
+               if ( creators.size() == 1 ){\r
+                       final ObjectCreator c = creators.get(0);\r
+                       ret.add(new JMenuItem("New " + c.getName()){\r
+                               private static final long serialVersionUID = 1L;\r
+                               {\r
+                                       addActionListener(new ActionListener() {\r
+                                               @Override\r
+                                               public void actionPerformed(ActionEvent ae) {\r
+                                                       log.debug("New");\r
+                                                       menuNew(c);\r
                                                }\r
                                        });\r
                                }\r
-                       }\r
-               });\r
+                       });\r
+               } else {\r
+                       ret.add(new JMenu("New"){\r
+                               private static final long serialVersionUID = 1L;\r
+                               {\r
+                                       for (final ObjectCreator c : creators ){\r
+                                               add(new JMenuItem("New " + c.getName()){\r
+                                                       private static final long serialVersionUID = 1L;\r
+                                                       {\r
+                                                               addActionListener(new ActionListener() {\r
+                                                                       @Override\r
+                                                                       public void actionPerformed(ActionEvent ae) {\r
+                                                                               log.debug("New");\r
+                                                                               menuNew(c);\r
+                                                                       }\r
+                                                               });\r
+                                                       }\r
+                                               });\r
+                                       }\r
+                               }\r
+                       });\r
+               }\r
                ret.add(new JMenuItem("Open" + noun + "..."){\r
                                private static final long serialVersionUID = 1L;\r
                                {\r
@@ -221,6 +254,7 @@ public abstract class MultiObjectEditor<OBJECT, EDITOR extends Component> extend
                                });\r
                        }\r
                });\r
+               ret.add(new JSeparator());\r
                ret.add(new JMenuItem("Save" + noun){\r
                        private static final long serialVersionUID = 1L;\r
                        {\r
@@ -254,6 +288,17 @@ public abstract class MultiObjectEditor<OBJECT, EDITOR extends Component> extend
                editorToObject.put(e, o);\r
                addTab("new", e);\r
                dirty(o);\r
+               objectAdded(o, e);\r
+       }\r
+       \r
+       protected final void add(final OBJECT o, final File f){\r
+               EDITOR e = createEditor(o);\r
+               objectToEditor.put(o, e);\r
+               editorToObject.put(e, o);\r
+               fileToEditor.put(f, e);\r
+               editorToFile.put(e, f);\r
+               addTab(f.getName(), e);\r
+               objectAdded(o, e);\r
        }\r
        \r
        public final void load(final File f) throws IOException{\r
@@ -264,12 +309,11 @@ public abstract class MultiObjectEditor<OBJECT, EDITOR extends Component> extend
                fileToEditor.put(f, e);\r
                editorToFile.put(e, f);\r
                addTab(f.getName(), e);\r
+               objectAdded(o, e);\r
        }\r
        \r
        public abstract EDITOR createEditor(final OBJECT o);\r
        \r
-       public abstract OBJECT newObject();\r
-       \r
        protected abstract OBJECT loadFromFile(final File f) throws IOException;\r
        \r
        protected abstract void saveToFile(final OBJECT o, final File f) throws IOException;\r