// Authors:
// Jordi Mas i Hernandez, jordi@ximian.com
// Mike Kestner <mkestner@novell.com>
+// Everaldo Canuto <ecanuto@novell.com>
//
using System.Collections;
if (!item.Enabled)
return;
- if (item.IsPopup) {
+ if (item.IsPopup) {
ShowSubPopup (menu, item);
} else {
Deactivate ();
return true;
}
- void ProcessArrowKey (Keys keyData)
+ Hashtable shortcuts = new Hashtable ();
+
+ public void AddShortcuts (MenuItem item)
+ {
+ foreach (MenuItem child in item.MenuItems) {
+ AddShortcuts (child);
+ if (child.Shortcut != Shortcut.None)
+ shortcuts [(int)child.Shortcut] = child;
+ }
+
+ if (item.Shortcut != Shortcut.None)
+ shortcuts [(int)item.Shortcut] = item;
+ }
+
+ public void RemoveShortcuts (MenuItem item)
{
+ foreach (MenuItem child in item.MenuItems) {
+ RemoveShortcuts (child);
+ if (child.Shortcut != Shortcut.None)
+ shortcuts.Remove ((int)child.Shortcut);
+ }
+
+ if (item.Shortcut != Shortcut.None)
+ shortcuts.Remove ((int)item.Shortcut);
+ }
+
+ bool ProcessShortcut (Keys keyData)
+ {
+ MenuItem item = shortcuts [(int)keyData] as MenuItem;
+ if (item == null)
+ return false;
+
+ Deactivate ();
+ item.PerformClick ();
+ return true;
+ }
+
+ public bool ProcessKeys (ref Message msg, Keys keyData)
+ {
+ 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;
+ return true;
else if (CurrentMenu.MenuItems.Count == 1 && CurrentMenu.parent_menu == TopMenu) {
DeselectItem (CurrentMenu.SelectedItem);
CurrentMenu = TopMenu;
- return;
+ 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) {
SelectItem (item, item.MenuItems [0], false);
CurrentMenu = item;
active = true;
+ grab_control.ActiveTracker = this;
}
- return;
+ 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);
}
}
break;
-
+
case Keys.Left:
if (CurrentMenu is MainMenu) {
item = GetNextItem (CurrentMenu, ItemNavigation.Previous);
CurrentMenu = CurrentMenu.parent_menu;
}
break;
- default:
- throw new ArgumentException ("Invalid keyData: " + keyData);
- }
- }
- Hashtable shortcuts = new Hashtable ();
-
- public void AddShortcuts (MenuItem item)
- {
- foreach (MenuItem child in item.MenuItems) {
- AddShortcuts (child);
- if (child.Shortcut != Shortcut.None)
- shortcuts [(int)child.Shortcut] = child;
- }
-
- if (item.Shortcut != Shortcut.None)
- shortcuts [(int)item.Shortcut] = item;
- }
-
- public void RemoveShortcuts (MenuItem item)
- {
- foreach (MenuItem child in item.MenuItems) {
- RemoveShortcuts (child);
- if (child.Shortcut != Shortcut.None)
- shortcuts.Remove ((int)child.Shortcut);
- }
-
- if (item.Shortcut != Shortcut.None)
- shortcuts.Remove ((int)item.Shortcut);
- }
-
- bool ProcessShortcut (Keys keyData)
- {
- MenuItem item = shortcuts [(int)keyData] as MenuItem;
- if (item == null)
- return false;
-
- Deactivate ();
- item.PerformClick ();
- return true;
- }
-
- public bool ProcessKeys (ref Message msg, Keys keyData)
- {
- 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;
-
- switch (keyData) {
- case Keys.Up:
- case Keys.Down:
- case Keys.Right:
- case Keys.Left:
- ProcessArrowKey (keyData);
+ case Keys.Return:
+ 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;
+ grab_control.ActiveTracker = this;
+ }
+ return true;
+ }
+
+ ExecFocusedItem (CurrentMenu, CurrentMenu.SelectedItem);
break;
case Keys.Escape:
Deactivate ();
break;
- case Keys.Return:
- ExecFocusedItem (CurrentMenu, CurrentMenu.SelectedItem);
- break;
-
default:
ProcessMnemonic (msg, keyData);
break;