view flys-client/src/main/java/de/intevation/flys/client/client/ui/WQSimpleArrayPanel.java @ 3847:f3b821735e39

Calculate the info url via i18n Don't fetch the info url from the artifact service and use i18n to calculate the url by using the official gauge and river number. flys-client/trunk@5582 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Bjoern Ricks <bjoern.ricks@intevation.de>
date Mon, 24 Sep 2012 08:39:22 +0000
parents 070321cf17e1
children 1cdbd8a0c994
line wrap: on
line source
package de.intevation.flys.client.client.ui;

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

import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.user.client.rpc.AsyncCallback;

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.RadioGroupItem;
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.layout.HLayout;
import com.smartgwt.client.widgets.layout.VLayout;
import com.smartgwt.client.widgets.tab.TabSet;
import com.smartgwt.client.widgets.tab.Tab;

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 de.intevation.flys.client.shared.model.DoubleArrayData;
import de.intevation.flys.client.shared.model.Gauge;
import de.intevation.flys.client.shared.model.IntegerOptionsData;
import de.intevation.flys.client.shared.model.WQInfoRecord;
import de.intevation.flys.client.shared.model.WQInfoObject;

import de.intevation.flys.client.client.Config;
import de.intevation.flys.client.client.FLYSConstants;
import de.intevation.flys.client.client.services.GaugeInfoService;
import de.intevation.flys.client.client.services.GaugeInfoServiceAsync;
import de.intevation.flys.client.client.services.WQInfoService;
import de.intevation.flys.client.client.services.WQInfoServiceAsync;
import de.intevation.flys.client.client.ui.wq.WTable;
import de.intevation.flys.client.client.ui.wq.QDTable;


/**
 * An UIProvider for inserting a mode for W or Q and an array of values for each
 * mode.
 *
 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
 */
public class WQSimpleArrayPanel
extends      AbstractUIProvider
implements   BlurHandler
{
    public static final String FIELD_MODE   = "field_mode";
    public static final String FIELD_VALUES = "field_values";

    public static final int MODE_W = 0;

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

    protected GaugeInfoServiceAsync gaugeService =
        GWT.create(GaugeInfoService.class);

    protected WQInfoServiceAsync wqInfoService =
        GWT.create(WQInfoService.class);

    protected String modeName;
    protected String valuesName;

    protected Canvas valuesWrapper;

    protected DynamicForm      modeForm;
    protected DoubleArrayPanel panelW;
    protected DoubleArrayPanel panelQ;

    protected WTable wTable;
    protected QDTable qTable;


    @Override
    public Canvas create(DataList data) {
        VLayout rootLayout = new VLayout();
        rootLayout.addMember(createLabel(data));
        rootLayout.addMember(createModeForm(data));
        rootLayout.addMember(createValuesForm(data));
        rootLayout.addMember(getNextButton());

        initializeMode(data);
        initializeTables();
        initializeHelperPanel();

        return rootLayout;
    }


    @Override
    public Canvas createOld(DataList dataList) {
        IntegerOptionsData modeData   = findOptionsData(dataList);
        DoubleArrayData    valuesData = findValuesData(dataList);

        DataItem[] modeItems   = modeData.getItems();
        DataItem[] valuesItems = valuesData.getItems();

        HLayout layout         = new HLayout();
        VLayout valueContainer = new VLayout();

        Label label = new Label(dataList.getLabel());
        label.setWidth(200);
        label.setHeight(20);

        Label mode = new Label(modeItems[0].getLabel());
        mode.setHeight(20);
        mode.setWidth(150);

        Canvas values = createOldValues(modeData, valuesData);
        values.setWidth(150);

        valueContainer.addMember(mode);
        valueContainer.addMember(values);

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

        return layout;
    }


    @Override
    protected Data[] getData() {
        Data mode = getModeAsData();

        if (getMode() == MODE_W) {
            return new Data[] { mode, getWValuesAsData() };
        }
        else {
            return new Data[] { mode, getQValuesAsData() };
        }
    }


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

        // TODO IMPLEMENT ME

        return errors;
    }


    @Override
    public void onBlur(BlurEvent event) {
        // TODO TRIGGER VALIDATION HERE
    }


    protected void initializeMode(DataList dataList) {
        IntegerOptionsData data  = findOptionsData(dataList);
        DataItem[]         items = data != null ? data.getItems() : null;

        if (items != null) {
            String value = items[0].getStringValue();
            modeForm.setValue(modeName, value);
            switchMode(value);
        }
    }


    protected void initializeTables() {
        wTable = new WTable();
        qTable = new QDTable();

        fetchWQData();
    }


    protected void initializeHelperPanel() {
        TabSet tabs = new TabSet();
        tabs.setWidth100();
        tabs.setHeight100();

        Tab w = new Tab(MSG.wq_table_w());
        Tab q = new Tab(MSG.wq_table_q());

        w.setPane(wTable);
        q.setPane(qTable);

        tabs.addTab(w, 0);
        tabs.addTab(q, 1);

        helperContainer.addMember(tabs);
    }


    protected void fetchWQData() {
        ArtifactDescription desc = artifact.getArtifactDescription();
        DataList[]          data = desc.getOldData();

        final String river    = desc.getRiver();
        final String refGauge = desc.getReferenceGauge();

        gaugeService.getGaugeInfo(river, refGauge, new AsyncCallback<List<Gauge>>() {
            public void onFailure(Throwable throwable) {
                GWT.log("ERROR WHILE FETCHING GAUGES!");
            }

            public void onSuccess(List<Gauge> gauges) {
                Gauge g = gauges.get(0);
                updateWQData(river, g.getLower(), g.getUpper());
            }
        });
    }


    protected void updateWQData(String river, double lower, double upper) {
        GWT.log("FETCH WQ INFO FOR " + lower + " - " + upper + " now!");

        Config config = Config.getInstance();
        String locale = config.getLocale();

        wqInfoService.getWQInfo(locale, river, lower, upper,
            new AsyncCallback<WQInfoObject[]>() {
                public void onFailure(Throwable caught) {
                    GWT.log("Could not recieve wq informations.");
                }

                public void onSuccess(WQInfoObject[] wqi) {
                    int num = wqi != null ? wqi.length :0;
                    GWT.log("Recieved " + num + " wq informations.");

                    if (num == 0) {
                        return;
                    }

                    addWQInfo(wqi);
                }
            }
        );
    }


    protected void addWQInfo (WQInfoObject[] wqi) {
        for(WQInfoObject wi: wqi) {
            WQInfoRecord rec = new WQInfoRecord(wi);

            if (wi.getType().equals("W")) {
                wTable.addData(rec);
            }
            else {
                qTable.addData(rec);
            }
        }
    }


    protected Canvas createLabel(DataList dataList) {
        Label label = new Label(MSG.wqHistorical());
        label.setWidth100();
        label.setHeight(25);

        return label;
    }


    protected Canvas createOldValues(
        IntegerOptionsData modeData,
        DoubleArrayData valuesData
    ) {
        NumberFormat nf = NumberFormat.getDecimalFormat();

        DataItem[] items = modeData.getItems();
        String     unit  = items[0].getStringValue().equals("0") ? "cm" : "q³/s";

        VLayout layout = new VLayout();

        for (double val: valuesData.getValues()) {
            Label tmp = new Label(nf.format(val) + " " + unit);
            tmp.setHeight(20);
            layout.addMember(tmp);
        }

        return layout;
    }


    protected DoubleArrayData findValuesData(DataList dataList) {
        DoubleArrayData data = null;

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

            if (tmp instanceof DoubleArrayData) {
                return (DoubleArrayData) tmp;
            }
        }

        return null;
    }


    protected IntegerOptionsData findOptionsData(DataList dataList) {
        IntegerOptionsData data = null;

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

            if (tmp instanceof IntegerOptionsData) {
                return (IntegerOptionsData) tmp;
            }
        }

        return null;
    }


    protected Canvas createModeForm(DataList dataList) {
        IntegerOptionsData data = findOptionsData(dataList);
        DataItem[]         opts = data != null ? data.getItems() : null;

        if (data == null || opts == null) {
            return new Label("NO MODES FOUND");
        }

        modeName = data.getLabel();
        modeForm = new DynamicForm();

        RadioGroupItem items = new RadioGroupItem(data.getLabel());
        LinkedHashMap values = new LinkedHashMap();

        for (DataItem opt: opts) {
            values.put(opt.getStringValue(), opt.getLabel());
        }

        items.setValueMap(values);
        items.setVertical(false);
        items.setShowTitle(false);
        items.addChangedHandler(new ChangedHandler() {
            @Override
            public void onChanged(ChangedEvent event) {
                switchMode((String) event.getValue());
            }
        });

        modeForm.setFields(items);

        return modeForm;
    }


    protected Canvas createValuesForm(DataList dataList) {
        DoubleArrayData data = findValuesData(dataList);

        if (data == null) {
            return new Label("NO VALUES GIVEN!");
        }

        valuesName = data.getLabel();
        panelW     = new DoubleArrayPanel(MSG.unitWSingle(), null, this);
        panelQ     = new DoubleArrayPanel(MSG.unitQSingle(), null, this);

        valuesWrapper = new Canvas();
        valuesWrapper.setWidth100();
        valuesWrapper.setHeight(35);

        return valuesWrapper;
    }


    public void switchMode(String newMode) {
        for (Canvas child: valuesWrapper.getChildren()) {
            valuesWrapper.removeChild(child);
        }

        if (newMode.equals("0")) {
            valuesWrapper.addChild(panelW);
        }
        else if (newMode.equals("1")) {
            valuesWrapper.addChild(panelQ);
        }
    }


    public String getModeAsString() {
        return (String) modeForm.getValue(modeName);
    }


    public int getMode() {
        String modeValue = getModeAsString();

        try {
            return Integer.valueOf(modeValue);
        }
        catch (NumberFormatException nfe) {
            // do something
        }
        catch (NullPointerException npe) {
            // do something
        }

        return -1;
    }


    public Data getModeAsData() {
        String  value = getModeAsString();
        DataItem item = new DefaultDataItem(value, value, value);

        return new DefaultData(modeName, null, null, new DataItem[] { item });
    }


    public Data getWValuesAsData() {
        double[] values = panelW.getInputValues();
        String valueStr = getStringValue(values);

        DataItem item = new DefaultDataItem(valueStr, valueStr, valueStr);

        return new DefaultData(valuesName, null, null, new DataItem[] { item });
    }


    public Data getQValuesAsData() {
        double[] values = panelQ.getInputValues();
        String valueStr = getStringValue(values);

        DataItem item = new DefaultDataItem(valueStr, valueStr, valueStr);

        return new DefaultData(valuesName, null, null, new DataItem[] { item });
    }


    protected static String getStringValue(double[] values) {
        StringBuilder sb = new StringBuilder();
        boolean    first = true;

        for (double value: values) {
            if (first) {
                sb.append(String.valueOf(value));
                first = false;
            }
            else {
                sb.append(";" + String.valueOf(value));
            }
        }

        return sb.toString();
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org