From 7cd32722829533e8114826b78f8b4433aa583fa6 Mon Sep 17 00:00:00 2001
From: hjk <qtc-committer@nokia.com>
Date: Wed, 8 Dec 2010 14:08:35 +0100
Subject: [PATCH] debugger: make memory view updatable

Task-number: QTCREATORBUG-3242
---
 src/plugins/debugger/debuggerconstants.h              |  1 +
 src/plugins/debugger/debuggercore.h                   |  1 +
 src/plugins/debugger/debuggerplugin.cpp               | 11 +++++++++++
 src/plugins/debugger/gdb/gdbengine.cpp                |  1 +
 src/plugins/debugger/memoryagent.cpp                  |  3 ++-
 .../manual/gdbdebugger/simple/simple_gdbtest_app.cpp  |  8 ++++++++
 6 files changed, 24 insertions(+), 1 deletion(-)

diff --git a/src/plugins/debugger/debuggerconstants.h b/src/plugins/debugger/debuggerconstants.h
index ec79f488631..3f734bd1668 100644
--- a/src/plugins/debugger/debuggerconstants.h
+++ b/src/plugins/debugger/debuggerconstants.h
@@ -84,6 +84,7 @@ namespace Internal {
 
 const char * const OPENED_BY_DEBUGGER         = "OpenedByDebugger";
 const char * const OPENED_WITH_DISASSEMBLY    = "DisassemblerView";
+const char * const OPENED_WITH_MEMORY         = "MemoryView";
 
 const char * const DEBUGMODE            = "Debugger.DebugMode";
 const char * const DEBUG                = "Debugger.Debug";
diff --git a/src/plugins/debugger/debuggercore.h b/src/plugins/debugger/debuggercore.h
index 95820d89912..0fa30f388e4 100644
--- a/src/plugins/debugger/debuggercore.h
+++ b/src/plugins/debugger/debuggercore.h
@@ -114,6 +114,7 @@ public:
     virtual void showModuleSymbols(const QString &moduleName,
         const QVector<Symbol> &symbols) = 0;
     virtual void openMemoryEditor() = 0;
+    virtual void updateMemoryEditors() = 0;
     virtual void languagesChanged() = 0;
 
     virtual Utils::SavedAction *action(int code) const = 0;
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index 8980634d1de..9063dd02ce3 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -1027,6 +1027,7 @@ public slots:
     void languagesChanged();
     void showStatusMessage(const QString &msg, int timeout = -1);
     void openMemoryEditor();
+    void updateMemoryEditors();
 
     const CPlusPlus::Snapshot &cppCodeModelSnapshot() const;
 
@@ -2433,6 +2434,16 @@ void DebuggerPluginPrivate::openMemoryEditor()
         currentEngine()->openMemoryView(dialog.address());
 }
 
+void DebuggerPluginPrivate::updateMemoryEditors()
+{
+    EditorManager *editorManager = EditorManager::instance();
+    QTC_ASSERT(editorManager, return);
+    foreach (IEditor *editor, editorManager->openedEditors()) {
+        if (editor->property(Constants::OPENED_WITH_MEMORY).toBool())
+            QMetaObject::invokeMethod(editor->widget(), "updateContents");
+    }
+}
+
 void DebuggerPluginPrivate::coreShutdown()
 {
     m_shuttingDown = true;
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 1e6e1691fb2..63c858a8b54 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -3530,6 +3530,7 @@ void GdbEngine::updateLocals(const QVariant &cookie)
         updateLocalsPython(false, QByteArray());
     else
         updateLocalsClassic(cookie);
+    debuggerCore()->updateMemoryEditors();
 }
 
 
diff --git a/src/plugins/debugger/memoryagent.cpp b/src/plugins/debugger/memoryagent.cpp
index 139fe3879dd..8577357b970 100644
--- a/src/plugins/debugger/memoryagent.cpp
+++ b/src/plugins/debugger/memoryagent.cpp
@@ -87,6 +87,8 @@ void MemoryViewAgent::createBinEditor(quint64 addr)
         Core::Constants::K_DEFAULT_BINARY_EDITOR_ID,
         &titlePattern);
     if (editor) {
+        editor->setProperty(Debugger::Constants::OPENED_BY_DEBUGGER, true);
+        editor->setProperty(Debugger::Constants::OPENED_WITH_MEMORY, true);
         connect(editor->widget(),
             SIGNAL(lazyDataRequested(Core::IEditor *, quint64,bool)),
             SLOT(fetchLazyData(Core::IEditor *, quint64,bool)));
@@ -103,7 +105,6 @@ void MemoryViewAgent::createBinEditor(quint64 addr)
             SIGNAL(endOfFileRequested(Core::IEditor *)),
             SLOT(handleEndOfFileRequested(Core::IEditor*)));
         m_editors << editor;
-        editorManager->activateEditor(editor);
         QMetaObject::invokeMethod(editor->widget(), "setNewWindowRequestAllowed");
         QMetaObject::invokeMethod(editor->widget(), "setLazyData",
             Q_ARG(quint64, addr), Q_ARG(int, DataRange), Q_ARG(int, BinBlockSize));
diff --git a/tests/manual/gdbdebugger/simple/simple_gdbtest_app.cpp b/tests/manual/gdbdebugger/simple/simple_gdbtest_app.cpp
index c22c5e943e1..a4b5ba91e91 100644
--- a/tests/manual/gdbdebugger/simple/simple_gdbtest_app.cpp
+++ b/tests/manual/gdbdebugger/simple/simple_gdbtest_app.cpp
@@ -1859,6 +1859,13 @@ public:
     Foo *f;
 };
 
+void testMemoryView()
+{
+    int a[20];
+    for (int i = 0; i != 20; ++i)
+        a[i] = i;
+}
+
 void testUninitialized()
 {
     QString s;
@@ -2111,6 +2118,7 @@ void testQSettings()
 
 int main(int argc, char *argv[])
 {
+    testMemoryView();
     //testQSettings();
     //testWCout0();
     //testWCout();
-- 
GitLab