diff --git a/src/plugins/projectexplorer/compileoutputwindow.cpp b/src/plugins/projectexplorer/compileoutputwindow.cpp index 2b941dc87c4..d9406a603ff 100644 --- a/src/plugins/projectexplorer/compileoutputwindow.cpp +++ b/src/plugins/projectexplorer/compileoutputwindow.cpp @@ -37,6 +37,7 @@ #include "projectexplorerconstants.h" #include "projectexplorer.h" #include "projectexplorersettings.h" +#include "taskhub.h" #include #include @@ -59,10 +60,50 @@ namespace { const int MAX_LINECOUNT = 50000; } +namespace ProjectExplorer { +namespace Internal { + +class CompileOutputTextEdit : public Core::OutputWindow +{ +public: + CompileOutputTextEdit(const Core::Context &context) : Core::OutputWindow(context) + { + } + + void addTask(const Task &task, int blocknumber) + { + m_taskids.insert(blocknumber, task.taskId); + } + + void clearTasks() + { + m_taskids.clear(); + } + +protected: + void mouseDoubleClickEvent(QMouseEvent *ev) + { + int line = cursorForPosition(ev->pos()).block().blockNumber(); + if (unsigned taskid = m_taskids.value(line, 0)) { + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + TaskHub *hub = pm->getObject(); + hub->showTaskInEditor(taskid); + } else { + QPlainTextEdit::mouseDoubleClickEvent(ev); + } + } + +private: + QHash m_taskids; //Map blocknumber to taskId +}; + +} // namespace Internal +} // namespace ProjectExplorer + CompileOutputWindow::CompileOutputWindow(BuildManager * /*bm*/) { Core::Context context(Constants::C_COMPILE_OUTPUT); - m_outputWindow = new Core::OutputWindow(context); + m_outputWindow = new CompileOutputTextEdit(context); m_outputWindow->setWindowTitle(tr("Compile Output")); m_outputWindow->setWindowIcon(QIcon(QLatin1String(Constants::ICON_WINDOW))); m_outputWindow->setReadOnly(true); @@ -148,6 +189,7 @@ void CompileOutputWindow::appendText(const QString &text, ProjectExplorer::Build void CompileOutputWindow::clearContents() { m_outputWindow->clear(); + m_outputWindow->clearTasks(); m_taskPositions.clear(); } @@ -191,7 +233,9 @@ void CompileOutputWindow::registerPositionOf(const Task &task) int blocknumber = m_outputWindow->blockCount(); if (blocknumber > MAX_LINECOUNT) return; + m_taskPositions.insert(task.taskId, blocknumber); + m_outputWindow->addTask(task, blocknumber); } bool CompileOutputWindow::knowsPositionOf(const Task &task) diff --git a/src/plugins/projectexplorer/compileoutputwindow.h b/src/plugins/projectexplorer/compileoutputwindow.h index 6a1844207da..315893c6403 100644 --- a/src/plugins/projectexplorer/compileoutputwindow.h +++ b/src/plugins/projectexplorer/compileoutputwindow.h @@ -52,6 +52,7 @@ class Task; namespace Internal { class ShowOutputTaskHandler; +class CompileOutputTextEdit; class CompileOutputWindow : public Core::IOutputPane { @@ -86,7 +87,7 @@ private slots: void updateWordWrapMode(); private: - Core::OutputWindow *m_outputWindow; + CompileOutputTextEdit *m_outputWindow; QHash m_taskPositions; ShowOutputTaskHandler * m_handler; }; diff --git a/src/plugins/projectexplorer/taskhub.cpp b/src/plugins/projectexplorer/taskhub.cpp index a05d9dc1fa1..613911330f9 100644 --- a/src/plugins/projectexplorer/taskhub.cpp +++ b/src/plugins/projectexplorer/taskhub.cpp @@ -132,6 +132,11 @@ void TaskHub::taskMarkClicked(unsigned int id) emit showTask(id); } +void TaskHub::showTaskInEditor(unsigned int id) +{ + emit openTask(id); +} + void TaskHub::setCategoryVisibility(const Core::Id &categoryId, bool visible) { emit categoryVisibilityChanged(categoryId, visible); diff --git a/src/plugins/projectexplorer/taskhub.h b/src/plugins/projectexplorer/taskhub.h index 6f92c3dd5ef..cdfce583d53 100644 --- a/src/plugins/projectexplorer/taskhub.h +++ b/src/plugins/projectexplorer/taskhub.h @@ -54,6 +54,7 @@ public: void removeTask(const Task &task); void updateTaskLineNumber(unsigned int id, int line); void taskMarkClicked(unsigned int id); + void showTaskInEditor(unsigned int id); void setCategoryVisibility(const Core::Id &categoryId, bool visible); void popup(bool withFocus); @@ -69,6 +70,7 @@ signals: void categoryVisibilityChanged(const Core::Id &categoryId, bool visible); void popupRequested(bool withFocus); void showTask(unsigned int id); + void openTask(unsigned int id); private: const QIcon m_errorIcon; const QIcon m_warningIcon; diff --git a/src/plugins/projectexplorer/taskwindow.cpp b/src/plugins/projectexplorer/taskwindow.cpp index 2c3eabbb012..5f91fae4fdf 100644 --- a/src/plugins/projectexplorer/taskwindow.cpp +++ b/src/plugins/projectexplorer/taskwindow.cpp @@ -306,6 +306,8 @@ TaskWindow::TaskWindow(TaskHub *taskhub) : d(new TaskWindowPrivate) this, SLOT(popup(bool))); connect(d->m_taskHub, SIGNAL(showTask(uint)), this, SLOT(showTask(uint))); + connect(d->m_taskHub, SIGNAL(openTask(uint)), + this, SLOT(openTask(uint))); } TaskWindow::~TaskWindow() @@ -398,6 +400,14 @@ void TaskWindow::showTask(unsigned int id) d->m_listview->setCurrentIndex(filterIdx); } +void TaskWindow::openTask(unsigned int id) +{ + int sourceRow = d->m_model->rowForId(id); + QModelIndex sourceIdx = d->m_model->index(sourceRow, 0); + QModelIndex filterIdx = d->m_filter->mapFromSource(sourceIdx); + triggerDefaultHandler(filterIdx); +} + void TaskWindow::triggerDefaultHandler(const QModelIndex &index) { if (!index.isValid()) diff --git a/src/plugins/projectexplorer/taskwindow.h b/src/plugins/projectexplorer/taskwindow.h index 8a41bf9b1f4..6a077bfe63e 100644 --- a/src/plugins/projectexplorer/taskwindow.h +++ b/src/plugins/projectexplorer/taskwindow.h @@ -91,6 +91,7 @@ private slots: void removeTask(const ProjectExplorer::Task &task); void updatedTaskLineNumber(unsigned int id, int line); void showTask(unsigned int id); + void openTask(unsigned int id); void clearTasks(const Core::Id &categoryId); void setCategoryVisibility(const Core::Id &categoryId, bool visible);