public SerializableBookmarksInfo GetSerializableInfo() { string ConvertPath(string fullPath) => fullPath.StartsWith(SolutionPath) ? fullPath.Substring(SolutionPath.Length) : fullPath; var filesWithBookmarks = new List <SerializableBookmarksInfo.FileWithBookmarks>(); var lineNumbers = new List <int>(); //We shouldn't have any duplicate bookmark, but let's play safe var usedLineNumbers = new List <int>(); foreach (var fileName in activeViewsByFilename.Keys) { var view = activeViewsByFilename[fileName]; if (bookmarksByView[view].Count == 0) { continue; } lineNumbers.Clear(); usedLineNumbers.Clear(); foreach (var bookmark in bookmarksByView[view]) { var lineNumber = bookmark.GetRow(Helpers.GetRootTextBuffer(view.TextBuffer)); if (usedLineNumbers.Contains(lineNumber)) { continue; } lineNumbers.Add(lineNumber); usedLineNumbers.Add(lineNumber); } filesWithBookmarks.Add(new SerializableBookmarksInfo.FileWithBookmarks { FileName = ConvertPath(fileName), Lines = lineNumbers.ToArray() }); } foreach (var fileName in bookmarksPendingCreation.Keys) { filesWithBookmarks.Add(new SerializableBookmarksInfo.FileWithBookmarks { FileName = ConvertPath(fileName), Lines = bookmarksPendingCreation[fileName].ToArray() }); } var info = new SerializableBookmarksInfo(); info.FilesWithBookmarks = filesWithBookmarks.ToArray(); return(info); }
public void LoadBookmarksFromDatFile() { if (!StorageOptions.SaveBookmarksToOwnFile) { return; } if (!File.Exists(DataFilePath)) { return; } SerializableBookmarksInfo info; try { using (var stream = File.OpenRead(DataFilePath)) info = SerializableBookmarksInfo.DeserializeFrom(stream); } catch { Helpers.ShowErrorMessage("Sorry, I couldn't parse the .SuperBookmarks.dat file, perhaps it is corrupted?", showHeader: false); return; } this.BookmarksManager.DeleteAllBookmarksIn(BookmarkActionTarget.Solution); try { this.BookmarksManager.RecreateBookmarksFromSerializedInfo(info); } catch { Helpers.ShowErrorMessage("Sorry, I couldn't get bookmarks data the .SuperBookmarks.dat file, perhaps it is corrupted?", showHeader: false); return; } Helpers.WriteToStatusBar($"Restored {Helpers.Quantifier(info.TotalBookmarksCount, "bookmark")} for {Helpers.Quantifier(info.TotalFilesCount, "file")} from .SuperBookmarks.dat file"); }
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); } } }
private int _ReadUserOptions(IStream pOptionsStream, string pszKey) { if (pszKey != persistenceKey) { throw new InvalidOperationException("SuperBookmarks: ReadUserOptions was called for unknown key " + pszKey); } var stream = new DataStreamFromComStream(pOptionsStream); SerializableBookmarksInfo info; try { info = SerializableBookmarksInfo.DeserializeFrom(stream); } catch { Helpers.ShowErrorMessage("Sorry, I couldn't parse the bookmarks information from the .suo file", showHeader: false); return(VSConstants.S_OK); } this.BookmarksManager.RecreateBookmarksFromSerializedInfo(info); Helpers.WriteToStatusBar($"Restored {Helpers.Quantifier(info.TotalBookmarksCount, "bookmark")} for {Helpers.Quantifier(info.TotalFilesCount, "file")} from .suo file"); return(VSConstants.S_OK); }