view gwt-client/src/main/java/org/dive4elements/river/client/client/ui/fixation/BunduFixPeriodPanel.java @ 9270:7337034eb5d5

multiple whitespace input fix
author gernotbelger
date Thu, 19 Jul 2018 13:36:38 +0200
parents c7e5285d434f
children e6958f0e72fa
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.fixation;

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

import org.dive4elements.river.client.client.FLYSConstants;
import org.dive4elements.river.client.client.ui.PanelHelper;
import org.dive4elements.river.client.client.ui.StringArrayParseHelper;
import org.dive4elements.river.client.client.ui.ValidationHelper;
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.FixingsOverviewInfo;
import org.dive4elements.river.client.shared.model.FixingsOverviewInfo.FixEvent;
import org.dive4elements.river.client.shared.model.IntDataItem;
import org.dive4elements.river.client.shared.model.IntegerArrayData;

import com.google.gwt.core.client.GWT;
import com.google.gwt.i18n.client.DateTimeFormat;
import com.smartgwt.client.widgets.Canvas;
import com.smartgwt.client.widgets.Label;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.fields.TextItem;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.layout.VLayout;

/**
 * This UIProvider creates a panel for location or distance input.
 *
 * @author <a href="mailto:raimund.renkert@intevation.de">Raimund Renkert</a>
 */
public class BunduFixPeriodPanel extends FixationPanel {
    private static final long serialVersionUID = 1L;
    /** The message class that provides i18n strings. */
    protected FLYSConstants MESSAGES = GWT.create(FLYSConstants.class);
    private TextItem inputItem;

    long start;
    long end;

    private final ArrayList<FixEvent> events = new ArrayList<FixEvent>();

    protected String getDatakey() {
        return "singleyear";
    }

    @Override
    public Canvas createWidget(final DataList data) {
        instances.put(this.artifact.getUuid(), this);
        final VLayout layout = new VLayout();

        final Label title = new Label(data.get(0).getDescription());
        title.setHeight("25px");

        final DynamicForm form = new DynamicForm();
        form.setNumCols(4);

        this.inputItem = PanelHelper.createItem("YEAR_INPUT");
        this.inputItem.setShowHint(true);
        this.inputItem.setHint(this.MSG.common_input_hint_year());
        this.inputItem.setShowHintInField(true);
        this.inputItem.setShowTitle(false);
        form.setFields(this.inputItem);

        layout.addMember(title);
        layout.addMember(form);

        return layout;
    }

    @Override
    public Canvas createOld(final DataList dataList) {
        final List<Data> items = dataList.getAll();
        final Data years = getData(items, getDatakey());
        final DataItem[] yearsItems = years.getItems();

        final String v1 = yearsItems[0].getStringValue().replace(" ", ", "); // multi.. single only allowed.. TODO: make createOld expecting single (general
                                                                             // refactoring necessary)

        final Label old = new Label(v1);
        final HLayout layout = new HLayout();
        layout.setWidth("400px");

        final Label label = new Label(dataList.getLabel());
        label.setWidth("200px");

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

        layout.addMember(label);
        layout.addMember(old);
        layout.addMember(back);

        return layout;
    }

    /**
     * This method returns the selected data.
     *
     * @return the selected/inserted data.
     */
    @Override
    public Data[] getData() {
        final List<String> errors = this.validate();
        if (errors.size() > 0) {
            showErrors(errors); // TODO: do not allow advance state
        }
        long startMillis = 0;
        long endMillis = 0;
        final DateTimeFormat df = DateTimeFormat.getFormat("dd.MM.yyyy");
        if (this.inputItem != null && !this.inputItem.getValueAsString().isEmpty()) {
            final List<Data> data = new ArrayList<Data>();
            final String bezugsjahr = StringArrayParseHelper.trimRawString(this.inputItem.getValueAsString());
            final DataItem yearsdata = new DefaultDataItem(getDatakey(), getDatakey(), bezugsjahr);
            data.add(new DefaultData(getDatakey(), null, null, new DataItem[] { yearsdata }));

            // start/end

            final int bezugsjahrInt = Integer.valueOf(bezugsjahr);

            startMillis = df.parse("01.01." + (bezugsjahrInt - 5)).getTime();
            // ist; radio-auswahl erfolgt aber erst im nächsten schritt
            endMillis = df.parse("31.12." + (bezugsjahrInt + 5)).getTime();

            // events:
            if (this.events.size() > 0) {
                // filter by start/end
                final ArrayList<FixEvent> temp = new ArrayList<FixEvent>();

                for (final FixEvent e : this.events) {
                    final long time = df.parse(e.getDate()).getTime();
                    if (!(time >= startMillis && time <= endMillis)) {
                        temp.add(e);
                    }
                }
                this.events.removeAll(temp);

                final IntDataItem[] arr = new IntDataItem[this.events.size()];
                for (int i = 0, E = this.events.size(); i < E; i++) {
                    try {
                        final Integer v = new Integer(this.events.get(i).getCId());
                        arr[i] = new IntDataItem("id", "id", v.intValue());
                    }
                    catch (final NumberFormatException nfe) {
                        return data.toArray(new Data[data.size()]);
                    }
                }

                final IntegerArrayData iad = new IntegerArrayData("events_temp", "events_temp", arr);

                data.add(iad);
            }

            return data.toArray(new Data[data.size()]);
        }
        return new Data[0];
    }

    @Override
    public final List<String> validate() {
        final List<String> errors = new ArrayList<String>();
        errors.addAll(ValidationHelper.checkForEmpty(this.inputItem, this.MSG));
        try {
            final int year = Integer.valueOf(this.inputItem.getValueAsString());
            if (year < 1000 || year > 9999) {
                errors.add(this.MSG.wrongFormat() + "(" + this.MSG.common_input_hint_year() + ")");
            }
        }
        catch (final NumberFormatException e) {
            errors.add(this.MSG.error_invalid_integer());
        }
        return errors;
    }

    @Override
    public void setValues(final String cid, final boolean checked) {
        // No user interaction, do nothing.
    }

    @Override
    public boolean renderCheckboxes() {
        // No selection, return false.
        return false;
    }

    @Override
    public void success(final FixingsOverviewInfo fixInfo) {
        for (final FixEvent fe : fixInfo.getEvents()) {
            this.events.add(fe);
        }
    }
}

http://dive4elements.wald.intevation.org