comparison gwt-client/src/main/java/org/dive4elements/river/client/client/ui/sinfo/WaterlevelSoundingSelectionController.java @ 9227:84397da33d17

Allow to control specific behaviour in TwinDatacagePanel Implemented client logic of 'intelligent datacage filtering' for SINFO
author gernotbelger
date Wed, 04 Jul 2018 18:28:08 +0200
parents
children 082e8e808902
comparison
equal deleted inserted replaced
9226:83aee0942eae 9227:84397da33d17
1 /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
2 * Software engineering by
3 * Björnsen Beratende Ingenieure GmbH
4 * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
5 *
6 * This file is Free Software under the GNU AGPL (>=v3)
7 * and comes with ABSOLUTELY NO WARRANTY! Check out the
8 * documentation coming with Dive4Elements River for details.
9 */
10 package org.dive4elements.river.client.client.ui.sinfo;
11
12 import java.util.List;
13
14 import org.dive4elements.river.client.client.FLYSConstants;
15 import org.dive4elements.river.client.client.ui.DatacagePairWidget.IDatacagePairControler;
16 import org.dive4elements.river.client.client.ui.DatacageWidget;
17
18 import com.smartgwt.client.data.DataSource;
19 import com.smartgwt.client.data.DataSourceField;
20 import com.smartgwt.client.types.Alignment;
21 import com.smartgwt.client.types.FieldType;
22 import com.smartgwt.client.types.TitleOrientation;
23 import com.smartgwt.client.widgets.form.DynamicForm;
24 import com.smartgwt.client.widgets.form.events.ItemChangedEvent;
25 import com.smartgwt.client.widgets.form.events.ItemChangedHandler;
26 import com.smartgwt.client.widgets.grid.events.SelectionUpdatedEvent;
27 import com.smartgwt.client.widgets.grid.events.SelectionUpdatedHandler;
28 import com.smartgwt.client.widgets.layout.HLayout;
29 import com.smartgwt.client.widgets.tree.TreeNode;
30
31 /**
32 * Implements special behavior when selecting soundings and waterlevels: datacage of waterlevels depends on selection of
33 * sounding.
34 *
35 * @author Gernot Belger
36 */
37 final class WaterlevelSoundingSelectionController implements IDatacagePairControler {
38
39 private static final String FIELD_INTELLIGENCE = "field_intelligence";
40
41 static final String ATTRIBUTE_YEAR = "year";
42
43 private final FLYSConstants msg;
44
45 private boolean turnFilterOff;
46
47 public WaterlevelSoundingSelectionController(final FLYSConstants msg) {
48 this.msg = msg;
49 }
50
51 @Override
52 public void setup(final DatacageWidget soundingWidget, final DatacageWidget waterlevelWidget, final HLayout toolbarLayout) {
53
54 soundingWidget.getTreeGrid().addSelectionUpdatedHandler(new SelectionUpdatedHandler() {
55
56 @Override
57 public void onSelectionUpdated(final SelectionUpdatedEvent event) {
58 final List<TreeNode> selection = soundingWidget.getPlainSelection();
59 handleSoundingChanged(waterlevelWidget, selection);
60 }
61 });
62
63 final DynamicForm form = createIntelligenCheckbox();
64 toolbarLayout.addMember(form);
65 form.addItemChangedHandler(new ItemChangedHandler() {
66
67 @Override
68 public void onItemChanged(final ItemChangedEvent event) {
69 final Boolean value = (Boolean) form.getValue(FIELD_INTELLIGENCE);
70 checkboxToggled(value);
71 handleSoundingChanged(waterlevelWidget, soundingWidget.getPlainSelection());
72 }
73 });
74
75 /* init to current selection */
76 handleSoundingChanged(waterlevelWidget, soundingWidget.getPlainSelection());
77 }
78
79 private DynamicForm createIntelligenCheckbox() {
80
81 final DynamicForm form = new DynamicForm();
82 form.setTitlePrefix("");
83 form.setTitleSuffix(": ");
84 form.setTitleAlign(Alignment.LEFT);
85 form.setTitleOrientation(TitleOrientation.LEFT);
86
87 final DataSourceField item = new DataSourceField(FIELD_INTELLIGENCE, FieldType.BOOLEAN);
88 item.setTitle(this.msg.sinfo_deactivate_intelligent_datacord());
89
90 final DataSource source = new DataSource();
91 source.setFields(item);
92 form.setDataSource(source);
93
94 form.setValue(FIELD_INTELLIGENCE, false);
95
96 return form;
97 }
98
99 protected final void checkboxToggled(final Boolean selected) {
100 this.turnFilterOff = selected == null ? false : selected;
101 }
102
103 protected final void handleSoundingChanged(final DatacageWidget waterlevelWidget, final List<TreeNode> selection) {
104
105 if (this.turnFilterOff) {
106 waterlevelWidget.setFilter(DatacageWidget.ACCEPT_ALL_FILTER);
107 waterlevelWidget.getTreeGrid().setEmptyMessage(this.msg.databasket_loading());
108 return;
109 }
110
111 // more than one should never happen, as the have single selection
112 final TreeNode soundingNode = selection.isEmpty() ? null : selection.get(0);
113
114 if (soundingNode == null || soundingNode.getAttribute("factory") == null) {
115 waterlevelWidget.setFilter(DatacageWidget.ACCEPT_NONE_FILTER);
116 waterlevelWidget.getTreeGrid().setEmptyMessage(this.msg.sinfo_sounding_waterlevel_select_waterlevel());
117 return;
118 }
119
120 final Integer soundingYear = getYear(soundingNode);
121
122 if (soundingYear == null) {
123 // should never happen, as we should only show soundings that actually have a year
124 waterlevelWidget.setFilter(DatacageWidget.ACCEPT_NONE_FILTER);
125 waterlevelWidget.getTreeGrid().setEmptyMessage("Der gewählte Wassrspiegel hat keine Informations zum Jahr");
126 } else
127 waterlevelWidget.setFilter(new WaterlevelSoundingYearFilter(soundingYear));
128 }
129
130 private static Integer getYear(final TreeNode soundingNode) {
131 final String year = soundingNode.getAttribute(ATTRIBUTE_YEAR);
132 if (year == null || year.trim().isEmpty())
133 return null;
134
135 try {
136 return Integer.valueOf(year);
137 }
138 catch (final NumberFormatException e) {
139 e.printStackTrace();
140 return null;
141 }
142 }
143 }

http://dive4elements.wald.intevation.org