/// <summary>
/// Key has been pressed down.
/// </summary>
/// <param name="c">Reference to the source control instance.</param>
/// <param name="e">A KeyEventArgs that contains the event data.</param>
public virtual void KeyDown(Control c, KeyEventArgs e)
{
Debug.Assert(c != null);
Debug.Assert(e != null);
// Validate incoming references
if (c == null)
{
throw new ArgumentNullException(nameof(c));
}
if (e == null)
{
throw new ArgumentNullException(nameof(e));
}
switch (e.KeyCode)
{
case Keys.Enter:
case Keys.Space:
// Only interested in enabled items
if (_menuItem.ItemEnabled)
{
// Do we press the item or show the sub menu?
if (!_menuItem.HasSubMenu)
{
PressMenuItem();
}
else
{
_menuItem.ShowSubMenu(true);
}
}
break;
case Keys.Tab:
_viewManager.KeyTab(e.Shift);
break;
case Keys.Home:
_viewManager.KeyHome();
break;
case Keys.End:
_viewManager.KeyEnd();
break;
case Keys.Up:
_viewManager.KeyUp();
break;
case Keys.Down:
_viewManager.KeyDown();
break;
case Keys.Left:
// We wrap if are the first context menu shown, rather than a sub menu showing
if (_viewManager.KeyLeft(!_menuItem.HasParentMenu))
{
// User tried to fall off the left edge, so dismiss ourself and let the
// keyboard access take us back to the owning context menu instance
_menuItem.DisposeContextMenu();
}
break;
case Keys.Right:
// If enabled and with a sub menu, then show the sub menu
if (_menuItem.ItemEnabled && _menuItem.HasSubMenu)
{
_menuItem.ShowSubMenu(true);
}
else
{
_viewManager.KeyRight();
}
break;
}
}