Warning, file /office/calligra/gemini/desktopviewproxy.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /*
0002  * <one line to give the library's name and an idea of what it does.>
0003  * SPDX-FileCopyrightText: 2013 Dan Leinir Turthra Jensen <admin@leinir.dk>
0004  *
0005  * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0006  *
0007  */
0008 
0009 #include "desktopviewproxy.h"
0010 
0011 #include <QProcess>
0012 #include <QDir>
0013 #include <QApplication>
0014 #include <QUrl>
0015 
0016 #include <klocalizedstring.h>
0017 #include <krecentfilesaction.h>
0018 #include <kactioncollection.h>
0019 #include <KConfigGroup>
0020 #include <KSharedConfig>
0021 
0022 #include <KoMainWindow.h>
0023 #include <KoFilterManager.h>
0024 #include <KoFileDialog.h>
0025 #include <KoDocumentEntry.h>
0026 
0027 #include "MainWindow.h"
0028 #include <DocumentManager.h>
0029 #include <RecentFileManager.h>
0030 #include <Settings.h>
0031 #include <KoDocument.h>
0032 #include <KWView.h>
0033 
0034 class DesktopViewProxy::Private
0035 {
0036 public:
0037     Private(MainWindow* mainWindow, KoMainWindow* desktopView)
0038         : mainWindow(mainWindow)
0039         , desktopView(desktopView)
0040         , isImporting(false)
0041     {}
0042     MainWindow* mainWindow;
0043     KoMainWindow* desktopView;
0044     bool isImporting;
0045 };
0046 
0047 DesktopViewProxy::DesktopViewProxy(MainWindow* mainWindow, KoMainWindow* parent)
0048     : QObject(parent)
0049     , d(new Private(mainWindow, parent))
0050 {
0051     Q_ASSERT(parent); // "There MUST be a KoMainWindow assigned, otherwise everything will blow up");
0052 
0053     // Hide this one... as it doesn't work at all well and release happens :P
0054     QAction* closeAction = d->desktopView->actionCollection()->action("file_close");
0055     closeAction->setVisible(false);
0056 
0057     // Concept is simple - simply steal all the actions we require to work differently, and reconnect them to local functions
0058     QAction* newAction = d->desktopView->actionCollection()->action("file_new");
0059     newAction->disconnect(d->desktopView);
0060     connect(newAction, &QAction::triggered, this, &DesktopViewProxy::fileNew);
0061     QAction* openAction = d->desktopView->actionCollection()->action("file_open");
0062     openAction->disconnect(d->desktopView);
0063     connect(openAction, &QAction::triggered, this, &DesktopViewProxy::fileOpen);
0064     QAction* saveAction = d->desktopView->actionCollection()->action("file_save");
0065     saveAction->disconnect(d->desktopView);
0066     connect(saveAction, &QAction::triggered, this, &DesktopViewProxy::fileSave);
0067     QAction* saveasAction = d->desktopView->actionCollection()->action("file_save_as");
0068     saveasAction->disconnect(d->desktopView);
0069     connect(saveasAction, &QAction::triggered, this, &DesktopViewProxy::fileSaveAs);
0070     QAction* reloadAction = d->desktopView->actionCollection()->action("file_reload_file");
0071     reloadAction->disconnect(d->desktopView);
0072     connect(reloadAction, &QAction::triggered, this, &DesktopViewProxy::reload);
0073     QAction* loadExistingAsNewAction = d->desktopView->actionCollection()->action("file_import_file");
0074     loadExistingAsNewAction->disconnect(d->desktopView);
0075     connect(loadExistingAsNewAction, &QAction::triggered, this, &DesktopViewProxy::loadExistingAsNew);
0076 
0077     // Recent files need a touch more work, as they aren't simply an action.
0078     KRecentFilesAction* recent = qobject_cast<KRecentFilesAction*>(d->desktopView->actionCollection()->action("file_open_recent"));
0079     recent->disconnect(d->desktopView);
0080     connect(recent, &KRecentFilesAction::urlSelected, this, &DesktopViewProxy::slotFileOpenRecent);
0081     recent->clear();
0082     recent->loadEntries(KSharedConfig::openConfig()->group("RecentFiles"));
0083 
0084     connect(d->desktopView, &KoMainWindow::documentSaved, this, &DesktopViewProxy::documentSaved);
0085 }
0086 
0087 DesktopViewProxy::~DesktopViewProxy()
0088 {
0089     delete d;
0090 }
0091 
0092 void DesktopViewProxy::fileNew()
0093 {
0094     QProcess::startDetached(qApp->applicationFilePath(), QStringList(), QDir::currentPath());
0095 }
0096 
0097 void DesktopViewProxy::fileOpen()
0098 {
0099     QStringList mimeFilter;
0100     KoDocumentEntry entry = KoDocumentEntry::queryByMimeType(DocumentManager::instance()->settingsManager()->currentFileClass().toLatin1());
0101     if (!entry.isEmpty()) {
0102         QJsonObject json = entry.metaData();
0103         QStringList mimeTypes = json.value("X-KDE-ExtraNativeMimeTypes").toVariant().toStringList();
0104         mimeFilter << KoFilterManager::mimeFilter(DocumentManager::instance()->settingsManager()->currentFileClass().toLatin1(),
0105                                                                KoFilterManager::Import,
0106                                                                mimeTypes);
0107     }
0108 
0109     KoFileDialog dialog(d->desktopView, KoFileDialog::OpenFile, "OpenDocument");
0110     dialog.setCaption(i18n("Open Document"));
0111     dialog.setDefaultDir(QStandardPaths::writableLocation(QStandardPaths::DocumentsLocation));
0112     dialog.setMimeTypeFilters(mimeFilter);
0113     QString filename = dialog.filename();
0114     if (filename.isEmpty()) return;
0115 
0116     DocumentManager::instance()->recentFileManager()->addRecent(filename);
0117 
0118     QProcess::startDetached(qApp->applicationFilePath(), QStringList() << filename, QDir::currentPath());
0119 }
0120 
0121 void DesktopViewProxy::fileSave()
0122 {
0123     if(DocumentManager::instance()->isTemporaryFile()) {
0124         if(d->desktopView->saveDocument(true)) {
0125             if (KoDocument* document = DocumentManager::instance()->document()) {
0126                 DocumentManager::instance()->recentFileManager()->addRecent(document->url().toLocalFile());
0127                 DocumentManager::instance()->settingsManager()->setCurrentFile(document->url().toLocalFile());
0128                 DocumentManager::instance()->setTemporaryFile(false);
0129                 emit documentSaved();
0130             }
0131         }
0132     } else {
0133         DocumentManager::instance()->save();
0134         emit documentSaved();
0135     }
0136 }
0137 
0138 bool DesktopViewProxy::fileSaveAs()
0139 {
0140     KoDocument* document = DocumentManager::instance()->document();
0141     if (!document)
0142         return false;
0143 
0144     if(d->desktopView->saveDocument(true)) {
0145         DocumentManager::instance()->recentFileManager()->addRecent(document->url().toLocalFile());
0146         DocumentManager::instance()->settingsManager()->setCurrentFile(document->url().toLocalFile());
0147         DocumentManager::instance()->setTemporaryFile(false);
0148         emit documentSaved();
0149         return true;
0150     }
0151 
0152     DocumentManager::instance()->settingsManager()->setCurrentFile(document->url().toLocalFile());
0153     return false;
0154 }
0155 
0156 void DesktopViewProxy::reload()
0157 {
0158     DocumentManager::instance()->reload();
0159 }
0160 
0161 void DesktopViewProxy::loadExistingAsNew()
0162 {
0163     d->isImporting = true;
0164     fileOpen();
0165     d->isImporting = false;
0166 }
0167 
0168 void DesktopViewProxy::slotFileOpenRecent(const QUrl& url)
0169 {
0170     QProcess::startDetached(qApp->applicationFilePath(), QStringList() << url.toLocalFile(), QDir::currentPath());
0171 }