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;
}
}