package it.eng.spagobi.engines.chart.bo.charttypes.targetcharts;
import it.eng.spago.base.SourceBean;
import it.eng.spagobi.engines.chart.bo.charttypes.utils.MyBarRendererThresholdPaint;
import it.eng.spagobi.engines.chart.utils.DatasetMap;
import java.awt.BasicStroke;
import java.awt.Font;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Iterator;
import java.util.Vector;
import org.apache.log4j.Logger;
import org.jfree.chart.ChartFactory;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.LegendItemCollection;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.labels.StandardCategoryItemLabelGenerator;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.Range;
import org.jfree.data.category.CategoryDataset;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.data.time.Month;
import org.jfree.data.time.TimeSeriesDataItem;
import org.jfree.ui.RectangleInsets;
public class WinLose extends TargetCharts{
private static transient Logger logger=Logger.getLogger(WinLose.class);
// all the targets
Vector<Double> targets=null;
Vector<Double> baselines=null;
Vector<String> nullValues=null;
double barHeight=0.5;
/** sets the height of bars */
public static final String BAR_HEIGHT = "bar_height";
@Override
public DatasetMap calculateValue() throws Exception {
logger.debug("IN");
DatasetMap datasets = super.calculateValue();
if(datasets==null || yearsDefined==null){
logger.error("Error in TrargetCharts calculate value");
return null;
}
DefaultCategoryDataset dataset = new DefaultCategoryDataset();
datasets.addDataset("1",dataset);
if(datasets!=null && yearsDefined.isEmpty()){
logger.warn("no rows found with dataset");
}
else{
// Check if defining target and baseline
Double mainTarget=null;
Double mainBaseline=null;
if(mainThreshold==null){
logger.error("No main target or baseline defined, not possible to draw the chart");
}
else{
if(useTargets)mainTarget=mainThreshold;
else mainBaseline=mainThreshold;
nullValues=new Vector<String>();
// run all the years defined
for (Iterator iterator = yearsDefined.iterator(); iterator.hasNext();) {
String currentYearS = (String) iterator.next();
int currentYear=Integer.valueOf(currentYearS).intValue();
boolean stop=false;
for(int i = 1; i < 13 && stop==false; i++) {
Month currentMonth=new Month(i,currentYear);
// if it is the first year and th ecurrent month is previous than the first month
if(currentYearS.equalsIgnoreCase(yearsDefined.first()) && i<firstMonth.getMonth()){
// continue
}
else{
TimeSeriesDataItem item = timeSeries.getDataItem(currentMonth);
if(item != null && item.getValue() != null) {
double v = item.getValue().doubleValue();
double result = 0;
if(mainTarget != null) {
result = (v >= mainTarget.doubleValue())?WIN:LOSE;
} else if(mainBaseline != null) {
result = (v > mainBaseline.doubleValue())?LOSE:WIN;
}
else{
logger.warn("could not find a threshold");
}
dataset.addValue(result, timeSeries.getKey(), "" + i+"-"+currentYear);
} else {
if(wlt_mode.doubleValue() == 5){
dataset.addValue(0.001, timeSeries.getKey(), "" + i+"-"+currentYear);
nullValues.add("" + i+"-"+currentYear);
}
else{
dataset.addValue(0.0, timeSeries.getKey(), "" + i+"-"+currentYear);
}
}
// if it is last year and current month is after the last month stop
if(currentYearS.equalsIgnoreCase(lastYear) && i>=lastMonth.getMonth()){
stop=true;
}
}
}
}
}
}
logger.debug("OUT");
return datasets;
}
@Override
public void configureChart(SourceBean content) {
logger.debug("IN");
super.configureChart(content);
if(confParameters.get(BAR_HEIGHT)!=null){
String bh=(String)confParameters.get(BAR_HEIGHT);
barHeight=Double.valueOf(bh).doubleValue();
WIN=barHeight;
LOSE=-barHeight;
}
else
{
barHeight=0.5;
}
logger.debug("OUT");
}
@Override
public JFreeChart createChart(DatasetMap datasets) {
logger.debug("IN");
DefaultCategoryDataset dataset=(DefaultCategoryDataset)datasets.getDatasets().get("1");
JFreeChart chart = ChartFactory.createBarChart(
name,
null,
null,
dataset,
PlotOrientation.VERTICAL,
legend,
false,
false);
chart.setBorderVisible(false);
chart.setBackgroundPaint(color);
TextTitle title =setStyleTitle(name, styleTitle);
chart.setTitle(title);
if(subName!= null && !subName.equals("")){
TextTitle subTitle =setStyleTitle(subName, styleSubTitle);
chart.addSubtitle(subTitle);
}
CategoryPlot plot = chart.getCategoryPlot();
plot.setOutlineVisible(false);
plot.setInsets(new RectangleInsets(0.0, 0.0, 0.0, 0.0));
plot.setBackgroundPaint(color);
plot.setDomainGridlinesVisible(false);
plot.setRangeGridlinesVisible(false);
plot.setRangeCrosshairVisible(true);
plot.setRangeCrosshairStroke(new BasicStroke(1f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL));
plot.setRangeCrosshairPaint(color.BLACK);
// customize axes
CategoryAxis domainAxis = plot.getDomainAxis();
domainAxis.setVisible(false);
domainAxis.setCategoryMargin(0.2);
NumberAxis rangeAxis = (NumberAxis) plot.getRangeAxis();
rangeAxis.setVisible(false);
rangeAxis.setRange(new Range(-(barHeight+0.2 ), (barHeight+0.2)));
// customize renderer
MyBarRendererThresholdPaint renderer=new MyBarRendererThresholdPaint(useTargets, thresholds, dataset, timeSeries, nullValues,bottomThreshold, color );
if(wlt_mode.doubleValue() == 0) {
renderer.setBaseItemLabelsVisible(Boolean.FALSE, true);
} else {
renderer.setBaseItemLabelsVisible(Boolean.TRUE, true);
renderer.setBaseItemLabelFont(new Font(styleValueLabels.getFontName(), Font.PLAIN, styleValueLabels.getSize()));
renderer.setBaseItemLabelPaint(styleValueLabels.getColor());
renderer.setBaseItemLabelGenerator(new StandardCategoryItemLabelGenerator("{2}", new DecimalFormat("0.#")) {
public String generateLabel(CategoryDataset dataset, int row, int column) {
if(dataset.getValue(row, column) == null || dataset.getValue(row, column).doubleValue() == 0) return "";
String columnKey=(String)dataset.getColumnKey(column);
int separator=columnKey.indexOf('-');
String month=columnKey.substring(0,separator);
String year=columnKey.substring(separator+1);
int monthNum = Integer.parseInt(month);
if(wlt_mode.doubleValue() >= 1 && wlt_mode.doubleValue() <= 4) {
if(wlt_mode.doubleValue() == 2 && column%2 == 0) return "";
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.MONTH, monthNum-1);
SimpleDateFormat dataFormat = new SimpleDateFormat("MMM");
return dataFormat.format( calendar.getTime() );
} else return "" + monthNum;
}
});
}
if(wlt_mode.doubleValue() == 3) {
renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, org.jfree.ui.TextAnchor.BOTTOM_CENTER,org.jfree.ui.TextAnchor.BOTTOM_RIGHT, Math.PI/2));
renderer.setBaseNegativeItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE6, org.jfree.ui.TextAnchor.TOP_CENTER, org.jfree.ui.TextAnchor.HALF_ASCENT_LEFT, Math.PI/2));
} else if (wlt_mode.doubleValue() == 4 || wlt_mode.doubleValue() == 5) {
renderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, org.jfree.ui.TextAnchor.BOTTOM_CENTER,org.jfree.ui.TextAnchor.BOTTOM_RIGHT, Math.PI/4));
renderer.setBaseNegativeItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE6, org.jfree.ui.TextAnchor.TOP_CENTER, org.jfree.ui.TextAnchor.HALF_ASCENT_LEFT, Math.PI/4));
}
if(legend==true){
LegendItemCollection collection=createThresholdLegend(plot);
plot.setFixedLegendItems(collection);
}
if(maxBarWidth!=null){
renderer.setMaximumBarWidth(maxBarWidth);
}
//renderer.setSeriesPaint(0, Color.BLUE);
plot.setRenderer(renderer);
logger.debug("OUT");
if(mainThreshold==null)return null;
return chart;
}
}