Mercurial > dive4elements > river
view gwt-client/src/main/java/org/dive4elements/river/client/client/ui/uinfo/SupraRegionalTablePanel.java @ 9239:4e3757202d5c
salix.supraregional better error- + advance-handling
author | gernotbelger |
---|---|
date | Tue, 10 Jul 2018 14:45:40 +0200 |
parents | 1c756bfee472 |
children | 54173301bc34 |
line wrap: on
line source
/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde * Software engineering by Intevation GmbH * * This file is Free Software under the GNU AGPL (>=v3) * and comes with ABSOLUTELY NO WARRANTY! Check out the * documentation coming with Dive4Elements River for details. */ package org.dive4elements.river.client.client.ui.uinfo; import java.util.ArrayList; import java.util.List; import org.dive4elements.river.client.client.ui.AbstractUIProvider; import org.dive4elements.river.client.client.ui.DistancePanelInputHelper; import org.dive4elements.river.client.client.ui.PanelHelper; import org.dive4elements.river.client.shared.model.Data; import org.dive4elements.river.client.shared.model.DataItem; import org.dive4elements.river.client.shared.model.DataList; import org.dive4elements.river.client.shared.model.DefaultData; import org.dive4elements.river.client.shared.model.DefaultDataItem; import org.dive4elements.river.client.shared.model.SalixZone; import com.google.gwt.core.client.GWT; import com.google.gwt.i18n.client.NumberFormat; import com.google.gwt.user.client.ui.Label; import com.smartgwt.client.data.Record; import com.smartgwt.client.types.Alignment; import com.smartgwt.client.util.SC; import com.smartgwt.client.widgets.Button; import com.smartgwt.client.widgets.Canvas; import com.smartgwt.client.widgets.events.ClickEvent; import com.smartgwt.client.widgets.events.ClickHandler; import com.smartgwt.client.widgets.form.DynamicForm; import com.smartgwt.client.widgets.form.fields.TextItem; import com.smartgwt.client.widgets.grid.CellEditValueFormatter; import com.smartgwt.client.widgets.grid.CellFormatter; import com.smartgwt.client.widgets.grid.ListGrid; import com.smartgwt.client.widgets.grid.ListGridField; import com.smartgwt.client.widgets.grid.ListGridRecord; import com.smartgwt.client.widgets.grid.events.CellSavedEvent; import com.smartgwt.client.widgets.grid.events.CellSavedHandler; import com.smartgwt.client.widgets.grid.events.RecordClickEvent; import com.smartgwt.client.widgets.grid.events.RecordClickHandler; import com.smartgwt.client.widgets.layout.HLayout; import com.smartgwt.client.widgets.layout.Layout; import com.smartgwt.client.widgets.layout.VLayout; public class SupraRegionalTablePanel extends AbstractUIProvider { private static final long serialVersionUID = 1L; private Double minKm, maxKm = -1.; // private String tableData = ""; private ListGrid table; private final String datakey = "supraregional_table"; final Label validationLabel = new Label(); private final NumberFormat format = NumberFormat.getDecimalFormat(); @Override public Canvas createOld(final DataList dataList) { final HLayout layout = new HLayout(); layout.setWidth("400px"); final VLayout vLayout = new VLayout(); vLayout.setWidth(130); final Label label = new Label(dataList.getLabel()); label.setWidth("200px"); label.setHeight("25px"); final List<Data> items = dataList.getAll(); final Data str = getData(items, this.datakey); final DataItem[] strItems = str.getItems(); final List<SalixZone> entries = SalixZone.parse(strItems[0].getLabel()); for (final SalixZone entry : entries) { final Label dateLabel = new Label( entry.getDwsplValue() + " (" + this.format.format(entry.getFromKm()) + "-" + this.format.format(entry.getToKm()) + " km)"); dateLabel.setHeight("20px"); vLayout.addMember(dateLabel); } final Canvas back = getBackButton(dataList.getState()); layout.addMember(label); layout.addMember(vLayout); layout.addMember(back); return layout; } @Override public Canvas create(final DataList data) { final Data dataItem = data.getAll().get(0); String tableData = ""; for (final DataItem item : dataItem.getItems()) { final String label = item.getLabel(); if (label.equals("salix_zones_min")) this.minKm = Double.valueOf(item.getStringValue()); else if (label.equals("salix_zones_max")) this.maxKm = Double.valueOf(item.getStringValue()); else if (label.equals("salix_zones")) tableData = item.getStringValue(); } if (this.minKm > this.maxKm) { final double temp = this.minKm; this.minKm = this.maxKm; this.maxKm = temp; } final VLayout layout = new VLayout(); final Canvas submit = getNextButton(); // // new Button(this.MSG.buttonNext()); // final HandlerRegistration reg = submit.addClickHandler(new ClickHandler() { // // @Override // public void onClick(final ClickEvent event) { // final String msg = getErrorMsg(); // if (!msg.equals("")) { // SC.warn(msg); // } else { // // continue, forward, advance // // } // } // }); final VLayout root = new VLayout(); root.setWidth(420); createWidget(root, data, tableData); layout.addMember(root); layout.addMember(submit); validateRangeOverlap();// init Text return layout; } @Override protected Data[] getData() { final List<Data> data = new ArrayList<Data>(); final ListGridRecord[] lgr = this.table.getRecords(); if (lgr == null) { return new Data[0]; } final List<SalixZone> zoneList = getSalixZones(lgr); final DataItem item = new DefaultDataItem(this.datakey, null, SalixZone.parseListToDataString(zoneList)); data.add(new DefaultData(this.datakey, null, null, new DataItem[] { item })); return data.toArray(new Data[data.size()]); } private List<SalixZone> getSalixZones(final ListGridRecord[] lgr) { final List<SalixZone> zoneList = new ArrayList<SalixZone>(); for (final ListGridRecord element : lgr) { final Record r = element; final SalixZone zone = SalixZone.createFromTableEntry(r.getAttribute("dmwspl"), r.getAttribute("from"), r.getAttribute("to")); zoneList.add(zone); } return zoneList; } public Canvas createWidget(final Layout root, final DataList data, final String tableData) { this.table = createTable(root, data, tableData); final TextItem dwspl = PanelHelper.createItem("_label_dwspl", this.MSG.uinfo_salix_dmwspl_short(), "50"); final TextItem start = PanelHelper.createIntegerItem("_from_dwspl", getLabelFromTo(this.MSG.from()), "50"); final TextItem end = PanelHelper.createIntegerItem("_to_dwspl", getLabelFromTo(this.MSG.to()), "50"); final HLayout fields = new HLayout(); final Button add = new Button(this.MSG.add_date()); // TODO: make key more generic or change to more specific final DynamicForm newEntryForm = new DynamicForm(); newEntryForm.setWidth(320); newEntryForm.setNumCols(12); newEntryForm.setFields(dwspl, start, end); add.addClickHandler(new ClickHandler() { @Override public void onClick(final ClickEvent ce) { final String v1 = start.getValueAsString(); final String v2 = end.getValueAsString(); final String v3 = dwspl.getValueAsString(); final String message = validate(v1, v2, v3); if (message != null) { SC.warn(message); return; } final ListGridRecord r = new ListGridRecord(); r.setAttribute("dmwspl", v3); r.setAttribute("from", SupraRegionalTablePanel.this.format.parse(v1)); r.setAttribute("to", SupraRegionalTablePanel.this.format.parse(v2)); SupraRegionalTablePanel.this.table.addData(r); validateRangeOverlap(); } }); fields.addMember(newEntryForm); root.addMember(fields); root.addMember(PanelHelper.getSpacer(10)); initHelperPanel(start, end); root.addMember(add); root.addMember(PanelHelper.getSpacer(20)); return root; } private String getLabelFromTo(final String fromOrTo) { return new StringBuilder().append(fromOrTo).append(" [").append(this.MSG.dpUnitFrom()).append("]").toString(); } protected void initHelperPanel(final TextItem start, final TextItem end) { final DistancePanelInputHelper helper = new DistancePanelInputHelper(this.MSG, this.helperContainer, this.getRiverName()); helper.getDistancesTable().addRecordClickHandler(new RecordClickHandler() { @Override public void onRecordClick(final RecordClickEvent e) { final Record r = e.getRecord(); final String from = r.getAttribute("from"); final String to = r.getAttribute("to"); try { start.setValue(SupraRegionalTablePanel.this.format.format(Double.valueOf(from))); end.setValue(SupraRegionalTablePanel.this.format.format(Double.valueOf(to))); } catch (final NumberFormatException nfe) { SC.warn(SupraRegionalTablePanel.this.MSG.wrongFormat()); } } }); helper.getLocationsTable().addRecordClickHandler(new RecordClickHandler() { @Override public void onRecordClick(final RecordClickEvent e) { final Record r = e.getRecord(); final int field = e.getFieldNum(); try { final String value = r.getAttribute("from"); switch (field) { case 0: start.setValue(SupraRegionalTablePanel.this.format.format(Double.valueOf(value))); break; case 1: end.setValue(SupraRegionalTablePanel.this.format.format(Double.valueOf(value))); break; } } catch (final NumberFormatException nfe) { SC.warn(SupraRegionalTablePanel.this.MSG.wrongFormat()); } } }); } protected final ListGrid createTable(final Layout root, final DataList data, final String tableData) { final Label title = new Label(data.get(0).getDescription()); title.setHeight("35px"); this.validationLabel.setHeight("10px"); final ListGrid elements = new ListGrid(); elements.setWidth(320); elements.setHeight(300); elements.setShowHeaderContextMenu(false); elements.setCanReorderFields(false); elements.setCanResizeFields(false); elements.setCanEdit(true); elements.setCanSort(false); elements.setCanResizeFields(false); final ListGridField dmwsplField = new ListGridField("dmwspl", this.MSG.uinfo_salix_dmwspl_short()); dmwsplField.setAlign(Alignment.RIGHT); dmwsplField.setWidth(95); dmwsplField.addCellSavedHandler(new CellSavedHandler() { @Override public void onCellSaved(final CellSavedEvent event) { final Object value = event.getNewValue(); event.getRecord().setAttribute("dmwspl", event.getOldValue()); try { final int intValue = Integer.valueOf(String.valueOf(value)); event.getRecord().setAttribute("dmwspl", intValue); } catch (final NumberFormatException e) { e.printStackTrace(); } } }); final ListGridField fromField = createDoubleTableField("from", this.MSG.from()); final ListGridField toField = createDoubleTableField("to", this.MSG.to()); final ListGridField removeField = PanelHelper.createRemoveField(elements, GWT.getHostPageBaseURL() + this.MSG.removeFeature()); elements.addRecordClickHandler(new RecordClickHandler() { // adding another custom record-Remove-Handler which is not included in the Panelhelper @Override public void onRecordClick(final RecordClickEvent event) { if (event.getField().getName().equals(removeField.getName())) { validateRangeOverlap(); } } }); elements.setFields(dmwsplField, fromField, toField, removeField); addDataInit(elements, tableData); root.addMember(title); root.addMember(elements); root.addMember(PanelHelper.getSpacer(3)); root.addMember(this.validationLabel); root.addMember(PanelHelper.getSpacer(4)); return elements; } private void addDataInit(final ListGrid table, final String tableData) { if (tableData != null) { final List<SalixZone> rows = SalixZone.parse(tableData); for (final SalixZone row : rows) { table.addData(createEntry(row)); } } } public final ListGridRecord createEntry(final SalixZone row) { final Integer dwspl = row.getDwsplValue(); final Double from = row.getFromKm(); final Double to = row.getToKm(); if (dwspl == null || from == null || to == null) { return null; } final ListGridRecord r = new ListGridRecord(); r.setAttribute("dmwspl", dwspl); r.setAttribute("from", from); r.setAttribute("to", to); return r; } private ListGridField createDoubleTableField(final String key, final String msg) { final ListGridField field = new ListGridField(key, msg); field.setAlign(Alignment.RIGHT); field.setWidth(90); field.addCellSavedHandler(new CellSavedHandler() { @Override public void onCellSaved(final CellSavedEvent event) { final Object value = event.getNewValue(); event.getRecord().setAttribute(key, event.getOldValue()); try { final double d = SupraRegionalTablePanel.this.format.parse(String.valueOf(value)); if (d > SupraRegionalTablePanel.this.maxKm) { event.getRecord().setAttribute(key, SupraRegionalTablePanel.this.maxKm); } else if (d < SupraRegionalTablePanel.this.minKm) { event.getRecord().setAttribute(key, SupraRegionalTablePanel.this.minKm); } else { event.getRecord().setAttribute(key, d); } validateRangeOverlap(); } catch (final NumberFormatException e) { e.printStackTrace(); } } }); field.setEditValueFormatter(new CellEditValueFormatter() { @Override public Object format(final Object value, final ListGridRecord record, final int rowNum, final int colNum) { if (!(value instanceof Float || value instanceof Double)) { try { return (float) SupraRegionalTablePanel.this.format.parse(String.valueOf(value)); } catch (final Exception e2) { return record.getAttribute(key); } } else { return SupraRegionalTablePanel.this.format.format((Double) value); } } }); field.setCellFormatter(new CellFormatter() { @Override public String format(final Object value, final ListGridRecord record, final int rowNum, final int colNum) { return SupraRegionalTablePanel.this.format.format(Double.valueOf(String.valueOf(value))); } }); return field; } private String validate(final String fromInput, final String toInput, final String dmwspl) { final List<SalixZone> zones = getSalixZones(this.table.getRecords()); if (fromInput == null || toInput == null || dmwspl == null || fromInput.trim().isEmpty() || toInput.trim().isEmpty() || dmwspl.trim().isEmpty()) return this.MSG.uinfo_vegetation_zones_validation_empty(); try { final Double from = this.format.parse(fromInput); final Double to = this.format.parse(toInput); Integer.valueOf(dmwspl); if (!SalixZone.hasGaps(zones, this.minKm, this.maxKm)) return this.MSG.uinfo_salix_input_complete(); if (from < this.minKm || from > this.maxKm || to > this.maxKm || to < this.minKm) return this.MSG.uinfo_salix_km_limit_exceed(); // range anschluss if (!SalixZone.isValidAnschlussRange(from, to, zones, this.minKm)) { return this.MSG.uinfo_salix_km_anschluss(); } return null; } catch (final NumberFormatException e) { return this.MSG.wrongFormat(); } } @Override public List<String> validate() { final List<String> errors = new ArrayList<String>(); if (SalixZone.zonesAreOverlapping(this.getSalixZones(this.table.getRecords()))) errors.add(this.MSG.uinfo_salix_km_overlap()); if (SalixZone.hasGaps(this.getSalixZones(this.table.getRecords()), this.minKm, this.maxKm)) errors.add(this.MSG.uinfo_salix_km_has_gaps());// "Der Km-Bereich wird nicht vollst. abgedeckt."; return errors; } private void validateRangeOverlap() { this.validationLabel.setText(validate().toString().replace("[", "").replace("]", "").replace(",", "")); } }