package org.activityinfo.ui.client.page.entry; /* * #%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.SelectionMode; import com.extjs.gxt.ui.client.data.ModelData; import com.extjs.gxt.ui.client.data.ModelIconProvider; import com.extjs.gxt.ui.client.event.Events; import com.extjs.gxt.ui.client.event.SelectionChangedEvent; import com.extjs.gxt.ui.client.event.SelectionChangedListener; import com.extjs.gxt.ui.client.store.TreeStore; import com.extjs.gxt.ui.client.widget.Component; import com.extjs.gxt.ui.client.widget.grid.ColumnModel; import com.extjs.gxt.ui.client.widget.grid.EditorGrid.ClicksToEdit; import com.extjs.gxt.ui.client.widget.grid.GridSelectionModel; import com.extjs.gxt.ui.client.widget.tips.QuickTip; import com.extjs.gxt.ui.client.widget.treegrid.EditorTreeGrid; import com.google.gwt.core.client.Scheduler; import com.google.gwt.user.client.ui.AbstractImagePrototype; import org.activityinfo.legacy.client.Dispatcher; import org.activityinfo.legacy.shared.command.Filter; import org.activityinfo.legacy.shared.model.SiteDTO; import org.activityinfo.ui.client.page.entry.grouping.AdminGroupingModel; import org.activityinfo.ui.client.page.entry.grouping.GroupingModel; import org.activityinfo.ui.client.page.entry.grouping.TimeGroupingModel; import org.activityinfo.ui.client.style.legacy.icon.IconImageBundle; final class SiteTreeGrid extends EditorTreeGrid<ModelData> implements SiteGridPanelView { public static final String ADMIN_STATE_ID = "sitetreegrid.admin"; public SiteTreeGrid(Dispatcher dispatcher, GroupingModel groupingModel, Filter filter, ColumnModel columnModel) { super(createStore(dispatcher, groupingModel), columnModel); setLoadMask(true); setStateful(true); setStateId(ADMIN_STATE_ID); setClicksToEdit(ClicksToEdit.TWO); setIconProvider(new ModelIconProvider<ModelData>() { @Override public AbstractImagePrototype getIcon(ModelData model) { if (model instanceof SiteDTO) { SiteDTO site = (SiteDTO) model; if (site.hasCoords()) { return IconImageBundle.ICONS.mapped(); } else { return IconImageBundle.ICONS.unmapped(); } } else { return IconImageBundle.ICONS.folder(); } } }); GridSelectionModel<ModelData> sm = new GridSelectionModel<ModelData>(); sm.setSelectionMode(SelectionMode.SINGLE); sm.addSelectionChangedListener(new SelectionChangedListener<ModelData>() { @Override public void selectionChanged(SelectionChangedEvent<ModelData> se) { if (se.getSelectedItem() instanceof SiteDTO) { fireEvent(Events.SelectionChange, se); } } }); setSelectionModel(sm); getLoader().setFilter(filter); Scheduler.get().scheduleDeferred(new Scheduler.ScheduledCommand() { @Override public void execute() { new QuickTip(SiteTreeGrid.this); } }); } private static TreeStore<ModelData> createStore(Dispatcher dispatcher, GroupingModel groupingModel) { SiteTreeLoader loader; if (groupingModel instanceof AdminGroupingModel) { loader = new SiteAdminTreeLoader(dispatcher, (AdminGroupingModel) groupingModel); } else if (groupingModel instanceof TimeGroupingModel) { loader = new SiteTimeTreeLoader(dispatcher); } else { throw new IllegalArgumentException("Invalid grouping model " + groupingModel); } TreeStore<ModelData> treeStore = new TreeStore<ModelData>(loader); treeStore.setKeyProvider(loader); return treeStore; } private SiteTreeLoader getLoader() { return (SiteTreeLoader) getTreeStore().getLoader(); } @Override public void addSelectionChangeListener(SelectionChangedListener<SiteDTO> selectionChangedListener) { addListener(Events.SelectionChange, selectionChangedListener); } @Override public void refresh() { getTreeStore().removeAll(); getLoader().load(); } @Override public Component asComponent() { return this; } @Override public SiteDTO getSelection() { ModelData selection = getSelectionModel().getSelectedItem(); if (selection instanceof SiteDTO) { return (SiteDTO) selection; } else { return null; } } }