File indexing completed on 2024-05-05 04:40:54

0001 /*
0002     SPDX-FileCopyrightText: 2007 David Nolden <david.nolden.kdevelop@art-master.de>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #ifndef KDEVPLATFORM_PLUGIN_QUICKOPENPLUGIN_H
0008 #define KDEVPLATFORM_PLUGIN_QUICKOPENPLUGIN_H
0009 
0010 #include <QVariant>
0011 #include <QPointer>
0012 
0013 #include <interfaces/iplugin.h>
0014 
0015 #include <language/interfaces/iquickopen.h>
0016 #include <language/interfaces/quickopendataprovider.h>
0017 
0018 class QAction;
0019 
0020 namespace KTextEditor {
0021 class Cursor;
0022 }
0023 
0024 class QuickOpenModel;
0025 class QuickOpenWidget;
0026 class QuickOpenLineEdit;
0027 
0028 class QuickOpenPlugin
0029     : public KDevelop::IPlugin
0030     , public KDevelop::IQuickOpen
0031 {
0032     Q_OBJECT
0033     Q_INTERFACES(KDevelop::IQuickOpen)
0034 public:
0035     explicit QuickOpenPlugin(QObject* parent, const QVariantList& = QVariantList());
0036     ~QuickOpenPlugin() override;
0037 
0038     static QuickOpenPlugin* self();
0039 
0040     // KDevelop::Plugin methods
0041     void unload() override;
0042 
0043     KDevelop::ContextMenuExtension contextMenuExtension(KDevelop::Context* context, QWidget* parent) override;
0044 
0045     enum ModelTypes {
0046         Files = 1,
0047         Functions = 2,
0048         Classes = 4,
0049         OpenFiles = 8,
0050         All = Files + Functions + Classes + OpenFiles
0051     };
0052 
0053     /**
0054      * Shows the quickopen dialog with the specified Model-types
0055      * @param modes A combination of ModelTypes
0056      * */
0057     void showQuickOpen(ModelTypes modes = All);
0058     void showQuickOpen(const QStringList& items) override;
0059 
0060     void registerProvider(const QStringList& scope, const QStringList& type, KDevelop::QuickOpenDataProviderBase* provider) override;
0061 
0062     bool removeProvider(KDevelop::QuickOpenDataProviderBase* provider) override;
0063 
0064     QSet<KDevelop::IndexedString> fileSet() const override;
0065 
0066     //Frees the model by closing active quickopen dialoags, and returns whether successful.
0067     bool freeModel();
0068 
0069     void createActionsForMainWindow(Sublime::MainWindow* window, QString& xmlFile, KActionCollection& actions) override;
0070 
0071     QuickOpenLineEdit* createQuickOpenLineWidget();
0072 
0073     QLineEdit* createQuickOpenLine(const QStringList& scopes, const QStringList& type, QuickOpenType kind) override;
0074 
0075 public Q_SLOTS:
0076     void quickOpen();
0077     void quickOpenFile();
0078     void quickOpenFunction();
0079     void quickOpenClass();
0080     void quickOpenDeclaration();
0081     void quickOpenOpenFile();
0082     void quickOpenDefinition();
0083     void quickOpenNavigateFunctions();
0084     void quickOpenDocumentation();
0085     void quickOpenActions();
0086 
0087     void previousFunction();
0088     void nextFunction();
0089 private Q_SLOTS:
0090     void storeScopes(const QStringList&);
0091     void storeItems(const QStringList&);
0092 private:
0093     friend class QuickOpenLineEdit;
0094     friend class StandardQuickOpenWidgetCreator;
0095     QuickOpenLineEdit* quickOpenLine(const QString& name = QStringLiteral( "Quickopen" ));
0096 
0097     enum FunctionJumpDirection { NextFunction, PreviousFunction };
0098     void jumpToNearestFunction(FunctionJumpDirection direction);
0099 
0100     QPair<QUrl, KTextEditor::Cursor> specialObjectJumpPosition() const;
0101     QWidget* specialObjectNavigationWidget() const;
0102     bool jumpToSpecialObject();
0103     void showQuickOpenWidget(const QStringList& items, const QStringList& scopes, bool preselectText);
0104 
0105     QuickOpenModel* m_model;
0106     class ProjectFileDataProvider* m_projectFileData;
0107     class ProjectItemDataProvider* m_projectItemData;
0108     class OpenFilesDataProvider* m_openFilesData;
0109     class DocumentationQuickOpenProvider* m_documentationItemData;
0110     class ActionsQuickOpenProvider* m_actionsItemData;
0111     QStringList lastUsedScopes;
0112     QStringList lastUsedItems;
0113 
0114     //We can only have one widget at a time, because we manipulate the model.
0115     QPointer<QObject> m_currentWidgetHandler;
0116     QAction* m_quickOpenDeclaration;
0117     QAction* m_quickOpenDefinition;
0118 };
0119 
0120 class QuickOpenWidgetCreator;
0121 
0122 class QuickOpenLineEdit : public QLineEdit
0123 {
0124     Q_OBJECT
0125 public:
0126     explicit QuickOpenLineEdit(QuickOpenWidgetCreator* creator);
0127     ~QuickOpenLineEdit() override;
0128 
0129     bool insideThis(QObject* object);
0130     void showWithWidget(QuickOpenWidget* widget);
0131 
0132 private Q_SLOTS:
0133     void activate();
0134     void deactivate();
0135     void checkFocus();
0136     void widgetDestroyed(QObject*);
0137 private:
0138     void focusInEvent(QFocusEvent* ev) override;
0139     bool eventFilter(QObject* obj, QEvent* e) override;
0140     void hideEvent(QHideEvent*) override;
0141 
0142     QPointer<QuickOpenWidget> m_widget;
0143     bool m_forceUpdate;
0144     QuickOpenWidgetCreator* m_widgetCreator;
0145 };
0146 
0147 #endif // KDEVPLATFORM_PLUGIN_QUICKOPENPLUGIN_H