# HG changeset patch # User Ingo Weinzierl # Date 1328797667 0 # Node ID 991e4a5df3237035fd3a263bb0bc4a7589f233bb # Parent bb04f958b7aa4f57be9e5fbb08021b05fd02dffb Enabled styling in timeseries charts. flys-artifacts/trunk@4003 c6561f87-3c4e-4783-a992-168aeb5c3f6f diff -r bb04f958b7aa -r 991e4a5df323 flys-artifacts/ChangeLog --- a/flys-artifacts/ChangeLog Thu Feb 09 14:26:03 2012 +0000 +++ b/flys-artifacts/ChangeLog Thu Feb 09 14:27:47 2012 +0000 @@ -1,3 +1,31 @@ +2012-02-09 Ingo Weinzierl + + * src/main/java/de/intevation/flys/jfree/Style.java: New. A Style object + needs to implements a method applyTheme() which takes a + XYLineAndShapeRenderer. + + * src/main/java/de/intevation/flys/jfree/XYStyle.java: New. This subclass of + Style modifies the XYLineAndShapeRenderer specified in applyTheme(). + + * src/main/java/de/intevation/flys/jfree/StyledSeries.java: New. This + interface defines two methods getStyle() and setStyle() to adjust and + retrieve the Style of a series. + + * src/main/java/de/intevation/flys/jfree/StyledTimeSeries.java: New. + Implementation of StyledSeries that subclasses JFreeChart's TimeSeries. + + * src/main/java/de/intevation/flys/jfree/StyledXYSeries.java: Removed the + code for adapting a XYLineAndShapeRenderer. Instead of implementing this + stuff in StyledXYSeries itself, this instance now implements StyledSeries + and stores an instance of XYStyle. + + * src/main/java/de/intevation/flys/exports/HistoricalDischargeCurveGenerator.java: + Create new instances of StyledTimeSeries now which enables styling in this + chart. + + * src/main/java/de/intevation/flys/exports/ChartGenerator.java: Enabled + styling of series for all series that implement StyledSeries. + 2012-02-09 Sascha L. Teichmann * src/main/java/de/intevation/flys/artifacts/model/WstValueTable.java(relateWs): diff -r bb04f958b7aa -r 991e4a5df323 flys-artifacts/src/main/java/de/intevation/flys/exports/ChartGenerator.java --- a/flys-artifacts/src/main/java/de/intevation/flys/exports/ChartGenerator.java Thu Feb 09 14:26:03 2012 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/exports/ChartGenerator.java Thu Feb 09 14:27:47 2012 +0000 @@ -52,7 +52,8 @@ import de.intevation.flys.jfree.EnhancedLineAndShapeRenderer; import de.intevation.flys.jfree.StableXYDifferenceRenderer; import de.intevation.flys.jfree.StyledAreaSeriesCollection; -import de.intevation.flys.jfree.StyledXYSeries; +import de.intevation.flys.jfree.Style; +import de.intevation.flys.jfree.StyledSeries; import de.intevation.flys.utils.FLYSUtils; import de.intevation.flys.utils.ThemeAccess; @@ -1177,6 +1178,8 @@ * @param idx The index of the renderer / dataset. */ protected void applyLineTheme(XYPlot plot, XYDataset dataset, int idx) { + logger.debug("Apply LineTheme for dataset at index: " + idx); + LegendItemCollection lic = new LegendItemCollection(); LegendItemCollection anno = plot.getFixedLegendItems(); @@ -1187,8 +1190,9 @@ for (int s = 0, num = dataset.getSeriesCount(); s < num; s++) { Series series = getSeriesOf(dataset, s); - if (series instanceof StyledXYSeries) { - ((StyledXYSeries) series).applyTheme(renderer, s); + if (series instanceof StyledSeries) { + Style style = ((StyledSeries) series).getStyle(); + style.applyTheme(renderer, s); } // special case: if there is just one single item, we need to enable diff -r bb04f958b7aa -r 991e4a5df323 flys-artifacts/src/main/java/de/intevation/flys/exports/HistoricalDischargeCurveGenerator.java --- a/flys-artifacts/src/main/java/de/intevation/flys/exports/HistoricalDischargeCurveGenerator.java Thu Feb 09 14:26:03 2012 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/exports/HistoricalDischargeCurveGenerator.java Thu Feb 09 14:27:47 2012 +0000 @@ -24,6 +24,7 @@ import de.intevation.flys.artifacts.model.HistoricalWQTimerange; import de.intevation.flys.artifacts.model.Timerange; import de.intevation.flys.artifacts.model.WQTimerange; +import de.intevation.flys.jfree.StyledTimeSeries; import de.intevation.flys.utils.FLYSUtils; @@ -199,6 +200,7 @@ TimeSeriesCollection tsc = newTimeSeriesCollection( wqt.getTimeranges(), wqt.getQs(), + theme, desc); addAxisDataset(tsc, 0, visible); @@ -219,6 +221,7 @@ TimeSeriesCollection tsc = newTimeSeriesCollection( wqt.getTimeranges(), wqt.getDiffs(), + theme, desc); addAxisDataset(tsc, 0, visible); @@ -234,12 +237,13 @@ protected TimeSeriesCollection newTimeSeriesCollection( Timerange[] timeranges, double[] values, + Document theme, String desc ) { logger.debug("Create new TimeSeriesCollection for: " + desc); TimeSeriesCollection tsc = new TimeSeriesCollection(); - TimeSeries series = new TimeSeries(desc); + TimeSeries series = new StyledTimeSeries(desc, theme); for (int i = 0, n = timeranges.length; i < n; i++) { RegularTimePeriod[] rtp = newRegularTimePeriod(timeranges[i]); diff -r bb04f958b7aa -r 991e4a5df323 flys-artifacts/src/main/java/de/intevation/flys/jfree/Style.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/jfree/Style.java Thu Feb 09 14:27:47 2012 +0000 @@ -0,0 +1,13 @@ +package de.intevation.flys.jfree; + +import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; + + +/** + * @author Ingo Weinzierl + */ +public interface Style { + + XYLineAndShapeRenderer applyTheme(XYLineAndShapeRenderer r, int idx); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r bb04f958b7aa -r 991e4a5df323 flys-artifacts/src/main/java/de/intevation/flys/jfree/StyledSeries.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/jfree/StyledSeries.java Thu Feb 09 14:27:47 2012 +0000 @@ -0,0 +1,13 @@ +package de.intevation.flys.jfree; + + +/** + * @author Ingo Weinzierl + */ +public interface StyledSeries { + + void setStyle(Style style); + + Style getStyle(); +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r bb04f958b7aa -r 991e4a5df323 flys-artifacts/src/main/java/de/intevation/flys/jfree/StyledTimeSeries.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/jfree/StyledTimeSeries.java Thu Feb 09 14:27:47 2012 +0000 @@ -0,0 +1,39 @@ +package de.intevation.flys.jfree; + +import org.apache.log4j.Logger; + +import org.w3c.dom.Document; + +import org.jfree.data.time.TimeSeries; + + +/** + * @author Ingo Weinzierl + */ +public class StyledTimeSeries extends TimeSeries implements StyledSeries { + + private static final Logger logger = + Logger.getLogger(StyledTimeSeries.class); + + + protected Style style; + + + public StyledTimeSeries(String key, Document theme) { + super(key); + setStyle(new XYStyle(theme)); + } + + + @Override + public void setStyle(Style style) { + this.style = style; + } + + + @Override + public Style getStyle() { + return style; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r bb04f958b7aa -r 991e4a5df323 flys-artifacts/src/main/java/de/intevation/flys/jfree/StyledXYSeries.java --- a/flys-artifacts/src/main/java/de/intevation/flys/jfree/StyledXYSeries.java Thu Feb 09 14:26:03 2012 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/jfree/StyledXYSeries.java Thu Feb 09 14:27:47 2012 +0000 @@ -1,31 +1,22 @@ package de.intevation.flys.jfree; -import java.awt.BasicStroke; -import java.awt.Color; -import java.awt.geom.Ellipse2D; import org.apache.log4j.Logger; import org.w3c.dom.Document; -import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; import org.jfree.data.xy.XYSeries; -import de.intevation.flys.utils.ThemeUtil; /** - * Dataseries in two dimensions with additional theme-document and further - * display options. - * The theme-document will later "style" the graphical representation. - * The display options can be used to control the z-order and the axis of the - * dataseries. + * @author Ingo Weinzierl */ -public class StyledXYSeries extends XYSeries { - - protected Document theme; +public class StyledXYSeries extends XYSeries implements StyledSeries { private static final Logger logger = Logger.getLogger(StyledXYSeries.class); + protected Style style; + public StyledXYSeries(String key, Document theme) { this(key, true, theme); @@ -39,109 +30,19 @@ */ public StyledXYSeries(String key, boolean sorted, Document theme) { super(key, sorted); - this.theme = theme; - } - - - /** - * Applies line color, size and type attributes to renderer, also - * whether to draw lines and/or points. - */ - public XYLineAndShapeRenderer applyTheme(XYLineAndShapeRenderer r, int idx){ - applyLineColor(r, idx); - applyLineSize(r, idx); - applyLineType(r, idx); - applyShowLine(r, idx); - applyShowPoints(r, idx); - applyPointSize(r, idx); - applyShowMinimum(r, idx); - applyShowMaximum(r, idx); - - return r; - } - - - /** Set line color to renderer. */ - protected void applyLineColor(XYLineAndShapeRenderer r, int idx) { - Color c = ThemeUtil.parseLineColorField(theme); - r.setSeriesPaint(idx, c); - } - - - protected void applyLineSize(XYLineAndShapeRenderer r, int idx) { - int size = ThemeUtil.parseLineWidth(theme); - r.setSeriesStroke( - idx, - new BasicStroke(Integer.valueOf(size))); + setStyle(new XYStyle(theme)); } - protected void applyLineType(XYLineAndShapeRenderer r, int idx) { - int size = ThemeUtil.parseLineWidth(theme); - float[] dashes = ThemeUtil.parseLineStyle(theme); - - // Do not apply the dashed style. - if (dashes.length <= 1) { - return; - } - - r.setSeriesStroke( - idx, - new BasicStroke(Integer.valueOf(size), - BasicStroke.CAP_BUTT, - BasicStroke.JOIN_ROUND, - 1.0f, - dashes, - 0.0f)); - } - - - protected void applyPointSize(XYLineAndShapeRenderer r, int idx) { - int size = ThemeUtil.parsePointWidth(theme); - int dim = 2 * size; - - r.setSeriesShape(idx, new Ellipse2D.Double(-size, -size, dim, dim)); + @Override + public void setStyle(Style style) { + this.style = style; } - /** - * Sets form and visibility of points. - */ - protected void applyShowPoints(XYLineAndShapeRenderer r, int idx) { - boolean show = ThemeUtil.parseShowPoints(theme); - - r.setSeriesShapesVisible(idx, show); - r.setDrawOutlines(true); - } - - - protected void applyShowLine(XYLineAndShapeRenderer r, int idx) { - boolean show = ThemeUtil.parseShowLine(theme); - r.setSeriesLinesVisible(idx, show); - } - - - protected void applyShowMinimum(XYLineAndShapeRenderer r, int idx) { - if (!(r instanceof EnhancedLineAndShapeRenderer)) { - return; - } - - boolean visible = ThemeUtil.parseShowMinimum(theme); - - EnhancedLineAndShapeRenderer er = (EnhancedLineAndShapeRenderer) r; - er.setIsMinimumShapeVisisble(idx, visible); - } - - - protected void applyShowMaximum(XYLineAndShapeRenderer r, int idx) { - if (!(r instanceof EnhancedLineAndShapeRenderer)) { - return; - } - - boolean visible = ThemeUtil.parseShowMaximum(theme); - - EnhancedLineAndShapeRenderer er = (EnhancedLineAndShapeRenderer) r; - er.setIsMaximumShapeVisible(idx, visible); + @Override + public Style getStyle() { + return style; } } // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : diff -r bb04f958b7aa -r 991e4a5df323 flys-artifacts/src/main/java/de/intevation/flys/jfree/XYStyle.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/jfree/XYStyle.java Thu Feb 09 14:27:47 2012 +0000 @@ -0,0 +1,129 @@ +package de.intevation.flys.jfree; + +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.geom.Ellipse2D; + + +import org.w3c.dom.Document; + +import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; + +import de.intevation.flys.utils.ThemeUtil; + + +/** + * @author Ingo Weinzierl + */ +public class XYStyle implements Style { + + protected Document theme; + + + public XYStyle(Document theme) { + this.theme = theme; + } + + + /** + * Applies line color, size and type attributes to renderer, also + * whether to draw lines and/or points. + */ + public XYLineAndShapeRenderer applyTheme(XYLineAndShapeRenderer r, int idx){ + applyLineColor(r, idx); + applyLineSize(r, idx); + applyLineType(r, idx); + applyShowLine(r, idx); + applyShowPoints(r, idx); + applyPointSize(r, idx); + applyShowMinimum(r, idx); + applyShowMaximum(r, idx); + + return r; + } + + + /** Set line color to renderer. */ + protected void applyLineColor(XYLineAndShapeRenderer r, int idx) { + Color c = ThemeUtil.parseLineColorField(theme); + r.setSeriesPaint(idx, c); + } + + + protected void applyLineSize(XYLineAndShapeRenderer r, int idx) { + int size = ThemeUtil.parseLineWidth(theme); + r.setSeriesStroke( + idx, + new BasicStroke(Integer.valueOf(size))); + } + + + protected void applyLineType(XYLineAndShapeRenderer r, int idx) { + int size = ThemeUtil.parseLineWidth(theme); + float[] dashes = ThemeUtil.parseLineStyle(theme); + + // Do not apply the dashed style. + if (dashes.length <= 1) { + return; + } + + r.setSeriesStroke( + idx, + new BasicStroke(Integer.valueOf(size), + BasicStroke.CAP_BUTT, + BasicStroke.JOIN_ROUND, + 1.0f, + dashes, + 0.0f)); + } + + + protected void applyPointSize(XYLineAndShapeRenderer r, int idx) { + int size = ThemeUtil.parsePointWidth(theme); + int dim = 2 * size; + + r.setSeriesShape(idx, new Ellipse2D.Double(-size, -size, dim, dim)); + } + + + /** + * Sets form and visibility of points. + */ + protected void applyShowPoints(XYLineAndShapeRenderer r, int idx) { + boolean show = ThemeUtil.parseShowPoints(theme); + + r.setSeriesShapesVisible(idx, show); + r.setDrawOutlines(true); + } + + + protected void applyShowLine(XYLineAndShapeRenderer r, int idx) { + boolean show = ThemeUtil.parseShowLine(theme); + r.setSeriesLinesVisible(idx, show); + } + + + protected void applyShowMinimum(XYLineAndShapeRenderer r, int idx) { + if (!(r instanceof EnhancedLineAndShapeRenderer)) { + return; + } + + boolean visible = ThemeUtil.parseShowMinimum(theme); + + EnhancedLineAndShapeRenderer er = (EnhancedLineAndShapeRenderer) r; + er.setIsMinimumShapeVisisble(idx, visible); + } + + + protected void applyShowMaximum(XYLineAndShapeRenderer r, int idx) { + if (!(r instanceof EnhancedLineAndShapeRenderer)) { + return; + } + + boolean visible = ThemeUtil.parseShowMaximum(theme); + + EnhancedLineAndShapeRenderer er = (EnhancedLineAndShapeRenderer) r; + er.setIsMaximumShapeVisible(idx, visible); + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :