232 lines
7.1 KiB
Java
232 lines
7.1 KiB
Java
package net.sf.jasperreports.engine.fill;
|
|
|
|
import java.util.HashMap;
|
|
import java.util.HashSet;
|
|
import java.util.Iterator;
|
|
import java.util.Map;
|
|
import java.util.Set;
|
|
import net.sf.jasperreports.engine.JRBand;
|
|
import net.sf.jasperreports.engine.JRElementGroup;
|
|
import net.sf.jasperreports.engine.JRException;
|
|
import net.sf.jasperreports.engine.JRExpression;
|
|
import net.sf.jasperreports.engine.JRGroup;
|
|
import net.sf.jasperreports.engine.JROrigin;
|
|
import org.apache.commons.logging.Log;
|
|
import org.apache.commons.logging.LogFactory;
|
|
|
|
public class JRFillBand extends JRFillElementContainer implements JRBand {
|
|
private static final Log log = LogFactory.getLog(JRFillBand.class);
|
|
|
|
private JRBand parent = null;
|
|
|
|
private boolean isPrintWhenTrue = true;
|
|
|
|
private boolean isNewPageColumn = false;
|
|
|
|
private boolean isFirstWholeOnPageColumn = false;
|
|
|
|
private Map isNewGroupMap = new HashMap();
|
|
|
|
private Set nowEvaluationTimes;
|
|
|
|
private Map savedVariableValues = new HashMap();
|
|
|
|
protected JROrigin origin = null;
|
|
|
|
protected JRFillBand(JRBaseFiller filler, JRBand band, JRFillObjectFactory factory) {
|
|
super(filler, (JRElementGroup)band, factory);
|
|
this.parent = band;
|
|
if (this.deepElements.length > 0)
|
|
for (int i = 0; i < this.deepElements.length; i++)
|
|
this.deepElements[i].setBand(this);
|
|
initElements();
|
|
initConditionalStyles();
|
|
this.nowEvaluationTimes = new HashSet();
|
|
}
|
|
|
|
protected JROrigin getOrigin() {
|
|
return this.origin;
|
|
}
|
|
|
|
protected void setOrigin(JROrigin origin) {
|
|
this.origin = origin;
|
|
this.filler.getJasperPrint().addOrigin(origin);
|
|
}
|
|
|
|
protected void setNewPageColumn(boolean isNew) {
|
|
this.isNewPageColumn = isNew;
|
|
}
|
|
|
|
protected boolean isNewPageColumn() {
|
|
return this.isNewPageColumn;
|
|
}
|
|
|
|
protected boolean isFirstWholeOnPageColumn() {
|
|
return this.isFirstWholeOnPageColumn;
|
|
}
|
|
|
|
protected void setNewGroup(JRGroup group, boolean isNew) {
|
|
this.isNewGroupMap.put(group, isNew ? Boolean.TRUE : Boolean.FALSE);
|
|
}
|
|
|
|
protected boolean isNewGroup(JRGroup group) {
|
|
Boolean value = (Boolean)this.isNewGroupMap.get(group);
|
|
if (value == null)
|
|
value = Boolean.FALSE;
|
|
return value.booleanValue();
|
|
}
|
|
|
|
public int getHeight() {
|
|
return (this.parent != null) ? this.parent.getHeight() : 0;
|
|
}
|
|
|
|
public boolean isSplitAllowed() {
|
|
return this.parent.isSplitAllowed();
|
|
}
|
|
|
|
public void setSplitAllowed(boolean isSplitAllowed) {}
|
|
|
|
public JRExpression getPrintWhenExpression() {
|
|
return (this.parent != null) ? this.parent.getPrintWhenExpression() : null;
|
|
}
|
|
|
|
protected boolean isPrintWhenExpressionNull() {
|
|
return (getPrintWhenExpression() == null);
|
|
}
|
|
|
|
protected boolean isPrintWhenTrue() {
|
|
return this.isPrintWhenTrue;
|
|
}
|
|
|
|
protected void setPrintWhenTrue(boolean isPrintWhenTrue) {
|
|
this.isPrintWhenTrue = isPrintWhenTrue;
|
|
}
|
|
|
|
protected boolean isToPrint() {
|
|
return (isPrintWhenExpressionNull() || (!isPrintWhenExpressionNull() && isPrintWhenTrue()));
|
|
}
|
|
|
|
protected void evaluatePrintWhenExpression(byte evaluation) throws JRException {
|
|
boolean isPrintTrue = false;
|
|
JRExpression expression = getPrintWhenExpression();
|
|
if (expression != null) {
|
|
Boolean printWhenExpressionValue = (Boolean)this.filler.evaluateExpression(expression, evaluation);
|
|
if (printWhenExpressionValue == null) {
|
|
isPrintTrue = false;
|
|
} else {
|
|
isPrintTrue = printWhenExpressionValue.booleanValue();
|
|
}
|
|
}
|
|
setPrintWhenTrue(isPrintTrue);
|
|
}
|
|
|
|
protected JRPrintBand refill(int availableStretchHeight) throws JRException {
|
|
rewind();
|
|
restoreSavedVariables();
|
|
return fill(availableStretchHeight);
|
|
}
|
|
|
|
protected JRPrintBand fill() throws JRException {
|
|
return fill(0, false);
|
|
}
|
|
|
|
protected JRPrintBand fill(int availableStretchHeight) throws JRException {
|
|
return fill(availableStretchHeight, true);
|
|
}
|
|
|
|
protected JRPrintBand fill(int availableStretchHeight, boolean isOverflowAllowed) throws JRException {
|
|
this.filler.fillContext.ensureMasterPageAvailable();
|
|
if (Thread.currentThread().isInterrupted() || this.filler.isInterrupted()) {
|
|
if (log.isDebugEnabled())
|
|
log.debug("Fill " + this.filler.fillerId + ": interrupted");
|
|
this.filler.setInterrupted(true);
|
|
throw new JRFillInterruptedException();
|
|
}
|
|
this.filler.setBandOverFlowAllowed(isOverflowAllowed);
|
|
initFill();
|
|
if (this.isNewPageColumn && !this.isOverflow)
|
|
this.isFirstWholeOnPageColumn = true;
|
|
resetElements();
|
|
prepareElements(availableStretchHeight, isOverflowAllowed);
|
|
stretchElements();
|
|
moveBandBottomElements();
|
|
removeBlankElements();
|
|
this.isFirstWholeOnPageColumn = (this.isNewPageColumn && this.isOverflow);
|
|
this.isNewPageColumn = false;
|
|
this.isNewGroupMap = new HashMap();
|
|
JRPrintBand printBand = new JRPrintBand();
|
|
fillElements(printBand);
|
|
return printBand;
|
|
}
|
|
|
|
protected int getContainerHeight() {
|
|
return getHeight();
|
|
}
|
|
|
|
protected boolean isVariableUsedInSubreportReturns(String variableName) {
|
|
boolean used = false;
|
|
if (this.deepElements != null)
|
|
for (int i = 0; i < this.deepElements.length; i++) {
|
|
JRFillElement element = this.deepElements[i];
|
|
if (element instanceof JRFillSubreport) {
|
|
JRFillSubreport subreport = (JRFillSubreport)element;
|
|
if (subreport.usesForReturnValue(variableName)) {
|
|
used = true;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
return used;
|
|
}
|
|
|
|
protected void addNowEvaluationTime(JREvaluationTime evaluationTime) {
|
|
this.nowEvaluationTimes.add(evaluationTime);
|
|
}
|
|
|
|
protected void addNowEvaluationTimes(JREvaluationTime[] evaluationTimes) {
|
|
for (int i = 0; i < evaluationTimes.length; i++)
|
|
this.nowEvaluationTimes.add(evaluationTimes[i]);
|
|
}
|
|
|
|
protected boolean isNowEvaluationTime(JREvaluationTime evaluationTime) {
|
|
return this.nowEvaluationTimes.contains(evaluationTime);
|
|
}
|
|
|
|
protected int getId() {
|
|
return System.identityHashCode(this);
|
|
}
|
|
|
|
protected void evaluate(byte evaluation) throws JRException {
|
|
resetSavedVariables();
|
|
evaluateConditionalStyles(evaluation);
|
|
super.evaluate(evaluation);
|
|
}
|
|
|
|
protected void resetSavedVariables() {
|
|
this.savedVariableValues.clear();
|
|
}
|
|
|
|
protected void saveVariable(String variableName) {
|
|
if (!this.savedVariableValues.containsKey(variableName)) {
|
|
Object value = this.filler.getVariableValue(variableName);
|
|
this.savedVariableValues.put(variableName, value);
|
|
}
|
|
}
|
|
|
|
protected void restoreSavedVariables() {
|
|
for (Iterator it = this.savedVariableValues.entrySet().iterator(); it.hasNext(); ) {
|
|
Map.Entry entry = it.next();
|
|
String variableName = (String)entry.getKey();
|
|
Object value = entry.getValue();
|
|
JRFillVariable variable = this.filler.getVariable(variableName);
|
|
variable.setOldValue(value);
|
|
variable.setValue(value);
|
|
variable.setIncrementedValue(value);
|
|
}
|
|
}
|
|
|
|
protected boolean isEmpty() {
|
|
return (this == this.filler.missingFillBand || (getHeight() == 0 && (getElements() == null || (getElements()).length == 0) && getPrintWhenExpression() == null));
|
|
}
|
|
}
|