Package it.eng.spagobi.engines.chart.bo.charttypes.barcharts

Source Code of it.eng.spagobi.engines.chart.bo.charttypes.barcharts.CombinedCategoryBar

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.FilterZeroStandardCategoryItemLabelGenerator;
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.ArrayList;
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.LegendItem;
import org.jfree.chart.LegendItemCollection;
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.CombinedDomainCategoryPlot;
import org.jfree.chart.plot.DatasetRenderingOrder;
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.title.TextTitle;
import org.jfree.data.category.DefaultCategoryDataset;
import org.jfree.ui.TextAnchor;

public class CombinedCategoryBar extends LinkableBar {


  HashMap seriesDraw=null;
  HashMap seriesScale=null;
  // Maps the serie Label with the reale Serie name
  HashMap seriesCaptions=null;
  boolean additionalLabels=false;
  HashMap catSerLabels=null;
  boolean useLinesRenderers=false; // just one to make code shorter in creation of the chart
  String secondAxisLabel=null;
  Vector lineNoShapeSeries1=null;
  Vector lineNoShapeSeries2=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(CombinedCategoryBar.class);





  public DatasetMap calculateValue() throws Exception {
    logger.debug("IN");

    seriesNames=new Vector();
    seriesCaptions=new LinkedHashMap();

    String res=DataSetAccessFunctions.getDataSetResultFromId(profile, getData(),parametersObject);
    categories=new HashMap();

    DatasetMap datasetMap=new DatasetMap();

    SourceBean sbRows=SourceBean.fromXMLString(res);

    List listAtts=sbRows.getAttributeAsList("ROW"); // One row for each category

    categoriesNumber=0;

    // 4 datasets, 2 for first axis named 1, 2 for second axis named 2
    datasetMap.getDatasets().put("1-bar", new DefaultCategoryDataset());
    datasetMap.getDatasets().put("1-line", new DefaultCategoryDataset());
    datasetMap.getDatasets().put("2-bar", new DefaultCategoryDataset());
    datasetMap.getDatasets().put("2-line", new DefaultCategoryDataset());

    lineNoShapeSeries1=new Vector<String>();
    lineNoShapeSeries2=new Vector<String>();
    categoriesTooltip=new HashMap<String, String>();
    seriesTooltip=new HashMap<String, String>();
    seriesOrder=new ArrayList<String>();

    boolean first=true;
    //categories.put(new Integer(0), "All Categories");

    for (Iterator iterator = listAtts.iterator(); iterator.hasNext();) {     // run all categories (one for each row)
      SourceBean category = (SourceBean) iterator.next();
      List atts=category.getContainedAttributes();              // attributes: x is category name, values as serie_name are others, addition values can be added

      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 numColumn = 0;
      for (Iterator iterator2 = atts.iterator(); iterator2.hasNext();) {
        numColumn ++;
        SourceBeanAttribute object = (SourceBeanAttribute) iterator2.next();
        // In order to have tootltip for category they must be defined after x
        nameP=new String(object.getKey());
        value=new String((String)object.getValue());
        if(nameP.equalsIgnoreCase("x"))                       // category name
        {
          catValue=value;
          categoriesNumber=categoriesNumber+1;
          categories.put(new Integer(categoriesNumber),value);
        }
        else {
          if(nameP.toUpperCase().startsWith("ADD_")){       // additional information
            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.toUpperCase()+"_"+catValue, value);
            }
          }

          else if(nameP.toUpperCase().startsWith("TIP_")){       // additional information
            if(enableToolTips){
              seriesTooltip.put(nameP.toUpperCase(), value);
            }
          }
          else if(nameP.toUpperCase().startsWith("FREETIP_X")){       // additional information
            if(enableToolTips){
              freeToolTips=true; //help the search later in MyCategoryToolTipGenerator
              categoriesTooltip.put(nameP.toUpperCase()+"_"+catValue, value);
            }
          }         
          else{
            if(seriesLabelsMap!=null){                  // a serie
              String serieLabel = (String)seriesLabelsMap.get(nameP);
              series.put(serieLabel, value);
              if(!seriesOrder.contains(serieLabel)){
                seriesOrder.add(serieLabel);
              }
              seriesCaptions.put(serieLabel, nameP);             

            }
            else {
              series.put(nameP, value);
              if(!seriesOrder.contains(nameP)){
                seriesOrder.add(nameP);
              }
            }
          }
          // 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);
            if(labelS==null)labelS=nameS;
          }
          else
            labelS = nameS; 


          // Fill DATASET: Check if has to be filled dataset 1 or dataset 2, to bar or lines
          // LINE CASE
          if(!isHiddenSerie(nameS) && seriesDraw.get(nameS)!=null &&
              (((String)seriesDraw.get(nameS)).equalsIgnoreCase("line") || ((String)seriesDraw.get(nameS)).equalsIgnoreCase("line_no_shapes"))
          )
          {
            if(!seriesNames.contains(nameS))seriesNames.add(nameS);
            // SET THE AXIS
            if(seriesScale != null && seriesScale.get(nameS)!=null && ((String)seriesScale.get(nameS)).equalsIgnoreCase("2")){
              useLinesRenderers=true;
              if(((String)seriesDraw.get(nameS)).equalsIgnoreCase("line_no_shapes") && !lineNoShapeSeries2.contains(nameS)){
                lineNoShapeSeries2.add(nameS);
              }
              ((DefaultCategoryDataset)(datasetMap.getDatasets().get("2-line"))).addValue(valueD!=null ? valueD.doubleValue() : null, labelS, catValue);
            }
            else{
              useLinesRenderers=true;
              if(((String)seriesDraw.get(nameS)).equalsIgnoreCase("line_no_shapes") && !lineNoShapeSeries1.contains(nameS)){
                lineNoShapeSeries1.add(nameS);
              }
              ((DefaultCategoryDataset)(datasetMap.getDatasets().get("1-line"))).addValue(valueD!=null ? valueD.doubleValue() : null, labelS, catValue);
            }

          }
          else if(!isHiddenSerie(nameS)){// BAR CASE
            if(!seriesNames.contains(nameS))seriesNames.add(nameS);
            // if to draw mapped to first axis
            if(seriesScale != null && seriesScale.get(nameS)!=null && ((String)seriesScale.get(nameS)).equalsIgnoreCase("2")){
              if(!seriesNames.contains(nameS))seriesNames.add(nameS);
              ((DefaultCategoryDataset)(datasetMap.getDatasets().get("2-bar"))).addValue(valueD!=null ? valueD.doubleValue() : null, labelS, catValue);
            }
            else{ // if to draw as a bar
              if(!seriesNames.contains(nameS))seriesNames.add(nameS);
              ((DefaultCategoryDataset)(datasetMap.getDatasets().get("1-bar"))).addValue(valueD!=null ? valueD.doubleValue() : null, labelS, catValue);
            }
          }

//          if(!isHiddenSerie(nameS)){
//          if(!seriesNames.contains(nameS))
//          seriesNames.add(nameS);
//          if(seriesScale != null && seriesScale.get(nameS)!=null && ((String)seriesScale.get(nameS)).equalsIgnoreCase("2")){ // 2 axis
//          if(!seriesNames.contains(nameS))seriesNames.add(nameS);
//          ((DefaultCategoryDataset)(datasetMap.getDatasets().get("2"))).addValue(Double.valueOf(valueS).doubleValue(), labelS, catValue);
//          }
//          else{                                                         // 1 axis 
//          if(!seriesNames.contains(nameS))seriesNames.add(nameS);             
//          ((DefaultCategoryDataset)(datasetMap.getDatasets().get("1"))).addValue(Double.valueOf(valueS).doubleValue(), 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);
          }

        }
      }     // close series cycle

    } // Close cycle on SpagoBI Dataset rows

    if (listAtts.size() == 0){
      if (name.indexOf("$F{") >= 0){
        setTitleParameter("");
      }
      if (getSubName()!= null && getSubName().indexOf("$F") >= 0){
        setSubTitleParameter("");
      }
    }
    logger.debug("OUT");

    return datasetMap;


  }






  public void configureChart(SourceBean content) {
    super.configureChart(content);
    logger.debug("IN");


    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;
    }

    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;
    }


    // In template: <SERIES_DRAW serie1='line' serie2='bar< />

    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="";
      // Run all the series specified in template and check if they are bar or line, by default will be bar; if not specified but present will be bar
      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, "line");
        }
        else if(serieDraw.equalsIgnoreCase("line_no_shapes")){
          seriesDraw.put(serieName, "line_no_shapes");
        }
        else{
          seriesDraw.put(serieName, "bar");         
        }

      }   

    }



    if(confParameters.get("second_axis_label")!=null){ 
      secondAxisLabel=(String)confParameters.get("second_axis_label");
    }


    // check wich series has to be mapped to the first axis and wich to the second
    SourceBean scales = (SourceBean)content.getAttribute("SERIES_SCALES");

    if(scales==null){
      scales = (SourceBean)content.getAttribute("CONF.SERIES_SCALES");
    }
    seriesScale=new LinkedHashMap(); // Maps serie Name to scale Number (1 or 2)

    if(scales!=null){

      List attsScales=scales.getContainedAttributes();

      String serieName="";
      Integer serieScale=1;
      for (Iterator iterator = attsScales.iterator(); iterator.hasNext();) {
        SourceBeanAttribute object = (SourceBeanAttribute) iterator.next();
        serieName=new String(object.getKey());
        try{
          String serieScaleS=(String)object.getValue();
          serieScale=Integer.valueOf(serieScaleS);
        }
        catch (Exception e) {
          logger.error("Not correct numebr scale; setting default 1");
          serieScale=Integer.valueOf(1);
        }

        if(serieScale.equals(2)){
          seriesScale.put(serieName, "2");
        }
        else{
          seriesScale.put(serieName, "1");         
        }
      }   
    }

    logger.debug("OUT");
  }




  public JFreeChart createChart(DatasetMap datasets) {
    logger.debug("IN");

    // recover the datasets
    DefaultCategoryDataset datasetBarFirstAxis=(DefaultCategoryDataset)datasets.getDatasets().get("1-bar");
    DefaultCategoryDataset datasetBarSecondAxis=(DefaultCategoryDataset)datasets.getDatasets().get("2-bar");
    DefaultCategoryDataset datasetLineFirstAxis=(DefaultCategoryDataset)datasets.getDatasets().get("1-line");
    DefaultCategoryDataset datasetLineSecondAxis=(DefaultCategoryDataset)datasets.getDatasets().get("2-line");

    // create the two subplots
    CategoryPlot subPlot1 = new CategoryPlot();
    CategoryPlot subPlot2 = new CategoryPlot();
    CombinedDomainCategoryPlot plot = new CombinedDomainCategoryPlot();

    subPlot1.setDataset(0,datasetBarFirstAxis);
    subPlot2.setDataset(0,datasetBarSecondAxis);

    subPlot1.setDataset(1,datasetLineFirstAxis);
    subPlot2.setDataset(1,datasetLineSecondAxis);

    // localize numbers on y axis
        NumberFormat nf = (NumberFormat) NumberFormat.getNumberInstance(locale);

   
    // Range Axis 1
    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.setUpperMargin(0.10);
        rangeAxis.setNumberFormatOverride(nf);
    subPlot1.setRangeAxis(rangeAxis);
    if(rangeIntegerValues==true){
      rangeAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits())
    }

    // Range Axis 2
    NumberAxis rangeAxis2 = new NumberAxis(secondAxisLabel);
    rangeAxis2.setLabelFont(new Font(styleXaxesLabels.getFontName(), Font.PLAIN, styleXaxesLabels.getSize()));
    rangeAxis2.setLabelPaint(styleXaxesLabels.getColor());
    rangeAxis2.setTickLabelFont(new Font(styleXaxesLabels.getFontName(), Font.PLAIN, styleXaxesLabels.getSize()));
    rangeAxis2.setTickLabelPaint(styleXaxesLabels.getColor());
    rangeAxis2.setUpperMargin(0.10);
        rangeAxis2.setNumberFormatOverride(nf);   
    subPlot2.setRangeAxis(rangeAxis2);
    if(rangeIntegerValues==true){
      rangeAxis2.setStandardTickUnits(NumberAxis.createIntegerTickUnits())
    }

    // Category Axis
    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());
    domainAxis.setUpperMargin(0.10);
    plot.setDomainAxis(domainAxis);
    plot.setOrientation(PlotOrientation.VERTICAL);
    plot.setRangeGridlinesVisible(true);
    plot.setDomainGridlinesVisible(true);

    // Add subplots to main plot
    plot.add(subPlot1, 1);
    plot.add(subPlot2, 2);

    MyStandardCategoryItemLabelGenerator generator=null;

    // value labels and additional values are mutually exclusive
    if(showValueLabels==true)additionalLabels=false;

    if(additionalLabels){
      generator = new MyStandardCategoryItemLabelGenerator(catSerLabels,"{1}", NumberFormat.getInstance());
    }

//    Create Renderers!
    CategoryItemRenderer barRenderer1=new BarRenderer();
    CategoryItemRenderer barRenderer2=new BarRenderer();
    LineAndShapeRenderer lineRenderer1=(useLinesRenderers==true) ? new LineAndShapeRenderer() : null;
    LineAndShapeRenderer lineRenderer2=(useLinesRenderers==true) ? new LineAndShapeRenderer() : null;

    subPlot1.setRenderer(0,barRenderer1);
    subPlot2.setRenderer(0,barRenderer2);

    if(useLinesRenderers==true){
      subPlot1.setRenderer(1,lineRenderer1);
      subPlot2.setRenderer(1,lineRenderer2);

      // no shapes for line_no_shapes  series
      for (Iterator iterator = lineNoShapeSeries1.iterator(); iterator.hasNext();) {
        String ser = (String) iterator.next();
        // if there iS a abel associated search for that
        String label=null;
        if(seriesLabelsMap!=null){
          label=(String)seriesLabelsMap.get(ser);
        }
        if(label==null)label=ser;
        int index=datasetLineFirstAxis.getRowIndex(label);
        if(index!=-1){
          lineRenderer1.setSeriesShapesVisible(index, false);
        }
      }
      for (Iterator iterator = lineNoShapeSeries2.iterator(); iterator.hasNext();) {
        String ser = (String) iterator.next();
        // if there iS a abel associated search for that

        String label=null;
        if(seriesLabelsMap!=null){
          label=(String)seriesLabelsMap.get(ser);
        }
        if(label==null)label=ser;
        int index=datasetLineSecondAxis.getRowIndex(label);
        if(index!=-1){
          lineRenderer2.setSeriesShapesVisible(index, false);
        }
      }

    }

    // add tooltip if enabled
    if(enableToolTips){
      MyCategoryToolTipGenerator generatorToolTip=new MyCategoryToolTipGenerator(freeToolTips, seriesTooltip, categoriesTooltip, seriesCaptions);
      barRenderer1.setToolTipGenerator(generatorToolTip);
      barRenderer2.setToolTipGenerator(generatorToolTip);
      if(useLinesRenderers){
        lineRenderer1.setToolTipGenerator(generatorToolTip);
        lineRenderer2.setToolTipGenerator(generatorToolTip);       
      }
    }

    subPlot1.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);
    subPlot2.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD);

    // COnfigure renderers: I do in extensive way so will be easier to add customization in the future

    if(maxBarWidth!=null){
      ((BarRenderer)barRenderer1).setMaximumBarWidth(maxBarWidth.doubleValue());
      ((BarRenderer)barRenderer2).setMaximumBarWidth(maxBarWidth.doubleValue());
    }


    // Values or addition Labels for first BAR Renderer
    if(showValueLabels){
      barRenderer1.setBaseItemLabelGenerator(new FilterZeroStandardCategoryItemLabelGenerator());
      barRenderer1.setBaseItemLabelsVisible(true);
      barRenderer1.setBaseItemLabelFont(new Font(styleValueLabels.getFontName(), Font.PLAIN, styleValueLabels.getSize()));
      barRenderer1.setBaseItemLabelPaint(styleValueLabels.getColor());

      barRenderer1.setBasePositiveItemLabelPosition(new ItemLabelPosition(
          ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));

      barRenderer1.setBaseNegativeItemLabelPosition(new ItemLabelPosition(
          ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));

      barRenderer2.setBaseItemLabelGenerator(new FilterZeroStandardCategoryItemLabelGenerator());
      barRenderer2.setBaseItemLabelsVisible(true);
      barRenderer2.setBaseItemLabelFont(new Font(styleValueLabels.getFontName(), Font.PLAIN, styleValueLabels.getSize()));
      barRenderer2.setBaseItemLabelPaint(styleValueLabels.getColor());

      barRenderer2.setBasePositiveItemLabelPosition(new ItemLabelPosition(
          ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));

      barRenderer2.setBaseNegativeItemLabelPosition(new ItemLabelPosition(
          ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));

    }
    else if(additionalLabels){
      barRenderer1.setBaseItemLabelGenerator(generator);
      barRenderer2.setBaseItemLabelGenerator(generator);

      double orient=(-Math.PI / 2.0);
      if(styleValueLabels.getOrientation().equalsIgnoreCase("horizontal")){
        orient=0.0;
      }

      barRenderer1.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.CENTER, TextAnchor.CENTER, orient));
      barRenderer1.setBaseNegativeItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.CENTER, TextAnchor.CENTER, orient));
      barRenderer2.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.CENTER, TextAnchor.CENTER, orient));
      barRenderer2.setBaseNegativeItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.CENTER, TextAnchor.CENTER, orient));

    }

    // Values or addition Labels for line Renderers if requested
    if(useLinesRenderers==true){
      if(showValueLabels){
        lineRenderer1.setBaseItemLabelGenerator(new FilterZeroStandardCategoryItemLabelGenerator());
        lineRenderer1.setBaseItemLabelsVisible(true);
        lineRenderer1.setBaseItemLabelFont(new Font(styleValueLabels.getFontName(), Font.PLAIN, styleValueLabels.getSize()));
        lineRenderer1.setBaseItemLabelPaint(styleValueLabels.getColor());
        lineRenderer1.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));
        lineRenderer1.setBaseNegativeItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));
        lineRenderer2.setBaseItemLabelGenerator(new FilterZeroStandardCategoryItemLabelGenerator());
        lineRenderer2.setBaseItemLabelsVisible(true);
        lineRenderer2.setBaseItemLabelFont(new Font(styleValueLabels.getFontName(), Font.PLAIN, styleValueLabels.getSize()));
        lineRenderer2.setBaseItemLabelPaint(styleValueLabels.getColor());
        lineRenderer2.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));
        lineRenderer2.setBaseNegativeItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.OUTSIDE12, TextAnchor.BASELINE_LEFT));

      }
      else if(additionalLabels){
        lineRenderer1.setBaseItemLabelGenerator(generator);
        lineRenderer2.setBaseItemLabelGenerator(generator);
        double orient=(-Math.PI / 2.0);
        if(styleValueLabels.getOrientation().equalsIgnoreCase("horizontal")){
          orient=0.0;
        }
        lineRenderer1.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.CENTER, TextAnchor.CENTER, orient));
        lineRenderer1.setBaseNegativeItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.CENTER, TextAnchor.CENTER, orient));
        lineRenderer2.setBasePositiveItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.CENTER, TextAnchor.CENTER, orient));
        lineRenderer2.setBaseNegativeItemLabelPosition(new ItemLabelPosition(ItemLabelAnchor.CENTER, TextAnchor.CENTER, TextAnchor.CENTER, orient));

      }
    }

    // Bar Dataset Colors!
    if(colorMap!=null){
      int idx = -1;
      for (Iterator iterator = datasetBarFirstAxis.getRowKeys().iterator(); iterator.hasNext();) {
        idx++;
        String serName = (String) iterator.next();
        String labelName = "";
        int index=-1;

        if (seriesCaptions != null && seriesCaptions.size()>0){
          labelName = serName;
          serName = (String)seriesCaptions.get(serName);
          index=datasetBarFirstAxis.getRowIndex(labelName);
        }
        else
          index=datasetBarFirstAxis.getRowIndex(serName);

        Color color=(Color)colorMap.get(serName);
        if(color!=null){
          barRenderer1.setSeriesPaint(index, color);
       
      }

      for (Iterator iterator = datasetBarSecondAxis.getRowKeys().iterator(); iterator.hasNext();) {
        idx++;
        String serName = (String) iterator.next();
        String labelName = "";
        int index=-1;

        if (seriesCaptions != null && seriesCaptions.size()>0){
          labelName = serName;
          serName = (String)seriesCaptions.get(serName);
          index=datasetBarSecondAxis.getRowIndex(labelName);
        }
        else
          index=datasetBarSecondAxis.getRowIndex(serName);

        Color color=(Color)colorMap.get(serName);
        if(color!=null){
          barRenderer2.setSeriesPaint(index, color);
       
      }       
    }




    // LINE Dataset Colors!
    if(useLinesRenderers==true){
      if(colorMap!=null){
        int idx = -1;
        for (Iterator iterator = datasetLineFirstAxis.getRowKeys().iterator(); iterator.hasNext();) {
          idx++;
          String serName = (String) iterator.next();
          String labelName = "";
          int index=-1;

          if (seriesCaptions != null && seriesCaptions.size()>0){
            labelName = serName;
            serName = (String)seriesCaptions.get(serName);
            index=datasetLineFirstAxis.getRowIndex(labelName);
          }
          else
            index=datasetLineFirstAxis.getRowIndex(serName);

          Color color=(Color)colorMap.get(serName);
          if(color!=null){
            lineRenderer1.setSeriesPaint(index, color);
         
        }

        for (Iterator iterator = datasetLineSecondAxis.getRowKeys().iterator(); iterator.hasNext();) {
          idx++;
          String serName = (String) iterator.next();
          String labelName = "";
          int index=-1;

          if (seriesCaptions != null && seriesCaptions.size()>0){
            labelName = serName;
            serName = (String)seriesCaptions.get(serName);
            index=datasetLineSecondAxis.getRowIndex(labelName);
          }
          else
            index=datasetLineSecondAxis.getRowIndex(serName);

          Color color=(Color)colorMap.get(serName);
          if(color!=null){
            lineRenderer2.setSeriesPaint(index, color);
         
        }       
      }
    }


    //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){
      barRenderer1.setItemURLGenerator(mycatUrl);
      barRenderer2.setItemURLGenerator(mycatUrl);
      if(useLinesRenderers){
        lineRenderer1.setItemURLGenerator(mycatUrl);
        lineRenderer2.setItemURLGenerator(mycatUrl);     
      }

    }


    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);

//    I want to re order the legend
    LegendItemCollection legends=plot.getLegendItems();
    // legend Temp
    HashMap<String, LegendItem> legendTemp=new HashMap<String, LegendItem>();
    Vector<String> alreadyInserted=new Vector<String>();
    for (int i = 0; i<legends.getItemCount(); i++) {
      LegendItem item=legends.get(i);
      String label=item.getLabel();
      legendTemp.put(label, item);
    }
    LegendItemCollection newLegend=new LegendItemCollection();
    // force the order of the ones specified
    for (Iterator iterator = seriesOrder.iterator(); iterator.hasNext();) {
      String serie = (String) iterator.next();
      if(legendTemp.keySet().contains(serie)){
        newLegend.add(legendTemp.get(serie));
        alreadyInserted.add(serie);
      }
    }
    // check that there are no serie not specified, otherwise add them
    for (Iterator iterator = legendTemp.keySet().iterator(); iterator.hasNext();) {
      String serie = (String) iterator.next();
      if(!alreadyInserted.contains(serie)){
        newLegend.add(legendTemp.get(serie));
      }
    }

    plot.setFixedLegendItems(newLegend);

    if(legend==true) drawLegend(chart);
    logger.debug("OUT");

    return chart;



  }



  private boolean isHiddenSerie(String serName){
    boolean res = false;

    for (int i=0; i < hiddenSeries.size(); i++){
      if (((String)hiddenSeries.get(i)).equalsIgnoreCase(serName)){
        res = true;
        break;
      }
    }
    return res;
  }
}
TOP

Related Classes of it.eng.spagobi.engines.chart.bo.charttypes.barcharts.CombinedCategoryBar

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.