Mercurial > dive4elements > river
diff flys-artifacts/src/main/java/de/intevation/flys/jfree/XYStyle.java @ 3468:f37e7e8907cb
merged flys-artifacts/2.8.1
author | Thomas Arendsen Hein <thomas@intevation.de> |
---|---|
date | Fri, 28 Sep 2012 12:14:39 +0200 |
parents | 0b9b2a0c4e64 |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/flys-artifacts/src/main/java/de/intevation/flys/jfree/XYStyle.java Fri Sep 28 12:14:39 2012 +0200 @@ -0,0 +1,229 @@ +package de.intevation.flys.jfree; + +import de.intevation.flys.utils.ThemeUtil; + +import java.awt.BasicStroke; +import java.awt.Color; +import java.awt.geom.Ellipse2D; + +import org.apache.log4j.Logger; +import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; +import org.w3c.dom.Document; + + +/** + * Utility to apply theme-settings to a renderer. + * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a> + */ +public class XYStyle implements Style { + + private static Logger logger = Logger.getLogger(XYStyle.class); + + protected Document theme; + + protected XYLineAndShapeRenderer renderer; + + + public XYStyle(Document theme) { + this.theme = theme; + this.renderer = null; + } + + + /** + * Applies line color, size and type attributes to renderer, also + * whether to draw lines and/or points. + */ + @Override + public XYLineAndShapeRenderer applyTheme(XYLineAndShapeRenderer r, int idx){ + this.renderer = r; + applyLineColor(r, idx); + applyLineSize(r, idx); + applyLineType(r, idx); + applyShowLine(r, idx); + applyShowPoints(r, idx); + applyPointSize(r, idx); + applyPointColor(r, idx); + applyShowMinimum(r, idx); + applyShowMaximum(r, idx); + + // Line label styles + applyShowLineLabel(r, idx); + applyShowLineLabelBG(r, idx); + applyLineLabelFont(r, idx); + applyLineLabelColor(r, idx); + applyLineLabelBGColor(r, idx); + + // Point label styles + // TODO: Currently point label are annotations and are not drawn this way + /* + applyShowPointLabelBG(r, idx); + applyLinePointFont(r, idx); + applyLinePointColor(r, idx); + applyLinePointBGColor(r, idx);*/ + + return r; + } + + + /** Set line color to renderer. */ + protected void applyLineColor(XYLineAndShapeRenderer r, int idx) { + Color c = ThemeUtil.parseLineColorField(theme); + if(c != null) { + logger.debug("applyLineColor " + c.toString()); + r.setSeriesPaint(idx, c); + } + else { + logger.warn("applyLineColor: color is null - malformed linecolor field?"); + } + } + + + /** Tells the renderer whether or not to add a label to a line. */ + protected void applyShowLineLabel(XYLineAndShapeRenderer r, int idx) { + if (!(r instanceof EnhancedLineAndShapeRenderer)) { + return; + } + boolean showLabelLine = ThemeUtil.parseShowLineLabel(theme); + boolean anyLabel = showLabelLine || ThemeUtil.parseShowWidth(theme) || + ThemeUtil.parseShowLevel(theme) || + ThemeUtil.parseShowMiddleHeight(theme); + ((EnhancedLineAndShapeRenderer)r).setShowLineLabel(anyLabel, idx); + } + + + /** Tells the renderer whether or not to fill the bg of a lines label. */ + protected void applyShowLineLabelBG(XYLineAndShapeRenderer r, int idx) { + if (!(r instanceof EnhancedLineAndShapeRenderer)) { + return; + } + boolean showLabelLine = ThemeUtil.parseLabelShowBackground(theme); + ((EnhancedLineAndShapeRenderer)r).setShowLineLabelBG(idx, showLabelLine); + } + + /** Tell the renderer which font (and -size and -style) to use for + * linelabels. */ + protected void applyLineLabelFont(XYLineAndShapeRenderer r, int idx) { + if (!(r instanceof EnhancedLineAndShapeRenderer)) { + return; + } + ((EnhancedLineAndShapeRenderer)r).setLineLabelFont( + ThemeUtil.parseTextFont(theme), idx); + } + + /** Tell the renderer which color to use for + * linelabels. */ + protected void applyLineLabelColor(XYLineAndShapeRenderer r, int idx) { + if (!(r instanceof EnhancedLineAndShapeRenderer)) { + return; + } + ((EnhancedLineAndShapeRenderer)r).setLineLabelTextColor( + idx, ThemeUtil.parseTextColor(theme)); + } + + /** Tell the renderer which color to use for bg of + * linelabels. */ + protected void applyLineLabelBGColor(XYLineAndShapeRenderer r, int idx) { + if (!(r instanceof EnhancedLineAndShapeRenderer)) { + return; + } + ((EnhancedLineAndShapeRenderer)r).setLineLabelBGColor(idx, + ThemeUtil.parseTextBackground(theme)); + } + + /** Set stroke of series. */ + protected void applyLineSize(XYLineAndShapeRenderer r, int idx) { + int size = ThemeUtil.parseLineWidth(theme); + r.setSeriesStroke( + idx, + new BasicStroke(size)); + } + + + /** Set stroke strength of series. */ + 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(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)); + } + + + protected void applyPointColor(XYLineAndShapeRenderer r, int idx) { + Color c = ThemeUtil.parsePointColor(theme); + + if (c != null) { + r.setSeriesFillPaint(idx, c); + r.setUseFillPaint(true); + r.setDrawOutlines(false); + } + } + + + /** + * 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 XYLineAndShapeRenderer getRenderer() { + return this.renderer; + } +} +// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :