123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214 |
- // This module defines interface to the QsciAPIs class.
- //
- // Copyright (c) 2017 Riverbank Computing Limited <info@riverbankcomputing.com>
- //
- // This file is part of QScintilla.
- //
- // This file may be used under the terms of the GNU General Public License
- // version 3.0 as published by the Free Software Foundation and appearing in
- // the file LICENSE included in the packaging of this file. Please review the
- // following information to ensure the GNU General Public License version 3.0
- // requirements will be met: http://www.gnu.org/copyleft/gpl.html.
- //
- // If you do not wish to use this file under the terms of the GPL version 3.0
- // then you may purchase a commercial license. For more information contact
- // info@riverbankcomputing.com.
- //
- // This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
- // WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
- #ifndef QSCIAPIS_H
- #define QSCIAPIS_H
- #include <QList>
- #include <QObject>
- #include <QPair>
- #include <QStringList>
- #include <Qsci/qsciabstractapis.h>
- #include <Qsci/qsciglobal.h>
- #include <Qsci/qsciscintilla.h>
- class QsciAPIsPrepared;
- class QsciAPIsWorker;
- class QsciLexer;
- //! \brief The QsciAPIs class provies an implementation of the textual API
- //! information used in call tips and for auto-completion.
- //!
- //! Raw API information is read from one or more files. Each API function is
- //! described by a single line of text comprising the function's name, followed
- //! by the function's optional comma separated parameters enclosed in
- //! parenthesis, and finally followed by optional explanatory text.
- //!
- //! A function name may be followed by a `?' and a number. The number is used
- //! by auto-completion to display a registered QPixmap with the function name.
- //!
- //! All function names are used by auto-completion, but only those that include
- //! function parameters are used in call tips.
- //!
- //! QScintilla only deals with prepared API information and not the raw
- //! information described above. This is done so that large APIs can be
- //! handled while still being responsive to user input. The conversion of raw
- //! information to prepared information is time consuming (think tens of
- //! seconds) and implemented in a separate thread. Prepared information can
- //! be quickly saved to and loaded from files. Such files are portable between
- //! different architectures.
- //!
- //! QScintilla based applications that want to support large APIs would
- //! normally provide the user with the ability to specify a set of, possibly
- //! project specific, raw API files and convert them to prepared files that are
- //! loaded quickly when the application is invoked.
- class QSCINTILLA_EXPORT QsciAPIs : public QsciAbstractAPIs
- {
- Q_OBJECT
- public:
- //! Constructs a QsciAPIs instance attached to lexer \a lexer. \a lexer
- //! becomes the instance's parent object although the instance can also be
- //! subsequently attached to other lexers.
- QsciAPIs(QsciLexer *lexer);
- //! Destroy the QsciAPIs instance.
- virtual ~QsciAPIs();
- //! Add the single raw API entry \a entry to the current set.
- //!
- //! \sa clear(), load(), remove()
- void add(const QString &entry);
- //! Deletes all raw API information.
- //!
- //! \sa add(), load(), remove()
- void clear();
- //! Load the API information from the file named \a filename, adding it to
- //! the current set. Returns true if successful, otherwise false.
- bool load(const QString &filename);
- //! Remove the single raw API entry \a entry from the current set.
- //!
- //! \sa add(), clear(), load()
- void remove(const QString &entry);
- //! Convert the current raw API information to prepared API information.
- //! This is implemented by a separate thread.
- //!
- //! \sa cancelPreparation()
- void prepare();
- //! Cancel the conversion of the current raw API information to prepared
- //! API information.
- //!
- //! \sa prepare()
- void cancelPreparation();
- //! Return the default name of the prepared API information file. It is
- //! based on the name of the associated lexer and in the directory defined
- //! by the QSCIDIR environment variable. If the environment variable isn't
- //! set then $HOME/.qsci is used.
- QString defaultPreparedName() const;
- //! Check to see is a prepared API information file named \a filename
- //! exists. If \a filename is empty then the value returned by
- //! defaultPreparedName() is used. Returns true if successful, otherwise
- //! false.
- //!
- //! \sa defaultPreparedName()
- bool isPrepared(const QString &filename = QString()) const;
- //! Load the prepared API information from the file named \a filename. If
- //! \a filename is empty then a name is constructed based on the name of
- //! the associated lexer and saved in the directory defined by the QSCIDIR
- //! environment variable. If the environment variable isn't set then
- //! $HOME/.qsci is used. Returns true if successful, otherwise false.
- bool loadPrepared(const QString &filename = QString());
- //! Save the prepared API information to the file named \a filename. If
- //! \a filename is empty then a name is constructed based on the name of
- //! the associated lexer and saved in the directory defined by the QSCIDIR
- //! environment variable. If the environment variable isn't set then
- //! $HOME/.qsci is used. Returns true if successful, otherwise false.
- bool savePrepared(const QString &filename = QString()) const;
- //! \reimp
- virtual void updateAutoCompletionList(const QStringList &context,
- QStringList &list);
- //! \reimp
- virtual void autoCompletionSelected(const QString &sel);
- //! \reimp
- virtual QStringList callTips(const QStringList &context, int commas,
- QsciScintilla::CallTipsStyle style, QList<int> &shifts);
- //! \internal Reimplemented to receive termination events from the worker
- //! thread.
- virtual bool event(QEvent *e);
- //! Return a list of the installed raw API file names for the associated
- //! lexer.
- QStringList installedAPIFiles() const;
- signals:
- //! This signal is emitted when the conversion of raw API information to
- //! prepared API information has been cancelled.
- //!
- //! \sa apiPreparationFinished(), apiPreparationStarted()
- void apiPreparationCancelled();
- //! This signal is emitted when the conversion of raw API information to
- //! prepared API information starts and can be used to give some visual
- //! feedback to the user.
- //!
- //! \sa apiPreparationCancelled(), apiPreparationFinished()
- void apiPreparationStarted();
-
- //! This signal is emitted when the conversion of raw API information to
- //! prepared API information has finished.
- //!
- //! \sa apiPreparationCancelled(), apiPreparationStarted()
- void apiPreparationFinished();
- private:
- friend class QsciAPIsPrepared;
- friend class QsciAPIsWorker;
- // This indexes a word in a set of raw APIs. The first part indexes the
- // entry in the set, the second part indexes the word within the entry.
- typedef QPair<quint32, quint32> WordIndex;
- // This is a list of word indexes.
- typedef QList<WordIndex> WordIndexList;
- QsciAPIsWorker *worker;
- QStringList old_context;
- QStringList::const_iterator origin;
- int origin_len;
- QString unambiguous_context;
- QStringList apis;
- QsciAPIsPrepared *prep;
- static bool enoughCommas(const QString &s, int commas);
- QStringList positionOrigin(const QStringList &context, QString &path);
- bool originStartsWith(const QString &path, const QString &wsep);
- const WordIndexList *wordIndexOf(const QString &word) const;
- void lastCompleteWord(const QString &word, QStringList &with_context,
- bool &unambig);
- void lastPartialWord(const QString &word, QStringList &with_context,
- bool &unambig);
- void addAPIEntries(const WordIndexList &wl, bool complete,
- QStringList &with_context, bool &unambig);
- QString prepName(const QString &filename, bool mkpath = false) const;
- void deleteWorker();
- QsciAPIs(const QsciAPIs &);
- QsciAPIs &operator=(const QsciAPIs &);
- };
- #endif
|