From e9ea4767b7f1bc8d0792c3d82a1ace95a725f5ac Mon Sep 17 00:00:00 2001 From: Siegfried Pammer Date: Sat, 18 Dec 2010 15:42:58 +0100 Subject: [PATCH] replaced CaretHighlight control by animated rectangle geometry --- .../AvalonEdit.AddIn/AvalonEdit.AddIn.csproj | 5 -- .../AvalonEdit.AddIn/Src/CaretHighlight.xaml | 35 -------- .../Src/CaretHighlight.xaml.cs | 26 ------ .../Src/CaretHighlightAdorner.cs | 90 ++++++------------- .../AvalonEdit.AddIn/Src/CodeEditorView.cs | 4 +- 5 files changed, 31 insertions(+), 129 deletions(-) delete mode 100644 src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CaretHighlight.xaml delete mode 100644 src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CaretHighlight.xaml.cs diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj index 271774a21f..b23f443ea4 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/AvalonEdit.AddIn.csproj @@ -94,10 +94,6 @@ - - CaretHighlight.xaml - Code - @@ -165,7 +161,6 @@ - SharpDevelopCompletionWindow.cs diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CaretHighlight.xaml b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CaretHighlight.xaml deleted file mode 100644 index dd7e1d8f37..0000000000 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CaretHighlight.xaml +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CaretHighlight.xaml.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CaretHighlight.xaml.cs deleted file mode 100644 index c21facf7b8..0000000000 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CaretHighlight.xaml.cs +++ /dev/null @@ -1,26 +0,0 @@ -// 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.Collections.Generic; -using System.Text; -using System.Windows; -using System.Windows.Controls; -using System.Windows.Data; -using System.Windows.Documents; -using System.Windows.Input; -using System.Windows.Media; - -namespace ICSharpCode.AvalonEdit.AddIn -{ - /// - /// Interaction logic for CaretHighlight.xaml - /// - public partial class CaretHighlight : UserControl - { - public CaretHighlight() - { - InitializeComponent(); - } - } -} \ No newline at end of file diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CaretHighlightAdorner.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CaretHighlightAdorner.cs index fcc8f5b6ed..98baf58d3e 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CaretHighlightAdorner.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CaretHighlightAdorner.cs @@ -3,10 +3,12 @@ using System; using System.Windows; +using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Media; using System.Windows.Media.Animation; -using System.Windows.Threading; + +using ICSharpCode.AvalonEdit.Editing; namespace ICSharpCode.AvalonEdit.AddIn { @@ -15,71 +17,37 @@ namespace ICSharpCode.AvalonEdit.AddIn /// public class CaretHighlightAdorner : Adorner { - CaretHighlight highlight; + const double SizeFactor = 0.5; - public CaretHighlightAdorner(UIElement adornedElement, Point origin) - : base(adornedElement) - { - this.Highlight = new CaretHighlight() { - RenderTransform = new TranslateTransform(origin.X, origin.Y), - }; - } + Rect min, max; + Pen blackPen; - /// - /// Gets/sets the visual child. - /// - protected CaretHighlight Highlight { - get { return highlight; } - set { - RemoveVisualChild(highlight); - highlight = value; - AddVisualChild(highlight); - InvalidateMeasure(); - } - } - - /// - /// Gets the visual child. - /// - protected override Visual GetVisualChild(int index) - { - if (index == 0 && highlight != null) - return highlight; - else - throw new ArgumentOutOfRangeException("index"); - } - - /// - /// Gets the number of visual children. - /// - protected override int VisualChildrenCount { - get { return highlight != null ? 1 : 0; } - } - - /// - /// Measure the visual child. - /// - protected override Size MeasureOverride(Size availableSize) + public CaretHighlightAdorner(TextArea textArea) + : base(textArea.TextView) { - if (highlight != null) { - highlight.Measure(availableSize); - return availableSize; - } else { - return base.MeasureOverride(availableSize); - } + Rect caret = textArea.Caret.CalculateCaretRectangle(); + + this.min = caret; + this.max = new Rect(caret.Location, new Size(caret.Width + Math.Max(caret.Width, caret.Height) * SizeFactor, caret.Height + Math.Max(caret.Width, caret.Height) * SizeFactor)); + + Vector centerOffset = new Vector(caret.Width / 2, caret.Height / 2); + + min.Offset(-textArea.TextView.ScrollOffset); + max.Offset(-textArea.TextView.ScrollOffset); + + max.Offset(-centerOffset); + + blackPen = new Pen(TextBlock.GetForeground(textArea.TextView).Clone(), 1); } - - /// - /// Arrange the visual child. - /// - protected override Size ArrangeOverride(Size finalSize) + + protected override void OnRender(DrawingContext drawingContext) { - if (highlight != null) { - highlight.Arrange(new Rect(new Point(0, 0), finalSize)); - return finalSize; - } else { - return base.ArrangeOverride(finalSize); - } + var geometry = new RectangleGeometry(max, 2, 2); + + geometry.BeginAnimation(RectangleGeometry.RectProperty, new RectAnimation(max, min, new Duration(TimeSpan.FromMilliseconds(400))) { AutoReverse = true }); + blackPen.Brush.BeginAnimation(Brush.OpacityProperty, new DoubleAnimation(1, 0, new Duration(TimeSpan.FromMilliseconds(600))) { BeginTime = TimeSpan.FromMilliseconds(200), AutoReverse = true }); + + drawingContext.DrawGeometry(null, blackPen, geometry); } } } diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs index 46d650734a..be2069c483 100755 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/CodeEditorView.cs @@ -13,8 +13,8 @@ using System.Windows.Controls; using System.Windows.Controls.Primitives; using System.Windows.Documents; using System.Windows.Input; -using System.Windows.Media; using System.Windows.Threading; + using ICSharpCode.AvalonEdit.AddIn.Options; using ICSharpCode.AvalonEdit.AddIn.Snippets; using ICSharpCode.AvalonEdit.Editing; @@ -463,7 +463,7 @@ namespace ICSharpCode.AvalonEdit.AddIn return; AdornerLayer layer = AdornerLayer.GetAdornerLayer(textArea.TextView); - CaretHighlightAdorner adorner = new CaretHighlightAdorner(textArea.TextView, textArea.Caret.CalculateCaretRectangle().Location - textArea.TextView.ScrollOffset - new Vector(3, 6.75)); + CaretHighlightAdorner adorner = new CaretHighlightAdorner(textArea); layer.Add(adorner); WorkbenchSingleton.CallLater(TimeSpan.FromSeconds(1), (Action)(() => layer.Remove(adorner)));