From 23f11f5fe725348d48851fcf116be08357985738 Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Thu, 16 Jul 2009 15:22:54 +0200
Subject: [PATCH] Add "Delete all breakpoints/Delete breakpoints by file".
 Reviewed-by: hjk <qtc-committer@nokia.com>

---
 src/plugins/debugger/breakwindow.cpp | 131 ++++++++++++++++++---------
 src/plugins/debugger/breakwindow.h   |   1 +
 2 files changed, 87 insertions(+), 45 deletions(-)

diff --git a/src/plugins/debugger/breakwindow.cpp b/src/plugins/debugger/breakwindow.cpp
index 399d5bda3c2..92d342983ac 100644
--- a/src/plugins/debugger/breakwindow.cpp
+++ b/src/plugins/debugger/breakwindow.cpp
@@ -125,6 +125,7 @@ void BreakWindow::resizeEvent(QResizeEvent *ev)
 void BreakWindow::contextMenuEvent(QContextMenuEvent *ev)
 {
     QMenu menu;
+    const QAbstractItemModel *itemModel = model();
     QItemSelectionModel *sm = selectionModel();
     QTC_ASSERT(sm, return);
     QModelIndexList si = sm->selectedIndexes();
@@ -133,72 +134,105 @@ void BreakWindow::contextMenuEvent(QContextMenuEvent *ev)
         si.append(indexUnderMouse.sibling(indexUnderMouse.row(), 0));
     si = normalizeIndexes(si);
 
-    QAction *act0 = new QAction(tr("Delete breakpoint", 0, si.size()), &menu);
-    act0->setEnabled(si.size() > 0);
+    const int rowCount = itemModel->rowCount();
+
+    QAction *deleteAction = new QAction(tr("Delete breakpoint", 0, si.size()), &menu);
+    deleteAction->setEnabled(si.size() > 0);
+
+    QAction *deleteAllAction = new QAction(tr("Delete all breakpoints", 0, si.size()), &menu);
+    deleteAllAction->setEnabled(si.size() > 0);
+
+    // Delete by file: Find indexes of breakpoints of the same file
+    QAction *deleteByFileAction = 0;
+    QList<int> breakPointsOfFile;
+    if (indexUnderMouse.isValid()) {
+        const QString file = itemModel->data(indexUnderMouse.sibling(indexUnderMouse.row(), 2)).toString();
+        if (!file.isEmpty()) {
+            for (int i = 0; i < rowCount; i++)
+                if (itemModel->data(itemModel->index(i, 2)).toString() == file)
+                    breakPointsOfFile.push_back(i);
+            if (breakPointsOfFile.size() > 1) {
+                deleteByFileAction = new QAction(tr("Delete breakpoints of \"%1\"").arg(file), &menu);
+                deleteByFileAction->setEnabled(true);
+            }
+        }
+    }
+    if (!deleteByFileAction) {
+        deleteByFileAction = new QAction(tr("Delete breakpoints of file"), &menu);
+        deleteByFileAction->setEnabled(false);
+    }
 
-    QAction *act1 = new QAction(tr("Adjust column widths to contents"), &menu);
+    QAction *adjustColumnAction = new QAction(tr("Adjust column widths to contents"), &menu);
 
-    QAction *act2 = new QAction(tr("Always adjust column widths to contents"), &menu);
-    act2->setCheckable(true);
-    act2->setChecked(m_alwaysResizeColumnsToContents);
+    QAction *alwaysAdjustAction = new QAction(tr("Always adjust column widths to contents"), &menu);
+    alwaysAdjustAction->setCheckable(true);
+    alwaysAdjustAction->setChecked(m_alwaysResizeColumnsToContents);
 
-    QAction *act3 = new QAction(tr("Edit condition...", 0, si.size()), &menu);
-    act3->setEnabled(si.size() > 0);
+    QAction *editConditionAction = new QAction(tr("Edit condition...", 0, si.size()), &menu);
+    editConditionAction->setEnabled(si.size() > 0);
 
-    QAction *act4 = new QAction(tr("Synchronize breakpoints"), &menu);
+    QAction *synchronizeAction = new QAction(tr("Synchronize breakpoints"), &menu);
 
     QModelIndex idx0 = (si.size() ? si.front() : QModelIndex());
     QModelIndex idx2 = idx0.sibling(idx0.row(), 2);
-    bool enabled = si.isEmpty() || model()->data(idx0, Qt::UserRole).toBool();
-    QString str5 = enabled ? tr("Disable breakpoint") : tr("Enable breakpoint");
-    QAction *act5 = new QAction(str5, &menu);
-    act5->setEnabled(si.size() > 0);
-
-    bool fullpath = si.isEmpty() || model()->data(idx2, Qt::UserRole).toBool();
-    QString str6 = fullpath ? tr("Use short path") : tr("Use full path");
-    QAction *act6 = new QAction(str6, &menu);
-    act6->setEnabled(si.size() > 0);
-
-    QAction *act7 = new QAction(this);
-    act7->setText(tr("Set Breakpoint at Function..."));
-    QAction *act8 = new QAction(this);
-    act8->setText(tr("Set Breakpoint at Function \"main\""));
-
-    menu.addAction(act0);
-    menu.addAction(act3);
-    menu.addAction(act5);
-    menu.addAction(act6);
+    bool enabled = si.isEmpty() || itemModel->data(idx0, Qt::UserRole).toBool();
+    const QString str5 = enabled ? tr("Disable breakpoint") : tr("Enable breakpoint");
+    QAction *toggleEnabledAction = new QAction(str5, &menu);
+    toggleEnabledAction->setEnabled(si.size() > 0);
+
+    const bool fullpath = si.isEmpty() || itemModel->data(idx2, Qt::UserRole).toBool();
+    const QString str6 = fullpath ? tr("Use short path") : tr("Use full path");
+    QAction *pathAction = new QAction(str6, &menu);
+    pathAction->setEnabled(si.size() > 0);
+
+    QAction *breakAtFunctionAction = new QAction(tr("Set Breakpoint at Function..."), this);
+    QAction *breakAtMainAction = new QAction(tr("Set Breakpoint at Function \"main\""), this);
+
+    menu.addAction(deleteAction);
+    menu.addAction(editConditionAction);
+    menu.addAction(toggleEnabledAction);
+    menu.addAction(pathAction);
+    menu.addSeparator();
+    menu.addAction(deleteAllAction);
+    menu.addAction(deleteByFileAction);
     menu.addSeparator();
-    menu.addAction(act1);
-    menu.addAction(act2);
-    menu.addAction(act4);
+    menu.addAction(adjustColumnAction);
+    menu.addAction(alwaysAdjustAction);
+    menu.addAction(synchronizeAction);
     menu.addSeparator();
-    menu.addAction(act7);
-    menu.addAction(act8);
+    menu.addAction(breakAtFunctionAction);
+    menu.addAction(breakAtMainAction);
     menu.addSeparator();
     menu.addAction(theDebuggerAction(SettingsDialog));
 
     QAction *act = menu.exec(ev->globalPos());
 
-    if (act == act0)
+    if (act == deleteAction) {
         deleteBreakpoints(si);
-    else if (act == act1)
+    } else if (act == deleteAllAction) {
+        QList<int> allRows;
+        for (int i = 0; i < rowCount; i++)
+            allRows.push_back(i);
+        deleteBreakpoints(allRows);
+    }  else if (act == deleteByFileAction)
+        deleteBreakpoints(breakPointsOfFile);
+    else if (act == adjustColumnAction)
         resizeColumnsToContents();
-    else if (act == act2)
+    else if (act == alwaysAdjustAction)
         setAlwaysResizeColumnsToContents(!m_alwaysResizeColumnsToContents);
-    else if (act == act3)
+    else if (act == editConditionAction)
         editConditions(si);
-    else if (act == act4)
+    else if (act == synchronizeAction)
         emit breakpointSynchronizationRequested();
-    else if (act == act5)
+    else if (act == toggleEnabledAction)
         setBreakpointsEnabled(si, !enabled);
-    else if (act == act6)
+    else if (act == pathAction)
         setBreakpointsFullPath(si, !enabled);
-    else if (act == act7) {
+    else if (act == breakAtFunctionAction) {
         BreakByFunctionDialog dlg(this);
         if (dlg.exec())
             emit breakByFunctionRequested(dlg.functionName());
-    } else if (act == act8)
+    } else if (act == breakAtMainAction)
         emit breakByFunctionMainRequested();
 }
 
@@ -224,14 +258,21 @@ void BreakWindow::deleteBreakpoints(const QModelIndexList &indexes)
     QList<int> list;
     foreach (const QModelIndex &idx, indexes)
         list.append(idx.row());
+    deleteBreakpoints(list);
+}
 
+void BreakWindow::deleteBreakpoints(QList<int> list)
+{
+    if (list.empty())
+        return;
+    const int firstRow = list.front();
     qSort(list.begin(), list.end());
     for (int i = list.size(); --i >= 0; )
         emit breakpointDeleted(i);
 
-    QModelIndex idx = indexes.front();
-    int row = qMax(idx.row(), model()->rowCount() - list.size() - 1);
-    setCurrentIndex(idx.sibling(row, 0));
+    const int row = qMax(firstRow, model()->rowCount() - list.size() - 1);
+    if (row >= 0)
+        setCurrentIndex(model()->index(row, 0));
 }
 
 void BreakWindow::editConditions(const QModelIndexList &list)
diff --git a/src/plugins/debugger/breakwindow.h b/src/plugins/debugger/breakwindow.h
index d445ba21971..9a7de197f72 100644
--- a/src/plugins/debugger/breakwindow.h
+++ b/src/plugins/debugger/breakwindow.h
@@ -64,6 +64,7 @@ protected:
 
 private:
     void deleteBreakpoints(const QModelIndexList &list);
+    void deleteBreakpoints(QList<int> rows);
     void editConditions(const QModelIndexList &list);
     void setBreakpointsEnabled(const QModelIndexList &list, bool enabled);
     void setBreakpointsFullPath(const QModelIndexList &list, bool fullpath);
-- 
GitLab