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.extjs.gxt.ui.client.Style;
import com.extjs.gxt.ui.client.data.ModelData;
import com.extjs.gxt.ui.client.event.CheckChangedEvent;
import com.extjs.gxt.ui.client.event.CheckChangedListener;
import com.extjs.gxt.ui.client.store.TreeStore;
import com.extjs.gxt.ui.client.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.layout.FitLayout;
import com.extjs.gxt.ui.client.widget.treepanel.TreePanel;
import com.google.gwt.event.logical.shared.ValueChangeEvent;
import com.google.gwt.event.logical.shared.ValueChangeHandler;
import com.google.gwt.event.shared.HandlerRegistration;
import com.google.inject.Inject;
import org.activityinfo.i18n.shared.I18N;
import org.activityinfo.legacy.client.Dispatcher;
import org.activityinfo.legacy.shared.command.DimensionType;
import org.activityinfo.legacy.shared.command.Filter;
import org.activityinfo.legacy.shared.model.AdminEntityDTO;
import org.activityinfo.ui.client.component.filter.FilterToolBar.ApplyFilterEvent;
import org.activityinfo.ui.client.component.filter.FilterToolBar.ApplyFilterHandler;
import org.activityinfo.ui.client.component.filter.FilterToolBar.RemoveFilterEvent;
import org.activityinfo.ui.client.component.filter.FilterToolBar.RemoveFilterHandler;
import org.activityinfo.ui.client.style.legacy.icon.IconImageBundle;
import java.util.ArrayList;
import java.util.List;
/**
* UI Component for editing Admin restrictions on a
* {@link org.activityinfo.legacy.shared.command.Filter}
*
* @author Alex Bertram
*/
public class AdminFilterPanel extends ContentPanel implements FilterPanel {
private final Dispatcher dispatcher;
private TreeStore<AdminEntityDTO> store;
private AdminTreeLoader loader;
private TreePanel<AdminEntityDTO> tree;
private Filter baseFilter = new Filter();
private Filter value = new Filter();
private FilterToolBar filterToolBar;
@Inject
public AdminFilterPanel(Dispatcher service) {
this.dispatcher = service;
initializeComponent();
createAdminEntitiesTree();
createFilterToolBar();
}
private void createAdminEntitiesTree() {
tree = new TreePanel<AdminEntityDTO>(store) {
@Override
protected String register(AdminEntityDTO m) {
String result = super.register(m);
// at this point we know the TreeNode has been created
// so we can set the check state
if (value.getRestrictions(DimensionType.AdminLevel).contains(m.getId())) {
tree.setChecked(m, true);
}
return result;
}
};
tree.setCheckable(true);
tree.setCheckNodes(TreePanel.CheckNodes.BOTH);
tree.setCheckStyle(TreePanel.CheckCascade.CHILDREN);
tree.setDisplayProperty("name");
tree.getStyle().setNodeCloseIcon(null);
tree.getStyle().setNodeOpenIcon(null);
tree.setStateful(true);
tree.addCheckListener(new CheckChangedListener<AdminEntityDTO>() {
@Override
public void checkChanged(CheckChangedEvent<AdminEntityDTO> event) {
filterToolBar.setApplyFilterEnabled(!tree.getCheckedSelection().isEmpty());
}
});
add(tree);
}
private void initializeComponent() {
this.setLayout(new FitLayout());
this.setScrollMode(Style.Scroll.AUTO);
this.setHeadingHtml(I18N.CONSTANTS.filterByGeography());
this.setIcon(IconImageBundle.ICONS.filter());
loader = new AdminTreeLoader(dispatcher);
store = new TreeStore<AdminEntityDTO>(loader);
}
private void createFilterToolBar() {
filterToolBar = new FilterToolBar();
filterToolBar.addApplyFilterHandler(new ApplyFilterHandler() {
@Override
public void onApplyFilter(ApplyFilterEvent deleteEvent) {
applyFilter();
}
});
filterToolBar.addRemoveFilterHandler(new RemoveFilterHandler() {
@Override
public void onRemoveFilter(RemoveFilterEvent deleteEvent) {
removeFilter();
}
});
setTopComponent(filterToolBar);
}
/**
* @return the list of AdminEntityDTOs that user has selected with which the
* filter should be restricted
*/
public List<AdminEntityDTO> getSelection() {
List<AdminEntityDTO> checked = tree.getCheckedSelection();
List<AdminEntityDTO> selected = new ArrayList<AdminEntityDTO>();
for (AdminEntityDTO entity : checked) {
selected.add(entity);
}
return selected;
}
public void setSelection(int id, boolean select) {
for (ModelData model : tree.getStore().getAllItems()) {
if (model instanceof AdminEntityDTO && ((AdminEntityDTO) model).getId() == id) {
tree.setChecked((AdminEntityDTO) model, select);
}
}
}
@Override
public HandlerRegistration addValueChangeHandler(ValueChangeHandler<Filter> handler) {
return addHandler(handler, ValueChangeEvent.getType());
}
private void applyFilter() {
List<AdminEntityDTO> selection = getSelection();
value = new Filter();
for (AdminEntityDTO entity : selection) {
value.addRestriction(DimensionType.AdminLevel, entity.getId());
}
ValueChangeEvent.fire(this, value);
filterToolBar.setRemoveFilterEnabled(true);
}
private void removeFilter() {
for (AdminEntityDTO entity : tree.getCheckedSelection()) {
tree.setChecked(entity, false);
}
value = new Filter();
ValueChangeEvent.fire(this, value);
filterToolBar.setRemoveFilterEnabled(false);
}
@Override
public Filter getValue() {
return value;
}
@Override
public void setValue(Filter value) {
setValue(value, false);
}
@Override
public void setValue(Filter value, boolean fireEvents) {
this.value = new Filter();
this.value.addRestriction(DimensionType.AdminLevel, value.getRestrictions(DimensionType.AdminLevel));
applyInternalState();
filterToolBar.setApplyFilterEnabled(false);
filterToolBar.setRemoveFilterEnabled(value.isRestricted(DimensionType.AdminLevel));
if (fireEvents) {
ValueChangeEvent.fire(this, value);
}
}
@Override
public void applyBaseFilter(final Filter providedFilter) {
Filter filter = new Filter(providedFilter);
filter.clearRestrictions(DimensionType.AdminLevel);
if (baseFilter == null || !baseFilter.equals(filter)) {
loader.setFilter(filter);
loader.load();
baseFilter = filter;
}
}
private void applyInternalState() {
for (AdminEntityDTO treeNode : tree.getStore().getAllItems()) {
tree.setChecked(treeNode, value.getRestrictions(DimensionType.AdminLevel).contains(treeNode.getId()));
}
}
}