Browse Source

GetNextCaretPosition methods: Use enum LogicalDirection instead of bool backwards.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@4037 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 17 years ago
parent
commit
cc8eddac14
  1. 7
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit.Tests/Utils/CaretNavigationTests.cs
  2. 6
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/Caret.cs
  3. 6
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/CaretNavigationCommandHandler.cs
  4. 7
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/NewLineElementGenerator.cs
  5. 5
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/SelectionMouseHandler.cs
  6. 12
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/SingleCharacterElementGenerator.cs
  7. 13
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/VisualLine.cs
  8. 7
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/VisualLineElement.cs
  9. 8
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/VisualLineText.cs
  10. 17
      src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Utils/TextUtilities.cs

7
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit.Tests/Utils/CaretNavigationTests.cs

@ -5,9 +5,10 @@ @@ -5,9 +5,10 @@
// <version>$Revision$</version>
// </file>
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 @@ -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]

6
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/Caret.cs

@ -8,7 +8,7 @@ @@ -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 @@ -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;

6
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/CaretNavigationCommandHandler.cs

@ -210,7 +210,7 @@ namespace ICSharpCode.AvalonEdit.Gui @@ -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 @@ -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 @@ -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) {

7
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/NewLineElementGenerator.cs

@ -7,6 +7,7 @@ @@ -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 @@ -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 {

5
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/SelectionMouseHandler.cs

@ -10,6 +10,7 @@ using System.Diagnostics; @@ -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 @@ -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;

12
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/SingleCharacterElementGenerator.cs

@ -5,13 +5,15 @@ @@ -5,13 +5,15 @@
// <version>$Revision$</version>
// </file>
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 @@ -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 @@ -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;
}

13
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/VisualLine.cs

@ -10,6 +10,7 @@ using System.Collections.Generic; @@ -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 @@ -315,22 +316,22 @@ namespace ICSharpCode.AvalonEdit.Gui
/// <summary>
/// Gets the next possible caret position after visualColumn, or -1 if there is no caret position.
/// </summary>
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 @@ -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 @@ -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;
}

7
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/VisualLineElement.cs

@ -7,6 +7,7 @@ @@ -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 @@ -167,18 +168,18 @@ namespace ICSharpCode.AvalonEdit.Gui
/// Gets the next caret position inside this element.
/// </summary>
/// <param name="visualColumn">The visual column from which the search should be started.</param>
/// <param name="backwards">Whether to search backwards (false=forwards,true=backwards).</param>
/// <param name="direction">The search direction (forwards or backwards).</param>
/// <param name="mode">Whether to stop only at word borders.</param>
/// <returns>The visual column of the next caret position, or -1 if there is no next caret position.</returns>
/// <remarks>
/// 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.
/// </remarks>
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)

8
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Gui/VisualLineText.cs

@ -5,11 +5,13 @@ @@ -5,11 +5,13 @@
// <version>$Revision$</version>
// </file>
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 @@ -92,13 +94,13 @@ namespace ICSharpCode.AvalonEdit.Gui
}
/// <inheritdoc/>
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

17
src/Libraries/AvalonEdit/ICSharpCode.AvalonEdit/Utils/TextUtilities.cs

@ -7,7 +7,7 @@ @@ -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 @@ -135,11 +135,11 @@ namespace ICSharpCode.AvalonEdit.Utils
/// </summary>
/// <param name="textSource">The text source.</param>
/// <param name="offset">The start offset inside the text source.</param>
/// <param name="backwards">True to look backwards, false to look forwards.</param>
/// <param name="direction">The search direction (forwards or backwards).</param>
/// <param name="mode">The mode for caret positioning.</param>
/// <returns>The offset of the next caret position, or -1 if there is no further caret position
/// in the text source.</returns>
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 @@ -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

Loading…
Cancel
Save