Mercurial > dive4elements > river
view gwt-client/src/main/java/org/dive4elements/river/client/client/ui/uinfo/AbstractVegZonesTablePanel.java @ 9263:abf14917be32
Moved stepping behaviour of NaviOutputChart into an exchangeable strategy.
Allows for distinct values stepping of sinfo flood duration.
author | gernotbelger |
---|---|
date | Tue, 17 Jul 2018 19:48:18 +0200 |
parents | b570b6fcc052 |
children | 4a6cc7c6716a |
line wrap: on
line source
/** 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.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; import org.dive4elements.river.client.shared.model.DefaultData; import org.dive4elements.river.client.shared.model.DefaultDataItem; 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.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; import com.smartgwt.client.widgets.layout.Layout; import com.smartgwt.client.widgets.layout.VLayout; /** * @author Domenico Nardi Tironi * */ public abstract class AbstractVegZonesTablePanel extends AbstractUIProvider { 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() { @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) { final Label title = new Label(data.get(0).getDescription()); title.setHeight("35px"); this.elements.setWidth(width); this.elements.setHeight(300); this.elements.setShowHeaderContextMenu(false); this.elements.setCanReorderFields(false); this.elements.setCanSort(true); 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 = 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 = 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(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(3)); root.addMember(this.validationLabel); root.addMember(PanelHelper.getSpacer(3)); return this.elements; } private IntegerRangeValidator getValidator() { final IntegerRangeValidator validator = new IntegerRangeValidator(); validator.setMin(0); validator.setMax(365); validator.setErrorMessage(this.MSG.uinfo_vegetation_zones_validation_range()); return validator; } private SortNormalizer getNormalizer() { final SortNormalizer normalizer = new SortNormalizer() { @Override public Object normalize(final ListGridRecord record, final String fieldName) { final String number = record.getAttribute(fieldName); final String numberFormat = "000" + number; return numberFormat.substring(numberFormat.length() - 3); } }; return normalizer; } public abstract void createWidget(final Layout root, 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) { final List<VegetationZone> rows = VegetationZone.parse(dataItem.getStringValue()); for (final VegetationZone row : rows) { this.elements.addData(createEntry(row)); } } } } } } @Override public final Canvas create(final DataList data) { final VLayout layout = new VLayout(); // TODO: Helper zur Vegetationszonen-Auswahl // final Canvas helper = createHelper(); // this.helperContainer.addMember(helper); final Canvas submit = getNextButton(); final VLayout root = new VLayout(); root.setWidth(450); createWidget(root, data); layout.addMember(root); layout.addMember(submit); validateRangeOverlap();// init Text 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("25px"); final List<Data> items = dataList.getAll(); final Data str = getData(items, datakey); final DataItem[] strItems = str.getItems(); final List<VegetationZone> entries = VegetationZone.parse(strItems[0].getLabel()); for (final VegetationZone entry : entries) { final Label dateLabel = new Label(entry.getZoneName() + " (" + entry.getMin_day_overflow() + "-" + entry.getMax_day_overflow() + ")"); dateLabel.setHeight("20px"); vLayout.addMember(dateLabel); } final Canvas back = getBackButton(dataList.getState()); layout.addMember(label); layout.addMember(vLayout); layout.addMember(back); return layout; } @Override protected final Data[] getData() { final List<Data> data = new ArrayList<Data>(); final ListGridRecord[] lgr = this.elements.getRecords(); 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"), r.getAttribute("color")); zoneList.add(zone); } return zoneList; } public final ListGridRecord createEntry(final VegetationZone row) { 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; } final ListGridRecord r = new ListGridRecord(); 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(",", "")); } }