view gnv-artifacts/src/main/java/de/intevation/gnv/chart/XMLChartTheme.java @ 507:45be952a3215

Solved some issues. Removed encoding problems while formatting coordinates (issue137) and use this format as subtitle in charts (issue136). gnv-artifacts/trunk@590 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Thu, 21 Jan 2010 14:42:51 +0000
parents 22a6493e8460
children 3d13fa281a7e
line wrap: on
line source
package de.intevation.gnv.chart;

import java.awt.Font;
import java.awt.Color;
import java.awt.geom.Ellipse2D;
import java.lang.NumberFormatException;

import org.apache.log4j.Logger;

import org.jfree.chart.StandardChartTheme;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.ui.RectangleInsets;
import org.jfree.util.UnitType;


import org.w3c.dom.Document;

import de.intevation.artifactdatabase.Config;

/**
 * @author Ingo Weinzierl <ingo.weinzierl@intevation.de>
 */
public class XMLChartTheme
extends      StandardChartTheme
{
    private static final Color DEFAULT_COLOR = Color.BLACK;

    private Logger log = Logger.getLogger(XMLChartTheme.class);

    protected boolean domainCrosshairVisible;
    protected boolean rangeCrosshairVisible;
    protected boolean renderLines;
    protected boolean renderShapes;

    protected int pointWidth;
    protected int pointHeight;


    public XMLChartTheme(String name) {
        super(name);
    }


    public void setDomainCrosshairVisible(boolean visible) {
        this.domainCrosshairVisible = visible;
    }


    public boolean getDomainCrosshairVisible() {
        return domainCrosshairVisible;
    }


    public boolean getRangeCrosshairVisible() {
        return rangeCrosshairVisible;
    }


    public void setRangeCrosshairVisible(boolean visible) {
        this.rangeCrosshairVisible = visible;
    }


    public void applyXMLConfiguration(Document document) {
        log.debug("create XMLChartTheme");

        init(document);
    }


    private void init(Document document) {
        log.debug("init XMLChartTheme parameters");

        initChartParameters(document);
        initTitleParameters(document);
        initSubtitleParameters(document);
        initPlotParameters(document);
        initAxisParameters(document);
        initLegendParameters(document);
        initRenderer(document);
    }


    private void initTitleParameters(Document document) {
        log.debug("init title parameters.");

        int     size  = getInt(document, "theme/title/font/size/@value");
        String  type  = getString(document, "theme/title/font/type/@value");
        boolean bold  = getBool(document, "theme/title/font/bold/@value");

        setExtraLargeFont(createFont(type, size, bold));

        String color = getString(document, "theme/title/font/color/@value");
        Color  c     = decodeColor(color);
        if (c != null)
            setTitlePaint(c);
    }


    private void initSubtitleParameters(Document document) {
        log.debug("init title parameters.");

        int     size  = getInt(document, "theme/subtitle/font/size/@value");
        String  type  = getString(document, "theme/subtitle/font/type/@value");
        boolean bold  = getBool(document, "theme/subtitle/font/bold/@value");

        setLargeFont(createFont(type, size, bold));

        String col  = getString(document, "theme/subtitle/font/color/@value");
        setSubtitlePaint(Color.decode(col));
    }


    private void initChartParameters(Document document) {
        log.debug("init chart parameters.");

        String bg = getString(document, "theme/chart/background/color/@value");
        Color  c  = decodeColor(bg);
        if (c != null)
            setChartBackgroundPaint(c);
    }


    private void initPlotParameters(Document document) {
        log.debug("init plot parameters.");

        String tmp = null;
        tmp        = getString(document, "theme/plot/background/color/@value");
        Color  c   = decodeColor(tmp);
        if (c != null)
            setPlotBackgroundPaint(c);

        tmp = getString(document, "theme/plot/outline/color/@value");
        c   = decodeColor(tmp);
        if (c != null)
            setPlotOutlinePaint(c);

        tmp = getString(document, "theme/plot/domaingridline/color/@value");
        c   = decodeColor(tmp);
        if (c != null)
            setDomainGridlinePaint(c);

        tmp = getString(document, "theme/plot/rangegridline/color/@value");
        c   = decodeColor(tmp);
        if (c != null)
            setRangeGridlinePaint(c);

        boolean rangeCrosshairVisible = getBool(
            document, "theme/plot/rangecrosshair/visible/@value");
        setRangeCrosshairVisible(rangeCrosshairVisible);

        boolean domainCrosshairVisible = getBool(
            document, "theme/plot/domaincrosshair/visible/@value");
        setDomainCrosshairVisible(domainCrosshairVisible);

        int top    = getInt(document, "theme/plot/offset/top/@value");
        int bottom = getInt(document, "theme/plot/offset/bottom/@value");
        int left   = getInt(document, "theme/plot/offset/left/@value");
        int right  = getInt(document, "theme/plot/offset/right/@value");
        setAxisOffset(new RectangleInsets(
            UnitType.RELATIVE,
            top, left, bottom, right)
        );
    }


    private void initAxisParameters(Document document) {
        log.debug("init axis parameters.");

        String tmp = null;
        tmp        = getString(document, "theme/axis/label/color/@value");
        Color c    = decodeColor(tmp);
        if (c != null)
            setAxisLabelPaint(c);

        tmp = getString(document, "theme/axis/ticklabel/color/@value");
        c   = decodeColor(tmp);
        if (c != null)
            setTickLabelPaint(c);
    }


    private void initLegendParameters(Document document) {
        log.debug("init legend parameters.");

        String tmp = null;
        tmp        = getString(document, "theme/legend/font/color/@value");
        Color c    = decodeColor(tmp);
        if (c != null)
            setLegendItemPaint(c);

        tmp = getString(document, "theme/legend/background/color/@value");
        c   = decodeColor(tmp);
        if (c != null)
            setLegendBackgroundPaint(c);
    }


    private void initRenderer(Document document) {
        log.debug("init renderer parameters.");

        pointWidth  = getInt(document, "theme/plot/itemrenderer/width/@value");
        log.debug("Read point width of " + pointWidth);
        pointHeight = getInt(document, "theme/plot/itemrenderer/height/@value");
        log.debug("Read point height of " + pointHeight);
        renderLines = getBool(
            document, "theme/plot/itemrenderer/renderLines/@value"
        );
        renderShapes = getBool(
            document, "theme/plot/itemrenderer/renderPoints/@value"
        );
    }


    private static String getString(Document document, String xpath) {
        return Config.getStringXPath(document, xpath);
    }


    private static int getInt(Document document, String xpath) {
        String tmp = getString(document, xpath);

        if (tmp != null)
            return Integer.parseInt(tmp);
        else
            return 0;
    }


    private static boolean getBool(Document document, String xpath) {
        String tmp = getString(document, xpath);

        if (tmp != null)
            return Boolean.parseBoolean(tmp);
        else
            return false;
    }


    protected Color decodeColor(String color) {
        try {
            if (color == null)
                return null;

            return Color.decode(color);
        }
        catch (NumberFormatException nfe) {
            log.warn("Error while parsing color: " + color, nfe);
        }

        return null;
    }


    protected Font createFont(String type, int size, boolean bold) {
        Font font = null;
        if (bold)
            font = new Font(type, Font.BOLD, size);
        else
            font = new Font(type, Font.PLAIN, size);

        return font;
    }


    protected void applyToXYPlot(XYPlot plot) {
        log.debug("apply theme parameter to XYPlot");

        super.applyToXYPlot(plot);
        plot.setDomainCrosshairVisible(this.domainCrosshairVisible);
        plot.setRangeCrosshairVisible(this.rangeCrosshairVisible);

        applyToXYLineAndShapeRenderer(plot);
    }


    protected void applyToXYLineAndShapeRenderer(XYPlot plot) {
        if (plot == null)
            return;

        XYLineAndShapeRenderer renderer =
            (XYLineAndShapeRenderer) plot.getRenderer();

        Ellipse2D.Double point = new Ellipse2D.Double(
            -(pointWidth/2), -(pointHeight/2), pointWidth, pointHeight
        );

        renderer.setSeriesShape(0, point);
        renderer.setSeriesShapesVisible(0, renderShapes);
        renderer.setSeriesLinesVisible(0, renderLines);

        plot.setRenderer(renderer);
    }
}

http://dive4elements.wald.intevation.org