package org.sigmah.client.ui.widget.popup; /* * #%L * Sigmah * %% * Copyright (C) 2010 - 2016 URD * %% * 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 java.util.ArrayList; import java.util.List; import org.sigmah.shared.command.GetIndicators; import org.sigmah.shared.command.GetProjects; import org.sigmah.shared.command.result.IndicatorListResult; import org.sigmah.shared.dto.IndicatorDTO; import org.sigmah.shared.dto.IndicatorDataSourceDTO; import com.extjs.gxt.ui.client.data.BaseTreeLoader; import com.extjs.gxt.ui.client.data.ModelData; import com.extjs.gxt.ui.client.data.ModelIconProvider; import com.extjs.gxt.ui.client.data.ModelStringProvider; import com.extjs.gxt.ui.client.data.RpcProxy; import com.extjs.gxt.ui.client.data.TreeLoader; import com.extjs.gxt.ui.client.event.ButtonEvent; import com.extjs.gxt.ui.client.event.SelectionListener; import com.extjs.gxt.ui.client.store.TreeStore; import com.extjs.gxt.ui.client.widget.button.Button; import com.extjs.gxt.ui.client.widget.treepanel.TreePanel; import com.extjs.gxt.ui.client.widget.treepanel.TreePanel.CheckNodes; import com.google.gwt.user.client.rpc.AsyncCallback; import com.google.gwt.user.client.ui.AbstractImagePrototype; import com.google.inject.Inject; import org.sigmah.client.dispatch.CommandResultHandler; import org.sigmah.client.dispatch.DispatchAsync; import org.sigmah.client.i18n.I18N; import org.sigmah.client.ui.res.icon.IconImageBundle; import org.sigmah.client.ui.view.base.AbstractPopupView; import org.sigmah.client.ui.widget.form.Forms; import org.sigmah.shared.command.result.ListResult; import org.sigmah.shared.command.result.VoidResult; import org.sigmah.shared.dto.ProjectDTO; import org.sigmah.shared.dto.referential.ProjectModelType; /** * Dialog that enables a user to select Indicators. * * @author Alexander Bertram (akbertram@gmail.com) v1.3 * @author Raphaƫl Calabro (rcalabro@gmail.com) v2.0 */ public class IndicatorBrowsePopup extends AbstractPopupView<PopupWidget> { private final DispatchAsync dispatcher; private final TreeLoader<ModelData> loader; private TreePanel<ModelData> treePanel; private AsyncCallback<VoidResult> callback; @Inject public IndicatorBrowsePopup(DispatchAsync dispatcher) { super(new PopupWidget(true)); this.dispatcher = dispatcher; this.loader = new BaseTreeLoader<ModelData>(new TreeProxy()) { @Override public boolean hasChildren(ModelData parent) { return parent instanceof ProjectDTO; } }; } @Override public void initialize() { setPopupTitle(I18N.CONSTANTS.selectIndicators()); final TreeStore<ModelData> treeStore = new TreeStore<ModelData>(loader); treePanel = new TreePanel<ModelData>(treeStore); treePanel.setCheckable(true); treePanel.setCheckNodes(CheckNodes.LEAF); treePanel.setIconProvider(new ModelIconProvider<ModelData>() { @Override public AbstractImagePrototype getIcon(ModelData model) { if(model instanceof ProjectDTO) { return IconImageBundle.ICONS.database(); } else { return null; } } }); treePanel.setLabelProvider(new ModelStringProvider<ModelData>() { @Override public String getStringValue(ModelData model, String property) { if(model instanceof ProjectDTO) { return ((ProjectDTO) model).getFullName(); } else if (model instanceof IndicatorDTO) { return ((IndicatorDTO) model).getName(); } else { throw new IllegalArgumentException("ModelData class should either be ProjectDTO or IndicatorDTO. Found: " + model.getClass()); } } }); final Button okButton = Forms.button(I18N.CONSTANTS.ok()); okButton.addSelectionListener(new SelectionListener<ButtonEvent>() { @Override public void componentSelected(ButtonEvent ce) { callback.onSuccess(null); } }); final Button cancelButton = Forms.button(I18N.CONSTANTS.cancel()); cancelButton.addSelectionListener(new SelectionListener<ButtonEvent>() { @Override public void componentSelected(ButtonEvent ce) { hide(); } }); getPopup().addButton(okButton); getPopup().addButton(cancelButton); initPopup(treePanel); } /** * Shows the form and calls back if the user clicks OK. * * @param callback */ public void show(AsyncCallback<VoidResult> callback) { this.callback = callback; center(); loader.load(); } /** * * @return the list of checked indicators. */ public List<IndicatorDTO> getSelection() { return (List)treePanel.getCheckedSelection(); } /** * * @return the selected indicators as {@link IndicatorDataSourceDTO} dtos. */ public List<IndicatorDataSourceDTO> getSelectionAsDataSources() { List<IndicatorDataSourceDTO> list = new ArrayList<IndicatorDataSourceDTO>(); for(ModelData model : treePanel.getCheckedSelection()) { IndicatorDTO indicator = (IndicatorDTO) model; ProjectDTO project = (ProjectDTO) treePanel.getStore().getParent(model); IndicatorDataSourceDTO datasource = new IndicatorDataSourceDTO(); datasource.setDatabaseId(project.getId()); datasource.setDatabaseName(project.getName()); datasource.setIndicatorCode(indicator.getCode()); datasource.setIndicatorName(indicator.getName()); datasource.setIndicatorId(indicator.getId()); list.add(datasource); } return list; } private class TreeProxy extends RpcProxy<List<?>> { @Override protected void load(Object parent, final AsyncCallback<List<?>> callback) { if(parent == null) { final GetProjects command = new GetProjects((ProjectModelType) null, ProjectDTO.Mode.BASE); dispatcher.execute(command, new CommandResultHandler<ListResult<ProjectDTO>>() { @Override protected void onCommandSuccess(ListResult<ProjectDTO> result) { callback.onSuccess(result.getList()); } }); } else if(parent instanceof ProjectDTO) { dispatcher.execute(new GetIndicators((ProjectDTO)parent), new CommandResultHandler<IndicatorListResult>() { @Override protected void onCommandSuccess(IndicatorListResult result) { callback.onSuccess(result.getData()); } }); } } } }