diff gwt-client/src/main/java/org/dive4elements/river/client/client/ui/uinfo/SupraRegionalTablePanel.java @ 9237:972e10522ed6

salix.supraregional ui
author gernotbelger
date Tue, 10 Jul 2018 11:24:12 +0200
parents
children 1c756bfee472
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/uinfo/SupraRegionalTablePanel.java	Tue Jul 10 11:24:12 2018 +0200
@@ -0,0 +1,412 @@
+/* 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();
+
+        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");
+        // this.dwspl.setColSpan(3);
+        final TextItem start = PanelHelper.createIntegerItem("_from_dwspl", getLabelFromTo(this.MSG.from()), "50");
+        // this.start.setColSpan(3);
+        final TextItem end = PanelHelper.createIntegerItem("_to_dwspl", getLabelFromTo(this.MSG.to()), "50");
+        // this.end.setColSpan(3);
+
+        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) {
+
+        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 (from < this.minKm || from > this.maxKm || to > this.maxKm || to < this.minKm)
+                return this.MSG.uinfo_salix_km_limit_exceed();
+            return null;
+        }
+        catch (final NumberFormatException e) {
+            return this.MSG.wrongFormat();
+        }
+    }
+
+    private void validateRangeOverlap() {
+        final StringBuilder builder = new StringBuilder();
+        if (SalixZone.zonesAreOverlapping(this.getSalixZones(this.table.getRecords())))
+            builder.append(this.MSG.uinfo_salix_km_overlap()).append(" ");
+        if (SalixZone.hasGaps(this.getSalixZones(this.table.getRecords()), this.minKm, this.maxKm))
+            builder.append(this.MSG.uinfo_salix_km_has_gaps());// "Der Km-Bereich wird nicht vollst. abgedeckt.";
+
+        this.validationLabel.setText(builder.toString());
+    }
+}
\ No newline at end of file

http://dive4elements.wald.intevation.org