Mercurial > dive4elements > river
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