/*******************************************************************************
 * Copyright (c) 2000, 2010 IBM Corporation 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:
 *     IBM Corporation - initial API and implementation
 *     Sven M�ller - Added tiling support
 *******************************************************************************/
package org.eclipse.draw2d;

import org.eclipse.swt.graphics.Color;
import org.eclipse.swt.printing.Printer;
import org.eclipse.swt.widgets.Display;

import org.eclipse.draw2d.geometry.Rectangle;
import org.eclipse.swt.SWT;

/**
 * Class responsible for printing Figures.
 * 
 * @author Dan Lee
 * @author Eric Bordeau
 * @author Sven M�ller
 */
public class PrintFigureOperation extends PrintOperation {

	/**
	 * The default print mode. Prints at 100% scale and tiles horizontally
	 * and/or vertically, if necessary.
	 */
	public static final int TILE = 1;
	/**
	 * A print mode that scales the printer graphics so that the entire printed
	 * image fits on one page.
	 */
	public static final int FIT_PAGE = 2;
	/**
	 * A print mode that scales the printer graphics so that the width of the
	 * printed image fits on one page and tiles vertically, if necessary.
	 */
	public static final int FIT_WIDTH = 3;
	/**
	 * A print mode that scales the printer graphics so that the height of the
	 * printed image fits on one page and tiles horizontally, if necessary.
	 */
	public static final int FIT_HEIGHT = 4;

	private IFigure printSource;
	private Color oldBGColor;
	private int printMode = TILE;

	/**
	 * Constructor for PrintFigureOperation.
	 * <p>
	 * Note: Descendants must call setPrintSource(IFigure) to set the IFigure
	 * that is to be printed.
	 * 
	 * @see org.eclipse.draw2d.PrintOperation#PrintOperation(Printer)
	 */
	protected PrintFigureOperation(Printer p) {
		super(p);
	}

	/**
	 * Constructor for PrintFigureOperation.
	 * 
	 * @param p
	 *            Printer to print on
	 * @param srcFigure
	 *            Figure to print
	 */
	public PrintFigureOperation(Printer p, IFigure srcFigure) {
		super(p);
		setPrintSource(srcFigure);
	}

	/**
	 * @return SWT.RIGHT_TO_LEFT if the print source is mirrored;
	 *         SWT.LEFT_TO_RIGHT otherwise
	 * @see org.eclipse.draw2d.PrintOperation#getGraphicsOrientation()
	 */
	int getGraphicsOrientation() {
		return getPrintSource().isMirrored() ? org.eclipse.draw2d.rap.swt.SWT.RIGHT_TO_LEFT
				: SWT.LEFT_TO_RIGHT;
	}

	/**
	 * Returns the current print mode. The print mode is one of:
	 * {@link #FIT_HEIGHT}, {@link #FIT_PAGE}, or {@link #FIT_WIDTH}.
	 * 
	 * @return the print mode
	 */
	protected int getPrintMode() {
		return printMode;
	}

	/**
	 * Returns the printSource.
	 * 
	 * @return IFigure The source IFigure
	 */
	protected IFigure getPrintSource() {
		return printSource;
	}

	/**
	 * @see org.eclipse.draw2d.PrintOperation#preparePrintSource()
	 */
	protected void preparePrintSource() {
		oldBGColor = getPrintSource().getLocalBackgroundColor();
		getPrintSource().setBackgroundColor(ColorConstants.white);
	}

	/**
	 * Prints the pages based on the current print mode.
	 * 
	 * @see org.eclipse.draw2d.PrintOperation#printPages()
	 */
	protected void printPages() {
		Graphics graphics = getFreshPrinterGraphics();
		IFigure figure = getPrintSource();
		setupPrinterGraphicsFor(graphics, figure);
		Rectangle bounds = figure.getBounds();
		int x = bounds.x, y = bounds.y;
		Rectangle clipRect = new Rectangle();
		while (y < bounds.y + bounds.height) {
			while (x < bounds.x + bounds.width) {
				graphics.pushState();
				getPrinter().startPage();
				graphics.translate(-x, -y);
				graphics.getClip(clipRect);
				clipRect.setLocation(x, y);
				graphics.clipRect(clipRect);
				figure.paint(graphics);
				getPrinter().endPage();
				graphics.popState();
				x += clipRect.width;
			}
			x = bounds.x;
			y += clipRect.height;
		}
	}

	/**
	 * @see org.eclipse.draw2d.PrintOperation#restorePrintSource()
	 */
	protected void restorePrintSource() {
		getPrintSource().setBackgroundColor(oldBGColor);
		oldBGColor = null;
	}

	/**
	 * Sets the print mode. Possible values are {@link #TILE},
	 * {@link #FIT_HEIGHT}, {@link #FIT_WIDTH} and {@link #FIT_PAGE}.
	 * 
	 * @param mode
	 *            the print mode
	 */
	public void setPrintMode(int mode) {
		printMode = mode;
	}

	/**
	 * Sets the printSource.
	 * 
	 * @param printSource
	 *            The printSource to set
	 */
	protected void setPrintSource(IFigure printSource) {
		this.printSource = printSource;
	}

	/**
	 * Sets up Graphics object for the given IFigure.
	 * 
	 * @param graphics
	 *            The Graphics to setup
	 * @param figure
	 *            The IFigure used to setup graphics
	 */
	protected void setupPrinterGraphicsFor(Graphics graphics, IFigure figure) {
		double dpiScale = (double) getPrinter().getDPI().x
				/ Display.getCurrent().getDPI().x;

		Rectangle printRegion = getPrintRegion();
		// put the print region in display coordinates
		printRegion.width /= dpiScale;
		printRegion.height /= dpiScale;

		Rectangle bounds = figure.getBounds();
		double xScale = (double) printRegion.width / bounds.width;
		double yScale = (double) printRegion.height / bounds.height;
		switch (getPrintMode()) {
		case FIT_PAGE:
			graphics.scale(Math.min(xScale, yScale) * dpiScale);
			break;
		case FIT_WIDTH:
			graphics.scale(xScale * dpiScale);
			break;
		case FIT_HEIGHT:
			graphics.scale(yScale * dpiScale);
			break;
		default:
			graphics.scale(dpiScale);
		}
		graphics.setForegroundColor(figure.getForegroundColor());
		graphics.setBackgroundColor(figure.getBackgroundColor());
		graphics.setFont(figure.getFont());
	}

}