// ============================================================================
//
// Copyright (C) 2006-2016 Talend Inc. - www.talend.com
//
// This source code is available under agreement available at
// %InstallDIR%\features\org.talend.rcp.branding.%PRODUCTNAME%\%PRODUCTNAME%license.txt
//
// You should have received a copy of the agreement
// along with this program; if not, write to Talend SA
// 9 rue Pages 92150 Suresnes, France
//
// ============================================================================
package org.talend.dataprofiler.chart.util;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.apache.log4j.Logger;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.StandardChartTheme;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.axis.NumberTickUnit;
import org.jfree.chart.axis.ValueAxis;
import org.jfree.chart.entity.EntityCollection;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.labels.StandardXYItemLabelGenerator;
import org.jfree.chart.labels.StandardXYZToolTipGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.CrosshairState;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.plot.PlotRenderingInfo;
import org.jfree.chart.plot.XYPlot;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.BoxAndWhiskerRenderer;
import org.jfree.chart.renderer.category.StackedBarRenderer;
import org.jfree.chart.renderer.xy.XYBarRenderer;
import org.jfree.chart.renderer.xy.XYBubbleRenderer;
import org.jfree.chart.renderer.xy.XYItemRenderer;
import org.jfree.chart.renderer.xy.XYItemRendererState;
import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer;
import org.jfree.chart.title.LegendTitle;
import org.jfree.chart.title.TextTitle;
import org.jfree.chart.urls.StandardXYZURLGenerator;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.gantt.TaskSeriesCollection;
import org.jfree.data.general.PieDataset;
import org.jfree.data.statistics.BoxAndWhiskerCategoryDataset;
import org.jfree.data.statistics.HistogramDataset;
import org.jfree.data.xy.DefaultXYZDataset;
import org.jfree.data.xy.XYDataset;
import org.jfree.data.xy.XYZDataset;
import org.jfree.ui.RectangleEdge;
import org.jfree.ui.TextAnchor;
import org.talend.dataprofiler.chart.ChartDecorator;
import org.talend.dataprofiler.chart.TalendBarRenderer;
import org.talend.dataprofiler.chart.i18n.Messages;
import org.talend.dataprofiler.chart.preview.DQRuleItemLabelGenerator;
import org.talend.dataprofiler.service.utils.ValueAggregator;
/**
* @author scorreia
*
* Chart factory adapted for TOP.
*/
public final class TopChartFactory {
private static final int BASE_ITEM_LABEL_SIZE = 12;
private static final int BASE_LABEL_SIZE = 12;
private static final int BASE_TICK_LABEL_SIZE = 10;
private static final int BASE_LEGEND_LABEL_SIZE = 10;
private static final int BASE_TITLE_LABEL_SIZE = 14;
public static final String NULL_FIELD = "<null>"; //$NON-NLS-1$
public static final String NULL_FIELD2 = "Null field"; //$NON-NLS-1$
public static final String EMPTY_FIELD = "Empty field"; //$NON-NLS-1$
public static final Logger log = Logger.getLogger(TopChartFactory.class);
private TopChartFactory() {
}
/**
* Creates a bubble chart with default settings. The chart is composed of an {@link XYPlot}, with a {@link NumberAxis} for the
* domain axis, a {@link NumberAxis} for the range axis, and an {@link XYBubbleRenderer} to draw the data items.
*
* This method is copied from
* {@link org.jfree.chart.ChartFactory#createBubbleChart(String, String, String, XYZDataset, PlotOrientation, boolean, boolean, boolean)}
*
* @param title the chart title (<code>null</code> permitted).
* @param xAxisLabel a label for the X-axis (<code>null</code> permitted).
* @param yAxisLabel a label for the Y-axis (<code>null</code> permitted).
* @param dataset the dataset for the chart (<code>null</code> permitted).
* @param orientation the orientation (horizontal or vertical) (<code>null</code> NOT permitted).
* @param legend a flag specifying whether or not a legend is required.
* @param tooltips configure chart to generate tool tips?
* @param urls configure chart to generate URLs?
*
* @return A bubble chart.
*/
public static JFreeChart createBubbleChart(String title, String xAxisLabel, String yAxisLabel, XYZDataset dataset,
PlotOrientation orientation, boolean legend, boolean tooltips, boolean urls) {
if (orientation == null) {
throw new IllegalArgumentException(Messages.getString("TopChartFactory.argument")); //$NON-NLS-1$
}
NumberAxis xAxis = new NumberAxis(xAxisLabel);
xAxis.setAutoRangeIncludesZero(false);
NumberAxis yAxis = new NumberAxis(yAxisLabel);
yAxis.setAutoRangeIncludesZero(false);
XYPlot plot = new XYPlot(dataset, xAxis, yAxis, null);
XYItemRenderer renderer = new XYBubbleRenderer(XYBubbleRenderer.SCALE_ON_RANGE_AXIS) {
@Override
public void drawItem(Graphics2D g2, XYItemRendererState state, Rectangle2D dataArea, PlotRenderingInfo info,
XYPlot plot, ValueAxis domainAxis, ValueAxis rangeAxis, XYDataset dataset, int series, int item,
CrosshairState crosshairState, int pass) {
// return straight away if the item is not visible
if (!getItemVisible(series, item)) {
return;
}
PlotOrientation orientation = plot.getOrientation();
// get the data point...
double x = dataset.getXValue(series, item);
double y = dataset.getYValue(series, item);
double z = Double.NaN;
if (dataset instanceof XYZDataset) {
XYZDataset xyzData = (XYZDataset) dataset;
z = xyzData.getZValue(series, item);
}
if (!Double.isNaN(z)) {
RectangleEdge domainAxisLocation = plot.getDomainAxisEdge();
RectangleEdge rangeAxisLocation = plot.getRangeAxisEdge();
double transX = domainAxis.valueToJava2D(x, dataArea, domainAxisLocation);
double transY = rangeAxis.valueToJava2D(y, dataArea, rangeAxisLocation);
double transDomain = 0.0;
double transRange = 0.0;
double zero;
// MOD scorreia +2L avoid points: minimal size of circle must be 1
// z = z * transX + 1;
// ADD xqliu 2009-07-06 bug 8035
double zSize = getBubbleSize(z); // calculate the multiple of bubble's default size
z = 0; // use bubble's default size
// ~
switch (getScaleType()) {
case SCALE_ON_DOMAIN_AXIS:
zero = domainAxis.valueToJava2D(0.0, dataArea, domainAxisLocation);
transDomain = domainAxis.valueToJava2D(z, dataArea, domainAxisLocation) - zero;
transRange = transDomain;
break;
case SCALE_ON_RANGE_AXIS:
zero = rangeAxis.valueToJava2D(0.0, dataArea, rangeAxisLocation);
transRange = zero - rangeAxis.valueToJava2D(z, dataArea, rangeAxisLocation);
transDomain = transRange;
break;
default:
double zero1 = domainAxis.valueToJava2D(0.0, dataArea, domainAxisLocation);
double zero2 = rangeAxis.valueToJava2D(0.0, dataArea, rangeAxisLocation);
transDomain = domainAxis.valueToJava2D(z, dataArea, domainAxisLocation) - zero1;
transRange = zero2 - rangeAxis.valueToJava2D(z, dataArea, rangeAxisLocation);
}
transDomain = Math.abs(transDomain);
transRange = Math.abs(transRange);
// MODSCA 2008-11-27 enlarge ellipse by diag% of the total diagonal
double diag = Math.sqrt(dataArea.getHeight() * dataArea.getHeight() + dataArea.getWidth()
* dataArea.getWidth());
transDomain += diag / 100;
transRange += diag / 100;
Ellipse2D circle = null;
// ADD xqliu 2009-07-06 bug 8035
transDomain *= zSize;
transRange *= zSize;
// ~
if (orientation == PlotOrientation.VERTICAL) {
circle = new Ellipse2D.Double(transX - transDomain / 2.0, transY - transRange / 2.0, transDomain,
transRange);
} else if (orientation == PlotOrientation.HORIZONTAL) {
circle = new Ellipse2D.Double(transY - transRange / 2.0, transX - transDomain / 2.0, transRange,
transDomain);
}
g2.setPaint(getItemPaint(series, item));
g2.fill(circle);
g2.setStroke(getItemOutlineStroke(series, item));
g2.setPaint(getItemOutlinePaint(series, item));
g2.draw(circle);
if (isItemLabelVisible(series, item)) {
if (orientation == PlotOrientation.VERTICAL) {
drawItemLabel(g2, orientation, dataset, series, item, transX, transY, false);
} else if (orientation == PlotOrientation.HORIZONTAL) {
drawItemLabel(g2, orientation, dataset, series, item, transY, transX, false);
}
}
// add an entity if this info is being collected
EntityCollection entities = null;
if (info != null) {
entities = info.getOwner().getEntityCollection();
if (entities != null && circle.intersects(dataArea)) {
addEntity(entities, circle, dataset, series, item, circle.getCenterX(), circle.getCenterY());
}
}
int domainAxisIndex = plot.getDomainAxisIndex(domainAxis);
int rangeAxisIndex = plot.getRangeAxisIndex(rangeAxis);
updateCrosshairValues(crosshairState, x, y, domainAxisIndex, rangeAxisIndex, transX, transY, orientation);
}
}
/**
* DOC xqliu : calculate the size of bubble. for bug 8035 2009-07-06.
*
* @param z multiple of bubble's default size
* @return
*/
private double getBubbleSize(double z) {
if (z > 0 && z <= 10) {
return 2;
} else if (z > 10 && z <= 100) {
return 3;
} else if (z > 100) {
return 4;
}
return 1;
}
};
if (tooltips) {
renderer.setBaseToolTipGenerator(new StandardXYZToolTipGenerator());
}
if (urls) {
renderer.setURLGenerator(new StandardXYZURLGenerator());
}
plot.setRenderer(renderer);
plot.setOrientation(orientation);
JFreeChart chart = new JFreeChart(title, JFreeChart.DEFAULT_TITLE_FONT, plot, legend);
return chart;
}
/**
* Method "createBubbleChart".
*
* @param indic the indicator
* @param numericColumn the analyzed numeric column
* @return the bubble chart
*/
public static JFreeChart createBubbleChart(String chartName, Object dataset, Map<String, ValueAggregator> xyzDatasets) {
final Map<String, ValueAggregator> xyzDatasetsFinal = xyzDatasets;
JFreeChart chart = TopChartFactory
.createBubbleChart(
chartName,
Messages.getString("TopChartFactory.average"), Messages.getString("TopChartFactory.count"), (DefaultXYZDataset) dataset, PlotOrientation.HORIZONTAL, //$NON-NLS-1$ //$NON-NLS-2$
true, true, true);
final XYPlot plot = (XYPlot) chart.getPlot();
final XYItemRenderer renderer = plot.getRenderer();
renderer.setBaseToolTipGenerator(new StandardXYZToolTipGenerator() {
private static final long serialVersionUID = 1L;
/*
* (non-Javadoc)
*
* @see org.jfree.chart.labels.StandardXYZToolTipGenerator#createItemArray(org.jfree.data.xy.XYZDataset,
* int, int)
*/
@Override
protected Object[] createItemArray(XYZDataset dset, int series, int item) {
final Comparable<?> seriesKey = dset.getSeriesKey(series);
final String seriesK = String.valueOf(seriesKey);
String label = seriesK;
if (xyzDatasetsFinal != null) {
ValueAggregator valueAggregator = xyzDatasetsFinal.get(seriesKey);
label = valueAggregator.getLabels(seriesK).get(item);
}
final Object[] itemArray = super.createItemArray(dset, series, item);
itemArray[0] = label;// label;
itemArray[1] = "avg=" + itemArray[1]; //$NON-NLS-1$
itemArray[2] = "record count=" + itemArray[2]; //$NON-NLS-1$
itemArray[3] = "null count=" + itemArray[3]; //$NON-NLS-1$
return itemArray;
}
});
return chart;
}
/**
*
* DOC zhaoxinyi Comment method "createGanttChart".
*
* @return
*/
public static JFreeChart createGanttChart(String chartAxies, Object ganttDataset) {
// ADD msjian TDQ-5112 2012-4-10: after upgrate to jfreechart-1.0.12.jar, change the default chart wallPaint
ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());
// TDQ-5112~
JFreeChart chart = ChartFactory.createGanttChart("", // chart title //$NON-NLS-1$
Messages.getString("TopChartFactory.Categories"), // domain axis label //$NON-NLS-1$
chartAxies, // range axis label
(TaskSeriesCollection) ganttDataset, // data
true, // include legend
true, // tooltips
false // urls
);
// ADD TDQ-5251 msjian 2012-7-31: do not display the shadow
CategoryPlot plot = chart.getCategoryPlot();
BarRenderer renderer = (BarRenderer) plot.getRenderer();
renderer.setShadowVisible(false);
// TDQ-5251~
return chart;
}
/**
*
* mzhao create bar chart with default bar render class.
*
* @param titile
* @param dataset
* @param showLegend
* @return
*/
public static JFreeChart createBarChart(String titile, CategoryDataset dataset, boolean showLegend) {
// MOD hcheng for 6965,Use 2D bar charts instead of 3D bar charts
// ADD msjian TDQ-5112 2012-4-10: after upgrate to jfreechart-1.0.12.jar, change the default chart wallPaint
ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());
// TDQ-5112~
JFreeChart chart = ChartFactory.createBarChart(null, titile,
Messages.getString("TopChartFactory.count"), dataset, PlotOrientation.VERTICAL, showLegend, //$NON-NLS-1$
true, false);
ChartDecorator.decorateBarChart(chart, new TalendBarRenderer(true, ChartDecorator.COLOR_LIST));
return chart;
}
/**
* create bar chart.
*
* @param titile
* @param dataset
* @return
*/
public static JFreeChart createBarChart(String title, CategoryDataset dataset) {
return createBarChartByKCD(title, dataset, null);
}
/**
* create bar chart.
*
* @param titile
* @param dataset
* @return
*/
public static JFreeChart createBarChartByKCD(String title, CategoryDataset dataset, Object cusmomerDataset) {
// ADD msjian TDQ-5112 2012-4-10: after upgrate to jfreechart-1.0.12.jar, change the default chart wallPaint
ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());
// TDQ-5112~
JFreeChart createBarChart = ChartFactory.createBarChart(null,
Messages.getString("TopChartFactory.Value"), title, dataset, PlotOrientation.HORIZONTAL, false, false, false); //$NON-NLS-1$
CategoryPlot plot = createBarChart.getCategoryPlot();
if (cusmomerDataset != null) {
plot.setDataset(1, new EncapsulationCumstomerDataset(dataset, cusmomerDataset));
}
CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setTickLabelPaint(NULL_FIELD, Color.RED);
domainAxis.setTickLabelPaint(NULL_FIELD2, Color.RED);
domainAxis.setTickLabelPaint(EMPTY_FIELD, Color.RED);
// ADD TDQ-5251 msjian 2012-7-31: do not display the shadow
BarRenderer renderer = new TalendBarRenderer(false, ChartDecorator.COLOR_LIST);
renderer.setShadowVisible(false);
// TDQ-5251~
plot.setRenderer(renderer);
return createBarChart;
}
/**
*
* DOC zshen Comment method "createMatchRuleBarChart".
*
* @param title
* @param dataset
* @return
*/
public static JFreeChart createMatchRuleBarChart(String categoryAxisLabel, String valueAxisLabel, CategoryDataset dataset) {
ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());
JFreeChart localJFreeChart = ChartFactory.createBarChart(null, categoryAxisLabel, valueAxisLabel, dataset,
PlotOrientation.VERTICAL, false, true, false);
localJFreeChart.addSubtitle(new TextTitle(Messages.getString(
"DataChart.title", sumItemCount(dataset), sumGroupCount(dataset)))); //$NON-NLS-1$
CategoryPlot plot = (CategoryPlot) localJFreeChart.getPlot();
// get real color list from ChartDecorator.COLOR_LIST dataset.getColumnKeys()
List<Color> currentColorList = null;
try {
currentColorList = getCurrentColorList(dataset.getColumnKeys());
} catch (NumberFormatException e) {
log.warn(e, e);
currentColorList = ChartDecorator.COLOR_LIST;
}
BarRenderer barRenderer = new TalendBarRenderer(true, currentColorList);
barRenderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator());
barRenderer.setBaseItemLabelsVisible(true);
// remove the shadow
barRenderer.setShadowVisible(Boolean.FALSE);
plot.setRenderer(barRenderer);
CategoryAxis localCategoryAxis = plot.getDomainAxis();
localCategoryAxis.setCategoryMargin(0.25D);
localCategoryAxis.setUpperMargin(0.02D);
localCategoryAxis.setLowerMargin(0.02D);
NumberAxis localNumberAxis = (NumberAxis) plot.getRangeAxis();
localNumberAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
localNumberAxis.setUpperMargin(0.1D);
return localJFreeChart;
}
/**
* DOC talend Comment method "getCurrentColorList".
*
* @param columnKeys
* @return
*/
private static List<Color> getCurrentColorList(List<?> columnKeys) {
List<Color> colorList = new ArrayList<>();
int colorSize = ChartDecorator.COLOR_LIST.size();
for (Object columnKey : columnKeys) {
int groupSize = Integer.parseInt(columnKey.toString());
colorList.add(ChartDecorator.COLOR_LIST.get(Math.abs((groupSize - 1) % colorSize)));
}
return colorList;
}
public static JFreeChart createBlockingBarChart(String title, HistogramDataset dataset) {
ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());
JFreeChart chart = ChartFactory.createHistogram(null, title, "Key frequency", dataset, PlotOrientation.VERTICAL, false, //$NON-NLS-1$
true, false);
XYPlot plot = chart.getXYPlot();
plot.getRangeAxis().setUpperMargin(0.08);
// plot.getRangeAxis().setLowerBound(-0.08);
decorateCategoryPlot(chart);
plot.setRangeGridlinesVisible(true);
XYBarRenderer renderer = new XYBarRenderer() {
private static final long serialVersionUID = 4168794048090452033L;
@Override
public Paint getItemPaint(int row, int column) {
return ChartDecorator.COLOR_LIST.get(0);
}
};
renderer.setBaseItemLabelsVisible(true);
renderer.setBaseItemLabelGenerator(new StandardXYItemLabelGenerator());
renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));
renderer.setBaseNegativeItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));
renderer.setShadowVisible(Boolean.FALSE);
plot.setRenderer(renderer);
return chart;
}
private static void decorateCategoryPlot(JFreeChart chart) {
XYPlot plot = chart.getXYPlot();
XYItemRenderer render = plot.getRenderer();
ValueAxis domainAxis = plot.getDomainAxis();
ValueAxis valueAxis = plot.getRangeAxis();
Font font = new Font("Tahoma", Font.BOLD, BASE_ITEM_LABEL_SIZE); //$NON-NLS-1$
render.setBaseItemLabelFont(font);
font = new Font("sans-serif", Font.BOLD, BASE_LABEL_SIZE); //$NON-NLS-1$
domainAxis.setLabelFont(font);
font = new Font("sans-serif", Font.BOLD, BASE_LABEL_SIZE); //$NON-NLS-1$
valueAxis.setLabelFont(font);
font = new Font("sans-serif", Font.PLAIN, BASE_TICK_LABEL_SIZE); //$NON-NLS-1$
domainAxis.setTickLabelFont(font);
valueAxis.setTickLabelFont(font);
font = new Font("Tahoma", Font.PLAIN, BASE_LEGEND_LABEL_SIZE); //$NON-NLS-1$
LegendTitle legend = chart.getLegend();
if (legend != null) {
legend.setItemFont(font);
}
font = new Font("sans-serif", Font.BOLD, BASE_TITLE_LABEL_SIZE); //$NON-NLS-1$
TextTitle title = chart.getTitle();
if (title != null) {
title.setFont(font);
}
font = null;
if (render instanceof BarRenderer) {
int rowCount = chart.getCategoryPlot().getDataset().getRowCount();
domainAxis.setUpperMargin(0.1);
// domainAxis.setMaximumCategoryLabelLines(10);
((BarRenderer) render).setItemMargin(-0.40 * rowCount);
}
// set color
int rowCount = chart.getXYPlot().getDataset().getSeriesCount();
for (int i = 0; i < rowCount; i++) {
plot.getRenderer().setSeriesPaint(i, Color.RED);
}
}
private static double sumItemCount(CategoryDataset categorydataset) {
double itemCount = 0;
for (int i = 0; i < categorydataset.getColumnCount(); i++) {
int columnKey = Integer.valueOf(categorydataset.getColumnKey(i).toString());
itemCount += categorydataset.getValue(0, i).intValue() * columnKey;
}
return itemCount;
}
private static double sumGroupCount(CategoryDataset categorydataset) {
double groupCount = 0.0;
for (int i = 0; i < categorydataset.getColumnCount(); i++) {
groupCount += categorydataset.getValue(0, i).doubleValue();
}
return groupCount;
}
/**
* DOC Zqin Comment method "createBoxAndWhiskerChart".
*
* @param title
* @param dataset
* @return
*/
public static JFreeChart createBoxAndWhiskerChart(String title, BoxAndWhiskerCategoryDataset dataset) {
// ADD msjian TDQ-5112 2012-4-10: after upgrate to jfreechart-1.0.12.jar, change the default chart wallPaint
ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());
// TDQ-5112~
JFreeChart chart = ChartFactory.createBoxAndWhiskerChart(null, title,
Messages.getString("TopChartFactory.Value"), dataset, false); //$NON-NLS-1$
CategoryPlot plot = chart.getCategoryPlot();
NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
rangeAxis.setAutoRange(false);
double min = dataset.getMinRegularValue("0", "").doubleValue(); //$NON-NLS-1$ //$NON-NLS-2$
double max = dataset.getMaxRegularValue("0", "").doubleValue(); //$NON-NLS-1$ //$NON-NLS-2$
double unit = (max - min) / 10;
rangeAxis.setRange(min - unit, max + unit);
rangeAxis.setTickUnit(new NumberTickUnit(unit));
BoxAndWhiskerRenderer renderer = (BoxAndWhiskerRenderer) plot.getRenderer();
renderer.setArtifactPaint(ChartDecorator.COLOR_LIST.get(1));
return chart;
}
/**
* DOC Zqin Comment method "createStackedBarChart".
*
* @param titile
* @param dataset
* @param orientation
* @return
*/
public static JFreeChart createStackedBarChart(String titile, CategoryDataset dataset, PlotOrientation orientation) {
return createStackedBarChart(null, null, Messages.getString("TopChartFactory.Value"), dataset, orientation, //$NON-NLS-1$
true, false, false);
}
/**
* DOC xqliu Comment method "createStackedBarChart".
*
* @param title
* @param dataset
* @param showLegend
* @return
*/
public static JFreeChart createStackedBarChart(String title, CategoryDataset dataset, boolean showLegend) {
return createStackedBarChart(null, title, Messages.getString("TopChartFactory.Value"), dataset, //$NON-NLS-1$
PlotOrientation.VERTICAL, showLegend, true, false);
}
/**
* DOC xqliu Comment method "createStackedBarChart".
*
* @param title
* @param dataset
* @param orientation
* @param showLegend
* @return
*/
public static JFreeChart createStackedBarChart(String title, CategoryDataset dataset, PlotOrientation orientation,
boolean showLegend) {
return createStackedBarChart(null, null, title, dataset, orientation, showLegend, false, false);
}
/**
* DOC xqliu Comment method "createStackedBarChart".
*
* @param title
* @param domainAxisLabel
* @param rangeAxisLabel
* @param dataset
* @param orientation
* @param legend
* @param tooltips
* @param urls
* @return
*/
public static JFreeChart createStackedBarChart(String title, String domainAxisLabel, String rangeAxisLabel,
CategoryDataset dataset, PlotOrientation orientation, boolean legend, boolean tooltips, boolean urls) {
// ADD msjian TDQ-5112 2012-4-10: after upgrate to jfreechart-1.0.12.jar, change the default chart wallPaint
ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());
// TDQ-5112~
final JFreeChart chart = ChartFactory.createStackedBarChart(title, domainAxisLabel, rangeAxisLabel, dataset, orientation,
legend, tooltips, urls);
CategoryPlot plot = (CategoryPlot) chart.getPlot();
plot.setRangeGridlinesVisible(true);
StackedBarRenderer sbr = (StackedBarRenderer) plot.getRenderer();
sbr.setBaseItemLabelsVisible(true);
sbr.setRenderAsPercentages(true);
sbr.setBaseItemLabelGenerator(new DQRuleItemLabelGenerator("{3}", NumberFormat.getIntegerInstance())); //$NON-NLS-1$
sbr.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.CENTER));
// ADD xqliu 2010-03-10 feature 10834
// sbr.setBaseToolTipGenerator(new DQRuleToolTipGenerator(ChartDecorator.NEW_TOOL_TIP_FORMAT_STRING,
// NumberFormat
// .getInstance()));
// ~10834
// ADD TDQ-5251 msjian 2012-7-31: do not display the shadow
sbr.setShadowVisible(false);
// TDQ-5251~
NumberAxis axis = (NumberAxis) plot.getRangeAxis();
axis.setNumberFormatOverride(NumberFormat.getPercentInstance());
axis.setUpperMargin(0.05f);
axis.setLowerMargin(0.01f);
return chart;
}
/**
* DOC xqliu Comment method "createLineChart".
*
* @param title
* @param dataset
* @param showLegend
* @return
*/
public static JFreeChart createLineChart(String title, XYDataset dataset, boolean showLegend) {
// ADD msjian TDQ-5112 2012-4-10: after upgrate to jfreechart-1.0.12.jar, change the default chart wallPaint
ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());
// TDQ-5112~
final JFreeChart chart = ChartFactory.createXYLineChart(null, title,
Messages.getString("TopChartFactory.Percent"), dataset, PlotOrientation.VERTICAL, //$NON-NLS-1$
showLegend, false, false);
final XYPlot plot = chart.getXYPlot();
final XYLineAndShapeRenderer renderer = new XYLineAndShapeRenderer();
renderer.setSeriesLinesVisible(0, true);
renderer.setSeriesShapesVisible(0, true);
plot.setRenderer(renderer);
final NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
return chart;
}
/**
*
* DOC qiongli Comment method "createPieChart".
*
* @param title
* @param dataset
* @param showLegend
* @param toolTips,if show the toolTips.
* @param urls
* @return
*/
public static JFreeChart createPieChart(String title, PieDataset dataset, boolean showLegend, boolean toolTips, boolean urls) {
// ADD msjian TDQ-5112 2012-4-10: after upgrate to jfreechart-1.0.12.jar, change the default chart wallPaint
ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());
// TDQ-5112~
return ChartFactory.createPieChart(title, dataset, showLegend, toolTips, urls);
}
public static JFreeChart createDuplicateRecordPieChart(String title, PieDataset dataset, boolean showLegend,
boolean toolTips, boolean urls) {
ChartFactory.setChartTheme(StandardChartTheme.createLegacyTheme());
JFreeChart pieChart = ChartFactory.createPieChart(title, dataset, showLegend, toolTips, urls);
ChartDecorator.decorateDuplicatePieChart(pieChart);
return pieChart;
}
}