protected override void OnKeyPress(KeyEventArgs args)
{
// Ignorieren, wenn kein Fokus
if (Focused != TreeState.Active) return;
// Linke Pfeiltaste
if (args.Key == Keys.Left)
{
if (args.Ctrl)
{
int x = Math.Min(CursorPosition - 1, Text.Length - 1);
while (x > 0 && Text[x] != ' ') x--;
CursorPosition = x;
}
else
{
CursorPosition--;
CursorPosition = Math.Max(CursorPosition, 0);
}
if (!args.Shift)
SelectionStart = CursorPosition;
args.Handled = true;
}
// Rechte Pfeiltaste
if (args.Key == Keys.Right)
{
if (args.Ctrl)
{
int x = CursorPosition;
while (x < Text.Length && Text[x] != ' ') x++;
CursorPosition = Math.Min(x + 1, Text.Length);
}
else
{
CursorPosition++;
CursorPosition = Math.Min(Text.Length, CursorPosition);
}
if (!args.Shift)
SelectionStart = CursorPosition;
args.Handled = true;
}
// Pos1-Taste
if (args.Key == Keys.Home)
{
CursorPosition = 0;
if (!args.Shift)
SelectionStart = CursorPosition;
args.Handled = true;
}
// Ende-Taste
if (args.Key == Keys.End)
{
CursorPosition = Text.Length;
if (!args.Shift)
SelectionStart = CursorPosition;
args.Handled = true;
}
// Backspace
if (args.Key == Keys.Back)
{
if (SelectionStart != CursorPosition)
{
int from = Math.Min(SelectionStart, CursorPosition);
int to = Math.Max(SelectionStart, CursorPosition);
Text = Text.Substring(0, from) + Text.Substring(to);
CursorPosition = from;
SelectionStart = from;
}
else if (CursorPosition > 0)
{
Text = Text.Substring(0, CursorPosition - 1) + Text.Substring(CursorPosition);
CursorPosition--;
SelectionStart--;
}
args.Handled = true;
}
// Entfernen
if (args.Key == Keys.Delete)
{
if (SelectionStart != CursorPosition)
{
int from = Math.Min(SelectionStart, CursorPosition);
int to = Math.Max(SelectionStart, CursorPosition);
Text = Text.Substring(0, from) + Text.Substring(to);
CursorPosition = from;
SelectionStart = from;
}
else if (CursorPosition < Text.Length)
{
Text = Text.Substring(0, CursorPosition) + Text.Substring(CursorPosition + 1);
}
args.Handled = true;
}
// Ctrl+A (Select all)
if (args.Key == Keys.A && args.Ctrl)
{
// Alles markieren
SelectionStart = 0;
CursorPosition = Text.Length;
args.Handled = true;
}
// Ctrl+C (Copy)
if (args.Key == Keys.C && args.Ctrl)
{
int from = Math.Min(SelectionStart, CursorPosition);
int to = Math.Max(SelectionStart, CursorPosition);
// Selektion kopieren
if (from == to) SystemSpecific.ClearClipboard();
else SystemSpecific.SetClipboardText(Text.Substring(from, to - from));
args.Handled = true;
}
// Ctrl+X (Cut)
if (args.Key == Keys.X && args.Ctrl)
{
int from = Math.Min(SelectionStart, CursorPosition);
int to = Math.Max(SelectionStart, CursorPosition);
// Selektion ausschneiden
if (from == to) SystemSpecific.ClearClipboard();
else SystemSpecific.SetClipboardText(Text.Substring(from, to - from));
CursorPosition = from;
SelectionStart = from;
Text = Text.Substring(0, from) + Text.Substring(to);
args.Handled = true;
}
// Ctrl+V (Paste)
if (args.Key == Keys.V && args.Ctrl)
{
// Selektierten Text löschen
if (SelectionStart != CursorPosition)
{
int from = Math.Min(SelectionStart, CursorPosition);
int to = Math.Max(SelectionStart, CursorPosition);
Text = Text.Substring(0, from) + Text.Substring(to);
CursorPosition = from;
SelectionStart = from;
}
// Text einfügen und Cursor ans Ende setzen
string paste = SystemSpecific.GetClipboardText();
Text = Text.Substring(0, CursorPosition) + paste + Text.Substring(CursorPosition);
CursorPosition += paste.Length;
SelectionStart = CursorPosition;
args.Handled = true;
}
args.Handled = true;
//Manche Keys weitergeben
if (ignoreKeys.Contains(args.Key))
args.Handled = false;
base.OnKeyPress(args);
}