teichmann@5863: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
teichmann@5863: * Software engineering by Intevation GmbH
teichmann@5863: *
teichmann@5994: * This file is Free Software under the GNU AGPL (>=v3)
teichmann@5863: * and comes with ABSOLUTELY NO WARRANTY! Check out the
teichmann@5994: * documentation coming with Dive4Elements River for details.
teichmann@5863: */
teichmann@5863:
teichmann@5831: package org.dive4elements.river.jfree;
ingo@2074:
gernotbelger@9555: import java.awt.Shape;
rrenkert@7891: import java.util.Map;
ingo@2074:
gernotbelger@9555: import org.dive4elements.artifactdatabase.state.Facet;
rrenkert@7891: import org.dive4elements.artifacts.Artifact;
rrenkert@7891: import org.dive4elements.artifacts.CallContext;
rrenkert@7891: import org.dive4elements.river.artifacts.D4EArtifact;
rrenkert@7891: import org.dive4elements.river.artifacts.access.RiverAccess;
rrenkert@7891: import org.dive4elements.river.artifacts.resources.Resources;
gernotbelger@9555: import org.dive4elements.river.model.River;
teichmann@6905: import org.dive4elements.river.themes.ThemeDocument;
gernotbelger@9555: import org.jfree.chart.LegendItem;
ingo@2074: import org.jfree.data.xy.XYSeries;
ingo@2074:
ingo@2074: /**
ingo@2321: * @author Ingo Weinzierl
ingo@2074: */
gernotbelger@9555: public class StyledXYSeries extends XYSeries implements StyledSeries, HasLabel, XYMetaDataset {
ingo@2074:
gernotbelger@9555: private static final long serialVersionUID = 1L;
ingo@2074:
gernotbelger@9555: private final Style style;
ingo@2321:
felix@2652: /** If this Series is to be labelled, use this String as label. */
gernotbelger@9555: private String label;
felix@2652:
rrenkert@7891: /** The meta data for this series. */
gernotbelger@9555: private Map metaData;
ingo@2074:
gernotbelger@9555: /**
gernotbelger@9555: * A 'type' that allows to categorize themes by it. Tyically this is simply the facet-name of the originating
gernotbelger@9555: * {@link Facet}.
gernotbelger@9555: * REMARK: stictly there should be a type per dataset, not per series, but flys uses (for line themes) generic datasets
gernotbelger@9555: * with one series.
gernotbelger@9555: */
gernotbelger@9555: private final String themeType;
gernotbelger@9555:
gernotbelger@9555: public StyledXYSeries(final String facetName, final String key, final ThemeDocument theme) {
gernotbelger@9555: this(facetName, key, true, theme, (Shape) null);
ingo@2074: }
sascha@3160:
gernotbelger@9555: public StyledXYSeries(final String facetName, final String key, final boolean sorted, final ThemeDocument theme) {
gernotbelger@9555: this(facetName, key, sorted, theme, (Shape) null);
christian@3155: }
ingo@2074:
gernotbelger@9555: public StyledXYSeries(final String facetName, final String key, final ThemeDocument theme, final Shape shape) {
gernotbelger@9555: this(facetName, key, true, theme, shape);
sascha@7541: }
ingo@2074:
ingo@2074: /**
gernotbelger@9555: * @param sorted
gernotbelger@9555: * whether or not to sort the points. Sorting will move NANs
gernotbelger@9555: * to one extrema which can cause problems in certain
gernotbelger@9555: * algorithms.
ingo@2074: */
gernotbelger@9555: public StyledXYSeries(final String facetName, final String key, final boolean sorted, final ThemeDocument theme, final Shape shape) {
ingo@2074: super(key, sorted);
gernotbelger@9555:
gernotbelger@9555: this.style = new XYStyle(theme, shape);
felix@2652: this.label = key.toString();
gernotbelger@9555: this.themeType = facetName;
ingo@2074: }
ingo@2074:
gernotbelger@9555: public StyledXYSeries(final String themeType, final String key, final boolean sorted, final boolean allowDuplicateXValues, final ThemeDocument theme) {
gernotbelger@9555: this(themeType, key, sorted, allowDuplicateXValues, theme, (Shape) null);
sascha@7541: }
sascha@7541:
gernotbelger@9555: public StyledXYSeries(final String themeType, final String key, final boolean sorted, final boolean allowDuplicateXValues, final ThemeDocument theme,
gernotbelger@9555: final Shape shape) {
teichmann@6876: super(key, sorted, allowDuplicateXValues);
gernotbelger@9555:
gernotbelger@9555: this.style = new XYStyle(theme, shape);
teichmann@6876: this.label = key.toString();
gernotbelger@9555: this.themeType = themeType;
teichmann@6876: }
teichmann@6876:
ingo@2321: @Override
gernotbelger@9555: public String getThemeType() {
gernotbelger@9555: return this.themeType;
ingo@2076: }
ingo@2076:
ingo@2321: @Override
ingo@2321: public Style getStyle() {
gernotbelger@9555: return this.style;
ingo@2074: }
felix@2652:
felix@2652: @Override
felix@2652: public String getLabel() {
gernotbelger@9555: return this.label;
felix@2652: }
felix@2652:
felix@2652: @Override
gernotbelger@9555: public void setLabel(final String label) {
felix@2652: this.label = label;
felix@2652: }
sascha@3160:
rrenkert@7891: @Override
rrenkert@7891: public Map getMetaData() {
gernotbelger@9555: return this.metaData;
rrenkert@7891: }
rrenkert@7891:
rrenkert@7891: @Override
gernotbelger@8853: // FIXME: bad! method with undocumented side-effects; given metadata will be changed inline
gernotbelger@9555: public void putMetaData(final Map metaData, final Artifact artifact, final CallContext context) {
rrenkert@7891: this.metaData = metaData;
gernotbelger@9555: final River river = new RiverAccess((D4EArtifact) artifact).getRiver();
tom@8287: String rivername = "";
tom@8287: String unit = "";
tom@8287: if (river != null) {
tom@8287: rivername = river.getName();
gernotbelger@8853: // FIXME: this will always return the wst unit, regardless if the series is a water level or not!
gernotbelger@9555: unit = river.getWstUnit().getName();
tom@8287: }
rrenkert@7891: if (metaData.containsKey("X")) {
gernotbelger@9555: this.metaData.put("X", Resources.getMsg(context.getMeta(), metaData.get("X"), new Object[] { rivername }));
rrenkert@7891: }
rrenkert@7891: if (metaData.containsKey("Y")) {
gernotbelger@9555: this.metaData.put("Y", Resources.getMsg(context.getMeta(), metaData.get("Y"), new Object[] { unit }));
rrenkert@7891: }
rrenkert@7891: }
gernotbelger@9555:
gernotbelger@9555: @Override
gernotbelger@9555: public void applyAggregatedLegendTheme(final LegendItem item, final ThemeDocument theme) {
gernotbelger@9555: this.style.applyAggregatedLegendTheme(item, theme);
gernotbelger@9555: }
gernotbelger@9555: }