view gwt-client/src/main/java/org/dive4elements/river/client/client/ui/LinkSelection.java @ 6019:078677c684af

Commit performance improvement written by Sascha Teichmann
author Andre Heinecke <aheinecke@intevation.de>
date Tue, 14 May 2013 18:41:43 +0200
parents ea9eef426962
children 0eab06d5144f
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.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 HLayout columns;

    private static Trigger trigger;

    private Canvas module;


    private class Trigger {

        private LinkSelection ls;

        public Trigger(LinkSelection ls) {
            this.ls = ls;
        }

        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);
        // XXX: This an evil hack because of misuse of static vars!
        layout.setHeight(25);
        columns = 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);

            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 (Map.Entry<String, LinkItem> entry: rivers.entrySet()) {
                            String s = entry.getKey();
                            LinkItem item = entry.getValue();
                            if (item.getLinkTitle().equals(river)) {
                                item.setCellStyle("riverLinkHighlight");
                                callHighlightRiver(river);
                            }
                            else {
                                item.setCellStyle("formCell");
                                callUnHighlightRiver(s);
                            }
                        }
                        if (columns != null) {
                            columns.redraw();
                        }
                    }
                });
            }

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

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

        }
        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 (Map.Entry<String, LinkItem> entry: rivers.entrySet()) {
            String s = entry.getKey();
            LinkItem item = entry.getValue();
            item.setCellStyle(s.equals(name) ? "riverLinkHighlight" : "formCell");
        }
        if (columns != null) {
            columns.redraw();
        }
    }

    private static boolean availableRiver(String river) {
        LinkItem ri = rivers.get(river);
        return ri != null && ri.isVisible();
    }

    private static void selectCallback(String name) {
        if (availableRiver(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