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 :

http://dive4elements.wald.intevation.org