/******************************************************************************
 * Copyright (c) 2002, 2003 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 
 ****************************************************************************/

package org.eclipse.gmf.runtime.common.ui.printing;

import java.util.List;

import org.eclipse.swt.printing.PrinterData;

/**
 * The IPrintHelper is an interface for the platform specfic print fragments.
 * The print fragments may have these methods declared in the interface as
 * native methods, then implement this interface as wrappers around the
 * native methods.
 * 
 * @author wdiu, Wayne Diu
 */
public interface IPrintHelper {
	/**
	 * The location where I expect the print helper to be implemented.
	 * This should be in a fragment, e.g. org.eclipse.gmf.runtime.common.ui.printing.operatingsystem
	 */
	public static final String PRINT_HELPER_CLASS_NAME = "org.eclipse.gmf.runtime.common.ui.printing.PrintHelper"; //$NON-NLS-1$

	/**
	 * Opens the print dialog with the diagram list which could be null
	 * 
	 * @param diagramList the List of Diagram objects.  diagramList can
	 * be null.
	 * @return <code>PrinterData</code>
	 */
	PrinterData openPrintDlg(List diagramList);

	/**
	 * If not > 0 then user has clicked percent scaling
	 * 
	 * @return scale to m int
	 */
	int getDlgScaleFitToM();

	/**
	 * If not > 0 then user has clicked percent scaling
	 * 
	 * @return scale to n int
	 */
	int getDlgScaleFitToN();

	/**
	 * If not > 0 then user has clicked fit to m x n scaling
	 * 
	 * @return scale percent int
	 */
	int getDlgScalePercent();

	/**
	 * Returns true if the diagram at the index was selected
	 * 
	 * @param index the index of the diagrams you passed in
	 * @return true if selected, false if not selected
	 */
	boolean isDlgDiagramSelected(int index);

	//one of the three is unnecssary, but it makes more sense
	/**
	 * Returns if diagram print range all was selected
	 * 
	 * @return true if selected, false if not selected
	 */
	boolean getDlgDiagramPrintRangeAll();

	/**
	 * Returns if diagram print range current was selected
	 * 
	 * @return true if selected, false if not selected
	 */
	boolean getDlgDiagramPrintRangeCurrent();

	/**
	 * Returns if diagram print range selection was selected
	 * 
	 * @return true if selected, false if not selected
	 */
	boolean getDlgDiagramPrintRangeSelection();

	/**
	 * Returns if print range all was selected
	 * 
	 * @return true if selected, false if not selected
	 */
	boolean getDlgPrintRangeAll();

	/**
	 * Returns if print range pages was selected
	 * 
	 * @return true if selected, false if not selected
	 */
	boolean getDlgPrintRangePages();

	/**
	 * Returns if collate was selected
	 * 
	 * @return true if selected, false if not selected
	 */
	boolean getDlgCollate();

	/**
	 * Returns the pages from int value, check if (getDlgPrintRangesPages())
	 * first.
	 * 
	 * @return int of the pages from box
	 */
	int getDlgPagesFrom();

	/**
	 * Returns the pages from int value, check if (getDlgPrintRangesPages())
	 * first.
	 * 
	 * @return int of the pages to box
	 */
	int getDlgPagesTo();

	/**
	 * Returns the number of copies the user wants to print.
	 * This is nCopies from PRINTDLG
	 * 
	 * @return int with the number of copies
	 */
	int getDlgNumberOfCopies();
    
    /**
     * Allows to set the orientation (portrait/landscape) in the print dialog.
     * @param isLandscape   true if orientation should be landscape, false otherwise.
     */
    void setDlgOrientation(boolean bLandscape);

    /**
     * Allows to set the paper size in the print dialog.
     * @param index         index of type of paper size, @see org.eclipse.gmf.runtime.diagram.ui.internal.pagesetup.PageSetupPageType
     *                      for the type of paper sizes available and their indices. 
     * @param width         specifies the custom width of the paper. Leave as 0 if
     *                      paper size index is user-defined.
     * @param height        specifies the custom width of the paper. Leave as 0 if
     *                      paper size index is user-defined.
     */
    void setDlgPaperSize(int index, double width, double length);
    
    /**
     * Preserve the scale factor that the user enters in the preview or print
     * dialogs.
     * 
     * @param scaleFactor a zoom factor integer value greater than 0.
     */
    void setScaleFactor(int scaleFactor);
    
    /**
     * Preserve the width and height scale factors
     * 
     * @param width scale to number of pages wide
     * @param height scale to number of pages high
     */
   	void setScaleToWidthHeight(int width, int height);
   
    
}
