view flys-client/src/main/java/de/intevation/flys/client/client/ui/DatacageWindow.java @ 911:4668357b255e

#259 Refresh charts after loading new Themes / Artifacts from Datacage. flys-client/trunk@2768 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Thu, 15 Sep 2011 17:01:12 +0000
parents 7f72239e56c8
children 07aa1f504491
line wrap: on
line source
package de.intevation.flys.client.client.ui;

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

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

import com.smartgwt.client.util.SC;
import com.smartgwt.client.widgets.Window;

import de.intevation.flys.client.client.Config;
import de.intevation.flys.client.client.FLYSConstants;

import de.intevation.flys.client.client.event.DatacageHandler;
import de.intevation.flys.client.client.event.HasRedrawRequestHandlers;
import de.intevation.flys.client.client.event.RedrawRequestHandler;
import de.intevation.flys.client.client.event.RedrawRequestEvent;
import de.intevation.flys.client.client.event.RedrawRequestEvent.Type;

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

import de.intevation.flys.client.shared.model.Artifact;
import de.intevation.flys.client.shared.model.ArtifactDescription;
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.DataList;
import de.intevation.flys.client.shared.model.ToLoad;
import de.intevation.flys.client.shared.model.User;
import de.intevation.flys.client.shared.model.Recommendation;


public class DatacageWindow
extends      Window
implements   DatacageHandler, HasRedrawRequestHandlers
{
    protected FLYSConstants messages =
        GWT.create(FLYSConstants.class);

    protected LoadArtifactServiceAsync loadService =
        GWT.create(LoadArtifactService.class);

    protected CollectionView view;

    protected List<RedrawRequestHandler> handlers;

    protected int inProgress;


    public DatacageWindow(
        Artifact       artifact, 
        User           user,
        String         outs,
        CollectionView view
    ) {
        this.view       = view;
        this.handlers   = new ArrayList<RedrawRequestHandler>();
        this.inProgress = 0;

        setWidth(400);
        setHeight(500);

        DatacageWidget dw = new DatacageWidget(artifact, user, outs);
        dw.addDatacageHandler(this);

        addItem(dw);

        String river =  findRiver(artifact);
        // TODO: i18n
        setTitle("Datenkorb: " + river);
        setShowMinimizeButton(false);
        setIsModal(true);
        setShowModalMask(true);
        setCanDragResize(true);

        centerInPage();
    }


    @Override
    public void toLoad(ToLoad toLoad) {
        destroy();
        List<Recommendation> recs = toLoad.toRecommendations();
        loadArtifacts(recs.toArray(new Recommendation[recs.size()]));
    }


    @Override
    public void addRedrawRequestHandler(RedrawRequestHandler handler) {
        if (handler != null) {
            handlers.add(handler);
        }
    }


    protected String findRiver(Artifact artifact) {
        ArtifactDescription adescr = artifact.getArtifactDescription();
        DataList [] data = adescr.getOldData();

        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")) {
                    for (int j = dl.size()-1; j >= 0; --j) {
                        Data d = dl.get(j);
                        DataItem [] di = d.getItems();
                        if (di != null && di.length == 1) {
                           return d.getItems()[0].getStringValue();
                        }
                    }
                }
            }
        }

        return "";
    }


    protected void decreateInProgress() {
        if (this.inProgress > 0) {
            this.inProgress--;
        }

        if (this.inProgress == 0) {
            fireRedrawRequest();
        }
    }


    protected void fireRedrawRequest() {
        RedrawRequestEvent evt = new RedrawRequestEvent(Type.DEFAULT);

        for (RedrawRequestHandler handler: handlers) {
            handler.onRedrawRequest(evt);
        }
    }


    protected void loadArtifacts(Recommendation[] recommendations) {
        Config cfg = Config.getInstance();

        final Collection collection     = view.getCollection();
        final Artifact   masterArtifact = view.getArtifact();
        final String     serverUrl      = cfg.getServerUrl();
        final String     locale         = cfg.getLocale();

        this.inProgress = recommendations.length;

        for (final Recommendation recommendation: recommendations) {
            // XXX: UGLY! If no reference artifact given use uuid of
            //      current artifact as reference.
            if (recommendation.getMasterArtifact() == null) {
                recommendation.setMasterArtifact(masterArtifact.getUuid());
            }

            final String factory = recommendation.getFactory();

            GWT.log("Load new artifact with factory: " + factory);

            loadService.load(
                collection,
                recommendation,
                factory,
                serverUrl,
                locale,
                new AsyncCallback<Artifact>() {
                    public void onFailure(Throwable caught) {
                        decreateInProgress();
                        SC.warn(caught.getMessage());
                    }

                    public void onSuccess(Artifact artifact) {
                        decreateInProgress();
                        GWT.log("Created new artifact: " + artifact.getUuid());
                    }
            });
        }
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org