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]