diff 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 diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gwt-client/src/main/java/org/dive4elements/river/client/client/ui/sinfo/WaterlevelSoundingSelectionController.java	Wed Jul 04 18:28:08 2018 +0200
@@ -0,0 +1,143 @@
+/** 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;
+        }
+    }
+}
\ No newline at end of file

http://dive4elements.wald.intevation.org