diff --git a/gui/gui.pro b/gui/gui.pro index 496925686..e4ffcb24b 100644 --- a/gui/gui.pro +++ b/gui/gui.pro @@ -91,7 +91,6 @@ HEADERS += aboutdialog.h \ mainwindow.h \ platforms.h \ printablereport.h \ - project.h \ projectfile.h \ projectfiledialog.h \ report.h \ @@ -128,7 +127,6 @@ SOURCES += aboutdialog.cpp \ mainwindow.cpp\ platforms.cpp \ printablereport.cpp \ - project.cpp \ projectfile.cpp \ projectfiledialog.cpp \ report.cpp \ diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 990630c01..7a3593d6c 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -35,7 +35,7 @@ #include "threadhandler.h" #include "fileviewdialog.h" #include "projectfile.h" -#include "project.h" +#include "projectfiledialog.h" #include "report.h" #include "scratchpad.h" #include "statsdialog.h" @@ -56,7 +56,7 @@ MainWindow::MainWindow(TranslationHandler* th, QSettings* settings) : mTranslation(th), mLogView(NULL), mScratchPad(NULL), - mProject(NULL), + mProjectFile(NULL), mPlatformActions(new QActionGroup(this)), mCStandardActions(new QActionGroup(this)), mCppStandardActions(new QActionGroup(this)), @@ -139,8 +139,8 @@ MainWindow::MainWindow(TranslationHandler* th, QSettings* settings) : loadSettings(); mThread->initialize(mUI.mResults); - if (mProject) - formatAndSetTitle(tr("Project:") + ' ' + mProject->getFilename()); + if (mProjectFile) + formatAndSetTitle(tr("Project:") + ' ' + mProjectFile->getFilename()); else formatAndSetTitle(); @@ -173,8 +173,8 @@ MainWindow::MainWindow(TranslationHandler* th, QSettings* settings) : handleCLIParams(args); } - mUI.mActionCloseProjectFile->setEnabled(mProject != nullptr); - mUI.mActionEditProjectFile->setEnabled(mProject != nullptr); + mUI.mActionCloseProjectFile->setEnabled(mProjectFile != nullptr); + mUI.mActionEditProjectFile->setEnabled(mProjectFile != nullptr); for (int i = 0; i < mPlatforms.getCount(); i++) { Platform plat = mPlatforms.mPlatforms[i]; @@ -215,7 +215,7 @@ MainWindow::MainWindow(TranslationHandler* th, QSettings* settings) : MainWindow::~MainWindow() { delete mLogView; - delete mProject; + delete mProjectFile; delete mScratchPad; } @@ -321,7 +321,8 @@ void MainWindow::loadSettings() QFileInfo inf(projectFile); if (inf.exists() && inf.isReadable()) { setPath(SETTINGS_LAST_PROJECT_PATH, projectFile); - mProject = new Project(projectFile, this); + mProjectFile = new ProjectFile(this); + mProjectFile->read(projectFile); loadLastResults(); } } @@ -365,7 +366,7 @@ void MainWindow::saveSettings() const mSettings->setValue(SETTINGS_LANGUAGE, mTranslation->getCurrentLanguage()); - mSettings->setValue(SETTINGS_OPEN_PROJECT, mProject ? mProject->getFilename() : QString()); + mSettings->setValue(SETTINGS_OPEN_PROJECT, mProjectFile ? mProjectFile->getFilename() : QString()); mUI.mResults->saveSettings(mSettings); } @@ -375,10 +376,10 @@ void MainWindow::doAnalyzeProject(ImportProject p) clearResults(); mIsLogfileLoaded = false; - if (mProject) { + if (mProjectFile) { std::vector v; - foreach (const QString &s, mProject->getProjectFile()->getExcludedPaths()) { - v.push_back(s.toStdString()); + foreach (const QString &i, mProjectFile->getExcludedPaths()) { + v.push_back(i.toStdString()); } p.ignorePaths(v); } else { @@ -400,8 +401,8 @@ void MainWindow::doAnalyzeProject(ImportProject p) Settings checkSettings = getCppcheckSettings(); checkSettings.force = false; - if (mProject) - qDebug() << "Checking project file" << mProject->getProjectFile()->getFilename(); + if (mProjectFile) + qDebug() << "Checking project file" << mProjectFile->getFilename(); if (!checkSettings.buildDir.empty()) { std::list sourcefiles; @@ -423,8 +424,8 @@ void MainWindow::doAnalyzeFiles(const QStringList &files) mIsLogfileLoaded = false; FileList pathList; pathList.addPathList(files); - if (mProject) { - pathList.addExcludeList(mProject->getProjectFile()->getExcludedPaths()); + if (mProjectFile) { + pathList.addExcludeList(mProjectFile->getExcludedPaths()); } else { enableProjectActions(false); } @@ -455,8 +456,8 @@ void MainWindow::doAnalyzeFiles(const QStringList &files) mUI.mResults->setCheckDirectory(checkPath); Settings checkSettings = getCppcheckSettings(); - if (mProject) - qDebug() << "Checking project file" << mProject->getProjectFile()->getFilename(); + if (mProjectFile) + qDebug() << "Checking project file" << mProjectFile->getFilename(); if (!checkSettings.buildDir.empty()) { std::list sourcefiles; @@ -497,7 +498,7 @@ void MainWindow::analyzeCode(const QString& code, const QString& filename) QStringList MainWindow::selectFilesToAnalyze(QFileDialog::FileMode mode) { - if (mProject) { + if (mProjectFile) { QMessageBox msgBox(this); msgBox.setWindowTitle(tr("Cppcheck")); const QString msg(tr("You must close the project file before selecting new files or directories!")); @@ -656,8 +657,8 @@ Library::Error MainWindow::loadLibrary(Library *library, QString filename) Library::Error ret; // Try to load the library from the project folder.. - if (mProject) { - QString path = QFileInfo(mProject->getProjectFile()->getFilename()).canonicalPath(); + if (mProjectFile) { + QString path = QFileInfo(mProjectFile->getFilename()).canonicalPath(); ret = library->load(NULL, (path+"/"+filename).toLatin1()); if (ret.errorcode != Library::ErrorCode::FILE_NOT_FOUND) return ret; @@ -755,25 +756,24 @@ Settings MainWindow::getCppcheckSettings() Settings result; // If project file loaded, read settings from it - if (mProject) { - ProjectFile *pfile = mProject->getProjectFile(); - QStringList dirs = pfile->getIncludeDirs(); + if (mProjectFile) { + QStringList dirs = mProjectFile->getIncludeDirs(); addIncludeDirs(dirs, result); - const QStringList defines = pfile->getDefines(); + const QStringList defines = mProjectFile->getDefines(); foreach (QString define, defines) { if (!result.userDefines.empty()) result.userDefines += ";"; result.userDefines += define.toStdString(); } - const QStringList libraries = pfile->getLibraries(); + const QStringList libraries = mProjectFile->getLibraries(); foreach (QString library, libraries) { const QString filename = library + ".cfg"; tryLoadLibrary(&result.library, filename); } - const QStringList suppressions = pfile->getSuppressions(); + const QStringList suppressions = mProjectFile->getSuppressions(); foreach (QString suppression, suppressions) { result.nomsg.addSuppressionLine(suppression.toStdString()); } @@ -782,9 +782,9 @@ Settings MainWindow::getCppcheckSettings() if (!defines.isEmpty()) result.maxConfigs = 1; - QString buildDir = pfile->getBuildDir(); + const QString &buildDir = mProjectFile->getBuildDir(); if (!buildDir.isEmpty()) { - QString prjpath = QFileInfo(pfile->getFilename()).absolutePath(); + QString prjpath = QFileInfo(mProjectFile->getFilename()).absolutePath(); result.buildDir = (prjpath + '/' + buildDir).toStdString(); } } @@ -852,7 +852,7 @@ void MainWindow::analysisDone() enableCheckButtons(true); mUI.mActionSettings->setEnabled(true); mUI.mActionOpenXML->setEnabled(true); - if (mProject) { + if (mProjectFile) { enableProjectActions(true); } else if (mIsLogfileLoaded) { mUI.mActionReanalyzeModified->setEnabled(false); @@ -867,9 +867,9 @@ void MainWindow::analysisDone() if (mScratchPad) mScratchPad->setEnabled(true); - if (mProject && !mProject->getProjectFile()->getBuildDir().isEmpty()) { - const QString prjpath = QFileInfo(mProject->getProjectFile()->getFilename()).absolutePath(); - const QString buildDir = prjpath + '/' + mProject->getProjectFile()->getBuildDir(); + if (mProjectFile && !mProjectFile->getBuildDir().isEmpty()) { + const QString prjpath = QFileInfo(mProjectFile->getFilename()).absolutePath(); + const QString buildDir = prjpath + '/' + mProjectFile->getBuildDir(); if (QDir(buildDir).exists()) { mUI.mResults->saveStatistics(buildDir + "/statistics.txt"); mUI.mResults->save(buildDir + "/lastResults.xml", Report::XMLV2); @@ -938,8 +938,8 @@ void MainWindow::reAnalyzeModified() void MainWindow::reAnalyzeAll() { - if (mProject) - analyzeProject(mProject); + if (mProjectFile) + analyzeProject(mProjectFile); else reAnalyze(true); } @@ -959,8 +959,8 @@ void MainWindow::reAnalyzeSelected(QStringList files, bool all) mCurrentDirectory = mUI.mResults->getCheckDirectory(); FileList pathList; pathList.addPathList(files); - if (mProject) - pathList.addExcludeList(mProject->getProjectFile()->getExcludedPaths()); + if (mProjectFile) + pathList.addExcludeList(mProjectFile->getExcludedPaths()); QStringList fileNames = pathList.getFileList(); checkLockDownUI(); // lock UI while checking mUI.mResults->checkingStarted(fileNames.size()); @@ -990,8 +990,8 @@ void MainWindow::reAnalyze(bool all) checkLockDownUI(); // lock UI while checking mUI.mResults->checkingStarted(files.size()); - if (mProject) - qDebug() << "Rechecking project file" << mProject->getProjectFile()->getFilename(); + if (mProjectFile) + qDebug() << "Rechecking project file" << mProjectFile->getFilename(); mThread->setCheckFiles(all); mThread->check(getCppcheckSettings(), all); @@ -1041,7 +1041,7 @@ void MainWindow::openResults() void MainWindow::loadResults(const QString selectedFile) { if (!selectedFile.isEmpty()) { - if (mProject) + if (mProjectFile) closeProjectFile(); mIsLogfileLoaded = true; mUI.mResults->clear(true); @@ -1063,7 +1063,7 @@ void MainWindow::enableCheckButtons(bool enable) mUI.mActionStop->setEnabled(!enable); mUI.mActionAnalyzeFiles->setEnabled(enable); - if (mProject) { + if (mProjectFile) { mUI.mActionReanalyzeModified->setEnabled(false); mUI.mActionReanalyzeAll->setEnabled(enable); } else if (!enable || mThread->hasPreviousFiles()) { @@ -1329,21 +1329,19 @@ void MainWindow::loadProjectFile(const QString &filePath) mIsLogfileLoaded = false; mUI.mActionCloseProjectFile->setEnabled(true); mUI.mActionEditProjectFile->setEnabled(true); - delete mProject; - mProject = new Project(filePath, this); + delete mProjectFile; + mProjectFile = new ProjectFile(filePath, this); if (!loadLastResults()) - analyzeProject(mProject); + analyzeProject(mProjectFile); } bool MainWindow::loadLastResults() { - if (!mProject) + if (!mProjectFile) return false; - if (!mProject->isOpen() && !mProject->open()) + if (mProjectFile->getBuildDir().isEmpty()) return false; - if (mProject->getProjectFile()->getBuildDir().isEmpty()) - return false; - const QString buildDir = QFileInfo(mProject->getFilename()).absolutePath() + '/' + mProject->getProjectFile()->getBuildDir(); + const QString buildDir = QFileInfo(mProjectFile->getFilename()).absolutePath() + '/' + mProjectFile->getBuildDir(); const QString lastResults = buildDir + "/lastResults.xml"; if (!QFileInfo(lastResults).exists()) return false; @@ -1351,18 +1349,10 @@ bool MainWindow::loadLastResults() return true; } -void MainWindow::analyzeProject(Project *project) +void MainWindow::analyzeProject(const ProjectFile *projectFile) { - if (!project->isOpen()) { - if (!project->open()) { - delete mProject; - mProject = 0; - return; - } - } - - QFileInfo inf(project->getFilename()); - const QString rootpath = project->getProjectFile()->getRootPath(); + QFileInfo inf(projectFile->getFilename()); + const QString rootpath = projectFile->getRootPath(); // If the root path is not given or is not "current dir", use project // file's location directory as root path @@ -1373,8 +1363,8 @@ void MainWindow::analyzeProject(Project *project) else mCurrentDirectory = rootpath; - if (!project->getProjectFile()->getBuildDir().isEmpty()) { - QString buildDir = project->getProjectFile()->getBuildDir(); + if (!projectFile->getBuildDir().isEmpty()) { + QString buildDir = projectFile->getBuildDir(); if (!QDir::isAbsolutePath(buildDir)) buildDir = mCurrentDirectory + '/' + buildDir; if (!QDir(buildDir).exists()) { @@ -1389,15 +1379,15 @@ void MainWindow::analyzeProject(Project *project) } } - if (!project->getProjectFile()->getImportProject().isEmpty()) { + if (!projectFile->getImportProject().isEmpty()) { ImportProject p; - QString prjfile = inf.canonicalPath() + '/' + project->getProjectFile()->getImportProject(); + QString prjfile = inf.canonicalPath() + '/' + projectFile->getImportProject(); p.import(prjfile.toStdString()); doAnalyzeProject(p); return; } - QStringList paths = project->getProjectFile()->getCheckPaths(); + QStringList paths = projectFile->getCheckPaths(); // If paths not given then check the root path (which may be the project // file's location, see above). This is to keep the compatibility with @@ -1431,24 +1421,29 @@ void MainWindow::newProjectFile() setPath(SETTINGS_LAST_PROJECT_PATH, filepath); - enableProjectActions(true); QFileInfo inf(filepath); const QString filename = inf.fileName(); formatAndSetTitle(tr("Project:") + QString(" ") + filename); - delete mProject; - mProject = new Project(filepath, this); - mProject->create(); - if (mProject->edit()) { + delete mProjectFile; + mProjectFile = new ProjectFile(this); + + ProjectFileDialog dlg(filepath, this); + dlg.loadFromProjectFile(mProjectFile); + if (dlg.exec() == QDialog::Accepted) { + dlg.saveToProjectFile(mProjectFile); + mProjectFile->write(); addProjectMRU(filepath); - analyzeProject(mProject); + analyzeProject(mProjectFile); + } else { + closeProjectFile(); } } void MainWindow::closeProjectFile() { - delete mProject; - mProject = NULL; + delete mProjectFile; + mProjectFile = NULL; enableProjectActions(false); enableProjectOpenActions(true); formatAndSetTitle(); @@ -1456,7 +1451,7 @@ void MainWindow::closeProjectFile() void MainWindow::editProjectFile() { - if (!mProject) { + if (!mProjectFile) { QMessageBox msg(QMessageBox::Critical, tr("Cppcheck"), QString(tr("No project file loaded")), @@ -1465,8 +1460,14 @@ void MainWindow::editProjectFile() msg.exec(); return; } - if (mProject->edit()) - analyzeProject(mProject); + + ProjectFileDialog dlg(mProjectFile->getFilename(), this); + dlg.loadFromProjectFile(mProjectFile); + if (dlg.exec() == QDialog::Accepted) { + dlg.saveToProjectFile(mProjectFile); + mProjectFile->write(); + analyzeProject(mProjectFile); + } } void MainWindow::showLogView() @@ -1484,9 +1485,7 @@ void MainWindow::showStatistics() StatsDialog statsDialog(this); // Show a dialog with the previous scan statistics and project information - if (mProject) { - statsDialog.setProject(*mProject); - } + statsDialog.setProject(mProjectFile); statsDialog.setPathSelected(mCurrentDirectory); statsDialog.setNumberOfFilesScanned(mThread->getPreviousFilesCount()); statsDialog.setScanDuration(mThread->getPreviousScanDuration() / 1000.0); diff --git a/gui/mainwindow.h b/gui/mainwindow.h index be9f114f6..c04fea5f0 100644 --- a/gui/mainwindow.h +++ b/gui/mainwindow.h @@ -34,7 +34,7 @@ class ThreadHandler; class TranslationHandler; class ScratchPad; class LogView; -class Project; +class ProjectFile; class ErrorItem; class QAction; @@ -237,7 +237,7 @@ private: * @brief Analyze the project. * @param project Pointer to the project to analyze. */ - void analyzeProject(Project *project); + void analyzeProject(const ProjectFile *projectFile); /** * @brief Set current language @@ -413,7 +413,7 @@ private: ScratchPad* mScratchPad; /** @brief Project (file). */ - Project *mProject; + ProjectFile *mProjectFile; /** @brief Filter field in the Filter toolbar. */ QLineEdit* mLineEditFilter; diff --git a/gui/project.cpp b/gui/project.cpp deleted file mode 100644 index 39baf90b1..000000000 --- a/gui/project.cpp +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2016 Cppcheck team. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include -#include -#include -#include -#include -#include -#include -#include "project.h" -#include "projectfile.h" -#include "projectfiledialog.h" - -Project::Project(QWidget *parent) : - QObject(parent), - mProjectFile(NULL), - mParentWidget(parent) -{ -} - -Project::Project(const QString &filename, QWidget *parent) : - QObject(parent), - mFilename(filename), - mProjectFile(NULL), - mParentWidget(parent) -{ -} - -Project::~Project() -{ - delete mProjectFile; -} - -QString Project::getFilename() const -{ - return mFilename; -} - -void Project::setFilename(const QString &filename) -{ - mFilename = filename; -} - -bool Project::isOpen() const -{ - return mProjectFile != NULL; -} - -bool Project::open() -{ - mProjectFile = new ProjectFile(mFilename, this); - if (!QFile::exists(mFilename)) - return false; - - if (!mProjectFile->read()) { - QMessageBox msg(QMessageBox::Critical, - tr("Cppcheck"), - tr("Could not read the project file."), - QMessageBox::Ok, - mParentWidget); - msg.exec(); - mFilename = QString(); - mProjectFile->setFilename(mFilename); - return false; - } - - return true; -} - -bool Project::edit() -{ - ProjectFileDialog dlg(mFilename, mParentWidget); - dlg.loadFromProjectFile(mProjectFile); - if (dlg.exec() != QDialog::Accepted) - return false; - - dlg.saveToProjectFile(mProjectFile); - - if (!mProjectFile->write()) { - QMessageBox msg(QMessageBox::Critical, - tr("Cppcheck"), - tr("Could not write the project file."), - QMessageBox::Ok, - mParentWidget); - msg.exec(); - return false; - } - - return true; -} - -void Project::create() -{ - mProjectFile = new ProjectFile(mFilename, this); -} diff --git a/gui/project.h b/gui/project.h deleted file mode 100644 index b88ffdc61..000000000 --- a/gui/project.h +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Cppcheck - A tool for static C/C++ code analysis - * Copyright (C) 2007-2016 Cppcheck team. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifndef PROJECT_H -#define PROJECT_H - -#include -#include - -class QWidget; -class ProjectFile; - -/// @addtogroup GUI -/// @{ - -/** -* @brief A class that contains project data and manages projects. -* Currently only project file creation and editing is implemented. -*/ -class Project : public QObject { - Q_OBJECT - -public: - explicit Project(QWidget *parent = 0); - Project(const QString &filename, QWidget *parent = 0); - ~Project(); - - /** - * @brief Return the filename of the project. - * @return Project's filename. - */ - QString getFilename() const; - - /** - * @brief Set filename for the project file. - * @param filename Filename. - */ - void setFilename(const QString &filename); - - /** - * @brief Is the project open? - * The project is considered to be open if it has an opened project file. - * @return true if the project is open, false otherwise. - */ - bool isOpen() const; - - /** - * @brief Open existing project file. - */ - bool open(); - - /** - * @brief Edit the project file. - * @return true if editing was successful. - */ - bool edit(); - - /** - * @brief Create new project file. - */ - void create(); - - /** - * @brief Return current project file. - * @return project file. - */ - ProjectFile * getProjectFile() const { - return mProjectFile; - } - -private: - - QString mFilename; - ProjectFile *mProjectFile; - QWidget *mParentWidget; -}; - -/// @} - -#endif // PROJECT_H diff --git a/gui/projectfile.cpp b/gui/projectfile.cpp index 20d9d8e2c..336595662 100644 --- a/gui/projectfile.cpp +++ b/gui/projectfile.cpp @@ -60,6 +60,7 @@ ProjectFile::ProjectFile(const QString &filename, QObject *parent) : QObject(parent), mFilename(filename) { + read(); } bool ProjectFile::read(const QString &filename) diff --git a/gui/statsdialog.cpp b/gui/statsdialog.cpp index 8e6cbebda..53a87be72 100644 --- a/gui/statsdialog.cpp +++ b/gui/statsdialog.cpp @@ -25,7 +25,6 @@ #include #include #include -#include "project.h" #include "projectfile.h" #include "statsdialog.h" #include "checkstatistics.h" @@ -39,9 +38,8 @@ StatsDialog::StatsDialog(QWidget *parent) connect(mUI.mPDFexport, SIGNAL(pressed()), this, SLOT(pdfExport())); } -void StatsDialog::setProject(const Project& project) +void StatsDialog::setProject(const ProjectFile* projectFile) { - ProjectFile *projectFile = project.getProjectFile(); if (projectFile) { mUI.mProject->setText(projectFile->getRootPath()); mUI.mPaths->setText(projectFile->getCheckPaths().join(";")); diff --git a/gui/statsdialog.h b/gui/statsdialog.h index d47a9da46..cbc4fde42 100644 --- a/gui/statsdialog.h +++ b/gui/statsdialog.h @@ -22,7 +22,7 @@ #include #include "ui_stats.h" -class Project; +class ProjectFile; class CheckStatistics; /// @addtogroup GUI @@ -40,7 +40,7 @@ public: /** * @brief Sets the project to extract statistics from */ - void setProject(const Project& project); + void setProject(const ProjectFile *projectFile); /** * @brief Sets the string to display beside "Path Selected:"