package org.devgateway.toolkit.web.excelcharts.data;
import org.apache.poi.ss.usermodel.Chart;
import org.apache.poi.ss.usermodel.charts.ChartAxis;
import org.apache.poi.ss.usermodel.charts.ChartDataSource;
import org.apache.poi.xssf.usermodel.XSSFChart;
import org.apache.xmlbeans.XmlObject;
import org.devgateway.toolkit.web.excelcharts.CustomChartSeries;
import org.devgateway.toolkit.web.excelcharts.util.XSSFChartUtil;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTAxDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTNumDataSource;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPieChart;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPieSer;
import org.openxmlformats.schemas.drawingml.x2006.chart.CTPlotArea;
/**
* @author idobre
* @since 8/8/16
*
* Holds data for a XSSF Pie Chart.
*/
public class XSSFPieChartData extends AbstractXSSFChartData {
public XSSFPieChartData(final String title) {
super(title);
}
@Override
protected CustomChartSeries createNewSerie(final int id, final int order, final ChartDataSource<?> categories,
final ChartDataSource<? extends Number> values) {
return new AbstractSeries(id, order, categories, values) {
@Override
public void addToChart(final XmlObject ctChart) {
final CTPieChart ctPieChart = (CTPieChart) ctChart;
final CTPieSer ctPieSer = ctPieChart.addNewSer();
ctPieSer.addNewIdx().setVal(this.id);
ctPieSer.addNewOrder().setVal(this.order);
final CTAxDataSource catDS = ctPieSer.addNewCat();
XSSFChartUtil.buildAxDataSource(catDS, this.categories);
final CTNumDataSource valueDS = ctPieSer.addNewVal();
XSSFChartUtil.buildNumDataSource(valueDS, this.values);
if (isTitleSet()) {
ctPieSer.setTx(getCTSerTx());
}
}
};
}
@Override
public void fillChart(final Chart chart, final ChartAxis... axis) {
if (!(chart instanceof XSSFChart)) {
throw new IllegalArgumentException("Chart must be instance of XSSFChart");
}
final XSSFChart xssfChart = (XSSFChart) chart;
final CTPlotArea plotArea = xssfChart.getCTChart().getPlotArea();
final CTPieChart pieChart = plotArea.addNewPieChart();
pieChart.addNewVaryColors().setVal(true);
xssfChart.setTitle(this.title);
for (CustomChartSeries s : series) {
s.addToChart(pieChart);
}
}
}