tkormann 02/02/15 06:58:45 Modified: sources/org/apache/batik/bridge AbstractGraphicsNodeBridge.java AbstractSVGGradientElementBridge.java BridgeContext.java BridgeUpdateEvent.java BridgeUpdateHandler.java PaintServer.java SVGCircleElementBridge.java SVGEllipseElementBridge.java SVGGElementBridge.java SVGImageElementBridge.java SVGLineElementBridge.java SVGLinearGradientElementBridge.java SVGPathElementBridge.java SVGPolygonElementBridge.java SVGPolylineElementBridge.java SVGRadialGradientElementBridge.java SVGRectElementBridge.java SVGSVGElementBridge.java SVGShapeElementBridge.java SVGTextElementBridge.java SVGUseElementBridge.java sources/org/apache/batik/gvt CompositeShapePainter.java Log: first quick and dirty support for dynamic radial and linear gradient. Revision Changes Path 1.13 +31 -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.12 retrieving revision 1.13 diff -u -r1.12 -r1.13 --- AbstractGraphicsNodeBridge.java 13 Feb 2002 15:01:14 -0000 1.12 +++ AbstractGraphicsNodeBridge.java 15 Feb 2002 14:58:44 -0000 1.13 @@ -39,10 +39,10 @@ * </ul> * * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> - * @version $Id: AbstractGraphicsNodeBridge.java,v 1.12 2002/02/13 15:01:14 tkormann Exp $ + * @version $Id: AbstractGraphicsNodeBridge.java,v 1.13 2002/02/15 14:58:44 tkormann Exp $ */ public abstract class AbstractGraphicsNodeBridge extends AbstractSVGBridge - implements GraphicsNodeBridge, ErrorConstants { + implements BridgeUpdateHandler, GraphicsNodeBridge, ErrorConstants { /** * The element that has been handled by this bridge. @@ -106,6 +106,12 @@ public void buildGraphicsNode(BridgeContext ctx, Element e, GraphicsNode node) { + + // push 'this' as the current BridgeUpdateHandler for subbridges + if (ctx.isDynamic()) { + ctx.pushBridgeUpdateHandler(this); + } + // 'opacity' node.setComposite(CSSUtilities.convertOpacity(e)); // 'filter' @@ -122,6 +128,8 @@ this.node = node; this.ctx = ctx; initializeDynamicSupport(); + // 'this' is no more the current BridgeUpdateHandler + ctx.popBridgeUpdateHandler(); } // Handle children elements such as <title> @@ -145,6 +153,26 @@ } /** + * Invoked when a bridge update is starting. + * + * @param evt the evt that describes the incoming update + */ + public void bridgeUpdateStarting(BridgeUpdateEvent evt) { + System.out.println("("+e.getLocalName()+" "+node+") update started "+ + evt.getHandlerKey()); + } + + /** + * Invoked when a bridge update is completed. + * + * @param evt the evt that describes the update + */ + public void bridgeUpdateCompleted(BridgeUpdateEvent evt) { + System.out.println("("+e.getLocalName()+" "+node+") update completed "+ + evt.getHandlerKey()); + } + + /** * Handles DOMAttrModified events. * * @param evt the DOM mutation event @@ -152,7 +180,7 @@ protected void handleDOMAttrModifiedEvent(MutationEvent evt) { String attrName = evt.getAttrName(); if (attrName.equals(SVG_TRANSFORM_ATTRIBUTE)) { - BridgeUpdateEvent be = new BridgeUpdateEvent(); + BridgeUpdateEvent be = new BridgeUpdateEvent(this); fireBridgeUpdateStarting(be); String s = evt.getNewValue(); 1.4 +96 -10 xml-batik/sources/org/apache/batik/bridge/AbstractSVGGradientElementBridge.java Index: AbstractSVGGradientElementBridge.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/AbstractSVGGradientElementBridge.java,v retrieving revision 1.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- AbstractSVGGradientElementBridge.java 11 Feb 2002 16:00:07 -0000 1.3 +++ AbstractSVGGradientElementBridge.java 15 Feb 2002 14:58:44 -0000 1.4 @@ -24,16 +24,32 @@ import org.w3c.dom.Element; import org.w3c.dom.Node; +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 vending gradients. * * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> - * @version $Id: AbstractSVGGradientElementBridge.java,v 1.3 2002/02/11 16:00:07 tkormann Exp $ + * @version $Id: AbstractSVGGradientElementBridge.java,v 1.4 2002/02/15 14:58:44 tkormann Exp $ */ public abstract class AbstractSVGGradientElementBridge extends AbstractSVGBridge implements PaintBridge, ErrorConstants { + protected BridgeContext ctx; + + protected Element paintElement; + + protected Element paintedElement; + + protected GraphicsNode paintedNode; + + protected float opacity; + + protected Paint paint; + /** * Constructs a new AbstractSVGGradientElementBridge. */ @@ -100,15 +116,36 @@ transform = new AffineTransform(); } - return buildGradient(paintElement, - paintedElement, - paintedNode, - spreadMethod, - colorSpace, - transform, - colors, - offsets, - ctx); + Paint paint = buildGradient(paintElement, + paintedElement, + paintedNode, + spreadMethod, + colorSpace, + transform, + colors, + offsets, + ctx); + + if (ctx.isDynamic()) { + if (handler == null) { // quick hack to fix dynamic + this.handler = ctx.getCurrentBridgeUpdateHandler(); + this.handlerKey = ctx.getCurrentBridgeUpdateHandlerKey(); + + this.ctx = ctx; + this.paintElement = paintElement; + this.paintedElement = paintedElement; + this.paintedNode = paintedNode; + this.opacity = opacity; + + ((EventTarget)paintElement).addEventListener + ("DOMAttrModified", + new DOMAttrModifiedEventListener(), + false); + } + this.paint = paint; + } + + return paint; } /** @@ -134,6 +171,55 @@ Color [] colors, float [] offsets, BridgeContext ctx); + // dynamic support + + /** + * Handles DOMAttrModified events. + * + * @param evt the DOM mutation event + */ + protected void handleDOMAttrModifiedEvent(MutationEvent evt) { + String attrName = evt.getAttrName(); + if (attrName.equals(SVG_GRADIENT_TRANSFORM_ATTRIBUTE) || + attrName.equals(SVG_SPREAD_METHOD_ATTRIBUTE)) { + + BridgeUpdateEvent be = new BridgeUpdateEvent(this); + be.setOldValue(paint); + fireBridgeUpdateStarting(be); + this.paint = createPaint + (ctx, paintElement, paintedElement, paintedNode, opacity); + be.setNewValue(paint); + fireBridgeUpdateCompleted(be); + } else { + System.out.println("Unsupported attribute modification: "+attrName+ + " on "+paintElement.getLocalName()); + } + } + + /** + * 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) { + Element e = (Element)evt.getTarget(); + // <!> FIXME: need to check if e is a stop + // check if an attribute has changed on the gradient or on a stop + if (e != paintElement && e.getParentNode() != paintElement) { + return; + } + handleDOMAttrModifiedEvent((MutationEvent)evt); + } + } + + // convenient methods /** * Converts the spreadMethod attribute. 1.34 +47 -2 xml-batik/sources/org/apache/batik/bridge/BridgeContext.java Index: BridgeContext.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/BridgeContext.java,v retrieving revision 1.33 retrieving revision 1.34 diff -u -r1.33 -r1.34 --- BridgeContext.java 14 Feb 2002 12:37:54 -0000 1.33 +++ BridgeContext.java 15 Feb 2002 14:58:44 -0000 1.34 @@ -47,7 +47,7 @@ * a SVG DOM tree such as the current viewport or the user agent. * * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> - * @version $Id: BridgeContext.java,v 1.33 2002/02/14 12:37:54 tkormann Exp $ + * @version $Id: BridgeContext.java,v 1.34 2002/02/15 14:58:44 tkormann Exp $ */ public class BridgeContext implements ErrorConstants { @@ -81,6 +81,11 @@ protected List viewportStack = new LinkedList(); /** + * The BridgeUpdateHandler stack. Used in building time. + */ + protected List bridgeUpdateHandlerStack = new LinkedList(); + + /** * The user agent. */ protected UserAgent userAgent; @@ -389,7 +394,7 @@ * @param e the element that closes its viewport */ public void closeViewport(Element e) { - viewportMap.remove(e); + //viewportMap.remove(e); FIXME: potential memory leak viewportStack.remove(0); if (viewportStack.size() == 0) { viewportStack = null; @@ -612,6 +617,46 @@ } } } + + // dynamic support + + public void pushBridgeUpdateHandler(BridgeUpdateHandler handler) { + bridgeUpdateHandlerStack.add(0, new BridgeUpdateHandlerInfo(handler)); + } + + public void setCurrentBridgeUpdateHandlerKey(int handlerKey) { + BridgeUpdateHandlerInfo info = + (BridgeUpdateHandlerInfo)bridgeUpdateHandlerStack.get(0); + info.handlerKey = handlerKey; + } + + public BridgeUpdateHandler getCurrentBridgeUpdateHandler() { + BridgeUpdateHandlerInfo info = + (BridgeUpdateHandlerInfo)bridgeUpdateHandlerStack.get(0); + return info.handler; + } + + public int getCurrentBridgeUpdateHandlerKey() { + BridgeUpdateHandlerInfo info = + (BridgeUpdateHandlerInfo)bridgeUpdateHandlerStack.get(0); + return info.handlerKey; + } + + public void popBridgeUpdateHandler() { + bridgeUpdateHandlerStack.remove(0); + } + + protected static class BridgeUpdateHandlerInfo { + + protected BridgeUpdateHandler handler; + protected int handlerKey; + + public BridgeUpdateHandlerInfo(BridgeUpdateHandler handler) { + this.handler = handler; + } + } + + // bridge extensions support /** * Registers the bridges to handle SVG 1.0 elements. 1.2 +27 -11 xml-batik/sources/org/apache/batik/bridge/BridgeUpdateEvent.java Index: BridgeUpdateEvent.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/BridgeUpdateEvent.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- BridgeUpdateEvent.java 23 Jan 2002 14:14:07 -0000 1.1 +++ BridgeUpdateEvent.java 15 Feb 2002 14:58:44 -0000 1.2 @@ -8,65 +8,81 @@ package org.apache.batik.bridge; +import java.util.EventObject; + /** * Describes an update from a <tt>DynamicBridge</tt> * * @author <a href="mailto:[EMAIL PROTECTED]">Vincent Hardy</a> * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> - * @version $Id: BridgeUpdateEvent.java,v 1.1 2002/01/23 14:14:07 deweese Exp $ + * @version $Id: BridgeUpdateEvent.java,v 1.2 2002/02/15 14:58:44 tkormann Exp $ */ -public class BridgeUpdateEvent { - +public class BridgeUpdateEvent extends EventObject { + + /** The handler key. */ private int handlerKey; + + /* The new value of the GVT product. */ private Object newValue; + + /* The old value of the GVT product. */ private Object oldValue; /** + * Constructs a new <tt>BridgeUpdateEvent</tt>. * + * @param source the source of the event */ - public BridgeUpdateEvent(){ + public BridgeUpdateEvent(Object source){ + super(source); } /** - * + * Returns the BridgeUpdateHandler's key. */ public int getHandlerKey(){ return handlerKey; } /** - * + * Sets the BridgeUpdateHandler's key to the specified value. + * + * @param handlerKey the key of the BridgeUpdateHandler */ public void setHandlerKey(int handlerKey){ this.handlerKey = handlerKey; } /** - * + * Returns the new GVT product resulting from the update or null + * if the update has not been completed yet. */ public Object getNewValue(){ return newValue; } /** - * + * Sets the new GVT product to the specified value. + * + * @param newValue the new GVT product resulting from the update */ public void setNewValue(Object newValue){ this.newValue = newValue; } /** - * + * Returns the old GVT product before the update. */ public Object getOldValue(){ return oldValue; } /** - * + * Sets the old GVT product to the specified value. + * + * @param oldValue the old GVT product before the update */ public void setOldValue(Object oldValue){ this.oldValue = oldValue; } - } 1.2 +10 -6 xml-batik/sources/org/apache/batik/bridge/BridgeUpdateHandler.java Index: BridgeUpdateHandler.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/BridgeUpdateHandler.java,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- BridgeUpdateHandler.java 23 Jan 2002 14:14:07 -0000 1.1 +++ BridgeUpdateHandler.java 15 Feb 2002 14:58:44 -0000 1.2 @@ -9,22 +9,26 @@ package org.apache.batik.bridge; /** - * Interface for objects interesed in being notified of updates - * by a <tt>DynamicBridge</tt>. + * Interface for objects interested in being notified of updates + * by a <tt>Bridge</tt>. * * @author <a href="mailto:[EMAIL PROTECTED]">Vincent Hardy</a> * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> - * @version $Id: BridgeUpdateHandler.java,v 1.1 2002/01/23 14:14:07 deweese Exp $ + * @version $Id: BridgeUpdateHandler.java,v 1.2 2002/02/15 14:58:44 tkormann Exp $ */ public interface BridgeUpdateHandler { /** + * Invoked when a bridge update starts. * + * @param evt the evt that describes the incoming update */ - public void bridgeUpdateStarting(BridgeUpdateEvent e); + void bridgeUpdateStarting(BridgeUpdateEvent evt); /** - * + * Invoked when a bridge update ends. + * + * @param evt the evt that describes the update */ - public void bridgeUpdateCompleted(BridgeUpdateEvent e); + void bridgeUpdateCompleted(BridgeUpdateEvent evt); } 1.3 +12 -2 xml-batik/sources/org/apache/batik/bridge/PaintServer.java Index: PaintServer.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/PaintServer.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- PaintServer.java 15 Mar 2001 16:28:00 -0000 1.2 +++ PaintServer.java 15 Feb 2002 14:58:44 -0000 1.3 @@ -49,11 +49,15 @@ * Paint using the ShapePainter interface. * * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> - * @version $Id: PaintServer.java,v 1.2 2001/03/15 16:28:00 tkormann Exp $ + * @version $Id: PaintServer.java,v 1.3 2002/02/15 14:58:44 tkormann Exp $ */ public abstract class PaintServer implements SVGConstants, CSSConstants, ErrorConstants { + public static final int KEY_STROKE = 1; + + public static final int KEY_FILL = 2; + /** * No instance of this class is required. */ @@ -154,10 +158,16 @@ ShapeNode node, BridgeContext ctx) { + if (ctx.isDynamic()) { + ctx.setCurrentBridgeUpdateHandlerKey(KEY_FILL); + } Paint fillPaint = convertFillPaint(e, node, ctx); + if (ctx.isDynamic()) { + ctx.setCurrentBridgeUpdateHandlerKey(KEY_STROKE); + } Paint strokePaint = convertStrokePaint(e, node, ctx); - Shape shape = node.getShape(); + Shape shape = node.getShape(); if (fillPaint != null && strokePaint != null) { FillShapePainter fp = new FillShapePainter(shape); fp.setPaint(fillPaint); 1.7 +2 -2 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.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- SVGCircleElementBridge.java 13 Feb 2002 09:51:01 -0000 1.6 +++ SVGCircleElementBridge.java 15 Feb 2002 14:58:44 -0000 1.7 @@ -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.6 2002/02/13 09:51:01 tkormann Exp $ + * @version $Id: SVGCircleElementBridge.java,v 1.7 2002/02/15 14:58:44 tkormann Exp $ */ public class SVGCircleElementBridge extends SVGShapeElementBridge { @@ -108,7 +108,7 @@ attrName.equals(SVG_CY_ATTRIBUTE) || attrName.equals(SVG_R_ATTRIBUTE)) { - BridgeUpdateEvent be = new BridgeUpdateEvent(); + BridgeUpdateEvent be = new BridgeUpdateEvent(this); fireBridgeUpdateStarting(be); buildShape(ctx, e, (ShapeNode)node); if (((ShapeNode)node).getShape() == null) { 1.7 +2 -2 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.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- SVGEllipseElementBridge.java 13 Feb 2002 09:51:01 -0000 1.6 +++ SVGEllipseElementBridge.java 15 Feb 2002 14:58:44 -0000 1.7 @@ -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.6 2002/02/13 09:51:01 tkormann Exp $ + * @version $Id: SVGEllipseElementBridge.java,v 1.7 2002/02/15 14:58:44 tkormann Exp $ */ public class SVGEllipseElementBridge extends SVGShapeElementBridge { @@ -122,7 +122,7 @@ attrName.equals(SVG_RX_ATTRIBUTE) || attrName.equals(SVG_RY_ATTRIBUTE)) { - BridgeUpdateEvent be = new BridgeUpdateEvent(); + BridgeUpdateEvent be = new BridgeUpdateEvent(this); fireBridgeUpdateStarting(be); buildShape(ctx, e, (ShapeNode)node); if (((ShapeNode)node).getShape() == null) { 1.14 +7 -4 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.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- SVGGElementBridge.java 14 Feb 2002 12:37:54 -0000 1.13 +++ SVGGElementBridge.java 15 Feb 2002 14:58:44 -0000 1.14 @@ -26,7 +26,7 @@ * Bridge class for the <g> element. * * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> - * @version $Id: SVGGElementBridge.java,v 1.13 2002/02/14 12:37:54 tkormann Exp $ + * @version $Id: SVGGElementBridge.java,v 1.14 2002/02/15 14:58:44 tkormann Exp $ */ public class SVGGElementBridge extends AbstractGraphicsNodeBridge { @@ -124,7 +124,7 @@ GVTBuilder builder = ctx.getGVTBuilder(); GraphicsNode childNode = builder.build(ctx, childElt); if (childNode == null) { - return; + return; // the added element is not a graphic element } // add the graphics node Node n = e.getFirstChild(); @@ -136,7 +136,7 @@ // append at the end ((CompositeGraphicsNode)node).add(childNode); } else { - // find the index into the CompositeGraphicsNode + // find the index of the GraphicsNode to add int index = 0; while (n != lastChild && n != childElt) { if (n.getNodeType() == Node.ELEMENT_NODE) { @@ -159,6 +159,9 @@ protected void handleDOMNodeRemoved(MutationEvent evt) { //System.out.println("handleDOMNodeRemoved "+e.getLocalName()); Element childElt = (Element)evt.getTarget(); + if (!ctx.hasGraphicsNodeBridge(childElt)) { + return; // the removed element is not a graphic element + } Node n = e.getFirstChild(); Node lastChild = e.getLastChild(); if (n == childElt) { @@ -169,7 +172,7 @@ CompositeGraphicsNode cgn = (CompositeGraphicsNode)node; cgn.remove(cgn.size()-1); } else { - // find the index into the CompositeGraphicsNode + // find the index of the GraphicsNode to remove int index = 0; while (n != lastChild && n != childElt) { if (n.getNodeType() == Node.ELEMENT_NODE) { 1.37 +2 -2 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.36 retrieving revision 1.37 diff -u -r1.36 -r1.37 --- SVGImageElementBridge.java 13 Feb 2002 15:01:14 -0000 1.36 +++ SVGImageElementBridge.java 15 Feb 2002 14:58:44 -0000 1.37 @@ -52,7 +52,7 @@ * Bridge class for the <image> element. * * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> - * @version $Id: SVGImageElementBridge.java,v 1.36 2002/02/13 15:01:14 tkormann Exp $ + * @version $Id: SVGImageElementBridge.java,v 1.37 2002/02/15 14:58:44 tkormann Exp $ */ public class SVGImageElementBridge extends AbstractGraphicsNodeBridge { @@ -235,7 +235,7 @@ attrName.equals(SVG_WIDTH_ATTRIBUTE) || attrName.equals(SVG_HEIGHT_ATTRIBUTE)) { - BridgeUpdateEvent be = new BridgeUpdateEvent(); + BridgeUpdateEvent be = new BridgeUpdateEvent(this); fireBridgeUpdateStarting(be); // <!> FIXME: Not yet implemented 1.7 +2 -2 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.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- SVGLineElementBridge.java 13 Feb 2002 09:51:01 -0000 1.6 +++ SVGLineElementBridge.java 15 Feb 2002 14:58:44 -0000 1.7 @@ -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.6 2002/02/13 09:51:01 tkormann Exp $ + * @version $Id: SVGLineElementBridge.java,v 1.7 2002/02/15 14:58:44 tkormann Exp $ */ public class SVGLineElementBridge extends SVGDecoratedShapeElementBridge { @@ -107,7 +107,7 @@ attrName.equals(SVG_X2_ATTRIBUTE) || attrName.equals(SVG_Y2_ATTRIBUTE)) { - BridgeUpdateEvent be = new BridgeUpdateEvent(); + BridgeUpdateEvent be = new BridgeUpdateEvent(this); fireBridgeUpdateStarting(be); buildShape(ctx, e, (ShapeNode)node); if (((ShapeNode)node).getShape() == null) { 1.6 +37 -1 xml-batik/sources/org/apache/batik/bridge/SVGLinearGradientElementBridge.java Index: SVGLinearGradientElementBridge.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGLinearGradientElementBridge.java,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- SVGLinearGradientElementBridge.java 15 Oct 2001 12:33:51 -0000 1.5 +++ SVGLinearGradientElementBridge.java 15 Feb 2002 14:58:44 -0000 1.6 @@ -19,12 +19,13 @@ import org.apache.batik.gvt.GraphicsNode; import org.w3c.dom.Element; +import org.w3c.dom.events.MutationEvent; /** * Bridge class for the <linearGradient> element. * * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> - * @version $Id: SVGLinearGradientElementBridge.java,v 1.5 2001/10/15 12:33:51 tkormann Exp $ + * @version $Id: SVGLinearGradientElementBridge.java,v 1.6 2002/02/15 14:58:44 tkormann Exp $ */ public class SVGLinearGradientElementBridge extends AbstractSVGGradientElementBridge { @@ -42,6 +43,13 @@ } /** + * Returns a new instance of this bridge. + */ + public Bridge getInstance() { + return new SVGLinearGradientElementBridge(); + } + + /** * Builds a linear gradient according to the specified parameters. * * @param paintElement the element that defines a Paint @@ -138,5 +146,33 @@ colorSpace, transform); } + } + + // dynamic support + + /** + * Handles DOMAttrModified events. + * + * @param evt the DOM mutation event + */ + protected void handleDOMAttrModifiedEvent(MutationEvent evt) { + 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) || + attrName.equals(SVG_GRADIENT_UNITS_ATTRIBUTE)) { + + BridgeUpdateEvent be = new BridgeUpdateEvent(this); + be.setOldValue(paint); + fireBridgeUpdateStarting(be); + // <!> FIXME: create a new paint each time + this.paint = createPaint + (ctx, paintElement, paintedElement, paintedNode, opacity); + be.setNewValue(paint); + fireBridgeUpdateCompleted(be); + } else { + super.handleDOMAttrModifiedEvent(evt); + } } } 1.10 +2 -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.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- SVGPathElementBridge.java 13 Feb 2002 09:51:01 -0000 1.9 +++ SVGPathElementBridge.java 15 Feb 2002 14:58:44 -0000 1.10 @@ -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.9 2002/02/13 09:51:01 tkormann Exp $ + * @version $Id: SVGPathElementBridge.java,v 1.10 2002/02/15 14:58:44 tkormann Exp $ */ public class SVGPathElementBridge extends SVGDecoratedShapeElementBridge { @@ -93,7 +93,7 @@ String attrName = evt.getAttrName(); if (attrName.equals(SVG_D_ATTRIBUTE)) { - BridgeUpdateEvent be = new BridgeUpdateEvent(); + BridgeUpdateEvent be = new BridgeUpdateEvent(this); fireBridgeUpdateStarting(be); buildShape(ctx, e, (ShapeNode)node); if (((ShapeNode)node).getShape() == null) { 1.11 +2 -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.10 retrieving revision 1.11 diff -u -r1.10 -r1.11 --- SVGPolygonElementBridge.java 13 Feb 2002 09:51:01 -0000 1.10 +++ SVGPolygonElementBridge.java 15 Feb 2002 14:58:44 -0000 1.11 @@ -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.10 2002/02/13 09:51:01 tkormann Exp $ + * @version $Id: SVGPolygonElementBridge.java,v 1.11 2002/02/15 14:58:44 tkormann Exp $ */ public class SVGPolygonElementBridge extends SVGDecoratedShapeElementBridge { @@ -92,7 +92,7 @@ String attrName = evt.getAttrName(); if (attrName.equals(SVG_POINTS_ATTRIBUTE)) { - BridgeUpdateEvent be = new BridgeUpdateEvent(); + BridgeUpdateEvent be = new BridgeUpdateEvent(this); fireBridgeUpdateStarting(be); buildShape(ctx, e, (ShapeNode)node); if (((ShapeNode)node).getShape() == null) { 1.10 +2 -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.9 retrieving revision 1.10 diff -u -r1.9 -r1.10 --- SVGPolylineElementBridge.java 13 Feb 2002 09:51:01 -0000 1.9 +++ SVGPolylineElementBridge.java 15 Feb 2002 14:58:44 -0000 1.10 @@ -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.9 2002/02/13 09:51:01 tkormann Exp $ + * @version $Id: SVGPolylineElementBridge.java,v 1.10 2002/02/15 14:58:44 tkormann Exp $ */ public class SVGPolylineElementBridge extends SVGDecoratedShapeElementBridge { @@ -92,7 +92,7 @@ String attrName = evt.getAttrName(); if (attrName.equals(SVG_POINTS_ATTRIBUTE)) { - BridgeUpdateEvent be = new BridgeUpdateEvent(); + BridgeUpdateEvent be = new BridgeUpdateEvent(this); fireBridgeUpdateStarting(be); buildShape(ctx, e, (ShapeNode)node); if (((ShapeNode)node).getShape() == null) { 1.7 +40 -1 xml-batik/sources/org/apache/batik/bridge/SVGRadialGradientElementBridge.java Index: SVGRadialGradientElementBridge.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGRadialGradientElementBridge.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- SVGRadialGradientElementBridge.java 15 Oct 2001 12:33:51 -0000 1.6 +++ SVGRadialGradientElementBridge.java 15 Feb 2002 14:58:44 -0000 1.7 @@ -19,12 +19,13 @@ import org.apache.batik.gvt.GraphicsNode; import org.w3c.dom.Element; +import org.w3c.dom.events.MutationEvent; /** * Bridge class for the <radialGradient> element. * * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> - * @version $Id: SVGRadialGradientElementBridge.java,v 1.6 2001/10/15 12:33:51 tkormann Exp $ + * @version $Id: SVGRadialGradientElementBridge.java,v 1.7 2002/02/15 14:58:44 tkormann Exp $ */ public class SVGRadialGradientElementBridge extends AbstractSVGGradientElementBridge { @@ -43,6 +44,13 @@ } /** + * Returns a new instance of this bridge. + */ + public Bridge getInstance() { + return new SVGRadialGradientElementBridge(); + } + + /** * Builds a radial gradient according to the specified parameters. * * @param paintElement the element that defines a Paint @@ -152,6 +160,37 @@ spreadMethod, RadialGradientPaint.SRGB, transform); + } + } + + // dynamic support + + /** + * Handles DOMAttrModified events. + * + * @param evt the DOM mutation event + */ + protected void handleDOMAttrModifiedEvent(MutationEvent evt) { + String attrName = evt.getAttrName(); + if (attrName.equals(SVG_CX_ATTRIBUTE) || + attrName.equals(SVG_CY_ATTRIBUTE) || + attrName.equals(SVG_R_ATTRIBUTE) || + attrName.equals(SVG_FX_ATTRIBUTE) || + attrName.equals(SVG_FY_ATTRIBUTE) || + attrName.equals(SVG_GRADIENT_UNITS_ATTRIBUTE)) { + //long t0 = System.currentTimeMillis(); + BridgeUpdateEvent be = new BridgeUpdateEvent(this); + be.setOldValue(paint); + fireBridgeUpdateStarting(be); + // <!> FIXME: create a new paint each time + this.paint = createPaint + (ctx, paintElement, paintedElement, paintedNode, opacity); + be.setNewValue(paint); + fireBridgeUpdateCompleted(be); + //long t1 = System.currentTimeMillis(); + //System.out.println("new grad: "+(t1-t0)); + } else { + super.handleDOMAttrModifiedEvent(evt); } } } 1.9 +2 -2 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.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- SVGRectElementBridge.java 13 Feb 2002 09:51:01 -0000 1.8 +++ SVGRectElementBridge.java 15 Feb 2002 14:58:44 -0000 1.9 @@ -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.8 2002/02/13 09:51:01 tkormann Exp $ + * @version $Id: SVGRectElementBridge.java,v 1.9 2002/02/15 14:58:44 tkormann Exp $ */ public class SVGRectElementBridge extends SVGShapeElementBridge { @@ -168,7 +168,7 @@ attrName.equals(SVG_RX_ATTRIBUTE) || attrName.equals(SVG_RY_ATTRIBUTE)) { - BridgeUpdateEvent be = new BridgeUpdateEvent(); + BridgeUpdateEvent be = new BridgeUpdateEvent(this); fireBridgeUpdateStarting(be); buildShape(ctx, e, (ShapeNode)node); if (((ShapeNode)node).getShape() == null) { 1.23 +2 -2 xml-batik/sources/org/apache/batik/bridge/SVGSVGElementBridge.java Index: SVGSVGElementBridge.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGSVGElementBridge.java,v retrieving revision 1.22 retrieving revision 1.23 diff -u -r1.22 -r1.23 --- SVGSVGElementBridge.java 13 Feb 2002 15:01:14 -0000 1.22 +++ SVGSVGElementBridge.java 15 Feb 2002 14:58:44 -0000 1.23 @@ -33,7 +33,7 @@ * Bridge class for the <svg> element. * * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> - * @version $Id: SVGSVGElementBridge.java,v 1.22 2002/02/13 15:01:14 tkormann Exp $ + * @version $Id: SVGSVGElementBridge.java,v 1.23 2002/02/15 14:58:44 tkormann Exp $ */ public class SVGSVGElementBridge extends AbstractSVGBridge implements GraphicsNodeBridge, ErrorConstants { @@ -248,7 +248,7 @@ protected void handleDOMAttrModifiedEvent(MutationEvent evt) { String attrName = evt.getAttrName(); - BridgeUpdateEvent be = new BridgeUpdateEvent(); + BridgeUpdateEvent be = new BridgeUpdateEvent(this); fireBridgeUpdateStarting(be); System.out.println("Unsupported attribute modification: "+attrName+ " on "+e.getLocalName()); 1.14 +78 -1 xml-batik/sources/org/apache/batik/bridge/SVGShapeElementBridge.java Index: SVGShapeElementBridge.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGShapeElementBridge.java,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- SVGShapeElementBridge.java 12 Feb 2002 15:14:37 -0000 1.13 +++ SVGShapeElementBridge.java 15 Feb 2002 14:58:45 -0000 1.14 @@ -17,11 +17,20 @@ import org.w3c.dom.Element; + +import org.apache.batik.gvt.CompositeShapePainter; +import org.apache.batik.gvt.FillShapePainter; +import org.apache.batik.gvt.StrokeShapePainter; +import java.awt.Paint; +import java.awt.Shape; + + + /** * The base bridge class for shapes. Subclasses bridge <tt>ShapeNode</tt>. * * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> - * @version $Id: SVGShapeElementBridge.java,v 1.13 2002/02/12 15:14:37 tkormann Exp $ + * @version $Id: SVGShapeElementBridge.java,v 1.14 2002/02/15 14:58:45 tkormann Exp $ */ public abstract class SVGShapeElementBridge extends AbstractGraphicsNodeBridge { @@ -84,8 +93,19 @@ public void buildGraphicsNode(BridgeContext ctx, Element e, GraphicsNode node) { + // push 'this' as the current BridgeUpdateHandler for subbridges + if (ctx.isDynamic()) { + ctx.pushBridgeUpdateHandler(this); + } + ShapeNode shapeNode = (ShapeNode)node; shapeNode.setShapePainter(createShapePainter(ctx, e, shapeNode)); + + // 'this' is no more the current BridgeUpdateHandler + if (ctx.isDynamic()) { + ctx.popBridgeUpdateHandler(); + } + super.buildGraphicsNode(ctx, e, node); } @@ -131,5 +151,62 @@ */ public boolean isComposite() { return false; + } + + // dynamic support + + /** + * Invoked when a bridge update is starting. + * + * @param evt the evt that describes the incoming update + */ + public void bridgeUpdateStarting(BridgeUpdateEvent evt) { + // System.out.println("("+e.getLocalName()+" "+node+") update started "+evt.getHandlerKey()); + } + + /** + * Invoked when a bridge update is completed. + * + * @param evt the evt that describes the update + */ + public void bridgeUpdateCompleted(BridgeUpdateEvent evt) { + // System.out.println(">>> ("+e.getLocalName()+" "+node+") update completed "+ evt.getHandlerKey()); + switch(evt.getHandlerKey()) { + case PaintServer.KEY_FILL: { + Paint paint = (Paint)evt.getNewValue(); + ShapeNode shapeNode = (ShapeNode)node; + Shape shape = shapeNode.getShape(); + ShapePainter painter = shapeNode.getShapePainter(); + if (painter instanceof FillShapePainter) { + FillShapePainter fp = (FillShapePainter)painter; + fp.setPaint(paint); + shapeNode.setShapePainter(fp); + } else if (painter instanceof CompositeShapePainter) { + CompositeShapePainter cp = (CompositeShapePainter)painter; + FillShapePainter fp = (FillShapePainter)cp.getShapePainter(0); + fp.setPaint(paint); + shapeNode.setShapePainter(cp); + } + break; + } case PaintServer.KEY_STROKE: { + Paint paint = (Paint)evt.getNewValue(); + ShapeNode shapeNode = (ShapeNode)node; + Shape shape = shapeNode.getShape(); + ShapePainter painter = shapeNode.getShapePainter(); + if (painter instanceof StrokeShapePainter) { + StrokeShapePainter sp = (StrokeShapePainter)painter; + sp.setPaint(paint); + shapeNode.setShapePainter(sp); + } else if (painter instanceof CompositeShapePainter) { + CompositeShapePainter cp = (CompositeShapePainter)painter; + StrokeShapePainter sp = + (StrokeShapePainter)cp.getShapePainter(1); + sp.setPaint(paint); + shapeNode.setShapePainter(cp); + } + break; + } + } + // System.out.println("<<< ("+e.getLocalName()+" "+node+") update completed "+ evt.getHandlerKey()); } } 1.49 +32 -3 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.48 retrieving revision 1.49 diff -u -r1.48 -r1.49 --- SVGTextElementBridge.java 13 Feb 2002 15:01:14 -0000 1.48 +++ SVGTextElementBridge.java 15 Feb 2002 14:58:45 -0000 1.49 @@ -60,10 +60,10 @@ * Bridge class for the <text> element. * * @author <a href="[EMAIL PROTECTED]>Bill Haneman</a> - * @version $Id: SVGTextElementBridge.java,v 1.48 2002/02/13 15:01:14 tkormann Exp $ + * @version $Id: SVGTextElementBridge.java,v 1.49 2002/02/15 14:58:45 tkormann Exp $ */ public class SVGTextElementBridge extends AbstractSVGBridge - implements GraphicsNodeBridge, ErrorConstants { + implements BridgeUpdateHandler, GraphicsNodeBridge, ErrorConstants { /** * The element that has been handled by this bridge. @@ -193,6 +193,13 @@ public void buildGraphicsNode(BridgeContext ctx, Element e, GraphicsNode node) { + + + // push 'this' as the current BridgeUpdateHandler for subbridges + if (ctx.isDynamic()) { + ctx.pushBridgeUpdateHandler(this); + } + e.normalize(); AttributedString as = buildAttributedString(ctx, e, node); addGlyphPositionAttributes(as, e, ctx); @@ -220,6 +227,8 @@ this.node = node; this.ctx = ctx; initializeDynamicSupport(); + // 'this' is no more the current BridgeUpdateHandler + ctx.popBridgeUpdateHandler(); } // Handle children elements such as <title> @@ -250,6 +259,26 @@ } /** + * Invoked when a bridge update is starting. + * + * @param evt the evt that describes the incoming update + */ + public void bridgeUpdateStarting(BridgeUpdateEvent evt) { + System.out.println("("+e.getLocalName()+" "+node+") update started "+ + evt.getHandlerKey()); + } + + /** + * Invoked when a bridge update is completed. + * + * @param evt the evt that describes the update + */ + public void bridgeUpdateCompleted(BridgeUpdateEvent evt) { + System.out.println("("+e.getLocalName()+" "+node+") update completed "+ + evt.getHandlerKey()); + } + + /** * Handles DOMAttrModified events. * * @param evt the DOM mutation event @@ -257,7 +286,7 @@ protected void handleDOMAttrModifiedEvent(MutationEvent evt) { String attrName = evt.getAttrName(); if (attrName.equals(SVG_TRANSFORM_ATTRIBUTE)) { - BridgeUpdateEvent be = new BridgeUpdateEvent(); + BridgeUpdateEvent be = new BridgeUpdateEvent(this); fireBridgeUpdateStarting(be); String s = evt.getNewValue(); 1.20 +2 -2 xml-batik/sources/org/apache/batik/bridge/SVGUseElementBridge.java Index: SVGUseElementBridge.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/bridge/SVGUseElementBridge.java,v retrieving revision 1.19 retrieving revision 1.20 diff -u -r1.19 -r1.20 --- SVGUseElementBridge.java 13 Feb 2002 15:01:15 -0000 1.19 +++ SVGUseElementBridge.java 15 Feb 2002 14:58:45 -0000 1.20 @@ -37,7 +37,7 @@ * Bridge class for the <use> element. * * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> - * @version $Id: SVGUseElementBridge.java,v 1.19 2002/02/13 15:01:15 tkormann Exp $ + * @version $Id: SVGUseElementBridge.java,v 1.20 2002/02/15 14:58:45 tkormann Exp $ */ public class SVGUseElementBridge extends AbstractSVGBridge implements GraphicsNodeBridge, ErrorConstants { @@ -274,7 +274,7 @@ protected void handleDOMAttrModifiedEvent(MutationEvent evt) { String attrName = evt.getAttrName(); - BridgeUpdateEvent be = new BridgeUpdateEvent(); + BridgeUpdateEvent be = new BridgeUpdateEvent(this); fireBridgeUpdateStarting(be); System.out.println("Unsupported attribute modification: "+attrName+ " on "+e.getLocalName()); 1.14 +20 -1 xml-batik/sources/org/apache/batik/gvt/CompositeShapePainter.java Index: CompositeShapePainter.java =================================================================== RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/CompositeShapePainter.java,v retrieving revision 1.13 retrieving revision 1.14 diff -u -r1.13 -r1.14 --- CompositeShapePainter.java 6 Feb 2002 17:52:36 -0000 1.13 +++ CompositeShapePainter.java 15 Feb 2002 14:58:45 -0000 1.14 @@ -21,7 +21,7 @@ * A shape painter which consists of multiple shape painters. * * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> - * @version $Id: CompositeShapePainter.java,v 1.13 2002/02/06 17:52:36 deweese Exp $ + * @version $Id: CompositeShapePainter.java,v 1.14 2002/02/15 14:58:45 tkormann Exp $ */ public class CompositeShapePainter implements ShapePainter { @@ -72,6 +72,25 @@ } painters[count++] = shapePainter; } + + /** + * Sets to the specified index, the specified ShapePainter. + * + * @param index the index where to set the ShapePainter + * @param shapePainter the ShapePainter to set + */ + /* public void setShapePainter(int index, ShapePainter shapePainter) { + if (shapePainter == null) { + return; + } + if (this.shape != shapePainter.getShape()) { + shapePainter.setShape(shape); + } + if (painters == null || index >= painters.length) { + throw new IllegalArgumentException("Bad index: "+index); + } + painters[index] = shapePainter; + }*/ /** * Returns the shape painter at the specified index.
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]