deweese 2003/02/26 03:13:46 Modified: sources/org/apache/batik/bridge BaseScriptingEnvironment.java UpdateManager.java sources/org/apache/batik/swing/gvt AbstractZoomInteractor.java JGVTComponent.java sources/org/apache/batik/swing/svg JSVGComponent.java Added: sources/org/apache/batik/swing/gvt JGVTComponentAdapter.java JGVTComponentListener.java Log: 1) onzoom, onscroll, onresize events are now implemented. 2) Improved the behavior on resize, so it does a better job of keeping the content centered. Revision Changes Path 1.16 +34 -1 xml-batik/sources/org/apache/batik/bridge/BaseScriptingEnvironment.java Index: BaseScriptingEnvironment.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/BaseScriptingEnvironment.java,v retrieving revision 1.15 retrieving revision 1.16 diff -u -r1.15 -r1.16 --- BaseScriptingEnvironment.java 12 Nov 2002 09:51:34 -0000 1.15 +++ BaseScriptingEnvironment.java 26 Feb 2003 11:13:45 -0000 1.16 @@ -457,6 +457,39 @@ } /** + * Method to dispatch SVG Zoom event. + */ + protected void dispatchSVGZoomEvent() { + dispatchSVGDocEvent("SVGZoom"); + } + + /** + * Method to dispatch SVG Scroll event. + */ + protected void dispatchSVGScrollEvent() { + dispatchSVGDocEvent("SVGScroll"); + } + + /** + * Method to dispatch SVG Resize event. + */ + protected void dispatchSVGResizeEvent() { + dispatchSVGDocEvent("SVGResize"); + } + + protected void dispatchSVGDocEvent(String eventType) { + SVGSVGElement root = + (SVGSVGElement)document.getDocumentElement(); + // Event is dispatched on outermost SVG element. + EventTarget t = root; + + DocumentEvent de = (DocumentEvent)document; + Event ev = de.createEvent("SVGEvents"); + ev.initEvent(eventType, false, false); + t.dispatchEvent(ev); + } + + /** * Handles the given exception. */ protected void handleInterpreterException(InterpreterException ie) { 1.20 +25 -1 xml-batik/sources/org/apache/batik/bridge/UpdateManager.java Index: UpdateManager.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/UpdateManager.java,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- UpdateManager.java 24 Feb 2003 18:25:52 -0000 1.19 +++ UpdateManager.java 26 Feb 2003 11:13:45 -0000 1.20 @@ -153,6 +153,30 @@ } /** + * Dispatches an "SVGZoom" event to the document. + */ + public void dispatchSVGZoomEvent() + throws InterruptedException { + scriptingEnvironment.dispatchSVGZoomEvent(); + } + + /** + * Dispatches an "SVGZoom" event to the document. + */ + public void dispatchSVGScrollEvent() + throws InterruptedException { + scriptingEnvironment.dispatchSVGScrollEvent(); + } + + /** + * Dispatches an "SVGZoom" event to the document. + */ + public void dispatchSVGResizeEvent() + throws InterruptedException { + scriptingEnvironment.dispatchSVGResizeEvent(); + } + + /** * Finishes the UpdateManager initialization. */ public void manageUpdates(final ImageRenderer r) { 1.3 +31 -5 xml-batik/sources/org/apache/batik/swing/gvt/AbstractZoomInteractor.java Index: AbstractZoomInteractor.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/swing/gvt/AbstractZoomInteractor.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- AbstractZoomInteractor.java 15 Mar 2001 14:11:17 -0000 1.2 +++ AbstractZoomInteractor.java 26 Feb 2003 11:13:45 -0000 1.3 @@ -187,10 +187,36 @@ xCurrent = e.getX(); yCurrent = e.getY(); - markerTop = new Line2D.Float(xStart, yStart, xCurrent, yStart); - markerLeft = new Line2D.Float(xStart, yStart, xStart, yCurrent); - markerBottom = new Line2D.Float(xStart, yCurrent, xCurrent, yCurrent); - markerRight = new Line2D.Float(xCurrent, yCurrent, xCurrent, yStart); + // Constrain rectangle to window's Aspect Ratio. + float xMin, yMin, width, height; + if (xStart < xCurrent) { + xMin = xStart; + width = xCurrent - xStart; + } else { + xMin = xCurrent; + width = xStart - xCurrent; + } + if (yStart < yCurrent) { + yMin = yStart; + height = yCurrent - yStart; + } else { + yMin = yCurrent; + height = yStart - yCurrent; + } + Dimension d = c.getSize(); + float compAR = d.width/(float)d.height; + if (compAR > width/height) { + width = compAR*height; + } else { + height = width/compAR; + } + + markerTop = new Line2D.Float(xMin, yMin, xMin+width, yMin); + markerLeft = new Line2D.Float(xMin, yMin, xMin, yMin+height); + markerBottom = new Line2D.Float(xMin, yMin+height, + xMin+width, yMin+height); + markerRight = new Line2D.Float(xMin+width, yMin, + xMin+width, yMin+height); overlay.paint(c.getGraphics()); } 1.31 +28 -1 xml-batik/sources/org/apache/batik/swing/gvt/JGVTComponent.java Index: JGVTComponent.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/swing/gvt/JGVTComponent.java,v retrieving revision 1.30 retrieving revision 1.31 diff -u -r1.30 -r1.31 --- JGVTComponent.java 24 Feb 2003 18:25:54 -0000 1.30 +++ JGVTComponent.java 26 Feb 2003 11:13:45 -0000 1.31 @@ -141,6 +141,11 @@ protected List overlays = new LinkedList(); /** + * The JGVTComponentListener list. + */ + protected List jgvtListeners = null; + + /** * The event dispatcher. */ protected AWTEventDispatcher eventDispatcher; @@ -234,6 +239,18 @@ return image; } + + public void addJGVTComponentListener(JGVTComponentListener listener) { + if (jgvtListeners == null) + jgvtListeners = new LinkedList(); + jgvtListeners.add(listener); + } + + public void removeJGVTComponentListener(JGVTComponentListener listener) { + if (jgvtListeners == null) return; + jgvtListeners.remove(listener); + } + /** * Resets the rendering transform to its initial value. */ @@ -500,6 +517,16 @@ handleException(e); } } + if (jgvtListeners != null) { + Iterator iter = jgvtListeners.iterator(); + ComponentEvent ce = new ComponentEvent + (this, JGVTComponentListener.COMPONENT_TRANSFORM_CHANGED); + while (iter.hasNext()) { + JGVTComponentListener l = (JGVTComponentListener)iter.next(); + l.componentTransformChanged(ce); + } + } + if (performRedraw) scheduleGVTRendering(); } 1.1 xml-batik/sources/org/apache/batik/swing/gvt/JGVTComponentAdapter.java Index: JGVTComponentAdapter.java =================================================================== /***************************************************************************** * Copyright (C) The Apache Software Foundation. All rights reserved. * * ------------------------------------------------------------------------- * * This software is published under the terms of the Apache Software License * * version 1.1, a copy of which has been included with this distribution in * * the LICENSE file. * *****************************************************************************/ package org.apache.batik.swing.gvt; import java.awt.event.ComponentAdapter; import java.awt.event.ComponentEvent; public class JGVTComponentAdapter implements JGVTComponentListener { /** * Called when the rendering transform * changes on the JGVTComponentListener */ public void componentTransformChanged (ComponentEvent event) { } } 1.1 xml-batik/sources/org/apache/batik/swing/gvt/JGVTComponentListener.java Index: JGVTComponentListener.java =================================================================== /***************************************************************************** * Copyright (C) The Apache Software Foundation. All rights reserved. * * ------------------------------------------------------------------------- * * This software is published under the terms of the Apache Software License * * version 1.1, a copy of which has been included with this distribution in * * the LICENSE file. * *****************************************************************************/ package org.apache.batik.swing.gvt; import java.awt.event.ComponentListener; import java.awt.event.ComponentEvent; public interface JGVTComponentListener { public static int COMPONENT_TRANSFORM_CHANGED = ComponentEvent.COMPONENT_LAST+1234; /** * Called when the rendering transform * changes on the JGVTComponentListener */ public void componentTransformChanged (ComponentEvent event); } 1.64 +117 -4 xml-batik/sources/org/apache/batik/swing/svg/JSVGComponent.java Index: JSVGComponent.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/swing/svg/JSVGComponent.java,v retrieving revision 1.63 retrieving revision 1.64 diff -u -r1.63 -r1.64 --- JSVGComponent.java 25 Feb 2003 10:30:57 -0000 1.63 +++ JSVGComponent.java 26 Feb 2003 11:13:46 -0000 1.64 @@ -20,9 +20,12 @@ import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; +import java.awt.event.ComponentEvent; +import java.awt.event.ComponentAdapter; import java.awt.geom.AffineTransform; import java.awt.geom.Dimension2D; +import java.awt.geom.Point2D; import java.awt.geom.NoninvertibleTransformException; import java.util.ArrayList; @@ -69,6 +72,7 @@ import org.apache.batik.swing.gvt.GVTTreeRendererEvent; import org.apache.batik.swing.gvt.JGVTComponent; +import org.apache.batik.swing.gvt.JGVTComponentListener; import org.apache.batik.util.ParsedURL; import org.apache.batik.util.RunnableQueue; @@ -310,6 +314,8 @@ */ protected int documentState; + protected Dimension prevComponentSize; + /** * Creates a new JSVGComponent. */ @@ -640,15 +646,55 @@ try { SVGSVGElement elt = svgDocument.getRootElement(); Dimension d = getSize(); + Dimension oldD = prevComponentSize; + prevComponentSize = d; if (d.width < 1) d.width = 1; if (d.height < 1) d.height = 1; AffineTransform at = ViewBox.getViewTransform (fragmentIdentifier, elt, d.width, d.height); CanvasGraphicsNode cgn = getCanvasGraphicsNode(); - if (!at.equals(cgn.getViewingTransform())) { + AffineTransform vt = cgn.getViewingTransform(); + if (!at.equals(vt)) { + if (oldD == null) + oldD = d; + // Here we map the old center of the component down to + // the user coodinate system with the old viewing + // transform and then back to the screen with the + // new viewing transform. We then adjust the rendering + // transform so it lands in the same place. + Point2D pt = new Point2D.Float(oldD.width/2.0f, + oldD.height/2.0f); + AffineTransform rendAT = getRenderingTransform(); + if (rendAT != null) { + try { + AffineTransform invRendAT = rendAT.createInverse(); + pt = invRendAT.transform(pt, null); + } catch (NoninvertibleTransformException e) { } + } + if (vt != null) { + try { + AffineTransform invVT = vt.createInverse(); + pt = invVT.transform(pt, null); + } catch (NoninvertibleTransformException e) { } + } + if (at != null) + pt = at.transform(pt, null); + if (rendAT != null) + pt = rendAT.transform(pt, null); + + // Now figure out how far we need to shift things + // to get the center point to line up again. + float dx = (float)((d.width/2.0f) -pt.getX()); + float dy = (float)((d.height/2.0f)-pt.getY()); + // Round the values to nearest integer. + dx = (int)((dx < 0)?(dx - .5):(dx + .5)); + dy = (int)((dy < 0)?(dy - .5):(dy + .5)); + if ((dx != 0) || (dy != 0)) { + rendAT.preConcatenate + (AffineTransform.getTranslateInstance(dx, dy)); + setRenderingTransform(rendAT, false); + } cgn.setViewingTransform(at); - if (renderer != null) - renderer.setTree(gvtRoot); return true; } } catch (BridgeException e) { @@ -815,6 +861,67 @@ } /** + * The JGVTComponentListener. + */ + protected JSVGComponentListener jsvgComponentListener = + new JSVGComponentListener(); + + class JSVGComponentListener extends ComponentAdapter + implements JGVTComponentListener { + float prevScale = 0; + float prevTransX = 0; + float prevTransY = 0; + + public void componentResized(ComponentEvent ce) { + if (updateManager != null && updateManager.isRunning()) { + updateManager.getUpdateRunnableQueue().invokeLater + (new Runnable() { + public void run() { + try { + updateManager.dispatchSVGResizeEvent(); + } catch (InterruptedException ie) { + } + }}); + } + } + + public void componentTransformChanged(ComponentEvent event) { + AffineTransform at = getRenderingTransform(); + + float currScale = (float)Math.sqrt(at.getDeterminant()); + float currTransX = (float)at.getTranslateX(); + float currTransY = (float)at.getTranslateY(); + + final boolean dispatchZoom = (currScale != prevScale); + final boolean dispatchScroll = ((currTransX != prevTransX) || + (currTransX != prevTransX)); + if (updateManager != null && updateManager.isRunning()) { + updateManager.getUpdateRunnableQueue().invokeLater + (new Runnable() { + public void run() { + try { + if (dispatchZoom) + updateManager.dispatchSVGZoomEvent(); + if (dispatchScroll) + updateManager.dispatchSVGScrollEvent(); + } catch (InterruptedException ie) { + } + }}); + } + prevScale = currScale; + prevTransX = currTransX; + prevTransY = currTransY; + } + + public void updateMatrix(AffineTransform at) { + prevScale = (float)Math.sqrt(at.getDeterminant()); + prevTransX = (float)at.getTranslateX(); + prevTransY = (float)at.getTranslateY(); + } + } + + + /** * Creates an instance of Listener. */ protected Listener createListener() { @@ -901,6 +1008,8 @@ * The data of the event is initialized to the old document. */ public void gvtBuildStarted(GVTTreeBuilderEvent e) { + removeJGVTComponentListener(jsvgComponentListener); + removeComponentListener(jsvgComponentListener); } /** @@ -924,6 +1033,7 @@ (int)dim.getHeight())); SVGSVGElement elt = svgDocument.getRootElement(); Dimension d = getSize(); + prevComponentSize = d; if (d.width < 1) d.width = 1; if (d.height < 1) d.height = 1; AffineTransform at = ViewBox.getViewTransform @@ -932,6 +1042,9 @@ cgn.setViewingTransform(at); initialTransform = new AffineTransform(); setRenderingTransform(initialTransform, false); + jsvgComponentListener.updateMatrix(initialTransform); + addJGVTComponentListener(jsvgComponentListener); + addComponentListener(jsvgComponentListener); gvtRoot = null; if (isDynamicDocument && JSVGComponent.this.eventsEnabled) {
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]