/* * This file is part of the KDE libraries * Copyright (c) 2001 Michael Goffioul * * 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 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #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; TQPtrList m_pages; KPrinter *m_printer; bool b_optionsEnabled; bool b_propertiesEnabled; bool b_systemEnabled; }; KPrintDialog::KPrintDialog(TQWidget *parent, const char *name) : KDialog(parent,name,true) { //WhatsThis strings.... (added by pfeifle@kde.org) TQString whatsThisLocationLabel = i18n( " Printer Location: The Location 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)." " " ); TQString whatsThisPrinterType = i18n( " Printer Type: The Type indicates your printer type." " " ); TQString whatsThisPrinterState = i18n( " Printer State: The State 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." " " ); TQString whatsThisPrinterComment = i18n( " Printer Comment: The Comment may describe the selected" " printer. This comment is created by the administrator" " of the print system (or may be left empty)." " " ); TQString whatsThisPrinterSelect = i18n( " Printer Selection Menu: " "

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 " " KDE special printers (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..." "

    " "
  • ...either create a local printer with the help of the KDE Add" " Printer Wizard. The Wizard is available for the CUPS and RLPR printing" " systems (click button to the left of the 'Properties' button),
  • " "
  • ...or try to connect to an existing remote" " CUPS print server. You can connect by clicking the 'System Options' button" " below. A new dialog opens: click on the 'CUPS server'" " icon: Fill in the information required to use the remote" " server.
  • " "
" "

Note: 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).

" "
" ); TQString whatsThisPrintJobProperties = i18n( " Print Job Properties: " "

This button opens a dialog where you can make decisions" " regarding all supported print job options." " " ); TQString whatsThisPrinterFilter = i18n( " Selective View on List of Printers:" "

This button reduces the list of visible printers" " to a shorter, more convenient, pre-defined list.

" "

This is particularly useful in enterprise environments" " with lots of printers. The default is to show all printers.

" "

To create a personal 'selective view list', click on the" " 'System Options' button at the bottom of this dialog." " Then, in the new dialog, select 'Filter' (left column in the" " KDE Print Configuration dialog) and setup your selection..

" "

Warning: Clicking this button without prior creation of a personal " " 'selective view list' will make all printers dissappear from the " " view. (To re-enable all printers, just click this button again.)

" "
" ); TQString whatsThisAddPrinterWizard = i18n( "KDE Add Printer Wizard" "

This button starts the KDE Add Printer Wizard.

" "

Use the Wizard (with \"CUPS\" or \"RLPR\") to add locally" " defined printers to your system.

" "

Note: The KDE Add Printer Wizard does not work, " " and this button is disabled if you use " " \"Generic LPD\", \"LPRng\", or \"Print Through " " an External Program\".)

" "
" ); TQString whatsThisExternalPrintCommand = i18n( " External Print Command" "

Here you can enter any command that would also print for you in " " a konsole window.

" " Example:
a2ps -P <printername> --medium=A3
." "
" ); TQString whatsThisOptions = i18n( " Additional Print Job Options" "

This button shows or hides additional printing options." ); TQString whatsThisSystemOptions = i18n( " System Options: " "

This button starts a new dialog where you can adjust various" " settings of your printing system. Amongst them:" "

  • Should KDE" " applications embed all fonts into the PostScript they" " generate for printing?" "
  • Should KDE use an external PostScript viewer" " like gv for print page previews?" "
  • Should KDEPrint use a local or a remote CUPS server?," "
and many more.... " "
" ); TQString whatsThisHelpButton = i18n( " Help: This button takes you to the complete KDEPrint" " Manual." " " ); TQString whatsThisCancelButton = i18n( " Cancel: This button cancels your print job and quits the" " kprinter dialog." " " ); TQString whatsThisPrintButton = i18n( " Print: 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." " " ); TQString whatsThisKeepDialogOpenCheckbox = i18n( " Keep Printing Dialog Open" "

If you enable this checkbox, the printing dialog" " stays open after you hit the Print button.

" "

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.

" "
" ); TQString whatsThisOutputFileLabel = i18n(" Output File Name and Path: 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 Special Printers 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." " " ); TQString whatsThisOutputFileLineedit = i18n(" Output File Name and Path: 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\")" " " ); TQString whatsThisOutputFileButton = i18n(" Browse Directories button: 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." " " ); TQString whatsThisAddFileButton = i18n( " Add File to Job" "

This button calls the \"File Open / Browse Directories\" dialog to allow you" " to select a file for printing. Note, that " "

  • you can select ASCII or International Text, PDF," " PostScript, JPEG, TIFF, PNG, GIF and many other graphical" " formats." "
  • you can select various files from different paths" " and send them as one \"multi-file job\" to the printing" " system." "
" "
" ); TQString whatsThisPreviewCheckBox = i18n(" Print Preview" " 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. " "

Note: 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. " " " ); TQString whatsThisSetDefaultPrinter = i18n(" Set as Default Printer" " This button sets the current printer as the user's" " default. " "

Note: (Button is only visible if the checkbox for " " System Options" " --> General --> Miscellaneous: \"Defaults" " to the last printer used in the application\" is disabled.)" " " ); d = new KPrintDialogPrivate; d->m_pages.setAutoDelete(false); d->m_printer = 0; setCaption(i18n("Print")); // widget creation QGroupBox *m_pbox = new TQGroupBox(0,Qt::Vertical,i18n("Printer"), this); d->m_type = new TQLabel(m_pbox); TQWhatsThis::add(d->m_type, whatsThisPrinterType); d->m_state = new TQLabel(m_pbox); TQWhatsThis::add(d->m_state, whatsThisPrinterState); d->m_comment = new TQLabel(m_pbox); TQWhatsThis::add(d->m_comment, whatsThisPrinterComment); d->m_location = new TQLabel(m_pbox); TQWhatsThis::add(d->m_location, whatsThisLocationLabel); d->m_printers = new TreeComboBox(m_pbox); TQWhatsThis::add(d->m_printers, whatsThisPrinterSelect); d->m_printers->setMinimumHeight(25); QLabel *m_printerlabel = new TQLabel(i18n("&Name:"), m_pbox); TQWhatsThis::add(m_printerlabel, whatsThisPrinterSelect); QLabel *m_statelabel = new TQLabel(i18n("Status", "State:"), m_pbox); TQWhatsThis::add(m_statelabel, whatsThisPrinterState); QLabel *m_typelabel = new TQLabel(i18n("Type:"), m_pbox); TQWhatsThis::add(m_typelabel, whatsThisPrinterType); QLabel *m_locationlabel = new TQLabel(i18n("Location:"), m_pbox); TQWhatsThis::add(m_locationlabel, whatsThisLocationLabel); QLabel *m_commentlabel = new TQLabel(i18n("Comment:"), m_pbox); TQWhatsThis::add(m_commentlabel, whatsThisPrinterComment); m_printerlabel->setBuddy(d->m_printers); d->m_properties = new KPushButton(KGuiItem(i18n("P&roperties"), "edit"), m_pbox); TQWhatsThis::add( d->m_properties, whatsThisPrintJobProperties); d->m_options = new KPushButton(KGuiItem(i18n("System Op&tions"), "kdeprint_configmgr"), this); TQWhatsThis::add(d->m_options,whatsThisSystemOptions); d->m_default = new KPushButton(KGuiItem(i18n("Set as &Default"), "kdeprint_defaultsoft"), m_pbox); TQWhatsThis::add(d->m_default,whatsThisSetDefaultPrinter); d->m_filter = new TQPushButton(m_pbox); d->m_filter->setPixmap(SmallIcon("filter")); d->m_filter->setMinimumSize(TQSize(d->m_printers->minimumHeight(),d->m_printers->minimumHeight())); d->m_filter->setToggleButton(true); d->m_filter->setOn(KMManager::self()->isFilterEnabled()); TQToolTip::add(d->m_filter, i18n("Toggle selective view on printer list")); TQWhatsThis::add(d->m_filter, whatsThisPrinterFilter); d->m_wizard = new TQPushButton(m_pbox); d->m_wizard->setPixmap(SmallIcon("wizard")); d->m_wizard->setMinimumSize(TQSize(d->m_printers->minimumHeight(),d->m_printers->minimumHeight())); TQToolTip::add(d->m_wizard, i18n("Add printer...")); TQWhatsThis::add(d->m_wizard, whatsThisAddPrinterWizard); d->m_ok = new KPushButton(KGuiItem(i18n("&Print"), "fileprint"), this); TQWhatsThis::add( d->m_ok, whatsThisPrintButton); d->m_ok->setDefault(true); d->m_ok->setEnabled( false ); QPushButton *m_cancel = new KPushButton(KStdGuiItem::cancel(), this); TQWhatsThis::add(m_cancel, whatsThisCancelButton); d->m_preview = new TQCheckBox(i18n("Previe&w"), m_pbox); TQWhatsThis::add(d->m_preview, whatsThisPreviewCheckBox); d->m_filelabel = new TQLabel(i18n("O&utput file:"), m_pbox); TQWhatsThis::add(d->m_filelabel,whatsThisOutputFileLabel); d->m_file = new KURLRequester(TQDir::homeDirPath()+"/print.ps", m_pbox); TQWhatsThis::add(d->m_file,whatsThisOutputFileLineedit); d->m_file->setEnabled(false); d->m_filelabel->setBuddy(d->m_file); d->m_cmdlabel = new TQLabel(i18n("Print co&mmand:"), m_pbox); TQWhatsThis::add( d->m_cmdlabel, whatsThisExternalPrintCommand); d->m_cmd = new TQLineEdit(m_pbox); TQWhatsThis::add( d->m_cmd, whatsThisExternalPrintCommand); d->m_cmdlabel->setBuddy(d->m_cmd); d->m_dummy = new TQVBox(this); d->m_plugin = new PluginComboBox(this); d->m_extbtn = new KPushButton(this); TQToolTip::add(d->m_extbtn, i18n("Show/hide advanced options")); TQWhatsThis::add(d->m_extbtn, whatsThisOptions); d->m_persistent = new TQCheckBox(i18n("&Keep this dialog open after printing"), this); TQWhatsThis::add( d->m_persistent, whatsThisKeepDialogOpenCheckbox); QPushButton *m_help = new KPushButton(KStdGuiItem::help(), this); TQWhatsThis::add( m_help, whatsThisHelpButton); TQWidget::setTabOrder( d->m_printers, d->m_filter ); TQWidget::setTabOrder( d->m_filter, d->m_wizard ); TQWidget::setTabOrder( d->m_wizard, d->m_properties ); TQWidget::setTabOrder( d->m_properties, d->m_preview ); TQWidget::setTabOrder( d->m_preview, d->m_file ); TQWidget::setTabOrder( d->m_file, d->m_cmd ); TQWidget::setTabOrder( d->m_plugin, d->m_persistent ); TQWidget::setTabOrder( d->m_persistent, d->m_extbtn ); TQWidget::setTabOrder( d->m_extbtn, d->m_options ); TQWidget::setTabOrder( d->m_options, m_help ); TQWidget::setTabOrder( m_help, d->m_ok ); TQWidget::setTabOrder( d->m_ok, m_cancel ); // layout creation QVBoxLayout *l1 = new TQVBoxLayout(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 TQHBoxLayout(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 TQGridLayout(m_pbox->layout(),3,3,7); l3->setColStretch(1,1); l3->setRowStretch(0,1); QGridLayout *l4 = new TQGridLayout(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 TQHBoxLayout(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 TQVBoxLayout(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,TQT_SIGNAL(clicked()),TQT_SLOT(accept())); connect(m_cancel,TQT_SIGNAL(clicked()),TQT_SLOT(reject())); connect(d->m_properties,TQT_SIGNAL(clicked()),TQT_SLOT(slotProperties())); connect(d->m_default,TQT_SIGNAL(clicked()),TQT_SLOT(slotSetDefault())); connect(d->m_printers,TQT_SIGNAL(activated(int)),TQT_SLOT(slotPrinterSelected(int))); connect(d->m_options,TQT_SIGNAL(clicked()),TQT_SLOT(slotOptions())); connect(d->m_wizard,TQT_SIGNAL(clicked()),TQT_SLOT(slotWizard())); connect(d->m_extbtn, TQT_SIGNAL(clicked()), TQT_SLOT(slotExtensionClicked())); connect(d->m_filter, TQT_SIGNAL(toggled(bool)), TQT_SLOT(slotToggleFilter(bool))); connect(m_help, TQT_SIGNAL(clicked()), TQT_SLOT(slotHelp())); connect(d->m_file, TQT_SIGNAL(urlSelected(const TQString&)), TQT_SLOT(slotOutputFileSelected(const TQString&))); connect( d->m_file, TQT_SIGNAL( openFileDialog( KURLRequester* ) ), TQT_SLOT( slotOpenFileDialog() ) ); connect( KMFactory::self()->manager(), TQT_SIGNAL( updatePossible( bool ) ), TQT_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(TQPtrList *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 // TQTabWidget child if any. if (pages->count() > 0) d->m_pages.append(pages->take(0)); d->m_pages.first()->reparent(d->m_dummy, TQPoint(0,0)); d->m_pages.first()->show(); delete d->m_dummy->child("TabWidget", "TQTabWidget"); } else { // more than one page. QTabWidget *tabs = static_cast(d->m_dummy->child("TabWidget", "TQTabWidget")); if (!tabs) { // TQTabWidget doesn't exist. Create it and reparent all // already existing pages. tabs = new TQTabWidget(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, TQWidget *parent, const TQString& 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) TQPtrList *plist = KMFactory::self()->manager()->printerList(); if (!KMManager::self()->errorMsg().isEmpty()) { KMessageBox::error(tqparentWidget(), ""+ i18n("An error occurred while retrieving the printer list:") +"

"+KMManager::self()->errorMsg()+"
"); } if (plist) { QString oldP = d->m_printers->currentText(); d->m_printers->clear(); TQPtrListIterator 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(TQPixmap(), TQString::tqfromLatin1("--------")); } 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")); TQPtrListIterator 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(TQString::null); d->m_state->setText(TQString::null); d->m_comment->setText(TQString::null); d->m_type->setText(TQString::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) { TQMap opts; KMPrinter *prt(0); // get options from global pages QString msg; TQPtrListIterator 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("").append("")); 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 TQMap popts = (prt->isEdited() ? prt->editedOptions() : prt->defaultOptions()); for (TQMap::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" ), TQString::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 { TQFileInfo 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 TQString& ext) { if (!ext.isEmpty()) { KURL url( d->m_file->url() ); TQString 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("").append("")); else if (result == 1) initialize(d->m_printer); } void KPrintDialog::reload() { // remove printer dependent pages (usually from plugin) QTabWidget *tabs = static_cast(d->m_dummy->child("TabWidget", "TQTabWidget")); for (uint i=0; im_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 TQPtrList 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(), TQT_SIGNAL( updatePossible( bool ) ), TQT_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->tqminimumSize().height()+d->m_plugin->tqminimumSize().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(TQString::null, "kdeprint"); } void KPrintDialog::slotOutputFileSelected(const TQString& 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(tqparentWidget(), ""+ i18n("An error occurred while retrieving the printer list:") +"

"+KMManager::self()->errorMsg()+"
"); 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(d->m_dummy->child("TabWidget", "TQTabWidget")); 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()) { TQStringList filter; filter << mimetype; filter << "all/allfiles"; dialog->setMimeFilter (filter, mimetype); } else if (!ext.isEmpty()) dialog->setFilter ("*." + ext + "\n*|" + i18n ("All Files")); } } #include "kprintdialog.moc"