From 2bdf10ce1077fc21f6a3835de1f103f87c75eebf Mon Sep 17 00:00:00 2001 From: hjk <qtc-committer@nokia.com> Date: Fri, 25 Jun 2010 16:06:48 +0200 Subject: [PATCH] debugger: reenable disabling of breakpoints in editor context menu --- src/plugins/debugger/breakhandler.cpp | 75 ++++++--------- src/plugins/debugger/breakhandler.h | 2 + src/plugins/debugger/breakwindow.cpp | 16 ---- src/plugins/debugger/breakwindow.h | 9 +- src/plugins/debugger/debuggerconstants.h | 4 +- src/plugins/debugger/debuggerengine.cpp | 117 +++++++++++++++++++++-- src/plugins/debugger/debuggerplugin.cpp | 77 +-------------- 7 files changed, 146 insertions(+), 154 deletions(-) diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp index 3492fbbdd8c..c9b63e8bfce 100644 --- a/src/plugins/debugger/breakhandler.cpp +++ b/src/plugins/debugger/breakhandler.cpp @@ -572,15 +572,6 @@ QVariant BreakHandler::data(const QModelIndex &mi, int role) const static const QString empty = QString(QLatin1Char('-')); switch (role) { - case RequestFindSimilarBreakpointRole: { - // Complain if data/setData are not used alternately. - QTC_ASSERT(m_lastFoundQueried, return false); - QVariant value = QVariant::fromValue(m_lastFound); - m_lastFoundQueried = false; - m_lastFound = 0; // Reset for "safety". - return value; - } - case CurrentThreadIdRole: QTC_ASSERT(m_engine, return QVariant()); return m_engine->threadsHandler()->currentThreadId(); @@ -714,16 +705,6 @@ Qt::ItemFlags BreakHandler::flags(const QModelIndex &index) const bool BreakHandler::setData(const QModelIndex &index, const QVariant &value, int role) { switch (role) { - case RequestFindSimilarBreakpointRole: { - // Complain if data/setData are not used alternately. - QTC_ASSERT(!m_lastFoundQueried, return false); - BreakpointData *needle = value.value<BreakpointData *>(); - QTC_ASSERT(needle, return false); - m_lastFound = findSimilarBreakpoint(needle); - m_lastFoundQueried = true; - return true; - } - case RequestActivateBreakpointRole: { const BreakpointData *data = at(value.toInt()); QTC_ASSERT(data, return false); @@ -739,14 +720,6 @@ bool BreakHandler::setData(const QModelIndex &index, const QVariant &value, int return true; } - case RequestUpdateBreakpointRole: { - BreakpointData *data = value.value<BreakpointData *>(); - QTC_ASSERT(data, return false); - QTC_ASSERT(m_engine, return false); - m_engine->attemptBreakpointSynchronization(); - return true; - } - case RequestSynchronizeBreakpointsRole: QTC_ASSERT(m_engine, return false); m_engine->attemptBreakpointSynchronization(); @@ -884,14 +857,12 @@ void BreakHandler::removeBreakpoint(int index) return; removeBreakpointHelper(index); emit layoutChanged(); - //saveBreakpoints(); } void BreakHandler::removeBreakpoint(BreakpointData *data) { removeBreakpointHelper(m_bp.indexOf(data)); emit layoutChanged(); - //saveBreakpoints(); } void BreakHandler::toggleBreakpointEnabled(BreakpointData *data) @@ -905,7 +876,6 @@ void BreakHandler::toggleBreakpointEnabled(BreakpointData *data) m_enabled.removeAll(data); m_disabled.append(data); } - //saveBreakpoints(); updateMarkers(); } @@ -913,7 +883,7 @@ void BreakHandler::appendBreakpoint(BreakpointData *data) { append(data); emit layoutChanged(); - saveBreakpoints(); + saveBreakpoints(); // FIXME: remove? updateMarkers(); } @@ -922,27 +892,40 @@ void BreakHandler::removeAllBreakpoints() for (int index = size(); --index >= 0;) removeBreakpointHelper(index); emit layoutChanged(); - //saveBreakpoints(); updateMarkers(); } +BreakpointData *BreakHandler::findBreakpoint(const QString &fileName, int lineNumber) +{ + foreach (BreakpointData *data, m_bp) + if (data->isLocatedAt(fileName, lineNumber)) + return data; + return 0; +} + void BreakHandler::toggleBreakpoint(const QString &fileName, int lineNumber) { - for (int index = size(); --index >= 0;) { - BreakpointData *data = m_bp.at(index); - if (data->isLocatedAt(fileName, lineNumber)) { - removeBreakpointHelper(index); - emit layoutChanged(); - return; - } + BreakpointData *data = findBreakpoint(fileName, lineNumber); + if (data) { + removeBreakpoint(data); + } else { + data = new BreakpointData; + data->fileName = fileName; + data->lineNumber = QByteArray::number(lineNumber); + data->pending = true; + data->setMarkerFileName(fileName); + data->setMarkerLineNumber(lineNumber); + appendBreakpoint(data); + m_engine->attemptBreakpointSynchronization(); } - BreakpointData *data = new BreakpointData; - data->fileName = fileName; - data->lineNumber = QByteArray::number(lineNumber); - data->pending = true; - data->setMarkerFileName(fileName); - data->setMarkerLineNumber(lineNumber); - appendBreakpoint(data); +} + +void BreakHandler::toggleBreakpointEnabled(const QString &fileName, int lineNumber) +{ + BreakpointData *data = findBreakpoint(fileName, lineNumber); + QTC_ASSERT(data, return); + data->enabled = !data->enabled; + data->updateMarker(); m_engine->attemptBreakpointSynchronization(); } diff --git a/src/plugins/debugger/breakhandler.h b/src/plugins/debugger/breakhandler.h index 0bd7ec202ed..16a477eb785 100644 --- a/src/plugins/debugger/breakhandler.h +++ b/src/plugins/debugger/breakhandler.h @@ -88,6 +88,8 @@ public: void initializeFromTemplate(BreakHandler *other); void storeToTemplate(BreakHandler *other); void toggleBreakpoint(const QString &fileName, int lineNumber); + void toggleBreakpointEnabled(const QString &fileName, int lineNumber); + BreakpointData *findBreakpoint(const QString &fileName, int lineNumber); public slots: void appendBreakpoint(BreakpointData *data); diff --git a/src/plugins/debugger/breakwindow.cpp b/src/plugins/debugger/breakwindow.cpp index a510ff6ecac..222fa8f400c 100644 --- a/src/plugins/debugger/breakwindow.cpp +++ b/src/plugins/debugger/breakwindow.cpp @@ -411,22 +411,6 @@ void BreakWindow::rowActivated(const QModelIndex &index) setModelData(RequestActivateBreakpointRole, index.row()); } -BreakpointData *BreakWindow::findSimilarBreakpoint(const BreakpointData *needle0) -{ - BreakpointData *needle = const_cast<BreakpointData *>(needle0); - QVariant v = QVariant::fromValue<BreakpointData *>(needle); - setModelData(RequestFindSimilarBreakpointRole, v); - QTC_ASSERT(model(), return false); - v = model()->data(QModelIndex(), RequestFindSimilarBreakpointRole); - return v.value<BreakpointData *>(); -} - -void BreakWindow::updateBreakpoint(BreakpointData *data) -{ - QVariant v = QVariant::fromValue<BreakpointData *>(data); - setModelData(RequestUpdateBreakpointRole, v); -} - void BreakWindow::setModelData (int role, const QVariant &value, const QModelIndex &index) { diff --git a/src/plugins/debugger/breakwindow.h b/src/plugins/debugger/breakwindow.h index 92013a0dd00..1e7204ab6c6 100644 --- a/src/plugins/debugger/breakwindow.h +++ b/src/plugins/debugger/breakwindow.h @@ -45,17 +45,10 @@ public: explicit BreakWindow(QWidget *parent = 0); ~BreakWindow(); - BreakpointData *findSimilarBreakpoint(const BreakpointData *needle); - void updateBreakpoint(BreakpointData *data); - //void appendBreakpoint(BreakpointData *data); - //void removeBreakpoint(BreakpointData *data); - QVariant modelData(int role, int index); - -public slots: +private slots: void resizeColumnsToContents(); void setAlwaysResizeColumnsToContents(bool on); -private slots: void rowActivated(const QModelIndex &index); void setAlternatingRowColorsHelper(bool on) { setAlternatingRowColors(on); } void showAddressColumn(bool on); diff --git a/src/plugins/debugger/debuggerconstants.h b/src/plugins/debugger/debuggerconstants.h index 00f4d560012..68ab98a0fe0 100644 --- a/src/plugins/debugger/debuggerconstants.h +++ b/src/plugins/debugger/debuggerconstants.h @@ -194,9 +194,9 @@ enum ModelRoles RequestSynchronizeBreakpointsRole, RequestBreakByFunctionRole, RequestBreakByFunctionMainRole, - RequestFindSimilarBreakpointRole, - RequestUpdateBreakpointRole, RequestToggleBreakpointRole, + RequestToggleBreakpointEnabledRole, + RequestContextMenuRole, // Locals and Watchers LocalsINameRole, diff --git a/src/plugins/debugger/debuggerengine.cpp b/src/plugins/debugger/debuggerengine.cpp index d46c763142f..04fd03a42c2 100644 --- a/src/plugins/debugger/debuggerengine.cpp +++ b/src/plugins/debugger/debuggerengine.cpp @@ -72,6 +72,7 @@ #include <QtGui/QAbstractItemView> #include <QtGui/QStandardItemModel> #include <QtGui/QAction> +#include <QtGui/QMenu> #include <QtGui/QMessageBox> #include <QtGui/QPlainTextEdit> #include <QtGui/QPushButton> @@ -197,8 +198,10 @@ bool CommandHandler::setData(const QModelIndex &, const QVariant &value, int rol // ////////////////////////////////////////////////////////////////////// -class DebuggerEnginePrivate +class DebuggerEnginePrivate : public QObject { + Q_OBJECT + public: DebuggerEnginePrivate(DebuggerEngine *engine, const DebuggerStartParameters &sp) : m_engine(engine), @@ -217,6 +220,11 @@ public: m_disassemblerViewAgent(engine) {} +public slots: + void breakpointSetRemoveMarginActionTriggered(); + void breakpointEnableDisableMarginActionTriggered(); + void handleContextMenuRequest(const QVariant ¶meters); + public: DebuggerEngine *m_engine; // Not owned. DebuggerRunControl *m_runControl; // Not owned. @@ -238,6 +246,85 @@ public: DisassemblerViewAgent m_disassemblerViewAgent; }; +void DebuggerEnginePrivate::breakpointSetRemoveMarginActionTriggered() +{ + QAction *act = qobject_cast<QAction *>(sender()); + QTC_ASSERT(act, return); + QList<QVariant> list = act->data().toList(); + QTC_ASSERT(list.size() == 2, return); + const QString fileName = list.at(0).toString(); + const int lineNumber = list.at(1).toInt(); + m_breakHandler.toggleBreakpoint(fileName, lineNumber); +} + +void DebuggerEnginePrivate::breakpointEnableDisableMarginActionTriggered() +{ + QAction *act = qobject_cast<QAction *>(sender()); + QTC_ASSERT(act, return); + QList<QVariant> list = act->data().toList(); + QTC_ASSERT(list.size() == 2, return); + const QString fileName = list.at(0).toString(); + const int lineNumber = list.at(1).toInt(); + m_breakHandler.toggleBreakpointEnabled(fileName, lineNumber); +} + +void DebuggerEnginePrivate::handleContextMenuRequest(const QVariant ¶meters) +{ + const QList<QVariant> list = parameters.toList(); + QTC_ASSERT(list.size() == 3, return); + TextEditor::ITextEditor *editor = + (TextEditor::ITextEditor *)(list.at(0).value<quint64>()); + int lineNumber = list.at(1).toInt(); + QMenu *menu = (QMenu *)(list.at(2).value<quint64>()); + + BreakpointData *data = 0; + QString position; + QString fileName; + if (editor->property("DisassemblerView").toBool()) { + fileName = editor->file()->fileName(); + QString line = editor->contents() + .section('\n', lineNumber - 1, lineNumber - 1); + position = _("*") + fileName; + BreakpointData needle; + needle.bpAddress = line.left(line.indexOf(QLatin1Char(' '))).toLatin1(); + needle.bpLineNumber = "-1"; + data = m_breakHandler.findSimilarBreakpoint(&needle); + } else { + fileName = editor->file()->fileName(); + position = fileName + QString(":%1").arg(lineNumber); + data = m_breakHandler.findBreakpoint(fileName, lineNumber); + } + + QList<QVariant> args; + args.append(fileName); + args.append(lineNumber); + + if (data) { + // existing breakpoint + QAction *act = new QAction(tr("Remove Breakpoint"), menu); + act->setData(args); + connect(act, SIGNAL(triggered()), + this, SLOT(breakpointSetRemoveMarginActionTriggered())); + menu->addAction(act); + + QAction *act2; + if (data->enabled) + act2 = new QAction(tr("Disable Breakpoint"), menu); + else + act2 = new QAction(tr("Enable Breakpoint"), menu); + act2->setData(args); + connect(act2, SIGNAL(triggered()), + this, SLOT(breakpointEnableDisableMarginActionTriggered())); + menu->addAction(act2); + } else { + // non-existing + QAction *act = new QAction(tr("Set Breakpoint"), menu); + act->setData(args); + connect(act, SIGNAL(triggered()), + this, SLOT(breakpointSetRemoveMarginActionTriggered())); + menu->addAction(act); + } +} ////////////////////////////////////////////////////////////////////// // @@ -340,25 +427,33 @@ void DebuggerEngine::handleCommand(int role, const QVariant &value) executeDebuggerCommand(value.toString()); break; + case RequestToggleBreakpointRole: { + QList<QVariant> list = value.toList(); + QTC_ASSERT(list.size() == 2, break); + const QString fileName = list.at(0).toString(); + const int lineNumber = list.at(1).toInt(); + breakHandler()->toggleBreakpoint(fileName, lineNumber); + break; + } + case RequestToolTipByExpressionRole: { QList<QVariant> list = value.toList(); QTC_ASSERT(list.size() == 3, break); - setToolTipExpression(list.at(0).value<QPoint>(), - (TextEditor::ITextEditor *)(list.at(1).value<quint64>()), - list.at(2).toInt()); // Eeks. + QPoint point = list.at(0).value<QPoint>(); + TextEditor::ITextEditor *editor = // Eeks. + (TextEditor::ITextEditor *)(list.at(1).value<quint64>()); + int pos = list.at(2).toInt(); + setToolTipExpression(point, editor, pos); break; } - case RequestToggleBreakpointRole: { + case RequestContextMenuRole: { QList<QVariant> list = value.toList(); - QTC_ASSERT(list.size() == 2, break); - const QString fileName = list.at(0).toString(); - const int lineNumber = list.at(1).toInt(); - breakHandler()->toggleBreakpoint(fileName, lineNumber); + QTC_ASSERT(list.size() == 3, break); + d->handleContextMenuRequest(list); break; } } - } void DebuggerEngine::showModuleSymbols @@ -960,3 +1055,5 @@ bool DebuggerEngine::isReverseDebugging() const } // namespace Internal } // namespace Debugger + +#include "debuggerengine.moc" diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index fd524af5582..c57a3dae516 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -815,8 +815,6 @@ public slots: void activateDebugMode(); void toggleBreakpoint(); void toggleBreakpoint(const QString &fileName, int lineNumber); - void breakpointSetRemoveMarginActionTriggered(); - void breakpointEnableDisableMarginActionTriggered(); void onModeChanged(Core::IMode *mode); void showSettingsDialog(); @@ -1785,51 +1783,11 @@ void DebuggerPluginPrivate::requestContextMenu(TextEditor::ITextEditor *editor, if (!isDebuggable(editor)) return; - BreakpointData *data = 0; - QString position; - if (editor->property("DisassemblerView").toBool()) { - QString fileName = editor->file()->fileName(); - QString line = editor->contents() - .section('\n', lineNumber - 1, lineNumber - 1); - position = _("*") + fileName; - BreakpointData needle; - needle.bpAddress = line.left(line.indexOf(QLatin1Char(' '))).toLatin1(); - needle.bpLineNumber = "-1"; - data = m_breakWindow->findSimilarBreakpoint(&needle); - } else { - QString fileName = editor->file()->fileName(); - position = fileName + QString(":%1").arg(lineNumber); - BreakpointData needle; - needle.bpFileName = fileName; - needle.bpLineNumber = QByteArray::number(lineNumber); - data = m_breakWindow->findSimilarBreakpoint(&needle); - } - - if (data) { - // existing breakpoint - QAction *act = new QAction(tr("Remove Breakpoint"), menu); - act->setData(position); - connect(act, SIGNAL(triggered()), - this, SLOT(breakpointSetRemoveMarginActionTriggered())); - menu->addAction(act); - - QAction *act2; - if (data->enabled) - act2 = new QAction(tr("Disable Breakpoint"), menu); - else - act2 = new QAction(tr("Enable Breakpoint"), menu); - act2->setData(position); - connect(act2, SIGNAL(triggered()), - this, SLOT(breakpointEnableDisableMarginActionTriggered())); - menu->addAction(act2); - } else { - // non-existing - QAction *act = new QAction(tr("Set Breakpoint"), menu); - act->setData(position); - connect(act, SIGNAL(triggered()), - this, SLOT(breakpointSetRemoveMarginActionTriggered())); - menu->addAction(act); - } + QList<QVariant> list; + list.append(quint64(editor)); + list.append(lineNumber); + list.append(quint64(menu)); + notifyCurrentEngine(RequestContextMenuRole, list); } void DebuggerPluginPrivate::toggleBreakpoint() @@ -1849,31 +1807,6 @@ void DebuggerPluginPrivate::toggleBreakpoint(const QString &fileName, int lineNu notifyCurrentEngine(RequestToggleBreakpointRole, list); } -void DebuggerPluginPrivate::breakpointSetRemoveMarginActionTriggered() -{ - QAction *act = qobject_cast<QAction *>(sender()); - QTC_ASSERT(act, return); - QString str = act->data().toString(); - int pos = str.lastIndexOf(':'); - toggleBreakpoint(str.left(pos), str.mid(pos + 1).toInt()); -} - -void DebuggerPluginPrivate::breakpointEnableDisableMarginActionTriggered() -{ - QAction *act = qobject_cast<QAction *>(sender()); - QTC_ASSERT(act, return); - - QString str = act->data().toString(); - int pos = str.lastIndexOf(':'); - BreakpointData needle; - needle.bpFileName = str.left(pos); - needle.bpLineNumber = str.mid(pos + 1).toLatin1(); - BreakpointData *data = m_breakWindow->findSimilarBreakpoint(&needle); - QTC_ASSERT(data, return); - data->enabled = !data->enabled; - m_breakWindow->updateBreakpoint(data); -} - void DebuggerPluginPrivate::requestMark(ITextEditor *editor, int lineNumber) { if (isDebuggable(editor)) -- GitLab