package com.vaadin.addon.spreadsheet.charts.converter.confwriter; /* * #%L * Vaadin Spreadsheet Charts Integration * %% * Copyright (C) 2016 Vaadin Ltd * %% * This program is available under Commercial Vaadin Add-On License 3.0 * (CVALv3). * * See the file license.html distributed with this software for more * information about licensing. * * You should have received a copy of the CVALv3 along with this program. * If not, see <http://vaadin.com/license/cval-3>. * #L% */ import com.vaadin.addon.charts.model.ChartType; import com.vaadin.addon.charts.model.Configuration; import com.vaadin.addon.charts.model.PlotOptionsPie; import com.vaadin.addon.charts.model.Series; import com.vaadin.addon.spreadsheet.charts.converter.chartdata.ChartData; import com.vaadin.addon.spreadsheet.charts.converter.chartdata.PieSeriesData; public class PieToDonutConverter { private static final double DONUT_GAP_BETWEEN_RINGS = 0.02; public static void convertIfNeeded(ChartData definition, Configuration conf) { if (definition.plotData.size() > 0 && definition.plotData.get(0) instanceof PieSeriesData) { PieSeriesData pieSeriesData = (PieSeriesData) definition.plotData .get(0); if (pieSeriesData.isDonut) convertPieToDonut(conf, pieSeriesData.donutHoleSizePercent); } } private static void convertPieToDonut(Configuration conf, short donutHoleSizePercent) { final int pieSerCount = countPieSeries(conf); int currentPieSeries = 0; final double onePieShare = (1.0 - donutHoleSizePercent / 100.0) / pieSerCount; final double gap = DONUT_GAP_BETWEEN_RINGS; for (Series ser : conf.getSeries()) { if (ser.getPlotOptions().getChartType() == ChartType.PIE) { double currentShare = 1 - currentPieSeries * onePieShare; double innerSize = (currentShare - onePieShare + gap) / currentShare; ((PlotOptionsPie) ser.getPlotOptions()).setInnerSize(Math .round(innerSize * 100) + "%"); ((PlotOptionsPie) ser.getPlotOptions()).setSize(Math .round(currentShare * 100) + "%"); currentPieSeries++; } } } private static int countPieSeries(Configuration conf) { int count = 0; for (Series ser : conf.getSeries()) { if (ser.getPlotOptions().getChartType() == ChartType.PIE) count++; } return count; } }