view flys-client/src/main/java/de/intevation/flys/client/client/ui/CollectionView.java @ 30:5709bd8f4d7c

Added a new widget that combines the module and the river selection. Users can now choose the desired plugin and river in one step. flys-client/trunk@1433 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Wed, 09 Mar 2011 09:41:45 +0000
parents c19985f75118
children 88c530c25968
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.i18n.client.DateTimeFormat;
import com.google.gwt.user.client.rpc.AsyncCallback;

import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.IButton;
import com.smartgwt.client.widgets.Window;
import com.smartgwt.client.widgets.events.ClickEvent;
import com.smartgwt.client.widgets.events.ClickHandler;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.RadioGroupItem;
import com.smartgwt.client.widgets.layout.Layout;
import com.smartgwt.client.widgets.layout.VLayout;
import com.smartgwt.client.widgets.tab.Tab;
import com.smartgwt.client.widgets.tab.TabSet;

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.DefaultData;
import de.intevation.flys.client.shared.model.DefaultDataItem;
import de.intevation.flys.client.shared.model.DefaultCollection;
import de.intevation.flys.client.shared.model.River;

import de.intevation.flys.client.client.Config;
import de.intevation.flys.client.client.FLYS;
import de.intevation.flys.client.client.FLYSMessages;
import de.intevation.flys.client.client.event.HasCollectionChangeHandlers;
import de.intevation.flys.client.client.event.HasStepForwardHandlers;
import de.intevation.flys.client.client.event.CollectionChangeEvent;
import de.intevation.flys.client.client.event.StepForwardEvent;
import de.intevation.flys.client.client.event.StepForwardHandler;
import de.intevation.flys.client.client.event.CollectionChangeHandler;
import de.intevation.flys.client.client.services.ArtifactService;
import de.intevation.flys.client.client.services.ArtifactServiceAsync;
import de.intevation.flys.client.client.services.CreateCollectionService;
import de.intevation.flys.client.client.services.CreateCollectionServiceAsync;
import de.intevation.flys.client.client.ui.ModuleSelection;


/**
 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
 */
public class CollectionView
extends      Window
implements   CollectionChangeHandler, HasCollectionChangeHandlers,
             StepForwardHandler
{
    /** The ArtifactService used to communicate with the Artifact server. */
    protected ArtifactServiceAsync artifactService =
        GWT.create(ArtifactService.class);

    /** The ArtifactService used to communicate with the Artifact server. */
    protected CreateCollectionServiceAsync createCollectionService =
        GWT.create(CreateCollectionService.class);

    /** The message class that provides i18n strings.*/
    FLYSMessages messages = GWT.create(FLYSMessages.class);

    /** The FLYS instance used to call services.*/
    protected FLYS flys;

    /** The ParameterList.*/
    protected ParameterList parameterList;

    /** The list of ValueChangeHandlers.*/
    protected List<CollectionChangeHandler> handlers;

    /** The collection to be displayed.*/
    protected Collection collection;

    /** The artifact that handles the parameterization.*/
    protected Artifact artifact;

    protected TabSet tabs;

    /** The parameter tab.*/
    protected Tab parameterTab;

    /** The output tab.*/
    protected Tab outputTab;

    /** The layout.*/
    protected Layout layout;


    /**
     * This constructor creates a new CollectionView that is used to display the
     * <i>collection</i>.
     *
     * @param collection The collection to be displayed.
     */
    public CollectionView(FLYS flys, Collection collection) {
        this.flys       = flys;
        this.collection = collection;

        this.tabs          = new TabSet();
        this.parameterTab  = new Tab(messages.winfo());
        this.parameterList = new ParameterList();
        this.handlers      = new ArrayList<CollectionChangeHandler>();
        this.layout        = new VLayout();

        addCollectionChangeHandler(this);

        init();
    }


    /**
     * This method handles the initial layout stuff.
     */
    protected void init() {
        setWidth(600);
        setHeight(400);

        layout.setWidth100();

        setCanDragResize(true);

        DateTimeFormat dtf = DateTimeFormat.getFormat(messages.date_format());
        String lastAccess  = dtf.format(collection.getLastAccess());
        setTitle(lastAccess + " - " + collection.getName());

        addItem(layout);

        layout.addMember(tabs);
        tabs.addTab(parameterTab);

        if (isNew()) {
            tabs.setTabTitle(0, "MODUL");
            tabs.updateTab(0, renderNew());
        }
    }


    /**
     * This method triggers the CreateCollectionService to create a new
     * collection in the artifact server.
     *
     * @param ownerId The uuid of the user that should own the new collection.
     */
    protected void createNewCollection(String ownerId) {
        Config config    = Config.getInstance();
        String serverUrl = config.getServerUrl();

        createCollectionService.create(
            serverUrl, ownerId,
            new AsyncCallback<String>() {
                public void onFailure(Throwable caught) {
                    GWT.log("Could not create the new collection.");
                    GWT.log(caught.getMessage());
                }

                public void onSuccess(String uuid) {
                    GWT.log("Successfully created a new collection.");
                    GWT.log("NEW collection uuid: " + uuid);
                }
            });
    }


    protected FLYS getFlys() {
        return flys;
    }



    /**
     * This method registers a new ValueChangeHandler.
     *
     * @param handler The new ValueChangeHandler.
     */
    public void addCollectionChangeHandler(CollectionChangeHandler handler) {
        if (handler != null) {
            handlers.add(handler);
        }
    }


    /**
     * This method calls the <code>onValueChange()</code> method of all
     * registered ValueChangeHanders.
     */
    protected void fireCollectionChangeEvent(
        Collection old, Collection newCol)
    {
        for (CollectionChangeHandler handler: handlers) {
            handler.onCollectionChange(new CollectionChangeEvent(old, newCol));
        }
    }


    /**
     * This method returns true, if the Collection is new and no plugins has
     * been chosen.
     *
     * @return true, if the Collection is new.
     */
    public boolean isNew() {
        return collection.getArtifactLength() == 0 ? true : false;
    }


    /**
     * This method creates a Canvas displaying the plugins of FLYS combined with
     * a widget to select a river.
     *
     * @return a Canvas that displays the supported plugins and rivers of FLYS.
     */
    protected Canvas renderNew() {
        River[] rivers   = flys.getRivers();
        DataItem[] items = new DataItem[rivers.length];

        int i = 0;
        for (River river: rivers) {
            String name = river.getName();
            items[i++]  = new DefaultDataItem(name, null, name);
        }

        Data data = new DefaultData(
            "RIVER", "RIVER SELECTION", null, items, null);

        ModuleSelection widget         = new ModuleSelection();
        HasStepForwardHandlers handler = (HasStepForwardHandlers) widget;

        handler.addStepForwardHandler(new StepForwardHandler() {
            public void onStepForward(StepForwardEvent event) {
                Data[] data = event.getData();

                DataItem[] moduleItems = data[0].getItems();
                DataItem[] riversItems = data[1].getItems();

                String module = moduleItems[0].getStringValue();
                String river  = riversItems[0].getStringValue();

                String serverUrl = Config.getInstance().getServerUrl();
                artifactService.create(
                    serverUrl, module.toLowerCase(),
                    new AsyncCallback<Artifact>() {
                        public void onFailure(Throwable caught) {
                            GWT.log("Could not create the new artifact.");
                            GWT.log(caught.getMessage());
                        }

                        public void onSuccess(Artifact artifact) {
                            GWT.log("Successfully created a new artifact.");
                            setArtifact(artifact);

                            GWT.log("TODO: FEED WITH RIVER!");
                        }
                });
            }
        });

        return widget.create(data);
    }


    /**
     * Set the current artifact that is the master of the parameterization.
     *
     * @param artifact The new artifact.
     */
    protected void setArtifact(Artifact artifact) {
        this.artifact = artifact;
    }


    /**
     * Set the current collection.
     *
     * @param collection The new collection.
     */
    protected void setCollection(Collection collection) {
        Collection tmp  = this.collection;
        this.collection = collection;

        fireCollectionChangeEvent(tmp, this.collection);
    }


    public void onCollectionChange(CollectionChangeEvent event) {
        updateView();
    }


    public void onStepForward(StepForwardEvent event) {
        GWT.log("CollectionView - onStepForward()");
        GWT.log("TODO: IMPLEMENT FEED!");
    }


    /**
     * Update the view (refresh the list of old and current data).
     */
    protected void updateView() {
        GWT.log("Update view of the collection: " + collection.identifier());
        Artifact artifact        = collection.getArtifact(0);
        ArtifactDescription desc = artifact.getArtifactDescription();

        Data currentData = desc.getCurrentData();
        if (currentData != null) {
            String uiProvider   = currentData.getUIProvider();
            UIProvider provider = UIProviderFactory.getProvider(uiProvider);

            HasStepForwardHandlers handler = (HasStepForwardHandlers) provider;
            handler.addStepForwardHandler(this);

            parameterList.setCurrentData(currentData, provider);
        }

        parameterList.addOldDatas(desc.getOldData());

        tabs.setTabTitle(0, messages.winfo());
        tabs.updateTab(0, parameterList);
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org