Browse Source

Handle \r\n newlines in TextBox.

Fixes #501.
pull/644/head
Steven Kirk 10 years ago
parent
commit
2d8a54ac62
  1. 78
      src/Avalonia.Controls/TextBox.cs

78
src/Avalonia.Controls/TextBox.cs

@ -362,8 +362,7 @@ namespace Avalonia.Controls
case Key.Back: case Key.Back:
if (!DeleteSelection() && CaretIndex > 0) if (!DeleteSelection() && CaretIndex > 0)
{ {
Text = text.Substring(0, caretIndex - 1) + text.Substring(caretIndex); CaretIndex -= DeleteCharacter(CaretIndex - 1);
--CaretIndex;
} }
break; break;
@ -371,7 +370,7 @@ namespace Avalonia.Controls
case Key.Delete: case Key.Delete:
if (!DeleteSelection() && caretIndex < text.Length) if (!DeleteSelection() && caretIndex < text.Length)
{ {
Text = text.Substring(0, caretIndex) + text.Substring(caretIndex + 1); DeleteCharacter(CaretIndex);
} }
break; break;
@ -473,27 +472,84 @@ namespace Avalonia.Controls
{ {
var text = Text; var text = Text;
var length = text?.Length ?? 0; var length = text?.Length ?? 0;
return Math.Max(0, Math.Min(length, value));
if (value < 0)
{
return 0;
}
else if (value > length)
{
return length;
}
else if (value > 0 && text[value - 1] == '\r' && text[value] == '\n')
{
return value + 1;
}
else
{
return value;
}
}
private int DeleteCharacter(int index)
{
var start = index + 1;
var text = Text;
var c = text[index];
var result = 1;
if (c == '\n' && index > 0 && text[index - 1] == '\r')
{
--index;
++result;
}
else if (c == '\r' && index < text.Length - 1 && text[index + 1] == '\n')
{
++start;
++result;
}
Text = text.Substring(0, index) + text.Substring(start);
return result;
} }
private void MoveHorizontal(int count, InputModifiers modifiers) private void MoveHorizontal(int direction, InputModifiers modifiers)
{ {
var text = Text ?? string.Empty; var text = Text ?? string.Empty;
var caretIndex = CaretIndex; var caretIndex = CaretIndex;
if ((modifiers & InputModifiers.Control) != 0) if ((modifiers & InputModifiers.Control) == 0)
{
var index = caretIndex + direction;
if (index < 0 || index >= text.Length)
{
return;
}
var c = text[index];
if (direction > 0)
{
CaretIndex += (c == '\r' && index < text.Length - 1 && text[index + 1] == '\n') ? 2 : 1;
}
else
{
CaretIndex -= (c == '\n' && index > 0 && text[index - 1] == '\r') ? 2 : 1;
}
}
else
{ {
if (count > 0) if (direction > 0)
{ {
count = StringUtils.NextWord(text, caretIndex, false) - caretIndex; CaretIndex += StringUtils.NextWord(text, caretIndex, false) - caretIndex;
} }
else else
{ {
count = StringUtils.PreviousWord(text, caretIndex, false) - caretIndex; CaretIndex += StringUtils.PreviousWord(text, caretIndex, false) - caretIndex;
} }
} }
CaretIndex = caretIndex += count;
} }
private void MoveVertical(int count, InputModifiers modifiers) private void MoveVertical(int count, InputModifiers modifiers)

Loading…
Cancel
Save