view flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/QWSeriesCollection.java @ 3785:a5f65e8983be

Merged revisions 5501-5502,5504-5508,5511-5513,5516-5519 via svnmerge from file:///home/clients/bsh/bsh-generischer-viewer/Material/SVN/flys-artifacts/trunk ........ r5501 | felix | 2012-09-18 11:49:45 +0200 (Di, 18 Sep 2012) | 1 line fix issue865 - missing showarea theme prop. ........ r5502 | clins | 2012-09-18 12:18:30 +0200 (Di, 18 Sep 2012) | 1 line Add robustness checks to prevent NPEs ........ r5504 | felix | 2012-09-18 14:03:15 +0200 (Di, 18 Sep 2012) | 1 line i18n for area label (fix issue487). ........ r5505 | clins | 2012-09-18 16:19:59 +0200 (Di, 18 Sep 2012) | 1 line Update themes to show point descriptions ........ r5506 | rrenkert | 2012-09-18 17:00:30 +0200 (Di, 18 Sep 2012) | 3 lines Removed incorrect characteristic diameter. ........ r5507 | rrenkert | 2012-09-18 17:03:20 +0200 (Di, 18 Sep 2012) | 3 lines Fixed some stupid bugs in bed quality data factory and calculation. ........ r5508 | teichmann | 2012-09-18 17:45:49 +0200 (Di, 18 Sep 2012) | 1 line The usual whitespace and import cleanups. ........ r5511 | teichmann | 2012-09-18 18:24:51 +0200 (Di, 18 Sep 2012) | 1 line Use generics aware Collections.emptyList(). ........ r5512 | teichmann | 2012-09-18 20:36:52 +0200 (Di, 18 Sep 2012) | 1 line Some more little steps towards "Auslagerung extremer Wasserspiegellagen". ........ r5513 | clins | 2012-09-18 23:38:19 +0200 (Di, 18 Sep 2012) | 1 line A and B facets of fix analyis are now deactivated by default ........ r5516 | bricks | 2012-09-19 10:45:51 +0200 (Mi, 19 Sep 2012) | 2 lines Add the gauge station to the GaugeOverviewInfoService xml response ........ r5517 | rrenkert | 2012-09-19 10:50:23 +0200 (Mi, 19 Sep 2012) | 3 lines Added CSV export to bed quality calculation. ........ r5518 | bricks | 2012-09-19 11:04:04 +0200 (Mi, 19 Sep 2012) | 2 lines Fix date in changelog entry ........ r5519 | teichmann | 2012-09-19 11:17:14 +0200 (Mi, 19 Sep 2012) | 1 line Removed trailing whitespace. ........ flys-artifacts/tags/2.9.1@5531 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Wed, 19 Sep 2012 14:58:31 +0000
parents e727e3ebdf85
children
line wrap: on
line source
package de.intevation.flys.artifacts.services;

import de.intevation.flys.artifacts.model.fixings.QWI;

import de.intevation.flys.java2d.ShapeUtils;

import de.intevation.flys.jfree.ShapeRenderer;

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Paint;
import java.awt.Shape;

import java.awt.geom.Rectangle2D;

import java.text.DateFormat;
import java.text.SimpleDateFormat;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.jfree.chart.LegendItem;
import org.jfree.chart.LegendItemCollection;

import org.jfree.chart.labels.XYItemLabelGenerator;

import org.jfree.chart.renderer.xy.StandardXYItemRenderer;

import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYSeries;
import org.jfree.data.xy.XYSeriesCollection;

public class QWSeriesCollection
extends      XYSeriesCollection
implements   XYItemLabelGenerator
{
    public interface LabelGenerator {
        String createLabel(QWI qw);
    } // interface LabelGenerator

    public static class DateFormatLabelGenerator
    implements          LabelGenerator
    {
        protected DateFormat format;

        public DateFormatLabelGenerator() {
            this("dd.MM.yyyy");
        }

        public DateFormatLabelGenerator(String format) {
            this(new SimpleDateFormat(format));
        }

        public DateFormatLabelGenerator(DateFormat format) {
            this.format = format;
        }

        @Override
        public String createLabel(QWI qw) {
            Date date = qw.getDate();
            return date != null ? format.format(date) : "";
        }
    } // class DateFormatLabelGenerator

    public static final LabelGenerator SIMPLE_GENERATOR =
        new DateFormatLabelGenerator();

    protected Date minDate;
    protected Date maxDate;

    protected List<List<QWI>> labels;

    protected Rectangle2D area;

    protected LabelGenerator labelGenerator;

    protected Map<ShapeRenderer.Entry, Integer> knownShapes =
        new HashMap<ShapeRenderer.Entry, Integer>();

    public QWSeriesCollection() {
        labels = new ArrayList<List<QWI>>();
        labelGenerator = SIMPLE_GENERATOR;
    }

    public QWSeriesCollection(LabelGenerator labelGenerator) {
        this();
        this.labelGenerator = labelGenerator;
    }

    protected static ShapeRenderer.Entry classify(QWI qw) {
        boolean interpolated = qw.getInterpolated();

        Shape shape = interpolated
            ? ShapeUtils.INTERPOLATED_SHAPE
            : ShapeUtils.MEASURED_SHAPE;

        boolean filled = !interpolated;
        Color color = Color.blue;

        return new ShapeRenderer.Entry(shape, color, filled);
    }

    public void add(QWI qw) {

        ShapeRenderer.Entry key = classify(qw);

        Integer seriesNo = knownShapes.get(key);

        XYSeries series;

        if (seriesNo == null) {
            seriesNo = Integer.valueOf(getSeriesCount());
            knownShapes.put(key, seriesNo);
            series = new XYSeries(seriesNo, false);
            addSeries(series);
            labels.add(new ArrayList<QWI>());
        }
        else {
            series = getSeries(seriesNo);
        }

        series.add(qw.getQ(), qw.getW());

        labels.get(seriesNo).add(qw);

        extendDateRange(qw);
        extendArea(qw);
    }

    protected void extendDateRange(QWI qw) {
        Date date = qw.getDate();
        if (date != null) {
            if (minDate == null) {
                minDate = maxDate = date;
            }
            else {
                if (date.compareTo(minDate) < 0) {
                    minDate = date;
                }
                if (date.compareTo(maxDate) > 0) {
                    maxDate = date;
                }
            }
        }
    }

    protected void extendArea(QWI qw) {
        if (area == null) {
            area = new Rectangle2D.Double(
                qw.getQ(), qw.getW(), 0d, 0d);
        }
        else {
            area.add(qw.getQ(), qw.getW());
        }
    }

    public Rectangle2D getArea() {
        return area;
    }

    public Date getMinDate() {
        return minDate;
    }

    public Date getMaxDate() {
        return maxDate;
    }

    public LabelGenerator getLabelGenerator() {
        return labelGenerator;
    }

    @Override
    public String generateLabel(XYDataset dataset, int series, int item) {
        return labelGenerator.createLabel(labels.get(series).get(item));
    }

    public StandardXYItemRenderer createRenderer() {
        StandardXYItemRenderer renderer = new ShapeRenderer(knownShapes);
        renderer.setBaseItemLabelGenerator(this);
        renderer.setBaseSeriesVisibleInLegend(false);
        renderer.setBaseItemLabelsVisible(true);
        return renderer;
    }

    public static final LegendItem legendItem(
        String  label,
        Paint   paint,
        Shape   shape,
        boolean filled
    ) {
        BasicStroke stroke = new BasicStroke();
        return new LegendItem(
            label,  // label
            null,   // description
            null,   // tooltip
            null,   // url
            true,   // shape visible
            shape,  // shape
            filled, // shape filled
            filled ? paint : Color.white, // fill paint
            true,   // shape outline
            paint,  // outline paint
            stroke, // outline stroke
            false,  // line visible
            shape,  // line
            stroke, // line stroke
            Color.white);
    }

    public void addLegendItems(
        LegendItemCollection         lic,
        ShapeRenderer.LabelGenerator lg
    ) {
        for (ShapeRenderer.Entry entry: knownShapes.keySet()) {
            lic.add(legendItem(
                lg.createLabel(entry),
                entry.getPaint(),
                entry.getShape(),
                entry.getFilled()));
        }
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org