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 :

http://dive4elements.wald.intevation.org