view gwt-client/src/main/java/org/dive4elements/river/client/client/ui/sinfo/WaterlevelSoundingSelectionController.java @ 9227:84397da33d17

Allow to control specific behaviour in TwinDatacagePanel Implemented client logic of 'intelligent datacage filtering' for SINFO
author gernotbelger
date Wed, 04 Jul 2018 18:28:08 +0200
parents
children 082e8e808902
line wrap: on
line source
/** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde
 * Software engineering by
 *  Björnsen Beratende Ingenieure GmbH
 *  Dr. Schumacher Ingenieurbüro für Wasser und Umwelt
 *
 * 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.sinfo;

import java.util.List;

import org.dive4elements.river.client.client.FLYSConstants;
import org.dive4elements.river.client.client.ui.DatacagePairWidget.IDatacagePairControler;
import org.dive4elements.river.client.client.ui.DatacageWidget;

import com.smartgwt.client.data.DataSource;
import com.smartgwt.client.data.DataSourceField;
import com.smartgwt.client.types.Alignment;
import com.smartgwt.client.types.FieldType;
import com.smartgwt.client.types.TitleOrientation;
import com.smartgwt.client.widgets.form.DynamicForm;
import com.smartgwt.client.widgets.form.events.ItemChangedEvent;
import com.smartgwt.client.widgets.form.events.ItemChangedHandler;
import com.smartgwt.client.widgets.grid.events.SelectionUpdatedEvent;
import com.smartgwt.client.widgets.grid.events.SelectionUpdatedHandler;
import com.smartgwt.client.widgets.layout.HLayout;
import com.smartgwt.client.widgets.tree.TreeNode;

/**
 * Implements special behavior when selecting soundings and waterlevels: datacage of waterlevels depends on selection of
 * sounding.
 *
 * @author Gernot Belger
 */
final class WaterlevelSoundingSelectionController implements IDatacagePairControler {

    private static final String FIELD_INTELLIGENCE = "field_intelligence";

    static final String ATTRIBUTE_YEAR = "year";

    private final FLYSConstants msg;

    private boolean turnFilterOff;

    public WaterlevelSoundingSelectionController(final FLYSConstants msg) {
        this.msg = msg;
    }

    @Override
    public void setup(final DatacageWidget soundingWidget, final DatacageWidget waterlevelWidget, final HLayout toolbarLayout) {

        soundingWidget.getTreeGrid().addSelectionUpdatedHandler(new SelectionUpdatedHandler() {

            @Override
            public void onSelectionUpdated(final SelectionUpdatedEvent event) {
                final List<TreeNode> selection = soundingWidget.getPlainSelection();
                handleSoundingChanged(waterlevelWidget, selection);
            }
        });

        final DynamicForm form = createIntelligenCheckbox();
        toolbarLayout.addMember(form);
        form.addItemChangedHandler(new ItemChangedHandler() {

            @Override
            public void onItemChanged(final ItemChangedEvent event) {
                final Boolean value = (Boolean) form.getValue(FIELD_INTELLIGENCE);
                checkboxToggled(value);
                handleSoundingChanged(waterlevelWidget, soundingWidget.getPlainSelection());
            }
        });

        /* init to current selection */
        handleSoundingChanged(waterlevelWidget, soundingWidget.getPlainSelection());
    }

    private DynamicForm createIntelligenCheckbox() {

        final DynamicForm form = new DynamicForm();
        form.setTitlePrefix("");
        form.setTitleSuffix(": ");
        form.setTitleAlign(Alignment.LEFT);
        form.setTitleOrientation(TitleOrientation.LEFT);

        final DataSourceField item = new DataSourceField(FIELD_INTELLIGENCE, FieldType.BOOLEAN);
        item.setTitle(this.msg.sinfo_deactivate_intelligent_datacord());

        final DataSource source = new DataSource();
        source.setFields(item);
        form.setDataSource(source);

        form.setValue(FIELD_INTELLIGENCE, false);

        return form;
    }

    protected final void checkboxToggled(final Boolean selected) {
        this.turnFilterOff = selected == null ? false : selected;
    }

    protected final void handleSoundingChanged(final DatacageWidget waterlevelWidget, final List<TreeNode> selection) {

        if (this.turnFilterOff) {
            waterlevelWidget.setFilter(DatacageWidget.ACCEPT_ALL_FILTER);
            waterlevelWidget.getTreeGrid().setEmptyMessage(this.msg.databasket_loading());
            return;
        }

        // more than one should never happen, as the have single selection
        final TreeNode soundingNode = selection.isEmpty() ? null : selection.get(0);

        if (soundingNode == null || soundingNode.getAttribute("factory") == null) {
            waterlevelWidget.setFilter(DatacageWidget.ACCEPT_NONE_FILTER);
            waterlevelWidget.getTreeGrid().setEmptyMessage(this.msg.sinfo_sounding_waterlevel_select_waterlevel());
            return;
        }

        final Integer soundingYear = getYear(soundingNode);

        if (soundingYear == null) {
            // should never happen, as we should only show soundings that actually have a year
            waterlevelWidget.setFilter(DatacageWidget.ACCEPT_NONE_FILTER);
            waterlevelWidget.getTreeGrid().setEmptyMessage("Der gewählte Wassrspiegel hat keine Informations zum Jahr");
        } else
            waterlevelWidget.setFilter(new WaterlevelSoundingYearFilter(soundingYear));
    }

    private static Integer getYear(final TreeNode soundingNode) {
        final String year = soundingNode.getAttribute(ATTRIBUTE_YEAR);
        if (year == null || year.trim().isEmpty())
            return null;

        try {
            return Integer.valueOf(year);
        }
        catch (final NumberFormatException e) {
            e.printStackTrace();
            return null;
        }
    }
}

http://dive4elements.wald.intevation.org