Package com.mobiletheatertech.plot

Source Code of com.mobiletheatertech.plot.Draw

package com.mobiletheatertech.plot;

import org.apache.batik.dom.GenericDOMImplementation;
import org.apache.batik.svggen.SVGGraphics2D;
import org.w3c.dom.DOMImplementation;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;

import java.awt.*;
import java.io.FileWriter;
import java.io.Writer;

/**
* Manage the Graphics2D canvas that is drawn to. An SVG file may be generated.
*
* @author dhs
* @since 0.0.1
*/
public class Draw extends SvgElement {

    private Document document = null;
    private SVGGraphics2D svgGenerator = null;
    private Element root = null;
    private String namespace;

//    private SvgElement svgRoot = null;

    /**
     * Create a Document and an SVGGraphics2D canvas on which to draw.
     */
    public Draw() {
        super( null );

        // Get a DOMImplementation.
        DOMImplementation domImpl =
                GenericDOMImplementation.getDOMImplementation();

        // create an instance of org.w3c.dom.Document.
        namespace = "http://www.w3.org/2000/svg";
        document = domImpl.createDocument( namespace, "svg", null );

        // create an instance of the SVG Generator.
        svgGenerator = new SVGGraphics2D( document );
    }

    /**
     * Provide the canvas to be drawn on.
     *
     * @return canvas
     */
    public Graphics2D canvas() {
        return svgGenerator;
    }

    /**
     * Provide the document to be worked with.
     *
     * @return document
     */
    public Document document() {
        return document;
    }

    /**
     * Provide the root of the document.
     *
     * @return document root
     */
    public Element root() {
        return root;
    }

//    /**
//     * Provide the root of the document.
//     *
//     * @return document root
//     */
//    public SvgElement svgRoot() {
//        return svgRoot;
//    }

    /**
     * Create a new element in this document.
     *
     * @param type Type of element to be created
     * @return created element
     */
    public SvgElement element(String type) {
        return new SvgElement( document.createElementNS( namespace, type ) );
    }

    /**
     * Write the generated SVG to the specified file.
     *
     * @param pathname pathname of file for generated SVG
     */
    public void create( String pathname ) {

//        System.out.println( "In create. Pathname: " + pathname );
        // Finally, stream out SVG to the specified pathname
//        boolean useCSS = true; // we want to use CSS style attributes
        try {
            Writer out = new FileWriter( pathname );

            /*
             * Per http://osdir.com/ml/text.xml.batik.user/2003-01/msg00121.html
             * getting the root element from the SVGGraphics2D object resets
             * SVGGraphics2D, so we have to make sure we generate the stream
             * from the root that we grabbed.
             */
            svgGenerator.stream( root, out );//, useCSS );
        }
        catch ( Exception e ) {
//            System.err.println( e.toString() );
        }
    }

    /**
     * Extract the root of the generated SVG DOM.
     * <p/>
     * Getting the root element from the SVGGraphics2D object resets SVGGraphics2D, so all of the
     * drawing must be done before this method is invoked and all of the non-drawing modifications
     * to the DOM should be done after this.
     */
    public void establishRoot() {
        root = svgGenerator.getRoot();
//        svgRoot = new SvgElement( root );
        element = root;
    }

    /**
     * Set the document title to the specified string.
     *
     * @param title New document title
     */
    void setDocumentTitle( String title ) {
        Node first = root.getFirstChild();
        Element titleElement = document.createElement( "title" );
        titleElement.appendChild( document.createTextNode( title ) );
        root.insertBefore( titleElement, first );
    }

    /**
     * Insert an element just after the first one under the document root.
     *
     * @param element Element to be inserted
     */
    void insertRootChild( SvgElement element ) {
        Node second = root.getFirstChild().getNextSibling();
        root.insertBefore( element.element(), second );
    }

    /**
     * Add an element directly under the document root.
     *
     * @param element Element to be added
     */
    void appendRootChild( SvgElement element ) {
        root.appendChild( element.element() );
    }

    // TODO Get rid of this.
    /**
     * Add an element directly under the document root.
     *
     * @param element Element to be added
     */
    void appendRootChild( Element element ) {
        root.appendChild( element );
    }

    @Override
    public void appendChild( SvgElement element ) {
        appendRootChild( element );
    }
}
TOP

Related Classes of com.mobiletheatertech.plot.Draw

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.