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