/*
* 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 org.eclipse.nebula.paperclips.core.internal.piece.EmptyPiece;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Device;
import org.eclipse.swt.graphics.GC;
import org.eclipse.swt.graphics.Point;
/**
* A Print which displays nothing but takes up space. Useful for putting blank
* cells in a GridPrint.
*
* @author Matthew
*/
public class EmptyPrint implements Print {
final int width;
final int height;
/**
* Constructs an EmptyPrint with size (0, 0).
*/
public EmptyPrint() {
this(0, 0);
}
/**
* Constructs an EmptyPrint with the given size.
*
* @param width
* width of the Print, in points (72pts = 1").
* @param height
* height of the Print, in points (72pts = 1").
*/
public EmptyPrint(int width, int height) {
this.width = checkDimension(width);
this.height = checkDimension(height);
}
/**
* Constructs an EmptyPrint with the given size.
*
* @param size
* the size, in points (72pts = 1").
*/
public EmptyPrint(Point size) {
this(size.x, size.y);
}
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + height;
result = prime * result + width;
return result;
}
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
EmptyPrint other = (EmptyPrint) obj;
if (height != other.height)
return false;
if (width != other.width)
return false;
return true;
}
/**
* Returns the size of the empty space.
*
* @return the size of the empty space.
*/
public Point getSize() {
return new Point(width, height);
}
private int checkDimension(int dim) {
if (dim < 0)
PaperClips.error(SWT.ERROR_INVALID_ARGUMENT,
"EmptyPrint dimensions must be >= 0"); //$NON-NLS-1$
return dim;
}
public PrintIterator iterator(Device device, GC gc) {
return new EmptyIterator(device, this);
}
}
class EmptyIterator implements PrintIterator {
private final Point size;
private boolean hasNext = true;
EmptyIterator(Device device, EmptyPrint target) {
Point dpi = device.getDPI();
this.size = new Point(Math.round(target.width * dpi.x / 72f), Math
.round(target.height * dpi.y / 72f));
}
EmptyIterator(EmptyIterator that) {
this.size = that.size;
this.hasNext = that.hasNext;
}
public boolean hasNext() {
return hasNext;
}
public PrintPiece next(int width, int height) {
if (size.x > width || size.y > height)
return null;
hasNext = false;
return new EmptyPiece(size);
}
public Point minimumSize() {
return new Point(size.x, size.y);
}
public Point preferredSize() {
return new Point(size.x, size.y);
}
public PrintIterator copy() {
return new EmptyIterator(this);
}
}