package org.activityinfo.server.report.renderer.itext;
/*
* #%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.google.inject.Inject;
import com.lowagie.text.*;
import org.activityinfo.legacy.shared.model.SiteDTO;
import org.activityinfo.legacy.shared.reports.content.TableData;
import org.activityinfo.legacy.shared.reports.model.TableColumn;
import org.activityinfo.legacy.shared.reports.model.TableElement;
import java.text.DateFormat;
import java.text.NumberFormat;
import java.util.Date;
import java.util.List;
/**
* Renders a {@link org.activityinfo.legacy.shared.reports.model.TableElement} to an
* iText Document.
*/
public class ItextTableRenderer implements ItextRenderer<TableElement> {
private final ItextMapRenderer mapRenderer;
@Inject
public ItextTableRenderer(ItextMapRenderer mapRenderer) {
this.mapRenderer = mapRenderer;
}
@Override
public void render(DocWriter writer, Document document, TableElement element) throws DocumentException {
document.add(ThemeHelper.elementTitle(element.getTitle()));
ItextRendererHelper.addFilterDescription(document, element.getContent().getFilterDescriptions());
ItextRendererHelper.addDateFilterDescription(document, element.getFilter().getDateRange());
TableData data = element.getContent().getData();
if (data.isEmpty()) {
renderEmptyText(document);
} else {
if (element.getMap() != null) {
mapRenderer.renderMap(writer, element.getMap(), document);
}
renderTable(document, data);
}
}
private void renderEmptyText(Document document) throws DocumentException {
document.add(new Paragraph("Aucune Données")); // TODO: i18n
}
private void renderTable(Document document, TableData data) throws DocumentException {
int colDepth = data.getRootColumn().getDepth();
List<TableColumn> colLeaves = data.getRootColumn().getLeaves();
int colBreadth = colLeaves.size();
Table table = new Table(colBreadth, 1);
table.setUseVariableBorders(true);
table.setWidth(100.0f);
table.setBorderWidth(0);
// first write the column headers
for (int depth = 1; depth <= colDepth; ++depth) {
List<TableColumn> columns = data.getRootColumn().getDescendantsAtDepth(depth);
for (TableColumn column : columns) {
Cell cell = ThemeHelper.columnHeaderCell(column.getLabel(), column.isLeaf(), computeHAlign(column));
cell.setColspan(Math.max(1, column.getChildren().size()));
cell.setRowspan(colDepth - depth - column.getDepth() + 1);
table.addCell(cell);
}
}
table.endHeaders();
DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM);
NumberFormat numberFormat = NumberFormat.getIntegerInstance();
numberFormat.setGroupingUsed(true);
for (SiteDTO row : data.getRows()) {
for (TableColumn column : colLeaves) {
Object value = row.get(column.getSitePropertyName());
String label = "";
if (value instanceof Date) {
label = dateFormat.format(value);
} else if (value instanceof Number) {
label = numberFormat.format(value);
} else if (value != null) {
label = value.toString();
}
table.addCell(ThemeHelper.bodyCell(label, false, 0, true, computeHAlign(column)));
}
}
document.add(table);
}
protected int computeHAlign(TableColumn column) {
if (!column.isLeaf()) {
return Cell.ALIGN_CENTER;
} else if ("indicator".equals(column.getProperty())) {
return Cell.ALIGN_RIGHT;
} else if ("map".equals(column.getProperty())) {
return Cell.ALIGN_CENTER;
} else {
return Cell.ALIGN_LEFT;
}
}
}