internal void Deactivate() { bool redrawbar = (keynav_state != KeyNavState.Idle) && (TopMenu is MainMenu); active = false; popup_active = false; hotkey_active = false; if (GrabControl != null) { GrabControl.ActiveTracker = null; } keynav_state = KeyNavState.Idle; if (TopMenu is ContextMenu) { PopUpWindow puw = TopMenu.Wnd as PopUpWindow; DeselectItem(TopMenu.SelectedItem); if (puw != null) { puw.HideWindow(); } } else { DeselectItem(TopMenu.SelectedItem); } CurrentMenu = TopMenu; if (redrawbar) { (TopMenu as MainMenu).Draw(); } }
void ProcessMenuKey(Msg msg_type) { if (TopMenu.MenuItems.Count == 0) { return; } MainMenu main_menu = TopMenu as MainMenu; switch (msg_type) { case Msg.WM_SYSKEYDOWN: switch (keynav_state) { case KeyNavState.Idle: keynav_state = KeyNavState.Startup; hotkey_active = true; GrabControl.ActiveTracker = this; CurrentMenu = TopMenu; main_menu.Draw(); break; case KeyNavState.Startup: break; default: Deactivate(); main_menu.Draw(); break; } break; case Msg.WM_SYSKEYUP: switch (keynav_state) { case KeyNavState.Idle: case KeyNavState.Navigating: break; case KeyNavState.Startup: keynav_state = KeyNavState.NoPopups; SelectItem(TopMenu, TopMenu.MenuItems [0], false); break; default: Deactivate(); main_menu.Draw(); break; } break; } }
bool ProcessMnemonic(Message msg, Keys key_data) { keynav_state = KeyNavState.Navigating; MenuItem item = FindItemByKey(CurrentMenu, msg.WParam); if ((item == null) || (GrabControl == null) || (GrabControl.ActiveTracker == null)) { return(false); } active = true; GrabControl.ActiveTracker = this; SelectItem(CurrentMenu, item, true); if (item.IsPopup) { CurrentMenu = item; SelectItem(item, item.MenuItems [0], false); } return(true); }
public bool ProcessKeys(ref Message msg, Keys keyData) { // We should process Alt+key only if we don't have an active menu, // and hide it otherwise. if ((keyData & Keys.Alt) == Keys.Alt && active) { Deactivate(); return(false); } // If we get Alt-F4, Windows will ignore it because we have a capture, // release the capture and the program will exit. (X11 doesn't care.) if ((keyData & Keys.Alt) == Keys.Alt && (keyData & Keys.F4) == Keys.F4) { if (GrabControl != null) { GrabControl.ActiveTracker = null; } return(false); } if ((Msg)msg.Msg != Msg.WM_SYSKEYUP && ProcessShortcut(keyData)) { return(true); } else if ((keyData & Keys.KeyCode) == Keys.Menu && TopMenu is MainMenu) { ProcessMenuKey((Msg)msg.Msg); return(true); } else if ((keyData & Keys.Alt) == Keys.Alt) { return(ProcessMnemonic(msg, keyData)); } else if ((Msg)msg.Msg == Msg.WM_SYSKEYUP) { return(false); } else if (!Navigating) { return(false); } MenuItem item; switch (keyData) { case Keys.Up: if (CurrentMenu is MainMenu) { return(true); } else if (CurrentMenu.MenuItems.Count == 1 && CurrentMenu.parent_menu == TopMenu) { DeselectItem(CurrentMenu.SelectedItem); CurrentMenu = TopMenu; return(true); } item = GetNextItem(CurrentMenu, ItemNavigation.Previous); if (item != null) { SelectItem(CurrentMenu, item, false); } break; case Keys.Down: if (CurrentMenu is MainMenu) { if (CurrentMenu.SelectedItem != null && CurrentMenu.SelectedItem.IsPopup) { keynav_state = KeyNavState.Navigating; item = CurrentMenu.SelectedItem; ShowSubPopup(CurrentMenu, item); SelectItem(item, item.MenuItems [0], false); CurrentMenu = item; active = true; GrabControl.ActiveTracker = this; } return(true); } item = GetNextItem(CurrentMenu, ItemNavigation.Next); if (item != null) { SelectItem(CurrentMenu, item, false); } break; case Keys.Right: if (CurrentMenu is MainMenu) { item = GetNextItem(CurrentMenu, ItemNavigation.Next); bool popup = item.IsPopup && keynav_state != KeyNavState.NoPopups; SelectItem(CurrentMenu, item, popup); if (popup) { SelectItem(item, item.MenuItems [0], false); CurrentMenu = item; } } else if (CurrentMenu.SelectedItem != null && CurrentMenu.SelectedItem.IsPopup) { item = CurrentMenu.SelectedItem; ShowSubPopup(CurrentMenu, item); SelectItem(item, item.MenuItems [0], false); CurrentMenu = item; } else { //Search up for a main menu Menu Prnt = CurrentMenu.parent_menu; while (Prnt != null && !(Prnt is MainMenu)) { Prnt = Prnt.parent_menu; } if (Prnt is MainMenu) { item = GetNextItem(Prnt, ItemNavigation.Next); SelectItem(Prnt, item, item.IsPopup); if (item.IsPopup) { SelectItem(item, item.MenuItems[0], false); CurrentMenu = item; } } } break; case Keys.Left: if (CurrentMenu is MainMenu) { item = GetNextItem(CurrentMenu, ItemNavigation.Previous); bool popup = item.IsPopup && keynav_state != KeyNavState.NoPopups; SelectItem(CurrentMenu, item, popup); if (popup) { SelectItem(item, item.MenuItems [0], false); CurrentMenu = item; } } else if (CurrentMenu.parent_menu is MainMenu) { item = GetNextItem(CurrentMenu.parent_menu, ItemNavigation.Previous); SelectItem(CurrentMenu.parent_menu, item, item.IsPopup); if (item.IsPopup) { SelectItem(item, item.MenuItems [0], false); CurrentMenu = item; } } else if (!(CurrentMenu is ContextMenu)) // ContextMenu root remains active. { HideSubPopups(CurrentMenu, TopMenu); if (CurrentMenu.parent_menu != null) { CurrentMenu = CurrentMenu.parent_menu; } } break; case Keys.Return: if (CurrentMenu.SelectedItem != null && CurrentMenu.SelectedItem.IsPopup) { keynav_state = KeyNavState.Navigating; item = CurrentMenu.SelectedItem; ShowSubPopup(CurrentMenu, item); SelectItem(item, item.MenuItems [0], false); CurrentMenu = item; active = true; GrabControl.ActiveTracker = this; } else { ExecFocusedItem(CurrentMenu, CurrentMenu.SelectedItem); } break; case Keys.Escape: Deactivate(); break; default: ProcessMnemonic(msg, keyData); break; } return(active); }
// UIA Framework Note: Used to select MenuItems 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)); } }
internal void Deactivate () { bool redrawbar = (keynav_state != KeyNavState.Idle) && (TopMenu is MainMenu); active = false; popup_active = false; hotkey_active = false; if (GrabControl != null) GrabControl.ActiveTracker = null; keynav_state = KeyNavState.Idle; if (TopMenu is ContextMenu) { PopUpWindow puw = TopMenu.Wnd as PopUpWindow; DeselectItem (TopMenu.SelectedItem); if (puw != null) puw.HideWindow (); } else { DeselectItem (TopMenu.SelectedItem); } CurrentMenu = TopMenu; if (redrawbar) (TopMenu as MainMenu).Draw (); }
public bool ProcessKeys (ref Message msg, Keys keyData) { // We should process Alt+key only if we don't have an active menu, // and hide it otherwise. if ((keyData & Keys.Alt) == Keys.Alt && active) { Deactivate (); return false; } // If we get Alt-F4, Windows will ignore it because we have a capture, // release the capture and the program will exit. (X11 doesn't care.) if ((keyData & Keys.Alt) == Keys.Alt && (keyData & Keys.F4) == Keys.F4) { if (GrabControl != null) GrabControl.ActiveTracker = null; return false; } if ((Msg)msg.Msg != Msg.WM_SYSKEYUP && ProcessShortcut (keyData)) return true; else if ((keyData & Keys.KeyCode) == Keys.Menu && TopMenu is MainMenu) { ProcessMenuKey ((Msg) msg.Msg); return true; } else if ((keyData & Keys.Alt) == Keys.Alt) return ProcessMnemonic (msg, keyData); else if ((Msg)msg.Msg == Msg.WM_SYSKEYUP) return false; else if (!Navigating) return false; MenuItem item; switch (keyData) { case Keys.Up: if (CurrentMenu is MainMenu) return true; else if (CurrentMenu.MenuItems.Count == 1 && CurrentMenu.parent_menu == TopMenu) { DeselectItem (CurrentMenu.SelectedItem); CurrentMenu = TopMenu; return true; } item = GetNextItem (CurrentMenu, ItemNavigation.Previous); if (item != null) SelectItem (CurrentMenu, item, false); break; case Keys.Down: if (CurrentMenu is MainMenu) { if (CurrentMenu.SelectedItem != null && CurrentMenu.SelectedItem.IsPopup) { keynav_state = KeyNavState.Navigating; item = CurrentMenu.SelectedItem; ShowSubPopup (CurrentMenu, item); SelectItem (item, item.MenuItems [0], false); CurrentMenu = item; active = true; GrabControl.ActiveTracker = this; } return true; } item = GetNextItem (CurrentMenu, ItemNavigation.Next); if (item != null) SelectItem (CurrentMenu, item, false); break; case Keys.Right: if (CurrentMenu is MainMenu) { item = GetNextItem (CurrentMenu, ItemNavigation.Next); bool popup = item.IsPopup && keynav_state != KeyNavState.NoPopups; SelectItem (CurrentMenu, item, popup); if (popup) { SelectItem (item, item.MenuItems [0], false); CurrentMenu = item; } } else if (CurrentMenu.SelectedItem != null && CurrentMenu.SelectedItem.IsPopup) { item = CurrentMenu.SelectedItem; ShowSubPopup (CurrentMenu, item); SelectItem (item, item.MenuItems [0], false); CurrentMenu = item; } else { //Search up for a main menu Menu Prnt = CurrentMenu.parent_menu; while (Prnt != null && !(Prnt is MainMenu)) { Prnt = Prnt.parent_menu; } if (Prnt is MainMenu) { item = GetNextItem(Prnt, ItemNavigation.Next); SelectItem(Prnt, item, item.IsPopup); if (item.IsPopup) { SelectItem(item, item.MenuItems[0], false); CurrentMenu = item; } } } break; case Keys.Left: if (CurrentMenu is MainMenu) { item = GetNextItem (CurrentMenu, ItemNavigation.Previous); bool popup = item.IsPopup && keynav_state != KeyNavState.NoPopups; SelectItem (CurrentMenu, item, popup); if (popup) { SelectItem (item, item.MenuItems [0], false); CurrentMenu = item; } } else if (CurrentMenu.parent_menu is MainMenu) { item = GetNextItem (CurrentMenu.parent_menu, ItemNavigation.Previous); SelectItem (CurrentMenu.parent_menu, item, item.IsPopup); if (item.IsPopup) { SelectItem (item, item.MenuItems [0], false); CurrentMenu = item; } } else if (!(CurrentMenu is ContextMenu)) { // ContextMenu root remains active. HideSubPopups (CurrentMenu, TopMenu); if (CurrentMenu.parent_menu != null) CurrentMenu = CurrentMenu.parent_menu; } break; case Keys.Return: if (CurrentMenu.SelectedItem != null && CurrentMenu.SelectedItem.IsPopup) { keynav_state = KeyNavState.Navigating; item = CurrentMenu.SelectedItem; ShowSubPopup (CurrentMenu, item); SelectItem (item, item.MenuItems [0], false); CurrentMenu = item; active = true; GrabControl.ActiveTracker = this; } else { ExecFocusedItem (CurrentMenu, CurrentMenu.SelectedItem); } break; case Keys.Escape: Deactivate (); break; default: ProcessMnemonic (msg, keyData); break; } return active; }
bool ProcessMnemonic (Message msg, Keys key_data) { keynav_state = KeyNavState.Navigating; MenuItem item = FindItemByKey (CurrentMenu, msg.WParam); if ((item == null) || (GrabControl == null) || (GrabControl.ActiveTracker == null)) return false; active = true; GrabControl.ActiveTracker = this; SelectItem (CurrentMenu, item, true); if (item.IsPopup) { CurrentMenu = item; SelectItem (item, item.MenuItems [0], false); } return true; }
void ProcessMenuKey (Msg msg_type) { if (TopMenu.MenuItems.Count == 0) return; MainMenu main_menu = TopMenu as MainMenu; switch (msg_type) { case Msg.WM_SYSKEYDOWN: switch (keynav_state) { case KeyNavState.Idle: keynav_state = KeyNavState.Startup; hotkey_active = true; GrabControl.ActiveTracker = this; CurrentMenu = TopMenu; main_menu.Draw (); break; case KeyNavState.Startup: break; default: Deactivate (); main_menu.Draw (); break; } break; case Msg.WM_SYSKEYUP: switch (keynav_state) { case KeyNavState.Idle: case KeyNavState.Navigating: break; case KeyNavState.Startup: keynav_state = KeyNavState.NoPopups; SelectItem (TopMenu, TopMenu.MenuItems [0], false); break; default: Deactivate (); main_menu.Draw (); break; } break; } }
// UIA Framework Note: Used to select MenuItems 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)); } }