/*
* Copyright (c) 2005 Matthew Hall and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Matthew Hall - initial API and implementation
*/
package org.eclipse.nebula.paperclips.core;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.nebula.paperclips.core.internal.util.Util;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
/**
* A composite PrintPiece for displaying child PrintPieces. This class is
* especially useful for Print implementations that perform layout of multiple
* child Prints.
*
* @author Matthew Hall
*/
public class CompositePiece implements PrintPiece {
private final Point size;
private final CompositeEntry[] entries;
/**
* Constructs a CompositePiece with the given entries.
*
* @param entries
* an array of entries that make up this PrintPiece.
*/
public CompositePiece(CompositeEntry[] entries) {
this(createList(entries));
}
/**
* Constructs a CompositePrintPiece with the given entries and explicit
* size. This constructor will increase the explicit size to completely
* contain any child entries which extend outside the given size.
*
* @param entries
* an array of entries that make up this PrintPiece.
* @param size
*/
public CompositePiece(CompositeEntry[] entries, Point size) {
this(createList(entries), size);
}
private static List createList(CompositeEntry[] entries) {
List result = new ArrayList();
for (int i = 0; i < entries.length; i++)
result.add(entries[i]);
return result;
}
/**
* Constructs a composite PrintPiece with the given entries.
*
* @param entries
* an array of entries that make up this PrintPiece.
*/
public CompositePiece(List entries) {
this(entries, new Point(0, 0));
}
/**
* Constructs a composite PrintPiece with the given entries and minimum
* size.
*
* @param entries
* a list of CompositeEntry objects describing the child
* PrintPieces.
* @param size
* a hint indicating the minimum size that should be reported
* from getSize(). This constructor increase this size to fit any
* entries that extend outside the given size.
*/
public CompositePiece(List entries, Point size) {
Util.noNulls(entries);
this.entries = (CompositeEntry[]) entries
.toArray(new CompositeEntry[entries.size()]);
this.size = new Point(size.x, size.y);
for (int i = 0; i < this.entries.length; i++) {
CompositeEntry entry = this.entries[i];
Point pieceSize = entry.piece.getSize();
this.size.x = Math.max(this.size.x, entry.offset.x + pieceSize.x);
this.size.y = Math.max(this.size.y, entry.offset.y + pieceSize.y);
}
}
public Point getSize() {
return new Point(size.x, size.y);
}
public void paint(GC gc, int x, int y) {
// SWT on OSX has problems with the clipping. A GC(Printer) always
// returns a clipping rectangle of
// [0,0,0,0] so that inhibits our ability to check each entry against
// the hit rectangle. In addition it
// appears that a GC(Image(Printer))'s clipping on OSX is not affected
// by the GC's transform, so that
// screws up the hit clip as well. For this reason we are no longer
// checking entries to see if they
// intersect the clipping region before drawing them.
for (int i = 0; i < entries.length; i++) {
CompositeEntry entry = entries[i];
entry.piece.paint(gc, x + entry.offset.x, y + entry.offset.y);
}
}
public void dispose() {
for (int i = 0; i < entries.length; i++)
entries[i].dispose();
}
}