view flys-client/src/main/java/de/intevation/flys/client/client/ui/GaugeTree.java @ 4573:b87073a05f9d

flys-client: Patch to render combobox options as clickable links. The way of passing data arguments to the links and further to the Artifact feeding service is somewhat hacked and should be refactored (later...).
author Christian Lins <christian.lins@intevation.de>
date Tue, 27 Nov 2012 12:50:10 +0100
parents f75968f0ce80
children
line wrap: on
line source
package de.intevation.flys.client.client.ui;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.user.client.ui.Anchor;
import com.google.gwt.user.client.ui.DecoratorPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.Tree;
import com.google.gwt.user.client.ui.TreeItem;

import com.smartgwt.client.widgets.layout.HLayout;

import de.intevation.flys.client.client.FLYS;
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.GaugeInfo;
import de.intevation.flys.client.shared.model.RiverInfo;

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

/**
 * @author <a href="mailto:bjoern.ricks@intevation.de">Björn Ricks</a>
 */
public class GaugeTree extends InfoTree {

    public GaugeTree(FLYS flys) {
        this.flys = flys;
        tree = new Tree();
        setWidget(tree);
    }

    /**
     * Resets the items of the tree.
     * If the list of gauges is empty or null the tree will be empty.
     */
    @Override
    public void setRiverInfo(RiverInfo riverinfo) {
        tree.clear();

        List<GaugeInfo> gauges = riverinfo.getGauges();

        if (gauges != null && !gauges.isEmpty()) {

            ArrayList<GaugeInfo> emptygauges = new ArrayList<GaugeInfo>();

            if (!riverinfo.isKmUp()) {
                for (GaugeInfo gauge : gauges) {
                    addGauge(gauge, emptygauges);
                }
            }
            else {
                for (int i = gauges.size()-1; i >= 0; i--) {
                    GaugeInfo gauge = gauges.get(i);
                    addGauge(gauge, emptygauges);
                }
            }

            // put empty gauges to the end
            for (GaugeInfo gauge : emptygauges) {
                addGauge(gauge);
            }

            open();
        }
    }

    private void addGauge(GaugeInfo gauge, List<GaugeInfo> empty) {
        if (gauge.getKmStart() != null && gauge.getKmEnd() != null) {
            addGauge(gauge);
        }
        else {
            empty.add(gauge);
        }
    }

    private void addGauge(GaugeInfo gauge) {
        GaugeInfoItem gaugeitem = new GaugeInfoItem(flys, gauge);
        tree.addItem(gaugeitem);
    }

    void getLocations(String labelname, List<Double> locations, DataList dl) {
        for (int j = dl.size()-1; j >= 0; --j) {
            Data d = dl.get(j);
            String label = d.getLabel();
            if (label.equals(labelname)) {
                getLocationsFromData(locations, d);
            }
        }
    }

    void getLocationsFromData(List<Double> locations, Data data) {
        DataItem[] items = data.getItems();
        for (int k = 0; k < items.length; k++) {
            String tmp = items[k].getStringValue();
            GWT.log("GaugeTree - getLocationsFromData " + tmp);
            if (tmp != null) {
                if (tmp.contains(" ")) {
                    // string contains several values ...
                    String[] values = tmp.split(" ");
                    for(int i=0; i < values.length; i++) {
                        Double value = Double.valueOf(values[i]);
                        if (value != null) {
                            locations.add(value);
                        }
                    }
                }
                else {
                    Double value = Double.valueOf(tmp);
                    if (value != null) {
                        locations.add(value);
                    }
                }
            }
        }
    }

    public void openOnReference(Long number) {
        GWT.log("GaugeTree - openOnReference " + number);
        for (Iterator<TreeItem> it = tree.treeItemIterator(); it.hasNext();) {
            TreeItem item = it.next();
            if (item instanceof GaugeInfoItem) {
                GaugeInfoItem gitem = (GaugeInfoItem)item;
                if (gitem.getReference().equals(number)) {
                    item.setState(true);
                }
                else {
                    item.setState(false);
                }
            }
        }
    }

    public void openOnDistance(Double start, Double end) {
        GWT.log("GaugeTree - openOnDistance " + start + " " + end + " " +
                tree.getItemCount());

        for (Iterator<TreeItem> it = tree.treeItemIterator(); it.hasNext();) {
            TreeItem item = it.next();
            /* Strange stuff is happening here:
             * GWT Tree.treeItemIterator returns another TreeItem for each
             * GaugeInfoItem */
            if (item instanceof GaugeInfoItem) {
                boolean setstate = false;
                GaugeInfoItem gitem = (GaugeInfoItem)item;
                if (end == null && gitem.getStart() != null) {
                    if (gitem.getStart() >= start) {
                        setstate = true;
                    }
                }
                else {
                    // as getStart()/getEnd() return Double objects, they can be null and
                    // can cause NPEs when comparing with double... strange...
                    if (gitem.getStart() != null && gitem.getEnd() != null) {
                        GWT.log("GaugeTree - openOnDistance gitem " + gitem.getStart() + " " + gitem.getEnd());
                        if ((start >= gitem.getStart() && start <= gitem.getEnd()) ||
                              (end >= gitem.getStart() &&   end <= gitem.getEnd()) ||
                            (start <= gitem.getStart() &&   end >= gitem.getEnd())) {
                            setstate = true;
                        }
                    }
                }
                item.setState(setstate);
            }
        }
    }

    /**
     * Open Gauge entry if a location fits to the gauge
     */
    public void openOnLocations(List<Double> locations) {
        GWT.log("GaugeTree - openOnLocations " + locations + " " +
                tree.getItemCount());

        if (locations == null || locations.isEmpty()) {
            return;
        }

        for (Iterator<TreeItem> it = tree.treeItemIterator(); it.hasNext();) {
            TreeItem item = it.next();
            if (item instanceof GaugeInfoItem) {
                GaugeInfoItem gitem = (GaugeInfoItem)item;
                boolean isset = false;
                for (Double location: locations) {
                    if (locations == null) {
                        continue;
                    }

                    Double start = gitem.getStart();
                    Double end   = gitem.getEnd();
                    if (start == null || end == null) {
                        // should not occur but avoid NullPointerException
                        continue;
                    }

                    if (location >= start && location <= end) {
                        isset = true;
                        break;
                    }
                }
                item.setState(isset);
            }
        }
    }

    class GaugeInfoItem extends TreeItem {

        private GaugeInfo gauge;

        public GaugeInfoItem(FLYS flys, GaugeInfo gauge) {
            GaugeInfoHead gaugeinfohead = new GaugeInfoHead(flys, gauge);
            GaugeInfoPanel gaugeinfopanel = new GaugeInfoPanel(gauge);
            setWidget(gaugeinfohead);
            addItem(gaugeinfopanel);
            this.gauge = gauge;
        }

        public Double getStart() {
            return gauge.getKmStart();
        }

        public Double getEnd() {
            return gauge.getKmEnd();
        }

        public Long getReference() {
            return gauge.getOfficialNumber();
        }
    }

    class GaugeInfoHead extends HLayout {

        public GaugeInfoHead(FLYS flys, GaugeInfo gauge) {
            setStyleName("gaugeinfohead");
            setAutoHeight();
            setAutoWidth();

            NumberFormat nf = NumberFormat.getDecimalFormat();

            Label label = new Label(gauge.getName(), true);
            addMember(label);

            Double start;
            Double end;

            if (!gauge.isKmUp()) {
                start = gauge.getKmStart();
                end   = gauge.getKmEnd();
            }
            else {
                start = gauge.getKmEnd();
                end   = gauge.getKmStart();
            }

            String kmtext = "";
            if (start != null) {
                kmtext += nf.format(start);
                kmtext += " - ";
            }
            if (end != null) {
                kmtext += nf.format(end);
            }
            if (start != null || end != null) {
                kmtext += " km";
            }

            label = new Label(kmtext);

            addMember(label);

            Double station = gauge.getStation();
            if (station != null) {
                String stext = nf.format(station);
                stext += " km";
                label = new Label(stext);
                addMember(label);
            }

            Long number = gauge.getOfficialNumber();
            String url = number != null ?
                MSG.gauge_url() + number :
                MSG.gauge_url();
            Anchor anchor = new Anchor(MSG.gauge_info_link(), url, "_blank");
            addMember(anchor);

            addMember(new GaugeCurveAnchor(flys, gauge));
        }
    }

    class GaugeCurveAnchor extends Anchor implements ClickHandler {

        private FLYS flys;
        private GaugeInfo gauge;

        public GaugeCurveAnchor(FLYS flys, GaugeInfo gauge) {
            super(MSG.gauge_curve_link());
            this.flys = flys;
            this.gauge = gauge;

            addClickHandler(this);
        }

        @Override
        public void onClick(ClickEvent ev) {
            GWT.log("GaugeCurveAnchor - onClick " + gauge.getRiverName() +
                    " " + gauge.getOfficialNumber());
            flys.newGaugeDischargeCurve(gauge.getRiverName(),
                    gauge.getOfficialNumber());
        }
    }

    class GaugeInfoPanel extends DecoratorPanel {

        public GaugeInfoPanel(GaugeInfo gauge) {
            setStyleName("gaugeinfopanel");
            Grid grid = new Grid(4, 2);

            NumberFormat nf = NumberFormat.getDecimalFormat();

            Double minw = gauge.getMinW();
            Double maxw = gauge.getMaxW();
            if (minw != null && maxw != null) {
                grid.setText(0, 0, MSG.wq_value_q());
                grid.setText(0, 1, "" + nf.format(minw) +
                        " - " + nf.format(maxw));
            }

            Double minq = gauge.getMinQ();
            Double maxq = gauge.getMaxQ();
            if (minq != null && maxq != null) {
                grid.setText(1, 0, MSG.wq_value_w());
                grid.setText(1, 1, "" + nf.format(minq) +
                        " - " + nf.format(maxq));
            }

            Double aeo = gauge.getAeo();
            if (aeo != null) {
                grid.setText(2, 0, "AEO [km²]");
                grid.setText(2, 1, "" + nf.format(aeo));
            }

            Double datum = gauge.getDatum();
            if (datum != null) {
                grid.setText(3, 0, MSG.gauge_zero() + " [" +
                        gauge.getWstUnit() + "]");
                grid.setText(3, 1, "" + nf.format(datum));
            }

            setWidget(grid);
        }
    }

    public void open() {
        ArrayList<Double> locations = new ArrayList<Double>();

        if (data != null && data.length > 0) {
            for (int i = 0; i < data.length; i++) {
                DataList dl = data[i];
                String state = dl.getState();
                GWT.log("GaugeTree - open " + state);
                if (state.equals("state.winfo.location_distance")) {
                    Double ldfrom = null;
                    Double ldto = null;

                    for (int j = dl.size()-1; j >= 0; --j) {
                        Data d = dl.get(j);
                        String label = d.getLabel();
                        GWT.log("GaugeTree - setData - label " + label + " " + d.getStringValue());
                        if (label.equals("ld_from")) {
                            ldfrom = getDoubleValue(d);
                        }
                        else if (label.equals("ld_to")) {
                            ldto = getDoubleValue(d);
                        }
                        else if (label.equals("ld_locations")) {
                            getLocationsFromData(locations, d);
                            openOnLocations(locations);
                            return;
                        }
                    }
                    if (ldfrom != null) {
                        openOnDistance(ldfrom, ldto);
                        return;
                    }
                }
                else if(state.equals("state.winfo.distance_only") ||
                        state.equals("state.winfo.distance")) {
                    Double ldfrom = null;
                    Double ldto = null;

                    for (int j = dl.size()-1; j >= 0; --j) {
                        Data d = dl.get(j);
                        String label = d.getLabel();
                        GWT.log("GaugeTree - setData - label " + label + " " + d.getStringValue());
                        if (label.equals("ld_from")) {
                            ldfrom = getDoubleValue(d);
                        }
                        else if (label.equals("ld_to")) {
                            ldto = getDoubleValue(d);
                        }
                    }

                    if (ldfrom != null) {
                        openOnDistance(ldfrom, ldto);
                        return;
                    }
                        }
                else if (state.equals("state.winfo.location")) {
                    getLocations("ld_locations", locations, dl);
                    openOnLocations(locations);
                    return;
                }
                else if (state.equals("state.winfo.reference.curve.input.start")) {
                    getLocations("reference_startpoint", locations, dl);
                }
                else if (state.equals("state.winfo.reference.curve.input.end")) {
                    getLocations("reference_endpoint", locations, dl);
                }
                else if (state.equals("state.winfo.historicalq.reference_gauge")) {
                    for (int j = dl.size()-1; j >= 0; --j) {
                        Data d = dl.get(j);
                        String label = d.getLabel();
                        if (label.equals("reference_gauge")) {
                            String tmp = d.getStringValue();
                            if (tmp != null) {
                                Long gaugereference = Long.valueOf(tmp);
                                if (gaugereference != null) {
                                    openOnReference(gaugereference);
                                    return;
                                }
                            }
                        }
                    }
                }
            }
        }
        if (!locations.isEmpty()) {
            openOnLocations(locations);
        }
        else {
            openAll();
        }
    }
}

http://dive4elements.wald.intevation.org