Mercurial > dive4elements > river
diff gwt-client/src/main/java/org/dive4elements/river/client/client/ui/uinfo/SupraRegionalTablePanel.java @ 9237:972e10522ed6
salix.supraregional ui
author | gernotbelger |
---|---|
date | Tue, 10 Jul 2018 11:24:12 +0200 |
parents | |
children | 1c756bfee472 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/uinfo/SupraRegionalTablePanel.java Tue Jul 10 11:24:12 2018 +0200 @@ -0,0 +1,412 @@ +/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde + * Software engineering by Intevation GmbH + * + * 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.DistancePanelInputHelper; +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 org.dive4elements.river.client.shared.model.SalixZone; + +import com.google.gwt.core.client.GWT; +import com.google.gwt.i18n.client.NumberFormat; +import com.google.gwt.user.client.ui.Label; +import com.smartgwt.client.data.Record; +import com.smartgwt.client.types.Alignment; +import com.smartgwt.client.util.SC; +import com.smartgwt.client.widgets.Button; +import com.smartgwt.client.widgets.Canvas; +import com.smartgwt.client.widgets.events.ClickEvent; +import com.smartgwt.client.widgets.events.ClickHandler; +import com.smartgwt.client.widgets.form.DynamicForm; +import com.smartgwt.client.widgets.form.fields.TextItem; +import com.smartgwt.client.widgets.grid.CellEditValueFormatter; +import com.smartgwt.client.widgets.grid.CellFormatter; +import com.smartgwt.client.widgets.grid.ListGrid; +import com.smartgwt.client.widgets.grid.ListGridField; +import com.smartgwt.client.widgets.grid.ListGridRecord; +import com.smartgwt.client.widgets.grid.events.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; + +public class SupraRegionalTablePanel extends AbstractUIProvider { + private static final long serialVersionUID = 1L; + + private Double minKm, maxKm = -1.; + // private String tableData = ""; + private ListGrid table; + private final String datakey = "supraregional_table"; + final Label validationLabel = new Label(); + + private final NumberFormat format = NumberFormat.getDecimalFormat(); + + @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, this.datakey); + final DataItem[] strItems = str.getItems(); + + final List<SalixZone> entries = SalixZone.parse(strItems[0].getLabel()); + + for (final SalixZone entry : entries) { + final Label dateLabel = new Label( + entry.getDwsplValue() + " (" + this.format.format(entry.getFromKm()) + "-" + this.format.format(entry.getToKm()) + " km)"); + dateLabel.setHeight("20px"); + vLayout.addMember(dateLabel); + } + final Canvas back = getBackButton(dataList.getState()); + layout.addMember(label); + layout.addMember(vLayout); + layout.addMember(back); + + return layout; + } + + @Override + public Canvas create(final DataList data) { + + final Data dataItem = data.getAll().get(0); + String tableData = ""; + for (final DataItem item : dataItem.getItems()) { + final String label = item.getLabel(); + if (label.equals("salix_zones_min")) + this.minKm = Double.valueOf(item.getStringValue()); + else if (label.equals("salix_zones_max")) + this.maxKm = Double.valueOf(item.getStringValue()); + else if (label.equals("salix_zones")) + tableData = item.getStringValue(); + } + + if (this.minKm > this.maxKm) { + final double temp = this.minKm; + this.minKm = this.maxKm; + this.maxKm = temp; + } + + final VLayout layout = new VLayout(); + final Canvas submit = getNextButton(); + + final VLayout root = new VLayout(); + root.setWidth(420); + createWidget(root, data, tableData); + + layout.addMember(root); + layout.addMember(submit); + + validateRangeOverlap();// init Text + return layout; + } + + @Override + protected Data[] getData() { + final List<Data> data = new ArrayList<Data>(); + + final ListGridRecord[] lgr = this.table.getRecords(); + if (lgr == null) { + return new Data[0]; + } + final List<SalixZone> zoneList = getSalixZones(lgr); + final DataItem item = new DefaultDataItem(this.datakey, null, SalixZone.parseListToDataString(zoneList)); + data.add(new DefaultData(this.datakey, null, null, new DataItem[] { item })); + return data.toArray(new Data[data.size()]); + } + + private List<SalixZone> getSalixZones(final ListGridRecord[] lgr) { + final List<SalixZone> zoneList = new ArrayList<SalixZone>(); + for (final ListGridRecord element : lgr) { + final Record r = element; + final SalixZone zone = SalixZone.createFromTableEntry(r.getAttribute("dmwspl"), r.getAttribute("from"), r.getAttribute("to")); + zoneList.add(zone); + } + return zoneList; + } + + public Canvas createWidget(final Layout root, final DataList data, final String tableData) { + + this.table = createTable(root, data, tableData); + + final TextItem dwspl = PanelHelper.createItem("_label_dwspl", this.MSG.uinfo_salix_dmwspl_short(), "50"); + // this.dwspl.setColSpan(3); + final TextItem start = PanelHelper.createIntegerItem("_from_dwspl", getLabelFromTo(this.MSG.from()), "50"); + // this.start.setColSpan(3); + final TextItem end = PanelHelper.createIntegerItem("_to_dwspl", getLabelFromTo(this.MSG.to()), "50"); + // this.end.setColSpan(3); + + final HLayout fields = new HLayout(); + + final Button add = new Button(this.MSG.add_date()); // TODO: make key more generic or change to more specific + + final DynamicForm newEntryForm = new DynamicForm(); + newEntryForm.setWidth(320); + newEntryForm.setNumCols(12); + newEntryForm.setFields(dwspl, start, end); + + add.addClickHandler(new ClickHandler() { + @Override + public void onClick(final ClickEvent ce) { + final String v1 = start.getValueAsString(); + final String v2 = end.getValueAsString(); + final String v3 = dwspl.getValueAsString(); + final String message = validate(v1, v2, v3); + if (message != null) { + SC.warn(message); + return; + } + final ListGridRecord r = new ListGridRecord(); + r.setAttribute("dmwspl", v3); + r.setAttribute("from", SupraRegionalTablePanel.this.format.parse(v1)); + r.setAttribute("to", SupraRegionalTablePanel.this.format.parse(v2)); + SupraRegionalTablePanel.this.table.addData(r); + validateRangeOverlap(); + } + }); + + fields.addMember(newEntryForm); + + root.addMember(fields); + root.addMember(PanelHelper.getSpacer(10)); + + initHelperPanel(start, end); + + root.addMember(add); + root.addMember(PanelHelper.getSpacer(20)); + return root; + } + + private String getLabelFromTo(final String fromOrTo) { + return new StringBuilder().append(fromOrTo).append(" [").append(this.MSG.dpUnitFrom()).append("]").toString(); + } + + protected void initHelperPanel(final TextItem start, final TextItem end) { + final DistancePanelInputHelper helper = new DistancePanelInputHelper(this.MSG, this.helperContainer, this.getRiverName()); + + helper.getDistancesTable().addRecordClickHandler(new RecordClickHandler() { + @Override + public void onRecordClick(final RecordClickEvent e) { + final Record r = e.getRecord(); + + final String from = r.getAttribute("from"); + final String to = r.getAttribute("to"); + + try { + start.setValue(SupraRegionalTablePanel.this.format.format(Double.valueOf(from))); + end.setValue(SupraRegionalTablePanel.this.format.format(Double.valueOf(to))); + } + catch (final NumberFormatException nfe) { + SC.warn(SupraRegionalTablePanel.this.MSG.wrongFormat()); + } + } + }); + + helper.getLocationsTable().addRecordClickHandler(new RecordClickHandler() { + @Override + public void onRecordClick(final RecordClickEvent e) { + final Record r = e.getRecord(); + final int field = e.getFieldNum(); + + try { + final String value = r.getAttribute("from"); + switch (field) { + case 0: + start.setValue(SupraRegionalTablePanel.this.format.format(Double.valueOf(value))); + break; + case 1: + end.setValue(SupraRegionalTablePanel.this.format.format(Double.valueOf(value))); + break; + } + } + catch (final NumberFormatException nfe) { + SC.warn(SupraRegionalTablePanel.this.MSG.wrongFormat()); + } + } + }); + + } + + protected final ListGrid createTable(final Layout root, final DataList data, final String tableData) { + + final Label title = new Label(data.get(0).getDescription()); + title.setHeight("35px"); + this.validationLabel.setHeight("10px"); + + final ListGrid elements = new ListGrid(); + elements.setWidth(320); + elements.setHeight(300); + elements.setShowHeaderContextMenu(false); + elements.setCanReorderFields(false); + elements.setCanResizeFields(false); + elements.setCanEdit(true); + elements.setCanSort(false); + elements.setCanResizeFields(false); + + final ListGridField dmwsplField = new ListGridField("dmwspl", this.MSG.uinfo_salix_dmwspl_short()); + dmwsplField.setAlign(Alignment.RIGHT); + dmwsplField.setWidth(95); + dmwsplField.addCellSavedHandler(new CellSavedHandler() { + @Override + public void onCellSaved(final CellSavedEvent event) { + final Object value = event.getNewValue(); + event.getRecord().setAttribute("dmwspl", event.getOldValue()); + try { + final int intValue = Integer.valueOf(String.valueOf(value)); + event.getRecord().setAttribute("dmwspl", intValue); + } + catch (final NumberFormatException e) { + e.printStackTrace(); + } + } + }); + final ListGridField fromField = createDoubleTableField("from", this.MSG.from()); + final ListGridField toField = createDoubleTableField("to", this.MSG.to()); + final ListGridField removeField = PanelHelper.createRemoveField(elements, GWT.getHostPageBaseURL() + this.MSG.removeFeature()); + elements.addRecordClickHandler(new RecordClickHandler() { // adding another custom record-Remove-Handler which is not included in the Panelhelper + @Override + public void onRecordClick(final RecordClickEvent event) { + if (event.getField().getName().equals(removeField.getName())) { + validateRangeOverlap(); + } + } + }); + elements.setFields(dmwsplField, fromField, toField, removeField); + addDataInit(elements, tableData); + + root.addMember(title); + root.addMember(elements); + root.addMember(PanelHelper.getSpacer(3)); + root.addMember(this.validationLabel); + root.addMember(PanelHelper.getSpacer(4)); + return elements; + } + + private void addDataInit(final ListGrid table, final String tableData) { + if (tableData != null) { + final List<SalixZone> rows = SalixZone.parse(tableData); + for (final SalixZone row : rows) { + table.addData(createEntry(row)); + } + } + } + + public final ListGridRecord createEntry(final SalixZone row) { + + final Integer dwspl = row.getDwsplValue(); + final Double from = row.getFromKm(); + final Double to = row.getToKm(); + + if (dwspl == null || from == null || to == null) { + return null; + } + + final ListGridRecord r = new ListGridRecord(); + r.setAttribute("dmwspl", dwspl); + r.setAttribute("from", from); + r.setAttribute("to", to); + + return r; + + } + + private ListGridField createDoubleTableField(final String key, final String msg) { + final ListGridField field = new ListGridField(key, msg); + field.setAlign(Alignment.RIGHT); + field.setWidth(90); + field.addCellSavedHandler(new CellSavedHandler() { + @Override + public void onCellSaved(final CellSavedEvent event) { + final Object value = event.getNewValue(); + event.getRecord().setAttribute(key, event.getOldValue()); + try { + final double d = SupraRegionalTablePanel.this.format.parse(String.valueOf(value)); + if (d > SupraRegionalTablePanel.this.maxKm) { + event.getRecord().setAttribute(key, SupraRegionalTablePanel.this.maxKm); + } else if (d < SupraRegionalTablePanel.this.minKm) { + event.getRecord().setAttribute(key, SupraRegionalTablePanel.this.minKm); + } else { + event.getRecord().setAttribute(key, d); + } + validateRangeOverlap(); + } + catch (final NumberFormatException e) { + e.printStackTrace(); + } + } + }); + + field.setEditValueFormatter(new CellEditValueFormatter() { + @Override + public Object format(final Object value, final ListGridRecord record, final int rowNum, final int colNum) { + if (!(value instanceof Float || value instanceof Double)) { + try { + return (float) SupraRegionalTablePanel.this.format.parse(String.valueOf(value)); + } + catch (final Exception e2) { + return record.getAttribute(key); + } + } else { + return SupraRegionalTablePanel.this.format.format((Double) value); + } + } + }); + field.setCellFormatter(new CellFormatter() { + @Override + public String format(final Object value, final ListGridRecord record, final int rowNum, final int colNum) { + return SupraRegionalTablePanel.this.format.format(Double.valueOf(String.valueOf(value))); + } + }); + return field; + } + + private String validate(final String fromInput, final String toInput, final String dmwspl) { + + if (fromInput == null || toInput == null || dmwspl == null || fromInput.trim().isEmpty() || toInput.trim().isEmpty() || dmwspl.trim().isEmpty()) + return this.MSG.uinfo_vegetation_zones_validation_empty(); + + try { + final Double from = this.format.parse(fromInput); + final Double to = this.format.parse(toInput); + Integer.valueOf(dmwspl); + + if (from < this.minKm || from > this.maxKm || to > this.maxKm || to < this.minKm) + return this.MSG.uinfo_salix_km_limit_exceed(); + return null; + } + catch (final NumberFormatException e) { + return this.MSG.wrongFormat(); + } + } + + private void validateRangeOverlap() { + final StringBuilder builder = new StringBuilder(); + if (SalixZone.zonesAreOverlapping(this.getSalixZones(this.table.getRecords()))) + builder.append(this.MSG.uinfo_salix_km_overlap()).append(" "); + if (SalixZone.hasGaps(this.getSalixZones(this.table.getRecords()), this.minKm, this.maxKm)) + builder.append(this.MSG.uinfo_salix_km_has_gaps());// "Der Km-Bereich wird nicht vollst. abgedeckt."; + + this.validationLabel.setText(builder.toString()); + } +} \ No newline at end of file