Exemplo n.º 1
0
        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");
        }
Exemplo n.º 3
0
        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);
                }
            }
        }
Exemplo n.º 4
0
        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);
        }