MonoGameUi.Textbox.OnKeyPress C# (CSharp) Method

OnKeyPress() protected method

Wird aufgerufen, wenn eine Taste gedrückt ist.
protected OnKeyPress ( Microsoft.Xna.Framework.Input.KeyEventArgs args ) : void
args Microsoft.Xna.Framework.Input.KeyEventArgs Zusätzliche Daten zum Event.
return void
        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);
        }