forked from qt-creator/qt-creator
debugger: start implementing a debugger console
This commit is contained in:
381
src/plugins/debugger/consolewindow.cpp
Normal file
381
src/plugins/debugger/consolewindow.cpp
Normal file
@@ -0,0 +1,381 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||||
|
**
|
||||||
|
** Commercial Usage
|
||||||
|
**
|
||||||
|
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||||
|
** accordance with the Qt Commercial License Agreement provided with the
|
||||||
|
** Software or, alternatively, in accordance with the terms contained in
|
||||||
|
** a written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||||
|
** General Public License version 2.1 as published by the Free Software
|
||||||
|
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||||
|
** packaging of this file. Please review the following information to
|
||||||
|
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||||
|
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||||
|
**
|
||||||
|
** If you are unsure which license is appropriate for your use, please
|
||||||
|
** contact the sales department at http://qt.nokia.com/contact.
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#include "consolewindow.h"
|
||||||
|
|
||||||
|
#include "debuggeractions.h"
|
||||||
|
#include "debuggerconstants.h"
|
||||||
|
|
||||||
|
#include <QtCore/QDebug>
|
||||||
|
#include <QtCore/QFile>
|
||||||
|
#include <QtCore/QTime>
|
||||||
|
|
||||||
|
#include <QtGui/QAction>
|
||||||
|
#include <QtGui/QHBoxLayout>
|
||||||
|
#include <QtGui/QVBoxLayout>
|
||||||
|
#include <QtGui/QKeyEvent>
|
||||||
|
#include <QtGui/QLabel>
|
||||||
|
#include <QtGui/QLineEdit>
|
||||||
|
#include <QtGui/QMenu>
|
||||||
|
#include <QtGui/QSpacerItem>
|
||||||
|
#include <QtGui/QSplitter>
|
||||||
|
#include <QtGui/QSyntaxHighlighter>
|
||||||
|
#include <QtGui/QTextBlock>
|
||||||
|
#include <QtGui/QPlainTextEdit>
|
||||||
|
#include <QtGui/QFileDialog>
|
||||||
|
#include <QtGui/QMessageBox>
|
||||||
|
|
||||||
|
#include <aggregation/aggregate.h>
|
||||||
|
#include <coreplugin/findplaceholder.h>
|
||||||
|
#include <coreplugin/minisplitter.h>
|
||||||
|
#include <find/basetextfind.h>
|
||||||
|
|
||||||
|
#include <utils/savedaction.h>
|
||||||
|
|
||||||
|
using namespace Find;
|
||||||
|
|
||||||
|
namespace Debugger {
|
||||||
|
namespace Internal {
|
||||||
|
|
||||||
|
static QChar charForChannel(int channel)
|
||||||
|
{
|
||||||
|
switch (channel) {
|
||||||
|
case LogDebug: return 'd';
|
||||||
|
case LogWarning: return 'w';
|
||||||
|
case LogError: return 'e';
|
||||||
|
case LogInput: return '<';
|
||||||
|
case LogOutput: return '>';
|
||||||
|
case LogStatus: return 's';
|
||||||
|
case LogTime: return 't';
|
||||||
|
case LogMisc:
|
||||||
|
default: return ' ';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static LogChannel channelForChar(QChar c)
|
||||||
|
{
|
||||||
|
switch (c.unicode()) {
|
||||||
|
case 'd': return LogDebug;
|
||||||
|
case 'w': return LogWarning;
|
||||||
|
case 'e': return LogError;
|
||||||
|
case '<': return LogInput;
|
||||||
|
case '>': return LogOutput;
|
||||||
|
case 's': return LogStatus;
|
||||||
|
case 't': return LogTime;
|
||||||
|
default: return LogMisc;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// ConsoleHighlighter
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
class ConsoleHighlighter : public QSyntaxHighlighter
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ConsoleHighlighter(QPlainTextEdit *parent)
|
||||||
|
: QSyntaxHighlighter(parent->document()), m_parent(parent)
|
||||||
|
{}
|
||||||
|
|
||||||
|
private:
|
||||||
|
void highlightBlock(const QString &text)
|
||||||
|
{
|
||||||
|
QTextCharFormat format;
|
||||||
|
switch (channelForChar(text.isEmpty() ? QChar() : text.at(0))) {
|
||||||
|
case LogInput:
|
||||||
|
format.setForeground(Qt::blue);
|
||||||
|
setFormat(1, text.size(), format);
|
||||||
|
break;
|
||||||
|
case LogStatus:
|
||||||
|
format.setForeground(Qt::darkGreen);
|
||||||
|
setFormat(1, text.size(), format);
|
||||||
|
break;
|
||||||
|
case LogWarning:
|
||||||
|
format.setForeground(Qt::darkYellow);
|
||||||
|
setFormat(1, text.size(), format);
|
||||||
|
break;
|
||||||
|
case LogError:
|
||||||
|
format.setForeground(Qt::red);
|
||||||
|
setFormat(1, text.size(), format);
|
||||||
|
break;
|
||||||
|
case LogTime:
|
||||||
|
format.setForeground(Qt::darkRed);
|
||||||
|
setFormat(1, text.size(), format);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
QColor base = m_parent->palette().color(QPalette::Base);
|
||||||
|
format.setForeground(base);
|
||||||
|
format.setFontPointSize(1);
|
||||||
|
setFormat(0, 1, format);
|
||||||
|
/*
|
||||||
|
if (text.size() > 3 && text.at(2) == QLatin1Char(':')) {
|
||||||
|
QTextCharFormat format;
|
||||||
|
format.setForeground(Qt::darkRed);
|
||||||
|
setFormat(1, text.size(), format);
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
|
QPlainTextEdit *m_parent;
|
||||||
|
};
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// DebbuggerPane base class
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// FIXME: Code duplication with FakeVim
|
||||||
|
class History
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
History() : m_index(0) {}
|
||||||
|
void append(const QString &item) {
|
||||||
|
m_items.removeAll(item);
|
||||||
|
m_items.append(item); m_index = m_items.size() - 1;
|
||||||
|
}
|
||||||
|
void down() { m_index = qMin(m_index + 1, m_items.size()); }
|
||||||
|
void up() { m_index = qMax(m_index - 1, 0); }
|
||||||
|
//void clear() { m_items.clear(); m_index = 0; }
|
||||||
|
void restart() { m_index = m_items.size(); }
|
||||||
|
QString current() const { return m_items.value(m_index, QString()); }
|
||||||
|
QStringList items() const { return m_items; }
|
||||||
|
private:
|
||||||
|
QStringList m_items;
|
||||||
|
int m_index;
|
||||||
|
};
|
||||||
|
|
||||||
|
class Console : public QPlainTextEdit
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
Console(QWidget *parent)
|
||||||
|
: QPlainTextEdit(parent)
|
||||||
|
{
|
||||||
|
setMaximumBlockCount(100000);
|
||||||
|
setFrameStyle(QFrame::NoFrame);
|
||||||
|
m_clearContentsAction = new QAction(this);
|
||||||
|
m_clearContentsAction->setText(tr("Clear Contents"));
|
||||||
|
m_clearContentsAction->setEnabled(true);
|
||||||
|
connect(m_clearContentsAction, SIGNAL(triggered(bool)),
|
||||||
|
parent, SLOT(clearContents()));
|
||||||
|
|
||||||
|
m_saveContentsAction = new QAction(this);
|
||||||
|
m_saveContentsAction->setText(tr("Save Contents"));
|
||||||
|
m_saveContentsAction->setEnabled(true);
|
||||||
|
connect(m_saveContentsAction, SIGNAL(triggered()), this, SLOT(saveContents()));
|
||||||
|
}
|
||||||
|
|
||||||
|
void contextMenuEvent(QContextMenuEvent *ev)
|
||||||
|
{
|
||||||
|
theDebuggerAction(ExecuteCommand)->setData(textCursor().block().text());
|
||||||
|
QMenu *menu = createStandardContextMenu();
|
||||||
|
menu->addAction(m_clearContentsAction);
|
||||||
|
menu->addAction(m_saveContentsAction); // X11 clipboard is unreliable for long texts
|
||||||
|
menu->addAction(theDebuggerAction(ExecuteCommand));
|
||||||
|
menu->addAction(theDebuggerAction(LogTimeStamps));
|
||||||
|
menu->addAction(theDebuggerAction(VerboseLog));
|
||||||
|
menu->addSeparator();
|
||||||
|
menu->addAction(theDebuggerAction(SettingsDialog));
|
||||||
|
menu->exec(ev->globalPos());
|
||||||
|
delete menu;
|
||||||
|
}
|
||||||
|
|
||||||
|
void keyPressEvent(QKeyEvent *ev)
|
||||||
|
{
|
||||||
|
if (ev->key() == Qt::Key_Return) {
|
||||||
|
if (ev->modifiers() == 0) {
|
||||||
|
QString cmd = textCursor().block().text();
|
||||||
|
if (cmd.isEmpty())
|
||||||
|
cmd = m_history.current();
|
||||||
|
QString cleanCmd;
|
||||||
|
foreach (QChar c, cmd)
|
||||||
|
if (c.unicode() >= 32 && c.unicode() < 128)
|
||||||
|
cleanCmd.append(c);
|
||||||
|
if (!cleanCmd.isEmpty()) {
|
||||||
|
theDebuggerAction(ExecuteCommand)->trigger(cleanCmd);
|
||||||
|
m_history.append(cleanCmd);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
QPlainTextEdit::keyPressEvent(ev);
|
||||||
|
} else if (ev->key() == Qt::Key_Up) {
|
||||||
|
m_history.up();
|
||||||
|
} else if (ev->key() == Qt::Key_Down) {
|
||||||
|
m_history.down();
|
||||||
|
} else {
|
||||||
|
QPlainTextEdit::keyPressEvent(ev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void mouseDoubleClickEvent(QMouseEvent *ev)
|
||||||
|
{
|
||||||
|
QString line = cursorForPosition(ev->pos()).block().text();
|
||||||
|
int n = 0;
|
||||||
|
|
||||||
|
// cut time string
|
||||||
|
if (line.size() > 18 && line.at(0) == '[')
|
||||||
|
line = line.mid(18);
|
||||||
|
//qDebug() << line;
|
||||||
|
|
||||||
|
for (int i = 0; i != line.size(); ++i) {
|
||||||
|
QChar c = line.at(i);
|
||||||
|
if (!c.isDigit())
|
||||||
|
break;
|
||||||
|
n = 10 * n + c.unicode() - '0';
|
||||||
|
}
|
||||||
|
//emit commandSelected(n);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
private slots:
|
||||||
|
void saveContents();
|
||||||
|
|
||||||
|
private:
|
||||||
|
QAction *m_clearContentsAction;
|
||||||
|
QAction *m_saveContentsAction;
|
||||||
|
History m_history;
|
||||||
|
};
|
||||||
|
|
||||||
|
void Console::saveContents()
|
||||||
|
{
|
||||||
|
while (true) {
|
||||||
|
const QString fileName = QFileDialog::getSaveFileName(this, tr("Log File"));
|
||||||
|
if (fileName.isEmpty())
|
||||||
|
break;
|
||||||
|
QFile file(fileName);
|
||||||
|
if (file.open(QIODevice::WriteOnly|QIODevice::Text|QIODevice::Truncate)) {
|
||||||
|
file.write(toPlainText().toUtf8());
|
||||||
|
file.close();
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
QMessageBox::warning(this, tr("Write Failure"),
|
||||||
|
tr("Unable to write log contents to '%1': %2").
|
||||||
|
arg(fileName, file.errorString()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// ConsoleWindow
|
||||||
|
//
|
||||||
|
/////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
ConsoleWindow::ConsoleWindow(QWidget *parent)
|
||||||
|
: QWidget(parent)
|
||||||
|
{
|
||||||
|
setWindowTitle(tr("Console"));
|
||||||
|
|
||||||
|
m_console = new Console(this);
|
||||||
|
m_console->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
|
||||||
|
|
||||||
|
QVBoxLayout *layout = new QVBoxLayout(this);
|
||||||
|
layout->setMargin(0);
|
||||||
|
layout->setSpacing(0);
|
||||||
|
layout->addWidget(m_console);
|
||||||
|
layout->addWidget(new Core::FindToolBarPlaceHolder(this));
|
||||||
|
setLayout(layout);
|
||||||
|
|
||||||
|
Aggregation::Aggregate *aggregate = new Aggregation::Aggregate;
|
||||||
|
aggregate->add(m_console);
|
||||||
|
aggregate->add(new BaseTextFind(m_console));
|
||||||
|
|
||||||
|
//connect(m_console, SIGNAL(statusMessageRequested(QString,int)),
|
||||||
|
// this, SIGNAL(statusMessageRequested(QString,int)));
|
||||||
|
};
|
||||||
|
|
||||||
|
void ConsoleWindow::showOutput(int channel, const QString &output)
|
||||||
|
{
|
||||||
|
if (output.isEmpty())
|
||||||
|
return;
|
||||||
|
//QTextCursor oldCursor = m_console->textCursor();
|
||||||
|
//QTextCursor cursor = oldCursor;
|
||||||
|
//cursor.movePosition(QTextCursor::End);
|
||||||
|
//bool atEnd = oldCursor.position() == cursor.position();
|
||||||
|
|
||||||
|
foreach (QString line, output.split('\n')) {
|
||||||
|
// FIXME: QTextEdit asserts on really long lines...
|
||||||
|
const int n = 30000;
|
||||||
|
if (line.size() > n) {
|
||||||
|
line.truncate(n);
|
||||||
|
line += QLatin1String(" [...] <cut off>");
|
||||||
|
}
|
||||||
|
m_console->appendPlainText(charForChannel(channel) + line + "\n");
|
||||||
|
}
|
||||||
|
QTextCursor cursor = m_console->textCursor();
|
||||||
|
cursor.movePosition(QTextCursor::End);
|
||||||
|
//if (atEnd) {
|
||||||
|
m_console->setTextCursor(cursor);
|
||||||
|
m_console->ensureCursorVisible();
|
||||||
|
//}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConsoleWindow::showInput(int channel, const QString &input)
|
||||||
|
{
|
||||||
|
Q_UNUSED(channel)
|
||||||
|
m_console->appendPlainText(input);
|
||||||
|
QTextCursor cursor = m_console->textCursor();
|
||||||
|
cursor.movePosition(QTextCursor::End);
|
||||||
|
m_console->setTextCursor(cursor);
|
||||||
|
m_console->ensureCursorVisible();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConsoleWindow::clearContents()
|
||||||
|
{
|
||||||
|
m_console->clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ConsoleWindow::setCursor(const QCursor &cursor)
|
||||||
|
{
|
||||||
|
m_console->viewport()->setCursor(cursor);
|
||||||
|
QWidget::setCursor(cursor);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString ConsoleWindow::combinedContents() const
|
||||||
|
{
|
||||||
|
return m_console->toPlainText();
|
||||||
|
}
|
||||||
|
|
||||||
|
QString ConsoleWindow::inputContents() const
|
||||||
|
{
|
||||||
|
return m_console->toPlainText();
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace Internal
|
||||||
|
} // namespace Debugger
|
||||||
|
|
||||||
|
#include "consolewindow.moc"
|
76
src/plugins/debugger/consolewindow.h
Normal file
76
src/plugins/debugger/consolewindow.h
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
/**************************************************************************
|
||||||
|
**
|
||||||
|
** This file is part of Qt Creator
|
||||||
|
**
|
||||||
|
** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
|
||||||
|
**
|
||||||
|
** Contact: Nokia Corporation (qt-info@nokia.com)
|
||||||
|
**
|
||||||
|
** Commercial Usage
|
||||||
|
**
|
||||||
|
** Licensees holding valid Qt Commercial licenses may use this file in
|
||||||
|
** accordance with the Qt Commercial License Agreement provided with the
|
||||||
|
** Software or, alternatively, in accordance with the terms contained in
|
||||||
|
** a written agreement between you and Nokia.
|
||||||
|
**
|
||||||
|
** GNU Lesser General Public License Usage
|
||||||
|
**
|
||||||
|
** Alternatively, this file may be used under the terms of the GNU Lesser
|
||||||
|
** General Public License version 2.1 as published by the Free Software
|
||||||
|
** Foundation and appearing in the file LICENSE.LGPL included in the
|
||||||
|
** packaging of this file. Please review the following information to
|
||||||
|
** ensure the GNU Lesser General Public License version 2.1 requirements
|
||||||
|
** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
|
||||||
|
**
|
||||||
|
** If you are unsure which license is appropriate for your use, please
|
||||||
|
** contact the sales department at http://qt.nokia.com/contact.
|
||||||
|
**
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#ifndef DEBUGGER_CONSOLEWINDOW_H
|
||||||
|
#define DEBUGGER_CONSOLEWINDOW_H
|
||||||
|
|
||||||
|
#include <QtGui/QWidget>
|
||||||
|
|
||||||
|
QT_BEGIN_NAMESPACE
|
||||||
|
class QCursor;
|
||||||
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
|
namespace Debugger {
|
||||||
|
namespace Internal {
|
||||||
|
|
||||||
|
class Console;
|
||||||
|
|
||||||
|
class ConsoleWindow : public QWidget
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit ConsoleWindow(QWidget *parent = 0);
|
||||||
|
|
||||||
|
void setCursor(const QCursor &cursor);
|
||||||
|
|
||||||
|
QString combinedContents() const;
|
||||||
|
QString inputContents() const;
|
||||||
|
|
||||||
|
static QString logTimeStamp();
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void clearContents();
|
||||||
|
void showOutput(int channel, const QString &output);
|
||||||
|
void showInput(int channel, const QString &input);
|
||||||
|
|
||||||
|
signals:
|
||||||
|
void showPage();
|
||||||
|
void statusMessageRequested(const QString &msg, int);
|
||||||
|
|
||||||
|
private:
|
||||||
|
Console *m_console; // combined input/output
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
} // namespace Internal
|
||||||
|
} // namespace Debugger
|
||||||
|
|
||||||
|
#endif // DEBUGGER_CONSOLEWINDOW_H
|
||||||
|
|
@@ -19,6 +19,7 @@ QT += gui \
|
|||||||
HEADERS += breakhandler.h \
|
HEADERS += breakhandler.h \
|
||||||
breakwindow.h \
|
breakwindow.h \
|
||||||
breakpoint.h \
|
breakpoint.h \
|
||||||
|
consolewindow.h \
|
||||||
debuggeragents.h \
|
debuggeragents.h \
|
||||||
debuggeractions.h \
|
debuggeractions.h \
|
||||||
debuggerconstants.h \
|
debuggerconstants.h \
|
||||||
@@ -56,6 +57,7 @@ HEADERS += breakhandler.h \
|
|||||||
SOURCES += breakhandler.cpp \
|
SOURCES += breakhandler.cpp \
|
||||||
breakwindow.cpp \
|
breakwindow.cpp \
|
||||||
breakpoint.cpp \
|
breakpoint.cpp \
|
||||||
|
consolewindow.cpp \
|
||||||
debuggeragents.cpp \
|
debuggeragents.cpp \
|
||||||
debuggeractions.cpp \
|
debuggeractions.cpp \
|
||||||
debuggerdialogs.cpp \
|
debuggerdialogs.cpp \
|
||||||
|
@@ -65,6 +65,7 @@ const char * const DEBUGGER_COMMON_SETTINGS_CATEGORY_ICON =
|
|||||||
|
|
||||||
// dock widget names
|
// dock widget names
|
||||||
const char * const DOCKWIDGET_BREAK = "Debugger.Docks.Break";
|
const char * const DOCKWIDGET_BREAK = "Debugger.Docks.Break";
|
||||||
|
const char * const DOCKWIDGET_CONSOLE = "Debugger.Docks.Console";
|
||||||
const char * const DOCKWIDGET_MODULES = "Debugger.Docks.Modules";
|
const char * const DOCKWIDGET_MODULES = "Debugger.Docks.Modules";
|
||||||
const char * const DOCKWIDGET_REGISTER = "Debugger.Docks.Register";
|
const char * const DOCKWIDGET_REGISTER = "Debugger.Docks.Register";
|
||||||
const char * const DOCKWIDGET_OUTPUT = "Debugger.Docks.Output";
|
const char * const DOCKWIDGET_OUTPUT = "Debugger.Docks.Output";
|
||||||
|
@@ -43,6 +43,7 @@
|
|||||||
#include "debuggeruiswitcher.h"
|
#include "debuggeruiswitcher.h"
|
||||||
|
|
||||||
#include "breakwindow.h"
|
#include "breakwindow.h"
|
||||||
|
#include "consolewindow.h"
|
||||||
#include "moduleswindow.h"
|
#include "moduleswindow.h"
|
||||||
#include "registerwindow.h"
|
#include "registerwindow.h"
|
||||||
#include "snapshotwindow.h"
|
#include "snapshotwindow.h"
|
||||||
@@ -993,6 +994,7 @@ public:
|
|||||||
QComboBox *m_threadBox;
|
QComboBox *m_threadBox;
|
||||||
|
|
||||||
QDockWidget *m_breakDock;
|
QDockWidget *m_breakDock;
|
||||||
|
QDockWidget *m_consoleDock;
|
||||||
QDockWidget *m_modulesDock;
|
QDockWidget *m_modulesDock;
|
||||||
QDockWidget *m_outputDock;
|
QDockWidget *m_outputDock;
|
||||||
QDockWidget *m_registerDock;
|
QDockWidget *m_registerDock;
|
||||||
@@ -1006,6 +1008,7 @@ public:
|
|||||||
DebuggerActions m_actions;
|
DebuggerActions m_actions;
|
||||||
|
|
||||||
BreakWindow *m_breakWindow;
|
BreakWindow *m_breakWindow;
|
||||||
|
ConsoleWindow *m_consoleWindow;
|
||||||
QTreeView *m_returnWindow;
|
QTreeView *m_returnWindow;
|
||||||
QTreeView *m_localsWindow;
|
QTreeView *m_localsWindow;
|
||||||
QTreeView *m_watchersWindow;
|
QTreeView *m_watchersWindow;
|
||||||
@@ -1039,6 +1042,7 @@ DebuggerPluginPrivate::DebuggerPluginPrivate(DebuggerPlugin *plugin)
|
|||||||
m_threadBox = 0;
|
m_threadBox = 0;
|
||||||
|
|
||||||
m_breakDock = 0;
|
m_breakDock = 0;
|
||||||
|
m_consoleDock = 0;
|
||||||
m_modulesDock = 0;
|
m_modulesDock = 0;
|
||||||
m_outputDock = 0;
|
m_outputDock = 0;
|
||||||
m_registerDock = 0;
|
m_registerDock = 0;
|
||||||
@@ -1104,6 +1108,8 @@ bool DebuggerPluginPrivate::initialize(const QStringList &arguments, QString *er
|
|||||||
|
|
||||||
m_breakWindow = new BreakWindow;
|
m_breakWindow = new BreakWindow;
|
||||||
m_breakWindow->setObjectName(QLatin1String("CppDebugBreakpoints"));
|
m_breakWindow->setObjectName(QLatin1String("CppDebugBreakpoints"));
|
||||||
|
m_consoleWindow = new ConsoleWindow;
|
||||||
|
m_consoleWindow->setObjectName(QLatin1String("CppDebugConsole"));
|
||||||
m_modulesWindow = new ModulesWindow;
|
m_modulesWindow = new ModulesWindow;
|
||||||
m_modulesWindow->setObjectName(QLatin1String("CppDebugModules"));
|
m_modulesWindow->setObjectName(QLatin1String("CppDebugModules"));
|
||||||
m_outputWindow = new DebuggerOutputWindow;
|
m_outputWindow = new DebuggerOutputWindow;
|
||||||
@@ -1266,6 +1272,11 @@ bool DebuggerPluginPrivate::initialize(const QStringList &arguments, QString *er
|
|||||||
// Dock widgets
|
// Dock widgets
|
||||||
m_breakDock = m_uiSwitcher->createDockWidget(CppLanguage, m_breakWindow);
|
m_breakDock = m_uiSwitcher->createDockWidget(CppLanguage, m_breakWindow);
|
||||||
m_breakDock->setObjectName(QString(DOCKWIDGET_BREAK));
|
m_breakDock->setObjectName(QString(DOCKWIDGET_BREAK));
|
||||||
|
|
||||||
|
m_consoleDock = m_uiSwitcher->createDockWidget(CppLanguage, m_consoleWindow,
|
||||||
|
Qt::TopDockWidgetArea);
|
||||||
|
m_consoleDock->setObjectName(QString(DOCKWIDGET_OUTPUT));
|
||||||
|
|
||||||
m_modulesDock = m_uiSwitcher->createDockWidget(CppLanguage, m_modulesWindow,
|
m_modulesDock = m_uiSwitcher->createDockWidget(CppLanguage, m_modulesWindow,
|
||||||
Qt::TopDockWidgetArea);
|
Qt::TopDockWidgetArea);
|
||||||
m_modulesDock->setObjectName(QString(DOCKWIDGET_MODULES));
|
m_modulesDock->setObjectName(QString(DOCKWIDGET_MODULES));
|
||||||
@@ -1281,6 +1292,7 @@ bool DebuggerPluginPrivate::initialize(const QStringList &arguments, QString *er
|
|||||||
m_outputDock = m_uiSwitcher->createDockWidget(AnyLanguage, m_outputWindow,
|
m_outputDock = m_uiSwitcher->createDockWidget(AnyLanguage, m_outputWindow,
|
||||||
Qt::TopDockWidgetArea);
|
Qt::TopDockWidgetArea);
|
||||||
m_outputDock->setObjectName(QString(DOCKWIDGET_OUTPUT));
|
m_outputDock->setObjectName(QString(DOCKWIDGET_OUTPUT));
|
||||||
|
|
||||||
m_snapshotDock = m_uiSwitcher->createDockWidget(CppLanguage, m_snapshotWindow);
|
m_snapshotDock = m_uiSwitcher->createDockWidget(CppLanguage, m_snapshotWindow);
|
||||||
m_snapshotDock->setObjectName(QString(DOCKWIDGET_SNAPSHOTS));
|
m_snapshotDock->setObjectName(QString(DOCKWIDGET_SNAPSHOTS));
|
||||||
|
|
||||||
@@ -2065,9 +2077,10 @@ void DebuggerPluginPrivate::fontSettingsChanged
|
|||||||
{
|
{
|
||||||
int size = settings.fontZoom() * settings.fontSize() / 100;
|
int size = settings.fontZoom() * settings.fontSize() / 100;
|
||||||
changeFontSize(m_breakWindow, size);
|
changeFontSize(m_breakWindow, size);
|
||||||
|
changeFontSize(m_outputWindow, size);
|
||||||
changeFontSize(m_localsWindow, size);
|
changeFontSize(m_localsWindow, size);
|
||||||
changeFontSize(m_modulesWindow, size);
|
changeFontSize(m_modulesWindow, size);
|
||||||
changeFontSize(m_outputWindow, size);
|
changeFontSize(m_consoleWindow, size);
|
||||||
changeFontSize(m_registerWindow, size);
|
changeFontSize(m_registerWindow, size);
|
||||||
changeFontSize(m_returnWindow, size);
|
changeFontSize(m_returnWindow, size);
|
||||||
changeFontSize(m_sourceFilesWindow, size);
|
changeFontSize(m_sourceFilesWindow, size);
|
||||||
@@ -2104,6 +2117,7 @@ void DebuggerPluginPrivate::setBusyCursor(bool busy)
|
|||||||
m_busy = busy;
|
m_busy = busy;
|
||||||
QCursor cursor(busy ? Qt::BusyCursor : Qt::ArrowCursor);
|
QCursor cursor(busy ? Qt::BusyCursor : Qt::ArrowCursor);
|
||||||
m_breakWindow->setCursor(cursor);
|
m_breakWindow->setCursor(cursor);
|
||||||
|
m_consoleWindow->setCursor(cursor);
|
||||||
m_localsWindow->setCursor(cursor);
|
m_localsWindow->setCursor(cursor);
|
||||||
m_modulesWindow->setCursor(cursor);
|
m_modulesWindow->setCursor(cursor);
|
||||||
m_outputWindow->setCursor(cursor);
|
m_outputWindow->setCursor(cursor);
|
||||||
@@ -2131,7 +2145,7 @@ void DebuggerPluginPrivate::setSimpleDockWidgetArrangement
|
|||||||
}
|
}
|
||||||
|
|
||||||
foreach (QDockWidget *dockWidget, dockWidgets) {
|
foreach (QDockWidget *dockWidget, dockWidgets) {
|
||||||
if (dockWidget == m_outputDock) {
|
if (dockWidget == m_outputDock || dockWidget == m_consoleDock) {
|
||||||
mw->addDockWidget(Qt::TopDockWidgetArea, dockWidget);
|
mw->addDockWidget(Qt::TopDockWidgetArea, dockWidget);
|
||||||
} else {
|
} else {
|
||||||
mw->addDockWidget(Qt::BottomDockWidgetArea, dockWidget);
|
mw->addDockWidget(Qt::BottomDockWidgetArea, dockWidget);
|
||||||
@@ -2660,6 +2674,7 @@ void DebuggerPlugin::showMessage(const QString &msg, int channel, int timeout)
|
|||||||
{
|
{
|
||||||
//qDebug() << "PLUGIN OUTPUT: " << channel << msg;
|
//qDebug() << "PLUGIN OUTPUT: " << channel << msg;
|
||||||
DebuggerOutputWindow *ow = d->m_outputWindow;
|
DebuggerOutputWindow *ow = d->m_outputWindow;
|
||||||
|
ConsoleWindow *cw = d->m_consoleWindow;
|
||||||
QTC_ASSERT(ow, return);
|
QTC_ASSERT(ow, return);
|
||||||
switch (channel) {
|
switch (channel) {
|
||||||
case StatusBar:
|
case StatusBar:
|
||||||
@@ -2679,6 +2694,7 @@ void DebuggerPlugin::showMessage(const QString &msg, int channel, int timeout)
|
|||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ow->showOutput(channel, msg);
|
ow->showOutput(channel, msg);
|
||||||
|
cw->showOutput(channel, msg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user