summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhjk <qtc-committer@nokia.com>2010-06-25 16:06:48 +0200
committerhjk <qtc-committer@nokia.com>2010-06-25 17:38:25 +0200
commit2bdf10ce1077fc21f6a3835de1f103f87c75eebf (patch)
tree74bca238df772fdbc7380c17ae14aee81b03d339
parentf3d38de9132bfc2b120838abc007f97ca1312bd2 (diff)
downloadqt-creator-2bdf10ce1077fc21f6a3835de1f103f87c75eebf.tar.gz
debugger: reenable disabling of breakpoints in editor context menu
-rw-r--r--src/plugins/debugger/breakhandler.cpp75
-rw-r--r--src/plugins/debugger/breakhandler.h2
-rw-r--r--src/plugins/debugger/breakwindow.cpp16
-rw-r--r--src/plugins/debugger/breakwindow.h9
-rw-r--r--src/plugins/debugger/debuggerconstants.h4
-rw-r--r--src/plugins/debugger/debuggerengine.cpp117
-rw-r--r--src/plugins/debugger/debuggerplugin.cpp77
7 files changed, 146 insertions, 154 deletions
diff --git a/src/plugins/debugger/breakhandler.cpp b/src/plugins/debugger/breakhandler.cpp
index 3492fbbdd8..c9b63e8bfc 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 0bd7ec202e..16a477eb78 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 a510ff6eca..222fa8f400 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 92013a0dd0..1e7204ab6c 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 00f4d56001..68ab98a0fe 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 d46c763142..04fd03a42c 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 &parameters);
+
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 &parameters)
+{
+ 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 fd524af558..c57a3dae51 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))