From 39c00dbb0c1439ce31b9b97b7b8a0f97f9441e7e Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Wed, 3 Jun 2009 13:01:19 +0000 Subject: [PATCH] Implemented ClassMemberBookmarks and NavigationPoints for AvalonEdit. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@4212 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Src/AvalonEditViewContent.cs | 13 +++++ .../AvalonEdit.AddIn/Src/CodeEditor.cs | 50 ++++++++++++------- .../AvalonEdit.AddIn/Src/IconBarManager.cs | 47 ++++++++++++++++- .../Src/Editor/Search/SearchResultsPad.cs | 1 + .../Bookmarks/ClassMemberBookmark.cs | 2 +- 5 files changed, 92 insertions(+), 21 deletions(-) diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditViewContent.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditViewContent.cs index cb2c824abb..3f1f018f6a 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditViewContent.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/AvalonEditViewContent.cs @@ -31,6 +31,7 @@ namespace ICSharpCode.AvalonEdit.AddIn this.Files.Add(file); file.ForceInitializeView(this); codeEditor.Document.Changed += textEditor_Document_Changed; + codeEditor.CaretPositionChanged += CaretChanged; } void textEditor_Document_Changed(object sender, DocumentChangeEventArgs e) @@ -97,6 +98,18 @@ namespace ICSharpCode.AvalonEdit.AddIn } } + public override INavigationPoint BuildNavPoint() + { + int lineNumber = this.Line; + string txt = codeEditor.Document.GetLineByNumber(lineNumber).Text; + return new TextNavigationPoint(this.PrimaryFileName, lineNumber, this.Column, txt); + } + + void CaretChanged(object sender, EventArgs e) + { + NavigationService.Log(this.BuildNavPoint()); + } + #region Bookmark Handling void BookmarksAttach() { diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs index 4033a47ca5..60c7791633 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditor.cs @@ -62,8 +62,14 @@ namespace ICSharpCode.AvalonEdit.AddIn } set { if (document != value) { + if (document != null) + document.UpdateFinished -= DocumentUpdateFinished; + document = value; + if (document != null) + document.UpdateFinished += DocumentUpdateFinished; + if (DocumentChanged != null) { DocumentChanged(this, EventArgs.Empty); } @@ -222,31 +228,36 @@ namespace ICSharpCode.AvalonEdit.AddIn } } + public event EventHandler CaretPositionChanged; + bool caretPositionWasChanged; + void caret_PositionChanged(object sender, EventArgs e) { - InvalidateQuickClassBrowserCaretPosition(); + Debug.Assert(sender is Caret); + if (sender == this.ActiveTextEditor.TextArea.Caret) { + if (document.IsInUpdate) + caretPositionWasChanged = true; + else + HandleCaretPositionChange(); + } } - bool quickClassBrowserCaretPositionInvalid; + void DocumentUpdateFinished(object sender, EventArgs e) + { + if (caretPositionWasChanged) { + caretPositionWasChanged = false; + HandleCaretPositionChange(); + } + } - /// - /// Only call 'SelectItemAtCaretPosition' once when the caret position - /// changes multiple times (e.g. running refactoring which causes lots of caret changes). - /// - void InvalidateQuickClassBrowserCaretPosition() + void HandleCaretPositionChange() { - if (!quickClassBrowserCaretPositionInvalid) { - quickClassBrowserCaretPositionInvalid = true; - Dispatcher.BeginInvoke( - DispatcherPriority.Normal, - new Action( - delegate { - quickClassBrowserCaretPositionInvalid = false; - if (quickClassBrowser != null) { - quickClassBrowser.SelectItemAtCaretPosition(this.ActiveTextEditorAdapter.Caret.Position); - } - })); + if (quickClassBrowser != null) { + quickClassBrowser.SelectItemAtCaretPosition(this.ActiveTextEditorAdapter.Caret.Position); } + var caret = this.ActiveTextEditor.TextArea.Caret; + StatusBarService.SetCaretPosition(caret.Column, caret.Line, caret.Column); + CaretPositionChanged.RaiseEvent(this, EventArgs.Empty); } public void JumpTo(int line, int column) @@ -458,13 +469,14 @@ namespace ICSharpCode.AvalonEdit.AddIn this.Children.Add(quickClassBrowser); } quickClassBrowser.Update(parseInfo.MostRecentCompilationUnit); - InvalidateQuickClassBrowserCaretPosition(); + quickClassBrowser.SelectItemAtCaretPosition(this.ActiveTextEditorAdapter.Caret.Position); } else { if (quickClassBrowser != null) { this.Children.Remove(quickClassBrowser); quickClassBrowser = null; } } + iconBarManager.UpdateClassMemberBookmarks(parseInfo); } } } diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarManager.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarManager.cs index c030d4d02a..291f1fec6b 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarManager.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/IconBarManager.cs @@ -5,11 +5,11 @@ // $Revision$ // +using ICSharpCode.SharpDevelop.Dom; using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Collections.Specialized; - using ICSharpCode.SharpDevelop.Bookmarks; namespace ICSharpCode.AvalonEdit.AddIn @@ -43,5 +43,50 @@ namespace ICSharpCode.AvalonEdit.AddIn } public event EventHandler RedrawRequested; + + internal void UpdateClassMemberBookmarks(ParseInformation parseInfo) + { + for (int i = bookmarks.Count - 1; i >= 0; i--) { + if (IsClassMemberBookmark(bookmarks[i])) + bookmarks.RemoveAt(i); + } + if (parseInfo == null) + return; + foreach (IClass c in parseInfo.MostRecentCompilationUnit.Classes) { + AddClassMemberBookmarks(c); + } + } + + void AddClassMemberBookmarks(IClass c) + { + if (c.IsSynthetic) return; + if (!c.Region.IsEmpty) { + bookmarks.Add(new ClassBookmark(c)); + } + foreach (IClass innerClass in c.InnerClasses) { + AddClassMemberBookmarks(innerClass); + } + foreach (IMethod m in c.Methods) { + if (m.Region.IsEmpty || m.IsSynthetic) continue; + bookmarks.Add(new ClassMemberBookmark(m)); + } + foreach (IProperty m in c.Properties) { + if (m.Region.IsEmpty || m.IsSynthetic) continue; + bookmarks.Add(new ClassMemberBookmark(m)); + } + foreach (IField f in c.Fields) { + if (f.Region.IsEmpty || f.IsSynthetic) continue; + bookmarks.Add(new ClassMemberBookmark(f)); + } + foreach (IEvent e in c.Events) { + if (e.Region.IsEmpty || e.IsSynthetic) continue; + bookmarks.Add(new ClassMemberBookmark(e)); + } + } + + static bool IsClassMemberBookmark(IBookmark b) + { + return b is ClassMemberBookmark || b is ClassBookmark; + } } } diff --git a/src/Main/Base/Project/Src/Editor/Search/SearchResultsPad.cs b/src/Main/Base/Project/Src/Editor/Search/SearchResultsPad.cs index 699303e68a..b79ddcea9b 100644 --- a/src/Main/Base/Project/Src/Editor/Search/SearchResultsPad.cs +++ b/src/Main/Base/Project/Src/Editor/Search/SearchResultsPad.cs @@ -70,6 +70,7 @@ namespace ICSharpCode.SharpDevelop.Editor.Search public void ClearLastSearchesList() { lastSearches.Clear(); + contentPlaceholder.SetContent(null); } public void ShowSearchResults(ISearchResult result) diff --git a/src/Main/Base/Project/Src/TextEditor/Bookmarks/ClassMemberBookmark.cs b/src/Main/Base/Project/Src/TextEditor/Bookmarks/ClassMemberBookmark.cs index 704e965658..0392c83b3a 100644 --- a/src/Main/Base/Project/Src/TextEditor/Bookmarks/ClassMemberBookmark.cs +++ b/src/Main/Base/Project/Src/TextEditor/Bookmarks/ClassMemberBookmark.cs @@ -73,7 +73,7 @@ namespace ICSharpCode.SharpDevelop.Bookmarks public virtual IImage Image { get { - return null; + return ClassBrowserIconService.GetIcon(@class); } }