package org.activityinfo.ui.client.page.common.grid; /* * #%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.data.Loader; import com.extjs.gxt.ui.client.data.ModelData; import com.extjs.gxt.ui.client.data.PagingLoader; import com.extjs.gxt.ui.client.event.SelectionChangedEvent; import com.extjs.gxt.ui.client.event.SelectionChangedListener; import com.extjs.gxt.ui.client.store.ListStore; import com.extjs.gxt.ui.client.store.Store; import com.extjs.gxt.ui.client.widget.ContentPanel; import com.extjs.gxt.ui.client.widget.grid.CellSelectionModel; import com.extjs.gxt.ui.client.widget.grid.Grid; import com.extjs.gxt.ui.client.widget.grid.GridSelectionModel; import com.extjs.gxt.ui.client.widget.toolbar.PagingToolBar; import org.activityinfo.i18n.shared.I18N; import org.activityinfo.legacy.client.AsyncMonitor; import org.activityinfo.legacy.client.monitor.MaskingAsyncMonitor; import org.activityinfo.ui.client.page.common.toolbar.ActionToolBar; public abstract class AbstractGridView<M extends ModelData, P extends GridPresenter<M>> extends ContentPanel implements GridView<P, M> { protected ActionToolBar toolBar; protected P presenter; protected PagingToolBar pagingBar; private Grid<M> grid; protected abstract <D extends ModelData> Grid<D> createGridAndAddToContainer(Store store); protected abstract void initToolBar(); public void init(final P presenter, Store store) { this.presenter = presenter; createToolBar(); grid = createGridAndAddToContainer(store); initGridListeners(grid); if (store instanceof ListStore) { Loader loader = ((ListStore) store).getLoader(); if (loader instanceof PagingLoader) { pagingBar = new PagingToolBar(presenter.getPageSize()); setBottomComponent(pagingBar); pagingBar.bind((PagingLoader<?>) loader); } } /** * In some cases, there is async call before the user inerface can be * loaded. So we have to make sure our new components are rendered */ if (this.isRendered()) { this.layout(); } } protected void initGridListeners(Grid<M> grid) { grid.getSelectionModel().addSelectionChangedListener(new SelectionChangedListener<M>() { @Override public void selectionChanged(SelectionChangedEvent<M> se) { presenter.onSelectionChanged(se.getSelectedItem()); } }); } protected void createToolBar() { toolBar = new ActionToolBar(presenter); setTopComponent(toolBar); initToolBar(); toolBar.setDirty(false); } @Override public void setActionEnabled(String actionId, boolean enabled) { toolBar.setActionEnabled(actionId, enabled); } @Override public void confirmDeleteSelected(ConfirmCallback callback) { callback.confirmed(); } @Override public M getSelection() { GridSelectionModel<M> sm = grid.getSelectionModel(); if (sm instanceof CellSelectionModel) { CellSelectionModel<M>.CellSelection cell = ((CellSelectionModel<M>) sm).getSelectCell(); return cell == null ? null : cell.model; } else { return sm.getSelectedItem(); } } @Override public AsyncMonitor getDeletingMonitor() { return new MaskingAsyncMonitor(this, I18N.CONSTANTS.deleting()); } @Override public AsyncMonitor getSavingMonitor() { return new MaskingAsyncMonitor(this, I18N.CONSTANTS.saving()); } public void refresh() { grid.getView().refresh(false); } }