You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
kscope/src/projectbase.h

282 lines
7.8 KiB

/***************************************************************************
*
* 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