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