comparison flys-client/src/main/java/org/dive4elements/river/client/client/ui/DistancePanel.java @ 5834:f507086aa94b

Repaired internal references.
author Sascha L. Teichmann <teichmann@intevation.de>
date Thu, 25 Apr 2013 12:31:32 +0200
parents flys-client/src/main/java/de/intevation/flys/client/client/ui/DistancePanel.java@360e22afb98b
children 821a02bbfb4e
comparison
equal deleted inserted replaced
5833:a2bdc0f524e8 5834:f507086aa94b
1 package de.intevation.flys.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 de.intevation.flys.client.client.Config;
33 import de.intevation.flys.client.client.FLYSConstants;
34 import de.intevation.flys.client.client.event.FilterHandler;
35 import de.intevation.flys.client.client.event.RangeFilterEvent;
36 import de.intevation.flys.client.client.event.StringFilterEvent;
37 import de.intevation.flys.client.client.ui.range.DistanceInfoDataSource;
38 import de.intevation.flys.client.client.ui.range.LocationsTable;
39 import de.intevation.flys.client.client.ui.range.RangeTable;
40 import de.intevation.flys.client.shared.model.ArtifactDescription;
41 import de.intevation.flys.client.shared.model.Data;
42 import de.intevation.flys.client.shared.model.DataItem;
43 import de.intevation.flys.client.shared.model.DataList;
44 import de.intevation.flys.client.shared.model.DefaultData;
45 import de.intevation.flys.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 :

http://dive4elements.wald.intevation.org