KUtils
kprintpreview.cpp
Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include "kprintpreview.h"
00021
00022 #include <QtCore/QFile>
00023 #include <QtGui/QLabel>
00024 #include <QtGui/QPrinter>
00025 #include <QtGui/QShowEvent>
00026
00027 #include <kmimetypetrader.h>
00028 #include <kparts/part.h>
00029 #include <kpluginfactory.h>
00030 #include <kpluginloader.h>
00031 #include <kservice.h>
00032 #include <ktempdir.h>
00033 #include <kdebug.h>
00034
00035
00036 class KPrintPreviewPrivate
00037 {
00038 public:
00039 KPrintPreviewPrivate(KPrintPreview *host, QPrinter * _printer)
00040 : q(host)
00041 , printer(_printer)
00042 , mainWidget(new QWidget(host))
00043 , previewPart(0)
00044 , failMessage(0)
00045 {
00046 if ( tempdir.exists() ) {
00047 filename = tempdir.name() + "print_preview.pdf";
00048 } else {
00049
00050 kWarning() << "Failed to create temporary directory";
00051 filename = "/dev/null";
00052 }
00053 }
00054
00055 void getPart();
00056 bool doPreview();
00057 void fail();
00058
00059 KPrintPreview *q;
00060
00061 QPrinter *printer;
00062 QWidget *mainWidget;
00063
00064 KTempDir tempdir;
00065 QString filename;
00066
00067 KParts::ReadOnlyPart *previewPart;
00068 QWidget *failMessage;
00069 };
00070
00071 void KPrintPreviewPrivate::getPart()
00072 {
00073 if (previewPart) {
00074 kDebug(500) << "already got a part";
00075 return;
00076 }
00077 kDebug(500) << "querying trader for application/pdf service";
00078
00079 KPluginFactory *factory(0);
00080 KService::List offers =
00081 KMimeTypeTrader::self()->query("application/pdf", "KParts/ReadOnlyPart");
00082
00083 KService::List::ConstIterator it = offers.begin();
00084 while (!factory && it != offers.end()) {
00085 KPluginLoader loader(**it);
00086 factory = loader.factory();
00087 if (!factory) {
00088 kDebug(500) << "Loading failed:" << loader.errorString();
00089 }
00090 ++it;
00091 }
00092 if (factory) {
00093 kDebug(500) << "Trying to create a part";
00094 previewPart = factory->create<KParts::ReadOnlyPart>(q, (QVariantList() << "Print/Preview"));
00095 if (!previewPart) {
00096 kDebug(500) << "Part creation failed";
00097 }
00098 }
00099 }
00100
00101 bool KPrintPreviewPrivate::doPreview()
00102 {
00103 if (!QFile::exists(filename)) {
00104 kWarning() << "Nothing was produced to be previewed";
00105 return false;
00106 }
00107
00108 getPart();
00109 if (!previewPart) {
00110
00111 kWarning() << "Could not find a PDF viewer for the preview dialog";
00112 fail();
00113 return false;
00114 } else {
00115 q->setMainWidget(previewPart->widget());
00116 return previewPart->openUrl(filename);
00117 }
00118 }
00119
00120 void KPrintPreviewPrivate::fail()
00121 {
00122 if (!failMessage) {
00123 failMessage = new QLabel(i18n("Could not load print preview part"), q);
00124 }
00125 q->setMainWidget(failMessage);
00126 }
00127
00128
00129
00130
00131 KPrintPreview::KPrintPreview(QPrinter *printer, QWidget *parent)
00132 : KDialog(parent)
00133 , d(new KPrintPreviewPrivate(this, printer))
00134 {
00135 kDebug(500) << "kdeprint: creating preview dialog";
00136
00137
00138 setCaption(i18n("Print Preview"));
00139 setButtons(KDialog::Close);
00140
00141
00142 kDebug(500) << "Will print to" << d->filename;
00143 printer->setOutputFileName(d->filename);
00144 }
00145
00146 KPrintPreview::~KPrintPreview()
00147 {
00148 delete d;
00149 }
00150
00151 void KPrintPreview::showEvent(QShowEvent *event)
00152 {
00153 if (!event->spontaneous()) {
00154
00155 if (!d->doPreview()) {
00156 event->accept();
00157 return;
00158 }
00159 }
00160 KDialog::showEvent(event);
00161 }
00162
00163 #include "kprintpreview.moc"
00164
00165
00166