1 package org.xpilot.jxpmap;
2 
3 import java.awt.BorderLayout;
4 import java.awt.Dimension;
5 import java.awt.Font;
6 import java.awt.Toolkit;
7 import java.awt.event.ActionEvent;
8 import java.awt.event.ActionListener;
9 import java.awt.event.WindowAdapter;
10 import java.awt.event.WindowEvent;
11 import java.io.File;
12 import java.io.InputStream;
13 import java.io.InputStreamReader;
14 import java.io.Reader;
15 import java.io.FileReader;
16 import java.io.FileWriter;
17 import java.util.HashMap;
18 import java.util.Iterator;
19 import java.util.Map;
20 
21 import javax.swing.AbstractAction;
22 import javax.swing.ActionMap;
23 import javax.swing.ButtonGroup;
24 import javax.swing.ImageIcon;
25 import javax.swing.InputMap;
26 import javax.swing.JButton;
27 import javax.swing.JFileChooser;
28 import javax.swing.JFrame;
29 import javax.swing.JLabel;
30 import javax.swing.JMenu;
31 import javax.swing.JMenuBar;
32 import javax.swing.JMenuItem;
33 import javax.swing.JOptionPane;
34 import javax.swing.JToggleButton;
35 import javax.swing.JToolBar;
36 import javax.swing.JSpinner;
37 import javax.swing.SpinnerNumberModel;
38 import javax.swing.KeyStroke;
39 import javax.swing.SwingConstants;
40 
41 public class MainFrame extends JFrame implements ActionListener {
42 
43     private static final Dimension BUTTON_SIZE = new Dimension(26, 26);
44 
45     private MapCanvas canvas;
46     private int zoom;
47 
48     private ButtonGroup toggleGroup;
49     private JLabel lblZoom;
50     private JSpinner gridSpinner;
51     private JToggleButton gridToggle;
52     private File mapFile;
53     private BshConsole bshConsole;
54     private JMenu scriptMenu;
55     private bsh.Interpreter interpreter;
56 
MainFrame()57     public MainFrame() throws Exception {
58         super("XPilotNG Map Editor");
59         canvas = new MapCanvas();
60         getContentPane().add(canvas, BorderLayout.CENTER);
61         buildMenuBar();
62         buildToolBar();
63         buildActionMap();
64         buildInputMap();
65         setSize(800, 600);
66         setDefaultCloseOperation(EXIT_ON_CLOSE);
67         Dimension ss = Toolkit.getDefaultToolkit().getScreenSize();
68         setLocation(ss.width / 2 - 400, ss.height / 2 - 300);
69         interpreter = new bsh.Interpreter();
70         interpreter.set("app", this);
71         interpreter.set("editor", canvas);
72         interpreter.set("scriptMenu", scriptMenu);
73         InputStream in = getClass().getResourceAsStream("init.bsh");
74         if (in != null) {
75             try {
76                 interpreter.eval(new InputStreamReader(in));
77             } finally {
78                 in.close();
79             }
80         }
81     }
82 
83 
setModel(MapModel model)84     public void setModel (MapModel model) {
85         canvas.setModel(model);
86     }
87 
88 
buildMenuBar()89     private void buildMenuBar() {
90 
91         JMenu menu;
92         JMenuItem menuItem;
93         JMenuBar menuBar = new JMenuBar();
94         setJMenuBar(menuBar);
95 
96         menu = new JMenu("File");
97         menuBar.add(menu);
98 
99         menuItem = new JMenuItem("New");
100         menu.add(menuItem);
101         menuItem.setActionCommand("newMap");
102         menuItem.addActionListener(this);
103 
104         menuItem = new JMenuItem("Open");
105         menu.add(menuItem);
106         menuItem.setActionCommand("openMap");
107         menuItem.addActionListener(this);
108 
109         menuItem = new JMenuItem("Save");
110         menu.add(menuItem);
111         menuItem.setActionCommand("saveMap");
112         menuItem.addActionListener(this);
113 
114         menuItem = new JMenuItem("Import XML");
115         menu.add(menuItem);
116         menuItem.setActionCommand("importXml");
117         menuItem.addActionListener(this);
118 
119         menuItem = new JMenuItem("Export XML");
120         menu.add(menuItem);
121         menuItem.setActionCommand("exportXml");
122         menuItem.addActionListener(this);
123 
124         menuItem = new JMenuItem("Exit");
125         menu.add(menuItem);
126         menuItem.setActionCommand("exitApp");
127         menuItem.addActionListener(this);
128 
129 
130         menu = new JMenu("Edit");
131         menuBar.add(menu);
132         menuItem = new JMenuItem("Undo");
133         menu.add(menuItem);
134         menuItem.setActionCommand("undo");
135         menuItem.addActionListener(this);
136 
137         menuItem = new JMenuItem("Redo");
138         menu.add(menuItem);
139         menuItem.setActionCommand("redo");
140         menuItem.addActionListener(this);
141 
142 
143         menu = new JMenu("View");
144         menuBar.add(menu);
145 
146         menuItem = new JMenuItem("Polygon styles");
147         menu.add(menuItem);
148         menuItem.setActionCommand("showPolygonStyles");
149         menuItem.addActionListener(this);
150 
151         menuItem = new JMenuItem("Edge styles");
152         menu.add(menuItem);
153         menuItem.setActionCommand("showEdgeStyles");
154         menuItem.addActionListener(this);
155 
156         menuItem = new JMenuItem("Images");
157         menu.add(menuItem);
158         menuItem.setActionCommand("showImages");
159         menuItem.addActionListener(this);
160 
161         menuItem = new JMenuItem("Options");
162         menu.add(menuItem);
163         menuItem.setActionCommand("showOptions");
164         menuItem.addActionListener(this);
165 
166         menuItem = new JMenuItem("BeanShell");
167         menu.add(menuItem);
168         menuItem.setActionCommand("showBeanShellConsole");
169         menuItem.addActionListener(this);
170 
171         scriptMenu = new JMenu("Scripts");
172         menuBar.add(scriptMenu);
173     }
174 
175 
buildToolBar()176     private void buildToolBar() {
177 
178         JToolBar tb1 = new JToolBar(SwingConstants.HORIZONTAL);
179         tb1.setFloatable(false);
180         JToolBar tb2 = new JToolBar(SwingConstants.VERTICAL);
181         tb2.setFloatable(false);
182         lblZoom = new JLabel("x1");
183         lblZoom.setHorizontalAlignment(SwingConstants.CENTER);
184         Font f = lblZoom.getFont();
185         lblZoom.setFont(f.deriveFont((float)(f.getSize() - 2)));
186         toggleGroup = new ButtonGroup();
187 
188         JToggleButton tb = newToggle("select", "/images/arrow.gif", "Select");
189         tb.setSelected(true);
190         tb1.add(tb);
191         tb1.add(newToggle("editMode", "/images/editobjicon.gif", "Edit objects"));
192         tb1.add(newToggle("eraseMode", "/images/eraseicon.gif", "Erasing mode"));
193         tb1.add(newToggle("copyMode", "/images/copyicon.gif", "Copy mode"));
194         tb1.addSeparator();
195         tb1.add(newButton("undo", "/images/undo.gif", "Undo"));
196         tb1.add(newButton("redo", "/images/redo.gif", "Redo"));
197         tb1.addSeparator();
198         tb1.add(makeGridSpinner());
199         tb1.add(makeGridToggle());
200         tb1.add(makeFastRenderingToggle());
201         tb1.add(newButton("zoomIn", "/images/zoominicon.gif", "Zoom in"));
202         tb1.add(newButton("zoomOut", "/images/zoomouticon.gif", "Zoom out"));
203         tb1.add(lblZoom);
204 
205         tb2.add(newToggle("newWall", "/images/polyicon.gif", "New wall"));
206         tb2.add(newToggle("newFuel", "/images/fuelicon.gif", "New fuel station"));
207         tb2.add(newToggle("newBase", "/images/baseicon.gif", "New base"));
208         tb2.add(newToggle("newBall", "/images/ballicon.gif", "New ball"));
209         tb2.add(newToggle("newCheckPoint", "/images/checkicon.gif", "New checkpoint"));
210         tb2.add(newToggle("newGrav", "/images/gravicon.gif", "New gravitation field"));
211         tb2.add(newToggle("newItemConcentrator", "/images/itemconicon.gif", "New item concentrator"));
212         tb2.add(newToggle("newAsteroidConcentrator", "/images/asteroidconicon.gif", "New asteroid concentrator"));
213         tb2.addSeparator();
214         tb2.add(newButton("group", "/images/groupicon.gif", "Group"));
215         tb2.add(newButton("ungroup", "/images/ungroupicon.gif", "Ungroup"));
216         tb2.add(newButton("regroup", "/images/regroupicon.gif", "Regroup"));
217         tb2.addSeparator();
218         tb2.add(newButton("makeBallArea", "/images/ballareaicon.gif", "Make ball area"));
219         tb2.add(newButton("makeBallTarget", "/images/balltargeticon.gif", "Make ball target"));
220         tb2.add(newButton("makeDecor", "/images/decoricon.gif", "Make decoration"));
221         tb2.add(newButton("makeFriction", "/images/fricticon.gif", "Make friction area"));
222         tb2.add(newButton("makeTarget", "/images/targeticon.gif", "Make target"));
223         tb2.add(newButton("makeCannon", "/images/cannonicon.gif", "Make cannon"));
224         tb2.add(newToggle("makeWormhole", "/images/wormicon.gif", "Make wormhole"));
225 
226         getContentPane().add(tb1, BorderLayout.NORTH);
227         getContentPane().add(tb2, BorderLayout.EAST);
228     }
229 
230 
buildActionMap()231     private void buildActionMap() {
232         ActionMap am = canvas.getActionMap();
233         am.put("quickSave", new GuiAction("quickSave"));
234         am.put("quickOpen", new GuiAction("quickOpen"));
235     }
236 
237 
buildInputMap()238     private void buildInputMap() {
239         InputMap im = canvas.getInputMap(
240         MapCanvas.WHEN_IN_FOCUSED_WINDOW);
241         im.put(KeyStroke.getKeyStroke("control S"), "quickSave");
242         im.put(KeyStroke.getKeyStroke("control L"), "quickOpen");
243         im.put(KeyStroke.getKeyStroke("control Z"), "undo");
244     }
245 
246 
actionPerformed(ActionEvent ae)247     public void actionPerformed (ActionEvent ae) {
248         String cmd = ae.getActionCommand();
249         dispatchCommand(cmd);
250     }
251 
252 
dispatchCommand(String cmd)253     private void dispatchCommand (String cmd) {
254         try {
255             getClass().getDeclaredMethod(cmd, null).invoke(this, null);
256         } catch (NoSuchMethodException nsme) {
257             JOptionPane.showMessageDialog
258             (this, "Sorry, operation " + cmd +
259             " is not implemented yet", "Error",
260             JOptionPane.ERROR_MESSAGE);
261         } catch (Exception e) {
262             e.printStackTrace();
263             JOptionPane.showMessageDialog
264             (this, "Unexpected exception: " + e, "Error",
265             JOptionPane.ERROR_MESSAGE);
266         }
267     }
268 
269 
newToggle(String cmd, String name, String toolTip)270     private JToggleButton newToggle(String cmd, String name, String toolTip) {
271         JToggleButton b =
272         new JToggleButton(new ImageIcon(getClass().getResource(name)));
273         b.setToolTipText(toolTip);
274         b.setActionCommand(cmd);
275         b.addActionListener(this);
276         b.setPreferredSize(BUTTON_SIZE);
277         b.setMaximumSize(BUTTON_SIZE);
278         toggleGroup.add(b);
279         return b;
280     }
281 
282 
newButton(String cmd, String name, String toolTip)283     private JButton newButton(String cmd, String name, String toolTip) {
284         JButton b = new JButton(new ImageIcon(getClass().getResource(name)));
285         b.setToolTipText(toolTip);
286         b.setActionCommand(cmd);
287         b.setPreferredSize(BUTTON_SIZE);
288         b.setMaximumSize(BUTTON_SIZE);
289         b.addActionListener(this);
290         return b;
291     }
292 
makeGridSpinner()293     private JSpinner makeGridSpinner() {
294         gridSpinner = new JSpinner(
295             new SpinnerNumberModel(8, 1, 256, 1) {
296                 public void setValue(Object value) {
297                     super.setValue(value);
298                     if (gridToggle.isSelected())
299                         canvas.setGrid(getNumber().intValue());
300                 }
301             });
302         gridSpinner.setToolTipText("Edit grid size");
303         gridSpinner.setPreferredSize(new Dimension(34, 26));
304         gridSpinner.setMaximumSize(new Dimension(34, 26));
305         return gridSpinner;
306     }
307 
makeGridToggle()308     private JToggleButton makeGridToggle() {
309         JToggleButton b = new JToggleButton(new ImageIcon(
310             getClass().getResource("/images/gridicon.gif")));
311         b.setToolTipText("Toggle grid");
312         b.setActionCommand("grid");
313         b.setPreferredSize(BUTTON_SIZE);
314         b.setMaximumSize(BUTTON_SIZE);
315         b.addActionListener(this);
316         this.gridToggle = b;
317         return b;
318     }
319 
makeFastRenderingToggle()320     private JToggleButton makeFastRenderingToggle() {
321         JToggleButton b = new JToggleButton(new ImageIcon(
322             getClass().getResource("/images/fasticon.gif")));
323         b.setToolTipText("Fast rendering mode");
324         b.setActionCommand("fast");
325         b.addActionListener(this);
326         b.setMaximumSize(BUTTON_SIZE);
327         b.setPreferredSize(BUTTON_SIZE);
328         return b;
329     }
330 
fast()331     private void fast() {
332         canvas.setFastRendering(!canvas.isFastRendering());
333         canvas.repaint();
334     }
335 
grid()336     private void grid() {
337         if (gridToggle.isSelected()) {
338             canvas.setGrid(((Number)gridSpinner.getValue()).intValue());
339         } else {
340             canvas.setGrid(-1);
341         }
342     }
343 
setZoom(int zoom)344     private void setZoom (int zoom) {
345         this.zoom = zoom;
346         updateScale();
347     }
348 
zoomIn()349     private void zoomIn() {
350         zoom++;
351         updateScale();
352     }
353 
354 
zoomOut()355     private void zoomOut() {
356         zoom--;
357         updateScale();
358     }
359 
360 
updateScale()361     private void updateScale() {
362         float df = canvas.getModel().getDefaultScale();
363         canvas.setScale
364         ((zoom >= 0) ?
365         (df * (zoom + 1)) :
366         (df / (-zoom + 1)));
367         canvas.repaint();
368 
369         if (zoom >= 0) {
370             lblZoom.setText("x" + (zoom + 1));
371         } else {
372             lblZoom.setText("x1/" + (-zoom + 1));
373         }
374     }
375 
select()376     private void select() {
377         canvas.setMode(MapCanvas.MODE_SELECT);
378         canvas.setCanvasEventHandler(null);
379         canvas.repaint();
380     }
381 
newWall()382     private void newWall() {
383         newMapObject(new MapPolygon());
384     }
385 
makeBallArea()386     private void makeBallArea() {
387         if (canvas.getSelectedObjects().isEmpty()) {
388             JOptionPane.showMessageDialog
389             (this, "First select the objects that belong to the ball area.",
390             "Info",
391             JOptionPane.INFORMATION_MESSAGE);
392             return;
393         }
394         canvas.makeBallAreaFromSelected();
395     }
396 
makeBallTarget()397     private void makeBallTarget() {
398         if (canvas.getSelectedObjects().isEmpty()) {
399             JOptionPane.showMessageDialog
400             (this, "First select the objects that belong to the ball target.",
401             "Info",
402             JOptionPane.INFORMATION_MESSAGE);
403             return;
404         }
405         canvas.makeBallTargetFromSelected();
406     }
407 
makeDecor()408     private void makeDecor() {
409         if (canvas.getSelectedObjects().isEmpty()) {
410             JOptionPane.showMessageDialog
411             (this, "First select the objects that belong to the decoration.",
412             "Info",
413             JOptionPane.INFORMATION_MESSAGE);
414             return;
415         }
416         canvas.makeDecorationFromSelected();
417 
418     }
419 
makeFriction()420     private void makeFriction() {
421         if (canvas.getSelectedObjects().isEmpty()) {
422             JOptionPane.showMessageDialog
423             (this, "First select the objects that belong to the friction area.",
424             "Info",
425             JOptionPane.INFORMATION_MESSAGE);
426             return;
427         }
428         canvas.makeFrictionAreaFromSelected();
429     }
430 
makeTarget()431     private void makeTarget() {
432         if (canvas.getSelectedObjects().isEmpty()) {
433             JOptionPane.showMessageDialog
434             (this, "First select the objects that belong to the target.",
435             "Info",
436             JOptionPane.INFORMATION_MESSAGE);
437             return;
438         }
439         canvas.makeTargetFromSelected();
440     }
441 
newFuel()442     private void newFuel() {
443         newMapObject(SimpleMapObject.createFuel());
444     }
445 
newBase()446     private void newBase() {
447         newMapObject(new Base());
448     }
449 
newBall()450     private void newBall() {
451         newMapObject(new Ball());
452     }
453 
makeCannon()454     private void makeCannon() {
455         if (canvas.getSelectedObjects().isEmpty()) {
456             JOptionPane.showMessageDialog
457             (this, "First select the objects that belong to the cannon.",
458             "Info",
459             JOptionPane.INFORMATION_MESSAGE);
460             return;
461         }
462         canvas.makeCannonFromSelected();
463     }
464 
newCheckPoint()465     private void newCheckPoint() {
466         newMapObject(SimpleMapObject.createCheck());
467     }
468 
newItemConcentrator()469     private void newItemConcentrator() {
470         newMapObject(SimpleMapObject.createItemConcentrator());
471     }
472 
newAsteroidConcentrator()473     private void newAsteroidConcentrator() {
474         newMapObject(SimpleMapObject.createAsteroidConcentrator());
475     }
476 
newGrav()477     private void newGrav() {
478         newMapObject(new Grav());
479     }
480 
makeWormhole()481     private void makeWormhole() {
482         if (canvas.getSelectedObjects().isEmpty()) {
483             JOptionPane.showMessageDialog
484             (this, "First select the objects that belong to the wormhole.",
485             "Info",
486             JOptionPane.INFORMATION_MESSAGE);
487             return;
488         }
489         canvas.makeWormholeFromSelected();
490     }
491 
newMapObject(MapObject o)492     private void newMapObject(MapObject o) {
493         canvas.setMode(MapCanvas.MODE_SELECT);
494         canvas.setCanvasEventHandler(o.getCreateHandler(null));
495     }
496 
editMode()497     private void editMode() {
498         canvas.setCanvasEventHandler(null);
499         canvas.setMode(MapCanvas.MODE_EDIT);
500     }
501 
eraseMode()502     private void eraseMode() {
503         canvas.setCanvasEventHandler(null);
504         canvas.setMode(MapCanvas.MODE_ERASE);
505         canvas.repaint();
506     }
507 
copyMode()508     private void copyMode() {
509         canvas.setCanvasEventHandler(null);
510         canvas.setMode(MapCanvas.MODE_COPY);
511         canvas.repaint();
512     }
513 
group()514     private void group() {
515         canvas.makeGroupFromSelected();
516     }
517 
ungroup()518     private void ungroup() {
519         canvas.ungroupSelected();
520     }
521 
regroup()522     private void regroup() {
523         canvas.regroupSelected();
524     }
525 
newMap()526     private void newMap() {
527         mapFile = null;
528         setModel(new MapModel());
529         //setZoom(-5);
530     }
531 
532 
openMap()533     private void openMap() {
534 
535         JFileChooser fc = new JFileChooser(System.getProperty("user.dir"));
536         if (mapFile != null) fc.setSelectedFile(mapFile);
537         if (fc.showOpenDialog(this) != JFileChooser.APPROVE_OPTION) return;
538 
539         File f = fc.getSelectedFile();
540         if (f == null) return;
541         mapFile = f;
542 
543         MapModel model = new MapModel();
544         try {
545             model.load(f.getAbsolutePath());
546         } catch (Exception e) {
547             e.printStackTrace();
548             JOptionPane.showMessageDialog
549             (this, "Loading failed: " + e.getMessage(), "Error",
550             JOptionPane.ERROR_MESSAGE);
551             return;
552         }
553         setModel(model);
554         //setZoom(-5);
555     }
556 
557 
saveMap()558     private void saveMap() {
559         if (!validateMap()) return;
560         JFileChooser fc = new JFileChooser(System.getProperty("user.dir"));
561         if (mapFile != null) fc.setSelectedFile(mapFile);
562         if (fc.showSaveDialog(this) != JFileChooser.APPROVE_OPTION) return;
563 
564         File f = fc.getSelectedFile();
565         if (f == null) return;
566         mapFile = f;
567 
568         try {
569             canvas.getModel().save(f);
570         } catch (Exception e) {
571             e.printStackTrace();
572             JOptionPane.showMessageDialog
573             (this, "Saving failed: " + e.getMessage(), "Error",
574             JOptionPane.ERROR_MESSAGE);
575         }
576     }
577 
578 
importXml()579     private void importXml() {
580         JFileChooser fc = new JFileChooser(System.getProperty("user.dir"));
581         if (fc.showOpenDialog(this) != JFileChooser.APPROVE_OPTION) return;
582         File f = fc.getSelectedFile();
583         if (f == null) return;
584 
585         try {
586 
587             char buf[] = new char[1024];
588             StringBuffer xml = new StringBuffer();
589             Reader reader = new FileReader(f);
590             try {
591                 while(true) {
592                     int len = reader.read(buf);
593                     if (len == -1) break;
594                     xml.append(buf, 0, len);
595                 }
596             } finally {
597                 reader.close();
598             }
599             MapModel model = new MapModel();
600             model.importXml(xml.toString());
601             setModel(model);
602 
603         } catch (Exception e) {
604             e.printStackTrace();
605             JOptionPane.showMessageDialog
606             (this, "Importing failed: " + e.getMessage(), "Error",
607             JOptionPane.ERROR_MESSAGE);
608             return;
609         }
610     }
611 
exportXml()612     private void exportXml() {
613         if (!validateMap()) return;
614         JFileChooser fc = new JFileChooser(System.getProperty("user.dir"));
615         if (fc.showSaveDialog(this) != JFileChooser.APPROVE_OPTION) return;
616 
617         File f = fc.getSelectedFile();
618         if (f == null) return;
619 
620         try {
621             FileWriter writer = new FileWriter(f);
622             try {
623                 writer.write(canvas.getModel().exportXml());
624             } finally {
625                 writer.close();
626             }
627         } catch (Exception e) {
628             e.printStackTrace();
629             JOptionPane.showMessageDialog
630             (this, "Exporting failed: " + e.getMessage(), "Error",
631             JOptionPane.ERROR_MESSAGE);
632             return;
633         }
634     }
635 
exitApp()636     private void exitApp() {
637         System.exit(0);
638     }
639 
640 
showOptions()641     private void showOptions() {
642         EditorDialog.show
643         (this,
644         new MapOptionEditor(canvas.getModel().options),
645         false,
646         EditorDialog.CLOSE);
647     }
648 
649 
showImages()650     private void showImages() {
651         EditorDialog.show
652         (this,
653         new ImageListEditor(canvas.getModel().pixmaps),
654         false,
655         EditorDialog.CLOSE);
656     }
657 
658 
showPolygonStyles()659     private void showPolygonStyles() {
660         EditorDialog.show
661         (this,
662         new PolygonStyleManager(canvas),
663         false,
664         EditorDialog.CLOSE);
665     }
666 
667 
showEdgeStyles()668     private void showEdgeStyles() {
669         EditorDialog.show
670         (this,
671         new EdgeStyleManager(canvas),
672         false,
673         EditorDialog.CLOSE);
674     }
675 
676 
showBeanShellConsole()677     private void showBeanShellConsole() {
678         if (bshConsole == null) {
679             try {
680                 Map vars = new HashMap();
681                 vars.put("editor", canvas);
682                 bshConsole = new BshConsole(vars, interpreter.getNameSpace());
683             } catch (Throwable t) {
684                 t.printStackTrace();
685                 JOptionPane.showMessageDialog
686                 (this, "Cannot create BeanShell console: " + t.toString(),
687                 "Error", JOptionPane.ERROR_MESSAGE);
688             }
689         }
690         if (bshConsole != null)
691             bshConsole.setVisible(true);
692     }
693 
694 
quickSave()695     private void quickSave() {
696 
697         if (mapFile == null) {
698             saveMap();
699             return;
700         }
701         try {
702             canvas.getModel().save(mapFile);
703         } catch (Exception e) {
704             e.printStackTrace();
705             JOptionPane.showMessageDialog
706             (this, "Saving failed: " + e.getMessage(), "Error",
707             JOptionPane.ERROR_MESSAGE);
708         }
709     }
710 
711 
quickOpen()712     private void quickOpen() {
713 
714         if (mapFile == null) {
715             openMap();
716             return;
717         }
718         MapModel model = new MapModel();
719         try {
720             model.load(mapFile.getAbsolutePath());
721         } catch (Exception e) {
722             e.printStackTrace();
723             JOptionPane.showMessageDialog
724             (this, "Loading failed: " + e.getMessage(), "Error",
725             JOptionPane.ERROR_MESSAGE);
726             return;
727         }
728         setModel(model);
729     }
730 
undo()731     private void undo() {
732         if (canvas.getUndoManager().canUndo())
733             canvas.getUndoManager().undo();
734         canvas.repaint();
735     }
736 
redo()737     private void redo() {
738         if (canvas.getUndoManager().canRedo())
739             canvas.getUndoManager().redo();
740         canvas.repaint();
741     }
742 
743 
validateMap()744     private boolean validateMap() {
745         Object[] error = canvas.getModel().validateModel();
746         if (error == null) return true;
747         canvas.setSelectedObject((MapObject)error[0]);
748         JOptionPane.showMessageDialog
749         (this, error[1], "Map validation failed",
750         JOptionPane.INFORMATION_MESSAGE);
751         canvas.repaint();
752         return false;
753     }
754 
755 
756     private class GuiAction extends AbstractAction {
757 
758         private String cmd;
759 
GuiAction(String cmd)760         public GuiAction (String cmd) {
761             super();
762             this.cmd = cmd;
763         }
764 
actionPerformed(ActionEvent ae)765         public void actionPerformed (ActionEvent ae) {
766             MainFrame.this.dispatchCommand(cmd);
767         }
768     }
769 
770 
main(String args[])771     public static void main (String args[]) throws Exception {
772 
773         try {
774             javax.swing.UIManager.setLookAndFeel(
775                 "com.incors.plaf.kunststoff.KunststoffLookAndFeel");
776         } catch (Exception ex) { /* ignore */ }
777         MainFrame mf = new MainFrame();
778         mf.setVisible(true);
779 
780         if (args.length == 0) mf.newMap();
781         else {
782             mf.mapFile = new File(args[0]);
783             MapModel model = new MapModel();
784             if (args.length > 0) model.load(args[0]);
785             mf.setModel(model);
786             //mf.setZoom(-5);
787         }
788     }
789 }
790 
791 class BshConsole extends JFrame {
BshConsole(Map variables, bsh.NameSpace ns)792     public BshConsole(Map variables, bsh.NameSpace ns) throws Exception {
793         super("BeanShell");
794         bsh.util.JConsole jc = new bsh.util.JConsole();
795         bsh.Interpreter interpreter = new bsh.Interpreter(jc, ns);
796         for (Iterator i = variables.keySet().iterator(); i.hasNext();) {
797             String key = (String)i.next();
798             interpreter.set(key, variables.get(key));
799         }
800         int w = 600; int h = 500;
801         Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
802         setBounds((d.width - w) / 2, (d.height - h) / 2, w, h);
803         getContentPane().add(jc);
804         setDefaultCloseOperation(HIDE_ON_CLOSE);
805         Thread t = new Thread(interpreter);
806         t.setDaemon(true);
807         t.start();
808     }
809 }