From cc8eddac149167343b786733d968a2755a78ba87 Mon Sep 17 00:00:00 2001 From: Daniel Grunwald Date: Wed, 29 Apr 2009 21:57:23 +0000 Subject: [PATCH] GetNextCaretPosition methods: Use enum LogicalDirection instead of bool backwards. git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@4037 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61 --- .../Utils/CaretNavigationTests.cs | 7 ++++--- .../ICSharpCode.AvalonEdit/Gui/Caret.cs | 6 +++--- .../Gui/CaretNavigationCommandHandler.cs | 6 +++--- .../Gui/NewLineElementGenerator.cs | 7 ++++--- .../Gui/SelectionMouseHandler.cs | 5 +++-- .../Gui/SingleCharacterElementGenerator.cs | 12 +++++++----- .../ICSharpCode.AvalonEdit/Gui/VisualLine.cs | 13 +++++++------ .../Gui/VisualLineElement.cs | 7 ++++--- .../Gui/VisualLineText.cs | 8 +++++--- .../Utils/TextUtilities.cs | 17 +++++++++++------ 10 files changed, 51 insertions(+), 37 deletions(-) diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit.Tests/Utils/CaretNavigationTests.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit.Tests/Utils/CaretNavigationTests.cs index f86f651032..64845cb1e3 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit.Tests/Utils/CaretNavigationTests.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit.Tests/Utils/CaretNavigationTests.cs @@ -5,9 +5,10 @@ // $Revision$ // -using ICSharpCode.AvalonEdit.Gui; using System; +using System.Windows.Documents; using ICSharpCode.AvalonEdit.Document; +using ICSharpCode.AvalonEdit.Gui; using ICSharpCode.AvalonEdit.Utils; using NUnit.Framework; @@ -18,12 +19,12 @@ namespace ICSharpCode.AvalonEdit.Tests.Utils { int GetNextCaretStop(string text, int offset, CaretPositioningMode mode) { - return TextUtilities.GetNextCaretPosition(new StringTextSource(text), offset, false, mode); + return TextUtilities.GetNextCaretPosition(new StringTextSource(text), offset, LogicalDirection.Forward, mode); } int GetPrevCaretStop(string text, int offset, CaretPositioningMode mode) { - return TextUtilities.GetNextCaretPosition(new StringTextSource(text), offset, true, mode); + return TextUtilities.GetNextCaretPosition(new StringTextSource(text), offset, LogicalDirection.Backward, mode); } [Test] diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/Caret.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/Caret.cs index 2f495eacad..5bbc70db08 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/Caret.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/Caret.cs @@ -8,7 +8,7 @@ using System; using System.Diagnostics; using System.Windows; -using System.Windows.Controls; +using System.Windows.Documents; using System.Windows.Media.TextFormatting; using System.Windows.Threading; @@ -258,10 +258,10 @@ namespace ICSharpCode.AvalonEdit.Gui } } // search possible caret position (first try forwards) - int newVisualColumn = visualLine.GetNextCaretPosition(position.VisualColumn - 1, false, CaretPositioningMode.Normal); + int newVisualColumn = visualLine.GetNextCaretPosition(position.VisualColumn - 1, LogicalDirection.Forward, CaretPositioningMode.Normal); if (newVisualColumn < 0) { // then try backwards - newVisualColumn = visualLine.GetNextCaretPosition(position.VisualColumn + 1, true, CaretPositioningMode.Normal); + newVisualColumn = visualLine.GetNextCaretPosition(position.VisualColumn + 1, LogicalDirection.Backward, CaretPositioningMode.Normal); } if (newVisualColumn >= 0 && newVisualColumn != position.VisualColumn) { int newOffset = visualLine.GetRelativeOffset(newVisualColumn) + firstDocumentLineOffset; diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/CaretNavigationCommandHandler.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/CaretNavigationCommandHandler.cs index 5df4b6b2eb..2b98c6a30c 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/CaretNavigationCommandHandler.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/CaretNavigationCommandHandler.cs @@ -210,7 +210,7 @@ namespace ICSharpCode.AvalonEdit.Gui #region Home/End static void MoveCaretToStartOfLine(TextArea textArea, VisualLine visualLine) { - int newVC = visualLine.GetNextCaretPosition(-1, false, CaretPositioningMode.WordStart); + int newVC = visualLine.GetNextCaretPosition(-1, LogicalDirection.Forward, CaretPositioningMode.WordStart); // in empty lines (whitespace only), jump to the end if (newVC < 0) newVC = visualLine.VisualLength; @@ -232,7 +232,7 @@ namespace ICSharpCode.AvalonEdit.Gui #region By-character / By-word movement static void MoveCaretRight(TextArea textArea, TextViewPosition caretPosition, VisualLine visualLine, CaretPositioningMode mode) { - int pos = visualLine.GetNextCaretPosition(caretPosition.VisualColumn, false, mode); + int pos = visualLine.GetNextCaretPosition(caretPosition.VisualColumn, LogicalDirection.Forward, mode); if (pos >= 0) { SetCaretPosition(textArea, pos, visualLine.GetRelativeOffset(pos) + visualLine.FirstDocumentLine.Offset); } else { @@ -243,7 +243,7 @@ namespace ICSharpCode.AvalonEdit.Gui static void MoveCaretLeft(TextArea textArea, TextViewPosition caretPosition, VisualLine visualLine, CaretPositioningMode mode) { - int pos = visualLine.GetNextCaretPosition(caretPosition.VisualColumn, true, mode); + int pos = visualLine.GetNextCaretPosition(caretPosition.VisualColumn, LogicalDirection.Backward, mode); if (pos >= 0) { SetCaretPosition(textArea, pos, visualLine.GetRelativeOffset(pos) + visualLine.FirstDocumentLine.Offset); } else if (caretPosition.Line > 1) { diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/NewLineElementGenerator.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/NewLineElementGenerator.cs index 4b80e271b1..bbcb112951 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/NewLineElementGenerator.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/NewLineElementGenerator.cs @@ -7,6 +7,7 @@ using System; using System.Windows; +using System.Windows.Documents; using System.Windows.Media; using ICSharpCode.AvalonEdit.Document; @@ -65,11 +66,11 @@ namespace ICSharpCode.AvalonEdit.Gui BreakAfter = LineBreakCondition.BreakRestrained; } - public override int GetNextCaretPosition(int visualColumn, bool backwards, CaretPositioningMode mode) + public override int GetNextCaretPosition(int visualColumn, LogicalDirection direction, CaretPositioningMode mode) { // only place a caret stop before the newline, no caret stop after it - if (visualColumn > this.VisualColumn && backwards || - visualColumn < this.VisualColumn && !backwards) + if (visualColumn > this.VisualColumn && direction == LogicalDirection.Backward || + visualColumn < this.VisualColumn && direction == LogicalDirection.Forward) { return this.VisualColumn; } else { diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/SelectionMouseHandler.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/SelectionMouseHandler.cs index 000eadd009..4102aa6a22 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/SelectionMouseHandler.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/SelectionMouseHandler.cs @@ -10,6 +10,7 @@ using System.Diagnostics; using System.Linq; using System.Runtime.InteropServices; using System.Windows; +using System.Windows.Documents; using System.Windows.Input; using System.Windows.Threading; @@ -390,10 +391,10 @@ namespace ICSharpCode.AvalonEdit.Gui VisualLine line = textView.GetVisualLineFromVisualTop(pos.Y); if (line != null) { int visualColumn = line.GetVisualColumn(pos); - int wordStartVC = line.GetNextCaretPosition(visualColumn + 1, true, CaretPositioningMode.WordStartOrSymbol); + int wordStartVC = line.GetNextCaretPosition(visualColumn + 1, LogicalDirection.Backward, CaretPositioningMode.WordStartOrSymbol); if (wordStartVC == -1) wordStartVC = 0; - int wordEndVC = line.GetNextCaretPosition(wordStartVC, false, CaretPositioningMode.WordBorderOrSymbol); + int wordEndVC = line.GetNextCaretPosition(wordStartVC, LogicalDirection.Forward, CaretPositioningMode.WordBorderOrSymbol); if (wordEndVC == -1) wordEndVC = line.VisualLength; int relOffset = line.FirstDocumentLine.Offset; diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/SingleCharacterElementGenerator.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/SingleCharacterElementGenerator.cs index 499de2159f..39c6500970 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/SingleCharacterElementGenerator.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/SingleCharacterElementGenerator.cs @@ -5,13 +5,15 @@ // $Revision$ // -using ICSharpCode.AvalonEdit.Utils; using System; using System.Globalization; using System.Windows; +using System.Windows.Documents; using System.Windows.Media; using System.Windows.Media.TextFormatting; + using ICSharpCode.AvalonEdit.Document; +using ICSharpCode.AvalonEdit.Utils; namespace ICSharpCode.AvalonEdit.Gui { @@ -154,10 +156,10 @@ namespace ICSharpCode.AvalonEdit.Gui BreakAfter = LineBreakCondition.BreakDesired; } - public override int GetNextCaretPosition(int visualColumn, bool backwards, CaretPositioningMode mode) + public override int GetNextCaretPosition(int visualColumn, LogicalDirection direction, CaretPositioningMode mode) { if (mode == CaretPositioningMode.Normal) - return base.GetNextCaretPosition(visualColumn, backwards, mode); + return base.GetNextCaretPosition(visualColumn, direction, mode); else return -1; } @@ -184,10 +186,10 @@ namespace ICSharpCode.AvalonEdit.Gui throw new ArgumentOutOfRangeException("startVisualColumn"); } - public override int GetNextCaretPosition(int visualColumn, bool backwards, CaretPositioningMode mode) + public override int GetNextCaretPosition(int visualColumn, LogicalDirection direction, CaretPositioningMode mode) { if (mode == CaretPositioningMode.Normal) - return base.GetNextCaretPosition(visualColumn, backwards, mode); + return base.GetNextCaretPosition(visualColumn, direction, mode); else return -1; } diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/VisualLine.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/VisualLine.cs index 6f2cecd077..572d8d807d 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/VisualLine.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/VisualLine.cs @@ -10,6 +10,7 @@ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Diagnostics; using System.Windows; +using System.Windows.Documents; using System.Windows.Media.TextFormatting; using ICSharpCode.AvalonEdit.Document; @@ -315,22 +316,22 @@ namespace ICSharpCode.AvalonEdit.Gui /// /// Gets the next possible caret position after visualColumn, or -1 if there is no caret position. /// - public int GetNextCaretPosition(int visualColumn, bool backwards, CaretPositioningMode mode) + public int GetNextCaretPosition(int visualColumn, LogicalDirection direction, CaretPositioningMode mode) { if (elements.Count == 0) { // special handling for empty visual lines: // even though we don't have any elements, // there's a single caret stop at visualColumn 0 - if (visualColumn < 0 && !backwards) + if (visualColumn < 0 && direction == LogicalDirection.Forward) return 0; - else if (visualColumn > 0 && backwards) + else if (visualColumn > 0 && direction == LogicalDirection.Backward) return 0; else return -1; } int i; - if (backwards) { + if (direction == LogicalDirection.Backward) { // Search Backwards: // If the last element doesn't handle line borders, return the line end as caret stop if (visualColumn > this.VisualLength && !elements[elements.Count-1].HandlesLineBorders) { @@ -345,7 +346,7 @@ namespace ICSharpCode.AvalonEdit.Gui for (; i >= 0; i--) { int pos = elements[i].GetNextCaretPosition( Math.Min(visualColumn, elements[i].VisualColumn + elements[i].VisualLength + 1), - backwards, mode); + direction, mode); if (pos >= 0) return pos; } @@ -367,7 +368,7 @@ namespace ICSharpCode.AvalonEdit.Gui for (; i < elements.Count; i++) { int pos = elements[i].GetNextCaretPosition( Math.Max(visualColumn, elements[i].VisualColumn - 1), - backwards, mode); + direction, mode); if (pos >= 0) return pos; } diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/VisualLineElement.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/VisualLineElement.cs index 728e2d480a..4205bf6a93 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/VisualLineElement.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/VisualLineElement.cs @@ -7,6 +7,7 @@ using System; using System.Collections.Generic; +using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media.TextFormatting; @@ -167,18 +168,18 @@ namespace ICSharpCode.AvalonEdit.Gui /// Gets the next caret position inside this element. /// /// The visual column from which the search should be started. - /// Whether to search backwards (false=forwards,true=backwards). + /// The search direction (forwards or backwards). /// Whether to stop only at word borders. /// The visual column of the next caret position, or -1 if there is no next caret position. /// /// In the space between two line elements, it is sufficient that one of them contains a caret position; /// though in many cases, both of them contain one. /// - public virtual int GetNextCaretPosition(int visualColumn, bool backwards, CaretPositioningMode mode) + public virtual int GetNextCaretPosition(int visualColumn, LogicalDirection direction, CaretPositioningMode mode) { int stop1 = this.VisualColumn; int stop2 = this.VisualColumn + this.VisualLength; - if (backwards) { + if (direction == LogicalDirection.Backward) { if (visualColumn > stop2 && mode != CaretPositioningMode.WordStart && mode != CaretPositioningMode.WordStartOrSymbol) return stop2; else if (visualColumn > stop1) diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/VisualLineText.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/VisualLineText.cs index 6b5408398e..73b2154991 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/VisualLineText.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/VisualLineText.cs @@ -5,11 +5,13 @@ // $Revision$ // -using ICSharpCode.AvalonEdit.Utils; using System; using System.Collections.Generic; +using System.Windows.Documents; using System.Windows.Media.TextFormatting; + using ICSharpCode.AvalonEdit.Document; +using ICSharpCode.AvalonEdit.Utils; namespace ICSharpCode.AvalonEdit.Gui { @@ -92,13 +94,13 @@ namespace ICSharpCode.AvalonEdit.Gui } /// - public override int GetNextCaretPosition(int visualColumn, bool backwards, CaretPositioningMode mode) + public override int GetNextCaretPosition(int visualColumn, LogicalDirection direction, CaretPositioningMode mode) { int textOffset = parentVisualLine.FirstDocumentLine.Offset + this.RelativeTextOffset; TextSourceView view = new TextSourceView( parentVisualLine.FirstDocumentLine.Document, new SimpleSegment(textOffset, this.DocumentLength)); - int pos = TextUtilities.GetNextCaretPosition(view, visualColumn - this.VisualColumn, backwards, mode); + int pos = TextUtilities.GetNextCaretPosition(view, visualColumn - this.VisualColumn, direction, mode); if (pos < 0) return pos; else diff --git a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Utils/TextUtilities.cs b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Utils/TextUtilities.cs index 4441109ae2..81d0e2c3df 100644 --- a/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Utils/TextUtilities.cs +++ b/src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Utils/TextUtilities.cs @@ -7,7 +7,7 @@ using System; using System.Globalization; -using System.Text; +using System.Windows.Documents; using ICSharpCode.AvalonEdit.Document; using ICSharpCode.AvalonEdit.Gui; @@ -135,11 +135,11 @@ namespace ICSharpCode.AvalonEdit.Utils /// /// The text source. /// The start offset inside the text source. - /// True to look backwards, false to look forwards. + /// The search direction (forwards or backwards). /// The mode for caret positioning. /// The offset of the next caret position, or -1 if there is no further caret position /// in the text source. - public static int GetNextCaretPosition(ITextSource textSource, int offset, bool backwards, CaretPositioningMode mode) + public static int GetNextCaretPosition(ITextSource textSource, int offset, LogicalDirection direction, CaretPositioningMode mode) { if (textSource == null) throw new ArgumentNullException("textSource"); @@ -151,17 +151,22 @@ namespace ICSharpCode.AvalonEdit.Utils { throw new ArgumentException("Unsupported CaretPositioningMode: " + mode, "mode"); } + if (direction != LogicalDirection.Backward + && direction != LogicalDirection.Forward) + { + throw new ArgumentException("Invalid LogicalDirection: " + direction, "direction"); + } int textLength = textSource.TextLength; if (textLength <= 0) { // empty document? has a normal caret position at 0, though no word borders if (mode == CaretPositioningMode.Normal) { - if (offset > 0 && backwards) return 0; - if (offset < 0 && !backwards) return 0; + if (offset > 0 && direction == LogicalDirection.Backward) return 0; + if (offset < 0 && direction == LogicalDirection.Forward) return 0; } return -1; } while (true) { - int nextPos = backwards ? offset - 1 : offset + 1; + int nextPos = (direction == LogicalDirection.Backward) ? offset - 1 : offset + 1; // return -1 if there is no further caret position in the text source // we also need this to handle offset values outside the valid range