Mercurial > dive4elements > river
comparison gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DistancePanel.java @ 9237:972e10522ed6
salix.supraregional ui
author | gernotbelger |
---|---|
date | Tue, 10 Jul 2018 11:24:12 +0200 |
parents | 34dc0163ad2d |
children | c08d5cfa4981 |
comparison
equal
deleted
inserted
replaced
9236:b515ed950d39 | 9237:972e10522ed6 |
---|---|
7 */ | 7 */ |
8 | 8 |
9 package org.dive4elements.river.client.client.ui; | 9 package org.dive4elements.river.client.client.ui; |
10 | 10 |
11 import java.util.ArrayList; | 11 import java.util.ArrayList; |
12 import java.util.LinkedHashMap; | |
13 import java.util.List; | 12 import java.util.List; |
14 | 13 |
15 import org.dive4elements.river.client.client.Config; | |
16 import org.dive4elements.river.client.client.FLYSConstants; | 14 import org.dive4elements.river.client.client.FLYSConstants; |
17 import org.dive4elements.river.client.client.event.FilterHandler; | |
18 import org.dive4elements.river.client.client.event.RangeFilterEvent; | |
19 import org.dive4elements.river.client.client.event.StringFilterEvent; | |
20 import org.dive4elements.river.client.client.ui.range.DistanceInfoDataSource; | |
21 import org.dive4elements.river.client.client.ui.range.LocationsTable; | |
22 import org.dive4elements.river.client.client.ui.range.RangeTable; | |
23 import org.dive4elements.river.client.shared.model.ArtifactDescription; | |
24 import org.dive4elements.river.client.shared.model.Data; | 15 import org.dive4elements.river.client.shared.model.Data; |
25 import org.dive4elements.river.client.shared.model.DataItem; | 16 import org.dive4elements.river.client.shared.model.DataItem; |
26 import org.dive4elements.river.client.shared.model.DataList; | 17 import org.dive4elements.river.client.shared.model.DataList; |
27 import org.dive4elements.river.client.shared.model.DefaultData; | 18 import org.dive4elements.river.client.shared.model.DefaultData; |
28 import org.dive4elements.river.client.shared.model.DefaultDataItem; | 19 import org.dive4elements.river.client.shared.model.DefaultDataItem; |
29 | 20 |
30 import com.google.gwt.core.client.GWT; | 21 import com.google.gwt.core.client.GWT; |
31 import com.google.gwt.i18n.client.NumberFormat; | 22 import com.google.gwt.i18n.client.NumberFormat; |
32 import com.smartgwt.client.data.AdvancedCriteria; | |
33 import com.smartgwt.client.data.Criteria; | |
34 import com.smartgwt.client.data.Criterion; | |
35 import com.smartgwt.client.data.Record; | 23 import com.smartgwt.client.data.Record; |
36 import com.smartgwt.client.types.Alignment; | |
37 import com.smartgwt.client.types.OperatorId; | |
38 import com.smartgwt.client.util.SC; | 24 import com.smartgwt.client.util.SC; |
39 import com.smartgwt.client.widgets.Canvas; | 25 import com.smartgwt.client.widgets.Canvas; |
40 import com.smartgwt.client.widgets.Label; | 26 import com.smartgwt.client.widgets.Label; |
41 import com.smartgwt.client.widgets.form.DynamicForm; | |
42 import com.smartgwt.client.widgets.form.fields.SelectItem; | |
43 import com.smartgwt.client.widgets.form.fields.StaticTextItem; | 27 import com.smartgwt.client.widgets.form.fields.StaticTextItem; |
44 import com.smartgwt.client.widgets.form.fields.events.BlurEvent; | 28 import com.smartgwt.client.widgets.form.fields.events.BlurEvent; |
45 import com.smartgwt.client.widgets.form.fields.events.BlurHandler; | 29 import com.smartgwt.client.widgets.form.fields.events.BlurHandler; |
46 import com.smartgwt.client.widgets.form.fields.events.ChangedEvent; | |
47 import com.smartgwt.client.widgets.form.fields.events.ChangedHandler; | |
48 import com.smartgwt.client.widgets.grid.ListGrid; | 30 import com.smartgwt.client.widgets.grid.ListGrid; |
49 import com.smartgwt.client.widgets.grid.events.RecordClickEvent; | 31 import com.smartgwt.client.widgets.grid.events.RecordClickEvent; |
50 import com.smartgwt.client.widgets.grid.events.RecordClickHandler; | 32 import com.smartgwt.client.widgets.grid.events.RecordClickHandler; |
51 import com.smartgwt.client.widgets.layout.HLayout; | 33 import com.smartgwt.client.widgets.layout.HLayout; |
52 import com.smartgwt.client.widgets.layout.VLayout; | 34 import com.smartgwt.client.widgets.layout.VLayout; |
53 import com.smartgwt.client.widgets.tab.Tab; | |
54 import com.smartgwt.client.widgets.tab.TabSet; | 35 import com.smartgwt.client.widgets.tab.TabSet; |
55 import com.smartgwt.client.widgets.tab.events.TabSelectedEvent; | |
56 import com.smartgwt.client.widgets.tab.events.TabSelectedHandler; | |
57 | 36 |
58 /** Panel to allow input of distance for calculation range. */ | 37 /** Panel to allow input of distance for calculation range. */ |
59 public class DistancePanel extends AbstractUIProvider implements BlurHandler, FilterHandler { | 38 public class DistancePanel extends AbstractUIProvider implements BlurHandler { |
60 | 39 |
61 private static final long serialVersionUID = -883142387908664588L; | 40 private static final long serialVersionUID = -883142387908664588L; |
62 | 41 |
63 public static final int DEFAULT_STEP_WIDTH = 100; | 42 public static final int DEFAULT_STEP_WIDTH = 100; |
64 | 43 |
66 public static final String FIELD_UPPER = "ld_to"; | 45 public static final String FIELD_UPPER = "ld_to"; |
67 public static final String FIELD_STEP = "ld_step"; | 46 public static final String FIELD_STEP = "ld_step"; |
68 | 47 |
69 protected FLYSConstants MSG = GWT.create(FLYSConstants.class); | 48 protected FLYSConstants MSG = GWT.create(FLYSConstants.class); |
70 | 49 |
71 protected RangeTable distancesTable; | 50 // protected RangeTable distancesTable; |
72 protected LocationsTable locationsTable; | 51 // protected LocationsTable locationsTable; |
73 | 52 |
74 protected DoubleRangePanel distancePanel; | 53 protected DoubleRangePanel distancePanel; |
75 | 54 |
76 protected TableFilter filterDescription; | 55 protected TableFilter filterDescription; |
77 protected RangeTableFilter filterRange; | 56 protected RangeTableFilter filterRange; |
297 | 276 |
298 final DataItem item = new DefaultDataItem(field, field, value); | 277 final DataItem item = new DefaultDataItem(field, field, value); |
299 return new DefaultData(field, null, null, new DataItem[] { item }); | 278 return new DefaultData(field, null, null, new DataItem[] { item }); |
300 } | 279 } |
301 | 280 |
302 @Override | |
303 public void onBlur(final BlurEvent event) { | |
304 this.distancePanel.validateForm(); | |
305 } | |
306 | |
307 protected void initMinMaxValues(final DataList data) { | 281 protected void initMinMaxValues(final DataList data) { |
308 final Data f = getData(data.getAll(), getLowerField()); | 282 final Data f = getData(data.getAll(), getLowerField()); |
309 final Data t = getData(data.getAll(), getUpperField()); | 283 final Data t = getData(data.getAll(), getUpperField()); |
310 | 284 |
311 final DataItem[] fItems = f.getItems(); | 285 final DataItem[] fItems = f.getItems(); |
391 | 365 |
392 return Double.valueOf(defValue); | 366 return Double.valueOf(defValue); |
393 } | 367 } |
394 | 368 |
395 protected void initHelperPanel() { | 369 protected void initHelperPanel() { |
396 this.distancesTable = new RangeTable(); | 370 |
397 this.locationsTable = new LocationsTable(); | 371 final DistancePanelInputHelper helper = new DistancePanelInputHelper(this.MSG, this.helperContainer, this.getRiverName()); |
398 | 372 |
399 final Config config = Config.getInstance(); | 373 helper.getDistancesTable().addRecordClickHandler(new RecordClickHandler() { |
400 final String url = config.getServerUrl(); | |
401 final String river = getRiverName(); | |
402 | |
403 this.distancesTable.setAutoFetchData(true); | |
404 this.locationsTable.setAutoFetchData(true); | |
405 this.distancesTable.setDataSource(new DistanceInfoDataSource(url, river, "distances")); | |
406 this.locationsTable.setDataSource(new DistanceInfoDataSource(url, river, "locations")); | |
407 | |
408 this.distancesTable.addRecordClickHandler(new RecordClickHandler() { | |
409 @Override | 374 @Override |
410 public void onRecordClick(final RecordClickEvent e) { | 375 public void onRecordClick(final RecordClickEvent e) { |
411 final Record r = e.getRecord(); | 376 final Record r = e.getRecord(); |
412 | 377 |
413 final String from = r.getAttribute("from"); | 378 final String from = r.getAttribute("from"); |
421 SC.warn(DistancePanel.this.MSG.wrongFormat()); | 386 SC.warn(DistancePanel.this.MSG.wrongFormat()); |
422 } | 387 } |
423 } | 388 } |
424 }); | 389 }); |
425 | 390 |
426 this.locationsTable.addRecordClickHandler(new RecordClickHandler() { | 391 helper.getLocationsTable().addRecordClickHandler(new RecordClickHandler() { |
427 @Override | 392 @Override |
428 public void onRecordClick(final RecordClickEvent e) { | 393 public void onRecordClick(final RecordClickEvent e) { |
429 final Record r = e.getRecord(); | 394 final Record r = e.getRecord(); |
430 final int field = e.getFieldNum(); | 395 final int field = e.getFieldNum(); |
431 | 396 |
445 SC.warn(DistancePanel.this.MSG.wrongFormat()); | 410 SC.warn(DistancePanel.this.MSG.wrongFormat()); |
446 } | 411 } |
447 } | 412 } |
448 }); | 413 }); |
449 | 414 |
450 this.tabs = new TabSet(); | |
451 this.tabs.setWidth100(); | |
452 this.tabs.setHeight100(); | |
453 | |
454 final Tab locations = new Tab(this.MSG.locations()); | |
455 final Tab distances = new Tab(this.MSG.distance()); | |
456 | |
457 locations.setPane(this.locationsTable); | |
458 distances.setPane(this.distancesTable); | |
459 | |
460 this.tabs.addTab(locations, 0); | |
461 this.tabs.addTab(distances, 1); | |
462 | |
463 this.filterResultCount = new StaticTextItem(this.MSG.resultCount()); | |
464 this.filterResultCount.setTitleAlign(Alignment.LEFT); | |
465 this.filterResultCount.setTitleStyle("color: #000"); | |
466 | |
467 this.filterDescription = new TableFilter(); | |
468 this.filterDescription.setHeight("30px"); | |
469 this.filterDescription.addFilterHandler(this); | |
470 | |
471 this.filterRange = new RangeTableFilter(); | |
472 this.filterRange.setHeight("30px"); | |
473 this.filterRange.addFilterHandler(this); | |
474 this.filterRange.setVisible(false); | |
475 | |
476 final SelectItem filterCriteria = new SelectItem(); | |
477 filterCriteria.setShowTitle(false); | |
478 filterCriteria.setWidth(100); | |
479 filterCriteria.addChangedHandler(new ChangedHandler() { | |
480 @Override | |
481 public void onChanged(final ChangedEvent e) { | |
482 if (e.getValue().toString().equals("range")) { | |
483 DistancePanel.this.filterRange.setVisible(true); | |
484 DistancePanel.this.filterDescription.setVisible(false); | |
485 DistancePanel.this.filterDescription.clear(); | |
486 } else { | |
487 DistancePanel.this.filterRange.setVisible(false); | |
488 DistancePanel.this.filterRange.clear(); | |
489 DistancePanel.this.filterDescription.setVisible(true); | |
490 } | |
491 } | |
492 }); | |
493 | |
494 final LinkedHashMap<String, String> filterMap = new LinkedHashMap<String, String>(); | |
495 filterMap.put("description", this.MSG.description()); | |
496 filterMap.put("range", this.MSG.range()); | |
497 filterCriteria.setValueMap(filterMap); | |
498 filterCriteria.setValue("description"); | |
499 | |
500 final DynamicForm form = new DynamicForm(); | |
501 form.setFields(filterCriteria); | |
502 | |
503 final DynamicForm form2 = new DynamicForm(); | |
504 form2.setFields(this.filterResultCount); | |
505 | |
506 final HLayout filterLayout = new HLayout(); | |
507 filterLayout.addMember(form); | |
508 filterLayout.addMember(this.filterDescription); | |
509 filterLayout.addMember(this.filterRange); | |
510 filterLayout.setHeight(30); | |
511 this.tabs.addTabSelectedHandler(new TabSelectedHandler() { | |
512 @Override | |
513 public void onTabSelected(final TabSelectedEvent evt) { | |
514 DistancePanel.this.filterDescription.clear(); | |
515 DistancePanel.this.filterRange.clear(); | |
516 DistancePanel.this.filterResultCount.setValue(""); | |
517 | |
518 final Canvas c = evt.getTabPane(); | |
519 if (c instanceof ListGrid) { | |
520 DistancePanel.this.currentFiltered = (ListGrid) c; | |
521 } | |
522 } | |
523 }); | |
524 | |
525 this.helperContainer.addMember(this.tabs); | |
526 this.helperContainer.addMember(filterLayout); | |
527 this.helperContainer.addMember(form2); | |
528 } | 415 } |
529 | 416 |
530 @Override | 417 @Override |
531 public void onFilterCriteriaChanged(final StringFilterEvent event) { | 418 public void onBlur(final BlurEvent event) { |
532 final String search = event.getFilter(); | 419 this.distancePanel.validateForm(); |
533 | |
534 if (search != null && search.length() > 0) { | |
535 final Criteria c = new Criteria("description", search); | |
536 this.locationsTable.filterData(c); | |
537 this.distancesTable.filterData(c); | |
538 this.filterResultCount.setValue(this.currentFiltered.getRecords().length); | |
539 } else { | |
540 this.locationsTable.clearCriteria(); | |
541 this.distancesTable.clearCriteria(); | |
542 this.filterResultCount.setValue(""); | |
543 } | |
544 } | |
545 | |
546 @Override | |
547 public void onFilterCriteriaChanged(final RangeFilterEvent event) { | |
548 final Float from = event.getFrom() - 0.001f; | |
549 final Float to = event.getTo() + 0.001f; | |
550 | |
551 Criterion combinedFilter = null; | |
552 Criterion locationFilter = null; | |
553 | |
554 if (from.equals(Float.NaN) && to.equals(Float.NaN)) { | |
555 this.locationsTable.clearCriteria(); | |
556 this.distancesTable.clearCriteria(); | |
557 this.filterResultCount.setValue(""); | |
558 return; | |
559 } | |
560 | |
561 if (from.equals(Float.NaN)) { | |
562 combinedFilter = new Criterion("to", OperatorId.LESS_OR_EQUAL, to); | |
563 | |
564 locationFilter = new Criterion("from", OperatorId.LESS_OR_EQUAL, to); | |
565 | |
566 this.locationsTable.filterData(locationFilter); | |
567 this.distancesTable.filterData(combinedFilter); | |
568 this.filterResultCount.setValue(this.currentFiltered.getRecords().length); | |
569 return; | |
570 } | |
571 | |
572 if (to.equals(Float.NaN)) { | |
573 combinedFilter = new Criterion("from", OperatorId.GREATER_OR_EQUAL, from); | |
574 } else { | |
575 final AdvancedCriteria c1 = new AdvancedCriteria(OperatorId.AND, | |
576 new Criterion[] { new Criterion("from", OperatorId.GREATER_OR_EQUAL, from), new Criterion("from", OperatorId.LESS_OR_EQUAL, to) }); | |
577 | |
578 final AdvancedCriteria c2 = new AdvancedCriteria(OperatorId.AND, | |
579 new Criterion[] { new Criterion("to", OperatorId.GREATER_OR_EQUAL, from), new Criterion("to", OperatorId.LESS_OR_EQUAL, to) }); | |
580 | |
581 final AdvancedCriteria c3 = new AdvancedCriteria(OperatorId.AND, | |
582 new Criterion[] { new Criterion("from", OperatorId.LESS_OR_EQUAL, to), new Criterion("to", OperatorId.GREATER_OR_EQUAL, from) }); | |
583 | |
584 combinedFilter = new AdvancedCriteria(OperatorId.OR, new Criterion[] { c1, c2, c3 }); | |
585 } | |
586 this.locationsTable.filterData(combinedFilter); | |
587 this.distancesTable.filterData(combinedFilter); | |
588 this.filterResultCount.setValue(this.currentFiltered.getRecords().length); | |
589 | |
590 } | |
591 | |
592 protected String getRiverName() { | |
593 final ArtifactDescription adescr = this.artifact.getArtifactDescription(); | |
594 return adescr.getRiver(); | |
595 } | 420 } |
596 } | 421 } |
597 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : | 422 // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 : |