File indexing completed on 2024-05-05 03:58:35

0001 /*
0002     SPDX-FileCopyrightText: 2013-2016 Simon St James <kdedevel@etotheipiplusone.com>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-or-later
0005 */
0006 
0007 #ifndef KATEVI_EMULATED_COMMAND_BAR_COMPLETER_H
0008 #define KATEVI_EMULATED_COMMAND_BAR_COMPLETER_H
0009 
0010 #include <functional>
0011 
0012 #include <QStringList>
0013 
0014 namespace KTextEditor
0015 {
0016 class ViewPrivate;
0017 }
0018 
0019 class QLineEdit;
0020 class QCompleter;
0021 class QStringListModel;
0022 class QKeyEvent;
0023 
0024 namespace KateVi
0025 {
0026 class ActiveMode;
0027 class EmulatedCommandBar;
0028 
0029 struct CompletionStartParams {
0030     static CompletionStartParams createModeSpecific(const QStringList &completions,
0031                                                     int wordStartPos,
0032                                                     std::function<QString(const QString &)> completionTransform = std::function<QString(const QString &)>())
0033     {
0034         CompletionStartParams completionStartParams;
0035         completionStartParams.completionType = ModeSpecific;
0036         completionStartParams.completions = completions;
0037         completionStartParams.wordStartPos = wordStartPos;
0038         completionStartParams.completionTransform = completionTransform;
0039         return completionStartParams;
0040     }
0041     static CompletionStartParams invalid()
0042     {
0043         CompletionStartParams completionStartParams;
0044         completionStartParams.completionType = None;
0045         return completionStartParams;
0046     }
0047     enum CompletionType { None, ModeSpecific, WordFromDocument };
0048     CompletionType completionType = None;
0049     int wordStartPos = -1;
0050     QStringList completions;
0051     std::function<QString(const QString &)> completionTransform;
0052 };
0053 
0054 class Completer
0055 {
0056 public:
0057     enum class CompletionInvocation { ExtraContext, NormalContext };
0058     Completer(EmulatedCommandBar *emulatedCommandBar, KTextEditor::ViewPrivate *view, QLineEdit *edit);
0059     void startCompletion(const CompletionStartParams &completionStartParams);
0060     void deactivateCompletion();
0061     bool isCompletionActive() const;
0062     bool isNextTextChangeDueToCompletionChange() const;
0063     bool completerHandledKeypress(const QKeyEvent *keyEvent);
0064     void editTextChanged(const QString &newText);
0065     void setCurrentMode(ActiveMode *currentMode);
0066 
0067 private:
0068     QLineEdit *m_edit;
0069     KTextEditor::ViewPrivate *m_view;
0070     ActiveMode *m_currentMode = nullptr;
0071 
0072     void setCompletionIndex(int index);
0073     void currentCompletionChanged();
0074     void updateCompletionPrefix();
0075     CompletionStartParams activateWordFromDocumentCompletion();
0076     QString wordBeforeCursor();
0077     int wordBeforeCursorBegin();
0078     void abortCompletionAndResetToPreCompletion();
0079 
0080     QCompleter *m_completer;
0081     QStringListModel *m_completionModel;
0082     QString m_textToRevertToIfCompletionAborted;
0083     int m_cursorPosToRevertToIfCompletionAborted = 0;
0084     bool m_isNextTextChangeDueToCompletionChange = false;
0085     CompletionStartParams m_currentCompletionStartParams;
0086     CompletionStartParams::CompletionType m_currentCompletionType = CompletionStartParams::None;
0087 };
0088 }
0089 #endif