view gwt-client/src/main/java/org/dive4elements/river/client/client/ui/LinkSelection.java @ 5928:34392dc16546

Implemented interaction design in project startup page.
author Raimund Renkert <rrenkert@intevation.de>
date Wed, 08 May 2013 16:34:45 +0200
parents 172338b1407f
children 5de1b9faebf5
line wrap: on
line source
/* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde
 * Software engineering by Intevation GmbH
 *
 * This file is Free Software under the GNU AGPL (>=v3) 
 * and comes with ABSOLUTELY NO WARRANTY! Check out the
 * documentation coming with Dive4Elements River for details. 
 */

package org.dive4elements.river.client.client.ui;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

import com.google.gwt.core.client.GWT;

import com.smartgwt.client.types.VerticalAlignment;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.HTMLPane;
import com.smartgwt.client.widgets.Img;
import com.smartgwt.client.widgets.Label;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.LinkItem;
import com.smartgwt.client.widgets.form.fields.events.ClickEvent;
import com.smartgwt.client.widgets.form.fields.events.ClickHandler;
import com.smartgwt.client.widgets.form.fields.events.ItemHoverEvent;
import com.smartgwt.client.widgets.form.fields.events.ItemHoverHandler;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.VLayout;

import org.dive4elements.river.client.client.FLYSConstants;
import org.dive4elements.river.client.client.event.StepForwardEvent;
import org.dive4elements.river.client.shared.model.Data;
import org.dive4elements.river.client.shared.model.DataItem;
import org.dive4elements.river.client.shared.model.DataList;
import org.dive4elements.river.client.shared.model.DefaultData;
import org.dive4elements.river.client.shared.model.DefaultDataItem;


/**
 * This UIProvider displays the DataItems of the Data object in a list of links.
 *
 * @author <a href="mailto:raimund.renkert@intevation.de">Raimund Renkert</a>
 */
public class LinkSelection
extends      MapSelection
{

    private static final long serialVersionUID = -7138270638349711024L;

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

    /** The selected river*/
    protected Data river;
    private static Map<String, LinkItem> rivers;

    private static Trigger trigger;

    private Canvas module;

    private class Trigger {

        private LinkSelection ls;

        public Trigger(LinkSelection ls) {
            this.ls = ls;
            // TODO Auto-generated constructor stub
        }

        public void trigger(String name) {
            DataItem item = new DefaultDataItem(
                name,
                null,
                name);

            river = new DefaultData(
                "river",
                null,
                null,
                new DataItem [] {item});
            this.ls.fireStepForwardEvent (new StepForwardEvent (getData()));
        }
    }

    /**
     * This method currently returns a
     * {@link com.smartgwt.client.widgets.form.DynamicForm} that contains all
     * data items in a list of links stored in <i>data</i>.
     *
     * @param data The {@link Data} object.
     *
     * @return a combobox.
     */
    @Override
    public Canvas create(DataList data) {
        trigger = new Trigger(this);
        createCallback();
        rivers = new HashMap<String, LinkItem>();

        VLayout v = new VLayout();
        v.setMembersMargin(10);
        v.setAlign(VerticalAlignment.TOP);
        if (data.getState() == null) {
            module = super.createWidget(data);
            v.addMember(module);
        }
        else {
            module = null;
        }
        Canvas content = createWidget(data);
        v.addMember(content);

        return v;
    }


    @Override
    public Canvas createOld(DataList dataList) {
        HLayout layout  = new HLayout();
        VLayout vLayout = new VLayout();
        layout.setWidth("400px");

        Label label = new Label(dataList.getLabel());
        label.setWidth("200px");

        int size = dataList.size();
        for (int i = 0; i < size; i++) {
            Data data        = dataList.get(i);
            DataItem[] items = data.getItems();

            for (DataItem item: items) {
                HLayout hLayout = new HLayout();

                hLayout.addMember(label);
                hLayout.addMember(new Label(item.getLabel()));

                vLayout.addMember(hLayout);
                vLayout.setWidth("130px");
            }
        }

        Canvas back = getBackButton(dataList.getState());

        layout.addMember(label);
        layout.addMember(vLayout);
        layout.addMember(back);

        return layout;
    }


    /**
     * This method creates the content of the widget.
     *
     * @param data The {@link Data} object.
     *
     * @return a list of links
     */
    @Override
    protected Canvas createWidget(DataList data) {
        GWT.log("LinkSelection - create()");

        VLayout layout   = new VLayout();
        layout.setAlign(VerticalAlignment.TOP);
        layout.setHeight(25);
        HLayout colums = new HLayout();
        VLayout formLayout1 = new VLayout();
        VLayout formLayout2 = new VLayout();

        formLayout1.setLayoutLeftMargin(60);

        int size = data.size();

        for (int i = 0; i < size; i++) {
            Data d = data.get(i);

            Label label = new Label(d.getDescription());
            label.setValign(VerticalAlignment.TOP);
            label.setHeight(20);
            label.setWidth(400);
            LinkedHashMap<String, String> it = new LinkedHashMap<String, String>();
            boolean  defaultSet = false;
            boolean  first      = true;
            DataItem def      = d.getDefault();
            String   defValue = def != null ? def.getStringValue() : null;

            if (defValue != null && defValue.length() > 0) {
                defaultSet = true;
            }

            int counter = 0;
            for (DataItem item: d.getItems()) {
                LinkItem link = new LinkItem("river");
                link.setLinkTitle(item.getLabel());
                link.setTarget(item.getStringValue());
                link.setShowTitle(false);
                DynamicForm f = new DynamicForm();
                rivers.put(item.getStringValue(), link);

                f.setItems(link);
                if (counter < d.getItems().length/2) {
                    formLayout1.addMember(f);
                }
                else {
                    formLayout2.addMember(f);
                }
                counter++;

                link.addClickHandler(new ClickHandler() {
                    @Override
                    public void onClick(ClickEvent event) {
                        DataItem item = new DefaultDataItem(
                            ((LinkItem)event.getItem()).getLinkTitle(),
                            null,
                            ((LinkItem)event.getItem()).getLinkTitle());

                            river = new DefaultData(
                                "river",
                                null,
                                null,
                                new DataItem [] {item});
                        fireStepForwardEvent (new StepForwardEvent (getData()));
                    }
                });
                link.addItemHoverHandler(new ItemHoverHandler() {
                    @Override
                    public void onItemHover(ItemHoverEvent event) {
                        String river = ((LinkItem)event.getItem()).getLinkTitle();
                        for (String s : rivers.keySet()) {
                            LinkItem item = rivers.get(s);
                            if (item.getLinkTitle().equals(river)) {
                                item.setCellStyle("riverLinkHighlight");
                            }
                            else {
                                item.setCellStyle("formCell");
                                callUnHighlightRiver(s);
                            }
                        }
                        callHighlightRiver(river);
                    }
                });
            }

            if (module != null) {
                getModuleSelection().setRivers(rivers);
            }
            label.setWidth(50);

            layout.addMember(label);
            colums.addMember(formLayout1);
            colums.addMember(formLayout2);
            layout.addMember(colums);

        }
        layout.addMember(getNextButton());
        HTMLPane map = new HTMLPane();
        map.setContentsURL("images/FLYS_Karte_interactive.html");

        helperContainer.addMember(map);
        return layout;
    }


    @Override
    protected Data[] getData() {
        Data[] module = super.getData();
        if (module != null) {
            return new Data[] {module[0], river};
        }
        else {
            return new Data[] {river};
        }
    }

    private native void createCallback() /*-{
        $wnd.highlightRiver = @org.dive4elements.river.client.client.ui.LinkSelection::highlightCallback(Ljava/lang/String;);
        $wnd.selectRiver = @org.dive4elements.river.client.client.ui.LinkSelection::selectCallback(Ljava/lang/String;);
        $wnd.availableRiver = @org.dive4elements.river.client.client.ui.LinkSelection::availableRiver(Ljava/lang/String;);
    }-*/;

    private static void highlightCallback(String name) {
        for (String s : rivers.keySet()) {
            if (s.equals(name)) {
                LinkItem item = rivers.get(name);
                item.setCellStyle("riverLinkHighlight");
                item.redraw();
            }
            else {
                LinkItem item = rivers.get(s);
                item.setCellStyle("formCell");
                item.redraw();
            }
        }
    }

    private static boolean availableRiver(String river) {
        if (rivers.containsKey(river)) {
            if(rivers.get(river).isVisible()) {
                return true;
            }
        }
        return false;
    }

    private static void selectCallback(String name) {
        trigger.trigger(name);
    }

    private native void callHighlightRiver(String name) /*-{
        $wnd.highlight(name);
    }-*/;

    private native void callUnHighlightRiver(String name) /*-{
        $wnd.unHighlight(name);
    }-*/;
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org