diff options
author | Mike Krüger <mikkrg@microsoft.com> | 2018-10-10 17:07:47 +0300 |
---|---|---|
committer | Mike Krüger <mikkrg@microsoft.com> | 2018-10-11 10:49:27 +0300 |
commit | 4d7a97f308ec550b605efa5dc23537f4201733b1 (patch) | |
tree | 2aa306664b9ad76d9a0bf698cd0d4fc139c81597 | |
parent | 3eee8f38640fba83ea30d63bff6080024bd962bc (diff) |
Fixes VSTS Bug 681385: Accessibility: VoiceOver: Editor Caret does notmaster-vsts681385
follow VoiceOver
https://devdiv.visualstudio.com/DevDiv/_workitems/edit/681385
-rw-r--r-- | main/src/addins/MonoDevelop.SourceEditor2/Mono.TextEditor/Gui/TextArea.cs | 96 |
1 files changed, 94 insertions, 2 deletions
diff --git a/main/src/addins/MonoDevelop.SourceEditor2/Mono.TextEditor/Gui/TextArea.cs b/main/src/addins/MonoDevelop.SourceEditor2/Mono.TextEditor/Gui/TextArea.cs index 0aed4846a5..523cb15200 100644 --- a/main/src/addins/MonoDevelop.SourceEditor2/Mono.TextEditor/Gui/TextArea.cs +++ b/main/src/addins/MonoDevelop.SourceEditor2/Mono.TextEditor/Gui/TextArea.cs @@ -407,7 +407,7 @@ namespace Mono.TextEditor this.textEditorData.SelectionChanged += TextEditorDataSelectionChanged; this.textEditorData.UpdateAdjustmentsRequested += TextEditorDatahandleUpdateAdjustmentsRequested; Document.DocumentUpdated += DocumentUpdatedHandler; - + Document.EndUndo += delegate { HandleAccessibilityCursorChange (); }; this.textEditorData.Options.Changed += OptionsChanged; @@ -571,7 +571,99 @@ namespace Mono.TextEditor RedrawMarginLine (TextViewMargin, Caret.Line); } } - + ISegment lastAccessiblitySelection = null; + ITextSourceVersion lastAccessiblityVersion; + DocumentLocation oldAccessibilityCursorLocation; + static readonly string selectedTextMessage = GettextCatalog.GetString (", selected"); + static readonly string unselectedTextMessage = GettextCatalog.GetString (", unselected"); + + void HandleAccessibilityCursorChange () + { + void NewLineAnnouncement () { ShowAccessibilityAnnouncement (GettextCatalog.GetString ("New line")); } + + var oldLocation = oldAccessibilityCursorLocation; + oldAccessibilityCursorLocation = Caret.Location; + if (lastAccessiblityVersion != null && editor.Document.Version.CompareAge (lastAccessiblityVersion) != 0) { // don't announce on text change + lastAccessiblityVersion = editor.Document.Version; + lastAccessiblitySelection = null; + return; + } + // handle selection case + var curSelection = editor.SelectionRange; + try { + if (editor.IsSomethingSelected) { + if (lastAccessiblitySelection == null) { + ShowAccessibilityAnnouncement (editor.GetTextAt (curSelection) + selectedTextMessage); + return; + } + if (curSelection.Offset < lastAccessiblitySelection.Offset) { + ShowAccessibilityAnnouncement (editor.GetTextAt (curSelection.Offset, lastAccessiblitySelection.Offset - curSelection.Offset) + selectedTextMessage); + return; + } + if (lastAccessiblitySelection.EndOffset < curSelection.EndOffset) { + ShowAccessibilityAnnouncement (editor.GetTextAt (lastAccessiblitySelection.EndOffset, curSelection.EndOffset - lastAccessiblitySelection.EndOffset) + selectedTextMessage); + return; + } + + if (curSelection.Offset > lastAccessiblitySelection.Offset) { + ShowAccessibilityAnnouncement (editor.GetTextAt (curSelection.Offset, curSelection.Offset - lastAccessiblitySelection.Offset) + unselectedTextMessage); + return; + } + + if (lastAccessiblitySelection.EndOffset > curSelection.EndOffset) { + ShowAccessibilityAnnouncement (editor.GetTextAt (curSelection.EndOffset, lastAccessiblitySelection.EndOffset - curSelection.EndOffset) + unselectedTextMessage); + return; + } + } else { + if (lastAccessiblitySelection != null) { + ShowAccessibilityAnnouncement (editor.GetTextAt (lastAccessiblitySelection) + unselectedTextMessage); + return; + } + } + } finally { + lastAccessiblitySelection = editor.IsSomethingSelected ? curSelection : null; + } + + // handle non selected caret movement + if (oldLocation == Caret.Location) + return; + var line = Document.GetLine (Caret.Line); + if (Caret.Line != oldLocation.Line) { + var text = Document.GetTextAt (line); + if (string.IsNullOrEmpty (text)) + NewLineAnnouncement (); + else + ShowAccessibilityAnnouncement (text); + return; + } + var offset = line.Offset + Caret.Column - 1; + if (Caret.Column - oldLocation.Column == 1) { + ShowAccessibilityAnnouncement (Document.GetTextAt (offset - 1, 1)); + } else if (Caret.Column - oldLocation.Column == -1) { + ShowAccessibilityAnnouncement (Document.GetTextAt (offset, 1)); + } else { + var o1 = GetTextEditorData ().FindCurrentWordStart (offset); + var o2 = GetTextEditorData ().FindCurrentWordEnd (offset); + if (o1 >= o2) { + o1 = offset; + o2 = offset + 1; + if (o2 > line.Offset) { + o1--; o2--; + if (o1 < line.Offset) { + NewLineAnnouncement (); + return; + } + } + } + ShowAccessibilityAnnouncement (Document.GetTextAt (o1, o2 - o1)); + } + } + + void ShowAccessibilityAnnouncement (string message) + { + Accessible.MakeAccessibilityAnnouncement (message); + } + MonoDevelop.Ide.Editor.Selection oldSelection = MonoDevelop.Ide.Editor.Selection.Empty; void TextEditorDataSelectionChanged (object sender, EventArgs args) { |