diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs index 2716e8b2f5..2c1fc063bd 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs @@ -581,7 +581,7 @@ namespace ICSharpCode.AvalonEdit.AddIn quickClassBrowser = null; } } - iconBarManager.UpdateClassMemberBookmarks(parseInfo); + iconBarManager.UpdateClassMemberBookmarks(parseInfo, document); primaryTextEditor.UpdateParseInformationForFolding(parseInfo); if (secondaryTextEditor != null) secondaryTextEditor.UpdateParseInformationForFolding(parseInfo); diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarManager.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarManager.cs index 9ec975baa9..d00268dd60 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarManager.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarManager.cs @@ -1,12 +1,14 @@ // 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.AvalonEdit.Document; using ICSharpCode.SharpDevelop.Dom; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Collections.Specialized; using ICSharpCode.SharpDevelop.Bookmarks; +using ICSharpCode.SharpDevelop.Editor; namespace ICSharpCode.AvalonEdit.AddIn { @@ -40,7 +42,13 @@ namespace ICSharpCode.AvalonEdit.AddIn public event EventHandler RedrawRequested; + [Obsolete("Please provide a TextDocument; this is necessary so that the bookmarks can move when lines are inserted/removed")] public void UpdateClassMemberBookmarks(ParseInformation parseInfo) + { + UpdateClassMemberBookmarks(parseInfo, null); + } + + public void UpdateClassMemberBookmarks(ParseInformation parseInfo, TextDocument document) { for (int i = bookmarks.Count - 1; i >= 0; i--) { if (IsClassMemberBookmark(bookmarks[i])) @@ -49,34 +57,34 @@ namespace ICSharpCode.AvalonEdit.AddIn if (parseInfo == null) return; foreach (IClass c in parseInfo.CompilationUnit.Classes) { - AddClassMemberBookmarks(c); + AddClassMemberBookmarks(c, document); } } - void AddClassMemberBookmarks(IClass c) + void AddClassMemberBookmarks(IClass c, TextDocument document) { if (c.IsSynthetic) return; if (!c.Region.IsEmpty) { - bookmarks.Add(new ClassBookmark(c)); + bookmarks.Add(new ClassBookmark(c, document)); } foreach (IClass innerClass in c.InnerClasses) { - AddClassMemberBookmarks(innerClass); + AddClassMemberBookmarks(innerClass, document); } foreach (IMethod m in c.Methods) { if (m.Region.IsEmpty || m.IsSynthetic) continue; - bookmarks.Add(new ClassMemberBookmark(m)); + bookmarks.Add(new ClassMemberBookmark(m, document)); } - foreach (IProperty m in c.Properties) { - if (m.Region.IsEmpty || m.IsSynthetic) continue; - bookmarks.Add(new ClassMemberBookmark(m)); + foreach (IProperty p in c.Properties) { + if (p.Region.IsEmpty || p.IsSynthetic) continue; + bookmarks.Add(new ClassMemberBookmark(p, document)); } foreach (IField f in c.Fields) { if (f.Region.IsEmpty || f.IsSynthetic) continue; - bookmarks.Add(new ClassMemberBookmark(f)); + bookmarks.Add(new ClassMemberBookmark(f, document)); } foreach (IEvent e in c.Events) { if (e.Region.IsEmpty || e.IsSynthetic) continue; - bookmarks.Add(new ClassMemberBookmark(e)); + bookmarks.Add(new ClassMemberBookmark(e, document)); } } diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarMargin.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarMargin.cs index b278a53c3d..c45080ce03 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarMargin.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarMargin.cs @@ -50,7 +50,11 @@ namespace ICSharpCode.AvalonEdit.AddIn void OnRedrawRequested(object sender, EventArgs e) { - InvalidateVisual(); + // Don't invalidate the IconBarMargin if it'll be invalidated again once the + // visual lines become valid. + if (this.TextView != null && this.TextView.VisualLinesValid) { + InvalidateVisual(); + } } public virtual void Dispose() diff --git a/src/AddIns/DisplayBindings/ILSpyAddIn/ViewContent/DecompiledViewContent.cs b/src/AddIns/DisplayBindings/ILSpyAddIn/ViewContent/DecompiledViewContent.cs index bc37972f18..428734d257 100644 --- a/src/AddIns/DisplayBindings/ILSpyAddIn/ViewContent/DecompiledViewContent.cs +++ b/src/AddIns/DisplayBindings/ILSpyAddIn/ViewContent/DecompiledViewContent.cs @@ -5,7 +5,6 @@ using System; using System.IO; using System.Linq; using System.Threading; - using ICSharpCode.Core; using ICSharpCode.Decompiler; using ICSharpCode.Decompiler.Ast; @@ -15,6 +14,7 @@ using ICSharpCode.SharpDevelop; using ICSharpCode.SharpDevelop.Bookmarks; using ICSharpCode.SharpDevelop.Debugging; using ICSharpCode.SharpDevelop.Editor; +using ICSharpCode.SharpDevelop.Editor.AvalonEdit; using ICSharpCode.SharpDevelop.Gui; using Mono.Cecil; @@ -197,7 +197,7 @@ namespace ICSharpCode.ILSpyAddIn JumpToEntity(this.jumpToEntityTagWhenDecompilationFinished); // update UI - UpdateIconMargin(output.ToString()); + UpdateIconMargin(); // fire events OnDecompilationFinished(EventArgs.Empty); @@ -205,9 +205,11 @@ namespace ICSharpCode.ILSpyAddIn #endregion #region Update UI - void UpdateIconMargin(string text) + void UpdateIconMargin() { - codeView.IconBarManager.UpdateClassMemberBookmarks(ParserService.ParseFile(tempFileName, new StringTextBuffer(text))); + codeView.IconBarManager.UpdateClassMemberBookmarks( + ParserService.ParseFile(tempFileName, new AvalonEditDocumentAdapter(codeView.Document, null)), + null); // load bookmarks foreach (SDBookmark bookmark in BookmarkManager.GetBookmarks(this.codeView.TextEditor.FileName)) { diff --git a/src/Main/Base/Project/Src/Bookmarks/BookmarkManager.cs b/src/Main/Base/Project/Src/Bookmarks/BookmarkManager.cs index 1afac251a8..ad8d1e839c 100644 --- a/src/Main/Base/Project/Src/Bookmarks/BookmarkManager.cs +++ b/src/Main/Base/Project/Src/Bookmarks/BookmarkManager.cs @@ -6,6 +6,7 @@ using System; using System.Collections.Generic; using ICSharpCode.Core; using ICSharpCode.SharpDevelop.Editor; +using ICSharpCode.SharpDevelop.Gui; namespace ICSharpCode.SharpDevelop.Bookmarks { @@ -27,6 +28,8 @@ namespace ICSharpCode.SharpDevelop.Bookmarks if (fileName == null) throw new ArgumentNullException("fileName"); + WorkbenchSingleton.AssertMainThread(); + List marks = new List(); foreach (SDBookmark mark in bookmarks) { @@ -40,6 +43,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks public static void AddMark(SDBookmark bookmark) { + WorkbenchSingleton.AssertMainThread(); if (bookmark == null) return; if (bookmarks.Contains(bookmark)) return; if (bookmarks.Exists(b => IsEqualBookmark(b, bookmark))) return; @@ -62,12 +66,14 @@ namespace ICSharpCode.SharpDevelop.Bookmarks public static void RemoveMark(SDBookmark bookmark) { + WorkbenchSingleton.AssertMainThread(); bookmarks.Remove(bookmark); OnRemoved(new BookmarkEventArgs(bookmark)); } public static void Clear() { + WorkbenchSingleton.AssertMainThread(); while (bookmarks.Count > 0) { SDBookmark b = bookmarks[bookmarks.Count - 1]; bookmarks.RemoveAt(bookmarks.Count - 1); @@ -96,6 +102,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks public static List GetProjectBookmarks(ICSharpCode.SharpDevelop.Project.IProject project) { + WorkbenchSingleton.AssertMainThread(); List projectBookmarks = new List(); foreach (SDBookmark mark in bookmarks) { if (mark.IsSaved && mark.FileName != null) { @@ -109,6 +116,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks Predicate canToggle, Func bookmarkFactory) { + WorkbenchSingleton.AssertMainThread(); foreach (SDBookmark bookmark in GetBookmarks(new FileName(editor.FileName))) { if (canToggle(bookmark) && bookmark.LineNumber == line) { BookmarkManager.RemoveMark(bookmark); @@ -125,6 +133,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks { if (match == null) throw new ArgumentNullException("Predicate is null!"); + WorkbenchSingleton.AssertMainThread(); for(int index = bookmarks.Count - 1; index >= 0; --index){ SDBookmark bookmark = bookmarks[index]; diff --git a/src/Main/Base/Project/Src/Bookmarks/ClassMemberBookmark.cs b/src/Main/Base/Project/Src/Bookmarks/ClassMemberBookmark.cs index 2ce762806f..fb24bd41b9 100644 --- a/src/Main/Base/Project/Src/Bookmarks/ClassMemberBookmark.cs +++ b/src/Main/Base/Project/Src/Bookmarks/ClassMemberBookmark.cs @@ -4,6 +4,7 @@ using System; using System.Windows; using System.Windows.Input; +using ICSharpCode.AvalonEdit.Document; using ICSharpCode.Core; using ICSharpCode.Core.Presentation; using ICSharpCode.SharpDevelop.Dom; @@ -18,6 +19,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks public class ClassMemberBookmark : IBookmark { IMember member; + DocumentLine line; public IMember Member { get { @@ -30,6 +32,14 @@ namespace ICSharpCode.SharpDevelop.Bookmarks this.member = member; } + public ClassMemberBookmark(IMember member, TextDocument document) + { + this.member = member; + int lineNr = member.Region.BeginLine; + if (document != null && lineNr > 0 && lineNr <= document.LineCount) + this.line = document.GetLineByNumber(lineNr); + } + public const string ContextMenuPath = "/SharpDevelop/ViewContent/DefaultTextEditor/ClassMemberContextMenu"; public virtual IImage Image { @@ -37,7 +47,12 @@ namespace ICSharpCode.SharpDevelop.Bookmarks } public int LineNumber { - get { return member.Region.BeginLine; } + get { + if (line != null && !line.IsDeleted) + return line.LineNumber; + else + return member.Region.BeginLine; + } } public virtual void MouseDown(MouseButtonEventArgs e) @@ -71,6 +86,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks public class ClassBookmark : IBookmark { IClass @class; + DocumentLine line; public IClass Class { get { @@ -86,6 +102,14 @@ namespace ICSharpCode.SharpDevelop.Bookmarks this.@class = @class; } + public ClassBookmark(IClass @class, TextDocument document) + { + this.@class = @class; + int lineNr = @class.Region.BeginLine; + if (document != null && lineNr > 0 && lineNr <= document.LineCount) + this.line = document.GetLineByNumber(lineNr); + } + public const string ContextMenuPath = "/SharpDevelop/ViewContent/DefaultTextEditor/ClassBookmarkContextMenu"; public virtual IImage Image { @@ -95,7 +119,12 @@ namespace ICSharpCode.SharpDevelop.Bookmarks } public int LineNumber { - get { return @class.Region.BeginLine; } + get { + if (line != null && !line.IsDeleted) + return line.LineNumber; + else + return @class.Region.BeginLine; + } } public virtual void MouseDown(MouseButtonEventArgs e)