tkormann 01/11/14 02:54:23 Modified: sources/org/apache/batik/bridge SVGImageElementBridge.java SVGTextElementBridge.java Log: fix linking on image element (raster and SVG image). Revision Changes Path 1.31 +102 -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.30 retrieving revision 1.31 diff -u -r1.30 -r1.31 --- SVGImageElementBridge.java 2001/11/13 15:20:58 1.30 +++ SVGImageElementBridge.java 2001/11/14 10:54:23 1.31 @@ -41,11 +41,17 @@ import org.w3c.dom.svg.SVGDocument; import org.w3c.dom.svg.SVGSVGElement; +import org.w3c.dom.events.DocumentEvent; +import org.w3c.dom.events.Event; +import org.w3c.dom.events.EventListener; +import org.w3c.dom.events.EventTarget; +import org.w3c.dom.events.MouseEvent; + /** * Bridge class for the <image> element. * * @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a> - * @version $Id: SVGImageElementBridge.java,v 1.30 2001/11/13 15:20:58 tkormann Exp $ + * @version $Id: SVGImageElementBridge.java,v 1.31 2001/11/14 10:54:23 tkormann Exp $ */ public class SVGImageElementBridge extends AbstractGraphicsNodeBridge { @@ -139,6 +145,41 @@ } /** + * Builds using the specified BridgeContext and element, the + * specified graphics node. + * + * @param ctx the bridge context to use + * @param e the element that describes the graphics node to build + * @param node the graphics node to build + */ + public void buildGraphicsNode(BridgeContext ctx, + Element e, + GraphicsNode node) { + // 'opacity' + node.setComposite(CSSUtilities.convertOpacity(e)); + // 'filter' + node.setFilter(CSSUtilities.convertFilter(e, node, ctx)); + // 'mask' + node.setMask(CSSUtilities.convertMask(e, node, ctx)); + // 'clip-path' + node.setClip(CSSUtilities.convertClipPath(e, node, ctx)); + + // bind the specified element and its associated graphics node if needed + if (ctx.isDynamic()) { + // HACK due to the way images are represented in GVT + ImageNode imgNode = (ImageNode)node; + if (imgNode.getImage() instanceof RasterImageNode) { + // register the RasterImageNode instead + ctx.bind(e, imgNode.getImage()); + } else { + ctx.bind(e, node); + } + BridgeEventSupport.addDOMListener(ctx, e); + } + SVGUtilities.bridgeChildren(ctx, e); + } + + /** * Creates an <tt>ImageNode</tt>. */ protected GraphicsNode instantiateGraphicsNode() { @@ -233,7 +274,67 @@ // appropriate AffineTransform to the image node Rectangle2D bounds = getImageBounds(ctx, e); initializeViewport(ctx, e, result, vb, bounds); + + // add a listener on the outermost svg element of the SVG image. + // if an event occured inside the SVG image document, send it + // to the <image> element (inside the original document). + if (ctx.isDynamic()) { + EventListener listener = new ForwardEventListener(svgElement, e); + EventTarget target = (EventTarget)svgElement; + target.addEventListener(SVG_EVENT_CLICK, listener, false); + target.addEventListener(SVG_EVENT_MOUSEOVER, listener, false); + target.addEventListener(SVG_EVENT_MOUSEOUT, listener, false); + } + return result; + } + + /** + * A simple DOM listener to forward events from the SVG image document to + * the original document. + */ + protected static class ForwardEventListener implements EventListener { + + /** + * The root element of the SVG image. + */ + protected Element svgElement; + + /** + * The image element. + */ + protected Element imgElement; + + /** + * Constructs a new <tt>ForwardEventListener</tt> + */ + public ForwardEventListener(Element svgElement, Element imgElement) { + this.svgElement = svgElement; + this.imgElement = imgElement; + } + + public void handleEvent(Event e) { + MouseEvent evt = (MouseEvent) e; + MouseEvent newMouseEvent = (MouseEvent) + // DOM Level 2 6.5 cast from Document to DocumentEvent is ok + ((DocumentEvent)imgElement.getOwnerDocument()).createEvent("MouseEvents"); + newMouseEvent.initMouseEvent(evt.getType(), + evt.getBubbles(), + evt.getCancelable(), + evt.getView(), + evt.getDetail(), + evt.getScreenX(), + evt.getScreenY(), + evt.getClientX(), + evt.getClientY(), + evt.getCtrlKey(), + evt.getAltKey(), + evt.getShiftKey(), + evt.getMetaKey(), + evt.getButton(), + (EventTarget)imgElement); + ((EventTarget)imgElement).dispatchEvent(newMouseEvent); + } } /** 1.41 +2 -6 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.40 retrieving revision 1.41 diff -u -r1.40 -r1.41 --- SVGTextElementBridge.java 2001/11/13 15:20:58 1.40 +++ SVGTextElementBridge.java 2001/11/14 10:54:23 1.41 @@ -56,7 +56,7 @@ * Bridge class for the <text> element. * * @author <a href="[EMAIL PROTECTED]>Bill Haneman</a> - * @version $Id: SVGTextElementBridge.java,v 1.40 2001/11/13 15:20:58 tkormann Exp $ + * @version $Id: SVGTextElementBridge.java,v 1.41 2001/11/14 10:54:23 tkormann Exp $ */ public class SVGTextElementBridge extends AbstractSVGBridge implements GraphicsNodeBridge, ErrorConstants { @@ -1326,7 +1326,7 @@ } - private class TextDecoration { + protected static class TextDecoration { Paint underlinePaint; Paint underlineStrokePaint; @@ -1361,11 +1361,7 @@ strikethroughStrokePaint = td.strikethroughStrokePaint; strikethroughStroke = td.strikethroughStroke; } - - } - - }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]