144 lines
5.2 KiB
Java
144 lines
5.2 KiB
Java
package net.sf.jasperreports.engine.fill;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.Arrays;
|
|
import java.util.List;
|
|
import net.sf.jasperreports.engine.JRChild;
|
|
import net.sf.jasperreports.engine.JRElement;
|
|
import net.sf.jasperreports.engine.JRElementGroup;
|
|
import net.sf.jasperreports.engine.JRVisitable;
|
|
import net.sf.jasperreports.engine.JRVisitor;
|
|
|
|
public class JRFillElementGroup implements JRElementGroup, JRFillCloneable {
|
|
protected List children = new ArrayList();
|
|
|
|
protected JRElementGroup elementGroup = null;
|
|
|
|
protected JRFillElement[] elements = null;
|
|
|
|
private JRElement topElementInGroup = null;
|
|
|
|
private JRElement bottomElementInGroup = null;
|
|
|
|
private int stretchHeightDiff = 0;
|
|
|
|
protected JRFillElementGroup(JRElementGroup elementGrp, JRFillObjectFactory factory) {
|
|
factory.put(elementGrp, this);
|
|
if (elementGrp != null) {
|
|
List list = elementGrp.getChildren();
|
|
if (list != null && list.size() > 0)
|
|
for (int i = 0; i < list.size(); i++) {
|
|
JRChild child = list.get(i);
|
|
child = (JRChild)factory.getVisitResult((JRVisitable)child);
|
|
this.children.add(child);
|
|
}
|
|
getElements();
|
|
this.elementGroup = (JRElementGroup)factory.getVisitResult((JRVisitable)elementGrp.getElementGroup());
|
|
}
|
|
}
|
|
|
|
protected JRFillElementGroup(JRFillElementGroup elementGrp, JRFillCloneFactory factory) {
|
|
factory.put(elementGrp, this);
|
|
List list = elementGrp.getChildren();
|
|
if (list != null)
|
|
for (int i = 0; i < list.size(); i++) {
|
|
JRFillCloneable child = list.get(i);
|
|
JRFillCloneable clone = child.createClone(factory);
|
|
this.children.add(clone);
|
|
}
|
|
getElements();
|
|
this.elementGroup = (JRFillElementGroup)factory.getClone((JRFillElementGroup)elementGrp.getElementGroup());
|
|
}
|
|
|
|
public List getChildren() {
|
|
return this.children;
|
|
}
|
|
|
|
public JRElementGroup getElementGroup() {
|
|
return this.elementGroup;
|
|
}
|
|
|
|
public JRElement[] getElements() {
|
|
if (this.elements == null)
|
|
if (this.children != null) {
|
|
List allElements = new ArrayList();
|
|
Object child = null;
|
|
JRElement[] childElementArray = null;
|
|
for (int i = 0; i < this.children.size(); i++) {
|
|
child = this.children.get(i);
|
|
if (child instanceof JRFillElement) {
|
|
allElements.add(child);
|
|
} else if (child instanceof JRFillElementGroup) {
|
|
childElementArray = ((JRFillElementGroup)child).getElements();
|
|
if (childElementArray != null)
|
|
allElements.addAll(Arrays.asList((Object[])childElementArray));
|
|
}
|
|
}
|
|
this.elements = new JRFillElement[allElements.size()];
|
|
allElements.toArray(this.elements);
|
|
}
|
|
return (JRElement[])this.elements;
|
|
}
|
|
|
|
public JRElement getElementByKey(String key) {
|
|
return null;
|
|
}
|
|
|
|
protected void reset() {
|
|
this.topElementInGroup = null;
|
|
}
|
|
|
|
protected int getStretchHeightDiff() {
|
|
if (this.topElementInGroup == null) {
|
|
this.stretchHeightDiff = 0;
|
|
setTopBottomElements();
|
|
JRElement[] allElements = getElements();
|
|
if (allElements != null && allElements.length > 0) {
|
|
JRFillElement topElem = null;
|
|
JRFillElement bottomElem = null;
|
|
for (int i = 0; i < allElements.length; i++) {
|
|
JRFillElement element = (JRFillElement)allElements[i];
|
|
if (element.isToPrint()) {
|
|
if (topElem == null || (topElem != null && element.getRelativeY() + element.getStretchHeight() < topElem.getRelativeY() + topElem.getStretchHeight()))
|
|
topElem = element;
|
|
if (bottomElem == null || (bottomElem != null && element.getRelativeY() + element.getStretchHeight() > bottomElem.getRelativeY() + bottomElem.getStretchHeight()))
|
|
bottomElem = element;
|
|
}
|
|
}
|
|
if (topElem != null)
|
|
this.stretchHeightDiff = bottomElem.getRelativeY() + bottomElem.getStretchHeight() - topElem.getRelativeY() - this.bottomElementInGroup.getY() + this.bottomElementInGroup.getHeight() - this.topElementInGroup.getY();
|
|
if (this.stretchHeightDiff < 0)
|
|
this.stretchHeightDiff = 0;
|
|
}
|
|
}
|
|
return this.stretchHeightDiff;
|
|
}
|
|
|
|
private void setTopBottomElements() {
|
|
JRElement[] allElements = getElements();
|
|
if (allElements != null && allElements.length > 0)
|
|
for (int i = 0; i < allElements.length; i++) {
|
|
if (this.topElementInGroup == null || (this.topElementInGroup != null && allElements[i].getY() + allElements[i].getHeight() < this.topElementInGroup.getY() + this.topElementInGroup.getHeight()))
|
|
this.topElementInGroup = allElements[i];
|
|
if (this.bottomElementInGroup == null || (this.bottomElementInGroup != null && allElements[i].getY() + allElements[i].getHeight() > this.bottomElementInGroup.getY() + this.bottomElementInGroup.getHeight()))
|
|
this.bottomElementInGroup = allElements[i];
|
|
}
|
|
}
|
|
|
|
public void visit(JRVisitor visitor) {
|
|
visitor.visitElementGroup(this);
|
|
}
|
|
|
|
public JRFillCloneable createClone(JRFillCloneFactory factory) {
|
|
return new JRFillElementGroup(this, factory);
|
|
}
|
|
|
|
public Object clone() {
|
|
return null;
|
|
}
|
|
|
|
public Object clone(JRElementGroup parentGroup) {
|
|
return null;
|
|
}
|
|
}
|