1 /*
2     SPDX-FileCopyrightText: 2003 Anders Lund <anders.lund@lund.tdcadsl.dk>
3     SPDX-FileCopyrightText: 2010 Christoph Cullmann <cullmann@kde.org>
4 
5     SPDX-License-Identifier: LGPL-2.0-or-later
6 */
7 
8 #ifndef _KateWordCompletion_h_
9 #define _KateWordCompletion_h_
10 
11 #include <ktexteditor/codecompletioninterface.h>
12 #include <ktexteditor/codecompletionmodel.h>
13 #include <ktexteditor/codecompletionmodelcontrollerinterface.h>
14 #include <ktexteditor/view.h>
15 
16 #include <QEvent>
17 #include <QList>
18 #include <QObject>
19 
20 #include "katepartdebug.h"
21 #include <ktexteditor_export.h>
22 
23 class KTEXTEDITOR_EXPORT KateWordCompletionModel : public KTextEditor::CodeCompletionModel, public KTextEditor::CodeCompletionModelControllerInterface
24 {
25     Q_OBJECT
26     Q_INTERFACES(KTextEditor::CodeCompletionModelControllerInterface)
27 public:
28     explicit KateWordCompletionModel(QObject *parent);
29     ~KateWordCompletionModel() override;
30 
31     /**
32      * This function is responsible to generating / updating the list of current
33      * completions. The default implementation does nothing.
34      *
35      * When implementing this function, remember to call setRowCount() (or implement
36      * rowCount()), and to generate the appropriate change notifications (for instance
37      * by calling QAbstractItemModel::reset()).
38      * @param view The view to generate completions for
39      * @param range The range of text to generate completions for
40      * */
41     void completionInvoked(KTextEditor::View *view, const KTextEditor::Range &range, InvocationType invocationType) override;
42 
43     bool shouldStartCompletion(KTextEditor::View *view, const QString &insertedText, bool userInsertion, const KTextEditor::Cursor &position) override;
44     bool shouldAbortCompletion(KTextEditor::View *view, const KTextEditor::Range &range, const QString &currentCompletion) override;
45 
46     void saveMatches(KTextEditor::View *view, const KTextEditor::Range &range);
47 
48     int rowCount(const QModelIndex &parent) const override;
49 
50     QVariant data(const QModelIndex &index, int role) const override;
51     QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;
52     QModelIndex parent(const QModelIndex &index) const override;
53     MatchReaction matchingItem(const QModelIndex &matched) override;
54 
55     bool shouldHideItemsWithEqualNames() const override;
56 
57     QStringList allMatches(KTextEditor::View *view, const KTextEditor::Range &range) const;
58 
59     void executeCompletionItem(KTextEditor::View *view, const KTextEditor::Range &word, const QModelIndex &index) const override;
60 
61 private:
62     QStringList m_matches;
63     bool m_automatic;
64 };
65 
66 class KateWordCompletionView : public QObject
67 {
68     Q_OBJECT
69 
70 public:
71     KateWordCompletionView(KTextEditor::View *view, KActionCollection *ac);
72     ~KateWordCompletionView() override;
73 
74 private Q_SLOTS:
75     void completeBackwards();
76     void completeForwards();
77     void slotCursorMoved();
78 
79     void shellComplete();
80 
81     void popupCompletionList();
82 
83 private:
84     void complete(bool fw = true);
85 
86     QString word() const;
87     KTextEditor::Range range() const;
88 
89     QString findLongestUnique(const QStringList &matches, int lead) const;
90 
91     KTextEditor::View *m_view;
92     KateWordCompletionModel *m_dWCompletionModel;
93     struct KateWordCompletionViewPrivate *d;
94 };
95 
96 #endif // _DocWordCompletionPlugin_h_
97