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
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
private final Map<File, EDITOR> fileToEditor = new HashMap<File, EDITOR>();\r
private final Map<EDITOR, File> editorToFile = new HashMap<EDITOR, File>();\r
\r
+ \r
private final Set<OBJECT> dirty = new HashSet<OBJECT>();\r
\r
public MultiObjectEditor(final Frame frame, final String noun){\r
this.noun = " " + noun.trim();\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
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
}\r
\r
@SuppressWarnings("unchecked")\r
- @Override\r
- public EDITOR getSelectedComponent(){\r
- return (EDITOR)super.getSelectedComponent();\r
+ public EDITOR getSelectedEditor(){\r
+ try {\r
+ return (EDITOR)super.getSelectedComponent();\r
+ } catch ( ClassCastException e ){\r
+ return null;\r
+ }\r
}\r
\r
private void close(){\r
- EDITOR e = getSelectedComponent();\r
+ EDITOR e = getSelectedEditor();\r
OBJECT o = editorToObject.get(e);\r
File f = editorToFile.get(e);\r
\r
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 = getSelectedComponent();\r
+ EDITOR e = getSelectedEditor();\r
if ( !editorToFile.containsKey(e) ){\r
log.debug("Editor has no file, saving as...");\r
saveAsDialog();\r
}\r
}\r
private void saveAsDialog(){\r
- EDITOR e = getSelectedComponent();\r
+ EDITOR e = getSelectedEditor();\r
final FileDialog fd = new FileDialog(frame, "Save" + noun + " As", FileDialog.SAVE);\r
fd.setVisible(true);\r
if (fd.getFile() != null ) {\r
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
});\r
}\r
});\r
+ ret.add(new JSeparator());\r
ret.add(new JMenuItem("Save" + noun){\r
private static final long serialVersionUID = 1L;\r
{\r
editorToObject.put(e, o);\r
addTab("new", e);\r
dirty(o);\r
+ objectAdded(o, e);\r
}\r
\r
public final void load(final File f) throws IOException{\r
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