/* PrinterJob.java -- This job is the printer control class
   Copyright (C) 1999, 2004, 2005, 2006  Free Software Foundation, Inc.

This file is part of GNU Classpath.

GNU Classpath is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2, or (at your option)
any later version.

GNU Classpath 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
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
02110-1301 USA.

Linking this library statically or dynamically with other modules is
making a combined work based on this library.  Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.

As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module.  An independent module is a module which is not derived from
or based on this library.  If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so.  If you do not wish to do so, delete this
exception statement from your version. */


package java.awt.print;

import gnu.java.awt.print.JavaPrinterJob;

import java.awt.HeadlessException;
import javax.print.PrintService;
import javax.print.PrintServiceLookup;
import javax.print.DocFlavor;
import javax.print.StreamPrintServiceFactory;
import javax.print.attribute.PrintRequestAttributeSet;

/**
 * This class controls printing.
 *
 * @author Aaron M. Renn (arenn@urbanophile.com)
 */
public abstract class PrinterJob
{
  // The print service associated with this job
  private PrintService printer = null;

  /**
   * Creates a new print job.
   *
   * @return A <code>PrinterJob</code> object for the newly created print job.
   */
  public static PrinterJob getPrinterJob()
  {
    return new JavaPrinterJob();
  }

  /**
   * Initializes a new instance of <code>PrinterJob</code>. 
   */
  public PrinterJob()
  {
  }

  /**
   * Returns the number of copies to be printed.
   *
   * @return The number of copies to be printed.
   */
  public abstract int getCopies();

  /**
   * Sets the number of copies to be printed.
   *
   * @param copies The number of copies to be printed.
   */
  public abstract void setCopies(int copies);

  /**
   * Returns the name of the print job.
   *
   * @return The name of the print job.
   */
  public abstract String getJobName();

  /**
   * Sets the name of the print job.
   *
   * @param job_name The name of the print job.
   */
  public abstract void setJobName(String job_name);

  /**
   * Returns the printing user name.
   *
   * @return The printing username.
   */
  public abstract String getUserName();

  /**
   * Cancels an in progress print job.
   */
  public abstract void cancel();

  /**
   * Tests whether or not this job has been cancelled.
   *
   * @return <code>true</code> if this job has been cancelled, <code>false</code>
   * otherwise.
   */
  public abstract boolean isCancelled();

  /**
   * Returns an instance of the default page which will have the default
   * paper and orientation.
   *
   * @return A default instance of <code>PageFormat</code>.
   */
  public PageFormat defaultPage()
  {
    return new PageFormat();
  }

  /**
   * Clones the specified <code>PageFormat</code> object then alters the
   * clone so that it represents the default page format.
   *
   * @param page_format The <code>PageFormat</code> to clone.
   *
   * @return A new default page format.
   */
  public abstract PageFormat defaultPage(PageFormat page_format);

  /**
   * Displays a dialog box to the user which allows the page format
   * attributes to be modified.
   *
   * @param page_format The <code>PageFormat</code> object to modify.
   *
   * @return The modified <code>PageFormat</code>.
   */
  public abstract PageFormat pageDialog(PageFormat page_format)
    throws HeadlessException;

  /**
   * @since 1.4
   */
  public PageFormat pageDialog(PrintRequestAttributeSet attributes)
    throws HeadlessException
  {
    // FIXME: Implement this for real.
    return pageDialog((PageFormat) null);
  }
  
  /**
   * Prints the pages.
   */
  public abstract void print () throws PrinterException;

  /**
   * Prints the page with given attributes.
   */
  public void print (PrintRequestAttributeSet attributes)
    throws PrinterException
  {
    print ();
  }

  /**
   * Displays a dialog box to the user which allows the print job
   * attributes to be modified.
   *
   * @return <code>false</code> if the user cancels the dialog box,
   * <code>true</code> otherwise.
   */
  public abstract boolean printDialog()
    throws HeadlessException;

  /**
   * Displays a dialog box to the user which allows the print job
   * attributes to be modified.
   *
   * @return <code>false</code> if the user cancels the dialog box,
   * <code>true</code> otherwise.
   */
  public boolean printDialog(PrintRequestAttributeSet attributes)
    throws HeadlessException
  {
    // FIXME: Implement this for real.
    return printDialog();
  }

  /**
   * This sets the pages that are to be printed.
   *
   * @param pageable The pages to be printed, which may not be <code>null</code>.
   */
  public abstract void setPageable(Pageable pageable);

  /**
   * Sets this specified <code>Printable</code> as the one to use for
   * rendering the pages on the print device.
   *
   * @param printable The <code>Printable</code> for the print job.
   */
  public abstract void setPrintable(Printable printable);

  /**
   * Sets the <code>Printable</code> and the page format for the pages
   * to be printed.
   *
   * @param printable The <code>Printable</code> for the print job.
   * @param page_format The <code>PageFormat</code> for the print job.
   */
  public abstract void setPrintable(Printable printable, PageFormat page_format);

  /**
   * Makes any alterations to the specified <code>PageFormat</code>
   * necessary to make it work with the current printer.  The alterations
   * are made to a clone of the input object, which is then returned.
   *
   * @param page_format The <code>PageFormat</code> to validate.
   *
   * @return The validated <code>PageFormat</code>.
   */
  public abstract PageFormat validatePage(PageFormat page_format);

  /**
   * Find and return 2D image print services.
   * 
   * This is the same as calling PrintServiceLookup.lookupPrintServices()
   * with Pageable service-specified DocFlavor.
   * @return Array of PrintService objects, could be empty.
   * @since 1.4
   */
  public static PrintService[] lookupPrintServices()
  {
    return PrintServiceLookup.lookupPrintServices
      (
       new DocFlavor("application/x-java-jvm-local-objectref",
		     "java.awt.print.Pageable"),
       null);
  }

  /**
   * Find and return 2D image stream print services.
   * 
   * This is the same as calling
   * StreamPrintServiceFactory.lookupStreamPrintServices()
   * with Pageable service-specified DocFlavor.
   * @param mimeType The output format mime type, or null for any type.
   * @return Array of stream print services, could be empty.
   * @since 1.4
   */
  // FIXME:
  // Enable when StreamPrintServiceFactory has lookupStreamServiceFactories
//  public static StreamPrintServiceFactory[] lookupStreamPrintServices(String mimeType)
//  {
//    return StreamPrintServiceFactory.lookupStreamServiceFactories(
//      new DocFlavor("application/x-java-jvm-local-objectref",
//      "java.awt.print.Pageable"),
//    	mimeType);
//  }

  /**
   * Return the printer for this job.  If print services aren't supported by
   * the subclass, returns null.
   * 
   * @return The associated PrintService.
   * @since 1.4
   */
  public PrintService getPrintService()
  {
    return printer;
  }

  /**
   * Change the printer for this print job to service.  Subclasses that
   * support setting the print service override this method.  Throws
   * PrinterException when the class doesn't support setting the printer,
   * the service doesn't support Pageable or Printable interfaces for 2D
   * print output.
   * @param service The new printer to use.
   * @throws PrinterException if service is not valid.
   */
  public void setPrintService(PrintService service)
    throws PrinterException
  {
    printer = service;
  }
}
