File indexing completed on 2024-06-02 06:03:20

0001 /*
0002     This file is part of the Kasten Framework, made within the KDE community.
0003 
0004     SPDX-FileCopyrightText: 2007-2009, 2019 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 "modelcodecmanager_p.hpp"
0010 
0011 // lib
0012 #include "modelencoderfilesystemexporter.hpp"
0013 #include "abstractmodelstreamencoder.hpp"
0014 // #include "abstractmodelstreamdecoder.hpp"
0015 #include "abstractmodeldatagenerator.hpp"
0016 #include "abstractoverwritedialog.hpp"
0017 #include "jobmanager.hpp"
0018 #include "abstractexportjob.hpp"
0019 // KF
0020 #include <KIO/StatJob>
0021 #include <KJobWidgets>
0022 #include <KLocalizedString>
0023 // Qt
0024 #include <QFileDialog>
0025 #include <QUrl>
0026 // Std
0027 #include <utility>
0028 
0029 namespace Kasten {
0030 
0031 ModelCodecManagerPrivate::~ModelCodecManagerPrivate()
0032 {
0033     qDeleteAll(mExporterList);
0034     qDeleteAll(mEncoderList);
0035 //     qDeleteAll( mDecoderList );
0036     qDeleteAll(mGeneratorList);
0037 }
0038 
0039 QVector<AbstractModelStreamEncoder*>
0040 ModelCodecManagerPrivate::encoderList(AbstractModel* model, const AbstractModelSelection* selection) const
0041 {
0042     Q_UNUSED(selection)
0043     return model ? mEncoderList : QVector<AbstractModelStreamEncoder*>();
0044 }
0045 
0046 QVector<AbstractModelStreamDecoder*>
0047 ModelCodecManagerPrivate::decoderList() const { return mDecoderList; }
0048 
0049 QVector<AbstractModelDataGenerator*>
0050 ModelCodecManagerPrivate::generatorList() const { return mGeneratorList; }
0051 
0052 QVector<AbstractModelExporter*>
0053 ModelCodecManagerPrivate::exporterList(AbstractModel* model, const AbstractModelSelection* selection) const
0054 {
0055     Q_UNUSED(selection)
0056     return model ? mExporterList : QVector<AbstractModelExporter*>();
0057 }
0058 
0059 void ModelCodecManagerPrivate::setOverwriteDialog(AbstractOverwriteDialog* overwriteDialog)
0060 {
0061     mOverwriteDialog = overwriteDialog;
0062 }
0063 
0064 void ModelCodecManagerPrivate::setEncoders(const QVector<AbstractModelStreamEncoder*>& encoderList)
0065 {
0066     mEncoderList = encoderList;
0067 
0068     qDeleteAll(mExporterList);
0069     mExporterList.clear();
0070 
0071     mExporterList.reserve(mEncoderList.size());
0072     for (AbstractModelStreamEncoder* encoder : std::as_const(mEncoderList)) {
0073         mExporterList << new ModelEncoderFileSystemExporter(encoder);
0074     }
0075 }
0076 
0077 void ModelCodecManagerPrivate::setDecoders(const QVector<AbstractModelStreamDecoder*>& decoderList)
0078 {
0079     mDecoderList = decoderList;
0080 }
0081 
0082 void ModelCodecManagerPrivate::setGenerators(const QVector<AbstractModelDataGenerator*>& generatorList)
0083 {
0084     mGeneratorList = generatorList;
0085 }
0086 
0087 void ModelCodecManagerPrivate::encodeToStream(AbstractModelStreamEncoder* encoder,
0088                                        AbstractModel* model, const AbstractModelSelection* selection)
0089 {
0090     Q_UNUSED(selection)
0091     Q_UNUSED(model)
0092     Q_UNUSED(encoder)
0093 //    AbstractDocument* model = mFactory->create();
0094 //    mManager->addDocument( model );
0095 }
0096 
0097 void ModelCodecManagerPrivate::exportDocument(AbstractModelExporter* exporter,
0098                                        AbstractModel* model, const AbstractModelSelection* selection)
0099 {
0100     bool exportDone = false;
0101 
0102     const QString dialogTitle =
0103         i18nc("@title:window", "Export");
0104     do {
0105         QFileDialog exportFileDialog(/*mWidget*/ nullptr, dialogTitle);
0106 
0107         exportFileDialog.setAcceptMode(QFileDialog::AcceptSave);
0108         exportFileDialog.setOption(QFileDialog::DontConfirmOverwrite);
0109         exportFileDialog.setFileMode(QFileDialog::AnyFile);
0110         const QStringList mimeTypes = QStringList { exporter->remoteMimeType() };
0111         exportFileDialog.setMimeTypeFilters(mimeTypes);
0112 
0113         exportFileDialog.setLabelText(QFileDialog::Accept, i18nc("@action:button", "&Export"));
0114 
0115         exportFileDialog.exec();
0116 
0117         const QList<QUrl> exportUrls = exportFileDialog.selectedUrls();
0118 
0119         if (!exportUrls.isEmpty()) {
0120             const QUrl& exportUrl = exportUrls.at(0);
0121 
0122             KIO::StatJob* statJob = KIO::stat(exportUrl);
0123             statJob->setSide(KIO::StatJob::DestinationSide);
0124             KJobWidgets::setWindow(statJob, /*mWidget*/ nullptr);
0125 
0126             const bool isUrlInUse = statJob->exec();
0127 
0128             if (isUrlInUse) {
0129                 // TODO: care for case that file from url is already loaded by (only?) this program
0130 //                     const bool otherFileLoaded = mManager->documentByUrl( exportUrl );
0131                 // TODO: replace "file" with synchronizer->storageTypeName() or such
0132                 // TODO: offer "Synchronize" as alternative, if supported, see below
0133                 const Answer answer =
0134                     mOverwriteDialog ? mOverwriteDialog->queryOverwrite(exportUrl, dialogTitle) : Cancel;
0135                 if (answer == Cancel) {
0136                     break;
0137                 }
0138                 if (answer == PreviousQuestion) {
0139                     continue;
0140                 }
0141             }
0142 
0143             AbstractExportJob* exportJob = exporter->startExport(model, selection, exportUrl);
0144             exportDone = JobManager::executeJob(exportJob);
0145 
0146 //                 if( exportDone )
0147 //                     Q_EMIT urlUsed( exportUrl );
0148         } else {
0149             break;
0150         }
0151     } while (!exportDone);
0152 }
0153 
0154 }