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: }