/*
* OpenFaces - JSF Component Library 2.0
* Copyright (C) 2007-2012, TeamDev Ltd.
* licensing@openfaces.org
* Unless agreed in writing the contents of this file are subject to
* the GNU Lesser General Public License Version 2.1 (the "LGPL" License).
* 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.
* Please visit http://openfaces.org/licensing/ for more details.
*/
package org.openfaces.component.chart.impl.plots;
import org.jfree.chart.labels.PieSectionLabelGenerator;
import org.jfree.chart.labels.PieToolTipGenerator;
import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
import org.jfree.chart.plot.PiePlot;
import org.jfree.chart.plot.PiePlot3D;
import org.jfree.chart.urls.PieURLGenerator;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.CategoryToPieDataset;
import org.jfree.data.general.PieDataset;
import org.jfree.util.TableOrder;
import org.openfaces.component.chart.Chart;
import org.openfaces.component.chart.ChartLabels;
import org.openfaces.component.chart.ChartLegend;
import org.openfaces.component.chart.ChartView;
import org.openfaces.component.chart.PieChartView;
import org.openfaces.component.chart.PieSectorProperties;
import org.openfaces.component.chart.impl.PropertiesConverter;
import org.openfaces.component.chart.impl.configuration.ConfigurablePlot;
import org.openfaces.component.chart.impl.configuration.ItemsColorConfigurator;
import org.openfaces.component.chart.impl.configuration.OutlineConfigurator;
import org.openfaces.component.chart.impl.configuration.PlotColorsConfigurator;
import org.openfaces.component.chart.impl.configuration.PlotConfigurator;
import org.openfaces.component.chart.impl.configuration.PlotSelectionConfigurator;
import org.openfaces.component.chart.impl.configuration.ShadowConfigurator;
import org.openfaces.component.chart.impl.generators.DynamicPieGenerator;
import org.openfaces.renderkit.cssparser.CSSUtil;
import org.openfaces.renderkit.cssparser.StyleBorderModel;
import org.openfaces.renderkit.cssparser.StyleObjectModel;
import java.awt.*;
import java.text.AttributedString;
import java.util.Collection;
/**
* @author Eugene Goncharov
*/
public class PiePlot3DAdapter extends PiePlot3D implements ConfigurablePlot {
private ConfigurablePlotBase configurationDelegate = new ConfigurablePlotBase();
private TableOrder order;
public PiePlot3DAdapter(PieDataset pieDataset, Chart chart, PieChartView chartView) {
setDataset(pieDataset);
init(this, chart, chartView, pieDataset, null);
}
PiePlot3DAdapter(PiePlot piePlot, CategoryDataset categoryDataset, TableOrder order, PieChartView chartView, Chart chart) {
// todo: consider refactoring -- view the usage
this.order = order;
PieDataset dataset = new CategoryToPieDataset(categoryDataset, order, 0);
init(piePlot, chart, chartView, dataset, categoryDataset);
}
private void setupLegendLabels(PiePlot plot, Chart chart, PieChartView chartView) {
if (!chart.isLegendVisible())
return;
ChartLegend legend = chart.getLegend();
if (legend == null || legend.getLabels() == null)
return;
final ChartLabels labels = legend.getLabels();
if (labels.getText() != null) {
// simple text = the same string for every item
plot.setLegendLabelGenerator(new PieSectionLabelGenerator() {
public String generateSectionLabel(PieDataset pieDataset, Comparable comparable) {
return labels.getText();
}
public AttributedString generateAttributedSectionLabel(PieDataset dataset, Comparable key) {
return null;
}
});
} else if (labels.getDynamicText() != null) {
plot.setLegendLabelGenerator(new DynamicPieGenerator(chartView, labels.getDynamicText()));
} else {
plot.setLegendLabelGenerator(new StandardPieSectionLabelGenerator());
}
}
private void setupPieLabelGenerator(PiePlot plot, PieChartView chartView) {
if (chartView.isLabelsVisible()) {
ChartLabels labels = chartView.getLabels();
if (labels != null && labels.getDynamicText() != null)
plot.setLabelGenerator(new DynamicPieGenerator(chartView, labels.getDynamicText()));
else
plot.setLabelGenerator(new StandardPieSectionLabelGenerator());
//TODO: move to style helper
if (labels != null) {
StyleObjectModel cssLabelsModel = labels.getStyleObjectModel();
plot.setLabelFont(CSSUtil.getFont(cssLabelsModel));
plot.setLabelPaint(cssLabelsModel.getColor());
plot.setLabelBackgroundPaint(cssLabelsModel.getBackground());
}
} else {
plot.setLabelGenerator(null);
}
}
private void setupTooltipsAndUrls(PiePlot plot, final PieChartView chartView) {
if (chartView.getTooltip() != null) {
plot.setToolTipGenerator(new PieToolTipGenerator() {
public String generateToolTip(PieDataset pieDataset, Comparable comparable) {
return chartView.getTooltip();
}
});
} else if (chartView.getDynamicTooltip() != null) {
plot.setToolTipGenerator(new DynamicPieGenerator(chartView, chartView.getDynamicTooltip()));
}
if (chartView.getUrl() != null) {
plot.setURLGenerator(new PieURLGenerator() {
public String generateURL(PieDataset pieDataset, Comparable comparable, int i) {
return chartView.getUrl();
}
});
} else if (chartView.getDynamicUrl() != null) {
plot.setURLGenerator(new DynamicPieGenerator(chartView, chartView.getDynamicUrl()));
}
}
private void sectorProcessing(PiePlot plot, PieChartView chartView, PieDataset dataset, CategoryDataset categoryDataset) {
java.util.List<PieSectorProperties> sectors = chartView.getSectors();
if (sectors == null || sectors.size() == 0)
return;
for (PieSectorProperties sector : sectors) {
DynamicPieGenerator generator = new DynamicPieGenerator(chartView, null);
int index = -1;
Float sectorPulled = sector.getPulled();
if (dataset instanceof CategoryToPieDataset) {
CategoryToPieDataset cds = (CategoryToPieDataset) dataset;
int count = getIterationCount(cds);
for (int q = 0; q < count; q++) {
CategoryToPieDataset currPieDataset = new CategoryToPieDataset(categoryDataset, order, q);
java.util.List keys = currPieDataset.getKeys();
index = -1;
for (int j = 0; j < keys.size(); j++) {
index++;
boolean conditionValue = generator.getConditionValue(sector, q, currPieDataset, currPieDataset.getKey(j));
if (!conditionValue)
continue;
if (sectorPulled != null && sectorPulled > 0) {
plot.setExplodePercent(index, (double) sectorPulled);
}
StyleObjectModel cssSectorModel = sector.getStyleObjectModel();
if (cssSectorModel != null && cssSectorModel.getBorder() != null) {
StyleBorderModel border = cssSectorModel.getBorder();
Color borderColor = border.getColor();
if (borderColor != null) {
plot.setSectionOutlinePaint(index, borderColor);
plot.setSectionOutlineStroke(index, PropertiesConverter.toStroke(border));
}
Color sectorModelColor = cssSectorModel.getColor();
if (sectorModelColor != null) {
plot.setSectionPaint(index, sectorModelColor);
}
}
}
}
} else {
if (dataset == null || dataset.getKeys() == null)
continue;
for (int j = 0; j < dataset.getKeys().size(); j++) {
index++;
boolean conditionValue = generator.getConditionValue(sector, 0, dataset, dataset.getKey(j));
if (!conditionValue)
continue;
if (sectorPulled != null && sectorPulled > 0) {
plot.setExplodePercent(index, (double) sectorPulled);
}
StyleObjectModel cssSectorModel = sector.getStyleObjectModel();
if (cssSectorModel != null && cssSectorModel.getBorder() != null) {
StyleBorderModel border = cssSectorModel.getBorder();
if (border.getColor() != null) {
plot.setSectionOutlinePaint(index, border.getColor());
plot.setSectionOutlineStroke(index, PropertiesConverter.toStroke(border));
}
}
if (cssSectorModel != null && cssSectorModel.getColor() != null) {
plot.setSectionPaint(index, cssSectorModel.getColor());
}
}
}
}
}
private int getIterationCount(CategoryToPieDataset cds) {
if (order == TableOrder.BY_ROW) {
return cds.getUnderlyingDataset().getRowCount();
}
if (order == TableOrder.BY_COLUMN) {
return cds.getUnderlyingDataset().getColumnCount();
}
return 0;
}
private void init(PiePlot plot, Chart chart, PieChartView chartView, PieDataset dataset, CategoryDataset categoryDataset) {
addConfigurator(new PlotColorsConfigurator());
addConfigurator(new ShadowConfigurator());
setupLegendLabels(plot, chart, chartView);
setupPieLabelGenerator(plot, chartView);
setupLegendLabels(plot, chart, chartView);
setupTooltipsAndUrls(plot, chartView);
sectorProcessing(plot, chartView, dataset, categoryDataset);
addConfigurator(new PlotSelectionConfigurator());
addConfigurator(new ItemsColorConfigurator());
addConfigurator(new OutlineConfigurator());
configure(chartView);
}
public void addConfigurator(PlotConfigurator configurator) {
configurationDelegate.addConfigurator(configurator);
}
public Collection<PlotConfigurator> getConfigurators() {
return configurationDelegate.getConfigurators();
}
public void configure(ChartView chartView) {
configurationDelegate.configure(this, chartView);
}
}