view flys-artifacts/src/main/java/de/intevation/flys/jfree/XYStyle.java @ 5645:696d710470f5

flys/issue1077: Show loads as step line, therefore transform data in SedimentLoadFacet to stretch as in the measurement stations bounds. Deal with this new kind of data in the Generator.
author Felix Wolfsteller <felix.wolfsteller@intevation.de>
date Wed, 10 Apr 2013 09:35:07 +0200
parents 0b9b2a0c4e64
children
line wrap: on
line source
package de.intevation.flys.jfree;

import de.intevation.flys.utils.ThemeUtil;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.geom.Ellipse2D;

import org.apache.log4j.Logger;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.w3c.dom.Document;


/**
 * Utility to apply theme-settings to a renderer.
 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
 */
public class XYStyle implements Style {

    private static Logger logger = Logger.getLogger(XYStyle.class);

    protected Document theme;

    protected XYLineAndShapeRenderer renderer;


    public XYStyle(Document theme) {
        this.theme = theme;
        this.renderer = null;
    }


    /**
     * Applies line color, size and type attributes to renderer, also
     * whether to draw lines and/or points.
     */
    @Override
    public XYLineAndShapeRenderer applyTheme(XYLineAndShapeRenderer r, int idx){
        this.renderer = r;
        applyLineColor(r, idx);
        applyLineSize(r, idx);
        applyLineType(r, idx);
        applyShowLine(r, idx);
        applyShowPoints(r, idx);
        applyPointSize(r, idx);
        applyPointColor(r, idx);
        applyShowMinimum(r, idx);
        applyShowMaximum(r, idx);

        // Line label styles
        applyShowLineLabel(r, idx);
        applyShowLineLabelBG(r, idx);
        applyLineLabelFont(r, idx);
        applyLineLabelColor(r, idx);
        applyLineLabelBGColor(r, idx);

        // Point label styles
        // TODO: Currently point label are annotations and are not drawn this way
        /*
        applyShowPointLabelBG(r, idx);
        applyLinePointFont(r, idx);
        applyLinePointColor(r, idx);
        applyLinePointBGColor(r, idx);*/

        return r;
    }


    /** Set line color to renderer. */
    protected void applyLineColor(XYLineAndShapeRenderer r, int idx) {
        Color c = ThemeUtil.parseLineColorField(theme);
        if(c != null) {
            logger.debug("applyLineColor " + c.toString());
            r.setSeriesPaint(idx, c);
        }
        else {
            logger.warn("applyLineColor: color is null - malformed linecolor field?");
        }
    }


    /** Tells the renderer whether or not to add a label to a line. */
    protected void applyShowLineLabel(XYLineAndShapeRenderer r, int idx) {
        if (!(r instanceof EnhancedLineAndShapeRenderer)) {
            return;
        }
        boolean showLabelLine = ThemeUtil.parseShowLineLabel(theme);
        boolean anyLabel = showLabelLine || ThemeUtil.parseShowWidth(theme) ||
                           ThemeUtil.parseShowLevel(theme) ||
                           ThemeUtil.parseShowMiddleHeight(theme);
        ((EnhancedLineAndShapeRenderer)r).setShowLineLabel(anyLabel, idx);
    }


    /** Tells the renderer whether or not to fill the bg of a lines label. */
    protected void applyShowLineLabelBG(XYLineAndShapeRenderer r, int idx) {
        if (!(r instanceof EnhancedLineAndShapeRenderer)) {
            return;
        }
        boolean showLabelLine = ThemeUtil.parseLabelShowBackground(theme);
        ((EnhancedLineAndShapeRenderer)r).setShowLineLabelBG(idx, showLabelLine);
    }

    /** Tell the renderer which font (and -size and -style) to use for
     * linelabels. */
    protected void applyLineLabelFont(XYLineAndShapeRenderer r, int idx) {
        if (!(r instanceof EnhancedLineAndShapeRenderer)) {
            return;
        }
        ((EnhancedLineAndShapeRenderer)r).setLineLabelFont(
                ThemeUtil.parseTextFont(theme), idx);
    }

    /** Tell the renderer which color to use for
     * linelabels. */
    protected void applyLineLabelColor(XYLineAndShapeRenderer r, int idx) {
        if (!(r instanceof EnhancedLineAndShapeRenderer)) {
            return;
        }
        ((EnhancedLineAndShapeRenderer)r).setLineLabelTextColor(
                idx, ThemeUtil.parseTextColor(theme));
    }

    /** Tell the renderer which color to use for bg of
     * linelabels. */
    protected void applyLineLabelBGColor(XYLineAndShapeRenderer r, int idx) {
        if (!(r instanceof EnhancedLineAndShapeRenderer)) {
            return;
        }
        ((EnhancedLineAndShapeRenderer)r).setLineLabelBGColor(idx,
            ThemeUtil.parseTextBackground(theme));
    }

    /** Set stroke of series. */
    protected void applyLineSize(XYLineAndShapeRenderer r, int idx) {
        int size = ThemeUtil.parseLineWidth(theme);
        r.setSeriesStroke(
            idx,
            new BasicStroke(size));
    }


    /** Set stroke strength of series. */
    protected void applyLineType(XYLineAndShapeRenderer r, int idx) {
        int size = ThemeUtil.parseLineWidth(theme);
        float[] dashes = ThemeUtil.parseLineStyle(theme);

        // Do not apply the dashed style.
        if (dashes.length <= 1) {
            return;
        }

        r.setSeriesStroke(
            idx,
            new BasicStroke(size,
                            BasicStroke.CAP_BUTT,
                            BasicStroke.JOIN_ROUND,
                            1.0f,
                            dashes,
                            0.0f));
    }


    protected void applyPointSize(XYLineAndShapeRenderer r, int idx) {
        int size = ThemeUtil.parsePointWidth(theme);
        int dim  = 2 * size;

        r.setSeriesShape(idx, new Ellipse2D.Double(-size, -size, dim, dim));
    }


    protected void applyPointColor(XYLineAndShapeRenderer r, int idx) {
        Color c = ThemeUtil.parsePointColor(theme);

        if (c != null) {
            r.setSeriesFillPaint(idx, c);
            r.setUseFillPaint(true);
            r.setDrawOutlines(false);
        }
    }


    /**
     * Sets form and visibility of points.
     */
    protected void applyShowPoints(XYLineAndShapeRenderer r, int idx) {
        boolean show = ThemeUtil.parseShowPoints(theme);

        r.setSeriesShapesVisible(idx, show);
        r.setDrawOutlines(true);
    }


    protected void applyShowLine(XYLineAndShapeRenderer r, int idx) {
        boolean show = ThemeUtil.parseShowLine(theme);
        r.setSeriesLinesVisible(idx, show);
    }


    protected void applyShowMinimum(XYLineAndShapeRenderer r, int idx) {
        if (!(r instanceof EnhancedLineAndShapeRenderer)) {
            return;
        }

        boolean visible = ThemeUtil.parseShowMinimum(theme);

        EnhancedLineAndShapeRenderer er = (EnhancedLineAndShapeRenderer) r;
        er.setIsMinimumShapeVisisble(idx, visible);
    }


    protected void applyShowMaximum(XYLineAndShapeRenderer r, int idx) {
        if (!(r instanceof EnhancedLineAndShapeRenderer)) {
            return;
        }

        boolean visible = ThemeUtil.parseShowMaximum(theme);

        EnhancedLineAndShapeRenderer er = (EnhancedLineAndShapeRenderer) r;
        er.setIsMaximumShapeVisible(idx, visible);
    }


    @Override
    public XYLineAndShapeRenderer getRenderer() {
        return this.renderer;
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org