File indexing completed on 2024-05-05 12:21:10
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"