package it.eng.spagobi.engines.chart.bo.charttypes.barcharts;
import it.eng.spago.base.SourceBean;
import it.eng.spago.base.SourceBeanAttribute;
import it.eng.spagobi.commons.constants.SpagoBIConstants;
import it.eng.spagobi.engines.chart.bo.charttypes.utils.MyCategoryToolTipGenerator;
import it.eng.spagobi.engines.chart.bo.charttypes.utils.MyCategoryUrlGenerator;
import it.eng.spagobi.engines.chart.bo.charttypes.utils.MyStandardCategoryItemLabelGenerator;
import it.eng.spagobi.engines.chart.utils.DataSetAccessFunctions;
import it.eng.spagobi.engines.chart.utils.DatasetMap;
import java.awt.Color;
import java.awt.Font;
import java.text.NumberFormat;
import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Vector;
import org.apache.log4j.Logger;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.axis.CategoryAxis;
import org.jfree.chart.axis.CategoryLabelPositions;
import org.jfree.chart.axis.NumberAxis;
import org.jfree.chart.labels.ItemLabelAnchor;
import org.jfree.chart.labels.ItemLabelPosition;
import org.jfree.chart.plot.CategoryPlot;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.chart.renderer.category.BarRenderer;
import org.jfree.chart.renderer.category.CategoryItemRenderer;
import org.jfree.chart.renderer.category.LineAndShapeRenderer;
import org.jfree.chart.renderer.category.StackedBarRenderer;
import org.jfree.chart.title.TextTitle;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.TextAnchor;
public class OverlaidStackedBarLine extends LinkableBar {
HashMap seriesDraw=null;
HashMap seriesCaptions=null;
boolean additionalLabels=false;
HashMap catSerLabels=null;
boolean useBars=false;
boolean useLines=false;
boolean secondAxis=false;
String secondAxisLabel=null;
boolean freeToolTips=false; //automatically set
// maps the element with the tooltip information. tip_element or freetip_element
HashMap<String, String> seriesTooltip=null;
HashMap<String, String> categoriesTooltip=null;
private static transient Logger logger=Logger.getLogger(OverlaidStackedBarLine.class);
public DatasetMap calculateValue() throws Exception {
seriesNames=new Vector();
seriesCaptions=new LinkedHashMap();
categoriesTooltip=new HashMap<String, String>();
seriesTooltip=new HashMap<String, String>();
// I must identify different series
String res=DataSetAccessFunctions.getDataSetResultFromId(profile, getData(),parametersObject);
categories=new LinkedHashMap();
//DefaultCategoryDataset dataset = new DefaultCategoryDataset();
DatasetMap datasetMap=new DatasetMap();
SourceBean sbRows=SourceBean.fromXMLString(res);
List listAtts=sbRows.getAttributeAsList("ROW");
// run all categories (one for each row)
categoriesNumber=0;
// new versione: two datasets one for bar and one for lines
datasetMap.getDatasets().put("stackedbar", new DefaultCategoryDataset());
datasetMap.getDatasets().put("line", new DefaultCategoryDataset());
boolean first=true;
//categories.put(new Integer(0), "All Categories");
for (Iterator iterator = listAtts.iterator(); iterator.hasNext();) {
SourceBean category = (SourceBean) iterator.next();
List atts=category.getContainedAttributes();
//HashMap series=new HashMap();
HashMap series=new LinkedHashMap();
HashMap additionalValues=new LinkedHashMap();
String catValue="";
String nameP="";
String value="";
if(first){
if (name.indexOf("$F{") >= 0){
setTitleParameter(atts);
}
if (getSubName()!= null && getSubName().indexOf("$F") >= 0){
setSubTitleParameter(atts);
}
first=false;
}
//run all the attributes, to define series!
int contSer = 0;
for (Iterator iterator2 = atts.iterator(); iterator2.hasNext();) {
SourceBeanAttribute object = (SourceBeanAttribute) iterator2.next();
nameP=new String(object.getKey());
value=new String((String)object.getValue());
if(nameP.equalsIgnoreCase("x"))
{
catValue=value;
categoriesNumber=categoriesNumber+1;
categories.put(new Integer(categoriesNumber),value);
}
else {
if(nameP.startsWith("add_") || nameP.startsWith("ADD_")){
if(additionalLabels){
String ind=nameP.substring(4);
additionalValues.put(ind, value);
}
}
// must be after x definition
else if(nameP.toUpperCase().startsWith("TIP_X")){ // additional information
if(enableToolTips){
categoriesTooltip.put(nameP+"_"+catValue, value);
}
}
else if(nameP.toUpperCase().startsWith("TIP_")){ // additional information
if(enableToolTips){
seriesTooltip.put(nameP, value);
}
}
else if(nameP.toUpperCase().startsWith("FREETIP_X")){ // additional information
if(enableToolTips){
freeToolTips=true; //help the search later in MyCategoryToolTipGenerator
categoriesTooltip.put(nameP+"_"+catValue, value);
}
}
else{
if(seriesLabelsMap!=null){
if((this.getNumberSerVisualization() > 0 && contSer < this.getNumberSerVisualization()) && seriesDraw.get(nameP)!= null &&
((String)seriesDraw.get(nameP)).equalsIgnoreCase("StackedBar")){
String serieLabel = (String)seriesLabelsMap.get(nameP);
series.put(serieLabel, value);
seriesCaptions.put(serieLabel, nameP);
contSer++;
}
else if(this.getNumberSerVisualization() == 0
||
( seriesDraw.get(nameP)!= null &&
((String)seriesDraw.get(nameP)).equalsIgnoreCase("line"))
)
{ //all series
String serieLabel = (String)seriesLabelsMap.get(nameP);
series.put(serieLabel, value);
seriesCaptions.put(serieLabel, nameP);
}
}
else if(this.getNumberSerVisualization() > 0 && contSer < this.getNumberSerVisualization() &&
((String)seriesDraw.get(nameP)).equalsIgnoreCase("StackedBar")){
series.put(nameP, value);
contSer++;
}
else if(this.getNumberSerVisualization() == 0 || ((String)seriesDraw.get(nameP)).equalsIgnoreCase("line")){ //all series
series.put(nameP, value);
}
}
// for now I make like if addition value is checked he seek for an attribute with name with value+name_serie
}
}
// for each serie
for (Iterator iterator3 = series.keySet().iterator(); iterator3.hasNext();) {
String nameS = (String) iterator3.next();
String labelS = "";
String valueS=(String)series.get(nameS);
Double valueD=null;
try{
valueD=Double.valueOf(valueS);
}
catch (Exception e) {
logger.warn("error in double conversion, put default to null");
valueD=null;
}
if(!hiddenSeries.contains(nameS)){
if(seriesLabelsMap != null && (seriesCaptions != null && seriesCaptions.size()>0)){
nameS = (String)(seriesCaptions.get(nameS));
labelS = (String)seriesLabelsMap.get(nameS);
}
else
labelS = nameS;
// if to draw as a line
if(seriesDraw.get(nameS)!=null && ((String)seriesDraw.get(nameS.toUpperCase())).equalsIgnoreCase("line")){
if(!seriesNames.contains(nameS.toUpperCase()))seriesNames.add(nameS.toUpperCase());
((DefaultCategoryDataset)(datasetMap.getDatasets().get("line"))).addValue(valueD!=null ? valueD.doubleValue() : null, labelS, catValue);
}
else{ // if to draw as a bar
if(!seriesNames.contains(nameS.toUpperCase()))seriesNames.add(nameS.toUpperCase());
((DefaultCategoryDataset)(datasetMap.getDatasets().get("stackedbar"))).addValue(valueD!=null ? valueD.doubleValue() : null, labelS, catValue);
}
// if there is an additional label are
if(additionalValues.get(nameS)!=null){
String val=(String)additionalValues.get(nameS);
String index=catValue+"-"+nameS;
catSerLabels.put(index, val);
}
}
}
}
return datasetMap;
}
public void configureChart(SourceBean content) {
super.configureChart(content);
if(confParameters.get("add_labels")!=null){
String additional=(String)confParameters.get("add_labels");
if(additional.equalsIgnoreCase("true")){
additionalLabels=true;
catSerLabels=new LinkedHashMap();
}
else additionalLabels=false;
}
else
{
additionalLabels=false;
}
//reading series colors if present
SourceBean draws = (SourceBean)content.getAttribute("SERIES_DRAW");
if(draws == null) {
draws = (SourceBean)content.getAttribute("CONF.SERIES_DRAW");
}
seriesDraw=new LinkedHashMap();
if(draws!=null){
List atts=draws.getContainedAttributes();
String serieName="";
String serieDraw="";
for (Iterator iterator = atts.iterator(); iterator.hasNext();) {
SourceBeanAttribute object = (SourceBeanAttribute) iterator.next();
serieName=new String(object.getKey());
serieDraw=new String((String)object.getValue());
if(serieDraw.equalsIgnoreCase("line")){
seriesDraw.put(serieName.toUpperCase(), "line");
useLines=true;
}
else{
seriesDraw.put(serieName.toUpperCase(), "stackedbar");
useBars=true;
}
}
}
else{
useBars=true;
}
if(confParameters.get("second_axis_label")!=null){
secondAxis=true;
secondAxisLabel=(String)confParameters.get("second_axis_label");
}
}
public JFreeChart createChart(DatasetMap datasets) {
// create the first renderer...
CategoryPlot plot = new CategoryPlot();
NumberFormat nf = NumberFormat.getNumberInstance(locale);
NumberAxis rangeAxis = new NumberAxis(getValueLabel());
rangeAxis.setLabelFont(new Font(styleXaxesLabels.getFontName(), Font.PLAIN, styleXaxesLabels.getSize()));
rangeAxis.setLabelPaint(styleXaxesLabels.getColor());
rangeAxis.setTickLabelFont(new Font(styleXaxesLabels.getFontName(), Font.PLAIN, styleXaxesLabels.getSize()));
rangeAxis.setTickLabelPaint(styleXaxesLabels.getColor());
rangeAxis.setNumberFormatOverride(nf);
plot.setRangeAxis(rangeAxis);
if(rangeIntegerValues==true){
rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
}
CategoryAxis domainAxis = new CategoryAxis(getCategoryLabel());
domainAxis.setLabelFont(new Font(styleYaxesLabels.getFontName(), Font.PLAIN, styleYaxesLabels.getSize()));
domainAxis.setLabelPaint(styleYaxesLabels.getColor());
domainAxis.setTickLabelFont(new Font(styleYaxesLabels.getFontName(), Font.PLAIN, styleYaxesLabels.getSize()));
domainAxis.setTickLabelPaint(styleYaxesLabels.getColor());
plot.setDomainAxis(domainAxis);
plot.setOrientation(PlotOrientation.VERTICAL);
plot.setRangeGridlinesVisible(true);
plot.setDomainGridlinesVisible(true);
DefaultCategoryDataset datasetBar=(DefaultCategoryDataset)datasets.getDatasets().get("stackedbar");
//I create one bar renderer and one line
MyStandardCategoryItemLabelGenerator generator=null;
if(additionalLabels){
generator = new MyStandardCategoryItemLabelGenerator(catSerLabels,"{1}", NumberFormat.getInstance());}
if(useBars){
CategoryItemRenderer barRenderer = new StackedBarRenderer();
if(maxBarWidth!=null){
((BarRenderer)barRenderer).setMaximumBarWidth(maxBarWidth.doubleValue());
}
if(additionalLabels){
barRenderer.setBaseItemLabelGenerator(generator);
double orient=(-Math.PI / 2.0);
if(styleValueLabels.getOrientation().equalsIgnoreCase("horizontal")){
orient=0.0;
}
barRenderer.setBaseItemLabelFont(new Font(styleValueLabels.getFontName(), Font.PLAIN, styleValueLabels.getSize()));
barRenderer.setBaseItemLabelPaint(styleValueLabels.getColor());
barRenderer.setBaseItemLabelsVisible(true);
barRenderer.setBasePositiveItemLabelPosition(new ItemLabelPosition(
ItemLabelAnchor.CENTER, TextAnchor.CENTER, TextAnchor.CENTER,
orient));
barRenderer.setBaseNegativeItemLabelPosition(new ItemLabelPosition(
ItemLabelAnchor.CENTER, TextAnchor.CENTER, TextAnchor.CENTER,
orient));
}
if(colorMap!=null){
for (Iterator iterator = datasetBar.getRowKeys().iterator(); iterator.hasNext();) {
String serName = (String) iterator.next();
String labelName = "";
int index=-1;
if (seriesCaptions != null && seriesCaptions.size()>0){
labelName = serName;
serName = (String)seriesCaptions.get(serName);
index=datasetBar.getRowIndex(labelName);
}
else
index=datasetBar.getRowIndex(serName);
Color color=(Color)colorMap.get(serName);
if(color!=null){
barRenderer.setSeriesPaint(index, color);
}
}
}
// add tooltip if enabled
if(enableToolTips){
MyCategoryToolTipGenerator generatorToolTip=new MyCategoryToolTipGenerator(freeToolTips, seriesTooltip, categoriesTooltip, seriesCaptions);
barRenderer.setToolTipGenerator(generatorToolTip);
}
//defines url for drill
boolean document_composition=false;
if(mode.equalsIgnoreCase(SpagoBIConstants.DOCUMENT_COMPOSITION))document_composition=true;
logger.debug("Calling Url Generation");
MyCategoryUrlGenerator mycatUrl=null;
if(super.rootUrl!=null){
logger.debug("Set MycatUrl");
mycatUrl=new MyCategoryUrlGenerator(super.rootUrl);
mycatUrl.setDocument_composition(document_composition);
mycatUrl.setCategoryUrlLabel(super.categoryUrlName);
mycatUrl.setSerieUrlLabel(super.serieUrlname);
mycatUrl.setDrillDocTitle(drillDocTitle);
mycatUrl.setTarget(target);
}
if(mycatUrl!=null){
barRenderer.setItemURLGenerator(mycatUrl);
}
plot.setDataset(1,datasetBar);
plot.setRenderer(1,barRenderer);
}
if(useLines){
LineAndShapeRenderer lineRenderer = new LineAndShapeRenderer();
//lineRenderer.setShapesFilled(false);
lineRenderer.setShapesFilled(true);
if(additionalLabels){lineRenderer.setBaseItemLabelGenerator(generator);
lineRenderer.setBaseItemLabelFont(new Font(defaultLabelsStyle.getFontName(), Font.PLAIN, defaultLabelsStyle.getSize()));
lineRenderer.setBaseItemLabelPaint(defaultLabelsStyle.getColor());
lineRenderer.setBaseItemLabelsVisible(true);
}
DefaultCategoryDataset datasetLine=(DefaultCategoryDataset)datasets.getDatasets().get("line");
if(enableToolTips){
MyCategoryToolTipGenerator generatorToolTip=new MyCategoryToolTipGenerator(freeToolTips, seriesTooltip, categoriesTooltip, seriesCaptions);
lineRenderer.setToolTipGenerator(generatorToolTip);
}
if(colorMap!=null){
for (Iterator iterator = datasetLine.getRowKeys().iterator(); iterator.hasNext();) {
String serName = (String) iterator.next();
String labelName = "";
int index=-1;
if (seriesCaptions != null && seriesCaptions.size()>0){
labelName = serName;
serName = (String)seriesCaptions.get(serName);
index=datasetLine.getRowIndex(labelName);
}
else
index=datasetLine.getRowIndex(serName);
Color color=(Color)colorMap.get(serName);
if(color!=null){
lineRenderer.setSeriesPaint(index, color);
}
}
}
plot.setDataset(0,datasetLine);
plot.setRenderer(0,lineRenderer);
}
if(secondAxis){
NumberAxis na=new NumberAxis(secondAxisLabel);
na.setLabelFont(new Font(styleXaxesLabels.getFontName(), Font.PLAIN, styleXaxesLabels.getSize()));
na.setLabelPaint(styleXaxesLabels.getColor());
na.setTickLabelFont(new Font(styleXaxesLabels.getFontName(), Font.PLAIN, styleXaxesLabels.getSize()));
na.setTickLabelPaint(styleXaxesLabels.getColor());
na.setUpperMargin(0.10);
if(rangeIntegerValues==true){
na.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
}
na.setNumberFormatOverride(nf);
plot.setRangeAxis(1,na);
plot.mapDatasetToRangeAxis(0, 1);
}
//plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
plot.getDomainAxis().setCategoryLabelPositions(
CategoryLabelPositions.UP_45);
JFreeChart chart = new JFreeChart(plot);
TextTitle title =setStyleTitle(name, styleTitle);
chart.setTitle(title);
if(subName!= null && !subName.equals("")){
TextTitle subTitle =setStyleTitle(subName, styleSubTitle);
chart.addSubtitle(subTitle);
}
chart.setBackgroundPaint(Color.white);
if(legend==true) drawLegend(chart);
return chart;
}
}