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 @@ -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);

28
src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarManager.cs

@ -1,12 +1,14 @@ @@ -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 @@ -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 @@ -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));
}
}

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

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

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

@ -5,7 +5,6 @@ using System; @@ -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; @@ -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 @@ -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 @@ -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)) {

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

@ -6,6 +6,7 @@ using System; @@ -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 @@ -27,6 +28,8 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
if (fileName == null)
throw new ArgumentNullException("fileName");
WorkbenchSingleton.AssertMainThread();
List<SDBookmark> marks = new List<SDBookmark>();
foreach (SDBookmark mark in bookmarks) {
@ -40,6 +43,7 @@ namespace ICSharpCode.SharpDevelop.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 @@ -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 @@ -96,6 +102,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
public static List<SDBookmark> GetProjectBookmarks(ICSharpCode.SharpDevelop.Project.IProject project)
{
WorkbenchSingleton.AssertMainThread();
List<SDBookmark> projectBookmarks = new List<SDBookmark>();
foreach (SDBookmark mark in bookmarks) {
if (mark.IsSaved && mark.FileName != null) {
@ -109,6 +116,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks @@ -109,6 +116,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks
Predicate<SDBookmark> canToggle,
Func<Location, SDBookmark> 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 @@ -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];

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

@ -4,6 +4,7 @@ @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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)

Loading…
Cancel
Save