1// BEGIN LICENSE BLOCK 2// Version: CMPL 1.1 3// 4// The contents of this file are subject to the Cisco-style Mozilla Public 5// License Version 1.1 (the "License"); you may not use this file except 6// in compliance with the License. You may obtain a copy of the License 7// at www.eclipse-clp.org/license. 8// 9// Software distributed under the License is distributed on an "AS IS" 10// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See 11// the License for the specific language governing rights and limitations 12// under the License. 13// 14// The Original Code is CPViz Constraint Visualization System 15// The Initial Developer of the Original Code is Helmut Simonis 16// Portions created by the Initial Developer are 17// Copyright (C) 2009-2010 Helmut Simonis 18// 19// Contributor(s): Helmut Simonis, 4C, Univerity College Cork, Cork 20// Paul Davern, 4C, Univerity College Cork, Cork 21// 22// END LICENSE BLOCK 23// ---------------------------------------------------------------------- 24package components; 25 26 27import javax.swing.Action; 28import javax.swing.JButton; 29import javax.swing.JInternalFrame; 30import javax.swing.JPanel; 31import javax.swing.JSlider; 32import javax.swing.JToolBar; 33import javax.swing.UIManager; 34import javax.swing.event.ChangeEvent; 35 36import org.apache.batik.swing.JSVGCanvas; 37import org.apache.batik.swing.JSVGScrollPane; 38import org.apache.batik.swing.gvt.GVTTreeRenderer; 39import org.apache.batik.swing.gvt.GVTTreeRendererAdapter; 40import org.apache.batik.swing.gvt.GVTTreeRendererEvent; 41import org.apache.batik.swing.gvt.GVTTreeRendererListener; 42import org.apache.batik.swing.svg.GVTTreeBuilderAdapter; 43import org.apache.batik.swing.svg.GVTTreeBuilderEvent; 44import org.apache.batik.swing.svg.SVGDocumentLoaderAdapter; 45import org.apache.batik.swing.svg.SVGDocumentLoaderEvent; 46import org.apache.batik.swing.svg.SVGLoadEventDispatcherAdapter; 47import org.apache.batik.swing.svg.SVGLoadEventDispatcherEvent; 48import org.apache.batik.util.Platform; 49import org.apache.batik.util.gui.resource.ToolBarFactory; 50import org.apache.batik.util.resources.ResourceManager; 51import org.w3c.dom.Document; 52import org.w3c.dom.Element; 53import org.w3c.dom.events.Event; 54import org.w3c.dom.events.EventListener; 55import org.w3c.dom.events.EventTarget; 56import org.apache.batik.script.Window; 57 58 59 60import java.awt.event.*; 61import java.awt.geom.AffineTransform; 62import java.awt.geom.NoninvertibleTransformException; 63import java.awt.geom.Point2D; 64import java.awt.*; 65import java.util.Iterator; 66import java.util.LinkedList; 67import java.util.List; 68import java.util.Locale; 69import java.util.ResourceBundle; 70 71class MyActionListener implements ActionListener { 72 73 MyInternalFrame Me; 74 MyActionListener(MyInternalFrame me){ 75 super(); 76 Me = me; 77 } 78 public void actionPerformed(ActionEvent arg0) { 79 // TODO Auto-generated method stub 80 // System.out.println("here"); 81 if (Me.FileName != null) 82 Me.svgCanvas.setURI(Me.FileName); 83 84 } 85 86} 87/* Used by InternalFrameDemo.java. */ 88public class MyInternalFrame extends JInternalFrame { 89 90 91 static int openFrameCount = 0; 92 static final int xOffset = 30, yOffset = 30; 93 JSVGCanvas svgCanvas; 94 JSVGScrollPane panelCanvas; 95 JPanel panel; 96 boolean first = true; 97 boolean veryfirst=true; 98 boolean ReRender = false; 99 AffineTransform oldTransform = null; 100 AffineTransform OriginalTransform = null; 101 JButton zoomin = new JButton("Zoom In"); 102 JButton zoomout = new JButton("Zoom Out"); 103 JButton OriginalSize = new JButton("Original Size"); 104 String FileName = null; 105 Document document; 106 Window window; 107 108 109 public void registerListeners() { 110 // Gets an element from the loaded document. 111 Element elt = document.getElementById("elt-id"); 112 EventTarget t = (EventTarget)elt; 113 114 // Adds a 'onload' listener 115 t.addEventListener("SVGLoad", new OnLoadAction(), false); 116 117 // Adds a 'onclick' listener 118 t.addEventListener("click", new OnClickAction(), false); 119 } 120 121 public class OnLoadAction implements EventListener { 122 public void handleEvent(Event evt) { 123 // Perform some actions here... 124 125 // ...for example start an animation loop: 126 window.setInterval(new Animation(), 50); 127 } 128 } 129 130 public class OnClickAction implements EventListener { 131 public void handleEvent(Event evt) { 132 // Perform some actions here... 133//System.out.println("element clicked"); 134 // ...for example schedule an action for later: 135 // window.setTimeout(new DelayedTask(), 500); 136 } 137 } 138 139 public class Animation implements Runnable { 140 public void run() { 141 // Insert animation code here... 142 } 143 } 144 145 public class DelayedTask implements Runnable { 146 public void run() { 147 // Perform some actions here... 148 149 // ...for example displays an alert dialog: 150 window.alert("Delayed Action invoked!"); 151 } 152 } 153 154 public void setURI(String fname){ 155 if (svgCanvas!=null){ 156 if (!veryfirst){ 157 ReRender = true; 158 oldTransform = svgCanvas.getRenderingTransform(); 159 } 160 else{ 161 OriginalTransform = svgCanvas.getRenderingTransform(); 162 veryfirst = false; 163 ReRender = false; 164 } 165 svgCanvas.setURI(fname); 166 FileName = fname; 167 String s = fname.substring(8); 168 int pos = s.lastIndexOf("/"); 169 if (pos==-1) 170 pos = s.lastIndexOf("\\"); 171 if (pos !=-1) 172 setTitle(s.substring(pos+1)); 173 else 174 setTitle(s); 175 176 } 177 } 178 public void setToOldTransform() 179 { 180 ReRender = true; 181 svgCanvas.repaint(); 182 } 183 public void SetVeryFirst(boolean b) 184 { 185 veryfirst = b; 186 } 187 public MyInternalFrame() { 188 super("Document #" + (++openFrameCount), 189 true, //resizable 190 true, //closable 191 true, //maximizable 192 true);//iconifiable 193 194 //...Create the GUI and put it in the window... 195 196 //...Then set the window size or call pack... 197 setSize(300,300); 198 199 //Set the window's location. 200 setLocation(xOffset*openFrameCount, yOffset*openFrameCount); 201 svgCanvas = new JSVGCanvas() { 202 Dimension screenSize; 203 204 { 205 screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 206 setMaximumSize(screenSize); 207 } 208 209 public Dimension getPreferredSize(){ 210 Dimension s = super.getPreferredSize(); 211 if (s.width > screenSize.width) s.width =screenSize.width; 212 if (s.height > screenSize.height) s.height = screenSize.height; 213 return s; 214 } 215 216 217 /** 218 * This method is called when the component knows the desired 219 * size of the window (based on width/height of outermost SVG 220 * element). We override it to immediately pack this frame. 221 */ 222 public void setMySize(Dimension d) { 223 // setPreferredSize(d); 224 //System.out.println("setmysize"+d); 225 invalidate(); 226 repaint(); 227 228 } 229 protected void renderGVTTree() { 230 //System.out.println("renderGVRTRee"); 231 Rectangle visRect = getRenderRect(); 232 if (gvtRoot == null || visRect.width <= 0 || visRect.height <= 0) { 233 return; 234 } 235 236 // Renderer setup. 237 if (renderer == null || renderer.getTree() != gvtRoot) { 238 renderer = createImageRenderer(); 239 renderer.setTree(gvtRoot); 240 } 241 242 // Area of interest computation. 243 AffineTransform inv; 244 try { 245 inv = renderingTransform.createInverse(); 246 } catch (NoninvertibleTransformException e) { 247 throw new IllegalStateException( "NoninvertibleTransformEx:" + e.getMessage() ); 248 } 249 Shape s = inv.createTransformedShape(visRect); 250 if (ReRender){ 251 // System.out.println("render "); 252 if (oldTransform != null){ 253 254 svgCanvas.setRenderingTransform(oldTransform,false); 255 // System.out.println("render is set old"); 256 257 } 258 ReRender = false; 259 } 260 // Rendering thread setup. 261 gvtTreeRenderer = new GVTTreeRenderer(renderer, renderingTransform, 262 doubleBufferedRendering, s, 263 visRect.width, visRect.height); 264 gvtTreeRenderer.setPriority(Thread.MIN_PRIORITY); 265 266 Iterator it = gvtTreeRendererListeners.iterator(); 267 while (it.hasNext()) { 268 gvtTreeRenderer.addGVTTreeRendererListener 269 ((GVTTreeRendererListener)it.next()); 270 } 271 272 // Disable the dispatch during the rendering 273 // to avoid concurrent access to the GVT tree. 274 if (eventDispatcher != null) { 275 eventDispatcher.setEventDispatchEnabled(false); 276 } 277 278 gvtTreeRenderer.start(); 279 } 280 281 282 }; 283 panelCanvas = new JSVGScrollPane(svgCanvas); 284 panel = new JPanel(new BorderLayout()); 285 SVGDocumentLoaderAdapter dla = new SVGDocumentLoaderAdapter() { 286 public void documentLoadingStarted(SVGDocumentLoaderEvent e) { 287 //updateStatus("Document Loading..."); 288 } 289 290 291 public void documentLoadingCompleted(SVGDocumentLoaderEvent e) { 292 //updateStatus("Document Loaded."); 293 } 294 }; 295 svgCanvas.addSVGDocumentLoaderListener(dla); 296 svgCanvas.addSVGLoadEventDispatcherListener 297 (new SVGLoadEventDispatcherAdapter() { 298 public void svgLoadEventDispatchStarted 299 (SVGLoadEventDispatcherEvent e) { 300 // At this time the document is available... 301 document = svgCanvas.getSVGDocument(); 302 // ...and the window object too. 303 window = svgCanvas.getUpdateManager(). 304 getScriptingEnvironment().createWindow(); 305 // Registers the listeners on the document 306 // just before the SVGLoad event is 307 // dispatched. 308 registerListeners(); 309 // It is time to pack the frame. 310 pack(); 311 } 312 }); 313 314 svgCanvas.addMouseListener(new MouseAdapter() { 315 public void mouseClicked(MouseEvent e) { 316 317 // System.out.println("view "+svgCanvas.getViewBoxTransform()); 318 // System.out.println(" x "+e.getX()+" y "+e.getY()); 319 AffineTransform at; 320 at = svgCanvas.getViewBoxTransform(); 321 322 if (at != null) { 323 // System.out.println("mouse move viewBoxTrans"+at+"mousepos "+ 324 // new Point2D.Float(e.getX(), e.getY())); 325 try { 326 at = at.createInverse(); 327 } catch (NoninvertibleTransformException e1) { 328 // TODO Auto-generated catch block 329 e1.printStackTrace(); 330 } 331 Point2D p2d = 332 at.transform(new Point2D.Float(e.getX(), e.getY()), 333 null); 334 // System.out.println("point in view "+p2d); 335 } 336 337 } 338 339 public void mouseExited(MouseEvent e) { 340 Dimension dim = svgCanvas.getSize(); 341 342 } 343 }); 344 345 GVTTreeBuilderAdapter tba = new GVTTreeBuilderAdapter() { 346 public void gvtBuildStarted(GVTTreeBuilderEvent e) { 347 // updateStatus("Build Started..."); 348 } 349 350 351 public void gvtBuildCompleted(GVTTreeBuilderEvent e) { 352 //updateStatus("Build Done."); 353 } 354 }; 355 svgCanvas.addGVTTreeBuilderListener(tba); 356 357 GVTTreeRendererAdapter tra= new GVTTreeRendererAdapter() { 358 public void gvtRenderingPrepare(GVTTreeRendererEvent e) { 359 //updateStatus("Rendering Started..."); 360 } 361 362 363 public void gvtRenderingCompleted(GVTTreeRendererEvent e) { 364 //updateStatus(""); 365 } 366 }; 367 svgCanvas.addGVTTreeRendererListener(tra); 368 JPanel panel1 = new JPanel(new GridLayout(1,1)); 369 panel1.add(zoomin); 370 panel1.add(zoomout); 371 panel1.add(OriginalSize); 372 panel.add(panel1,BorderLayout.NORTH); 373 panel.add(panelCanvas,BorderLayout.CENTER); 374 panelCanvas.setScrollbarsAlwaysVisible(true); 375 //svgCanvas.setURI("file:///C:/testsaros/result/tree_1.svg"); 376 javax.swing.ActionMap cMap = svgCanvas.getActionMap(); 377 zoomin.addActionListener(cMap.get(JSVGCanvas.ZOOM_IN_ACTION)); 378 zoomout.addActionListener(cMap.get(JSVGCanvas.ZOOM_OUT_ACTION)); 379 OriginalSize.addActionListener(new MyActionListener(this)); 380 381 AffineTransform vb = svgCanvas.getViewBoxTransform(); 382 // System.out.println("view box trans"+vb); 383 getContentPane().add(panel, BorderLayout.CENTER); 384 addComponentListener(new ComponentAdapter() { 385 public void componentResized(ComponentEvent e) { 386 387 // System.out.println("JSVG canvas component resize listener"); 388 AffineTransform vb = svgCanvas.getViewBoxTransform(); 389 // System.out.println("view box trans"+vb); 390 AffineTransform at = svgCanvas.getRenderingTransform(); 391 // System.out.println("new render"+at); 392 Dimension sp = panel.getSize(); 393 Dimension c = svgCanvas.getSize(); 394 // System.out.println("sp "+sp+" c "+c); 395 double top = sp.getHeight();///c.getHeight();s.getHeight()-t.getHeight()-sbar.getHeight()-sslide.getHeight(); 396 397 if (top > 40.0){ 398 double scale = (top-20.0)/(double)(c.getHeight()); 399 400 // System.out.println("scale "+scale); 401 at= svgCanvas.getRenderingTransform(); 402 at.concatenate(AffineTransform.getScaleInstance(scale,scale)); 403 // if (first){ 404 // at = new AffineTransform(scale,0.0,0.0,scale,-vb.getTranslateX(),-vb.getTranslateY()); 405 // first = false; 406 // svgCanvas.setRenderingTransform(at); 407 // } 408 vb = svgCanvas.getViewBoxTransform(); 409 // System.out.println("new view box trans"+vb); 410 at = svgCanvas.getRenderingTransform(); 411 // System.out.println("new render"+at); 412 // leftpane.AffineScale = scale; 413 // at.concatenate(AffineTransform.getTranslateInstance(c.getWidth()/2, 0)); 414 // svgCanvas.setRenderingTransform(at); 415 /* int tx=0,ty=0; 416 at = AffineTransform.getTranslateInstance(tx, ty); 417 AffineTransform rat = svgCanvas.getRenderingTransform(); 418 Dimension dim = svgCanvas.getSize(); 419 int x = dim.width / 2; 420 int y = dim.height / 2; 421 AffineTransform t = AffineTransform.getTranslateInstance(x, y); 422 t.concatenate(at); 423 t.translate(-x, -y); 424 t.concatenate(rat); 425 svgCanvas.setRenderingTransform(t);*/ 426 svgCanvas.setSize(sp); 427 // setURI(FileName); 428 /* javax.swing.SwingUtilities.invokeLater(new Runnable() { 429 public void run() { 430 panel.validate(); 431 panel.repaint(); 432 } 433 });*/ 434 435 } 436 437 438 } 439 }); 440 } 441} 442