diff options
Diffstat (limited to 'kdeprint/kprintdialog.cpp')
-rw-r--r-- | kdeprint/kprintdialog.cpp | 987 |
1 files changed, 987 insertions, 0 deletions
diff --git a/kdeprint/kprintdialog.cpp b/kdeprint/kprintdialog.cpp new file mode 100644 index 000000000..3570393bb --- /dev/null +++ b/kdeprint/kprintdialog.cpp @@ -0,0 +1,987 @@ +/* + * 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. + **/ + +/* + * "WhatsThis" help items added by Kurt Pfeifle, August 2003, + * same copyright as above. + **/ + +#include "kprintdialog.h" +#include "kprinter.h" +#include "kprinterimpl.h" +#include "kmfactory.h" +#include "kmuimanager.h" +#include "kmmanager.h" +#include "kmprinter.h" +#include "kmvirtualmanager.h" +#include "kprintdialogpage.h" +#include "kprinterpropertydialog.h" +#include "plugincombobox.h" +#include "kpcopiespage.h" +#include "treecombobox.h" +#include "messagewindow.h" + +#include <qgroupbox.h> +#include <qcheckbox.h> +#include <kpushbutton.h> +#include <qlabel.h> +#include <qcombobox.h> +#include <qtabwidget.h> +#include <qvbox.h> +#include <qlayout.h> +#include <qregexp.h> +#include <kmessagebox.h> +#include <qdir.h> +#include <qtooltip.h> +#include <qwhatsthis.h> + +#include <klocale.h> +#include <kiconloader.h> +#include <kfiledialog.h> +#include <kurlrequester.h> +#include <klineedit.h> +#include <kdebug.h> +#include <kglobal.h> +#include <kconfig.h> +#include <kguiitem.h> +#include <kstdguiitem.h> +#include <kapplication.h> +#include <kio/renamedlg.h> + +#include <time.h> + +#define SHOWHIDE(widget,on) if (on) widget->show(); else widget->hide(); + +class KPrintDialog::KPrintDialogPrivate +{ +public: + QLabel *m_type, *m_state, *m_comment, *m_location, *m_cmdlabel, *m_filelabel; + KPushButton *m_properties, *m_default, *m_options, *m_ok, *m_extbtn; + QPushButton *m_wizard, *m_filter; + QCheckBox *m_preview; + QLineEdit *m_cmd; + TreeComboBox *m_printers; + QVBox *m_dummy; + PluginComboBox *m_plugin; + KURLRequester *m_file; + QCheckBox *m_persistent; + bool m_reduced; + + QPtrList<KPrintDialogPage> m_pages; + KPrinter *m_printer; + bool b_optionsEnabled; + bool b_propertiesEnabled; + bool b_systemEnabled; +}; + +KPrintDialog::KPrintDialog(QWidget *parent, const char *name) +: KDialog(parent,name,true) +{ + //WhatsThis strings.... (added by pfeifle@kde.org) + QString whatsThisLocationLabel = i18n( " <qt><b>Printer Location:</b> The <em>Location</em> may describe where the" + " selected printer is located. The Location description is created" + " by the administrator of the print system (or may be" + " left empty)." + " </qt>" ); + QString whatsThisPrinterType = i18n( " <qt><b>Printer Type:</b> The <em>Type</em> indicates your printer type." + " </qt>" ); + QString whatsThisPrinterState = i18n( " <qt><b>Printer State:</b> The <em>State</em> indicates the state of the" + " print queue on the print server (which could be your localhost). The" + " state may be 'Idle', 'Processing', 'Stopped', 'Paused' or similar." + " </qt>" ); + QString whatsThisPrinterComment = i18n( " <qt><b>Printer Comment:</b> The <em>Comment</em> may describe the selected" + " printer. This comment is created by the administrator" + " of the print system (or may be left empty)." + " </qt>" ); + QString whatsThisPrinterSelect = i18n( " <qt><b>Printer Selection Menu:</b> " + " <p>Use this combo box to select the printer to which you want to print." + " Initially (if you run KDEPrint for the first time), you may only find the " + " <em>KDE special printers</em> (which save" + " jobs to disk [as PostScript- or PDF-files], or deliver jobs via" + " email (as a PDF" + " attachment). If you are missing a real printer, you need to..." + " <ul>" + " <li>...either create a local printer with the help of the <em>KDE Add" + " Printer Wizard</em>. The Wizard is available for the CUPS and RLPR printing" + " systems (click button to the left of the <em>'Properties'</em> button),</li>" + " <li>...or try to connect to an existing remote" + " CUPS print server. You can connect by clicking the <em>'System Options'</em> button" + " below. A new dialog opens: click on the <em>'CUPS server'</em>" + " icon: Fill in the information required to use the remote" + " server. </li> " + " </ul>" + " <p><b>Note:</b> It may happen that you successfully connected to a remote CUPS " + " server and still do not get a printer list. If this happens: force KDEPrint to " + " re-load its configuration files." + " To reload the configuration files, either start kprinter again, or use the " + " switch the print system away from CUPS and back again once. The print system switch " + " can be made through a selection in the drop-down menu at bottom of this dialog when " + " fully expanded). </p> " + " </qt>" ); + QString whatsThisPrintJobProperties = i18n( " <qt><b>Print Job Properties:</b> " + " <p>This button opens a dialog where you can make decisions" + " regarding all supported print job options." + " </qt>" ); + QString whatsThisPrinterFilter = i18n( " <qt><b>Selective View on List of Printers:</b>" + " <p> This button reduces the list of visible printers" + " to a shorter, more convenient, pre-defined list.</p>" + " <p>This is particularly useful in enterprise environments" + " with lots of printers. The default is to show <b>all</b> printers.</p>" + " <p>To create a personal <em>'selective view list'</em>, click on the" + " <em>'System Options'</em> button at the bottom of this dialog." + " Then, in the new dialog, select <em>'Filter'</em> (left column in the" + " <em>KDE Print Configuration</em> dialog) and setup your selection..</p>" + " <p><b>Warning:</b> Clicking this button without prior creation of a personal " + " <em>'selective view list'</em> will make all printers dissappear from the " + " view. (To re-enable all printers, just click this button again.) </p> " + " </qt>" ); + QString whatsThisAddPrinterWizard = i18n( "<qt><b>KDE Add Printer Wizard</b>" + " <p>This button starts the <em>KDE Add Printer Wizard</em>.</p>" + " <p>Use the Wizard (with <em>\"CUPS\"</em> or <em>\"RLPR\"</em>) to add locally" + " defined printers to your system. </p>" + " <p><b>Note:</b> The <em>KDE Add Printer Wizard</em> does <b>not</b> work, " + " and this button is disabled if you use " + " <em>\"Generic LPD</em>\", <em>\"LPRng\"</em>, or <em>\"Print Through " + " an External Program</em>\".) </p> " + " </qt>" ); + QString whatsThisExternalPrintCommand = i18n( " <qt><b>External Print Command</b>" + " <p>Here you can enter any command that would also print for you in " + " a <em>konsole</em> window. </p>" + " <b>Example:</b> <pre>a2ps -P <printername> --medium=A3</pre>." + " </qt>" ); + QString whatsThisOptions = i18n( " <qt><b>Additional Print Job Options</b>" + " <p>This button shows or hides additional printing options.</qt>" ); + QString whatsThisSystemOptions = i18n( " <qt><b>System Options:</b> " + " <p>This button starts a new dialog where you can adjust various" + " settings of your printing system. Amongst them:" + " <ul><li> Should KDE" + " applications embed all fonts into the PostScript they" + " generate for printing?" + " <li> Should KDE use an external PostScript viewer" + " like <em>gv</em> for print page previews?" + " <li> Should KDEPrint use a local or a remote CUPS server?," + " </ul> and many more.... " + " </qt>" ); + + QString whatsThisHelpButton = i18n( " <qt><b>Help:</b> This button takes you to the complete <em>KDEPrint" + " Manual</em>." + " </qt>" ); + + QString whatsThisCancelButton = i18n( " <qt><b>Cancel:</b> This button cancels your print job and quits the" + " kprinter dialog." + " </qt>" ); + + QString whatsThisPrintButton = i18n( " <qt><b>Print:</b> This button sends the job to the printing process." + " If you are sending non-PostScript files, you may be" + " asked if you want KDE to convert the files into PostScript," + " or if you want your print subsystem (like CUPS) to do this." + " </qt>" ); + + QString whatsThisKeepDialogOpenCheckbox = i18n( " <qt><b>Keep Printing Dialog Open</b>" + "<p>If you enable this checkbox, the printing dialog" + " stays open after you hit the <em>Print</em> button.</p>" + " <p> This is" + " especially useful, if you need to test various" + " print settings (like color matching for an inkjet printer)" + " or if you want to send your job to multiple printers (one after" + " the other) to have it finished more quickly.</p>" + " </qt>" ); + + QString whatsThisOutputFileLabel = i18n(" <qt><b>Output File Name and Path:</b> The \"Output file:\" shows " + " you where your file will be" + " saved if you decide to \"Print to File\" your job, using one of the" + " KDE <em>Special Printers</em> named \"Print to File (PostScript)\"" + " or \"Print to File (PDF)\". Choose a name and location that suits" + " your need by using the button and/or editing the line on the right." + " </qt>" ); + + QString whatsThisOutputFileLineedit = i18n(" <qt><b>Output File Name and Path:</b> Edit this line to create a " + " path and filename that suits your needs." + " (Button and Lineedit field are only available if you \"Print to File\")" + " </qt>" ); + + QString whatsThisOutputFileButton = i18n(" <qt><b>Browse Directories button:<b> This button calls " + " the \"File Open / Browsed Directories\" dialog to let you" + " choose a directory and file name where your \"Print-to-File\"" + " job should be saved." + " </qt>" ); + + QString whatsThisAddFileButton = i18n( " <qt><b>Add File to Job</b>" + " <p>This button calls the \"File Open / Browse Directories\" dialog to allow you" + " to select a file for printing. Note, that " + " <ul><li>you can select ASCII or International Text, PDF," + " PostScript, JPEG, TIFF, PNG, GIF and many other graphical" + " formats." + " <li>you can select various files from different paths" + " and send them as one \"multi-file job\" to the printing" + " system." + " </ul>" + " </qt>" ); + + QString whatsThisPreviewCheckBox = i18n(" <qt><b>Print Preview</b>" + " Enable this checkbox if you want to see a preview of" + " your printout. A preview lets you check if, for instance," + " your intended \"poster\" or \"pamphlet\" layout" + " looks like you expected, without wasting paper first. It" + " also lets you cancel the job if something looks wrong. " + " <p><b>Note:</b> The preview feature (and therefore this checkbox) " + " is only visible for printjobs created from inside KDE applications. " + " If you start kprinter from the commandline, or if you use kprinter " + " as a print command for non-KDE applications (like Acrobat Reader, " + " Firefox or OpenOffice), print preview is not available here. " + " </qt>" ); + + QString whatsThisSetDefaultPrinter = i18n(" <qt><b>Set as Default Printer</b>" + " This button sets the current printer as the user's" + " default. " + " <p><b>Note:</b> (Button is only visible if the checkbox for " + " <em>System Options</em>" + " --> <em>General</em> --> <em>Miscellaneous</em>: <em>\"Defaults" + " to the last printer used in the application\"</em> is disabled.)" + " </qt>" ); + d = new KPrintDialogPrivate; + + d->m_pages.setAutoDelete(false); + d->m_printer = 0; + setCaption(i18n("Print")); + + // widget creation + QGroupBox *m_pbox = new QGroupBox(0,Qt::Vertical,i18n("Printer"), this); + d->m_type = new QLabel(m_pbox); + QWhatsThis::add(d->m_type, whatsThisPrinterType); + d->m_state = new QLabel(m_pbox); + QWhatsThis::add(d->m_state, whatsThisPrinterState); + d->m_comment = new QLabel(m_pbox); + QWhatsThis::add(d->m_comment, whatsThisPrinterComment); + d->m_location = new QLabel(m_pbox); + QWhatsThis::add(d->m_location, whatsThisLocationLabel); + + d->m_printers = new TreeComboBox(m_pbox); + QWhatsThis::add(d->m_printers, whatsThisPrinterSelect); + d->m_printers->setMinimumHeight(25); + QLabel *m_printerlabel = new QLabel(i18n("&Name:"), m_pbox); + QWhatsThis::add(m_printerlabel, whatsThisPrinterSelect); + QLabel *m_statelabel = new QLabel(i18n("Status", "State:"), m_pbox); + QWhatsThis::add(m_statelabel, whatsThisPrinterState); + QLabel *m_typelabel = new QLabel(i18n("Type:"), m_pbox); + QWhatsThis::add(m_typelabel, whatsThisPrinterType); + QLabel *m_locationlabel = new QLabel(i18n("Location:"), m_pbox); + QWhatsThis::add(m_locationlabel, whatsThisLocationLabel); + QLabel *m_commentlabel = new QLabel(i18n("Comment:"), m_pbox); + QWhatsThis::add(m_commentlabel, whatsThisPrinterComment); + m_printerlabel->setBuddy(d->m_printers); + d->m_properties = new KPushButton(KGuiItem(i18n("P&roperties"), "edit"), m_pbox); + QWhatsThis::add( d->m_properties, whatsThisPrintJobProperties); + d->m_options = new KPushButton(KGuiItem(i18n("System Op&tions"), "kdeprint_configmgr"), this); + QWhatsThis::add(d->m_options,whatsThisSystemOptions); + d->m_default = new KPushButton(KGuiItem(i18n("Set as &Default"), "kdeprint_defaultsoft"), m_pbox); + QWhatsThis::add(d->m_default,whatsThisSetDefaultPrinter); + d->m_filter = new QPushButton(m_pbox); + d->m_filter->setPixmap(SmallIcon("filter")); + d->m_filter->setMinimumSize(QSize(d->m_printers->minimumHeight(),d->m_printers->minimumHeight())); + d->m_filter->setToggleButton(true); + d->m_filter->setOn(KMManager::self()->isFilterEnabled()); + QToolTip::add(d->m_filter, i18n("Toggle selective view on printer list")); + QWhatsThis::add(d->m_filter, whatsThisPrinterFilter); + d->m_wizard = new QPushButton(m_pbox); + d->m_wizard->setPixmap(SmallIcon("wizard")); + d->m_wizard->setMinimumSize(QSize(d->m_printers->minimumHeight(),d->m_printers->minimumHeight())); + QToolTip::add(d->m_wizard, i18n("Add printer...")); + QWhatsThis::add(d->m_wizard, whatsThisAddPrinterWizard); + d->m_ok = new KPushButton(KGuiItem(i18n("&Print"), "fileprint"), this); + QWhatsThis::add( d->m_ok, whatsThisPrintButton); + d->m_ok->setDefault(true); + d->m_ok->setEnabled( false ); + QPushButton *m_cancel = new KPushButton(KStdGuiItem::cancel(), this); + QWhatsThis::add(m_cancel, whatsThisCancelButton); + d->m_preview = new QCheckBox(i18n("Previe&w"), m_pbox); + QWhatsThis::add(d->m_preview, whatsThisPreviewCheckBox); + d->m_filelabel = new QLabel(i18n("O&utput file:"), m_pbox); + QWhatsThis::add(d->m_filelabel,whatsThisOutputFileLabel); + d->m_file = new KURLRequester(QDir::homeDirPath()+"/print.ps", m_pbox); + QWhatsThis::add(d->m_file,whatsThisOutputFileLineedit); + d->m_file->setEnabled(false); + d->m_filelabel->setBuddy(d->m_file); + d->m_cmdlabel = new QLabel(i18n("Print co&mmand:"), m_pbox); + QWhatsThis::add( d->m_cmdlabel, whatsThisExternalPrintCommand); + + d->m_cmd = new QLineEdit(m_pbox); + QWhatsThis::add( d->m_cmd, whatsThisExternalPrintCommand); + d->m_cmdlabel->setBuddy(d->m_cmd); + d->m_dummy = new QVBox(this); + d->m_plugin = new PluginComboBox(this); + d->m_extbtn = new KPushButton(this); + QToolTip::add(d->m_extbtn, i18n("Show/hide advanced options")); + QWhatsThis::add(d->m_extbtn, whatsThisOptions); + d->m_persistent = new QCheckBox(i18n("&Keep this dialog open after printing"), this); + QWhatsThis::add( d->m_persistent, whatsThisKeepDialogOpenCheckbox); + QPushButton *m_help = new KPushButton(KStdGuiItem::help(), this); + QWhatsThis::add( m_help, whatsThisHelpButton); + + QWidget::setTabOrder( d->m_printers, d->m_filter ); + QWidget::setTabOrder( d->m_filter, d->m_wizard ); + QWidget::setTabOrder( d->m_wizard, d->m_properties ); + QWidget::setTabOrder( d->m_properties, d->m_preview ); + QWidget::setTabOrder( d->m_preview, d->m_file ); + QWidget::setTabOrder( d->m_file, d->m_cmd ); + QWidget::setTabOrder( d->m_plugin, d->m_persistent ); + QWidget::setTabOrder( d->m_persistent, d->m_extbtn ); + QWidget::setTabOrder( d->m_extbtn, d->m_options ); + QWidget::setTabOrder( d->m_options, m_help ); + QWidget::setTabOrder( m_help, d->m_ok ); + QWidget::setTabOrder( d->m_ok, m_cancel ); + + // layout creation + QVBoxLayout *l1 = new QVBoxLayout(this, 10, 10); + l1->addWidget(m_pbox,0); + l1->addWidget(d->m_dummy,1); + l1->addWidget(d->m_plugin,0); + l1->addWidget(d->m_persistent); + QHBoxLayout *l2 = new QHBoxLayout(0, 0, 10); + l1->addLayout(l2); + l2->addWidget(d->m_extbtn,0); + l2->addWidget(d->m_options,0); + l2->addWidget(m_help,0); + l2->addStretch(1); + l2->addWidget(d->m_ok,0); + l2->addWidget(m_cancel,0); + QGridLayout *l3 = new QGridLayout(m_pbox->layout(),3,3,7); + l3->setColStretch(1,1); + l3->setRowStretch(0,1); + QGridLayout *l4 = new QGridLayout(0, 5, 2, 0, 5); + l3->addMultiCellLayout(l4,0,0,0,1); + l4->addWidget(m_printerlabel,0,0); + l4->addWidget(m_statelabel,1,0); + l4->addWidget(m_typelabel,2,0); + l4->addWidget(m_locationlabel,3,0); + l4->addWidget(m_commentlabel,4,0); + QHBoxLayout *ll4 = new QHBoxLayout(0, 0, 3); + l4->addLayout(ll4,0,1); + ll4->addWidget(d->m_printers,1); + ll4->addWidget(d->m_filter,0); + ll4->addWidget(d->m_wizard,0); + //l4->addWidget(d->m_printers,0,1); + l4->addWidget(d->m_state,1,1); + l4->addWidget(d->m_type,2,1); + l4->addWidget(d->m_location,3,1); + l4->addWidget(d->m_comment,4,1); + l4->setColStretch(1,1); + QVBoxLayout *l5 = new QVBoxLayout(0, 0, 10); + l3->addLayout(l5,0,2); + l5->addWidget(d->m_properties,0); + l5->addWidget(d->m_default,0); + l5->addWidget(d->m_preview,0); + l5->addStretch(1); + //*** + l3->addWidget(d->m_filelabel,1,0); + l3->addWidget(d->m_file,1,1); + //*** + l3->addWidget(d->m_cmdlabel,2,0); + l3->addMultiCellWidget(d->m_cmd,2,2,1,2); + + // connections + connect(d->m_ok,SIGNAL(clicked()),SLOT(accept())); + connect(m_cancel,SIGNAL(clicked()),SLOT(reject())); + connect(d->m_properties,SIGNAL(clicked()),SLOT(slotProperties())); + connect(d->m_default,SIGNAL(clicked()),SLOT(slotSetDefault())); + connect(d->m_printers,SIGNAL(activated(int)),SLOT(slotPrinterSelected(int))); + connect(d->m_options,SIGNAL(clicked()),SLOT(slotOptions())); + connect(d->m_wizard,SIGNAL(clicked()),SLOT(slotWizard())); + connect(d->m_extbtn, SIGNAL(clicked()), SLOT(slotExtensionClicked())); + connect(d->m_filter, SIGNAL(toggled(bool)), SLOT(slotToggleFilter(bool))); + connect(m_help, SIGNAL(clicked()), SLOT(slotHelp())); + connect(d->m_file, SIGNAL(urlSelected(const QString&)), SLOT(slotOutputFileSelected(const QString&))); + connect( d->m_file, SIGNAL( openFileDialog( KURLRequester* ) ), SLOT( slotOpenFileDialog() ) ); + connect( KMFactory::self()->manager(), SIGNAL( updatePossible( bool ) ), SLOT( slotUpdatePossible( bool ) ) ); + + d->b_optionsEnabled = kapp->authorize("print/options") && kapp->authorize("print/selection"); + d->b_propertiesEnabled = kapp->authorize("print/properties") && kapp->authorize("print/selection"); + d->b_systemEnabled = kapp->authorize("print/system") && kapp->authorize("print/selection"); + + if (!d->b_systemEnabled) + { + d->m_plugin->hide(); + } + + if (!d->b_optionsEnabled) + { + d->m_options->hide(); + } + + if (!d->b_propertiesEnabled) + { + d->m_properties->hide(); + d->m_wizard->hide(); + } + + if (!kapp->authorize("print/selection")) + { + d->m_extbtn->hide(); + m_pbox->hide(); + + expandDialog(true); + } + else + { + KConfig *config = KGlobal::config(); + config->setGroup("KPrinter Settings"); + expandDialog(!config->readBoolEntry("DialogReduced", (KMFactory::self()->settings()->application != KPrinter::StandAlone))); + } +} + +KPrintDialog::~KPrintDialog() +{ + KConfig *config = KGlobal::config(); + config->setGroup("KPrinter Settings"); + config->writeEntry("DialogReduced", d->m_reduced); + + delete d; +} + +void KPrintDialog::setFlags(int f) +{ + SHOWHIDE(d->m_properties, (f & KMUiManager::Properties) && d->b_propertiesEnabled) + d->m_default->hide(); + SHOWHIDE(d->m_default, ((f & KMUiManager::Default) && !KMFactory::self()->printConfig("General")->readBoolEntry("UseLast", true))) + SHOWHIDE(d->m_preview, (f & KMUiManager::Preview)) + bool on = (f & KMUiManager::OutputToFile); + SHOWHIDE(d->m_filelabel, on) + SHOWHIDE(d->m_file, on) + on = (f & KMUiManager::PrintCommand); + SHOWHIDE(d->m_cmdlabel, on) + SHOWHIDE(d->m_cmd, on) + SHOWHIDE(d->m_persistent, (f & KMUiManager::Persistent)) + + // also update "wizard" button + KMManager *mgr = KMFactory::self()->manager(); + d->m_wizard->setEnabled((mgr->hasManagement() && (mgr->printerOperationMask() & KMManager::PrinterCreation))); +} + +void KPrintDialog::setDialogPages(QPtrList<KPrintDialogPage> *pages) +{ + if (!pages) return; + if (pages->count() + d->m_pages.count() == 1) + { + // only one page, reparent the page to d->m_dummy and remove any + // QTabWidget child if any. + if (pages->count() > 0) + d->m_pages.append(pages->take(0)); + d->m_pages.first()->reparent(d->m_dummy, QPoint(0,0)); + d->m_pages.first()->show(); + delete d->m_dummy->child("TabWidget", "QTabWidget"); + } + else + { + // more than one page. + QTabWidget *tabs = static_cast<QTabWidget*>(d->m_dummy->child("TabWidget", "QTabWidget")); + if (!tabs) + { + // QTabWidget doesn't exist. Create it and reparent all + // already existing pages. + tabs = new QTabWidget(d->m_dummy, "TabWidget"); + tabs->setMargin(10); + for (d->m_pages.first(); d->m_pages.current(); d->m_pages.next()) + { + tabs->addTab(d->m_pages.current(), d->m_pages.current()->title()); + } + } + while (pages->count() > 0) + { + KPrintDialogPage *page = pages->take(0); + d->m_pages.append(page); + tabs->addTab(page, page->title()); + } + tabs->show(); + } + d->m_extbtn->setEnabled(d->m_pages.count() > 0); +} + +KPrintDialog* KPrintDialog::printerDialog(KPrinter *printer, QWidget *parent, const QString& caption, bool forceExpand) +{ + if (printer) + { + KPrintDialog *dlg = new KPrintDialog(parent); + // needs to set the printer before setting up the + // print dialog as some additional pages may need it. + // Real initialization comes after. + dlg->d->m_printer = printer; + KMFactory::self()->uiManager()->setupPrintDialog(dlg); + dlg->init(); + if (!caption.isEmpty()) + dlg->setCaption(caption); + if (forceExpand) + { + // we force the dialog to be expanded: + // - expand the dialog + // - hide the show/hide button + dlg->expandDialog(true); + dlg->d->m_extbtn->hide(); + } + return dlg; + } + return NULL; +} + +void KPrintDialog::initialize(KPrinter *printer) +{ + d->m_printer = printer; + + // first retrieve printer list and update combo box (get default or last used printer also) + QPtrList<KMPrinter> *plist = KMFactory::self()->manager()->printerList(); + if (!KMManager::self()->errorMsg().isEmpty()) + { + KMessageBox::error(parentWidget(), + "<qt><nobr>"+ + i18n("An error occurred while retrieving the printer list:") + +"</nobr><br><br>"+KMManager::self()->errorMsg()+"</qt>"); + } + + if (plist) + { + QString oldP = d->m_printers->currentText(); + d->m_printers->clear(); + QPtrListIterator<KMPrinter> it(*plist); + int defsoft(-1), defhard(-1), defsearch(-1); + bool sep(false); + for (;it.current();++it) + { + // skip invalid printers + if ( !it.current()->isValid() ) + continue; + + if (!sep && it.current()->isSpecial()) + { + sep = true; + d->m_printers->insertItem(QPixmap(), QString::fromLatin1("--------")); + } + d->m_printers->insertItem(SmallIcon(it.current()->pixmap(),0,(it.current()->isValid() ? (int)KIcon::DefaultState : (int)KIcon::LockOverlay)),it.current()->name(),false/*sep*/); + if (it.current()->isSoftDefault()) + defsoft = d->m_printers->count()-1; + if (it.current()->isHardDefault()) + defhard = d->m_printers->count()-1; + if (!oldP.isEmpty() && oldP == it.current()->name()) + defsearch = d->m_printers->count()-1; + else if (defsearch == -1 && it.current()->name() == printer->searchName()) + defsearch = d->m_printers->count()-1; + } + int defindex = (defsearch != -1 ? defsearch : (defsoft != -1 ? defsoft : QMAX(defhard,0))); + d->m_printers->setCurrentItem(defindex); + //slotPrinterSelected(defindex); + } + + // Initialize output filename + if (!d->m_printer->outputFileName().isEmpty()) + d->m_file->setURL( d->m_printer->outputFileName() ); + else if (!d->m_printer->docFileName().isEmpty()) + d->m_file->setURL( d->m_printer->docDirectory()+"/"+d->m_printer->docFileName()+".ps" ); + + if ( d->m_printers->count() > 0 ) + slotPrinterSelected( d->m_printers->currentItem() ); + + // update with KPrinter options + if (d->m_printer->option("kde-preview") == "1" || d->m_printer->previewOnly()) + d->m_preview->setChecked(true); + d->m_preview->setEnabled(!d->m_printer->previewOnly()); + d->m_cmd->setText(d->m_printer->option("kde-printcommand")); + QPtrListIterator<KPrintDialogPage> it(d->m_pages); + for (;it.current();++it) + it.current()->setOptions(d->m_printer->options()); +} + +void KPrintDialog::slotPrinterSelected(int index) +{ + bool ok(false); + d->m_location->setText(QString::null); + d->m_state->setText(QString::null); + d->m_comment->setText(QString::null); + d->m_type->setText(QString::null); + if (index >= 0 && index < d->m_printers->count()) + { + KMManager *mgr = KMFactory::self()->manager(); + KMPrinter *p = mgr->findPrinter(d->m_printers->text(index)); + if (p) + { + if (!p->isSpecial()) mgr->completePrinterShort(p); + d->m_location->setText(p->location()); + d->m_comment->setText(p->driverInfo()); + d->m_type->setText(p->description()); + d->m_state->setText(p->stateString()); + ok = p->isValid(); + enableSpecial(p->isSpecial()); + enableOutputFile(p->option("kde-special-file") == "1"); + setOutputFileExtension(p->option("kde-special-extension")); + } + else + enableOutputFile( ok ); + } + d->m_properties->setEnabled(ok); + d->m_ok->setEnabled(ok); +} + +void KPrintDialog::slotProperties() +{ + if (!d->m_printer) return; + + KMPrinter *prt = KMFactory::self()->manager()->findPrinter(d->m_printers->currentText()); + if (prt) + KPrinterPropertyDialog::setupPrinter(prt, this); +} + +void KPrintDialog::slotSetDefault() +{ + KMPrinter *p = KMFactory::self()->manager()->findPrinter(d->m_printers->currentText()); + if (p) + KMFactory::self()->virtualManager()->setDefault(p); +} + +void KPrintDialog::done(int result) +{ + if (result == Accepted && d->m_printer) + { + QMap<QString,QString> opts; + KMPrinter *prt(0); + + // get options from global pages + QString msg; + QPtrListIterator<KPrintDialogPage> it(d->m_pages); + for (;it.current();++it) + if (it.current()->isEnabled()) + { + if (it.current()->isValid(msg)) + it.current()->getOptions(opts); + else + { + KMessageBox::error(this, msg.prepend("<qt>").append("</qt>")); + return; + } + } + + // add options from the dialog itself + // TODO: ADD PRINTER CHECK MECHANISM !!! + prt = KMFactory::self()->manager()->findPrinter(d->m_printers->currentText()); + if (prt->isSpecial() && prt->option("kde-special-file") == "1") + { + if (!checkOutputFile()) return; + d->m_printer->setOutputToFile(true); + /* be sure to decode the output filename */ + d->m_printer->setOutputFileName( KURL::decode_string( d->m_file->url() ) ); + } + else + d->m_printer->setOutputToFile(false); + d->m_printer->setPrinterName(prt->printerName()); + d->m_printer->setSearchName(prt->name()); + opts["kde-printcommand"] = d->m_cmd->text(); + opts["kde-preview"] = (d->m_preview->isChecked() ? "1" : "0"); + opts["kde-isspecial"] = (prt->isSpecial() ? "1" : "0"); + opts["kde-special-command"] = prt->option("kde-special-command"); + + // merge options with KMPrinter object options + QMap<QString,QString> popts = (prt->isEdited() ? prt->editedOptions() : prt->defaultOptions()); + for (QMap<QString,QString>::ConstIterator it=popts.begin(); it!=popts.end(); ++it) + opts[it.key()] = it.data(); + + // update KPrinter object + d->m_printer->setOptions(opts); + + emit printRequested(d->m_printer); + // close dialog if not persistent + if (!d->m_persistent->isChecked() || !d->m_persistent->isVisible()) + KDialog::done(result); + } + else + KDialog::done(result); +} + +bool KPrintDialog::checkOutputFile() +{ + bool value(false); + if (d->m_file->url().isEmpty()) + KMessageBox::error(this,i18n("The output filename is empty.")); + else + { + KURL url( d->m_file->url() ); + if ( !url.isLocalFile() ) + return true; + + bool anotherCheck; + do + { + anotherCheck = false; + QFileInfo f(url.path()); + if (f.exists()) + { + if (f.isWritable()) + { + //value = (KMessageBox::warningYesNo(this,i18n("File \"%1\" already exists. Overwrite?").arg(f.absFilePath())) == KMessageBox::Yes); + time_t mtimeDest = f.lastModified().toTime_t(); + KIO::RenameDlg dlg( this, i18n( "Print" ), QString::null, d->m_file->url(), + KIO::M_OVERWRITE, ( time_t ) -1, f.size(), ( time_t ) -1, f.created().toTime_t() , mtimeDest+1, mtimeDest, true ); + int result = dlg.exec(); + switch ( result ) + { + case KIO::R_OVERWRITE: + value = true; + break; + default: + case KIO::R_CANCEL: + value = false; + break; + case KIO::R_RENAME: + url = dlg.newDestURL(); + d->m_file->setURL( url.path() ); + value = true; + anotherCheck = true; + break; + } + } + else + KMessageBox::error(this,i18n("You don't have write permissions to this file.")); + } + else + { + QFileInfo d( f.dirPath( true ) ); + if ( !d.exists() ) + KMessageBox::error( this, i18n( "The output directory does not exist." ) ); + else if ( !d.isWritable() ) + KMessageBox::error(this,i18n("You don't have write permissions in that directory.")); + else + value = true; + } + } while( anotherCheck ); + } + return value; +} + +void KPrintDialog::slotOptions() +{ + if (KMManager::self()->invokeOptionsDialog(this)) + init(); +} + +void KPrintDialog::enableOutputFile(bool on) +{ + d->m_filelabel->setEnabled(on); + d->m_file->setEnabled(on); +} + +void KPrintDialog::enableSpecial(bool on) +{ + d->m_default->setDisabled(on); + d->m_cmdlabel->setDisabled(on); + d->m_cmd->setDisabled(on); + KPCopiesPage *copypage = (KPCopiesPage*)child("CopiesPage","KPCopiesPage"); + if (copypage) + copypage->initialize(!on); + // disable/enable all other pages (if needed) + for (d->m_pages.first(); d->m_pages.current(); d->m_pages.next()) + if (d->m_pages.current()->onlyRealPrinters()) + d->m_pages.current()->setEnabled(!on); +} + +void KPrintDialog::setOutputFileExtension(const QString& ext) +{ + if (!ext.isEmpty()) + { + KURL url( d->m_file->url() ); + QString f( url.fileName() ); + int p = f.findRev( '.' ); + // change "file.ext"; don't change "file", "file." or ".file" but do change ".file.ext" + if ( p > 0 && p != int (f.length () - 1) ) + { + url.setFileName( f.left( p ) + "." + ext ); + d->m_file->setURL( KURL::decode_string( url.url() ) ); + } + } +} + +void KPrintDialog::slotWizard() +{ + int result = KMFactory::self()->manager()->addPrinterWizard(this); + if (result == -1) + KMessageBox::error(this, KMFactory::self()->manager()->errorMsg().prepend("<qt>").append("</qt>")); + else if (result == 1) + initialize(d->m_printer); +} + +void KPrintDialog::reload() +{ + // remove printer dependent pages (usually from plugin) + QTabWidget *tabs = static_cast<QTabWidget*>(d->m_dummy->child("TabWidget", "QTabWidget")); + for (uint i=0; i<d->m_pages.count(); i++) + if (d->m_pages.at(i)->onlyRealPrinters()) + { + KPrintDialogPage *page = d->m_pages.take(i--); + if (tabs) + tabs->removePage(page); + delete page; + } + // reload printer dependent pages from plugin + QPtrList<KPrintDialogPage> pages; + pages.setAutoDelete(false); + KMFactory::self()->uiManager()->setupPrintDialogPages(&pages); + // add those pages to the dialog + setDialogPages(&pages); + if (!d->m_reduced) + d->m_dummy->show(); + // other initializations + setFlags(KMFactory::self()->uiManager()->dialogFlags()); + connect( KMFactory::self()->manager(), SIGNAL( updatePossible( bool ) ), SLOT( slotUpdatePossible( bool ) ) ); + init(); +} + +void KPrintDialog::configChanged() +{ + // simply update the printer list: do it all the time + // as changing settings may influence the way printer + // are listed. + init(); + + // update the GUI + setFlags(KMFactory::self()->uiManager()->dialogFlags()); +} + +void KPrintDialog::expandDialog(bool on) +{ + QSize sz(size()); + bool needResize(isVisible()); + + if (on) + { + sz.setHeight(sz.height()+d->m_dummy->minimumSize().height()+d->m_plugin->minimumSize().height()+2*layout()->spacing()); + if (isVisible() || !d->m_dummy->isVisible() || !d->m_plugin->isVisible()) + { + d->m_dummy->show(); + if (d->b_systemEnabled) + d->m_plugin->show(); + } + d->m_extbtn->setIconSet(SmallIconSet("up")); + d->m_extbtn->setText(i18n("&Options <<")); + d->m_reduced = false; + } + else + { + sz.setHeight(sz.height()-d->m_dummy->height()-d->m_plugin->height()-2*layout()->spacing()); + if (!isVisible() || d->m_dummy->isVisible() || d->m_plugin->isVisible()) + { + d->m_dummy->hide(); + if (d->b_systemEnabled) + d->m_plugin->hide(); + } + d->m_extbtn->setIconSet(SmallIconSet("down")); + d->m_extbtn->setText(i18n("&Options >>")); + d->m_reduced = true; + } + + if (needResize) + { + layout()->activate(); + resize(sz); + } +} + +void KPrintDialog::slotExtensionClicked() +{ + // As all pages are children of d->m_dummy, I simply have to hide/show it + expandDialog(!(d->m_dummy->isVisible())); +} + +KPrinter* KPrintDialog::printer() const +{ + return d->m_printer; +} + +void KPrintDialog::slotToggleFilter(bool on) +{ + KMManager::self()->enableFilter(on); + initialize(d->m_printer); +} + +void KPrintDialog::slotHelp() +{ + kapp->invokeHelp(QString::null, "kdeprint"); +} + +void KPrintDialog::slotOutputFileSelected(const QString& txt) +{ + d->m_file->setURL( txt ); +} + +void KPrintDialog::init() +{ + d->m_ok->setEnabled( false ); + MessageWindow::remove( this ); + MessageWindow::add( this, i18n( "Initializing printing system..." ), 500 ); + KMFactory::self()->manager()->checkUpdatePossible(); +} + +void KPrintDialog::slotUpdatePossible( bool flag ) +{ + MessageWindow::remove( this ); + if ( !flag ) + KMessageBox::error(parentWidget(), + "<qt><nobr>"+ + i18n("An error occurred while retrieving the printer list:") + +"</nobr><br><br>"+KMManager::self()->errorMsg()+"</qt>"); + initialize( d->m_printer ); +} + +void KPrintDialog::enableDialogPage( int index, bool flag ) +{ + if ( index < 0 || index >= ( int )d->m_pages.count() ) + { + kdWarning() << "KPrintDialog: page index out of bound" << endl; + return; + } + + if ( d->m_pages.count() > 1 ) + { + QTabWidget *tabs = static_cast<QTabWidget*>(d->m_dummy->child("TabWidget", "QTabWidget")); + tabs->setTabEnabled( d->m_pages.at( index ), flag ); + } + else + d->m_pages.at( 0 )->setEnabled( flag ); +} + +void KPrintDialog::slotOpenFileDialog() +{ + KFileDialog *dialog = d->m_file->fileDialog(); + + dialog->setCaption(i18n("Print to File")); + dialog->setMode(d->m_file->fileDialog()->mode() & ~KFile::LocalOnly); + dialog->setOperationMode( KFileDialog::Saving ); + + KMPrinter *prt = KMFactory::self()->manager()->findPrinter(d->m_printers->currentText()); + if (prt) + { + QString mimetype(prt->option("kde-special-mimetype")); + QString ext(prt->option("kde-special-extension")); + + if (!mimetype.isEmpty()) + { + QStringList filter; + filter << mimetype; + filter << "all/allfiles"; + dialog->setMimeFilter (filter, mimetype); + } + else if (!ext.isEmpty()) + dialog->setFilter ("*." + ext + "\n*|" + i18n ("All Files")); + } +} + +#include "kprintdialog.moc" |