You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdelibs/kdeprint/kprinter.h

781 lines
26 KiB

/*
* This file is part of the KDE libraries
* Copyright (c) 2001 Michael Goffioul <kdeprint@swing.be>
*
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License version 2 as published by the Free Software Foundation.
*
* 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public License
* along with this library; see the file COPYING.LIB. If not, write to
* the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
**/
#ifndef KPRINTER_H
#define KPRINTER_H
#include <qpaintdevice.h>
#include <qprinter.h>
#include <qmap.h>
#include <qstring.h>
#include <qstringlist.h>
#include <qvaluelist.h>
#include <kdemacros.h>
#include <kdelibs_export.h>
#include <kdeprint/kpreloadobject.h>
class KPrinterImpl;
class KPrintDialogPage;
class KPrinterPrivate;
class DrPageSize;
/**
* This class is the main interface to access the KDE print framework. It allows KDE
* applications to easily access the print system, through an interface that is compatible
* with QPrinter. So that the porting of an existing application should be as easy as
* replacing any occurrence of QPrinter by KPrinter. However applications that explicitly
* used the QPrintDialog class must be changed to the standard KPrinter way of accessing
* the print dialog.
*
* Basically, a KDE application will use the KPrinter object as a paint device, and will draw
* on it using QPainter. In a standard application, the use of the KPrinter class will
* look like this:
* \code
* #include <kprinter.h>
* #include <qpainter.h>
*
* void MyClass::doPrint()
* {
* KPrinter printer;
*
* // do some printer initialization
* printer.setFullPage( true );
*
* // initialize the printer using the print dialog
* if ( printer.setup( this ) )
* {
* // create a painter to paint on the printer object
* QPainter painter;
*
* // start painting
* painter.begin( &printer );
* <do something>
* // stop painting, this will automatically send the print data to the printer
* painter.end();
* }
* }
* \endcode
*
* The KPrinter interface also allows some more advanced possibilities, like the customization
* of the print dialog to integrate application specific print options. This is done by subclassing
* KPrintDialogPage and adding the page using addDialogPage().
*
* When compiling an application that uses KPrinter, you must link to -lkdeprint, which when
* using the standard KDE build framework can be done by adding $(LIB_KDEPRINT) to _LDADD.
*
* @short The central interface class to access the KDE print system.
* @author Michael Goffioul
* @see QPrinter, KPrintDialogPage
*/
class KDEPRINT_EXPORT KPrinter : public QPaintDevice, public KPReloadObject
{
friend class KPrinterWrapper;
friend class KPrinterImpl;
public:
// Print global settings (set via static functions)
/**
* Defines the standard pages available for the print dialog:
* @li @p CopiesPage: page and copies selection (included by default)
* @li @p FilesPage: file selection (only used by kprinter utility)
* @li @p Custom: unused
*
* @see addStandardPage(), removeStandardPage()
*/
enum StandardPageType { CopiesPage = 0x01, FilesPage = 0x02, Custom = 0x10 };
/**
* Defines whether the application can perform page selection itself or not.
* Some print systems (like CUPS) can do page selection, in this case the
* page selection will be enabled in the print dialog, otherwise it will be
* disabled. However some applications (word processor) can do page selection
* themselves, then it will be enabled in the print dialog, whatever the
* print system used. But such an application has to tell kdeprint about its
* feature:
* @li @p ApplicationSide: the application will do page selection
* @li @p SystemSide: page selection will be left to the print system, if available (default)
*
* @see setPageSelection(), pageSelection()
*/
enum PageSelectionType { ApplicationSide = 0x01, SystemSide = 0x02 };
/**
* Defines the type of the application, this affects the GUI of the print dialog:
* @li @p Dialog: print dialog used in an application (default)
* @li @p StandAlone: print dialog used as a standalone widget
* @li @p StandAlonePersistent: print dialog used as standalone widget, but persistent (do not use)
*
* @internal
* @see setApplicationType(), applicationType()
*/
enum ApplicationType { Dialog = 0x00, StandAlone = 0x01, StandAlonePersistent = 0x02 };
// QPrinter extension
/**
* Defines the page set to print:
* @li @p AllPages: all pages
* @li @p OddPages: only odd pages
* @li @p EvenPages: only even pages
*
* @see pageSet()
*/
enum PageSetType { AllPages = 0x00, OddPages = 0x01, EvenPages = 0x02 };
/**
* Defines the collate property of the printer (if supported by the print system):
* @li @p Collate: copies collated (1-2-3-..., 1-2-3-...)
* @li @p Uncollate: copies uncollated (1-1-..., 2-2-..., 3-3-...)
*
* @see setCollate(), collate()
*/
enum CollateType { Collate = 0x00, Uncollate = 0x01 };
// from QPrinter class
/**
* Defines the color mode of the printer
* @see QPrinter::ColorMode
*/
enum ColorMode { GrayScale = QPrinter::GrayScale, Color = QPrinter::Color };
/**
* Defines the orientation of the paper
* @see QPrinter::Orientation
*/
enum Orientation { Portrait = QPrinter::Portrait, Landscape = QPrinter::Landscape };
/**
* Defines the page order of the print job
* @see QPrinter::PageOrder
*/
enum PageOrder { FirstPageFirst = QPrinter::FirstPageFirst, LastPageFirst = QPrinter::LastPageFirst };
/**
* Defines the paper size to use
* @see QPrinter::PageSize
*/
enum PageSize
{
A4 = QPrinter::A4,
B5 = QPrinter::B5,
Letter = QPrinter::Letter,
Legal = QPrinter::Legal,
Executive = QPrinter::Executive,
A0 = QPrinter::A0,
A1 = QPrinter::A1,
A2 = QPrinter::A2,
A3 = QPrinter::A3,
A5 = QPrinter::A5,
A6 = QPrinter::A6,
A7 = QPrinter::A7,
A8 = QPrinter::A8,
A9 = QPrinter::A9,
B0 = QPrinter::B0,
B1 = QPrinter::B1,
B10 = QPrinter::B10,
B2 = QPrinter::B2,
B3 = QPrinter::B3,
B4 = QPrinter::B4,
B6 = QPrinter::B6,
B7 = QPrinter::B7,
B8 = QPrinter::B8,
B9 = QPrinter::B9,
C5E = QPrinter::C5E,
Comm10E = QPrinter::Comm10E,
DLE = QPrinter::DLE,
Folio = QPrinter::Folio,
Ledger = QPrinter::Ledger,
Tabloid = QPrinter::Tabloid,
NPageSize = QPrinter::NPageSize
};
// constructors / destructor
/**
* Constructor. This also restores/saves the state from a previous KPrinter object created within
* the same application run, if @p restore is true. Setting @p restore to false may
* be useful if you want an independent/clean KPrinter object.
* @param restore if true, options will be restored/saved between successive KPrinter objects
* @param m the mode to establish the KPrinter in (see QPrinter::PrinterMode)
*/
KPrinter(bool restore = true, QPrinter::PrinterMode m = QPrinter::ScreenResolution );
/**
* Destructor. This also saves the current KPrinter state for future printing.
*/
~KPrinter();
// QPrinter interface (+ some extensions)
/**
* See QPrinter::newPage().
*/
bool newPage();
/**
* See QPrinter::abort().
*/
bool abort();
/**
* See QPrinter::aborted(.)
*/
bool aborted() const;
/**
* See QPrinter::outputToFile().
*/
bool outputToFile() const;
/**
* See QPrinter::setOutputToFile().
*/
void setOutputToFile(bool);
/**
* See QPrinter::outputFileName().
*/
QString outputFileName() const;
/**
* See QPrinter::setOutputFileName().
*/
void setOutputFileName(const QString&);
/**
* See QPrinter::docName().
*/
QString docName() const;
/**
* See QPrinter::setDocName().
*/
void setDocName(const QString&);
/**
* See QPrinter::creator().
*/
QString creator() const;
/**
* See QPrinter::setCreator().
*/
void setCreator(const QString&);
/**
* See QPrinter::fullPage().
*/
bool fullPage() const;
/**
* See QPrinter::setFullPage().
*/
void setFullPage(bool);
/**
* See QPrinter::colorMode().
*/
ColorMode colorMode() const;
/**
* See QPrinter::setColorMode().
*/
void setColorMode(ColorMode);
/**
* See QPrinter::numCopies().
*/
int numCopies() const;
/**
* See QPrinter::setNumCopies().
*/
void setNumCopies(int n);
/**
* See QPrinter::orientation().
*/
Orientation orientation() const;
/**
* See QPrinter::setOrientation().
*/
void setOrientation(Orientation);
/**
* See QPrinter::pageOrder().
*/
PageOrder pageOrder() const;
/**
* See QPrinter::setPageOrder().
*/
void setPageOrder(PageOrder);
/**
* Returns the collate status of the current KPrinter.
*/
CollateType collate() const;
/**
* Sets the collate status for the current KPrinter to @p type.
*/
void setCollate(CollateType type);
/**
* See QPrinter::minPage().
*/
int minPage() const;
/**
* See QPrinter::maxPage().
*/
int maxPage() const;
/**
* See QPrinter::setMinMax().
*/
void setMinMax(int, int);
/**
* Returns the first page to be printed.
* @deprecated Applications
* should use pageList() instead, which takes into account all options: collate,
* page order, ranges, page set, ...
*
* @see pageList()
*/
int fromPage() const KDE_DEPRECATED;
/**
* Returns the last page to be printed.
* @deprecated Applications
* should use pageList() instead, which takes into account all options: collate,
* page order, ranges, page set, ...
*
* @see pageList()
*/
int toPage() const;
/**
* Sets the first and last page to be printed. See QPrinter::setFromTo().
*/
void setFromTo(int, int);
/**
* See QPrinter::pageSize().
*/
PageSize pageSize() const;
/**
* See QPrinter::setPageSize().
*/
void setPageSize(PageSize);
/**
* See QPrinter::printerName().
*/
QString printerName() const;
/**
* See QPrinter::setPrinterName().
*/
void setPrinterName(const QString&);
/**
* Returns the print program as set by setPrintProgram() or by the print dialog
* if a special printer has been selected.
* @return the print command line
* @see setPrintProgram()
*/
QString printProgram() const;
/**
* Sets the command line to use when printing. This function is useful
* when using a KPrinter object without the print dialog, to control what
* to print and how to do it. The command line may contain the following
* tags:
* @li %in : the input file to the print program. It is required and automatically
* appended at the end of the command line if not present.
* @li %out : the output file. Use this tag in conjunction with setOutputToFile()
* and setOutputFileName()
* @li %psl : the page size in lower case. This may be useful with some
* programs like gs.
* \code
* void createPNGOutputFile(const QString& filename)
* {
* // use a clean KPrinter object
* KPrinter prt(false);
*
* prt.setOutputToFile( true );
* prt.setOutputFileName( filename );
* prt.setPrintProgram( "gs -sDEVICE=png256 -sPAPERSIZE=%psl -sOutputFile=%out %in" );
*
* QPainter painter( &prt );
* doPaint( &painter );
* }
* \endcode
* @param cmd the print command line (containing at least the @p %in tag)
* @see printProgram()
*/
void setPrintProgram(const QString& cmd);
/**
* See QPrinter::printerSelectionOption(). Unused.
*/
QString printerSelectionOption() const;
/**
* See QPrinter::setPrinterSelectionOption(). Unused
*/
void setPrinterSelectionOption(const QString&);
/**
* Returns the current page number.
* @see setCurrentPage()
*/
int currentPage() const;
/**
* Sets the current page number. This page number will be used if the user
* selected "current page" in the print dialog. This option will only be
* enabled if the application does page selection itself and the application
* has called setCurrentPage() before opening the print dialog:
* \code
* MyClass::MyClass()
* {
* // declares my application able to do page selection
* KPrinter::setPageSelection( KPrinter::ApplicationSide );
* }
*
* void MyClass::doPrint()
* {
* KPrinter printer;
*
* printer.setCurrentPage( mycurrentpage );
* if ( printer.setup( this ) )
* {
* QValueList<int> pages = printer.pageList();
* // print the pages
* ...
* }
* }
* \endcode
* @param p the current page number (starting from 1)
*/
void setCurrentPage(int p = 0);
/**
* Returns the page set of the current KPrinter object.
*/
PageSetType pageSet() const;
/**
* Sets up the KPrinter object using the print dialog, returns true if the user clicked OK.
* @param parent the parent widget to use for the print dialog
* @param caption the caption to use in the print dialog
* @param forceExpand force the expansion of the dialog (the show/hide button will be hidden)
* @returns boolean value corresponding to the button clicked by the user
*/
bool setup(QWidget *parent = 0, const QString& caption = QString::null, bool forceExpand = false);
/**
* See QPrinter::margins().
*/
QSize margins() const;
/**
* Not used yet.
*/
void setMargins(QSize m);
/**
* Returns the page size in dot unit ( 1 dot = 1/72th in ). This method is intended for
* internal use, if you want to access actual page size, use a QPaintDeviceMetrics object
* instead. Note that the size returned by this method does not take resolution into
* account, and that it can returns invalid size if no page metric was found in the printer
* driver. DO NOT USE, WILL BE REMOVED.
* @see setRealPageSize
* @obsolete
*/
QSize realPageSize() const;
/**
* DO NOT USE, WILL BE REMOVED.
* @obsolete
*/
void setRealPageSize( QSize p );
/**
* DO NOT USE, WILL BE REMOVED.
* @obsolete
*/
void setRealDrawableArea( const QRect& r );
/**
* DO NOT USE, WILL BE REMOVED.
* @obsolete
*/
QRect realDrawableArea() const;
void margins( uint *top, uint *left, uint *bottom, uint *right ) const;
void setMargins( uint top, uint left, uint bottom, uint right );
/**
* Returns the page list to be printed, correpsonding to the options selected by the user. This
* takes into account collate, page order, page set, ranges, ... This is useful when the
* application does page selection itself.
* @see setCurrentPage()
*/
QValueList<int> pageList() const;
/**
* Sets the KPrinter object to preview mode if @p on is true. In this mode, nothing will be
* printed but only a preview dialog will be popped up with the single "Close" action. Using
* this mode, any application can easily implement a preview action:
* \code
* void MyClass:doPreview()
* {
* // use a "clean" KPrinter object (independent from previous print jobs),
* // this is not necessary, it depends on the application
* KPrinter prt( false );
* prt.setPreviewOnly( true );
*
* QPainter painter( &prt );
* doPrint( &painter );
* }
* \endcode
* @param on the preview-only state
* @see previewOnly()
*/
void setPreviewOnly(bool on);
/**
* Returns the preview-only state for this KPrinter object.
* @see setPreviewOnly()
*/
bool previewOnly() const;
/**
* Set the resolution of the current KPrinter object. The resolution is given in DPI. This
* resolution mainly affects the accuracy for object positionning on the paint device, and
* does not influence the real resolution that will be used by the printer (this should be
* set in the driver settings). The resolution is usually defined in the constructor.
* @param dpi the resolution in DPI
* @see KPrinter(), resolution()
*/
void setResolution(int dpi);
/**
* Resturns the resolution of the current KPrinter object. The resolution is given in DPI.
* @returns resolution in DPI
* @see setResolution(), KPrinter()
*/
int resolution() const;
/**
* Define the KPrinter object to use the actual printer resolution. Under some print systems
* (CUPS, Foomatic, PostScript printers), it is possible to know the actual resolution that
* is used by the printer, as selected by the user in the driver settings. If @p on is true,
* this KPrinter object will use the actual printer resolution if it is able to extract it.
* If nothing can be found, the default resolution will be the one defined by the PrinterMode
* argument used in the KPrinter constructor, or set explicitly by setResolution().
* @param on true if the KPrinter object should use the actual printer resolution
* @see resolution(), setResolution()
*/
void setUsePrinterResolution( bool on );
/**
* For internal use only.
*/
KPrinterImpl* implementation() const;
/**
* Prints the files given in argument. This will first filter the files accorsing to the filtering
* options selected by the user in the print dialog, then send the filtered files to the printer
* with the print options selected. This function is called automatically when calling
* QPainter::end() for a painter object constructed on KPrinter. In normal use, you don't need
* this use this function explicitly.
*/
bool printFiles(const QStringList& files, bool removeafter = false, bool startviewer = true);
/**
* Adds a customized page to the print dialog. The pages will appear in a tab widget in the
* bottom half of the dialog, along with the standard "Copies" page. The page must be created
* and added each time you want open a print dialog with setup(). If you correctly
* reimplemented KPrintDialogPage::setOptions(), the settings will be restored from call
* to call, you don't have to worry about state saving/restoration.
* @param _page the page to add
* @see KPrintDialogPage::setOptions()
*/
static void addDialogPage(KPrintDialogPage* _page);
/**
* Sets the page selection mode of the application. If needed, call this method somewhere at
* the beginning of your code. The default value is @p SystemSide.
* @param _mode the mode for the application
* @see pageSelection()
*/
static void setPageSelection(PageSelectionType _mode);
/**
* Returns the page selection mode of the current application.
* @returns the page selection mode
* @see setPageSelection()
*/
static PageSelectionType pageSelection();
/**
* Sets the application type concerning the print dialog. You probably don't want to use it.
* For internal use only.
* @param type the type for this application
* @see applicationType()
*/
static void setApplicationType(ApplicationType type);
/**
* Returns the application type concerning the print dialog. For internal use only.
* @returns the type for the current application
* @see setApplicationType()
*/
static ApplicationType applicationType();
/**
* Adds a standard page to the print dialog. This is not useful yet as there's only one
* standard page defines @p CopiesPage.
* @param p the page identifier
* @see StandardPageType
*/
static void addStandardPage(int p);
/**
* Removes a standard page from the print dialog. If your application doesn't want a
* standard page in the dialog, simply call this method with the correct identifier.
* By default, the print dialog includes the @p CopiesPage page.
* @param p the page identifier
* @see StandardPageType
*/
static void removeStandardPage(int p);
/**
* Starts the add printer wizard. This utility function allows any application for
* adding a printer using the KDEPrint powerful wizard.
* @param parent the parent widget for the wizard
* @returns 1: success, 0: cancel, -1: error
*/
//static int addPrinterWizard(QWidget *parent = 0);
/**
* The KPrinter object stores all its settings in an internal QMap structure on
* QString. This allows to store any property. This method allows an application to access
* any print option from the KPrinter object, using the option name. For example if your
* application add a customized page to the print dialog, this page will saves its settings
* into the KPrinter object using this QMap<QString,QString> structure. After showing the
* print dialog, your application can then access these options using this method. The
* custom option name should follow the form "kde-appname-optionname".
* \code
* void MyClass::doPrint()
* {
* KPrinter prt;
*
* // add my custom page
* prt.addDialogPage( new MyDialogPage() );
*
* // open print dialog
* if ( prt.setup( this ) )
* {
* QString fntname = prt.option( "kde-myapp-fontname" );
* ...
* do_something;
* ...
* }
* }
* \endcode
* @param key the option name (key)
* @returns the option value correponding to the key, or QString::null
* @see KPrintDialogPage, setOption, options(), setOptions()
*/
const QString& option(const QString& key) const;
/**
* Adds or modifies an option in the KPrinter object. You probably don't need to use this function
* explicitly. This will be done implicitely for example when reimplementing
* KPrintDialogPage::getOptions().
* @param key the option name
* @param value the option value
* @see option(), KPrintDialogPage
*/
void setOption(const QString& key, const QString& value);
/**
* Returns the complete set of print options from the KPrinter object. For internal use.
* @returns the option set as a QMap object
*/
const QMap<QString,QString>& options() const;
/**
* Sets the option set in one operation. This method has some side effects like merging
* the internal map with the one given in argument, but only for option in the form
* "kde-...". For internal use only.
* @param opts the option set to be merged in the KPrinter object
*/
void setOptions(const QMap<QString,QString>& opts);
/**
* For internal use only. Does a similar job as setOption(), except that all possible
* internal printers are initialized with the option if it has the form "kde-...".
* @param opts the option set
* @see setOptions()
*/
void initOptions(const QMap<QString,QString>& opts);
/**
* Returns the search name of the printer selected by the user. Each printer is identified by
* a unique name. This method is mainly used for state restoration. For internal use.
* @returns the unique printer search name
* @see setSearchName
*/
QString searchName() const;
/**
* Sets the search name of the KPrinter object. For internal use.
* @param n the unique printer search name
* @see searchName()
*/
void setSearchName(const QString& n);
/**
* Returns the last error message issued by the print system. Unimplemented yet.
* @returns the last error message
*/
QString errorMessage() const;
/**
* Sets the last error message. For internal use.
* @param msg the error message
*/
void setErrorMessage(const QString& msg);
/**
* Configure the KPrinter object to be used with the printer named
* @p prname. After the call, the KPrinter object can be used without
* the need to call the print dialog. If @p prname is empty, then the
* KPrinter object is configured for the default printer. If @p prname
* corresponds to a pseudo-printer which needs an output file, a file
* dialog will be used. In that case, providing a parent widget for
* that dialog in @p parent may be useful.
* @param prname the name of the printer for which the KPrinter object
* has to be configured
* @param parent a parent widget, used a parent for a file dialog
* @returns boolean flag: if false, the KPrinter has not been correctly
* set up, and the application shouldn't use it to print. This may
* happen if the printer named @p prname has not been found or if the
* user clicked "Cancel" in the file dialog.
* @see setup()
*/
bool autoConfigure(const QString& prname = QString::null, QWidget *parent = 0);
/**
* Set the default document filename. This filename will be used as the
* default basename for the output file, instead of the default "print".
* For example, by using setDocFileName("my_document"), the default
* output file will be $HOME/my_document.ps.
* @param filename the default document basename to use
* @see docFileName()
*/
void setDocFileName(const QString& filename);
/**
* Get the default document filename, that is the default basename used for
* the output file.
* @returns the default document basename
* @see setDocFileName()
*/
QString docFileName() const;
/**
* Set the default document directory. This directory will be used as
* the default location for any output file. If not set, $HOME directory
* is used instead.
* @param dir the new default output directory
* @see docDirectory()
*/
void setDocDirectory( const QString& dir );
/**
* Get the default document directory, that is the directory used for
* any output file. By default, it is the $HOME directory.
* @returns the default output directory
* @see setDocDirectory
*/
QString docDirectory() const;
protected:
virtual bool cmd(int, QPainter*, QPDevCmdParam*);
virtual int metric(int) const;
void translateQtOptions();
void loadSettings();
void saveSettings();
void preparePrinting();
void finishPrinting();
void reload();
void init(bool restore = true, QPrinter::PrinterMode m = QPrinter::ScreenResolution);
bool doPreview(const QString& file);
void setRealPageSize(DrPageSize* p);
void setOption( const QString& key, const QString& value, bool broadcast );
protected:
KPrinterPrivate *d;
};
//**************************************************************************************
// Utility functions
KDEPRINT_EXPORT KPrinter::PageSize pageNameToPageSize(const QString& name);
KDEPRINT_EXPORT const char* pageSizeToPageName(KPrinter::PageSize s);
/**
* DO NOT USE, WILL BE REMOVED.
* @obsolete
*/
QSize rangeToSize( const QString& );
#endif