9078
|
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 |
|
15 import org.dive4elements.river.client.client.ui.FromToTableHelperPanel.IColumnClickHandler; |
|
16 import org.dive4elements.river.client.shared.model.Data; |
|
17 import org.dive4elements.river.client.shared.model.DataItem; |
|
18 import org.dive4elements.river.client.shared.model.DataList; |
|
19 import org.dive4elements.river.client.shared.model.DefaultData; |
|
20 import org.dive4elements.river.client.shared.model.DefaultDataItem; |
|
21 |
|
22 import com.smartgwt.client.widgets.Canvas; |
|
23 import com.smartgwt.client.widgets.Label; |
|
24 import com.smartgwt.client.widgets.form.fields.TextItem; |
|
25 import com.smartgwt.client.widgets.layout.HLayout; |
|
26 import com.smartgwt.client.widgets.layout.VLayout; |
|
27 |
|
28 /** |
|
29 * @author Domenico Nardi Tironi |
|
30 * |
|
31 */ |
|
32 public abstract class AbstractSingleItemPanel extends AbstractUIProvider { |
|
33 |
9079
|
34 private static final long serialVersionUID = 1L; |
9078
|
35 |
9079
|
36 protected enum Type { |
|
37 single, multi // "SingleItem" (Klassenname) meint, dass es nur ein einziges Eingabefeld gibt (nicht from-to; epoch) |
|
38 // Type multi: append (year): es können mehrere Werte eingegeben werden; Leerzeichen-getrennt |
|
39 // Type single: append (year, sohlhöhendifferenz): nur ein Wert ist zulässig |
|
40 } |
9078
|
41 |
9079
|
42 private final Type type; |
9078
|
43 |
9079
|
44 private TextItem inputItem; |
|
45 |
|
46 private List<String> validInputs = new ArrayList<String>(); |
9078
|
47 |
|
48 protected abstract String getDatakey(); |
|
49 |
9079
|
50 protected abstract Canvas createWidget(final DataList data); |
9078
|
51 |
9079
|
52 public AbstractSingleItemPanel(final Type type) { |
|
53 this.type = type; |
|
54 } |
9078
|
55 |
|
56 @Override |
9079
|
57 public final Canvas create(final DataList data) { |
9078
|
58 final VLayout layout = new VLayout(); |
|
59 final IColumnClickHandler fromHandler = new IColumnClickHandler() { // add to external class |
|
60 |
|
61 @Override |
|
62 public void columnClicked(final String value) { |
|
63 appendValue(value); |
|
64 } |
|
65 }; |
|
66 |
|
67 final FromToTableHelperPanel helper = new FromToTableHelperPanel(data, getDatakey(), this.MSG, fromHandler, null); |
|
68 final Canvas table = helper.getTable(); |
|
69 this.validInputs = helper.getKeycolEntries(); |
|
70 |
|
71 this.helperContainer.addMember(table); |
|
72 |
|
73 final Canvas submit = getNextButton(); |
|
74 final Canvas widget = createWidget(data); |
|
75 |
|
76 layout.addMember(widget); |
|
77 layout.addMember(submit); |
|
78 |
|
79 return layout; |
|
80 } |
|
81 |
|
82 @Override |
9079
|
83 public final Canvas createOld(final DataList dataList) { |
9078
|
84 final List<Data> items = dataList.getAll(); |
|
85 final Data years = getData(items, getDatakey()); |
|
86 final DataItem[] yearsItems = years.getItems(); |
|
87 |
|
88 final String v1 = yearsItems[0].getStringValue().replace(" ", ", "); |
|
89 |
|
90 final Label old = new Label(v1); |
|
91 final HLayout layout = new HLayout(); |
|
92 layout.setWidth("400px"); |
|
93 |
|
94 final Label label = new Label(dataList.getLabel()); |
|
95 label.setWidth("200px"); |
|
96 |
|
97 final Canvas back = getBackButton(dataList.getState()); |
|
98 |
|
99 layout.addMember(label); |
|
100 layout.addMember(old); |
|
101 layout.addMember(back); |
|
102 |
|
103 return layout; |
|
104 } |
|
105 |
|
106 @Override |
9079
|
107 protected final Data[] getData() { |
|
108 final List<String> errors = this.validate(); |
|
109 if (errors.size() > 0) { |
|
110 showErrors(errors); // TODO: do not allow advance state |
|
111 // return null; |
|
112 } |
|
113 if (this.inputItem != null && !this.inputItem.getValueAsString().isEmpty()) { |
|
114 final List<Data> data = new ArrayList<Data>(); |
|
115 |
|
116 final DataItem yearsdata = new DefaultDataItem(getDatakey(), getDatakey(), this.inputItem.getValueAsString().trim()); |
|
117 data.add(new DefaultData(getDatakey(), null, null, new DataItem[] { yearsdata })); |
|
118 |
|
119 return data.toArray(new Data[data.size()]); |
|
120 } |
|
121 return new Data[0]; |
|
122 } |
|
123 |
|
124 protected final TextItem createInputItem(final String title) { |
|
125 this.inputItem = PanelHelper.createItem(title);// new TextItem(title); |
|
126 return this.inputItem; |
|
127 } |
|
128 |
|
129 private final List<String> checkForEmpty() { |
9078
|
130 final List<String> errors = new ArrayList<String>(); |
|
131 |
|
132 if (this.inputItem.getValueAsString() == null || this.inputItem.getValueAsString().trim().isEmpty()) { |
|
133 errors.add(this.MSG.empty_filter()); |
|
134 return errors; |
|
135 } |
9079
|
136 return errors; |
|
137 } |
9078
|
138 |
9079
|
139 private final List<String> validateSingleInput(final String sValue) { |
|
140 final List<String> errors = new ArrayList<String>(); |
|
141 // String filtered = ""; |
|
142 // int goodValues = 0; |
|
143 |
9078
|
144 try { |
9079
|
145 Integer.parseInt(sValue); |
9078
|
146 } |
|
147 catch (final NumberFormatException e) { |
|
148 errors.add(this.MSG.wrongFormat() + ": " + sValue); |
|
149 |
|
150 } |
|
151 boolean isGood = false; |
|
152 for (final String validYear : this.validInputs) { |
|
153 /* No list contains for strings? */ |
|
154 if (sValue.equals(validYear)) { |
|
155 isGood = true; |
|
156 break; |
|
157 } |
|
158 } |
|
159 if (!isGood) { |
|
160 String tmp = errorForItemMsg(); |
|
161 tmp = tmp.replace("$1", sValue); |
|
162 errors.add(tmp); |
|
163 // continue; |
|
164 } |
9079
|
165 // goodValues++; |
|
166 // if (goodValues > 1) { |
|
167 // filtered += " " + Integer.toString(value); |
|
168 // } else { |
|
169 // filtered = Integer.toString(value); |
|
170 // } |
|
171 return errors; |
|
172 } |
|
173 |
|
174 protected abstract String errorForItemMsg(); |
|
175 |
|
176 protected final void appendValue(final String value) { |
|
177 |
|
178 switch (this.type) { |
|
179 case multi: |
|
180 // APPEND = ADD to existing -> MULTI YEAR |
|
181 final String oldYears = this.inputItem.getValueAsString(); |
|
182 if (oldYears != null && !oldYears.isEmpty()) |
|
183 this.inputItem.setValue(oldYears.trim() + " " + value); |
|
184 else |
|
185 this.inputItem.setValue(value); |
|
186 |
|
187 break; |
|
188 |
|
189 case single: |
|
190 this.inputItem.setValue(value); |
|
191 break; |
|
192 |
|
193 default: |
|
194 throw new IllegalStateException(); |
|
195 } |
|
196 } |
|
197 |
|
198 @Override |
|
199 public final List<String> validate() { |
|
200 |
|
201 final List<String> errors = new ArrayList<String>(); |
|
202 errors.addAll(this.checkForEmpty()); |
|
203 |
|
204 final String sValue = this.inputItem.getValueAsString(); |
|
205 |
|
206 switch (this.type) { |
|
207 case multi: |
|
208 final String[] sValues = sValue.trim().split(" "); |
|
209 for (final String value : sValues) { |
|
210 errors.addAll(this.validateSingleInput(value)); |
|
211 } |
|
212 break; |
|
213 |
|
214 case single: |
|
215 errors.addAll(this.validateSingleInput(sValue)); |
|
216 break; |
|
217 |
|
218 default: |
|
219 throw new IllegalStateException(); |
9078
|
220 } |
|
221 |
|
222 return errors; |
|
223 } |
9079
|
224 } |