package org.sigmah.client.ui.view.project;
/*
* #%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.presenter.project.LinkedProjectPresenter;
import org.sigmah.client.ui.res.icon.IconImageBundle;
import org.sigmah.client.ui.res.icon.dashboard.funding.FundingIconProvider;
import org.sigmah.client.ui.res.icon.dashboard.funding.FundingIconProvider.IconSize;
import org.sigmah.client.ui.view.base.AbstractPopupView;
import org.sigmah.client.ui.widget.button.Button;
import org.sigmah.client.ui.widget.form.FormPanel;
import org.sigmah.client.ui.widget.form.Forms;
import org.sigmah.client.ui.widget.popup.PopupWidget;
import org.sigmah.shared.dto.ProjectDTO;
import org.sigmah.shared.dto.ProjectFundingDTO.LinkedProjectType;
import org.sigmah.shared.dto.country.CountryDTO;
import org.sigmah.shared.dto.referential.ProjectModelType;
import com.extjs.gxt.ui.client.data.ModelData;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.widget.Label;
import com.extjs.gxt.ui.client.widget.form.ComboBox;
import com.extjs.gxt.ui.client.widget.form.LabelField;
import com.extjs.gxt.ui.client.widget.form.NumberField;
import com.google.gwt.user.client.DOM;
import com.google.gwt.user.client.ui.Grid;
import com.google.inject.Singleton;
/**
* Linked project edit frame view used to link a new funding/funded project or edit an existing link.
*
* @author Denis Colliot (dcolliot@ideia.fr)
*/
@Singleton
public class LinkedProjectView extends AbstractPopupView<PopupWidget> implements LinkedProjectPresenter.View {
// CSS style names.
private static final String STYLE_HEADER_LABEL = "header-label";
/**
* The projects list template.
*/
private static final String PROJECTS_LIST_TEMPLATE;
static {
final StringBuilder template = new StringBuilder();
template.append("<tpl for=\".\">");
template.append(" <tpl if=\"!values.").append(ProjectDTO.TYPE_ICON_HTML).append("\">");
template.append(" <div class=\"x-combo-list-item x-combo-list-item-disabled\">");
template.append(" {values.").append(CountryDTO.NAME).append("}");
template.append(" </div>");
template.append(" </tpl>");
template.append(" <tpl if=\"values.").append(ProjectDTO.TYPE_ICON_HTML).append("\">");
template.append(" <div class=\"x-combo-list-item\">");
template.append(" {values.").append(ProjectDTO.TYPE_ICON_HTML).append("} {values.").append(ProjectDTO.COMPLETE_NAME).append("}");
template.append(" </div>");
template.append(" </tpl>");
template.append("</tpl>");
PROJECTS_LIST_TEMPLATE = template.toString();
}
private FormPanel form;
private Label headerLabel;
private ComboBox<ModelData> projectsField;
private LabelField projectTypeField;
private NumberField amountField;
private LabelField percentageField;
private Button saveButton;
private Button deleteButton;
/**
* Builds the view.
*/
public LinkedProjectView() {
super(new PopupWidget(true), 600);
}
/**
* {@inheritDoc}
*/
@Override
public void initialize() {
form = Forms.panel(180);
headerLabel = new Label(I18N.CONSTANTS.createProjectTypeFunding());
headerLabel.setStyleName(STYLE_HEADER_LABEL);
projectsField = Forms.combobox(I18N.CONSTANTS.createProjectTypeFunding(), true, ProjectDTO.ID, ProjectDTO.COMPLETE_NAME, new ListStore<ModelData>());
projectsField.setTemplate(PROJECTS_LIST_TEMPLATE);
projectTypeField = Forms.label(I18N.CONSTANTS.createProjectType());
projectTypeField.setHeight(25);
amountField = Forms.number(I18N.MESSAGES.projectFundedByDetails(null), true);
percentageField = Forms.label(I18N.CONSTANTS.createProjectPercentage());
saveButton = Forms.button(I18N.CONSTANTS.formWindowSubmitAction(), IconImageBundle.ICONS.save());
deleteButton = Forms.button(I18N.CONSTANTS.formWindowDeleteAction(), IconImageBundle.ICONS.linkDelete());
form.add(headerLabel);
form.add(projectsField);
form.add(projectTypeField);
form.add(amountField);
form.add(percentageField);
form.addButton(deleteButton);
form.addButton(saveButton);
initPopup(form);
}
/**
* {@inheritDoc}
*/
@Override
public void setInitializationMode(final LinkedProjectType projectType, final boolean selection, final String projectName) {
// --
// Form labels & fields.
// --
final String headerText;
final String amountFieldLabel;
switch (projectType) {
case FUNDING_PROJECT:
headerText = selection ? I18N.CONSTANTS.createProjectTypeFundingSelectDetails() : I18N.CONSTANTS.createProjectFundingProjectEditDetails();
projectsField.setFieldLabel(I18N.CONSTANTS.createProjectTypeFunding());
amountFieldLabel = I18N.MESSAGES.projectFinancesDetails(projectName);
break;
case FUNDED_PROJECT:
headerText = selection ? I18N.CONSTANTS.createProjectTypePartnerSelectDetails() : I18N.CONSTANTS.createProjectPartnerProjectEditDetails();
projectsField.setFieldLabel(I18N.CONSTANTS.createProjectTypePartner());
amountFieldLabel = I18N.MESSAGES.projectFundedByDetails(projectName);
break;
default:
throw new IllegalArgumentException("Invalid linked project type.");
}
headerLabel.setHtml(headerText + " \"" + projectName + '\"');
amountField.setFieldLabel(amountFieldLabel + " (" + I18N.CONSTANTS.currencyEuro() + ')');
projectsField.setVisible(selection);
projectsField.setEnabled(selection);
projectTypeField.setVisible(selection);
projectTypeField.setEnabled(selection);
// --
// Form delete button.
// --
deleteButton.setEnabled(!selection);
deleteButton.setVisible(!selection);
}
/**
* {@inheritDoc}
*/
@Override
public FormPanel getForm() {
return form;
}
/**
* {@inheritDoc}
*/
@Override
public ComboBox<ModelData> getProjectsField() {
return projectsField;
}
/**
* {@inheritDoc}
*/
@Override
public LabelField getProjectTypeField() {
return projectTypeField;
}
/**
* {@inheritDoc}
*/
@Override
public NumberField getAmountField() {
return amountField;
}
/**
* {@inheritDoc}
*/
@Override
public LabelField getPercentageField() {
return percentageField;
}
/**
* {@inheritDoc}
*/
@Override
public Button getSaveButton() {
return saveButton;
}
/**
* {@inheritDoc}
*/
@Override
public Button getDeleteButton() {
return deleteButton;
}
/**
* {@inheritDoc}
*/
@Override
public void setProjectType(final ProjectModelType type) {
final Grid iconGrid = new Grid(1, 2);
iconGrid.setCellPadding(0);
iconGrid.setCellSpacing(0);
iconGrid.setWidget(0, 0, FundingIconProvider.getProjectTypeIcon(type, IconSize.MEDIUM).createImage());
DOM.setStyleAttribute(iconGrid.getCellFormatter().getElement(0, 0), "paddingTop", "2px");
iconGrid.setText(0, 1, ProjectModelType.getName(type));
DOM.setStyleAttribute(iconGrid.getCellFormatter().getElement(0, 1), "paddingLeft", "5px");
projectTypeField.setValue(iconGrid.getElement().getString());
}
}