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

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

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



  }


}
TOP

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

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.