From 1abea58fb216af7e7d4b017c94e6ac1c6795033e Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 31 Jan 2014 23:06:24 +0100 Subject: [PATCH] Turn TextArea.OverstrikeMode into a dependency property. --- .../ICSharpCode.AvalonEdit/Editing/Caret.cs | 17 ++++++----- .../Editing/CaretLayer.cs | 3 +- .../Editing/TextArea.cs | 30 ++++++++++++------- .../TextEditorOptions.cs | 14 ++++----- 4 files changed, 37 insertions(+), 27 deletions(-) diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/Caret.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/Caret.cs index a78dc7b07e..4e5dad6070 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/Caret.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/Caret.cs @@ -53,6 +53,13 @@ namespace ICSharpCode.AvalonEdit.Editing textView.ScrollOffsetChanged += TextView_ScrollOffsetChanged; } + internal void UpdateIfVisible() + { + if (visible) { + Show(); + } + } + void TextView_VisualLinesChanged(object sender, EventArgs e) { if (visible) { @@ -414,8 +421,7 @@ namespace ICSharpCode.AvalonEdit.Editing { if (textView != null && textView.Document != null) { VisualLine visualLine = textView.GetOrConstructVisualLine(textView.Document.GetLineByNumber(position.Line)); - return (this.textView.Options.AllowOverstrikeMode && this.textArea.OverstrikeMode) - ? CalcCaretOverstrikeRectangle(visualLine) : CalcCaretRectangle(visualLine); + return textArea.OverstrikeMode ? CalcCaretOverstrikeRectangle(visualLine) : CalcCaretRectangle(visualLine); } else { return Rect.Empty; } @@ -470,12 +476,7 @@ namespace ICSharpCode.AvalonEdit.Editing if (caretAdorner != null && textView != null) { VisualLine visualLine = textView.GetVisualLine(position.Line); if (visualLine != null) { - Rect caretRect; - if (this.textView.Options.AllowOverstrikeMode && this.textArea.OverstrikeMode) { - caretRect = CalcCaretOverstrikeRectangle(visualLine); - } else { - caretRect = CalcCaretRectangle(visualLine); - } + Rect caretRect = this.textArea.OverstrikeMode ? CalcCaretOverstrikeRectangle(visualLine) : CalcCaretRectangle(visualLine); // Create Win32 caret so that Windows knows where our managed caret is. This is necessary for // features like 'Follow text editing' in the Windows Magnifier. if (!hasWin32Caret) { diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/CaretLayer.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/CaretLayer.cs index 709f8bead1..266fbb1285 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/CaretLayer.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/CaretLayer.cs @@ -94,12 +94,13 @@ namespace ICSharpCode.AvalonEdit.Editing if (caretBrush == null) caretBrush = (Brush)textView.GetValue(TextBlock.ForegroundProperty); - if (this.textArea.Options.AllowOverstrikeMode && this.textArea.OverstrikeMode) { + if (this.textArea.OverstrikeMode) { SolidColorBrush scBrush = caretBrush as SolidColorBrush; if (scBrush != null) { Color brushColor = scBrush.Color; Color newColor = Color.FromArgb(100, brushColor.R, brushColor.G, brushColor.B); caretBrush = new SolidColorBrush(newColor); + caretBrush.Freeze(); } } diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/TextArea.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/TextArea.cs index de820862df..0d0747c112 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/TextArea.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/TextArea.cs @@ -25,6 +25,7 @@ using System.Linq; using System.Windows; 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; @@ -882,8 +883,8 @@ namespace ICSharpCode.AvalonEdit.Editing if (e.Text == "\n" || e.Text == "\r" || e.Text == "\r\n") ReplaceSelectionWithNewLine(); else { - if (overstrikeMode && Selection.IsEmpty && Document.GetLineByNumber(Caret.Line).EndOffset > Caret.Offset) - Selection = Selection.Create(this, Caret.Offset, Caret.Offset+e.Text.Length); + if (OverstrikeMode && Selection.IsEmpty && Document.GetLineByNumber(Caret.Line).EndOffset > Caret.Offset) + EditingCommands.SelectRightByCharacter.Execute(null, this); ReplaceSelectionWithText(e.Text); } OnTextEntered(e); @@ -971,11 +972,8 @@ namespace ICSharpCode.AvalonEdit.Editing { base.OnPreviewKeyDown(e); - if (!this.Options.AllowOverstrikeMode) { - this.overstrikeMode = false; - } else if (!e.Handled && e.Key == Key.Insert) { - this.overstrikeMode = !this.overstrikeMode; - this.caret.Show(); + if (!e.Handled && e.Key == Key.Insert && this.Options.AllowToggleOverstrikeMode) { + this.OverstrikeMode = !this.OverstrikeMode; e.Handled = true; return; } @@ -1047,11 +1045,19 @@ namespace ICSharpCode.AvalonEdit.Editing #region Overstrike mode - bool overstrikeMode = false; + /// + /// The dependency property. + /// + public static readonly DependencyProperty OverstrikeModeProperty = + DependencyProperty.Register("OverstrikeMode", typeof(bool), typeof(TextArea), + new FrameworkPropertyMetadata(Boxes.False)); - public bool OverstrikeMode - { - get { return this.overstrikeMode; } + /// + /// Gets/Sets whether overstrike mode is active. + /// + public bool OverstrikeMode { + get { return (bool)GetValue(OverstrikeModeProperty); } + set { SetValue(OverstrikeModeProperty, value); } } #endregion @@ -1073,6 +1079,8 @@ namespace ICSharpCode.AvalonEdit.Editing || e.Property == SelectionCornerRadiusProperty) { textView.Redraw(); + } else if (e.Property == OverstrikeModeProperty) { + caret.UpdateIfVisible(); } } diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditorOptions.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditorOptions.cs index 1416368de6..5b0fa5538e 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditorOptions.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditorOptions.cs @@ -478,18 +478,18 @@ namespace ICSharpCode.AvalonEdit } } - bool allowOverstrikeMode = false; + bool allowToggleOverstrikeMode = false; /// - /// Gets/Sets if the user is allowed to switch to overstrike mode. + /// Gets/Sets if the user is allowed to enable/disable overstrike mode. /// [DefaultValue(false)] - public bool AllowOverstrikeMode { - get { return allowOverstrikeMode; } + public bool AllowToggleOverstrikeMode { + get { return allowToggleOverstrikeMode; } set { - if (allowOverstrikeMode != value) { - allowOverstrikeMode = value; - OnPropertyChanged("AllowOverstrikeMode"); + if (allowToggleOverstrikeMode != value) { + allowToggleOverstrikeMode = value; + OnPropertyChanged("AllowToggleOverstrikeMode"); } } }