CalipsoDecoratedReportLayout.java :  » Report » jmagallanes-1.0 » com » calipso » reportgenerator » common » Java Open Source

Java Open Source » Report » jmagallanes 1.0 
jmagallanes 1.0 » com » calipso » reportgenerator » common » CalipsoDecoratedReportLayout.java
package com.calipso.reportgenerator.common;

import net.sf.jasperreports.engine.design.*;
import net.sf.jasperreports.engine.*;
import net.sf.jasperreports.engine.base.JRBaseFont;

import java.text.SimpleDateFormat;
import java.text.DateFormat;
import java.util.*;

/**
 *
 * User: jbassino
 * Date: 18/10/2004
 * Time: 17:26:19
 *
 */
public class CalipsoDecoratedReportLayout implements IJasperDefinition {
  private IJasperDefinition jasperDefinition;
  private static final int FIRSTCOLUMN_LABELS_X = 2;
  private static final int FIRST_ROW_LABELS_Y = 2;
  private static final int headerColumns = 3;
  private static final int headerRows = 3;
  private static final String countryParam = "countryparamVALUE";
  private static final String zoneuserParam = "zoneuserVALUE";
  private static final String moduleParam = "moduleVALUE";
  private static final String endOfReportString = "*** FIN DE REPORTE ***";
  //private int FIRSTCOLUMN_TITLE_LABELS_WIDTH = 70;

  private CalipsoDecoratedReportLayout(){
  }

  public CalipsoDecoratedReportLayout(IJasperDefinition design) {
    this.jasperDefinition = design;
  }

  public JasperDesign getJasperDefinition(boolean isLandscape) throws JRException {
    JasperDesign design = jasperDefinition.getJasperDefinition(isLandscape);
    addCalipsoParams(design);
    addCalipsoHeader(design);
    return design;
  }

  private void addCalipsoParams(JasperDesign design) throws JRException{
    Collection paramNames = getParamsNames(design);
    String[] names = new String[] {countryParam, zoneuserParam, moduleParam};
    for (int i = 0; i < names.length; i++) {
      String name = names[i];
      if(!paramNames.contains(name)){
        JRParameter param = getParameterFor(name);
        design.addParameter(param);
      }
    }
  }

  private JRParameter getParameterFor(String name) {
    JRDesignParameter parameter = new JRDesignParameter();
    parameter.setValueClass(java.lang.String.class);
    JRDesignExpression expression = new JRDesignExpression();
    expression.setText("");
    expression.setValueClass(java.lang.String.class);
    parameter.setDefaultValueExpression(expression);
    parameter.setName(name);
    return parameter;
  }

  private Collection getParamsNames(JasperDesign design) {
    Collection result = new Vector();
    JRParameter[] params = design.getParameters();
    for (int i = 0; i < params.length; i++) {
      JRParameter param = params[i];
      result.add(param.getName());
    }
    return result;
  }

  private void addCalipsoHeader(JasperDesign design) {
    changeTitleBand(design);
    addPageHeader(design);
    addReportFooter(design);
  }

  private void addPageHeader(JasperDesign design) {
    JRDesignBand pageHeader = (JRDesignBand)design.getPageHeader();
    pageHeader.setHeight(30);
    pageHeader.addElement(getBandRectangle(design, pageHeader));
    addColumnHeaders(design, pageHeader);
  }

  private void addColumnHeaders(JasperDesign design, JRDesignBand pageHeader) {
    int columnWidth = getColumnWidth(design);
    addGroupsHeader(design, pageHeader, columnWidth);
    addNonGroupsHeader(design, pageHeader, columnWidth);
  }

  private void addNonGroupsHeader(JasperDesign design, JRDesignBand pageHeader, int columnWidth) {
    int groupCount = design.getGroups().length;
    Collection elements = selectStaticTextElements(design.getDetail().getElements());
    int i=0;
    for (Iterator iterator = elements.iterator(); iterator.hasNext();i++) {
      String name = (String) iterator.next();
      pageHeader.addElement(getColumnHeader(pageHeader, name, columnWidth, i + groupCount));
    }
  }

  private JRDesignElement getColumnHeader(JRDesignBand pageHeader, String name, int columnWidth, int i) {
    JRDesignStaticText text = new JRDesignStaticText();
    text.setFont(getLabelFont(getLabelHeightFromBand(pageHeader, 1) - 2));
    text.setText(name);
    text.setX(i * columnWidth + 1);
    text.setY(FIRST_ROW_LABELS_Y);
    text.setHeight(getLabelHeightFromBand(pageHeader, 1) - 2);
    text.setWidth(columnWidth - 1);
    text.setTextAlignment(JRTextElement.HORIZONTAL_ALIGN_CENTER);
    return text;
  }

  private Collection selectStaticTextElements(JRElement[] elements) {
    Collection collection = new Vector();
    for (int i = 0; i < elements.length; i++) {
      JRElement element = elements[i];
      if(element instanceof JRDesignStaticText){
        collection.add(((JRDesignStaticText)element).getText());
      }else if(element instanceof JRDesignTextField){
        String text = ((JRDesignTextField)element).getExpression().getChunks()[0].getText();
        collection.add(text);
      }
    }
    return collection;
  }

  private int getColumnWidth(JasperDesign design) {
    int width = getPrintWidth(design);
    int columnCount = design.getGroups().length + selectStaticTextElements(design.getDetail().getElements()).size();
    return width / columnCount;
  }

  private void addGroupsHeader(JasperDesign design, JRDesignBand pageHeader, int columnWidth) {
    JRGroup[] groups = design.getGroups();
    for (int i = 0; i < groups.length; i++) {
      JRGroup group = groups[i];
      pageHeader.addElement(getGroupColumnHeader(pageHeader, group, columnWidth, i));
    }
  }

  private JRDesignElement getGroupColumnHeader(JRDesignBand pageHeader, JRGroup group, int columnWidth, int i) {
    String groupName = getTextForHeader(group);
    JRDesignStaticText text = new JRDesignStaticText();
    text.setFont(getLabelFont(getLabelHeightFromBand(pageHeader, 1) - 2));
    text.setText(groupName);
    text.setX(i * columnWidth + 1);
    text.setY(FIRST_ROW_LABELS_Y);
    text.setHeight(getLabelHeightFromBand(pageHeader, 1) - 2);
    text.setWidth(columnWidth - 1);
    text.setTextAlignment(JRTextElement.HORIZONTAL_ALIGN_CENTER);
    return text;
  }

  private String getTextForHeader(JRGroup group) {
    if(group.getName()!=null && group.getName().endsWith("_GROUP")){
      int endIndex = group.getName().indexOf("_GROUP");
      return group.getName().substring(0, endIndex);
    }else{
      return "";
    }
  }

  private void addReportFooter(JasperDesign design) {
    JRDesignBand endOfReport = (JRDesignBand)design.getSummary();
    endOfReport.addElement(getEndOfReportLabel(endOfReport));
  }

  private JRDesignElement getEndOfReportLabel(JRDesignBand band) {
    JRDesignStaticText text = new JRDesignStaticText();
    text.setFont(getLabelFont(Math.min(20, band.getHeight())));
    text.setText(endOfReportString);
    text.setX(FIRSTCOLUMN_LABELS_X);
    text.setY(FIRST_ROW_LABELS_Y);
    text.setHeight(getLabelHeightFromBand(band, 1) - 2);
    text.setWidth(getWidthForText(text));
    text.setTextAlignment(JRTextElement.HORIZONTAL_ALIGN_LEFT);
    return text;
  }

  /**
   * Retorna un ancho aproximado o probable que podria ocupar un texto con una fuente determinada.
   * No sirve para fuentes de mas de 18 puntos.
   * @param text
   * @return
   */
  private int getWidthForText(JRDesignStaticText text) {
    if(text.getFont().getSize() < 12){
      return text.getText().length() * 10;
    }else{
      return text.getText().length() * 20;
    }
  }

  private void changeTitleBand(JasperDesign design) {
    JRBand oldTitleBand = design.getTitle();
    JRDesignBand titleBand = new JRDesignBand();
    titleBand.setHeight(oldTitleBand.getHeight());
    moveOldElements(design, oldTitleBand, titleBand);
    JRDesignRectangle rectangle = getBandRectangle(design, oldTitleBand);
    titleBand.addElement(rectangle);
    titleBand.addElement(getCalipsoLabel(design, titleBand));
    titleBand.addElement(getCountryZoneLabel(design, titleBand));
    titleBand.addElement(getZoneUserLabel(design, titleBand));
    titleBand.addElement(getModuleLabel(design, titleBand));
    addPageNumberLabel(design, titleBand);
    titleBand.addElement(getDateLabel(design, titleBand));
    titleBand.addElement(getTimeLabel(design, titleBand));
    design.setTitle(titleBand);
  }

  private JRDesignElement getTimeLabel(JasperDesign design, JRDesignBand titleBand) {
    JRDesignTextField field = new JRDesignTextField();
    field.setX(getLabelPosX(design, 3, 3));
    field.setY(getLabelPosY(titleBand, headerRows, 3));
    field.setHeight(getLabelHeightFromBand(titleBand, headerRows));
    field.setWidth(getTitleLabelsWidth(design, headerColumns));
    field.setFont(getLabelFont(field.getHeight()));
    field.setBlankWhenNull(true);
    JRDesignExpression expression = new JRDesignExpression();
    expression.setValueClass(java.lang.String.class);
    expression.setText("SimpleDateFormat.getTimeInstance().format(GregorianCalendar.getInstance().getTime())");
    field.setExpression(expression);
    field.setTextAlignment(JRTextElement.HORIZONTAL_ALIGN_RIGHT);
    return field;
  }

  private JRDesignElement getDateLabel(JasperDesign design, JRDesignBand titleBand) {
    JRDesignTextField field = new JRDesignTextField();
    field.setX(getLabelPosX(design, 3, 3));
    field.setY(getLabelPosY(titleBand, headerRows, 2));
    field.setHeight(getLabelHeightFromBand(titleBand, headerRows));
    field.setWidth(getTitleLabelsWidth(design, headerColumns));
    field.setFont(getLabelFont(field.getHeight()));
    field.setBlankWhenNull(true);
    JRDesignExpression expression = new JRDesignExpression();
    expression.setValueClass(java.lang.String.class);
    expression.setText("new SimpleDateFormat(\"dd/MM/yyyy\").format(GregorianCalendar.getInstance().getTime())");
    field.setExpression(expression);
    field.setTextAlignment(JRTextElement.HORIZONTAL_ALIGN_RIGHT);
    return field;
  }

  private void addPageNumberLabel(JasperDesign design, JRDesignBand titleBand) {
    JRDesignStaticText textElement = new JRDesignStaticText();
    textElement.setText("Pag. ");
    int posX = design.getPageWidth() - design.getRightMargin();
    textElement.setX(posX - 115);
    textElement.setY(FIRST_ROW_LABELS_Y);
    textElement.setHeight(getLabelHeightFromBand(titleBand, headerRows));
    textElement.setWidth(30);
    textElement.setFont(getLabelFont(textElement.getHeight()));
    titleBand.addElement(textElement);

    JRDesignTextField field = new JRDesignTextField();
    field.setX(posX - 85);
    field.setY(FIRST_ROW_LABELS_Y);
    field.setHeight(getLabelHeightFromBand(titleBand, headerRows));
    field.setWidth(22);
    field.setFont(getLabelFont(textElement.getHeight()));
    JRDesignExpression expression = new JRDesignExpression();
    expression.setValueClass(java.lang.Integer.class);
    expression.setText("$V{PAGE_NUMBER}");
    field.setExpression(expression);
    field.setPattern("###");
    field.setTextAlignment(JRTextElement.HORIZONTAL_ALIGN_CENTER);
    titleBand.addElement(field);

    textElement = new JRDesignStaticText();
    textElement.setText(" de ");
    textElement.setX(posX - 63);
    textElement.setY(FIRST_ROW_LABELS_Y);
    textElement.setHeight(getLabelHeightFromBand(titleBand, headerRows));
    textElement.setWidth(20);
    textElement.setFont(getLabelFont(textElement.getHeight()));
    titleBand.addElement(textElement);

    field = new JRDesignTextField();
    field.setX(posX - 43);
    field.setY(FIRST_ROW_LABELS_Y);
    field.setHeight(getLabelHeightFromBand(titleBand, headerRows));
    field.setWidth(22);
    field.setFont(getLabelFont(textElement.getHeight()));
    expression = new JRDesignExpression();
    expression.setValueClass(java.lang.Integer.class);
    expression.setText("$V{PAGE_COUNT}");
    field.setExpression(expression);
    field.setPattern("###");
    field.setTextAlignment(JRTextElement.HORIZONTAL_ALIGN_CENTER);
    titleBand.addElement(field);
  }

  private JRDesignElement getModuleLabel(JasperDesign design, JRDesignBand titleBand) {
    JRDesignTextField field = new JRDesignTextField();
    field.setX(getLabelPosX(design, headerColumns, 2));
    field.setY(FIRST_ROW_LABELS_Y);
    field.setHeight(getLabelHeightFromBand(titleBand, headerRows));
    field.setWidth(getTitleLabelsWidth(design, headerColumns));
    field.setFont(getLabelFont(field.getHeight()));
    field.setBlankWhenNull(true);
    JRDesignExpression expression = new JRDesignExpression();
    expression.setValueClass(java.lang.String.class);
    expression.setText("$P{"+ moduleParam +"}");
    field.setExpression(expression);
    field.setTextAlignment(JRTextElement.HORIZONTAL_ALIGN_CENTER);
    return field;
  }

  private void moveOldElements(JasperDesign design, JRBand oldTitleBand, JRDesignBand titleBand) {
    JRElement[] elements = oldTitleBand.getElements();
    if(elements.length > 1){
      System.out.println(LanguageTraslator.traslate("468"));
    }
    JRDesignTextElement element = null;
    try{
      element = (JRDesignTextElement)elements[0];
    }catch (ClassCastException e){
      System.out.println(LanguageTraslator.traslate("469"));
      e.printStackTrace();
    }
    element.setX(getLabelPosX(design, headerColumns, 2));
    element.setY(getLabelPosY(titleBand, headerRows, 2));
    element.setFont(getLabelFont(getLabelHeightFromBand(titleBand, headerRows)));
    element.setHeight(getLabelHeightFromBand(titleBand, headerRows));
    element.setWidth(getTitleLabelsWidth(design, headerColumns));
    element.setTextAlignment(JRTextElement.HORIZONTAL_ALIGN_CENTER);
    titleBand.addElement(element);
  }

  /**
   * Retorna la posicion X donde debera ubicarse el elemento segun cuantas columnas halla, y su numero de columna
   * @param design El design al que se agregara el elemento (tiene el width)
   * @param columns Cantidad de columnas (cantidad de elementos que se agregaran seguidos en la misma linea)
   * @param columnNumber
   * @return
   */
  private int getLabelPosX(JasperDesign design, int columns, int columnNumber) {
    int width = getTitleLabelsWidth(design, columns);
    return (columnNumber - 1)* width;
  }

  /**
   * Retorna el valor de la posicion Y donde se ubicara el elemento en el design.
   * @param band La banda donde estara el elemento
   * @param rows La cantidad de elementos que habr uno sobre otro (como en filas)
   * @param pos La posicion o numero de fila. Para la primera es uno.
   * @return
   */
  private int getLabelPosY(JRDesignBand band, int rows, int pos){
    int height = getLabelHeightFromBand(band, rows);
    return ((pos - 1) * height) + ((pos - 1) * (height / rows));
  }

  private JRDesignElement getZoneUserLabel(JasperDesign design, JRDesignBand titleBand) {
    JRDesignTextField field = new JRDesignTextField();
    field.setX(FIRSTCOLUMN_LABELS_X);
    field.setY(getLabelPosY(titleBand, headerRows, 3));
    field.setHeight(getLabelHeightFromBand(titleBand, headerRows));
    field.setWidth(getTitleLabelsWidth(design, headerColumns));
    field.setFont(getLabelFont(field.getHeight()));
    field.setBlankWhenNull(true);
    JRDesignExpression expression = new JRDesignExpression();
    expression.setValueClass(java.lang.String.class);
    expression.setText("$P{"+ zoneuserParam +"}");
    field.setExpression(expression);
    field.setTextAlignment(JRTextElement.HORIZONTAL_ALIGN_LEFT);
    return field;
  }

  private int getTitleLabelsWidth(JasperDesign design, int columns) {
    return getPrintWidth(design) / columns;
  }

  private JRDesignElement getCountryZoneLabel(JasperDesign design, JRDesignBand titleBand) {
    JRDesignTextField field = new JRDesignTextField();
    field.setX(FIRSTCOLUMN_LABELS_X);
    field.setY(getLabelPosY(titleBand, headerRows, 2));
    field.setHeight(getLabelHeightFromBand(titleBand, headerRows));
    field.setWidth(getTitleLabelsWidth(design, headerColumns));
    field.setFont(getLabelFont(field.getHeight()));
    field.setBlankWhenNull(true);
    JRDesignExpression expression = new JRDesignExpression();
    expression.setValueClass(java.lang.String.class);
    expression.setText("$P{"+ countryParam +"}");
    field.setExpression(expression);
    field.setTextAlignment(JRTextElement.HORIZONTAL_ALIGN_LEFT);
    return field;
  }

  private JRDesignElement getCalipsoLabel(JasperDesign design, JRDesignBand band) {
    JRDesignStaticText staticText = new JRDesignStaticText();
    staticText.setX(FIRSTCOLUMN_LABELS_X);
    staticText.setY(FIRST_ROW_LABELS_Y);
    staticText.setHeight(getLabelHeightFromBand(band, headerRows));
    staticText.setWidth(getTitleLabelsWidth(design, headerColumns));
    staticText.setFont(getLabelFont(staticText.getHeight()));
    staticText.setText("CALIPSO");
    staticText.setTextAlignment(JRTextElement.HORIZONTAL_ALIGN_LEFT);
    return staticText;
  }

  private JRFont getLabelFont(int height) {
    JRDesignFont font = new JRDesignFont();
    font.setFontName("Arial");
    font.setSize(getFontSize(height));
    return font;
  }

  private int getFontSize(int labalHeight) {
    if(labalHeight < 13){
      return labalHeight - 4;
    }else if(labalHeight < 18){
      return labalHeight - 5;
    }else{
      return 12;
    }
  }

  /*private int getCalipsoLabelWidth(JRDesignBand band) {
    return
  }*/

  private int getLabelHeightFromBand(JRDesignBand band, int labels) {
    return (band.getHeight() / labels + 1);
  }

  private void addElements(JRBand fromBand, JRDesignBand toBand) {
    JRElement[] elements = fromBand.getElements();
    for (int i = 0; i < elements.length; i++) {
      JRElement element = elements[i];
      toBand.addElement((JRDesignElement)element);
    }
  }

  private int getPrintWidth(JasperDesign design){
    return (design.getPageWidth() - design.getLeftMargin() - design.getRightMargin());
  }

  private JRDesignRectangle getBandRectangle(JasperDesign design, JRBand band) {
    JRDesignRectangle rectangle = new JRDesignRectangle();
    int width = getPrintWidth(design);
    rectangle.setX(0);
    rectangle.setY(0);
    rectangle.setHeight(band.getHeight());
    rectangle.setWidth(width);
    rectangle.setPen(JRGraphicElement.PEN_2_POINT);
    rectangle.setStretchType(JRGraphicElement.STRETCH_TYPE_RELATIVE_TO_BAND_HEIGHT);
    rectangle.setMode(JRGraphicElement.MODE_TRANSPARENT);
    return rectangle;
  }
}
java2s.com  | Contact Us | Privacy Policy
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.