comparison 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
comparison
equal deleted inserted replaced
8909:31dff17c6828 8910:d9c89651bd67
8 8
9 package org.dive4elements.river.jfree; 9 package org.dive4elements.river.jfree;
10 10
11 import java.awt.BasicStroke; 11 import java.awt.BasicStroke;
12 import java.awt.Color; 12 import java.awt.Color;
13 import java.awt.Paint;
13 import java.awt.Stroke; 14 import java.awt.Stroke;
15 import java.awt.TexturePaint;
16 import java.awt.geom.Ellipse2D;
17 import java.awt.geom.Rectangle2D;
18 import java.awt.image.BufferedImage;
14 19
15 import org.jfree.data.xy.XYSeriesCollection; 20 import org.jfree.data.xy.XYSeriesCollection;
16 21
17 import org.dive4elements.river.themes.ThemeDocument; 22 import org.dive4elements.river.themes.ThemeDocument;
18 23
21 * the area between two curves), a theme-document and further display options. 26 * the area between two curves), a theme-document and further display options.
22 * The theme-document will later "style" the graphical representation. 27 * The theme-document will later "style" the graphical representation.
23 * The display options can be used to control the z-order and the axis of the 28 * The display options can be used to control the z-order and the axis of the
24 * dataset. 29 * dataset.
25 */ 30 */
31 // FIXME: bad abstraction: the only purpose of this derivation is to apply specific styles. This should rather be solved similar to the XYSTyle.
26 public class StyledAreaSeriesCollection extends XYSeriesCollection { 32 public class StyledAreaSeriesCollection extends XYSeriesCollection {
27 private static final long serialVersionUID = 5274940965666948237L; 33 private static final long serialVersionUID = 5274940965666948237L;
28 34
29 /** Mode, how to draw/which areas to fill. */ 35 /** Mode, how to draw/which areas to fill. */
30 public enum FILL_MODE {UNDER, ABOVE, BETWEEN} 36 public enum FILL_MODE {UNDER, ABOVE, BETWEEN}
69 applyShowShape(renderer); 75 applyShowShape(renderer);
70 applyOutlineColor(renderer); 76 applyOutlineColor(renderer);
71 applyOutlineStyle(renderer); 77 applyOutlineStyle(renderer);
72 applyShowLine(renderer); 78 applyShowLine(renderer);
73 applyShowAreaLabel(renderer); 79 applyShowAreaLabel(renderer);
80 applyPointStyle(renderer);
74 if (mode == FILL_MODE.UNDER) { 81 if (mode == FILL_MODE.UNDER) {
75 renderer.setAreaCalculationMode( 82 renderer.setAreaCalculationMode(
76 StableXYDifferenceRenderer.CALCULATE_NEGATIVE_AREA); 83 StableXYDifferenceRenderer.CALCULATE_NEGATIVE_AREA);
77 } 84 }
78 else if (mode == FILL_MODE.ABOVE) { 85 else if (mode == FILL_MODE.ABOVE) {
87 // Apply text style. 94 // Apply text style.
88 theme.parseComplexTextStyle().apply(renderer); 95 theme.parseComplexTextStyle().apply(renderer);
89 return renderer; 96 return renderer;
90 } 97 }
91 98
92 99 private void applyFillColor(final StableXYDifferenceRenderer renderer) {
93 private void applyFillColor(StableXYDifferenceRenderer renderer) { 100
94 Color paint = theme.parseAreaBackgroundColor(); 101 final boolean showArea = theme.parseShowArea();
95 102 if( !showArea ) {
96 int transparency = theme.parseAreaTransparency(); 103 renderer.setPositivePaint(null);
97 if (transparency > 0 && paint != null) { 104 renderer.setNegativePaint(null);
98 paint = new Color( 105 return;
99 paint.getRed(), 106 }
100 paint.getGreen(), 107
101 paint.getBlue(), 108 Paint paint = parseFillPaint();
102 (int)((100 - transparency) * 2.55f)); 109
103 }
104
105 if (paint != null && this.getMode() == FILL_MODE.ABOVE) { 110 if (paint != null && this.getMode() == FILL_MODE.ABOVE) {
106 renderer.setPositivePaint(paint); 111 renderer.setPositivePaint(paint);
107 renderer.setNegativePaint(new Color(0,0,0,0)); 112 renderer.setNegativePaint(new Color(0,0,0,0));
108 } 113 }
109 else if (paint != null && this.getMode() == FILL_MODE.UNDER) { 114 else if (paint != null && this.getMode() == FILL_MODE.UNDER) {
111 renderer.setPositivePaint(new Color(0,0,0,0)); 116 renderer.setPositivePaint(new Color(0,0,0,0));
112 } 117 }
113 else { 118 else {
114 if (paint == null) 119 if (paint == null)
115 paint = new Color(177, 117, 102); 120 paint = new Color(177, 117, 102);
121
116 renderer.setPositivePaint(paint); 122 renderer.setPositivePaint(paint);
117 renderer.setNegativePaint(paint); 123 renderer.setNegativePaint(paint);
118 } 124 }
119 } 125 }
120 126
127 private Paint parseFillPaint() {
128 final Color paint = this.theme.parseAreaBackgroundColor();
129 final int transparency = theme.parseAreaTransparency();
130
131 final Color alphaPaint = withAlpha(paint, transparency);
132
133 final AreaFillPattern pattern = this.theme.parseAreaBackgroundPattern();
134
135 if( pattern == null )
136 return alphaPaint;
137
138 final BufferedImage image = pattern.getImage(alphaPaint);
139
140 final Rectangle2D anchor = new Rectangle2D.Double(0,0, image.getWidth(), image.getHeight());
141 return new TexturePaint(image, anchor);
142 }
143
144 private Color withAlpha(final Color color, final int transparency) {
145
146 if (transparency <= 0 || color == null)
147 return color;
148
149 return new Color(
150 color.getRed(),
151 color.getGreen(),
152 color.getBlue(),
153 (int)((100 - transparency) * 2.55f));
154 }
121 155
122 private void applyShowShape(StableXYDifferenceRenderer renderer) { 156 private void applyShowShape(StableXYDifferenceRenderer renderer) {
123 boolean show = theme.parseAreaShowBorder(); 157 boolean show = theme.parseAreaShowBorder();
124 renderer.setDrawOutline(show); 158 renderer.setDrawOutline(show);
125 } 159 }
126 160
127 161
128 private void applyShowLine(StableXYDifferenceRenderer renderer) { 162 private void applyShowLine(StableXYDifferenceRenderer renderer) {
129 boolean show = theme.parseShowLine(); 163 /* FIXME: strange: this will enable/disable showing the 'point' shapes at each vertex. */
164 /* FIXME: this will also now be overridden by the option 'showpoints' */
165 final boolean show = theme.parseShowLine();
130 renderer.setShapesVisible(show); 166 renderer.setShapesVisible(show);
131 } 167 }
132 168
133 private void applyOutlineColor(StableXYDifferenceRenderer renderer) { 169 private void applyOutlineColor(StableXYDifferenceRenderer renderer) {
134 Color c = theme.parseLineColorField(); 170 Color c = theme.parseLineColorField();
159 } 195 }
160 196
161 renderer.setOutlineStroke(stroke); 197 renderer.setOutlineStroke(stroke);
162 } 198 }
163 199
200 private void applyPointStyle(final StableXYDifferenceRenderer renderer) {
201
202 final boolean showPoints = this.theme.parseShowPoints();
203 renderer.setShapesVisible(showPoints);
204
205 if( showPoints )
206 {
207 final int size = theme.parsePointWidth();
208 final int dim = 2 * size;
209
210 final Ellipse2D pointShape = new Ellipse2D.Double(-size, -size, dim, dim);
211 final Color pointColor = theme.parsePointColor();
212
213 renderer.setSeriesPaint(0, pointColor);
214 renderer.setSeriesPaint(1, pointColor);
215
216 renderer.setSeriesShape(0, pointShape);
217 renderer.setSeriesShape(1, pointShape);
218 }
219 }
220
164 public boolean shouldCalculateRange() { 221 public boolean shouldCalculateRange() {
165 return theme.parseCalculateRange(); 222 return theme.parseCalculateRange();
166 } 223 }
167 } 224 }
168 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : 225 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org