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]