From 67ab31c224d2c7628e5fdd19df77378af6d0b13a Mon Sep 17 00:00:00 2001
From: Leandro Melo <leandro.melo@nokia.com>
Date: Tue, 29 Nov 2011 13:51:00 +0100
Subject: [PATCH] Editor: Bookmark when Shift-clicking the gutter

Task-number: QTCREATORBUG-2852

Change-Id: If539f812bce76c1c1e7b63e7133e2a7c962990ea
Reviewed-by: Eike Ziller <eike.ziller@nokia.com>
---
 src/plugins/bookmarks/bookmarkmanager.cpp |  8 ++++++++
 src/plugins/bookmarks/bookmarkmanager.h   |  9 +++++----
 src/plugins/bookmarks/bookmarksplugin.cpp |  7 +++++++
 src/plugins/debugger/debuggerplugin.cpp   | 15 +++++++++++----
 src/plugins/texteditor/basetexteditor.cpp |  7 ++++++-
 src/plugins/texteditor/itexteditor.h      |  7 ++++++-
 6 files changed, 43 insertions(+), 10 deletions(-)

diff --git a/src/plugins/bookmarks/bookmarkmanager.cpp b/src/plugins/bookmarks/bookmarkmanager.cpp
index e988598aec8..d1965872130 100644
--- a/src/plugins/bookmarks/bookmarkmanager.cpp
+++ b/src/plugins/bookmarks/bookmarkmanager.cpp
@@ -760,6 +760,14 @@ void BookmarkManager::loadBookmarks()
     updateActionStatus();
 }
 
+void BookmarkManager::handleBookmarkRequest(TextEditor::ITextEditor *textEditor,
+                                            int line,
+                                            TextEditor::ITextEditor::MarkRequestKind kind)
+{
+    if (kind == TextEditor::ITextEditor::BookmarkRequest && textEditor->file())
+        toggleBookmark(textEditor->file()->fileName(), line);
+}
+
 // BookmarkViewFactory
 
 BookmarkViewFactory::BookmarkViewFactory(BookmarkManager *bm)
diff --git a/src/plugins/bookmarks/bookmarkmanager.h b/src/plugins/bookmarks/bookmarkmanager.h
index 3e450290c64..a0ac93cbb67 100644
--- a/src/plugins/bookmarks/bookmarkmanager.h
+++ b/src/plugins/bookmarks/bookmarkmanager.h
@@ -36,6 +36,8 @@
 #include <coreplugin/icontext.h>
 #include <coreplugin/inavigationwidgetfactory.h>
 
+#include <texteditor/itexteditor.h>
+
 #include <QtCore/QAbstractItemModel>
 #include <QtCore/QMultiMap>
 #include <QtCore/QList>
@@ -51,10 +53,6 @@ namespace Core {
 class IEditor;
 }
 
-namespace TextEditor {
-class ITextEditor;
-}
-
 namespace Bookmarks {
 namespace Internal {
 
@@ -115,6 +113,9 @@ signals:
 private slots:
     void updateActionStatus();
     void loadBookmarks();
+    void handleBookmarkRequest(TextEditor::ITextEditor * textEditor,
+                               int line,
+                               TextEditor::ITextEditor::MarkRequestKind kind);
 
 private:
     TextEditor::ITextEditor *currentTextEditor() const;
diff --git a/src/plugins/bookmarks/bookmarksplugin.cpp b/src/plugins/bookmarks/bookmarksplugin.cpp
index bada612f120..19d9cb5b249 100644
--- a/src/plugins/bookmarks/bookmarksplugin.cpp
+++ b/src/plugins/bookmarks/bookmarksplugin.cpp
@@ -179,6 +179,13 @@ void BookmarksPlugin::editorOpened(Core::IEditor *editor)
     if (qobject_cast<ITextEditor *>(editor)) {
         connect(editor, SIGNAL(markContextMenuRequested(TextEditor::ITextEditor*,int,QMenu*)),
                 this, SLOT(requestContextMenu(TextEditor::ITextEditor*,int,QMenu*)));
+
+        connect(editor,
+                SIGNAL(markRequested(TextEditor::ITextEditor*,int,
+                                     TextEditor::ITextEditor::MarkRequestKind)),
+                m_bookmarkManager,
+                SLOT(handleBookmarkRequest(TextEditor::ITextEditor*,int,
+                                           TextEditor::ITextEditor::MarkRequestKind)));
     }
 }
 
diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp
index 8d36242fa85..187ed776d72 100644
--- a/src/plugins/debugger/debuggerplugin.cpp
+++ b/src/plugins/debugger/debuggerplugin.cpp
@@ -707,7 +707,9 @@ public slots:
     void editorOpened(Core::IEditor *editor);
     void updateBreakMenuItem(Core::IEditor *editor);
     void setBusyCursor(bool busy);
-    void requestMark(TextEditor::ITextEditor *editor, int lineNumber);
+    void requestMark(TextEditor::ITextEditor *editor,
+                     int lineNumber,
+                     TextEditor::ITextEditor::MarkRequestKind kind);
     void requestContextMenu(TextEditor::ITextEditor *editor,
         int lineNumber, QMenu *menu);
 
@@ -1773,8 +1775,8 @@ void DebuggerPluginPrivate::editorOpened(IEditor *editor)
     if (!textEditor)
         return;
     connect(textEditor,
-        SIGNAL(markRequested(TextEditor::ITextEditor*,int)),
-        SLOT(requestMark(TextEditor::ITextEditor*,int)));
+        SIGNAL(markRequested(TextEditor::ITextEditor*,int, TextEditor::ITextEditor::MarkRequestKind)),
+        SLOT(requestMark(TextEditor::ITextEditor*,int, TextEditor::ITextEditor::MarkRequestKind)));
     connect(textEditor,
         SIGNAL(markContextMenuRequested(TextEditor::ITextEditor*,int,QMenu*)),
         SLOT(requestContextMenu(TextEditor::ITextEditor*,int,QMenu*)));
@@ -1943,8 +1945,13 @@ void DebuggerPluginPrivate::toggleBreakpointByAddress(quint64 address,
     }
 }
 
-void DebuggerPluginPrivate::requestMark(ITextEditor *editor, int lineNumber)
+void DebuggerPluginPrivate::requestMark(ITextEditor *editor,
+                                        int lineNumber,
+                                        ITextEditor::MarkRequestKind kind)
 {
+    if (kind != ITextEditor::BreakpointRequest)
+        return;
+
     if (editor->property("DisassemblerView").toBool()) {
         QString line = editor->contents()
             .section('\n', lineNumber - 1, lineNumber - 1);
diff --git a/src/plugins/texteditor/basetexteditor.cpp b/src/plugins/texteditor/basetexteditor.cpp
index 2b6866d66a1..8df44c4a496 100644
--- a/src/plugins/texteditor/basetexteditor.cpp
+++ b/src/plugins/texteditor/basetexteditor.cpp
@@ -4370,7 +4370,12 @@ void BaseTextEditorWidget::extraAreaMouseEvent(QMouseEvent *e)
             d->extraAreaToggleMarkBlockNumber = -1;
             if (cursor.blockNumber() == n) {
                 int line = n + 1;
-                emit editor()->markRequested(editor(), line);
+                ITextEditor::MarkRequestKind kind;
+                if (QApplication::keyboardModifiers() & Qt::ShiftModifier)
+                    kind = ITextEditor::BookmarkRequest;
+                else
+                    kind = ITextEditor::BreakpointRequest;
+                emit editor()->markRequested(editor(), line, kind);
             }
         }
     }
diff --git a/src/plugins/texteditor/itexteditor.h b/src/plugins/texteditor/itexteditor.h
index ab8ff77347d..fe1caa87d5d 100644
--- a/src/plugins/texteditor/itexteditor.h
+++ b/src/plugins/texteditor/itexteditor.h
@@ -153,10 +153,15 @@ public:
     static QMap<QString, QString> openedTextEditorsContents();
     static QMap<QString, QTextCodec *> openedTextEditorsEncodings();
 
+    enum MarkRequestKind {
+        BreakpointRequest,
+        BookmarkRequest
+    };
+
 signals:
     void contentsChanged();
     void contentsChangedBecauseOfUndo();
-    void markRequested(TextEditor::ITextEditor *editor, int line);
+    void markRequested(TextEditor::ITextEditor *editor, int line, TextEditor::ITextEditor::MarkRequestKind kind);
     void markContextMenuRequested(TextEditor::ITextEditor *editor, int line, QMenu *menu);
     void tooltipOverrideRequested(TextEditor::ITextEditor *editor, const QPoint &globalPos, int position, bool *handled);
     void tooltipRequested(TextEditor::ITextEditor *editor, const QPoint &globalPos, int position);
-- 
GitLab