diff --git a/src/plugins/debugger/debuggeragents.cpp b/src/plugins/debugger/debuggeragents.cpp index 4bc623496e8f1e8dbef55b25455c6d5b255bebb3..32cf9336cdfd7f8e2f274a999b62dbb2c56423bd 100644 --- a/src/plugins/debugger/debuggeragents.cpp +++ b/src/plugins/debugger/debuggeragents.cpp @@ -58,6 +58,8 @@ #include <limits.h> +using namespace Core; + namespace Debugger { namespace Internal { @@ -95,9 +97,9 @@ MemoryViewAgent::MemoryViewAgent(DebuggerEngine *engine, const QString &addr) MemoryViewAgent::~MemoryViewAgent() { - Core::EditorManager *editorManager = Core::EditorManager::instance(); - QList<Core::IEditor *> editors; - foreach (QPointer<Core::IEditor> editor, m_editors) + EditorManager *editorManager = EditorManager::instance(); + QList<IEditor *> editors; + foreach (QPointer<IEditor> editor, m_editors) if (editor) editors.append(editor.data()); editorManager->closeEditors(editors); @@ -105,25 +107,29 @@ MemoryViewAgent::~MemoryViewAgent() void MemoryViewAgent::createBinEditor(quint64 addr) { - Core::EditorManager *editorManager = Core::EditorManager::instance(); + EditorManager *editorManager = EditorManager::instance(); QString titlePattern = tr("Memory $"); - Core::IEditor *editor = editorManager->openEditorWithContents( + IEditor *editor = editorManager->openEditorWithContents( Core::Constants::K_DEFAULT_BINARY_EDITOR_ID, &titlePattern); if (editor) { - connect(editor->widget(), SIGNAL(lazyDataRequested(Core::IEditor *, quint64,bool)), - this, SLOT(fetchLazyData(Core::IEditor *, quint64,bool))); - connect(editor->widget(), SIGNAL(newWindowRequested(quint64)), - this, SLOT(createBinEditor(quint64))); connect(editor->widget(), - SIGNAL(newRangeRequested(Core::IEditor *, quint64)), this, + SIGNAL(lazyDataRequested(Core::IEditor *, quint64,bool)), + SLOT(fetchLazyData(Core::IEditor *, quint64,bool))); + connect(editor->widget(), + SIGNAL(newWindowRequested(quint64)), + SLOT(createBinEditor(quint64))); + connect(editor->widget(), + SIGNAL(newRangeRequested(Core::IEditor *, quint64)), SLOT(provideNewRange(Core::IEditor*,quint64))); - connect(editor->widget(), SIGNAL(startOfFileRequested(Core::IEditor *)), - this, SLOT(handleStartOfFileRequested(Core::IEditor*))); - connect(editor->widget(), SIGNAL(endOfFileRequested(Core::IEditor *)), - this, SLOT(handleEndOfFileRequested(Core::IEditor*))); + connect(editor->widget(), + SIGNAL(startOfFileRequested(Core::IEditor *)), + SLOT(handleStartOfFileRequested(Core::IEditor*))); + connect(editor->widget(), + SIGNAL(endOfFileRequested(Core::IEditor *)), + SLOT(handleEndOfFileRequested(Core::IEditor*))); m_editors << editor; - editorManager->activateEditor(editor, Core::EditorManager::NoModeSwitch); + editorManager->activateEditor(editor, EditorManager::NoModeSwitch); QMetaObject::invokeMethod(editor->widget(), "setNewWindowRequestAllowed"); QMetaObject::invokeMethod(editor->widget(), "setLazyData", Q_ARG(quint64, addr), Q_ARG(int, DataRange), Q_ARG(int, BinBlockSize)); @@ -136,7 +142,7 @@ void MemoryViewAgent::createBinEditor(quint64 addr) } } -void MemoryViewAgent::fetchLazyData(Core::IEditor *editor, quint64 block, bool sync) +void MemoryViewAgent::fetchLazyData(IEditor *editor, quint64 block, bool sync) { Q_UNUSED(sync); // FIXME: needed support for incremental searching m_engine->fetchMemory(this, editor, BinBlockSize * block, BinBlockSize); @@ -145,15 +151,15 @@ void MemoryViewAgent::fetchLazyData(Core::IEditor *editor, quint64 block, bool s void MemoryViewAgent::addLazyData(QObject *editorToken, quint64 addr, const QByteArray &ba) { - Core::IEditor *editor = qobject_cast<Core::IEditor *>(editorToken); + IEditor *editor = qobject_cast<IEditor *>(editorToken); if (editor && editor->widget()) { - Core::EditorManager::instance()->activateEditor(editor, Core::EditorManager::NoModeSwitch); + EditorManager::instance()->activateEditor(editor, EditorManager::NoModeSwitch); QMetaObject::invokeMethod(editor->widget(), "addLazyData", Q_ARG(quint64, addr / BinBlockSize), Q_ARG(QByteArray, ba)); } } -void MemoryViewAgent::provideNewRange(Core::IEditor *editor, quint64 address) +void MemoryViewAgent::provideNewRange(IEditor *editor, quint64 address) { QMetaObject::invokeMethod(editor->widget(), "setLazyData", Q_ARG(quint64, address), Q_ARG(int, DataRange), @@ -163,13 +169,13 @@ void MemoryViewAgent::provideNewRange(Core::IEditor *editor, quint64 address) // Since we are not dealing with files, we take these signals to mean // "move to start/end of range". This seems to make more sense than // jumping to the start or end of the address space, respectively. -void MemoryViewAgent::handleStartOfFileRequested(Core::IEditor *editor) +void MemoryViewAgent::handleStartOfFileRequested(IEditor *editor) { QMetaObject::invokeMethod(editor->widget(), "setCursorPosition", Q_ARG(int, 0)); } -void MemoryViewAgent::handleEndOfFileRequested(Core::IEditor *editor) +void MemoryViewAgent::handleEndOfFileRequested(IEditor *editor) { QMetaObject::invokeMethod(editor->widget(), "setCursorPosition", Q_ARG(int, DataRange - 1)); @@ -234,9 +240,9 @@ DisassemblerViewAgent::DisassemblerViewAgent(DebuggerEngine *engine) DisassemblerViewAgent::~DisassemblerViewAgent() { - Core::EditorManager *editorManager = Core::EditorManager::instance(); + EditorManager *editorManager = EditorManager::instance(); if (d->editor) - editorManager->closeEditors(QList<Core::IEditor *>() << d->editor); + editorManager->closeEditors(QList<IEditor *>() << d->editor); d->editor = 0; delete d->locationMark; d->locationMark = 0; @@ -301,7 +307,7 @@ void DisassemblerViewAgentPrivate::configureMimeType() TextEditor::PlainTextEditor *pe = qobject_cast<TextEditor::PlainTextEditor *>(editor->widget()); QTC_ASSERT(pe, return); - if (const Core::MimeType mtype = Core::ICore::instance()->mimeDatabase()->findByType(mimeType)) { + if (const MimeType mtype = ICore::instance()->mimeDatabase()->findByType(mimeType)) { pe->configure(mtype); } else { qWarning("Assembler mimetype '%s' not found.", qPrintable(mimeType)); @@ -343,7 +349,7 @@ void DisassemblerViewAgent::setContents(const QString &contents) d->configureMimeType(); } - editorManager->activateEditor(d->editor, Core::EditorManager::NoModeSwitch); + editorManager->activateEditor(d->editor, EditorManager::NoModeSwitch); plainTextEdit = qobject_cast<QPlainTextEdit *>(d->editor->widget()); if (plainTextEdit) { diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp index 8bcfa8bf1ccb5baa4e0eb8351fed738158a78bd7..8986c13a2d3e517613e8b4c3de0fc0d18507969a 100644 --- a/src/plugins/debugger/debuggerengine.cpp +++ b/src/plugins/debugger/debuggerengine.cpp @@ -543,6 +543,12 @@ void DebuggerEngine::handleCommand(int role, const QVariant &value) d->handleContextMenuRequest(list); break; } + + case RequestShowMemoryRole: { + qDebug() << "CREATING MEMORY VIEW"; + (void) MemoryViewAgent(this, "0x0"); + break; + } } } diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index e271bc3c8a7871f8d79ac0b649e2380e6f6ba050..c6a8f9e4be1152a60382c88fb1386dd495e39547 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -923,6 +923,7 @@ public slots: void enableReverseDebuggingTriggered(const QVariant &value); void languagesChanged(const Debugger::DebuggerLanguages &languages); void showStatusMessage(const QString &msg, int timeout = -1); + void openMemoryEditor(); DebuggerMainWindow *mainWindow() { return qobject_cast<DebuggerMainWindow*> @@ -2346,8 +2347,7 @@ void DebuggerPluginPrivate::gotoLocation(const QString &file, int line, bool set bool newEditor = false; ITextEditor *editor = BaseTextEditor::openEditorAt(file, line, 0, QString(), - Core::EditorManager::IgnoreNavigationHistory, - &newEditor); + EditorManager::IgnoreNavigationHistory, &newEditor); if (!editor) return; if (newEditor) @@ -2488,6 +2488,15 @@ void DebuggerPluginPrivate::scriptExpressionEntered(const QString &expression) notifyCurrentEngine(RequestExecuteCommandRole, expression); } +void DebuggerPluginPrivate::openMemoryEditor() +{ + AddressDialog dialog; + if (dialog.exec() != QDialog::Accepted) + return; + QTC_ASSERT(m_watchersWindow, return); + m_watchersWindow->model()->setData( + QModelIndex(), dialog.address(), RequestShowMemoryRole); +} /////////////////////////////////////////////////////////////////////// @@ -2704,6 +2713,8 @@ void DebuggerPlugin::extensionsInitialized() d->m_uiSwitcher->initialize(); d->m_watchersWindow->setVisible(false); d->m_returnWindow->setVisible(false); + connect(d->m_uiSwitcher, SIGNAL(memoryEditorRequested()), + d, SLOT(openMemoryEditor())); // time gdb -i mi -ex 'debuggerplugin.cpp:800' -ex r -ex q bin/qtcreator.bin const QByteArray env = qgetenv("QTC_DEBUGGER_TEST"); diff --git a/src/plugins/debugger/debuggeruiswitcher.cpp b/src/plugins/debugger/debuggeruiswitcher.cpp index 3a4ddc33f8f73b7b33e2e94b72781c46962c23e8..b31b81fcbda18cc220b4244d918040d46671618e 100644 --- a/src/plugins/debugger/debuggeruiswitcher.cpp +++ b/src/plugins/debugger/debuggeruiswitcher.cpp @@ -73,15 +73,11 @@ #include <QtCore/QSettings> namespace Debugger { -using namespace Debugger::Internal; - - +namespace Internal { DockWidgetEventFilter::DockWidgetEventFilter(QObject *parent) : QObject(parent) -{ - -} +{} bool DockWidgetEventFilter::eventFilter(QObject *obj, QEvent *event) { @@ -125,6 +121,7 @@ struct DebuggerUISwitcherPrivate DebuggerLanguages m_activeDebugLanguages; QAction *m_activateCppAction; QAction *m_activateQmlAction; + QAction *m_openMemoryEditorAction; bool m_qmlEnabled; Core::ActionContainer *m_viewsMenu; @@ -154,6 +151,7 @@ DebuggerUISwitcherPrivate::DebuggerUISwitcherPrivate(DebuggerUISwitcher *q) , m_activeDebugLanguages(AnyLanguage) , m_activateCppAction(0) , m_activateQmlAction(0) + , m_openMemoryEditorAction(0) , m_qmlEnabled(false) , m_viewsMenu(0) , m_debugMenu(0) @@ -164,8 +162,12 @@ DebuggerUISwitcherPrivate::DebuggerUISwitcherPrivate(DebuggerUISwitcher *q) DebuggerUISwitcher *DebuggerUISwitcherPrivate::m_instance = 0; -DebuggerUISwitcher::DebuggerUISwitcher(Core::BaseMode *mode, QObject* parent) : - QObject(parent), d(new DebuggerUISwitcherPrivate(this)) +} // namespace Internal + +using namespace Internal; + +DebuggerUISwitcher::DebuggerUISwitcher(Core::BaseMode *mode, QObject* parent) + : QObject(parent), d(new DebuggerUISwitcherPrivate(this)) { mode->setWidget(createContents(mode)); @@ -325,13 +327,13 @@ void DebuggerUISwitcher::onModeChanged(Core::IMode *mode) void DebuggerUISwitcher::hideInactiveWidgets() { + // Hide all the debugger windows if mode is different. + if (d->m_inDebugMode) + return; // Hide dock widgets manually in case they are floating. - if (!d->m_inDebugMode) { - // hide all the debugger windows if mode is different - foreach(QDockWidget *dockWidget, d->m_dockWidgets) { - if (dockWidget->isFloating()) - dockWidget->hide(); - } + foreach (QDockWidget *dockWidget, d->m_dockWidgets) { + if (dockWidget->isFloating()) + dockWidget->hide(); } } @@ -344,8 +346,17 @@ void DebuggerUISwitcher::createViewsMenuItems() d->m_debugMenu->addMenu(d->m_debuggerLanguageMenu, Core::Constants::G_DEFAULT_THREE); d->m_debuggerLanguageMenu->menu()->setTitle(tr("&Debug Languages")); + d->m_openMemoryEditorAction = new QAction(this); + d->m_openMemoryEditorAction->setText(tr("Memory...")); + connect(d->m_openMemoryEditorAction, SIGNAL(triggered()), + SIGNAL(memoryEditorRequested())); + // Add menu items - Core::Command *cmd = am->registerAction(d->m_mainWindow->menuSeparator1(), + Core::Command *cmd = 0; + cmd = am->registerAction(d->m_openMemoryEditorAction, + QLatin1String("Debugger.Views.OpenMemoryEditor"), globalcontext); + d->m_viewsMenu->addAction(cmd); + cmd = am->registerAction(d->m_mainWindow->menuSeparator1(), QLatin1String("Debugger.Views.Separator1"), globalcontext); d->m_viewsMenu->addAction(cmd); cmd = am->registerAction(d->m_mainWindow->toggleLockedAction(), @@ -742,7 +753,8 @@ void DebuggerUISwitcher::updateDockWidgetSettings() bool DebuggerUISwitcher::isQmlCppActive() const { - return (d->m_activeDebugLanguages & CppLanguage) && (d->m_activeDebugLanguages & QmlLanguage); + return (d->m_activeDebugLanguages & CppLanguage) + && (d->m_activeDebugLanguages & QmlLanguage); } bool DebuggerUISwitcher::isQmlActive() const diff --git a/src/plugins/debugger/debuggeruiswitcher.h b/src/plugins/debugger/debuggeruiswitcher.h index 377462251c5e26a6cd6c42db0eea834fa929dd90..63f7be6fa0024738e8facea113f2d29279b79582 100644 --- a/src/plugins/debugger/debuggeruiswitcher.h +++ b/src/plugins/debugger/debuggeruiswitcher.h @@ -61,10 +61,10 @@ namespace ProjectExplorer { } namespace Debugger { -struct DebuggerUISwitcherPrivate; namespace Internal { - class DebuggerMainWindow; +class DebuggerUISwitcherPrivate; +class DebuggerMainWindow; }; class DEBUGGER_EXPORT DebuggerUISwitcher : public QObject @@ -122,8 +122,8 @@ signals: // emit when user changes active languages from the menu. // Both UI and debugger startup are affected. void activeLanguagesChanged(Debugger::DebuggerLanguages activeLanguages); - void dockResetRequested(const Debugger::DebuggerLanguages &activeLanguages); + void memoryEditorRequested(); private slots: void updateUi(); @@ -156,7 +156,7 @@ private: QWidget *createContents(Core::BaseMode *mode); QWidget *createMainWindow(Core::BaseMode *mode); - DebuggerUISwitcherPrivate *d; + Internal::DebuggerUISwitcherPrivate *d; }; namespace Internal {