/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package cli_fmw.report.implemenatation;
import cli_fmw.main.ClipsException;
import cli_fmw.report.CombinedReportCreator;
import cli_fmw.report.CombinedReportOptions;
import cli_fmw.report.FormReportCreator;
import cli_fmw.report.PageOptions;
import cli_fmw.report.ReporterFactory;
import cli_fmw.report.SegmentedTableReporter;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRParameter;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRMapCollectionDataSource;
/**
*
* @author finder
*/
public class JasperCombinedReport extends JasperReporter<CombinedReportOptions> implements CombinedReportCreator, JasperSubReportContener {
ArrayList<JasperSubReport> reports = new ArrayList<JasperSubReport>();
public JasperCombinedReport(Class formClass, int reportType, String reportName) {
super(formClass, reportType, reportName);
}
@Override
public void setUpReport(){
setUpReport(null);
}
@Override
public void setUpReport(Map<String, Object> extraFields) {
setUpReport(null, null, extraFields == null? null: extraFields.entrySet());
}
@Override
public void setUpReport(String title, CombinedReportOptions options, Collection<Entry<String, Object>> topExtraFields) {
setUpReport(title, options, topExtraFields, null);
}
@Override
public void setUpReport(String title, CombinedReportOptions options, Collection<Entry<String, Object>> topExtraFields, Collection<Entry<String, Object>> bottomExtraFields) {
setInit();
this.title = title;
setOptions(options);
this.topExtraFields = topExtraFields;
this.bottomExtraFields = bottomExtraFields;
}
private void setUpAsSubReporter(Object creator){
if (creator == null) {
throw new IllegalArgumentException("Не удалось создать отчет переданного типа!");
}
if (!(creator instanceof JasperSubReport)) {
throw new IllegalArgumentException("Не поддерживаемый тип подотчета, поддерживается только JasperReporter, получен: " + creator.getClass().getName());
}
JasperSubReport jasperCreator = (JasperSubReport) creator;
jasperCreator.setAsSubreport(this);
}
@Override
public FormReportCreator createFormReporter(Class clazz, int type) {
isInit();
FormReportCreator creator = ReporterFactory.createFormReporter(clazz, type);
setUpAsSubReporter(creator);
return creator;
}
@Override
public CombinedReportCreator createCombinedReporter(Class clazz, int type) {
isInit();
CombinedReportCreator creator = ReporterFactory.createCombinedReporter(clazz, type);
setUpAsSubReporter(creator);
return creator;
}
@Override
public SegmentedTableReporter createAnalyseReporter(Class clazz) {
isInit();
SegmentedTableReporter creator = ReporterFactory.createAnalyseReporter(clazz);
setUpAsSubReporter(creator);
return creator;
}
@Override
public JasperReport getTemplateImp() throws ClipsException, JRException {
isInit();
JasperReport report = getLoader().loadReport();
if (report == null){
JasperSubreportBuilder subRepBuilder = new JasperSubreportBuilder(getOptions());
JasperReportBuilder reportBuilder = new JasperReportBuilder(title, getOptions(), topExtraFields, bottomExtraFields, subRepBuilder);
report = reportBuilder.buildReport();
}
return report;
}
private void putFormatParams(ArrayList<Map<String, Object>> params){
for (int i = 0; i < params.size(); i++) {
Map<String, Object> map = params.get(i);
if (getOptions().subReportNewPageType == CombinedReportOptions.NewPageType.beginNotFirst && i == 0){
map.put(JasperSubreportBuilder.SUBREPORT_NEW_PAGE_FLAG, false);
}
else if (getOptions().subReportNewPageType == CombinedReportOptions.NewPageType.endNotLast && i == params.size() - 1){
map.put(JasperSubreportBuilder.SUBREPORT_NEW_PAGE_FLAG, false);
}
else{
map.put(JasperSubreportBuilder.SUBREPORT_NEW_PAGE_FLAG, true);
}
}
}
@Override
public Map<String, ?> getParameters() throws ClipsException, JRException {
isInit();
HashMap<String, Object> params = new HashMap<String, Object>();
params.put(JRParameter.REPORT_LOCALE, RUS_LOCALE);
initFieldParams(params, isAutoGenerated());
ArrayList<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
for (JasperSubReport curReporter : reports) {
Map<String, Object> item = new HashMap<String, Object>();
item.put(JasperSubreportBuilder.SUBREPORT_DATA_NAME, curReporter.getTemplate());
Map<String, ?> subParam = curReporter.getParameters();
item.put(JasperSubreportBuilder.SUBREPORT_PARAMETER_NAME, subParam);
item.put(JasperSubreportBuilder.SUBREPORT_DATASOURCE_NAME, subParam.get(JRParameter.REPORT_DATA_SOURCE));
data.add(item);
}
putFormatParams(data);
params.put(JRParameter.REPORT_DATA_SOURCE, new JRMapCollectionDataSource(data));
return params;
}
@Override
public void addSubReport(JasperSubReport report) {
reports.add(report);
}
@Override
public CombinedReportOptions getOptions() {
CombinedReportOptions opt = super.getOptions();
if (opt == null) {
opt = new CombinedReportOptions();
setOptions(opt);
}
return opt;
}
@Override
public void correctReportPageSize(PageOptions options) {
int curVisibleArea = getOptions().reportWidht - getOptions().leftMargin - getOptions().rightMargin;
int newVisibleArea = options.reportWidht - options.leftMargin - options.rightMargin;
if (curVisibleArea >= newVisibleArea){
options.reportWidht = curVisibleArea;
int dif = curVisibleArea - newVisibleArea;
options.leftMargin = dif >> 1;
options.rightMargin = dif >> 1 | dif & 1;
}
else{
options.reportWidht = curVisibleArea - options.leftMargin - options.rightMargin;
}
}
}