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