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"