File indexing completed on 2024-04-28 04:39:03
0001 /* 0002 SPDX-FileCopyrightText: 2010 Friedrich W. H. Kossebau <kossebau@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL 0005 */ 0006 0007 #include "oktetaplugin.h" 0008 0009 // plugin 0010 #include "oktetadocumentfactory.h" 0011 #include "oktetatoolviewfactory.h" 0012 #include "oktetadocument.h" 0013 // Okteta Kasten tools 0014 #include <Kasten/Okteta/StringsExtractToolViewFactory> 0015 #include <Kasten/Okteta/StringsExtractToolFactory> 0016 #include <Kasten/Okteta/InfoToolViewFactory> 0017 #include <Kasten/Okteta/InfoToolFactory> 0018 #include <Kasten/Okteta/FilterToolViewFactory> 0019 #include <Kasten/Okteta/FilterToolFactory> 0020 #include <Kasten/Okteta/ChecksumToolViewFactory> 0021 #include <Kasten/Okteta/ChecksumToolFactory> 0022 // #include <documentinfotoolview.h> 0023 // #include <documentinfotool.h> 0024 #include <Kasten/Okteta/PODDecoderToolViewFactory> 0025 #include <Kasten/Okteta/PODDecoderToolFactory> 0026 #include <Kasten/Okteta/ByteTableToolViewFactory> 0027 #include <Kasten/Okteta/ByteTableToolFactory> 0028 #include <Kasten/Okteta/BookmarksToolViewFactory> 0029 #include <Kasten/Okteta/BookmarksToolFactory> 0030 #include <Kasten/Okteta/StructuresToolViewFactory> 0031 #include <Kasten/Okteta/StructuresToolFactory> 0032 // Okteta Kasten 0033 #include <Kasten/Okteta/ByteArrayViewProfileManager> 0034 // KDev 0035 #include <project/projectmodel.h> 0036 #include <interfaces/icore.h> 0037 #include <interfaces/idocumentcontroller.h> 0038 #include <interfaces/iuicontroller.h> 0039 #include <interfaces/contextmenuextension.h> 0040 #include <interfaces/context.h> 0041 // KF 0042 #include <KPluginFactory> 0043 #include <KLocalizedString> 0044 0045 #include <QMimeType> 0046 #include <QAction> 0047 0048 K_PLUGIN_FACTORY_WITH_JSON(OktetaPluginFactory, "kdevokteta.json", registerPlugin<KDevelop::OktetaPlugin>(); ) 0049 0050 namespace KDevelop 0051 { 0052 0053 static inline 0054 void addTool( IUiController* uiController, 0055 Kasten::AbstractToolViewFactory* toolViewFactory, 0056 Kasten::AbstractToolFactory* toolFactory ) 0057 { 0058 auto* factory = 0059 new OktetaToolViewFactory( toolViewFactory, toolFactory ); 0060 0061 uiController->addToolView( toolViewFactory->title(), factory ); 0062 } 0063 0064 0065 OktetaPlugin::OktetaPlugin( QObject* parent, const QVariantList& args ) 0066 : IPlugin( QStringLiteral("kdevokteta"), parent ) 0067 , mDocumentFactory( new OktetaDocumentFactory(this) ) 0068 , mViewProfileManager( new Kasten::ByteArrayViewProfileManager() ) 0069 { 0070 Q_UNUSED(args) 0071 0072 IUiController* uiController = core()->uiController(); 0073 addTool( uiController, new Kasten::ChecksumToolViewFactory(), new Kasten::ChecksumToolFactory() ); 0074 addTool( uiController, new Kasten::FilterToolViewFactory(), new Kasten::FilterToolFactory() ); 0075 addTool( uiController, new Kasten::StringsExtractToolViewFactory, new Kasten::StringsExtractToolFactory() ); 0076 addTool( uiController, new Kasten::ByteTableToolViewFactory(), new Kasten::ByteTableToolFactory() ); 0077 addTool( uiController, new Kasten::InfoToolViewFactory(), new Kasten::InfoToolFactory() ); 0078 addTool( uiController, new Kasten::PodDecoderToolViewFactory(), new Kasten::PodDecoderToolFactory() ); 0079 addTool( uiController, new Kasten::StructuresToolViewFactory(), new Kasten::StructuresToolFactory() ); 0080 addTool( uiController, new Kasten::BookmarksToolViewFactory, new Kasten::BookmarksToolFactory() ); 0081 0082 KDevelop::IDocumentController* documentController = core()->documentController(); 0083 documentController->registerDocumentForMimetype(QStringLiteral("application/octet-stream"), mDocumentFactory); 0084 } 0085 0086 ContextMenuExtension OktetaPlugin::contextMenuExtension(Context* context, QWidget* parent) 0087 { 0088 auto* openWithContext = dynamic_cast<OpenWithContext*>( context ); 0089 0090 if( openWithContext && !openWithContext->mimeType().inherits(QStringLiteral("inode/directory"))) 0091 { 0092 auto* openAction = new QAction(i18nc("@item:inmenu", "Hex Editor"), parent); 0093 openAction->setIcon( QIcon::fromTheme(QStringLiteral("document-open")) ); 0094 openAction->setData( QVariant::fromValue(openWithContext->urls()) ); 0095 connect( openAction, &QAction::triggered, this, &OktetaPlugin::onOpenTriggered ); 0096 0097 KDevelop::ContextMenuExtension contextMenuExtension; 0098 contextMenuExtension.addAction( KDevelop::ContextMenuExtension::OpenEmbeddedGroup, openAction ); 0099 return contextMenuExtension; 0100 } 0101 0102 return KDevelop::IPlugin::contextMenuExtension(context, parent); 0103 } 0104 0105 void OktetaPlugin::onOpenTriggered() 0106 { 0107 auto* action = qobject_cast<QAction*>(sender()); 0108 Q_ASSERT(action); 0109 0110 KDevelop::ICore* core = KDevelop::ICore::self(); 0111 IDocumentController* documentController = core->documentController(); 0112 0113 const auto urls = action->data().value<QList<QUrl>>(); 0114 for (const QUrl& url : urls) { 0115 IDocument* existingDocument = documentController->documentForUrl(url); 0116 if( existingDocument ) 0117 if( ! existingDocument->close() ) 0118 continue; 0119 0120 IDocument* createdDocument = mDocumentFactory->create( url, core ); 0121 if( createdDocument ) 0122 documentController->openDocument( createdDocument ); 0123 } 0124 } 0125 0126 OktetaPlugin::~OktetaPlugin() 0127 { 0128 delete mDocumentFactory; 0129 } 0130 0131 } 0132 0133 #include "oktetaplugin.moc" 0134 #include "moc_oktetaplugin.cpp"