public void OnMotion (MouseEventArgs args)
{
// Windows helpfully sends us MOUSEMOVE messages when any key is pressed.
// So if the mouse hasn't actually moved since the last MOUSEMOVE, ignore it.
if (args.Location == last_motion)
return;
last_motion = args.Location;
MenuItem item = GetItemAtXY (args.X, args.Y);
UpdateCursor ();
if (CurrentMenu.SelectedItem == item)
return;
//GrabControl.ActiveTracker = (active || item != null) ? this : null;
if (item == null) {
MenuItem old_item = CurrentMenu.SelectedItem;
// Return when is a popup with visible subitems for MainMenu
if ((active && old_item.VisibleItems && old_item.IsPopup && (CurrentMenu is MainMenu)))
return;
// Also returns when keyboard navigating
if (keynav_state == KeyNavState.Navigating)
return;
// Select parent menu when move outside of menu item
if (old_item.Parent is MenuItem) {
MenuItem new_item = (old_item.Parent as MenuItem);
if (new_item.IsPopup) {
SelectItem (new_item.Parent, new_item, false);
return;
}
}
if (CurrentMenu != TopMenu)
CurrentMenu = CurrentMenu.parent_menu;
DeselectItem (old_item);
} else {
keynav_state = KeyNavState.Idle;
SelectItem (item.Parent, item, active && item.IsPopup && popup_active && (CurrentMenu.SelectedItem != item));
}
}