File indexing completed on 2024-05-19 12:17:49
0001 /* 0002 SPDX-FileCopyrightText: 2007 John Layt <john@layt.net> 0003 0004 FilePrinterPreview based on KPrintPreview (originally LGPL) 0005 SPDX-FileCopyrightText: 2007 Alex Merry <huntedhacker@tiscali.co.uk> 0006 0007 SPDX-License-Identifier: GPL-2.0-or-later 0008 */ 0009 0010 #include "fileprinterpreview.h" 0011 0012 #include <QDialogButtonBox> 0013 #include <QFile> 0014 #include <QLabel> 0015 #include <QPushButton> 0016 #include <QShowEvent> 0017 #include <QSize> 0018 #include <QVBoxLayout> 0019 0020 #include <KLocalizedString> 0021 #include <KPluginFactory> 0022 #include <KSharedConfig> 0023 #include <KWindowConfig> 0024 #include <QLoggingCategory> 0025 #include <kparts/readonlypart.h> 0026 0027 #include "gui/debug_ui.h" 0028 0029 using namespace Okular; 0030 0031 // This code copied from KPrintPreview by Alex Merry, adapted to do PS files instead of PDF 0032 0033 class Okular::FilePrinterPreviewPrivate 0034 { 0035 public: 0036 FilePrinterPreviewPrivate(FilePrinterPreview *host, const QString &_filename) 0037 : q(host) 0038 , mainWidget(new QWidget(host)) 0039 , previewPart(nullptr) 0040 , failMessage(nullptr) 0041 , config(KSharedConfig::openConfig(QStringLiteral("okularrc"))) 0042 0043 { 0044 mainlayout = new QVBoxLayout(q); 0045 buttonBox = new QDialogButtonBox(QDialogButtonBox::Close, q); 0046 mainlayout->addWidget(buttonBox); 0047 filename = _filename; 0048 } 0049 0050 void getPart(); 0051 bool doPreview(); 0052 void fail(); 0053 0054 FilePrinterPreview *q; 0055 0056 QWidget *mainWidget; 0057 0058 QDialogButtonBox *buttonBox; 0059 0060 QVBoxLayout *mainlayout; 0061 0062 QString filename; 0063 0064 KParts::ReadOnlyPart *previewPart; 0065 QWidget *failMessage; 0066 0067 KSharedConfig::Ptr config; 0068 Q_DISABLE_COPY(FilePrinterPreviewPrivate) 0069 }; 0070 static inline QString ConfigGroupKey() 0071 { 0072 return QStringLiteral("Print Preview"); 0073 } 0074 0075 void FilePrinterPreviewPrivate::getPart() 0076 { 0077 if (previewPart) { 0078 qCDebug(OkularUiDebug) << "already got a part"; 0079 return; 0080 } 0081 0082 auto result = KPluginFactory::instantiatePlugin<KParts::ReadOnlyPart>(KPluginMetaData(QStringLiteral("okularpart")), q, QVariantList() << QStringLiteral("Print/Preview")); 0083 0084 if (!result) { 0085 qCWarning(OkularUiDebug) << "Part creation failed" << result.errorText; 0086 } else { 0087 previewPart = result.plugin; 0088 } 0089 } 0090 0091 bool FilePrinterPreviewPrivate::doPreview() 0092 { 0093 if (!QFile::exists(filename)) { 0094 qCWarning(OkularUiDebug) << "Nothing was produced to be previewed"; 0095 return false; 0096 } 0097 0098 getPart(); 0099 if (!previewPart) { 0100 // TODO: error dialog 0101 qCWarning(OkularUiDebug) << "Could not find a PS viewer for the preview dialog"; 0102 fail(); 0103 return false; 0104 } else { 0105 mainlayout->insertWidget(0, previewPart->widget()); 0106 return previewPart->openUrl(QUrl::fromLocalFile(filename)); 0107 } 0108 } 0109 0110 void FilePrinterPreviewPrivate::fail() 0111 { 0112 if (!failMessage) { 0113 failMessage = new QLabel(i18n("Could not load print preview part"), q); 0114 } 0115 mainlayout->insertWidget(0, failMessage); 0116 } 0117 0118 FilePrinterPreview::FilePrinterPreview(const QString &filename, QWidget *parent) 0119 : QDialog(parent) 0120 , d(new FilePrinterPreviewPrivate(this, filename)) 0121 { 0122 qCDebug(OkularUiDebug) << "kdeprint: creating preview dialog"; 0123 0124 // Set up the dialog 0125 setWindowTitle(i18n("Print Preview")); 0126 0127 connect(d->buttonBox, &QDialogButtonBox::rejected, this, &QDialog::reject); 0128 0129 KWindowConfig::restoreWindowSize(windowHandle(), d->config->group(ConfigGroupKey())); 0130 } 0131 0132 FilePrinterPreview::~FilePrinterPreview() 0133 { 0134 KConfigGroup group(d->config->group(ConfigGroupKey())); 0135 KWindowConfig::saveWindowSize(windowHandle(), group); 0136 0137 delete d; 0138 } 0139 0140 QSize FilePrinterPreview::sizeHint() const 0141 { 0142 // return a more or less useful window size, if not saved already 0143 return QSize(600, 500); 0144 } 0145 0146 void FilePrinterPreview::showEvent(QShowEvent *event) 0147 { 0148 if (!event->spontaneous()) { 0149 // being shown for the first time 0150 if (!d->doPreview()) { 0151 event->accept(); 0152 return; 0153 } 0154 } 0155 QDialog::showEvent(event); 0156 } 0157 0158 #include "moc_fileprinterpreview.cpp"