view flys-client/src/main/java/org/dive4elements/river/client/client/ui/DistancePanel.java @ 5834:f507086aa94b

Repaired internal references.
author Sascha L. Teichmann <teichmann@intevation.de>
date Thu, 25 Apr 2013 12:31:32 +0200
parents flys-client/src/main/java/de/intevation/flys/client/client/ui/DistancePanel.java@360e22afb98b
children 821a02bbfb4e
line wrap: on
line source
package de.intevation.flys.client.client.ui;

import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.NumberFormat;

import com.smartgwt.client.data.AdvancedCriteria;
import com.smartgwt.client.data.Criteria;
import com.smartgwt.client.data.Criterion;
import com.smartgwt.client.data.Record;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.OperatorId;
import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.Label;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.SelectItem;
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.form.fields.events.ChangedEvent;
import com.smartgwt.client.widgets.form.fields.events.ChangedHandler;
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.Tab;
import com.smartgwt.client.widgets.tab.TabSet;
import com.smartgwt.client.widgets.tab.events.TabSelectedEvent;
import com.smartgwt.client.widgets.tab.events.TabSelectedHandler;

import de.intevation.flys.client.client.Config;
import de.intevation.flys.client.client.FLYSConstants;
import de.intevation.flys.client.client.event.FilterHandler;
import de.intevation.flys.client.client.event.RangeFilterEvent;
import de.intevation.flys.client.client.event.StringFilterEvent;
import de.intevation.flys.client.client.ui.range.DistanceInfoDataSource;
import de.intevation.flys.client.client.ui.range.LocationsTable;
import de.intevation.flys.client.client.ui.range.RangeTable;
import de.intevation.flys.client.shared.model.ArtifactDescription;
import de.intevation.flys.client.shared.model.Data;
import de.intevation.flys.client.shared.model.DataItem;
import de.intevation.flys.client.shared.model.DataList;
import de.intevation.flys.client.shared.model.DefaultData;
import de.intevation.flys.client.shared.model.DefaultDataItem;

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


public class DistancePanel extends AbstractUIProvider implements BlurHandler, FilterHandler
{

    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(String labelOrientation) {
        distancePanel  = new DoubleRangePanel(
            labelFrom(), labelTo(), labelStep(),
            0d, 0d, 0d, 250, this, labelOrientation);
    }


    @Override
    public Canvas create(DataList data) {
        VLayout layout = new VLayout();
        layout.setMembersMargin(10);

        Label label = new Label(getLabel());

        Canvas submit = getNextButton();

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

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

        initMinMaxValues(data);
        initDefaultValues(data);
        initHelperPanel();

        return layout;
    }


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

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

        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(DataList dataList) {
        List<Data> items = dataList.getAll();

        Data dFrom = getData(items, getLowerField());
        Data dTo   = getData(items, getUpperField());
        Data dStep = getData(items, getStepField());

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

        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 MSG.distance_state();
    }


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


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


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


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


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


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


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


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


    protected String getUnitStep() {
        return 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() {
        List<String> errors = new ArrayList<String>();

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

            return errors;
        }

        validateFrom(errors);
        validateTo(errors);

        return errors;
    }


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

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

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

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


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

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

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

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


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

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

        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() {
        String value = String.valueOf(distancePanel.getFrom());
        String field = getLowerField();

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


    protected Data getDataTo() {
        String value = String.valueOf(distancePanel.getTo());
        String field = getUpperField();

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


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

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


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


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

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

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


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


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

        double from = getDefaultFrom();

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

        distancePanel.setFrom(from);
    }


    protected double getDefaultFrom() {
        return min;
    }


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

        double to = getDefaultTo();

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

        distancePanel.setTo(to);
    }


    protected double getDefaultTo() {
        return max;
    }


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

        double step = getDefaultStep();

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

        distancePanel.setStep(step);
    }


    protected double getDefaultStep() {
        return DEFAULT_STEP_WIDTH;
    }


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

        return Double.valueOf(defValue);
    }


    protected void initHelperPanel() {
        distancesTable = new RangeTable();
        locationsTable = new LocationsTable();

        Config config = Config.getInstance();
        String url    = config.getServerUrl();
        String river  = getRiverName();

        distancesTable.setAutoFetchData(true);
        locationsTable.setAutoFetchData(true);
        distancesTable.setDataSource(new DistanceInfoDataSource(
            url, river, "distances"));
        locationsTable.setDataSource(new DistanceInfoDataSource(
            url, river, "locations"));

        distancesTable.addRecordClickHandler(new RecordClickHandler() {
            @Override
            public void onRecordClick(RecordClickEvent e) {
                Record r = e.getRecord();

                String from = r.getAttribute("from");
                String to   = r.getAttribute("to");

                try {
                    distancePanel.setFrom(Double.valueOf(from));
                    distancePanel.setTo(Double.valueOf(to));
                }
                catch (NumberFormatException nfe) {
                    SC.warn(MSG.wrongFormat());
                }
            }
        });

        locationsTable.addRecordClickHandler(new RecordClickHandler() {
            @Override
            public void onRecordClick(RecordClickEvent e) {
                Record  r = e.getRecord();
                int field = e.getFieldNum();

                try {
                    String value = r.getAttribute("from");

                    switch (field) {
                    case 0:
                        distancePanel.setFrom(Double.valueOf(value));
                        break;
                    case 1:
                        distancePanel.setTo(Double.valueOf(value));
                        break;
                    }
                }
                catch (NumberFormatException nfe) {
                    SC.warn(MSG.wrongFormat());
                }
            }
        });

        tabs = new TabSet();
        tabs.setWidth100();
        tabs.setHeight100();

        Tab locations = new Tab(MSG.locations());
        Tab distances = new Tab(MSG.distance());

        locations.setPane(locationsTable);
        distances.setPane(distancesTable);

        tabs.addTab(locations, 0);
        tabs.addTab(distances, 1);

        filterResultCount = new StaticTextItem(MSG.resultCount());
        filterResultCount.setTitleAlign(Alignment.LEFT);
        filterResultCount.setTitleStyle("color: #000");

        filterDescription = new TableFilter();
        filterDescription.setHeight("30px");
        filterDescription.addFilterHandler(this);

        filterRange = new RangeTableFilter();
        filterRange.setHeight("30px");
        filterRange.addFilterHandler(this);
        filterRange.setVisible(false);

        SelectItem filterCriteria = new SelectItem();
        filterCriteria.setShowTitle(false);
        filterCriteria.setWidth(100);
        filterCriteria.addChangedHandler(new ChangedHandler() {
            @Override
            public void onChanged(ChangedEvent e) {
                if(e.getValue().toString().equals("range")) {
                    filterRange.setVisible(true);
                    filterDescription.setVisible(false);
                    filterDescription.clear();
                }
                else {
                    filterRange.setVisible(false);
                    filterRange.clear();
                    filterDescription.setVisible(true);
                }
            }
        });

        LinkedHashMap<String, String> filterMap =
            new LinkedHashMap<String, String>();
        filterMap.put("description", MSG.description());
        filterMap.put("range", MSG.range());
        filterCriteria.setValueMap(filterMap);
        filterCriteria.setValue("description");

        DynamicForm form = new DynamicForm();
        form.setFields(filterCriteria);

        DynamicForm form2 = new DynamicForm();
        form2.setFields(filterResultCount);

        HLayout filterLayout = new HLayout();
        filterLayout.addMember(form);
        filterLayout.addMember(filterDescription);
        filterLayout.addMember(filterRange);
        filterLayout.setHeight(30);
        tabs.addTabSelectedHandler(new TabSelectedHandler() {
            @Override
            public void onTabSelected(TabSelectedEvent evt) {
                filterDescription.clear();
                filterRange.clear();
                filterResultCount.setValue("");

                Canvas c = evt.getTabPane();
                if(c instanceof ListGrid) {
                    currentFiltered = (ListGrid)c;
                }
            }
        });

        helperContainer.addMember(tabs);
        helperContainer.addMember(filterLayout);
        helperContainer.addMember(form2);
    }


    @Override
    public void onFilterCriteriaChanged(StringFilterEvent event) {
        String search = event.getFilter();

        if (search != null && search.length() > 0) {
            Criteria c = new Criteria("description", search);
            locationsTable.filterData(c);
            distancesTable.filterData(c);
            filterResultCount.setValue(currentFiltered.getRecords().length);
        }
        else {
            locationsTable.clearCriteria();
            distancesTable.clearCriteria();
            filterResultCount.setValue("");
        }
    }


    @Override
    public void onFilterCriteriaChanged(RangeFilterEvent event) {
        Float from = event.getFrom() - 0.001f;
        Float to = event.getTo() + 0.001f;

        Criterion combinedFilter = null;
        Criterion locationFilter = null;
        if (from.equals(Float.NaN) && to.equals(Float.NaN)) {
            locationsTable.clearCriteria();
            distancesTable.clearCriteria();
            filterResultCount.setValue("");
            return;
        }
        else if (from.equals(Float.NaN)) {
            combinedFilter = new Criterion("to", OperatorId.LESS_OR_EQUAL, to);
            locationFilter =
                new Criterion("from", OperatorId.LESS_OR_EQUAL, to);
            locationsTable.filterData(locationFilter);
            distancesTable.filterData(combinedFilter);
            filterResultCount.setValue(currentFiltered.getRecords().length);
            return;
        }
        else if (to.equals(Float.NaN)) {
            combinedFilter =
                new Criterion("from", OperatorId.GREATER_OR_EQUAL, from);
        }
        else {
            AdvancedCriteria c1 =
                new AdvancedCriteria(OperatorId.AND, new Criterion[] {
                    new Criterion("from", OperatorId.GREATER_OR_EQUAL, from),
                    new Criterion("from", OperatorId.LESS_OR_EQUAL, to)
                });

            AdvancedCriteria c2 =
                new AdvancedCriteria(OperatorId.AND, new Criterion[] {
                    new Criterion("to", OperatorId.GREATER_OR_EQUAL, from),
                    new Criterion("to", OperatorId.LESS_OR_EQUAL, to)
                });

            AdvancedCriteria c3 =
                new AdvancedCriteria(OperatorId.AND, new Criterion[] {
                    new Criterion("from", OperatorId.LESS_OR_EQUAL, to),
                    new Criterion("to", OperatorId.GREATER_OR_EQUAL, from)
                });

            combinedFilter =
                new AdvancedCriteria(OperatorId.OR, new Criterion[] {
                    c1, c2, c3
                });
        }
        locationsTable.filterData(combinedFilter);
        distancesTable.filterData(combinedFilter);
        filterResultCount.setValue(currentFiltered.getRecords().length);

    }


    protected String getRiverName() {
        ArtifactDescription adescr = artifact.getArtifactDescription();
        return adescr.getRiver();
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org