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"