changeset 9070:611a523fc42f

VegetationZoneAccessHelper, VegetationTablePanels verbessert
author gernotbelger
date Tue, 15 May 2018 18:04:36 +0200
parents 1ffd38826175
children a561b882436d
files artifacts/src/main/java/org/dive4elements/river/artifacts/access/RangeAccess.java artifacts/src/main/java/org/dive4elements/river/artifacts/common/AccessHelper.java artifacts/src/main/java/org/dive4elements/river/artifacts/common/EpochYearAccessHelper.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionAccess.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationAccess.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculation.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthAccess.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthdev/FlowDepthDevelopmentAccess.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthminmax/FlowDepthMinMaxAccess.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/predefineddepthevol/PredefinedDepthEvolAccess.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/predefinedflowdepth/PredefinedFlowDepthColumnAccess.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/predefinedtkh/PredefinedTkhColumnAccess.java artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/TkhAccess.java artifacts/src/main/java/org/dive4elements/river/artifacts/states/DistanceOnlyPartSelect.java artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationAccess.java artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationCalculation.java artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineAccess.java artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculation.java artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesCalculation.java artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesState.java artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationzonesAccess.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/SuperVegZonesTablePanel.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 gwt-client/src/main/java/org/dive4elements/river/client/shared/model/Artifact.java
diffstat 26 files changed, 524 insertions(+), 688 deletions(-) [+]
line wrap: on
line diff
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/access/RangeAccess.java	Tue May 15 12:00:26 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/access/RangeAccess.java	Tue May 15 18:04:36 2018 +0200
@@ -8,25 +8,23 @@
 
 package org.dive4elements.river.artifacts.access;
 
-import gnu.trove.TDoubleArrayList;
-
+import org.apache.commons.lang.math.DoubleRange;
 import org.apache.log4j.Logger;
-
 import org.dive4elements.river.artifacts.D4EArtifact;
 import org.dive4elements.river.artifacts.WINFOArtifact;
-
+import org.dive4elements.river.utils.DoubleUtil;
 import org.dive4elements.river.utils.RiverUtils;
-import org.dive4elements.river.utils.DoubleUtil;
 
+import gnu.trove.TDoubleArrayList;
 
 /** For the moment, light-weight wrapper around RiverUtils. */
 // TODO employ 'Caching' like other Accesses, remove usage of RiverUtils.
-public class RangeAccess
-extends RiverAccess
-{
+public class RangeAccess extends RiverAccess {
     private static Logger log = Logger.getLogger(RangeAccess.class);
 
-    public static enum KM_MODE { RANGE, LOCATIONS, NONE };
+    public static enum KM_MODE {
+        RANGE, LOCATIONS, NONE
+    };
 
     /** The default step width between the start end end kilometer. */
     public static final double DEFAULT_KM_STEPS = 0.1;
@@ -44,32 +42,34 @@
     public RangeAccess() {
     }
 
-    public RangeAccess(D4EArtifact artifact) {
+    public RangeAccess(final D4EArtifact artifact) {
         super(artifact);
     }
 
-
     /** Evaluate the ld_mode data of artifact. */
     public KM_MODE getKmRangeMode() {
-        if (mode != null) {
-            return mode;
+        if (this.mode != null) {
+            return this.mode;
         }
-        String modeData = getString("ld_mode");
+        final String modeData = getString("ld_mode");
 
         if (modeData == null || modeData.length() == 0) {
-            mode = KM_MODE.NONE;
-        }
-        else if (modeData.equals("distance"))  {
-            mode = KM_MODE.RANGE;
-        }
-        else if (modeData.equals("locations")) {
-            mode = KM_MODE.LOCATIONS;
-        }
-        else {
-            mode = KM_MODE.NONE;
+            this.mode = KM_MODE.NONE;
+        } else if (modeData.equals("distance")) {
+            this.mode = KM_MODE.RANGE;
+        } else if (modeData.equals("locations")) {
+            this.mode = KM_MODE.LOCATIONS;
+        } else {
+            this.mode = KM_MODE.NONE;
         }
 
-        return mode;
+        return this.mode;
+    }
+
+    public final DoubleRange getRange() {
+        final double from = getFrom();
+        final double to = getTo();
+        return new DoubleRange(from, to);
     }
 
     /** Check if the calculation mode is Range. */
@@ -82,39 +82,28 @@
      * (from ld_locations data), null if not parameterized this way.
      */
     public double[] getLocations() {
-        String locationStr = getString("ld_locations");
+        final String locationStr = getString("ld_locations");
 
         if (locationStr == null || locationStr.length() == 0) {
             if (getArtifact() instanceof WINFOArtifact) {
-                WINFOArtifact winfo = (WINFOArtifact) getArtifact();
-                if (winfo.getReferenceStartKm() != null
-                    && winfo.getReferenceEndKms() != null
-                ) {
-                    return new double[]
-                        {
-                            winfo.getReferenceStartKm().doubleValue(),
-                            winfo.getReferenceEndKms()[0]
-                        };
-                }
-                else if (winfo.getReferenceStartKm() != null) {
-                    return new double[]
-                        {
-                            winfo.getReferenceStartKm().doubleValue(),
-                            winfo.getReferenceStartKm().doubleValue()
-                        };
+                final WINFOArtifact winfo = (WINFOArtifact) getArtifact();
+                if (winfo.getReferenceStartKm() != null && winfo.getReferenceEndKms() != null) {
+                    return new double[] { winfo.getReferenceStartKm().doubleValue(), winfo.getReferenceEndKms()[0] };
+                } else if (winfo.getReferenceStartKm() != null) {
+                    return new double[] { winfo.getReferenceStartKm().doubleValue(), winfo.getReferenceStartKm().doubleValue() };
                 }
             }
             return null;
         }
 
-        String[] tmp               = locationStr.split(" ");
-        TDoubleArrayList locations = new TDoubleArrayList();
+        final String[] tmp = locationStr.split(" ");
+        final TDoubleArrayList locations = new TDoubleArrayList();
 
-        for (String l: tmp) {
+        for (final String l : tmp) {
             try {
                 locations.add(Double.parseDouble(l));
             }
-            catch (NumberFormatException nfe) {
+            catch (final NumberFormatException nfe) {
                 log.debug(nfe.getLocalizedMessage(), nfe);
             }
         }
@@ -125,87 +114,89 @@
     }
 
     public boolean hasFrom() {
-        return from != null || (from = getDouble("ld_from")) != null;
+        return this.from != null || (this.from = getDouble("ld_from")) != null;
     }
 
     public boolean hasTo() {
-        return to != null || (to = getDouble("ld_to")) != null;
+        return this.to != null || (this.to = getDouble("ld_to")) != null;
     }
 
-    /* If left_to_right is set to true this returns
-     * the smaller value of from and to. */
-    public double getFrom(boolean left_to_right) {
+    /*
+     * If left_to_right is set to true this returns
+     * the smaller value of from and to.
+     */
+    public double getFrom(final boolean left_to_right) {
         if (!left_to_right) {
             return getFrom();
         }
-        double from = getFrom();
-        double to = getTo();
+        final double from = getFrom();
+        final double to = getTo();
         return from > to ? to : from;
     }
 
     /** Return ld_from data (in km). If not found, the min. */
     public double getFrom() {
-        if (from == null) {
-            from = getDouble("ld_from");
+        if (this.from == null) {
+            this.from = getDouble("ld_from");
         }
 
         if (log.isDebugEnabled()) {
-            log.debug("from from data: '" + from + "'");
+            log.debug("from from data: '" + this.from + "'");
         }
 
-        if (from == null) {
+        if (this.from == null) {
             log.warn("No 'from' found. Assume min of river.");
             return getRiver().determineMinMaxDistance()[0];
         }
 
-        return from.doubleValue();
+        return this.from.doubleValue();
     }
 
-    /* If left_to_right is set to true this returns
-     * the larger value of from and to. */
-    public double getTo(boolean left_to_right) {
+    /*
+     * If left_to_right is set to true this returns
+     * the larger value of from and to.
+     */
+    public double getTo(final boolean left_to_right) {
         if (!left_to_right) {
             return getTo();
         }
-        double from = getFrom();
-        double to = getTo();
+        final double from = getFrom();
+        final double to = getTo();
         return from > to ? from : to;
     }
 
     /** Return ld_to data (in km), if not found, the max. */
     public double getTo() {
-        if (to == null) {
-            to = getDouble("ld_to");
+        if (this.to == null) {
+            this.to = getDouble("ld_to");
         }
 
         if (log.isDebugEnabled()) {
-            log.debug("to from data: '" + to + "'");
+            log.debug("to from data: '" + this.to + "'");
         }
 
-        if (to == null) {
+        if (this.to == null) {
             log.warn("No 'to' found. Assume max of river.");
             return getRiver().determineMinMaxDistance()[1];
         }
 
-        return to.doubleValue();
+        return this.to.doubleValue();
     }
 
-
     /** Step width for calculation. */
     public Double getStep() {
 
-        if (step == null) {
-            step = getDouble("ld_step");
+        if (this.step == null) {
+            this.step = getDouble("ld_step");
         }
 
         if (log.isDebugEnabled()) {
-            log.debug("step: '" + step + "'");
+            log.debug("step: '" + this.step + "'");
         }
 
-        return step;
+        return this.step;
     }
 
-
     /**
      * Get min and max kilometer, independent of parametization
      * (ld_from/to vs ld_locations).
@@ -213,37 +204,35 @@
     public double[] getKmRange() {
         // TODO store kmRange in field.
         switch (getKmRangeMode()) {
-            case RANGE: {
+        case RANGE: {
+            return getKmFromTo();
+        }
+
+        case LOCATIONS: {
+            final double[] locs = getLocations();
+            // if no locations, nPE.
+            if (locs == null) {
+                log.warn("no locations to get km range from.");
+                return new double[] { Double.NaN, Double.NaN };
+            }
+            return new double[] { locs[0], locs[locs.length - 1] };
+        }
+
+        case NONE: {
+            final double[] locs = getLocations();
+            if (locs != null) {
+                return new double[] { locs[0], locs[locs.length - 1] };
+            } else {
                 return getKmFromTo();
             }
-
-            case LOCATIONS: {
-                double[] locs = getLocations();
-                // if no locations, nPE.
-                if (locs == null) {
-                    log.warn("no locations to get km range from.");
-                    return new double[] { Double.NaN, Double.NaN };
-                }
-                return new double[] { locs[0], locs[locs.length-1] };
-            }
-
-            case NONE: {
-                double[] locs = getLocations();
-                if (locs != null) {
-                    return new double[] { locs[0], locs[locs.length-1] };
-                }
-                else {
-                    return getKmFromTo();
-                }
-            }
+        }
         }
 
         return new double[] { Double.NaN, Double.NaN };
     }
 
-
     public double[] getKmFromTo() {
-         return RiverUtils.getKmFromTo(this.getArtifact());
+        return RiverUtils.getKmFromTo(this.getArtifact());
     }
 
     /**
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/common/AccessHelper.java	Tue May 15 12:00:26 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,108 +0,0 @@
-/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
- * Software engineering by
- *  Björnsen Beratende Ingenieure GmbH
- *  Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
- *
- * 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.artifacts.common;
-
-import org.apache.log4j.Logger;
-import org.dive4elements.artifacts.Artifact;
-import org.dive4elements.river.artifacts.D4EArtifact;
-import org.dive4elements.river.artifacts.access.Access;
-
-import gnu.trove.TIntArrayList;
-
-/**
- * @author Domenico Nardi Tironi
- *
- */
-public class AccessHelper extends Access {
-
-    private static Logger log = Logger.getLogger(AccessHelper.class);
-
-    // private final Artifact artifact;
-
-    public AccessHelper(final Artifact artifact) {
-        this.artifact = (D4EArtifact) artifact;
-    }
-
-    public String getYearEpoch() {
-
-        return getString("ye_select"); // ACHTUNG, Ergebniswerte wurden geändert in state.sinfo.epoch und state.sinfo.year
-
-    }
-
-    /** [year1, years2,..] if its about years. */
-    public int[] getYears(final String yearSelectedValue, final String yearKey) {
-        int[] years = null;
-        // if (years != null) {
-        // return years;
-        // }
-        if (getYearEpoch().equals(yearSelectedValue)) {
-            final TIntArrayList ints = new TIntArrayList();
-            final String yearsData = getString(yearKey);
-            if (yearsData == null || yearsData.isEmpty()) {
-                log.warn("No years provided");
-                return null;
-            }
-            for (final String sValue : yearsData.split(" ")) {
-                try {
-                    ints.add(Integer.parseInt(sValue));
-                }
-                catch (final NumberFormatException e) {
-                    /* Client should prevent this */
-                    log.warn("Invalid year value: " + sValue);
-                    continue;
-                }
-            }
-
-            if (!ints.isEmpty()) {
-                ints.sort();
-                years = ints.toNativeArray();
-            }
-            return years;
-        }
-        return null;
-    }
-
-    public int[][] getEpochs(final String epochSelectedValue, final String epochKey) {
-        int epochs[][] = null;
-        // if (epochs != null) {
-        // return epochs;
-        // }
-
-        if (!getYearEpoch().equals(epochSelectedValue)) {
-            return null;
-        }
-
-        final String data = getString(epochKey);
-
-        if (data == null) {
-            log.warn("No 'epochs' parameter specified!");
-            return null;
-        }
-
-        final String[] parts = data.split(";");
-
-        epochs = new int[parts.length][];
-
-        for (int i = 0; i < parts.length; i++) {
-            final String[] values = parts[i].split(",");
-            final TIntArrayList ints = new TIntArrayList();
-            try {
-                ints.add(Integer.parseInt(values[0]));
-                ints.add(Integer.parseInt(values[1]));
-                epochs[i] = ints.toNativeArray();
-            }
-            catch (final NumberFormatException nfe) {
-                log.warn("Cannot parse int from string: '" + values + "'");
-            }
-        }
-        return epochs;
-    }
-
-}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/common/EpochYearAccessHelper.java	Tue May 15 18:04:36 2018 +0200
@@ -0,0 +1,106 @@
+/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
+ * Software engineering by
+ *  Björnsen Beratende Ingenieure GmbH
+ *  Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
+ *
+ * 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.artifacts.common;
+
+import org.apache.log4j.Logger;
+import org.dive4elements.artifacts.Artifact;
+import org.dive4elements.river.artifacts.D4EArtifact;
+import org.dive4elements.river.artifacts.access.Access;
+
+import gnu.trove.TIntArrayList;
+
+/**
+ * @author Domenico Nardi Tironi
+ *
+ */
+// TODO: rename?
+public class EpochYearAccessHelper extends Access {
+
+    private static Logger log = Logger.getLogger(EpochYearAccessHelper.class);
+
+    // private final Artifact artifact;
+
+    public EpochYearAccessHelper(final Artifact artifact) {
+        this.artifact = (D4EArtifact) artifact;
+    }
+
+    public String getYearEpoch() {
+        return getString("ye_select"); // ACHTUNG, Ergebniswerte wurden geändert in state.sinfo.epoch und state.sinfo.year
+    }
+
+    /** [year1, years2,..] if its about years. */
+    public int[] getYears(final String yearSelectedValue, final String yearKey) {
+        int[] years = null;
+        // if (years != null) {
+        // return years;
+        // }
+        if (getYearEpoch().equals(yearSelectedValue)) {
+            final TIntArrayList ints = new TIntArrayList();
+            final String yearsData = getString(yearKey);
+            if (yearsData == null || yearsData.isEmpty()) {
+                log.warn("No years provided");
+                return null;
+            }
+            for (final String sValue : yearsData.split(" ")) {
+                try {
+                    ints.add(Integer.parseInt(sValue));
+                }
+                catch (final NumberFormatException e) {
+                    /* Client should prevent this */
+                    log.warn("Invalid year value: " + sValue);
+                    continue;
+                }
+            }
+
+            if (!ints.isEmpty()) {
+                ints.sort();
+                years = ints.toNativeArray();
+            }
+            return years;
+        }
+        return null;
+    }
+
+    public int[][] getEpochs(final String epochSelectedValue, final String epochKey) {
+        int epochs[][] = null;
+        // if (epochs != null) {
+        // return epochs;
+        // }
+
+        if (!getYearEpoch().equals(epochSelectedValue)) {
+            return null;
+        }
+
+        final String data = getString(epochKey);
+
+        if (data == null) {
+            log.warn("No 'epochs' parameter specified!");
+            return null;
+        }
+
+        final String[] parts = data.split(";");
+
+        epochs = new int[parts.length][];
+
+        for (int i = 0; i < parts.length; i++) {
+            final String[] values = parts[i].split(",");
+            final TIntArrayList ints = new TIntArrayList();
+            try {
+                ints.add(Integer.parseInt(values[0]));
+                ints.add(Integer.parseInt(values[1]));
+                epochs[i] = ints.toNativeArray();
+            }
+            catch (final NumberFormatException nfe) {
+                log.warn("Cannot parse int from string: '" + values + "'");
+            }
+        }
+        return epochs;
+    }
+}
\ No newline at end of file
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionAccess.java	Tue May 15 12:00:26 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/collision/CollisionAccess.java	Tue May 15 18:04:36 2018 +0200
@@ -10,9 +10,8 @@
 
 package org.dive4elements.river.artifacts.sinfo.collision;
 
-import org.apache.commons.lang.math.DoubleRange;
 import org.dive4elements.river.artifacts.access.RangeAccess;
-import org.dive4elements.river.artifacts.common.AccessHelper;
+import org.dive4elements.river.artifacts.common.EpochYearAccessHelper;
 import org.dive4elements.river.artifacts.sinfo.SINFOArtifact;
 import org.dive4elements.river.artifacts.sinfo.SinfoCalcMode;
 
@@ -26,7 +25,7 @@
  */
 final class CollisionAccess extends RangeAccess {
 
-    private final AccessHelper helper;
+    private final EpochYearAccessHelper helper;
 
     /// Fields from state:
 
@@ -41,16 +40,10 @@
 
         /* assert calculation mode */
         final SinfoCalcMode calculationMode = artifact.getCalculationMode();
-        this.helper = new AccessHelper(artifact);
+        this.helper = new EpochYearAccessHelper(artifact);
         assert (calculationMode == SinfoCalcMode.sinfo_calc_flow_depth);
     }
 
-    public DoubleRange getRange() {
-        final double from = getFrom();
-        final double to = getTo();
-        return new DoubleRange(from, to);
-    }
-
     public int[] getYears() {
         return this.helper.getYears("state.sinfo.year", "years");
     }
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationAccess.java	Tue May 15 12:00:26 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationAccess.java	Tue May 15 18:04:36 2018 +0200
@@ -10,10 +10,9 @@
 
 package org.dive4elements.river.artifacts.sinfo.flood_duration;
 
-import org.apache.commons.lang.math.DoubleRange;
 import org.apache.log4j.Logger;
 import org.dive4elements.river.artifacts.access.RangeAccess;
-import org.dive4elements.river.artifacts.common.AccessHelper;
+import org.dive4elements.river.artifacts.common.EpochYearAccessHelper;
 import org.dive4elements.river.artifacts.sinfo.SINFOArtifact;
 import org.dive4elements.river.artifacts.sinfo.SinfoCalcMode;
 
@@ -31,11 +30,7 @@
 
     private static Logger log = Logger.getLogger(FloodDurationAccess.class);
 
-    private static final String FIELD_DIFFIDS = "diffids"; //$NON-NLS-1$
-
-    private static final String FIELD_USE_TKH = "use_transport_bodies"; //$NON-NLS-1$
-
-    private final AccessHelper helper;
+    private final EpochYearAccessHelper helper;
 
     /// Fields from state:
 
@@ -56,16 +51,10 @@
 
         /* assert calculation mode */
         final SinfoCalcMode calculationMode = artifact.getCalculationMode();
-        this.helper = new AccessHelper(artifact);
+        this.helper = new EpochYearAccessHelper(artifact);
         assert (calculationMode == SinfoCalcMode.sinfo_calc_flood_duration);
     }
 
-    public DoubleRange getRange() {
-        final double from = getFrom();
-        final double to = getTo();
-        return new DoubleRange(from, to);
-    }
-
     @Override
     public Double getStep() {
         return super.getStep();
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculation.java	Tue May 15 12:00:26 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flood_duration/FloodDurationCalculation.java	Tue May 15 18:04:36 2018 +0200
@@ -49,6 +49,9 @@
         final String calcModeLabel = Resources.getMsg(this.context.getMeta(), sinfo.getCalculationMode().name());
 
         final String riverside = access.getRiverside();
+
+        // TODO: mis- ups.. re-use WINFO Artifact as in TkhState
+
         final double step = access.getStep();
         final boolean wspl = access.getWspl();
         final Boolean wqisfree = access.getWqIsFree();
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthAccess.java	Tue May 15 12:00:26 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepth/FlowDepthAccess.java	Tue May 15 18:04:36 2018 +0200
@@ -13,7 +13,6 @@
 import java.util.Collection;
 import java.util.Collections;
 
-import org.apache.commons.lang.math.DoubleRange;
 import org.dive4elements.river.artifacts.access.RangeAccess;
 import org.dive4elements.river.artifacts.sinfo.SINFOArtifact;
 import org.dive4elements.river.artifacts.sinfo.SinfoCalcMode;
@@ -40,12 +39,6 @@
         assert (calculationMode == SinfoCalcMode.sinfo_calc_flow_depth);
     }
 
-    public DoubleRange getRange() {
-        final double from = getFrom();
-        final double to = getTo();
-        return new DoubleRange(from, to);
-    }
-
     public boolean isUseTransportBodies() {
         final Boolean useTkh = this.artifact.getDataAsBoolean(FIELD_USE_TKH);
         return useTkh == null ? false : useTkh;
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthdev/FlowDepthDevelopmentAccess.java	Tue May 15 12:00:26 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthdev/FlowDepthDevelopmentAccess.java	Tue May 15 18:04:36 2018 +0200
@@ -12,7 +12,6 @@
 
 import java.util.List;
 
-import org.apache.commons.lang.math.DoubleRange;
 import org.dive4elements.river.artifacts.access.RangeAccess;
 import org.dive4elements.river.artifacts.sinfo.SINFOArtifact;
 import org.dive4elements.river.artifacts.sinfo.SinfoCalcMode;
@@ -39,12 +38,6 @@
         assert (calculationMode == SinfoCalcMode.sinfo_calc_flow_depth_minmax);
     }
 
-    public DoubleRange getRange() {
-        final double from = getFrom();
-        final double to = getTo();
-        return new DoubleRange(from, to);
-    }
-
     public WstSoundingIdPair getCurrentPair() {
         return getPair(FIELD_DIFFID_CURRENT);
     }
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthminmax/FlowDepthMinMaxAccess.java	Tue May 15 12:00:26 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/flowdepthminmax/FlowDepthMinMaxAccess.java	Tue May 15 18:04:36 2018 +0200
@@ -12,7 +12,6 @@
 
 import java.util.Collection;
 
-import org.apache.commons.lang.math.DoubleRange;
 import org.dive4elements.river.artifacts.access.RangeAccess;
 import org.dive4elements.river.artifacts.sinfo.SINFOArtifact;
 import org.dive4elements.river.artifacts.sinfo.SinfoCalcMode;
@@ -38,12 +37,6 @@
         assert (calculationMode == SinfoCalcMode.sinfo_calc_flow_depth_minmax);
     }
 
-    public DoubleRange getRange() {
-        final double from = getFrom();
-        final double to = getTo();
-        return new DoubleRange(from, to);
-    }
-
     public Collection<WstSoundingIdPair> getMinMaxPairs() {
         final String diffids = getString(FIELD_DIFFIDS);
         return WstSoundingIdPair.parsePairs(diffids);
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/predefineddepthevol/PredefinedDepthEvolAccess.java	Tue May 15 12:00:26 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/predefineddepthevol/PredefinedDepthEvolAccess.java	Tue May 15 18:04:36 2018 +0200
@@ -10,7 +10,6 @@
 
 package org.dive4elements.river.artifacts.sinfo.predefineddepthevol;
 
-import org.apache.commons.lang.math.DoubleRange;
 import org.dive4elements.river.artifacts.D4EArtifact;
 import org.dive4elements.river.artifacts.access.RangeAccess;
 
@@ -27,22 +26,14 @@
 
     private String name;
 
-
     /***** CONSTRUCTORS *****/
 
     public PredefinedDepthEvolAccess(final D4EArtifact artifact) {
         super(artifact);
     }
 
-
     /***** METHDOS *****/
 
-    public DoubleRange getRange() {
-        final double from = getFrom();
-        final double to = getTo();
-        return new DoubleRange(from, to);
-    }
-
     public Integer getId() {
         if (this.id == null) {
             this.id = getInteger("depthevol_id");
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/predefinedflowdepth/PredefinedFlowDepthColumnAccess.java	Tue May 15 12:00:26 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/predefinedflowdepth/PredefinedFlowDepthColumnAccess.java	Tue May 15 18:04:36 2018 +0200
@@ -10,7 +10,6 @@
 
 package org.dive4elements.river.artifacts.sinfo.predefinedflowdepth;
 
-import org.apache.commons.lang.math.DoubleRange;
 import org.dive4elements.river.artifacts.D4EArtifact;
 import org.dive4elements.river.artifacts.access.RangeAccess;
 
@@ -29,22 +28,14 @@
 
     private String name;
 
-
     /***** CONSTRUCTORS *****/
 
     public PredefinedFlowDepthColumnAccess(final D4EArtifact artifact) {
         super(artifact);
     }
 
-
     /***** METHDOS *****/
 
-    public DoubleRange getRange() {
-        final double from = getFrom();
-        final double to = getTo();
-        return new DoubleRange(from, to);
-    }
-
     public Integer getSeriesId() {
         if (this.seriesId == null) {
             this.seriesId = getInteger("flowdepth_id");
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/predefinedtkh/PredefinedTkhColumnAccess.java	Tue May 15 12:00:26 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/predefinedtkh/PredefinedTkhColumnAccess.java	Tue May 15 18:04:36 2018 +0200
@@ -10,7 +10,6 @@
 
 package org.dive4elements.river.artifacts.sinfo.predefinedtkh;
 
-import org.apache.commons.lang.math.DoubleRange;
 import org.dive4elements.river.artifacts.D4EArtifact;
 import org.dive4elements.river.artifacts.access.RangeAccess;
 
@@ -29,22 +28,14 @@
 
     private String name;
 
-
     /***** CONSTRUCTORS *****/
 
     public PredefinedTkhColumnAccess(final D4EArtifact artifact) {
         super(artifact);
     }
 
-
     /***** METHDOS *****/
 
-    public DoubleRange getRange() {
-        final double from = getFrom();
-        final double to = getTo();
-        return new DoubleRange(from, to);
-    }
-
     public Integer getTkhId() {
         if (this.tkhId == null) {
             this.tkhId = getInteger("tkh_id");
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/TkhAccess.java	Tue May 15 12:00:26 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/sinfo/tkhstate/TkhAccess.java	Tue May 15 18:04:36 2018 +0200
@@ -10,7 +10,6 @@
 
 package org.dive4elements.river.artifacts.sinfo.tkhstate;
 
-import org.apache.commons.lang.math.DoubleRange;
 import org.dive4elements.river.artifacts.access.RangeAccess;
 import org.dive4elements.river.artifacts.sinfo.SINFOArtifact;
 import org.dive4elements.river.artifacts.sinfo.SinfoCalcMode;
@@ -32,9 +31,4 @@
         assert (calculationMode == SinfoCalcMode.sinfo_calc_transport_bodies_heights);
     }
 
-    public DoubleRange getRange() {
-        final double from = getFrom();
-        final double to = getTo();
-        return new DoubleRange(from, to);
-    }
 }
\ No newline at end of file
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/states/DistanceOnlyPartSelect.java	Tue May 15 12:00:26 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/states/DistanceOnlyPartSelect.java	Tue May 15 18:04:36 2018 +0200
@@ -18,4 +18,5 @@
     protected String getUIProvider() {
         return "distance_only_part_panel";
     }
+
 }
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationAccess.java	Tue May 15 12:00:26 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationAccess.java	Tue May 15 18:04:36 2018 +0200
@@ -10,11 +10,8 @@
 
 package org.dive4elements.river.artifacts.uinfo.inundationduration;
 
-import java.util.ArrayList;
-
-import org.apache.commons.lang.math.DoubleRange;
 import org.dive4elements.river.artifacts.access.RangeAccess;
-import org.dive4elements.river.artifacts.common.AccessHelper;
+import org.dive4elements.river.artifacts.common.EpochYearAccessHelper;
 import org.dive4elements.river.artifacts.uinfo.UINFOArtifact;
 import org.dive4elements.river.artifacts.uinfo.UinfoCalcMode;
 
@@ -31,7 +28,8 @@
     // IMMER ABGLEICHEN MIT SuperVegZonesTablePanel.TABLE_CELL_SEPARATOR
     public static final String TABLE_CELL_SEPARATOR = "TABLE_CELL_SEPARATOR";
     public static final String TABLE_ROW_SEPARATOR = "TABLE_ROW_SEPARATOR";
-    private final AccessHelper helper;
+
+    private final EpochYearAccessHelper helper;
 
     // Fields from state:
     //
@@ -47,19 +45,12 @@
 
     public InundationDurationAccess(final UINFOArtifact uinfo) {
         super(uinfo);
-
         /* assert calculation mode */
         final UinfoCalcMode calculationMode = uinfo.getCalculationMode();
-        this.helper = new AccessHelper(uinfo);
+        this.helper = new EpochYearAccessHelper(uinfo);
         assert (calculationMode == UinfoCalcMode.uinfo_inundation_duration);
     }
 
-    public DoubleRange getRange() {
-        final double from = getFrom();
-        final double to = getTo();
-        return new DoubleRange(from, to);
-    }
-
     public Double getSedimentHeight() {
         if (super.getBoolean("use_scenario")) {
             return super.getDouble("sedimentheight"); // TODO: INPUT Valdiation (nicht hier, sondern im Panel. Erinnerung)
@@ -83,20 +74,9 @@
         return null;
     }
 
-    public ArrayList<String[]> getVegZones() {
-        // TODO: MIT VegetationzonesAccess zusammenlegen
-        final ArrayList<String[]> results = new ArrayList<>();
-        final String zonesRaw = super.getString("vegzones");
-        if (zonesRaw.contains(TABLE_ROW_SEPARATOR)) {
-            final String[] rows = zonesRaw.split(TABLE_ROW_SEPARATOR);
-            for (final String row : rows) {
-                if (row.contains(TABLE_CELL_SEPARATOR)) {
-                    final String[] result = row.split(TABLE_CELL_SEPARATOR);
-                    results.add(result);
-                }
-            }
-        }
-        return results;
+    public String getVegZones() {
+        // MIT VegetationzonesAccess zusammenlegen (eine Zeile sparen...)
+        return super.getString("vegzones");
     }
 
 }
\ No newline at end of file
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationCalculation.java	Tue May 15 12:00:26 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/inundationduration/InundationDurationCalculation.java	Tue May 15 18:04:36 2018 +0200
@@ -11,6 +11,7 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
 
 import org.apache.commons.lang.math.DoubleRange;
 import org.dive4elements.artifacts.CallContext;
@@ -23,6 +24,7 @@
 import org.dive4elements.river.artifacts.sinfo.util.CalculationUtils;
 import org.dive4elements.river.artifacts.sinfo.util.RiverInfo;
 import org.dive4elements.river.artifacts.uinfo.UINFOArtifact;
+import org.dive4elements.river.artifacts.uinfo.vegetationzones.VegetationZoneAccessHelper;
 import org.dive4elements.river.model.River;
 
 /**
@@ -44,15 +46,17 @@
         final String user = CalculationUtils.findArtifactUser(this.context, uinfo);
 
         final RiverAccess access = new RiverAccess(uinfo);
-        final River river = access.getRiver();
-        final DoubleRange calcRange = null;
-        final RiverInfo riverInfo = new RiverInfo(river);
 
         final InundationDurationAccess indurax = new InundationDurationAccess(uinfo);
+        final River river = indurax.getRiver();
+        final RiverInfo riverInfo = new RiverInfo(river);
+        final DoubleRange calcRange = indurax.getRange();
         final int[] totalEpoch = indurax.getTotalEpoch();
         final Integer year = indurax.getYear(); // null bei year -> Integer.. evtl ungünstig.. evtl. anders lösen
         final DoubleRange range = indurax.getRange();
         final Double sedimentHeight = indurax.getSedimentHeight();
+        final String zonesRaw = indurax.getVegZones();
+        final List<VegetationZoneAccessHelper> zones = VegetationZoneAccessHelper.parse(zonesRaw);
 
         final InundationDurationCalculationResults results = new InundationDurationCalculationResults(calcModeLabel, user, riverInfo, calcRange);
 
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineAccess.java	Tue May 15 12:00:26 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineAccess.java	Tue May 15 18:04:36 2018 +0200
@@ -10,7 +10,6 @@
 
 package org.dive4elements.river.artifacts.uinfo.salix;
 
-import org.apache.commons.lang.math.DoubleRange;
 import org.dive4elements.river.artifacts.access.RangeAccess;
 import org.dive4elements.river.artifacts.uinfo.UINFOArtifact;
 import org.dive4elements.river.artifacts.uinfo.UinfoCalcMode;
@@ -41,12 +40,6 @@
         assert (calculationMode == UinfoCalcMode.uinfo_salix_line);
     }
 
-    public DoubleRange getRange() {
-        final double from = getFrom();
-        final double to = getTo();
-        return new DoubleRange(from, to);
-    }
-
     public boolean getUseScenario() {
         return super.getBoolean("use_scenario");
     }
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculation.java	Tue May 15 12:00:26 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/salix/SalixLineCalculation.java	Tue May 15 18:04:36 2018 +0200
@@ -14,7 +14,6 @@
 
 import org.apache.commons.lang.math.DoubleRange;
 import org.dive4elements.artifacts.CallContext;
-import org.dive4elements.river.artifacts.access.RiverAccess;
 import org.dive4elements.river.artifacts.common.GeneralResultType;
 import org.dive4elements.river.artifacts.common.ResultRow;
 import org.dive4elements.river.artifacts.model.Calculation;
@@ -44,12 +43,11 @@
         final String calcModeLabel = Resources.getMsg(this.context.getMeta(), uinfo.getCalculationMode().name());
         final String user = CalculationUtils.findArtifactUser(this.context, uinfo);
 
-        final RiverAccess access = new RiverAccess(uinfo);
-        final River river = access.getRiver();
-        final DoubleRange calcRange = null;
+        final SalixLineAccess accessSalix = new SalixLineAccess(uinfo);
+
+        final River river = accessSalix.getRiver();
         final RiverInfo riverInfo = new RiverInfo(river);
 
-        final SalixLineAccess accessSalix = new SalixLineAccess(uinfo);
         final DoubleRange range = accessSalix.getRange();
         final boolean useScenario = accessSalix.getUseScenario();
         final String selectedScenario = accessSalix.getScenario();
@@ -61,7 +59,9 @@
         // ld_from_part; ld_to_part
         // scenario_selection (mögliche Werte:"scenarioType.option1" "scenarioType.option2" "scenarioType.option3"
 
-        final SalixLineCalculationResults results = new SalixLineCalculationResults(calcModeLabel, user, riverInfo, calcRange);
+        // FIXME: real calculation
+
+        final SalixLineCalculationResults results = new SalixLineCalculationResults(calcModeLabel, user, riverInfo, range);
 
         final Collection<ResultRow> rows = new ArrayList<>();
 
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesCalculation.java	Tue May 15 12:00:26 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesCalculation.java	Tue May 15 18:04:36 2018 +0200
@@ -11,6 +11,7 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
 
 import org.apache.commons.lang.math.DoubleRange;
 import org.dive4elements.artifacts.CallContext;
@@ -43,22 +44,23 @@
         final String calcModeLabel = Resources.getMsg(this.context.getMeta(), uinfo.getCalculationMode().name());
         final String user = CalculationUtils.findArtifactUser(this.context, uinfo);
 
+        // FIXME: remove, check other states as well
         final RiverAccess access = new RiverAccess(uinfo);
         final River river = access.getRiver();
         final DoubleRange calcRange = null;
         final RiverInfo riverInfo = new RiverInfo(river);
 
         final VegetationzonesAccess vAccess = new VegetationzonesAccess(uinfo);
-        final ArrayList<String[]> zones = vAccess.getVegZones();
-
+        final String zonesRaw = vAccess.getVegZones();
+        final List<VegetationZoneAccessHelper> helpers = VegetationZoneAccessHelper.parse(zonesRaw);
         final VegetationZonesCalculationResults results = new VegetationZonesCalculationResults(calcModeLabel, user, riverInfo, calcRange);
 
         final Collection<ResultRow> rows = new ArrayList<>();
-        for (final String[] zone : zones) {
+        for (final VegetationZoneAccessHelper zone : helpers) {
             final ResultRow row2 = ResultRow.create().//
-                    putValue(UInfoResultType.vegname, zone[0]).//
-                    putValue(UInfoResultType.vegdauervon, zone[1]).//
-                    putValue(UInfoResultType.vegdauerbis, zone[2]);
+                    putValue(UInfoResultType.vegname, zone.getZoneName()).//
+                    putValue(UInfoResultType.vegdauervon, zone.getMin_day_overflow()).//
+                    putValue(UInfoResultType.vegdauerbis, zone.getMax_day_overflow());
             rows.add(row2);
         }
 
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesState.java	Tue May 15 12:00:26 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationZonesState.java	Tue May 15 18:04:36 2018 +0200
@@ -49,7 +49,6 @@
             facets.add(new EmptyFacet());
             return null;
         }
-
         return compute((UINFOArtifact) artifact, context, hash, facets, old);
     }
 
--- a/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationzonesAccess.java	Tue May 15 12:00:26 2018 +0200
+++ b/artifacts/src/main/java/org/dive4elements/river/artifacts/uinfo/vegetationzones/VegetationzonesAccess.java	Tue May 15 18:04:36 2018 +0200
@@ -10,11 +10,8 @@
 
 package org.dive4elements.river.artifacts.uinfo.vegetationzones;
 
-import java.util.ArrayList;
-
-import org.apache.commons.lang.math.DoubleRange;
 import org.dive4elements.river.artifacts.access.RangeAccess;
-import org.dive4elements.river.artifacts.common.AccessHelper;
+import org.dive4elements.river.artifacts.common.EpochYearAccessHelper;
 import org.dive4elements.river.artifacts.uinfo.UINFOArtifact;
 import org.dive4elements.river.artifacts.uinfo.UinfoCalcMode;
 
@@ -28,10 +25,7 @@
  */
 final class VegetationzonesAccess extends RangeAccess {
 
-    // IMMER ABGLEICHEN MIT SuperVegZonesTablePanel.TABLE_CELL_SEPARATOR
-    public static final String TABLE_CELL_SEPARATOR = "TABLE_CELL_SEPARATOR";
-    public static final String TABLE_ROW_SEPARATOR = "TABLE_ROW_SEPARATOR";
-    private final AccessHelper helper;
+    private final EpochYearAccessHelper helper;
 
     // Fields from state:
     // calculation_mode (String)
@@ -43,29 +37,12 @@
 
         /* assert calculation mode */
         final UinfoCalcMode calculationMode = uinfo.getCalculationMode();
-        this.helper = new AccessHelper(uinfo);
+        this.helper = new EpochYearAccessHelper(uinfo);
         assert (calculationMode == UinfoCalcMode.uinfo_vegetation_zones);
     }
 
-    public DoubleRange getRange() {
-        final double from = getFrom();
-        final double to = getTo();
-        return new DoubleRange(from, to);
-    }
-
-    public ArrayList<String[]> getVegZones() {
-        final ArrayList<String[]> results = new ArrayList<>();
-        final String zonesRaw = super.getString("vegzones");
-        if (zonesRaw.contains(TABLE_ROW_SEPARATOR)) {
-            final String[] rows = zonesRaw.split(TABLE_ROW_SEPARATOR);
-            for (final String row : rows) {
-                if (row.contains(TABLE_CELL_SEPARATOR)) {
-                    final String[] result = row.split(TABLE_CELL_SEPARATOR);
-                    results.add(result);
-                }
-            }
-        }
-        return results;
+    public String getVegZones() {
+        return super.getString("vegzones");
     }
 
 }
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/uinfo/AbstractVegZonesTablePanel.java	Tue May 15 18:04:36 2018 +0200
@@ -0,0 +1,278 @@
+/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
+ * Software engineering by
+ *  Björnsen Beratende Ingenieure GmbH
+ *  Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
+ *
+ * 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.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 com.smartgwt.client.data.Record;
+import com.smartgwt.client.types.Alignment;
+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.grid.ListGrid;
+import com.smartgwt.client.widgets.grid.ListGridField;
+import com.smartgwt.client.widgets.grid.ListGridRecord;
+import com.smartgwt.client.widgets.layout.HLayout;
+import com.smartgwt.client.widgets.layout.VLayout;
+
+/**
+ * @author Domenico Nardi Tironi
+ *
+ */
+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;
+
+    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());
+
+    final protected VLayout root = new VLayout();
+    final protected HLayout input = new HLayout();
+    final protected VLayout tableLayout = new VLayout();
+
+    protected final void createTable(final DataList data, final int width) {
+        data.add(VegetationzonesTablePanel.getDummyData()); // TODO: GET REAL DATA!
+
+        final Label title = new Label(data.get(0).getDescription());
+        title.setHeight("35px"); // orig:25
+
+        this.elements.setWidth(width); // 185
+        this.elements.setHeight(300); //
+        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);
+
+        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));
+
+    }
+
+    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);
+
+        /* 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;
+    }
+
+    public abstract Canvas createWidget(final DataList data);
+
+    private final void addDataInit(final DataList data) {
+        for (final Data dataItemContainer : data.getAll()) {
+            if (dataItemContainer.getItems() != null) {
+                for (final DataItem dataItem : dataItemContainer.getItems()) {
+                    if (dataItem.getStringValue() != null && dataItem.getStringValue().contains(TABLE_ROW_SEPARATOR)) {
+
+                        final String[] rows = dataItem.getStringValue().split(TABLE_ROW_SEPARATOR);
+                        for (final String row : rows) {
+                            this.elements.addData(createEntry(row));
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    @Override
+    public final Canvas create(final DataList data) {
+        final VLayout layout = new VLayout();
+        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
+
+        // fetchSedimentLoadData(); //TODO: feed from database...
+
+        return layout;
+    }
+
+    @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(25);
+
+        final List<Data> items = dataList.getAll();
+        final Data str = getData(items, datakey);
+        final DataItem[] strItems = str.getItems();
+
+        final String[] entries = strItems[0].getLabel().split(VegetationzonesTablePanel.TABLE_ROW_SEPARATOR);
+        for (final String entry : entries) {
+            final String[] vals = entry.split(VegetationzonesTablePanel.TABLE_CELL_SEPARATOR);
+            final Label dateLabel = new Label(vals[0] + " (" + vals[1] + "-" + vals[2] + ")");
+            dateLabel.setHeight(20);
+            vLayout.addMember(dateLabel);
+        }
+        final Canvas back = getBackButton(dataList.getState());
+        layout.addMember(label);
+        layout.addMember(vLayout);
+        layout.addMember(back);
+
+        return layout;
+    }
+
+    protected static final Data[] getDummyData() {
+        final List<Data> data = new ArrayList<Data>();
+
+        // TODO: move to messages
+        final String d = "Zonaler Wald" + TABLE_CELL_SEPARATOR + "0" + TABLE_CELL_SEPARATOR + "5" + TABLE_ROW_SEPARATOR//
+                + "Hartholzaue, trocken" + TABLE_CELL_SEPARATOR + "5" + TABLE_CELL_SEPARATOR + "40" + TABLE_ROW_SEPARATOR//
+                + "Hartholzaue, feucht" + TABLE_CELL_SEPARATOR + "40" + TABLE_CELL_SEPARATOR + "80" + TABLE_ROW_SEPARATOR//
+                + "Silberweidenwald" + TABLE_CELL_SEPARATOR + "80" + TABLE_CELL_SEPARATOR + "140" + TABLE_ROW_SEPARATOR//
+                + "Weidengebüsch" + TABLE_CELL_SEPARATOR + "140" + TABLE_CELL_SEPARATOR + "200" + TABLE_ROW_SEPARATOR//
+                + "Uferröhricht" + TABLE_CELL_SEPARATOR + "200" + TABLE_CELL_SEPARATOR + "260" + TABLE_ROW_SEPARATOR//
+                + "Uferpioniere" + TABLE_CELL_SEPARATOR + "260" + TABLE_CELL_SEPARATOR + "320" + TABLE_ROW_SEPARATOR//
+                + "Vegetationslos" + TABLE_CELL_SEPARATOR + "320" + TABLE_CELL_SEPARATOR + "365" + TABLE_ROW_SEPARATOR//
+                + "Wasserfläche" + TABLE_CELL_SEPARATOR + "365" + TABLE_CELL_SEPARATOR + "365" + TABLE_ROW_SEPARATOR;//
+
+        final DataItem item = new DefaultDataItem(datakey, "entryDescription", d); // DATA-key
+        data.add(new DefaultData(datakey, null, null, new DataItem[] { item }));
+        return data.toArray(new Data[data.size()]);
+    }
+
+    @Override
+    protected final Data[] getData() {
+        final List<Data> data = new ArrayList<Data>();
+
+        final ListGridRecord[] lgr = this.elements.getRecords();
+        if (lgr.length == 0) {
+            return getDummyData();// new Data[0]; // return getDummyData();
+        }
+        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;
+        }
+
+        final DataItem item = new DefaultDataItem(datakey, null, d); // DATA-key
+        data.add(new DefaultData(datakey, null, null, new DataItem[] { item }));
+        return data.toArray(new Data[data.size()]);
+    }
+
+    public final ListGridRecord createEntry(final String row) {
+
+        if (row.contains(TABLE_CELL_SEPARATOR)) {
+
+            final String[] vals = row.split(TABLE_CELL_SEPARATOR);
+            if (vals.length == 3) {
+                final String vegzone = vals[0];
+                final String from = vals[1];
+                final String to = vals[2];
+
+                if (vegzone == null || from == null || to == null) {
+                    return null;
+                }
+
+                final ListGridRecord r = new ListGridRecord();
+                r.setAttribute("vegzone", vegzone);
+                r.setAttribute("from", from);
+                r.setAttribute("to", to);
+                return r;
+
+            }
+
+        }
+        return null;
+    }
+
+}
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/uinfo/SuperVegZonesTablePanel.java	Tue May 15 12:00:26 2018 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,244 +0,0 @@
-/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
- * Software engineering by
- *  Björnsen Beratende Ingenieure GmbH
- *  Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
- *
- * 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.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 com.smartgwt.client.data.Record;
-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.grid.ListGrid;
-import com.smartgwt.client.widgets.grid.ListGridRecord;
-import com.smartgwt.client.widgets.layout.HLayout;
-import com.smartgwt.client.widgets.layout.VLayout;
-
-/**
- * @author Domenico Nardi Tironi
- *
- */
-public abstract class SuperVegZonesTablePanel 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;
-
-    final protected VLayout root = new VLayout();
-    final protected HLayout input = new HLayout();
-    final protected VLayout tableLayout = new VLayout();
-
-    public SuperVegZonesTablePanel() {
-
-    }
-
-    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);
-
-        /* 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;
-    }
-
-    public abstract Canvas createWidget(final DataList data);
-
-    protected final void addDataInit(final DataList data) {
-        for (final Data dataItemContainer : data.getAll()) {
-            if (dataItemContainer.getItems() != null) {
-                for (final DataItem dataItem : dataItemContainer.getItems()) {
-                    if (dataItem.getStringValue() != null && dataItem.getStringValue().contains(TABLE_ROW_SEPARATOR)) {
-
-                        final String[] rows = dataItem.getStringValue().split(TABLE_ROW_SEPARATOR);
-                        for (final String row : rows) {
-                            this.elements.addData(createEntry(row));
-                        }
-                    }
-                }
-            }
-        }
-    }
-
-    @Override
-    public final Canvas create(final DataList data) {
-        final VLayout layout = new VLayout();
-        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
-
-        // fetchSedimentLoadData(); //TODO: feed from database...
-
-        return layout;
-    }
-
-    @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(25);
-
-        final List<Data> items = dataList.getAll();
-        final Data str = getData(items, datakey);
-        final DataItem[] strItems = str.getItems();
-
-        final String[] entries = strItems[0].getLabel().split(VegetationzonesTablePanel.TABLE_ROW_SEPARATOR);
-        for (final String entry : entries) {
-            final String[] vals = entry.split(VegetationzonesTablePanel.TABLE_CELL_SEPARATOR);
-            final Label dateLabel = new Label(vals[0] + " (" + vals[1] + "-" + vals[2] + ")");
-            dateLabel.setHeight(20);
-            vLayout.addMember(dateLabel);
-        }
-        final Canvas back = getBackButton(dataList.getState());
-        layout.addMember(label);
-        layout.addMember(vLayout);
-        layout.addMember(back);
-
-        return layout;
-    }
-
-    protected static final Data[] getDummyData() {
-        final List<Data> data = new ArrayList<Data>();
-        String d = "";
-        // TODO: move to messages
-        d = d + "Zonaler Wald" + TABLE_CELL_SEPARATOR + "0" + TABLE_CELL_SEPARATOR + "5" + TABLE_ROW_SEPARATOR;
-        d = d + "Hartholzaue, trocken" + TABLE_CELL_SEPARATOR + "5" + TABLE_CELL_SEPARATOR + "40" + TABLE_ROW_SEPARATOR;
-        d = d + "Hartholzaue, feucht" + TABLE_CELL_SEPARATOR + "40" + TABLE_CELL_SEPARATOR + "80" + TABLE_ROW_SEPARATOR;
-        d = d + "Silberweidenwald" + TABLE_CELL_SEPARATOR + "80" + TABLE_CELL_SEPARATOR + "140" + TABLE_ROW_SEPARATOR;
-        d = d + "Weidengebüsch" + TABLE_CELL_SEPARATOR + "140" + TABLE_CELL_SEPARATOR + "200" + TABLE_ROW_SEPARATOR;
-        d = d + "Uferröhricht" + TABLE_CELL_SEPARATOR + "200" + TABLE_CELL_SEPARATOR + "260" + TABLE_ROW_SEPARATOR;
-        d = d + "Uferpioniere" + TABLE_CELL_SEPARATOR + "260" + TABLE_CELL_SEPARATOR + "320" + TABLE_ROW_SEPARATOR;
-        d = d + "Vegetationslos" + TABLE_CELL_SEPARATOR + "320" + TABLE_CELL_SEPARATOR + "365" + TABLE_ROW_SEPARATOR;
-        d = d + "Wasserfläche" + TABLE_CELL_SEPARATOR + "365" + TABLE_CELL_SEPARATOR + "365" + TABLE_ROW_SEPARATOR;
-
-        final DataItem item = new DefaultDataItem(datakey, "entryDescription", d); // DATA-key
-        data.add(new DefaultData(datakey, null, null, new DataItem[] { item }));
-        return data.toArray(new Data[data.size()]);
-    }
-
-    @Override
-    protected final Data[] getData() {
-        final List<Data> data = new ArrayList<Data>();
-
-        final ListGridRecord[] lgr = this.elements.getRecords();
-        if (lgr.length == 0) {
-            return getDummyData();// new Data[0]; // return getDummyData();
-        }
-        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;
-        }
-
-        final DataItem item = new DefaultDataItem(datakey, null, d); // DATA-key
-        data.add(new DefaultData(datakey, null, null, new DataItem[] { item }));
-        return data.toArray(new Data[data.size()]);
-    }
-
-    public final ListGridRecord createEntry(final String row) {
-
-        if (row.contains(TABLE_CELL_SEPARATOR)) {
-
-            final String[] vals = row.split(TABLE_CELL_SEPARATOR);
-            if (vals.length == 3) {
-                final String vegzone = vals[0];
-                final String from = vals[1];
-                final String to = vals[2];
-
-                if (vegzone == null || from == null || to == null) {
-                    return null;
-                }
-
-                final ListGridRecord r = new ListGridRecord();
-                r.setAttribute("vegzone", vegzone);
-                r.setAttribute("from", from);
-                r.setAttribute("to", to);
-                return r;
-
-            }
-
-        }
-        return null;
-    }
-
-}
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/uinfo/VegetationzonesTableEditPanel.java	Tue May 15 12:00:26 2018 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/uinfo/VegetationzonesTableEditPanel.java	Tue May 15 18:04:36 2018 +0200
@@ -15,7 +15,6 @@
 import com.smartgwt.client.types.ListGridFieldType;
 import com.smartgwt.client.widgets.Button;
 import com.smartgwt.client.widgets.Canvas;
-import com.smartgwt.client.widgets.Label;
 import com.smartgwt.client.widgets.events.ClickEvent;
 import com.smartgwt.client.widgets.events.ClickHandler;
 import com.smartgwt.client.widgets.form.DynamicForm;
@@ -27,26 +26,20 @@
 import com.smartgwt.client.widgets.grid.events.RecordClickHandler;
 import com.smartgwt.client.widgets.layout.HLayout;
 
-public class VegetationzonesTableEditPanel extends SuperVegZonesTablePanel {
+public class VegetationzonesTableEditPanel extends AbstractVegZonesTablePanel {
     private static final long serialVersionUID = 1L;
 
     @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());
         final HLayout fields = new HLayout();
         final HLayout fields2 = new HLayout();
 
         final Button add = new Button(this.MSG.add_date()); // TODO: make key more generic or change to more specific
 
-        data.add(VegetationzonesTablePanel.getDummyData());
-
-        final Label title = new Label(data.get(0).getDescription());
-        title.setHeight("35px"); // orig:25
-
-        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());
-
         final DynamicForm form1 = new DynamicForm();
         final DynamicForm form2 = new DynamicForm();
         form2.setNumCols(5);
@@ -81,23 +74,6 @@
             }
         });
 
-        final Label sel = new Label(this.MSG.select());
-        sel.setHeight(25);
-        this.elements.setWidth(450); // 185
-        this.elements.setHeight(300); // 120
-        this.elements.setShowHeaderContextMenu(false);
-        this.elements.setCanReorderFields(false);
-        this.elements.setCanSort(false);
-        this.elements.setCanEdit(false);
-        final ListGridField vegzone = new ListGridField("vegzone", this.MSG.uinfo_vegetation_zones_label());
-        final ListGridField from = new ListGridField("from", this.MSG.uinfo_vegetation_zones_from());
-        final ListGridField to = new ListGridField("to", this.MSG.uinfo_vegetation_zones_to());
-        vegzone.setWidth(285);
-        from.setWidth(70);
-        to.setWidth(70);
-
-        addDataInit(data);
-
         final ListGridField removeField = new ListGridField("_removeRecord", "Remove Record") {
             {
                 setType(ListGridFieldType.ICON);
@@ -122,16 +98,11 @@
             }
         });
 
-        this.elements.setFields(vegzone, from, to, removeField);
+        this.elements.setFields(super.vegzoneField, super.fromField, super.toField, removeField);
 
         fields.addMember(form1);
         fields2.addMember(form2);
 
-        this.tableLayout.addMember(this.elements);
-        this.root.addMember(title);
-        this.root.addMember(this.input);
-        this.root.addMember(this.tableLayout);
-        this.root.addMember(PanelHelper.getSpacer(10));
         this.root.addMember(fields);
         this.root.addMember(fields2);
         this.root.addMember(PanelHelper.getSpacer(10));
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/uinfo/VegetationzonesTablePanel.java	Tue May 15 12:00:26 2018 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/uinfo/VegetationzonesTablePanel.java	Tue May 15 18:04:36 2018 +0200
@@ -8,57 +8,19 @@
 
 package org.dive4elements.river.client.client.ui.uinfo;
 
-import org.dive4elements.river.client.client.ui.PanelHelper;
 import org.dive4elements.river.client.shared.model.DataList;
 
 import com.smartgwt.client.widgets.Canvas;
-import com.smartgwt.client.widgets.Label;
-import com.smartgwt.client.widgets.form.validator.IsIntegerValidator;
-import com.smartgwt.client.widgets.form.validator.IsStringValidator;
-import com.smartgwt.client.widgets.grid.ListGridField;
 
-public class VegetationzonesTablePanel extends SuperVegZonesTablePanel {
+public class VegetationzonesTablePanel extends AbstractVegZonesTablePanel {
 
     private static final long serialVersionUID = 1L;
 
     @Override
     public Canvas createWidget(final DataList data) {
 
-        data.add(VegetationzonesTablePanel.getDummyData()); // TODO: GET REAL DATA!
-
-        final Label title = new Label(data.get(0).getDescription());
-        title.setHeight("35px"); // orig:25
-
-        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());
-
-        final Label sel = new Label(this.MSG.select());
-        sel.setHeight(25);
-        this.elements.setWidth(420); // 185
-        this.elements.setHeight(300); //
-        this.elements.setShowHeaderContextMenu(false);
-        this.elements.setCanReorderFields(false);
-        this.elements.setCanSort(false);
-        this.elements.setCanEdit(false);
-        final ListGridField vegzone = new ListGridField("vegzone", this.MSG.uinfo_vegetation_zones_label());
-        final ListGridField from = new ListGridField("from", this.MSG.uinfo_vegetation_zones_from());
-        final ListGridField to = new ListGridField("to", this.MSG.uinfo_vegetation_zones_to());
-        vegzone.setWidth(265);
-        from.setWidth(70);
-        to.setWidth(70);
-
-        addDataInit(data);
-
-        this.elements.setFields(vegzone, from, to);
-
-        this.tableLayout.addMember(this.elements);
-        this.root.addMember(title);
-        this.root.addMember(this.input);
-        this.root.addMember(this.tableLayout);
-        this.root.addMember(PanelHelper.getSpacer(10));
-
+        createTable(data, 420);
+        this.elements.setFields(this.vegzoneField, this.fromField, this.toField);
         return this.root;
     }
-
 }
--- a/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/Artifact.java	Tue May 15 12:00:26 2018 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/shared/model/Artifact.java	Tue May 15 18:04:36 2018 +0200
@@ -11,7 +11,6 @@
 import java.io.Serializable;
 import java.util.List;
 
-
 /**
  * This class represents an artifact for the client. It contains the necessary
  * information for the client and the communication with the artifact server.
@@ -27,7 +26,6 @@
      */
     public String getUuid();
 
-
     /**
      * Returns the hash of the artifact.
      *
@@ -35,7 +33,6 @@
      */
     public String getHash();
 
-
     /**
      * Returns the name of the artifact.
      * This happens to be the factory name, too.
@@ -51,7 +48,6 @@
      */
     public ArtifactDescription getArtifactDescription();
 
-
     /**
      * Returns true, if the Artifact is in Background mode.
      *
@@ -59,7 +55,6 @@
      */
     public boolean isInBackground();
 
-
     /**
      * Return a list of background messages.
      *
@@ -67,11 +62,11 @@
      */
     public List<CalculationMessage> getBackgroundMessages();
 
-
     /**
      * Sets a new ArtifactDescription.
      *
-     * @param artifactDescription The new artifact description.
+     * @param artifactDescription
+     *            The new artifact description.
      */
     public void setArtifactDescription(ArtifactDescription artifactDescription);
 }

http://dive4elements.wald.intevation.org