From a1aebe8dcdaf5107ba6db056f506e55d131052ee Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Tue, 21 Jan 2014 19:13:34 +0100 Subject: [PATCH] fix #285: Method Insight tooltip is invisible and only appears after scrolling and related bug: Method Insight tooltip is not refreshed after caret moves to different parameter --- .../Src/Completion/CSharpInsightItem.cs | 15 +++++++++++- .../XamlBinding/XamlCompletionItem.cs | 18 +++++++++++++++ .../Src/SharpDevelopInsightWindow.cs | 23 ++++++++++++++++++- .../CodeCompletion/InsightWindow.cs | 4 ++-- .../Editor/CodeCompletion/IInsightItem.cs | 3 ++- 5 files changed, 58 insertions(+), 5 deletions(-) diff --git a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpInsightItem.cs b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpInsightItem.cs index e2dfa930e9..34344de871 100644 --- a/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpInsightItem.cs +++ b/src/AddIns/BackendBindings/CSharpBinding/Project/Src/Completion/CSharpInsightItem.cs @@ -2,12 +2,12 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.ComponentModel; using System.IO; using System.Text; using System.Windows; using System.Windows.Controls; -using ICSharpCode.AvalonEdit.Highlighting; using ICSharpCode.NRefactory.CSharp; using ICSharpCode.NRefactory.TypeSystem; using ICSharpCode.NRefactory.Xml; @@ -31,6 +31,7 @@ namespace CSharpBinding.Completion get { if (header == null) { header = GenerateHeader(); + OnPropertyChanged("Header"); } return header; } @@ -45,6 +46,8 @@ namespace CSharpBinding.Completion this.highlightedParameterIndex = parameterIndex; if (header != null) header = GenerateHeader(); + OnPropertyChanged("Header"); + OnPropertyChanged("Content"); } FlowDocumentScrollViewer GenerateHeader() @@ -94,6 +97,7 @@ namespace CSharpBinding.Completion get { if (content == null) { GenerateHeader(); + OnPropertyChanged("Content"); } return content; } @@ -132,5 +136,14 @@ namespace CSharpBinding.Completion } } } + + public event PropertyChangedEventHandler PropertyChanged; + + void OnPropertyChanged(string propertyName) + { + var handler = PropertyChanged; + if (handler != null) + handler(this, new PropertyChangedEventArgs(propertyName)); + } } } diff --git a/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlCompletionItem.cs b/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlCompletionItem.cs index c08da37e12..31737b0550 100644 --- a/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlCompletionItem.cs +++ b/src/AddIns/BackendBindings/XamlBinding/XamlBinding/XamlCompletionItem.cs @@ -210,6 +210,15 @@ namespace ICSharpCode.XamlBinding public object Content { get { return ctor.Documentation; } } + + public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; + + protected virtual void OnPropertyChanged(System.ComponentModel.PropertyChangedEventArgs e) + { + var handler = PropertyChanged; + if (handler != null) + handler(this, e); + } } class MemberInsightItem : IInsightItem @@ -237,5 +246,14 @@ namespace ICSharpCode.XamlBinding public object Content { get { return member.Documentation; } } + + public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; + + protected virtual void OnPropertyChanged(System.ComponentModel.PropertyChangedEventArgs e) + { + var handler = PropertyChanged; + if (handler != null) + handler(this, e); + } } } diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/SharpDevelopInsightWindow.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/SharpDevelopInsightWindow.cs index 18718abd6f..7232ce4139 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/SharpDevelopInsightWindow.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/SharpDevelopInsightWindow.cs @@ -37,6 +37,7 @@ namespace ICSharpCode.AvalonEdit.AddIn OnPropertyChanged("CurrentHeader"); OnPropertyChanged("CurrentContent"); OnPropertyChanged("CurrentIndexText"); + insightWindow.OnSelectedItemChanged(EventArgs.Empty); } public event PropertyChangedEventHandler PropertyChanged; @@ -78,7 +79,7 @@ namespace ICSharpCode.AvalonEdit.AddIn } } - void OnPropertyChanged(string propertyName) + internal void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); @@ -119,6 +120,7 @@ namespace ICSharpCode.AvalonEdit.AddIn TextDocument document; Caret caret; + IInsightItem oldSelectedItem; void AttachEvents() { @@ -157,11 +159,30 @@ namespace ICSharpCode.AvalonEdit.AddIn protected virtual void OnSelectedItemChanged(EventArgs e) { + if (oldSelectedItem != null) + oldSelectedItem.PropertyChanged -= SelectedItemPropertyChanged; + oldSelectedItem = SelectedItem; + if (oldSelectedItem != null) + oldSelectedItem.PropertyChanged += SelectedItemPropertyChanged; if (SelectedItemChanged != null) { SelectedItemChanged(this, e); } } + void SelectedItemPropertyChanged(object sender, PropertyChangedEventArgs e) + { + var provider = Provider as SDItemProvider; + if (provider == null) return; + switch (e.PropertyName) { + case "Header": + provider.OnPropertyChanged("CurrentHeader"); + break; + case "Content": + provider.OnPropertyChanged("CurrentContent"); + break; + } + } + public event EventHandler CaretPositionChanged; protected virtual void OnCaretPositionChanged(EventArgs e) diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/InsightWindow.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/InsightWindow.cs index d606bad92d..972baf8f74 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/InsightWindow.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/CodeCompletion/InsightWindow.cs @@ -34,14 +34,14 @@ namespace ICSharpCode.AvalonEdit.CodeCompletion /// protected override void OnSourceInitialized(EventArgs e) { - base.OnSourceInitialized(e); - Rect caret = this.TextArea.Caret.CalculateCaretRectangle(); Point pointOnScreen = this.TextArea.TextView.PointToScreen(caret.Location - this.TextArea.TextView.ScrollOffset); Rect workingArea = System.Windows.Forms.Screen.FromPoint(pointOnScreen.ToSystemDrawing()).WorkingArea.ToWpf().TransformFromDevice(this); MaxHeight = workingArea.Height; MaxWidth = Math.Min(workingArea.Width, Math.Max(1000, workingArea.Width * 0.6)); + + base.OnSourceInitialized(e); } /// diff --git a/src/Main/Base/Project/Editor/CodeCompletion/IInsightItem.cs b/src/Main/Base/Project/Editor/CodeCompletion/IInsightItem.cs index 57b9a004d1..3b9866b84c 100644 --- a/src/Main/Base/Project/Editor/CodeCompletion/IInsightItem.cs +++ b/src/Main/Base/Project/Editor/CodeCompletion/IInsightItem.cs @@ -2,13 +2,14 @@ // This code is distributed under the GNU LGPL (for details please see \doc\license.txt) using System; +using System.ComponentModel; namespace ICSharpCode.SharpDevelop.Editor.CodeCompletion { /// /// An item in the insight window. /// - public interface IInsightItem + public interface IInsightItem : INotifyPropertyChanged { object Header { get; } object Content { get; }