/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package cli_fmw.report.implemenatation;
import cli_fmw.report.CombinedReportOptions;
import framework.beans.report.ReportBaseConstant;
import java.util.Map;
import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRExpression;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.design.JRDesignBand;
import net.sf.jasperreports.engine.design.JRDesignBreak;
import net.sf.jasperreports.engine.design.JRDesignExpression;
import net.sf.jasperreports.engine.design.JRDesignField;
import net.sf.jasperreports.engine.design.JRDesignSubreport;
/**
*
* @author finder
*/
public class JasperSubreportBuilder implements JasperDetailBuilder {
public static final String SUBREPORT_DATA_NAME = "report_data";
public static final String SUBREPORT_PARAMETER_NAME = ReportBaseConstant.SUBREPORT_PARAMETER_NAME;
public static final String SUBREPORT_DATASOURCE_NAME = ReportBaseConstant.SUBREPORT_DATASOURCE_NAME;
public static final String SUBREPORT_NEW_PAGE_FLAG = "new_page_flag";
private CombinedReportOptions options;
private JasperBuilder builder;
private JRDesignBand detalsBand;
public JasperSubreportBuilder(CombinedReportOptions options) {
if (options == null) {
throw new IllegalArgumentException("options can not be null");
}
this.options = options;
if (this.options.subReportNewPageType == null) {
this.options.subReportNewPageType = CombinedReportOptions.NewPageType.none;
}
}
@Override
public void buildDetails(JasperBuilder inBuilder, JasperReportBuilderCustomizer inCustomizer) throws JRException {
if (inBuilder == null) {
throw new IllegalArgumentException("inBuilder can not be null");
}
this.builder = inBuilder;
detalsBand = builder.getDetalsBand();
buildDetail();
}
private JRExpression createFieldCallExpresion(String name, Class clazz) throws JRException{
JRDesignField field = (JRDesignField) builder.getTargetDesting().getFieldsMap().get(name);
if (field == null){
field = new JRDesignField();
field.setName(name);
field.setValueClass(clazz);
builder.getTargetDesting().addField(field);
}
else if (field.getClass() != clazz) {
throw new RuntimeException("Field exist, but has defferent class. Name " + name);
}
JRDesignExpression ex = new JRDesignExpression();
ex.setText("$F{" + field.getName() + "}");
ex.setValueClass(clazz);
return ex;
}
private void buildDetail() throws JRException{
JRDesignSubreport subreport = new JRDesignSubreport(builder.getTargetDesting());
subreport.setExpression(createFieldCallExpresion(SUBREPORT_DATA_NAME, JasperReport.class));
subreport.setParametersMapExpression(createFieldCallExpresion(SUBREPORT_PARAMETER_NAME, Map.class));
subreport.setDataSourceExpression(createFieldCallExpresion(SUBREPORT_DATASOURCE_NAME, JRDataSource.class));
subreport.setX(0);
subreport.setHeight(1);
if (options.subReportWidth > 0) {
subreport.setWidth(options.subReportWidth);
}
else {
subreport.setWidth(builder.getDestingWidth());
}
if (options.subReportNewPageType == CombinedReportOptions.NewPageType.none) {
subreport.setY(0);
detalsBand.setHeight(1);
}
else {
detalsBand.setHeight(2);
JRDesignBreak jrBreak = new JRDesignBreak();
jrBreak.setType(JRDesignBreak.TYPE_PAGE);
switch (options.subReportNewPageType){
case begin:
case beginNotFirst:
jrBreak.setX(0);
subreport.setY(1);
break;
case end:
case endNotLast:
jrBreak.setX(1);
subreport.setY(0);
jrBreak.setPositionType(JRDesignBreak.POSITION_TYPE_FLOAT);
break;
default:
throw new IllegalArgumentException("Uncnown options.subReportNewPageType paramiter");
}
jrBreak.setPrintWhenExpression(createFieldCallExpresion(SUBREPORT_NEW_PAGE_FLAG, Boolean.class));
detalsBand.addElement(jrBreak);
}
detalsBand.addElement(subreport);
}
}