view gwt-client/src/main/java/org/dive4elements/river/client/client/ui/DistancePanel.java @ 9416:05405292a7ca

Navigationtheme panel now shows themes of dWt and WQ charts grayed out, if the current station is outside the valid range of the theme.
author gernotbelger
date Thu, 16 Aug 2018 16:28:03 +0200
parents c08d5cfa4981
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;

import java.util.ArrayList;
import java.util.List;

import org.dive4elements.river.client.client.FLYSConstants;
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.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.NumberFormat;
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.StaticTextItem;
import com.smartgwt.client.widgets.form.fields.events.BlurEvent;
import com.smartgwt.client.widgets.form.fields.events.BlurHandler;
import com.smartgwt.client.widgets.grid.ListGrid;
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.VLayout;
import com.smartgwt.client.widgets.tab.TabSet;

/** Panel to allow input of distance for calculation range. */
public class DistancePanel extends AbstractUIProvider implements BlurHandler {

    private static final long serialVersionUID = -883142387908664588L;

    public static final int DEFAULT_STEP_WIDTH = 100;

    public static final String FIELD_LOWER = "ld_from";
    public static final String FIELD_UPPER = "ld_to";
    public static final String FIELD_STEP = "ld_step";

    protected FLYSConstants MSG = GWT.create(FLYSConstants.class);

    // protected RangeTable distancesTable;
    // protected LocationsTable locationsTable;

    protected DoubleRangePanel distancePanel;

    protected TableFilter filterDescription;
    protected RangeTableFilter filterRange;

    protected TabSet tabs;

    protected double min;
    protected double max;

    protected StaticTextItem filterResultCount;
    protected ListGrid currentFiltered;

    public DistancePanel() {
        this("right");
    }

    public DistancePanel(final String labelOrientation) {
        this.distancePanel = new DoubleRangePanel(labelFrom(), labelTo(), labelStep(), 0d, 0d, 0d, 250, this, labelOrientation);
    }

    @Override
    public Canvas create(final DataList data) {
        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);
        initHelperPanel(data);

        return layout;
    }

    protected Label getLabel(final DataList data) {
        final Data item = data.get(0);
        return new Label(item.getDescription()); // holt das Label vom Server (funktoniert schon sehr oft so!)
    }

    @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, getLowerField());
        final Data dTo = getData(items, getUpperField());
        final Data dStep = getData(items, getStepField());

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

        final StringBuilder sb = new StringBuilder();
        sb.append(from[0].getLabel());
        sb.append(" " + getUnitFrom() + " - ");
        sb.append(to[0].getLabel());
        sb.append(" " + getUnitTo() + " - ");
        sb.append(step[0].getLabel());
        sb.append(" " + getUnitStep());

        return sb.toString();
    }

    // protected String getLabel() {
    // return this.MSG.distance_state();
    // }

    protected String labelFrom() {
        return getLabelFrom() + " [" + getUnitFrom() + "]";
    }

    protected String getLabelFrom() {
        return this.MSG.dpLabelFrom();
    }

    protected String getUnitFrom() {
        return this.MSG.dpUnitFrom();
    }

    protected String labelTo() {
        return getLabelTo() + " [" + getUnitTo() + "]";
    }

    protected String getLabelTo() {
        return this.MSG.dpLabelTo();
    }

    protected String getUnitTo() {
        return this.MSG.dpUnitTo();
    }

    protected String labelStep() {
        return getLabelStep() + " [" + getUnitStep() + "]";
    }

    protected String getLabelStep() {
        return this.MSG.dpLabelStep();
    }

    protected String getUnitStep() {
        return this.MSG.dpUnitStep();
    }

    protected String getLowerField() {
        return FIELD_LOWER;
    }

    protected String getUpperField() {
        return FIELD_UPPER;
    }

    protected String getStepField() {
        return FIELD_STEP;
    }

    @Override
    public List<String> validate() {
        final List<String> errors = new ArrayList<String>();

        if (!this.distancePanel.validateForm()) {
            errors.add(this.MSG.wrongFormat());

            return errors;
        }

        validateFrom(errors);
        validateTo(errors);

        return errors;
    }

    protected void validateFrom(final List<String> errors) {
        final double from = this.distancePanel.getFrom();

        if (from < this.min || from > this.max) {
            final NumberFormat nf = NumberFormat.getDecimalFormat();

            String tmp = this.MSG.error_validate_lower_range();
            tmp = tmp.replace("$1", nf.format(from));
            tmp = tmp.replace("$2", nf.format(this.min));

            this.distancePanel.setFrom(this.min);
            errors.add(tmp);
        }
    }

    protected void validateTo(final List<String> errors) {
        final double to = this.distancePanel.getTo();

        if (to < this.min || to > this.max) {
            final NumberFormat nf = NumberFormat.getDecimalFormat();

            String tmp = this.MSG.error_validate_upper_range();
            tmp = tmp.replace("$1", nf.format(to));
            tmp = tmp.replace("$2", nf.format(this.max));

            this.distancePanel.setTo(this.max);
            errors.add(tmp);
        }
    }

    @Override
    public Data[] getData() {
        final Data[] data = new Data[4];

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

        final DataItem item = new DefaultDataItem("ld_mode", "ld_mode", "distance");
        data[3] = new DefaultData("ld_mode", null, null, new DataItem[] { item });

        return data;
    }

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

        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 = getUpperField();

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

    protected Data getDataStep() {
        final String value = String.valueOf(this.distancePanel.getStep());
        final String field = getStepField();

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

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

        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);
        initDefaultStep(data);
    }

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

        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(), getUpperField());

        double to = getDefaultTo();

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

        this.distancePanel.setTo(to);
    }

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

    protected void initDefaultStep(final DataList data) {
        final Data s = getData(data.getAll(), getStepField());

        double step = getDefaultStep();

        try {
            step = getDefaultValue(s);
        }
        catch (final NumberFormatException nfe) {
            // do nothing
        }

        this.distancePanel.setStep(step);
    }

    protected double getDefaultStep() {
        return DEFAULT_STEP_WIDTH;
    }

    /** Gets the double from default in data, null if none. */
    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);
    }

    protected void initHelperPanel(final DataList data) {

        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 {
                    DistancePanel.this.distancePanel.setFrom(Double.valueOf(from));
                    DistancePanel.this.distancePanel.setTo(Double.valueOf(to));
                }
                catch (final NumberFormatException nfe) {
                    SC.warn(DistancePanel.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:
                        DistancePanel.this.distancePanel.setFrom(Double.valueOf(value));
                        break;
                    case 1:
                        DistancePanel.this.distancePanel.setTo(Double.valueOf(value));
                        break;
                    }
                }
                catch (final NumberFormatException nfe) {
                    SC.warn(DistancePanel.this.MSG.wrongFormat());
                }
            }
        });

    }

    @Override
    public void onBlur(final BlurEvent event) {
        this.distancePanel.validateForm();
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org