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

0001 /* This file is part of the KDE project
0002  * SPDX-FileCopyrightText: 2012 Arjen Hiemstra <ahiemstra@heimr.nl>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "DocumentManager.h"
0008 #include "Settings.h"
0009 #include "RecentFileManager.h"
0010 #include "ProgressProxy.h"
0011 
0012 #include <KWPart.h>
0013 #include <KoDocument.h>
0014 #include <KoDocumentEntry.h>
0015 
0016 #include <libs/pigment/KoColor.h>
0017 #include <KoColorSpaceRegistry.h>
0018 
0019 #include <stage/part/KPrDocument.h>
0020 #include <part/KWDocument.h>
0021 
0022 #include <QMimeType>
0023 
0024 class DocumentManager::Private
0025 {
0026 public:
0027     Private()
0028         : proxy(0)
0029         , document(0)
0030         , part(0)
0031         , settingsManager(0)
0032         , recentFileManager(0)
0033         , importingDocument(false)
0034         , temporaryFile(false)
0035     { }
0036 
0037     ProgressProxy* proxy;
0038     QPointer<KoDocument> document;
0039     QPointer<KoPart> part;
0040     Settings* settingsManager;
0041     RecentFileManager* recentFileManager;
0042 
0043     QString saveAsFilename;
0044     QString openDocumentFilename;
0045     bool importingDocument;
0046     QVariantMap newDocOptions;
0047     bool temporaryFile;
0048 };
0049 
0050 DocumentManager *DocumentManager::sm_instance = 0;
0051 
0052 KoDocument* DocumentManager::document() const
0053 {
0054     return d->document;
0055 }
0056 
0057 QObject* DocumentManager::doc() const
0058 {
0059     return d->document;
0060 }
0061 
0062 KoPart* DocumentManager::part(const QString& type)
0063 {
0064     Q_UNUSED(type)
0065     if (!d->part)
0066         d->part = new KWPart(this);
0067     return d->part;
0068 }
0069 
0070 ProgressProxy* DocumentManager::progressProxy() const
0071 {
0072     return d->proxy;
0073 }
0074 
0075 Settings* DocumentManager::settingsManager() const
0076 {
0077     return d->settingsManager;
0078 }
0079 
0080 void DocumentManager::setSettingsManager(Settings* newManager)
0081 {
0082     d->settingsManager = newManager;
0083 }
0084 
0085 void DocumentManager::setDocAndPart(KoDocument* document, KoPart* part)
0086 {
0087     d->document = document;
0088     d->part = part;
0089     d->temporaryFile = false;
0090     emit documentChanged();
0091     connect(document, &QObject::destroyed, this, &DocumentManager::aboutToDeleteDocument);
0092 }
0093 
0094 RecentFileManager* DocumentManager::recentFileManager() const
0095 {
0096     return d->recentFileManager;
0097 }
0098 
0099 bool DocumentManager::isTemporaryFile() const
0100 {
0101     if(d->document->url().isEmpty()) {
0102         return true;
0103     }
0104     return d->temporaryFile;
0105 }
0106 
0107 void DocumentManager::newDocument(int width, int height, float resolution)
0108 {
0109     Q_UNUSED(width)
0110     Q_UNUSED(height)
0111     Q_UNUSED(resolution)
0112     closeDocument();
0113 
0114     QTimer::singleShot(300, this, &DocumentManager::delayedNewDocument);
0115 }
0116 
0117 void DocumentManager::newDocument(const QVariantMap& options)
0118 {
0119     closeDocument();
0120 
0121     d->newDocOptions = options;
0122     QTimer::singleShot(300, this, &DocumentManager::delayedNewDocument);
0123 }
0124 
0125 void DocumentManager::delayedNewDocument()
0126 {
0127     QString filetype;
0128     if(d->newDocOptions.value("type", WORDS_MIME_TYPE).toString() == WORDS_MIME_TYPE) {
0129         filetype = "odt";
0130         d->document = new KWDocument(part(WORDS_MIME_TYPE));
0131     }
0132     else {
0133         filetype = "odp";
0134         d->document = new KPrDocument(part(STAGE_MIME_TYPE));
0135     }
0136     d->document->setProgressProxy(d->proxy);
0137     d->document->setSaveInBatchMode(true);
0138     part()->setDocument(d->document);
0139     connect(d->document.data(), &QObject::destroyed, this, &DocumentManager::aboutToDeleteDocument);
0140 
0141     if(d->newDocOptions.isEmpty())
0142     {
0143         //d->document->newImage("Untitled", d->newDocWidth, d->newDocHeight, KoColorSpaceRegistry::instance()->rgb8());
0144         //d->document->image()->setResolution(d->newDocResolution, d->newDocResolution);
0145         //d->document->setUrl(QUrl("Untitled.kra"));
0146     }
0147     else
0148     {
0149         //QString name = d->newDocOptions.value("name", "Untitled").toString();
0150         //int width = d->newDocOptions.value("width").toInt();
0151         //int height = d->newDocOptions.value("height").toInt();
0152         // internal resolution is pixels per point, not ppi
0153         //float res = d->newDocOptions.value("resolution", 72.0f).toFloat() / 72.0f;
0154 
0155         QString colorModelId = d->newDocOptions.value("colorModelId").toString();
0156         QString colorDepthId = d->newDocOptions.value("colorDepthId").toString();
0157         QString colorProfileId = d->newDocOptions.value("colorProfileId").toString();
0158 
0159         const KoColorSpace* profile;
0160         if(colorModelId.isEmpty() || colorDepthId.isEmpty() || colorProfileId.isEmpty())
0161         {
0162             profile = KoColorSpaceRegistry::instance()->rgb8();
0163         }
0164         else
0165         {
0166             profile = KoColorSpaceRegistry::instance()->colorSpace(colorModelId, colorDepthId, colorProfileId);
0167         }
0168 
0169         QColor background = d->newDocOptions.value("backgroundColor", QColor("white")).value<QColor>();
0170         background.setAlphaF(d->newDocOptions.value("backgroundOpacity", 1.0f).toFloat());
0171         KoColor bg(background, profile);
0172 
0173         d->document->setUrl(QUrl(QString("Untitled.").append(filetype)));
0174     }
0175 
0176     d->temporaryFile = true;
0177 
0178     emit documentChanged();
0179 }
0180 
0181 void DocumentManager::openDocument(const QString& document, bool import)
0182 {
0183     closeDocument();
0184     d->openDocumentFilename = document;
0185     d->importingDocument = import;
0186     QTimer::singleShot(0, this, &DocumentManager::delayedOpenDocument);
0187 }
0188 
0189 void DocumentManager::delayedOpenDocument()
0190 {
0191     d->document = 0;
0192     QMimeDatabase db;
0193     QMimeType mimeType = db.mimeTypeForUrl(QUrl::fromLocalFile(d->openDocumentFilename));
0194     KoDocumentEntry documentEntry = KoDocumentEntry::queryByMimeType(mimeType.name());
0195     d->part = documentEntry.createKoPart();
0196     if (d->part) {
0197         d->document = d->part->document();
0198         d->document->setProgressProxy(d->proxy);
0199         d->document->setSaveInBatchMode(true);
0200 
0201         d->document->setModified(false);
0202         if (d->importingDocument)
0203             d->document->importDocument(QUrl::fromLocalFile(d->openDocumentFilename));
0204         else
0205             d->document->openUrl(QUrl::fromLocalFile(d->openDocumentFilename));
0206         d->recentFileManager->addRecent(d->openDocumentFilename);
0207 
0208         d->temporaryFile = false;
0209     }
0210 
0211     emit documentChanged();
0212 }
0213 
0214 void DocumentManager::closeDocument()
0215 {
0216     if (d->document) {
0217         d->document->closeUrl(false);
0218         d->document->deleteLater();
0219         d->document.clear();
0220     }
0221 }
0222 
0223 bool DocumentManager::save()
0224 {
0225     if (d->document->save())
0226     {
0227         d->recentFileManager->addRecent(d->document->url().toLocalFile());
0228         d->settingsManager->setCurrentFile(d->document->url().toLocalFile());
0229         emit documentSaved();
0230         return true;
0231     }
0232     return false;
0233 }
0234 
0235 void DocumentManager::saveAs(const QString &filename, const QString &mimetype)
0236 {
0237     d->document->setOutputMimeType(mimetype.toLatin1());
0238     d->saveAsFilename = filename;
0239     // Yes. This is a massive hack. Basically, we need to wait a little while, to ensure
0240     // the save call happens late enough for a variety of UI things to happen first.
0241     // A second seems like a long time, but well, we do have file system interaction here,
0242     // so for now, we can get away with it.
0243     QTimer::singleShot(0, this, &DocumentManager::delayedSaveAs);
0244 }
0245 
0246 void DocumentManager::delayedSaveAs()
0247 {
0248     d->document->saveAs(QUrl::fromLocalFile(d->saveAsFilename));
0249     d->settingsManager->setCurrentFile(d->saveAsFilename);
0250     d->recentFileManager->addRecent(d->saveAsFilename);
0251     emit documentSaved();
0252 }
0253 
0254 void DocumentManager::reload()
0255 {
0256     QUrl url = d->document->url();
0257     closeDocument();
0258     d->openDocumentFilename = url.toLocalFile();
0259     QTimer::singleShot(0, this, &DocumentManager::delayedOpenDocument);
0260 }
0261 
0262 void DocumentManager::setTemporaryFile(bool temp)
0263 {
0264     d->temporaryFile = temp;
0265     emit documentSaved();
0266 }
0267 
0268 DocumentManager* DocumentManager::instance()
0269 {
0270     if (!sm_instance) {
0271         sm_instance = new DocumentManager(QCoreApplication::instance());
0272     }
0273 
0274     return sm_instance;
0275 }
0276 
0277 DocumentManager::DocumentManager(QObject* parent)
0278     : QObject(parent), d(new Private)
0279 {
0280     d->proxy = new ProgressProxy(this);
0281     d->recentFileManager = new RecentFileManager(this);
0282 }
0283 
0284 DocumentManager::~DocumentManager()
0285 {
0286     delete d;
0287 }
0288