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 &currentCompletion) 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 &currentCompletion) 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