Browse Source

IconBarMargin: use DocumentLine as an anchor for entity bookmarks so that they move correctly when inserting/deleting text (without having to wait for the next parse run).

pull/20/merge
Daniel Grunwald 14 years ago
parent
commit
6aaaadd81f
  1. 2
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs
  2. 28
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarManager.cs
  3. 4
      src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarMargin.cs
  4. 10
      src/AddIns/DisplayBindings/ILSpyAddIn/ViewContent/DecompiledViewContent.cs
  5. 9
      src/Main/Base/Project/Src/Bookmarks/BookmarkManager.cs
  6. 33
      src/Main/Base/Project/Src/Bookmarks/ClassMemberBookmark.cs

2
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs

@ -581,7 +581,7 @@ namespace ICSharpCode.AvalonEdit.AddIn
quickClassBrowser = null; quickClassBrowser = null;
} }
} }
iconBarManager.UpdateClassMemberBookmarks(parseInfo); iconBarManager.UpdateClassMemberBookmarks(parseInfo, document);
primaryTextEditor.UpdateParseInformationForFolding(parseInfo); primaryTextEditor.UpdateParseInformationForFolding(parseInfo);
if (secondaryTextEditor != null) if (secondaryTextEditor != null)
secondaryTextEditor.UpdateParseInformationForFolding(parseInfo); secondaryTextEditor.UpdateParseInformationForFolding(parseInfo);

28
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) // 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) // This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using ICSharpCode.AvalonEdit.Document;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Collections.ObjectModel; using System.Collections.ObjectModel;
using System.Collections.Specialized; using System.Collections.Specialized;
using ICSharpCode.SharpDevelop.Bookmarks; using ICSharpCode.SharpDevelop.Bookmarks;
using ICSharpCode.SharpDevelop.Editor;
namespace ICSharpCode.AvalonEdit.AddIn namespace ICSharpCode.AvalonEdit.AddIn
{ {
@ -40,7 +42,13 @@ namespace ICSharpCode.AvalonEdit.AddIn
public event EventHandler RedrawRequested; 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) public void UpdateClassMemberBookmarks(ParseInformation parseInfo)
{
UpdateClassMemberBookmarks(parseInfo, null);
}
public void UpdateClassMemberBookmarks(ParseInformation parseInfo, TextDocument document)
{ {
for (int i = bookmarks.Count - 1; i >= 0; i--) { for (int i = bookmarks.Count - 1; i >= 0; i--) {
if (IsClassMemberBookmark(bookmarks[i])) if (IsClassMemberBookmark(bookmarks[i]))
@ -49,34 +57,34 @@ namespace ICSharpCode.AvalonEdit.AddIn
if (parseInfo == null) if (parseInfo == null)
return; return;
foreach (IClass c in parseInfo.CompilationUnit.Classes) { 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.IsSynthetic) return;
if (!c.Region.IsEmpty) { if (!c.Region.IsEmpty) {
bookmarks.Add(new ClassBookmark(c)); bookmarks.Add(new ClassBookmark(c, document));
} }
foreach (IClass innerClass in c.InnerClasses) { foreach (IClass innerClass in c.InnerClasses) {
AddClassMemberBookmarks(innerClass); AddClassMemberBookmarks(innerClass, document);
} }
foreach (IMethod m in c.Methods) { foreach (IMethod m in c.Methods) {
if (m.Region.IsEmpty || m.IsSynthetic) continue; if (m.Region.IsEmpty || m.IsSynthetic) continue;
bookmarks.Add(new ClassMemberBookmark(m)); bookmarks.Add(new ClassMemberBookmark(m, document));
} }
foreach (IProperty m in c.Properties) { foreach (IProperty p in c.Properties) {
if (m.Region.IsEmpty || m.IsSynthetic) continue; if (p.Region.IsEmpty || p.IsSynthetic) continue;
bookmarks.Add(new ClassMemberBookmark(m)); bookmarks.Add(new ClassMemberBookmark(p, document));
} }
foreach (IField f in c.Fields) { foreach (IField f in c.Fields) {
if (f.Region.IsEmpty || f.IsSynthetic) continue; if (f.Region.IsEmpty || f.IsSynthetic) continue;
bookmarks.Add(new ClassMemberBookmark(f)); bookmarks.Add(new ClassMemberBookmark(f, document));
} }
foreach (IEvent e in c.Events) { foreach (IEvent e in c.Events) {
if (e.Region.IsEmpty || e.IsSynthetic) continue; if (e.Region.IsEmpty || e.IsSynthetic) continue;
bookmarks.Add(new ClassMemberBookmark(e)); bookmarks.Add(new ClassMemberBookmark(e, document));
} }
} }

4
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarMargin.cs

@ -50,8 +50,12 @@ namespace ICSharpCode.AvalonEdit.AddIn
void OnRedrawRequested(object sender, EventArgs e) void OnRedrawRequested(object sender, EventArgs e)
{ {
// 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(); InvalidateVisual();
} }
}
public virtual void Dispose() public virtual void Dispose()
{ {

10
src/AddIns/DisplayBindings/ILSpyAddIn/ViewContent/DecompiledViewContent.cs

@ -5,7 +5,6 @@ using System;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Threading; using System.Threading;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.Decompiler; using ICSharpCode.Decompiler;
using ICSharpCode.Decompiler.Ast; using ICSharpCode.Decompiler.Ast;
@ -15,6 +14,7 @@ using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Bookmarks; using ICSharpCode.SharpDevelop.Bookmarks;
using ICSharpCode.SharpDevelop.Debugging; using ICSharpCode.SharpDevelop.Debugging;
using ICSharpCode.SharpDevelop.Editor; using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Editor.AvalonEdit;
using ICSharpCode.SharpDevelop.Gui; using ICSharpCode.SharpDevelop.Gui;
using Mono.Cecil; using Mono.Cecil;
@ -197,7 +197,7 @@ namespace ICSharpCode.ILSpyAddIn
JumpToEntity(this.jumpToEntityTagWhenDecompilationFinished); JumpToEntity(this.jumpToEntityTagWhenDecompilationFinished);
// update UI // update UI
UpdateIconMargin(output.ToString()); UpdateIconMargin();
// fire events // fire events
OnDecompilationFinished(EventArgs.Empty); OnDecompilationFinished(EventArgs.Empty);
@ -205,9 +205,11 @@ namespace ICSharpCode.ILSpyAddIn
#endregion #endregion
#region Update UI #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 // load bookmarks
foreach (SDBookmark bookmark in BookmarkManager.GetBookmarks(this.codeView.TextEditor.FileName)) { foreach (SDBookmark bookmark in BookmarkManager.GetBookmarks(this.codeView.TextEditor.FileName)) {

9
src/Main/Base/Project/Src/Bookmarks/BookmarkManager.cs

@ -6,6 +6,7 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.SharpDevelop.Editor; using ICSharpCode.SharpDevelop.Editor;
using ICSharpCode.SharpDevelop.Gui;
namespace ICSharpCode.SharpDevelop.Bookmarks namespace ICSharpCode.SharpDevelop.Bookmarks
{ {
@ -27,6 +28,8 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
if (fileName == null) if (fileName == null)
throw new ArgumentNullException("fileName"); throw new ArgumentNullException("fileName");
WorkbenchSingleton.AssertMainThread();
List<SDBookmark> marks = new List<SDBookmark>(); List<SDBookmark> marks = new List<SDBookmark>();
foreach (SDBookmark mark in bookmarks) { foreach (SDBookmark mark in bookmarks) {
@ -40,6 +43,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
public static void AddMark(SDBookmark bookmark) public static void AddMark(SDBookmark bookmark)
{ {
WorkbenchSingleton.AssertMainThread();
if (bookmark == null) return; if (bookmark == null) return;
if (bookmarks.Contains(bookmark)) return; if (bookmarks.Contains(bookmark)) return;
if (bookmarks.Exists(b => IsEqualBookmark(b, bookmark))) return; if (bookmarks.Exists(b => IsEqualBookmark(b, bookmark))) return;
@ -62,12 +66,14 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
public static void RemoveMark(SDBookmark bookmark) public static void RemoveMark(SDBookmark bookmark)
{ {
WorkbenchSingleton.AssertMainThread();
bookmarks.Remove(bookmark); bookmarks.Remove(bookmark);
OnRemoved(new BookmarkEventArgs(bookmark)); OnRemoved(new BookmarkEventArgs(bookmark));
} }
public static void Clear() public static void Clear()
{ {
WorkbenchSingleton.AssertMainThread();
while (bookmarks.Count > 0) { while (bookmarks.Count > 0) {
SDBookmark b = bookmarks[bookmarks.Count - 1]; SDBookmark b = bookmarks[bookmarks.Count - 1];
bookmarks.RemoveAt(bookmarks.Count - 1); bookmarks.RemoveAt(bookmarks.Count - 1);
@ -96,6 +102,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
public static List<SDBookmark> GetProjectBookmarks(ICSharpCode.SharpDevelop.Project.IProject project) public static List<SDBookmark> GetProjectBookmarks(ICSharpCode.SharpDevelop.Project.IProject project)
{ {
WorkbenchSingleton.AssertMainThread();
List<SDBookmark> projectBookmarks = new List<SDBookmark>(); List<SDBookmark> projectBookmarks = new List<SDBookmark>();
foreach (SDBookmark mark in bookmarks) { foreach (SDBookmark mark in bookmarks) {
if (mark.IsSaved && mark.FileName != null) { if (mark.IsSaved && mark.FileName != null) {
@ -109,6 +116,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
Predicate<SDBookmark> canToggle, Predicate<SDBookmark> canToggle,
Func<Location, SDBookmark> bookmarkFactory) Func<Location, SDBookmark> bookmarkFactory)
{ {
WorkbenchSingleton.AssertMainThread();
foreach (SDBookmark bookmark in GetBookmarks(new FileName(editor.FileName))) { foreach (SDBookmark bookmark in GetBookmarks(new FileName(editor.FileName))) {
if (canToggle(bookmark) && bookmark.LineNumber == line) { if (canToggle(bookmark) && bookmark.LineNumber == line) {
BookmarkManager.RemoveMark(bookmark); BookmarkManager.RemoveMark(bookmark);
@ -125,6 +133,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
{ {
if (match == null) if (match == null)
throw new ArgumentNullException("Predicate is null!"); throw new ArgumentNullException("Predicate is null!");
WorkbenchSingleton.AssertMainThread();
for(int index = bookmarks.Count - 1; index >= 0; --index){ for(int index = bookmarks.Count - 1; index >= 0; --index){
SDBookmark bookmark = bookmarks[index]; SDBookmark bookmark = bookmarks[index];

33
src/Main/Base/Project/Src/Bookmarks/ClassMemberBookmark.cs

@ -4,6 +4,7 @@
using System; using System;
using System.Windows; using System.Windows;
using System.Windows.Input; using System.Windows.Input;
using ICSharpCode.AvalonEdit.Document;
using ICSharpCode.Core; using ICSharpCode.Core;
using ICSharpCode.Core.Presentation; using ICSharpCode.Core.Presentation;
using ICSharpCode.SharpDevelop.Dom; using ICSharpCode.SharpDevelop.Dom;
@ -18,6 +19,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
public class ClassMemberBookmark : IBookmark public class ClassMemberBookmark : IBookmark
{ {
IMember member; IMember member;
DocumentLine line;
public IMember Member { public IMember Member {
get { get {
@ -30,6 +32,14 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
this.member = member; 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 const string ContextMenuPath = "/SharpDevelop/ViewContent/DefaultTextEditor/ClassMemberContextMenu";
public virtual IImage Image { public virtual IImage Image {
@ -37,7 +47,12 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
} }
public int LineNumber { 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) public virtual void MouseDown(MouseButtonEventArgs e)
@ -71,6 +86,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
public class ClassBookmark : IBookmark public class ClassBookmark : IBookmark
{ {
IClass @class; IClass @class;
DocumentLine line;
public IClass Class { public IClass Class {
get { get {
@ -86,6 +102,14 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
this.@class = @class; 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 const string ContextMenuPath = "/SharpDevelop/ViewContent/DefaultTextEditor/ClassBookmarkContextMenu";
public virtual IImage Image { public virtual IImage Image {
@ -95,7 +119,12 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
} }
public int LineNumber { 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) public virtual void MouseDown(MouseButtonEventArgs e)

Loading…
Cancel
Save