All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ar.com.fdvs.dj.domain.builders.CrosstabBuilder Maven / Gradle / Ivy

/*
 * DynamicJasper: A library for creating reports dynamically by specifying
 * columns, groups, styles, etc. at runtime. It also saves a lot of development
 * time in many cases! (http://sourceforge.net/projects/dynamicjasper)
 *
 * Copyright (C) 2008  FDV Solutions (http://www.fdvsolutions.com)
 *
 * This library 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 2.1 of the License, or (at your option) any later version.
 *
 * This library 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 this library; if not, write to the Free Software
 *
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 *
 *
 */

package ar.com.fdvs.dj.domain.builders;

import ar.com.fdvs.dj.core.DJConstants;
import ar.com.fdvs.dj.core.layout.CrossTabColorShema;
import ar.com.fdvs.dj.core.layout.LayoutException;
import ar.com.fdvs.dj.domain.DJCRosstabMeasurePrecalculatedTotalProvider;
import ar.com.fdvs.dj.domain.DJCalculation;
import ar.com.fdvs.dj.domain.DJCrosstab;
import ar.com.fdvs.dj.domain.DJCrosstabColumn;
import ar.com.fdvs.dj.domain.DJCrosstabMeasure;
import ar.com.fdvs.dj.domain.DJCrosstabRow;
import ar.com.fdvs.dj.domain.DJDataSource;
import ar.com.fdvs.dj.domain.DJLabel;
import ar.com.fdvs.dj.domain.DJValueFormatter;
import ar.com.fdvs.dj.domain.Style;
import ar.com.fdvs.dj.domain.constants.Border;

import java.util.Comparator;

public class CrosstabBuilder {

	private DJCrosstab crosstab = new DJCrosstab();
	
	int cellHeight = -1;
	int cellWidth = -1;
	int columnHeaderHeight = -1;
	int rowHeaderWidth = -1;
	
	private final int DEFAULT_ROW_HEADER_WIDTH = 90;
	private final int DEFAULT_COLUMN_HEADER_HEIGHT = 25;
	private final int DEFAULT_CELL_HEIGHT = 20;
	private final int DEFAULT_CELL_WIDTH = 90;

	/**
	 * Build the crosstab. Throws LayoutException if anything is wrong
	 * @return
	 */
	public DJCrosstab build(){
		if (crosstab.getMeasures().isEmpty()){
			throw new LayoutException("Crosstabs must have at least one measure");
		}
		if (crosstab.getColumns().isEmpty()){
			throw new LayoutException("Crosstabs must have at least one column");
		}
		if (crosstab.getRows().isEmpty()){
			throw new LayoutException("Crosstabs must have at least one row");
		}
		
		
		//Ensure default dimension values
		for (DJCrosstabColumn col : crosstab.getColumns()) {
			if (col.getWidth() == -1 && cellWidth != -1)
				col.setWidth(cellWidth);

			if (col.getWidth() == -1 )
				col.setWidth(DEFAULT_CELL_WIDTH);

			if (col.getHeaderHeight() == -1 && columnHeaderHeight != -1)
				col.setHeaderHeight(columnHeaderHeight);

			if (col.getHeaderHeight() == -1)
				col.setHeaderHeight(DEFAULT_COLUMN_HEADER_HEIGHT);
		}

		for (DJCrosstabRow row : crosstab.getRows()) {
			if (row.getHeight() == -1 && cellHeight != -1)
				row.setHeight(cellHeight);

			if (row.getHeight() == -1 )
				row.setHeight(DEFAULT_CELL_HEIGHT);

			if (row.getHeaderWidth() == -1 && rowHeaderWidth != -1)
				row.setHeaderWidth(rowHeaderWidth);

			if (row.getHeaderWidth() == -1)
				row.setHeaderWidth(DEFAULT_ROW_HEADER_WIDTH);

		}
		return crosstab;
	}

	/**
	 * The height if the whole corsstab. This just ensures a minimun height in case the crosstab results
	 * shorter that the height specified.
	 * 
	 * Height is not taken into account if the crosstab must grow because of its data
	 * 
	 * @param height
	 * @return
	 */
	public CrosstabBuilder setHeight(int height) {
		crosstab.setHeight(height);
		return this;
	}

	public CrosstabBuilder setWidth(int width) {
		crosstab.setWidth(width);
		return this;
	}
	public CrosstabBuilder setHeaderStyle(Style headerStyle) {
		crosstab.setHeaderStyle(headerStyle);
		return this;
	}
	public CrosstabBuilder setDatasource(String expression, int origin, int type) {
		DJDataSource datasource = new DJDataSource(expression,origin,type);
		crosstab.setDatasource(datasource);
		return this;
	}
	public CrosstabBuilder setDatasource(String expression, int origin, int type, boolean preSorted) {
		DJDataSource datasource = new DJDataSource(expression,origin,type);
		datasource.setPreSorted(preSorted);
		crosstab.setDatasource(datasource);
		return this;
	}
	
	/**
	 * To use main report datasource. There should be nothing else in the detail band
	 * @param preSorted
	 * @return
	 */
	public CrosstabBuilder useMainReportDatasource(boolean preSorted) {
		DJDataSource datasource = new DJDataSource("ds",DJConstants.DATA_SOURCE_ORIGIN_REPORT_DATASOURCE,DJConstants.DATA_SOURCE_TYPE_JRDATASOURCE);
		datasource.setPreSorted(preSorted);
		crosstab.setDatasource(datasource);
		return this;
	}
	public CrosstabBuilder setUseFullWidth(boolean useFullWidth) {
		crosstab.setUseFullWidth(useFullWidth);
		return this;
	}
	public CrosstabBuilder setIgnoreWidth(boolean ignoreWidth) {
		crosstab.setIgnoreWidth(ignoreWidth);
		return this;
	}
	public CrosstabBuilder setCellBorder(Border cellBorder) {
		crosstab.setCellBorder(cellBorder);
		return this;
	}
	
	
	/**
	 * Adds a measure to the crosstab. A crosstab can have many measures. DJ will lay out one measure above
	 * the other.
	 * 
	 * A measure is what is shown on each intersection of a column and a row. A calculation is performed to 
	 * all occurrences in the datasource where the column and row values matches (between elements) 
	 * 
	 * @param property
	 * @param className
	 * @param operation
	 * @param title
	 * @param style
	 * @return
	 */
	public CrosstabBuilder addMeasure(String property, String className, DJCalculation operation, String title, Style style) {
		DJCrosstabMeasure measure = new DJCrosstabMeasure(property,className, operation , title);
		measure.setStyle(style);
		crosstab.getMeasures().add(measure);
		return this;
	}

	public CrosstabBuilder addMeasure(String property, String className, DJCalculation operation, String title, Style style, boolean isPercentage) {
		DJCrosstabMeasure measure = new DJCrosstabMeasure(property,className, operation , title);
		measure.setStyle(style);
		measure.setIsPercentage(isPercentage);
		crosstab.getMeasures().add(measure);
		return this;
	}

	public CrosstabBuilder addMeasure(DJCrosstabMeasure measure) {
		crosstab.getMeasures().add(measure);
		return this;
	}

    /**
	 * Adds a measure to the crosstab. A crosstab can have many measures. DJ will lay out one measure above
	 * the other.
	 *
	 * A measure is what is shown on each intersection of a column and a row. A calculation is performed to
	 * all occurrences in the datasource where the column and row values matches (between elements)
     *
     * The only difference between the prior methods is that this method sets "visible" to false
	 *
	 * @param property
	 * @param className
     * @param title
	 * @return
     */
    public CrosstabBuilder addInvisibleMeasure(String property, String className, String title) {
        DJCrosstabMeasure measure = new DJCrosstabMeasure(property, className, DJCalculation.NOTHING, title);
        measure.setVisible(false);
        crosstab.getMeasures().add(measure);
        return this;
    }
	
	/**
	 * Add a row to the crosstab. In a double entry "X\Y" like table  table, rows are "X" (columns are Y) 
	 * The first row added will be the inner most one.  
	 * @param row
	 * @return
	 */
	public CrosstabBuilder addRow(DJCrosstabRow row) {
		crosstab.getRows().add(row);
		return this;
	}

	/**
	 * Add a column to the crosstab. In a double entry "X\Y" like table  table, columns are "Y" (rows are X) 
	 * The first column added will be the inner most one.  
	 * @param col
	 * @return
	 */
	public CrosstabBuilder addColumn(DJCrosstabColumn col) {
		crosstab.getColumns().add(col);
		return this;
	}
	public CrosstabBuilder setColorScheme(int colorScheme) {
		crosstab.setColorScheme(colorScheme);
		return this;
	}
	public CrosstabBuilder setColorScheme(CrossTabColorShema colorScheme) {
		crosstab.setCtColorScheme(colorScheme);
		return this;
	}
	public CrosstabBuilder setMainHeaderTitle(String title) {
		crosstab.setMainHeaderTitle(title);
		crosstab.setAutomaticTitle(false);
		return this;
	}
	public CrosstabBuilder setAutomaticTitle(boolean bool) {
		crosstab.setAutomaticTitle(bool);
		return this;
	}
	public CrosstabBuilder setBottomSpace(int bottomSpace) {
		crosstab.setBottomSpace(bottomSpace);
		return this;
	}
	public CrosstabBuilder setTopSpace(int topSpace) {
		crosstab.setTopSpace(topSpace);
		return this;
	}

	/**
	 * {@linkplain CrosstabBuilder#addColumn(DJCrosstabColumn)}
	 * @param title
	 * @param property
	 * @param className
	 * @param showTotal
	 * @return
	 */
	public CrosstabBuilder addColumn(String title, String property, String className, boolean showTotal) {
		DJCrosstabColumn col = new CrosstabColumnBuilder()
			.setProperty(property,className)
			.setShowTotals(showTotal)
			.setTitle(title)
			.build();
		addColumn(col);
		return this;
	}

	public CrosstabBuilder addColumn(String title, String property, String className, boolean showTotal, String totalLegend) {
		DJCrosstabColumn col = new CrosstabColumnBuilder()
		.setProperty(property,className)
		.setShowTotals(showTotal)
		.setTotalLegend(totalLegend)
		.setTitle(title)
		.build();
		addColumn(col);
		return this;
	}

	public CrosstabBuilder addColumn(String title, String property, String className, boolean showTotal, String totalLegend, Comparator comparator) {
		DJCrosstabColumn col = new CrosstabColumnBuilder()
				.setProperty(property, className)
				.setShowTotals(showTotal)
				.setTotalLegend(totalLegend)
				.setTitle(title)
				.setComparator(comparator)
				.build();
		addColumn(col);
		return this;
	}

	/**
	 * {@linkplain CrosstabBuilder#addColumn(DJCrosstabColumn)}
	 * @param title
	 * @param property
	 * @param className
	 * @param showTotal
	 * @param headerStyle
	 * @param totalStyle
	 * @param totalHeaderStyle
	 * @return
	 */
	public CrosstabBuilder addColumn(String title, String property, String className, boolean showTotal,
			Style headerStyle, Style totalStyle, Style totalHeaderStyle) {
		DJCrosstabColumn col = new CrosstabColumnBuilder()
		.setProperty(property,className)
		.setShowTotals(showTotal)
		.setTitle(title)
		.setHeaderStyle(headerStyle)
		.setTotalHeaderStyle(totalHeaderStyle)
		.setTotalStyle(totalStyle)
		.build();
		addColumn(col);
		return this;
	}

	public CrosstabBuilder addColumn(String title, String property, String className, boolean showTotal,
									 Style headerStyle, Style totalStyle, Style totalHeaderStyle, Comparator comparator) {
		DJCrosstabColumn col = new CrosstabColumnBuilder()
				.setProperty(property, className)
				.setShowTotals(showTotal)
				.setTitle(title)
				.setHeaderStyle(headerStyle)
				.setTotalHeaderStyle(totalHeaderStyle)
				.setTotalStyle(totalStyle)
				.setComparator(comparator)
				.build();
		addColumn(col);
		return this;
	}
	
	/**
	 * {@linkplain CrosstabBuilder#addRow(DJCrosstabRow)}
	 * @param title
	 * @param property
	 * @param className
	 * @param showTotal
	 * @return
	 */
	public CrosstabBuilder addRow(String title, String property, String className, boolean showTotal) {
		DJCrosstabRow row = new CrosstabRowBuilder()
			.setProperty(property,className)
			.setShowTotals(showTotal)
			.setTitle(title)
			.build();
		addRow(row);
		return this;
	}
	
	public CrosstabBuilder addRow(String title, String property, String className, boolean showTotal, String totalLegend) {
		DJCrosstabRow row = new CrosstabRowBuilder()
		.setProperty(property,className)
		.setTotalLegend(totalLegend)
		.setShowTotals(showTotal)
		.setTitle(title)
		.build();
		addRow(row);
		return this;
	}

	public CrosstabBuilder addRow(String title, String property, String className, boolean showTotal, String totalLegend, Comparator comparator) {
		DJCrosstabRow row = new CrosstabRowBuilder()
				.setProperty(property, className)
				.setTotalLegend(totalLegend)
				.setShowTotals(showTotal)
				.setTitle(title)
				.setComparator(comparator)
				.build();
		addRow(row);
		return this;
	}
	
/**
 * {@linkplain CrosstabBuilder#addRow(DJCrosstabRow)}
 * @param title
 * @param property
 * @param className
 * @param showTotal
 * @param headerStyle
 * @param totalStyle
 * @param totalHeaderStyle
 * @return
 */
	public CrosstabBuilder addRow(String title, String property, String className, boolean showTotal,
			Style headerStyle, Style totalStyle, Style totalHeaderStyle) {
		DJCrosstabRow row = new CrosstabRowBuilder()
		.setProperty(property,className)
		.setShowTotals(showTotal)
		.setTitle(title)
		.setHeaderStyle(headerStyle)
		.setTotalHeaderStyle(totalHeaderStyle)
		.setTotalStyle(totalStyle)
		.build();
		addRow(row);
		return this;
	}

	public CrosstabBuilder addRow(String title, String property, String className, boolean showTotal,
								  Style headerStyle, Style totalStyle, Style totalHeaderStyle, Comparator comparator) {
		DJCrosstabRow row = new CrosstabRowBuilder()
				.setProperty(property, className)
				.setShowTotals(showTotal)
				.setTitle(title)
				.setHeaderStyle(headerStyle)
				.setTotalHeaderStyle(totalHeaderStyle)
				.setTotalStyle(totalStyle)
				.setComparator(comparator)
				.build();
		addRow(row);
		return this;
	}

	/**
	 * Should be called after all rows have been created 
	 * @param headerStyle
	 * @param totalStyle
	 * @param totalHeaderStyle
	 * @return
	 */
	public CrosstabBuilder setRowStyles(Style headerStyle, Style totalStyle, Style totalHeaderStyle) {
		crosstab.setRowHeaderStyle(headerStyle);
		crosstab.setRowTotalheaderStyle(totalHeaderStyle);
		crosstab.setRowTotalStyle(totalStyle);
		return this;
	}

	/**
	 * Should be called after all columns have been created
	 * @param headerStyle
	 * @param totalStyle
	 * @param totalHeaderStyle
	 * @return
	 */
	public CrosstabBuilder setColumnStyles(Style headerStyle, Style totalStyle, Style totalHeaderStyle) {
		crosstab.setColumnHeaderStyle(headerStyle);
		crosstab.setColumnTotalheaderStyle(totalHeaderStyle);
		crosstab.setColumnTotalStyle(totalStyle);
		return this;
	}

	public CrosstabBuilder setCellWidth(int width) {
		this.cellWidth = width;
		return this;
	}
	public CrosstabBuilder setColumnHeaderHeight(int height) {
		this.columnHeaderHeight = height;
		return this;
	}
	public CrosstabBuilder setCellDimension(int height,int width) {
		setCellHeight(height);
		setCellWidth(width);
		return this;
	}
	public CrosstabBuilder setCellHeight(int height) {
		this.cellHeight = height;
		return this;
	}
	public CrosstabBuilder setRowHeaderWidth(int width) {
		this.rowHeaderWidth = width;
		return this;
	}

	public CrosstabBuilder setCaption(DJLabel caption) {
		crosstab.setCaption(caption);
		return this;
	}

	public CrosstabBuilder addMeasure(String property, String className, DJCalculation operation, String title, Style style,
			DJValueFormatter valueFormatter) {
		DJCrosstabMeasure measure = new DJCrosstabMeasure(property,className, operation , title);
		measure.setStyle(style);
		measure.setValueFormatter(valueFormatter);
		crosstab.getMeasures().add(measure);
		return this;	
	}

	public CrosstabBuilder addMeasure(String property, String className, DJCalculation operation, String title, Style style,
			DJValueFormatter valueFormatter, boolean isPercentage) {
		DJCrosstabMeasure measure = new DJCrosstabMeasure(property,className, operation , title);
		measure.setStyle(style);
		measure.setValueFormatter(valueFormatter);
		measure.setIsPercentage(isPercentage);
		crosstab.getMeasures().add(measure);
		return this;	
	}
	
	public CrosstabBuilder addMeasure(String property, String className, DJCalculation operation, String title, Style style,
			DJValueFormatter valueFormatter, DJCRosstabMeasurePrecalculatedTotalProvider totalProvider) {
		DJCrosstabMeasure measure = new DJCrosstabMeasure(property,className, operation , title);
		measure.setStyle(style);
		measure.setValueFormatter(valueFormatter);
		measure.setPrecalculatedTotalProvider(totalProvider);
		crosstab.getMeasures().add(measure);
		return this;	
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy