net.sf.dynamicreports.design.transformation.CrosstabTransform Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of dynamicreports-core Show documentation
Show all versions of dynamicreports-core Show documentation
DynamicReports is an open source Java reporting library based on JasperReports. It allows to create dynamic report designs and it doesn't need a visual report designer.
You can very quickly create reports and produce documents that can be displayed, printed or exported into many popular formats such as PDF, Excel, Word and others.
/**
* DynamicReports - Free Java reporting library for creating reports dynamically
*
* Copyright (C) 2010 - 2016 Ricardo Mariaca
* http://www.dynamicreports.org
*
* This file is part of DynamicReports.
*
* DynamicReports is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* DynamicReports 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 Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with DynamicReports. If not, see .
*/
package net.sf.dynamicreports.design.transformation;
import java.awt.Color;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import net.sf.dynamicreports.design.base.DRDesignGroup;
import net.sf.dynamicreports.design.base.component.DRDesignComponent;
import net.sf.dynamicreports.design.base.component.DRDesignList;
import net.sf.dynamicreports.design.base.component.DRDesignTextField;
import net.sf.dynamicreports.design.base.crosstab.DRDesignCrosstab;
import net.sf.dynamicreports.design.base.crosstab.DRDesignCrosstabCell;
import net.sf.dynamicreports.design.base.crosstab.DRDesignCrosstabCellContent;
import net.sf.dynamicreports.design.base.crosstab.DRDesignCrosstabColumnGroup;
import net.sf.dynamicreports.design.base.crosstab.DRDesignCrosstabDataset;
import net.sf.dynamicreports.design.base.crosstab.DRDesignCrosstabGroup;
import net.sf.dynamicreports.design.base.crosstab.DRDesignCrosstabMeasure;
import net.sf.dynamicreports.design.base.crosstab.DRDesignCrosstabRowGroup;
import net.sf.dynamicreports.design.constant.DefaultStyleType;
import net.sf.dynamicreports.design.constant.ResetType;
import net.sf.dynamicreports.design.transformation.expressions.CrosstabExpression;
import net.sf.dynamicreports.design.transformation.expressions.CrosstabMeasureExpression;
import net.sf.dynamicreports.design.transformation.expressions.CrosstabPrintInEvenRow;
import net.sf.dynamicreports.design.transformation.expressions.CrosstabPrintInOddRow;
import net.sf.dynamicreports.design.transformation.expressions.CrosstabRowCount;
import net.sf.dynamicreports.design.transformation.expressions.CrosstabRowCounter;
import net.sf.dynamicreports.report.base.DRHyperLink;
import net.sf.dynamicreports.report.base.component.DRFiller;
import net.sf.dynamicreports.report.base.component.DRTextField;
import net.sf.dynamicreports.report.base.crosstab.DRCrosstabCellContent;
import net.sf.dynamicreports.report.base.crosstab.DRCrosstabCellStyle;
import net.sf.dynamicreports.report.base.style.DRConditionalStyle;
import net.sf.dynamicreports.report.base.style.DRStyle;
import net.sf.dynamicreports.report.builder.expression.SystemMessageExpression;
import net.sf.dynamicreports.report.constant.Calculation;
import net.sf.dynamicreports.report.constant.CrosstabPercentageType;
import net.sf.dynamicreports.report.constant.StretchType;
import net.sf.dynamicreports.report.definition.crosstab.DRICrosstab;
import net.sf.dynamicreports.report.definition.crosstab.DRICrosstabCellContent;
import net.sf.dynamicreports.report.definition.crosstab.DRICrosstabCellStyle;
import net.sf.dynamicreports.report.definition.crosstab.DRICrosstabColumnGroup;
import net.sf.dynamicreports.report.definition.crosstab.DRICrosstabDataset;
import net.sf.dynamicreports.report.definition.crosstab.DRICrosstabGroup;
import net.sf.dynamicreports.report.definition.crosstab.DRICrosstabMeasure;
import net.sf.dynamicreports.report.definition.crosstab.DRICrosstabRowGroup;
import net.sf.dynamicreports.report.definition.crosstab.DRICrosstabVariable;
import net.sf.dynamicreports.report.definition.expression.DRIExpression;
import net.sf.dynamicreports.report.definition.expression.DRIJasperExpression;
import net.sf.dynamicreports.report.definition.expression.DRISimpleExpression;
import net.sf.dynamicreports.report.definition.style.DRIConditionalStyle;
import net.sf.dynamicreports.report.definition.style.DRIReportStyle;
import net.sf.dynamicreports.report.definition.style.DRISimpleStyle;
import net.sf.dynamicreports.report.definition.style.DRIStyle;
import net.sf.dynamicreports.report.exception.DRException;
/**
* @author Ricardo Mariaca ([email protected])
*/
public class CrosstabTransform {
private DesignTransformAccessor accessor;
private Map crosstabs;
private CrosstabRowCounter crosstabRowCounter;
public CrosstabTransform(DesignTransformAccessor accessor) {
this.accessor = accessor;
init();
}
private void init() {
crosstabs = new HashMap();
crosstabRowCounter = new CrosstabRowCounter();
}
protected DRDesignCrosstab transform(DRICrosstab crosstab, ResetType resetType, DRDesignGroup resetGroup) throws DRException {
DRDesignCrosstab designCrosstab = new DRDesignCrosstab();
designCrosstab.setDataset(dataset(crosstab.getDataset(), resetType, resetGroup));
accessor.transformToDataset(crosstab.getDataset().getSubDataset());
if (crosstab.getDataset() != null) {
resetType = null;
resetGroup = null;
}
DRDesignCrosstabCellContent whenNoDataCell = cellContent(crosstab.getWhenNoDataCell(), resetType, resetGroup);
designCrosstab.setWidth(accessor.getTemplateTransform().getCrosstabWidth(crosstab));
designCrosstab.setHeight(accessor.getTemplateTransform().getCrosstabHeight(crosstab, whenNoDataCell));
designCrosstab.setRepeatColumnHeaders(crosstab.isRepeatColumnHeaders());
designCrosstab.setRepeatRowHeaders(crosstab.isRepeatRowHeaders());
designCrosstab.setColumnBreakOffset(crosstab.getColumnBreakOffset());
designCrosstab.setIgnoreWidth(crosstab.getIgnoreWidth());
designCrosstab.setRunDirection(crosstab.getRunDirection());
designCrosstab.setWhenNoDataCell(whenNoDataCell);
designCrosstab.setHeaderCell(cellContent(crosstab.getHeaderCell(), resetType, resetGroup));
for (DRICrosstabColumnGroup columnGroup : crosstab.getColumnGroups()) {
addColumnGroup(crosstab, designCrosstab, columnGroup, resetType, resetGroup);
}
for (DRICrosstabRowGroup rowGroup : crosstab.getRowGroups()) {
addRowGroup(crosstab, designCrosstab, rowGroup, resetType, resetGroup);
}
addCells(crosstab, designCrosstab, resetType, resetGroup);
for (DRICrosstabVariable variable : crosstab.getVariables()) {
addMeasure(designCrosstab, variable);
}
for (DRICrosstabMeasure measure : crosstab.getMeasures()) {
if (measure.getExpression() instanceof DRICrosstabVariable) {
addMeasure(designCrosstab, (DRICrosstabVariable) measure.getExpression());
}
}
accessor.getExpressionTransform().transformExpression(crosstabRowCounter);
addRowCountExpression(designCrosstab);
crosstabs.put(designCrosstab, crosstab);
accessor.transformToMainDataset();
return designCrosstab;
}
//dataset
private DRDesignCrosstabDataset dataset(DRICrosstabDataset dataset, ResetType resetType, DRDesignGroup resetGroup) throws DRException {
DRDesignCrosstabDataset designDataset = new DRDesignCrosstabDataset();
designDataset.setSubDataset(accessor.getDatasetTransform().transform(dataset.getSubDataset()));
designDataset.setDataPreSorted(dataset.getDataPreSorted());
if (resetType != null && resetType.equals(ResetType.NONE)) {
designDataset.setResetType(ResetType.REPORT);
}
else {
designDataset.setResetType(resetType);
}
designDataset.setResetGroup(resetGroup);
return designDataset;
}
private void addRowCountExpression(DRDesignCrosstab designCrosstab) throws DRException {
DRDesignCrosstabRowGroup lastRowGroup = getLastValue(designCrosstab.getRowGroups());
DRFiller filler = new DRFiller();
CrosstabRowCount rowCountExpression = new CrosstabRowCount();
filler.setPrintWhenExpression(rowCountExpression);
DRDesignComponent designTextField = accessor.getComponentTransform().filler(filler);
lastRowGroup.getHeader().getList().addComponent(designTextField);
}
private DRDesignCrosstabCellContent cellContent(DRICrosstabCellContent cellContent, ResetType resetType, DRDesignGroup resetGroup) throws DRException {
DRDesignCrosstabCellContent designCellContents = new DRDesignCrosstabCellContent();
designCellContents.setList(accessor.getComponentTransform().list(cellContent.getList(), DefaultStyleType.TEXT, resetType, resetGroup));
designCellContents.setStyle(accessor.getStyleTransform().transformStyle(cellContent.getStyle(), false, DefaultStyleType.NONE));
return designCellContents;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
private void group(DRDesignCrosstabGroup designGroup, DRICrosstab crosstab, DRICrosstabGroup group, boolean showTotal, ResetType resetType, DRDesignGroup resetGroup, DRDesignComponent designTitleComponent, DRDesignComponent designTotalTitleComponent) throws DRException {
designGroup.setName(group.getName());
designGroup.setOrderType(group.getOrderType());
designGroup.setExpression(accessor.getExpressionTransform().transformExpression(group.getExpression()));
if (group.getOrderByExpression() != null) {
DRIExpression orderByExpression = getCrosstabExpression(crosstab, group.getOrderByExpression());
designGroup.setOrderByExpression(accessor.getExpressionTransform().transformExpression(orderByExpression));
}
if (group.getComparatorExpression() != null) {
DRIExpression comparatorExpression = getCrosstabExpression(crosstab, group.getComparatorExpression());
designGroup.setComparatorExpression(accessor.getExpressionTransform().transformExpression(comparatorExpression));
}
DRTextField textField = new DRTextField();
textField.setValueExpression(group);
textField.setPattern(group.getHeaderPattern());
textField.setHorizontalTextAlignment(group.getHeaderHorizontalTextAlignment());
textField.setValueFormatter(group.getHeaderValueFormatter());
textField.setDataType(group.getDataType());
textField.setStretchWithOverflow(group.getHeaderStretchWithOverflow());
textField.setHyperLink((DRHyperLink) group.getHeaderHyperLink());
textField.setPropertyExpressions(group.getHeaderPropertyExpressions());
boolean measureTitle = false;
for (DRICrosstabMeasure crosstabMeasure : crosstab.getMeasures()) {
if (crosstabMeasure.getTitleExpression() != null) {
measureTitle = true;
break;
}
}
if (group instanceof DRICrosstabRowGroup || (group instanceof DRICrosstabColumnGroup && !measureTitle)) {
textField.setStretchType(StretchType.CONTAINER_HEIGHT);
}
DRIReportStyle groupStyle = group.getHeaderStyle();
if (groupStyle == null) {
groupStyle = accessor.getTemplateTransform().getCrosstabGroupStyle(crosstab);
}
textField.setStyle(groupStyle);
DRDesignCrosstabCellContent header = createCellContent(getCellStyle(groupStyle), resetType, resetGroup);
DRDesignTextField designTextField = accessor.getComponentTransform().textField(textField, DefaultStyleType.TEXT);
designTextField.setUniqueName("group_" + designGroup.getName() + ".header");
header.getList().addComponent(designTextField);
if (designTitleComponent != null) {
header.getList().addComponent(designTitleComponent);
}
designGroup.setHeader(header);
if (showTotal) {
DRIReportStyle totalStyle = group.getTotalHeaderStyle();
if (totalStyle == null) {
DRICrosstabGroup firstGroup = null;
if (group instanceof DRICrosstabRowGroup) {
firstGroup = getFirstValue(crosstab.getRowGroups());
}
else {
firstGroup = getFirstValue(crosstab.getColumnGroups());
}
if (firstGroup == group) {
totalStyle = accessor.getTemplateTransform().getCrosstabGrandTotalStyle(crosstab);
}
else {
totalStyle = accessor.getTemplateTransform().getCrosstabGroupTotalStyle(crosstab);
}
}
textField = new DRTextField();
DRIExpression totalHeaderExpression = group.getTotalHeaderExpression();
if (totalHeaderExpression == null) {
totalHeaderExpression = new SystemMessageExpression("total");
}
textField.setValueExpression(totalHeaderExpression);
textField.setStretchWithOverflow(group.getTotalHeaderStretchWithOverflow());
textField.setPropertyExpressions(group.getTotalHeaderPropertyExpressions());
textField.setStyle(totalStyle);
if (group instanceof DRICrosstabRowGroup || (group instanceof DRICrosstabColumnGroup && !measureTitle)) {
textField.setStretchType(StretchType.CONTAINER_HEIGHT);
}
DRDesignCrosstabCellContent totalHeader = createCellContent(getCellStyle(totalStyle), resetType, resetGroup);
designTextField = accessor.getComponentTransform().textField(textField, DefaultStyleType.TEXT);
designTextField.setUniqueName("group_" + designGroup.getName() + ".totalheader");
totalHeader.getList().addComponent(designTextField);
if (designTotalTitleComponent != null) {
totalHeader.getList().addComponent(designTotalTitleComponent);
}
designGroup.setTotalHeader(totalHeader);
}
}
private void addColumnGroup(DRICrosstab crosstab, DRDesignCrosstab designCrosstab, DRICrosstabColumnGroup columnGroup, ResetType resetType, DRDesignGroup resetGroup) throws DRException {
DRDesignCrosstabColumnGroup designColumnGroup = new DRDesignCrosstabColumnGroup();
boolean showTotal = accessor.getTemplateTransform().isCrosstabColumnGroupShowTotal(columnGroup);
DRDesignComponent designTitleComponent = null;
DRDesignComponent designTotalTitleComponent = null;
boolean lastColumn = columnGroup == getLastValue(crosstab.getColumnGroups());
if (showTotal || lastColumn) {
boolean showTitle = false;
for (DRICrosstabMeasure measure : crosstab.getMeasures()) {
if (measure.getTitleExpression() != null) {
showTitle = true;
break;
}
}
if (showTitle) {
if (lastColumn) {
DRIReportStyle groupStyle = columnGroup.getHeaderStyle();
if (groupStyle == null) {
groupStyle = accessor.getTemplateTransform().getCrosstabGroupStyle(crosstab);
}
String name = "group_" + columnGroup.getName() + ".titleheader";
designTitleComponent = getMeasureTitleComponent(name, crosstab, groupStyle);
}
if (showTotal) {
DRIReportStyle totalStyle = columnGroup.getTotalHeaderStyle();
if (totalStyle == null) {
DRICrosstabGroup firstGroup = getFirstValue(crosstab.getColumnGroups());
if (firstGroup == columnGroup) {
totalStyle = accessor.getTemplateTransform().getCrosstabGrandTotalStyle(crosstab);
}
else {
totalStyle = accessor.getTemplateTransform().getCrosstabGroupTotalStyle(crosstab);
}
}
String name = "group_" + columnGroup.getName() + ".titletotalheader";
designTotalTitleComponent = getMeasureTitleComponent(name, crosstab, totalStyle);
}
}
}
group(designColumnGroup, crosstab, columnGroup, showTotal, resetType, resetGroup, designTitleComponent, designTotalTitleComponent);
designColumnGroup.setTotalPosition(accessor.getTemplateTransform().getCrosstabColumnGroupTotalPosition(columnGroup));
designCrosstab.getColumnGroups().add(designColumnGroup);
}
@SuppressWarnings({ "rawtypes", "unchecked" })
private DRDesignComponent getMeasureTitleComponent(String name, DRICrosstab crosstab, DRIReportStyle defaultStyle) throws DRException {
DRDesignList titleComponent = new DRDesignList();
for (DRICrosstabMeasure measure : crosstab.getMeasures()) {
DRTextField textField = new DRTextField();
if (measure.getTitleExpression() != null) {
textField.setValueExpression(measure.getTitleExpression());
}
DRIReportStyle titleStyle = accessor.getTemplateTransform().getCrosstabMeasureTitleStyle(crosstab, measure);
if (titleStyle == null) {
titleStyle = defaultStyle;
}
textField.setStyle(titleStyle);
DRDesignTextField designTextField = accessor.getComponentTransform().textField(textField, DefaultStyleType.TEXT);
designTextField.setUniqueName(name + "." + measure.getName());
titleComponent.addComponent(designTextField);
}
return titleComponent;
}
private void addRowGroup(DRICrosstab crosstab, DRDesignCrosstab designCrosstab, DRICrosstabRowGroup rowGroup, ResetType resetType, DRDesignGroup resetGroup) throws DRException {
DRDesignCrosstabRowGroup designRowGroup = new DRDesignCrosstabRowGroup();
boolean showTotal = accessor.getTemplateTransform().isCrosstabRowGroupShowTotal(rowGroup);
group(designRowGroup, crosstab, rowGroup, showTotal, resetType, resetGroup, null, null);
designRowGroup.setTotalPosition(accessor.getTemplateTransform().getCrosstabRowGroupTotalPosition(rowGroup));
designCrosstab.getRowGroups().add(designRowGroup);
}
private void addCells(DRICrosstab crosstab, DRDesignCrosstab designCrosstab, ResetType resetType, DRDesignGroup resetGroup) throws DRException {
MeasuresStyles measuresStyle = new MeasuresStyles(crosstab, designCrosstab);
DRIReportStyle groupTotalStyle = accessor.getTemplateTransform().getCrosstabGroupTotalStyle(crosstab);
groupTotalStyle = getCellStyle(groupTotalStyle);
DRIReportStyle grandTotalStyle = accessor.getTemplateTransform().getCrosstabGrandTotalStyle(crosstab);
grandTotalStyle = getCellStyle(grandTotalStyle);
DRIReportStyle cellStyle = accessor.getTemplateTransform().getCrosstabCellStyle(crosstab);
cellStyle = getCellStyle(cellStyle);
DRICrosstabGroup firstColumnGroup = getFirstValue(crosstab.getColumnGroups());
DRICrosstabGroup firstRowGroup = getFirstValue(crosstab.getRowGroups());
DRDesignCrosstabCell designCell = cell(crosstab, cellStyle, measuresStyle, null, null, resetType, resetGroup);
designCrosstab.getCells().add(designCell);
DRIReportStyle style = null;
for (DRICrosstabColumnGroup columnGroup : crosstab.getColumnGroups()) {
if (columnGroup == firstColumnGroup) {
style = grandTotalStyle;
}
else {
style = groupTotalStyle;
}
if (accessor.getTemplateTransform().isCrosstabColumnGroupShowTotal(columnGroup)) {
designCell = cell(crosstab, style, measuresStyle, null, columnGroup, resetType, resetGroup);
designCrosstab.getCells().add(designCell);
}
}
for (DRICrosstabRowGroup rowGroup : crosstab.getRowGroups()) {
if (rowGroup == firstRowGroup) {
style = grandTotalStyle;
}
else {
style = groupTotalStyle;
}
if (accessor.getTemplateTransform().isCrosstabRowGroupShowTotal(rowGroup)) {
designCell = cell(crosstab, style, measuresStyle, rowGroup, null, resetType, resetGroup);
designCrosstab.getCells().add(designCell);
for (DRICrosstabColumnGroup columnGroup : crosstab.getColumnGroups()) {
if (accessor.getTemplateTransform().isCrosstabColumnGroupShowTotal(columnGroup)) {
DRIReportStyle totalStyle = style;
if (columnGroup == firstColumnGroup) {
totalStyle = grandTotalStyle;
}
designCell = cell(crosstab, totalStyle, measuresStyle, rowGroup, columnGroup, resetType, resetGroup);
designCrosstab.getCells().add(designCell);
}
}
}
}
}
private T getFirstValue(List values) {
if (!values.isEmpty()) {
return values.get(0);
}
return null;
}
private T getLastValue(List values) {
if (!values.isEmpty()) {
return values.get(values.size() - 1);
}
return null;
}
private DRIReportStyle getCellStyle(DRIReportStyle reportStyle) throws DRException {
DRIStyle style = accessor.getStyleTransform().getStyle(reportStyle);
if (style == null || style.getBackgroundColor() == null) {
return null;
}
DRStyle cellStyle = new DRStyle();
cellStyle.setBackgroundColor(style.getBackgroundColor());
return cellStyle;
}
private DRIReportStyle cellStyle(DRICrosstab crosstab, List rowHighlighters, DRIReportStyle reportStyle) throws DRException {
DRIStyle style = accessor.getStyleTransform().getStyle(reportStyle);
if (rowHighlighters != null && !rowHighlighters.isEmpty() || !style.getConditionalStyles().isEmpty()) {
DRStyle newStyle = new DRStyle();
if (style != null) {
newStyle.setParentStyle(style);
for (DRIConditionalStyle conditionalStyle : style.getConditionalStyles()) {
DRIExpression conditionalStyleExpression = getCrosstabExpression(crosstab, conditionalStyle.getConditionExpression());
DRConditionalStyle newConditionalStyle = new DRConditionalStyle(conditionalStyleExpression);
accessor.getStyleTransform().copyStyle(newConditionalStyle, conditionalStyle);
newStyle.addConditionalStyle(newConditionalStyle);
}
}
if (rowHighlighters != null && !rowHighlighters.isEmpty()) {
Color backgroundColor = StyleResolver.getBackgroundColor(style, accessor.getStyleTransform());
for (DRIConditionalStyle conditionalStyle : rowHighlighters) {
if (backgroundColor != null && conditionalStyle.getBackgroundColor() != null) {
DRConditionalStyle newConditionalStyle = new DRConditionalStyle(conditionalStyle.getConditionExpression());
accessor.getStyleTransform().copyStyle(newConditionalStyle, conditionalStyle);
Color mergedColor = StyleResolver.mergeColors(backgroundColor, conditionalStyle.getBackgroundColor(), 0.25f);
newConditionalStyle.setBackgroundColor(mergedColor);
newStyle.addConditionalStyle(newConditionalStyle);
}
else {
newStyle.addConditionalStyle((DRConditionalStyle) conditionalStyle);
}
}
}
return newStyle;
}
return style;
}
@SuppressWarnings({ "rawtypes", "unchecked" })
private DRDesignCrosstabCell cell(DRICrosstab crosstab, DRIReportStyle cellStyle, MeasuresStyles measuresStyle, DRICrosstabRowGroup rowGroup, DRICrosstabColumnGroup columnGroup, ResetType resetType, DRDesignGroup resetGroup) throws DRException {
DRDesignCrosstabCell designCell = new DRDesignCrosstabCell();
String rowTotalGroup = null;
String columnTotalGroup = null;
if (rowGroup != null) {
rowTotalGroup = rowGroup.getName();
}
if (columnGroup != null) {
columnTotalGroup = columnGroup.getName();
}
designCell.setRowTotalGroup(rowTotalGroup);
designCell.setColumnTotalGroup(columnTotalGroup);
DRDesignList designList = new DRDesignList();
designList.setStretchType(StretchType.CONTAINER_HEIGHT);
for (DRICrosstabMeasure measure : crosstab.getMeasures()) {
DRTextField textField = new DRTextField();
if (measure.getExpression() instanceof DRICrosstabVariable) {
textField.setValueExpression(measure.getExpression());
}
else {
DRIExpression valueExpression = getCrosstabExpression(crosstab, measure.getExpression());
textField.setValueExpression(valueExpression);
}
textField.setPattern(measure.getPattern());
textField.setHorizontalTextAlignment(measure.getHorizontalTextAlignment());
textField.setValueFormatter(measure.getValueFormatter());
textField.setDataType(measure.getDataType());
textField.setStretchWithOverflow(measure.getStretchWithOverflow());
textField.setStretchType(StretchType.CONTAINER_HEIGHT);
textField.setHyperLink((DRHyperLink) measure.getHyperLink());
textField.setPropertyExpressions(measure.getPropertyExpressions());
textField.setStyle(measuresStyle.getStyle(measure, rowGroup, columnGroup));
DRDesignTextField designTextField = accessor.getComponentTransform().textField(textField, DefaultStyleType.TEXT);
String name = "cell_measure[" + measure.getName() + "]";
if (rowTotalGroup != null) {
name += "_rowgroup[" + rowTotalGroup + "]";
}
if (columnTotalGroup != null) {
name += "_columngroup[" + columnTotalGroup + "]";
}
designTextField.setUniqueName(name);
designList.addComponent(designTextField);
}
DRDesignCrosstabCellContent content = createCellContent(cellStyle, resetType, resetGroup);
designCell.setContent(content);
content.getList().addComponent(designList);
return designCell;
}
private DRConditionalStyle detailRowConditionalStyle(DRISimpleStyle style, DRISimpleExpression expression) {
DRConditionalStyle conditionalStyle = new DRConditionalStyle(expression);
accessor.getStyleTransform().copyStyle(conditionalStyle, style);
return conditionalStyle;
}
private boolean equalsGroup(DRICrosstabGroup group1, DRICrosstabGroup group2) {
if (group1 == null && group2 == null) {
return true;
}
if (group1 != null && group2 != null) {
return group1.equals(group2);
}
return false;
}
private DRDesignCrosstabCellContent createCellContent(DRIReportStyle style, ResetType resetType, DRDesignGroup resetGroup) throws DRException {
DRCrosstabCellContent cellContent = new DRCrosstabCellContent();
cellContent.setStyle(style);
return cellContent(cellContent, resetType, resetGroup);
}
private void addMeasure(DRDesignCrosstab designCrosstab, DRICrosstabVariable variable) throws DRException {
DRDesignCrosstabMeasure designMeasure = new DRDesignCrosstabMeasure();
designMeasure.setName(variable.getName());
DRIExpression expression;
if (variable.getPercentageType() != null && variable.getPercentageType().equals(CrosstabPercentageType.GRAND_TOTAL) &&
!variable.getCalculation().equals(Calculation.COUNT) && !variable.getCalculation().equals(Calculation.DISTINCT_COUNT)) {
expression = new CrosstabMeasureExpression(variable.getValueExpression());
}
else {
expression = variable.getValueExpression();
}
designMeasure.setValueExpression(accessor.getExpressionTransform().transformExpression(expression));
designMeasure.setCalculation(variable.getCalculation());
designMeasure.setPercentageType(accessor.getTemplateTransform().getCrosstabPercentageType(variable));
designCrosstab.getMeasures().add(designMeasure);
}
protected DRICrosstab getCrosstab(DRDesignCrosstab designCrosstab) {
return crosstabs.get(designCrosstab);
}
private DRIExpression getCrosstabExpression(DRICrosstab crosstab, DRIExpression expression) throws DRException {
if (expression instanceof DRIJasperExpression) {
return expression;
}
accessor.getExpressionTransform().transformExpression(expression);
return new CrosstabExpression(crosstab, expression);
}
private class MeasuresStyles {
private Map, List> measuresStyle;
private DRIReportStyle defaultCellStyle;
private DRIReportStyle defaultGroupTotalStyle;
private DRIReportStyle defaultGrandTotalStyle;
private DRIReportStyle defaultRowGroupTotalStyle;
private DRIReportStyle defaultRowGrandTotalStyle;
private DRICrosstabGroup firstColumnGroup;
private DRICrosstabGroup firstRowGroup;
private MeasuresStyles(DRICrosstab crosstab, DRDesignCrosstab designCrosstab) throws DRException {
measuresStyle = new HashMap, List>();
init(crosstab, designCrosstab);
}
private void init(DRICrosstab crosstab, DRDesignCrosstab designCrosstab) throws DRException {
List rowHighlighters = new ArrayList();
DRISimpleStyle detailOddRowStyle = accessor.getTemplateTransform().getCrosstabOddRowStyle(crosstab);
DRISimpleStyle detailEvenRowStyle = accessor.getTemplateTransform().getCrosstabEvenRowStyle(crosstab);
if (detailOddRowStyle != null || detailEvenRowStyle != null) {
if (detailOddRowStyle != null) {
rowHighlighters.add(detailRowConditionalStyle(detailOddRowStyle, new CrosstabPrintInOddRow()));
}
if (detailEvenRowStyle != null) {
rowHighlighters.add(detailRowConditionalStyle(detailEvenRowStyle, new CrosstabPrintInEvenRow()));
}
}
for (DRICrosstabMeasure measure : crosstab.getMeasures()) {
List styles = new ArrayList();
measuresStyle.put(measure, styles);
for (DRICrosstabCellStyle cellStyle : measure.getStyles()) {
DRIReportStyle newStyle = cellStyle(crosstab, rowHighlighters, cellStyle.getStyle());
styles.add(new DRCrosstabCellStyle(newStyle, cellStyle.getRowGroup(), cellStyle.getColumnGroup()));
}
}
DRIReportStyle groupTotalStyle = accessor.getTemplateTransform().getCrosstabGroupTotalStyle(crosstab);
DRIReportStyle grandTotalStyle = accessor.getTemplateTransform().getCrosstabGrandTotalStyle(crosstab);
DRIReportStyle cellStyle = accessor.getTemplateTransform().getCrosstabCellStyle(crosstab);
if (groupTotalStyle == null) {
groupTotalStyle = cellStyle;
}
if (grandTotalStyle == null) {
grandTotalStyle = cellStyle;
}
defaultGroupTotalStyle = cellStyle(crosstab, rowHighlighters, groupTotalStyle);
defaultGrandTotalStyle = cellStyle(crosstab, rowHighlighters, grandTotalStyle);
if (StyleResolver.getBackgroundColor(groupTotalStyle, accessor.getStyleTransform()) != null) {
defaultRowGroupTotalStyle = cellStyle(crosstab, null, groupTotalStyle);
}
if (StyleResolver.getBackgroundColor(grandTotalStyle, accessor.getStyleTransform()) != null) {
defaultRowGrandTotalStyle = cellStyle(crosstab, null, grandTotalStyle);
}
defaultCellStyle = cellStyle(crosstab, rowHighlighters, cellStyle);
firstColumnGroup = getFirstValue(crosstab.getColumnGroups());
firstRowGroup = getFirstValue(crosstab.getRowGroups());
}
public DRIReportStyle getStyle(DRICrosstabMeasure measure, DRICrosstabRowGroup rowGroup, DRICrosstabColumnGroup columnGroup) {
List styles = measuresStyle.get(measure);
for (DRICrosstabCellStyle crosstabCellStyle : styles) {
if (equalsGroup(rowGroup, crosstabCellStyle.getRowGroup()) &&
equalsGroup(columnGroup, crosstabCellStyle.getColumnGroup())) {
return crosstabCellStyle.getStyle();
}
}
for (DRICrosstabCellStyle crosstabCellStyle : styles) {
if (crosstabCellStyle.getRowGroup() == null && crosstabCellStyle.getColumnGroup() == null) {
return crosstabCellStyle.getStyle();
}
}
if (rowGroup == null && columnGroup == null) {
return defaultCellStyle;
}
if (rowGroup != null) {
if ((columnGroup == firstColumnGroup || rowGroup == firstRowGroup) && defaultRowGrandTotalStyle != null) {
return defaultRowGrandTotalStyle;
}
if (defaultRowGroupTotalStyle != null) {
return defaultRowGroupTotalStyle;
}
}
if (columnGroup == firstColumnGroup || rowGroup == firstRowGroup) {
return defaultGrandTotalStyle;
}
else {
return defaultGroupTotalStyle;
}
}
}
}