From 080f1697e97e13461ec6df4d31c8924d01257a1b Mon Sep 17 00:00:00 2001 From: Roy Ben Shabat Date: Tue, 9 Apr 2019 01:47:48 +0300 Subject: MERGE --- .../CodeCompletion/InsightWindow.cs | 94 ++++++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 Software/Visual_Studio/Scripting/Tango.Scripting.Editors/CodeCompletion/InsightWindow.cs (limited to 'Software/Visual_Studio/Scripting/Tango.Scripting.Editors/CodeCompletion/InsightWindow.cs') diff --git a/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/CodeCompletion/InsightWindow.cs b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/CodeCompletion/InsightWindow.cs new file mode 100644 index 000000000..bea06f3b3 --- /dev/null +++ b/Software/Visual_Studio/Scripting/Tango.Scripting.Editors/CodeCompletion/InsightWindow.cs @@ -0,0 +1,94 @@ +// 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 System; +using System.Windows; +using System.Windows.Controls; +using Tango.Scripting.Editors.Editing; +using Tango.Scripting.Editors.Utils; + +namespace Tango.Scripting.Editors.CodeCompletion +{ + /// + /// A popup-like window that is attached to a text segment. + /// + public class InsightWindow : CompletionWindowBase + { + static InsightWindow() + { + DefaultStyleKeyProperty.OverrideMetadata(typeof(InsightWindow), + new FrameworkPropertyMetadata(typeof(InsightWindow))); + AllowsTransparencyProperty.OverrideMetadata(typeof(InsightWindow), + new FrameworkPropertyMetadata(Boxes.True)); + } + + /// + /// Creates a new InsightWindow. + /// + public InsightWindow(TextArea textArea) : base(textArea) + { + this.CloseAutomatically = true; + AttachEvents(); + } + + /// + 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)); + } + + /// + /// Gets/Sets whether the insight window should close automatically. + /// The default value is true. + /// + public bool CloseAutomatically { get; set; } + + /// + protected override bool CloseOnFocusLost { + get { return this.CloseAutomatically; } + } + + void AttachEvents() + { + this.TextArea.Caret.PositionChanged += CaretPositionChanged; + } + + /// + protected override void DetachEvents() + { + this.TextArea.Caret.PositionChanged -= CaretPositionChanged; + base.DetachEvents(); + } + + void CaretPositionChanged(object sender, EventArgs e) + { + if (this.CloseAutomatically) { + int offset = this.TextArea.Caret.Offset; + if (offset < this.StartOffset || offset > this.EndOffset) { + Close(); + } + } + } + } + + /// + /// TemplateSelector for InsightWindow to replace plain string content by a TextBlock with TextWrapping. + /// + internal sealed class InsightWindowTemplateSelector : DataTemplateSelector + { + public override DataTemplate SelectTemplate(object item, DependencyObject container) + { + if (item is string) + return (DataTemplate)((FrameworkElement)container).FindResource("TextBlockTemplate"); + + return null; + } + } +} -- cgit v1.3.1