File indexing completed on 2024-04-21 11:36:09

0001 /*
0002     SPDX-FileCopyrightText: 2003 Anders Lund <anders.lund@lund.tdcadsl.dk>
0003     SPDX-FileCopyrightText: 2010 Christoph Cullmann <cullmann@kde.org>
0004 
0005     SPDX-License-Identifier: LGPL-2.0-or-later
0006 */
0007 
0008 #ifndef _KateWordCompletion_h_
0009 #define _KateWordCompletion_h_
0010 
0011 #include <ktexteditor/codecompletioninterface.h>
0012 #include <ktexteditor/codecompletionmodel.h>
0013 #include <ktexteditor/codecompletionmodelcontrollerinterface.h>
0014 #include <ktexteditor/view.h>
0015 
0016 #include <QEvent>
0017 #include <QList>
0018 #include <QObject>
0019 
0020 #include "katepartdebug.h"
0021 #include <ktexteditor_export.h>
0022 
0023 class KTEXTEDITOR_EXPORT KateWordCompletionModel : public KTextEditor::CodeCompletionModel, public KTextEditor::CodeCompletionModelControllerInterface
0024 {
0025     Q_OBJECT
0026     Q_INTERFACES(KTextEditor::CodeCompletionModelControllerInterface)
0027 public:
0028     explicit KateWordCompletionModel(QObject *parent);
0029     ~KateWordCompletionModel() override;
0030 
0031     /**
0032      * This function is responsible to generating / updating the list of current
0033      * completions. The default implementation does nothing.
0034      *
0035      * When implementing this function, remember to call setRowCount() (or implement
0036      * rowCount()), and to generate the appropriate change notifications (for instance
0037      * by calling QAbstractItemModel::reset()).
0038      * @param view The view to generate completions for
0039      * @param range The range of text to generate completions for
0040      * */
0041     void completionInvoked(KTextEditor::View *view, const KTextEditor::Range &range, InvocationType invocationType) override;
0042 
0043     bool shouldStartCompletion(KTextEditor::View *view, const QString &insertedText, bool userInsertion, const KTextEditor::Cursor &position) override;
0044     bool shouldAbortCompletion(KTextEditor::View *view, const KTextEditor::Range &range, const QString &currentCompletion) override;
0045 
0046     void saveMatches(KTextEditor::View *view, const KTextEditor::Range &range);
0047 
0048     int rowCount(const QModelIndex &parent) const override;
0049 
0050     QVariant data(const QModelIndex &index, int role) const override;
0051     QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;
0052     QModelIndex parent(const QModelIndex &index) const override;
0053     MatchReaction matchingItem(const QModelIndex &matched) override;
0054 
0055     bool shouldHideItemsWithEqualNames() const override;
0056 
0057     static QStringList allMatches(KTextEditor::View *view, const KTextEditor::Range &range);
0058 
0059     void executeCompletionItem(KTextEditor::View *view, const KTextEditor::Range &word, const QModelIndex &index) const override;
0060 
0061 private:
0062     QStringList m_matches;
0063     bool m_automatic;
0064 };
0065 
0066 class KateWordCompletionView : public QObject
0067 {
0068     Q_OBJECT
0069 
0070 public:
0071     KateWordCompletionView(KTextEditor::View *view, KActionCollection *ac);
0072     ~KateWordCompletionView() override;
0073 
0074 private Q_SLOTS:
0075     void completeBackwards();
0076     void completeForwards();
0077     void slotCursorMoved();
0078 
0079     void shellComplete();
0080 
0081     void popupCompletionList();
0082 
0083 private:
0084     void complete(bool fw = true);
0085 
0086     QString word() const;
0087     KTextEditor::Range range() const;
0088 
0089     static QString findLongestUnique(const QStringList &matches, int lead);
0090 
0091     KTextEditor::View *m_view;
0092     KateWordCompletionModel *m_dWCompletionModel;
0093     struct KateWordCompletionViewPrivate *d;
0094 };
0095 
0096 #endif // _DocWordCompletionPlugin_h_