I am building an xhtml/mathml editor/viewer and I want to allow embedded 
svg tags. The problem I am trying to solve is the proper use of batik to 
display the svg image. I already have the Document loaded into memory, and 
I am trying to grab the svg Element and use GVTBuilder.build() to get a 
GraphicsNode object, then ask it to paint the graphic. I am getting the 
following exception.

Is there an easy fix, or am I, perhaps, on the wrong track altogether?

/*java.lang.ClassCastException: org.apache.xerces.dom.DeferredDocumentImpl
         at 
org.apache.batik.bridge.CSSUtilities.getViewCSS(CSSUtilities.java:87)
         at 
org.apache.batik.bridge.CSSUtilities.getComputedStyle(CSSUtilities.java:96)
         at 
org.apache.batik.bridge.CSSUtilities.convertDisplay(CSSUtilities.java:358)
         at org.apache.batik.bridge.GVTBuilder.build(GVTBuilder.java:101)
         at temp.SVGTagTest.displaySvg(SVGTagTest.java:76)
         at temp.SVGTagTest.<init>(SVGTagTest.java:52)
         at temp.SVGTagTest.main(SVGTagTest.java:43) */

package temp;

import javax.swing.*;
import java.awt.*;
import java.io.*;
import java.util.*;
import org.w3c.dom.*;
import org.w3c.dom.svg.SVGAElement;
import org.apache.xerces.parsers.DOMParser;
import org.xml.sax.InputSource;

import org.apache.batik.gvt.GraphicsNode;
import org.apache.batik.gvt.GraphicsNodeRenderContext;
import org.apache.batik.bridge.GVTBuilder;
import org.apache.batik.bridge.UserAgent;
import org.apache.batik.bridge.BridgeContext;
import org.apache.batik.gvt.event.EventDispatcher;
import org.apache.batik.gvt.filter.ConcreteGraphicsNodeRableFactory;
import org.apache.batik.bridge.UserAgent;
import org.apache.batik.bridge.BridgeExtension;
import java.awt.geom.AffineTransform;
import java.awt.geom.Dimension2D;
import java.awt.image.renderable.RenderContext;

public class SVGTagTest extends JFrame{
        
        private Document doc;
        private Component canvas;
        private Element svgElem;
        private GraphicsNode graphicsNode;
        
        public static void main(String[] args) throws Exception {
                SVGTagTest test = new SVGTagTest();
        }
        
        public SVGTagTest() throws Exception {
                setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                setSize(300,300);
                setVisible(true);
                canvas = getContentPane();
                read(new FileReader("/Projects/Editor/temp/SVGExample.xml"));
                displaySvg();
        }
        
        public void read(Reader is) throws Exception{
                InputSource saxIs = new InputSource(is);
                DOMParser parser = new DOMParser();
                parser.setIncludeIgnorableWhitespace(false);
                
parser.setFeature("http://apache.org/xml/features/dom/create-entity-ref-no 
parser.setFeature("http://apache.org/xml/features/dom/create-entity-ref-node 
s",false);
                parser.parse(saxIs);
                doc = parser.getDocument();
        }
        
        public void displaySvg(){
                svgElem = (Element)doc.getElementsByTagName("svg").item(0);
                if (svgElem == null) return;
                GVTBuilder b = new GVTBuilder();
                Graphics2D g = (Graphics2D)canvas.getGraphics();
                GraphicsNodeRenderContext gnrc = new GraphicsNodeRenderContext(
                        g.getTransform(),
                        g.getClip(),
                        new RenderingHints(null), null, null,
                        new ConcreteGraphicsNodeRableFactory());
                UserAgent ua = new NLMSVGUserAgent(canvas);
                BridgeContext ctx = new BridgeContext(ua, gnrc);
                graphicsNode = b.build(ctx, svgElem); // exception here!
                graphicsNode.paint(g, gnrc);
        }
}

class NLMSVGUserAgent implements UserAgent {
        
        private Component component;
        private AffineTransform transform;

        public NLMSVGUserAgent(Component comp){
                component = comp;
                transform = new AffineTransform();
        }

        public Dimension2D getViewportSize() {
                return component.getSize();
        }

        public EventDispatcher getEventDispatcher() {
                return null;
        }

        public void displayError(String message) {
                System.out.println(message);
        }

        public void displayError(Exception ex) {
                System.out.println(ex.getMessage());
        }

        public void displayMessage(String message) {
                System.out.println(message);
        }

        public float getPixelToMM() {
                return 0.264583333333333333333f; // 96 dpi
        }

        public String getLanguages() {
                return "en";
        }

        public String getUserStyleSheetURI() {
                return null;
        }

        public void openLink(SVGAElement elt) {
        }

        protected void fireLinkActivatedEvent(SVGAElement elt, String href) {
        }

        public void setSVGCursor(Cursor cursor) {
                //JSVGComponent.this.setCursor(cursor);
        }

        public String getXMLParserClassName() {
                return "org.apache.crimson.parser.XMLReaderImpl";
        }

        public AffineTransform getTransform() {
                return transform;
        }

        public Point getClientAreaLocationOnScreen() {
                return component.getLocationOnScreen();
        }

        public boolean hasFeature(String s) {
                return false;
        }

        protected Map extensions = new HashMap();

        public boolean supportExtension(String s) {
                return extensions.containsKey(s);
        }

        public void registerExtension(BridgeExtension ext) {
                Iterator i = ext.getImplementedExtensions();
                while (i.hasNext())
                        extensions.put(i.next(), ext);
        }
}


---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to