File indexing completed on 2024-04-28 15:51:44

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"