view gwt-client/src/main/java/org/dive4elements/river/client/client/ui/ParameterMatrixPanel.java @ 9390:f575ff573cbb

"Name der Peilung" columname minfo.
author gernotbelger
date Thu, 09 Aug 2018 15:22:31 +0200
parents 5e38e2924c07
children 2da486c7c05f
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.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;

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

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

        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