File indexing completed on 2024-04-14 15:17:27
0001 /************************************************************************************************ 0002 Copyright (C) 2004-2007 by Holger Danielsson (holger.danielsson@versanet.de) 0003 2008-2014 by Michel Ludwig (michel.ludwig@kdemail.net) 0004 ************************************************************************************************/ 0005 0006 /*************************************************************************** 0007 * * 0008 * This program is free software; you can redistribute it and/or modify * 0009 * it under the terms of the GNU General Public License as published by * 0010 * the Free Software Foundation; either version 2 of the License, or * 0011 * (at your option) any later version. * 0012 * * 0013 ***************************************************************************/ 0014 0015 #ifndef CODECOMPLETION_H 0016 #define CODECOMPLETION_H 0017 0018 #include <QObject> 0019 #include <QList> 0020 0021 #include <KTextEditor/CodeCompletionInterface> 0022 #include <KTextEditor/CodeCompletionModel> 0023 #include <KTextEditor/CodeCompletionModelControllerInterface> 0024 #include <KTextEditor/Document> 0025 #include <KTextEditor/View> 0026 #include <kconfig.h> 0027 0028 #include "latexcmd.h" 0029 #include "widgets/abbreviationview.h" 0030 0031 //default bullet char (a cross) 0032 static const QChar s_bullet_char = QChar(0xd7); 0033 static const QString s_bullet = QString(&s_bullet_char, 1); 0034 0035 class QTimer; 0036 0037 class KileInfo; 0038 0039 namespace KileDocument { 0040 class EditorExtension; 0041 } 0042 0043 namespace KileCodeCompletion 0044 { 0045 class Manager; 0046 0047 class LaTeXCompletionModel : public KTextEditor::CodeCompletionModel, 0048 public KTextEditor::CodeCompletionModelControllerInterface { 0049 Q_OBJECT 0050 Q_INTERFACES(KTextEditor::CodeCompletionModelControllerInterface) 0051 0052 public: 0053 LaTeXCompletionModel(QObject *parent, KileCodeCompletion::Manager *manager, 0054 KileDocument::EditorExtension *editorExtension); 0055 virtual ~LaTeXCompletionModel(); 0056 virtual QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const Q_DECL_OVERRIDE; 0057 virtual QVariant data(const QModelIndex& index, int role) const Q_DECL_OVERRIDE; 0058 virtual int rowCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE; 0059 0060 virtual bool shouldStartCompletion(KTextEditor::View *view, const QString &insertedText, 0061 bool userInsertion, const KTextEditor::Cursor &position) Q_DECL_OVERRIDE; 0062 virtual bool shouldAbortCompletion(KTextEditor::View *view, const KTextEditor::Range &range, 0063 const QString ¤tCompletion) Q_DECL_OVERRIDE; 0064 virtual void completionInvoked(KTextEditor::View *view, const KTextEditor::Range &range, 0065 InvocationType invocationType) Q_DECL_OVERRIDE; 0066 virtual KTextEditor::Range updateCompletionRange(KTextEditor::View *view, 0067 const KTextEditor::Range& range) Q_DECL_OVERRIDE; 0068 virtual KTextEditor::Range completionRange(KTextEditor::View *view, 0069 const KTextEditor::Cursor &position) Q_DECL_OVERRIDE; 0070 virtual QString filterString(KTextEditor::View *view, 0071 const KTextEditor::Range &range, 0072 const KTextEditor::Cursor &position) Q_DECL_OVERRIDE; 0073 0074 virtual void executeCompletionItem(KTextEditor::View *view, const KTextEditor::Range& word, 0075 const QModelIndex &index) const Q_DECL_OVERRIDE; 0076 QString filterLatexCommand(const QString &text, int &cursorYPos, int &cursorXPos); 0077 0078 0079 protected: 0080 KileCodeCompletion::Manager *m_codeCompletionManager; 0081 KileDocument::EditorExtension *m_editorExtension; 0082 QStringList m_completionList; 0083 KTextEditor::View *m_currentView; 0084 0085 void buildModel(KTextEditor::View *view, const KTextEditor::Range &r); 0086 void filterModel(const QString& text); 0087 0088 QString stripParameters(const QString &text) const; 0089 QString buildRegularCompletedText(const QString &text, int &cursorYPos, int &cursorXPos, 0090 bool checkGroup) const; 0091 QString buildEnvironmentCompletedText(const QString &text, const QString &prefix, 0092 int &ypos, int &xpos) const; 0093 QString buildWhiteSpaceString(const QString &s) const; 0094 KTextEditor::Cursor determineLaTeXCommandStart(KTextEditor::Document *doc, 0095 const KTextEditor::Cursor& position) const; 0096 bool isWithinLaTeXCommand(KTextEditor::Document *doc, const KTextEditor::Cursor& commandStart, 0097 const KTextEditor::Cursor& cursorPosition) const; 0098 }; 0099 0100 class AbbreviationCompletionModel : public KTextEditor::CodeCompletionModel, public KTextEditor::CodeCompletionModelControllerInterface { 0101 Q_OBJECT 0102 Q_INTERFACES(KTextEditor::CodeCompletionModelControllerInterface) 0103 0104 public: 0105 AbbreviationCompletionModel(QObject *parent, KileAbbreviation::Manager *manager); 0106 virtual ~AbbreviationCompletionModel(); 0107 0108 virtual QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const Q_DECL_OVERRIDE; 0109 virtual QVariant data(const QModelIndex& index, int role) const Q_DECL_OVERRIDE; 0110 virtual int rowCount(const QModelIndex &parent = QModelIndex()) const Q_DECL_OVERRIDE; 0111 0112 virtual bool shouldStartCompletion(KTextEditor::View *view, const QString &insertedText, 0113 bool userInsertion, const KTextEditor::Cursor &position) Q_DECL_OVERRIDE; 0114 virtual bool shouldAbortCompletion(KTextEditor::View *view, const KTextEditor::Range &range, 0115 const QString ¤tCompletion) Q_DECL_OVERRIDE; 0116 virtual void completionInvoked(KTextEditor::View *view, const KTextEditor::Range &range, 0117 InvocationType invocationType) Q_DECL_OVERRIDE; 0118 virtual KTextEditor::Range updateCompletionRange(KTextEditor::View *view, 0119 const KTextEditor::Range& range) Q_DECL_OVERRIDE; 0120 virtual KTextEditor::Range completionRange(KTextEditor::View *view, 0121 const KTextEditor::Cursor &position) Q_DECL_OVERRIDE; 0122 virtual QString filterString(KTextEditor::View *view, 0123 const KTextEditor::Range &range, 0124 const KTextEditor::Cursor &position) Q_DECL_OVERRIDE; 0125 0126 virtual void executeCompletionItem(KTextEditor::View *view, const KTextEditor::Range& word, 0127 const QModelIndex &index) const Q_DECL_OVERRIDE; 0128 0129 protected: 0130 KileAbbreviation::Manager *m_abbreviationManager; 0131 QStringList m_completionList; 0132 KTextEditor::View *m_currentView; 0133 0134 /** 0135 * 'singleMatchMode' should be set to true for manual invocations of this completion model; 0136 * it triggers an immediate substitution of a matching abbreviation even if there is a longer 0137 * abbreviation match, e.g. for two abbreviations 'a' -> 'x1' and 'ab' -> 'x2', 'singleMatchMode' 0138 * will immediately replace 'a' with 'x1' if 'a' has been entered by the user. 0139 **/ 0140 void buildModel(KTextEditor::View *view, const KTextEditor::Range &r, bool singleMatchMode = false); 0141 }; 0142 0143 class Manager : public QObject { 0144 Q_OBJECT 0145 friend class LaTeXCompletionModel; 0146 0147 public: 0148 Manager(KileInfo *info, QObject *parent); 0149 virtual ~Manager(); 0150 0151 QStringList getLaTeXCommands() const; 0152 QStringList getLocallyDefinedLaTeXCommands(KTextEditor::View *view) const; 0153 0154 void readConfig(KConfig *config); 0155 0156 QStringList readCWLFile(const QString &filename, bool fullPathGiven = false); 0157 QStringList readCWLFiles(const QStringList &files, const QString &dir); 0158 QString validCwlFile(const QString &filename); 0159 0160 /** 0161 * A map from file names to paths is returned. 0162 */ 0163 static QMap<QString, QString> getAllCwlFiles(const QString &localCwlPath, const QString &globalCwlPath); 0164 /** 0165 * Returns a pair (local CWL base dir, global CWL base dir). 0166 */ 0167 static QPair<QString, QString> getCwlBaseDirs(); 0168 0169 public Q_SLOTS: 0170 void startLaTeXCompletion(KTextEditor::View *view = Q_NULLPTR); 0171 void startLaTeXEnvironment(KTextEditor::View *view = Q_NULLPTR); 0172 void startAbbreviationCompletion(KTextEditor::View *view = Q_NULLPTR); 0173 0174 void textInserted(KTextEditor::View* view, const KTextEditor::Cursor& position, const QString & text); 0175 0176 protected: 0177 KileInfo* m_ki; 0178 QStringList m_texWordList, m_dictWordList, m_abbrevWordList; 0179 bool m_firstConfig; 0180 QRegExp m_referencesRegExp; 0181 QRegExp m_referencesExtRegExp; 0182 QRegExp m_citeRegExp; 0183 QRegExp m_citeExtRegExp; 0184 0185 void addUserDefinedLaTeXCommands(QStringList &wordlist); 0186 void buildReferenceCitationRegularExpressions(); 0187 QString getCommandsString(KileDocument::CmdAttribute attrtype); 0188 }; 0189 0190 } 0191 #endif