gernotbelger@9227: /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde gernotbelger@9227: * Software engineering by gernotbelger@9227: * Björnsen Beratende Ingenieure GmbH gernotbelger@9227: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt gernotbelger@9227: * gernotbelger@9227: * This file is Free Software under the GNU AGPL (>=v3) gernotbelger@9227: * and comes with ABSOLUTELY NO WARRANTY! Check out the gernotbelger@9227: * documentation coming with Dive4Elements River for details. gernotbelger@9227: */ gernotbelger@9227: package org.dive4elements.river.client.client.ui.sinfo; gernotbelger@9227: gernotbelger@9227: import java.util.List; gernotbelger@9227: gernotbelger@9227: import org.dive4elements.river.client.client.FLYSConstants; gernotbelger@9227: import org.dive4elements.river.client.client.ui.DatacagePairWidget.IDatacagePairControler; gernotbelger@9227: import org.dive4elements.river.client.client.ui.DatacageWidget; gernotbelger@9231: import org.dive4elements.river.client.client.ui.DatacageWidget.DatacageFilter; gernotbelger@9231: import org.dive4elements.river.client.shared.model.AttrList; gernotbelger@9231: import org.dive4elements.river.client.shared.model.DataCageNode; gernotbelger@9227: gernotbelger@9227: import com.smartgwt.client.data.DataSource; gernotbelger@9227: import com.smartgwt.client.data.DataSourceField; gernotbelger@9227: import com.smartgwt.client.types.Alignment; gernotbelger@9227: import com.smartgwt.client.types.FieldType; gernotbelger@9227: import com.smartgwt.client.types.TitleOrientation; gernotbelger@9227: import com.smartgwt.client.widgets.form.DynamicForm; gernotbelger@9227: import com.smartgwt.client.widgets.form.events.ItemChangedEvent; gernotbelger@9227: import com.smartgwt.client.widgets.form.events.ItemChangedHandler; gernotbelger@9227: import com.smartgwt.client.widgets.grid.events.SelectionUpdatedEvent; gernotbelger@9227: import com.smartgwt.client.widgets.grid.events.SelectionUpdatedHandler; gernotbelger@9227: import com.smartgwt.client.widgets.layout.HLayout; gernotbelger@9227: import com.smartgwt.client.widgets.tree.TreeNode; gernotbelger@9227: gernotbelger@9227: /** gernotbelger@9227: * Implements special behavior when selecting soundings and waterlevels: datacage of waterlevels depends on selection of gernotbelger@9227: * sounding. gernotbelger@9227: * gernotbelger@9227: * @author Gernot Belger gernotbelger@9227: */ gernotbelger@9227: final class WaterlevelSoundingSelectionController implements IDatacagePairControler { gernotbelger@9227: gernotbelger@9227: private static final String FIELD_INTELLIGENCE = "field_intelligence"; gernotbelger@9227: gernotbelger@9227: static final String ATTRIBUTE_YEAR = "year"; gernotbelger@9227: gernotbelger@9227: private final FLYSConstants msg; gernotbelger@9227: gernotbelger@9227: private boolean turnFilterOff; gernotbelger@9227: gernotbelger@9227: public WaterlevelSoundingSelectionController(final FLYSConstants msg) { gernotbelger@9227: this.msg = msg; gernotbelger@9227: } gernotbelger@9227: gernotbelger@9227: @Override gernotbelger@9227: public void setup(final DatacageWidget soundingWidget, final DatacageWidget waterlevelWidget, final HLayout toolbarLayout) { gernotbelger@9227: gernotbelger@9231: /* do not show ever any soundings that do not have a year */ gernotbelger@9231: soundingWidget.setFilter(new DatacageFilter() { gernotbelger@9231: @Override gernotbelger@9231: public boolean accept(final DataCageNode node) { gernotbelger@9231: gernotbelger@9231: final AttrList attributes = node.getAttributes(); gernotbelger@9231: if (WaterlevelSoundingYearFilter.isFolder(attributes)) gernotbelger@9231: return true; gernotbelger@9231: gernotbelger@9231: final String year = attributes.getValue(WaterlevelSoundingSelectionController.ATTRIBUTE_YEAR); gernotbelger@9231: gernotbelger@9231: final Integer waterlevelYear = WaterlevelSoundingYearFilter.parseYear(year); gernotbelger@9231: if (waterlevelYear == null) { gernotbelger@9279: // should never happen, we should only show soundings that have a year gernotbelger@9231: return false; gernotbelger@9231: } gernotbelger@9231: gernotbelger@9231: return true; gernotbelger@9231: } gernotbelger@9231: }); gernotbelger@9231: gernotbelger@9231: /* react to selections of a sounding */ gernotbelger@9227: soundingWidget.getTreeGrid().addSelectionUpdatedHandler(new SelectionUpdatedHandler() { gernotbelger@9227: gernotbelger@9227: @Override gernotbelger@9227: public void onSelectionUpdated(final SelectionUpdatedEvent event) { gernotbelger@9227: final List selection = soundingWidget.getPlainSelection(); gernotbelger@9227: handleSoundingChanged(waterlevelWidget, selection); gernotbelger@9227: } gernotbelger@9227: }); gernotbelger@9227: gernotbelger@9315: /* check box to deactivate intelligence */ gernotbelger@9227: final DynamicForm form = createIntelligenCheckbox(); gernotbelger@9227: toolbarLayout.addMember(form); gernotbelger@9227: form.addItemChangedHandler(new ItemChangedHandler() { gernotbelger@9227: gernotbelger@9227: @Override gernotbelger@9227: public void onItemChanged(final ItemChangedEvent event) { gernotbelger@9227: final Boolean value = (Boolean) form.getValue(FIELD_INTELLIGENCE); gernotbelger@9227: checkboxToggled(value); gernotbelger@9227: handleSoundingChanged(waterlevelWidget, soundingWidget.getPlainSelection()); gernotbelger@9227: } gernotbelger@9227: }); gernotbelger@9227: gernotbelger@9231: /* initialize by applying the current selection */ gernotbelger@9227: handleSoundingChanged(waterlevelWidget, soundingWidget.getPlainSelection()); gernotbelger@9227: } gernotbelger@9227: gernotbelger@9227: private DynamicForm createIntelligenCheckbox() { gernotbelger@9227: gernotbelger@9227: final DynamicForm form = new DynamicForm(); gernotbelger@9227: form.setTitlePrefix(""); gernotbelger@9227: form.setTitleSuffix(": "); gernotbelger@9227: form.setTitleAlign(Alignment.LEFT); gernotbelger@9227: form.setTitleOrientation(TitleOrientation.LEFT); gernotbelger@9227: gernotbelger@9227: final DataSourceField item = new DataSourceField(FIELD_INTELLIGENCE, FieldType.BOOLEAN); gernotbelger@9227: item.setTitle(this.msg.sinfo_deactivate_intelligent_datacord()); gernotbelger@9227: gernotbelger@9227: final DataSource source = new DataSource(); gernotbelger@9227: source.setFields(item); gernotbelger@9227: form.setDataSource(source); gernotbelger@9227: gernotbelger@9227: form.setValue(FIELD_INTELLIGENCE, false); gernotbelger@9227: gernotbelger@9227: return form; gernotbelger@9227: } gernotbelger@9227: gernotbelger@9227: protected final void checkboxToggled(final Boolean selected) { gernotbelger@9227: this.turnFilterOff = selected == null ? false : selected; gernotbelger@9227: } gernotbelger@9227: gernotbelger@9227: protected final void handleSoundingChanged(final DatacageWidget waterlevelWidget, final List selection) { gernotbelger@9227: gernotbelger@9227: if (this.turnFilterOff) { gernotbelger@9279: // still filter waterlevels without year gernotbelger@9279: waterlevelWidget.setFilter(new WaterlevelSoundingYearFilter(null)); gernotbelger@9231: waterlevelWidget.getTreeGrid().setEmptyMessage(this.msg.databasket_empty()); gernotbelger@9227: return; gernotbelger@9227: } gernotbelger@9227: gernotbelger@9231: // more than one should never happen, as the bedhhave single selection gernotbelger@9227: final TreeNode soundingNode = selection.isEmpty() ? null : selection.get(0); gernotbelger@9227: gernotbelger@9227: if (soundingNode == null || soundingNode.getAttribute("factory") == null) { gernotbelger@9227: waterlevelWidget.setFilter(DatacageWidget.ACCEPT_NONE_FILTER); gernotbelger@9227: waterlevelWidget.getTreeGrid().setEmptyMessage(this.msg.sinfo_sounding_waterlevel_select_waterlevel()); gernotbelger@9227: return; gernotbelger@9227: } gernotbelger@9227: gernotbelger@9231: final Integer soundingYear = WaterlevelSoundingYearFilter.parseYear(soundingNode.getAttribute(ATTRIBUTE_YEAR)); gernotbelger@9227: gernotbelger@9227: if (soundingYear == null) { gernotbelger@9227: // should never happen, as we should only show soundings that actually have a year gernotbelger@9227: waterlevelWidget.setFilter(DatacageWidget.ACCEPT_NONE_FILTER); gernotbelger@9231: waterlevelWidget.getTreeGrid().setEmptyMessage("Die gewählte Peilung hat keine Informations zum Jahr"); gernotbelger@9231: } else { gernotbelger@9227: waterlevelWidget.setFilter(new WaterlevelSoundingYearFilter(soundingYear)); gernotbelger@9231: waterlevelWidget.getTreeGrid().setEmptyMessage(this.msg.databasket_empty()); gernotbelger@9227: } gernotbelger@9227: } gernotbelger@9227: }