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@2321: ingo@2321: import java.awt.BasicStroke; ingo@2321: import java.awt.Color; sascha@7541: import java.awt.Shape; ingo@2321: import java.awt.geom.Ellipse2D; ingo@2321: gernotbelger@9325: import org.dive4elements.river.themes.ThemeDocument; gernotbelger@9555: import org.jfree.chart.LegendItem; christian@3464: import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; ingo@2321: ingo@2321: /** felix@2648: * Utility to apply theme-settings to a renderer. gernotbelger@9325: * ingo@2321: * @author Ingo Weinzierl ingo@2321: */ gernotbelger@9325: public final class XYStyle implements Style { ingo@2321: gernotbelger@9325: private final ThemeDocument theme; ingo@2321: gernotbelger@9325: private XYLineAndShapeRenderer renderer; sascha@7541: gernotbelger@9325: private final Shape shape; christian@3155: gernotbelger@9325: public XYStyle(final ThemeDocument theme) { gernotbelger@9325: this(theme, null); ingo@2321: } ingo@2321: gernotbelger@9325: public XYStyle(final ThemeDocument theme, final Shape shape) { sascha@7541: this.theme = theme; sascha@7541: this.shape = shape; sascha@7541: } sascha@7541: ingo@2321: /** ingo@2321: * Applies line color, size and type attributes to renderer, also ingo@2321: * whether to draw lines and/or points. ingo@2321: */ christian@3464: @Override gernotbelger@9325: public XYLineAndShapeRenderer applyTheme(final XYLineAndShapeRenderer r, final int idx) { sascha@7541: this.renderer = r; gernotbelger@9325: gernotbelger@9325: if (this.shape != null) gernotbelger@9325: r.setShape(this.shape); gernotbelger@9325: gernotbelger@9325: if (this.theme == null) aheinecke@7156: return r; gernotbelger@9325: ingo@2321: applyLineColor(r, idx); ingo@2321: applyLineSize(r, idx); ingo@2321: applyLineType(r, idx); ingo@2321: applyShowLine(r, idx); gernotbelger@9325: gernotbelger@9325: applyPointStyles(r, idx); gernotbelger@9325: ingo@2321: applyShowMinimum(r, idx); ingo@2321: applyShowMaximum(r, idx); christian@3464: christian@3464: // Line label styles felix@2648: applyShowLineLabel(r, idx); christian@3464: applyShowLineLabelBG(r, idx); felix@2656: applyLineLabelFont(r, idx); felix@2660: applyLineLabelColor(r, idx); felix@2660: applyLineLabelBGColor(r, idx); ingo@2321: christian@3464: // Point label styles tom@8856: // TODO: Currently point label are annotations and tom@8856: // are not drawn this way christian@3464: /* gernotbelger@9325: * applyShowPointLabelBG(r, idx); gernotbelger@9325: * applyLinePointFont(r, idx); gernotbelger@9325: * applyLinePointColor(r, idx); gernotbelger@9325: * applyLinePointBGColor(r, idx); gernotbelger@9325: */ christian@3464: ingo@2321: return r; ingo@2321: } ingo@2321: ingo@2321: /** Set line color to renderer. */ gernotbelger@9325: private void applyLineColor(final XYLineAndShapeRenderer r, final int idx) { gernotbelger@9325: final Color c = this.theme.parseLineColorField(); teichmann@7545: if (c != null) { christian@3155: r.setSeriesPaint(idx, c); christian@3155: } ingo@2321: } ingo@2321: felix@2648: /** Tells the renderer whether or not to add a label to a line. */ gernotbelger@9325: private void applyShowLineLabel(final XYLineAndShapeRenderer r, final int idx) { felix@2656: if (!(r instanceof EnhancedLineAndShapeRenderer)) { felix@2656: return; felix@2656: } gernotbelger@9325: final boolean showLabelLine = this.theme.parseShowLineLabel(); gernotbelger@9325: final boolean anyLabel = showLabelLine || this.theme.parseShowWidth() || this.theme.parseShowLevel() || this.theme.parseShowMiddleHeight(); gernotbelger@9325: ((EnhancedLineAndShapeRenderer) r).setShowLineLabel(anyLabel, idx); felix@2656: } felix@2656: gernotbelger@9325: /** Tells the renderer whether or not to fill the bg of a lines label. */ gernotbelger@9325: private void applyShowLineLabelBG(final XYLineAndShapeRenderer r, final int idx) { felix@2660: if (!(r instanceof EnhancedLineAndShapeRenderer)) { felix@2660: return; felix@2660: } gernotbelger@9325: final boolean showLabelLine = this.theme.parseLabelShowBackground(); gernotbelger@9325: ((EnhancedLineAndShapeRenderer) r).setShowLineLabelBG(idx, showLabelLine); felix@2660: } felix@2660: gernotbelger@9325: /** gernotbelger@9325: * Tell the renderer which font (and -size and -style) to use for gernotbelger@9325: * linelabels. gernotbelger@9325: */ gernotbelger@9325: private void applyLineLabelFont(final XYLineAndShapeRenderer r, final int idx) { felix@2660: if (!(r instanceof EnhancedLineAndShapeRenderer)) { felix@2660: return; felix@2660: } gernotbelger@9325: ((EnhancedLineAndShapeRenderer) r).setLineLabelFont(this.theme.parseTextFont(), idx); gernotbelger@9325: } gernotbelger@9325: gernotbelger@9325: /** gernotbelger@9325: * Tell the renderer which color to use for gernotbelger@9325: * linelabels. gernotbelger@9325: */ gernotbelger@9325: private void applyLineLabelColor(final XYLineAndShapeRenderer r, final int idx) { gernotbelger@9325: if (!(r instanceof EnhancedLineAndShapeRenderer)) { gernotbelger@9325: return; gernotbelger@9325: } gernotbelger@9325: ((EnhancedLineAndShapeRenderer) r).setLineLabelTextColor(idx, this.theme.parseTextColor()); gernotbelger@9325: } gernotbelger@9325: gernotbelger@9325: /** gernotbelger@9325: * Tell the renderer which color to use for bg of gernotbelger@9325: * linelabels. gernotbelger@9325: */ gernotbelger@9325: private void applyLineLabelBGColor(final XYLineAndShapeRenderer r, final int idx) { gernotbelger@9325: if (!(r instanceof EnhancedLineAndShapeRenderer)) { gernotbelger@9325: return; gernotbelger@9325: } gernotbelger@9325: ((EnhancedLineAndShapeRenderer) r).setLineLabelBGColor(idx, this.theme.parseTextBackground()); felix@2660: } felix@2656: felix@2656: /** Set stroke of series. */ gernotbelger@9325: private void applyLineSize(final XYLineAndShapeRenderer r, final int idx) { gernotbelger@9325: final int size = this.theme.parseLineWidth(); gernotbelger@9325: r.setSeriesStroke(idx, new BasicStroke(size)); ingo@2321: } ingo@2321: felix@2656: /** Set stroke strength of series. */ gernotbelger@9325: private void applyLineType(final XYLineAndShapeRenderer r, final int idx) { gernotbelger@9325: final int size = this.theme.parseLineWidth(); gernotbelger@9325: final float[] dashes = this.theme.parseLineStyle(); ingo@2321: ingo@2321: // Do not apply the dashed style. ingo@2321: if (dashes.length <= 1) { ingo@2321: return; ingo@2321: } ingo@2321: gernotbelger@9325: r.setSeriesStroke(idx, new BasicStroke(size, BasicStroke.CAP_BUTT, BasicStroke.JOIN_ROUND, 1.0f, dashes, 0.0f)); ingo@2321: } ingo@2321: gernotbelger@9325: private void applyPointStyles(final XYLineAndShapeRenderer r, final int idx) { gernotbelger@9325: applyPointSize(r, idx); ingo@2321: gernotbelger@9325: final Color c = this.theme.parsePointColor(); gernotbelger@9325: final boolean show = this.theme.parseShowPoints(); gernotbelger@9325: final boolean showOutline = this.theme.parseShowPointsOutline(); gernotbelger@9325: gernotbelger@9325: if (c != null) gernotbelger@9325: r.setSeriesFillPaint(idx, c); gernotbelger@9555: r.setUseFillPaint(c != null); gernotbelger@9555: gernotbelger@9325: r.setSeriesShapesFilled(idx, show); gernotbelger@9325: gernotbelger@9325: r.setSeriesOutlinePaint(idx, c); gernotbelger@9325: r.setDrawOutlines(showOutline); gernotbelger@9325: r.setUseOutlinePaint(c != null); gernotbelger@9325: gernotbelger@9325: r.setSeriesShapesVisible(idx, show || showOutline); gernotbelger@9325: } gernotbelger@9325: gernotbelger@9325: private void applyPointSize(final XYLineAndShapeRenderer r, final int idx) { gernotbelger@9325: final int size = this.theme.parsePointWidth(); gernotbelger@9325: final int dim = 2 * size; ingo@2321: ingo@2321: r.setSeriesShape(idx, new Ellipse2D.Double(-size, -size, dim, dim)); ingo@2321: } ingo@2321: gernotbelger@9325: private void applyShowLine(final XYLineAndShapeRenderer r, final int idx) { gernotbelger@9325: final boolean show = this.theme.parseShowLine(); ingo@2321: r.setSeriesLinesVisible(idx, show); ingo@2321: } ingo@2321: gernotbelger@9325: private void applyShowMinimum(final XYLineAndShapeRenderer r, final int idx) { ingo@2321: if (!(r instanceof EnhancedLineAndShapeRenderer)) { ingo@2321: return; ingo@2321: } ingo@2321: gernotbelger@9325: final boolean visible = this.theme.parseShowMinimum(); ingo@2321: gernotbelger@9325: final EnhancedLineAndShapeRenderer er = (EnhancedLineAndShapeRenderer) r; ingo@2321: er.setIsMinimumShapeVisisble(idx, visible); ingo@2321: } ingo@2321: gernotbelger@9325: private void applyShowMaximum(final XYLineAndShapeRenderer r, final int idx) { ingo@2321: if (!(r instanceof EnhancedLineAndShapeRenderer)) { ingo@2321: return; ingo@2321: } ingo@2321: gernotbelger@9325: final boolean visible = this.theme.parseShowMaximum(); ingo@2321: gernotbelger@9325: final EnhancedLineAndShapeRenderer er = (EnhancedLineAndShapeRenderer) r; ingo@2321: er.setIsMaximumShapeVisible(idx, visible); ingo@2321: } raimund@3134: christian@3464: @Override raimund@3134: public XYLineAndShapeRenderer getRenderer() { raimund@3134: return this.renderer; raimund@3134: } gernotbelger@9555: gernotbelger@9555: @Override gernotbelger@9555: public void applyAggregatedLegendTheme(final LegendItem item, final ThemeDocument legendTheme) { gernotbelger@9555: gernotbelger@9555: if (this.theme == null) gernotbelger@9555: return; gernotbelger@9555: gernotbelger@9555: if (this.shape != null) gernotbelger@9555: item.setShape(this.shape); gernotbelger@9555: gernotbelger@9555: final Color lineColor = legendTheme.parseLineColorField(); gernotbelger@9555: if (lineColor != null) gernotbelger@9555: item.setLinePaint(lineColor); gernotbelger@9555: gernotbelger@9555: if (legendTheme.getValue(ThemeDocument.SHOW_LINE) != null) gernotbelger@9555: item.setLineVisible(legendTheme.parseShowLine()); gernotbelger@9555: gernotbelger@9555: /* remark cant set line stroke on legend item */ gernotbelger@9555: // applyLineSize(r, idx); gernotbelger@9555: // applyLineType(r, idx); gernotbelger@9555: gernotbelger@9555: /* gernotbelger@9555: * REMARK: we only change the colors, as visibility and such are interdependend and should be the same as the original gernotbelger@9555: * items gernotbelger@9555: */ gernotbelger@9555: final Color c = legendTheme.parsePointColor(); gernotbelger@9555: if (c != null) { gernotbelger@9555: item.setFillPaint(c); gernotbelger@9555: item.setOutlinePaint(c); gernotbelger@9555: } gernotbelger@9555: } gernotbelger@9325: }