view flys-client/src/main/java/de/intevation/flys/client/client/ui/ParameterList.java @ 72:9b726350ab07

Moved ParameterList specific code into the ParameterList. flys-client/trunk@1575 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Sat, 26 Mar 2011 18:07:41 +0000
parents f793d35bfb08
children 39210a74db07
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.smartgwt.client.types.VerticalAlignment;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.VLayout;

import de.intevation.flys.client.shared.model.Artifact;
import de.intevation.flys.client.shared.model.ArtifactDescription;
import de.intevation.flys.client.shared.model.Data;
import de.intevation.flys.client.shared.model.DataList;
import de.intevation.flys.client.client.event.HasStepBackHandlers;
import de.intevation.flys.client.client.event.HasStepForwardHandlers;
import de.intevation.flys.client.client.event.ParameterChangeEvent;
import de.intevation.flys.client.client.event.ParameterChangeHandler;
import de.intevation.flys.client.client.event.StepBackEvent;
import de.intevation.flys.client.client.event.StepBackHandler;


public class ParameterList
extends      VLayout
implements   StepBackHandler, ParameterChangeHandler
{
    protected CollectionView cView;

    protected List<DataList> old;
    protected DataList   current;

    protected UIProvider uiProvider;

    protected VLayout oldItems;
    protected VLayout currentItems;

    public ParameterList(CollectionView cView) {
        this.cView   = cView;
        old          = new ArrayList<DataList>();
        oldItems     = new VLayout();
        currentItems = new VLayout();

        init();
    }


    protected void init() {
        setWidth(300);

        oldItems.setHeight(20);
        oldItems.setMembersMargin(10);
        currentItems.setHeight("*");
        currentItems.setAlign(VerticalAlignment.TOP);

        setMembersMargin(20);

        addMember(oldItems);
        addMember(currentItems);
    }


    protected void clearOldData() {
        old.clear();
    }


    public void addOldData(DataList old) {
        if (old != null) {
            this.old.add(old);
        }

        refreshOld();
    }


    public void addOldDatas(DataList[] old) {
        if (old != null && old.length > 0) {
            for (DataList o: old) {
                if (!exists(o)) {
                    GWT.log("Data '" + o.getLabel() + "' is new.");
                    addOldData(o);
                }
            }

            return;
        }

        addOldData(null);
    }


    public boolean exists(DataList data) {
        String stateName = data.getState();

        for (DataList o: old) {
            if (stateName.equals(o.getState())) {
                return true;
            }
        }

        return false;
    }


    public void setCurrentData(DataList current, UIProvider uiProvider) {
        this.current    = current;
        this.uiProvider = uiProvider;

        refreshCurrent();
    }


    public void refreshOld() {
        // XXX maybe we should not remove all items but just add the newest item
        // to the list.
        oldItems.removeMembers(oldItems.getMembers());

        for (DataList dataList: old) {
            HLayout h = new HLayout();
            h.setAlign(VerticalAlignment.TOP);
            h.setHeight(20);

            String     provider   = dataList.getUIProvider();
            UIProvider uiprovider = UIProviderFactory.getProvider(provider);
            ((HasStepBackHandlers) uiprovider).addStepBackHandler(cView);
            ((HasStepBackHandlers) uiprovider).addStepBackHandler(this);

            oldItems.addMember(uiprovider.createOld(dataList));
        }

        int minHeight = oldItems.getMinHeight();
        if (minHeight <= 20) {
            oldItems.setHeight(20);
        }
        else {
            oldItems.setHeight(minHeight);
        }
    }


    /**
     * This method refreshes the part displaying the data of the current state.
     * The UI is created using the UIProvider stored in the Data object.
     */
    public void refreshCurrent() {
        currentItems.removeMembers(currentItems.getMembers());

        if (current != null && uiProvider != null) {
            Canvas c = uiProvider.create(current);
            c.setLayoutAlign(VerticalAlignment.TOP);

            currentItems.addMember(c);
        }
    }


    /**
     * This method is used to remove all old items from this list after the user
     * has clicked the step back button.
     *
     * @param e The StepBackEvent.
     */
    public void onStepBack(StepBackEvent e) {
        old.clear();
        oldItems.removeMembers(oldItems.getMembers());
    }


    /**
     * Implements the onCollectionChange() method to do update the GUI after the
     * parameterization has changed.
     *
     * @param event The ParameterChangeEvent.
     */
    public void onParameterChange(ParameterChangeEvent event) {
        GWT.log("ParameterList.onParameterChange");

        Artifact art             = event.getNewValue();
        ArtifactDescription desc = art.getArtifactDescription();

        DataList currentData = desc.getCurrentData();
        if (currentData != null) {
            // the user has to enter some attributes
            String uiProvider   = currentData.getUIProvider();
            UIProvider provider = UIProviderFactory.getProvider(uiProvider);

            ((HasStepForwardHandlers) provider).addStepForwardHandler(cView);
            ((HasStepBackHandlers) provider).addStepBackHandler(cView);

            setCurrentData(currentData, provider);
        }
        else {
            // we have reached a final state with no more user input
            setCurrentData(null, null);
        }

        addOldDatas(desc.getOldData());
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org