public void HandleKeyDown()

in src/XmlNotepad/TreeView.cs [448:580]


        public void HandleKeyDown(KeyEventArgs e)
        {

            TreeNode sel = this.SelectedNode;

            bool isLetterOrDigit = ((e.KeyCode >= Keys.A && e.KeyCode <= Keys.Z) ||
                                   (e.KeyCode >= Keys.D0 && e.KeyCode <= Keys.D9)) &&
                                   (e.Modifiers == Keys.Shift || e.Modifiers == 0);

            if (e.Modifiers == Keys.Control && (e.KeyCode == Keys.Home || e.KeyCode == Keys.End))
            {
                // drop through in this case.
            }
            else if (e.Modifiers != 0 && !isLetterOrDigit)
            {
                // Reserve use of modifiers for other things, like multi-select expansion and so on.
                return;
            }

            TreeNode n = this.SelectedNode;

            switch (e.KeyCode)
            {
                case Keys.Left:
                    if (sel != null)
                    {
                        if (sel.IsExpanded)
                        {
                            sel.Collapse();
                        }
                        else if (sel.Parent != null)
                        {
                            this.SelectedNode = sel.Parent;
                        }
                    }
                    e.Handled = true;
                    break;
                case Keys.Right:
                    if (sel != null && !sel.IsExpanded)
                    {
                        sel.Expand();
                    }
                    e.Handled = true;
                    break;
                case Keys.Up:
                    if (sel != null)
                    {
                        TreeNode prev = sel.PrevVisibleNode;
                        if (prev != null)
                        {
                            this.SelectedNode = prev;
                        }
                    }
                    else
                    {
                        this.SelectedNode = this.LastVisibleNode;
                    }
                    e.Handled = true;
                    break;
                case Keys.Down:
                    if (sel != null)
                    {
                        TreeNode next = sel.NextVisibleNode;
                        if (next != null)
                        {
                            this.SelectedNode = next;
                        }
                    }
                    else
                    {
                        this.SelectedNode = this.FirstVisibleNode;
                    }
                    e.Handled = true;
                    break;
                case Keys.Home:
                    this.SelectedNode = this.FirstVisibleNode;
                    e.Handled = true;
                    break;
                case Keys.End:
                    this.SelectedNode = this.LastVisibleNode;
                    e.Handled = true;
                    break;
                case Keys.PageDown:
                    this.HandlePageDown();
                    e.Handled = true;
                    return;
                case Keys.PageUp:
                    this.HandlePageUp();
                    e.Handled = true;
                    return;

                case Keys.Multiply:
                    if (n != null)
                    {
                        n.ExpandAll();
                        e.Handled = true;
                    }
                    return;
                case Keys.Add:
                    if (n != null)
                    {
                        n.Expand();
                        e.Handled = true;
                    }
                    return;
                case Keys.Subtract:
                    if (n != null)
                    {
                        n.Collapse();
                        e.Handled = true;
                    }
                    break;
                default:
                    if (isLetterOrDigit && !e.Handled && this.ContainsFocus)
                    {
                        if (_ttf.Started)
                        {
                            e.Handled = true;
                        }
                        else if (!this.IsEditing)
                        {
                            char ch = Convert.ToChar(e.KeyValue);
                            if (!e.Shift) ch = Char.ToLower(ch);
                            if (Char.IsLetter(ch) && this.BeginEdit(ch.ToString()))
                            {
                                this._editor.SelectEnd();
                                e.Handled = true;
                            }
                        }
                    }
                    break;
            }
        }