package org.activityinfo.ui.client.page.entry.column;
/*
* #%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.Style;
import com.extjs.gxt.ui.client.data.ModelData;
import com.extjs.gxt.ui.client.store.ListStore;
import com.extjs.gxt.ui.client.widget.form.NumberField;
import com.extjs.gxt.ui.client.widget.grid.*;
import com.extjs.gxt.ui.client.widget.treegrid.TreeGridCellRenderer;
import com.google.common.collect.Lists;
import com.google.gwt.safehtml.shared.SafeHtmlUtils;
import org.activityinfo.model.type.FieldTypeClass;
import org.activityinfo.i18n.shared.I18N;
import org.activityinfo.legacy.client.type.IndicatorNumberFormat;
import org.activityinfo.legacy.shared.model.*;
import org.activityinfo.ui.client.page.common.columns.EditableLocalDateColumn;
import org.activityinfo.ui.client.page.common.columns.ReadTextColumn;
import org.activityinfo.ui.client.util.GwtUtil;
import java.util.List;
/**
* Builder class for constructing a ColumnModel for site grids
*/
public class ColumnModelBuilder {
private List<ColumnConfig> columns = Lists.newArrayList();
public ColumnModelBuilder addActivityColumn(final UserDatabaseDTO database) {
ColumnConfig config = new ColumnConfig("activityId", I18N.CONSTANTS.activity(), 100);
config.setToolTip(I18N.CONSTANTS.activity());
config.setRenderer(new GridCellRenderer<SiteDTO>() {
@Override
public Object render(SiteDTO model,
String property,
ColumnData config,
int rowIndex,
int colIndex,
ListStore<SiteDTO> store,
Grid<SiteDTO> grid) {
ActivityDTO activity = database.getActivityById(model.getActivityId());
return GwtUtil.valueWithTooltip(activity == null ? "" : activity.getName());
}
});
columns.add(config);
return this;
}
public ColumnModelBuilder addActivityColumn(final SchemaDTO schema) {
ColumnConfig config = new ColumnConfig("activityId", I18N.CONSTANTS.activity(), 100);
config.setToolTip(I18N.CONSTANTS.activity());
config.setRenderer(new GridCellRenderer<SiteDTO>() {
@Override
public Object render(SiteDTO model,
String property,
ColumnData config,
int rowIndex,
int colIndex,
ListStore<SiteDTO> store,
Grid<SiteDTO> grid) {
ActivityDTO activity = schema.getActivityById(model.getActivityId());
return GwtUtil.valueWithTooltip(activity == null ? "" : activity.getName());
}
});
columns.add(config);
return this;
}
public ColumnModelBuilder addDatabaseColumn(final SchemaDTO schema) {
ColumnConfig config = new ColumnConfig("activityId", I18N.CONSTANTS.database(), 100);
config.setToolTip(I18N.CONSTANTS.database());
config.setRenderer(new GridCellRenderer<SiteDTO>() {
@Override
public Object render(SiteDTO model,
String property,
ColumnData config,
int rowIndex,
int colIndex,
ListStore<SiteDTO> store,
Grid<SiteDTO> grid) {
ActivityDTO activity = schema.getActivityById(model.getActivityId());
return GwtUtil.valueWithTooltip(activity == null ? "" : activity.getDatabaseName());
}
});
columns.add(config);
return this;
}
public ColumnModel build() {
return new ColumnModel(columns);
}
protected ColumnModelBuilder maybeAddProjectColumn(ActivityFormDTO activity) {
if (!activity.getProjects().isEmpty()) {
addProjectColumn();
}
return this;
}
public void addProjectColumn() {
columns.add(new ReadTextColumn("project", I18N.CONSTANTS.project(), 100));
}
public ColumnModelBuilder maybeAddLockColumn(final ActivityFormDTO activity) {
if (activity.getReportingFrequency() == ActivityFormDTO.REPORT_ONCE) {
ColumnConfig columnLocked = new ColumnConfig("x", "", 28);
columnLocked.setRenderer(new LockedColumnRenderer(activity.getLockedPeriodSet()));
columnLocked.setSortable(false);
columnLocked.setMenuDisabled(true);
columns.add(columnLocked);
}
return this;
}
public ColumnConfig createIndicatorColumn(IndicatorDTO indicator, String header) {
NumberField indicatorField = new NumberField();
indicatorField.getPropertyEditor().setFormat(IndicatorNumberFormat.INSTANCE);
String columnName = SafeHtmlUtils.fromString(header).asString();
ColumnConfig indicatorColumn = new ColumnConfig(indicator.getPropertyName(),
columnName, 50);
indicatorColumn.setToolTip(columnName);
indicatorColumn.setNumberFormat(IndicatorNumberFormat.INSTANCE);
indicatorColumn.setEditor(new CellEditor(indicatorField));
indicatorColumn.setAlignment(Style.HorizontalAlignment.RIGHT);
if (indicator.getType() == FieldTypeClass.QUANTITY) {
// For SUM indicators, don't show ZEROs in the Grid
// (it looks better if we don't)
if (indicator.getAggregation() == IndicatorDTO.AGGREGATE_SUM) {
indicatorColumn.setRenderer(new GridCellRenderer() {
@Override
public Object render(ModelData model,
String property,
ColumnData config,
int rowIndex,
int colIndex,
ListStore listStore,
Grid grid) {
Object value = model.get(property);
if (value instanceof Double && (Double) value != 0) {
return GwtUtil.valueWithTooltip(IndicatorNumberFormat.INSTANCE.format((Double) value));
} else {
return "";
}
}
});
} else if (indicator.getAggregation() == IndicatorDTO.AGGREGATE_SITE_COUNT) {
indicatorColumn.setRenderer(new GridCellRenderer() {
@Override
public Object render(ModelData model,
String property,
ColumnData config,
int rowIndex,
int colIndex,
ListStore listStore,
Grid grid) {
return GwtUtil.valueWithTooltip("1"); // the value of a site count indicator a single site is always 1
}
});
}
} else if (indicator.getType() == FieldTypeClass.FREE_TEXT || indicator.getType() == FieldTypeClass.NARRATIVE) {
indicatorColumn.setRenderer(new GridCellRenderer() {
@Override
public Object render(ModelData model,
String property,
ColumnData config,
int rowIndex,
int colIndex,
ListStore listStore,
Grid grid) {
Object value = model.get(property);
return value instanceof String ? GwtUtil.valueWithTooltip((String) value) : "";
}
});
}
return indicatorColumn;
}
public ColumnModelBuilder addIndicatorColumn(IndicatorDTO indicator, String header) {
columns.add(createIndicatorColumn(indicator, header));
return this;
}
public ColumnModelBuilder maybeAddTwoLineLocationColumn(ActivityFormDTO activity) {
if (activity.getLocationType().getBoundAdminLevelId() == null) {
ReadTextColumn column = new ReadTextColumn("locationName", activity.getLocationType().getName(), 100);
column.setRenderer(new LocationColumnRenderer());
columns.add(column);
}
return this;
}
public ColumnModelBuilder maybeAddSingleLineLocationColumn(ActivityFormDTO activity) {
if (activity.getLocationType().getBoundAdminLevelId() == null) {
ReadTextColumn column = new ReadTextColumn("locationName", activity.getLocationType().getName(), 100);
columns.add(column);
}
return this;
}
public ColumnModelBuilder addLocationColumn() {
ReadTextColumn column = new ReadTextColumn("locationName", I18N.CONSTANTS.location(), 100);
columns.add(column);
return this;
}
public ColumnModelBuilder addAdminLevelColumns(ActivityFormDTO activity) {
return addAdminLevelColumns(activity.getAdminLevels());
}
public ColumnModelBuilder addSingleAdminColumn(ActivityFormDTO activity) {
ColumnConfig admin = new ColumnConfig("admin", I18N.CONSTANTS.location(), 100);
admin.setToolTip(I18N.CONSTANTS.location());
admin.setRenderer(new AdminColumnRenderer(activity.getAdminLevels()));
columns.add(admin);
return this;
}
public ColumnModelBuilder addAdminLevelColumns(List<AdminLevelDTO> adminLevels) {
for (AdminLevelDTO level : adminLevels) {
ColumnConfig column = new ColumnConfig(AdminLevelDTO.getPropertyName(level.getId()), level.getName(), 100);
column.setToolTip(level.getName());
column.setRenderer(new StringWithTooltipRenderer());
columns.add(column);
}
return this;
}
public ColumnModelBuilder addAdminLevelColumns(UserDatabaseDTO database) {
return addAdminLevelColumns(database.getCountry().getAdminLevels());
}
public ColumnModelBuilder maybeAddPartnerColumn(ActivityFormDTO activity) {
addPartnerColumn();
return this;
}
public ColumnModelBuilder maybeAddPartnerColumn(UserDatabaseDTO activity) {
addPartnerColumn();
return this;
}
public ColumnModelBuilder addPartnerColumn() {
ColumnConfig column = new ColumnConfig("partner", I18N.CONSTANTS.partner(), 100);
column.setToolTip(I18N.CONSTANTS.partner());
column.setRenderer(new StringWithTooltipRenderer());
columns.add(column);
return this;
}
public ColumnModelBuilder maybeAddDateColumn(ActivityFormDTO activity) {
if (activity.getReportingFrequency() == ActivityFormDTO.REPORT_ONCE) {
columns.add(new EditableLocalDateColumn("date2", I18N.CONSTANTS.date(), 100));
}
return this;
}
public ColumnModelBuilder addMapColumn() {
ColumnConfig mapColumn = new ColumnConfig("x", "", 25);
mapColumn.setRenderer(new GridCellRenderer<ModelData>() {
@Override
public Object render(ModelData model,
String property,
ColumnData config,
int rowIndex,
int colIndex,
ListStore listStore,
Grid grid) {
if (model instanceof SiteDTO) {
SiteDTO siteModel = (SiteDTO) model;
if (siteModel.hasCoords()) {
return "<div class='mapped'> </div>";
} else {
return "<div class='unmapped'> </div>";
}
}
return " ";
}
});
columns.add(mapColumn);
return this;
}
public ColumnModelBuilder maybeAddKeyIndicatorColumns(ActivityFormDTO activity) {
// Only add indicators that have a queries heading
if (activity.getReportingFrequency() == ActivityFormDTO.REPORT_ONCE) {
for (IndicatorDTO indicator : activity.getIndicators()) {
if (indicator.getListHeader() != null && !indicator.getListHeader().isEmpty()) {
columns.add(createIndicatorColumn(indicator, indicator.getListHeader()));
}
}
}
return this;
}
public ColumnModelBuilder addTreeNameColumn() {
ColumnConfig name = new ColumnConfig("name", I18N.CONSTANTS.location(), 200);
name.setToolTip(I18N.CONSTANTS.location());
name.setRenderer(new TreeGridCellRenderer<ModelData>() {
@Override
public Object render(ModelData model,
String property,
ColumnData config,
int rowIndex,
int colIndex,
ListStore<ModelData> store,
Grid<ModelData> grid) {
return super.render(model, propertyName(model), config, rowIndex, colIndex, store, grid);
}
private String propertyName(ModelData model) {
if (model instanceof SiteDTO) {
return "locationName";
} else {
return "name";
}
}
});
columns.add(name);
return this;
}
public ColumnModelBuilder maybeAddProjectColumn(UserDatabaseDTO database) {
if (database.getProjects().size() > 1) {
addProjectColumn();
}
return this;
}
}