Mercurial > dive4elements > river
comparison gwt-client/src/main/java/org/dive4elements/river/client/client/ui/WQSimpleArrayPanel.java @ 5838:5aa05a7a34b7
Rename modules to more fitting names.
author | Sascha L. Teichmann <teichmann@intevation.de> |
---|---|
date | Thu, 25 Apr 2013 15:23:37 +0200 |
parents | flys-client/src/main/java/org/dive4elements/river/client/client/ui/WQSimpleArrayPanel.java@821a02bbfb4e |
children | 172338b1407f |
comparison
equal
deleted
inserted
replaced
5837:d9901a08d0a6 | 5838:5aa05a7a34b7 |
---|---|
1 package org.dive4elements.river.client.client.ui; | |
2 | |
3 import com.google.gwt.core.client.GWT; | |
4 import com.google.gwt.i18n.client.NumberFormat; | |
5 import com.google.gwt.user.client.rpc.AsyncCallback; | |
6 | |
7 import com.smartgwt.client.widgets.Canvas; | |
8 import com.smartgwt.client.widgets.Label; | |
9 import com.smartgwt.client.widgets.form.DynamicForm; | |
10 import com.smartgwt.client.widgets.form.fields.RadioGroupItem; | |
11 import com.smartgwt.client.widgets.form.fields.events.BlurEvent; | |
12 import com.smartgwt.client.widgets.form.fields.events.BlurHandler; | |
13 import com.smartgwt.client.widgets.form.fields.events.ChangedEvent; | |
14 import com.smartgwt.client.widgets.form.fields.events.ChangedHandler; | |
15 import com.smartgwt.client.widgets.layout.HLayout; | |
16 import com.smartgwt.client.widgets.layout.VLayout; | |
17 import com.smartgwt.client.widgets.tab.Tab; | |
18 import com.smartgwt.client.widgets.tab.TabSet; | |
19 | |
20 import org.dive4elements.river.client.client.Config; | |
21 import org.dive4elements.river.client.client.FLYSConstants; | |
22 import org.dive4elements.river.client.client.services.GaugeInfoService; | |
23 import org.dive4elements.river.client.client.services.GaugeInfoServiceAsync; | |
24 import org.dive4elements.river.client.client.services.WQInfoService; | |
25 import org.dive4elements.river.client.client.services.WQInfoServiceAsync; | |
26 import org.dive4elements.river.client.client.ui.wq.ClickableQDTable; | |
27 import org.dive4elements.river.client.client.ui.wq.ClickableWTable; | |
28 import org.dive4elements.river.client.client.ui.wq.ClickableWTable.ClickMode; | |
29 import org.dive4elements.river.client.client.widgets.DischargeTablesChart; | |
30 import org.dive4elements.river.client.shared.model.ArtifactDescription; | |
31 import org.dive4elements.river.client.shared.model.Data; | |
32 import org.dive4elements.river.client.shared.model.DataItem; | |
33 import org.dive4elements.river.client.shared.model.DataList; | |
34 import org.dive4elements.river.client.shared.model.DefaultData; | |
35 import org.dive4elements.river.client.shared.model.DefaultDataItem; | |
36 import org.dive4elements.river.client.shared.model.DoubleArrayData; | |
37 import org.dive4elements.river.client.shared.model.Gauge; | |
38 import org.dive4elements.river.client.shared.model.IntegerOptionsData; | |
39 import org.dive4elements.river.client.shared.model.WQInfoObject; | |
40 import org.dive4elements.river.client.shared.model.WQInfoRecord; | |
41 | |
42 import java.util.ArrayList; | |
43 import java.util.LinkedHashMap; | |
44 import java.util.List; | |
45 | |
46 | |
47 /** | |
48 * An UIProvider for inserting a mode for W or Q and an array of values for each | |
49 * mode. | |
50 * | |
51 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a> | |
52 */ | |
53 public class WQSimpleArrayPanel | |
54 extends AbstractUIProvider | |
55 implements BlurHandler | |
56 { | |
57 private static final long serialVersionUID = 3223369196267895010L; | |
58 | |
59 public static final String FIELD_MODE = "field_mode"; | |
60 public static final String FIELD_VALUES = "field_values"; | |
61 | |
62 public static final int MODE_W = 0; | |
63 | |
64 protected FLYSConstants MSG = GWT.create(FLYSConstants.class); | |
65 | |
66 protected GaugeInfoServiceAsync gaugeService = | |
67 GWT.create(GaugeInfoService.class); | |
68 | |
69 protected WQInfoServiceAsync wqInfoService = | |
70 GWT.create(WQInfoService.class); | |
71 | |
72 protected String modeName; | |
73 protected String valuesName; | |
74 | |
75 protected Canvas valuesWrapper; | |
76 | |
77 protected TabSet tabs; | |
78 | |
79 protected DynamicForm modeForm; | |
80 protected DoubleArrayPanel panelW; | |
81 protected DoubleArrayPanel panelQ; | |
82 | |
83 protected ClickableWTable wTable; | |
84 protected ClickableQDTable qTable; | |
85 | |
86 | |
87 @Override | |
88 public Canvas create(DataList data) { | |
89 VLayout rootLayout = new VLayout(); | |
90 rootLayout.addMember(createLabel(data)); | |
91 rootLayout.addMember(createModeForm(data)); | |
92 rootLayout.addMember(createValuesForm(data)); | |
93 rootLayout.addMember(getNextButton()); | |
94 | |
95 initializeMode(data); | |
96 initializeTables(); | |
97 initializeHelperPanel(); | |
98 | |
99 return rootLayout; | |
100 } | |
101 | |
102 | |
103 @Override | |
104 public Canvas createOld(DataList dataList) { | |
105 IntegerOptionsData modeData = findOptionsData(dataList); | |
106 DoubleArrayData valuesData = findValuesData(dataList); | |
107 | |
108 DataItem[] modeItems = modeData.getItems(); | |
109 | |
110 HLayout layout = new HLayout(); | |
111 VLayout valueContainer = new VLayout(); | |
112 | |
113 Label label = new Label(dataList.getLabel()); | |
114 label.setWidth(200); | |
115 label.setHeight(20); | |
116 | |
117 Label mode = new Label(modeItems[0].getLabel()); | |
118 mode.setHeight(20); | |
119 mode.setWidth(150); | |
120 | |
121 Canvas values = createOldValues(modeData, valuesData); | |
122 values.setWidth(150); | |
123 | |
124 valueContainer.addMember(mode); | |
125 valueContainer.addMember(values); | |
126 | |
127 layout.addMember(label); | |
128 layout.addMember(valueContainer); | |
129 layout.addMember(getBackButton(dataList.getState())); | |
130 | |
131 return layout; | |
132 } | |
133 | |
134 | |
135 @Override | |
136 protected Data[] getData() { | |
137 Data mode = getModeAsData(); | |
138 | |
139 if (getMode() == MODE_W) { | |
140 return new Data[] { mode, getWValuesAsData() }; | |
141 } | |
142 else { | |
143 return new Data[] { mode, getQValuesAsData() }; | |
144 } | |
145 } | |
146 | |
147 | |
148 @Override | |
149 public List<String> validate() { | |
150 List<String> errors = new ArrayList<String>(); | |
151 | |
152 // TODO IMPLEMENT ME | |
153 | |
154 return errors; | |
155 } | |
156 | |
157 | |
158 @Override | |
159 public void onBlur(BlurEvent event) { | |
160 // TODO TRIGGER VALIDATION HERE | |
161 } | |
162 | |
163 | |
164 protected void initializeMode(DataList dataList) { | |
165 IntegerOptionsData data = findOptionsData(dataList); | |
166 DataItem[] items = data != null ? data.getItems() : null; | |
167 | |
168 if (items != null) { | |
169 String value = items[0].getStringValue(); | |
170 modeForm.setValue(modeName, value); | |
171 switchMode(value); | |
172 } | |
173 } | |
174 | |
175 | |
176 /** Initialize the w/q/d tables for the helper area. */ | |
177 protected void initializeTables() { | |
178 wTable = new ClickableWTable(new ClickableWTable.WClickedListener() { | |
179 @Override | |
180 public void clickedUpper(double value) { | |
181 // nothing to do here | |
182 } | |
183 | |
184 @Override | |
185 public void clickedLower(double value) { | |
186 panelW.addValue(value); | |
187 } | |
188 }, ClickMode.SINGLE, true); | |
189 | |
190 qTable = new ClickableQDTable(new ClickableQDTable.QClickedListener() { | |
191 | |
192 @Override | |
193 public void clickedUpper(double value) { | |
194 // nothing to do here | |
195 } | |
196 | |
197 @Override | |
198 public void clickedLower(double value) { | |
199 panelQ.addValue(value); | |
200 } | |
201 }, ClickableQDTable.ClickMode.SINGLE); | |
202 | |
203 fetchWQData(); | |
204 } | |
205 | |
206 | |
207 /** Put interactive tables to the helper area. */ | |
208 protected void initializeHelperPanel() { | |
209 tabs = new TabSet(); | |
210 tabs.setWidth100(); | |
211 tabs.setHeight100(); | |
212 | |
213 Tab w = new Tab(MSG.wq_table_w()); | |
214 Tab q = new Tab(MSG.wq_table_q()); | |
215 Tab c = new Tab(MSG.discharge_tables_chart()); | |
216 | |
217 w.setPane(wTable); | |
218 q.setPane(qTable); | |
219 c.setPane(new DischargeTablesChart(this.artifact)); | |
220 | |
221 tabs.addTab(w, 0); | |
222 tabs.addTab(q, 1); | |
223 tabs.addTab(c, 2); | |
224 | |
225 helperContainer.addMember(tabs); | |
226 } | |
227 | |
228 | |
229 protected void fetchWQData() { | |
230 ArtifactDescription desc = artifact.getArtifactDescription(); | |
231 | |
232 final String river = desc.getRiver(); | |
233 final String refGauge = desc.getReferenceGauge(); | |
234 | |
235 gaugeService.getGaugeInfo(river, refGauge, new AsyncCallback<List<Gauge>>() { | |
236 @Override | |
237 public void onFailure(Throwable throwable) { | |
238 GWT.log("ERROR WHILE FETCHING GAUGES!"); | |
239 } | |
240 | |
241 @Override | |
242 public void onSuccess(List<Gauge> gauges) { | |
243 Gauge g = gauges.get(0); | |
244 updateWQData(river, g.getLower(), g.getUpper()); | |
245 } | |
246 }); | |
247 } | |
248 | |
249 | |
250 protected void updateWQData(String river, double lower, double upper) { | |
251 GWT.log("FETCH WQ INFO FOR " + lower + " - " + upper + " now!"); | |
252 | |
253 Config config = Config.getInstance(); | |
254 String locale = config.getLocale(); | |
255 | |
256 wqInfoService.getWQInfo(locale, river, lower, upper, | |
257 new AsyncCallback<WQInfoObject[]>() { | |
258 @Override | |
259 public void onFailure(Throwable caught) { | |
260 GWT.log("Could not recieve wq informations."); | |
261 } | |
262 | |
263 @Override | |
264 public void onSuccess(WQInfoObject[] wqi) { | |
265 int num = wqi != null ? wqi.length :0; | |
266 GWT.log("Recieved " + num + " wq informations."); | |
267 | |
268 if (num == 0) { | |
269 return; | |
270 } | |
271 | |
272 addWQInfo(wqi); | |
273 } | |
274 } | |
275 ); | |
276 } | |
277 | |
278 | |
279 protected void addWQInfo (WQInfoObject[] wqi) { | |
280 for(WQInfoObject wi: wqi) { | |
281 WQInfoRecord rec = new WQInfoRecord(wi); | |
282 | |
283 if (wi.getType().equals("W")) { | |
284 wTable.addData(rec); | |
285 } | |
286 else { | |
287 qTable.addData(rec); | |
288 } | |
289 } | |
290 } | |
291 | |
292 | |
293 protected Canvas createLabel(DataList dataList) { | |
294 Label label = new Label(MSG.wqHistorical()); | |
295 label.setWidth100(); | |
296 label.setHeight(25); | |
297 | |
298 return label; | |
299 } | |
300 | |
301 | |
302 protected Canvas createOldValues( | |
303 IntegerOptionsData modeData, | |
304 DoubleArrayData valuesData | |
305 ) { | |
306 NumberFormat nf = NumberFormat.getDecimalFormat(); | |
307 | |
308 DataItem[] items = modeData.getItems(); | |
309 String unit = items[0].getStringValue().equals("0") ? "cm" : "m³/s"; | |
310 | |
311 VLayout layout = new VLayout(); | |
312 | |
313 for (double val: valuesData.getValues()) { | |
314 Label tmp = new Label(nf.format(val) + " " + unit); | |
315 tmp.setHeight(20); | |
316 layout.addMember(tmp); | |
317 } | |
318 | |
319 return layout; | |
320 } | |
321 | |
322 | |
323 protected DoubleArrayData findValuesData(DataList dataList) { | |
324 for (int i = 0, n = dataList.size(); i < n; i++) { | |
325 Data tmp = dataList.get(i); | |
326 | |
327 if (tmp instanceof DoubleArrayData) { | |
328 return (DoubleArrayData) tmp; | |
329 } | |
330 } | |
331 | |
332 return null; | |
333 } | |
334 | |
335 | |
336 protected IntegerOptionsData findOptionsData(DataList dataList) { | |
337 for (int i = 0, n = dataList.size(); i < n; i++) { | |
338 Data tmp = dataList.get(i); | |
339 | |
340 if (tmp instanceof IntegerOptionsData) { | |
341 return (IntegerOptionsData) tmp; | |
342 } | |
343 } | |
344 | |
345 return null; | |
346 } | |
347 | |
348 | |
349 protected Canvas createModeForm(DataList dataList) { | |
350 IntegerOptionsData data = findOptionsData(dataList); | |
351 DataItem[] opts = data != null ? data.getItems() : null; | |
352 | |
353 if (data == null || opts == null) { | |
354 return new Label("NO MODES FOUND"); | |
355 } | |
356 | |
357 modeName = data.getLabel(); | |
358 modeForm = new DynamicForm(); | |
359 | |
360 RadioGroupItem items = new RadioGroupItem(data.getLabel()); | |
361 LinkedHashMap values = new LinkedHashMap(); | |
362 | |
363 for (DataItem opt: opts) { | |
364 values.put(opt.getStringValue(), opt.getLabel()); | |
365 } | |
366 | |
367 items.setValueMap(values); | |
368 items.setVertical(false); | |
369 items.setShowTitle(false); | |
370 items.addChangedHandler(new ChangedHandler() { | |
371 @Override | |
372 public void onChanged(ChangedEvent event) { | |
373 switchMode((String) event.getValue()); | |
374 } | |
375 }); | |
376 | |
377 modeForm.setFields(items); | |
378 | |
379 return modeForm; | |
380 } | |
381 | |
382 | |
383 protected Canvas createValuesForm(DataList dataList) { | |
384 DoubleArrayData data = findValuesData(dataList); | |
385 | |
386 if (data == null) { | |
387 return new Label("NO VALUES GIVEN!"); | |
388 } | |
389 | |
390 valuesName = data.getLabel(); | |
391 panelW = new DoubleArrayPanel(MSG.unitWSingle(), null, this); | |
392 panelQ = new DoubleArrayPanel(MSG.unitQSingle(), null, this); | |
393 | |
394 valuesWrapper = new Canvas(); | |
395 valuesWrapper.setWidth100(); | |
396 valuesWrapper.setHeight(35); | |
397 | |
398 return valuesWrapper; | |
399 } | |
400 | |
401 | |
402 public void switchMode(String newMode) { | |
403 for (Canvas child: valuesWrapper.getChildren()) { | |
404 valuesWrapper.removeChild(child); | |
405 } | |
406 | |
407 if (newMode.equals("0")) { | |
408 valuesWrapper.addChild(panelW); | |
409 showWTable(); | |
410 } | |
411 else if (newMode.equals("1")) { | |
412 valuesWrapper.addChild(panelQ); | |
413 showQDTable(); | |
414 } | |
415 } | |
416 | |
417 public void showWTable() { | |
418 if (tabs != null) { | |
419 tabs.selectTab(0); | |
420 } | |
421 } | |
422 | |
423 public void showQDTable() { | |
424 if (tabs != null) { | |
425 tabs.selectTab(1); | |
426 } | |
427 } | |
428 | |
429 | |
430 public String getModeAsString() { | |
431 return (String) modeForm.getValue(modeName); | |
432 } | |
433 | |
434 | |
435 public int getMode() { | |
436 String modeValue = getModeAsString(); | |
437 | |
438 try { | |
439 return Integer.valueOf(modeValue); | |
440 } | |
441 catch (NumberFormatException nfe) { | |
442 // do something | |
443 } | |
444 catch (NullPointerException npe) { | |
445 // do something | |
446 } | |
447 | |
448 return -1; | |
449 } | |
450 | |
451 | |
452 public Data getModeAsData() { | |
453 String value = getModeAsString(); | |
454 DataItem item = new DefaultDataItem(value, value, value); | |
455 | |
456 return new DefaultData(modeName, null, null, new DataItem[] { item }); | |
457 } | |
458 | |
459 | |
460 public Data getWValuesAsData() { | |
461 double[] values = panelW.getInputValues(); | |
462 String valueStr = getStringValue(values); | |
463 | |
464 DataItem item = new DefaultDataItem(valueStr, valueStr, valueStr); | |
465 | |
466 return new DefaultData(valuesName, null, null, new DataItem[] { item }); | |
467 } | |
468 | |
469 | |
470 public Data getQValuesAsData() { | |
471 double[] values = panelQ.getInputValues(); | |
472 String valueStr = getStringValue(values); | |
473 | |
474 DataItem item = new DefaultDataItem(valueStr, valueStr, valueStr); | |
475 | |
476 return new DefaultData(valuesName, null, null, new DataItem[] { item }); | |
477 } | |
478 | |
479 | |
480 protected static String getStringValue(double[] values) { | |
481 StringBuilder sb = new StringBuilder(); | |
482 boolean first = true; | |
483 | |
484 for (double value: values) { | |
485 if (first) { | |
486 sb.append(String.valueOf(value)); | |
487 first = false; | |
488 } | |
489 else { | |
490 sb.append(";" + String.valueOf(value)); | |
491 } | |
492 } | |
493 | |
494 return sb.toString(); | |
495 } | |
496 } | |
497 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |