File indexing completed on 2024-04-21 15:02:45

0001 /*
0002     SPDX-FileCopyrightText: 2000 David Faure <faure@kde.org>
0003     SPDX-FileCopyrightText: 2000 Simon Hausmann <hausmann@kde.org>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0006 */
0007 
0008 #include "partviewer.h"
0009 
0010 #include <KActionCollection>
0011 #include <KActionMenu>
0012 #include <KLocalizedString>
0013 #include <KPluginFactory>
0014 #include <partloader.h>
0015 
0016 #include <QAction>
0017 #include <QApplication>
0018 #include <QFile>
0019 #include <QFileDialog>
0020 #include <QMimeDatabase>
0021 #include <QTest>
0022 
0023 PartViewer::PartViewer()
0024 {
0025     setXMLFile(QFINDTESTDATA("partviewer_shell.rc"));
0026 
0027     QAction *paOpen = new QAction(QIcon::fromTheme(QStringLiteral("document-open")), QStringLiteral("&Open file"), this);
0028     actionCollection()->addAction(QStringLiteral("file_open"), paOpen);
0029     connect(paOpen, &QAction::triggered, this, &PartViewer::slotFileOpen);
0030 
0031     QAction *paQuit = new QAction(QIcon::fromTheme(QStringLiteral("application-exit")), QStringLiteral("&Quit"), this);
0032     actionCollection()->addAction(QStringLiteral("file_quit"), paQuit);
0033     connect(paQuit, &QAction::triggered, this, &PartViewer::close);
0034 
0035     m_part = nullptr;
0036 
0037     // Set a reasonable size
0038     resize(600, 350);
0039 }
0040 
0041 PartViewer::~PartViewer()
0042 {
0043     qDeleteAll(m_openWithActions);
0044     delete m_part;
0045 }
0046 
0047 void PartViewer::switchToPart(const QUrl &url)
0048 {
0049     setCentralWidget(m_part->widget());
0050     // Integrate its GUI
0051     createGUI(m_part);
0052 
0053     m_part->openUrl(url);
0054 }
0055 
0056 void PartViewer::openUrl(const QUrl &url)
0057 {
0058     unplugActionList(QStringLiteral("file_openwith"));
0059     delete m_part;
0060     QMimeDatabase db;
0061     const QString mimeType = db.mimeTypeForUrl(url).name();
0062     QString errorString;
0063     m_part = KParts::PartLoader::createPartInstanceForMimeType<KParts::ReadOnlyPart>(mimeType, this, this, &errorString);
0064 
0065     if (m_part) {
0066         switchToPart(url);
0067     } else {
0068         qWarning() << errorString;
0069     }
0070 
0071     // Show available parts in the GUI
0072 
0073     qDeleteAll(m_openWithActions);
0074     m_openWithActions.clear();
0075     const QVector<KPluginMetaData> plugins = KParts::PartLoader::partsForMimeType(mimeType);
0076     for (const KPluginMetaData &plugin : plugins) {
0077         QAction *action = new QAction(plugin.name(), this);
0078         connect(action, &QAction::triggered, this, [=] {
0079             loadPlugin(plugin, url);
0080         });
0081         m_openWithActions.append(action);
0082     }
0083     if (!m_openWithActions.isEmpty()) {
0084         QAction *sep = new QAction(this);
0085         sep->setSeparator(true);
0086         m_openWithActions.append(sep);
0087     }
0088     plugActionList(QStringLiteral("file_openwith"), m_openWithActions);
0089 }
0090 
0091 void PartViewer::slotFileOpen()
0092 {
0093     QUrl url = QFileDialog::getOpenFileUrl();
0094     if (!url.isEmpty()) {
0095         openUrl(url);
0096     }
0097 }
0098 
0099 void PartViewer::loadPlugin(const KPluginMetaData &md, const QUrl &url)
0100 {
0101     delete m_part;
0102     auto factory = KPluginFactory::loadFactory(md).plugin;
0103     Q_ASSERT(factory);
0104     m_part = factory->create<KParts::ReadOnlyPart>(this, this, QVariantList());
0105     if (m_part) {
0106         switchToPart(url);
0107     }
0108 }
0109 
0110 int main(int argc, char **argv)
0111 {
0112     // This is a test window for showing any part
0113 
0114     QApplication app(argc, argv);
0115     PartViewer *shell = new PartViewer;
0116     if (argc > 1) {
0117         QUrl url = QUrl::fromUserInput(QLatin1String(argv[1]));
0118         shell->openUrl(url);
0119     } else {
0120         shell->slotFileOpen();
0121     }
0122     shell->show();
0123     return app.exec();
0124 }
0125 
0126 #include "moc_partviewer.cpp"