Mercurial > dive4elements > river
diff artifacts/src/main/java/org/dive4elements/river/jfree/StyledAreaSeriesCollection.java @ 8910:d9c89651bd67
Area chart layers may now have an 'arebgpattern'. Real pattern yet to be defined.
author | gernotbelger |
---|---|
date | Thu, 22 Feb 2018 18:46:37 +0100 |
parents | e5f688820951 |
children | 924cd9943337 |
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/jfree/StyledAreaSeriesCollection.java Thu Feb 22 18:44:28 2018 +0100 +++ b/artifacts/src/main/java/org/dive4elements/river/jfree/StyledAreaSeriesCollection.java Thu Feb 22 18:46:37 2018 +0100 @@ -10,7 +10,12 @@ import java.awt.BasicStroke; import java.awt.Color; +import java.awt.Paint; import java.awt.Stroke; +import java.awt.TexturePaint; +import java.awt.geom.Ellipse2D; +import java.awt.geom.Rectangle2D; +import java.awt.image.BufferedImage; import org.jfree.data.xy.XYSeriesCollection; @@ -23,6 +28,7 @@ * The display options can be used to control the z-order and the axis of the * dataset. */ +// FIXME: bad abstraction: the only purpose of this derivation is to apply specific styles. This should rather be solved similar to the XYSTyle. public class StyledAreaSeriesCollection extends XYSeriesCollection { private static final long serialVersionUID = 5274940965666948237L; @@ -71,6 +77,7 @@ applyOutlineStyle(renderer); applyShowLine(renderer); applyShowAreaLabel(renderer); + applyPointStyle(renderer); if (mode == FILL_MODE.UNDER) { renderer.setAreaCalculationMode( StableXYDifferenceRenderer.CALCULATE_NEGATIVE_AREA); @@ -89,19 +96,17 @@ return renderer; } - - private void applyFillColor(StableXYDifferenceRenderer renderer) { - Color paint = theme.parseAreaBackgroundColor(); - - int transparency = theme.parseAreaTransparency(); - if (transparency > 0 && paint != null) { - paint = new Color( - paint.getRed(), - paint.getGreen(), - paint.getBlue(), - (int)((100 - transparency) * 2.55f)); + private void applyFillColor(final StableXYDifferenceRenderer renderer) { + + final boolean showArea = theme.parseShowArea(); + if( !showArea ) { + renderer.setPositivePaint(null); + renderer.setNegativePaint(null); + return; } + Paint paint = parseFillPaint(); + if (paint != null && this.getMode() == FILL_MODE.ABOVE) { renderer.setPositivePaint(paint); renderer.setNegativePaint(new Color(0,0,0,0)); @@ -113,11 +118,40 @@ else { if (paint == null) paint = new Color(177, 117, 102); + renderer.setPositivePaint(paint); renderer.setNegativePaint(paint); } } + private Paint parseFillPaint() { + final Color paint = this.theme.parseAreaBackgroundColor(); + final int transparency = theme.parseAreaTransparency(); + + final Color alphaPaint = withAlpha(paint, transparency); + + final AreaFillPattern pattern = this.theme.parseAreaBackgroundPattern(); + + if( pattern == null ) + return alphaPaint; + + final BufferedImage image = pattern.getImage(alphaPaint); + + final Rectangle2D anchor = new Rectangle2D.Double(0,0, image.getWidth(), image.getHeight()); + return new TexturePaint(image, anchor); + } + + private Color withAlpha(final Color color, final int transparency) { + + if (transparency <= 0 || color == null) + return color; + + return new Color( + color.getRed(), + color.getGreen(), + color.getBlue(), + (int)((100 - transparency) * 2.55f)); + } private void applyShowShape(StableXYDifferenceRenderer renderer) { boolean show = theme.parseAreaShowBorder(); @@ -126,7 +160,9 @@ private void applyShowLine(StableXYDifferenceRenderer renderer) { - boolean show = theme.parseShowLine(); + /* FIXME: strange: this will enable/disable showing the 'point' shapes at each vertex. */ + /* FIXME: this will also now be overridden by the option 'showpoints' */ + final boolean show = theme.parseShowLine(); renderer.setShapesVisible(show); } @@ -161,6 +197,27 @@ renderer.setOutlineStroke(stroke); } + private void applyPointStyle(final StableXYDifferenceRenderer renderer) { + + final boolean showPoints = this.theme.parseShowPoints(); + renderer.setShapesVisible(showPoints); + + if( showPoints ) + { + final int size = theme.parsePointWidth(); + final int dim = 2 * size; + + final Ellipse2D pointShape = new Ellipse2D.Double(-size, -size, dim, dim); + final Color pointColor = theme.parsePointColor(); + + renderer.setSeriesPaint(0, pointColor); + renderer.setSeriesPaint(1, pointColor); + + renderer.setSeriesShape(0, pointShape); + renderer.setSeriesShape(1, pointShape); + } + } + public boolean shouldCalculateRange() { return theme.parseCalculateRange(); }