// -*- c++ -*-
// Generated by gtkmmproc -- DO NOT MODIFY!
#ifndef _GTKMM_PRINTJOB_H
#define _GTKMM_PRINTJOB_H


#include <glibmm.h>

/* Copyright (C) 2006 The gtkmm Development Team
 *
 * 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
 */

#include <glibmm/object.h>
#include <gtkmm/pagesetup.h>
#include <gtkmm/printer.h>
#include <gtkmm/printoperation.h>
#include <gtkmm/printsettings.h>
#include <cairomm/surface.h>


#ifndef DOXYGEN_SHOULD_SKIP_THIS
typedef struct _GtkPrintJob GtkPrintJob;
typedef struct _GtkPrintJobClass GtkPrintJobClass;
#endif /* DOXYGEN_SHOULD_SKIP_THIS */


namespace Gtk
{ class PrintJob_Class; } // namespace Gtk
namespace Gtk
{

/** A PrintJob object represents a job that is sent to a printer. You only need to deal 
 * directly with print jobs if you  use the non-portable PrintUnixDialog API.
 * 
 * Use get_surface() to obtain the cairo surface onto which the pages must be drawn. 
 * Use send() to send the finished job to the printer.If you don't use cairo then 
 * PrintJob also supports printing of manually generated postscript, via set_source_file().
 * 
 * @newin{2,10}
 *
 * @ingroup Printing
 */

class PrintJob : public Glib::Object
{
  
#ifndef DOXYGEN_SHOULD_SKIP_THIS

public:
  typedef PrintJob CppObjectType;
  typedef PrintJob_Class CppClassType;
  typedef GtkPrintJob BaseObjectType;
  typedef GtkPrintJobClass BaseClassType;

private:  friend class PrintJob_Class;
  static CppClassType printjob_class_;

private:
  // noncopyable
  PrintJob(const PrintJob&);
  PrintJob& operator=(const PrintJob&);

protected:
  explicit PrintJob(const Glib::ConstructParams& construct_params);
  explicit PrintJob(GtkPrintJob* castitem);

#endif /* DOXYGEN_SHOULD_SKIP_THIS */

public:
  virtual ~PrintJob();

#ifndef DOXYGEN_SHOULD_SKIP_THIS
  static GType get_type()      G_GNUC_CONST;


  static GType get_base_type() G_GNUC_CONST;
#endif

  ///Provides access to the underlying C GObject.
  GtkPrintJob*       gobj()       { return reinterpret_cast<GtkPrintJob*>(gobject_); }

  ///Provides access to the underlying C GObject.
  const GtkPrintJob* gobj() const { return reinterpret_cast<GtkPrintJob*>(gobject_); }

  ///Provides access to the underlying C instance. The caller is responsible for unrefing it. Use when directly setting fields in structs.
  GtkPrintJob* gobj_copy();

private:

  //This is not available in on Win32.
//This source file will not be compiled,
//and the class will not be registered in wrap_init.h or wrap_init.cc


protected:
    explicit PrintJob(const Glib::ustring& title, const Glib::RefPtr<Printer>& printer, const Glib::RefPtr<PrintSettings>& settings, const Glib::RefPtr<PageSetup>& page_setup);


public:
  
  static Glib::RefPtr<PrintJob> create(const Glib::ustring& title, const Glib::RefPtr<Printer>& printer, const Glib::RefPtr<PrintSettings>& settings, const Glib::RefPtr<PageSetup>& page_setup);


  /** Gets the Gtk::PrintSettings of the print job.
   * 
   * @newin{2,10}
   * @return The settings of @a job.
   */
  Glib::RefPtr<PrintSettings> get_settings();
  
  /** Gets the Gtk::PrintSettings of the print job.
   * 
   * @newin{2,10}
   * @return The settings of @a job.
   */
  Glib::RefPtr<const PrintSettings> get_settings() const;

  
  /** Gets the Gtk::Printer of the print job.
   * 
   * @newin{2,10}
   * @return The printer of @a job.
   */
  Glib::RefPtr<Printer> get_printer();
  
  /** Gets the Gtk::Printer of the print job.
   * 
   * @newin{2,10}
   * @return The printer of @a job.
   */
  Glib::RefPtr<const Printer> get_printer() const;

  
  /** Gets the job title.
   * 
   * @newin{2,10}
   * @return The title of @a job.
   */
  Glib::ustring get_title() const;
  
  /** Gets the status of the print job.
   * 
   * @newin{2,10}
   * @return The status of @a job.
   */
  PrintStatus get_status() const;
   // this appears in gtkprinter-private.h
  
  /** Make the Gtk::PrintJob send an existing document to the 
   * printing system. The file can be in any format understood
   * by the platforms printing system (typically PostScript,
   * but on many platforms PDF may work too). See 
   * Gtk::Printer::accepts_pdf() and Gtk::Printer::accepts_ps().
   * 
   * @newin{2,10}
   * @param filename The file to be printed.
   * @return <tt>false</tt> if an error occurred.
   */
  void set_source_file(const std::string& filename);

   
  /** Gets a cairo surface onto which the pages of
   * the print job should be rendered.
   * 
   * @newin{2,10}
   * @return The cairo surface of @a job.
   */
  Cairo::RefPtr<Cairo::Surface> get_surface();
  
  /** Gets a cairo surface onto which the pages of
   * the print job should be rendered.
   * 
   * @newin{2,10}
   * @return The cairo surface of @a job.
   */
  Cairo::RefPtr<const Cairo::Surface> get_surface() const;

  
  /** If track_status is <tt>true</tt>, the print job will try to continue report
   * on the status of the print job in the printer queues and printer. This
   * can allow your application to show things like "out of paper" issues,
   * and when the print job actually reaches the printer.
   * 
   * This function is often implemented using some form of polling, so it should
   * not be enabled unless needed.
   * 
   * @newin{2,10}
   * @param track_status <tt>true</tt> to track status after printing.
   */
  void set_track_print_status(bool track_status =  true);
  
  /** Returns wheter jobs will be tracked after printing.
   * For details, see set_track_print_status().
   * 
   * @newin{2,10}
   * @return <tt>true</tt> if print job status will be reported after printing.
   */
  bool get_track_print_status() const;

  /** For example, 
   * void on_print_job_complete(const Glib::RefPtr<PrintJob>& job);
   *
   * @throws exception
   */
  typedef sigc::slot< void, const Glib::RefPtr<PrintJob>& > SlotPrintJobComplete;

  /** Sends the print job off to the printer.
   * @param slot A function to call when the job completes or an error occurs.
   */
  void send(const SlotPrintJobComplete& slot);
  
  
  /** Gets the Gtk::PrintPages setting for this job.
   * 
   * @newin{3,0}
   * @return The Gtk::PrintPages setting.
   */
  PrintPages get_pages() const;
  
  /** Sets the Gtk::PrintPages setting for this job.
   * 
   * @newin{3,0}
   * @param pages The Gtk::PrintPages setting.
   */
  void set_pages(PrintPages pages);
//TODO:  _WRAP_METHOD(PageRange* get_page_ranges(int *n_ranges), gtk_print_job_get_page_ranges)
//TODO: _WRAP_METHOD(void set_page_ranges(GtkPageRange* ranges, int n_ranges), gtk_print_job_set_page_ranges)
  
  /** Gets the Gtk::PageSet setting for this job.
   * 
   * @newin{3,0}
   * @return The Gtk::PageSet setting.
   */
  PageSet get_page_set() const;
  
  /** Sets the Gtk::PageSet setting for this job.
   * 
   * @newin{3,0}
   * @param page_set A Gtk::PageSet setting.
   */
  void set_page_set(PageSet page_set);
  
  /** Gets the number of copies of this job.
   * 
   * @newin{3,0}
   * @return The number of copies.
   */
  int get_num_copies() const;
  
  /** Sets the number of copies for this job.
   * 
   * @newin{3,0}
   * @param num_copies The number of copies.
   */
  void set_num_copies(int num_copies);
  
  /** Gets the scale for this job (where 1.0 means unscaled).
   * 
   * @newin{3,0}
   * @return The scale.
   */
  double get_scale() const;
  
  /** Sets the scale for this job (where 1.0 means unscaled).
   * 
   * @newin{3,0}
   * @param scale The scale.
   */
  void set_scale(double scale);
  
  /** Gets the n-up setting for this job.
   * 
   * @newin{3,0}
   * @return The n-up setting.
   */
  guint get_n_up() const;
  
  /** Sets the n-up setting for this job.
   * 
   * @newin{3,0}
   * @param n_up The n-up value.
   */
  void set_n_up(guint n_up);
  
  /** Gets the n-up layout setting for this job.
   * 
   * @newin{3,0}
   * @return The n-up layout.
   */
  NumberUpLayout get_n_up_layout() const;
  
  /** Sets the n-up layout setting for this job.
   * 
   * @newin{3,0}
   * @param layout The n-up layout setting.
   */
  void set_n_up_layout(NumberUpLayout layout);
  
  /** Gets whether the job is printed rotated.
   * 
   * @newin{3,0}
   * @return Whether the job is printed rotated.
   */
  bool get_rotate() const;
  
  /** Sets whether this job is printed rotated.
   * 
   * @newin{3,0}
   * @param rotate Whether to print rotated.
   */
  void set_rotate(bool rotate =  true);
  
  /** Gets whether this job is printed collated.
   * 
   * @newin{3,0}
   * @return Whether the job is printed collated.
   */
  bool get_collate() const;
  
  /** Sets whether this job is printed collated.
   * 
   * @newin{3,0}
   * @param collate Whether the job is printed collated.
   */
  void set_collate(bool collate =  true);
  
  /** Gets whether this job is printed reversed.
   * 
   * @newin{3,0}
   * @return Whether the job is printed reversed.
   */
  bool get_reverse() const;
  
  /** Sets whether this job is printed reversed.
   * 
   * @newin{3,0}
   * @param reverse Whether the job is printed reversed.
   */
  void set_reverse(bool reverse =  true);


  /**
   * @par Prototype:
   * <tt>void on_my_%status_changed()</tt>
   */

  Glib::SignalProxy0< void > signal_status_changed();


  #ifdef GLIBMM_PROPERTIES_ENABLED
/** Title of the print job.
   *
   * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
   * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
   * the value of the property changes.
   */
  Glib::PropertyProxy_ReadOnly<Glib::ustring> property_title() const;
#endif //#GLIBMM_PROPERTIES_ENABLED


  #ifdef GLIBMM_PROPERTIES_ENABLED
/** Printer to print the job to.
   *
   * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
   * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
   * the value of the property changes.
   */
  Glib::PropertyProxy_ReadOnly< Glib::RefPtr<Printer> > property_printer() const;
#endif //#GLIBMM_PROPERTIES_ENABLED


  #ifdef GLIBMM_PROPERTIES_ENABLED
/** Printer settings.
   *
   * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
   * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
   * the value of the property changes.
   */
  Glib::PropertyProxy_ReadOnly< Glib::RefPtr<PrintSettings> > property_settings() const;
#endif //#GLIBMM_PROPERTIES_ENABLED


  #ifdef GLIBMM_PROPERTIES_ENABLED
/** Page Setup.
   *
   * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
   * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
   * the value of the property changes.
   */
  Glib::PropertyProxy_ReadOnly< Glib::RefPtr<PageSetup> > property_page_setup() const;
#endif //#GLIBMM_PROPERTIES_ENABLED


  #ifdef GLIBMM_PROPERTIES_ENABLED
/** TRUE if the print job will continue to emit status-changed signals after the print data has been sent to the printer or print server.
   *
   * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
   * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
   * the value of the property changes.
   */
  Glib::PropertyProxy<bool> property_track_print_status() ;
#endif //#GLIBMM_PROPERTIES_ENABLED

#ifdef GLIBMM_PROPERTIES_ENABLED
/** TRUE if the print job will continue to emit status-changed signals after the print data has been sent to the printer or print server.
   *
   * You rarely need to use properties because there are get_ and set_ methods for almost all of them.
   * @return A PropertyProxy that allows you to get or set the property of the value, or receive notification when
   * the value of the property changes.
   */
  Glib::PropertyProxy_ReadOnly<bool> property_track_print_status() const;
#endif //#GLIBMM_PROPERTIES_ENABLED


public:

public:
  //C++ methods used to invoke GTK+ virtual functions:

protected:
  //GTK+ Virtual Functions (override these to change behaviour):

  //Default Signal Handlers::
  virtual void on_status_changed();


};

} // namespace Gtk


namespace Glib
{
  /** A Glib::wrap() method for this object.
   * 
   * @param object The C instance.
   * @param take_copy False if the result should take ownership of the C instance. True if it should take a new copy or ref.
   * @result A C++ instance that wraps this C instance.
   *
   * @relates Gtk::PrintJob
   */
  Glib::RefPtr<Gtk::PrintJob> wrap(GtkPrintJob* object, bool take_copy = false);
}


#endif /* _GTKMM_PRINTJOB_H */

