// 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 ICSharpCode.NRefactory; using System; using System.Collections.Generic; using ICSharpCode.Core; using ICSharpCode.SharpDevelop.Editor; namespace ICSharpCode.SharpDevelop.Bookmarks { /// /// Static class that maintains the list of bookmarks and breakpoints. /// public static class BookmarkManager { static List bookmarks = new List(); public static List Bookmarks { get { return bookmarks; } } public static List GetBookmarks(FileName fileName) { if (fileName == null) throw new ArgumentNullException("fileName"); List marks = new List(); foreach (SDBookmark mark in bookmarks) { if (fileName == mark.FileName) { marks.Add(mark); } } return marks; } public static void AddMark(SDBookmark 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(SDBookmark a, SDBookmark b) { if (a == b) return true; if (a == null || b == null) return false; if (a.GetType() != b.GetType()) return false; if (a.FileName != b.FileName) return false; return a.LineNumber == b.LineNumber; } public static void RemoveMark(SDBookmark bookmark) { bookmarks.Remove(bookmark); OnRemoved(new BookmarkEventArgs(bookmark)); } public static void Clear() { while (bookmarks.Count > 0) { SDBookmark b = bookmarks[bookmarks.Count - 1]; bookmarks.RemoveAt(bookmarks.Count - 1); OnRemoved(new BookmarkEventArgs(b)); } } internal static void Initialize() { Project.ProjectService.SolutionClosing += delegate { Clear(); }; } static void OnRemoved(BookmarkEventArgs e) { if (Removed != null) { Removed(null, e); } } static void OnAdded(BookmarkEventArgs e) { if (Added != null) { Added(null, e); } } public static List GetProjectBookmarks(ICSharpCode.SharpDevelop.Project.IProject project) { List projectBookmarks = new List(); foreach (SDBookmark mark in bookmarks) { if (mark.IsSaved && mark.FileName != null && project.IsFileInProject(mark.FileName)) { projectBookmarks.Add(mark); } } return projectBookmarks; } public static void ToggleBookmark(ITextEditor editor, int line, Predicate canToggle, Func bookmarkFactory) { foreach (SDBookmark bookmark in GetBookmarks(new FileName(editor.FileName))) { if (canToggle(bookmark) && bookmark.LineNumber == line) { BookmarkManager.RemoveMark(bookmark); return; } } // no bookmark at that line: create a new bookmark int lineStartOffset = editor.Document.GetLine(line).Offset; int column = 1 + DocumentUtilitites.GetWhitespaceAfter(editor.Document, lineStartOffset).Length; BookmarkManager.AddMark(bookmarkFactory(new Location(column, line))); } public static event BookmarkEventHandler Removed; public static event BookmarkEventHandler Added; } }