Mercurial > dive4elements > river
comparison flys-artifacts/src/main/java/de/intevation/flys/artifacts/services/QWSeriesCollection.java @ 3162:0d8146989012
Added labeling for Q/W points FixingsKMChartService.
flys-artifacts/trunk@4774 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Mon, 25 Jun 2012 11:38:33 +0000 |
parents | |
children | 6d0567a8387d |
comparison
equal
deleted
inserted
replaced
3161:cd8d81b2824d | 3162:0d8146989012 |
---|---|
1 package de.intevation.flys.artifacts.services; | |
2 | |
3 import de.intevation.flys.artifacts.model.fixings.QW; | |
4 | |
5 import de.intevation.flys.java2d.ShapeUtils; | |
6 | |
7 import de.intevation.flys.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(QW qw); | |
42 } // interface LabelGenerator | |
43 | |
44 public static class DateFormatLabelGenerator | |
45 implements LabelGenerator | |
46 { | |
47 protected DateFormat format; | |
48 | |
49 public DateFormatLabelGenerator() { | |
50 this(new SimpleDateFormat("dd.MM.yyyy")); | |
51 } | |
52 | |
53 public DateFormatLabelGenerator(DateFormat format) { | |
54 this.format = format; | |
55 } | |
56 | |
57 @Override | |
58 public String createLabel(QW qw) { | |
59 Date date = qw.getDate(); | |
60 return date != null ? format.format(date) : ""; | |
61 } | |
62 } // class DateFormatLabelGenerator | |
63 | |
64 public static final LabelGenerator SIMPLE_GENERATOR = | |
65 new DateFormatLabelGenerator(); | |
66 | |
67 protected Date minDate; | |
68 protected Date maxDate; | |
69 | |
70 protected List<List<QW>> labels; | |
71 | |
72 protected Rectangle2D area; | |
73 | |
74 protected LabelGenerator labelGenerator; | |
75 | |
76 protected Map<ShapeRenderer.Entry, Integer> knownShapes = | |
77 new HashMap<ShapeRenderer.Entry, Integer>(); | |
78 | |
79 public QWSeriesCollection() { | |
80 labels = new ArrayList<List<QW>>(); | |
81 labelGenerator = SIMPLE_GENERATOR; | |
82 } | |
83 | |
84 public QWSeriesCollection(LabelGenerator labelGenerator) { | |
85 this(); | |
86 this.labelGenerator = labelGenerator; | |
87 } | |
88 | |
89 protected static ShapeRenderer.Entry classify(QW qw) { | |
90 Shape shape = qw.getInterpolated() | |
91 ? ShapeUtils.INTERPOLATED_SHAPE | |
92 : ShapeUtils.MEASURED_SHAPE; | |
93 | |
94 boolean filled = !qw.getInterpolated(); | |
95 | |
96 return new ShapeRenderer.Entry( | |
97 shape, Color.black, filled); | |
98 } | |
99 | |
100 public void add(QW qw) { | |
101 | |
102 ShapeRenderer.Entry key = classify(qw); | |
103 | |
104 Integer seriesNo = knownShapes.get(key); | |
105 | |
106 XYSeries series; | |
107 | |
108 if (seriesNo == null) { | |
109 seriesNo = Integer.valueOf(getSeriesCount()); | |
110 knownShapes.put(key, seriesNo); | |
111 series = new XYSeries(seriesNo, false); | |
112 addSeries(series); | |
113 labels.add(new ArrayList<QW>()); | |
114 } | |
115 else { | |
116 series = getSeries(seriesNo); | |
117 } | |
118 | |
119 series.add(qw.getQ(), qw.getW()); | |
120 | |
121 labels.get(seriesNo).add(qw); | |
122 | |
123 extendDateRange(qw); | |
124 extendArea(qw); | |
125 } | |
126 | |
127 protected void extendDateRange(QW qw) { | |
128 Date date = qw.getDate(); | |
129 if (date != null) { | |
130 if (minDate == null) { | |
131 minDate = maxDate = date; | |
132 } | |
133 else { | |
134 if (date.compareTo(minDate) < 0) { | |
135 minDate = date; | |
136 } | |
137 if (date.compareTo(maxDate) > 0) { | |
138 maxDate = date; | |
139 } | |
140 } | |
141 } | |
142 } | |
143 | |
144 protected void extendArea(QW qw) { | |
145 if (area == null) { | |
146 area = new Rectangle2D.Double( | |
147 qw.getQ(), qw.getW(), 0d, 0d); | |
148 } | |
149 else { | |
150 area.add(qw.getQ(), qw.getW()); | |
151 } | |
152 } | |
153 | |
154 public Rectangle2D getArea() { | |
155 return area; | |
156 } | |
157 | |
158 public Date getMinDate() { | |
159 return minDate; | |
160 } | |
161 | |
162 public Date getMaxDate() { | |
163 return maxDate; | |
164 } | |
165 | |
166 public LabelGenerator getLabelGenerator() { | |
167 return labelGenerator; | |
168 } | |
169 | |
170 @Override | |
171 public String generateLabel(XYDataset dataset, int series, int item) { | |
172 return labelGenerator.createLabel(labels.get(series).get(item)); | |
173 } | |
174 | |
175 public StandardXYItemRenderer createRenderer() { | |
176 StandardXYItemRenderer renderer = new ShapeRenderer(knownShapes); | |
177 renderer.setBaseItemLabelGenerator(this); | |
178 renderer.setBaseSeriesVisibleInLegend(false); | |
179 renderer.setBaseItemLabelsVisible(true); | |
180 return renderer; | |
181 } | |
182 | |
183 public static final LegendItem legendItem( | |
184 String label, | |
185 Paint paint, | |
186 Shape shape, | |
187 boolean filled | |
188 ) { | |
189 BasicStroke stroke = new BasicStroke(); | |
190 return new LegendItem( | |
191 label, // label | |
192 null, // description | |
193 null, // tooltip | |
194 null, // url | |
195 true, // shape visible | |
196 shape, // shape | |
197 filled, // shape filled | |
198 filled ? paint : Color.white, // fill paint | |
199 true, // shape outline | |
200 paint, // outline paint | |
201 stroke, // outline stroke | |
202 false, // line visible | |
203 shape, // line | |
204 stroke, // line stroke | |
205 Color.white); | |
206 } | |
207 | |
208 public void addLegendItems(LegendItemCollection lic) { | |
209 for (ShapeRenderer.Entry entry: knownShapes.keySet()) { | |
210 // TODO: i18n | |
211 String label = entry.getFilled() | |
212 ? "gemessene Werte" | |
213 : "interpolierte Werte"; | |
214 lic.add(legendItem( | |
215 label, | |
216 entry.getPaint(), | |
217 entry.getShape(), | |
218 entry.getFilled())); | |
219 } | |
220 } | |
221 } | |
222 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |