changeset 9107:41f4bc83aa7a

vegzones improved
author gernotbelger
date Tue, 29 May 2018 15:19:03 +0200
parents ffd4e2b0381c
children f5b55b383ef9
files artifacts/doc/conf/artifacts/uinfo.xml artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/commons/AbstractUInfoExporter.java artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationExporter.java artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineExporter.java artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesCalculation.java gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.java gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.properties gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants_de.properties gwt-client/src/main/java/org/dive4elements/river/client/client/ui/PanelHelper.java gwt-client/src/main/java/org/dive4elements/river/client/client/ui/uinfo/AbstractVegZonesTablePanel.java gwt-client/src/main/java/org/dive4elements/river/client/client/ui/uinfo/VegetationzonesTableEditPanel.java gwt-client/src/main/java/org/dive4elements/river/client/client/ui/uinfo/VegetationzonesTablePanel.java
diffstat 12 files changed, 181 insertions(+), 171 deletions(-) [+]
line wrap: on
line diff
--- a/artifacts/doc/conf/artifacts/uinfo.xml	Tue May 29 11:38:13 2018 +0200
+++ b/artifacts/doc/conf/artifacts/uinfo.xml	Tue May 29 15:19:03 2018 +0200
@@ -248,13 +248,13 @@
 
     <transition transition="org.dive4elements.river.artifacts.transitions.ValueCompareTransition">
       <from state="state.uinfo.calculation_mode" />
-      <to state="state.uinfo.distance" />
+      <to state="state.uinfo.distance_only" />
       <condition data="calculation_mode" value="uinfo_vegetation_zones" operator="equal" />
     </transition>
 
 
     <transition transition="org.dive4elements.river.artifacts.transitions.ValueCompareTransition">
-      <from state="state.uinfo.distance" />
+      <from state="state.uinfo.distance_only" />
       <to state="state.uinfo.vegetation_zones.table" />
       <condition data="calculation_mode" value="uinfo_vegetation_zones" operator="equal" />
     </transition>
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/commons/AbstractUInfoExporter.java	Tue May 29 11:38:13 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/commons/AbstractUInfoExporter.java	Tue May 29 15:19:03 2018 +0200
@@ -92,9 +92,6 @@
         // "# Gewässer: "
         writeCSVMetaEntry(writer, I18NStrings.CSV_META_RIVER, msg(I18NStrings.CSV_META_RIVER_LABEL), river.getName());
 
-        // "# Höhensystem des Flusses: "
-        writeCSVMetaEntry(writer, I18NStrings.CSV_META_HEIGHT_UNIT_RIVER, river.getWstUnit()); // move to child?
-
         if (calcRange != null) {
             // "# Ort/Bereich (km): "
             writeCSVMetaEntry(writer, I18NStrings.CSV_META_RANGE, msg(I18NStrings.CSV_META_RANGE_LABEL), getKmFormatter().format(calcRange.getMinimumDouble()),
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationExporter.java	Tue May 29 11:38:13 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationExporter.java	Tue May 29 15:19:03 2018 +0200
@@ -15,6 +15,7 @@
 
 import org.apache.log4j.Logger;
 import org.dive4elements.river.artifacts.common.GeneralResultType;
+import org.dive4elements.river.artifacts.common.I18NStrings;
 import org.dive4elements.river.artifacts.common.JasperReporter;
 import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource;
 import org.dive4elements.river.artifacts.common.ResultRow;
@@ -46,6 +47,10 @@
         log.info("SalixLineExporter.writeCSVMeta");
 
         super.writeCSVGlobalMetadataDefaults(writer, results);
+
+        // "# Höhensystem des Flusses: "
+        writeCSVMetaEntry(writer, I18NStrings.CSV_META_HEIGHT_UNIT_RIVER, results.getRiver().getWstUnit());
+
         writer.writeNext(new String[] { "" }); // break line
     }
 
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineExporter.java	Tue May 29 11:38:13 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineExporter.java	Tue May 29 15:19:03 2018 +0200
@@ -15,6 +15,7 @@
 
 import org.apache.log4j.Logger;
 import org.dive4elements.river.artifacts.common.GeneralResultType;
+import org.dive4elements.river.artifacts.common.I18NStrings;
 import org.dive4elements.river.artifacts.common.JasperReporter;
 import org.dive4elements.river.artifacts.common.MetaAndTableJRDataSource;
 import org.dive4elements.river.artifacts.common.ResultRow;
@@ -47,6 +48,9 @@
 
         super.writeCSVGlobalMetadataDefaults(writer, results);
 
+        // "# Höhensystem des Flusses: "
+        writeCSVMetaEntry(writer, I18NStrings.CSV_META_HEIGHT_UNIT_RIVER, results.getRiver().getWstUnit());
+
         // Add Auswerter, Bezugspegel, Jahr/Zeitraum der Wasserspiegellage
 
         // "# Auswerter: "
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesCalculation.java	Tue May 29 11:38:13 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesCalculation.java	Tue May 29 15:19:03 2018 +0200
@@ -15,7 +15,7 @@
 
 import org.apache.commons.lang.math.DoubleRange;
 import org.dive4elements.artifacts.CallContext;
-import org.dive4elements.river.artifacts.access.RiverAccess;
+import org.dive4elements.river.artifacts.access.RangeAccess;
 import org.dive4elements.river.artifacts.common.ResultRow;
 import org.dive4elements.river.artifacts.model.Calculation;
 import org.dive4elements.river.artifacts.model.CalculationResult;
@@ -45,9 +45,9 @@
         final String user = CalculationUtils.findArtifactUser(this.context, uinfo);
 
         // FIXME: remove, check other states as well
-        final RiverAccess access = new RiverAccess(uinfo);
+        final RangeAccess access = new RangeAccess(uinfo);
         final River river = access.getRiver();
-        final DoubleRange calcRange = null;
+        final DoubleRange calcRange = access.getRange();
         final RiverInfo riverInfo = new RiverInfo(river);
 
         final VegetationzonesAccess vAccess = new VegetationzonesAccess(uinfo);
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.java	Tue May 29 11:38:13 2018 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.java	Tue May 29 15:19:03 2018 +0200
@@ -1517,4 +1517,11 @@
 
     String bundu();
 
+    String uinfo_vegetation_zones_validation_empty();
+
+    String uinfo_vegetation_zones_validation_range();
+
+    String uinfo_vegetation_zones_validation_from_greater_to();
+
+    String uinfo_vegetation_zones_invalid_integer();
 }
\ No newline at end of file
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.properties	Tue May 29 11:38:13 2018 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants.properties	Tue May 29 15:19:03 2018 +0200
@@ -810,5 +810,9 @@
 uinfo_vegetation_zones_label = Vegetationszonen
 uinfo_vegetation_zones_from = \u00dcfd von [d/a]
 uinfo_vegetation_zones_to = \u00dcfd bis [d/a]
+uinfo_vegetation_zones_validation_empty = Eingabefeld leer.
+uinfo_vegetation_zones_validation_range = Werte m\u00fcssen zwischen 0 und 365 liegen.
+uinfo_vegetation_zones_validation_from_greater_to = Der Wert f\u00fcr "\u00dcfd von" muss kleiner als "\u00dcfd bis".
+uinfo_vegetation_zones_invalid_integer = Nur Ganzzahlen erlaubt.
 
 bundu = Betrieb und Unterhaltung 
\ No newline at end of file
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants_de.properties	Tue May 29 11:38:13 2018 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/FLYSConstants_de.properties	Tue May 29 15:19:03 2018 +0200
@@ -810,5 +810,9 @@
 uinfo_vegetation_zones_label = Vegetationszonen
 uinfo_vegetation_zones_from = \u00dcfd von [d/a]
 uinfo_vegetation_zones_to = \u00dcfd bis [d/a]
+uinfo_vegetation_zones_validation_empty = Eingabefeld leer.
+uinfo_vegetation_zones_validation_range = Werte m\u00fcssen zwischen 0 und 365 liegen.
+uinfo_vegetation_zones_validation_from_greater_to = Der Wert f\u00fcr "\u00dcfd von" muss kleiner als "\u00dcfd bis".
+uinfo_vegetation_zones_invalid_integer = Nur Ganzzahlen erlaubt.
 
 bundu = Betrieb und Unterhaltung
\ No newline at end of file
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/PanelHelper.java	Tue May 29 11:38:13 2018 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/PanelHelper.java	Tue May 29 15:19:03 2018 +0200
@@ -9,6 +9,7 @@
  */
 package org.dive4elements.river.client.client.ui;
 
+import com.smartgwt.client.widgets.form.fields.IntegerItem;
 import com.smartgwt.client.widgets.form.fields.TextItem;
 import com.smartgwt.client.widgets.form.validator.IsIntegerValidator;
 import com.smartgwt.client.widgets.form.validator.Validator;
@@ -32,6 +33,14 @@
         return item;
     }
 
+    public static final IntegerItem createIntegerItem(final String identifier, final String title, final int width, final Validator... validator) {
+        final IntegerItem item = new IntegerItem(identifier, title);
+        item.setWidth(width);
+        item.setWrapTitle(false);
+        item.setValidators(validator);
+        return item;
+    }
+
     public static VLayout getSpacer(final int height) {
         final VLayout spacer = new VLayout();
         spacer.setHeight(height);
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/uinfo/AbstractVegZonesTablePanel.java	Tue May 29 11:38:13 2018 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/uinfo/AbstractVegZonesTablePanel.java	Tue May 29 15:19:03 2018 +0200
@@ -20,15 +20,20 @@
 import org.dive4elements.river.client.shared.model.DefaultData;
 import org.dive4elements.river.client.shared.model.DefaultDataItem;
 
+import com.google.gwt.core.client.GWT;
 import com.smartgwt.client.data.Record;
 import com.smartgwt.client.types.Alignment;
+import com.smartgwt.client.types.ListGridFieldType;
 import com.smartgwt.client.widgets.Canvas;
 import com.smartgwt.client.widgets.Label;
-import com.smartgwt.client.widgets.form.fields.TextItem;
+import com.smartgwt.client.widgets.form.validator.IntegerRangeValidator;
 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.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;
 
 /**
@@ -37,26 +42,18 @@
  */
 public abstract class AbstractVegZonesTablePanel extends AbstractUIProvider {
     private static final long serialVersionUID = 1L;
-    public static final String TABLE_CELL_SEPARATOR = "TABLE_CELL_SEPARATOR";
-    public static final String TABLE_ROW_SEPARATOR = "TABLE_ROW_SEPARATOR";
-
-    protected static final String datakey = "vegzones";
 
-    protected final ListGrid elements = new ListGrid();
-    protected TextItem vegzone;
-    protected TextItem start;
-    protected TextItem end;
-    private ListGrid table;
+    private static final String TABLE_CELL_SEPARATOR = "TABLE_CELL_SEPARATOR";
 
-    protected ListGridField vegzoneField;// = new ListGridField("vegzone", this.MSG.uinfo_vegetation_zones_label());
-    protected ListGridField fromField;// = new ListGridField("from", this.MSG.uinfo_vegetation_zones_from());
-    protected ListGridField toField;// = new ListGridField("to", this.MSG.uinfo_vegetation_zones_to());
+    private static final String TABLE_ROW_SEPARATOR = "TABLE_ROW_SEPARATOR";
 
-    final protected VLayout root = new VLayout();
-    final protected HLayout input = new HLayout();
-    final protected VLayout tableLayout = new VLayout();
+    private static final String datakey = "vegzones";
 
-    protected final void createTable(final DataList data, final int width) {
+    private final ListGrid elements = new ListGrid();
+
+    // private final HLayout input = new HLayout();
+
+    protected final ListGrid createTable(final Layout root, final DataList data, final int width, final boolean editable) {
         data.add(VegetationzonesTablePanel.getDummyData()); // TODO: GET REAL DATA!
 
         final Label title = new Label(data.get(0).getDescription());
@@ -67,85 +64,75 @@
         this.elements.setShowHeaderContextMenu(false);
         this.elements.setCanReorderFields(false);
         this.elements.setCanSort(false);
-        this.elements.setCanEdit(false);
-        this.vegzoneField = new ListGridField("vegzone", this.MSG.uinfo_vegetation_zones_label());
-        this.fromField = new ListGridField("from", this.MSG.uinfo_vegetation_zones_from());
-        this.toField = new ListGridField("to", this.MSG.uinfo_vegetation_zones_to());
-        this.vegzoneField.setWidth(245);
-        this.fromField.setWidth(80);
-        this.toField.setWidth(80);
-        this.fromField.setAlign(Alignment.RIGHT);
-        this.toField.setAlign(Alignment.RIGHT);
+        this.elements.setCanEdit(editable);
+
+        final ListGridField vegzoneField = new ListGridField("vegzone", this.MSG.uinfo_vegetation_zones_label());
+        vegzoneField.setType(ListGridFieldType.TEXT);
+        vegzoneField.setWidth(245);
+
+        final ListGridField fromField = new ListGridField("from", this.MSG.uinfo_vegetation_zones_from());
+        fromField.setType(ListGridFieldType.INTEGER);
+        final IntegerRangeValidator validator = new IntegerRangeValidator();
+        validator.setMin(0);
+        validator.setMax(365);
+
+        fromField.setValidators(validator);
+        fromField.setWidth(80);
+        fromField.setAlign(Alignment.RIGHT);
+
+        final ListGridField toField = new ListGridField("to", this.MSG.uinfo_vegetation_zones_to());
+        toField.setType(ListGridFieldType.INTEGER);
+        toField.setValidators(validator);
+        toField.setWidth(80);
+        toField.setAlign(Alignment.RIGHT);
+
+        if (editable) {
+            final ListGridField removeField = createRemoveField();
+            this.elements.setFields(vegzoneField, fromField, toField, removeField);
+
+        } else {
+            this.elements.setFields(vegzoneField, fromField, toField);
+        }
 
         addDataInit(data);
 
-        this.root.addMember(title);
-        this.tableLayout.addMember(this.elements);
-        this.root.addMember(this.input);
-        this.root.addMember(this.tableLayout);
-        this.root.addMember(PanelHelper.getSpacer(10));
+        root.addMember(title);
+        root.addMember(this.elements);
+        root.addMember(PanelHelper.getSpacer(10));
 
+        return this.elements;
     }
 
-    protected final Canvas createHelper() {
-        this.table = new ListGrid();
-        this.table.setShowHeaderContextMenu(false);
-        this.table.setWidth100();
-        this.table.setShowRecordComponents(true);
-        this.table.setShowRecordComponentsByCell(true);
-        this.table.setHeight100();
-        this.table.setEmptyMessage(this.MSG.empty_table());
-        this.table.setCanReorderFields(false);
+    private ListGridField createRemoveField() {
 
-        /* Input support pins */
-        // final String baseUrl = GWT.getHostPageBaseURL();
-        // final ListGridField pinFrom = new ListGridField("fromIcon", this.MSG.uinfo_vegetation_zones_from());
-        // pinFrom.setWidth(300);
-        // pinFrom.setType(ListGridFieldType.ICON);
-        // pinFrom.setCellIcon(baseUrl + this.MSG.markerGreen());
-        //
-        // final ListGridField pinTo = new ListGridField("toIcon", this.MSG.uinfo_vegetation_zones_to());
-        // pinTo.setType(ListGridFieldType.ICON);
-        // pinTo.setWidth(300);
-        // pinTo.setCellIcon(baseUrl + this.MSG.markerRed());
-        //
-        // pinFrom.addRecordClickHandler(new RecordClickHandler() {
-        // @Override
-        // public void onRecordClick(final RecordClickEvent e) {
-        // final Record r = e.getRecord();
-        // VegetationzonesTableEditPanel.this.vegzone.setValue(r.getAttribute("date")); // date??
-        // }
-        // });
-        //
-        // pinFrom.addRecordClickHandler(new RecordClickHandler() {
-        // @Override
-        // public void onRecordClick(final RecordClickEvent e) {
-        // final Record r = e.getRecord();
-        // VegetationzonesTableEditPanel.this.start.setValue(r.getAttribute("date"));
-        // }
-        // });
-        //
-        // pinTo.addRecordClickHandler(new RecordClickHandler() {
-        // @Override
-        // public void onRecordClick(final RecordClickEvent e) {
-        // final Record r = e.getRecord();
-        // VegetationzonesTableEditPanel.this.end.setValue(r.getAttribute("date"));
-        // }
-        // });
-        //
-        // final ListGridField date = new ListGridField("date", this.MSG.year());
-        // date.setType(ListGridFieldType.TEXT);
-        // date.setWidth(100);
-        //
-        // final ListGridField descr = new ListGridField("description", this.MSG.description());
-        // descr.setType(ListGridFieldType.TEXT);
-        // descr.setWidth("*");
-        //
-        // this.table.setFields(pinFrom, pinTo, date, descr);
-        return this.table;
+        final ListGridField removeField = new ListGridField("_removeRecord", "Remove Record") {
+            {
+                setType(ListGridFieldType.ICON);
+                setIcon(GWT.getHostPageBaseURL() + AbstractVegZonesTablePanel.this.MSG.removeFeature());
+                setCanEdit(false);
+                setCanFilter(false);
+                setCanSort(false);
+                setCanGroupBy(false);
+                setCanFreeze(false);
+                setWidth(25);
+            }
+        };
+
+        this.elements.addRecordClickHandler(new RecordClickHandler() {
+            @Override
+            public void onRecordClick(final RecordClickEvent event) {
+                // Just handle remove-clicks
+                if (!event.getField().getName().equals(removeField.getName())) {
+                    return;
+                }
+                event.getViewer().removeData(event.getRecord());
+            }
+        });
+
+        return removeField;
     }
 
-    public abstract Canvas createWidget(final DataList data);
+    public abstract void createWidget(final Layout root, final DataList data);
 
     private final void addDataInit(final DataList data) {
         for (final Data dataItemContainer : data.getAll()) {
@@ -166,16 +153,17 @@
     @Override
     public final Canvas create(final DataList data) {
         final VLayout layout = new VLayout();
-        final Canvas helper = createHelper();
-        this.helperContainer.addMember(helper);
+
+        // final Canvas helper = createHelper();
+        // this.helperContainer.addMember(helper);
 
         final Canvas submit = getNextButton();
-        final Canvas widget = createWidget(data);
 
-        layout.addMember(widget);
-        layout.addMember(submit); // TODO: SUBMIT
+        final VLayout root = new VLayout();
+        createWidget(root, data);
 
-        // fetchSedimentLoadData(); //TODO: feed from database...
+        layout.addMember(root);
+        layout.addMember(submit);
 
         return layout;
     }
@@ -194,9 +182,9 @@
         final Data str = getData(items, datakey);
         final DataItem[] strItems = str.getItems();
 
-        final String[] entries = strItems[0].getLabel().split(VegetationzonesTablePanel.TABLE_ROW_SEPARATOR);
+        final String[] entries = strItems[0].getLabel().split(AbstractVegZonesTablePanel.TABLE_ROW_SEPARATOR);
         for (final String entry : entries) {
-            final String[] vals = entry.split(VegetationzonesTablePanel.TABLE_CELL_SEPARATOR);
+            final String[] vals = entry.split(AbstractVegZonesTablePanel.TABLE_CELL_SEPARATOR);
             final Label dateLabel = new Label(vals[0] + " (" + vals[1] + "-" + vals[2] + ")");
             dateLabel.setHeight(20);
             vLayout.addMember(dateLabel);
@@ -239,9 +227,9 @@
         String d = "";
         for (final ListGridRecord element : lgr) {
             final Record r = element;
-            d += r.getAttribute("vegzone") + VegetationzonesTablePanel.TABLE_CELL_SEPARATOR + r.getAttribute("from")
-                    + VegetationzonesTablePanel.TABLE_CELL_SEPARATOR + r.getAttribute("to");
-            d += VegetationzonesTablePanel.TABLE_ROW_SEPARATOR;
+            d += r.getAttribute("vegzone") + AbstractVegZonesTablePanel.TABLE_CELL_SEPARATOR + r.getAttribute("from")
+                    + AbstractVegZonesTablePanel.TABLE_CELL_SEPARATOR + r.getAttribute("to");
+            d += AbstractVegZonesTablePanel.TABLE_ROW_SEPARATOR;
         }
 
         final DataItem item = new DefaultDataItem(datakey, null, d); // DATA-key
@@ -274,5 +262,4 @@
         }
         return null;
     }
-
-}
+}
\ No newline at end of file
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/uinfo/VegetationzonesTableEditPanel.java	Tue May 29 11:38:13 2018 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/uinfo/VegetationzonesTableEditPanel.java	Tue May 29 15:19:03 2018 +0200
@@ -11,30 +11,34 @@
 import org.dive4elements.river.client.client.ui.PanelHelper;
 import org.dive4elements.river.client.shared.model.DataList;
 
-import com.google.gwt.core.client.GWT;
-import com.smartgwt.client.types.ListGridFieldType;
+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.validator.IsIntegerValidator;
-import com.smartgwt.client.widgets.form.validator.IsStringValidator;
-import com.smartgwt.client.widgets.grid.ListGridField;
+import com.smartgwt.client.widgets.form.fields.TextItem;
+import com.smartgwt.client.widgets.grid.ListGrid;
 import com.smartgwt.client.widgets.grid.ListGridRecord;
-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;
 
 public class VegetationzonesTableEditPanel extends AbstractVegZonesTablePanel {
     private static final long serialVersionUID = 1L;
 
+    private TextItem vegzone;
+
+    private TextItem start;
+
+    private TextItem end;
+
     @Override
-    public Canvas createWidget(final DataList data) {
-        super.createTable(data, 450);
-        this.vegzone = PanelHelper.createItem("uinfo_vegetation_zone_label", this.MSG.uinfo_vegetation_zone_label(), 200, new IsStringValidator());
-        this.start = PanelHelper.createItem("uinfo_vegetation_zones_from", this.MSG.uinfo_vegetation_zones_from(), 40, new IsIntegerValidator());
-        this.end = PanelHelper.createItem("uinfo_vegetation_zones_to", this.MSG.uinfo_vegetation_zones_to(), 40, new IsIntegerValidator());
+    public void createWidget(final Layout root, final DataList data) {
+
+        final ListGrid elements = super.createTable(root, data, 450, true);
+
+        this.vegzone = PanelHelper.createItem("uinfo_vegetation_zone_label", this.MSG.uinfo_vegetation_zone_label(), 200);
+        this.start = PanelHelper.createIntegerItem("uinfo_vegetation_zones_from", this.MSG.uinfo_vegetation_zones_from(), 40);
+        this.end = PanelHelper.createIntegerItem("uinfo_vegetation_zones_to", this.MSG.uinfo_vegetation_zones_to(), 40);
         final HLayout fields = new HLayout();
         final HLayout fields2 = new HLayout();
 
@@ -53,16 +57,9 @@
                 final String v1 = VegetationzonesTableEditPanel.this.start.getValueAsString();
                 final String v2 = VegetationzonesTableEditPanel.this.end.getValueAsString();
                 final String v3 = VegetationzonesTableEditPanel.this.vegzone.getValueAsString();
-                if (v1 == null || v2 == null || v3 == null) {
-                    return;
-                }
-                try {
-                    final double test = Double.valueOf(v1);
-                    final double test2 = Double.valueOf(v2);
-                    // TODO: MAKE MESSAGE, Apply Format (1.000,00)
-                }
-                catch (final Exception e) {
-                    e.printStackTrace();
+                final String message = validate(v1, v2, v3);
+                if (message != null) {
+                    SC.warn(message);
                     return;
                 }
 
@@ -70,46 +67,42 @@
                 r.setAttribute("vegzone", v3);
                 r.setAttribute("from", v1);
                 r.setAttribute("to", v2);
-                VegetationzonesTableEditPanel.this.elements.addData(r);
+                elements.addData(r);
             }
         });
 
-        final ListGridField removeField = new ListGridField("_removeRecord", "Remove Record") {
-            {
-                setType(ListGridFieldType.ICON);
-                setIcon(GWT.getHostPageBaseURL() + VegetationzonesTableEditPanel.this.MSG.removeFeature());
-                setCanEdit(false);
-                setCanFilter(false);
-                setCanSort(false);
-                setCanGroupBy(false);
-                setCanFreeze(false);
-                setWidth(25);
-            }
-        };
-
-        this.elements.addRecordClickHandler(new RecordClickHandler() {
-            @Override
-            public void onRecordClick(final RecordClickEvent event) {
-                // Just handle remove-clicks
-                if (!event.getField().getName().equals(removeField.getName())) {
-                    return;
-                }
-                event.getViewer().removeData(event.getRecord());
-            }
-        });
-
-        this.elements.setFields(super.vegzoneField, super.fromField, super.toField, removeField);
-
         fields.addMember(form1);
         fields2.addMember(form2);
 
-        this.root.addMember(fields);
-        this.root.addMember(fields2);
-        this.root.addMember(PanelHelper.getSpacer(10));
-        this.root.addMember(add);
-        this.root.addMember(PanelHelper.getSpacer(20));
-
-        return this.root;
+        root.addMember(fields);
+        root.addMember(fields2);
+        root.addMember(PanelHelper.getSpacer(10));
+        root.addMember(add);
+        root.addMember(PanelHelper.getSpacer(20));
     }
 
-}
+    protected String validate(final String v1, final String v2, final String v3) {
+
+        if (v1 == null || v2 == null || v3 == null || v1.trim().isEmpty() || v2.trim().isEmpty() || v3.trim().isEmpty())
+            return this.MSG.uinfo_vegetation_zones_validation_empty();
+
+        try {
+            final Integer from = Integer.valueOf(v1);
+            final Integer to = Integer.valueOf(v2);
+
+            if (from < 0 || from > 365)
+                return this.MSG.uinfo_vegetation_zones_validation_range();
+
+            if (to < 0 || to > 365)
+                return this.MSG.uinfo_vegetation_zones_validation_range();
+
+            if (from > to)
+                return this.MSG.uinfo_vegetation_zones_validation_from_greater_to();
+
+            return null;
+        }
+        catch (final NumberFormatException e) {
+            return this.MSG.uinfo_vegetation_zones_invalid_integer();
+        }
+    }
+}
\ No newline at end of file
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/uinfo/VegetationzonesTablePanel.java	Tue May 29 11:38:13 2018 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/uinfo/VegetationzonesTablePanel.java	Tue May 29 15:19:03 2018 +0200
@@ -10,17 +10,17 @@
 
 import org.dive4elements.river.client.shared.model.DataList;
 
-import com.smartgwt.client.widgets.Canvas;
+import com.smartgwt.client.widgets.layout.Layout;
 
 public class VegetationzonesTablePanel extends AbstractVegZonesTablePanel {
 
     private static final long serialVersionUID = 1L;
 
     @Override
-    public Canvas createWidget(final DataList data) {
+    public void createWidget(final Layout root, final DataList data) {
 
-        createTable(data, 420);
-        this.elements.setFields(this.vegzoneField, this.fromField, this.toField);
-        return this.root;
+        createTable(root, data, 420, false);
+
+        // fetchSedimentLoadData(); //TODO: feed from database...
     }
 }

http://dive4elements.wald.intevation.org