view gwt-client/src/main/java/org/dive4elements/river/client/client/ui/minfo/SedLoadDistancePanel.java @ 9175:34dc0163ad2d

DistancePanel Berechnungsstrecke->Darstellungsbereich Refactoring
author gernotbelger
date Mon, 25 Jun 2018 17:58:11 +0200
parents 5e38e2924c07
children
line wrap: on
line source
/* 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.minfo;

import java.util.List;

import org.dive4elements.river.client.client.Config;
import org.dive4elements.river.client.client.ui.AbstractUIProvider;
import org.dive4elements.river.client.client.ui.DoubleRangeOnlyPanel;
import org.dive4elements.river.client.client.ui.DoubleRangePanel;
import org.dive4elements.river.client.client.ui.LocationPicker;
import org.dive4elements.river.client.client.ui.range.DistanceInfoDataSource;
import org.dive4elements.river.client.shared.model.ArtifactDescription;
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 com.smartgwt.client.data.Record;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.Label;
import com.smartgwt.client.widgets.form.fields.events.BlurEvent;
import com.smartgwt.client.widgets.form.fields.events.BlurHandler;
import com.smartgwt.client.widgets.grid.events.CellClickEvent;
import com.smartgwt.client.widgets.grid.events.CellClickHandler;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.VLayout;

public class SedLoadDistancePanel extends AbstractUIProvider implements BlurHandler, CellClickHandler {
    public static final String FIELD_LOWER = "ld_from";
    public static final String FIELD_UPPER = "ld_to";

    protected DoubleRangePanel distancePanel;
    protected double min;
    protected double max;
    protected LocationPicker picker;

    @Override
    public Canvas createOld(final DataList dataList) {
        final String s = getOldSelectionString(dataList);
        final String l = dataList.getLabel();

        final Label label = new Label(l);
        final Label selected = new Label(s);

        final HLayout layout = new HLayout();

        layout.setWidth(400);
        label.setWidth(200);
        selected.setWidth(130);

        layout.addMember(label);
        layout.addMember(selected);
        layout.addMember(getBackButton(dataList.getState()));

        return layout;
    }

    protected String getOldSelectionString(final DataList dataList) {
        final List<Data> items = dataList.getAll();

        final Data dFrom = getData(items, FIELD_LOWER);
        final Data dTo = getData(items, FIELD_UPPER);

        final DataItem[] from = dFrom.getItems();
        final DataItem[] to = dTo.getItems();

        final StringBuilder sb = new StringBuilder();
        sb.append(from[0].getLabel());
        sb.append(" " + this.MSG.dpUnitFrom() + " - ");
        sb.append(to[0].getLabel());
        sb.append(" " + this.MSG.dpUnitTo());

        return sb.toString();
    }

    @Override
    public Canvas create(final DataList data) {
        this.picker = new LocationPicker(this);
        this.distancePanel = new DoubleRangeOnlyPanel(this.MSG.dpUnitFrom() + " - ", this.MSG.dpUnitTo(), 0d, 0d, 250, this, "right");
        final VLayout layout = new VLayout();
        layout.setMembersMargin(10);

        final Label label = getLabel(data);

        final Canvas submit = getNextButton();

        label.setHeight(25);
        this.distancePanel.setHeight(50);

        layout.addMember(label);
        layout.addMember(this.distancePanel);
        layout.addMember(submit);

        initMinMaxValues(data);
        initDefaultValues(data);

        this.picker.setIsDistance(true);
        this.picker.getLocationTable().setAutoFetchData(true);
        this.picker.prepareFilter();

        this.helperContainer.addMember(this.picker.getLocationTable());
        this.helperContainer.addMember(this.picker.getFilterLayout());
        this.helperContainer.addMember(this.picker.getResultCountForm());

        setPickerDataSource();
        this.picker.createLocationTable();

        return layout;
    }

    protected void initMinMaxValues(final DataList data) {
        final Data f = getData(data.getAll(), FIELD_LOWER);
        final Data t = getData(data.getAll(), FIELD_UPPER);

        final DataItem[] fItems = f.getItems();
        final DataItem[] tItems = t.getItems();

        try {
            this.min = Double.valueOf(fItems[0].getStringValue());
            this.max = Double.valueOf(tItems[0].getStringValue());
        }
        catch (final NumberFormatException nfe) {
            this.min = -Double.MAX_VALUE;
            this.max = Double.MAX_VALUE;
        }
    }

    protected void initDefaultValues(final DataList data) {
        initDefaultFrom(data);
        initDefaultTo(data);
    }

    private Label getLabel(final DataList data) {
        final Data item = data.get(0);
        // if (data.getState().contains("uinfo")) { // "Wahl der Berechnungsstrecke/des Darstellungsbereichs" (server) vs.
        // "Berechnungsstrecke wählen" (client)
        return new Label(item.getDescription()); // holt das Label vom Server (funktoniert schon sehr oft so!)
        // }
        // return new Label(getLabel()); // holt das Label aus den Flys-Constants..
    }

    protected void initDefaultFrom(final DataList data) {
        final Data f = getData(data.getAll(), FIELD_LOWER);

        double from = getDefaultFrom();

        try {
            from = getDefaultValue(f);
        }
        catch (final NumberFormatException nfe) {
            // do nothing
        }

        this.distancePanel.setFrom(from);
    }

    protected double getDefaultFrom() {
        return this.min;
    }

    protected void initDefaultTo(final DataList data) {
        final Data t = getData(data.getAll(), FIELD_UPPER);

        double to = getDefaultTo();

        try {
            to = getDefaultValue(t);
        }
        catch (final NumberFormatException nfe) {
            // do nothing
        }

        this.distancePanel.setTo(to);
    }

    protected double getDefaultTo() {
        return this.max;
    }

    protected double getDefaultValue(final Data data) throws NumberFormatException {
        final DataItem def = data.getDefault();
        final String defValue = def != null ? def.getStringValue() : null;

        return Double.valueOf(defValue);
    }

    /** Hook service to the listgrid with possible input values. */
    protected void setPickerDataSource() {
        final Config config = Config.getInstance();
        final String url = config.getServerUrl();
        String river = "";

        final ArtifactDescription adescr = this.artifact.getArtifactDescription();
        final DataList[] data = adescr.getOldData();

        // Try to find a "river" data item to set the source for the
        // list grid.
        String dataFilter = "locations";
        if (data != null && data.length > 0) {
            for (final DataList dl : data) {
                if (dl.getState().equals("state.minfo.river")) {
                    dataFilter = "measuringpoint";
                }
                if (dl.getState().equals("state.winfo.river") || dl.getState().equals("state.chart.river") || dl.getState().equals("state.minfo.river")) {
                    for (int j = 0; j < dl.size(); j++) {
                        final Data d = dl.get(j);
                        final DataItem[] di = d.getItems();
                        if (di != null && di.length == 1) {
                            river = d.getItems()[0].getStringValue();
                            break;
                        }
                    }
                }
            }
        }

        this.picker.getLocationTable().setDataSource(new DistanceInfoDataSource(url, river, dataFilter));
    }

    @Override
    protected Data[] getData() {
        final Data[] data = new Data[2];

        data[0] = getDataFrom();
        data[1] = getDataTo();

        return data;
    }

    protected Data getDataFrom() {
        final String value = String.valueOf(this.distancePanel.getFrom());
        final String field = FIELD_LOWER;

        final DataItem item = new DefaultDataItem(field, field, value);
        return new DefaultData(field, null, null, new DataItem[] { item });
    }

    protected Data getDataTo() {
        final String value = String.valueOf(this.distancePanel.getTo());
        final String field = FIELD_UPPER;

        final DataItem item = new DefaultDataItem(field, field, value);
        return new DefaultData(field, null, null, new DataItem[] { item });
    }

    @Override
    public void onBlur(final BlurEvent event) {
        this.distancePanel.validateForm();
    }

    @Override
    public void onCellClick(final CellClickEvent e) {
        final Record record = e.getRecord();
        final int ndx = e.getColNum();
        final String from = record.getAttribute("from");
        try {
            final double value = Double.valueOf(from);
            switch (ndx) {
            case 0:
                this.distancePanel.setFrom(value);
                break;
            case 1:
                this.distancePanel.setTo(value);
                break;
            }
        }
        catch (final NumberFormatException nfe) {
            SC.warn(this.MSG.wrongFormat());
        }
    }

}

http://dive4elements.wald.intevation.org