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

net.sf.dynamicreports.design.transformation.ChartTransform Maven / Gradle / Ivy

Go to download

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.

There is a newer version: 6.20.1
Show newest version
/**
 * 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.Comparator;
import java.util.List;
import java.util.Map;

import net.sf.dynamicreports.design.base.DRDesignDataset;
import net.sf.dynamicreports.design.base.DRDesignGroup;
import net.sf.dynamicreports.design.base.chart.DRDesignChart;
import net.sf.dynamicreports.design.base.chart.DRDesignChartLegend;
import net.sf.dynamicreports.design.base.chart.DRDesignChartSubtitle;
import net.sf.dynamicreports.design.base.chart.DRDesignChartTitle;
import net.sf.dynamicreports.design.base.chart.dataset.DRDesignCategoryChartSerie;
import net.sf.dynamicreports.design.base.chart.dataset.DRDesignCategoryDataset;
import net.sf.dynamicreports.design.base.chart.dataset.DRDesignChartDataset;
import net.sf.dynamicreports.design.base.chart.dataset.DRDesignChartSerie;
import net.sf.dynamicreports.design.base.chart.dataset.DRDesignGanttChartSerie;
import net.sf.dynamicreports.design.base.chart.dataset.DRDesignHighLowDataset;
import net.sf.dynamicreports.design.base.chart.dataset.DRDesignSeriesDataset;
import net.sf.dynamicreports.design.base.chart.dataset.DRDesignTimeSeriesDataset;
import net.sf.dynamicreports.design.base.chart.dataset.DRDesignValueDataset;
import net.sf.dynamicreports.design.base.chart.dataset.DRDesignXyChartSerie;
import net.sf.dynamicreports.design.base.chart.dataset.DRDesignXyzChartSerie;
import net.sf.dynamicreports.design.base.chart.plot.AbstractDesignBasePlot;
import net.sf.dynamicreports.design.base.chart.plot.DRDesignAxisFormat;
import net.sf.dynamicreports.design.base.chart.plot.DRDesignAxisPlot;
import net.sf.dynamicreports.design.base.chart.plot.DRDesignBar3DPlot;
import net.sf.dynamicreports.design.base.chart.plot.DRDesignBarPlot;
import net.sf.dynamicreports.design.base.chart.plot.DRDesignBubblePlot;
import net.sf.dynamicreports.design.base.chart.plot.DRDesignCandlestickPlot;
import net.sf.dynamicreports.design.base.chart.plot.DRDesignChartAxis;
import net.sf.dynamicreports.design.base.chart.plot.DRDesignHighLowPlot;
import net.sf.dynamicreports.design.base.chart.plot.DRDesignLinePlot;
import net.sf.dynamicreports.design.base.chart.plot.DRDesignMeterInterval;
import net.sf.dynamicreports.design.base.chart.plot.DRDesignMeterPlot;
import net.sf.dynamicreports.design.base.chart.plot.DRDesignMultiAxisPlot;
import net.sf.dynamicreports.design.base.chart.plot.DRDesignPie3DPlot;
import net.sf.dynamicreports.design.base.chart.plot.DRDesignPiePlot;
import net.sf.dynamicreports.design.base.chart.plot.DRDesignSpiderPlot;
import net.sf.dynamicreports.design.base.chart.plot.DRDesignThermometerPlot;
import net.sf.dynamicreports.design.constant.ResetType;
import net.sf.dynamicreports.design.definition.DRIDesignHyperLink;
import net.sf.dynamicreports.design.definition.DRIDesignVariable;
import net.sf.dynamicreports.design.definition.chart.plot.DRIDesignPlot;
import net.sf.dynamicreports.design.definition.expression.DRIDesignExpression;
import net.sf.dynamicreports.design.exception.DRDesignReportException;
import net.sf.dynamicreports.design.transformation.chartcustomizer.DifferenceRendererCustomizer;
import net.sf.dynamicreports.design.transformation.chartcustomizer.GroupedStackedBarRendererCustomizer;
import net.sf.dynamicreports.design.transformation.chartcustomizer.LayeredBarRendererCustomizer;
import net.sf.dynamicreports.design.transformation.chartcustomizer.PieChartLabelFormatCustomizer;
import net.sf.dynamicreports.design.transformation.chartcustomizer.SeriesColorsByNameCustomizer;
import net.sf.dynamicreports.design.transformation.chartcustomizer.SeriesOrderCustomizer;
import net.sf.dynamicreports.design.transformation.chartcustomizer.ShowPercentagesCustomizer;
import net.sf.dynamicreports.design.transformation.chartcustomizer.ShowValuesCustomizer;
import net.sf.dynamicreports.design.transformation.chartcustomizer.WaterfallBarRendererCustomizer;
import net.sf.dynamicreports.design.transformation.chartcustomizer.XyBlockRendererCustomizer;
import net.sf.dynamicreports.design.transformation.chartcustomizer.XyStepRendererCustomizer;
import net.sf.dynamicreports.design.transformation.expressions.GroupedSeriesExpression;
import net.sf.dynamicreports.design.transformation.expressions.SerieValueExpression;
import net.sf.dynamicreports.report.ReportUtils;
import net.sf.dynamicreports.report.builder.expression.Expressions;
import net.sf.dynamicreports.report.constant.OrderType;
import net.sf.dynamicreports.report.definition.DRIDataset;
import net.sf.dynamicreports.report.definition.chart.DRIChart;
import net.sf.dynamicreports.report.definition.chart.DRIChartCustomizer;
import net.sf.dynamicreports.report.definition.chart.DRIChartLegend;
import net.sf.dynamicreports.report.definition.chart.DRIChartSubtitle;
import net.sf.dynamicreports.report.definition.chart.DRIChartTitle;
import net.sf.dynamicreports.report.definition.chart.dataset.DRICategoryChartSerie;
import net.sf.dynamicreports.report.definition.chart.dataset.DRICategoryDataset;
import net.sf.dynamicreports.report.definition.chart.dataset.DRIChartDataset;
import net.sf.dynamicreports.report.definition.chart.dataset.DRIChartSerie;
import net.sf.dynamicreports.report.definition.chart.dataset.DRIGanttChartSerie;
import net.sf.dynamicreports.report.definition.chart.dataset.DRIGroupedCategoryChartSerie;
import net.sf.dynamicreports.report.definition.chart.dataset.DRIHighLowDataset;
import net.sf.dynamicreports.report.definition.chart.dataset.DRISeriesDataset;
import net.sf.dynamicreports.report.definition.chart.dataset.DRITimeSeriesDataset;
import net.sf.dynamicreports.report.definition.chart.dataset.DRIValueDataset;
import net.sf.dynamicreports.report.definition.chart.dataset.DRIXyChartSerie;
import net.sf.dynamicreports.report.definition.chart.dataset.DRIXyzChartSerie;
import net.sf.dynamicreports.report.definition.chart.plot.DRIAxisFormat;
import net.sf.dynamicreports.report.definition.chart.plot.DRIAxisPlot;
import net.sf.dynamicreports.report.definition.chart.plot.DRIBar3DPlot;
import net.sf.dynamicreports.report.definition.chart.plot.DRIBarPlot;
import net.sf.dynamicreports.report.definition.chart.plot.DRIBasePlot;
import net.sf.dynamicreports.report.definition.chart.plot.DRIBubblePlot;
import net.sf.dynamicreports.report.definition.chart.plot.DRICandlestickPlot;
import net.sf.dynamicreports.report.definition.chart.plot.DRIChartAxis;
import net.sf.dynamicreports.report.definition.chart.plot.DRIDifferencePlot;
import net.sf.dynamicreports.report.definition.chart.plot.DRIGroupedStackedBarPlot;
import net.sf.dynamicreports.report.definition.chart.plot.DRIHighLowPlot;
import net.sf.dynamicreports.report.definition.chart.plot.DRILayeredBarPlot;
import net.sf.dynamicreports.report.definition.chart.plot.DRILinePlot;
import net.sf.dynamicreports.report.definition.chart.plot.DRIMeterInterval;
import net.sf.dynamicreports.report.definition.chart.plot.DRIMeterPlot;
import net.sf.dynamicreports.report.definition.chart.plot.DRIMultiAxisPlot;
import net.sf.dynamicreports.report.definition.chart.plot.DRIPie3DPlot;
import net.sf.dynamicreports.report.definition.chart.plot.DRIPiePlot;
import net.sf.dynamicreports.report.definition.chart.plot.DRIPlot;
import net.sf.dynamicreports.report.definition.chart.plot.DRISpiderPlot;
import net.sf.dynamicreports.report.definition.chart.plot.DRIThermometerPlot;
import net.sf.dynamicreports.report.definition.chart.plot.DRIWaterfallBarPlot;
import net.sf.dynamicreports.report.definition.chart.plot.DRIXyBlockPlot;
import net.sf.dynamicreports.report.definition.chart.plot.DRIXyStepPlot;
import net.sf.dynamicreports.report.definition.expression.DRIExpression;
import net.sf.dynamicreports.report.exception.DRException;

/**
 * @author Ricardo Mariaca ([email protected])
 */
public class ChartTransform {
	private DesignTransformAccessor accessor;

	public ChartTransform(DesignTransformAccessor accessor) {
		this.accessor = accessor;
	}

	//chart
	protected DRDesignChart transform(DRIChart chart, ResetType resetType, DRDesignGroup resetGroup) throws DRException {
		return transform(chart, null, resetType, resetGroup);
	}

	private DRDesignChart transform(DRIChart chart, DRIDataset subDataset, ResetType resetType, DRDesignGroup resetGroup) throws DRException {
		DRDesignChart designChart = new DRDesignChart();
		designChart.setWidth(accessor.getTemplateTransform().getChartWidth(chart));
		designChart.setHeight(accessor.getTemplateTransform().getChartHeight(chart));
		designChart.setChartType(chart.getChartType());
		designChart.setTheme(accessor.getTemplateTransform().getChartTheme(chart));
		if (!(chart.getPlot() instanceof DRIMultiAxisPlot)) {
			designChart.setDataset(dataset(chart.getDataset(), subDataset, resetType, resetGroup));
		}
		designChart.setPlot(plot(chart.getPlot(), designChart.getCustomizers(), chart.getDataset().getSubDataset(), resetType, resetGroup));
		designChart.setTitle(title(chart.getTitle()));
		designChart.setSubtitle(subtitle(chart.getSubtitle()));
		designChart.setLegend(legend(chart.getLegend()));

		if (!chart.getCustomizers().isEmpty()) {
			designChart.getCustomizers().addAll(chart.getCustomizers());
		}

		return designChart;
	}

	//plot
	private DRIDesignPlot plot(DRIPlot plot, List chartCustomizers, DRIDataset subDataset, ResetType resetType, DRDesignGroup resetGroup) throws DRException {
		DRIDesignPlot designPlot;

		if (plot instanceof DRIBar3DPlot) {
			designPlot = bar3DPlot((DRIBar3DPlot) plot, chartCustomizers);
		}
		else if (plot instanceof DRILayeredBarPlot) {
			designPlot = layeredBarPlot((DRILayeredBarPlot) plot, chartCustomizers);
		}
		else if (plot instanceof DRIWaterfallBarPlot) {
			designPlot = waterfallBarPlot((DRIWaterfallBarPlot) plot, chartCustomizers);
		}
		else if (plot instanceof DRIGroupedStackedBarPlot) {
			designPlot = groupedStackedBarPlot((DRIGroupedStackedBarPlot) plot, chartCustomizers);
		}
		else if (plot instanceof DRIBarPlot) {
			designPlot = barPlot((DRIBarPlot) plot, chartCustomizers);
		}
		else if (plot instanceof DRIDifferencePlot) {
			designPlot = differencePlot((DRIDifferencePlot) plot, chartCustomizers);
		}
		else if (plot instanceof DRIXyStepPlot) {
			designPlot = xyStepPlot((DRIXyStepPlot) plot, chartCustomizers);
		}
		else if (plot instanceof DRILinePlot) {
			designPlot = linePlot((DRILinePlot) plot, chartCustomizers);
		}
		else if (plot instanceof DRIMultiAxisPlot) {
			designPlot = multiAxisPlot((DRIMultiAxisPlot) plot, chartCustomizers, subDataset, resetType, resetGroup);
		}
		else if (plot instanceof DRIPie3DPlot) {
			designPlot = pie3DPlot((DRIPie3DPlot) plot, chartCustomizers);
		}
		else if (plot instanceof DRIPiePlot) {
			designPlot = piePlot((DRIPiePlot) plot, chartCustomizers);
		}
		else if (plot instanceof DRISpiderPlot) {
			designPlot = spiderPlot((DRISpiderPlot) plot);
		}
		else if (plot instanceof DRIXyBlockPlot) {
			designPlot = xyBlockPlot((DRIXyBlockPlot) plot, chartCustomizers);
		}
		else if (plot instanceof DRIBubblePlot) {
			designPlot = bubblePlot((DRIBubblePlot) plot, chartCustomizers);
		}
		else if (plot instanceof DRICandlestickPlot) {
			designPlot = candlestickPlot((DRICandlestickPlot) plot, chartCustomizers);
		}
		else if (plot instanceof DRIHighLowPlot) {
			designPlot = highLowPlot((DRIHighLowPlot) plot, chartCustomizers);
		}
		else if (plot instanceof DRIMeterPlot) {
			designPlot = meterPlot((DRIMeterPlot) plot);
		}
		else if (plot instanceof DRIThermometerPlot) {
			designPlot = thermometerPlot((DRIThermometerPlot) plot);
		}
		else if (plot instanceof DRIAxisPlot) {
			designPlot = axisPlot((DRIAxisPlot) plot, chartCustomizers);
		}
		else {
			throw new DRDesignReportException("Chart plot " + plot.getClass().getName() + " not supported");
		}

		if (plot instanceof DRIBasePlot) {
			AbstractDesignBasePlot designBasePlot = ((AbstractDesignBasePlot) designPlot);
			DRIBasePlot basePlot = (DRIBasePlot) plot;
			designBasePlot.setOrientation(basePlot.getOrientation());
			designBasePlot.setSeriesColors(accessor.getTemplateTransform().getChartSeriesColors(basePlot));
			Map seriesColorsByName = basePlot.getSeriesColorsByName();
			if (!seriesColorsByName.isEmpty()) {
				chartCustomizers.add(new SeriesColorsByNameCustomizer(seriesColorsByName));
			}
		}

		return designPlot;
	}

	private DRDesignBar3DPlot bar3DPlot(DRIBar3DPlot bar3DPlot, List chartCustomizers) throws DRException {
		DRDesignBar3DPlot designBar3DPlot = new DRDesignBar3DPlot();
		axisPlot(designBar3DPlot, bar3DPlot, chartCustomizers);
		designBar3DPlot.setXOffset(bar3DPlot.getXOffset());
		designBar3DPlot.setYOffset(bar3DPlot.getYOffset());
		designBar3DPlot.setShowLabels(bar3DPlot.getShowLabels());
		return designBar3DPlot;
	}

	private DRDesignBarPlot barPlot(DRIBarPlot barPlot, List chartCustomizers) throws DRException {
		DRDesignBarPlot designBarPlot = new DRDesignBarPlot();
		axisPlot(designBarPlot, barPlot, chartCustomizers);
		designBarPlot.setShowTickMarks(barPlot.getShowTickMarks());
		designBarPlot.setShowTickLabels(barPlot.getShowTickLabels());
		designBarPlot.setShowLabels(barPlot.getShowLabels());
		return designBarPlot;
	}

	private DRDesignBarPlot groupedStackedBarPlot(DRIGroupedStackedBarPlot groupedStackedBarPlot, List chartCustomizers) throws DRException {
		GroupedStackedBarRendererCustomizer renderer = new GroupedStackedBarRendererCustomizer();
		chartCustomizers.add(renderer);
		DRDesignBarPlot designBarPlot = barPlot(groupedStackedBarPlot, chartCustomizers);
		return designBarPlot;
	}

	private DRDesignBarPlot layeredBarPlot(DRILayeredBarPlot layeredBarPlot, List chartCustomizers) throws DRException {
		chartCustomizers.add(new LayeredBarRendererCustomizer(layeredBarPlot.getSeriesBarWidths()));
		DRDesignBarPlot designBarPlot = barPlot(layeredBarPlot, chartCustomizers);
		return designBarPlot;
	}

	private DRDesignBarPlot waterfallBarPlot(DRIWaterfallBarPlot waterfallBarPlot, List chartCustomizers) throws DRException {
		WaterfallBarRendererCustomizer waterfallBarCustomizer = new WaterfallBarRendererCustomizer(waterfallBarPlot);
		chartCustomizers.add(waterfallBarCustomizer);
		DRDesignBarPlot designBarPlot = barPlot(waterfallBarPlot, chartCustomizers);
		return designBarPlot;
	}

	private DRDesignLinePlot linePlot(DRILinePlot linePlot, List chartCustomizers) throws DRException {
		DRDesignLinePlot designLinePlot = new DRDesignLinePlot();
		axisPlot(designLinePlot, linePlot, chartCustomizers);
		designLinePlot.setShowShapes(linePlot.getShowShapes());
		designLinePlot.setShowLines(linePlot.getShowLines());
		return designLinePlot;
	}

	private DRDesignLinePlot differencePlot(DRIDifferencePlot differencePlot, List chartCustomizers) throws DRException {
		DRDesignLinePlot designLinePlot = new DRDesignLinePlot();
		chartCustomizers.add(new DifferenceRendererCustomizer(differencePlot));
		axisPlot(designLinePlot, differencePlot, chartCustomizers);
		return designLinePlot;
	}

	private DRDesignLinePlot xyStepPlot(DRIXyStepPlot xyStepPlot, List chartCustomizers) throws DRException {
		DRDesignLinePlot designLinePlot = new DRDesignLinePlot();
		chartCustomizers.add(new XyStepRendererCustomizer(xyStepPlot.getStepPoint()));
		axisPlot(designLinePlot, xyStepPlot, chartCustomizers);
		return designLinePlot;
	}

	private DRDesignMultiAxisPlot multiAxisPlot(DRIMultiAxisPlot multiAxisPlot, List chartCustomizers, DRIDataset subDataset, ResetType resetType, DRDesignGroup resetGroup) throws DRException {
		DRDesignMultiAxisPlot designMultiAxisPlot = new DRDesignMultiAxisPlot();
		axisPlot(designMultiAxisPlot, multiAxisPlot, chartCustomizers);
		for (DRIChartAxis axis : multiAxisPlot.getAxes()) {
			DRDesignChartAxis designAxis = new DRDesignChartAxis();
			designAxis.setPosition(axis.getPosition());
			DRDesignChart chart = transform(axis.getChart(), subDataset, resetType, resetGroup);
			chart.setUniqueName(ReportUtils.generateUniqueName("chart"));
			designAxis.setChart(chart);
			designMultiAxisPlot.getAxes().add(designAxis);
		}
		return designMultiAxisPlot;
	}

	private DRDesignPie3DPlot pie3DPlot(DRIPie3DPlot pie3DPlot, List chartCustomizers) {
		DRDesignPie3DPlot designPie3DPlot = new DRDesignPie3DPlot();
		piePlot(designPie3DPlot, pie3DPlot, chartCustomizers);
		designPie3DPlot.setDepthFactor(pie3DPlot.getDepthFactor());
		return designPie3DPlot;
	}

	private DRDesignPiePlot piePlot(DRIPiePlot piePlot, List chartCustomizers) {
		DRDesignPiePlot designPiePlot = new DRDesignPiePlot();
		piePlot(designPiePlot, piePlot, chartCustomizers);
		return designPiePlot;
	}

	private void piePlot(DRDesignPiePlot designPiePlot, DRIPiePlot piePlot, List chartCustomizers) {
		designPiePlot.setCircular(piePlot.getCircular());
		designPiePlot.setLabelFormat(piePlot.getLabelFormat());
		designPiePlot.setLegendLabelFormat(piePlot.getLegendLabelFormat());
		if (piePlot.getShowLabels() != null && !piePlot.getShowLabels()) {
			chartCustomizers.add(new PieChartLabelFormatCustomizer(null, null, null));
		}
		else {
			String labelFormat = piePlot.getLabelFormat();
			if (labelFormat == null) {
				labelFormat = "{0}";
			}
			if (piePlot.getShowValues() != null && piePlot.getShowValues()) {
				labelFormat += " = {1}";
			}
			if (piePlot.getShowPercentages() != null && piePlot.getShowPercentages()) {
				labelFormat += " ({2})";
			}
			String valuePattern = accessor.getTemplateTransform().getChartValuePattern(piePlot);
			String percentValuePattern = accessor.getTemplateTransform().getChartPercentValuePattern(piePlot);
			chartCustomizers.add(new PieChartLabelFormatCustomizer(labelFormat, valuePattern, percentValuePattern));
		}
	}

	private DRDesignSpiderPlot spiderPlot(DRISpiderPlot spiderPlot) throws DRException {
		DRDesignSpiderPlot designSpiderPlot = new DRDesignSpiderPlot();
		designSpiderPlot.setMaxValueExpression(accessor.getExpressionTransform().transformExpression(spiderPlot.getMaxValueExpression()));
		designSpiderPlot.setRotation(spiderPlot.getRotation());
		designSpiderPlot.setTableOrder(spiderPlot.getTableOrder());
		designSpiderPlot.setWebFilled(spiderPlot.getWebFilled());
		designSpiderPlot.setStartAngle(spiderPlot.getStartAngle());
		designSpiderPlot.setHeadPercent(spiderPlot.getHeadPercent());
		designSpiderPlot.setInteriorGap(spiderPlot.getInteriorGap());
		designSpiderPlot.setAxisLineColor(spiderPlot.getAxisLineColor());
		designSpiderPlot.setAxisLineWidth(spiderPlot.getAxisLineWidth());
		designSpiderPlot.setLabelFont(accessor.getStyleTransform().transformFont(spiderPlot.getLabelFont()));
		designSpiderPlot.setLabelGap(spiderPlot.getLabelGap());
		designSpiderPlot.setLabelColor(spiderPlot.getLabelColor());
		return designSpiderPlot;
	}

	private DRDesignAxisPlot xyBlockPlot(DRIXyBlockPlot xyBlockPlot, List chartCustomizers) throws DRException {
		DRDesignBubblePlot designBubblePlot = new DRDesignBubblePlot();
		chartCustomizers.add(new XyBlockRendererCustomizer(xyBlockPlot));
		axisPlot(designBubblePlot, xyBlockPlot, chartCustomizers);
		return designBubblePlot;
	}

	private DRDesignBubblePlot bubblePlot(DRIBubblePlot bubblePlot, List chartCustomizers) throws DRException {
		DRDesignBubblePlot designBubblePlot = new DRDesignBubblePlot();
		axisPlot(designBubblePlot, bubblePlot, chartCustomizers);
		designBubblePlot.setScaleType(bubblePlot.getScaleType());
		return designBubblePlot;
	}

	private DRDesignCandlestickPlot candlestickPlot(DRICandlestickPlot candlestickPlot, List chartCustomizers) throws DRException {
		DRDesignCandlestickPlot designCandlestickPlot = new DRDesignCandlestickPlot();
		axisPlot(designCandlestickPlot, candlestickPlot, chartCustomizers);
		designCandlestickPlot.setShowVolume(candlestickPlot.getShowVolume());
		return designCandlestickPlot;
	}

	private DRDesignHighLowPlot highLowPlot(DRIHighLowPlot highLowPlot, List chartCustomizers) throws DRException {
		DRDesignHighLowPlot designHighLowPlot = new DRDesignHighLowPlot();
		axisPlot(designHighLowPlot, highLowPlot, chartCustomizers);
		designHighLowPlot.setShowOpenTicks(highLowPlot.getShowOpenTicks());
		designHighLowPlot.setShowCloseTicks(highLowPlot.getShowCloseTicks());
		return designHighLowPlot;
	}

	private DRDesignMeterPlot meterPlot(DRIMeterPlot meterPlot) throws DRException {
		DRDesignMeterPlot designMeterPlot = new DRDesignMeterPlot();
		designMeterPlot.setDataRangeLowExpression(accessor.getExpressionTransform().transformExpression(meterPlot.getDataRangeLowExpression()));
		designMeterPlot.setDataRangeHighExpression(accessor.getExpressionTransform().transformExpression(meterPlot.getDataRangeHighExpression()));
		designMeterPlot.setValueColor(meterPlot.getValueColor());
		designMeterPlot.setValueMask(meterPlot.getValueMask());
		designMeterPlot.setValueFont(accessor.getStyleTransform().transformFont(meterPlot.getValueFont()));
		designMeterPlot.setShape(meterPlot.getShape());
		for (DRIMeterInterval interval : meterPlot.getIntervals()) {
			designMeterPlot.getIntervals().add(meterInterval(interval));
		}
		designMeterPlot.setMeterAngle(meterPlot.getMeterAngle());
		designMeterPlot.setUnits(meterPlot.getUnits());
		designMeterPlot.setTickInterval(meterPlot.getTickInterval());
		designMeterPlot.setMeterBackgroundColor(meterPlot.getMeterBackgroundColor());
		designMeterPlot.setNeedleColor(meterPlot.getNeedleColor());
		designMeterPlot.setTickColor(meterPlot.getTickColor());
		designMeterPlot.setTickLabelFont(accessor.getStyleTransform().transformFont(meterPlot.getTickLabelFont()));
		return designMeterPlot;
	}

	private DRDesignThermometerPlot thermometerPlot(DRIThermometerPlot thermometerPlot) throws DRException {
		DRDesignThermometerPlot designThermometerPlot = new DRDesignThermometerPlot();
		designThermometerPlot.setDataRangeLowExpression(accessor.getExpressionTransform().transformExpression(thermometerPlot.getDataRangeLowExpression()));
		designThermometerPlot.setDataRangeHighExpression(accessor.getExpressionTransform().transformExpression(thermometerPlot.getDataRangeHighExpression()));
		designThermometerPlot.setValueColor(thermometerPlot.getValueColor());
		designThermometerPlot.setValueMask(thermometerPlot.getValueMask());
		designThermometerPlot.setValueFont(accessor.getStyleTransform().transformFont(thermometerPlot.getValueFont()));
		designThermometerPlot.setValueLocation(accessor.getTemplateTransform().getChartThermometerPlotValueLocation(thermometerPlot));
		designThermometerPlot.setMercuryColor(thermometerPlot.getMercuryColor());
		designThermometerPlot.setLowDataRangeLowExpression(accessor.getExpressionTransform().transformExpression(thermometerPlot.getLowDataRangeLowExpression()));
		designThermometerPlot.setLowDataRangeHighExpression(accessor.getExpressionTransform().transformExpression(thermometerPlot.getLowDataRangeHighExpression()));
		designThermometerPlot.setMediumDataRangeLowExpression(accessor.getExpressionTransform().transformExpression(thermometerPlot.getMediumDataRangeLowExpression()));
		designThermometerPlot.setMediumDataRangeHighExpression(accessor.getExpressionTransform().transformExpression(thermometerPlot.getMediumDataRangeHighExpression()));
		designThermometerPlot.setHighDataRangeLowExpression(accessor.getExpressionTransform().transformExpression(thermometerPlot.getHighDataRangeLowExpression()));
		designThermometerPlot.setHighDataRangeHighExpression(accessor.getExpressionTransform().transformExpression(thermometerPlot.getHighDataRangeHighExpression()));
		return designThermometerPlot;
	}

	private DRDesignMeterInterval meterInterval(DRIMeterInterval interval) throws DRException {
		DRDesignMeterInterval designInterval = new DRDesignMeterInterval();
		designInterval.setLabel(interval.getLabel());
		designInterval.setBackgroundColor(interval.getBackgroundColor());
		designInterval.setAlpha(interval.getAlpha());
		designInterval.setDataRangeLowExpression(accessor.getExpressionTransform().transformExpression(interval.getDataRangeLowExpression()));
		designInterval.setDataRangeHighExpression(accessor.getExpressionTransform().transformExpression(interval.getDataRangeHighExpression()));
		return designInterval;
	}

	private DRDesignAxisPlot axisPlot(DRIAxisPlot axisPlot, List chartCustomizers) throws DRException {
		DRDesignAxisPlot designAxisPlot = new DRDesignAxisPlot();
		axisPlot(designAxisPlot, axisPlot, chartCustomizers);
		return designAxisPlot;
	}

	private void axisPlot(DRDesignAxisPlot designAxisPlot, DRIAxisPlot axisPlot, List chartCustomizers) throws DRException {
		designAxisPlot.setXAxisFormat(axisFormat(axisPlot.getXAxisFormat()));
		designAxisPlot.setYAxisFormat(axisFormat(axisPlot.getYAxisFormat()));
		Comparator seriesOrderBy = axisPlot.getSeriesOrderBy();
		OrderType seriesOrderType = axisPlot.getSeriesOrderType();
		if (seriesOrderBy != null || seriesOrderType != null) {
			chartCustomizers.add(new SeriesOrderCustomizer(seriesOrderBy, seriesOrderType));
		}
		if (axisPlot.getShowPercentages() != null && axisPlot.getShowPercentages()) {
			chartCustomizers.add(new ShowPercentagesCustomizer());
		}
		if (axisPlot.getShowValues() != null && axisPlot.getShowValues()) {
			String valuePattern;
			if (axisPlot.getShowPercentages() != null && axisPlot.getShowPercentages()) {
				valuePattern = accessor.getTemplateTransform().getChartPercentValuePattern(axisPlot);
			}
			else {
				valuePattern = accessor.getTemplateTransform().getChartValuePattern(axisPlot);
			}
			boolean customRangeMaxValue = false;
			if (axisPlot.getYAxisFormat() != null) {
				customRangeMaxValue = axisPlot.getYAxisFormat().getRangeMaxValueExpression() != null;
			}
			chartCustomizers.add(new ShowValuesCustomizer(valuePattern, customRangeMaxValue));
		}
	}

	//axis format
	private DRDesignAxisFormat axisFormat(DRIAxisFormat axisFormat) throws DRException {
		DRDesignAxisFormat designAxisFormat = new DRDesignAxisFormat();
		designAxisFormat.setLabelExpression(accessor.getExpressionTransform().transformExpression(axisFormat.getLabelExpression()));
		designAxisFormat.setLabelFont(accessor.getStyleTransform().transformFont(axisFormat.getLabelFont()));
		designAxisFormat.setLabelColor(axisFormat.getLabelColor());
		designAxisFormat.setTickLabelFont(accessor.getStyleTransform().transformFont(axisFormat.getTickLabelFont()));
		designAxisFormat.setTickLabelColor(axisFormat.getTickLabelColor());
		designAxisFormat.setTickLabelMask(axisFormat.getTickLabelMask());
		designAxisFormat.setVerticalTickLabels(axisFormat.getVerticalTickLabels());
		designAxisFormat.setTickLabelRotation(axisFormat.getTickLabelRotation());
		designAxisFormat.setLineColor(axisFormat.getLineColor());
		designAxisFormat.setRangeMinValueExpression(accessor.getExpressionTransform().transformExpression(axisFormat.getRangeMinValueExpression()));
		designAxisFormat.setRangeMaxValueExpression(accessor.getExpressionTransform().transformExpression(axisFormat.getRangeMaxValueExpression()));
		return designAxisFormat;
	}

	//title
	private DRDesignChartTitle title(DRIChartTitle title) throws DRException {
		DRDesignChartTitle designTitle = new DRDesignChartTitle();
		subtitle(designTitle, title);
		designTitle.setPosition(title.getPosition());
		return designTitle;
	}

	//subtitle
	private DRDesignChartSubtitle subtitle(DRIChartSubtitle subtitle) throws DRException {
		DRDesignChartSubtitle designSubtitle = new DRDesignChartSubtitle();
		subtitle(designSubtitle, subtitle);
		return designSubtitle;
	}

	private void subtitle(DRDesignChartSubtitle designSubtitle, DRIChartSubtitle subtitle) throws DRException {
		designSubtitle.setColor(subtitle.getColor());
		designSubtitle.setFont(accessor.getStyleTransform().transformFont(subtitle.getFont()));
		designSubtitle.setTitle(accessor.getExpressionTransform().transformExpression(subtitle.getTitle()));
	}

	//legend
	private DRDesignChartLegend legend(DRIChartLegend legend) {
		DRDesignChartLegend designLegend = new DRDesignChartLegend();
		designLegend.setColor(legend.getColor());
		designLegend.setBackgroundColor(legend.getBackgroundColor());
		designLegend.setShowLegend(legend.getShowLegend());
		designLegend.setFont(accessor.getStyleTransform().transformFont(legend.getFont()));
		designLegend.setPosition(legend.getPosition());
		return designLegend;
	}

	//dataset
	private DRDesignChartDataset dataset(DRIChartDataset dataset, DRIDataset subDataset, ResetType resetType, DRDesignGroup resetGroup) throws DRException {
		DRDesignDataset designSubDataset = null;
		if (dataset.getSubDataset() != null) {
			designSubDataset = accessor.getDatasetTransform().transform(dataset.getSubDataset());
			accessor.transformToDataset(dataset.getSubDataset());
		}
		else {
			designSubDataset = accessor.getDatasetTransform().transform(subDataset);
			accessor.transformToDataset(subDataset);
		}

		DRDesignChartDataset designDataset;
		if (dataset instanceof DRICategoryDataset) {
			designDataset = categoryDataset((DRICategoryDataset) dataset, resetType, resetGroup);
		}
		else if (dataset instanceof DRITimeSeriesDataset) {
			designDataset = timeSeriesDataset((DRITimeSeriesDataset) dataset, resetType, resetGroup);
		}
		else if (dataset instanceof DRISeriesDataset) {
			designDataset = seriesDataset((DRISeriesDataset) dataset, resetType, resetGroup);
		}
		else if (dataset instanceof DRIHighLowDataset) {
			designDataset = highLowDataset((DRIHighLowDataset) dataset);
		}
		else if (dataset instanceof DRIValueDataset) {
			designDataset = valueDataset((DRIValueDataset) dataset);
		}
		else {
			throw new DRDesignReportException("Dataset " + dataset.getClass().getName() + " not supported");
		}

		designDataset.setSubDataset(designSubDataset);
		if (resetType != null && resetType.equals(ResetType.NONE)) {
			designDataset.setResetType(ResetType.REPORT);
		}
		else {
			designDataset.setResetType(resetType);
		}
		designDataset.setResetGroup(resetGroup);
		accessor.transformToMainDataset();

		return designDataset;
	}

	private void seriesDataset(DRISeriesDataset dataset, DRDesignSeriesDataset designDataset, ResetType resetType, DRDesignGroup resetGroup) throws DRException {
		DRIDesignExpression valueExpression = accessor.getExpressionTransform().transformExpression(dataset.getValueExpression());
		DRIDesignHyperLink datasetItemHyperLink = accessor.getReportTransform().hyperlink(dataset.getItemHyperLink());
		designDataset.setValueExpression(valueExpression);
		int index = 0;
		for (DRIChartSerie serie : dataset.getSeries()) {
			DRDesignChartSerie designSerie;
			if (serie instanceof DRIGroupedCategoryChartSerie) {
				designSerie = groupedCategorySerie(dataset.getSubDataset(), (DRIGroupedCategoryChartSerie) serie, valueExpression, resetType, resetGroup, index++);
			}
			else if (serie instanceof DRICategoryChartSerie) {
				designSerie = categorySerie(dataset.getSubDataset(), (DRICategoryChartSerie) serie, valueExpression, resetType, resetGroup, index++);
			}
			else if (serie instanceof DRIXyChartSerie) {
				designSerie = xySerie(dataset.getSubDataset(), (DRIXyChartSerie) serie, valueExpression, resetType, resetGroup, index++);
			}
			else if (serie instanceof DRIXyzChartSerie) {
				designSerie = xyzSerie(dataset.getSubDataset(), (DRIXyzChartSerie) serie, valueExpression, resetType, resetGroup, index++);
			}
			else if (serie instanceof DRIGanttChartSerie) {
				designSerie = ganttSerie(dataset.getSubDataset(), (DRIGanttChartSerie) serie, valueExpression, resetType, resetGroup, index++);
			}
			else {
				throw new DRDesignReportException("Chart serie " + serie.getClass().getName() + " not supported");
			}
			DRIDesignHyperLink itemHyperLink = accessor.getReportTransform().hyperlink(serie.getItemHyperLink());
			if (itemHyperLink == null) {
				itemHyperLink = datasetItemHyperLink;
			}
			designSerie.setItemHyperLink(itemHyperLink);

			designDataset.addSerie(designSerie);
		}
	}

	private DRDesignSeriesDataset seriesDataset(DRISeriesDataset dataset, ResetType resetType, DRDesignGroup resetGroup) throws DRException {
		DRDesignSeriesDataset designDataset = new DRDesignSeriesDataset();
		seriesDataset(dataset, designDataset, resetType, resetGroup);
		return designDataset;
	}

	private DRDesignCategoryDataset categoryDataset(DRICategoryDataset dataset, ResetType resetType, DRDesignGroup resetGroup) throws DRException {
		DRDesignCategoryDataset designDataset = new DRDesignCategoryDataset();
		seriesDataset(dataset, designDataset, resetType, resetGroup);
		designDataset.setUseSeriesAsCategory(accessor.getTemplateTransform().isChartCategoryDatasetUseSeriesAsCategory(dataset));
		return designDataset;
	}

	private DRDesignTimeSeriesDataset timeSeriesDataset(DRITimeSeriesDataset dataset, ResetType resetType, DRDesignGroup resetGroup) throws DRException {
		DRDesignTimeSeriesDataset designDataset = new DRDesignTimeSeriesDataset();
		seriesDataset(dataset, designDataset, resetType, resetGroup);
		designDataset.setTimePeriodType(accessor.getTemplateTransform().getChartTimeSeriesDatasetTimePeriodType(dataset));
		return designDataset;
	}

	private DRDesignHighLowDataset highLowDataset(DRIHighLowDataset dataset) throws DRException {
		DRDesignHighLowDataset designDataset = new DRDesignHighLowDataset();
		AbstractExpressionTransform expressionTransform = accessor.getExpressionTransform();
		designDataset.setItemHyperLink(accessor.getReportTransform().hyperlink(dataset.getItemHyperLink()));
		designDataset.setSeriesExpression(expressionTransform.transformExpression(dataset.getSeriesExpression()));
		designDataset.setDateExpression(expressionTransform.transformExpression(dataset.getDateExpression()));
		designDataset.setHighExpression(expressionTransform.transformExpression(dataset.getHighExpression()));
		designDataset.setLowExpression(expressionTransform.transformExpression(dataset.getLowExpression()));
		designDataset.setOpenExpression(expressionTransform.transformExpression(dataset.getOpenExpression()));
		designDataset.setCloseExpression(expressionTransform.transformExpression(dataset.getCloseExpression()));
		designDataset.setVolumeExpression(expressionTransform.transformExpression(dataset.getVolumeExpression()));
		return designDataset;
	}

	private DRDesignValueDataset valueDataset(DRIValueDataset dataset) throws DRException {
		DRDesignValueDataset designDataset = new DRDesignValueDataset();
		AbstractExpressionTransform expressionTransform = accessor.getExpressionTransform();
		designDataset.setValueExpression(expressionTransform.transformExpression(dataset.getValueExpression()));
		return designDataset;
	}

	//design serie
	private DRDesignCategoryChartSerie categorySerie(DRIDataset dataset, DRICategoryChartSerie serie, DRIDesignExpression valueExpression, ResetType resetType, DRDesignGroup resetGroup, int index) throws DRException {
		DRDesignCategoryChartSerie designSerie = new DRDesignCategoryChartSerie();

		AbstractExpressionTransform expressionTransform = accessor.getExpressionTransform();
		DRIDesignExpression seriesExpression = expressionTransform.transformExpression(serie.getSeriesExpression());
		designSerie.setSeriesExpression(seriesExpression);
		DRIDesignExpression serieValueExpression = expressionTransform.transformExpression(serie.getValueExpression());
		if (serieValueExpression instanceof DRIDesignVariable) {
			designSerie.setValueExpression(serieValueExpression);
		}
		else {
			if (seriesExpression == null) {
				designSerie.setValueExpression(expressionTransform.transformExpression(new SerieValueExpression(valueExpression, serieValueExpression, resetType, resetGroup, null)));
			}
			else {
				designSerie.setValueExpression(expressionTransform.transformExpression(new SerieValueExpression(valueExpression, serieValueExpression, resetType, resetGroup, seriesExpression.getName())));
			}
		}
		DRIExpression labelExpression = serie.getLabelExpression();
		if (labelExpression == null) {
			labelExpression = Expressions.text("serie" + index);
		}
		designSerie.setLabelExpression(expressionTransform.transformExpression(labelExpression));

		return designSerie;
	}

	private DRDesignCategoryChartSerie groupedCategorySerie(DRIDataset dataset, DRIGroupedCategoryChartSerie serie, DRIDesignExpression valueExpression, ResetType resetType, DRDesignGroup resetGroup, int index) throws DRException {
		DRDesignCategoryChartSerie designSerie = new DRDesignCategoryChartSerie();

		AbstractExpressionTransform expressionTransform = accessor.getExpressionTransform();
		GroupedSeriesExpression groupedSeriesExpression = new GroupedSeriesExpression(serie.getGroupExpression(), serie.getSeriesExpression(), serie.getLabelExpression(), index);
		DRIDesignExpression seriesExpression = expressionTransform.transformExpression(groupedSeriesExpression);
		designSerie.setSeriesExpression(seriesExpression);
		DRIDesignExpression serieValueExpression = expressionTransform.transformExpression(serie.getValueExpression());
		if (serieValueExpression instanceof DRIDesignVariable) {
			designSerie.setValueExpression(serieValueExpression);
		}
		else {
			designSerie.setValueExpression(expressionTransform.transformExpression(new SerieValueExpression(valueExpression, serieValueExpression, resetType, resetGroup, seriesExpression.getName())));
		}
		DRIExpression labelExpression = serie.getLabelExpression();
		if (labelExpression == null) {
			labelExpression = Expressions.text("serie" + index);
		}
		designSerie.setLabelExpression(expressionTransform.transformExpression(labelExpression));

		return designSerie;
	}

	//xy serie
	private DRDesignXyChartSerie xySerie(DRIDataset dataset, DRIXyChartSerie serie, DRIDesignExpression valueExpression, ResetType resetType, DRDesignGroup resetGroup, int index) throws DRException {
		DRDesignXyChartSerie designSerie = new DRDesignXyChartSerie();

		AbstractExpressionTransform expressionTransform = accessor.getExpressionTransform();
		designSerie.setSeriesExpression(expressionTransform.transformExpression(serie.getSeriesExpression()));
		designSerie.setXValueExpression(expressionTransform.transformExpression(serie.getXValueExpression()));
		designSerie.setYValueExpression(expressionTransform.transformExpression(serie.getYValueExpression()));
		DRIExpression labelExpression = serie.getLabelExpression();
		if (labelExpression == null) {
			labelExpression = Expressions.text("serie" + index);
		}
		designSerie.setLabelExpression(expressionTransform.transformExpression(labelExpression));

		return designSerie;
	}

	//xyz serie
	private DRDesignXyzChartSerie xyzSerie(DRIDataset dataset, DRIXyzChartSerie serie, DRIDesignExpression valueExpression, ResetType resetType, DRDesignGroup resetGroup, int index) throws DRException {
		DRDesignXyzChartSerie designSerie = new DRDesignXyzChartSerie();
		AbstractExpressionTransform expressionTransform = accessor.getExpressionTransform();
		DRIExpression seriesExpression = serie.getSeriesExpression();
		if (seriesExpression == null) {
			seriesExpression = Expressions.text("serie" + index);
		}
		designSerie.setSeriesExpression(expressionTransform.transformExpression(seriesExpression));
		designSerie.setXValueExpression(expressionTransform.transformExpression(serie.getXValueExpression()));
		designSerie.setYValueExpression(expressionTransform.transformExpression(serie.getYValueExpression()));
		designSerie.setZValueExpression(expressionTransform.transformExpression(serie.getZValueExpression()));
		return designSerie;
	}

	//gantt serie
	private DRDesignGanttChartSerie ganttSerie(DRIDataset dataset, DRIGanttChartSerie serie, DRIDesignExpression valueExpression, ResetType resetType, DRDesignGroup resetGroup, int index) throws DRException {
		DRDesignGanttChartSerie designSerie = new DRDesignGanttChartSerie();
		AbstractExpressionTransform expressionTransform = accessor.getExpressionTransform();
		designSerie.setSeriesExpression(expressionTransform.transformExpression(serie.getSeriesExpression()));
		designSerie.setStartDateExpression(expressionTransform.transformExpression(serie.getStartDateExpression()));
		designSerie.setEndDateExpression(expressionTransform.transformExpression(serie.getEndDateExpression()));
		designSerie.setPercentExpression(expressionTransform.transformExpression(serie.getPercentExpression()));
		DRIExpression labelExpression = serie.getLabelExpression();
		if (labelExpression == null) {
			labelExpression = Expressions.text("serie" + index);
		}
		designSerie.setLabelExpression(expressionTransform.transformExpression(labelExpression));
		return designSerie;
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy