// ============================================================================
//
// 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.preview;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.data.DataUtilities;
import org.jfree.data.category.CategoryDataset;
/**
* DOC Administrator class global comment. Detailled comment
*/
public class DQRuleItemLabelGenerator extends StandardCategoryItemLabelGenerator {
private static final long serialVersionUID = 1L;
public DQRuleItemLabelGenerator(String labelFormat, NumberFormat formatter) {
super(labelFormat, formatter);
}
/**
* DOC Administrator DQRuleItemLabelGenerator constructor comment.
*
* @param labelFormat
* @param formatter
*/
public DQRuleItemLabelGenerator(String labelFormat, DateFormat formatter) {
super(labelFormat, formatter);
}
@Override
protected Object[] createItemArray(CategoryDataset dataset, int row, int column) {
Object[] result = new Object[4];
result[0] = dataset.getRowKey(row).toString();
result[1] = dataset.getColumnKey(column).toString();
Number value = dataset.getValue(row, column);
if (value != null && !value.equals(Double.NaN)) {
if (super.getNumberFormat() != null) {
result[2] = super.getNumberFormat().format(value);
} else if (super.getDateFormat() != null) {
result[2] = super.getDateFormat().format(value);
}
double total = DataUtilities.calculateColumnTotal(dataset, column);
double percent = value.doubleValue() / total;
// MOD qiongli bug 21589,override for just changeing this line.avoid 99.99% to show 100%
// result[3] = this.percentFormat.format(percent);
result[3] = stringformat(percent, 0).toString();
} else {
result[2] = "-"; //$NON-NLS-1$
result[3] = "-"; //$NON-NLS-1$
}
return result;
}
/**
* DOC yyin Comment method "stringformat".
*
* @param percent
* @param i
* @return
*/
private Object stringformat(Object percent, int i) {
// ADD msjian TDQ-10793: when there is no data, the percent value is NaN
if (Double.isNaN((double) percent)) {
return String.valueOf(Double.NaN);
}
// TDQ-10793~
BigDecimal zero = new BigDecimal(0);
BigDecimal temp = new BigDecimal(percent.toString());
BigDecimal min = new BigDecimal(10E-5);
BigDecimal max = new BigDecimal(9999 * 10E-5);
boolean isUseScientific = false;
if (temp.compareTo(min) == -1 && temp.compareTo(zero) == 1) {
isUseScientific = true;
} else if (temp.compareTo(max) == 1 && temp.compareTo(new BigDecimal(1)) == -1) {
percent = max.toString();
}
DecimalFormat format = (DecimalFormat) DecimalFormat.getPercentInstance(Locale.ENGLISH);
format.applyPattern("0.00%"); //$NON-NLS-1$
if (isUseScientific) {
format.applyPattern("0.###E0%"); //$NON-NLS-1$
}
return format.format(new Double(percent.toString()));
}
}