mirror of https://github.com/icsharpcode/ILSpy.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
114 lines
2.8 KiB
114 lines
2.8 KiB
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt) |
|
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt) |
|
|
|
using System; |
|
using System.Collections.Generic; |
|
using ICSharpCode.NRefactory.CSharp; |
|
using Mono.CSharp; |
|
|
|
namespace ILSpy.Debugger.Bookmarks |
|
{ |
|
/// <summary> |
|
/// Static class that maintains the list of bookmarks and breakpoints. |
|
/// </summary> |
|
public static class BookmarkManager |
|
{ |
|
static List<BookmarkBase> bookmarks = new List<BookmarkBase>(); |
|
|
|
public static List<BookmarkBase> Bookmarks { |
|
get { |
|
return bookmarks; |
|
} |
|
} |
|
|
|
public static List<BookmarkBase> GetBookmarks(string typeName) |
|
{ |
|
if (typeName == null) |
|
throw new ArgumentNullException("typeName"); |
|
|
|
List<BookmarkBase> marks = new List<BookmarkBase>(); |
|
|
|
foreach (BookmarkBase mark in bookmarks) { |
|
if (typeName == mark.Type.FullName) { |
|
marks.Add(mark); |
|
} |
|
} |
|
|
|
return marks; |
|
} |
|
|
|
public static void AddMark(BookmarkBase bookmark) |
|
{ |
|
if (bookmark == null) return; |
|
if (bookmarks.Contains(bookmark)) return; |
|
if (bookmarks.Exists(b => IsEqualBookmark(b, bookmark))) return; |
|
bookmarks.Add(bookmark); |
|
OnAdded(new BookmarkEventArgs(bookmark)); |
|
} |
|
|
|
static bool IsEqualBookmark(BookmarkBase a, BookmarkBase b) |
|
{ |
|
if (a == b) |
|
return true; |
|
if (a == null || b == null) |
|
return false; |
|
if (a.GetType() != b.GetType()) |
|
return false; |
|
if (a.Type.FullName != b.Type.FullName) |
|
return false; |
|
return a.LineNumber == b.LineNumber; |
|
} |
|
|
|
public static void RemoveMark(BookmarkBase bookmark) |
|
{ |
|
bookmarks.Remove(bookmark); |
|
OnRemoved(new BookmarkEventArgs(bookmark)); |
|
} |
|
|
|
public static void Clear() |
|
{ |
|
while (bookmarks.Count > 0) { |
|
var b = bookmarks[bookmarks.Count - 1]; |
|
bookmarks.RemoveAt(bookmarks.Count - 1); |
|
OnRemoved(new BookmarkEventArgs(b)); |
|
} |
|
} |
|
|
|
internal static void Initialize() |
|
{ |
|
|
|
} |
|
|
|
static void OnRemoved(BookmarkEventArgs e) |
|
{ |
|
if (Removed != null) { |
|
Removed(null, e); |
|
} |
|
} |
|
|
|
static void OnAdded(BookmarkEventArgs e) |
|
{ |
|
if (Added != null) { |
|
Added(null, e); |
|
} |
|
} |
|
|
|
public static void ToggleBookmark(string typeName, int line, |
|
Predicate<BookmarkBase> canToggle, |
|
Func<AstLocation, BookmarkBase> bookmarkFactory) |
|
{ |
|
foreach (BookmarkBase bookmark in GetBookmarks(typeName)) { |
|
if (canToggle(bookmark) && bookmark.LineNumber == line) { |
|
BookmarkManager.RemoveMark(bookmark); |
|
return; |
|
} |
|
} |
|
|
|
// no bookmark at that line: create a new bookmark |
|
BookmarkManager.AddMark(bookmarkFactory(new AstLocation(line, 0))); |
|
} |
|
|
|
public static event BookmarkEventHandler Removed; |
|
public static event BookmarkEventHandler Added; |
|
} |
|
}
|
|
|