xmlgraphics-batik-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Erik Bunn <...@basen.net>
Subject Modifying CSS via SVGStylable: null CSSEngine?
Date Tue, 26 Sep 2006 07:36:34 GMT

In my continuing series...

On Sep 21, 2006, at 13:16 , thomas.deweese@kodak.com wrote:

>    I would avoid 'setComputedStyleMap' you should be able to use
> SVGStylable.getStyle().setProperty(String prop, String val, String
> priority)

It took me a while to get this to work: I had to manually force a  
CSSEngine to my parsed SVGDocument, otherwise Batik throws an NPE.
Can anyone point out what goes wrong in the following? (The following  
is just a synopsis of my code, as always, but checked for consistency  
with the actual implementation.)

         // 1. Load a document; docReader is provided and gives us a  
valid SVG document.
         String parser = XMLResourceDescriptor.getXMLParserClassName();
         SAXSVGDocumentFactory factory = new SAXSVGDocumentFactory 
( parser );
         factory.setValidating( false );
         // *) See commentary below
         String svgNS = SVGDOMImplementation.SVG_NAMESPACE_URI;
         SVGDocument doc = factory.createSVGDocument( svgNS,  
docReader );

         // 2. Locate an element and modify CSS.
         Element knownStylable = doc.getElementById 
( "element_with_style" );
         CSSStyleDeclaration styles = ((SVGStylable) 
         styles.setProperty( CSSConstants.CSS_DISPLAY_PROPERTY,  
CSSConstants.CSS_NONE_VALUE, "" );

Done like this, the last line causes an NPE to be thrown; the  
CSSEngine of the document is null. (I can compile Batik with debug  
and check the exact location, if required.)
Is there something obvious I'm missing when I assume the above should  
just work?
One way of forcing functionality is to add the following at *) :

         SVGDOMImplementation di = (SVGDOMImplementation) 
m_factory.getDOMImplementation( "1.1" );
         UserAgent ua = new UserAgentAdapter();
         BridgeContext bc = new BridgeContext( ua );
         di.createCSSEngine( (SVGOMDocument)doc, bc );

(To complicate matters, I actually tend to clone 'doc' and play with  
the copy. In that case, I will have to manually set the CSSEngine of  
the copy, as well. I've just given the clone the same instance as  
'doc' use; not sure if this is good.)

I'm using Batik 1.6.

Hints appreciated; thanks!

To unsubscribe, e-mail: batik-users-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: batik-users-help@xmlgraphics.apache.org

View raw message