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 }