Mercurial > dive4elements > river
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 } |