view flys-client/src/main/java/de/intevation/flys/client/client/ui/GaugePanel.java @ 3719:e82acd5c86f7

Merged revisions 5495-5496,5509,5514-5515,5521-5526 via svnmerge from file:///home/clients/bsh/bsh-generischer-viewer/Material/SVN/flys-client/trunk ........ r5495 | ingo | 2012-09-17 14:55:09 +0200 (Mo, 17 Sep 2012) | 1 line Added missing i18n strings for minfo state description. ........ r5496 | ingo | 2012-09-17 15:47:43 +0200 (Mo, 17 Sep 2012) | 1 line Tagged 'flys-client' as 2.9.1 ........ r5509 | teichmann | 2012-09-18 17:54:37 +0200 (Di, 18 Sep 2012) | 1 line Removed trailing whitespace. ........ r5514 | bricks | 2012-09-19 09:56:42 +0200 (Mi, 19 Sep 2012) | 2 lines Add missing Changelog entry for r5472 ........ r5515 | bricks | 2012-09-19 09:59:35 +0200 (Mi, 19 Sep 2012) | 2 lines Implement a scrolling gauge info tree ........ r5521 | bricks | 2012-09-19 14:41:48 +0200 (Mi, 19 Sep 2012) | 2 lines Add station info to the gauges ........ r5522 | bricks | 2012-09-19 14:43:43 +0200 (Mi, 19 Sep 2012) | 2 lines Improve the handling of the GaugePanel in the ParameterList ........ r5523 | bricks | 2012-09-19 14:51:02 +0200 (Mi, 19 Sep 2012) | 4 lines Improve the GaugePanel Be locale aware and only load the gauge info if the river name changes. ........ r5524 | bricks | 2012-09-19 15:14:46 +0200 (Mi, 19 Sep 2012) | 5 lines Fix a NullPointerException When iterating over a list it must be checked if the reference to the list is valid. ........ r5525 | bricks | 2012-09-19 15:16:24 +0200 (Mi, 19 Sep 2012) | 2 lines Don't display the GaugePanel if no river is selected ........ r5526 | bricks | 2012-09-19 15:18:36 +0200 (Mi, 19 Sep 2012) | 2 lines Use the wstunit from the river as unit for the Pegelnullpunkt ........ flys-client/tags/2.9.1@5528 c6561f87-3c4e-4783-a992-168aeb5c3f6f
author Ingo Weinzierl <ingo.weinzierl@intevation.de>
date Wed, 19 Sep 2012 14:42:48 +0000
parents 4e33aa341e51
children 22cd60315e08
line wrap: on
line source
package de.intevation.flys.client.client.ui;

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

import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.DecoratorPanel;
import com.google.gwt.user.client.ui.Grid;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ScrollPanel;
import com.google.gwt.user.client.ui.Tree;
import com.google.gwt.user.client.ui.TreeItem;

import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.Overflow;
import com.smartgwt.client.widgets.events.ResizedEvent;
import com.smartgwt.client.widgets.events.ResizedHandler;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.SectionStackSection;
import com.smartgwt.client.widgets.layout.VLayout;

import de.intevation.flys.client.client.FLYSConstants;
import de.intevation.flys.client.client.services.GaugeOverviewInfoService;
import de.intevation.flys.client.client.services.GaugeOverviewInfoServiceAsync;
import de.intevation.flys.client.shared.model.GaugeInfo;
import de.intevation.flys.client.shared.model.RiverInfo;

/**
 * The GaugePanel is intendet to be used within a SectionStackSection
 * It extends the VLayout by two methods to show and hide the
 * section stack section.
 */
public class GaugePanel extends VLayout implements ResizedHandler {

    /** SectionStackSection where this GaugePanel belongs in*/
    private SectionStackSection sectionStack;

    /** Name of the river */
    private String river;

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

    protected GaugeOverviewInfoServiceAsync gaugeOverviewInfoService =
        GWT.create(GaugeOverviewInfoService.class);

    protected GaugeTree gaugetree = new GaugeTree();

    protected RiverInfoPanel riverinfopanel;

    /**
     * Creates a new VLayout with a SectionStackSection
     * The GaugePanel's SectionStackSection is hidden by default.
     * @param sectionStack The section stack section to place the VLayout in.
     */
    public GaugePanel(SectionStackSection sectionStack) {
        setOverflow(Overflow.HIDDEN);
        sectionStack.setHidden(true);
        sectionStack.setItems(this);
        this.sectionStack = sectionStack;
        setStyleName("gaugepanel");
        addResizedHandler(this);
    }

    /**
     * Sets and loads the river data if river is not the current set river
     */
    public void setRiver(String river) {
        if (!river.equals(this.river)) {
            this.river = river;
            this.refresh();
        }
    }

    /**
     * Loads the river info and renders it afterwards
     */
    public void refresh() {
        gaugeOverviewInfoService.getRiverInfo(this.river, new AsyncCallback<RiverInfo>() {
            public void onFailure(Throwable e) {
                GWT.log("Could not load the river info." + e);
            }

            public void onSuccess(RiverInfo riverinfo) {
                GWT.log("Loaded river info");
                renderGaugeOverviewInfo(riverinfo);
                gaugetree.openAll();
            }
        });
    }

    public void renderGaugeOverviewInfo(RiverInfo riverinfo) {
        removeMembers(getMembers());

        riverinfopanel = new RiverInfoPanel(riverinfo);
        addMember(riverinfopanel);
        addMember(gaugetree);

        gaugetree.setGauges(riverinfo);
    }

    @Override
    public void onResized(ResizedEvent event) {
        /* this height calculation is only an approximation and doesn't reflect
         * the real height of the the gaugetree. */
        int height = getInnerContentHeight() -
            (RiverInfoPanel.HEIGHT +
            (2 * RiverInfoPanel.BORDER_WIDTH) +
            (2 * RiverInfoPanel.PADDING) +
            (2 * RiverInfoPanel.MARGIN));

        if (height < 0) {
            height = 0;
        }

        gaugetree.setHeight("" + height + "px");
    }


    /**
     * Hide the section stack section.
     */
    public void hide() {
        GWT.log("GaugePanel - hide");
        this.sectionStack.setHidden(true);
    }

    /**
     * Show the section stack section.
     */
    public void show() {
        GWT.log("GaugePanel - show");
        this.sectionStack.setHidden(false);
    }

    class GaugeTree extends ScrollPanel {

        private Tree tree;

        public GaugeTree() {
            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.
         */
        public void setGauges(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(); i >= 0; i--) {
                        GaugeInfo gauge = gauges.get(i);
                        addGauge(gauge, emptygauges);
                    }
                }

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

        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) {
            TreeItem gaugeitem = new GaugeInfoItem(gauge);
            tree.addItem(gaugeitem);
        }

        public void openAll() {
            for (Iterator<TreeItem> it = tree.treeItemIterator(); it.hasNext();) {
                TreeItem item = it.next();
                item.setState(true);
            }
        }
    }

    class RiverInfoPanel extends HorizontalPanel {

        public final static int HEIGHT = 30;
        public final static int BORDER_WIDTH = 3;
        public final static int PADDING = 8;
        public final static int MARGIN = 10;

        public RiverInfoPanel(RiverInfo riverinfo) {
            setStyleName("riverinfopanel");
            setHeight("" + HEIGHT + "px");
            setVerticalAlignment(ALIGN_MIDDLE);

            NumberFormat nf = NumberFormat.getDecimalFormat();

            addLabel(riverinfo.getName(), false);

            String kmtext = "";
            Double start = riverinfo.getKmStart();
            Double end = riverinfo.getKmEnd();

            if (!riverinfo.isKmUp()) {
                Double tmp = end;
                end = start;
                start = tmp;
            }
            if (end != null) {
                kmtext += nf.format(end);
                kmtext += " - ";
            }
            if (start != null) {
                kmtext += nf.format(start);
            }
            kmtext += " km";

            addLabel(kmtext, false);

            String qtext = "";
            Double qmin = riverinfo.getMinQ();
            Double qmax = riverinfo.getMaxQ();
            if (qmin != null) {
                qtext += nf.format(qmin);
                qtext += " " + MSG.gauge_q_unit();
                qtext += " - ";
            }
            if (qmax != null) {
                qtext += nf.format(qmax);
                qtext += " " + MSG.gauge_q_unit();
            }

            addLabel(qtext, false);
        }

        private void addLabel(String text, boolean wordwrap) {
            Label label = new Label(text, wordwrap);
            add(label);
            setCellHeight(label, "" + HEIGHT + "px");
        }
    }

    class GaugeInfoItem extends TreeItem {
        public GaugeInfoItem(GaugeInfo gauge) {
            GaugeInfoHead gaugeinfohead = new GaugeInfoHead(gauge);
            GaugeInfoPanel gaugeinfopanel = new GaugeInfoPanel(gauge);
            setWidget(gaugeinfohead);
            addItem(gaugeinfopanel);
        }
    }

    class GaugeInfoHead extends HLayout {

        public GaugeInfoHead(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);
            }
        }
    }

    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);
        }
    }
}

http://dive4elements.wald.intevation.org