/* Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to You under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package org.apache.batik.svggen; import java.awt.Font; import java.net.URL; import java.util.Iterator; import java.util.Map; import org.w3c.dom.CDATASection; import org.w3c.dom.DOMImplementation; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.apache.batik.anim.dom.SVGDOMImplementation; import org.apache.batik.svggen.SVGGeneratorContext.GraphicContextDefaults; import org.apache.batik.util.SVGConstants; /** * Testing customization of the SVGGeneratorContext and generation of * SVG Fonts. * * @author <a href="mailto:cjolif@ilog.fr">Christophe Jolif</a> * @version $Id$ */ public class GeneratorContext extends SVGAccuracyTest implements SVGConstants { public static class TestIDGenerator extends SVGIDGenerator { public String generateID(String prefix) { return "test"+super.generateID(prefix); } } public static class TestStyleHandler extends DefaultStyleHandler { private CDATASection styleSheet; public TestStyleHandler(CDATASection styleSheet) { this.styleSheet = styleSheet; } public void setStyle(Element element, Map styleMap, SVGGeneratorContext generatorContext) { Iterator iter = styleMap.keySet().iterator(); // create a new class id in the style sheet String id = generatorContext.getIDGenerator().generateID("C"); styleSheet.appendData("."+id+" {"); // append each key/value pairs while (iter.hasNext()) { String key = (String)iter.next(); String value = (String)styleMap.get(key); styleSheet.appendData(key+":"+value+";"); } styleSheet.appendData("}\n"); // reference the class id of the style sheet on the element to be styled element.setAttribute("class", id); } } private Element topLevelGroup = null; public GeneratorContext(Painter painter, URL refURL) { super(painter, refURL); } protected SVGGraphics2D buildSVGGraphics2D(){ // Use Batik's DOM implementation to create a Document DOMImplementation impl = SVGDOMImplementation.getDOMImplementation(); String namespaceURI = SVGDOMImplementation.SVG_NAMESPACE_URI; Document domFactory = impl.createDocument(namespaceURI, SVG_SVG_TAG, null); // Create a default context from our Document instance SVGGeneratorContext ctx = SVGGeneratorContext.createDefault(domFactory); // Set ID generator ctx.setIDGenerator(new TestIDGenerator()); // Extension Handler to be done // Image Handler to be done GenericImageHandler ihandler = new CachedImageHandlerBase64Encoder(); ctx.setGenericImageHandler(ihandler); // Set Style handler CDATASection styleSheet = domFactory.createCDATASection(""); ctx.setStyleHandler(new TestStyleHandler(styleSheet)); // Set the generator comment ctx.setComment("Generated by the Batik Test Framework. Test:\u00e9j"); // Turn SVG Font embedding on. ctx.setEmbeddedFontsOn(true); // Set the default font to use GraphicContextDefaults defaults = new GraphicContextDefaults(); defaults.font = new Font("Arial", Font.PLAIN, 12); ctx.setGraphicContextDefaults(defaults); // // Build SVGGraphics2D with our customized context // SVGGraphics2D g2d = new SVGGraphics2D(ctx, false); // Append our stylesheet to the top level group. topLevelGroup = g2d.getTopLevelGroup(); Element style = domFactory.createElementNS(SVG_NAMESPACE_URI, SVG_STYLE_TAG); style.setAttributeNS(null, SVG_TYPE_ATTRIBUTE, "text/css"); style.appendChild(styleSheet); topLevelGroup.appendChild(style); return g2d; } protected void configureSVGGraphics2D(SVGGraphics2D g2d) { topLevelGroup.appendChild(g2d.getTopLevelGroup()); g2d.setTopLevelGroup(topLevelGroup); } }