You are viewing a plain text version of this content. The canonical link for it is here.
Posted to batik-dev@xmlgraphics.apache.org by hi...@apache.org on 2001/02/02 09:04:47 UTC

cvs commit: xml-batik/sources/org/apache/batik/swing JSVGCanvas.java

hillion     01/02/02 00:04:47

  Modified:    .        build.xml
               sources/org/apache/batik/apps/svgviewer ViewerFrame.java
               sources/org/apache/batik/dom AbstractParentNode.java
               sources/org/apache/batik/dom/svg
                        SVGOMAnimatedEnumeration.java
                        SVGOMAnimatedLength.java
                        SVGOMAnimatedNumberList.java
                        SVGOMAnimatedTransformList.java
                        SVGOMNumberList.java
               sources/org/apache/batik/parser
                        FragmentIdentifierHandler.java
                        FragmentIdentifierParser.java
                        PreserveAspectRatioHandler.java
                        PreserveAspectRatioParser.java
               sources/org/apache/batik/swing JSVGCanvas.java
  Added:       sources/org/apache/batik/parser
                        DefaultFragmentIdentifierHandler.java
  Log:
  - changed build.xml to include the svg generator in the distrib and
    to build all the javadocs.
  - fixed a bug in DOM (AbstractParentNode.replaceChild()),
  - initial commit of an incomplete fragment identifier parser,
  - added support for linking to a viewBox (URI of the form
    "<base-uri>#svgView(viewBox(<float>,<float>,<float>,<float>))".
    only works from a link in the same document.
  
  Revision  Changes    Path
  1.40      +15 -19    xml-batik/build.xml
  
  Index: build.xml
  ===================================================================
  RCS file: /home/cvs/xml-batik/build.xml,v
  retrieving revision 1.39
  retrieving revision 1.40
  diff -u -r1.39 -r1.40
  --- build.xml	2001/02/01 14:18:37	1.39
  +++ build.xml	2001/02/02 08:04:45	1.40
  @@ -45,7 +45,7 @@
     [win32] .\build.bat help
   
    
  - $Id: build.xml,v 1.39 2001/02/01 14:18:37 tkormann Exp $
  + $Id: build.xml,v 1.40 2001/02/02 08:04:45 hillion Exp $
   
   -->
   
  @@ -60,8 +60,8 @@
       <tstamp/>
       <property name="Project" value="Batik"/>
       <property name="project" value="batik"/>
  -    <property name="year"    value="2000"/>
  -    <property name="version" value="1.0beta2"/>
  +    <property name="year"    value="2001"/>
  +    <property name="version" value="1.0beta3"/>
   
       <property name="src"             value="sources"/>
       <property name="resources"       value="resources"/>
  @@ -248,6 +248,7 @@
                                  bridge-jar,
                                  xml-jar,
                                  svg-pp-jar,
  +                               svggen-jar,
                                  svg-viewer-jar,
                                  rasterizer-jar">
       <copy todir="${build}/lib">
  @@ -309,6 +310,16 @@
     </target>
   
   
  +  <!-- AWT Util (dependencies: util) -->
  +  <target name="svggen-jar" depends="compile, prepare-build">
  +    <jar jarfile="${build}/lib/${project}-svggen.jar">
  +      <fileset dir="${dest}">
  +        <include name="${package-prefix}/svggen/**/*.class"/>
  +      </fileset>
  +    </jar>
  +  </target>
  +
  +
     <!-- GUI Util (dependencies: none) -->
     <target name="gui-util-jar" depends="compile, prepare-build">
       <jar jarfile="${build}/lib/${project}-gui-util.jar">
  @@ -618,22 +629,7 @@
     <target name="javadocs" depends="javadoc"/>
     <target name="javadoc" depends="prepare-docs">
       <mkdir dir="${docs}/javadoc"/>
  -    <javadoc packagenames="${class-prefix}.apps.*,
  -                           ${class-prefix}.bridge,
  -                           ${class-prefix}.css.*,
  -                           ${class-prefix}.dom.*,
  -                           ${class-prefix}.ext.*,
  -                           ${class-prefix}.gvt.*,
  -                           ${class-prefix}.i18n.*,
  -                           ${class-prefix}.parser.*,
  -                           ${class-prefix}.script.*,
  -                           ${class-prefix}.swing.*,
  -                           ${class-prefix}.transcoder,
  -                           ${class-prefix}.transcoder.image,
  -                           ${class-prefix}.transcoder.svg2svg,
  -                           ${class-prefix}.util,
  -                           ${class-prefix}.util.gui,
  -                           ${class-prefix}.util.svg,
  +    <javadoc packagenames="${class-prefix}.*,
                              org.xml.*,
                              org.w3c.css.*,
                              org.w3c.dom.*"
  
  
  
  1.48      +59 -1     xml-batik/sources/org/apache/batik/apps/svgviewer/ViewerFrame.java
  
  Index: ViewerFrame.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/apps/svgviewer/ViewerFrame.java,v
  retrieving revision 1.47
  retrieving revision 1.48
  diff -u -r1.47 -r1.48
  --- ViewerFrame.java	2001/01/29 15:58:54	1.47
  +++ ViewerFrame.java	2001/02/02 08:04:46	1.48
  @@ -142,7 +142,8 @@
    *
    * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
    * @author <a href="mailto:cjolif@ilog.fr">Christophe Jolif</a>
  - * @version $Id: ViewerFrame.java,v 1.47 2001/01/29 15:58:54 cjolif Exp $
  + * @author <a href="mailto:bill.haneman@ireland.sun.com">Bill Haneman</a>
  + * @version $Id: ViewerFrame.java,v 1.48 2001/02/02 08:04:46 hillion Exp $
    */
   public class ViewerFrame
       extends    JFrame
  @@ -713,6 +714,7 @@
        * @param s The document name.
        */
       public void loadDocument(String s) {
  +        String old = uri;
           uri = s;
           File f = new File(uri);
           if (f.exists()) {
  @@ -723,6 +725,18 @@
               }
           }
           if (uri != null) {
  +            if (old != null) {
  +                URL prev = null;
  +                try {
  +                    prev = new URL(old);
  +                    if (prev.sameFile(new URL(uri))) {
  +                        manageFragmentIdentifier();
  +                        return;
  +                    }
  +                } catch (java.net.MalformedURLException e) {
  +                }
  +            }
  +
               // interrupt any document load already underway
               if ((thread != null) && thread.isAlive()) {
                   thread.interrupt();
  @@ -751,6 +765,50 @@
           }
       }
   
  +    protected void manageFragmentIdentifier() {
  +        URL u = null;
  +        try {
  +            u = new URL(uri);
  +        } catch (java.net.MalformedURLException e) {
  +            System.out.println(e.getMessage());
  +        }
  +        String ref = u.getRef();
  +        if (ref == null) {
  +            canvas.setTransform(new java.awt.geom.AffineTransform());
  +        } else {
  +            org.apache.batik.parser.FragmentIdentifierParser p;
  +            p = new org.apache.batik.parser.FragmentIdentifierParser();
  +            FragmentIdentifierHandler h = new FragmentIdentifierHandler();
  +            p.setFragmentIdentifierHandler(h);
  +
  +            try {
  +                p.parse(new java.io.StringReader(ref));
  +
  +                canvas.setViewBox(h.x, h.y, h.width, h.height);
  +
  +            } catch (Exception e) {
  +                e.printStackTrace();
  +                System.out.println(e.getMessage());
  +            }
  +        }
  +        
  +    }
  +
  +
  +    /**
  +     * To manage fragment identifiers.
  +     */
  +    protected static class FragmentIdentifierHandler
  +        extends org.apache.batik.parser.DefaultFragmentIdentifierHandler {
  +        float x, y, width, height;
  +        public void viewBox(float x, float y, float width, float height)
  +            throws org.apache.batik.parser.ParseException {
  +            this.x = x;
  +            this.y = y;
  +            this.width = width;
  +            this.height = height;
  +        }
  +    }
       // ActionMap /////////////////////////////////////////////////////
   
       /**
  
  
  
  1.5       +17 -5     xml-batik/sources/org/apache/batik/dom/AbstractParentNode.java
  
  Index: AbstractParentNode.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/dom/AbstractParentNode.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- AbstractParentNode.java	2000/11/22 16:26:51	1.4
  +++ AbstractParentNode.java	2001/02/02 08:04:46	1.5
  @@ -24,7 +24,7 @@
    * This class implements the Node interface with support for children.
    *
    * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
  - * @version $Id: AbstractParentNode.java,v 1.4 2000/11/22 16:26:51 hillion Exp $
  + * @version $Id: AbstractParentNode.java,v 1.5 2001/02/02 08:04:46 hillion Exp $
    */
   
   public abstract class AbstractParentNode extends AbstractNode {
  @@ -553,14 +553,22 @@
   	 */
   	public ExtendedNode replace(ExtendedNode n, ExtendedNode o) {
   	    if (o == firstChild) {
  -		n.setNextSibling(firstChild.getNextSibling());
  +                ExtendedNode t = (ExtendedNode)firstChild.getNextSibling();
  +		n.setNextSibling(t);
  +                if (o == lastChild) {
  +                    lastChild = n;
  +                } else {
  +                    t.setPreviousSibling(n);
  +                }
   		firstChild.setNextSibling(null);
   		firstChild = n;
   		return o;
   	    }
   
   	    if (o == lastChild) {
  -		n.setPreviousSibling(lastChild.getPreviousSibling());
  +                ExtendedNode t = (ExtendedNode)lastChild.getPreviousSibling();
  +		n.setPreviousSibling(t);
  +                t.setNextSibling(n);
   		lastChild.setPreviousSibling(null);
   		lastChild = n;
   		return o;
  @@ -569,8 +577,12 @@
   	    ExtendedNode cn = firstChild;
   	    while (cn != null) {
   		if (cn == o) {
  -		    n.setPreviousSibling(o.getPreviousSibling());
  -		    n.setNextSibling(o.getNextSibling());
  +                    ExtendedNode t = (ExtendedNode)o.getPreviousSibling();
  +		    n.setPreviousSibling(t);
  +                    t.setNextSibling(n);
  +                    t = (ExtendedNode)o.getNextSibling();
  +		    n.setNextSibling(t);
  +                    t.setPreviousSibling(n);
   		    o.setPreviousSibling(null);
   		    o.setNextSibling(null);
   		    return o;
  
  
  
  1.4       +2 -2      xml-batik/sources/org/apache/batik/dom/svg/SVGOMAnimatedEnumeration.java
  
  Index: SVGOMAnimatedEnumeration.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/dom/svg/SVGOMAnimatedEnumeration.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- SVGOMAnimatedEnumeration.java	2000/12/28 09:37:18	1.3
  +++ SVGOMAnimatedEnumeration.java	2001/02/02 08:04:46	1.4
  @@ -18,7 +18,7 @@
    * This class implements the {@link SVGAnimatedEnumeration} interface.
    *
    * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
  - * @version $Id: SVGOMAnimatedEnumeration.java,v 1.3 2000/12/28 09:37:18 hillion Exp $
  + * @version $Id: SVGOMAnimatedEnumeration.java,v 1.4 2001/02/02 08:04:46 hillion Exp $
    */
   public class SVGOMAnimatedEnumeration
       implements SVGAnimatedEnumeration {
  @@ -121,7 +121,7 @@
   
       /**
        * <b>DOM</b>: Implements {@link
  -     * org.w3c.dom.svg.SVGAnimatedNumber#setBaseVal(short)}.
  +     * org.w3c.dom.svg.SVGAnimatedEnumeration#setBaseVal(short)}.
        */
       public void setBaseVal(short baseVal) throws DOMException {
           if (baseVal == 0 || baseVal > shortStringMap.size()) {
  
  
  
  1.6       +2 -2      xml-batik/sources/org/apache/batik/dom/svg/SVGOMAnimatedLength.java
  
  Index: SVGOMAnimatedLength.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/dom/svg/SVGOMAnimatedLength.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- SVGOMAnimatedLength.java	2000/12/28 09:37:18	1.5
  +++ SVGOMAnimatedLength.java	2001/02/02 08:04:46	1.6
  @@ -19,7 +19,7 @@
    * This class implements {@link org.w3c.dom.svg.SVGAnimatedLength}.
    *
    * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
  - * @version $Id: SVGOMAnimatedLength.java,v 1.5 2000/12/28 09:37:18 hillion Exp $
  + * @version $Id: SVGOMAnimatedLength.java,v 1.6 2001/02/02 08:04:46 hillion Exp $
    */
   public class SVGOMAnimatedLength
       implements SVGAnimatedLength,
  @@ -103,7 +103,7 @@
       }
   
       /**
  -     * Implements {@link ModificationHandler#getObject(Object,String)}.
  +     * Implements {@link ModificationHandler#getObject(Object)}.
        */
       public Object getObject(Object key) {
           return element;
  
  
  
  1.4       +2 -2      xml-batik/sources/org/apache/batik/dom/svg/SVGOMAnimatedNumberList.java
  
  Index: SVGOMAnimatedNumberList.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/dom/svg/SVGOMAnimatedNumberList.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- SVGOMAnimatedNumberList.java	2000/12/28 09:37:18	1.3
  +++ SVGOMAnimatedNumberList.java	2001/02/02 08:04:46	1.4
  @@ -18,7 +18,7 @@
    * This class implements {@link org.w3c.dom.svg.SVGAnimatedNumberList}.
    *
    * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
  - * @version $Id: SVGOMAnimatedNumberList.java,v 1.3 2000/12/28 09:37:18 hillion Exp $
  + * @version $Id: SVGOMAnimatedNumberList.java,v 1.4 2001/02/02 08:04:46 hillion Exp $
    */
   public class SVGOMAnimatedNumberList
       implements SVGAnimatedNumberList,
  @@ -102,7 +102,7 @@
       }
   
       /**
  -     * Implements {@link ModificationHandler#getObject(Object,String)}.
  +     * Implements {@link ModificationHandler#getObject(Object)}.
        */
       public Object getObject(Object key) {
           return null;
  
  
  
  1.5       +2 -2      xml-batik/sources/org/apache/batik/dom/svg/SVGOMAnimatedTransformList.java
  
  Index: SVGOMAnimatedTransformList.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/dom/svg/SVGOMAnimatedTransformList.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- SVGOMAnimatedTransformList.java	2000/12/18 14:58:56	1.4
  +++ SVGOMAnimatedTransformList.java	2001/02/02 08:04:46	1.5
  @@ -18,7 +18,7 @@
    * This class implements {@link org.w3c.dom.svg.SVGAnimatedLength}.
    *
    * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
  - * @version $Id: SVGOMAnimatedTransformList.java,v 1.4 2000/12/18 14:58:56 hillion Exp $
  + * @version $Id: SVGOMAnimatedTransformList.java,v 1.5 2001/02/02 08:04:46 hillion Exp $
    */
   public class SVGOMAnimatedTransformList
       implements SVGAnimatedTransformList,
  @@ -99,7 +99,7 @@
       }
   
       /**
  -     * Implements {@link ModificationHandler#getObject(Object,String)}.
  +     * Implements {@link ModificationHandler#getObject(Object)}.
        */
       public Object getObject(Object key) {
           return null;
  
  
  
  1.5       +2 -2      xml-batik/sources/org/apache/batik/dom/svg/SVGOMNumberList.java
  
  Index: SVGOMNumberList.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/dom/svg/SVGOMNumberList.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- SVGOMNumberList.java	2000/12/28 09:37:26	1.4
  +++ SVGOMNumberList.java	2001/02/02 08:04:46	1.5
  @@ -21,7 +21,7 @@
    * This class implements the {@link SVGNumberList} interface.
    *
    * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
  - * @version $Id: SVGOMNumberList.java,v 1.4 2000/12/28 09:37:26 hillion Exp $
  + * @version $Id: SVGOMNumberList.java,v 1.5 2001/02/02 08:04:46 hillion Exp $
    */
   public class SVGOMNumberList
       implements SVGNumberList,
  @@ -218,7 +218,7 @@
       }
   
       /**
  -     * Implements {@link ModificationHandler#getObject(Object,String)}.
  +     * Implements {@link ModificationHandler#getObject(Object)}.
        */
       public Object getObject(Object key) {
           return null;
  
  
  
  1.2       +4 -4      xml-batik/sources/org/apache/batik/parser/FragmentIdentifierHandler.java
  
  Index: FragmentIdentifierHandler.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/parser/FragmentIdentifierHandler.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- FragmentIdentifierHandler.java	2000/10/10 18:40:25	1.1
  +++ FragmentIdentifierHandler.java	2001/02/02 08:04:47	1.2
  @@ -14,11 +14,11 @@
    * in order to be notified of parsing events.
    *
    * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
  - * @version $Id: FragmentIdentifierHandler.java,v 1.1 2000/10/10 18:40:25 hillion Exp $
  + * @version $Id: FragmentIdentifierHandler.java,v 1.2 2001/02/02 08:04:47 hillion Exp $
    */
  -public interface FragmentIdentifierHandler {
  +public interface FragmentIdentifierHandler extends PreserveAspectRatioHandler {
       /**
  -     * Invoked when the fragment identifier attribute starts.
  +     * Invoked when the fragment identifier starts.
        * @exception ParseException if an error occured while processing the
        *                           fragment identifier
        */
  @@ -50,7 +50,7 @@
       void viewTarget(String name) throws ParseException;
   
       /**
  -     * Invoked when the points attribute ends.
  +     * Invoked when the fragment identifier ends.
        * @exception ParseException if an error occured while processing the
        *                           fragment identifier
        */
  
  
  
  1.2       +377 -6    xml-batik/sources/org/apache/batik/parser/FragmentIdentifierParser.java
  
  Index: FragmentIdentifierParser.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/parser/FragmentIdentifierParser.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- FragmentIdentifierParser.java	2000/10/10 18:40:25	1.1
  +++ FragmentIdentifierParser.java	2001/02/02 08:04:47	1.2
  @@ -8,15 +8,38 @@
   
   package org.apache.batik.parser;
   
  +import java.io.Reader;
  +
  +import org.apache.batik.util.XMLUtilities;
  +
   /**
  - * This interface represents an event-based parser for the SVG
  - * fragment identifier (used with polyline and polygon elements).
  + * This class represents an event-based parser for the SVG
  + * fragment identifiers.
    *
    * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
  - * @version $Id: FragmentIdentifierParser.java,v 1.1 2000/10/10 18:40:25 hillion Exp $
  + * @version $Id: FragmentIdentifierParser.java,v 1.2 2001/02/02 08:04:47 hillion Exp $
    */
  -public interface FragmentIdentifierParser extends Parser {
  +public class FragmentIdentifierParser extends PreserveAspectRatioParser {
  +    
       /**
  +     * The buffer used for numbers.
  +     */
  +    protected char[] buffer = new char[16];
  +
  +    /**
  +     * The buffer size.
  +     */
  +    protected int bufferSize;
  +
  +    /**
  +     * Creates a new FragmentIdentifier parser.
  +     */
  +    public FragmentIdentifierParser() {
  +        preserveAspectRatioHandler =
  +            DefaultFragmentIdentifierHandler.INSTANCE;
  +    }
  +
  +    /**
        * Allows an application to register a fragment identifier handler.
        *
        * <p>If the application does not register a handler, all
  @@ -27,10 +50,358 @@
        * handler immediately.</p>
        * @param handler The transform list handler.
        */
  -    void setPointsHandler(FragmentIdentifierHandler handler);
  +    public void setFragmentIdentifierHandler(FragmentIdentifierHandler handler) {
  +        preserveAspectRatioHandler = handler;
  +    }
   
       /**
        * Returns the points handler in use.
  +     */
  +    public FragmentIdentifierHandler getFragmentIdentfierHandler() {
  +        return (FragmentIdentifierHandler)preserveAspectRatioHandler;
  +    }
  +
  +    /**
  +     * Returns the current handler.
  +     */
  +    protected FragmentIdentifierHandler getFragmentIdentifierHandler() {
  +        return (FragmentIdentifierHandler)preserveAspectRatioHandler;
  +    }
  +
  +    /**
  +     * Parses the given reader.
  +     */
  +    public void parse(Reader r) throws ParseException {
  +	initialize(r);
  +
  +	read();
  +
  +        getFragmentIdentfierHandler().startFragmentIdentifier();
  +
  +        ident: {
  +            String id = null;
  +
  +            switch (current) {
  +            case 'x':
  +                inputBuffer.setMark();
  +
  +                read();
  +                if (current != 'p') {
  +                    parseIdentifier();
  +                    break;
  +                }
  +                read();
  +                if (current != 'o') {
  +                    parseIdentifier();
  +                    break;
  +                }
  +                read();
  +                if (current != 'i') {
  +                    parseIdentifier();
  +                    break;
  +                }
  +                read();
  +                if (current != 'n') {
  +                    parseIdentifier();
  +                    break;
  +                }
  +                read();
  +                if (current != 'o') {
  +                    parseIdentifier();
  +                    break;
  +                }
  +                read();
  +                if (current != 't') {
  +                    parseIdentifier();
  +                    break;
  +                }
  +                read();
  +                if (current != 'e') {
  +                    parseIdentifier();
  +                    break;
  +                }
  +                read();
  +                if (current != 'r') {
  +                    parseIdentifier();
  +                    break;
  +                }
  +                read();
  +                if (current != '(') {
  +                    parseIdentifier();
  +                    break;
  +                }
  +                read();
  +                if (current != 'i') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('i'),
  +	         	                       new Integer(current) });
  +                    break ident;
  +                }
  +                read();
  +                if (current != 'd') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('d'),
  +                                               new Integer(current) });
  +                    break ident;
  +                }
  +                read();
  +                if (current != '(') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('('),
  +                                               new Integer(current) });
  +                    break ident;
  +                }
  +                read();
  +                inputBuffer.resetMark();
  +                parseIdentifier();
  +
  +                char[] c = new char[inputBuffer.contentSize()];
  +                inputBuffer.readContent(c);
  +
  +                id = new String(c);
  +
  +                if (current != ')') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character(')'),
  +                                               new Integer(current) });
  +                    break ident;
  +                }
  +                read();
  +                if (current != ')') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character(')'),
  +                                               new Integer(current) });
  +                    break ident;
  +                }
  +                break;
  +            case 's':
  +                inputBuffer.setMark();
  +
  +                read();
  +                if (current != 'v') {
  +                    parseIdentifier();
  +                    break;
  +                }
  +                read();
  +                if (current != 'g') {
  +                    parseIdentifier();
  +                    break;
  +                }
  +                read();
  +                if (current != 'V') {
  +                    parseIdentifier();
  +                    break;
  +                }
  +                read();
  +                if (current != 'i') {
  +                    parseIdentifier();
  +                    break;
  +                }
  +                read();
  +                if (current != 'e') {
  +                    parseIdentifier();
  +                    break;
  +                }
  +                read();
  +                if (current != 'w') {
  +                    parseIdentifier();
  +                    break;
  +                }
  +                read();
  +                if (current != '(') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('('),
  +                                               new Integer(current) });
  +                    break ident;
  +                }
  +                inputBuffer.unsetMark();
  +                read();
  +
  +                parseViewAttributes();
  +
  +                if (current != ')') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('('),
  +                                               new Integer(current) });
  +                }
  +                break ident;
  +            default:
  +                if (current == -1 ||
  +                    !XMLUtilities.isXMLNameFirstCharacter((char)current)) {
  +                    break ident;
  +                }
  +                inputBuffer.setMark();
  +                read();
  +                parseIdentifier();
  +                c = new char[inputBuffer.contentSize()];
  +                inputBuffer.readContent(c);
  +
  +                id = new String(c);
  +            }
  +            getFragmentIdentfierHandler().idReference(id);
  +        }
  +
  +        getFragmentIdentfierHandler().endFragmentIdentifier();
  +    }
  +
  +    /**
  +     * Parses the svgView attributes.
  +     */
  +    protected void parseViewAttributes() throws ParseException {
  +        loop: for (;;) {
  +            switch (current) {
  +            case -1:
  +            case ')':
  +            default:
  +                break loop;
  +            case 'v':
  +                read();
  +                if (current != 'i') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('i'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 'e') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('e'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 'w') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('w'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 'B') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('B'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 'o') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('o'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != 'x') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('x'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                if (current != '(') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character('('),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +
  +                float x = parseFloat();
  +                if (current != ',') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character(','),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +
  +                float y = parseFloat();
  +                if (current != ',') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character(','),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +
  +                float w = parseFloat();
  +                if (current != ',') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character(','),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +
  +                float h = parseFloat();
  +                if (current != ')') {
  +                    reportError("character.expected",
  +                                new Object[] { new Character(')'),
  +                                               new Integer(current) });
  +                    break loop;
  +                }
  +                read();
  +                getFragmentIdentfierHandler().viewBox(x, y, w, h);
  +            }
  +        }
  +    }
  +
  +    /**
  +     * Parses an identifier.
  +     */
  +    protected void parseIdentifier() throws ParseException {
  +        loop: for (;;) {
  +            if (current == -1 || !XMLUtilities.isXMLNameCharacter((char)current)) {
  +                break;
  +            }
  +            read();
  +        }
  +    }
  +
  +    /**
  +     * Parses the content of the buffer and converts it to a float.
  +     */
  +    protected float parseFloat()
  +	throws NumberFormatException,
  +	       ParseException {
  +	readNumber();
  +	return Float.parseFloat(getBufferContent());
  +    }
  +
  +    /**
  +     * Returns the content of the buffer.
  +     */
  +    protected String getBufferContent() {
  +	return new String(buffer, 0, bufferSize);
  +    }
  +
  +    /**
  +     * Adds the current character to the buffer.
  +     */
  +    protected void bufferize() {
  +	if (bufferSize >= buffer.length) {
  +	    char[] t = new char[buffer.length * 2];
  +	    for (int i = 0; i < bufferSize; i++) {
  +		t[i] = buffer[i];
  +	    }
  +	    buffer = t;
  +	}
  +	buffer[bufferSize++] = (char)current;
  +    }
  +
  +    /**
  +     * Reads a number.
        */
  -    FragmentIdentifierHandler getPointsHandler();
  +    protected void readNumber() throws ParseException {
  +	bufferSize = 0;
  +        for (;;) {
  +	    read();
  +	    switch (current) {
  +	    case ',':
  +	    case ')':
  +                return;
  +	    default:
  +		if (current == -1) {
  +		    return;
  +		}
  +		bufferize();
  +	    }
  +	}
  +    }
   }
  
  
  
  1.2       +15 -15    xml-batik/sources/org/apache/batik/parser/PreserveAspectRatioHandler.java
  
  Index: PreserveAspectRatioHandler.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/parser/PreserveAspectRatioHandler.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- PreserveAspectRatioHandler.java	2000/10/10 18:40:30	1.1
  +++ PreserveAspectRatioHandler.java	2001/02/02 08:04:47	1.2
  @@ -14,104 +14,104 @@
    * be notified of parsing events.
    *
    * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
  - * @version $Id: PreserveAspectRatioHandler.java,v 1.1 2000/10/10 18:40:30 hillion Exp $
  + * @version $Id: PreserveAspectRatioHandler.java,v 1.2 2001/02/02 08:04:47 hillion Exp $
    */
   public interface PreserveAspectRatioHandler {
       /**
        * Invoked when the PreserveAspectRatio parsing starts.
        * @exception ParseException if an error occured while processing
  -     * the transform 
  +     * the PreserveAspectRatio 
        */
       void startPreserveAspectRatio() throws ParseException;
   
       /**
        * Invoked when 'none' been parsed.
        * @exception ParseException if an error occured while processing
  -     * the transform 
  +     * the PreserveAspectRatio 
        */
       void none() throws ParseException;
   
       /**
        * Invoked when 'xMaxYMax' has been parsed.
        * @exception ParseException if an error occured while processing
  -     * the transform 
  +     * the PreserveAspectRatio 
        */
       void xMaxYMax() throws ParseException;
   
       /**
        * Invoked when 'xMaxYMid' has been parsed.
        * @exception ParseException if an error occured while processing
  -     * the transform 
  +     * the PreserveAspectRatio 
        */
       void xMaxYMid() throws ParseException;
   
       /**
        * Invoked when 'xMaxYMin' has been parsed.
        * @exception ParseException if an error occured while processing
  -     * the transform 
  +     * the PreserveAspectRatio 
        */
       void xMaxYMin() throws ParseException;
   
       /**
        * Invoked when 'xMidYMax' has been parsed.
        * @exception ParseException if an error occured while processing
  -     * the transform 
  +     * the PreserveAspectRatio 
        */
       void xMidYMax() throws ParseException;
   
       /**
        * Invoked when 'xMidYMid' has been parsed.
        * @exception ParseException if an error occured while processing
  -     * the transform 
  +     * the PreserveAspectRatio 
        */
       void xMidYMid() throws ParseException;
   
       /**
        * Invoked when 'xMidYMin' has been parsed.
        * @exception ParseException if an error occured while processing
  -     * the transform 
  +     * the PreserveAspectRatio 
        */
       void xMidYMin() throws ParseException;
   
       /**
        * Invoked when 'xMinYMax' has been parsed.
        * @exception ParseException if an error occured while processing
  -     * the transform 
  +     * the PreserveAspectRatio 
        */
       void xMinYMax() throws ParseException;
   
       /**
        * Invoked when 'xMinYMid' has been parsed.
        * @exception ParseException if an error occured while processing
  -     * the transform 
  +     * the PreserveAspectRatio 
        */
       void xMinYMid() throws ParseException;
   
       /**
        * Invoked when 'xMinYMin' has been parsed.
        * @exception ParseException if an error occured while processing
  -     * the transform 
  +     * the PreserveAspectRatio 
        */
       void xMinYMin() throws ParseException;
   
       /**
        * Invoked when 'meet' has been parsed.
        * @exception ParseException if an error occured while processing
  -     * the transform 
  +     * the PreserveAspectRatio 
        */
       void meet() throws ParseException;
   
       /**
        * Invoked when 'slice' has been parsed.
        * @exception ParseException if an error occured while processing
  -     * the transform 
  +     * the PreserveAspectRatio 
        */
       void slice() throws ParseException;
   
       /**
        * Invoked when the PreserveAspectRatio parsing ends.
        * @exception ParseException if an error occured while processing
  -     * the transform
  +     * the PreserveAspectRatio
        */
       void endPreserveAspectRatio() throws ParseException;
   }
  
  
  
  1.3       +12 -6     xml-batik/sources/org/apache/batik/parser/PreserveAspectRatioParser.java
  
  Index: PreserveAspectRatioParser.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/parser/PreserveAspectRatioParser.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- PreserveAspectRatioParser.java	2001/01/03 14:17:39	1.2
  +++ PreserveAspectRatioParser.java	2001/02/02 08:04:47	1.3
  @@ -15,7 +15,7 @@
    * attribute values.
    *
    * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
  - * @version $Id: PreserveAspectRatioParser.java,v 1.2 2001/01/03 14:17:39 hillion Exp $
  + * @version $Id: PreserveAspectRatioParser.java,v 1.3 2001/02/02 08:04:47 hillion Exp $
    */
   public class PreserveAspectRatioParser extends AbstractParser {
   
  @@ -43,8 +43,7 @@
        * handler immediately.</p>
        * @param handler The transform list handler.
        */
  -    public void setPreserveAspectRatioHandler(
  -            PreserveAspectRatioHandler handler) {
  +    public void setPreserveAspectRatioHandler(PreserveAspectRatioHandler handler) {
   	preserveAspectRatioHandler = handler;
       }
   
  @@ -61,11 +60,18 @@
       public void parse(Reader r) throws ParseException {
   	initialize(r);
   
  -	preserveAspectRatioHandler.startPreserveAspectRatio();
  -
   	read();
   	skipSpaces();
   
  +        parsePreserveAspectRatio();
  +    }
  +
  +    /**
  +     * Parses a PreserveAspectRatio attribute.
  +     */
  +    protected void parsePreserveAspectRatio() throws ParseException {
  +	preserveAspectRatioHandler.startPreserveAspectRatio();
  +
   	s: if (current == 'n') {
   	    read();
   	    if (current != 'o') {
  @@ -292,7 +298,7 @@
   		}
   	    }
   
  -	    skipSpaces();
  +	    skipCommaSpaces();
   
   	    switch (current) {
   	    case 'm':
  
  
  
  1.1                  xml-batik/sources/org/apache/batik/parser/DefaultFragmentIdentifierHandler.java
  
  Index: DefaultFragmentIdentifierHandler.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.parser;
  
  /**
   * This class provides an adapter for FragmentIdentifierHandler.
   *
   * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
   * @version $Id: DefaultFragmentIdentifierHandler.java,v 1.1 2001/02/02 08:04:47 hillion Exp $
   */
  public class DefaultFragmentIdentifierHandler
      extends DefaultPreserveAspectRatioHandler
      implements FragmentIdentifierHandler {
  
      /**
       * The only instance of this class.
       */
      public final static FragmentIdentifierHandler INSTANCE
          = new DefaultFragmentIdentifierHandler();
  
      /**
       * This class does not need to be instantiated.
       */
      protected DefaultFragmentIdentifierHandler() {
      }
  
      /**
       * Implements {@link FragmentIdentifierHandler#startFragmentIdentifier()}.
       */
      public void startFragmentIdentifier() throws ParseException {
      }
  
      /**
       * Invoked when an ID has been parsed.
       * @param s The string that represents the parsed ID.
       * @exception ParseException if an error occured while processing the
       *                           fragment identifier
       */
      public void idReference(String s) throws ParseException {
  
      }
  
      /**
       * Invoked when 'viewBox(x,y,width,height)' has been parsed.
       * @param x&nbsp;y&nbsp;width&nbsp;height the coordinates of the viewbox.
       * @exception ParseException if an error occured while processing the
       *                           fragment identifier
       */
      public void viewBox(float x, float y, float width, float height)
          throws ParseException {
  
      }
  
      /**
       * Invoked when 'viewTarget(name)' has been parsed.
       * @param name the target name.
       * @exception ParseException if an error occured while processing the
       *                           fragment identifier
       */
      public void viewTarget(String name) throws ParseException {
  
      }
  
      /**
       * Implements {@link FragmentIdentifierHandler#endFragmentIdentifier()}.
       */
      public void endFragmentIdentifier() throws ParseException {
      }
  }
  
  
  
  1.7       +45 -2     xml-batik/sources/org/apache/batik/swing/JSVGCanvas.java
  
  Index: JSVGCanvas.java
  ===================================================================
  RCS file: /home/cvs/xml-batik/sources/org/apache/batik/swing/JSVGCanvas.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- JSVGCanvas.java	2001/02/01 13:45:50	1.6
  +++ JSVGCanvas.java	2001/02/02 08:04:47	1.7
  @@ -110,7 +110,7 @@
    *
    * @author <a href="mailto:stephane@hillion.org">Stephane Hillion</a>
    * @author <a href="mailto:cjolif@ilog.fr">Christophe Jolif</a>
  - * @version $Id: JSVGCanvas.java,v 1.6 2001/02/01 13:45:50 tkormann Exp $
  + * @version $Id: JSVGCanvas.java,v 1.7 2001/02/02 08:04:47 hillion Exp $
    */
   public class JSVGCanvas
       extends    JComponent
  @@ -507,7 +507,6 @@
               backgroundBuilderThread.setPriority(Thread.MIN_PRIORITY);
               backgroundBuilderThread.start();
           }
  -
       }
   
       /**
  @@ -1096,6 +1095,50 @@
        */
       public AffineTransform getTransform() {
           return transform;
  +    }
  +    
  +    /**
  +     * Applies the given transform to the canvas.
  +     */
  +    public void setTransform(AffineTransform at) {
  +        documentTransformed = false;
  +        computeTransform();
  +        rotateAngle = 0;
  +        rotateCos = 1;
  +        previousRotateTransform = null;
  +        rotateTransform = null;
  +
  +        transform.concatenate(at);
  +        documentTransformed = true;
  +        updateBaseTransform();
  +        if (zoomHandler != null) {
  +            zoomHandler.zoomChanged((float)(transform.getScaleX() /
  +                                            rotateCos / initialScale));
  +        }
  +        bufferNeedsRendering = true;
  +        repaint();
  +        if (thumbnailCanvas != null) {
  +            thumbnailCanvas.repaint();
  +        }
  +    }
  +
  +    /**
  +     * Specifies a view box.
  +     */
  +    public void setViewBox(float x, float y, float width, float height) {
  +        AffineTransform t;
  +        Dimension d = getSize();
  +        AffineTransform part = SVGUtilities.getPreserveAspectRatioTransform
  +            (document.getRootElement(), d.width, d.height);
  +        try {
  +            part = part.createInverse();
  +            Point2D p2d = part.transform(new Point2D.Double(d.width, d.height), null);
  +            t = AffineTransform.getScaleInstance(p2d.getX() / width,
  +                                                 p2d.getY() / height);
  +            t.translate(-x, -y);
  +            setTransform(t);
  +        } catch (NoninvertibleTransformException e) {
  +        }
       }
   
       /**