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 }

http://dive4elements.wald.intevation.org