private void UnregisterAndDeleteBookmark(List <Bookmark> bookmarks, Bookmark bookmark, ITextBuffer buffer, bool notifyIfLastBookmark = true)
        {
            var tagger = Helpers.GetTaggerFor(buffer);

            tagger?.RemoveTagSpan(bookmark.TrackingSpan);
            bookmarks.Remove(bookmark);

            if (bookmarks.Count == 0 && notifyIfLastBookmark)
            {
                SolutionExplorerFilter.OnFileLostItsLastBookmark(buffer.Properties["fileName"] as string);
            }
        }
        private void RegisterAndCreateBookmark(List <Bookmark> bookmarks, ITextBuffer buffer, string fileName, int lineNumber)
        {
            var trackingSpan = CreateTagSpan(buffer, lineNumber);

            if (trackingSpan != null)
            {
                bookmarks.Add(new Bookmark(trackingSpan));
                if (bookmarks.Count == 1)
                {
                    SolutionExplorerFilter.OnFileGotItsFirstBookmark(fileName);
                }
            }
        }
        public void RecreateBookmarksFromSerializedInfo(SerializableBookmarksInfo info)
        {
            foreach (var item in info.FilesWithBookmarks)
            {
                var fileName = Path.Combine(SolutionPath, item.FileName); //Filename could be absolute, then this is a NOP, that's ok
                if (!File.Exists(fileName))
                {
                    continue;
                }

                var lineNumbers = item.Lines;

                if (activeViewsByFilename.ContainsKey(fileName))
                {
                    var view      = activeViewsByFilename[fileName];
                    var buffer    = view.TextBuffer;
                    var bookmarks = bookmarksByView[view];
                    foreach (var lineNumber in lineNumbers)
                    {
                        var bookmarkExists = bookmarks.Any(b => b.GetRow(buffer) == lineNumber);
                        if (!bookmarkExists)
                        {
                            RegisterAndCreateBookmark(bookmarks, buffer, fileName, lineNumber);
                        }
                    }
                }
                else if (bookmarksPendingCreation.ContainsKey(fileName))
                {
                    bookmarksPendingCreation[fileName] = bookmarksPendingCreation[fileName].Union(lineNumbers).ToArray();
                }
                else
                {
                    bookmarksPendingCreation.Add(fileName, lineNumbers);
                    SolutionExplorerFilter.OnFileGotItsFirstBookmark(fileName);
                }
            }
        }