static MenuItem GetNextItem (Menu menu, ItemNavigation navigation)
{
int pos = 0;
bool selectable_items = false;
MenuItem item;
// Check if there is at least a selectable item
for (int i = 0; i < menu.MenuItems.Count; i++) {
item = menu.MenuItems [i];
if (item.Separator == false && item.Visible == true) {
selectable_items = true;
break;
}
}
if (selectable_items == false)
return null;
switch (navigation) {
case ItemNavigation.First:
/* First item that is not separator and it is visible*/
for (pos = 0; pos < menu.MenuItems.Count; pos++) {
item = menu.MenuItems [pos];
if (item.Separator == false && item.Visible == true)
break;
}
break;
case ItemNavigation.Last: // Not used
break;
case ItemNavigation.Next:
pos = menu.SelectedItem == null ? - 1 : menu.SelectedItem.Index;
/* Next item that is not separator and it is visible*/
for (pos++; pos < menu.MenuItems.Count; pos++) {
item = menu.MenuItems [pos];
if (item.Separator == false && item.Visible == true)
break;
}
if (pos >= menu.MenuItems.Count) { /* Jump at the start of the menu */
pos = 0;
/* Next item that is not separator and it is visible*/
for (; pos < menu.MenuItems.Count; pos++) {
item = menu.MenuItems [pos];
if (item.Separator == false && item.Visible == true)
break;
}
}
break;
case ItemNavigation.Previous:
if (menu.SelectedItem != null)
pos = menu.SelectedItem.Index;
/* Previous item that is not separator and it is visible*/
for (pos--; pos >= 0; pos--) {
item = menu.MenuItems [pos];
if (item.Separator == false && item.Visible == true)
break;
}
if (pos < 0 ) { /* Jump at the end of the menu*/
pos = menu.MenuItems.Count - 1;
/* Previous item that is not separator and it is visible*/
for (; pos >= 0; pos--) {
item = menu.MenuItems [pos];
if (item.Separator == false && item.Visible == true)
break;
}
}
break;
default:
break;
}
return menu.MenuItems [pos];
}