gernotbelger@9237: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde gernotbelger@9237: * Software engineering by Intevation GmbH gernotbelger@9237: * gernotbelger@9237: * This file is Free Software under the GNU AGPL (>=v3) gernotbelger@9237: * and comes with ABSOLUTELY NO WARRANTY! Check out the gernotbelger@9237: * documentation coming with Dive4Elements River for details. gernotbelger@9237: */ gernotbelger@9237: gernotbelger@9237: package org.dive4elements.river.client.client.ui; gernotbelger@9237: gernotbelger@9237: import java.util.LinkedHashMap; gernotbelger@9237: gernotbelger@9237: import org.dive4elements.river.client.client.Config; gernotbelger@9237: import org.dive4elements.river.client.client.FLYSConstants; gernotbelger@9237: import org.dive4elements.river.client.client.event.FilterHandler; gernotbelger@9237: import org.dive4elements.river.client.client.event.RangeFilterEvent; gernotbelger@9237: import org.dive4elements.river.client.client.event.StringFilterEvent; gernotbelger@9237: import org.dive4elements.river.client.client.ui.range.DistanceInfoDataSource; gernotbelger@9237: import org.dive4elements.river.client.client.ui.range.LocationsTable; gernotbelger@9237: import org.dive4elements.river.client.client.ui.range.RangeTable; gernotbelger@9237: gernotbelger@9237: import com.smartgwt.client.data.AdvancedCriteria; gernotbelger@9237: import com.smartgwt.client.data.Criteria; gernotbelger@9237: import com.smartgwt.client.data.Criterion; gernotbelger@9237: import com.smartgwt.client.types.Alignment; gernotbelger@9237: import com.smartgwt.client.types.OperatorId; gernotbelger@9237: import com.smartgwt.client.widgets.Canvas; gernotbelger@9237: import com.smartgwt.client.widgets.form.DynamicForm; gernotbelger@9237: import com.smartgwt.client.widgets.form.fields.SelectItem; gernotbelger@9237: import com.smartgwt.client.widgets.form.fields.StaticTextItem; gernotbelger@9237: import com.smartgwt.client.widgets.form.fields.events.ChangedEvent; gernotbelger@9237: import com.smartgwt.client.widgets.form.fields.events.ChangedHandler; gernotbelger@9237: import com.smartgwt.client.widgets.grid.ListGrid; gernotbelger@9237: import com.smartgwt.client.widgets.layout.HLayout; gernotbelger@9237: import com.smartgwt.client.widgets.layout.VLayout; gernotbelger@9237: import com.smartgwt.client.widgets.tab.Tab; gernotbelger@9237: import com.smartgwt.client.widgets.tab.TabSet; gernotbelger@9237: import com.smartgwt.client.widgets.tab.events.TabSelectedEvent; gernotbelger@9237: import com.smartgwt.client.widgets.tab.events.TabSelectedHandler; gernotbelger@9237: gernotbelger@9237: /** Panel to allow input of distance for calculation range. */ gernotbelger@9237: public class DistancePanelInputHelper implements FilterHandler { gernotbelger@9237: gernotbelger@9237: private RangeTable distancesTable; gernotbelger@9237: private LocationsTable locationsTable; gernotbelger@9237: private TabSet tabs; gernotbelger@9237: private StaticTextItem filterResultCount; gernotbelger@9237: private TableFilter filterDescription; gernotbelger@9237: private RangeTableFilter filterRange; gernotbelger@9237: private ListGrid currentFiltered; gernotbelger@9237: protected final VLayout helperContainer; gernotbelger@9237: private final FLYSConstants MSG; gernotbelger@9237: private final String river; gernotbelger@9237: gernotbelger@9237: public DistancePanelInputHelper(final FLYSConstants MSG, final VLayout helperContainer, final String river) { gernotbelger@9237: this.MSG = MSG; gernotbelger@9237: this.helperContainer = helperContainer; gernotbelger@9237: this.river = river; gernotbelger@9237: gernotbelger@9237: initHelperPanel(); // copy from DistancePanel gernotbelger@9237: } gernotbelger@9237: gernotbelger@9237: protected void initHelperPanel() { gernotbelger@9237: this.distancesTable = new RangeTable(); gernotbelger@9237: this.locationsTable = new LocationsTable(); gernotbelger@9237: gernotbelger@9237: final Config config = Config.getInstance(); gernotbelger@9237: final String url = config.getServerUrl(); gernotbelger@9237: // final String river = getRiverName(); gernotbelger@9237: gernotbelger@9237: this.distancesTable.setAutoFetchData(true); gernotbelger@9237: this.locationsTable.setAutoFetchData(true); gernotbelger@9237: this.distancesTable.setDataSource(new DistanceInfoDataSource(url, this.river, "distances")); gernotbelger@9237: this.locationsTable.setDataSource(new DistanceInfoDataSource(url, this.river, "locations")); gernotbelger@9237: gernotbelger@9237: // recordClickHandlers were here gernotbelger@9237: gernotbelger@9237: this.tabs = new TabSet(); gernotbelger@9237: this.tabs.setWidth100(); gernotbelger@9237: this.tabs.setHeight100(); gernotbelger@9237: gernotbelger@9237: final Tab locations = new Tab(this.MSG.locations()); gernotbelger@9237: final Tab distances = new Tab(this.MSG.distance()); gernotbelger@9237: gernotbelger@9237: locations.setPane(this.locationsTable); gernotbelger@9237: distances.setPane(this.distancesTable); gernotbelger@9237: gernotbelger@9237: this.tabs.addTab(locations, 0); gernotbelger@9237: this.tabs.addTab(distances, 1); gernotbelger@9237: gernotbelger@9237: this.filterResultCount = new StaticTextItem(this.MSG.resultCount()); gernotbelger@9237: this.filterResultCount.setTitleAlign(Alignment.LEFT); gernotbelger@9237: this.filterResultCount.setTitleStyle("color: #000"); gernotbelger@9237: gernotbelger@9237: this.filterDescription = new TableFilter(); gernotbelger@9237: this.filterDescription.setHeight("30px"); gernotbelger@9237: this.filterDescription.addFilterHandler(this); gernotbelger@9237: gernotbelger@9237: this.filterRange = new RangeTableFilter(); gernotbelger@9237: this.filterRange.setHeight("30px"); gernotbelger@9237: this.filterRange.addFilterHandler(this); gernotbelger@9237: this.filterRange.setVisible(false); gernotbelger@9237: gernotbelger@9237: final SelectItem filterCriteria = new SelectItem(); gernotbelger@9237: filterCriteria.setShowTitle(false); gernotbelger@9237: filterCriteria.setWidth(100); gernotbelger@9237: filterCriteria.addChangedHandler(new ChangedHandler() { gernotbelger@9237: @Override gernotbelger@9237: public void onChanged(final ChangedEvent e) { gernotbelger@9237: if (e.getValue().toString().equals("range")) { gernotbelger@9237: DistancePanelInputHelper.this.filterRange.setVisible(true); gernotbelger@9237: DistancePanelInputHelper.this.filterDescription.setVisible(false); gernotbelger@9237: DistancePanelInputHelper.this.filterDescription.clear(); gernotbelger@9237: } else { gernotbelger@9237: DistancePanelInputHelper.this.filterRange.setVisible(false); gernotbelger@9237: DistancePanelInputHelper.this.filterRange.clear(); gernotbelger@9237: DistancePanelInputHelper.this.filterDescription.setVisible(true); gernotbelger@9237: } gernotbelger@9237: } gernotbelger@9237: }); gernotbelger@9237: gernotbelger@9237: final LinkedHashMap filterMap = new LinkedHashMap(); gernotbelger@9237: filterMap.put("description", this.MSG.description()); gernotbelger@9237: filterMap.put("range", this.MSG.range()); gernotbelger@9237: filterCriteria.setValueMap(filterMap); gernotbelger@9237: filterCriteria.setValue("description"); gernotbelger@9237: gernotbelger@9237: final DynamicForm form = new DynamicForm(); gernotbelger@9237: form.setFields(filterCriteria); gernotbelger@9237: gernotbelger@9237: final DynamicForm form2 = new DynamicForm(); gernotbelger@9237: form2.setFields(this.filterResultCount); gernotbelger@9237: gernotbelger@9237: final HLayout filterLayout = new HLayout(); gernotbelger@9237: filterLayout.addMember(form); gernotbelger@9237: filterLayout.addMember(this.filterDescription); gernotbelger@9237: filterLayout.addMember(this.filterRange); gernotbelger@9237: filterLayout.setHeight(30); gernotbelger@9237: this.tabs.addTabSelectedHandler(new TabSelectedHandler() { gernotbelger@9237: @Override gernotbelger@9237: public void onTabSelected(final TabSelectedEvent evt) { gernotbelger@9237: DistancePanelInputHelper.this.filterDescription.clear(); gernotbelger@9237: DistancePanelInputHelper.this.filterRange.clear(); gernotbelger@9237: DistancePanelInputHelper.this.filterResultCount.setValue(""); gernotbelger@9237: gernotbelger@9237: final Canvas c = evt.getTabPane(); gernotbelger@9237: if (c instanceof ListGrid) { gernotbelger@9237: DistancePanelInputHelper.this.currentFiltered = (ListGrid) c; gernotbelger@9237: } gernotbelger@9237: } gernotbelger@9237: }); gernotbelger@9237: gernotbelger@9237: this.helperContainer.addMember(this.tabs); gernotbelger@9237: this.helperContainer.addMember(filterLayout); gernotbelger@9237: this.helperContainer.addMember(form2); gernotbelger@9237: } gernotbelger@9237: gernotbelger@9237: @Override gernotbelger@9237: public void onFilterCriteriaChanged(final StringFilterEvent event) { gernotbelger@9237: final String search = event.getFilter(); gernotbelger@9237: gernotbelger@9237: if (search != null && search.length() > 0) { gernotbelger@9237: final Criteria c = new Criteria("description", search); gernotbelger@9237: this.locationsTable.filterData(c); gernotbelger@9237: this.distancesTable.filterData(c); gernotbelger@9237: this.filterResultCount.setValue(this.currentFiltered.getRecords().length); gernotbelger@9237: } else { gernotbelger@9237: this.locationsTable.clearCriteria(); gernotbelger@9237: this.distancesTable.clearCriteria(); gernotbelger@9237: this.filterResultCount.setValue(""); gernotbelger@9237: } gernotbelger@9237: } gernotbelger@9237: gernotbelger@9237: @Override gernotbelger@9237: public void onFilterCriteriaChanged(final RangeFilterEvent event) { gernotbelger@9237: final Float from = event.getFrom() - 0.001f; gernotbelger@9237: final Float to = event.getTo() + 0.001f; gernotbelger@9237: gernotbelger@9237: Criterion combinedFilter = null; gernotbelger@9237: Criterion locationFilter = null; gernotbelger@9237: gernotbelger@9237: if (from.equals(Float.NaN) && to.equals(Float.NaN)) { gernotbelger@9237: this.locationsTable.clearCriteria(); gernotbelger@9237: this.distancesTable.clearCriteria(); gernotbelger@9237: this.filterResultCount.setValue(""); gernotbelger@9237: return; gernotbelger@9237: } gernotbelger@9237: gernotbelger@9237: if (from.equals(Float.NaN)) { gernotbelger@9237: combinedFilter = new Criterion("to", OperatorId.LESS_OR_EQUAL, to); gernotbelger@9237: gernotbelger@9237: locationFilter = new Criterion("from", OperatorId.LESS_OR_EQUAL, to); gernotbelger@9237: gernotbelger@9237: this.locationsTable.filterData(locationFilter); gernotbelger@9237: this.distancesTable.filterData(combinedFilter); gernotbelger@9237: this.filterResultCount.setValue(this.currentFiltered.getRecords().length); gernotbelger@9237: return; gernotbelger@9237: } gernotbelger@9237: gernotbelger@9237: if (to.equals(Float.NaN)) { gernotbelger@9237: combinedFilter = new Criterion("from", OperatorId.GREATER_OR_EQUAL, from); gernotbelger@9237: } else { gernotbelger@9237: final AdvancedCriteria c1 = new AdvancedCriteria(OperatorId.AND, gernotbelger@9237: new Criterion[] { new Criterion("from", OperatorId.GREATER_OR_EQUAL, from), new Criterion("from", OperatorId.LESS_OR_EQUAL, to) }); gernotbelger@9237: gernotbelger@9237: final AdvancedCriteria c2 = new AdvancedCriteria(OperatorId.AND, gernotbelger@9237: new Criterion[] { new Criterion("to", OperatorId.GREATER_OR_EQUAL, from), new Criterion("to", OperatorId.LESS_OR_EQUAL, to) }); gernotbelger@9237: gernotbelger@9237: final AdvancedCriteria c3 = new AdvancedCriteria(OperatorId.AND, gernotbelger@9237: new Criterion[] { new Criterion("from", OperatorId.LESS_OR_EQUAL, to), new Criterion("to", OperatorId.GREATER_OR_EQUAL, from) }); gernotbelger@9237: gernotbelger@9237: combinedFilter = new AdvancedCriteria(OperatorId.OR, new Criterion[] { c1, c2, c3 }); gernotbelger@9237: } gernotbelger@9237: this.locationsTable.filterData(combinedFilter); gernotbelger@9237: this.distancesTable.filterData(combinedFilter); gernotbelger@9237: this.filterResultCount.setValue(this.currentFiltered.getRecords().length); gernotbelger@9237: gernotbelger@9237: } gernotbelger@9237: gernotbelger@9237: public ListGrid getDistancesTable() { gernotbelger@9237: return this.distancesTable; gernotbelger@9237: } gernotbelger@9237: gernotbelger@9237: public ListGrid getLocationsTable() { gernotbelger@9237: return this.locationsTable; gernotbelger@9237: } gernotbelger@9237: gernotbelger@9237: } gernotbelger@9237: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 :