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: * DefaultPageGrid.java
027: * ------------
028: * (C) Copyright 2001-2007, by Object Refinery Ltd, Pentaho Corporation and Contributors.
029: */package org.jfree.report.layout.model;
030:
031: import java.awt.geom.Rectangle2D;
032: import java.awt.print.PageFormat;
033: import java.util.Iterator;
034: import java.util.TreeSet;
035:
036: import org.jfree.report.PageDefinition;
037: import org.jfree.report.util.geom.StrictGeomUtility;
038:
039: /**
040: * Creation-Date: 05.04.2007, 16:15:32
041: *
042: * @author Thomas Morgner
043: */
044: public class DefaultPageGrid implements PageGrid {
045: private long[] horizontalBreaks;
046: private long[] verticalBreaks;
047: private long[] horizontalBreaksFull;
048: private long[] verticalBreaksFull;
049: private PageFormat[][] pageMapping;
050:
051: public DefaultPageGrid(final PageDefinition pageDefinition) {
052: final Rectangle2D[] pagePositions = pageDefinition
053: .getPagePositions();
054:
055: final TreeSet horizontalPositions = new TreeSet();
056: final TreeSet verticalPositions = new TreeSet();
057:
058: final int pagePosCount = pagePositions.length;
059: for (int i = 0; i < pagePosCount; i++) {
060: final Rectangle2D pagePosition = pagePositions[i];
061:
062: final double minX = pagePosition.getMinX();
063: final double maxX = pagePosition.getMaxX();
064: final double minY = pagePosition.getMinY();
065: final double maxY = pagePosition.getMaxY();
066:
067: if (minX == maxX || maxY == minY) {
068: throw new IllegalArgumentException(
069: "This page format is invalid, it has no imageable area.");
070: }
071: horizontalPositions.add(new Double(minX));
072: horizontalPositions.add(new Double(maxX));
073: verticalPositions.add(new Double(minY));
074: verticalPositions.add(new Double(maxY));
075: }
076:
077: horizontalBreaksFull = new long[horizontalPositions.size()];
078: int pos = 0;
079: for (Iterator iterator = horizontalPositions.iterator(); iterator
080: .hasNext();) {
081: final Double value = (Double) iterator.next();
082: horizontalBreaksFull[pos] = StrictGeomUtility
083: .toInternalValue(value.doubleValue());
084: pos += 1;
085: }
086:
087: verticalBreaksFull = new long[verticalPositions.size()];
088: pos = 0;
089: for (Iterator iterator = verticalPositions.iterator(); iterator
090: .hasNext();) {
091: final Double value = (Double) iterator.next();
092: verticalBreaksFull[pos] = StrictGeomUtility
093: .toInternalValue(value.doubleValue());
094: pos += 1;
095: }
096:
097: horizontalPositions.remove(new Double(0));
098: verticalPositions.remove(new Double(0));
099:
100: horizontalBreaks = new long[horizontalPositions.size()];
101: pos = 0;
102: for (Iterator iterator = horizontalPositions.iterator(); iterator
103: .hasNext();) {
104: final Double value = (Double) iterator.next();
105: horizontalBreaks[pos] = StrictGeomUtility
106: .toInternalValue(value.doubleValue());
107: pos += 1;
108: }
109:
110: verticalBreaks = new long[verticalPositions.size()];
111: pos = 0;
112: for (Iterator iterator = verticalPositions.iterator(); iterator
113: .hasNext();) {
114: final Double value = (Double) iterator.next();
115: verticalBreaks[pos] = StrictGeomUtility
116: .toInternalValue(value.doubleValue());
117: pos += 1;
118: }
119:
120: final int hbreakLength = horizontalBreaksFull.length;
121: final int vbreakLength = verticalBreaksFull.length;
122: pageMapping = new PageFormat[vbreakLength - 1][hbreakLength - 1];
123: for (int col = 0; col < hbreakLength; col++) {
124: final long xPosition = horizontalBreaksFull[col];
125: for (int row = 0; row < vbreakLength; row++) {
126: final long yPosition = verticalBreaksFull[row];
127: final int idx = findPageFormat(pagePositions,
128: xPosition, yPosition);
129: if (idx >= 0) {
130: pageMapping[row][col] = pageDefinition
131: .getPageFormat(idx);
132: }
133: }
134: }
135: }
136:
137: private int findPageFormat(final Rectangle2D[] positions,
138: final long xPosition, final long yPosition) {
139: final int posCount = positions.length;
140: for (int i = 0; i < posCount; i++) {
141: final Rectangle2D rect = positions[i];
142: if (StrictGeomUtility.toInternalValue(rect.getMinY()) == yPosition
143: && StrictGeomUtility
144: .toInternalValue(rect.getMinX()) == xPosition) {
145: return i;
146: }
147: }
148: return -1;
149: }
150:
151: /**
152: * In case of overlapping pageboxes, this method may return null.
153: *
154: * @param row
155: * @param col
156: * @return
157: */
158: public PhysicalPageBox getPage(final int row, final int col) {
159: final long offsetX = horizontalBreaksFull[col];
160: final long offsetY = verticalBreaksFull[row];
161:
162: final PageFormat format = pageMapping[row][col];
163: return new PhysicalPageBox(format, offsetX, offsetY);
164: }
165:
166: public long[] getHorizontalBreaks() {
167: return (long[]) horizontalBreaks.clone();
168: }
169:
170: public long[] getVerticalBreaks() {
171: return (long[]) verticalBreaks.clone();
172: }
173:
174: public int getRowCount() {
175: return verticalBreaks.length;
176: }
177:
178: public int getColumnCount() {
179: return horizontalBreaks.length;
180: }
181:
182: public Object clone() throws CloneNotSupportedException {
183: return super .clone();
184: }
185:
186: public long getMaximumPageWidth() {
187: return horizontalBreaks[horizontalBreaks.length - 1];
188: }
189:
190: public long getMaximumPageHeight() {
191: return verticalBreaks[verticalBreaks.length - 1];
192: }
193: }
|