diff options
author | Friedemann Kleint <Friedemann.Kleint@nokia.com> | 2011-04-19 12:17:48 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@nokia.com> | 2011-04-19 12:19:23 +0200 |
commit | ed30a3f724b27178e5dba3975b550ad1d3461c03 (patch) | |
tree | 7394f202adbcb985ac4c40d0b9733691a81c6565 /src/plugins/debugger/memoryview.cpp | |
parent | ce67924b731982da09eee311a4907ebf5d8b1d20 (diff) | |
download | qt-creator-ed30a3f724b27178e5dba3975b550ad1d3461c03.tar.gz |
Debugger: Use bin editor widget for standalone-memory views.
Remove MemoryViewWidget/RegisterMemoryViewWidget
in favour of MemoryView/RegisterMemoryView based on the bin
editor widget.
Diffstat (limited to 'src/plugins/debugger/memoryview.cpp')
-rw-r--r-- | src/plugins/debugger/memoryview.cpp | 196 |
1 files changed, 196 insertions, 0 deletions
diff --git a/src/plugins/debugger/memoryview.cpp b/src/plugins/debugger/memoryview.cpp new file mode 100644 index 0000000000..8403815c1d --- /dev/null +++ b/src/plugins/debugger/memoryview.cpp @@ -0,0 +1,196 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (info@qt.nokia.com) +** +** +** GNU Lesser General Public License Usage +** +** 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. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** Other Usage +** +** Alternatively, this file may be used in accordance with the terms and +** conditions contained in a signed written agreement between you and Nokia. +** +** If you have questions regarding the use of this file, please contact +** Nokia at qt-info@nokia.com. +** +**************************************************************************/ + +#include "memoryview.h" +#include "registerhandler.h" +#include "memoryagent.h" + +#include <bineditor/markup.h> + +#include <QtGui/QVBoxLayout> +#include <QtCore/QModelIndex> +#include <QtCore/QDebug> + +namespace Debugger { +namespace Internal { + +/*! + \class Debugger::Internal::MemoryView + \brief Base class for memory view tool windows + + Small tool-window that stays on top and displays a chunk of memory + based on the widget provided by the Bin editor plugin. + + Provides static functionality for handling a Bin Editor Widget + (soft dependency) via QMetaObject invocation. + + \sa Debugger::Internal::MemoryAgent, Debugger::DebuggerEngine +*/ + +MemoryView::MemoryView(QWidget *binEditor, QWidget *parent) : + QWidget(parent, Qt::Tool|Qt::WindowStaysOnTopHint), m_binEditor(binEditor) +{ + setAttribute(Qt::WA_DeleteOnClose); + QVBoxLayout *layout = new QVBoxLayout(this); + layout->addWidget(binEditor); + setMinimumWidth(400); +} + +void MemoryView::setBinEditorRange(QWidget *w, quint64 address, int range, int blockSize) +{ + QMetaObject::invokeMethod(w, "setSizes", + Q_ARG(quint64, address), Q_ARG(int, range), Q_ARG(int, blockSize)); +} + +void MemoryView::setBinEditorReadOnly(QWidget *w, bool readOnly) +{ + w->setProperty("readOnly", QVariant(readOnly)); +} + +void MemoryView::setBinEditorNewWindowRequestAllowed(QWidget *w, bool a) +{ + w->setProperty("newWindowRequestAllowed", QVariant(a)); +} + +void MemoryView::setBinEditorMarkup(QWidget *w, const QList<MemoryMarkup> &ml) +{ + // Convert into bin editor markup and set. + QList<BINEditor::Markup> bml; + foreach (const MemoryMarkup &m, ml) + bml.push_back(BINEditor::Markup(m.address, m.length, m.color, m.toolTip)); + w->setProperty("markup", qVariantFromValue(bml)); +} + +void MemoryView::binEditorUpdateContents(QWidget *w) +{ + QMetaObject::invokeMethod(w, "updateContents"); +} + +void MemoryView::binEditorSetCursorPosition(QWidget *w, int p) +{ + QMetaObject::invokeMethod(w, "setCursorPosition", Q_ARG(int, p)); +} + +void MemoryView::binEditorAddData(QWidget *w, quint64 addr, const QByteArray &ba) +{ + QMetaObject::invokeMethod(w, "addData", + Q_ARG(quint64, addr / MemoryAgent::BinBlockSize), + Q_ARG(QByteArray, ba)); +} + +void MemoryView::setAddress(quint64 a) +{ + setBinEditorRange(m_binEditor, a, MemoryAgent::DataRange, MemoryAgent::BinBlockSize); +} + +void MemoryView::updateContents() +{ + binEditorUpdateContents(m_binEditor); +} + +void MemoryView::setMarkup(const QList<MemoryMarkup> &m) +{ + MemoryView::setBinEditorMarkup(m_binEditor, m); +} + +/*! + \class Debugger::Internal::RegisterMemoryView + \brief Memory view that shows the memory around the contents of a register + (such as stack pointer, program counter), + tracking changes of the register value. + + Connects to Debugger::Internal::RegisterHandler to listen for changes + of the register value. + + \note Some registers might switch to 0 (for example, 'rsi','rbp' + while stepping out of a function with parameters). + This must be handled gracefully. + + \sa Debugger::Internal::RegisterHandler, Debugger::Internal::RegisterWindow + \sa Debugger::Internal::MemoryAgent, Debugger::DebuggerEngine +*/ + +RegisterMemoryView::RegisterMemoryView(QWidget *binEditor, QWidget *parent) : + MemoryView(binEditor, parent), + m_registerIndex(0), m_registerAddress(0) +{ +} + +void RegisterMemoryView::slotRegisterSet(const QModelIndex &index) +{ + if (m_registerIndex != index.row()) + return; + const QVariant newAddressV = index.data(Qt::EditRole); + if (newAddressV.type() == QVariant::ULongLong) + setRegisterAddress(newAddressV.toULongLong()); +} + +QString RegisterMemoryView::title(const QString ®isterName, quint64 a) +{ + return tr("Memory at Register '%1' (0x%2)").arg(registerName).arg(a, 0, 16); +} + +void RegisterMemoryView::setRegisterAddress(quint64 v) +{ + if (v == m_registerAddress) { + updateContents(); + return; + } + m_registerAddress = v; + setAddress(v); + setWindowTitle(title(m_registerName, v)); + if (v) + setMarkup(registerMarkup(v, m_registerName)); +} + +QList<MemoryMarkup> RegisterMemoryView::registerMarkup(quint64 a, const QString &name) +{ + QList<MemoryMarkup> result; + result.push_back(MemoryMarkup(a, 1, QColor(Qt::blue).lighter(), + tr("Register '%1'").arg(name))); + return result; +} + +void RegisterMemoryView::init(RegisterHandler *h, int registerIndex) +{ + m_registerIndex = registerIndex; + m_registerName = QString::fromAscii(h->registerAt(registerIndex).name); + // Known issue: CDB might reset the model by changing the special + // registers it reports. + connect(h, SIGNAL(modelReset()), this, SLOT(close())); + connect(h, SIGNAL(registerSet(QModelIndex)), + this, SLOT(slotRegisterSet(QModelIndex))); + setRegisterAddress(h->registerAt(m_registerIndex).editValue().toULongLong()); +} + +} // namespace Internal +} // namespace Debugger |