tkormann 02/02/14 04:37:55
Modified: sources/org/apache/batik/bridge BridgeContext.java
SVGGElementBridge.java
sources/org/apache/batik/gvt AbstractGraphicsNode.java
UpdateTracker.java
Added: samples/tests/spec/scripting add.svg remove.svg
Log:
- add/remove child on the DOM now works
- two new tests added add.svg and remove.svg
- two small patches have been applied to support add and remove
1. updateTracker does not put 'null' new region (remove usecase)
2. AbstractGraphicsNode.invalidateGeometryCache,
if bounds == null does *not* mean the parent is dirty too
-> empty <g> + appendChild usecase
Revision Changes Path
1.1 xml-batik/samples/tests/spec/scripting/add.svg
Index: add.svg
===================================================================
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.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. -->
<!-- ====================================================================== -->
<!-- ====================================================================== -->
<!-- append child test -->
<!-- -->
<!-- @author [EMAIL PROTECTED] -->
<!-- @version $Id: add.svg,v 1.1 2002/02/14 12:37:54 tkormann Exp $ -->
<!-- ====================================================================== -->
<?xml-stylesheet type="text/css" href="../../resources/style/test.css" ?>
<svg xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
id="body" width="450" height="500" viewBox="0 0 450 500">
<title>appendChild test 'onload'</title>
<text x="50%" y="45" class="title">appendChild test 'onload'</text>
<script type="text/ecmascript">
var svgNamespaceURI = "http://www.w3.org/2000/svg";
function build(evt) {
var g = evt.target;
var document = g.ownerDocument;
var e;
e = createElement(document, 200, 100, "fill:crimson");
g.appendChild(e);
e = createElement(document, 250, 100, "fill:orange");
g.appendChild(e);
e = createElement(document, 150, 100, "fill:gold");
g.insertBefore(e, g.firstChild);
var ee = createElement(document, 100, 100, "fill:#eee");
g.insertBefore(ee, e);
}
function createElement(g, x, y, style) {
var e = document.createElementNS(svgNamespaceURI, "rect");
e.setAttribute("x", x);
e.setAttribute("y", y);
e.setAttribute("width", 100);
e.setAttribute("height", 100);
e.setAttribute("style", style);
return e;
}
</script>
<g onload="build(evt)" id="test-content">
</g>
<text x="225" y="220" style="text-anchor:middle">constructed using
'onload'</text>
<g>
<rect x="100" y="300" width="100" height="100" style="fill:#eee"/>
<rect x="150" y="300" width="100" height="100" style="fill:gold"/>
<rect x="200" y="300" width="100" height="100" style="fill:crimson"/>
<rect x="250" y="300" width="100" height="100" style="fill:orange"/>
</g>
<text x="225" y="420" style="text-anchor:middle">reference</text>
</svg>
1.1 xml-batik/samples/tests/spec/scripting/remove.svg
Index: remove.svg
===================================================================
<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN"
"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.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. -->
<!-- ====================================================================== -->
<!-- ====================================================================== -->
<!-- append child test -->
<!-- -->
<!-- @author [EMAIL PROTECTED] -->
<!-- @version $Id: remove.svg,v 1.1 2002/02/14 12:37:54 tkormann Exp $ -->
<!-- ====================================================================== -->
<?xml-stylesheet type="text/css" href="../../resources/style/test.css" ?>
<svg xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
id="body" width="450" height="500" viewBox="0 0 450 500">
<title>removeChild test 'onload'</title>
<text x="50%" y="45" class="title">removeChild test 'onload'</text>
<script type="text/ecmascript">
var svgNamespaceURI = "http://www.w3.org/2000/svg";
function remove(evt) {
var g = evt.target;
g.removeChild(g.firstChild); // remove grey
g.removeChild(g.firstChild.nextSibling); // remove crimson
g.removeChild(g.firstChild.nextSibling); // remove orange
g.removeChild(g.firstChild); // remove gold
}
function removeAll(evt) {
var g = evt.target;
// while (g.hasChildNodes) {
while (g.firstChild != null) {
g.removeChild(g.firstChild);
}
}
</script>
<g onload="remove(evt)" id="test-content">
<rect x="100" y="100" width="100" height="100" style="fill:#eee"/>
<rect x="150" y="100" width="100" height="100" style="fill:gold"/>
<rect x="200" y="100" width="100" height="100" style="fill:crimson"/>
<rect x="250" y="100" width="100" height="100" style="fill:orange"/>
</g>
<g onload="removeAll(evt)" id="test-content">
<rect x="100" y="300" width="100" height="100" style="fill:#eee"/>
<rect x="150" y="300" width="100" height="100" style="fill:gold"/>
<rect x="200" y="300" width="100" height="100" style="fill:crimson"/>
<rect x="250" y="300" width="100" height="100" style="fill:orange"/>
</g>
</svg>
1.33 +23 -1 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.32
retrieving revision 1.33
diff -u -r1.32 -r1.33
--- BridgeContext.java 12 Feb 2002 15:14:37 -0000 1.32
+++ BridgeContext.java 14 Feb 2002 12:37:54 -0000 1.33
@@ -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.32 2002/02/12 15:14:37 tkormann Exp $
+ * @version $Id: BridgeContext.java,v 1.33 2002/02/14 12:37:54 tkormann Exp $
*/
public class BridgeContext implements ErrorConstants {
@@ -488,6 +488,7 @@
/**
* Returns the bridge associated with the specified element.
+ *
* @param element the element
*/
public Bridge getBridge(Element element) {
@@ -510,7 +511,28 @@
}
/**
+ * Returns true if the specified element has a GraphicsNodeBridge
+ * associated to it, false otherwise.
+ *
+ * @param element the element
+ */
+ public boolean hasGraphicsNodeBridge(Element element) {
+ if (namespaceURIMap == null || element == null) {
+ return false;
+ }
+ String namespaceURI = element.getNamespaceURI();
+ String localName = element.getLocalName();
+ namespaceURI = ((namespaceURI == null)? "" : namespaceURI);
+ HashMap localNameMap = (HashMap) namespaceURIMap.get(namespaceURI);
+ if (localNameMap == null) {
+ return false;
+ }
+ return (localNameMap.get(localName) instanceof GraphicsNodeBridge);
+ }
+
+ /**
* Returns the bridge associated with the element type
+ *
* @param nameSpaceURI namespace of the requested element
* @param localName element's local name
*
1.13 +136 -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.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- SVGGElementBridge.java 13 Feb 2002 09:51:01 -0000 1.12
+++ SVGGElementBridge.java 14 Feb 2002 12:37:54 -0000 1.13
@@ -16,12 +16,17 @@
import org.apache.batik.gvt.GraphicsNode;
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 the <g> element.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a>
- * @version $Id: SVGGElementBridge.java,v 1.12 2002/02/13 09:51:01 tkormann Exp $
+ * @version $Id: SVGGElementBridge.java,v 1.13 2002/02/14 12:37:54 tkormann Exp $
*/
public class SVGGElementBridge extends AbstractGraphicsNodeBridge {
@@ -87,5 +92,135 @@
*/
public boolean isComposite() {
return true;
+ }
+
+ // dynamic support
+
+ /**
+ * This method is invoked during the build phase if the document
+ * is dynamic. The responsability of this method is to ensure that
+ * any dynamic modifications of the element this bridge is
+ * dedicated to, happen on its associated GVT product.
+ */
+ protected void initializeDynamicSupport() {
+ super.initializeDynamicSupport();
+ ((EventTarget)e).addEventListener("DOMNodeInserted",
+ new DOMNodeInsertedEventListener(),
+ false);
+ ((EventTarget)e).addEventListener("DOMNodeRemoved",
+ new DOMNodeRemovedEventListener(),
+ false);
+ }
+
+ /**
+ * Handles DOMNodeInserted events.
+ *
+ * @param evt the DOM mutation event
+ */
+ protected void handleDOMNodeInserted(MutationEvent evt) {
+ //System.out.println("handleDOMNodeInserted "+e.getLocalName());
+ Element childElt = (Element)evt.getTarget();
+ // build the graphics node
+ GVTBuilder builder = ctx.getGVTBuilder();
+ GraphicsNode childNode = builder.build(ctx, childElt);
+ if (childNode == null) {
+ return;
+ }
+ // add the graphics node
+ Node n = e.getFirstChild();
+ Node lastChild = e.getLastChild();
+ if (n == childElt) {
+ // add at the beginning
+ ((CompositeGraphicsNode)node).add(0, childNode);
+ } else if (lastChild == childElt) {
+ // append at the end
+ ((CompositeGraphicsNode)node).add(childNode);
+ } else {
+ // find the index into the CompositeGraphicsNode
+ int index = 0;
+ while (n != lastChild && n != childElt) {
+ if (n.getNodeType() == Node.ELEMENT_NODE) {
+ if (ctx.hasGraphicsNodeBridge((Element)n)) {
+ index++;
+ }
+ }
+ n = n.getNextSibling();
+ }
+ // insert at the index
+ ((CompositeGraphicsNode)node).add(index, childNode);
+ }
+ }
+
+ /**
+ * Handles DOMNodeRemoved events.
+ *
+ * @param evt the DOM mutation event
+ */
+ protected void handleDOMNodeRemoved(MutationEvent evt) {
+ //System.out.println("handleDOMNodeRemoved "+e.getLocalName());
+ Element childElt = (Element)evt.getTarget();
+ Node n = e.getFirstChild();
+ Node lastChild = e.getLastChild();
+ if (n == childElt) {
+ // remove first
+ ((CompositeGraphicsNode)node).remove(0);
+ } else if (lastChild == childElt) {
+ // remove last
+ CompositeGraphicsNode cgn = (CompositeGraphicsNode)node;
+ cgn.remove(cgn.size()-1);
+ } else {
+ // find the index into the CompositeGraphicsNode
+ int index = 0;
+ while (n != lastChild && n != childElt) {
+ if (n.getNodeType() == Node.ELEMENT_NODE) {
+ if (ctx.hasGraphicsNodeBridge((Element)n)) {
+ index++;
+ }
+ }
+ n = n.getNextSibling();
+ }
+ // remove at the index
+ ((CompositeGraphicsNode)node).remove(index);
+ }
+ }
+
+ /**
+ * The listener class for 'DOMNodeInserted' event.
+ */
+ protected class DOMNodeInsertedEventListener implements EventListener {
+
+ /**
+ * Handles 'DOMNodeInserted' events and deleguates to the
+ * 'handleDOMNodeInserted' method any changes to the
+ * GraphicsNode if any.
+ *
+ * @param evt the DOM event
+ */
+ public void handleEvent(Event evt) {
+ if (((MutationEvent)evt).getRelatedNode() != e) {
+ return;
+ }
+ handleDOMNodeInserted((MutationEvent)evt);
+ }
+ }
+
+ /**
+ * The listener class for 'DOMNodeRemoved' event.
+ */
+ protected class DOMNodeRemovedEventListener implements EventListener {
+
+ /**
+ * Handles 'DOMNodeRemoved' events and deleguates to the
+ * 'handleDOMNodeRemoved' method any changes to the
+ * GraphicsNode if any.
+ *
+ * @param evt the DOM event
+ */
+ public void handleEvent(Event evt) {
+ if (((MutationEvent)evt).getRelatedNode() != e) {
+ return;
+ }
+ handleDOMNodeRemoved((MutationEvent)evt);
+ }
}
}
1.34 +2 -2 xml-batik/sources/org/apache/batik/gvt/AbstractGraphicsNode.java
Index: AbstractGraphicsNode.java
===================================================================
RCS file:
/home/cvs/xml-batik/sources/org/apache/batik/gvt/AbstractGraphicsNode.java,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -r1.33 -r1.34
--- AbstractGraphicsNode.java 31 Jan 2002 21:57:35 -0000 1.33
+++ AbstractGraphicsNode.java 14 Feb 2002 12:37:54 -0000 1.34
@@ -54,7 +54,7 @@
* @author <a href="mailto:[EMAIL PROTECTED]">Thierry Kormann</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Emmanuel Tissandier</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Thomas DeWeese</a>
- * @version $Id: AbstractGraphicsNode.java,v 1.33 2002/01/31 21:57:35 deweese Exp $
+ * @version $Id: AbstractGraphicsNode.java,v 1.34 2002/02/14 12:37:54 tkormann Exp $
*/
public abstract class AbstractGraphicsNode implements GraphicsNode {
@@ -879,7 +879,7 @@
protected void invalidateGeometryCache() {
// If our bounds are invalid then our parents bounds
// must be invalid also. So just return.
- if (bounds == null) return;
+ //if (bounds == null) return;
if (parent != null) {
((AbstractGraphicsNode) parent).invalidateGeometryCache();
1.8 +4 -2 xml-batik/sources/org/apache/batik/gvt/UpdateTracker.java
Index: UpdateTracker.java
===================================================================
RCS file: /home/cvs/xml-batik/sources/org/apache/batik/gvt/UpdateTracker.java,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- UpdateTracker.java 12 Feb 2002 18:58:31 -0000 1.7
+++ UpdateTracker.java 14 Feb 2002 12:37:55 -0000 1.8
@@ -29,7 +29,7 @@
* This class tracks the changes on a GVT tree
*
* @author <a href="mailto:[EMAIL PROTECTED]">Thomas DeWeese</a>
- * @version $Id: UpdateTracker.java,v 1.7 2002/02/12 18:58:31 deweese Exp $
+ * @version $Id: UpdateTracker.java,v 1.8 2002/02/14 12:37:55 tkormann Exp $
*/
public class UpdateTracker extends GraphicsNodeChangeAdapter {
@@ -124,7 +124,9 @@
// org.ImageDisplay.stringShape(oRgn) + "\n" +
// org.ImageDisplay.stringShape(nRgn) + "\n");
ret.add(oRgn);
- ret.add(nRgn);
+ if (nRgn != null) {
+ ret.add(nRgn);
+ }
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]