On Wednesday 12 December 2001 16:08, Peter Rice wrote:
> 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-n
>o
> parser.setFeature("http://apache.org/xml/features/dom/create-entity-ref-nod
>e 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);

You need to clone the Xerces DOM subtree into a Batik DOM subtree because 
batik requires some internal features (mainly for CSS computation).
Do do that, create a Batik SVG DOM document 
(org.apache.batik.dom.svg.SVGDOMImplementation.createDocument()), deep import 
the Xerces element, and then replace the root element with the imported 
element.

>               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]

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

Reply via email to