| 1 18 package org.apache.batik.apps.svgbrowser; 19 20 import java.awt.BorderLayout ; 21 import java.awt.Color ; 22 import java.awt.Cursor ; 23 import java.awt.Dimension ; 24 import java.awt.Event ; 25 import java.awt.EventQueue ; 26 import java.awt.Font ; 27 import java.awt.Graphics2D ; 28 import java.awt.Rectangle ; 29 import java.awt.Toolkit ; 30 import java.awt.event.ActionEvent ; 31 import java.awt.event.ComponentAdapter ; 32 import java.awt.event.ComponentEvent ; 33 import java.awt.event.KeyEvent ; 34 import java.awt.event.MouseAdapter ; 35 import java.awt.event.MouseEvent ; 36 import java.awt.event.MouseMotionAdapter ; 37 import java.awt.event.WindowAdapter ; 38 import java.awt.event.WindowEvent ; 39 import java.awt.geom.AffineTransform ; 40 import java.awt.geom.NoninvertibleTransformException ; 41 import java.awt.geom.Point2D ; 42 import java.awt.image.BufferedImage ; 43 import java.awt.print.PrinterException ; 44 import java.io.BufferedOutputStream ; 45 import java.io.File ; 46 import java.io.FileOutputStream ; 47 import java.io.IOException ; 48 import java.io.InputStream ; 49 import java.io.OutputStream ; 50 import java.io.OutputStreamWriter ; 51 import java.io.Reader ; 52 import java.io.Writer ; 53 import java.lang.reflect.Constructor ; 54 import java.lang.reflect.Method ; 55 import java.net.MalformedURLException ; 56 import java.util.HashMap ; 57 import java.util.Iterator ; 58 import java.util.LinkedList ; 59 import java.util.List ; 60 import java.util.Locale ; 61 import java.util.Map ; 62 import java.util.MissingResourceException ; 63 import java.util.ResourceBundle ; 64 import java.util.Vector ; 65 66 import javax.swing.AbstractAction ; 67 import javax.swing.Action ; 68 import javax.swing.BorderFactory ; 69 import javax.swing.ButtonGroup ; 70 import javax.swing.JCheckBox ; 71 import javax.swing.JComponent ; 72 import javax.swing.JDialog ; 73 import javax.swing.JFileChooser ; 74 import javax.swing.JFrame ; 75 import javax.swing.JMenu ; 76 import javax.swing.JMenuBar ; 77 import javax.swing.JOptionPane ; 78 import javax.swing.JPanel ; 79 import javax.swing.JRadioButtonMenuItem ; 80 import javax.swing.JScrollPane ; 81 import javax.swing.JTextArea ; 82 import javax.swing.JToolBar ; 83 import javax.swing.JWindow ; 84 import javax.swing.KeyStroke ; 85 import javax.swing.filechooser.FileFilter ; 86 import javax.swing.text.Document ; 87 import javax.swing.text.PlainDocument ; 88 89 import org.apache.batik.bridge.DefaultExternalResourceSecurity; 90 import org.apache.batik.bridge.DefaultScriptSecurity; 91 import org.apache.batik.bridge.EmbededExternalResourceSecurity; 92 import org.apache.batik.bridge.EmbededScriptSecurity; 93 import org.apache.batik.bridge.ExternalResourceSecurity; 94 import org.apache.batik.bridge.NoLoadExternalResourceSecurity; 95 import org.apache.batik.bridge.NoLoadScriptSecurity; 96 import org.apache.batik.bridge.RelaxedExternalResourceSecurity; 97 import org.apache.batik.bridge.RelaxedScriptSecurity; 98 import org.apache.batik.bridge.ScriptSecurity; 99 import org.apache.batik.bridge.UpdateManager; 100 import org.apache.batik.bridge.UpdateManagerEvent; 101 import org.apache.batik.bridge.UpdateManagerListener; 102 import org.apache.batik.dom.StyleSheetProcessingInstruction; 103 import org.apache.batik.dom.svg.SVGOMDocument; 104 import org.apache.batik.dom.util.HashTable; 105 import org.apache.batik.dom.util.DOMUtilities; 106 import org.apache.batik.ext.swing.JAffineTransformChooser; 107 import org.apache.batik.swing.JSVGCanvas; 108 import org.apache.batik.swing.gvt.GVTTreeRendererEvent; 109 import org.apache.batik.swing.gvt.GVTTreeRendererListener; 110 import org.apache.batik.swing.svg.GVTTreeBuilderEvent; 111 import org.apache.batik.swing.svg.GVTTreeBuilderListener; 112 import org.apache.batik.swing.svg.LinkActivationEvent; 113 import org.apache.batik.swing.svg.LinkActivationListener; 114 import org.apache.batik.swing.svg.SVGDocumentLoaderEvent; 115 import org.apache.batik.swing.svg.SVGDocumentLoaderListener; 116 import org.apache.batik.swing.svg.SVGFileFilter; 117 import org.apache.batik.swing.svg.SVGLoadEventDispatcherEvent; 118 import org.apache.batik.swing.svg.SVGLoadEventDispatcherListener; 119 import org.apache.batik.swing.svg.SVGUserAgent; 120 import org.apache.batik.transcoder.TranscoderInput; 121 import org.apache.batik.transcoder.TranscoderOutput; 122 import org.apache.batik.transcoder.image.ImageTranscoder; 123 import org.apache.batik.transcoder.image.JPEGTranscoder; 124 import org.apache.batik.transcoder.image.PNGTranscoder; 125 import org.apache.batik.transcoder.image.TIFFTranscoder; 126 import org.apache.batik.transcoder.print.PrintTranscoder; 127 import org.apache.batik.transcoder.svg2svg.SVGTranscoder; 128 import org.apache.batik.util.ParsedURL; 129 import org.apache.batik.util.Service; 130 import org.apache.batik.util.SVGConstants; 131 import org.apache.batik.util.XMLConstants; 132 import org.apache.batik.util.gui.DOMViewer; 133 import org.apache.batik.util.gui.JErrorPane; 134 import org.apache.batik.util.gui.LocationBar; 135 import org.apache.batik.util.gui.MemoryMonitor; 136 import org.apache.batik.util.gui.URIChooser; 137 import org.apache.batik.util.gui.resource.ActionMap; 138 import org.apache.batik.util.gui.resource.JComponentModifier; 139 import org.apache.batik.util.gui.resource.MenuFactory; 140 import org.apache.batik.util.gui.resource.MissingListenerException; 141 import org.apache.batik.util.gui.resource.ResourceManager; 142 import org.apache.batik.util.gui.resource.ToolBarFactory; 143 import org.apache.batik.xml.XMLUtilities; 144 import org.mozilla.javascript.Context; 145 import org.mozilla.javascript.ContextListener; 146 import org.w3c.dom.Element ; 147 import org.w3c.dom.Node ; 148 import org.w3c.dom.css.ViewCSS; 149 import org.w3c.dom.svg.SVGDocument; 150 151 157 public class JSVGViewerFrame 158 extends JFrame  159 implements ActionMap, 160 SVGDocumentLoaderListener, 161 GVTTreeBuilderListener, 162 SVGLoadEventDispatcherListener, 163 GVTTreeRendererListener, 164 LinkActivationListener, 165 UpdateManagerListener { 166 167 static private String EOL; 168 static { 169 String temp; 170 try { temp = System.getProperty ("line.separator", "\n"); } 171 catch (SecurityException e) { temp = "\n"; } 172 EOL = temp; 173 } 174 175 179 protected static boolean priorJDK1_4 = true; 180 181 185 protected static final String JDK_1_4_PRESENCE_TEST_CLASS 186 = "java.util.logging.LoggingPermission"; 187 188 static { 189 Class cl = null; 190 try { 191 cl = Class.forName(JDK_1_4_PRESENCE_TEST_CLASS); 192 } catch (ClassNotFoundException e){ 193 } 194 195 if (cl != null) { 196 priorJDK1_4 = false; 197 } 198 } 199 200 static JFrame debuggerFrame = null; 201 static Class debuggerClass = null; 202 static Method clearAllBreakpoints = null; 203 static Method scriptGo = null; 204 static Method setExitAction = null; 205 static { 206 try { 207 debuggerClass = JSVGViewerFrame.class.getClassLoader().loadClass 208 ("org.mozilla.javascript.tools.debugger.Main"); 209 clearAllBreakpoints = debuggerClass.getMethod 210 ("clearAllBreakpoints", null); 211 scriptGo = debuggerClass.getMethod 212 ("go", null); 213 setExitAction = debuggerClass.getMethod 214 ("setExitAction", new Class [] {Runnable .class}); 215 } catch (ThreadDeath td) { 216 debuggerClass = null; 217 clearAllBreakpoints = null; 218 scriptGo = null; 219 setExitAction = null; 220 throw td; 221 } catch (Throwable t) { 222 debuggerClass = null; 223 clearAllBreakpoints = null; 224 scriptGo = null; 225 setExitAction = null; 226 } 227 } 228 229 public static void showDebugger() { 230 if (debuggerClass == null) return; 231 if (debuggerFrame == null) { 232 try { 233 Constructor c = debuggerClass.getConstructor 234 (new Class [] { String .class }); 235 debuggerFrame = (JFrame )c.newInstance 236 (new Object [] { "Rhino JavaScript Debugger" }); 237 JMenuBar menuBar = debuggerFrame.getJMenuBar(); 240 JMenu menu = menuBar.getMenu(0); 241 menu.getItem(0).setEnabled(false); menu.getItem(1).setEnabled(false); menu.getItem(3).setText 244 (Resources.getString("Close.text")); menu.getItem(3).setAccelerator 246 (KeyStroke.getKeyStroke(KeyEvent.VK_W, Event.CTRL_MASK)); 247 248 debuggerFrame.setSize(600, 460); 249 debuggerFrame.pack(); 250 WindowAdapter wa = new WindowAdapter () { 251 public void windowClosing(WindowEvent e) { 252 hideDebugger(); 253 }}; 254 setExitAction.invoke(debuggerFrame, 255 new Object [] { new Runnable () { 256 public void run() { 257 hideDebugger(); 258 }}}); 259 debuggerFrame.addWindowListener(wa); 260 } catch (Exception ex) { 261 ex.printStackTrace(); 262 return; 263 } 264 } 265 if (debuggerFrame != null) { 266 debuggerFrame.setVisible(true); 267 Context.addContextListener((ContextListener)debuggerFrame); 268 } 269 } 270 271 public static void hideDebugger() { 272 if (debuggerFrame == null) 273 return; 274 Context.removeContextListener((ContextListener)debuggerFrame); 275 debuggerFrame.setVisible(false); 276 try { 277 clearAllBreakpoints.invoke(debuggerFrame, null); 278 scriptGo.invoke(debuggerFrame, null); 279 } catch (Exception ex) { 280 ex.printStackTrace(); 281 } 282 } 283 284 287 public final static String RESOURCES = 288 "org.apache.batik.apps.svgbrowser.resources.GUI"; 289 290 public final static String ABOUT_ACTION = "AboutAction"; 292 public final static String OPEN_ACTION = "OpenAction"; 293 public final static String OPEN_LOCATION_ACTION = "OpenLocationAction"; 294 public final static String NEW_WINDOW_ACTION = "NewWindowAction"; 295 public final static String RELOAD_ACTION = "ReloadAction"; 296 public final static String SAVE_AS_ACTION = "SaveAsAction"; 297 public final static String BACK_ACTION = "BackAction"; 298 public final static String FORWARD_ACTION = "ForwardAction"; 299 public final static String FULL_SCREEN_ACTION = "FullScreenAction"; 300 public final static String PRINT_ACTION = "PrintAction"; 301 public final static String EXPORT_AS_JPG_ACTION = "ExportAsJPGAction"; 302 public final static String EXPORT_AS_PNG_ACTION = "ExportAsPNGAction"; 303 public final static String EXPORT_AS_TIFF_ACTION = "ExportAsTIFFAction"; 304 public final static String PREFERENCES_ACTION = "PreferencesAction"; 305 public final static String CLOSE_ACTION = "CloseAction"; 306 public final static String VIEW_SOURCE_ACTION = "ViewSourceAction"; 307 public final static String EXIT_ACTION = "ExitAction"; 308 public final static String RESET_TRANSFORM_ACTION = "ResetTransformAction"; 309 public final static String ZOOM_IN_ACTION = "ZoomInAction"; 310 public final static String ZOOM_OUT_ACTION = "ZoomOutAction"; 311 public final static String PREVIOUS_TRANSFORM_ACTION = "PreviousTransformAction"; 312 public final static String NEXT_TRANSFORM_ACTION = "NextTransformAction"; 313 public final static String USE_STYLESHEET_ACTION = "UseStylesheetAction"; 314 public final static String PLAY_ACTION = "PlayAction"; 315 public final static String PAUSE_ACTION = "PauseAction"; 316 public final static String STOP_ACTION = "StopAction"; 317 public final static String MONITOR_ACTION = "MonitorAction"; 318 public final static String DOM_VIEWER_ACTION = "DOMViewerAction"; 319 public final static String SET_TRANSFORM_ACTION = "SetTransformAction"; 320 public final static String FIND_DIALOG_ACTION = "FindDialogAction"; 321 public final static String THUMBNAIL_DIALOG_ACTION = "ThumbnailDialogAction"; 322 public final static String FLUSH_ACTION = "FlushAction"; 323 public final static String TOGGLE_DEBUGGER_ACTION = "ToggleDebuggerAction"; 324 325 328 public final static Cursor WAIT_CURSOR = 329 new Cursor (Cursor.WAIT_CURSOR); 330 331 334 public final static Cursor DEFAULT_CURSOR = 335 new Cursor (Cursor.DEFAULT_CURSOR); 336 337 340 public final static String PROPERTY_OS_NAME 341 = Resources.getString("JSVGViewerFrame.property.os.name"); 342 343 346 public final static String PROPERTY_OS_NAME_DEFAULT 347 = Resources.getString("JSVGViewerFrame.property.os.name.default"); 348 349 353 public final static String PROPERTY_OS_WINDOWS_PREFIX 354 = Resources.getString("JSVGViewerFrame.property.os.windows.prefix"); 355 356 359 protected static Vector handlers; 360 361 364 protected static SquiggleInputHandler defaultHandler = new SVGInputHandler(); 365 366 369 protected static ResourceBundle bundle; 370 371 374 protected static ResourceManager resources; 375 static { 376 bundle = ResourceBundle.getBundle(RESOURCES, Locale.getDefault()); 377 resources = new ResourceManager(bundle); 378 } 379 380 383 protected Application application; 384 385 388 protected JSVGCanvas svgCanvas; 389 390 393 protected JPanel svgCanvasPanel; 394 395 398 protected JWindow window; 399 400 403 protected static JFrame memoryMonitorFrame; 404 405 408 protected File currentPath = new File (""); 409 410 413 protected File currentSavePath = new File (""); 414 415 418 protected BackAction backAction = new BackAction(); 419 420 423 protected ForwardAction forwardAction = new ForwardAction(); 424 425 428 protected PlayAction playAction = new PlayAction(); 429 430 433 protected PauseAction pauseAction = new PauseAction(); 434 435 438 protected StopAction stopAction = new StopAction(); 439 440 443 protected PreviousTransformAction previousTransformAction = 444 new PreviousTransformAction(); 445 446 449 protected NextTransformAction nextTransformAction = 450 new NextTransformAction(); 451 452 455 protected UseStylesheetAction useStylesheetAction = 456 new UseStylesheetAction(); 457 458 461 protected boolean debug; 462 463 466 protected boolean autoAdjust = true; 467 468 471 protected boolean managerStopped; 472 473 476 protected SVGUserAgent userAgent = new UserAgent(); 477 478 481 protected SVGDocument svgDocument; 482 483 486 protected URIChooser uriChooser; 487 488 491 protected DOMViewer domViewer; 492 493 496 protected FindDialog findDialog; 497 498 501 protected ThumbnailDialog thumbnailDialog; 502 503 506 protected JAffineTransformChooser.Dialog transformDialog; 507 508 511 protected LocationBar locationBar; 512 513 516 protected StatusBar statusBar; 517 518 521 protected String title; 522 523 526 protected LocalHistory localHistory; 527 528 531 protected TransformHistory transformHistory = new TransformHistory(); 532 533 536 protected String alternateStyleSheet; 537 538 541 public JSVGViewerFrame(Application app) { 542 application = app; 543 544 addWindowListener(new WindowAdapter () { 545 public void windowClosing(WindowEvent e) { 546 application.closeJSVGViewerFrame(JSVGViewerFrame.this); 547 } 548 }); 549 550 svgCanvas = new JSVGCanvas(userAgent, true, true){ 556 Dimension screenSize; 557 558 { 559 screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 560 setMaximumSize(screenSize); 561 } 562 563 public Dimension getPreferredSize(){ 564 Dimension s = super.getPreferredSize(); 565 if (s.width > screenSize.width) s.width =screenSize.width; 566 if (s.height > screenSize.height) s.height = screenSize.height; 567 return s; 568 } 569 570 571 576 public void setMySize(Dimension d) { 577 setPreferredSize(d); 578 invalidate(); 579 if (JSVGViewerFrame.this.autoAdjust) { 580 JSVGViewerFrame.this.pack(); 581 } 582 } 583 584 public void setDisableInteractions(boolean b) { 585 super.setDisableInteractions(b); 586 587 590 ((Action )listeners.get(SET_TRANSFORM_ACTION)) .setEnabled(!b); 591 592 if (thumbnailDialog != null) 593 thumbnailDialog.setInteractionEnabled(!b); 594 } 595 }; 596 597 javax.swing.ActionMap map = svgCanvas.getActionMap(); 598 map.put(FULL_SCREEN_ACTION, new FullScreenAction()); 599 javax.swing.InputMap imap = svgCanvas.getInputMap(JComponent.WHEN_FOCUSED); 600 KeyStroke key = KeyStroke.getKeyStroke(KeyEvent.VK_F11, 0); 601 imap.put(key, FULL_SCREEN_ACTION); 602 603 svgCanvas.setDoubleBufferedRendering(true); 604 605 listeners.put(ABOUT_ACTION, new AboutAction()); 606 listeners.put(OPEN_ACTION, new OpenAction()); 607 listeners.put(OPEN_LOCATION_ACTION, new OpenLocationAction()); 608 listeners.put(NEW_WINDOW_ACTION, new NewWindowAction()); 609 listeners.put(RELOAD_ACTION, new ReloadAction()); 610 listeners.put(SAVE_AS_ACTION, new SaveAsAction()); 611 listeners.put(BACK_ACTION, backAction); 612 listeners.put(FORWARD_ACTION, forwardAction); 613 listeners.put(PRINT_ACTION, new PrintAction()); 614 listeners.put(EXPORT_AS_JPG_ACTION, new ExportAsJPGAction()); 615 listeners.put(EXPORT_AS_PNG_ACTION, new ExportAsPNGAction()); 616 listeners.put(EXPORT_AS_TIFF_ACTION, new ExportAsTIFFAction()); 617 listeners.put(PREFERENCES_ACTION, new PreferencesAction()); 618 listeners.put(CLOSE_ACTION, new CloseAction()); 619 listeners.put(EXIT_ACTION, application.createExitAction(this)); 620 listeners.put(VIEW_SOURCE_ACTION, new ViewSourceAction()); 621 622 javax.swing.ActionMap cMap = svgCanvas.getActionMap(); 623 listeners.put(RESET_TRANSFORM_ACTION, 624 cMap.get(JSVGCanvas.RESET_TRANSFORM_ACTION)); 625 listeners.put(ZOOM_IN_ACTION, 626 cMap.get(JSVGCanvas.ZOOM_IN_ACTION)); 627 listeners.put(ZOOM_OUT_ACTION, 628 cMap.get(JSVGCanvas.ZOOM_OUT_ACTION)); 629 630 listeners.put(PREVIOUS_TRANSFORM_ACTION, previousTransformAction); 631 key = KeyStroke.getKeyStroke(KeyEvent.VK_K, KeyEvent.CTRL_MASK); 632 imap.put(key, previousTransformAction); 633 634 listeners.put(NEXT_TRANSFORM_ACTION, nextTransformAction); 635 key = KeyStroke.getKeyStroke(KeyEvent.VK_L, KeyEvent.CTRL_MASK); 636 imap.put(key, nextTransformAction); 637 638 listeners.put(USE_STYLESHEET_ACTION, useStylesheetAction); 639 listeners.put(PLAY_ACTION, playAction); 640 listeners.put(PAUSE_ACTION, pauseAction); 641 listeners.put(STOP_ACTION, stopAction); 642 listeners.put(MONITOR_ACTION, new MonitorAction()); 643 listeners.put(DOM_VIEWER_ACTION, new DOMViewerAction()); 644 listeners.put(SET_TRANSFORM_ACTION, new SetTransformAction()); 645 listeners.put(FIND_DIALOG_ACTION, new FindDialogAction()); 646 listeners.put(THUMBNAIL_DIALOG_ACTION, new ThumbnailDialogAction()); 647 listeners.put(FLUSH_ACTION, new FlushAction()); 648 listeners.put(TOGGLE_DEBUGGER_ACTION, new ToggleDebuggerAction()); 649 650 JPanel p = null; 651 try { 652 MenuFactory mf = new MenuFactory(bundle, this); 654 JMenuBar mb = mf.createJMenuBar("MenuBar"); 655 setJMenuBar(mb); 656 657 localHistory = new LocalHistory(mb, this); 658 659 String uri[] = application.getVisitedURIs(); 660 for (int i=0; i<uri.length; i++) { 661 if (uri[i] != null && !"".equals(uri[i])) { 662 localHistory.update(uri[i]); 663 } 664 } 665 p = new JPanel (new BorderLayout ()); 666 667 ToolBarFactory tbf = new ToolBarFactory(bundle, this); 669 JToolBar tb = tbf.createJToolBar("ToolBar"); 670 tb.setFloatable(false); 671 getContentPane().add(p, BorderLayout.NORTH); 672 p.add(tb, BorderLayout.NORTH); 673 p.add(new javax.swing.JSeparator (), BorderLayout.CENTER); 674 p.add(locationBar = new LocationBar(), BorderLayout.SOUTH); 675 676 } catch (MissingResourceException e) { 677 System.out.println(e.getMessage()); 678 System.exit(0); 679 } 680 681 svgCanvasPanel = new JPanel (new BorderLayout ()); 682 svgCanvasPanel.setBorder(BorderFactory.createEtchedBorder()); 683 684 svgCanvasPanel.add(svgCanvas, BorderLayout.CENTER); 685 p = new JPanel (new BorderLayout ()); 686 p.add(svgCanvasPanel, BorderLayout.CENTER); 687 p.add(statusBar = new StatusBar(), BorderLayout.SOUTH); 688 689 getContentPane().add(p, BorderLayout.CENTER); 690 691 svgCanvas.addSVGDocumentLoaderListener(this); 692 svgCanvas.addGVTTreeBuilderListener(this); 693 svgCanvas.addSVGLoadEventDispatcherListener(this); 694 svgCanvas.addGVTTreeRendererListener(this); 695 svgCanvas.addLinkActivationListener(this); 696 svgCanvas.addUpdateManagerListener(this); 697 698 svgCanvas.addMouseMotionListener(new MouseMotionAdapter () { 699 &nbs
|