diff options
Diffstat (limited to 'src/projectbase.h')
-rw-r--r-- | src/projectbase.h | 281 |
1 files changed, 281 insertions, 0 deletions
diff --git a/src/projectbase.h b/src/projectbase.h new file mode 100644 index 0000000..4170652 --- /dev/null +++ b/src/projectbase.h @@ -0,0 +1,281 @@ +/*************************************************************************** + * + * Copyright (C) 2007 Elad Lahav (elad_lahav@users.sourceforge.net) + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ***************************************************************************/ + +#ifndef PROJECTBASE_H +#define PROJECTBASE_H + +#include <qstringlist.h> +#include <qdir.h> +#include <qfile.h> +#include <kconfig.h> + +#define DEF_IS_KERNEL false +#define DEF_INV_INDEX true +#define DEF_NO_COMPRESS false +#define DEF_SLOW_PATH false +#define DEF_AC_MIN_CHARS 3 +#define DEF_AC_DELAY 500 +#define DEF_AC_MAX_ENTRIES 100 +#define DEF_TAB_WIDTH 0 /* Use editor's default */ +#define DEF_CTAGS_COMMAND \ + "--regex-c=\"/^[ \\t]*([_a-zA-Z][_a-zA-Z0-9]*):/\\1/l,label/\" " \ + "--regex-c=\"/^[ \\t]*#[ \\t]*include[ \\t]*[\\\"<]" \ + "([_a-zA-Z0-9\\.\\/]*)[\\\">]/\\1/i,include/\" " \ + "--regex-c++=\"/^[ \\t]*#[ \\t]*include[ \\t]*[\\\"<]" \ + "([_a-zA-Z0-9\\.\\/]*)[\\\">]/\\1/i,include/\"" + +/** + * Abstract base class for classes that need the list of project files. + * Objects of classes derived from this one are used as a parameter to + * ProjectManager::fillList(), which reads all file entries in the project, + * and calls addItem() for each. + * Any class that wishes to retrieve the project's file list, should inherit + * from this class, and implement addItem(). + * @author Elad Lahav + */ + +class FileListTarget +{ +public: + /** + * Class constructor. + */ + FileListTarget() {} + + /** + * Class destructor. + */ + virtual ~FileListTarget() {} + + /** + * Appends a file to the list. + * @param sFilePath The full path of the file to add + */ + virtual void addItem(const QString& sFilePath) = 0; +}; + +/** + * Abstract base class for classes that need the list of project files. + * Objects of classes derived from this one are used as a parameter to + * ProjectManager::writeList(), which calls getFirstItem() and getNextItem(), + * and writes the returned values to the project's 'cscope.files' file. + * Any class that wishes to retrieve the project's file list, should inherit + * from this class, and implement firstItem() and nextItem(). + * @author Elad Lahav + */ + +class FileListSource +{ +public: + /** + * Class constructor. + */ + FileListSource() {} + + /** + * Class destructor. + */ + virtual ~FileListSource() {} + + /** + * Returns the first file in the list, and initiates a new iteration. + * @param sFilePath Holds the path of the first file, upon return + * @return true if there are more files, false otherwise + */ + virtual bool firstItem(QString& sFilePath) = 0; + + /** + * Returns the next file in the list. + * @param sFilePath Holds the path of the file, upon return + * @return true if there are more files, false otherwise + */ + virtual bool nextItem(QString& sFilePath) = 0; +}; + +/** + * Defines a cursor location inside a file. + * This structure is used to store project session information. + * @author Elad Lahav + */ +struct FileLocation +{ + /** + * Struct constructor. + * @param sPath The full path of the file + * @param nLine The line position of the cursor + * @param nCol The column position of the cursor + */ + FileLocation(QString sPath, uint nLine, uint nCol) : m_sPath(sPath), + m_nLine(nLine), m_nCol(nCol) {} + + /** The full path of the file. */ + QString m_sPath; + + /** The line position of the cursor. */ + uint m_nLine; + + /** The column position of the cursor. */ + uint m_nCol; +}; + +/** + * A list of file locations used for restoring a session. + */ +typedef QPtrList<FileLocation> FileLocationList; + +class FileSemaphore; + +/** + * @author Elad Lahav + */ +class ProjectBase +{ +public: + ProjectBase(); + virtual ~ProjectBase(); + + /** + * Configurable project options. + */ + struct Options { + QString sSrcRootPath; + + /** A list of MIME-types that determines which files are included in + the project. */ + QStringList slFileTypes; + + /** true if the -k option for CScope should be used. */ + bool bKernel; + + /** true if Cscope should build an inverted index. */ + bool bInvIndex; + + /** true if the -c option for CScope should be used. */ + bool bNoCompress; + + /** true if the -D option for CScope should be used. */ + bool bSlowPathDef; + + /** The time, in milliseconds, after which the database should be + automatically rebuilt (-1 if this option is disabled). */ + int nAutoRebuildTime; + + /** true to use auto-completion. */ + bool bACEnabled; + + /** Minimum number of characters in a symbol for auto-completion. */ + uint nACMinChars; + + /** Time interval, in milliseconds, before auto-completion is + started. */ + uint nACDelay; + + /** Maximal number of entries for auto-completion. */ + uint nACMaxEntries; + + /** Per-project tab width (overrides editor settings). */ + uint nTabWidth; + + /** Ctags command line. */ + QString sCtagsCmd; + }; + + virtual bool open(const QString&); + virtual bool loadFileList(FileListTarget*); + virtual bool storeFileList(FileListSource*) { return false; } + virtual bool isEmpty() { return false; } + bool dbExists(); + virtual void close() {} + + virtual QString getFileTypes() const { return QString::null; } + virtual void getOptions(Options&) const; + virtual void setOptions(const Options&) {} + virtual void getSymHistory(QStringList&) const {} + virtual void setSymHistory(QStringList&) {} + virtual void getMakeParams(QString&, QString&) const; + + /** + * Determines whether a project is based on a Cscope.out file, and is + * therefore considered as a temporary project. + * @return true if this is a temporary project, false otherwise + */ + virtual bool isTemporary() { return true; } + + /** + * @return The name of the current project + */ + QString getName() const { return m_sName; } + + /** + * @return The full path of the project's directory + */ + QString getPath() const { return m_dir.absPath(); } + + /** + * @return Command-line arguments to pass to a Cscope object, based on + * project's options + */ + uint getArgs() const { return m_nArgs; } + + const QString& getSourceRoot() const { return m_opt.sSrcRootPath; } + + /** + * @return The time, in seconds, to wait before rebuilding the + * cross-refernce database. + */ + int getAutoRebuildTime() const { return m_opt.nAutoRebuildTime; } + + /** + * @return The tab width to use (0 to use the editor's default) + */ + uint getTabWidth() const { return m_opt.nTabWidth; } + + static void getDefOptions(Options&); + +protected: + /** The name of the project, as written in the configuration file */ + QString m_sName; + + /** The directory associated with the project */ + QDir m_dir; + + /** A cached version of the project's options. */ + Options m_opt; + + /** A list of Cscope command-line arguments based on the project's + options. */ + uint m_nArgs; + + /** A list of symbols previously queried. */ + QStringList m_slSymHistory; + + void initOptions(); + + static bool isCscopeOut(const QString&); +}; + +#endif |