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