Mercurial > dive4elements > river
comparison gwt-client/src/main/java/org/dive4elements/river/client/client/ui/AbstractEpochPanel.java @ 9079:aafae1ab25f0
epoch-panels, single-input-panels
author | gernotbelger |
---|---|
date | Wed, 23 May 2018 17:30:24 +0200 |
parents | |
children | c3994657c15d |
comparison
equal
deleted
inserted
replaced
9078:fc02833dbcc1 | 9079:aafae1ab25f0 |
---|---|
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; | |
11 | |
12 import java.util.ArrayList; | |
13 import java.util.List; | |
14 import java.util.TreeSet; | |
15 | |
16 import org.dive4elements.river.client.client.ui.FromToTableHelperPanel.IColumnClickHandler; | |
17 import org.dive4elements.river.client.shared.model.Data; | |
18 import org.dive4elements.river.client.shared.model.DataItem; | |
19 import org.dive4elements.river.client.shared.model.DataList; | |
20 import org.dive4elements.river.client.shared.model.DefaultData; | |
21 import org.dive4elements.river.client.shared.model.DefaultDataItem; | |
22 | |
23 import com.smartgwt.client.widgets.Canvas; | |
24 import com.smartgwt.client.widgets.Label; | |
25 import com.smartgwt.client.widgets.form.fields.TextItem; | |
26 import com.smartgwt.client.widgets.grid.ListGrid; | |
27 import com.smartgwt.client.widgets.grid.ListGridRecord; | |
28 import com.smartgwt.client.widgets.layout.HLayout; | |
29 import com.smartgwt.client.widgets.layout.VLayout; | |
30 | |
31 /** | |
32 * @author Domenico Nardi Tironi | |
33 * | |
34 */ | |
35 public abstract class AbstractEpochPanel extends AbstractUIProvider { | |
36 | |
37 private static final long serialVersionUID = 1L; | |
38 | |
39 protected enum Type { | |
40 singleMinMax, multi | |
41 // Type singleMinMax: nur eine Epoche kann gesetzt werden; minMax vorbelegt aus Datenquelle | |
42 // Type multi: mehrere epochs können eingegeben werden | |
43 } | |
44 | |
45 private TextItem start; | |
46 | |
47 private TextItem end; | |
48 | |
49 private ListGrid elements; | |
50 | |
51 private List<String> validInputs = new ArrayList<String>(); | |
52 | |
53 private final Type type; | |
54 | |
55 public AbstractEpochPanel(final Type type) { | |
56 this.type = type; | |
57 } | |
58 | |
59 protected abstract String getDatakey(); | |
60 | |
61 protected abstract Canvas createWidget(final DataList data); | |
62 | |
63 private final void postCreate() { | |
64 switch (this.type) { | |
65 case singleMinMax: | |
66 final TreeSet<String> minMax = new TreeSet<String>(this.validInputs); | |
67 if (minMax.size() > 1) { | |
68 this.start.setValue(minMax.first()); | |
69 this.end.setValue(minMax.last()); | |
70 } else { | |
71 // TODO: THIS STATE IS INVALID; RETURN - es gibt keinen Mechanismus, der das verhindert; müsste | |
72 // im State davor passieren) | |
73 } | |
74 break; | |
75 case multi: | |
76 break; // do nothing | |
77 default: | |
78 throw new IllegalStateException(); | |
79 } | |
80 } | |
81 | |
82 protected final TextItem createStartInputItem(final String title) { | |
83 this.start = PanelHelper.createItem(title); | |
84 return this.start; | |
85 } | |
86 | |
87 protected final TextItem createEndInputItem(final String title) { | |
88 this.end = PanelHelper.createItem(title); | |
89 return this.end; | |
90 } | |
91 | |
92 protected final ListGrid createListGrid() { | |
93 this.elements = new ListGrid(); | |
94 this.elements.setShowHeaderContextMenu(false); | |
95 this.elements.setCanReorderFields(false); | |
96 this.elements.setCanSort(false); | |
97 this.elements.setCanEdit(false); | |
98 return this.elements; | |
99 } | |
100 | |
101 @Override | |
102 public final Canvas createOld(final DataList dataList) { | |
103 final HLayout layout = new HLayout(); | |
104 layout.setWidth("400px"); | |
105 final VLayout vLayout = new VLayout(); | |
106 vLayout.setWidth(130); | |
107 final Label label = new Label(dataList.getLabel()); | |
108 label.setWidth("200px"); | |
109 label.setHeight(25); | |
110 | |
111 final List<Data> items = dataList.getAll(); | |
112 final Data str = getData(items, getDatakey()); | |
113 final DataItem[] strItems = str.getItems(); | |
114 | |
115 final String[] pairs = strItems[0].getLabel().split(";"); | |
116 for (final String pair : pairs) { | |
117 final Label dateLabel = new Label(pair.replace(",", " - ")); | |
118 dateLabel.setHeight(20); | |
119 vLayout.addMember(dateLabel); | |
120 } | |
121 final Canvas back = getBackButton(dataList.getState()); | |
122 layout.addMember(label); | |
123 layout.addMember(vLayout); | |
124 layout.addMember(back); | |
125 | |
126 return layout; | |
127 } | |
128 | |
129 @Override | |
130 public final Canvas create(final DataList data) { | |
131 final VLayout layout = new VLayout(); | |
132 final Canvas submit = getNextButton(); | |
133 final Canvas widget = createWidget(data); | |
134 | |
135 layout.addMember(widget); | |
136 layout.addMember(submit); | |
137 | |
138 final IColumnClickHandler fromHandler = createHandler(this.start); | |
139 final IColumnClickHandler toHandler = createHandler(this.end); | |
140 | |
141 final FromToTableHelperPanel helper = new FromToTableHelperPanel(data, getDatakey(), this.MSG, fromHandler, toHandler); | |
142 this.validInputs = helper.getKeycolEntries(); | |
143 final Canvas table = helper.getTable(); | |
144 | |
145 this.helperContainer.addMember(table); | |
146 | |
147 postCreate(); | |
148 return layout; | |
149 } | |
150 | |
151 private final IColumnClickHandler createHandler(final TextItem field) { | |
152 final IColumnClickHandler handler = new IColumnClickHandler() { | |
153 | |
154 @Override | |
155 public void columnClicked(final String value) { | |
156 field.setValue(value); | |
157 } | |
158 }; | |
159 return handler; | |
160 } | |
161 | |
162 /* | |
163 * Validate the epoch input. We do this here and not in an overridden | |
164 * validate method as we want to validate before an epoch is added | |
165 * to the list of epochs. | |
166 */ | |
167 protected final boolean isValidEpoch(final String y1, final String y2) { | |
168 // First check that both are integer | |
169 // int iY1; | |
170 // int iY2; | |
171 final List<String> errors = new ArrayList<String>(); | |
172 try { | |
173 // iY1 = | |
174 Integer.parseInt(y1); | |
175 } | |
176 catch (final NumberFormatException e) { | |
177 errors.add(this.MSG.wrongFormat() + ": " + y1); | |
178 } | |
179 try { | |
180 // iY2 = | |
181 Integer.parseInt(y2); | |
182 } | |
183 catch (final NumberFormatException e) { | |
184 errors.add(this.MSG.wrongFormat() + ": " + y2); | |
185 } | |
186 if (!errors.isEmpty()) { | |
187 showErrors(errors); | |
188 return false; | |
189 } | |
190 boolean startIsGood = false; | |
191 boolean endIsGood = false; | |
192 for (final String validYear : this.validInputs) { | |
193 if (startIsGood || y1.equals(validYear)) { | |
194 startIsGood = true; | |
195 } | |
196 if (endIsGood || y2.equals(validYear)) { | |
197 endIsGood = true; | |
198 } | |
199 if (startIsGood && endIsGood) { | |
200 break; | |
201 } | |
202 /* | |
203 * alternative check if data lies in between | |
204 * int aYear = Integer.parseInt(validYear); | |
205 * if (aYear >= iY1 && aYear <= iY2) { | |
206 * isGood = true; | |
207 * break; | |
208 * } | |
209 */ | |
210 } | |
211 if (!startIsGood) { | |
212 String tmp = this.MSG.no_data_for_year(); | |
213 tmp = tmp.replace("$1", y1); | |
214 errors.add(tmp); | |
215 } | |
216 if (!endIsGood) { | |
217 String tmp = this.MSG.no_data_for_year(); | |
218 tmp = tmp.replace("$1", y2); | |
219 errors.add(tmp); | |
220 } | |
221 if (!errors.isEmpty()) { | |
222 showErrors(errors); | |
223 return false; | |
224 } | |
225 return true; | |
226 } | |
227 | |
228 @Override | |
229 protected final Data[] getData() { | |
230 final List<Data> data = new ArrayList<Data>(); | |
231 switch (this.type) { | |
232 | |
233 case singleMinMax: | |
234 data.add(buildResult(this.start.getValueAsString(), this.end.getValueAsString())); | |
235 | |
236 break; | |
237 case multi: | |
238 final ListGridRecord[] lgr = this.elements.getRecords(); | |
239 if (lgr.length == 0) { | |
240 return new Data[0]; | |
241 } | |
242 for (final ListGridRecord element : lgr) { | |
243 data.add(buildResult(element.getAttribute("from"), element.getAttribute("to"))); | |
244 } | |
245 break; | |
246 default: | |
247 throw new IllegalStateException(); | |
248 } | |
249 return data.toArray(new Data[data.size()]); | |
250 } | |
251 | |
252 private final Data buildResult(final String startStr, final String endStr) { | |
253 final StringBuilder builder = new StringBuilder(); | |
254 builder.append(startStr); | |
255 builder.append(","); | |
256 builder.append(endStr); | |
257 builder.append(";"); | |
258 final DataItem item = new DefaultDataItem(getDatakey(), null, builder.toString()); | |
259 return new DefaultData(getDatakey(), null, null, new DataItem[] { item }); | |
260 } | |
261 | |
262 } |