Mercurial > dive4elements > river
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