protected override void OnKeyDown(KeyEventArgs e) { base.OnKeyDown(e); if (e.Modifiers == Keys.None) { switch (e.KeyCode) { case Keys.Space: case Keys.Return: if (SelectedNode != null) { SelectedNode.Toggle(); } break; case Keys.Down: SelectNext(); break; case Keys.Left: if (SelectedNode != null) { SelectedNode.Collapse(); } break; case Keys.Right: if (SelectedNode != null) { SelectedNode.Expand(); } break; case Keys.Up: SelectPrevious(); break; case Keys.PageDown: if (nodeList.Count > 0) { var lNodesOnScreen = nodesOnScreen; var nextIndex = 0; if (SelectedNode != null) { nextIndex = nodeList.IndexOf(SelectedNode); } nextIndex = MathHelper.Clamp(nextIndex + lNodesOnScreen, 0, nodeList.Count - 1); SelectedNode = nodeList[nextIndex]; } break; case Keys.PageUp: if (nodeList.Count > 0) { var lNodesOnScreen = nodesOnScreen; var nextIndex = 0; if (SelectedNode != null) { nextIndex = nodeList.IndexOf(SelectedNode); } nextIndex = MathHelper.Clamp(nextIndex - lNodesOnScreen, 0, nodeList.Count - 1); SelectedNode = nodeList[nextIndex]; } break; case Keys.End: if (nodeList.Count > 0) { SelectedNode = nodeList[nodeList.Count - 1]; } break; case Keys.Home: if (nodeList.Count > 0) { SelectedNode = nodeList[0]; } break; } } else if (e.Control) { switch (e.KeyCode) { case Keys.Down: if (vScrollBar != null) { vScrollBar.DoScroll(ScrollEventType.SmallIncrement); } break; case Keys.Up: if (vScrollBar != null) { vScrollBar.DoScroll(ScrollEventType.SmallDecrement); } break; } } char c = KeyHelper.GetLastInputChar(); if (char.IsLetterOrDigit(c) || char.IsPunctuation(c)) { filter += c; resetFilterTime = 3; // sec. SelectNodeWText(filter); } }