9237
|
1 /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde |
|
2 * Software engineering by Intevation GmbH |
|
3 * |
|
4 * This file is Free Software under the GNU AGPL (>=v3) |
|
5 * and comes with ABSOLUTELY NO WARRANTY! Check out the |
|
6 * documentation coming with Dive4Elements River for details. |
|
7 */ |
|
8 |
|
9 package org.dive4elements.river.client.client.ui.uinfo; |
|
10 |
|
11 import java.util.ArrayList; |
|
12 import java.util.List; |
|
13 |
|
14 import org.dive4elements.river.client.client.ui.AbstractUIProvider; |
|
15 import org.dive4elements.river.client.client.ui.DistancePanelInputHelper; |
|
16 import org.dive4elements.river.client.client.ui.PanelHelper; |
|
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 import org.dive4elements.river.client.shared.model.SalixZone; |
|
23 |
|
24 import com.google.gwt.core.client.GWT; |
|
25 import com.google.gwt.i18n.client.NumberFormat; |
|
26 import com.google.gwt.user.client.ui.Label; |
|
27 import com.smartgwt.client.data.Record; |
|
28 import com.smartgwt.client.types.Alignment; |
|
29 import com.smartgwt.client.util.SC; |
|
30 import com.smartgwt.client.widgets.Button; |
|
31 import com.smartgwt.client.widgets.Canvas; |
|
32 import com.smartgwt.client.widgets.events.ClickEvent; |
|
33 import com.smartgwt.client.widgets.events.ClickHandler; |
|
34 import com.smartgwt.client.widgets.form.DynamicForm; |
|
35 import com.smartgwt.client.widgets.form.fields.TextItem; |
|
36 import com.smartgwt.client.widgets.grid.CellEditValueFormatter; |
|
37 import com.smartgwt.client.widgets.grid.CellFormatter; |
|
38 import com.smartgwt.client.widgets.grid.ListGrid; |
|
39 import com.smartgwt.client.widgets.grid.ListGridField; |
|
40 import com.smartgwt.client.widgets.grid.ListGridRecord; |
|
41 import com.smartgwt.client.widgets.grid.events.CellSavedEvent; |
|
42 import com.smartgwt.client.widgets.grid.events.CellSavedHandler; |
|
43 import com.smartgwt.client.widgets.grid.events.RecordClickEvent; |
|
44 import com.smartgwt.client.widgets.grid.events.RecordClickHandler; |
|
45 import com.smartgwt.client.widgets.layout.HLayout; |
|
46 import com.smartgwt.client.widgets.layout.Layout; |
|
47 import com.smartgwt.client.widgets.layout.VLayout; |
|
48 |
|
49 public class SupraRegionalTablePanel extends AbstractUIProvider { |
|
50 private static final long serialVersionUID = 1L; |
|
51 |
|
52 private Double minKm, maxKm = -1.; |
|
53 // private String tableData = ""; |
|
54 private ListGrid table; |
|
55 private final String datakey = "supraregional_table"; |
|
56 final Label validationLabel = new Label(); |
|
57 |
|
58 private final NumberFormat format = NumberFormat.getDecimalFormat(); |
|
59 |
|
60 @Override |
|
61 public Canvas createOld(final DataList dataList) { |
|
62 final HLayout layout = new HLayout(); |
|
63 layout.setWidth("400px"); |
|
64 final VLayout vLayout = new VLayout(); |
|
65 vLayout.setWidth(130); |
|
66 final Label label = new Label(dataList.getLabel()); |
|
67 label.setWidth("200px"); |
|
68 label.setHeight("25px"); |
|
69 |
|
70 final List<Data> items = dataList.getAll(); |
|
71 final Data str = getData(items, this.datakey); |
|
72 final DataItem[] strItems = str.getItems(); |
|
73 |
|
74 final List<SalixZone> entries = SalixZone.parse(strItems[0].getLabel()); |
|
75 |
|
76 for (final SalixZone entry : entries) { |
|
77 final Label dateLabel = new Label( |
|
78 entry.getDwsplValue() + " (" + this.format.format(entry.getFromKm()) + "-" + this.format.format(entry.getToKm()) + " km)"); |
|
79 dateLabel.setHeight("20px"); |
|
80 vLayout.addMember(dateLabel); |
|
81 } |
|
82 final Canvas back = getBackButton(dataList.getState()); |
|
83 layout.addMember(label); |
|
84 layout.addMember(vLayout); |
|
85 layout.addMember(back); |
|
86 |
|
87 return layout; |
|
88 } |
|
89 |
|
90 @Override |
|
91 public Canvas create(final DataList data) { |
|
92 |
|
93 final Data dataItem = data.getAll().get(0); |
|
94 String tableData = ""; |
|
95 for (final DataItem item : dataItem.getItems()) { |
|
96 final String label = item.getLabel(); |
|
97 if (label.equals("salix_zones_min")) |
|
98 this.minKm = Double.valueOf(item.getStringValue()); |
|
99 else if (label.equals("salix_zones_max")) |
|
100 this.maxKm = Double.valueOf(item.getStringValue()); |
|
101 else if (label.equals("salix_zones")) |
|
102 tableData = item.getStringValue(); |
|
103 } |
|
104 |
|
105 if (this.minKm > this.maxKm) { |
|
106 final double temp = this.minKm; |
|
107 this.minKm = this.maxKm; |
|
108 this.maxKm = temp; |
|
109 } |
|
110 |
|
111 final VLayout layout = new VLayout(); |
|
112 final Canvas submit = getNextButton(); |
|
113 |
|
114 final VLayout root = new VLayout(); |
|
115 root.setWidth(420); |
|
116 createWidget(root, data, tableData); |
|
117 |
|
118 layout.addMember(root); |
|
119 layout.addMember(submit); |
|
120 |
|
121 validateRangeOverlap();// init Text |
|
122 return layout; |
|
123 } |
|
124 |
|
125 @Override |
|
126 protected Data[] getData() { |
|
127 final List<Data> data = new ArrayList<Data>(); |
|
128 |
|
129 final ListGridRecord[] lgr = this.table.getRecords(); |
|
130 if (lgr == null) { |
|
131 return new Data[0]; |
|
132 } |
|
133 final List<SalixZone> zoneList = getSalixZones(lgr); |
|
134 final DataItem item = new DefaultDataItem(this.datakey, null, SalixZone.parseListToDataString(zoneList)); |
|
135 data.add(new DefaultData(this.datakey, null, null, new DataItem[] { item })); |
|
136 return data.toArray(new Data[data.size()]); |
|
137 } |
|
138 |
|
139 private List<SalixZone> getSalixZones(final ListGridRecord[] lgr) { |
|
140 final List<SalixZone> zoneList = new ArrayList<SalixZone>(); |
|
141 for (final ListGridRecord element : lgr) { |
|
142 final Record r = element; |
|
143 final SalixZone zone = SalixZone.createFromTableEntry(r.getAttribute("dmwspl"), r.getAttribute("from"), r.getAttribute("to")); |
|
144 zoneList.add(zone); |
|
145 } |
|
146 return zoneList; |
|
147 } |
|
148 |
|
149 public Canvas createWidget(final Layout root, final DataList data, final String tableData) { |
|
150 |
|
151 this.table = createTable(root, data, tableData); |
|
152 |
|
153 final TextItem dwspl = PanelHelper.createItem("_label_dwspl", this.MSG.uinfo_salix_dmwspl_short(), "50"); |
|
154 // this.dwspl.setColSpan(3); |
|
155 final TextItem start = PanelHelper.createIntegerItem("_from_dwspl", getLabelFromTo(this.MSG.from()), "50"); |
|
156 // this.start.setColSpan(3); |
|
157 final TextItem end = PanelHelper.createIntegerItem("_to_dwspl", getLabelFromTo(this.MSG.to()), "50"); |
|
158 // this.end.setColSpan(3); |
|
159 |
|
160 final HLayout fields = new HLayout(); |
|
161 |
|
162 final Button add = new Button(this.MSG.add_date()); // TODO: make key more generic or change to more specific |
|
163 |
|
164 final DynamicForm newEntryForm = new DynamicForm(); |
|
165 newEntryForm.setWidth(320); |
|
166 newEntryForm.setNumCols(12); |
|
167 newEntryForm.setFields(dwspl, start, end); |
|
168 |
|
169 add.addClickHandler(new ClickHandler() { |
|
170 @Override |
|
171 public void onClick(final ClickEvent ce) { |
|
172 final String v1 = start.getValueAsString(); |
|
173 final String v2 = end.getValueAsString(); |
|
174 final String v3 = dwspl.getValueAsString(); |
|
175 final String message = validate(v1, v2, v3); |
|
176 if (message != null) { |
|
177 SC.warn(message); |
|
178 return; |
|
179 } |
|
180 final ListGridRecord r = new ListGridRecord(); |
|
181 r.setAttribute("dmwspl", v3); |
|
182 r.setAttribute("from", SupraRegionalTablePanel.this.format.parse(v1)); |
|
183 r.setAttribute("to", SupraRegionalTablePanel.this.format.parse(v2)); |
|
184 SupraRegionalTablePanel.this.table.addData(r); |
|
185 validateRangeOverlap(); |
|
186 } |
|
187 }); |
|
188 |
|
189 fields.addMember(newEntryForm); |
|
190 |
|
191 root.addMember(fields); |
|
192 root.addMember(PanelHelper.getSpacer(10)); |
|
193 |
|
194 initHelperPanel(start, end); |
|
195 |
|
196 root.addMember(add); |
|
197 root.addMember(PanelHelper.getSpacer(20)); |
|
198 return root; |
|
199 } |
|
200 |
|
201 private String getLabelFromTo(final String fromOrTo) { |
|
202 return new StringBuilder().append(fromOrTo).append(" [").append(this.MSG.dpUnitFrom()).append("]").toString(); |
|
203 } |
|
204 |
|
205 protected void initHelperPanel(final TextItem start, final TextItem end) { |
|
206 final DistancePanelInputHelper helper = new DistancePanelInputHelper(this.MSG, this.helperContainer, this.getRiverName()); |
|
207 |
|
208 helper.getDistancesTable().addRecordClickHandler(new RecordClickHandler() { |
|
209 @Override |
|
210 public void onRecordClick(final RecordClickEvent e) { |
|
211 final Record r = e.getRecord(); |
|
212 |
|
213 final String from = r.getAttribute("from"); |
|
214 final String to = r.getAttribute("to"); |
|
215 |
|
216 try { |
|
217 start.setValue(SupraRegionalTablePanel.this.format.format(Double.valueOf(from))); |
|
218 end.setValue(SupraRegionalTablePanel.this.format.format(Double.valueOf(to))); |
|
219 } |
|
220 catch (final NumberFormatException nfe) { |
|
221 SC.warn(SupraRegionalTablePanel.this.MSG.wrongFormat()); |
|
222 } |
|
223 } |
|
224 }); |
|
225 |
|
226 helper.getLocationsTable().addRecordClickHandler(new RecordClickHandler() { |
|
227 @Override |
|
228 public void onRecordClick(final RecordClickEvent e) { |
|
229 final Record r = e.getRecord(); |
|
230 final int field = e.getFieldNum(); |
|
231 |
|
232 try { |
|
233 final String value = r.getAttribute("from"); |
|
234 switch (field) { |
|
235 case 0: |
|
236 start.setValue(SupraRegionalTablePanel.this.format.format(Double.valueOf(value))); |
|
237 break; |
|
238 case 1: |
|
239 end.setValue(SupraRegionalTablePanel.this.format.format(Double.valueOf(value))); |
|
240 break; |
|
241 } |
|
242 } |
|
243 catch (final NumberFormatException nfe) { |
|
244 SC.warn(SupraRegionalTablePanel.this.MSG.wrongFormat()); |
|
245 } |
|
246 } |
|
247 }); |
|
248 |
|
249 } |
|
250 |
|
251 protected final ListGrid createTable(final Layout root, final DataList data, final String tableData) { |
|
252 |
|
253 final Label title = new Label(data.get(0).getDescription()); |
|
254 title.setHeight("35px"); |
|
255 this.validationLabel.setHeight("10px"); |
|
256 |
|
257 final ListGrid elements = new ListGrid(); |
|
258 elements.setWidth(320); |
|
259 elements.setHeight(300); |
|
260 elements.setShowHeaderContextMenu(false); |
|
261 elements.setCanReorderFields(false); |
|
262 elements.setCanResizeFields(false); |
|
263 elements.setCanEdit(true); |
|
264 elements.setCanSort(false); |
|
265 elements.setCanResizeFields(false); |
|
266 |
|
267 final ListGridField dmwsplField = new ListGridField("dmwspl", this.MSG.uinfo_salix_dmwspl_short()); |
|
268 dmwsplField.setAlign(Alignment.RIGHT); |
|
269 dmwsplField.setWidth(95); |
|
270 dmwsplField.addCellSavedHandler(new CellSavedHandler() { |
|
271 @Override |
|
272 public void onCellSaved(final CellSavedEvent event) { |
|
273 final Object value = event.getNewValue(); |
|
274 event.getRecord().setAttribute("dmwspl", event.getOldValue()); |
|
275 try { |
|
276 final int intValue = Integer.valueOf(String.valueOf(value)); |
|
277 event.getRecord().setAttribute("dmwspl", intValue); |
|
278 } |
|
279 catch (final NumberFormatException e) { |
|
280 e.printStackTrace(); |
|
281 } |
|
282 } |
|
283 }); |
|
284 final ListGridField fromField = createDoubleTableField("from", this.MSG.from()); |
|
285 final ListGridField toField = createDoubleTableField("to", this.MSG.to()); |
|
286 final ListGridField removeField = PanelHelper.createRemoveField(elements, GWT.getHostPageBaseURL() + this.MSG.removeFeature()); |
|
287 elements.addRecordClickHandler(new RecordClickHandler() { // adding another custom record-Remove-Handler which is not included in the Panelhelper |
|
288 @Override |
|
289 public void onRecordClick(final RecordClickEvent event) { |
|
290 if (event.getField().getName().equals(removeField.getName())) { |
|
291 validateRangeOverlap(); |
|
292 } |
|
293 } |
|
294 }); |
|
295 elements.setFields(dmwsplField, fromField, toField, removeField); |
|
296 addDataInit(elements, tableData); |
|
297 |
|
298 root.addMember(title); |
|
299 root.addMember(elements); |
|
300 root.addMember(PanelHelper.getSpacer(3)); |
|
301 root.addMember(this.validationLabel); |
|
302 root.addMember(PanelHelper.getSpacer(4)); |
|
303 return elements; |
|
304 } |
|
305 |
|
306 private void addDataInit(final ListGrid table, final String tableData) { |
|
307 if (tableData != null) { |
|
308 final List<SalixZone> rows = SalixZone.parse(tableData); |
|
309 for (final SalixZone row : rows) { |
|
310 table.addData(createEntry(row)); |
|
311 } |
|
312 } |
|
313 } |
|
314 |
|
315 public final ListGridRecord createEntry(final SalixZone row) { |
|
316 |
|
317 final Integer dwspl = row.getDwsplValue(); |
|
318 final Double from = row.getFromKm(); |
|
319 final Double to = row.getToKm(); |
|
320 |
|
321 if (dwspl == null || from == null || to == null) { |
|
322 return null; |
|
323 } |
|
324 |
|
325 final ListGridRecord r = new ListGridRecord(); |
|
326 r.setAttribute("dmwspl", dwspl); |
|
327 r.setAttribute("from", from); |
|
328 r.setAttribute("to", to); |
|
329 |
|
330 return r; |
|
331 |
|
332 } |
|
333 |
|
334 private ListGridField createDoubleTableField(final String key, final String msg) { |
|
335 final ListGridField field = new ListGridField(key, msg); |
|
336 field.setAlign(Alignment.RIGHT); |
|
337 field.setWidth(90); |
|
338 field.addCellSavedHandler(new CellSavedHandler() { |
|
339 @Override |
|
340 public void onCellSaved(final CellSavedEvent event) { |
|
341 final Object value = event.getNewValue(); |
|
342 event.getRecord().setAttribute(key, event.getOldValue()); |
|
343 try { |
|
344 final double d = SupraRegionalTablePanel.this.format.parse(String.valueOf(value)); |
|
345 if (d > SupraRegionalTablePanel.this.maxKm) { |
|
346 event.getRecord().setAttribute(key, SupraRegionalTablePanel.this.maxKm); |
|
347 } else if (d < SupraRegionalTablePanel.this.minKm) { |
|
348 event.getRecord().setAttribute(key, SupraRegionalTablePanel.this.minKm); |
|
349 } else { |
|
350 event.getRecord().setAttribute(key, d); |
|
351 } |
|
352 validateRangeOverlap(); |
|
353 } |
|
354 catch (final NumberFormatException e) { |
|
355 e.printStackTrace(); |
|
356 } |
|
357 } |
|
358 }); |
|
359 |
|
360 field.setEditValueFormatter(new CellEditValueFormatter() { |
|
361 @Override |
|
362 public Object format(final Object value, final ListGridRecord record, final int rowNum, final int colNum) { |
|
363 if (!(value instanceof Float || value instanceof Double)) { |
|
364 try { |
|
365 return (float) SupraRegionalTablePanel.this.format.parse(String.valueOf(value)); |
|
366 } |
|
367 catch (final Exception e2) { |
|
368 return record.getAttribute(key); |
|
369 } |
|
370 } else { |
|
371 return SupraRegionalTablePanel.this.format.format((Double) value); |
|
372 } |
|
373 } |
|
374 }); |
|
375 field.setCellFormatter(new CellFormatter() { |
|
376 @Override |
|
377 public String format(final Object value, final ListGridRecord record, final int rowNum, final int colNum) { |
|
378 return SupraRegionalTablePanel.this.format.format(Double.valueOf(String.valueOf(value))); |
|
379 } |
|
380 }); |
|
381 return field; |
|
382 } |
|
383 |
|
384 private String validate(final String fromInput, final String toInput, final String dmwspl) { |
|
385 |
|
386 if (fromInput == null || toInput == null || dmwspl == null || fromInput.trim().isEmpty() || toInput.trim().isEmpty() || dmwspl.trim().isEmpty()) |
|
387 return this.MSG.uinfo_vegetation_zones_validation_empty(); |
|
388 |
|
389 try { |
|
390 final Double from = this.format.parse(fromInput); |
|
391 final Double to = this.format.parse(toInput); |
|
392 Integer.valueOf(dmwspl); |
|
393 |
|
394 if (from < this.minKm || from > this.maxKm || to > this.maxKm || to < this.minKm) |
|
395 return this.MSG.uinfo_salix_km_limit_exceed(); |
|
396 return null; |
|
397 } |
|
398 catch (final NumberFormatException e) { |
|
399 return this.MSG.wrongFormat(); |
|
400 } |
|
401 } |
|
402 |
|
403 private void validateRangeOverlap() { |
|
404 final StringBuilder builder = new StringBuilder(); |
|
405 if (SalixZone.zonesAreOverlapping(this.getSalixZones(this.table.getRecords()))) |
|
406 builder.append(this.MSG.uinfo_salix_km_overlap()).append(" "); |
|
407 if (SalixZone.hasGaps(this.getSalixZones(this.table.getRecords()), this.minKm, this.maxKm)) |
|
408 builder.append(this.MSG.uinfo_salix_km_has_gaps());// "Der Km-Bereich wird nicht vollst. abgedeckt."; |
|
409 |
|
410 this.validationLabel.setText(builder.toString()); |
|
411 } |
|
412 } |