view flys-artifacts/src/main/java/de/intevation/flys/exports/NormalizedReferenceCurveGenerator.java @ 2278:08bb95e1fc41

"Bezugslinienverfahren": Fetch axis types from call context. flys-artifacts/trunk@3937 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 06 Feb 2012 15:57:31 +0000
parents 3f3e4f94171b
children 094b4abde10e
line wrap: on
line source
package de.intevation.flys.exports;

import org.w3c.dom.Document;

import java.awt.Font;

import org.apache.log4j.Logger;

import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.title.TextTitle;

import org.jfree.data.xy.XYSeries;

import de.intevation.artifactdatabase.state.ArtifactAndFacet;

import de.intevation.flys.artifacts.model.FacetTypes;
import de.intevation.flys.artifacts.model.WW;
import de.intevation.flys.artifacts.model.WW.ApplyFunctionIterator;
import de.intevation.flys.artifacts.model.WWAxisTypes;

import de.intevation.flys.jfree.StyledXYSeries;


/**
 * An OutGenerator that generates reference curves.
 */
public class NormalizedReferenceCurveGenerator
extends      XYChartGenerator
implements   FacetTypes
{
    public static enum YAXIS {
        W_M(0),
        W_CM(1);

        public int idx;
        private YAXIS(int c) {
           idx = c;
        }
    }

    /** House logger. */
    private static Logger logger =
        Logger.getLogger(NormalizedReferenceCurveGenerator.class);

    public static final String I18N_CHART_TITLE =
        "chart.reference.curve.title";

    public static final String I18N_CHART_SUBTITLE =
        "chart.reference.curve.subtitle";

    public static final String W_CM_DEFAULT =
        "chart.reference.curve.wcm";

    public static final String W_NNM_DEFAULT =
        "chart.reference.curve.wnn";

    public static final String START_GAUGE =
        "chart.reference.curve.start_at_gauge";

    public static final String START_FREE =
        "chart.reference.curve.start_free";

    /*

    public static final String I18N_XAXIS_LABEL =
        "chart.reference.curve.xaxis.label";

    public static final String I18N_YAXIS_LABEL =
        "chart.reference.curve.yaxis.label";
*/
/*
    public static final String I18N_XAXIS_LABEL_DEFAULT  =
        "W [NN + m]";

    public static final String I18N_YAXIS_LABEL_DEFAULT  =
        "W [NN + m]";
    */


    public static final String I18N_CHART_TITLE_DEFAULT  =
        "Bezugslinie";


    public NormalizedReferenceCurveGenerator() {
        super();
    }


    /**
     * Create Axis for given index.
     * @return axis with according internationalized label.
     */
    @Override
    protected NumberAxis createYAxis(int index) {
        Font labelFont = new Font("Tahoma", Font.BOLD, 14);
        String label   = getYAxisLabel(index);

        NumberAxis axis = createNumberAxis(index, label);
        // TODO aspect-ratio settings.
        if (index == YAXIS.W_M.idx) {
            axis.setAutoRangeIncludesZero(false);
        }
        axis.setLabelFont(labelFont);
        return axis;
    }


    /** Get default chart title. */
    @Override
    protected String getDefaultChartTitle() {
        return msg(I18N_CHART_TITLE, I18N_CHART_TITLE_DEFAULT);
    }

    @Override
    protected String getDefaultChartSubtitle() {
        Object[] args = new Object[] {
            getRiverName(),
        };

        return msg(I18N_CHART_SUBTITLE, "", args);
    }


    @Override
    protected void addSubtitles(JFreeChart chart) {
        String subtitle = getChartSubtitle();

        if (subtitle != null && subtitle.length() > 0) {
            chart.addSubtitle(new TextTitle(subtitle));
        }
    }


    /** Get Label for X-axis (W). */
    @Override
    protected String getDefaultXAxisLabel() {
        // TODO i18nreturn msg(I18N_XAXIS_LABEL, I18N_XAXIS_LABEL_DEFAULT);
        // at_gauge + w_cm
        return "W am Bezugsort- oder Pegel.";
    }


    /**
     * Get Label for primary and other Y Axes.
     * @param index Axis-Index (0-based).
     */
    @Override
    protected String getDefaultYAxisLabel(int index) {
        String label = "default";
        if (index == YAXIS.W_M.idx) {
            //label = msg(I18N_YAXIS_LABEL, I18N_YAXIS_LABEL_DEFAULT);
            //TODO i18n 
            return "W am Zielort";
        }
        else if (index == YAXIS.W_CM.idx) {
            return "W am Zielpegel";
        }

        return label;
    }


    /**
     * Called for each facet/them in the out mapped to this generator.
     * @param artifactFacet artifact and facet for this theme.
     * @param theme         styling info.
     * @param visible       Whether or not the theme is visible.
     */
    @Override
    public void doOut(
        ArtifactAndFacet artifactFacet,
        Document         theme,
        boolean          visible
    ) {
        String name = artifactFacet.getFacetName();

        logger.debug("NormalizedReferenceCurveGenerator.doOut: " + name);

        if (name == null || name.length() == 0) {
            logger.error("No facet given. Cannot create dataset.");
            return;
        }

        if (name.equals(REFERENCE_CURVE_NORMALIZED)) {
            doReferenceOut(artifactFacet.getData(context), theme, visible);
        }
        else {
            logger.warn("Unknown facet name: " + name);
            return;
        }
    }


    /** Register DataSeries with (maybe transformed) points. */
    public void doReferenceOut(
        Object   data,
        Document theme,
        boolean  visible
    ) {
        WW ww = (WW)data;

        Object obj = context.getContextValue("reference.curve.axis.scale");

        WWAxisTypes wwat = obj instanceof WWAxisTypes
            ? (WWAxisTypes)obj
            : new WWAxisTypes(ww);

        ApplyFunctionIterator iter = wwat.transform(ww, true);

        XYSeries series = new StyledXYSeries(
            ww.getName(), false, theme);

        double [] values = new double[2];

        while (iter.hasNext()) {
            iter.next(values);
            series.add(values[0], values[1], false);
        }

        if (ww.endAtGauge()) {
            addAxisSeries(series, YAXIS.W_M.idx, visible);
        }
        else {
            addAxisSeries(series, YAXIS.W_CM.idx, visible);
        }
    }


    /** Get Walker to iterate over all axes. */
    @Override
    protected YAxisWalker getYAxisWalker() {
        return new YAxisWalker() {
            /** Get number of items. */
            @Override
            public int length() {
                return YAXIS.values().length;
            }

            /** Get identifier for this index. */
            @Override
            public String getId(int idx) {
                YAXIS[] yaxes = YAXIS.values();
                return yaxes[idx].toString();
            }
        };
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org