From c5dfc33b3d0aa6aa25dbd2400460cee9df7d938d Mon Sep 17 00:00:00 2001
From: Christian Kandeler <christian.kandeler@theqtcompany.com>
Date: Tue, 3 Mar 2015 12:13:21 +0100
Subject: [PATCH] Valgrind: Log errors to issues pane instead of popping up a
 QMessageBox.

Just as informative, but less intrusive and can't introduce event loop
problems.

Change-Id: I7dec17b1e82ba23340376075125f965017047959
Reviewed-by: hjk <hjk@theqtcompany.com>
---
 src/plugins/analyzerbase/analyzerutils.cpp |  9 +++++++++
 src/plugins/analyzerbase/analyzerutils.h   |  6 +++---
 src/plugins/valgrind/callgrindtool.cpp     |  5 ++---
 src/plugins/valgrind/memchecktool.cpp      | 10 +++++-----
 4 files changed, 19 insertions(+), 11 deletions(-)

diff --git a/src/plugins/analyzerbase/analyzerutils.cpp b/src/plugins/analyzerbase/analyzerutils.cpp
index 1216f9cfb53..3d4e71747d4 100644
--- a/src/plugins/analyzerbase/analyzerutils.cpp
+++ b/src/plugins/analyzerbase/analyzerutils.cpp
@@ -33,6 +33,7 @@
 #include "analyzerconstants.h"
 
 #include <cpptools/cppmodelmanager.h>
+#include <projectexplorer/taskhub.h>
 #include <texteditor/texteditor.h>
 #include <texteditor/textdocument.h>
 
@@ -46,6 +47,7 @@
 
 using namespace Analyzer;
 using namespace Core;
+using namespace ProjectExplorer;
 
 static void moveCursorToEndOfName(QTextCursor *tc)
 {
@@ -93,3 +95,10 @@ CPlusPlus::Symbol *AnalyzerUtils::findSymbolUnderCursor()
     const CPlusPlus::LookupItem &lookupItem = lookupItems.first(); // ### TODO: select best candidate.
     return lookupItem.declaration();
 }
+
+void AnalyzerUtils::logToIssuesPane(Task::TaskType type, const QString &message)
+{
+    TaskHub::addTask(type, message, Analyzer::Constants::ANALYZERTASK_ID);
+    if (type == Task::Error)
+        TaskHub::requestPopup();
+}
diff --git a/src/plugins/analyzerbase/analyzerutils.h b/src/plugins/analyzerbase/analyzerutils.h
index 210da4860d8..a7d544e8b5d 100644
--- a/src/plugins/analyzerbase/analyzerutils.h
+++ b/src/plugins/analyzerbase/analyzerutils.h
@@ -33,15 +33,15 @@
 
 #include "analyzerbase_global.h"
 
-QT_BEGIN_NAMESPACE
-class QWidget;
-QT_END_NAMESPACE
+#include <projectexplorer/task.h>
 
 namespace CPlusPlus { class Symbol; }
 
 namespace AnalyzerUtils
 {
     ANALYZER_EXPORT CPlusPlus::Symbol *findSymbolUnderCursor();
+    ANALYZER_EXPORT void logToIssuesPane(ProjectExplorer::Task::TaskType type,
+                                         const QString &message);
 }
 
 #endif // ANALYZERUTILS_H
diff --git a/src/plugins/valgrind/callgrindtool.cpp b/src/plugins/valgrind/callgrindtool.cpp
index c658815aaad..dcd2a1396b2 100644
--- a/src/plugins/valgrind/callgrindtool.cpp
+++ b/src/plugins/valgrind/callgrindtool.cpp
@@ -88,7 +88,6 @@
 #include <QHBoxLayout>
 #include <QLineEdit>
 #include <QMenu>
-#include <QMessageBox>
 #include <QSortFilterProxyModel>
 #include <QToolBar>
 #include <QToolButton>
@@ -933,8 +932,8 @@ void CallgrindToolPrivate::loadExternalLogFile()
 
     QFile logFile(filePath);
     if (!logFile.open(QIODevice::ReadOnly | QIODevice::Text)) {
-        QMessageBox::critical(AnalyzerManager::mainWindow(), tr("Internal Error"),
-            tr("Failed to open file for reading: %1").arg(filePath));
+        AnalyzerUtils::logToIssuesPane(Task::Error,
+                tr("Callgrind: Failed to open file for reading: %1").arg(filePath));
         return;
     }
 
diff --git a/src/plugins/valgrind/memchecktool.cpp b/src/plugins/valgrind/memchecktool.cpp
index 4365c077dfc..ebee6c1c3b1 100644
--- a/src/plugins/valgrind/memchecktool.cpp
+++ b/src/plugins/valgrind/memchecktool.cpp
@@ -36,6 +36,7 @@
 #include "valgrindplugin.h"
 
 #include <analyzerbase/analyzermanager.h>
+#include <analyzerbase/analyzerutils.h>
 #include <analyzerbase/analyzerconstants.h>
 
 #include <valgrind/valgrindsettings.h>
@@ -83,7 +84,6 @@
 #include <QSpinBox>
 #include <QAction>
 #include <QMenu>
-#include <QMessageBox>
 #include <QToolButton>
 #include <QCheckBox>
 #include <utils/stylehelper.h>
@@ -493,8 +493,8 @@ void MemcheckTool::loadExternalXmlLogFile()
     QFile *logFile = new QFile(filePath);
     if (!logFile->open(QIODevice::ReadOnly | QIODevice::Text)) {
         delete logFile;
-        QMessageBox::critical(m_errorView, tr("Internal Error"),
-            tr("Failed to open file for reading: %1").arg(filePath));
+        AnalyzerUtils::logToIssuesPane(Task::Error,
+                tr("Memcheck: Failed to open file for reading: %1").arg(filePath));
         return;
     }
 
@@ -524,8 +524,8 @@ void MemcheckTool::parserError(const Error &error)
 
 void MemcheckTool::internalParserError(const QString &errorString)
 {
-    QMessageBox::critical(m_errorView, tr("Internal Error"),
-        tr("Error occurred parsing Valgrind output: %1").arg(errorString));
+    AnalyzerUtils::logToIssuesPane(Task::Error,
+            tr("Memcheck: Error occurred parsing Valgrind output: %1").arg(errorString));
 }
 
 void MemcheckTool::clearErrorView()
-- 
GitLab