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