view flys-client/src/main/java/de/intevation/flys/client/client/ui/DatacageTwinPanel.java @ 1266:ff012a9d9d1d

Employ waterlevelfactory when cloning artifacts for WDifferences-Subtrahend/Minuend-artifacts. flys-client/trunk@2805 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Felix Wolfsteller <felix.wolfsteller@intevation.de>
date Wed, 21 Sep 2011 14:37:51 +0000
parents 87b6a93db523
children 6ec804500621
line wrap: on
line source
package de.intevation.flys.client.client.ui;

import java.util.ArrayList;
import java.util.Map;
import java.util.List;
import java.util.Set;

import com.google.gwt.core.client.GWT;
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.layout.HLayout;
import com.smartgwt.client.widgets.layout.VLayout;
import com.smartgwt.client.widgets.grid.ListGrid;
import com.smartgwt.client.widgets.grid.ListGridField;
import com.smartgwt.client.widgets.grid.ListGridRecord;
import com.smartgwt.client.widgets.events.ClickEvent;

import de.intevation.flys.client.shared.model.Artifact;
import de.intevation.flys.client.shared.model.Collection;
import de.intevation.flys.client.shared.model.Data;
import de.intevation.flys.client.shared.model.DataItem;
import de.intevation.flys.client.shared.model.DefaultData;
import de.intevation.flys.client.shared.model.DefaultDataItem;
import de.intevation.flys.client.shared.model.DataList;
import de.intevation.flys.client.shared.model.User;

import de.intevation.flys.client.client.FLYSConstants;
import de.intevation.flys.client.client.event.StepForwardEvent;
import de.intevation.flys.client.shared.model.Recommendation;
import de.intevation.flys.client.shared.model.ToLoad;
import de.intevation.flys.client.shared.model.Recommendation.Facet;
import de.intevation.flys.client.shared.model.Recommendation.Filter;

import de.intevation.flys.client.client.services.LoadArtifactService;
import de.intevation.flys.client.client.services.LoadArtifactServiceAsync;
import de.intevation.flys.client.client.Config;

// TODO Probably better to branch off AbstractUIProvider.
// TODO Merge with other datacage-widget impls.
/**
 * Panel containing a Grid and a "next" button. The Grid is fed by a
 * DatacagePairWidget which is put in the input-helper area.
 */
public class DatacageTwinPanel
extends      TextProvider {

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

    protected String dataName;

    protected User user;

    protected ToLoad toLoad1;

    protected ToLoad toLoad2;

    protected ListGrid differencesList;

    LoadArtifactServiceAsync loadArtifactService = GWT.create(
            de.intevation.flys.client.client.services.LoadArtifactService.class);


    public DatacageTwinPanel(User user) {
        super();
        this.user = user;
    }


    @Override
    public Canvas create(DataList dataList) {
        GWT.log("createData()");
        Data   data   = dataList.get(0);
        this.dataName = data.getLabel();

        // TODO use i18n of data.
        Canvas label  = new Label("Subtrahend/Minuend");//data.getDescription());
        Canvas widget = createWidget();
        Canvas submit = getNextButton();

        VLayout layout = new VLayout();
        HLayout helperLayout = new HLayout();
        label.setHeight(50);
        helperLayout.addMember(new DatacagePairWidget(this.artifact,
            user, "longitudinal_section", differencesList));

        /*layout.addMember(label);*/
        layout.addMember(widget);
        layout.addMember(submit);
        layout.setMembersMargin(10);
        this.helperContainer.addMember(helperLayout);

        return layout;
    }


    @Override
    public List<String> validate() {
        List<String> errors = new ArrayList<String>();
        if (differencesList.getRecords().length == 0) {
            // TODO i18n of error message. (MSG.no_waterlevel_pair_selected())
            errors.add("No pair of waterlevel items selected");
        }

        return errors;
    }


    public Canvas createWidget() {
        VLayout layout = new VLayout();

        differencesList = new ListGrid();  
        differencesList.setHeight(150);  
        differencesList.setShowAllRecords(true);  
        differencesList.setCanEdit(false);  

        ListGridField nameField    = new ListGridField("first", "Minuend");  
        ListGridField capitalField = new ListGridField("second", "Subtrahend");  
        ListGridField removeField  = new ListGridField("remove", "Remove");  
        differencesList.setFields(new ListGridField[] {nameField,
           capitalField, removeField});

        layout.addMember(differencesList);

        return layout;
    }


    @Override
    public void onClick(ClickEvent e) {
        /*
        TODO: Validation/Error
        List<String> errors = validate();
        if (errors == null || errors.isEmpty()) {
        ...
        else {showErrors(errors);}

         * */
        GWT.log("DatacageTwinPanel.onClick");
        Config config = Config.getInstance();
        ListGridRecord[] records = differencesList.getRecords();
        ArrayList<Recommendation> ar = new ArrayList<Recommendation>();
        for (ListGridRecord record : records) {
            DatacagePairWidget.RecommendationPairRecord r =
                (DatacagePairWidget.RecommendationPairRecord) record;
            ar.add(r.getFirst());
            ar.add(r.getSecond());
        }

        final Recommendation[] rs = ar.toArray(new Recommendation[ar.size()]);
        loadArtifactService.loadMany(
              this.collection,
              rs,
              "waterlevel",
              config.getServerUrl(),
              config.getLocale(),
              new AsyncCallback<Artifact[]>() {
                public void onFailure(Throwable caught) {
                    GWT.log("Failure of cloning with waterlevelfactory!");
                }
                public void onSuccess(Artifact[] artifacts) {
                    GWT.log("Success in cloning with watelevelfactory!");

                    fireStepForwardEvent(new StepForwardEvent(
                        getData(rs, artifacts)));
                } }
                );
    }


    protected Data[] getData(Recommendation[] rs, Artifact[] newArtifacts) {
        // Construct string with info about selections.
        String dataItemString = "";
        for (int i = 0; i < rs.length; i++) {
            Recommendation r = rs[i];
            Artifact newArtifact = newArtifacts[i];
            String uuid = newArtifact.getUuid();
            r.setMasterArtifact(uuid);
            if (i>0) dataItemString += "#";
    
            dataItemString += createDataString(uuid, r.getFilter());
        }
        DataItem item = new DefaultDataItem(dataName, dataName, dataItemString);
        return new Data[] { new DefaultData(
            dataName, null, null, new DataItem[] {item}) };
    }


    protected String createDataString(String artifact, Filter filter) {
        Facet f = null;

        Map<String, List<Facet>>               outs = filter.getOuts();
        Set<Map.Entry<String, List<Facet>>> entries = outs.entrySet();

        for (Map.Entry<String, List<Facet>> entry: entries) {
            List<Facet> fs = entry.getValue();

            f = fs.get(0);
            if (f != null) {
                break;
            }
        }

        return "[" + artifact + ";" + f.getName() + ";" + f.getIndex() + "]";
    }

    /*@Override
    protected Data[] getData() {
        // TODO ToLoadRecord ! 
        String value = "TODO:FIND VALUE";
        if (toLoad1 != null) {
            List<Recommendation> recommendations = toLoad1.toRecommendations();
            value = recommendations.get(0).getIDs();
        }
        DataItem item1 = new DefaultDataItem(dataName, dataName, value);
        DataItem item2 = new DefaultDataItem(dataName, dataName, value);
        return new Data[] { new DefaultData(
            dataName, null, null, new DataItem[] { item1, item2}) };
    }*/
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org