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]

Reply via email to