comparison flys-artifacts/src/main/java/org/dive4elements/river/artifacts/services/QWSeriesCollection.java @ 5831:bd047b71ab37

Repaired internal references
author Sascha L. Teichmann <teichmann@intevation.de>
date Thu, 25 Apr 2013 12:06:39 +0200
parents flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/QWSeriesCollection.java@e727e3ebdf85
children
comparison
equal deleted inserted replaced
5830:160f53ee0870 5831:bd047b71ab37
1 package org.dive4elements.river.artifacts.services;
2
3 import org.dive4elements.river.artifacts.model.fixings.QWI;
4
5 import org.dive4elements.river.java2d.ShapeUtils;
6
7 import org.dive4elements.river.jfree.ShapeRenderer;
8
9 import java.awt.BasicStroke;
10 import java.awt.Color;
11 import java.awt.Paint;
12 import java.awt.Shape;
13
14 import java.awt.geom.Rectangle2D;
15
16 import java.text.DateFormat;
17 import java.text.SimpleDateFormat;
18
19 import java.util.ArrayList;
20 import java.util.Date;
21 import java.util.HashMap;
22 import java.util.List;
23 import java.util.Map;
24
25 import org.jfree.chart.LegendItem;
26 import org.jfree.chart.LegendItemCollection;
27
28 import org.jfree.chart.labels.XYItemLabelGenerator;
29
30 import org.jfree.chart.renderer.xy.StandardXYItemRenderer;
31
32 import org.jfree.data.xy.XYDataset;
33 import org.jfree.data.xy.XYSeries;
34 import org.jfree.data.xy.XYSeriesCollection;
35
36 public class QWSeriesCollection
37 extends XYSeriesCollection
38 implements XYItemLabelGenerator
39 {
40 public interface LabelGenerator {
41 String createLabel(QWI qw);
42 } // interface LabelGenerator
43
44 public static class DateFormatLabelGenerator
45 implements LabelGenerator
46 {
47 protected DateFormat format;
48
49 public DateFormatLabelGenerator() {
50 this("dd.MM.yyyy");
51 }
52
53 public DateFormatLabelGenerator(String format) {
54 this(new SimpleDateFormat(format));
55 }
56
57 public DateFormatLabelGenerator(DateFormat format) {
58 this.format = format;
59 }
60
61 @Override
62 public String createLabel(QWI qw) {
63 Date date = qw.getDate();
64 return date != null ? format.format(date) : "";
65 }
66 } // class DateFormatLabelGenerator
67
68 public static final LabelGenerator SIMPLE_GENERATOR =
69 new DateFormatLabelGenerator();
70
71 protected Date minDate;
72 protected Date maxDate;
73
74 protected List<List<QWI>> labels;
75
76 protected Rectangle2D area;
77
78 protected LabelGenerator labelGenerator;
79
80 protected Map<ShapeRenderer.Entry, Integer> knownShapes =
81 new HashMap<ShapeRenderer.Entry, Integer>();
82
83 public QWSeriesCollection() {
84 labels = new ArrayList<List<QWI>>();
85 labelGenerator = SIMPLE_GENERATOR;
86 }
87
88 public QWSeriesCollection(LabelGenerator labelGenerator) {
89 this();
90 this.labelGenerator = labelGenerator;
91 }
92
93 protected static ShapeRenderer.Entry classify(QWI qw) {
94 boolean interpolated = qw.getInterpolated();
95
96 Shape shape = interpolated
97 ? ShapeUtils.INTERPOLATED_SHAPE
98 : ShapeUtils.MEASURED_SHAPE;
99
100 boolean filled = !interpolated;
101 Color color = Color.blue;
102
103 return new ShapeRenderer.Entry(shape, color, filled);
104 }
105
106 public void add(QWI qw) {
107
108 ShapeRenderer.Entry key = classify(qw);
109
110 Integer seriesNo = knownShapes.get(key);
111
112 XYSeries series;
113
114 if (seriesNo == null) {
115 seriesNo = Integer.valueOf(getSeriesCount());
116 knownShapes.put(key, seriesNo);
117 series = new XYSeries(seriesNo, false);
118 addSeries(series);
119 labels.add(new ArrayList<QWI>());
120 }
121 else {
122 series = getSeries(seriesNo);
123 }
124
125 series.add(qw.getQ(), qw.getW());
126
127 labels.get(seriesNo).add(qw);
128
129 extendDateRange(qw);
130 extendArea(qw);
131 }
132
133 protected void extendDateRange(QWI qw) {
134 Date date = qw.getDate();
135 if (date != null) {
136 if (minDate == null) {
137 minDate = maxDate = date;
138 }
139 else {
140 if (date.compareTo(minDate) < 0) {
141 minDate = date;
142 }
143 if (date.compareTo(maxDate) > 0) {
144 maxDate = date;
145 }
146 }
147 }
148 }
149
150 protected void extendArea(QWI qw) {
151 if (area == null) {
152 area = new Rectangle2D.Double(
153 qw.getQ(), qw.getW(), 0d, 0d);
154 }
155 else {
156 area.add(qw.getQ(), qw.getW());
157 }
158 }
159
160 public Rectangle2D getArea() {
161 return area;
162 }
163
164 public Date getMinDate() {
165 return minDate;
166 }
167
168 public Date getMaxDate() {
169 return maxDate;
170 }
171
172 public LabelGenerator getLabelGenerator() {
173 return labelGenerator;
174 }
175
176 @Override
177 public String generateLabel(XYDataset dataset, int series, int item) {
178 return labelGenerator.createLabel(labels.get(series).get(item));
179 }
180
181 public StandardXYItemRenderer createRenderer() {
182 StandardXYItemRenderer renderer = new ShapeRenderer(knownShapes);
183 renderer.setBaseItemLabelGenerator(this);
184 renderer.setBaseSeriesVisibleInLegend(false);
185 renderer.setBaseItemLabelsVisible(true);
186 return renderer;
187 }
188
189 public static final LegendItem legendItem(
190 String label,
191 Paint paint,
192 Shape shape,
193 boolean filled
194 ) {
195 BasicStroke stroke = new BasicStroke();
196 return new LegendItem(
197 label, // label
198 null, // description
199 null, // tooltip
200 null, // url
201 true, // shape visible
202 shape, // shape
203 filled, // shape filled
204 filled ? paint : Color.white, // fill paint
205 true, // shape outline
206 paint, // outline paint
207 stroke, // outline stroke
208 false, // line visible
209 shape, // line
210 stroke, // line stroke
211 Color.white);
212 }
213
214 public void addLegendItems(
215 LegendItemCollection lic,
216 ShapeRenderer.LabelGenerator lg
217 ) {
218 for (ShapeRenderer.Entry entry: knownShapes.keySet()) {
219 lic.add(legendItem(
220 lg.createLabel(entry),
221 entry.getPaint(),
222 entry.getShape(),
223 entry.getFilled()));
224 }
225 }
226 }
227 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org