package org.activityinfo.ui.client.component.filter; /* * #%L * ActivityInfo Server * %% * Copyright (C) 2009 - 2013 UNICEF * %% * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public * License along with this program. If not, see * <http://www.gnu.org/licenses/gpl-3.0.html>. * #L% */ import com.google.gwt.event.logical.shared.ValueChangeEvent; import com.google.gwt.event.logical.shared.ValueChangeHandler; import com.google.gwt.event.shared.GwtEvent; import com.google.gwt.event.shared.HandlerManager; import com.google.gwt.event.shared.HandlerRegistration; import org.activityinfo.legacy.shared.Log; import org.activityinfo.legacy.shared.command.Filter; import org.activityinfo.ui.client.page.entry.ActivityFilterPanel; import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class FilterPanelSet implements FilterPanel { private List<FilterPanel> panels; private HandlerManager manager; private List<HandlerRegistration> myRegistrations; public FilterPanelSet(FilterPanel... panels) { super(); this.panels = Arrays.asList(panels); } private HandlerManager ensureHandlers() { if (manager == null) { manager = new HandlerManager(this); myRegistrations = new ArrayList<HandlerRegistration>(); for (FilterPanel panel : panels) { HandlerRegistration registration = panel.addValueChangeHandler(new ValueChangeHandler<Filter>() { @Override public void onValueChange(ValueChangeEvent<Filter> event) { // reset attribute- and partner filters when a different activity, database (data entry) // or indicator (reports) is selected if (event.getSource() instanceof ActivityFilterPanel || event.getSource() instanceof IndicatorFilterPanel) { clearAttributeAndPartnerFilters(); } Filter value = composeFilter(new Filter(), null); Log.debug("FilterPanelSet: Filter changed = " + value); ValueChangeEvent.fire(FilterPanelSet.this, value); } }); myRegistrations.add(registration); } } return manager; } private void clearAttributeAndPartnerFilters() { for (FilterPanel panel : panels) { if (panel instanceof AttributeFilterPanel) { ((AttributeFilterPanel) panel).clearFilter(); } else if (panel instanceof AttributeGroupFilterWidgets) { ((AttributeGroupFilterWidgets) panel).clearFilter(); } else if (panel instanceof PartnerFilterPanel) { ((PartnerFilterPanel) panel).clearFilter(); } } } @Override public Filter getValue() { return composeFilter(new Filter(), null); } @Override public void applyBaseFilter(Filter baseFilter) { for (FilterPanel panel : panels) { panel.applyBaseFilter(composeFilter(baseFilter, panel)); } } private Filter composeFilter(Filter baseFilter, FilterPanel exclude) { Filter filter = baseFilter; for (FilterPanel panel : panels) { if (panel != exclude) { filter = new Filter(filter, panel.getValue()); } } return filter; } @Override public void setValue(Filter value) { for (FilterPanel panel : panels) { panel.applyBaseFilter(value); panel.setValue(value); } } @Override public void setValue(Filter value, boolean fireEvents) { for (FilterPanel panel : panels) { panel.applyBaseFilter(value); panel.setValue(value, fireEvents); } } @Override public HandlerRegistration addValueChangeHandler(ValueChangeHandler<Filter> handler) { final HandlerRegistration reg = ensureHandlers().addHandler(ValueChangeEvent.getType(), handler); return new HandlerRegistration() { @Override public void removeHandler() { reg.removeHandler(); if (manager.getHandlerCount(ValueChangeEvent.getType()) == 0) { for (HandlerRegistration myReg : myRegistrations) { myReg.removeHandler(); } } manager = null; } }; } @Override public void fireEvent(GwtEvent<?> event) { if (manager != null) { manager.fireEvent(event); } } }