// 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 ICSharpCode.AvalonEdit.Editing; using ICSharpCode.AvalonEdit.Utils; namespace ICSharpCode.AvalonEdit.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; } } }