File indexing completed on 2025-03-09 05:20:57

0001 /*
0002     This file is part of the Kasten Framework, made within the KDE community.
0003 
0004     SPDX-FileCopyrightText: 2011 Friedrich W. H. Kossebau <kossebau@kde.org>
0005 
0006     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0007 */
0008 
0009 #include "singledocumentstrategy_p.hpp"
0010 
0011 // lib
0012 #include "createdialog.hpp"
0013 // Kasten gui
0014 #include <abstractmodeldatageneratorconfigeditor.hpp>
0015 #include <modelcodecviewmanager.hpp>
0016 #include <viewmanager.hpp>
0017 // Kasten core
0018 #include <Kasten/ModelDataGenerateThread>
0019 #include <Kasten/DocumentSyncManager>
0020 #include <Kasten/DocumentCreateManager>
0021 #include <Kasten/AbstractModelDataGenerator>
0022 #include <Kasten/AbstractModel>
0023 // KF
0024 #include <KProcess>
0025 // Qt
0026 #include <QMimeData>
0027 #include <QClipboard>
0028 #include <QUrl>
0029 #include <QApplication>
0030 
0031 namespace Kasten {
0032 
0033 void SingleDocumentStrategyPrivate::init()
0034 {
0035     Q_Q(SingleDocumentStrategy);
0036     // setup
0037     QObject::connect(mDocumentManager, &DocumentManager::added,
0038                      mViewManager, &ViewManager::createViewsFor);
0039     QObject::connect(mDocumentManager, &DocumentManager::closing,
0040                      mViewManager, &ViewManager::removeViewsFor);
0041     QObject::connect(mDocumentManager, &DocumentManager::added,
0042                      q, &SingleDocumentStrategy::added);
0043     QObject::connect(mDocumentManager, &DocumentManager::closing,
0044                      q, &SingleDocumentStrategy::closing);
0045     QObject::connect(mDocumentManager->syncManager(), &DocumentSyncManager::urlUsed,
0046                      q, &SingleDocumentStrategy::urlUsed);
0047 }
0048 
0049 void SingleDocumentStrategyPrivate::createNew()
0050 {
0051     if (mDocumentManager->isEmpty()) {
0052         mDocumentManager->createManager()->createNew();
0053     } else {
0054         const QString executable = QCoreApplication::applicationFilePath();
0055         // TODO: get parameters from common place with KCmdLineOptions
0056         // TODO: forward also interesting parameters passed to this program
0057         const QStringList parameters { QStringLiteral("-c") };
0058         KProcess::startDetached(executable, parameters);
0059     }
0060 }
0061 
0062 void SingleDocumentStrategyPrivate::createNewFromClipboard()
0063 {
0064     if (mDocumentManager->isEmpty()) {
0065         const QMimeData* mimeData =
0066             QApplication::clipboard()->mimeData(QClipboard::Clipboard);
0067 
0068         mDocumentManager->createManager()->createNewFromData(mimeData, true);
0069     } else {
0070         const QString executable = QCoreApplication::applicationFilePath();
0071         // TODO: get parameters from common place with KCmdLineOptions
0072         // TODO: forward also interesting parameters passed to this program
0073         const QStringList parameters {
0074             QStringLiteral("-c"),
0075             QStringLiteral("-g"),
0076             QStringLiteral("FromClipboard"),
0077         };
0078         KProcess::startDetached(executable, parameters);
0079     }
0080 }
0081 
0082 void SingleDocumentStrategyPrivate::createNewWithGenerator(AbstractModelDataGenerator* generator)
0083 {
0084     Q_Q(SingleDocumentStrategy);
0085 
0086     // TODO: show dialog in this process, meanwhile start other process, but hidden,
0087     // on result of dialog pass on the parameters
0088     if (!mDocumentManager->isEmpty()) {
0089         const QString executable = QCoreApplication::applicationFilePath();
0090         // TODO: get parameters from common place with KCmdLineOptions
0091         // TODO: forward also interesting parameters passed to this program
0092         // TODO: add id to AbstractModelDataGenerator, to use instead of className
0093         const QStringList parameters {
0094             QStringLiteral("-c"),
0095             QStringLiteral("-g"),
0096             QLatin1String(generator->metaObject()->className()),
0097         };
0098         KProcess::startDetached(executable, parameters);
0099         return;
0100     }
0101 
0102     AbstractModelDataGeneratorConfigEditor* configEditor =
0103         mViewManager->codecViewManager()->createConfigEditor(generator);
0104 
0105     if (configEditor) {
0106         // TODO: make dialog abstract for different UIs
0107         auto* dialog = new CreateDialog(configEditor, generator, QApplication::activeWindow());
0108 //         dialog->setData( mModel, selection ); TODO
0109         QObject::connect(dialog, &CreateDialog::createAccepted, q, [this](AbstractModelDataGenerator* generator) {
0110             triggerGeneration(generator);
0111         });
0112         dialog->open();
0113         return;
0114     }
0115 
0116     triggerGeneration(generator);
0117 }
0118 
0119 void SingleDocumentStrategyPrivate::triggerGeneration(AbstractModelDataGenerator* generator)
0120 {
0121     Q_Q(SingleDocumentStrategy);
0122 
0123     QApplication::setOverrideCursor(Qt::WaitCursor);
0124 
0125     auto* generateThread = new ModelDataGenerateThread(q, generator);
0126     generateThread->start();
0127     while (!generateThread->wait(100)) {
0128         QCoreApplication::processEvents(QEventLoop::ExcludeUserInputEvents | QEventLoop::ExcludeSocketNotifiers);
0129     }
0130 
0131     QMimeData* mimeData = generateThread->data();
0132 
0133     delete generateThread;
0134 
0135     const bool setModified = (generator->flags() & AbstractModelDataGenerator::DynamicGeneration);
0136     mDocumentManager->createManager()->createNewFromData(mimeData, setModified);
0137 
0138     QApplication::restoreOverrideCursor();
0139 }
0140 
0141 void SingleDocumentStrategyPrivate::load(const QUrl& url)
0142 {
0143     if (mDocumentManager->isEmpty()) {
0144         mDocumentManager->syncManager()->load(url);
0145     } else {
0146         const QString executable = QCoreApplication::applicationFilePath();
0147         // TODO: get parameters from common place with KCmdLineOptions
0148         // TODO: forward also interesting parameters passed to this program
0149         const QStringList parameters { url.url() };
0150         KProcess::startDetached(executable, parameters);
0151     }
0152 }
0153 
0154 }