1 /*
2     SPDX-FileCopyrightText: 2013-2016 Simon St James <kdedevel@etotheipiplusone.com>
3 
4     SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6 
7 #ifndef KATEVI_EMULATED_COMMAND_BAR_COMPLETER_H
8 #define KATEVI_EMULATED_COMMAND_BAR_COMPLETER_H
9 
10 #include <functional>
11 
12 #include <QStringList>
13 
14 namespace KTextEditor
15 {
16 class ViewPrivate;
17 }
18 
19 class QLineEdit;
20 class QCompleter;
21 class QStringListModel;
22 class QKeyEvent;
23 
24 namespace KateVi
25 {
26 class ActiveMode;
27 class EmulatedCommandBar;
28 
29 struct CompletionStartParams {
30     static CompletionStartParams createModeSpecific(const QStringList &completions,
31                                                     int wordStartPos,
32                                                     std::function<QString(const QString &)> completionTransform = std::function<QString(const QString &)>())
33     {
34         CompletionStartParams completionStartParams;
35         completionStartParams.completionType = ModeSpecific;
36         completionStartParams.completions = completions;
37         completionStartParams.wordStartPos = wordStartPos;
38         completionStartParams.completionTransform = completionTransform;
39         return completionStartParams;
40     }
invalidCompletionStartParams41     static CompletionStartParams invalid()
42     {
43         CompletionStartParams completionStartParams;
44         completionStartParams.completionType = None;
45         return completionStartParams;
46     }
47     enum CompletionType { None, ModeSpecific, WordFromDocument };
48     CompletionType completionType = None;
49     int wordStartPos = -1;
50     QStringList completions;
51     std::function<QString(const QString &)> completionTransform;
52 };
53 
54 class Completer
55 {
56 public:
57     enum class CompletionInvocation { ExtraContext, NormalContext };
58     Completer(EmulatedCommandBar *emulatedCommandBar, KTextEditor::ViewPrivate *view, QLineEdit *edit);
59     void startCompletion(const CompletionStartParams &completionStartParams);
60     void deactivateCompletion();
61     bool isCompletionActive() const;
62     bool isNextTextChangeDueToCompletionChange() const;
63     bool completerHandledKeypress(const QKeyEvent *keyEvent);
64     void editTextChanged(const QString &newText);
65     void setCurrentMode(ActiveMode *currentMode);
66 
67 private:
68     QLineEdit *m_edit;
69     KTextEditor::ViewPrivate *m_view;
70     ActiveMode *m_currentMode = nullptr;
71 
72     void setCompletionIndex(int index);
73     void currentCompletionChanged();
74     void updateCompletionPrefix();
75     CompletionStartParams activateWordFromDocumentCompletion();
76     QString wordBeforeCursor();
77     int wordBeforeCursorBegin();
78     void abortCompletionAndResetToPreCompletion();
79 
80     QCompleter *m_completer;
81     QStringListModel *m_completionModel;
82     QString m_textToRevertToIfCompletionAborted;
83     int m_cursorPosToRevertToIfCompletionAborted = 0;
84     bool m_isNextTextChangeDueToCompletionChange = false;
85     CompletionStartParams m_currentCompletionStartParams;
86     CompletionStartParams::CompletionType m_currentCompletionType = CompletionStartParams::None;
87 };
88 }
89 #endif
90