001: /**
002: * ===========================================
003: * JFreeReport : a free Java reporting library
004: * ===========================================
005: *
006: * Project Info: http://reporting.pentaho.org/
007: *
008: * (C) Copyright 2001-2007, by Object Refinery Ltd, Pentaho Corporation and Contributors.
009: *
010: * This library is free software; you can redistribute it and/or modify it under the terms
011: * of the GNU Lesser General Public License as published by the Free Software Foundation;
012: * either version 2.1 of the License, or (at your option) any later version.
013: *
014: * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
015: * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
016: * See the GNU Lesser General Public License for more details.
017: *
018: * You should have received a copy of the GNU Lesser General Public License along with this
019: * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
020: * Boston, MA 02111-1307, USA.
021: *
022: * [Java is a trademark or registered trademark of Sun Microsystems, Inc.
023: * in the United States and other countries.]
024: *
025: * ------------
026: * CacheBoxShifter.java
027: * ------------
028: * (C) Copyright 2001-2007, by Object Refinery Ltd, Pentaho Corporation and Contributors.
029: */package org.jfree.report.layout.process;
030:
031: import org.jfree.report.layout.model.RenderBox;
032: import org.jfree.report.layout.model.RenderNode;
033:
034: /**
035: * By keeping the shifting in a separate class, we can optimize it later without having to touch the other code.
036: * Remember: Recursive calls can be evil in complex documents..
037: *
038: * @author Thomas Morgner
039: */
040: public final class CacheBoxShifter {
041: private CacheBoxShifter() {
042: }
043:
044: public static void shiftBox(final RenderNode box, final long amount) {
045: if (amount == 0) {
046: return;
047: }
048: if (amount < 0) {
049: throw new IllegalArgumentException("Cannot shift upwards: "
050: + amount);
051: }
052:
053: box.shiftCached(amount);
054: if (box instanceof RenderBox) {
055: CacheBoxShifter.shiftBoxInternal((RenderBox) box, amount);
056: }
057: }
058:
059: public static void shiftBoxUnchecked(final RenderNode box,
060: final long amount) {
061: if (amount == 0) {
062: return;
063: }
064:
065: box.shiftCached(amount);
066: if (box instanceof RenderBox) {
067: CacheBoxShifter.shiftBoxInternal((RenderBox) box, amount);
068: }
069: }
070:
071: public static void shiftBoxChilds(final RenderBox box,
072: final long amount) {
073: if (amount == 0) {
074: return;
075: }
076: CacheBoxShifter.shiftBoxInternal(box, amount);
077: }
078:
079: private static void shiftBoxInternal(final RenderBox box,
080: final long amount) {
081: RenderNode node = box.getFirstChild();
082: while (node != null) {
083: node.shiftCached(amount);
084: if (node instanceof RenderBox) {
085: CacheBoxShifter.shiftBoxInternal((RenderBox) node,
086: amount);
087: }
088: node = node.getNext();
089: }
090: }
091:
092: public static void extendHeight(final RenderNode node,
093: final long amount) {
094: if (amount < 0) {
095: throw new IllegalArgumentException(
096: "Cannot shrink elements.");
097: }
098: if (node == null || amount == 0) {
099: return;
100: }
101:
102: node.setCachedHeight(node.getCachedHeight() + amount);
103:
104: RenderBox parent = node.getParent();
105: while (parent != null) {
106: parent.setCachedHeight(parent.getCachedHeight() + amount);
107: parent = parent.getParent();
108: }
109: }
110: }
|