From f76da43b05c0a01c2b2defbdc44a0e6f8ba4105f Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Thu, 4 Aug 2011 14:25:38 +0200
Subject: [PATCH] Debugger: Replace virtuals by capability flags.

Change-Id: If09efd21dc44e356eb575bb6170356fdbd409b39
Reviewed-on: http://codereview.qt.nokia.com/2625
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: hjk <qthjk@ovi.com>
---
 src/plugins/debugger/cdb/cdbengine.cpp    |  7 +------
 src/plugins/debugger/cdb/cdbengine.h      |  1 -
 src/plugins/debugger/debuggerconstants.h  | 14 ++++++++------
 src/plugins/debugger/debuggerengine.cpp   | 10 ----------
 src/plugins/debugger/debuggerengine.h     |  2 --
 src/plugins/debugger/gdb/gdbengine.cpp    |  5 +----
 src/plugins/debugger/gdb/gdbengine.h      |  1 -
 src/plugins/debugger/qml/qmlcppengine.cpp | 20 +++++++++-----------
 src/plugins/debugger/qml/qmlcppengine.h   |  2 --
 src/plugins/debugger/qml/qmlengine.cpp    |  7 +------
 src/plugins/debugger/qml/qmlengine.h      |  1 -
 src/plugins/debugger/watchhandler.cpp     |  2 +-
 src/plugins/debugger/watchwindow.cpp      |  6 +++---
 13 files changed, 24 insertions(+), 54 deletions(-)

diff --git a/src/plugins/debugger/cdb/cdbengine.cpp b/src/plugins/debugger/cdb/cdbengine.cpp
index 2eefdb7c1f2..7daf735da24 100644
--- a/src/plugins/debugger/cdb/cdbengine.cpp
+++ b/src/plugins/debugger/cdb/cdbengine.cpp
@@ -1074,7 +1074,7 @@ void CdbEngine::updateLocalVariable(const QByteArray &iname)
 unsigned CdbEngine::debuggerCapabilities() const
 {
     return DisassemblerCapability | RegisterCapability | ShowMemoryCapability
-           |WatchpointByAddressCapability|JumpToLineCapability|AddWatcherCapability
+           |WatchpointByAddressCapability|JumpToLineCapability|AddWatcherCapability|WatchWidgetsCapability
            |ReloadModuleCapability
            |BreakOnThrowAndCatchCapability // Sort-of: Can break on throw().
            |BreakConditionCapability|TracePointCapability
@@ -1083,11 +1083,6 @@ unsigned CdbEngine::debuggerCapabilities() const
            |RunToLineCapability;
 }
 
-bool CdbEngine::canWatchWidgets() const
-{
-    return true;
-}
-
 void CdbEngine::executeStep()
 {
     if (!m_operateByInstruction)
diff --git a/src/plugins/debugger/cdb/cdbengine.h b/src/plugins/debugger/cdb/cdbengine.h
index 27a4e7b2b87..9c21dd4b0a8 100644
--- a/src/plugins/debugger/cdb/cdbengine.h
+++ b/src/plugins/debugger/cdb/cdbengine.h
@@ -99,7 +99,6 @@ public:
     virtual void updateWatchData(const WatchData &data,
                                  const WatchUpdateFlags & flags = WatchUpdateFlags());
     virtual unsigned debuggerCapabilities() const;
-    virtual bool canWatchWidgets() const;
     virtual void watchPoint(const QPoint &);
     virtual void setRegisterValue(int regnr, const QString &value);
 
diff --git a/src/plugins/debugger/debuggerconstants.h b/src/plugins/debugger/debuggerconstants.h
index c14c6822796..35ae2fb8f83 100644
--- a/src/plugins/debugger/debuggerconstants.h
+++ b/src/plugins/debugger/debuggerconstants.h
@@ -148,12 +148,14 @@ enum DebuggerCapabilities
     ReturnFromFunctionCapability = 0x2000,
     CreateFullBacktraceCapability = 0x4000,
     AddWatcherCapability = 0x8000,
-    WatchpointByAddressCapability = 0x10000,
-    WatchpointByExpressionCapability = 0x20000,
-    ShowModuleSymbolsCapability = 0x40000,
-    CatchCapability = 0x80000, //!< fork, vfork, syscall
-    OperateByInstructionCapability = 0x100000,
-    RunToLineCapability = 0x200000,
+    AddWatcherWhileRunningCapability = 0x10000,
+    WatchWidgetsCapability = 0x20000,
+    WatchpointByAddressCapability = 0x40000,
+    WatchpointByExpressionCapability = 0x80000,
+    ShowModuleSymbolsCapability = 0x100000,
+    CatchCapability = 0x200000, //!< fork, vfork, syscall
+    OperateByInstructionCapability = 0x400000,
+    RunToLineCapability = 0x800000,
     AllDebuggerCapabilities = 0xFFFFFFFF
 };
 
diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp
index 15f86c2ac14..7065a3e1e5a 100644
--- a/src/plugins/debugger/debuggerengine.cpp
+++ b/src/plugins/debugger/debuggerengine.cpp
@@ -1298,16 +1298,6 @@ unsigned DebuggerEngine::debuggerCapabilities() const
     return 0;
 }
 
-bool DebuggerEngine::canWatchWidgets() const
-{
-    return false;
-}
-
-bool DebuggerEngine::acceptsWatchesWhileRunning() const
-{
-    return false;
-}
-
 bool DebuggerEngine::isSynchronous() const
 {
     return false;
diff --git a/src/plugins/debugger/debuggerengine.h b/src/plugins/debugger/debuggerengine.h
index 7fabfd253d9..d20bb421bf3 100644
--- a/src/plugins/debugger/debuggerengine.h
+++ b/src/plugins/debugger/debuggerengine.h
@@ -193,8 +193,6 @@ public:
     virtual void setRegisterValue(int regnr, const QString &value);
     virtual void addOptionPages(QList<Core::IOptionsPage*> *) const;
     virtual unsigned debuggerCapabilities() const;
-    virtual bool canWatchWidgets() const;
-    virtual bool acceptsWatchesWhileRunning() const;
 
     virtual bool isSynchronous() const;
     virtual QByteArray qtNamespace() const;
diff --git a/src/plugins/debugger/gdb/gdbengine.cpp b/src/plugins/debugger/gdb/gdbengine.cpp
index 0f4169cf545..1f3737737a8 100644
--- a/src/plugins/debugger/gdb/gdbengine.cpp
+++ b/src/plugins/debugger/gdb/gdbengine.cpp
@@ -1999,6 +1999,7 @@ unsigned GdbEngine::debuggerCapabilities() const
         | WatchpointByAddressCapability
         | WatchpointByExpressionCapability
         | AddWatcherCapability
+        | WatchWidgetsCapability
         | ShowModuleSymbolsCapability
         | CatchCapability
         | OperateByInstructionCapability
@@ -2014,10 +2015,6 @@ unsigned GdbEngine::debuggerCapabilities() const
     return caps | SnapshotCapability;
 }
 
-bool GdbEngine::canWatchWidgets() const
-{
-    return true;
-}
 
 void GdbEngine::continueInferiorInternal()
 {
diff --git a/src/plugins/debugger/gdb/gdbengine.h b/src/plugins/debugger/gdb/gdbengine.h
index 99d869e3884..6dc50b4df80 100644
--- a/src/plugins/debugger/gdb/gdbengine.h
+++ b/src/plugins/debugger/gdb/gdbengine.h
@@ -238,7 +238,6 @@ private: ////////// General Interface //////////
     virtual void runEngine();
 
     virtual unsigned debuggerCapabilities() const;
-    virtual bool canWatchWidgets() const;
     virtual void detachDebugger();
     virtual void shutdownEngine();
     virtual void shutdownInferior();
diff --git a/src/plugins/debugger/qml/qmlcppengine.cpp b/src/plugins/debugger/qml/qmlcppengine.cpp
index a05a7fd35f3..963df0f16af 100644
--- a/src/plugins/debugger/qml/qmlcppengine.cpp
+++ b/src/plugins/debugger/qml/qmlcppengine.cpp
@@ -252,17 +252,15 @@ void QmlCppEngine::setRegisterValue(int regnr, const QString &value)
 unsigned QmlCppEngine::debuggerCapabilities() const
 {
     // ### this could also be an OR of both engines' capabilities
-    return d->m_cppEngine->debuggerCapabilities();
-}
-
-bool QmlCppEngine::canWatchWidgets() const
-{
-    return d->m_activeEngine->canWatchWidgets();
-}
-
-bool QmlCppEngine::acceptsWatchesWhileRunning() const
-{
-    return d->m_activeEngine->acceptsWatchesWhileRunning();
+    unsigned result = d->m_cppEngine->debuggerCapabilities();
+    if (d->m_activeEngine != d->m_cppEngine) {
+        const unsigned qmlCapabilities = d->m_qmlEngine->debuggerCapabilities();
+        if (qmlCapabilities & AddWatcherWhileRunningCapability)
+            result |= AddWatcherWhileRunningCapability;
+        if (!(qmlCapabilities & WatchWidgetsCapability))
+            result &= ~WatchWidgetsCapability;
+    }
+    return result;
 }
 
 bool QmlCppEngine::isSynchronous() const
diff --git a/src/plugins/debugger/qml/qmlcppengine.h b/src/plugins/debugger/qml/qmlcppengine.h
index 322e4a9d447..80bf87e52aa 100644
--- a/src/plugins/debugger/qml/qmlcppengine.h
+++ b/src/plugins/debugger/qml/qmlcppengine.h
@@ -74,8 +74,6 @@ public:
 
     void setRegisterValue(int regnr, const QString &value);
     unsigned debuggerCapabilities() const;
-    virtual bool canWatchWidgets() const;
-    virtual bool acceptsWatchesWhileRunning() const;
 
     bool isSynchronous() const;
     QByteArray qtNamespace() const;
diff --git a/src/plugins/debugger/qml/qmlengine.cpp b/src/plugins/debugger/qml/qmlengine.cpp
index 7b7aa9e4b0b..06a880e3655 100644
--- a/src/plugins/debugger/qml/qmlengine.cpp
+++ b/src/plugins/debugger/qml/qmlengine.cpp
@@ -321,11 +321,6 @@ void QmlEngine::showMessage(const QString &msg, int channel, int timeout) const
     DebuggerEngine::showMessage(msg, channel, timeout);
 }
 
-bool QmlEngine::acceptsWatchesWhileRunning() const
-{
-    return true;
-}
-
 void QmlEngine::closeConnection()
 {
     disconnect(watchersModel(),SIGNAL(layoutChanged()),this,SLOT(synchronizeWatchers()));
@@ -645,7 +640,7 @@ void QmlEngine::synchronizeWatchers()
 
 unsigned QmlEngine::debuggerCapabilities() const
 {
-    return AddWatcherCapability;
+    return AddWatcherCapability|AddWatcherWhileRunningCapability;
     /*ReverseSteppingCapability | SnapshotCapability
         | AutoDerefPointersCapability | DisassemblerCapability
         | RegisterCapability | ShowMemoryCapability
diff --git a/src/plugins/debugger/qml/qmlengine.h b/src/plugins/debugger/qml/qmlengine.h
index 2658de726a8..ae96ad1d261 100644
--- a/src/plugins/debugger/qml/qmlengine.h
+++ b/src/plugins/debugger/qml/qmlengine.h
@@ -66,7 +66,6 @@ public:
     void showMessage(const QString &msg, int channel = LogDebug,
                      int timeout = -1) const;
     void filterApplicationMessage(const QString &msg, int channel);
-    virtual bool acceptsWatchesWhileRunning() const;
     QString toFileInProject(const QUrl &fileUrl);
     void inferiorSpontaneousStop();
 
diff --git a/src/plugins/debugger/watchhandler.cpp b/src/plugins/debugger/watchhandler.cpp
index 2624c790097..944cedc9e44 100644
--- a/src/plugins/debugger/watchhandler.cpp
+++ b/src/plugins/debugger/watchhandler.cpp
@@ -892,7 +892,7 @@ Qt::ItemFlags WatchModel::flags(const QModelIndex &idx) const
 
     // Disable editing if debuggee is positively running.
     const bool isRunning = engine() && engine()->state() == InferiorRunOk;
-    if (isRunning && engine() && !engine()->acceptsWatchesWhileRunning())
+    if (isRunning && engine() && !(engine()->debuggerCapabilities() & AddWatcherWhileRunningCapability))
         return notEditable;
 
     const WatchData &data = *watchItem(idx);
diff --git a/src/plugins/debugger/watchwindow.cpp b/src/plugins/debugger/watchwindow.cpp
index 8cf50608315..4d04ab1682f 100644
--- a/src/plugins/debugger/watchwindow.cpp
+++ b/src/plugins/debugger/watchwindow.cpp
@@ -716,7 +716,7 @@ void WatchWindow::contextMenuEvent(QContextMenuEvent *ev)
     const DebuggerState state = engine->state();
     const bool canInsertWatches = state == InferiorStopOk
         || state == InferiorUnrunnable
-        || (state == InferiorRunOk && engine->acceptsWatchesWhileRunning());
+        || (state == InferiorRunOk && (engineCapabilities & AddWatcherWhileRunningCapability));
 
     QMenu breakpointMenu;
     breakpointMenu.setTitle(tr("Add Data Breakpoint..."));
@@ -763,8 +763,8 @@ void WatchWindow::contextMenuEvent(QContextMenuEvent *ev)
     QAction *actInsertNewWatchItem = menu.addAction(tr("Insert New Evaluated Expression"));
     actInsertNewWatchItem->setEnabled(canHandleWatches && canInsertWatches);
     QAction *actSelectWidgetToWatch = menu.addAction(tr("Select Widget to Watch"));
-    actSelectWidgetToWatch->setEnabled(canHandleWatches && (engine->canWatchWidgets()));
-
+    actSelectWidgetToWatch->setEnabled(canHandleWatches
+                                       && (engine->debuggerCapabilities() & WatchWidgetsCapability));
     menu.addSeparator();
 
     QAction *actWatchExpression = new QAction(addWatchActionText(exp), &menu);
-- 
GitLab