package org.sigmah.client.ui.view.project.dashboard;
/*
* #%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 org.sigmah.client.i18n.I18N;
import org.sigmah.client.ui.res.icon.dashboard.funding.FundingIconProvider;
import org.sigmah.client.util.NumberUtils;
import org.sigmah.shared.dto.ProjectDTO;
import org.sigmah.shared.dto.ProjectFundingDTO;
import org.sigmah.shared.dto.ProjectFundingDTO.LinkedProjectType;
import org.sigmah.shared.dto.referential.ProjectModelType;
import com.extjs.gxt.ui.client.Style.HorizontalAlignment;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.widget.Label;
import com.extjs.gxt.ui.client.widget.grid.ColumnConfig;
import com.extjs.gxt.ui.client.widget.grid.ColumnData;
import com.extjs.gxt.ui.client.widget.grid.Grid;
import com.extjs.gxt.ui.client.widget.grid.GridCellRenderer;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
/**
* Provides linked projects columns configuration.
*
* @author Denis Colliot (dcolliot@ideia.fr)
*/
public final class LinkedProjectsColumnsProvider extends LinkedProjectsAbstractProvider {
private ProjectDTO project;
/**
* Initializes the linked projects columns provider.
*
* @param view
* See {@link #view}.
* @param projectType
* See {@link #projectType}.
*/
public LinkedProjectsColumnsProvider(final ProjectDashboardView view, final LinkedProjectType projectType) {
super(view, projectType);
}
public void setProject(ProjectDTO project) {
this.project = project;
}
/**
* Builds the columns for the funding/funded projects grids.
*
* @return The columns for the funding/funded projects grids.
*/
public ColumnConfig[] getLinkedProjectsColumnModel() {
// Icon.
final ColumnConfig iconColumn = new ColumnConfig();
iconColumn.setId("icon");
iconColumn.setSortable(false);
iconColumn.setWidth(15);
iconColumn.setAlignment(HorizontalAlignment.CENTER);
iconColumn.setRenderer(new GridCellRenderer<ProjectFundingDTO>() {
@Override
public Object render(ProjectFundingDTO model, String property, ColumnData config, int rowIndex, int colIndex, ListStore<ProjectFundingDTO> store,
Grid<ProjectFundingDTO> grid) {
final ProjectModelType type = view.getPresenterHandler().getProjectModelType(getProject(model));
return FundingIconProvider.getProjectTypeIcon(type).createImage();
}
});
// Name.
final ColumnConfig nameColumn = new ColumnConfig();
nameColumn.setId(ProjectDTO.NAME);
nameColumn.setHeaderText(I18N.CONSTANTS.projectName());
nameColumn.setWidth(80);
nameColumn.setRenderer(new GridCellRenderer<ProjectFundingDTO>() {
@Override
public Object render(final ProjectFundingDTO model, String property, ColumnData config, int rowIndex, int colIndex, ListStore<ProjectFundingDTO> store,
Grid<ProjectFundingDTO> grid) {
final com.google.gwt.user.client.ui.Label label = new com.google.gwt.user.client.ui.Label(getProject(model).getName());
// BUGFIX: #770 Using the right style name to display project name like an hyperlink.
label.addStyleName("hyperlink-label");
label.addClickHandler(new ClickHandler() {
@Override
public void onClick(ClickEvent event) {
view.getPresenterHandler().onLinkedProjectClickEvent(getProject(model));
}
});
return label;
}
});
// Full name.
final ColumnConfig fullNameColumn = new ColumnConfig();
fullNameColumn.setId(ProjectDTO.FULL_NAME);
fullNameColumn.setHeaderText(I18N.CONSTANTS.projectFullName());
fullNameColumn.setWidth(130);
fullNameColumn.setRenderer(new GridCellRenderer<ProjectFundingDTO>() {
@Override
public Object render(ProjectFundingDTO model, String property, ColumnData config, int rowIndex, int colIndex, ListStore<ProjectFundingDTO> store,
Grid<ProjectFundingDTO> grid) {
return new Label(getProject(model).getFullName());
}
});
// Amount.
final ColumnConfig amountColumn = new ColumnConfig();
amountColumn.setId(ProjectFundingDTO.PERCENTAGE);
if (this.projectType == LinkedProjectType.FUNDING_PROJECT) {
amountColumn.setHeaderHtml(I18N.CONSTANTS.projectFinances() + " (" + I18N.CONSTANTS.currencyEuro() + ')');
} else {
amountColumn.setHeaderHtml(I18N.CONSTANTS.projectFundedBy() + " (" + I18N.CONSTANTS.currencyEuro() + ')');
}
amountColumn.setWidth(120);
// Percentage.
final ColumnConfig percentageColumn = new ColumnConfig();
percentageColumn.setId("percentage2");
percentageColumn.setHeaderText(I18N.CONSTANTS.createProjectPercentage());
percentageColumn.setWidth(60);
percentageColumn.setRenderer(new GridCellRenderer<ProjectFundingDTO>() {
@Override
public Object render(ProjectFundingDTO model, String property, ColumnData config, int rowIndex, int colIndex, ListStore<ProjectFundingDTO> store,
Grid<ProjectFundingDTO> grid) {
// The amount of the funding.
final Double amount = model.getPercentage();
// The current project budget.
final Double budget = projectType == LinkedProjectType.FUNDING_PROJECT ?
project.getPlannedBudget() :
getProject(model).getPlannedBudget();
return new Label(NumberUtils.ratioAsString(amount, budget));
}
});
// Edit icon.
final ColumnConfig editButtonColumn = new ColumnConfig();
editButtonColumn.setId("editButton");
editButtonColumn.setSortable(false);
editButtonColumn.setWidth(30);
editButtonColumn.setAlignment(HorizontalAlignment.LEFT);
editButtonColumn.setRenderer(new LinkedProjectsEditButtonCellRender(view, projectType));
return new ColumnConfig[] {
iconColumn,
nameColumn,
fullNameColumn,
amountColumn,
percentageColumn,
editButtonColumn
};
}
}