package org.sigmah.client.ui.presenter.project.projectcore;
/*
* #%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.client.dispatch.CommandResultHandler;
import org.sigmah.client.i18n.I18N;
import org.sigmah.client.inject.Injector;
import org.sigmah.client.page.Page;
import org.sigmah.client.page.PageRequest;
import org.sigmah.client.page.RequestParameter;
import org.sigmah.client.ui.notif.N10N;
import org.sigmah.client.ui.presenter.base.AbstractPagePresenter;
import org.sigmah.client.ui.view.base.ViewPopupInterface;
import org.sigmah.client.ui.view.project.projectcore.DiffEntry;
import org.sigmah.client.ui.view.project.projectcore.ProjectCoreDiffView;
import org.sigmah.shared.command.GetValue;
import org.sigmah.shared.command.result.ValueResult;
import org.sigmah.shared.dto.AmendmentDTO;
import org.sigmah.shared.dto.ProjectDTO;
import org.sigmah.shared.dto.element.FlexibleElementDTO;
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.widget.ContentPanel;
import com.extjs.gxt.ui.client.widget.form.ComboBox;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.google.inject.ImplementedBy;
import com.google.inject.Inject;
import com.google.inject.Singleton;
import org.sigmah.shared.command.BatchCommand;
import org.sigmah.shared.command.result.ListResult;
import org.sigmah.shared.command.result.Result;
/**
* Manages the diff view between core versions.
*
* @author Mehdi Benabdeslam (mehdi.benabdeslam@netapsys.fr)
* @author Raphaƫl Calabro (rcalabro@ideia.fr)
*/
@Singleton
public class ProjectCoreDiffPresenter extends AbstractPagePresenter<ProjectCoreDiffPresenter.View> {
private static final int LEFT = 0;
private static final int RIGHT = 1;
private ProjectDTO project;
private boolean show = true;
@ImplementedBy(ProjectCoreDiffView.class)
public static interface View extends ViewPopupInterface {
ContentPanel getMainPanel();
ComboBox<AmendmentDTO> getAmendmentsComboBox1();
ListStore<AmendmentDTO> getAmendmentStore1();
ComboBox<AmendmentDTO> getAmendmentsComboBox2();
ListStore<AmendmentDTO> getAmendmentStore2();
Grid<DiffEntry> getProjectFields();
ListStore<DiffEntry> getProjectFieldsValueStore();
}
@Inject
protected ProjectCoreDiffPresenter(View view, Injector injector) {
super(view, injector);
}
@Override
public Page getPage() {
return Page.PROJECT_AMENDMENT_DIFF;
}
@Override
public void onBind() {
view.getAmendmentsComboBox1().addSelectionChangedListener(new SelectionChangedListener<AmendmentDTO>() {
@Override
public void selectionChanged(SelectionChangedEvent<AmendmentDTO> se) {
loadCoreVersion(se, LEFT);
}
});
view.getAmendmentsComboBox2().addSelectionChangedListener(new SelectionChangedListener<AmendmentDTO>() {
@Override
public void selectionChanged(SelectionChangedEvent<AmendmentDTO> se) {
loadCoreVersion(se, RIGHT);
}
});
}
@Override
public void onPageRequest(PageRequest request) {
setPageTitle(I18N.CONSTANTS.projectCoreCompareVersion());
project = request.getData(RequestParameter.DTO);
if (project.getAmendments().isEmpty()) {
show = false;
N10N.info(I18N.MESSAGES.amendmentCompareNoValue());
}
if (initView(project) == false) {
show = false;
N10N.info(I18N.MESSAGES.amendmentCompareNoFields());
}
}
public boolean initView(ProjectDTO project) {
view.getAmendmentStore1().removeAll();
view.getAmendmentStore2().removeAll();
view.getProjectFieldsValueStore().removeAll();
view.getAmendmentsComboBox1().setValue(null);
view.getAmendmentsComboBox2().setValue(null);
final AmendmentDTO projectAmendment = new AmendmentDTO(project);
projectAmendment.setName(I18N.CONSTANTS.projectCoreCurrent());
view.getAmendmentStore1().add(project.getAmendments());
view.getAmendmentStore1().add(projectAmendment);
view.getAmendmentStore2().add(project.getAmendments());
view.getAmendmentStore2().add(projectAmendment);
List<DiffEntry> listFieldsAmendable = new ArrayList<DiffEntry>();
for (FlexibleElementDTO field : project.getProjectModel().getAllElements()) {
if (field.getAmendable()) {
// BUGFIX #728: Using the cache to resolve users and countries.
field.setCache(injector.getClientCache());
DiffEntry entry = new DiffEntry();
entry.setField(field);
listFieldsAmendable.add(entry);
}
}
view.getProjectFieldsValueStore().add(listFieldsAmendable);
view.getProjectFieldsValueStore().commitChanges();
view.getAmendmentStore1().commitChanges();
view.getAmendmentStore2().commitChanges();
if(!project.getAmendments().isEmpty()) {
view.getAmendmentsComboBox1().setValue(project.getAmendments().get(project.getAmendments().size() - 1));
}
view.getAmendmentsComboBox2().setValue(projectAmendment);
return !listFieldsAmendable.isEmpty();
}
private void loadCoreVersion(SelectionChangedEvent<AmendmentDTO> event, final int position) {
if (event.getSelectedItem() != null) {
final AmendmentDTO coreVersion = event.getSelectedItem();
final BatchCommand batchCommand = new BatchCommand();
for (int index = 0; index < view.getProjectFieldsValueStore().getCount(); index++) {
final DiffEntry entry = view.getProjectFieldsValueStore().getAt(index);
final FlexibleElementDTO field = entry.getField();
batchCommand.add(new GetValue(project.getId(), field.getId(),
field.getEntityName(), coreVersion.getId()));
}
dispatch.execute(batchCommand, new CommandResultHandler<ListResult<Result>>() {
@Override
protected void onCommandSuccess(ListResult<Result> results) {
for (int index = 0; index < view.getProjectFieldsValueStore().getCount(); index++) {
final ValueResult result = (ValueResult) results.getList().get(index);
final DiffEntry entry = view.getProjectFieldsValueStore().getAt(index);
entry.setValue(position, result.getValueObject());
view.getProjectFieldsValueStore().update(entry);
}
}
});
}
}
@Override
protected void onViewRevealed() {
if (!show) {
view.hide();
}
}
}