void __keydown(EventContext context)
{
if (!_editing || context.isDefaultPrevented)
return;
InputEvent evt = context.inputEvent;
switch (evt.keyCode)
{
case KeyCode.Backspace:
{
context.PreventDefault();
if (_selectionStart != null)
ReplaceSelection(null);
else if (_caretPosition > 0)
{
int tmp = _caretPosition;
_caretPosition--;
ReplaceText(textField.text.Substring(0, tmp - 1) + textField.text.Substring(tmp));
}
break;
}
case KeyCode.Delete:
{
context.PreventDefault();
if (_selectionStart != null)
ReplaceSelection(null);
else if (_caretPosition < textField.text.Length)
ReplaceText(textField.text.Substring(0, _caretPosition) + textField.text.Substring(_caretPosition + 1));
break;
}
case KeyCode.LeftArrow:
{
context.PreventDefault();
if (evt.shift)
{
if (_selectionStart == null)
_selectionStart = GetCharPosition(_caretPosition);
}
else
ClearSelection();
if (_caretPosition > 0)
{
TextField.CharPosition cp = GetCharPosition(_caretPosition - 1);
AdjustCaret(cp);
}
break;
}
case KeyCode.RightArrow:
{
context.PreventDefault();
if (evt.shift)
{
if (_selectionStart == null)
_selectionStart = GetCharPosition(_caretPosition);
}
else
ClearSelection();
if (_caretPosition < textField.text.Length)
{
TextField.CharPosition cp = GetCharPosition(_caretPosition + 1);
AdjustCaret(cp);
}
break;
}
case KeyCode.UpArrow:
{
context.PreventDefault();
if (evt.shift)
{
if (_selectionStart == null)
_selectionStart = GetCharPosition(_caretPosition);
}
else
ClearSelection();
TextField.CharPosition cp = GetCharPosition(_caretPosition);
if (cp.lineIndex == 0)
return;
TextField.LineInfo line = textField.lines[cp.lineIndex - 1];
cp = GetCharPosition(new Vector2(_caret.x, line.y + textField.y));
AdjustCaret(cp);
break;
}
case KeyCode.DownArrow:
{
context.PreventDefault();
if (evt.shift)
{
if (_selectionStart == null)
_selectionStart = GetCharPosition(_caretPosition);
}
else
ClearSelection();
TextField.CharPosition cp = GetCharPosition(_caretPosition);
if (cp.lineIndex == textField.lines.Count - 1)
cp.caretIndex = textField.charPositions.Count - 1;
else
{
TextField.LineInfo line = textField.lines[cp.lineIndex + 1];
cp = GetCharPosition(new Vector2(_caret.x, line.y + textField.y));
}
AdjustCaret(cp);
break;
}
case KeyCode.PageUp:
{
context.PreventDefault();
ClearSelection();
break;
}
case KeyCode.PageDown:
{
context.PreventDefault();
ClearSelection();
break;
}
case KeyCode.Home:
{
context.PreventDefault();
ClearSelection();
TextField.CharPosition cp = GetCharPosition(_caretPosition);
TextField.LineInfo line = textField.lines[cp.lineIndex];
cp = GetCharPosition(new Vector2(int.MinValue, line.y + textField.y));
AdjustCaret(cp);
break;
}
case KeyCode.End:
{
context.PreventDefault();
ClearSelection();
TextField.CharPosition cp = GetCharPosition(_caretPosition);
TextField.LineInfo line = textField.lines[cp.lineIndex];
cp = GetCharPosition(new Vector2(int.MaxValue, line.y + textField.y));
AdjustCaret(cp);
break;
}
//Select All
case KeyCode.A:
{
if (evt.ctrl)
{
context.PreventDefault();
_selectionStart = GetCharPosition(0);
AdjustCaret(GetCharPosition(textField.text.Length));
}
break;
}
//Copy
case KeyCode.C:
{
if (evt.ctrl && !_displayAsPassword)
{
context.PreventDefault();
string s = GetSelection();
if (!string.IsNullOrEmpty(s))
DoCopy(s);
}
break;
}
//Paste
case KeyCode.V:
{
if (evt.ctrl)
{
context.PreventDefault();
DoPaste();
}
break;
}
//Cut
case KeyCode.X:
{
if (evt.ctrl && !_displayAsPassword)
{
context.PreventDefault();
string s = GetSelection();
if (!string.IsNullOrEmpty(s))
{
DoCopy(s);
ReplaceSelection(null);
}
}
break;
}
case KeyCode.Return:
case KeyCode.KeypadEnter:
{
if (!evt.ctrl && !evt.shift)
{
context.PreventDefault();
if (!textField.singleLine)
ReplaceSelection("\n");
}
break;
}
}
}