Files
HRMS/hrmsEjb/net/sf/jasperreports/engine/fill/JRHorizontalFiller.java
2025-07-28 13:56:49 +05:30

819 lines
34 KiB
Java

package net.sf.jasperreports.engine.fill;
import java.util.Iterator;
import java.util.List;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JRGroup;
import net.sf.jasperreports.engine.JRPrintElement;
import net.sf.jasperreports.engine.JRRuntimeException;
import net.sf.jasperreports.engine.JasperReport;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
public class JRHorizontalFiller extends JRBaseFiller {
private static final Log log = LogFactory.getLog(JRHorizontalFiller.class);
private int lastDetailOffsetX = -1;
private int lastDetailOffsetY = -1;
protected JRHorizontalFiller(JasperReport jasperReport) throws JRException {
this(jasperReport, (JREvaluator)null, (JRBaseFiller)null);
}
protected JRHorizontalFiller(JasperReport jasperReport, JRBaseFiller parentFiller) throws JRException {
super(jasperReport, null, parentFiller);
setPageHeight(this.pageHeight);
}
protected JRHorizontalFiller(JasperReport jasperReport, JREvaluator evaluator, JRBaseFiller parentFiller) throws JRException {
super(jasperReport, evaluator, parentFiller);
setPageHeight(this.pageHeight);
}
protected void setPageHeight(int pageHeight) {
this.pageHeight = pageHeight;
this.columnFooterOffsetY = pageHeight - this.bottomMargin;
if (this.pageFooter != null)
this.columnFooterOffsetY -= this.pageFooter.getHeight();
if (this.columnFooter != null)
this.columnFooterOffsetY -= this.columnFooter.getHeight();
this.lastPageColumnFooterOffsetY = pageHeight - this.bottomMargin;
if (this.lastPageFooter != null)
this.lastPageColumnFooterOffsetY -= this.lastPageFooter.getHeight();
if (this.columnFooter != null)
this.lastPageColumnFooterOffsetY -= this.columnFooter.getHeight();
}
protected synchronized void fillReport() throws JRException {
setLastPageFooter(false);
if (next()) {
fillReportStart();
while (next())
fillReportContent();
fillReportEnd();
} else {
if (log.isDebugEnabled())
log.debug("Fill " + this.fillerId + ": no data");
switch (this.whenNoDataType) {
case 3:
if (log.isDebugEnabled())
log.debug("Fill " + this.fillerId + ": all sections");
this.scriptlet.callBeforeReportInit();
this.calculator.initializeVariables((byte)1);
this.scriptlet.callAfterReportInit();
this.printPage = newPage();
addPage(this.printPage);
setFirstColumn();
this.offsetY = this.topMargin;
fillBackground();
fillTitle();
fillPageHeader((byte)3);
fillColumnHeaders((byte)3);
fillGroupHeaders(true);
fillGroupFooters(true);
fillSummary();
break;
case 2:
if (log.isDebugEnabled())
log.debug("Fill " + this.fillerId + ": blank page");
this.printPage = newPage();
addPage(this.printPage);
break;
case 4:
if (log.isDebugEnabled())
log.debug("Fill " + this.fillerId + ": NoData section");
this.scriptlet.callBeforeReportInit();
this.calculator.initializeVariables((byte)1);
this.scriptlet.callAfterReportInit();
this.printPage = newPage();
addPage(this.printPage);
setFirstColumn();
this.offsetY = this.topMargin;
fillBackground();
fillNoData();
break;
default:
if (log.isDebugEnabled())
log.debug("Fill " + this.fillerId + ": no pages");
break;
}
}
if (isSubreport()) {
this.printPageStretchHeight = this.offsetY + this.bottomMargin;
if (this.fillContext.isUsingVirtualizer())
removePageIdentityDataProvider();
}
if (this.fillContext.isIgnorePagination())
this.jasperPrint.setPageHeight(this.offsetY + this.bottomMargin);
}
private void fillReportStart() throws JRException {
this.scriptlet.callBeforeReportInit();
this.calculator.initializeVariables((byte)1);
this.scriptlet.callAfterReportInit();
this.printPage = newPage();
addPage(this.printPage);
setFirstColumn();
this.offsetY = this.topMargin;
fillBackground();
fillTitle();
fillPageHeader((byte)3);
fillColumnHeaders((byte)3);
fillGroupHeaders(true);
fillDetail();
}
private void setFirstColumn() {
this.columnIndex = 0;
this.offsetX = this.leftMargin;
setColumnNumberVariable();
}
private void fillReportContent() throws JRException {
this.calculator.estimateGroupRuptures();
fillGroupFooters(false);
resolveGroupBoundElements((byte)1, false);
this.scriptlet.callBeforeGroupInit();
this.calculator.initializeVariables((byte)4);
this.scriptlet.callAfterGroupInit();
fillGroupHeaders(false);
fillDetail();
}
private void fillReportEnd() throws JRException {
fillGroupFooters(true);
fillSummary();
}
private void fillTitle() throws JRException {
if (log.isDebugEnabled() && !this.title.isEmpty())
log.debug("Fill " + this.fillerId + ": title");
this.title.evaluatePrintWhenExpression((byte)3);
if (this.title.isToPrint()) {
while (this.title.getHeight() > this.pageHeight - this.bottomMargin - this.offsetY)
addPage(false);
this.title.evaluate((byte)3);
JRPrintBand printBand = this.title.fill(this.pageHeight - this.bottomMargin - this.offsetY - this.title.getHeight());
if (this.title.willOverflow() && !this.title.isSplitAllowed() && isSubreport()) {
resolveGroupBoundElements((byte)3, false);
resolveColumnBoundElements((byte)3);
resolvePageBoundElements((byte)3);
this.scriptlet.callBeforePageInit();
this.calculator.initializeVariables((byte)2);
this.scriptlet.callAfterPageInit();
addPage(false);
printBand = this.title.refill(this.pageHeight - this.bottomMargin - this.offsetY - this.title.getHeight());
}
fillBand(printBand);
this.offsetY += printBand.getHeight();
while (this.title.willOverflow()) {
resolveGroupBoundElements((byte)3, false);
resolveColumnBoundElements((byte)3);
resolvePageBoundElements((byte)3);
this.scriptlet.callBeforePageInit();
this.calculator.initializeVariables((byte)2);
this.scriptlet.callAfterPageInit();
addPage(false);
printBand = this.title.fill(this.pageHeight - this.bottomMargin - this.offsetY - this.title.getHeight());
fillBand(printBand);
this.offsetY += printBand.getHeight();
}
resolveBandBoundElements(this.title, (byte)3);
if (this.isTitleNewPage) {
resolveGroupBoundElements((byte)3, false);
resolveColumnBoundElements((byte)3);
resolvePageBoundElements((byte)3);
this.scriptlet.callBeforePageInit();
this.calculator.initializeVariables((byte)2);
this.scriptlet.callAfterPageInit();
addPage(false);
}
}
}
private void fillPageHeader(byte evaluation) throws JRException {
if (log.isDebugEnabled() && !this.pageHeader.isEmpty())
log.debug("Fill " + this.fillerId + ": page header");
setNewPageColumnInBands();
this.pageHeader.evaluatePrintWhenExpression((byte)3);
if (this.pageHeader.isToPrint()) {
int reattempts = getMasterColumnCount();
if (this.isCreatingNewPage)
reattempts--;
boolean filled = fillBandNoOverflow(this.pageHeader, evaluation);
for (int i = 0; !filled && i < reattempts; i++) {
resolveGroupBoundElements(evaluation, false);
resolveColumnBoundElements(evaluation);
resolvePageBoundElements(evaluation);
this.scriptlet.callBeforePageInit();
this.calculator.initializeVariables((byte)2);
this.scriptlet.callAfterPageInit();
addPage(false);
filled = fillBandNoOverflow(this.pageHeader, evaluation);
}
if (!filled)
throw new JRRuntimeException("Infinite loop creating new page due to page header overflow.");
}
this.columnHeaderOffsetY = this.offsetY;
this.isNewPage = true;
this.isFirstPageBand = true;
}
private boolean fillBandNoOverflow(JRFillBand band, byte evaluation) throws JRException {
int availableStretch = this.columnFooterOffsetY - this.offsetY - band.getHeight();
boolean overflow = (availableStretch < 0);
if (!overflow) {
band.evaluate(evaluation);
JRPrintBand printBand = band.fill(availableStretch);
overflow = band.willOverflow();
if (overflow) {
band.rewind();
} else {
fillBand(printBand);
this.offsetY += printBand.getHeight();
resolveBandBoundElements(band, evaluation);
}
}
return !overflow;
}
private void fillColumnHeaders(byte evaluation) throws JRException {
if (log.isDebugEnabled() && !this.columnHeader.isEmpty())
log.debug("Fill " + this.fillerId + ": column headers");
setNewPageColumnInBands();
for (this.columnIndex = 0; this.columnIndex < this.columnCount; this.columnIndex++) {
setColumnNumberVariable();
this.columnHeader.evaluatePrintWhenExpression(evaluation);
if (this.columnHeader.isToPrint()) {
int reattempts = getMasterColumnCount();
if (this.isCreatingNewPage)
reattempts--;
boolean fits = (this.columnHeader.getHeight() <= this.columnFooterOffsetY - this.offsetY);
for (int i = 0; !fits && i < reattempts; i++) {
fillPageFooter(evaluation);
resolveGroupBoundElements(evaluation, false);
resolveColumnBoundElements(evaluation);
resolvePageBoundElements(evaluation);
this.scriptlet.callBeforePageInit();
this.calculator.initializeVariables((byte)2);
this.scriptlet.callAfterPageInit();
addPage(false);
fillPageHeader(evaluation);
fits = (this.columnHeader.getHeight() <= this.columnFooterOffsetY - this.offsetY);
}
if (!fits)
throw new JRRuntimeException("Infinite loop creating new page due to column header size.");
this.offsetX = this.leftMargin + this.columnIndex * (this.columnSpacing + this.columnWidth);
this.offsetY = this.columnHeaderOffsetY;
fillFixedBand(this.columnHeader, evaluation, false);
}
}
setFirstColumn();
this.isNewColumn = true;
this.isFirstColumnBand = true;
}
private void fillGroupHeaders(boolean isFillAll) throws JRException {
if (this.groups != null && this.groups.length > 0)
for (int i = 0; i < this.groups.length; i++) {
if (isFillAll) {
fillGroupHeader(this.groups[i]);
} else if (this.groups[i].hasChanged()) {
fillGroupHeader(this.groups[i]);
}
}
}
private void fillGroupHeader(JRFillGroup group) throws JRException {
JRFillBand groupHeader = (JRFillBand)group.getGroupHeader();
if (log.isDebugEnabled() && !groupHeader.isEmpty())
log.debug("Fill " + this.fillerId + ": " + group.getName() + " header");
byte evalPrevPage = group.isTopLevelChange() ? 1 : 3;
if (((group.isStartNewPage() || group.isResetPageNumber()) && !this.isNewPage) || (group.isStartNewColumn() && !this.isNewColumn))
fillPageBreak(group.isResetPageNumber(), evalPrevPage, (byte)3, true);
groupHeader.evaluatePrintWhenExpression((byte)3);
if (groupHeader.isToPrint())
while (groupHeader.getHeight() > this.columnFooterOffsetY - this.offsetY || group.getMinHeightToStartNewPage() > this.columnFooterOffsetY - this.offsetY)
fillPageBreak(false, evalPrevPage, (byte)3, true);
setNewGroupInBands(group);
group.setFooterPrinted(false);
if (groupHeader.isToPrint()) {
setFirstColumn();
fillColumnBand(groupHeader, (byte)3);
}
group.setHeaderPrinted(true);
this.isNewGroup = true;
this.isFirstPageBand = false;
}
private void fillGroupHeadersReprint(byte evaluation) throws JRException {
if (this.groups != null && this.groups.length > 0)
for (int i = 0; i < this.groups.length; i++)
fillGroupHeaderReprint(this.groups[i], evaluation);
}
private void fillGroupHeaderReprint(JRFillGroup group, byte evaluation) throws JRException {
if (group.isReprintHeaderOnEachPage() && (!group.hasChanged() || (group.hasChanged() && group.isHeaderPrinted()))) {
JRFillBand groupHeader = (JRFillBand)group.getGroupHeader();
groupHeader.evaluatePrintWhenExpression(evaluation);
if (groupHeader.isToPrint()) {
setFirstColumn();
while (groupHeader.getHeight() > this.columnFooterOffsetY - this.offsetY || group.getMinHeightToStartNewPage() > this.columnFooterOffsetY - this.offsetY)
fillPageBreak(false, evaluation, evaluation, true);
fillColumnBand(groupHeader, evaluation);
}
this.isFirstPageBand = false;
}
}
private void fillDetail() throws JRException {
if (log.isDebugEnabled() && !this.detail.isEmpty())
log.debug("Fill " + this.fillerId + ": detail");
if (!this.detail.isPrintWhenExpressionNull()) {
this.calculator.estimateVariables();
this.detail.evaluatePrintWhenExpression((byte)2);
}
if (this.detail.isToPrint())
while ((this.columnIndex == this.columnCount - 1 || this.isNewGroup) && this.detail.getHeight() > this.columnFooterOffsetY - this.offsetY) {
byte evalPrevPage = this.isNewGroup ? 3 : 1;
fillPageBreak(false, evalPrevPage, (byte)3, true);
}
this.scriptlet.callBeforeDetailEval();
this.calculator.calculateVariables();
this.scriptlet.callAfterDetailEval();
if (!this.detail.isPrintWhenExpressionNull())
this.detail.evaluatePrintWhenExpression((byte)3);
if (this.detail.isToPrint()) {
if (this.offsetX == this.lastDetailOffsetX && this.offsetY == this.lastDetailOffsetY)
if (this.columnIndex == this.columnCount - 1) {
setFirstColumn();
} else {
this.columnIndex++;
this.offsetX += this.columnWidth + this.columnSpacing;
this.offsetY -= this.detail.getHeight();
setColumnNumberVariable();
}
fillFixedBand(this.detail, (byte)3, false);
this.lastDetailOffsetX = this.offsetX;
this.lastDetailOffsetY = this.offsetY;
}
this.isNewPage = false;
this.isNewColumn = false;
this.isNewGroup = false;
this.isFirstPageBand = false;
this.isFirstColumnBand = false;
}
private void fillGroupFooters(boolean isFillAll) throws JRException {
if (this.groups != null && this.groups.length > 0) {
byte evaluation = isFillAll ? 3 : 1;
for (int i = this.groups.length - 1; i >= 0; i--) {
if (isFillAll) {
fillGroupFooter(this.groups[i], evaluation);
} else if (this.groups[i].hasChanged()) {
fillGroupFooter(this.groups[i], evaluation);
}
}
}
}
private void fillGroupFooter(JRFillGroup group, byte evaluation) throws JRException {
JRFillBand groupFooter = (JRFillBand)group.getGroupFooter();
if (log.isDebugEnabled() && !groupFooter.isEmpty())
log.debug("Fill " + this.fillerId + ": " + group.getName() + " footer");
groupFooter.evaluatePrintWhenExpression(evaluation);
if (groupFooter.isToPrint()) {
setFirstColumn();
if (groupFooter.getHeight() > this.columnFooterOffsetY - this.offsetY)
fillPageBreak(false, evaluation, evaluation, true);
fillColumnBand(groupFooter, evaluation);
}
this.isNewPage = false;
this.isNewColumn = false;
this.isFirstPageBand = false;
this.isFirstColumnBand = false;
group.setHeaderPrinted(false);
group.setFooterPrinted(true);
}
private void fillColumnFooters(byte evaluation) throws JRException {
if (log.isDebugEnabled() && !this.columnFooter.isEmpty())
log.debug("Fill " + this.fillerId + ": column footers");
if (isSubreport())
this.columnFooterOffsetY = this.offsetY;
int tmpColumnFooterOffsetY = this.columnFooterOffsetY;
if (this.isFloatColumnFooter || this.fillContext.isIgnorePagination())
tmpColumnFooterOffsetY = this.offsetY;
for (this.columnIndex = 0; this.columnIndex < this.columnCount; this.columnIndex++) {
setColumnNumberVariable();
this.offsetX = this.leftMargin + this.columnIndex * (this.columnSpacing + this.columnWidth);
this.offsetY = tmpColumnFooterOffsetY;
this.columnFooter.evaluatePrintWhenExpression(evaluation);
if (this.columnFooter.isToPrint())
fillFixedBand(this.columnFooter, evaluation, false);
}
}
private void fillPageFooter(byte evaluation) throws JRException {
JRFillBand crtPageFooter = getCurrentPageFooter();
if (log.isDebugEnabled() && !crtPageFooter.isEmpty())
log.debug("Fill " + this.fillerId + ": " + (this.isLastPageFooter ? "last " : "") + "page footer");
this.offsetX = this.leftMargin;
if (!isSubreport() && !this.fillContext.isIgnorePagination())
this.offsetY = this.pageHeight - crtPageFooter.getHeight() - this.bottomMargin;
crtPageFooter.evaluatePrintWhenExpression(evaluation);
if (crtPageFooter.isToPrint())
fillFixedBand(crtPageFooter, evaluation);
}
private void fillSummary() throws JRException {
if (log.isDebugEnabled() && !this.summary.isEmpty())
log.debug("Fill " + this.fillerId + ": summary");
this.offsetX = this.leftMargin;
if (this.lastPageFooter == this.missingFillBand) {
if (!this.isSummaryNewPage && this.summary.getHeight() <= this.columnFooterOffsetY - this.offsetY) {
fillSummarySamePage();
} else {
fillSummaryNewPage();
}
} else if (!this.isSummaryNewPage && this.summary.getHeight() <= this.lastPageColumnFooterOffsetY - this.offsetY) {
setLastPageFooter(true);
fillSummarySamePage();
} else if (!this.isSummaryNewPage && this.summary.getHeight() <= this.columnFooterOffsetY - this.offsetY) {
fillSummarySamePageMixedFooters();
} else if (this.offsetY <= this.lastPageColumnFooterOffsetY) {
setLastPageFooter(true);
fillSummaryNewPage();
} else {
fillPageBreak(false, (byte)3, (byte)3, false);
setLastPageFooter(true);
if (this.isSummaryNewPage) {
fillSummaryNewPage();
} else {
fillSummarySamePage();
}
}
resolveGroupBoundElements((byte)3, true);
resolveColumnBoundElements((byte)3);
resolvePageBoundElements((byte)3);
resolveReportBoundElements();
}
private void fillSummarySamePage() throws JRException {
this.summary.evaluatePrintWhenExpression((byte)3);
if (this.summary != this.missingFillBand && this.summary.isToPrint()) {
this.summary.evaluate((byte)3);
JRPrintBand printBand = this.summary.fill(this.columnFooterOffsetY - this.offsetY - this.summary.getHeight());
if (this.summary.willOverflow() && !this.summary.isSplitAllowed()) {
fillColumnFooters((byte)3);
fillPageFooter((byte)3);
resolveGroupBoundElements((byte)3, true);
resolveColumnBoundElements((byte)3);
resolvePageBoundElements((byte)3);
this.scriptlet.callBeforePageInit();
this.calculator.initializeVariables((byte)2);
this.scriptlet.callAfterPageInit();
addPage(false);
printBand = this.summary.refill(this.pageHeight - this.bottomMargin - this.offsetY - this.summary.getHeight());
fillBand(printBand);
this.offsetY += printBand.getHeight();
} else {
fillBand(printBand);
this.offsetY += printBand.getHeight();
fillColumnFooters((byte)3);
fillPageFooter((byte)3);
}
while (this.summary.willOverflow()) {
resolveGroupBoundElements((byte)3, true);
resolveColumnBoundElements((byte)3);
resolvePageBoundElements((byte)3);
this.scriptlet.callBeforePageInit();
this.calculator.initializeVariables((byte)2);
this.scriptlet.callAfterPageInit();
addPage(false);
printBand = this.summary.fill(this.pageHeight - this.bottomMargin - this.offsetY - this.summary.getHeight());
fillBand(printBand);
this.offsetY += printBand.getHeight();
}
resolveBandBoundElements(this.summary, (byte)3);
} else {
fillColumnFooters((byte)3);
fillPageFooter((byte)3);
}
}
private void fillSummarySamePageMixedFooters() throws JRException {
this.summary.evaluatePrintWhenExpression((byte)3);
if (this.summary != this.missingFillBand && this.summary.isToPrint()) {
this.summary.evaluate((byte)3);
JRPrintBand printBand = this.summary.fill(this.columnFooterOffsetY - this.offsetY - this.summary.getHeight());
if (this.summary.willOverflow() && !this.summary.isSplitAllowed()) {
if (this.offsetY <= this.lastPageColumnFooterOffsetY) {
setLastPageFooter(true);
fillColumnFooters((byte)3);
fillPageFooter((byte)3);
resolveGroupBoundElements((byte)3, true);
resolveColumnBoundElements((byte)3);
resolvePageBoundElements((byte)3);
this.scriptlet.callBeforePageInit();
this.calculator.initializeVariables((byte)2);
this.scriptlet.callAfterPageInit();
addPage(false);
printBand = this.summary.refill(this.pageHeight - this.bottomMargin - this.offsetY - this.summary.getHeight());
fillBand(printBand);
this.offsetY += printBand.getHeight();
} else {
fillPageBreak(false, (byte)3, (byte)3, false);
setLastPageFooter(true);
printBand = this.summary.refill(this.lastPageColumnFooterOffsetY - this.offsetY - this.summary.getHeight());
fillBand(printBand);
this.offsetY += printBand.getHeight();
fillColumnFooters((byte)3);
fillPageFooter((byte)3);
}
} else {
fillBand(printBand);
this.offsetY += printBand.getHeight();
fillPageBreak(false, (byte)3, (byte)3, false);
setLastPageFooter(true);
if (this.summary.willOverflow()) {
printBand = this.summary.fill(this.lastPageColumnFooterOffsetY - this.offsetY - this.summary.getHeight());
fillBand(printBand);
this.offsetY += printBand.getHeight();
}
fillColumnFooters((byte)3);
fillPageFooter((byte)3);
}
while (this.summary.willOverflow()) {
resolveGroupBoundElements((byte)3, true);
resolveColumnBoundElements((byte)3);
resolvePageBoundElements((byte)3);
this.scriptlet.callBeforePageInit();
this.calculator.initializeVariables((byte)2);
this.scriptlet.callAfterPageInit();
addPage(false);
printBand = this.summary.fill(this.pageHeight - this.bottomMargin - this.offsetY - this.summary.getHeight());
fillBand(printBand);
this.offsetY += printBand.getHeight();
}
resolveBandBoundElements(this.summary, (byte)3);
} else {
if (this.offsetY > this.lastPageColumnFooterOffsetY)
fillPageBreak(false, (byte)3, (byte)3, false);
setLastPageFooter(true);
fillColumnFooters((byte)3);
fillPageFooter((byte)3);
}
}
private void fillSummaryNewPage() throws JRException {
fillColumnFooters((byte)3);
fillPageFooter((byte)3);
this.summary.evaluatePrintWhenExpression((byte)3);
if (this.summary != this.missingFillBand && this.summary.isToPrint()) {
resolveGroupBoundElements((byte)3, true);
resolveColumnBoundElements((byte)3);
resolvePageBoundElements((byte)3);
this.scriptlet.callBeforePageInit();
this.calculator.initializeVariables((byte)2);
this.scriptlet.callAfterPageInit();
addPage(false);
this.columnIndex = -1;
this.summary.evaluate((byte)3);
JRPrintBand printBand = this.summary.fill(this.pageHeight - this.bottomMargin - this.offsetY - this.summary.getHeight());
if (this.summary.willOverflow() && !this.summary.isSplitAllowed() && isSubreport()) {
resolveGroupBoundElements((byte)3, true);
resolveColumnBoundElements((byte)3);
resolvePageBoundElements((byte)3);
this.scriptlet.callBeforePageInit();
this.calculator.initializeVariables((byte)2);
this.scriptlet.callAfterPageInit();
addPage(false);
printBand = this.summary.refill(this.pageHeight - this.bottomMargin - this.offsetY - this.summary.getHeight());
}
fillBand(printBand);
this.offsetY += printBand.getHeight();
while (this.summary.willOverflow()) {
resolveGroupBoundElements((byte)3, true);
resolveColumnBoundElements((byte)3);
resolvePageBoundElements((byte)3);
this.scriptlet.callBeforePageInit();
this.calculator.initializeVariables((byte)2);
this.scriptlet.callAfterPageInit();
addPage(false);
printBand = this.summary.fill(this.pageHeight - this.bottomMargin - this.offsetY - this.summary.getHeight());
fillBand(printBand);
this.offsetY += printBand.getHeight();
}
resolveBandBoundElements(this.summary, (byte)3);
}
}
private void fillBackground() throws JRException {
if (log.isDebugEnabled() && !this.background.isEmpty())
log.debug("Fill " + this.fillerId + ": background");
if (this.background.getHeight() <= this.pageHeight - this.bottomMargin - this.offsetY) {
this.background.evaluatePrintWhenExpression((byte)3);
if (this.background.isToPrint()) {
this.background.evaluate((byte)3);
JRPrintBand printBand = this.background.fill(this.pageHeight - this.bottomMargin - this.offsetY - this.background.getHeight());
fillBand(printBand);
}
}
}
private void addPage(boolean isResetPageNumber) throws JRException {
if (isSubreport()) {
if (!this.parentFiller.isBandOverFlowAllowed())
throw new JRRuntimeException("Subreport overflowed on a band that does not support overflow.");
this.printPageStretchHeight = this.offsetY + this.bottomMargin;
if (this.fillContext.isUsingVirtualizer())
removePageIdentityDataProvider();
suspendSubreportRunner();
}
this.printPage = newPage();
if (isSubreport() && this.fillContext.isUsingVirtualizer())
addPageIdentityDataProvider();
if (isResetPageNumber) {
this.calculator.getPageNumber().setValue(new Integer(1));
} else {
this.calculator.getPageNumber().setValue(new Integer(((Number)this.calculator.getPageNumber().getValue()).intValue() + 1));
}
this.calculator.getPageNumber().setOldValue(this.calculator.getPageNumber().getValue());
addPage(this.printPage);
setFirstColumn();
this.offsetY = this.topMargin;
this.lastDetailOffsetX = -1;
this.lastDetailOffsetY = -1;
fillBackground();
}
private void setColumnNumberVariable() {
JRFillVariable columnNumberVar = this.calculator.getColumnNumber();
columnNumberVar.setValue(new Integer(this.columnIndex + 1));
columnNumberVar.setOldValue(columnNumberVar.getValue());
}
private void fillPageBreak(boolean isResetPageNumber, byte evalPrevPage, byte evalNextPage, boolean isReprintGroupHeaders) throws JRException {
if (this.isCreatingNewPage)
throw new JRException("Infinite loop creating new page.");
this.isCreatingNewPage = true;
fillColumnFooters(evalPrevPage);
fillPageFooter(evalPrevPage);
resolveGroupBoundElements(evalPrevPage, false);
resolveColumnBoundElements(evalPrevPage);
resolvePageBoundElements(evalPrevPage);
this.scriptlet.callBeforePageInit();
this.calculator.initializeVariables((byte)2);
this.scriptlet.callAfterPageInit();
addPage(isResetPageNumber);
fillPageHeader(evalNextPage);
fillColumnHeaders(evalNextPage);
if (isReprintGroupHeaders)
fillGroupHeadersReprint(evalNextPage);
this.isCreatingNewPage = false;
}
protected void fillPageBand(JRFillBand band, byte evaluation) throws JRException {
band.evaluate(evaluation);
JRPrintBand printBand = band.fill(this.columnFooterOffsetY - this.offsetY - band.getHeight());
if (band.willOverflow() && !band.isSplitAllowed()) {
fillPageBreak(false, evaluation, evaluation, true);
printBand = band.refill(this.columnFooterOffsetY - this.offsetY - band.getHeight());
}
fillBand(printBand);
this.offsetY += printBand.getHeight();
while (band.willOverflow()) {
fillPageBreak(false, evaluation, evaluation, true);
printBand = band.fill(this.columnFooterOffsetY - this.offsetY - band.getHeight());
fillBand(printBand);
this.offsetY += printBand.getHeight();
}
resolveBandBoundElements(band, evaluation);
}
protected void fillColumnBand(JRFillBand band, byte evaluation) throws JRException {
band.evaluate(evaluation);
JRPrintBand printBand = band.fill(this.columnFooterOffsetY - this.offsetY - band.getHeight());
if (band.willOverflow() && !band.isSplitAllowed()) {
fillPageBreak(false, evaluation, evaluation, true);
printBand = band.refill(this.columnFooterOffsetY - this.offsetY - band.getHeight());
}
fillBand(printBand);
this.offsetY += printBand.getHeight();
while (band.willOverflow()) {
fillPageBreak(false, evaluation, evaluation, true);
printBand = band.fill(this.columnFooterOffsetY - this.offsetY - band.getHeight());
fillBand(printBand);
this.offsetY += printBand.getHeight();
}
resolveBandBoundElements(band, evaluation);
}
protected void fillFixedBand(JRFillBand band, byte evaluation) throws JRException {
fillFixedBand(band, evaluation, true);
}
protected void fillFixedBand(JRFillBand band, byte evaluation, boolean allowShrinking) throws JRException {
band.evaluate(evaluation);
JRPrintBand printBand = band.fill();
fillBand(printBand);
this.offsetY += allowShrinking ? printBand.getHeight() : band.getHeight();
resolveBandBoundElements(band, evaluation);
}
protected void fillBand(JRPrintBand band) {
List elements = band.getElements();
if (elements != null && elements.size() > 0) {
JRPrintElement element = null;
for (Iterator it = elements.iterator(); it.hasNext(); ) {
element = it.next();
element.setX(element.getX() + this.offsetX);
element.setY(element.getY() + this.offsetY);
this.printPage.addElement(element);
}
}
}
private void setNewPageColumnInBands() {
this.title.setNewPageColumn(true);
this.pageHeader.setNewPageColumn(true);
this.columnHeader.setNewPageColumn(true);
this.detail.setNewPageColumn(true);
this.columnFooter.setNewPageColumn(true);
this.pageFooter.setNewPageColumn(true);
this.lastPageFooter.setNewPageColumn(true);
this.summary.setNewPageColumn(true);
this.noData.setNewPageColumn(true);
if (this.groups != null && this.groups.length > 0)
for (int i = 0; i < this.groups.length; i++) {
((JRFillBand)this.groups[i].getGroupHeader()).setNewPageColumn(true);
((JRFillBand)this.groups[i].getGroupFooter()).setNewPageColumn(true);
}
}
private void setNewGroupInBands(JRGroup group) {
this.title.setNewGroup(group, true);
this.pageHeader.setNewGroup(group, true);
this.columnHeader.setNewGroup(group, true);
this.detail.setNewGroup(group, true);
this.columnFooter.setNewGroup(group, true);
this.pageFooter.setNewGroup(group, true);
this.lastPageFooter.setNewGroup(group, true);
this.summary.setNewGroup(group, true);
if (this.groups != null && this.groups.length > 0)
for (int i = 0; i < this.groups.length; i++) {
((JRFillBand)this.groups[i].getGroupHeader()).setNewGroup(group, true);
((JRFillBand)this.groups[i].getGroupFooter()).setNewGroup(group, true);
}
}
private JRFillBand getCurrentPageFooter() {
return this.isLastPageFooter ? this.lastPageFooter : this.pageFooter;
}
private void setLastPageFooter(boolean isLastPageFooter) {
this.isLastPageFooter = isLastPageFooter;
if (isLastPageFooter)
this.columnFooterOffsetY = this.lastPageColumnFooterOffsetY;
}
private void fillNoData() throws JRException {
if (log.isDebugEnabled() && !this.noData.isEmpty())
log.debug("Fill " + this.fillerId + ": noData");
this.noData.evaluatePrintWhenExpression((byte)3);
if (this.noData.isToPrint()) {
while (this.noData.getHeight() > this.pageHeight - this.bottomMargin - this.offsetY)
addPage(false);
this.noData.evaluate((byte)3);
JRPrintBand printBand = this.noData.fill(this.pageHeight - this.bottomMargin - this.offsetY - this.noData.getHeight());
if (this.noData.willOverflow() && !this.noData.isSplitAllowed() && isSubreport()) {
resolveGroupBoundElements((byte)3, false);
resolveColumnBoundElements((byte)3);
resolvePageBoundElements((byte)3);
this.scriptlet.callBeforePageInit();
this.calculator.initializeVariables((byte)2);
this.scriptlet.callAfterPageInit();
addPage(false);
printBand = this.noData.refill(this.pageHeight - this.bottomMargin - this.offsetY - this.noData.getHeight());
}
fillBand(printBand);
this.offsetY += printBand.getHeight();
while (this.noData.willOverflow()) {
resolveGroupBoundElements((byte)3, false);
resolveColumnBoundElements((byte)3);
resolvePageBoundElements((byte)3);
this.scriptlet.callBeforePageInit();
this.calculator.initializeVariables((byte)2);
this.scriptlet.callAfterPageInit();
addPage(false);
printBand = this.noData.fill(this.pageHeight - this.bottomMargin - this.offsetY - this.noData.getHeight());
fillBand(printBand);
this.offsetY += printBand.getHeight();
}
resolveBandBoundElements(this.noData, (byte)3);
}
}
}