/* ===========================================================
* TradeManager : a application to trade strategies for the Java(tm) platform
* ===========================================================
*
* (C) Copyright 2011-2011, by Simon Allen and Contributors.
*
* Project Info: org.trade
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or
* (at your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
* License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
* USA.
*
* [Java is a trademark or registered trademark of Oracle, Inc.
* in the United States and other countries.]
*
* (C) Copyright 2011-2011, by Simon Allen and Contributors.
*
* Original Author: Simon Allen;
* Contributor(s): -;
*
* Changes
* -------
*
*/
package org.trade.ui.base;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Point2D;
import java.awt.print.PageFormat;
import java.awt.print.Pageable;
import java.awt.print.Printable;
import java.awt.print.PrinterException;
import java.awt.print.PrinterGraphics;
/**
* A simple Pageable class that can split a large drawing canvas over multiple
* pages.
*
* The pages in a canvas are laid out on pages going left to right and then top
* to bottom.
*
* @author Simon Allen
* @version $Revision: 1.0 $
*/
public class PrintPage implements Pageable {
private int m_NumPagesX;
private int m_NumPagesY;
private int m_NumPages;
private Printable m_Painter = null;
private PageFormat m_Format = null;
/**
* Create a java.awt.Pageable that will print a canvas over as many pages as
* are needed. A Vista can be passed to PrinterJob.setPageable.
*
* @param width
* The width, in 1/72nds of an inch, of the vist's canvas.
*
* @param height
* The height, in 1/72nds of an inch, of the vista's canvas.
*
* @param painter
* The object that will drawn the contents of the canvas.
*
* @param format
* The description of the pages on to which the canvas will be
* drawn.
*/
public PrintPage(float width, float height, Printable painter, PageFormat format) {
setPrintable(painter);
setPageFormat(format);
setSize(width, height);
}
/**
* Create a vista over a canvas whose width and height are zero and whose
* Printable and PageFormat are null.
*/
protected PrintPage() {
}
/**
* Set the object responsible for drawing the canvas.
*
* @param painter
* Printable
*/
protected void setPrintable(Printable painter) {
m_Painter = painter;
}
/**
* Set the page format for the pages over which the canvas will be drawn.
*
* @param pageFormat
* PageFormat
*/
protected void setPageFormat(PageFormat pageFormat) {
m_Format = pageFormat;
}
/**
* Set the size of the canvas to be drawn.
*
* @param width
* The width, in 1/72nds of an inch, of the vist's canvas.
*
* @param height
* The height, in 1/72nds of an inch, of the vista's canvas.
*/
protected void setSize(float width, float height) {
m_NumPagesX = (int) (((width + m_Format.getImageableWidth()) - 1) / m_Format.getImageableWidth());
m_NumPagesY = (int) (((height + m_Format.getImageableHeight()) - 1) / m_Format.getImageableHeight());
m_NumPages = m_NumPagesX * m_NumPagesY;
}
/**
* Returns the number of pages over which the canvas will be drawn.
*
* @return int
* @see java.awt.print.Pageable#getNumberOfPages()
*/
public int getNumberOfPages() {
return m_NumPages;
}
/**
* Method getPageFormat.
*
* @return PageFormat
*/
protected PageFormat getPageFormat() {
return m_Format;
}
/**
* Returns the PageFormat of the page specified by pageIndex. For a Vista
* the PageFormat is the same for all pages.
*
* @param pageIndex
* the zero based index of the page whose PageFormat is being
* requested
*
*
* @return the PageFormat describing the size and orientation. * @exception
* IndexOutOfBoundsException the Pageable does not contain the
* requested page. * @see java.awt.print.Pageable#getPageFormat(int)
*/
public PageFormat getPageFormat(int pageIndex) throws IndexOutOfBoundsException {
if (pageIndex >= m_NumPages) {
throw new IndexOutOfBoundsException();
}
return getPageFormat();
}
/**
* Returns the <code>Printable</code> instance responsible for rendering the
* page specified by <code>pageIndex</code>. In a Vista, all of the pages
* are drawn with the same Printable. This method however creates a
* Printable which calls the canvas's Printable. This new Printable is
* responsible for translating the coordinate system so that the desired
* part of the canvas hits the page.
*
* The Vista's pages cover the canvas by going left to right and then top to
* bottom. In order to change this behavior, override this method.
*
* @param pageIndex
* the zero based index of the page whose Printable is being
* requested
*
*
* @return the Printable that renders the page. * @exception
* IndexOutOfBoundsException the Pageable does not contain the
* requested page. * @see java.awt.print.Pageable#getPrintable(int)
*/
public Printable getPrintable(int pageIndex) throws IndexOutOfBoundsException {
if (pageIndex >= m_NumPages) {
throw new IndexOutOfBoundsException();
}
double originX = (pageIndex % m_NumPagesX) * m_Format.getImageableWidth();
double originY = (pageIndex / (double) m_NumPagesX) * m_Format.getImageableHeight();
Point2D.Double origin = new Point2D.Double(originX, originY);
return new TranslatedPrintable(m_Painter, origin);
}
/**
* This inner class's sole responsibility is to translate the coordinate
* system before invoking a canvas's painter. The coordinate system is
* translated in order to get the desired portion of a canvas to line up
* with the top of a page.
*
* @author Simon Allen
* @version $Revision: 1.0 $
*/
public static final class TranslatedPrintable implements Printable {
/**
* The object that will draw the canvas.
*/
private Printable m_Painter;
/**
* The upper-left corner of the part of the canvas that will be
* displayed on this page. This corner is lined up with the upper-left
* of the imageable area of the page.
*/
private Point2D m_Origin;
/**
* Create a new Printable that will translate the drawing done by
* painter on to the imageable area of a page.
*
* @param painter
* The object responsible for drawing the canvas
*
* @param origin
* The point in the canvas that will be mapped to the
* upper-left corner of the page's imageable area.
*/
public TranslatedPrintable(Printable painter, Point2D origin) {
m_Painter = painter;
m_Origin = origin;
}
/**
* Prints the page at the specified index into the specified
* {@link Graphics} context in the specified format. A PrinterJob calls
* the Printableinterface to request that a page be rendered into the
* context specified by graphics. The format of the page to be drawn is
* specified by pageFormat. The zero based index If the requested page
* does not exist then this method returns NO_SUCH_PAGE; otherwise
* PAGE_EXISTS is returned. The Graphics class or subclass implements
* the {@link PrinterGraphics} interface to provide additional
* information. If the Printable object aborts the print job then it
* throws a {@link PrinterException}.
*
* @param graphics
* the context into which the page is drawn
* @param pageFormat
* the size and orientation of the page being drawn
* @param pageIndex
* the zero based index of the page to be drawn
*
*
* @return PAGE_EXISTS if the page is rendered successfully or
* NO_SUCH_PAGE if pageIndex specifies a non-existent page.
* * @throws PrinterException
* @exception java.awt.print.PrinterException
* thrown when the print job is terminated. * @see
* java.awt.print.Printable#print(Graphics, PageFormat,
* int)
*/
public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException {
Graphics2D g2 = (Graphics2D) graphics;
g2.translate(-m_Origin.getX(), -m_Origin.getY());
return m_Painter.print(g2, pageFormat, pageIndex);
}
}
}