Mercurial > dive4elements > river
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 : |