view flys-client/src/main/java/de/intevation/flys/client/client/ui/SingleLocationPanel.java @ 1594:ddf43791244c

Removed superfluous imports. flys-client/trunk@3905 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Fri, 03 Feb 2012 15:04:12 +0000
parents ff9d71469b7c
children 66671b69c7ea
line wrap: on
line source
package de.intevation.flys.client.client.ui;

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

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.BlurHandler;
import com.smartgwt.client.widgets.form.fields.events.BlurEvent;

import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.VLayout;

import com.smartgwt.client.widgets.grid.events.RecordClickHandler;
import com.smartgwt.client.widgets.grid.events.RecordClickEvent;

import com.smartgwt.client.data.Record;

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.DistanceInfoObject;
import de.intevation.flys.client.shared.model.RangeData;

import de.intevation.flys.client.client.services.DistanceInfoService;
import de.intevation.flys.client.client.services.DistanceInfoServiceAsync;
import de.intevation.flys.client.client.Config;
import de.intevation.flys.client.client.ui.range.DistanceInfoDataSource;


/**
 * This UIProvider creates a widget to enter a single location (km).
 *
 * @author <a href="mailto:raimund.renkert@intevation.de">Raimund Renkert</a>
 */
public class SingleLocationPanel
extends      LocationPanel
implements   RecordClickHandler
{
    /** The DistanceInfoService used to retrieve locations about rivers. */
    protected DistanceInfoServiceAsync distanceInfoService =
        GWT.create(DistanceInfoService.class);

    /** The table data. */
    protected DistanceInfoObject[] tableData;

    /** The input helper (usually right side, table to click on, values are
     * then entered in the texfield. */
    protected LocationPicker picker;

    /**
     * Creates a new LocationDistancePanel instance.
     */
    public SingleLocationPanel() {
        picker = new LocationPicker(this);
    }


    /**
     * This method creates a widget that contains a label, a panel with
     * checkboxes to switch the input mode between location and distance input,
     * and a mode specific panel.
     *
     * @param data The data that might be inserted.
     *
     * @return a panel.
     */
    @Override
    public Canvas create(DataList data) {
        findDataItemName(data);

        VLayout layout = new VLayout();
        layout.setMembersMargin(10);

        Label label   = new Label(MSG.location ());
        Canvas widget = createWidget(data);
        Canvas submit = getNextButton();

        initDefaults(data);

        picker.createLocationTable();

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

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

        return layout;
    }


    /**
     * This method reads the default values defined in the DataItems of the Data
     * objects in <i>list</i>.
     *
     * @param list The DataList container that stores the Data objects.
     */
    protected void initDefaults(DataList list) {
        Data data = list.get(0);

        // Compatibility with MinMax- DataItems:
        RangeData rangeData = null;

        for (int i = 0, n = list.size(); i < n; i++) {
            Data tmp = list.get(i);

            if (tmp instanceof RangeData) {
                rangeData = (RangeData) tmp;
            }
        }

        if (rangeData != null) {
            min = Double.parseDouble(rangeData.getDefaultLower().toString());
            max = Double.parseDouble(rangeData.getDefaultUpper().toString());
            // catch ..?
        }
        else {
            DataItem[] items = data.getItems();
            DataItem   iMin  = getDataItem(items, "min");
            DataItem   iMax  = getDataItem(items, "max");
    
            try {
                min = Double.parseDouble(iMin.getStringValue());
                max = Double.parseDouble(iMax.getStringValue());
            }
            catch (NumberFormatException nfe) {
                SC.warn(MSG.error_read_minmax_values());
                min = -Double.MAX_VALUE;
                max = Double.MAX_VALUE;
            }
        }

        DataItem def = data.getDefault();
        if (def != null) {
            String value = def.getStringValue();

            try {
                double d = Double.parseDouble(value);
                setLocationValues(new double[] { d } );
            }
            catch (NumberFormatException nfe) {
                // could not parse, dont know what to do else
            }
        }
    }


    protected Canvas createWidget(DataList data) {
        VLayout layout = new VLayout();
        inputLayout    = new HLayout();

        // The initial view will display the location input mode.
        locationPanel = new DoubleArrayPanel(
            MSG.unitLocation(),
            getLocationValues(),
            new BlurHandler(){public void onBlur(BlurEvent be) {}});

        picker.getLocationTable().setAutoFetchData(true);

        inputLayout.addMember(locationPanel);

        layout.addMember(inputLayout);

        inputLayout.setMembersMargin(30);

        picker.prepareFilter();

        helperContainer.addMember(picker.getLocationTable());
        helperContainer.addMember(picker.getFilterLayout());
        helperContainer.addMember(picker.getResultCountForm());
        setPickerDataSource();
        return layout;
    }


    /**
     * This method returns the selected data.
     *
     * @return the selected/inserted data.
     */
    public Data[] getData() {
        saveLocationValues(locationPanel);
        double[] values = getLocationValues();
        Data[] data = new Data[values.length+1];

        for (int i = 0; i < values.length; i++) {
            data[i] = createDataArray(getDataItemName(),
                Double.valueOf(values[i]).toString());
        }
        data[values.length] = createDataArray("ld_mode", "locations");

        return data;
    }


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

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

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

        picker.getLocationTable().setDataSource(new DistanceInfoDataSource(
            url, river, "locations"));
    }


    /**
     * Callback when an item from the input helper was clicked.
     * Set the respective km-value in the location value field.
     * @param e event passed.
     */
    public void onRecordClick (RecordClickEvent e) {
        Record record = e.getRecord();
        double[] selected = new double[1];
        try {
            selected[0] =
                Double.parseDouble(record.getAttribute("from"));
        }
        catch(NumberFormatException nfe) {
            // Is there anything else to do here?
        }
        setLocationValues(selected);
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org