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");
}
}
}