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();
     }

http://dive4elements.wald.intevation.org