From ab20c6ea8b3b82da3afb7fd08d6e897c048f1813 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen <oswald.buddenhagen@nokia.com> Date: Wed, 3 Dec 2008 21:50:31 +0100 Subject: [PATCH] add "copy" action to problems output pane. --- src/plugins/coreplugin/coreconstants.h | 1 + src/plugins/projectexplorer/taskwindow.cpp | 60 +++++++++++++++++++++- src/plugins/projectexplorer/taskwindow.h | 16 ++++++ 3 files changed, 75 insertions(+), 2 deletions(-) diff --git a/src/plugins/coreplugin/coreconstants.h b/src/plugins/coreplugin/coreconstants.h index ee1488d40dc..c2a703a2d6f 100644 --- a/src/plugins/coreplugin/coreconstants.h +++ b/src/plugins/coreplugin/coreconstants.h @@ -94,6 +94,7 @@ const char * const C_WELCOME_MODE = "Core.WelcomeMode"; const char * const C_EDIT_MODE = "Core.EditMode"; const char * const C_EDITORMANAGER = "Core.EditorManager"; const char * const C_NAVIGATION_PANE = "Core.NavigationPane"; +const char * const C_PROBLEM_PANE = "Core.ProblemPane"; //default editor kind const char * const K_DEFAULT_TEXT_EDITOR = "Plain Text Editor"; diff --git a/src/plugins/projectexplorer/taskwindow.cpp b/src/plugins/projectexplorer/taskwindow.cpp index b69d37541ee..309e8ab9836 100644 --- a/src/plugins/projectexplorer/taskwindow.cpp +++ b/src/plugins/projectexplorer/taskwindow.cpp @@ -37,6 +37,7 @@ #include <coreplugin/actionmanager/actionmanager.h> #include <coreplugin/editormanager/editormanager.h> #include <coreplugin/coreconstants.h> +#include <coreplugin/uniqueidmanager.h> #include <texteditor/itexteditor.h> #include <texteditor/basetexteditor.h> #include <projectexplorerconstants.h> @@ -47,6 +48,8 @@ #include <QtGui/QListView> #include <QtGui/QPainter> #include <QtCore/QAbstractItemModel> +#include <QtGui/QApplication> +#include <QtGui/QClipboard> #include <QtGui/QFont> #include <QtGui/QFontMetrics> #include <QtGui/QTextLayout> @@ -81,7 +84,7 @@ public: QModelIndex firstError() const; void setFileNotFound(const QModelIndex &index, bool b); - enum Roles { File = Qt::UserRole, Line, Description, FileNotFound }; + enum Roles { File = Qt::UserRole, Line, Description, FileNotFound, Type }; private: QList<TaskItem> m_items; int m_maxSizeOfFileName; @@ -196,6 +199,8 @@ QVariant TaskModel::data(const QModelIndex &index, int role) const return m_items.at(index.row()).description; else if (role == TaskModel::FileNotFound) return m_items.at(index.row()).fileNotFound; + else if (role == TaskModel::Type) + return (int)m_items.at(index.row()).type; else if (role == Qt::DecorationRole) { if (m_items.at(index.row()).type == ProjectExplorer::BuildParserInterface::Error) { return QIcon(":/projectexplorer/images/compile_error.png"); @@ -257,6 +262,15 @@ TaskWindow::TaskWindow() TaskDelegate *tld = new TaskDelegate(this); m_listview->setItemDelegate(tld); m_listview->setWindowIcon(QIcon(":/qt4projectmanager/images/window.png")); + m_listview->setContextMenuPolicy(Qt::ActionsContextMenu); + + m_taskWindowContext = new TaskWindowContext(m_listview); + m_coreIFace->addContextObject(m_taskWindowContext); + + m_copyAction = new QAction(QIcon(Core::Constants::ICON_COPY), tr("&Copy"), this); + m_coreIFace->actionManager()-> + registerAction(m_copyAction, Core::Constants::COPY, m_taskWindowContext->context()); + m_listview->addAction(m_copyAction); connect(m_listview->selectionModel(), SIGNAL(currentChanged(const QModelIndex &, const QModelIndex &)), tld, SLOT(currentChanged(const QModelIndex &, const QModelIndex &))); @@ -266,12 +280,15 @@ TaskWindow::TaskWindow() connect(m_listview, SIGNAL(clicked(const QModelIndex &)), this, SLOT(showTaskInFile(const QModelIndex &))); + connect(m_copyAction, SIGNAL(triggered()), SLOT(copy())); + m_errorCount = 0; m_currentTask = -1; } TaskWindow::~TaskWindow() { + m_coreIFace->removeContextObject(m_taskWindowContext); delete m_listview; delete m_model; } @@ -291,6 +308,7 @@ void TaskWindow::clearContents() m_errorCount = 0; m_currentTask = -1; m_model->clear(); + m_copyAction->setEnabled(false); emit tasksChanged(); } @@ -305,6 +323,7 @@ void TaskWindow::addItem(ProjectExplorer::BuildParserInterface::PatternType type m_model->addTask(type, description, file, line); if (type == ProjectExplorer::BuildParserInterface::Error) ++m_errorCount; + m_copyAction->setEnabled(true); emit tasksChanged(); } @@ -327,6 +346,25 @@ void TaskWindow::showTaskInFile(const QModelIndex &index) m_listview->selectionModel()->select(index, QItemSelectionModel::ClearAndSelect); } +void TaskWindow::copy() +{ + QModelIndex index = m_listview->selectionModel()->currentIndex(); + QString file = index.data(TaskModel::File).toString(); + QString line = index.data(TaskModel::Line).toString(); + QString description = index.data(TaskModel::Description).toString(); + QString type; + switch (index.data(TaskModel::Type).toInt()) { + case ProjectExplorer::BuildParserInterface::Error: + type = "error: "; + break; + case ProjectExplorer::BuildParserInterface::Warning: + type = "warning: "; + break; + } + + QApplication::clipboard()->setText(file + ':' + line + ": " + type + description); +} + int TaskWindow::numberOfTasks() const { return m_model->rowCount(QModelIndex()); @@ -483,7 +521,7 @@ void TaskDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, painter->fillRect(width, 2 + opt.rect.top(), gwidth, fm.height() + 1, lg); } } else { - // Descritption + // Description QString description = index.data(TaskModel::Description).toString(); // Layout the description int leading = fm.leading(); @@ -536,3 +574,21 @@ void TaskDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, painter->drawLine(0, opt.rect.bottom(), opt.rect.right(), opt.rect.bottom()); painter->restore(); } + +TaskWindowContext::TaskWindowContext(QWidget *widget) + : m_taskList(widget) +{ + Core::ICore *core = ExtensionSystem::PluginManager::instance()->getObject<Core::ICore>(); + m_context << core->uniqueIDManager()->uniqueIdentifier(Core::Constants::C_PROBLEM_PANE); +} + +QList<int> TaskWindowContext::context() const +{ + return m_context; +} + +QWidget *TaskWindowContext::widget() +{ + return m_taskList; +} + diff --git a/src/plugins/projectexplorer/taskwindow.h b/src/plugins/projectexplorer/taskwindow.h index efd2752469e..70253411530 100644 --- a/src/plugins/projectexplorer/taskwindow.h +++ b/src/plugins/projectexplorer/taskwindow.h @@ -37,6 +37,7 @@ #include "buildparserinterface.h" #include <coreplugin/ioutputpane.h> +#include <coreplugin/icontext.h> #include <coreplugin/icore.h> #include <QtGui/QTreeWidget> @@ -49,6 +50,7 @@ namespace Internal { class TaskModel; class TaskView; +class TaskWindowContext; class TaskWindow : public Core::IOutputPane { @@ -82,6 +84,7 @@ signals: private slots: void showTaskInFile(const QModelIndex &index); + void copy(); private: int sizeHintForColumn(int column) const; @@ -92,6 +95,8 @@ private: TaskModel *m_model; TaskView *m_listview; + TaskWindowContext *m_taskWindowContext; + QAction *m_copyAction; }; class TaskView : public QListView @@ -122,6 +127,17 @@ private: void generateGradientPixmap(int width, int height, QColor color, bool selected) const; }; +class TaskWindowContext : public Core::IContext +{ +public: + TaskWindowContext(QWidget *widget); + virtual QList<int> context() const; + virtual QWidget *widget(); +private: + QWidget *m_taskList; + QList<int> m_context; +}; + } //namespace Internal } //namespace ProjectExplorer -- GitLab