diff gwt-client/src/main/java/org/dive4elements/river/client/client/ui/uinfo/AbstractVegZonesTablePanel.java @ 9260:b570b6fcc052

VegetationZone color added and disabled
author gernotbelger
date Tue, 17 Jul 2018 10:59:27 +0200
parents af73fdd96920
children 4a6cc7c6716a
line wrap: on
line diff
--- a/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/uinfo/AbstractVegZonesTablePanel.java	Mon Jul 16 08:43:07 2018 +0200
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/uinfo/AbstractVegZonesTablePanel.java	Tue Jul 17 10:59:27 2018 +0200
@@ -14,6 +14,7 @@
 
 import org.dive4elements.river.client.client.ui.AbstractUIProvider;
 import org.dive4elements.river.client.client.ui.PanelHelper;
+import org.dive4elements.river.client.client.ui.VegZonePanelHelper;
 import org.dive4elements.river.client.shared.model.Data;
 import org.dive4elements.river.client.shared.model.DataItem;
 import org.dive4elements.river.client.shared.model.DataList;
@@ -22,16 +23,20 @@
 import org.dive4elements.river.client.shared.model.VegetationZone;
 
 import com.google.gwt.core.client.GWT;
+import com.google.gwt.user.client.ui.Label;
 import com.smartgwt.client.data.Record;
 import com.smartgwt.client.types.Alignment;
 import com.smartgwt.client.types.ListGridFieldType;
+import com.smartgwt.client.types.SortDirection;
 import com.smartgwt.client.widgets.Canvas;
-import com.smartgwt.client.widgets.Label;
+import com.smartgwt.client.widgets.form.fields.ColorItem;
 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.SortNormalizer;
+import com.smartgwt.client.widgets.grid.events.CellSavedEvent;
+import com.smartgwt.client.widgets.grid.events.CellSavedHandler;
 import com.smartgwt.client.widgets.grid.events.RecordClickEvent;
 import com.smartgwt.client.widgets.grid.events.RecordClickHandler;
 import com.smartgwt.client.widgets.layout.HLayout;
@@ -46,8 +51,31 @@
     private static final long serialVersionUID = 1L;
 
     private static final String datakey = "vegzones";
+    final protected List<ListGridRecord> records = new ArrayList<ListGridRecord>();
+    private final Label validationLabel = new Label();
+    private final ListGrid elements = new ListGrid() {
 
-    private final ListGrid elements = new ListGrid();
+        @Override
+        protected String getCellCSSText(final ListGridRecord record, final int rowNum, final int colNum) {
+            if (record != null) {
+                if (getFieldName(colNum).equals("color")) {
+                    final String color = record.getAttribute("color");
+                    return "background-color:" + color + ";";
+                }
+            }
+            return super.getCellCSSText(record, rowNum, colNum); // is null...
+        }
+
+        @Override
+        protected Canvas getCellHoverComponent(final Record record, final java.lang.Integer rowNum, final java.lang.Integer colNum) {
+            if (record != null) {
+                if (getFieldName(colNum).equals("color")) {
+                    return null;// "background-color:" + color + ";";
+                }
+            }
+            return super.getCellHoverComponent(record, rowNum, colNum); // is null...
+        }
+    };
 
     protected final ListGrid createTable(final Layout root, final DataList data, final String width, final boolean editable) {
 
@@ -59,33 +87,131 @@
         this.elements.setShowHeaderContextMenu(false);
         this.elements.setCanReorderFields(false);
         this.elements.setCanSort(true);
-        this.elements.setSortField(1);
+        this.elements.setSortField("to");
         this.elements.setCanResizeFields(false);
 
         this.elements.setCanEdit(editable);
 
+        final ListGridField internalNumber = new ListGridField("number", "number"); // valid only if no data is to be added
+        internalNumber.setCanSort(false);
+        internalNumber.setHidden(true);
+
         final ListGridField vegzoneField = new ListGridField("vegzone", this.MSG.uinfo_vegetation_zones_label());
         vegzoneField.setType(ListGridFieldType.TEXT);
         vegzoneField.setWidth("*"); // 245
         vegzoneField.setCanSort(false);
         vegzoneField.setCanDragResize(true);
+        vegzoneField.setCanEdit(true); // neue Anforderung - doch nicht? ???
 
-        final ListGridField fromField = createIntTableField("from", this.MSG.uinfo_vegetation_zones_from(), true);
-        final ListGridField toField = createIntTableField("to", this.MSG.uinfo_vegetation_zones_to(), false);// nicht sortierbar nach "ÜFDauer bis"
+        final ListGridField fromField = VegZonePanelHelper.createIntTableField("from", this.MSG.uinfo_vegetation_zones_from(), true, getNormalizer(),
+                getValidator());
+        fromField.addCellSavedHandler(new CellSavedHandler() {
+            @Override
+            public void onCellSaved(final CellSavedEvent event) {
+                validateRangeOverlap();
+            }
+        });
+        // war mal ne anforderung, dass sich die Werte anderer Zellen ändern, sodass keine lücken entstehen... mach das jetzt
+        // aber über die Validierung. es sei denn, es soll doch wieder erwünscht sein, dass sihc die werte andere Zellen ändern
+        // fromField.addCellSavedHandler(new CellSavedHandler() {
+        //
+        // @Override
+        // public void onCellSaved(final CellSavedEvent event) {
+        //
+        // final ListGridRecord r = event.getRecord();
+        //
+        // final int from = Integer.valueOf(r.getAttribute("from"));
+        // final int to = Integer.valueOf(r.getAttribute("to"));
+        // final String message = validate(r.getAttribute("from"), r.getAttribute("to"), r.getAttribute("zone"),
+        // r.getAttribute("color"));
+        //
+        // final int key = Integer.valueOf(r.getAttribute("number"));
+        // final int lowerKey = key - 1;
+        // final int higherKey = key + 1;
+        //
+        // final ListGridRecord lower = lowerKey > -1 ? AbstractVegZonesTablePanel.this.records.get(lowerKey) : null;
+        // final ListGridRecord higher = higherKey < AbstractVegZonesTablePanel.this.records.size()
+        // ? AbstractVegZonesTablePanel.this.records.get(higherKey)
+        // : null;
+        //
+        // // primary
+        // if (lower != null) {
+        // lower.setAttribute("to", r.getAttribute("from"));
+        //
+        // // additional:
+        // final int lowerFrom = Integer.valueOf(lower.getAttribute("from"));
+        // if (lowerFrom > from) {
+        // lower.setAttribute("from", from);
+        // }
+        // }
+        //
+        // if (from > to) {
+        // r.setAttribute("to", from);
+        // if (higher != null) {
+        // // higher.setAttribute("from", from); //ist vermutlich too much
+        // final int higherTo = Integer.valueOf(higher.getAttribute("to"));
+        // if (from > higherTo) {
+        // // higher.setAttribute("to", from); //ist vermutlich too much
+        // }
+        // }
+        // }
+        // }
+        // });
+
+        final ListGridField toField = VegZonePanelHelper.createIntTableField("to", this.MSG.uinfo_vegetation_zones_to(), false, getNormalizer(),
+                getValidator());
+        toField.addCellSavedHandler(new CellSavedHandler() {
+            @Override
+            public void onCellSaved(final CellSavedEvent event) {
+                validateRangeOverlap();
+            }
+        });
+        // nicht
+        // sortierbar nach
+        // "ÜFDauer bis"
+        toField.setCanEdit(true);// neue Anforderung - doch nicht?
+
+        final ListGridField colorField = new ListGridField("color", this.MSG.uinfo_vegetation_zone_color());
+        colorField.setHidden(VegetationZone.HAS_COLORS_EDITABLE ? false : true);
+        final ColorItem item = new ColorItem();
+        colorField.setEditorProperties(item);
+
+        colorField.setWidth(80); // 25 too small
+        colorField.setAlign(Alignment.LEFT);
+        colorField.setCanSort(false);
+        colorField.setCanDragResize(false);
+
+        // sortierbar nach
+        // "ÜFDauer bis"
+        toField.setCanEdit(true);// neue Anforderung
 
         if (editable) {
-            final ListGridField removeField = createRemoveField();
-            this.elements.setFields(vegzoneField, fromField, toField, removeField);
+            final ListGridField removeField = PanelHelper.createRemoveField(this.elements, GWT.getHostPageBaseURL() + this.MSG.removeFeature());
+            this.elements.addRecordClickHandler(new RecordClickHandler() { // adding another custom record-Remove-Handler which is not included in the
+                                                                           // Panelhelper TODO: MERGE WITH SupraRegionalPanel!!
+                @Override
+                public void onRecordClick(final RecordClickEvent event) {
+                    if (event.getField().getName().equals(removeField.getName())) {
+                        validateRangeOverlap();
+                    }
+                }
+            });
+            this.elements.setFields(vegzoneField, fromField, toField, colorField, removeField);
         } else {
-            this.elements.setFields(vegzoneField, fromField, toField);
+            this.elements.setFields(internalNumber, vegzoneField, fromField, toField, colorField);
         }
 
+        this.elements.sort("from", SortDirection.ASCENDING);
+        this.validationLabel.setHeight("10px");
+        this.validationLabel.getElement().getStyle().setColor("red");
         addDataInit(data);
         root.setWidth(width);
         root.addMember(title);
         root.addMember(this.elements);
-        root.addMember(PanelHelper.getSpacer(10));
+        root.addMember(PanelHelper.getSpacer(3));
 
+        root.addMember(this.validationLabel);
+        root.addMember(PanelHelper.getSpacer(3));
         return this.elements;
     }
 
@@ -110,50 +236,6 @@
         return normalizer;
     }
 
-    private ListGridField createIntTableField(final String key, final String msg, final boolean canSort) {
-        final ListGridField intField = new ListGridField(key, msg);
-        intField.setType(ListGridFieldType.INTEGER);
-        intField.setValidators(getValidator());
-        intField.setWidth(90);
-        intField.setAlign(Alignment.RIGHT);
-        intField.setSortNormalizer(getNormalizer());
-        intField.setCanSort(canSort);
-        intField.setCanDragResize(false);
-
-        return intField;
-    }
-
-    private ListGridField createRemoveField() {
-
-        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);
-                setCanDragResize(false);
-                super.setCanToggle(false);
-            }
-        };
-
-        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 void createWidget(final Layout root, final DataList data);
 
     private final void addDataInit(final DataList data) {
@@ -189,6 +271,8 @@
         layout.addMember(root);
         layout.addMember(submit);
 
+        validateRangeOverlap();// init Text
+
         return layout;
     }
 
@@ -200,7 +284,7 @@
         vLayout.setWidth(130);
         final Label label = new Label(dataList.getLabel());
         label.setWidth("200px");
-        label.setHeight(25);
+        label.setHeight("25px");
 
         final List<Data> items = dataList.getAll();
         final Data str = getData(items, datakey);
@@ -210,7 +294,7 @@
 
         for (final VegetationZone entry : entries) {
             final Label dateLabel = new Label(entry.getZoneName() + " (" + entry.getMin_day_overflow() + "-" + entry.getMax_day_overflow() + ")");
-            dateLabel.setHeight(20);
+            dateLabel.setHeight("20px");
             vLayout.addMember(dateLabel);
         }
         final Canvas back = getBackButton(dataList.getState());
@@ -229,16 +313,21 @@
         if (lgr.length == 0) {
             return new Data[0]; // TODO: Klären, ob Vegetationszonen-Auswahl Pflicht ist, ob es ein Fallback geben soll usw.
         }
+
+        final DataItem item = new DefaultDataItem(datakey, null, VegetationZone.parseListToDataString(getZones(lgr))); // DATA-key
+        data.add(new DefaultData(datakey, null, null, new DataItem[] { item }));
+        return data.toArray(new Data[data.size()]);
+    }
+
+    protected final List<VegetationZone> getZones(final ListGridRecord[] lgr) {
         final List<VegetationZone> zoneList = new ArrayList<VegetationZone>();
         for (final ListGridRecord element : lgr) {
             final Record r = element;
-            final VegetationZone zone = VegetationZone.createFromTableEntry(r.getAttribute("vegzone"), r.getAttribute("from"), r.getAttribute("to"));
+            final VegetationZone zone = VegetationZone.createFromTableEntry(r.getAttribute("vegzone"), r.getAttribute("from"), r.getAttribute("to"),
+                    r.getAttribute("color"));
             zoneList.add(zone);
         }
-
-        final DataItem item = new DefaultDataItem(datakey, null, VegetationZone.parseListToDataString(zoneList)); // DATA-key
-        data.add(new DefaultData(datakey, null, null, new DataItem[] { item }));
-        return data.toArray(new Data[data.size()]);
+        return zoneList;
     }
 
     public final ListGridRecord createEntry(final VegetationZone row) {
@@ -246,7 +335,7 @@
         final String vegzone = row.getZoneName();
         final Integer from = row.getMin_day_overflow();
         final Integer to = row.getMax_day_overflow();
-
+        final String colorStr = row.getHexColor();
         if (vegzone == null || from == null || to == null) {
             return null;
         }
@@ -255,7 +344,51 @@
         r.setAttribute("vegzone", vegzone);
         r.setAttribute("from", from);
         r.setAttribute("to", to);
+        r.setAttribute("color", colorStr);
+        r.setAttribute("number", this.records.size());
+        this.records.add(r);
         return r;
 
     }
+
+    protected String validate(final String fromInput, final String toInput, final String zoneName, final String hexColor) {
+
+        if (fromInput == null || toInput == null || zoneName == null || hexColor == null || fromInput.trim().isEmpty() || toInput.trim().isEmpty()
+                || zoneName.trim().isEmpty() || hexColor.trim().isEmpty())
+            return this.MSG.uinfo_vegetation_zones_validation_empty();
+
+        try {
+            final Integer from = Integer.valueOf(fromInput);
+            final Integer to = Integer.valueOf(toInput);
+
+            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.error_invalid_integer();
+        }
+    }
+
+    @Override
+    public List<String> validate() {
+        final List<String> errors = new ArrayList<String>();
+
+        if (VegetationZone.zonesAreOverlapping(this.getZones(this.elements.getRecords())))
+            errors.add(this.MSG.uinfo_vegetation_zone_overlap());
+        if (VegetationZone.hasGaps(this.getZones(this.elements.getRecords()), 0, 365))
+            errors.add(this.MSG.uinfo_vegetation_zone_has_gaps());
+        return errors;
+    }
+
+    protected final void validateRangeOverlap() {
+        this.validationLabel.setText(validate().toString().replace("[", "").replace("]", "").replace(",", ""));
+    }
 }
\ No newline at end of file

http://dive4elements.wald.intevation.org