From 9cf768e802bd0bf0fb24853e9486b89dd3f5c755 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Fri, 31 Jan 2014 22:53:32 +0100 Subject: [PATCH] Fix caret rendering in overstrike mode on right-to-left text. --- data/resources/StringResources.resx | 6 ++---- .../Src/ContextActions/ClipboardRingPopup.cs | 7 +++++-- .../ICSharpCode.AvalonEdit/Editing/Caret.cs | 12 +++++++----- .../ICSharpCode.AvalonEdit/TextEditorOptions.cs | 8 ++++---- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/data/resources/StringResources.resx b/data/resources/StringResources.resx index 02dd6ff97f..108a17f839 100644 --- a/data/resources/StringResources.resx +++ b/data/resources/StringResources.resx @@ -6437,11 +6437,9 @@ Removed the end part of the original message ", reason '${Message}'" since this Classes deriving from ${Name} Title for search results for derived classes - - Clipboard ring - - From clipboard ring + Paste from clipboard ring... + 'Paste previous' command in Edit > Insert menu Clipboard ring is empty diff --git a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/ClipboardRingPopup.cs b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/ClipboardRingPopup.cs index 437dd67d8e..16e7fb4023 100644 --- a/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/ClipboardRingPopup.cs +++ b/src/AddIns/DisplayBindings/AvalonEdit.AddIn/Src/ContextActions/ClipboardRingPopup.cs @@ -10,18 +10,21 @@ using ICSharpCode.SharpDevelop.Editor.ContextActions; namespace ICSharpCode.AvalonEdit.AddIn.ContextActions { + /// + /// 'Paste from clipboard ring' command + /// public class ClipboardRingPopup : ContextActionsPopup { ToolTip toolTip; public ClipboardRingPopup() : base() - { + { this.toolTip = new ToolTip(); this.toolTip.PlacementTarget = this.ActionsControl; this.toolTip.Placement = PlacementMode.Right; this.toolTip.Closed += new RoutedEventHandler(ClipboardRingPopup_Closed); - this.ActionsControl.ActionExecuted += delegate + this.ActionsControl.ActionExecuted += delegate { if(this.toolTip != null) this.toolTip.IsOpen = false; diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/Caret.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/Caret.cs index 193750a7cd..a78dc7b07e 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/Caret.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Editing/Caret.cs @@ -389,17 +389,19 @@ namespace ICSharpCode.AvalonEdit.Editing } TextLine textLine = visualLine.GetTextLine(position.VisualColumn, position.IsAtEndOfLine); - double xPos = visualLine.GetTextLineVisualXPosition(textLine, position.VisualColumn); double lineTop = visualLine.GetTextLineVisualYPosition(textLine, VisualYPosition.TextTop); double lineBottom = visualLine.GetTextLineVisualYPosition(textLine, VisualYPosition.TextBottom); int currentPos = position.VisualColumn; + double xPos = visualLine.GetTextLineVisualXPosition(textLine, currentPos); + // The text being overwritten in overstrike mode is everything up to the next normal caret stop int nextPos = visualLine.GetNextCaretPosition(currentPos, LogicalDirection.Forward, CaretPositioningMode.Normal, true); - double charSize = Math.Abs( - visualLine.GetTextLineVisualXPosition(textLine, currentPos) - - visualLine.GetTextLineVisualXPosition(textLine, nextPos) ); + double nextXPos = visualLine.GetTextLineVisualXPosition(textLine, nextPos); + // Use Math.Abs (and Math.Min below) in case of right-to-left text + // Use a minimum width of SystemParameters.CaretWidth in case of extremely thin characters (e.g. zero-width space) + double charSize = Math.Max(Math.Abs(xPos - nextXPos), SystemParameters.CaretWidth); - return new Rect(xPos, + return new Rect(Math.Min(xPos, nextXPos), lineTop, charSize, lineBottom - lineTop); diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditorOptions.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditorOptions.cs index 23b550d663..1416368de6 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditorOptions.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/TextEditorOptions.cs @@ -464,10 +464,10 @@ namespace ICSharpCode.AvalonEdit bool hideCursorWhileTyping = true; - [DefaultValue(true)] /// - /// Gets/Sets if mouse cursor should be shown when user is typing + /// Gets/Sets if mouse cursor should be hidden while user is typing. /// + [DefaultValue(true)] public bool HideCursorWhileTyping { get { return hideCursorWhileTyping; } set { @@ -480,10 +480,10 @@ namespace ICSharpCode.AvalonEdit bool allowOverstrikeMode = false; - [DefaultValue(false)] /// - /// Gets/Sets if overstrike mode is enabled to use + /// Gets/Sets if the user is allowed to switch to overstrike mode. /// + [DefaultValue(false)] public bool AllowOverstrikeMode { get { return allowOverstrikeMode; } set {