view gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ParameterMatrixPanel.java @ 9416:05405292a7ca

Navigationtheme panel now shows themes of dWt and WQ charts grayed out, if the current station is outside the valid range of the theme.
author gernotbelger
date Thu, 16 Aug 2018 16:28:03 +0200
parents 2da486c7c05f
children
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.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.dive4elements.river.client.client.FLYSConstants;
import org.dive4elements.river.client.client.ui.ParameterMatrix.Column.SelectionMode;
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;
import org.dive4elements.river.client.shared.model.IntegerOptionsData;
import org.dive4elements.river.client.shared.model.MultiAttributeData;
import org.dive4elements.river.client.shared.model.StringOptionsData;

import com.google.gwt.core.client.GWT;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.Label;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.LayoutSpacer;
import com.smartgwt.client.widgets.layout.VLayout;

/**
 * @author <a href="mailto:ingo.weinzierl@intevation.de">Ingo Weinzierl</a>
 */
public class ParameterMatrixPanel extends AbstractUIProvider {

    private static final long serialVersionUID = -5827445025768340371L;

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

    private ParameterMatrix matrix;
    private final String itemnameColTitle;
    private final SelectionMode mode;

    public ParameterMatrixPanel(final String itemNameColTitle, final SelectionMode mode) {
        this.itemnameColTitle = itemNameColTitle;
        this.mode = mode;
    }

    @Override
    protected Data[] getData() {
        final Map<String, List<String>> selection = this.matrix.getSelection();
        final Set<Map.Entry<String, List<String>>> entries = selection.entrySet();

        final Data[] list = new Data[this.matrix.getColumnNames().size()];

        int i = 0;

        for (final Map.Entry<String, List<String>> entry : entries) {
            final String value = buildValueString(entry.getValue());

            final DataItem item = new DefaultDataItem(entry.getKey(), null, value);

            list[i++] = new DefaultData(entry.getKey(), null, null, new DataItem[] { item });
        }

        // To delete old values already given, construct empty ones
        // for all not-specified options.
        for (final String colName : this.matrix.getColumnNames()) {
            boolean found = false;
            for (final Data data : list) {
                if (data != null && data.getLabel().equals(colName)) {
                    found = true;
                    break;
                }
            }
            if (!found) {
                // Add an empty data for this.
                list[i++] = new DefaultData(colName, null, null, new DataItem[] {});
            }
        }

        return list;
    }

    protected String buildValueString(final List<String> values) {
        final StringBuilder sb = new StringBuilder();

        boolean first = true;

        for (final String value : values) {
            if (!first) {
                sb.append(";");
            }

            sb.append(value);

            first = false;
        }

        return sb.toString();
    }

    /** Canvas to show in non-edit mode. */
    @Override
    public Canvas createOld(final DataList dataList) {
        final HLayout layout = new HLayout();
        final VLayout vLayout = new VLayout();

        layout.setWidth(300);
        vLayout.setWidth(280);

        for (int i = 0, n = dataList.size(); i < n; i++) {
            final HLayout row = new HLayout();
            final VLayout cols = new VLayout();

            row.setWidth(300);
            cols.setWidth(100);

            final Data data = dataList.get(i);
            final DataItem[] items = data.getItems();

            final Label parameter = new Label(data.getDescription());
            parameter.setWidth(200);

            for (final DataItem item : items) {
                final Label value = new Label(item.getLabel());

                value.setValign(com.smartgwt.client.types.VerticalAlignment.TOP);
                value.setWidth(130);
                value.setHeight(15);

                cols.addMember(value);
                final LayoutSpacer spacer = new LayoutSpacer();
                spacer.setHeight(5);
                cols.addMember(spacer);
            }

            row.addMember(parameter);
            row.addMember(cols);

            vLayout.addMember(row);
        }

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

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

        return layout;
    }

    /** Create the main canvas in the "editing" mode. */
    @Override
    public Canvas create(final DataList dataList) {
        final VLayout v = new VLayout();
        v.addMember(createTitle(dataList));

        this.matrix = new ParameterMatrix(this.itemnameColTitle, this.mode);

        for (final Data data : dataList.getAll()) {
            if (data instanceof IntegerOptionsData) {
                this.matrix.addColumn((IntegerOptionsData) data);
            } else if (data instanceof StringOptionsData) {
                this.matrix.addColumn((StringOptionsData) data);
            } else if (data instanceof MultiAttributeData) {
                this.matrix.addColumn((MultiAttributeData) data);
            }
        }

        // If too many items are shown, show it in the helper Panel.
        // TODO its not about the datalist, but about the "rows" in the data.
        if (dataList.getAll().size() > 5) {
            v.addMember(this.matrix.create(false));
        } else {
            this.helperContainer.addMember(this.matrix.create(true));
        }
        v.addMember(getNextButton());

        return v;
    }

    /** Reaturns a label with description of first Data. */
    protected Canvas createTitle(final DataList dataList) {
        final Data data = dataList.get(0);
        final Label label = new Label(data.getDescription());
        label.setHeight(35);

        return label;
    }

    /** Selection shall not be empty. */
    @Override
    public List<String> validate() {
        GWT.log("validation. validation. validation. ");
        final List<String> errors = new ArrayList<String>();
        // Early stop on one (only) error.
        boolean ok = false;
        for (final Map.Entry<String, List<String>> entry : this.matrix.getSelection().entrySet()) {
            /*
             * single entries are allowed!!
             * if (entry.getValue() == null || entry.getValue().size() == 0) {
             * errors.add(MESSAGES.error_values_needed());
             * return errors;
             * }
             */
            if (entry.getValue() != null && entry.getValue().size() > 0) {
                ok = true;
            }
        }
        if (!ok) {
            errors.add(this.MESSAGES.error_values_needed());
        }
        return errors;
    }
}
// vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :

http://dive4elements.wald.intevation.org