comparison artifacts/src/main/java/org/dive4elements/river/jfree/StyledAreaSeriesCollection.java @ 9182:77eb4553245b

Fixed: waterlevels could not show a band any more Correctly implemented 'showarea' on area themes now
author gernotbelger
date Tue, 26 Jun 2018 20:19:16 +0200
parents 924cd9943337
children eec4df8165a1
comparison
equal deleted inserted replaced
9181:5dacb6ea75a1 9182:77eb4553245b
15 import java.awt.TexturePaint; 15 import java.awt.TexturePaint;
16 import java.awt.geom.Ellipse2D; 16 import java.awt.geom.Ellipse2D;
17 import java.awt.geom.Rectangle2D; 17 import java.awt.geom.Rectangle2D;
18 import java.awt.image.BufferedImage; 18 import java.awt.image.BufferedImage;
19 19
20 import org.dive4elements.river.themes.ThemeDocument;
20 import org.jfree.data.xy.XYSeriesCollection; 21 import org.jfree.data.xy.XYSeriesCollection;
21
22 import org.dive4elements.river.themes.ThemeDocument;
23 22
24 /** 23 /**
25 * One or more dataseries to draw a polygon (either "open up/downwards", or 24 * One or more dataseries to draw a polygon (either "open up/downwards", or
26 * the area between two curves), a theme-document and further display options. 25 * the area between two curves), a theme-document and further display options.
27 * The theme-document will later "style" the graphical representation. 26 * The theme-document will later "style" the graphical representation.
37 36
38 /** MODE in use. */ 37 /** MODE in use. */
39 private FILL_MODE mode; 38 private FILL_MODE mode;
40 39
41 /** Theme-document with attributes about actual visual representation. */ 40 /** Theme-document with attributes about actual visual representation. */
42 private ThemeDocument theme; 41 private final ThemeDocument theme;
43 42
44 /** 43 /**
45 * @param theme the theme-document. 44 * @param theme the theme-document.
46 */ 45 */
47 public StyledAreaSeriesCollection(ThemeDocument theme) { 46 public StyledAreaSeriesCollection(final ThemeDocument theme) {
48 this.theme = theme; 47 this.theme = theme;
49 this.mode = FILL_MODE.BETWEEN; 48 this.mode = FILL_MODE.BETWEEN;
50 } 49 }
51 50
52 51
53 /** Gets the Fill mode. */ 52 /** Gets the Fill mode. */
54 public FILL_MODE getMode() { 53 public FILL_MODE getMode() {
55 return this.mode; 54 return this.mode;
56 } 55 }
57 56
58 57
59 /** Sets the Fill mode. */ 58 /** Sets the Fill mode. */
60 public void setMode(FILL_MODE fMode) { 59 public void setMode(final FILL_MODE fMode) {
61 this.mode = fMode; 60 this.mode = fMode;
62 } 61 }
63 62
64 63
65 /** 64 /**
67 * whether to draw lines and/or points. 66 * whether to draw lines and/or points.
68 * @param renderer Renderer to apply theme to. 67 * @param renderer Renderer to apply theme to.
69 * @return \param renderer 68 * @return \param renderer
70 */ 69 */
71 public StableXYDifferenceRenderer applyTheme( 70 public StableXYDifferenceRenderer applyTheme(
72 StableXYDifferenceRenderer renderer 71 final StableXYDifferenceRenderer renderer
73 ) { 72 ) {
74 applyFillColor(renderer); 73 applyFillColor(renderer);
75 applyShowShape(renderer); 74 applyShowBorder(renderer);
75 applyShowArea(renderer);
76 applyOutlineColor(renderer); 76 applyOutlineColor(renderer);
77 applyOutlineStyle(renderer); 77 applyOutlineStyle(renderer);
78 applyShowLine(renderer); 78 applyShowLine(renderer);
79 applyShowAreaLabel(renderer); 79 applyShowAreaLabel(renderer);
80 applyPointStyle(renderer); 80 applyPointStyle(renderer);
81 if (mode == FILL_MODE.UNDER) { 81 if (this.mode == FILL_MODE.UNDER) {
82 renderer.setAreaCalculationMode( 82 renderer.setAreaCalculationMode(
83 StableXYDifferenceRenderer.CALCULATE_NEGATIVE_AREA); 83 StableXYDifferenceRenderer.CALCULATE_NEGATIVE_AREA);
84 } 84 }
85 else if (mode == FILL_MODE.ABOVE) { 85 else if (this.mode == FILL_MODE.ABOVE) {
86 renderer.setAreaCalculationMode( 86 renderer.setAreaCalculationMode(
87 StableXYDifferenceRenderer.CALCULATE_POSITIVE_AREA); 87 StableXYDifferenceRenderer.CALCULATE_POSITIVE_AREA);
88 } 88 }
89 else { 89 else {
90 renderer.setAreaCalculationMode( 90 renderer.setAreaCalculationMode(
91 StableXYDifferenceRenderer.CALCULATE_ALL_AREA); 91 StableXYDifferenceRenderer.CALCULATE_ALL_AREA);
92 } 92 }
93 93
94 // Apply text style. 94 // Apply text style.
95 theme.parseComplexTextStyle().apply(renderer); 95 this.theme.parseComplexTextStyle().apply(renderer);
96 return renderer; 96 return renderer;
97 } 97 }
98 98
99 private void applyFillColor(final StableXYDifferenceRenderer renderer) { 99 private void applyFillColor(final StableXYDifferenceRenderer renderer) {
100
101 final boolean showArea = theme.parseShowArea();
102 if( !showArea ) {
103 renderer.setPositivePaint(null);
104 renderer.setNegativePaint(null);
105 return;
106 }
107 100
108 Paint paint = parseFillPaint(); 101 Paint paint = parseFillPaint();
109 102
110 if (paint != null && this.getMode() == FILL_MODE.ABOVE) { 103 if (paint != null && this.getMode() == FILL_MODE.ABOVE) {
111 renderer.setPositivePaint(paint); 104 renderer.setPositivePaint(paint);
112 renderer.setNegativePaint(new Color(0,0,0,0)); 105 renderer.setNegativePaint(new Color(0,0,0,0));
113 } 106 }
114 else if (paint != null && this.getMode() == FILL_MODE.UNDER) { 107 else if (paint != null && this.getMode() == FILL_MODE.UNDER) {
116 renderer.setPositivePaint(new Color(0,0,0,0)); 109 renderer.setPositivePaint(new Color(0,0,0,0));
117 } 110 }
118 else { 111 else {
119 if (paint == null) 112 if (paint == null)
120 paint = new Color(177, 117, 102); 113 paint = new Color(177, 117, 102);
121 114
122 renderer.setPositivePaint(paint); 115 renderer.setPositivePaint(paint);
123 renderer.setNegativePaint(paint); 116 renderer.setNegativePaint(paint);
124 } 117 }
125 } 118 }
126 119
127 private Paint parseFillPaint() { 120 private Paint parseFillPaint() {
128 final Color paint = this.theme.parseAreaBackgroundColor(); 121 final Color paint = this.theme.parseAreaBackgroundColor();
129 final int transparency = theme.parseAreaTransparency(); 122 final int transparency = this.theme.parseAreaTransparency();
130 123
131 final Color alphaPaint = withAlpha(paint, transparency); 124 final Color alphaPaint = withAlpha(paint, transparency);
132 125
133 final AreaFillPattern pattern = this.theme.parseAreaBackgroundPattern(); 126 final AreaFillPattern pattern = this.theme.parseAreaBackgroundPattern();
134 127
135 if( pattern == null || pattern == AreaFillPattern.patternFill ) 128 if( pattern == null || pattern == AreaFillPattern.patternFill )
136 return alphaPaint; 129 return alphaPaint;
137 130
138 final BufferedImage image = pattern.getImage(alphaPaint); 131 final BufferedImage image = pattern.getImage(alphaPaint);
139 132
140 final Rectangle2D anchor = new Rectangle2D.Double(0,0, image.getWidth(), image.getHeight()); 133 final Rectangle2D anchor = new Rectangle2D.Double(0,0, image.getWidth(), image.getHeight());
141 return new TexturePaint(image, anchor); 134 return new TexturePaint(image, anchor);
142 } 135 }
143 136
144 private Color withAlpha(final Color color, final int transparency) { 137 private Color withAlpha(final Color color, final int transparency) {
145 138
146 if (transparency <= 0 || color == null) 139 if (transparency <= 0 || color == null)
147 return color; 140 return color;
148 141
149 return new Color( 142 return new Color(
150 color.getRed(), 143 color.getRed(),
151 color.getGreen(), 144 color.getGreen(),
152 color.getBlue(), 145 color.getBlue(),
153 (int)((100 - transparency) * 2.55f)); 146 (int)((100 - transparency) * 2.55f));
154 } 147 }
155 148
156 private void applyShowShape(StableXYDifferenceRenderer renderer) { 149 private void applyShowBorder(final StableXYDifferenceRenderer renderer) {
157 boolean show = theme.parseAreaShowBorder(); 150 final boolean show = this.theme.parseAreaShowBorder();
158 renderer.setDrawOutline(show); 151 renderer.setDrawOutline(show);
159 } 152 }
160 153
161 154 private void applyShowArea(final StableXYDifferenceRenderer renderer) {
162 private void applyShowLine(StableXYDifferenceRenderer renderer) { 155
156 final boolean showArea = this.theme.parseShowArea();
157 renderer.setDrawArea(showArea);
158 }
159
160 private void applyShowLine(final StableXYDifferenceRenderer renderer) {
163 /* FIXME: strange: this will enable/disable showing the 'point' shapes at each vertex. */ 161 /* 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' */ 162 /* FIXME: this will also now be overridden by the option 'showpoints' */
165 final boolean show = theme.parseShowLine(); 163 final boolean show = this.theme.parseShowLine();
166 renderer.setShapesVisible(show); 164 renderer.setShapesVisible(show);
167 } 165 }
168 166
169 private void applyOutlineColor(StableXYDifferenceRenderer renderer) { 167 private void applyOutlineColor(final StableXYDifferenceRenderer renderer) {
170 Color c = theme.parseLineColorField(); 168 final Color c = this.theme.parseLineColorField();
171 renderer.setOutlinePaint(c); 169 renderer.setOutlinePaint(c);
172 } 170 }
173 171
174 /** Inform renderer whether it should draw a label. */ 172 /** Inform renderer whether it should draw a label. */
175 private void applyShowAreaLabel(StableXYDifferenceRenderer renderer) { 173 private void applyShowAreaLabel(final StableXYDifferenceRenderer renderer) {
176 renderer.setLabelArea(theme.parseShowAreaLabel()); 174 renderer.setLabelArea(this.theme.parseShowAreaLabel());
177 } 175 }
178 176
179 private void applyOutlineStyle(StableXYDifferenceRenderer renderer) { 177 private void applyOutlineStyle(final StableXYDifferenceRenderer renderer) {
180 float[] dashes = theme.parseLineStyle(); 178 final float[] dashes = this.theme.parseLineStyle();
181 int size = theme.parseLineWidth(); 179 final int size = this.theme.parseLineWidth();
182 180
183 Stroke stroke = null; 181 Stroke stroke = null;
184 182
185 if (dashes.length <= 1) { 183 if (dashes.length <= 1) {
186 stroke = new BasicStroke(Integer.valueOf(size)); 184 stroke = new BasicStroke(Integer.valueOf(size));
187 } 185 }
188 else { 186 else {
189 stroke = new BasicStroke(Integer.valueOf(size), 187 stroke = new BasicStroke(Integer.valueOf(size),
190 BasicStroke.CAP_BUTT, 188 BasicStroke.CAP_BUTT,
191 BasicStroke.JOIN_ROUND, 189 BasicStroke.JOIN_ROUND,
192 1.0f, 190 1.0f,
193 dashes, 191 dashes,
194 0.0f); 192 0.0f);
195 } 193 }
196 194
197 renderer.setOutlineStroke(stroke); 195 renderer.setOutlineStroke(stroke);
198 } 196 }
199 197
201 199
202 final boolean showPoints = this.theme.parseShowPoints(); 200 final boolean showPoints = this.theme.parseShowPoints();
203 renderer.setShapesVisible(showPoints); 201 renderer.setShapesVisible(showPoints);
204 202
205 if( showPoints ) 203 if( showPoints )
206 { 204 {
207 final int size = theme.parsePointWidth(); 205 final int size = this.theme.parsePointWidth();
208 final int dim = 2 * size; 206 final int dim = 2 * size;
209 207
210 final Ellipse2D pointShape = new Ellipse2D.Double(-size, -size, dim, dim); 208 final Ellipse2D pointShape = new Ellipse2D.Double(-size, -size, dim, dim);
211 final Color pointColor = theme.parsePointColor(); 209 final Color pointColor = this.theme.parsePointColor();
212 210
213 renderer.setSeriesPaint(0, pointColor); 211 renderer.setSeriesPaint(0, pointColor);
214 renderer.setSeriesPaint(1, pointColor); 212 renderer.setSeriesPaint(1, pointColor);
215 213
216 renderer.setSeriesShape(0, pointShape); 214 renderer.setSeriesShape(0, pointShape);
217 renderer.setSeriesShape(1, pointShape); 215 renderer.setSeriesShape(1, pointShape);
218 } 216 }
219 } 217 }
220 218
221 public boolean shouldCalculateRange() { 219 public boolean shouldCalculateRange() {
222 return theme.parseCalculateRange(); 220 return this.theme.parseCalculateRange();
223 } 221 }
224 } 222 }
225 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : 223 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org