kdeprint Library API Documentation

kprintpreview.cpp

00001 /* 00002 * This file is part of the KDE libraries 00003 * Copyright (c) 2001 Michael Goffioul <kdeprint@swing.be> 00004 * 00005 * 00006 * This library is free software; you can redistribute it and/or 00007 * modify it under the terms of the GNU Library General Public 00008 * License version 2 as published by the Free Software Foundation. 00009 * 00010 * This library is distributed in the hope that it will be useful, 00011 * but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00013 * Library General Public License for more details. 00014 * 00015 * You should have received a copy of the GNU Library General Public License 00016 * along with this library; see the file COPYING.LIB. If not, write to 00017 * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, 00018 * Boston, MA 02111-1307, USA. 00019 **/ 00020 00021 #include "kprintpreview.h" 00022 #include "kmfactory.h" 00023 00024 #include <qfile.h> 00025 #include <qlayout.h> 00026 #include <qvbox.h> 00027 00028 #include <kparts/part.h> 00029 #include <kaccel.h> 00030 #include <kaction.h> 00031 #include <klibloader.h> 00032 #include <ktrader.h> 00033 #include <kuserprofile.h> 00034 #include <krun.h> 00035 #include <kapplication.h> 00036 #include <kstandarddirs.h> 00037 #include <klocale.h> 00038 #include <kmessagebox.h> 00039 #include <kdebug.h> 00040 #include <kconfig.h> 00041 #include <ktoolbar.h> 00042 #include <kmimetype.h> 00043 00044 KPreviewProc::KPreviewProc() 00045 : KProcess() 00046 { 00047 m_bOk = false; 00048 connect(this, SIGNAL(processExited(KProcess*)), SLOT(slotProcessExited(KProcess*))); 00049 } 00050 00051 KPreviewProc::~KPreviewProc() 00052 { 00053 } 00054 00055 bool KPreviewProc::startPreview() 00056 { 00057 if (start()) 00058 { 00059 kapp->enter_loop(); 00060 return m_bOk; 00061 } 00062 else 00063 return false; 00064 } 00065 00066 void KPreviewProc::slotProcessExited(KProcess* proc) 00067 { 00068 kapp->exit_loop(); 00069 if ( proc->normalExit() && proc->exitStatus() == 0 ) 00070 m_bOk = true; 00071 else 00072 kdDebug(500) << "KPreviewProc::slotProcessExited: normalExit=" << proc->normalExit() 00073 << " exitStatus=" << proc->exitStatus() << endl; 00074 } 00075 00076 //******************************************************************************************* 00077 00078 class KPrintPreview::KPrintPreviewPrivate 00079 { 00080 public: 00081 KPrintPreviewPrivate(KPrintPreview *dlg) : gvpart_(0) 00082 { 00083 mainwidget_ = new QWidget(dlg, "MainWidget"); 00084 toolbar_ = new KToolBar(mainwidget_, "PreviewToolBar", true); 00085 actions_ = new KActionCollection(dlg); 00086 accel_ = new KAccel(dlg); 00087 previewonly_ = false; 00088 } 00089 ~KPrintPreviewPrivate() 00090 { 00091 if (gvpart_) delete gvpart_; 00092 } 00093 void plugAction(KAction *act) 00094 { 00095 act->plug(toolbar_); 00096 act->plugAccel(accel_); 00097 } 00098 00099 KParts::ReadOnlyPart *gvpart_; 00100 KToolBar *toolbar_; 00101 KActionCollection *actions_; 00102 QWidget *mainwidget_; 00103 KAccel *accel_; 00104 bool previewonly_; 00105 }; 00106 00107 static KLibFactory* componentFactory() 00108 { 00109 kdDebug(500) << "kdeprint: querying trader for 'application/postscript' service" << endl; 00110 KLibFactory *factory(0); 00111 KTrader::OfferList offers = KTrader::self()->query(QString::fromLatin1("application/postscript"), QString::fromLatin1("KParts/ReadOnlyPart"), QString::null, QString::null); 00112 for (KTrader::OfferList::ConstIterator it = offers.begin(); it != offers.end(); ++it) 00113 { 00114 KService::Ptr service = *it; 00115 factory = KLibLoader::self()->factory(QFile::encodeName(service->library())); 00116 if (factory) 00117 break; 00118 } 00119 if (!factory) 00120 { 00121 // nothing has been found, try to load directly the KGhostview part 00122 factory = KLibLoader::self()->factory("libkghostviewpart"); 00123 } 00124 return factory; 00125 } 00126 00127 static bool continuePrint(const QString& msg_, QWidget *parent, bool previewOnly) 00128 { 00129 QString msg(msg_); 00130 if (previewOnly) 00131 { 00132 KMessageBox::error(parent, msg); 00133 return false; 00134 } 00135 else 00136 { 00137 msg.append(" ").append(i18n("Do you want to continue printing anyway?")); 00138 return (KMessageBox::warningYesNo(parent, msg, QString::null, KGuiItem(i18n("Print"),"fileprint"), KStdGuiItem::cancel()) == KMessageBox::Yes); 00139 } 00140 } 00141 00142 //******************************************************************************************* 00143 00144 KPrintPreview::KPrintPreview(QWidget *parent, bool previewOnly) 00145 : KDialogBase(parent, "PreviewDlg", true, i18n("Print Preview"), 0) 00146 { 00147 kdDebug(500) << "kdeprint: creating preview dialog" << endl; 00148 d = new KPrintPreviewPrivate(this); 00149 d->previewonly_ = previewOnly; 00150 00151 // create main view and actions 00152 setMainWidget(d->mainwidget_); 00153 if (previewOnly) 00154 KStdAction::close(this, SLOT(reject()), d->actions_, "close_print"); 00155 else 00156 { 00157 new KAction(i18n("Print"), "fileprint", Qt::Key_Return, this, SLOT(accept()), d->actions_, "continue_print"); 00158 new KAction(KStdGuiItem::cancel(), Qt::Key_Escape, this, SLOT(reject()), d->actions_, "stop_print"); 00159 } 00160 00161 } 00162 00163 KPrintPreview::~KPrintPreview() 00164 { 00165 delete d; 00166 } 00167 00168 void KPrintPreview::initView(KLibFactory *factory) 00169 { 00170 // load the component 00171 d->gvpart_ = (KParts::ReadOnlyPart*)factory->create(d->mainwidget_, "gvpart", "KParts::ReadOnlyPart"); 00172 00173 // populate the toolbar 00174 if (d->previewonly_) 00175 d->plugAction(d->actions_->action("close_print")); 00176 else 00177 { 00178 d->plugAction(d->actions_->action("continue_print")); 00179 d->plugAction(d->actions_->action("stop_print")); 00180 } 00181 if (d->gvpart_) 00182 { 00183 QDomNodeList l = d->gvpart_->domDocument().elementsByTagName( "ToolBar" ); 00184 if ( l.length() > 0 ) 00185 { 00186 d->toolbar_->insertLineSeparator(); 00187 QDomNodeList acts = l.item( 0 ).toElement().elementsByTagName( "Action" ); 00188 for ( uint i=0; i<acts.length(); i++ ) 00189 { 00190 QDomElement a = acts.item( i ).toElement(); 00191 if ( a.attribute( "name" ) == "goToPage" ) 00192 continue; 00193 KAction *act = d->gvpart_->action( a ); 00194 if ( act != 0 ) 00195 d->plugAction( act ); 00196 } 00197 } 00198 /* 00199 KAction *act; 00200 d->toolbar_->insertLineSeparator(); 00201 if ((act = d->gvpart_->action("zoomIn")) != 0) 00202 d->plugAction(act); 00203 if ((act = d->gvpart_->action("zoomOut")) != 0) 00204 d->plugAction(act); 00205 d->toolbar_->insertSeparator(); 00206 if ((act = d->gvpart_->action("prevPage")) != 0) 00207 d->plugAction(act); 00208 if ((act = d->gvpart_->action("nextPage")) != 0) 00209 d->plugAction(act); 00210 */ 00211 } 00212 d->toolbar_->setIconText(KToolBar::IconTextRight); 00213 d->toolbar_->setBarPos(KToolBar::Top); 00214 d->toolbar_->setMovingEnabled(false); 00215 //d->adjustSize(); 00216 00217 // construct the layout 00218 QVBoxLayout *l0 = new QVBoxLayout(d->mainwidget_, 0, 0); 00219 l0->addWidget(d->toolbar_, AlignTop); 00220 if (d->gvpart_) 00221 l0->addWidget(d->gvpart_->widget()); 00222 00223 resize(855, 500); 00224 setCaption(i18n("Print Preview")); 00225 } 00226 00227 void KPrintPreview::openFile(const QString& file) 00228 { 00229 d->gvpart_->openURL(KURL(file)); 00230 } 00231 00232 bool KPrintPreview::isValid() const 00233 { 00234 return (d->gvpart_ != 0); 00235 } 00236 00237 bool KPrintPreview::preview(const QString& file, bool previewOnly, WId parentId) 00238 { 00239 KMimeType::Ptr mime = KMimeType::findByPath( file ); 00240 bool isPS = ( mime->name() == "application/postscript" ); 00241 if ( !isPS ) 00242 kdDebug( 500 ) << "Previewing a non PostScript file, built-in preview disabled" << endl; 00243 00244 KConfig *conf = KMFactory::self()->printConfig(); 00245 conf->setGroup("General"); 00246 KLibFactory *factory(0); 00247 bool externalPreview = conf->readBoolEntry("ExternalPreview", false); 00248 QWidget *parentW = QWidget::find(parentId); 00249 QString exe; 00250 if (!externalPreview && isPS && (factory = componentFactory()) != 0) 00251 { 00252 KPrintPreview dlg(parentW, previewOnly); 00253 dlg.initView(factory); 00254 00255 if (dlg.isValid()) 00256 { 00257 dlg.openFile(file); 00258 return dlg.exec(); 00259 } 00260 else 00261 // do nothing at that point: try to use the other way around by 00262 // using an external PS viewer if possible 00263 ; 00264 } 00265 00266 // Either the PS viewer component was not found, or an external 00267 // preview program has been specified 00268 KPreviewProc proc; 00269 if (externalPreview && isPS ) 00270 { 00271 exe = conf->readPathEntry("PreviewCommand", "gv"); 00272 if (KStandardDirs::findExe(exe).isEmpty()) 00273 { 00274 QString msg = i18n("The preview program %1 cannot be found. " 00275 "Check that the program is correctly installed and " 00276 "located in a directory included in your PATH " 00277 "environment variable.").arg(exe); 00278 return continuePrint(msg, parentW, previewOnly); 00279 } 00280 proc << exe << file; 00281 } 00282 else 00283 { 00284 KService::Ptr serv = KServiceTypeProfile::preferredService( mime->name(), QString::null ); 00285 if ( serv ) 00286 { 00287 KURL url; 00288 url.setPath( file ); 00289 QStringList args = KRun::processDesktopExec( *serv, url, false ); 00290 proc << args; 00291 exe = serv->name(); 00292 } 00293 else 00294 { 00295 // in that case, the PS viewer component could not be loaded and no service 00296 // could be found to view PS 00297 QString msg; 00298 if ( isPS ) 00299 msg = i18n("Preview failed: neither the internal KDE PostScript " 00300 "viewer (KGhostView) nor any other external PostScript " 00301 "viewer could be found."); 00302 else 00303 msg = i18n( "Preview failed: KDE could not find any application " 00304 "to preview files of type %1." ).arg( mime->name() ); 00305 00306 return continuePrint(msg, parentW, previewOnly); 00307 } 00308 } 00309 00310 // start the preview process 00311 if (!proc.startPreview()) 00312 { 00313 QString msg = i18n("Preview failed: unable to start program %1.").arg(exe); 00314 return continuePrint(msg, parentW, previewOnly); 00315 } 00316 else if (!previewOnly) 00317 { 00318 return (KMessageBox::questionYesNo(parentW, i18n("Do you want to continue printing?"), QString::null, KGuiItem(i18n("Print"),"fileprint"), KStdGuiItem::cancel(), "continuePrinting") == KMessageBox::Yes); 00319 } 00320 else 00321 return false; 00322 } 00323 00324 #include "kprintpreview.moc"
KDE Logo
This file is part of the documentation for kdeprint Library Version 3.2.3.
Documentation copyright © 1996-2004 the KDE developers.
Generated on Fri Aug 20 09:50:01 2004 by doxygen 1.3.7 written by Dimitri van Heesch, © 1997-2003