Warning, file /utilities/okteta/parts/kpart/part.cpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /*
0002     This file is part of the Okteta KPart module, made within the KDE community.
0003 
0004     SPDX-FileCopyrightText: 2003, 2007, 2009, 2011, 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 "part.hpp"
0010 
0011 // part
0012 #include "partfactory.hpp"
0013 #include "browserextension.hpp"
0014 // Okteta Kasten controllers
0015 // #include <Kasten/Okteta/OverwriteOnlyControllerFactory>
0016 #include <Kasten/Okteta/OverwriteModeControllerFactory>
0017 #include <Kasten/Okteta/GotoOffsetControllerFactory>
0018 #include <Kasten/Okteta/SelectRangeControllerFactory>
0019 #include <Kasten/Okteta/SearchControllerFactory>
0020 #include <Kasten/Okteta/ReplaceControllerFactory>
0021 #include <Kasten/Okteta/BookmarksControllerFactory>
0022 #include <Kasten/Okteta/PrintControllerFactory>
0023 #include <Kasten/Okteta/ViewConfigControllerFactory>
0024 #include <Kasten/Okteta/ViewModeControllerFactory>
0025 #include <Kasten/Okteta/ViewContextMenuControllerFactory>
0026 #include <Kasten/Okteta/ViewStatusControllerFactory>
0027 #include <Kasten/Okteta/ViewProfileControllerFactory>
0028 // Okteta Kasten
0029 #include <Kasten/Okteta/ByteArrayDocument>
0030 #include <Kasten/Okteta/ByteArrayView>
0031 #include <Kasten/Okteta/ByteArrayViewProfileSynchronizer>
0032 #include <Kasten/Okteta/ByteArrayViewProfileManager>
0033 #include <Kasten/Okteta/ByteArrayRawFileSynchronizerFactory>
0034 // Kasten controllers
0035 #include <Kasten/ReadOnlyControllerFactory>
0036 // #include <Kasten/ReadOnlyBarController>
0037 // #include <Kasten/SynchronizeController>
0038 #include <Kasten/ClipboardControllerFactory>
0039 #include <Kasten/InsertControllerFactory>
0040 #include <Kasten/CopyAsControllerFactory>
0041 #include <Kasten/ExportControllerFactory>
0042 #include <Kasten/VersionControllerFactory>
0043 #include <Kasten/ZoomControllerFactory>
0044 // #include <Kasten/ZoomBarControllerFactory>
0045 #include <Kasten/SelectControllerFactory>
0046 // Kasten
0047 #include <Kasten/SingleViewArea>
0048 #include <Kasten/AbstractXmlGuiController>
0049 #include <Kasten/JobManager>
0050 #include <Kasten/AbstractLoadJob>
0051 #include <Kasten/AbstractSyncWithRemoteJob>
0052 // KF
0053 #if KPARTS_VERSION >= QT_VERSION_CHECK(5, 77, 0)
0054 #include <KPluginMetaData>
0055 #endif
0056 // Qt
0057 #include <QWidget>
0058 #include <QVBoxLayout>
0059 #include <QUrl>
0060 
0061 static constexpr const char* UIFileName[] =
0062 {
0063     "oktetapartreadonlyui.rc",
0064     "oktetapartbrowserui.rc",
0065     "oktetapartreadwriteui.rc"
0066 };
0067 
0068 OktetaPart::OktetaPart(QObject* parent,
0069 #if KPARTS_VERSION >= QT_VERSION_CHECK(5, 77, 0)
0070                        const KPluginMetaData& metaData,
0071 #else
0072                        const KAboutData& componentData,
0073 #endif
0074                        Modus modus,
0075                        Kasten::ByteArrayViewProfileManager* viewProfileManager,
0076                        Kasten::ModelCodecManager* modelCodecManager,
0077                        Kasten::ModelCodecViewManager* modelCodecViewManager)
0078     : KParts::ReadWritePart(parent)
0079     , mModus(modus)
0080     , mViewProfileManager(viewProfileManager)
0081 {
0082 #if KPARTS_VERSION >= QT_VERSION_CHECK(5, 77, 0)
0083     setMetaData(metaData);
0084 #else
0085     setComponentData(componentData);
0086 #endif
0087 
0088     auto* widget = new QWidget();
0089     mLayout = new QVBoxLayout(widget);
0090     mLayout->setContentsMargins(0, 0, 0, 0);
0091 
0092     setWidget(widget);
0093 
0094     setXMLFile(QLatin1String(UIFileName[modus]));
0095 
0096     mSingleViewArea = new Kasten::SingleViewArea();
0097     auto areaWidget = mSingleViewArea->widget();
0098     mLayout->addWidget(areaWidget);
0099     mLayout->parentWidget()->setFocusProxy(areaWidget);
0100 
0101     if (modus == Modus::ReadWrite) {
0102         addController(Kasten::VersionControllerFactory());
0103     }
0104     if (modus == Modus::ReadWrite) {
0105         addController(Kasten::ReadOnlyControllerFactory());
0106     }
0107     // TODO: save_as
0108     addController(Kasten::ExportControllerFactory(modelCodecViewManager, modelCodecManager));
0109     addController(Kasten::ZoomControllerFactory());
0110     addController(Kasten::SelectControllerFactory());
0111     if (modus != Modus::BrowserView) {
0112         addController(Kasten::ClipboardControllerFactory());
0113     }
0114     if (modus == Modus::ReadWrite) {
0115         addController(Kasten::InsertControllerFactory(modelCodecViewManager, modelCodecManager));
0116     }
0117     addController(Kasten::CopyAsControllerFactory(modelCodecViewManager, modelCodecManager));
0118     if (modus == Modus::ReadWrite) {
0119         addController(Kasten::OverwriteModeControllerFactory());
0120     }
0121     addController(Kasten::SearchControllerFactory(widget));
0122     if (modus == Modus::ReadWrite) {
0123         addController(Kasten::ReplaceControllerFactory(widget));
0124     }
0125     addController(Kasten::GotoOffsetControllerFactory(mSingleViewArea));
0126     addController(Kasten::SelectRangeControllerFactory(mSingleViewArea));
0127 //     addController(Kasten::BookmarksControllerFactory());
0128     addController(Kasten::PrintControllerFactory());
0129     addController(Kasten::ViewConfigControllerFactory());
0130     addController(Kasten::ViewModeControllerFactory());
0131     addController(Kasten::ViewContextMenuControllerFactory());
0132     addController(Kasten::ViewProfileControllerFactory(mViewProfileManager, widget));
0133 
0134 //     Kasten::StatusBar* bottomBar = static_cast<Kasten::StatusBar*>( statusBar() );
0135 //     addController(ViewStatusControllerFactory(bottomBar) );
0136 //     addController(ReadOnlyBarControllerFactory(bottomBar) );
0137 //     addController(ZoomBarControllerFactory(bottomBar) );
0138 
0139 //     addTool( new DocumentInfoToolView(new DocumentInfoTool(mProgram->documentManager()->syncManager())) );
0140 //     addTool( new ChecksumToolView(new ChecksumTool()) );
0141 //     addTool( new FilterToolView(new FilterTool()) );
0142 //     addTool( new StringsExtractToolView(new StringsExtractTool()) );
0143 //     addTool( new ByteTableToolView(new ByteTableTool()) );
0144 //     addTool( new InfoToolView(new InfoTool()) );
0145 //     addTool( new PODDecoderToolView(new PODDecoderTool()) );
0146 //     addTool( new BookmarksToolView(new BookmarksTool()) );
0147 
0148     // TODO: BrowserExtension might rely on existing objects (session snap while loadJob),
0149     // so this hack just creates some dummies
0150     mDocument = new Kasten::ByteArrayDocument(QString());
0151     auto* viewProfileSynchronizer = new Kasten::ByteArrayViewProfileSynchronizer(viewProfileManager);
0152     mByteArrayView = new Kasten::ByteArrayView(mDocument, viewProfileSynchronizer);
0153 
0154     if (modus == Modus::BrowserView) {
0155         new OktetaBrowserExtension(this);
0156     }
0157 }
0158 
0159 OktetaPart::~OktetaPart()
0160 {
0161     qDeleteAll(mControllers);
0162     delete mSingleViewArea;
0163     delete mByteArrayView;
0164     delete mDocument;
0165 }
0166 
0167 void OktetaPart::addController(const Kasten::AbstractXmlGuiControllerFactory& factory)
0168 {
0169     Kasten::AbstractXmlGuiController* controller = factory.create(this);
0170     mControllers.append(controller);
0171 }
0172 
0173 void OktetaPart::setReadWrite(bool readWrite)
0174 {
0175     mDocument->setReadOnly(!readWrite);
0176 
0177     KParts::ReadWritePart::setReadWrite(readWrite);   // TODO: call to super needed?
0178 }
0179 
0180 bool OktetaPart::openFile()
0181 {
0182     auto* synchronizerFactory = new Kasten::ByteArrayRawFileSynchronizerFactory();
0183     Kasten::AbstractModelSynchronizer* synchronizer = synchronizerFactory->createSynchronizer();
0184 
0185     Kasten::AbstractLoadJob* loadJob = synchronizer->startLoad(QUrl::fromLocalFile(localFilePath()));
0186     connect(loadJob, &Kasten::AbstractLoadJob::documentLoaded,
0187             this, &OktetaPart::onDocumentLoaded);
0188     Kasten::JobManager::executeJob(loadJob);
0189 
0190     delete synchronizerFactory;
0191 
0192     return true;
0193 }
0194 
0195 bool OktetaPart::saveFile()
0196 {
0197     Kasten::AbstractModelSynchronizer* synchronizer = mDocument->synchronizer();
0198 
0199     Kasten::AbstractSyncWithRemoteJob* syncJob =
0200         synchronizer->startSyncWithRemote(QUrl::fromLocalFile(localFilePath()), Kasten::AbstractModelSynchronizer::ReplaceRemote);
0201     const bool syncSucceeded = Kasten::JobManager::executeJob(syncJob);
0202 
0203     return syncSucceeded;
0204 }
0205 
0206 void OktetaPart::onDocumentLoaded(Kasten::AbstractDocument* document)
0207 {
0208     if (document) {
0209         for (Kasten::AbstractXmlGuiController* controller : qAsConst(mControllers)) {
0210             controller->setTargetModel(nullptr);
0211         }
0212         mSingleViewArea->setView(nullptr);
0213         delete mByteArrayView;
0214         delete mDocument;
0215 
0216         mDocument = static_cast<Kasten::ByteArrayDocument*>(document);
0217         mDocument->setReadOnly(mModus != Modus::ReadWrite);
0218         connect(mDocument->synchronizer(), &Kasten::AbstractModelSynchronizer::localSyncStateChanged,
0219                 this, &OktetaPart::onModified);
0220 
0221         auto* viewProfileSynchronizer = new Kasten::ByteArrayViewProfileSynchronizer(mViewProfileManager);
0222         viewProfileSynchronizer->setViewProfileId(mViewProfileManager->defaultViewProfileId());
0223 
0224         mByteArrayView = new Kasten::ByteArrayView(mDocument, viewProfileSynchronizer);
0225         connect(mByteArrayView, SIGNAL(hasSelectedDataChanged(bool)), SIGNAL(hasSelectedDataChanged(bool)));
0226 
0227         mSingleViewArea->setView(mByteArrayView);
0228 
0229         for (Kasten::AbstractXmlGuiController* controller : qAsConst(mControllers)) {
0230             controller->setTargetModel(mByteArrayView);
0231         }
0232 
0233         setModified(false);
0234     }
0235 }
0236 
0237 void OktetaPart::onModified(Kasten::LocalSyncState state)
0238 {
0239     const bool isModified = (state != Kasten::LocalInSync);
0240     setModified(isModified);
0241 }
0242 
0243 #include "moc_part.cpp"