tkormann 02/02/13 01:51:01 Modified: samples/tests/spec/scripting transform.svg sources/org/apache/batik/bridge AbstractGraphicsNodeBridge.java SVGCircleElementBridge.java SVGEllipseElementBridge.java SVGGElementBridge.java SVGImageElementBridge.java SVGLineElementBridge.java SVGPathElementBridge.java SVGPolygonElementBridge.java SVGPolylineElementBridge.java SVGRectElementBridge.java SVGTextElementBridge.java Added: samples/tests/spec/scripting transform2.svg Log: - dynamic 'transform' attribute now works on basic shapes, image, text and g - new test transform2.svg (translate and rotate are done in 'onload') Revision Changes Path 1.2 +24 -5 xml-batik/samples/tests/spec/scripting/transform.svg Index: transform.svg =================================================================== RCS file: /home/cvs/xml-batik/samples/tests/spec/scripting/transform.svg,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- transform.svg 12 Feb 2002 16:34:06 -0000 1.1 +++ transform.svg 13 Feb 2002 09:51:01 -0000 1.2 @@ -14,7 +14,7 @@ <!-- Modification of a transform attribute --> <!-- --> <!-- @author [EMAIL PROTECTED] --> -<!-- @version $Id: transform.svg,v 1.1 2002/02/12 16:34:06 tkormann Exp $ --> +<!-- @version $Id: transform.svg,v 1.2 2002/02/13 09:51:01 tkormann Exp $ --> <!-- ====================================================================== --> <?xml-stylesheet type="text/css" href="../../resources/style/test.css" ?> @@ -56,9 +56,20 @@ <path d="M50 0 L100 100 L0 100Z" style="fill:gold" onload="transform(evt, 'translate(320 250)')"/> - <line x1="0" y1="0" x2="100" y2="50" style="stroke:orange; stroke-width:8; fill:none" - onload="transform(evt, 'translate(170 400)')"/> - + <line x1="0" y1="0" x2="100" y2="50" + style="stroke:crimson; stroke-width:8; fill:none" + onload="transform(evt, 'translate(20 400)')"/> + + <text x="0" y="0" + style="fill:orange; text-anchor:middle;font-size:48" + onload="transform(evt, 'translate(220 420)')">Batik</text> + + <image x="0" y="0" width="50" height="50" + xlink:href="../../resources/images/png2.png" + onload="transform(evt, 'translate(320 400)')" /> + <image x="0" y="0" width="50" height="50" + xlink:href="../../resources/images/svg.svg" + onload="transform(evt, 'translate(370 400)')" /> </g> <g style="fill:none; stroke:black"> @@ -75,7 +86,15 @@ <path d="M50 0 L100 100 L0 100Z" transform="translate(320 250)"/> - <line x1="0" y1="0" x2="100" y2="50" transform="translate(170 400)"/> + <line x1="0" y1="0" x2="100" y2="50" transform="translate(20 400)"/> + + <text x="0" y="0" + style="stroke:black; fill:none; text-anchor:middle;font-size:48" + transform="translate(220 420)">Batik</text> + <rect x="0" y="0" width="50" height="50" transform="translate(320 400)" + style="stroke:black; fill:none;"/> + <rect x="0" y="0" width="50" height="50" transform="translate(370 400)" + style="stroke:black; fill:none;"/> </g> 1.1 xml-batik/samples/tests/spec/scripting/transform2.svg Index: transform2.svg =================================================================== <?xml version="1.0" standalone="no"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20000802//EN" "http://www.w3.org/TR/2000/CR-SVG-20000802/DTD/svg-20000802.dtd"> <!-- ====================================================================== --> <!-- 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. --> <!-- ====================================================================== --> <!-- ====================================================================== --> <!-- Modification of a transform attribute --> <!-- --> <!-- @author [EMAIL PROTECTED] --> <!-- @version $Id: transform2.svg,v 1.1 2002/02/13 09:51:01 tkormann Exp $ --> <!-- ====================================================================== --> <?xml-stylesheet type="text/css" href="../../resources/style/test.css" ?> <svg id="body" width="450" height="500" viewBox="0 0 450 500"> <title>transform attribute in 'onload' (2)</title> <text x="50%" y="45" class="title">transform attributes in 'onload' (2)</text> <script type="text/ecmascript"> function transform(evt, transform) { var elt = evt.target; elt.setAttribute("transform", transform) } </script> <g id="test-content" > <g onload="transform(evt, 'translate(175, 150)')"> <rect x="0" y="0" width="50" height="50" style="fill:crimson" /> <rect x="50" y="0" width="50" height="50" style="fill:gold" /> <rect x="0" y="50" width="50" height="50" style="fill:orange" /> <rect x="50" y="50" width="50" height="50" style="fill:#eee" /> </g> <g onload="transform(evt, 'translate(175, 320) rotate(45 50 50)')"> <rect x="0" y="0" width="50" height="50" style="fill:crimson" /> <rect x="50" y="0" width="50" height="50" style="fill:gold" /> <rect x="0" y="50" width="50" height="50" style="fill:orange" /> <rect x="50" y="50" width="50" height="50" style="fill:#eee" /> </g> <g style="fill:none; stroke:black"> <g transform="translate(175, 150)" style="stroke:black; fill:none"> <rect x="0" y="0" width="50" height="50" /> <rect x="50" y="0" width="50" height="50" /> <rect x="0" y="50" width="50" height="50" /> <rect x="50" y="50" width="50" height="50" /> </g> <g transform="translate(175, 320) rotate(45 50 50)"> <rect x="0" y="0" width="50" height="50" /> <rect x="50" y="0" width="50" height="50" /> <rect x="0" y="50" width="50" height="50" /> <rect x="50" y="50" width="50" height="50" /> </g> </g> </g> </svg> 1.10 +3 -3 xml-batik/sources/org/apache/batik/bridge/AbstractGraphicsNodeBridge.java Index: AbstractGraphicsNodeBridge.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/AbstractGraphicsNodeBridge.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- AbstractGraphicsNodeBridge.java 12 Feb 2002 15:14:37 -0000 1.9 +++ AbstractGraphicsNodeBridge.java 13 Feb 2002 09:51:01 -0000 1.10 @@ -39,7 +39,7 @@ * </ul> * * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> - * @version $Id: AbstractGraphicsNodeBridge.java,v 1.9 2002/02/12 15:14:37 tkormann Exp $ + * @version $Id: AbstractGraphicsNodeBridge.java,v 1.10 2002/02/13 09:51:01 tkormann Exp $ */ public abstract class AbstractGraphicsNodeBridge extends AbstractSVGBridge implements GraphicsNodeBridge, ErrorConstants { @@ -140,7 +140,8 @@ * @param evt the DOM mutation event */ protected void handleDOMAttrModifiedEvent(MutationEvent evt) { - if (evt.getAttrName().equals(SVG_TRANSFORM_ATTRIBUTE)) { + String attrName = evt.getAttrName(); + if (attrName.equals(SVG_TRANSFORM_ATTRIBUTE)) { BridgeUpdateEvent be = new BridgeUpdateEvent(); fireBridgeUpdateStarting(be); @@ -151,7 +152,6 @@ (e, SVG_TRANSFORM_ATTRIBUTE, s); } node.setTransform(at); - fireBridgeUpdateCompleted(be); } } 1.6 +5 -4 xml-batik/sources/org/apache/batik/bridge/SVGCircleElementBridge.java Index: SVGCircleElementBridge.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGCircleElementBridge.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- SVGCircleElementBridge.java 12 Feb 2002 15:14:37 -0000 1.5 +++ SVGCircleElementBridge.java 13 Feb 2002 09:51:01 -0000 1.6 @@ -22,7 +22,7 @@ * Bridge class for the <circle> element. * * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> - * @version $Id: SVGCircleElementBridge.java,v 1.5 2002/02/12 15:14:37 tkormann Exp $ + * @version $Id: SVGCircleElementBridge.java,v 1.6 2002/02/13 09:51:01 tkormann Exp $ */ public class SVGCircleElementBridge extends SVGShapeElementBridge { @@ -103,9 +103,10 @@ * @param evt the DOM mutation event */ protected void handleDOMAttrModifiedEvent(MutationEvent evt) { - if (evt.getAttrName().equals(SVG_CX_ATTRIBUTE) || - evt.getAttrName().equals(SVG_CY_ATTRIBUTE) || - evt.getAttrName().equals(SVG_R_ATTRIBUTE)) { + String attrName = evt.getAttrName(); + if (attrName.equals(SVG_CX_ATTRIBUTE) || + attrName.equals(SVG_CY_ATTRIBUTE) || + attrName.equals(SVG_R_ATTRIBUTE)) { BridgeUpdateEvent be = new BridgeUpdateEvent(); fireBridgeUpdateStarting(be); 1.6 +6 -5 xml-batik/sources/org/apache/batik/bridge/SVGEllipseElementBridge.java Index: SVGEllipseElementBridge.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGEllipseElementBridge.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- SVGEllipseElementBridge.java 12 Feb 2002 15:14:37 -0000 1.5 +++ SVGEllipseElementBridge.java 13 Feb 2002 09:51:01 -0000 1.6 @@ -22,7 +22,7 @@ * Bridge class for the <ellipse> element. * * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> - * @version $Id: SVGEllipseElementBridge.java,v 1.5 2002/02/12 15:14:37 tkormann Exp $ + * @version $Id: SVGEllipseElementBridge.java,v 1.6 2002/02/13 09:51:01 tkormann Exp $ */ public class SVGEllipseElementBridge extends SVGShapeElementBridge { @@ -116,10 +116,11 @@ * @param evt the DOM mutation event */ protected void handleDOMAttrModifiedEvent(MutationEvent evt) { - if (evt.getAttrName().equals(SVG_CX_ATTRIBUTE) || - evt.getAttrName().equals(SVG_CY_ATTRIBUTE) || - evt.getAttrName().equals(SVG_RX_ATTRIBUTE) || - evt.getAttrName().equals(SVG_RY_ATTRIBUTE)) { + String attrName = evt.getAttrName(); + if (attrName.equals(SVG_CX_ATTRIBUTE) || + attrName.equals(SVG_CY_ATTRIBUTE) || + attrName.equals(SVG_RX_ATTRIBUTE) || + attrName.equals(SVG_RY_ATTRIBUTE)) { BridgeUpdateEvent be = new BridgeUpdateEvent(); fireBridgeUpdateStarting(be); 1.12 +8 -1 xml-batik/sources/org/apache/batik/bridge/SVGGElementBridge.java Index: SVGGElementBridge.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGGElementBridge.java,v retrieving revision 1.11 retrieving revision 1.12 diff -u -r1.11 -r1.12 --- SVGGElementBridge.java 13 Nov 2001 15:20:58 -0000 1.11 +++ SVGGElementBridge.java 13 Feb 2002 09:51:01 -0000 1.12 @@ -21,7 +21,7 @@ * Bridge class for the <g> element. * * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> - * @version $Id: SVGGElementBridge.java,v 1.11 2001/11/13 15:20:58 tkormann Exp $ + * @version $Id: SVGGElementBridge.java,v 1.12 2002/02/13 09:51:01 tkormann Exp $ */ public class SVGGElementBridge extends AbstractGraphicsNodeBridge { @@ -35,6 +35,13 @@ */ public String getLocalName() { return SVG_G_TAG; + } + + /** + * Returns a new instance of this bridge. + */ + public Bridge getInstance() { + return new SVGGElementBridge(); } /** 1.35 +43 -1 xml-batik/sources/org/apache/batik/bridge/SVGImageElementBridge.java Index: SVGImageElementBridge.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGImageElementBridge.java,v retrieving revision 1.34 retrieving revision 1.35 diff -u -r1.34 -r1.35 --- SVGImageElementBridge.java 23 Jan 2002 14:14:07 -0000 1.34 +++ SVGImageElementBridge.java 13 Feb 2002 09:51:01 -0000 1.35 @@ -46,12 +46,13 @@ import org.w3c.dom.events.EventListener; import org.w3c.dom.events.EventTarget; import org.w3c.dom.events.MouseEvent; +import org.w3c.dom.events.MutationEvent; /** * Bridge class for the <image> element. * * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> - * @version $Id: SVGImageElementBridge.java,v 1.34 2002/01/23 14:14:07 deweese Exp $ + * @version $Id: SVGImageElementBridge.java,v 1.35 2002/02/13 09:51:01 tkormann Exp $ */ public class SVGImageElementBridge extends AbstractGraphicsNodeBridge { @@ -68,6 +69,13 @@ } /** + * Returns a new instance of this bridge. + */ + public Bridge getInstance() { + return new SVGImageElementBridge(); + } + + /** * Creates a graphics node using the specified BridgeContext and for the * specified element. * @@ -168,6 +176,12 @@ // bind the specified element and its associated graphics node if needed if (ctx.isDynamic()) { + ((EventTarget)e).addEventListener("DOMAttrModified", + new DOMAttrModifiedEventListener(), + false); + this.e = e; + this.node = node; + this.ctx = ctx; // HACK due to the way images are represented in GVT ImageNode imgNode = (ImageNode)node; if (imgNode.getImage() instanceof RasterImageNode) { @@ -194,6 +208,34 @@ public boolean isComposite() { return false; } + + // dynamic support + + /** + * Handles DOMAttrModified events. + * + * @param evt the DOM mutation event + */ + protected void handleDOMAttrModifiedEvent(MutationEvent evt) { + String attrName = evt.getAttrName(); + if (attrName.equals(SVG_X_ATTRIBUTE) || + attrName.equals(SVG_Y_ATTRIBUTE) || + attrName.equals(SVG_WIDTH_ATTRIBUTE) || + attrName.equals(SVG_HEIGHT_ATTRIBUTE)) { + + BridgeUpdateEvent be = new BridgeUpdateEvent(); + fireBridgeUpdateStarting(be); + + // <!> FIXME: Not yet implemented + System.err.println("Not yet implemented"); + + fireBridgeUpdateCompleted(be); + } else { + super.handleDOMAttrModifiedEvent(evt); + } + } + + // convenient methods /** * Returns a GraphicsNode that represents an raster image in JPEG or PNG 1.6 +6 -5 xml-batik/sources/org/apache/batik/bridge/SVGLineElementBridge.java Index: SVGLineElementBridge.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGLineElementBridge.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- SVGLineElementBridge.java 12 Feb 2002 15:14:37 -0000 1.5 +++ SVGLineElementBridge.java 13 Feb 2002 09:51:01 -0000 1.6 @@ -21,7 +21,7 @@ * Bridge class for the <line> element. * * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> - * @version $Id: SVGLineElementBridge.java,v 1.5 2002/02/12 15:14:37 tkormann Exp $ + * @version $Id: SVGLineElementBridge.java,v 1.6 2002/02/13 09:51:01 tkormann Exp $ */ public class SVGLineElementBridge extends SVGDecoratedShapeElementBridge { @@ -101,10 +101,11 @@ * @param evt the DOM mutation event */ protected void handleDOMAttrModifiedEvent(MutationEvent evt) { - if (evt.getAttrName().equals(SVG_X1_ATTRIBUTE) || - evt.getAttrName().equals(SVG_Y1_ATTRIBUTE) || - evt.getAttrName().equals(SVG_X2_ATTRIBUTE) || - evt.getAttrName().equals(SVG_Y2_ATTRIBUTE)) { + String attrName = evt.getAttrName(); + if (attrName.equals(SVG_X1_ATTRIBUTE) || + attrName.equals(SVG_Y1_ATTRIBUTE) || + attrName.equals(SVG_X2_ATTRIBUTE) || + attrName.equals(SVG_Y2_ATTRIBUTE)) { BridgeUpdateEvent be = new BridgeUpdateEvent(); fireBridgeUpdateStarting(be); 1.9 +3 -2 xml-batik/sources/org/apache/batik/bridge/SVGPathElementBridge.java Index: SVGPathElementBridge.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGPathElementBridge.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- SVGPathElementBridge.java 12 Feb 2002 15:14:37 -0000 1.8 +++ SVGPathElementBridge.java 13 Feb 2002 09:51:01 -0000 1.9 @@ -24,7 +24,7 @@ * Bridge class for the <path> element. * * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> - * @version $Id: SVGPathElementBridge.java,v 1.8 2002/02/12 15:14:37 tkormann Exp $ + * @version $Id: SVGPathElementBridge.java,v 1.9 2002/02/13 09:51:01 tkormann Exp $ */ public class SVGPathElementBridge extends SVGDecoratedShapeElementBridge { @@ -90,7 +90,8 @@ * @param evt the DOM mutation event */ protected void handleDOMAttrModifiedEvent(MutationEvent evt) { - if (evt.getAttrName().equals(SVG_D_ATTRIBUTE)) { + String attrName = evt.getAttrName(); + if (attrName.equals(SVG_D_ATTRIBUTE)) { BridgeUpdateEvent be = new BridgeUpdateEvent(); fireBridgeUpdateStarting(be); 1.10 +3 -2 xml-batik/sources/org/apache/batik/bridge/SVGPolygonElementBridge.java Index: SVGPolygonElementBridge.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGPolygonElementBridge.java,v retrieving revision 1.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- SVGPolygonElementBridge.java 12 Feb 2002 15:14:37 -0000 1.9 +++ SVGPolygonElementBridge.java 13 Feb 2002 09:51:01 -0000 1.10 @@ -24,7 +24,7 @@ * Bridge class for the <polygon> element. * * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> - * @version $Id: SVGPolygonElementBridge.java,v 1.9 2002/02/12 15:14:37 tkormann Exp $ + * @version $Id: SVGPolygonElementBridge.java,v 1.10 2002/02/13 09:51:01 tkormann Exp $ */ public class SVGPolygonElementBridge extends SVGDecoratedShapeElementBridge { @@ -89,7 +89,8 @@ * @param evt the DOM mutation event */ protected void handleDOMAttrModifiedEvent(MutationEvent evt) { - if (evt.getAttrName().equals(SVG_POINTS_ATTRIBUTE)) { + String attrName = evt.getAttrName(); + if (attrName.equals(SVG_POINTS_ATTRIBUTE)) { BridgeUpdateEvent be = new BridgeUpdateEvent(); fireBridgeUpdateStarting(be); 1.9 +3 -2 xml-batik/sources/org/apache/batik/bridge/SVGPolylineElementBridge.java Index: SVGPolylineElementBridge.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGPolylineElementBridge.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- SVGPolylineElementBridge.java 12 Feb 2002 15:14:37 -0000 1.8 +++ SVGPolylineElementBridge.java 13 Feb 2002 09:51:01 -0000 1.9 @@ -24,7 +24,7 @@ * Bridge class for the <polyline> element. * * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> - * @version $Id: SVGPolylineElementBridge.java,v 1.8 2002/02/12 15:14:37 tkormann Exp $ + * @version $Id: SVGPolylineElementBridge.java,v 1.9 2002/02/13 09:51:01 tkormann Exp $ */ public class SVGPolylineElementBridge extends SVGDecoratedShapeElementBridge { @@ -89,7 +89,8 @@ * @param evt the DOM mutation event */ protected void handleDOMAttrModifiedEvent(MutationEvent evt) { - if (evt.getAttrName().equals(SVG_POINTS_ATTRIBUTE)) { + String attrName = evt.getAttrName(); + if (attrName.equals(SVG_POINTS_ATTRIBUTE)) { BridgeUpdateEvent be = new BridgeUpdateEvent(); fireBridgeUpdateStarting(be); 1.8 +8 -7 xml-batik/sources/org/apache/batik/bridge/SVGRectElementBridge.java Index: SVGRectElementBridge.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGRectElementBridge.java,v retrieving revision 1.7 retrieving revision 1.8 diff -u -r1.7 -r1.8 --- SVGRectElementBridge.java 12 Feb 2002 15:14:37 -0000 1.7 +++ SVGRectElementBridge.java 13 Feb 2002 09:51:01 -0000 1.8 @@ -24,7 +24,7 @@ * Bridge class for the <rect> element. * * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> - * @version $Id: SVGRectElementBridge.java,v 1.7 2002/02/12 15:14:37 tkormann Exp $ + * @version $Id: SVGRectElementBridge.java,v 1.8 2002/02/13 09:51:01 tkormann Exp $ */ public class SVGRectElementBridge extends SVGShapeElementBridge { @@ -160,12 +160,13 @@ * @param evt the DOM mutation event */ protected void handleDOMAttrModifiedEvent(MutationEvent evt) { - if (evt.getAttrName().equals(SVG_X_ATTRIBUTE) || - evt.getAttrName().equals(SVG_Y_ATTRIBUTE) || - evt.getAttrName().equals(SVG_WIDTH_ATTRIBUTE) || - evt.getAttrName().equals(SVG_HEIGHT_ATTRIBUTE) || - evt.getAttrName().equals(SVG_RX_ATTRIBUTE) || - evt.getAttrName().equals(SVG_RY_ATTRIBUTE)) { + String attrName = evt.getAttrName(); + if (attrName.equals(SVG_X_ATTRIBUTE) || + attrName.equals(SVG_Y_ATTRIBUTE) || + attrName.equals(SVG_WIDTH_ATTRIBUTE) || + attrName.equals(SVG_HEIGHT_ATTRIBUTE) || + attrName.equals(SVG_RX_ATTRIBUTE) || + attrName.equals(SVG_RY_ATTRIBUTE)) { BridgeUpdateEvent be = new BridgeUpdateEvent(); fireBridgeUpdateStarting(be); 1.46 +96 -10 xml-batik/sources/org/apache/batik/bridge/SVGTextElementBridge.java Index: SVGTextElementBridge.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGTextElementBridge.java,v retrieving revision 1.45 retrieving revision 1.46 diff -u -r1.45 -r1.46 --- SVGTextElementBridge.java 11 Feb 2002 16:00:08 -0000 1.45 +++ SVGTextElementBridge.java 13 Feb 2002 09:51:01 -0000 1.46 @@ -51,22 +51,40 @@ import org.w3c.dom.css.CSSStyleDeclaration; import org.w3c.dom.css.CSSValue; import org.w3c.dom.css.CSSValueList; +import org.w3c.dom.events.Event; +import org.w3c.dom.events.EventListener; +import org.w3c.dom.events.EventTarget; +import org.w3c.dom.events.MutationEvent; /** * Bridge class for the <text> element. * * @author <a href="[EMAIL PROTECTED]>Bill Haneman</a> - * @version $Id: SVGTextElementBridge.java,v 1.45 2002/02/11 16:00:08 tkormann Exp $ + * @version $Id: SVGTextElementBridge.java,v 1.46 2002/02/13 09:51:01 tkormann Exp $ */ public class SVGTextElementBridge extends AbstractSVGBridge implements GraphicsNodeBridge, ErrorConstants { /** + * The element that has been handled by this bridge. + */ + protected Element e; + + /** + * The graphics node constructed by this bridge. + */ + protected GraphicsNode node; + + /** + * The bridge context to use for dynamic updates. + */ + protected BridgeContext ctx; + + /** * Constructs a new bridge for the <text> element. */ public SVGTextElementBridge() {} - /** * Returns 'text'. */ @@ -74,8 +92,11 @@ return SVG_TEXT_TAG; } - public Bridge getInstance(){ - return this; + /** + * Returns a new instance of this bridge. + */ + public Bridge getInstance() { + return new SVGTextElementBridge(); } /** @@ -123,10 +144,23 @@ node.setRenderingHints(hints); } + node.setLocation(getLocation(ctx, e)); + + return node; + } + + /** + * Returns the text node location according to the 'x' and 'y' + * attributes of the specified text element. + * + * @param ctx the bridge context to use + * @param e the text element + */ + protected Point2D getLocation(BridgeContext ctx, Element e) { UnitProcessor.Context uctx = UnitProcessor.createContext(ctx, e); // 'x' attribute - default is 0 - s = e.getAttributeNS(null, SVG_X_ATTRIBUTE); + String s = e.getAttributeNS(null, SVG_X_ATTRIBUTE); float x = 0; if (s.length() != 0) { StringTokenizer st = new StringTokenizer(s); @@ -145,10 +179,7 @@ y = UnitProcessor.svgVerticalCoordinateToUserSpace (startY, SVG_Y_ATTRIBUTE, uctx); } - - node.setLocation(new Point2D.Float(x, y)); - - return node; + return new Point2D.Float(x, y); } /** @@ -170,7 +201,8 @@ // now add the painting attributes, cannot do it before this because // some of the Paint objects need to know the bounds of the text // and this isn't know until the text node aci is set - TextDecoration textDecoration = getTextDecoration(e, (TextNode)node, new TextDecoration(), ctx); + TextDecoration textDecoration = + getTextDecoration(e, (TextNode)node, new TextDecoration(), ctx); addPaintAttributes(as, e, (TextNode)node, textDecoration, ctx); ((TextNode)node).setAttributedCharacterIterator(as.getIterator()); @@ -185,7 +217,14 @@ // bind the specified element and its associated graphics node if needed if (ctx.isDynamic()) { + ((EventTarget)e).addEventListener("DOMAttrModified", + new DOMAttrModifiedEventListener(), + false); + this.e = e; + this.node = node; + this.ctx = ctx; ctx.bind(e, node); + BridgeEventSupport.addDOMListener(ctx, e); } // Handle children elements such as <title> @@ -197,6 +236,53 @@ */ public boolean isComposite() { return false; + } + + // dynamic support + + /** + * Handles DOMAttrModified events. + * + * @param evt the DOM mutation event + */ + protected void handleDOMAttrModifiedEvent(MutationEvent evt) { + String attrName = evt.getAttrName(); + if (attrName.equals(SVG_TRANSFORM_ATTRIBUTE)) { + BridgeUpdateEvent be = new BridgeUpdateEvent(); + fireBridgeUpdateStarting(be); + + String s = evt.getNewValue(); + AffineTransform at = GraphicsNode.IDENTITY; + if (s.length() != 0) { + at = SVGUtilities.convertTransform + (e, SVG_TRANSFORM_ATTRIBUTE, s); + } + node.setTransform(at); + + fireBridgeUpdateCompleted(be); + + } + } + + + /** + * The listener class for 'DOMAttrModified' event. + */ + protected class DOMAttrModifiedEventListener implements EventListener { + + /** + * Handles 'DOMAttrModfied' events and deleguates to the + * 'handleDOMAttrModifiedEvent' method any changes to the + * GraphicsNode if any. + * + * @param evt the DOM event + */ + public void handleEvent(Event evt) { + if (evt.getTarget() != e) { + throw new Error("handleEvent bad target"); + } + handleDOMAttrModifiedEvent((MutationEvent)evt); + } } // -----------------------------------------------------------------------
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]