diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarMargin.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarMargin.cs index 6be173c17e..28d34e8ead 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarMargin.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarMargin.cs @@ -79,8 +79,9 @@ namespace ICSharpCode.AvalonEdit.AddIn Dictionary bookmarkDict = new Dictionary(); foreach (IBookmark bm in manager.Bookmarks) { int line = bm.LineNumber; - if (!bookmarkDict.ContainsKey(line)) - bookmarkDict.Add(line, bm); + IBookmark existingBookmark; + if (!bookmarkDict.TryGetValue(line, out existingBookmark) || bm.ZOrder > existingBookmark.ZOrder) + bookmarkDict[line] = bm; } Size pixelSize = PixelSnapHelpers.GetPixelSize(this); foreach (VisualLine line in textView.VisualLines) { @@ -113,15 +114,13 @@ namespace ICSharpCode.AvalonEdit.AddIn base.OnMouseDown(e); int line = GetLineFromMousePosition(e); if (!e.Handled && line > 0) { - foreach (IBookmark bm in manager.Bookmarks) { - if (bm.LineNumber == line) { - bm.MouseDown(e); - if (e.Handled) - return; + IBookmark bm = GetBookmarkFromLine(line); + if (bm != null) { + bm.MouseDown(e); + if (!e.Handled) { if (e.ChangedButton == MouseButton.Left && bm.CanDragDrop && CaptureMouse()) { StartDragDrop(bm, e); e.Handled = true; - return; } } } @@ -131,6 +130,18 @@ namespace ICSharpCode.AvalonEdit.AddIn e.Handled = true; } + IBookmark GetBookmarkFromLine(int line) + { + IBookmark result = null; + foreach (IBookmark bm in manager.Bookmarks) { + if (bm.LineNumber == line) { + if (result == null || bm.ZOrder > result.ZOrder) + result = bm; + } + } + return result; + } + protected override void OnLostMouseCapture(MouseEventArgs e) { CancelDragDrop(); @@ -206,12 +217,11 @@ namespace ICSharpCode.AvalonEdit.AddIn CancelDragDrop(); } if (!e.Handled && line != 0) { - foreach (IBookmark bm in manager.Bookmarks) { - if (bm.LineNumber == line) { - bm.MouseUp(e); - if (e.Handled) - return; - } + IBookmark bm = GetBookmarkFromLine(line); + if (bm != null) { + bm.MouseUp(e); + if (e.Handled) + return; } if (e.ChangedButton == MouseButton.Left && TextView != null) { // no bookmark on the line: create a new breakpoint diff --git a/src/Main/Base/Project/Src/Bookmarks/BookmarkBase.cs b/src/Main/Base/Project/Src/Bookmarks/BookmarkBase.cs index dfcaf720fc..457787f117 100644 --- a/src/Main/Base/Project/Src/Bookmarks/BookmarkBase.cs +++ b/src/Main/Base/Project/Src/Bookmarks/BookmarkBase.cs @@ -128,6 +128,10 @@ namespace ICSharpCode.SharpDevelop.Bookmarks } } + public virtual int ZOrder { + get { return 0; } + } + /// /// Gets if the bookmark can be toggled off using the 'set/unset bookmark' command. /// diff --git a/src/Main/Base/Project/Src/Bookmarks/ClassMemberBookmark.cs b/src/Main/Base/Project/Src/Bookmarks/ClassMemberBookmark.cs index b0e28b445e..2ce762806f 100644 --- a/src/Main/Base/Project/Src/Bookmarks/ClassMemberBookmark.cs +++ b/src/Main/Base/Project/Src/Bookmarks/ClassMemberBookmark.cs @@ -54,6 +54,10 @@ namespace ICSharpCode.SharpDevelop.Bookmarks { } + int IBookmark.ZOrder { + get { return -10; } + } + bool IBookmark.CanDragDrop { get { return false; } } @@ -108,6 +112,10 @@ namespace ICSharpCode.SharpDevelop.Bookmarks { } + int IBookmark.ZOrder { + get { return -10; } + } + bool IBookmark.CanDragDrop { get { return false; } } diff --git a/src/Main/Base/Project/Src/Bookmarks/IBookmarkMargin.cs b/src/Main/Base/Project/Src/Bookmarks/IBookmarkMargin.cs index 331d0ce195..28d57bcc19 100644 --- a/src/Main/Base/Project/Src/Bookmarks/IBookmarkMargin.cs +++ b/src/Main/Base/Project/Src/Bookmarks/IBookmarkMargin.cs @@ -38,6 +38,11 @@ namespace ICSharpCode.SharpDevelop.Bookmarks /// IImage Image { get; } + /// + /// Gets the Z-Order of the bookmark icon. + /// + int ZOrder { get; } + /// /// Handles the mouse down event. /// diff --git a/src/Main/Base/Project/Src/Services/Debugger/CurrentLineBookmark.cs b/src/Main/Base/Project/Src/Services/Debugger/CurrentLineBookmark.cs index 1bbee51ee2..3502189916 100644 --- a/src/Main/Base/Project/Src/Services/Debugger/CurrentLineBookmark.cs +++ b/src/Main/Base/Project/Src/Services/Debugger/CurrentLineBookmark.cs @@ -68,6 +68,10 @@ namespace ICSharpCode.SharpDevelop.Debugging } } + public override int ZOrder { + get { return 100; } + } + public CurrentLineBookmark(FileName fileName, Location location) : base(fileName, location) { this.IsSaved = false;