diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp index 4cc329d6a..0ab92ba83 100644 --- a/gui/mainwindow.cpp +++ b/gui/mainwindow.cpp @@ -530,6 +530,13 @@ Settings MainWindow::GetCppcheckSettings() result.userDefines += define.toStdString(); } + QStringList libraries = pfile->GetLibraries(); + foreach(QString library, libraries) { + const QString applicationFilePath = QCoreApplication::applicationFilePath(); + if (!result.library.load(applicationFilePath.toLatin1(), (library+".cfg").toLatin1())) + QMessageBox::information(this, tr("Information"), tr("Failed to load the selected library %1").arg(library)); + } + // Only check the given -D configuration if (!defines.isEmpty()) result._maxConfigs = 1; diff --git a/gui/project.cpp b/gui/project.cpp index 25a625d1f..75f53daa2 100644 --- a/gui/project.cpp +++ b/gui/project.cpp @@ -95,6 +95,7 @@ bool Project::Edit() dlg.SetPaths(paths); QStringList ignorepaths = mPFile->GetExcludedPaths(); dlg.SetExcludedPaths(ignorepaths); + dlg.SetLibraries(mPFile->GetLibraries()); int rv = dlg.exec(); if (rv == QDialog::Accepted) { @@ -108,6 +109,7 @@ bool Project::Edit() mPFile->SetCheckPaths(paths); QStringList excludedpaths = dlg.GetExcludedPaths(); mPFile->SetExcludedPaths(excludedpaths); + mPFile->SetLibraries(dlg.GetLibraries()); bool writeSuccess = mPFile->Write(); if (!writeSuccess) { diff --git a/gui/projectfile.cpp b/gui/projectfile.cpp index 972346c60..96df1da3a 100644 --- a/gui/projectfile.cpp +++ b/gui/projectfile.cpp @@ -44,6 +44,8 @@ static const char IgnorePathNameAttrib[] = "name"; static const char ExcludeElementName[] = "exclude"; static const char ExcludePathName[] = "path"; static const char ExcludePathNameAttrib[] = "name"; +static const char LibrariesElementName[] = "libraries"; +static const char LibraryElementName[] = "library"; ProjectFile::ProjectFile(QObject *parent) : QObject(parent) @@ -100,6 +102,10 @@ bool ProjectFile::Read(const QString &filename) if (insideProject && xmlReader.name() == IgnoreElementName) ReadExcludes(xmlReader); + // Find libraries list from insid project element + if (insideProject && xmlReader.name() == LibrariesElementName) + ReadLibraries(xmlReader); + break; case QXmlStreamReader::EndElement: @@ -160,6 +166,15 @@ QStringList ProjectFile::GetExcludedPaths() const return paths; } +QStringList ProjectFile::GetLibraries() const +{ + QStringList libraries; + foreach(QString library, mLibraries) { + libraries << library; + } + return libraries; +} + void ProjectFile::ReadRootPath(QXmlStreamReader &reader) { QXmlStreamAttributes attribs = reader.attributes(); @@ -327,6 +342,45 @@ void ProjectFile::ReadExcludes(QXmlStreamReader &reader) } while (!allRead); } + +void ProjectFile::ReadLibraries(QXmlStreamReader &reader) +{ + QXmlStreamReader::TokenType type; + bool allRead = false; + do { + type = reader.readNext(); + switch (type) { + case QXmlStreamReader::StartElement: + // Read library-elements + if (reader.name().toString() == LibraryElementName) { + type = reader.readNext(); + if (type == QXmlStreamReader::Characters) { + QString library = reader.text().toString(); + mLibraries << library; + } + } + break; + + case QXmlStreamReader::EndElement: + if (reader.name().toString() == LibrariesElementName) + allRead = true; + break; + + // Not handled + case QXmlStreamReader::NoToken: + case QXmlStreamReader::Invalid: + case QXmlStreamReader::StartDocument: + case QXmlStreamReader::EndDocument: + case QXmlStreamReader::Characters: + case QXmlStreamReader::Comment: + case QXmlStreamReader::DTD: + case QXmlStreamReader::EntityReference: + case QXmlStreamReader::ProcessingInstruction: + break; + } + } while (!allRead); +} + void ProjectFile::SetIncludes(const QStringList &includes) { mIncludeDirs = includes; @@ -347,6 +401,11 @@ void ProjectFile::SetExcludedPaths(const QStringList &paths) mExcludedPaths = paths; } +void ProjectFile::SetLibraries(const QStringList &libraries) +{ + mLibraries = libraries; +} + bool ProjectFile::Write(const QString &filename) { if (!filename.isEmpty()) @@ -408,6 +467,16 @@ bool ProjectFile::Write(const QString &filename) xmlWriter.writeEndElement(); } + if (!mLibraries.isEmpty()) { + xmlWriter.writeStartElement(LibrariesElementName); + foreach(QString library, mLibraries) { + xmlWriter.writeStartElement(LibraryElementName); + xmlWriter.writeCharacters(library); + xmlWriter.writeEndElement(); + } + xmlWriter.writeEndElement(); + } + xmlWriter.writeEndDocument(); file.close(); return true; diff --git a/gui/projectfile.h b/gui/projectfile.h index 6c9305e76..fa9a1dc66 100644 --- a/gui/projectfile.h +++ b/gui/projectfile.h @@ -78,6 +78,12 @@ public: */ QStringList GetExcludedPaths() const; + /** + * @brief Get list libraries. + * @return list of libraries. + */ + QStringList GetLibraries() const; + /** * @brief Get filename for the project file. * @return file name. @@ -118,6 +124,12 @@ public: */ void SetExcludedPaths(const QStringList &paths); + /** + * @brief Set list of libraries. + * @param paths List of libraries. + */ + void SetLibraries(const QStringList &libraries); + /** * @brief Write project file (to disk). * @param filename Filename to use. @@ -164,6 +176,12 @@ protected: */ void ReadExcludes(QXmlStreamReader &reader); + /** + * @brief Read list of libraries. + * @param reader XML stream reader. + */ + void ReadLibraries(QXmlStreamReader &reader); + private: /** @@ -198,6 +216,11 @@ private: * @brief Paths excluded from the check. */ QStringList mExcludedPaths; + + /** + * @brief List of libraries. + */ + QStringList mLibraries; }; /// @} #endif // PROJECT_FILE_H diff --git a/gui/projectfile.ui b/gui/projectfile.ui index 91e11de30..8d6f9100a 100644 --- a/gui/projectfile.ui +++ b/gui/projectfile.ui @@ -58,6 +58,45 @@ + + + + + + Libraries: + + + + + + + gtk + + + + + + + posix + + + + + + + qt + + + + + + + windows + + + + + diff --git a/gui/projectfiledialog.cpp b/gui/projectfiledialog.cpp index ad292451f..15fbf28ae 100644 --- a/gui/projectfiledialog.cpp +++ b/gui/projectfiledialog.cpp @@ -160,6 +160,17 @@ QStringList ProjectFileDialog::GetExcludedPaths() const return paths; } +QStringList ProjectFileDialog::GetLibraries() const +{ + QStringList libraries; + const QCheckBox *c[] = { mUI.mChkboxGtk, mUI.mChkboxPosix, mUI.mChkboxQt, mUI.mChkboxWindows }; + for (unsigned int i = 0; i < sizeof(c) / sizeof(c[0]); i++) { + if (c[i]->isChecked()) + libraries << c[i]->text(); + } + return libraries; +} + void ProjectFileDialog::SetRootPath(const QString &root) { QString newroot = QDir::toNativeSeparators(root); @@ -201,6 +212,13 @@ void ProjectFileDialog::SetExcludedPaths(const QStringList &paths) } } +void ProjectFileDialog::SetLibraries(const QStringList &libraries) +{ + QCheckBox *c[] = { mUI.mChkboxGtk, mUI.mChkboxPosix, mUI.mChkboxQt, mUI.mChkboxWindows }; + for (unsigned int i = 0; i < sizeof(c) / sizeof(c[0]); i++) + c[i]->setChecked(libraries.contains(c[i]->text())); +} + void ProjectFileDialog::AddIncludeDir() { const QFileInfo inf(mFilePath); diff --git a/gui/projectfiledialog.h b/gui/projectfiledialog.h index dbf48bbef..e760e51e9 100644 --- a/gui/projectfiledialog.h +++ b/gui/projectfiledialog.h @@ -70,6 +70,12 @@ public: */ QStringList GetExcludedPaths() const; + /** + * @brief Return selected libraries from the dialog control. + * @return List of libraries. + */ + QStringList GetLibraries() const; + /** * @brief Set project root path to dialog control. * @param root Project root path to set to dialog control. @@ -100,6 +106,12 @@ public: */ void SetExcludedPaths(const QStringList &paths); + /** + * @brief Set libraries to dialog control. + * @param paths List of libraries to set to dialog control. + */ + void SetLibraries(const QStringList &libraries); + protected slots: /** * @brief Browse for include directory.