Mercurial > dive4elements > river
comparison gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DistancePanel.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/DistancePanel.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 | |
6 import com.smartgwt.client.data.AdvancedCriteria; | |
7 import com.smartgwt.client.data.Criteria; | |
8 import com.smartgwt.client.data.Criterion; | |
9 import com.smartgwt.client.data.Record; | |
10 import com.smartgwt.client.types.Alignment; | |
11 import com.smartgwt.client.types.OperatorId; | |
12 import com.smartgwt.client.util.SC; | |
13 import com.smartgwt.client.widgets.Canvas; | |
14 import com.smartgwt.client.widgets.Label; | |
15 import com.smartgwt.client.widgets.form.DynamicForm; | |
16 import com.smartgwt.client.widgets.form.fields.SelectItem; | |
17 import com.smartgwt.client.widgets.form.fields.StaticTextItem; | |
18 import com.smartgwt.client.widgets.form.fields.events.BlurEvent; | |
19 import com.smartgwt.client.widgets.form.fields.events.BlurHandler; | |
20 import com.smartgwt.client.widgets.form.fields.events.ChangedEvent; | |
21 import com.smartgwt.client.widgets.form.fields.events.ChangedHandler; | |
22 import com.smartgwt.client.widgets.grid.ListGrid; | |
23 import com.smartgwt.client.widgets.grid.events.RecordClickEvent; | |
24 import com.smartgwt.client.widgets.grid.events.RecordClickHandler; | |
25 import com.smartgwt.client.widgets.layout.HLayout; | |
26 import com.smartgwt.client.widgets.layout.VLayout; | |
27 import com.smartgwt.client.widgets.tab.Tab; | |
28 import com.smartgwt.client.widgets.tab.TabSet; | |
29 import com.smartgwt.client.widgets.tab.events.TabSelectedEvent; | |
30 import com.smartgwt.client.widgets.tab.events.TabSelectedHandler; | |
31 | |
32 import org.dive4elements.river.client.client.Config; | |
33 import org.dive4elements.river.client.client.FLYSConstants; | |
34 import org.dive4elements.river.client.client.event.FilterHandler; | |
35 import org.dive4elements.river.client.client.event.RangeFilterEvent; | |
36 import org.dive4elements.river.client.client.event.StringFilterEvent; | |
37 import org.dive4elements.river.client.client.ui.range.DistanceInfoDataSource; | |
38 import org.dive4elements.river.client.client.ui.range.LocationsTable; | |
39 import org.dive4elements.river.client.client.ui.range.RangeTable; | |
40 import org.dive4elements.river.client.shared.model.ArtifactDescription; | |
41 import org.dive4elements.river.client.shared.model.Data; | |
42 import org.dive4elements.river.client.shared.model.DataItem; | |
43 import org.dive4elements.river.client.shared.model.DataList; | |
44 import org.dive4elements.river.client.shared.model.DefaultData; | |
45 import org.dive4elements.river.client.shared.model.DefaultDataItem; | |
46 | |
47 import java.util.ArrayList; | |
48 import java.util.LinkedHashMap; | |
49 import java.util.List; | |
50 | |
51 | |
52 public class DistancePanel extends AbstractUIProvider implements BlurHandler, FilterHandler | |
53 { | |
54 | |
55 private static final long serialVersionUID = -883142387908664588L; | |
56 | |
57 public static final int DEFAULT_STEP_WIDTH = 100; | |
58 | |
59 public static final String FIELD_LOWER = "ld_from"; | |
60 public static final String FIELD_UPPER = "ld_to"; | |
61 public static final String FIELD_STEP = "ld_step"; | |
62 | |
63 | |
64 protected FLYSConstants MSG = GWT.create(FLYSConstants.class); | |
65 | |
66 protected RangeTable distancesTable; | |
67 protected LocationsTable locationsTable; | |
68 | |
69 protected DoubleRangePanel distancePanel; | |
70 | |
71 protected TableFilter filterDescription; | |
72 protected RangeTableFilter filterRange; | |
73 | |
74 protected TabSet tabs; | |
75 | |
76 protected double min; | |
77 protected double max; | |
78 | |
79 protected StaticTextItem filterResultCount; | |
80 protected ListGrid currentFiltered; | |
81 | |
82 public DistancePanel() { | |
83 this("right"); | |
84 } | |
85 | |
86 | |
87 public DistancePanel(String labelOrientation) { | |
88 distancePanel = new DoubleRangePanel( | |
89 labelFrom(), labelTo(), labelStep(), | |
90 0d, 0d, 0d, 250, this, labelOrientation); | |
91 } | |
92 | |
93 | |
94 @Override | |
95 public Canvas create(DataList data) { | |
96 VLayout layout = new VLayout(); | |
97 layout.setMembersMargin(10); | |
98 | |
99 Label label = new Label(getLabel()); | |
100 | |
101 Canvas submit = getNextButton(); | |
102 | |
103 label.setHeight(25); | |
104 distancePanel.setHeight(50); | |
105 | |
106 layout.addMember(label); | |
107 layout.addMember(distancePanel); | |
108 layout.addMember(submit); | |
109 | |
110 initMinMaxValues(data); | |
111 initDefaultValues(data); | |
112 initHelperPanel(); | |
113 | |
114 return layout; | |
115 } | |
116 | |
117 | |
118 @Override | |
119 public Canvas createOld(DataList dataList) { | |
120 String s = getOldSelectionString(dataList); | |
121 String l = dataList.getLabel(); | |
122 | |
123 Label label = new Label(l); | |
124 Label selected = new Label(s); | |
125 | |
126 HLayout layout = new HLayout(); | |
127 | |
128 layout.setWidth(400); | |
129 label.setWidth(200); | |
130 selected.setWidth(130); | |
131 | |
132 layout.addMember(label); | |
133 layout.addMember(selected); | |
134 layout.addMember(getBackButton(dataList.getState())); | |
135 | |
136 return layout; | |
137 } | |
138 | |
139 | |
140 protected String getOldSelectionString(DataList dataList) { | |
141 List<Data> items = dataList.getAll(); | |
142 | |
143 Data dFrom = getData(items, getLowerField()); | |
144 Data dTo = getData(items, getUpperField()); | |
145 Data dStep = getData(items, getStepField()); | |
146 | |
147 DataItem[] from = dFrom.getItems(); | |
148 DataItem[] to = dTo.getItems(); | |
149 DataItem[] step = dStep.getItems(); | |
150 | |
151 StringBuilder sb = new StringBuilder(); | |
152 sb.append(from[0].getLabel()); | |
153 sb.append(" " + getUnitFrom() + " - "); | |
154 sb.append(to[0].getLabel()); | |
155 sb.append(" " + getUnitTo() + " - "); | |
156 sb.append(step[0].getLabel()); | |
157 sb.append(" " + getUnitStep()); | |
158 | |
159 return sb.toString(); | |
160 } | |
161 | |
162 | |
163 protected String getLabel() { | |
164 return MSG.distance_state(); | |
165 } | |
166 | |
167 | |
168 protected String labelFrom() { | |
169 return getLabelFrom() + " [" + getUnitFrom() + "]"; | |
170 } | |
171 | |
172 | |
173 protected String getLabelFrom() { | |
174 return MSG.dpLabelFrom(); | |
175 } | |
176 | |
177 | |
178 protected String getUnitFrom() { | |
179 return MSG.dpUnitFrom(); | |
180 } | |
181 | |
182 | |
183 protected String labelTo() { | |
184 return getLabelTo() + " [" + getUnitTo() + "]"; | |
185 } | |
186 | |
187 | |
188 protected String getLabelTo() { | |
189 return MSG.dpLabelTo(); | |
190 } | |
191 | |
192 | |
193 protected String getUnitTo() { | |
194 return MSG.dpUnitTo(); | |
195 } | |
196 | |
197 | |
198 protected String labelStep() { | |
199 return getLabelStep() + " [" + getUnitStep() + "]"; | |
200 } | |
201 | |
202 | |
203 protected String getLabelStep() { | |
204 return MSG.dpLabelStep(); | |
205 } | |
206 | |
207 | |
208 protected String getUnitStep() { | |
209 return MSG.dpUnitStep(); | |
210 } | |
211 | |
212 | |
213 protected String getLowerField() { | |
214 return FIELD_LOWER; | |
215 } | |
216 | |
217 | |
218 protected String getUpperField() { | |
219 return FIELD_UPPER; | |
220 } | |
221 | |
222 | |
223 protected String getStepField() { | |
224 return FIELD_STEP; | |
225 } | |
226 | |
227 | |
228 @Override | |
229 public List<String> validate() { | |
230 List<String> errors = new ArrayList<String>(); | |
231 | |
232 if (!distancePanel.validateForm()) { | |
233 errors.add(MSG.wrongFormat()); | |
234 | |
235 return errors; | |
236 } | |
237 | |
238 validateFrom(errors); | |
239 validateTo(errors); | |
240 | |
241 return errors; | |
242 } | |
243 | |
244 | |
245 protected void validateFrom(List<String> errors) { | |
246 double from = distancePanel.getFrom(); | |
247 | |
248 if (from < min || from > max) { | |
249 NumberFormat nf = NumberFormat.getDecimalFormat(); | |
250 | |
251 String tmp = MSG.error_validate_lower_range(); | |
252 tmp = tmp.replace("$1", nf.format(from)); | |
253 tmp = tmp.replace("$2", nf.format(min)); | |
254 | |
255 distancePanel.setFrom(min); | |
256 errors.add(tmp); | |
257 } | |
258 } | |
259 | |
260 | |
261 protected void validateTo(List<String> errors) { | |
262 double to = distancePanel.getTo(); | |
263 | |
264 if (to < min || to > max) { | |
265 NumberFormat nf = NumberFormat.getDecimalFormat(); | |
266 | |
267 String tmp = MSG.error_validate_upper_range(); | |
268 tmp = tmp.replace("$1", nf.format(to)); | |
269 tmp = tmp.replace("$2", nf.format(max)); | |
270 | |
271 distancePanel.setTo(max); | |
272 errors.add(tmp); | |
273 } | |
274 } | |
275 | |
276 | |
277 @Override | |
278 public Data[] getData() { | |
279 Data[] data = new Data[4]; | |
280 | |
281 data[0] = getDataFrom(); | |
282 data[1] = getDataTo(); | |
283 data[2] = getDataStep(); | |
284 | |
285 DataItem item = new DefaultDataItem("ld_mode","ld_mode", "distance"); | |
286 data[3] = new DefaultData( | |
287 "ld_mode", null, null, new DataItem[] { item }); | |
288 | |
289 return data; | |
290 } | |
291 | |
292 | |
293 protected Data getDataFrom() { | |
294 String value = String.valueOf(distancePanel.getFrom()); | |
295 String field = getLowerField(); | |
296 | |
297 DataItem item = new DefaultDataItem(field, field, value); | |
298 return new DefaultData( | |
299 field, null, null, new DataItem[] { item }); | |
300 } | |
301 | |
302 | |
303 protected Data getDataTo() { | |
304 String value = String.valueOf(distancePanel.getTo()); | |
305 String field = getUpperField(); | |
306 | |
307 DataItem item = new DefaultDataItem(field, field, value); | |
308 return new DefaultData( | |
309 field, null, null, new DataItem[] { item }); | |
310 } | |
311 | |
312 | |
313 protected Data getDataStep() { | |
314 String value = String.valueOf(distancePanel.getStep()); | |
315 String field = getStepField(); | |
316 | |
317 DataItem item = new DefaultDataItem(field, field, value); | |
318 return new DefaultData( | |
319 field, null, null, new DataItem[] { item }); | |
320 } | |
321 | |
322 | |
323 @Override | |
324 public void onBlur(BlurEvent event) { | |
325 distancePanel.validateForm(); | |
326 } | |
327 | |
328 | |
329 protected void initMinMaxValues(DataList data) { | |
330 Data f = getData(data.getAll(), getLowerField()); | |
331 Data t = getData(data.getAll(), getUpperField()); | |
332 | |
333 DataItem[] fItems = f.getItems(); | |
334 DataItem[] tItems = t.getItems(); | |
335 | |
336 try { | |
337 min = Double.valueOf(fItems[0].getStringValue()); | |
338 max = Double.valueOf(tItems[0].getStringValue()); | |
339 } | |
340 catch (NumberFormatException nfe) { | |
341 min = -Double.MAX_VALUE; | |
342 max = Double.MAX_VALUE; | |
343 } | |
344 } | |
345 | |
346 | |
347 protected void initDefaultValues(DataList data) { | |
348 initDefaultFrom(data); | |
349 initDefaultTo(data); | |
350 initDefaultStep(data); | |
351 } | |
352 | |
353 | |
354 protected void initDefaultFrom(DataList data) { | |
355 Data f = getData(data.getAll(), getLowerField()); | |
356 | |
357 double from = getDefaultFrom(); | |
358 | |
359 try { | |
360 from = getDefaultValue(f); | |
361 } | |
362 catch (NumberFormatException nfe) { | |
363 // do nothing | |
364 } | |
365 | |
366 distancePanel.setFrom(from); | |
367 } | |
368 | |
369 | |
370 protected double getDefaultFrom() { | |
371 return min; | |
372 } | |
373 | |
374 | |
375 protected void initDefaultTo(DataList data) { | |
376 Data t = getData(data.getAll(), getUpperField()); | |
377 | |
378 double to = getDefaultTo(); | |
379 | |
380 try { | |
381 to = getDefaultValue(t); | |
382 } | |
383 catch (NumberFormatException nfe) { | |
384 // do nothing | |
385 } | |
386 | |
387 distancePanel.setTo(to); | |
388 } | |
389 | |
390 | |
391 protected double getDefaultTo() { | |
392 return max; | |
393 } | |
394 | |
395 | |
396 protected void initDefaultStep(DataList data) { | |
397 Data s = getData(data.getAll(), getStepField()); | |
398 | |
399 double step = getDefaultStep(); | |
400 | |
401 try { | |
402 step = getDefaultValue(s); | |
403 } | |
404 catch (NumberFormatException nfe) { | |
405 // do nothing | |
406 } | |
407 | |
408 distancePanel.setStep(step); | |
409 } | |
410 | |
411 | |
412 protected double getDefaultStep() { | |
413 return DEFAULT_STEP_WIDTH; | |
414 } | |
415 | |
416 | |
417 protected double getDefaultValue(Data data) | |
418 throws NumberFormatException | |
419 { | |
420 DataItem def = data.getDefault(); | |
421 String defValue = def != null ? def.getStringValue() : null; | |
422 | |
423 return Double.valueOf(defValue); | |
424 } | |
425 | |
426 | |
427 protected void initHelperPanel() { | |
428 distancesTable = new RangeTable(); | |
429 locationsTable = new LocationsTable(); | |
430 | |
431 Config config = Config.getInstance(); | |
432 String url = config.getServerUrl(); | |
433 String river = getRiverName(); | |
434 | |
435 distancesTable.setAutoFetchData(true); | |
436 locationsTable.setAutoFetchData(true); | |
437 distancesTable.setDataSource(new DistanceInfoDataSource( | |
438 url, river, "distances")); | |
439 locationsTable.setDataSource(new DistanceInfoDataSource( | |
440 url, river, "locations")); | |
441 | |
442 distancesTable.addRecordClickHandler(new RecordClickHandler() { | |
443 @Override | |
444 public void onRecordClick(RecordClickEvent e) { | |
445 Record r = e.getRecord(); | |
446 | |
447 String from = r.getAttribute("from"); | |
448 String to = r.getAttribute("to"); | |
449 | |
450 try { | |
451 distancePanel.setFrom(Double.valueOf(from)); | |
452 distancePanel.setTo(Double.valueOf(to)); | |
453 } | |
454 catch (NumberFormatException nfe) { | |
455 SC.warn(MSG.wrongFormat()); | |
456 } | |
457 } | |
458 }); | |
459 | |
460 locationsTable.addRecordClickHandler(new RecordClickHandler() { | |
461 @Override | |
462 public void onRecordClick(RecordClickEvent e) { | |
463 Record r = e.getRecord(); | |
464 int field = e.getFieldNum(); | |
465 | |
466 try { | |
467 String value = r.getAttribute("from"); | |
468 | |
469 switch (field) { | |
470 case 0: | |
471 distancePanel.setFrom(Double.valueOf(value)); | |
472 break; | |
473 case 1: | |
474 distancePanel.setTo(Double.valueOf(value)); | |
475 break; | |
476 } | |
477 } | |
478 catch (NumberFormatException nfe) { | |
479 SC.warn(MSG.wrongFormat()); | |
480 } | |
481 } | |
482 }); | |
483 | |
484 tabs = new TabSet(); | |
485 tabs.setWidth100(); | |
486 tabs.setHeight100(); | |
487 | |
488 Tab locations = new Tab(MSG.locations()); | |
489 Tab distances = new Tab(MSG.distance()); | |
490 | |
491 locations.setPane(locationsTable); | |
492 distances.setPane(distancesTable); | |
493 | |
494 tabs.addTab(locations, 0); | |
495 tabs.addTab(distances, 1); | |
496 | |
497 filterResultCount = new StaticTextItem(MSG.resultCount()); | |
498 filterResultCount.setTitleAlign(Alignment.LEFT); | |
499 filterResultCount.setTitleStyle("color: #000"); | |
500 | |
501 filterDescription = new TableFilter(); | |
502 filterDescription.setHeight("30px"); | |
503 filterDescription.addFilterHandler(this); | |
504 | |
505 filterRange = new RangeTableFilter(); | |
506 filterRange.setHeight("30px"); | |
507 filterRange.addFilterHandler(this); | |
508 filterRange.setVisible(false); | |
509 | |
510 SelectItem filterCriteria = new SelectItem(); | |
511 filterCriteria.setShowTitle(false); | |
512 filterCriteria.setWidth(100); | |
513 filterCriteria.addChangedHandler(new ChangedHandler() { | |
514 @Override | |
515 public void onChanged(ChangedEvent e) { | |
516 if(e.getValue().toString().equals("range")) { | |
517 filterRange.setVisible(true); | |
518 filterDescription.setVisible(false); | |
519 filterDescription.clear(); | |
520 } | |
521 else { | |
522 filterRange.setVisible(false); | |
523 filterRange.clear(); | |
524 filterDescription.setVisible(true); | |
525 } | |
526 } | |
527 }); | |
528 | |
529 LinkedHashMap<String, String> filterMap = | |
530 new LinkedHashMap<String, String>(); | |
531 filterMap.put("description", MSG.description()); | |
532 filterMap.put("range", MSG.range()); | |
533 filterCriteria.setValueMap(filterMap); | |
534 filterCriteria.setValue("description"); | |
535 | |
536 DynamicForm form = new DynamicForm(); | |
537 form.setFields(filterCriteria); | |
538 | |
539 DynamicForm form2 = new DynamicForm(); | |
540 form2.setFields(filterResultCount); | |
541 | |
542 HLayout filterLayout = new HLayout(); | |
543 filterLayout.addMember(form); | |
544 filterLayout.addMember(filterDescription); | |
545 filterLayout.addMember(filterRange); | |
546 filterLayout.setHeight(30); | |
547 tabs.addTabSelectedHandler(new TabSelectedHandler() { | |
548 @Override | |
549 public void onTabSelected(TabSelectedEvent evt) { | |
550 filterDescription.clear(); | |
551 filterRange.clear(); | |
552 filterResultCount.setValue(""); | |
553 | |
554 Canvas c = evt.getTabPane(); | |
555 if(c instanceof ListGrid) { | |
556 currentFiltered = (ListGrid)c; | |
557 } | |
558 } | |
559 }); | |
560 | |
561 helperContainer.addMember(tabs); | |
562 helperContainer.addMember(filterLayout); | |
563 helperContainer.addMember(form2); | |
564 } | |
565 | |
566 | |
567 @Override | |
568 public void onFilterCriteriaChanged(StringFilterEvent event) { | |
569 String search = event.getFilter(); | |
570 | |
571 if (search != null && search.length() > 0) { | |
572 Criteria c = new Criteria("description", search); | |
573 locationsTable.filterData(c); | |
574 distancesTable.filterData(c); | |
575 filterResultCount.setValue(currentFiltered.getRecords().length); | |
576 } | |
577 else { | |
578 locationsTable.clearCriteria(); | |
579 distancesTable.clearCriteria(); | |
580 filterResultCount.setValue(""); | |
581 } | |
582 } | |
583 | |
584 | |
585 @Override | |
586 public void onFilterCriteriaChanged(RangeFilterEvent event) { | |
587 Float from = event.getFrom() - 0.001f; | |
588 Float to = event.getTo() + 0.001f; | |
589 | |
590 Criterion combinedFilter = null; | |
591 Criterion locationFilter = null; | |
592 if (from.equals(Float.NaN) && to.equals(Float.NaN)) { | |
593 locationsTable.clearCriteria(); | |
594 distancesTable.clearCriteria(); | |
595 filterResultCount.setValue(""); | |
596 return; | |
597 } | |
598 else if (from.equals(Float.NaN)) { | |
599 combinedFilter = new Criterion("to", OperatorId.LESS_OR_EQUAL, to); | |
600 locationFilter = | |
601 new Criterion("from", OperatorId.LESS_OR_EQUAL, to); | |
602 locationsTable.filterData(locationFilter); | |
603 distancesTable.filterData(combinedFilter); | |
604 filterResultCount.setValue(currentFiltered.getRecords().length); | |
605 return; | |
606 } | |
607 else if (to.equals(Float.NaN)) { | |
608 combinedFilter = | |
609 new Criterion("from", OperatorId.GREATER_OR_EQUAL, from); | |
610 } | |
611 else { | |
612 AdvancedCriteria c1 = | |
613 new AdvancedCriteria(OperatorId.AND, new Criterion[] { | |
614 new Criterion("from", OperatorId.GREATER_OR_EQUAL, from), | |
615 new Criterion("from", OperatorId.LESS_OR_EQUAL, to) | |
616 }); | |
617 | |
618 AdvancedCriteria c2 = | |
619 new AdvancedCriteria(OperatorId.AND, new Criterion[] { | |
620 new Criterion("to", OperatorId.GREATER_OR_EQUAL, from), | |
621 new Criterion("to", OperatorId.LESS_OR_EQUAL, to) | |
622 }); | |
623 | |
624 AdvancedCriteria c3 = | |
625 new AdvancedCriteria(OperatorId.AND, new Criterion[] { | |
626 new Criterion("from", OperatorId.LESS_OR_EQUAL, to), | |
627 new Criterion("to", OperatorId.GREATER_OR_EQUAL, from) | |
628 }); | |
629 | |
630 combinedFilter = | |
631 new AdvancedCriteria(OperatorId.OR, new Criterion[] { | |
632 c1, c2, c3 | |
633 }); | |
634 } | |
635 locationsTable.filterData(combinedFilter); | |
636 distancesTable.filterData(combinedFilter); | |
637 filterResultCount.setValue(currentFiltered.getRecords().length); | |
638 | |
639 } | |
640 | |
641 | |
642 protected String getRiverName() { | |
643 ArtifactDescription adescr = artifact.getArtifactDescription(); | |
644 return adescr.getRiver(); | |
645 } | |
646 } | |
647 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |