summaryrefslogtreecommitdiffstats
path: root/src/projectmanager.cpp
diff options
context:
space:
mode:
authorSlávek Banko <slavek.banko@axis.cz>2013-10-07 23:28:24 +0200
committerSlávek Banko <slavek.banko@axis.cz>2013-10-08 05:14:51 +0200
commit3af5832abe7c802a384cd58d34f7cc4433595ced (patch)
treecc300d6fae4cb5798f0cf5db3ece63026f34379a /src/projectmanager.cpp
downloadkscope-3af5832abe7c802a384cd58d34f7cc4433595ced.tar.gz
kscope-3af5832abe7c802a384cd58d34f7cc4433595ced.zip
Initial import of kscope 1.6.2
Diffstat (limited to 'src/projectmanager.cpp')
-rw-r--r--src/projectmanager.cpp180
1 files changed, 180 insertions, 0 deletions
diff --git a/src/projectmanager.cpp b/src/projectmanager.cpp
new file mode 100644
index 0000000..998b4a5
--- /dev/null
+++ b/src/projectmanager.cpp
@@ -0,0 +1,180 @@
+/***************************************************************************
+ *
+ * Copyright (C) 2005 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.
+ *
+ ***************************************************************************/
+
+#include <kmessagebox.h>
+#include <klocale.h>
+#include "projectmanager.h"
+#include "project.h"
+#include "kscopeconfig.h"
+
+/**
+ * Class constructor.
+ */
+ProjectManager::ProjectManager() : m_pCurProj(NULL)
+{
+}
+
+/**
+ * Class destructor.
+ */
+ProjectManager::~ProjectManager()
+{
+ close();
+}
+
+/**
+ * Creates a project's directory, and associates this directory with the
+ * current object. This directory is created under the given path, and using
+ * the project's name (which, thus, has to be a legal file name).
+ * Note: this function attempts to create a new directory, so the given path
+ * and name must not lead to an existing one.
+ * @param sName The project's name
+ * @param sPath The parent directory under which to create the
+ * project's directory
+ * @param opt A structure containing project options
+ * @return true if successful, false otherwise
+ */
+bool ProjectManager::create(const QString& sName, const QString& sPath,
+ const ProjectBase::Options& opt, QString& sProjDir)
+{
+ QDir dir(sPath);
+ QString sParentPath;
+ QString sDirName = sName;
+ QString sMsg;
+
+ // Handle requests for a hidden .cscope directory
+ if (dir.dirName() == ".cscope") {
+ sParentPath = QDir::cleanDirPath(dir.absPath());
+ sParentPath = sParentPath.section('/', 0, -2);
+ dir.cd(sParentPath);
+ sDirName = ".cscope";
+ }
+
+ // The parent directory must exist
+ if (!dir.exists()) {
+ sMsg = i18n("The requested parent directory (%1) does not exist").
+ arg(sParentPath);
+ KMessageBox::error(0, sMsg);
+ return false;
+ }
+
+ // Make sure the directory doesn't exist
+ if (dir.exists(sDirName)) {
+ sMsg = i18n("Cannot create a project inside an existing directory "
+ "(%1/%2)").arg(dir.canonicalPath()).arg(sDirName);
+ KMessageBox::error(0, sMsg);
+ return false;
+ }
+
+ // Try to create the projcet's directory
+ if (!dir.mkdir(sDirName, false) || !dir.cd(sDirName, false)) {
+ sMsg = i18n("Failed to create the project directory (%1/%2)").
+ arg(dir.canonicalPath()).arg(sDirName);
+ KMessageBox::error(0, sMsg);
+ return false;
+ }
+
+ if (!Project::create(sName, dir.absPath(), opt))
+ return false;
+
+ sProjDir = dir.path();
+ return true;
+}
+
+/**
+ * Opens a project and makes it the current one.
+ * @param sPath The directory containing the project's files
+ * @return true if successful, false otherwise
+ */
+bool ProjectManager::open(const QString& sPath)
+{
+ Project* pProj;
+
+ // Close the current project
+ close();
+
+ // Try to open the new project
+ pProj = new Project();
+ if (!pProj->open(sPath)) {
+ delete pProj;
+ return false;
+ }
+
+ // Add to the list of recently opened projects
+ Config().addRecentProject(sPath);
+
+ // Project opened successfully
+ m_pCurProj = pProj;
+ return true;
+}
+
+/**
+ * Opens a Cscope.out file as a temporary project.
+ * @param sFilePath The full path of the Cscope.out file
+ * @return true if successful, false otherwise
+ */
+bool ProjectManager::openCscopeOut(const QString& sFilePath)
+{
+ ProjectBase* pProj;
+
+ // Close the current project
+ close();
+
+ // Try to open the new project
+ pProj = new ProjectBase();
+ if (!pProj->open(sFilePath)) {
+ delete pProj;
+ return false;
+ }
+
+ // Add to the list of recently opened projects
+ Config().addRecentProject(sFilePath);
+
+ // Project opened successfully
+ m_pCurProj = pProj;
+ return true;
+}
+
+/**
+ * Performs clean-up on the project's variables, and detaches the associated
+ * directory.
+ */
+void ProjectManager::close()
+{
+ if (m_pCurProj) {
+ delete m_pCurProj;
+ m_pCurProj = NULL;
+ }
+}
+
+QString ProjectManager::getProjName() const
+{
+ if (!m_pCurProj)
+ return i18n("No Project");
+
+ return m_pCurProj->getName();
+}