/* * Copyright (c) 2011-2015 Marat Gubaidullin. * * This file is part of HYBRIDBPM. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. * */ package com.hybridbpm.ui.component.chart; import com.hybridbpm.ui.HybridbpmUI; import com.hybridbpm.core.data.chart.DiagrammePreference; import com.hybridbpm.ui.component.chart.manager.GroupedDataSeriesManager; import com.hybridbpm.ui.component.chart.manager.SimpleDataSeriesManager; import static com.hybridbpm.ui.component.chart.util.DiagrammeUtil.checkNotEmpty; import com.hybridbpm.ui.component.chart.color.ChartColorer; import com.hybridbpm.ui.util.Translate; import com.vaadin.addon.charts.model.ChartType; import com.vaadin.addon.charts.model.Labels; import com.vaadin.addon.charts.model.PlotOptionsPie; import com.vaadin.addon.charts.model.style.SolidColor; import com.vaadin.data.Container; import java.util.HashMap; import java.util.Map; import java.util.Set; @SuppressWarnings("serial") public class DonutChart extends ThreeParamChart { private ChartColorer chartColorer; private SimpleDataSeriesManager innerItemsManager; private GroupedDataSeriesManager outerItemsManager; public DonutChart(Container container) { super(container); innerItemsManager = new SimpleDataSeriesManager(); outerItemsManager = new GroupedDataSeriesManager(); // Setup outer ring PlotOptionsPie outerOptions = new PlotOptionsPie(); outerOptions.setInnerSize(200); outerOptions.setSize("80%"); outerItemsManager.getSeries().setPlotOptions(outerOptions); outerOptions.setBorderWidth(0.5); // Setup inner aggregation ring PlotOptionsPie innerOptions = new PlotOptionsPie(); innerOptions.setSize(200); innerItemsManager.getSeries().setPlotOptions(innerOptions); innerOptions.setDataLabels(new Labels()); innerOptions.getDataLabels().setFormatter("this.y > 5 ? this.point.name : null"); innerOptions.getDataLabels().setColor(new SolidColor(255, 255, 255)); innerOptions.getDataLabels().setDistance(-35); innerOptions.setBorderWidth(0.5); getConfiguration().setSeries(innerItemsManager.getSeries(), outerItemsManager.getSeries()); } @Override protected void initPreferences() { super.initPreferences(); Map<String, String> valueColourMap = getPreferenceValue(DiagrammePreference.VALUE_COLOUR_MAP); this.chartColorer = new ChartColorer(valueColourMap); outerItemsManager.getSeries().setName(getFirstColumnName()); innerItemsManager.getSeries().setName(getSecondColumnName()); } @Override protected void renderChart(Map<ColumnCoupleKey<?, ?>, Object> data, Set secondColumnValues, Set firstColumnValues) { outerItemsManager.beginUpdate(); // setup outer data Map<String, Number> totals = new HashMap<String, Number>(); for (Object secondColumnValue : secondColumnValues) { for (Object firstColumnValue : firstColumnValues) { // Assume that the column could be either numeric or text // and values are always numeric Number value = (Number) data.get(new ColumnCoupleKey(secondColumnValue, firstColumnValue)); if (value != null) { String secondColumnTxt = secondColumnValue.toString(); String firstColumnTxt = firstColumnValue.toString(); // draw the outer ring item SolidColor color = chartColorer.lookupColor(secondColumnTxt); // changes are accumulated in the manager and will be rendered all at once afterwards outerItemsManager.addItem(value, firstColumnTxt, color, secondColumnTxt); // count total for the inner circle Number columnTotal = totals.get(secondColumnTxt); if (columnTotal == null) { columnTotal = 0; } totals.put(secondColumnTxt, columnTotal.doubleValue() + value.doubleValue()); } } } // render all outer ring items outerItemsManager.renderItems(); // setup inner data innerItemsManager.beginUpdate(); for (Object secondColumnObject : secondColumnValues) { String secondColumnTxt = secondColumnObject.toString(); SolidColor color = chartColorer.lookupColor(secondColumnTxt); // draw the inner circle item innerItemsManager.addItem(totals.get(secondColumnTxt), secondColumnTxt, color); } // render all inner circle items innerItemsManager.renderItems(); // save changes in values colors back to the preference setPreferenceValue(DiagrammePreference.VALUE_COLOUR_MAP, chartColorer.getValueColourMap()); } @Override public ChartType getChartType() { return ChartType.PIE; } @Override protected void checkState() { super.checkState(); checkNotEmpty(chartColorer, Translate.getMessage("color-value-not-set")); checkNotEmpty(chartColorer.getValueColourMap(), Translate.getMessage("color-value-not-set")); } }