// Navigates to the indicated item and returns the new item private int NavigateItemVisually (ItemNavigation navigation) { int page_size, columns, selected_index = -1; if (multicolumn) { columns = items_area.Width / ColumnWidthInternal; page_size = columns * RowCount; if (page_size == 0) { page_size = RowCount; } } else { page_size = items_area.Height / ItemHeight; } switch (navigation) { case ItemNavigation.PreviousColumn: { if (SelectedIndex - RowCount < 0) { return -1; } if (SelectedIndex - RowCount < top_index) { top_index = SelectedIndex - RowCount; UpdateTopItem (); } selected_index = SelectedIndex - RowCount; break; } case ItemNavigation.NextColumn: { if (SelectedIndex + RowCount >= Items.Count) { break; } if (SelectedIndex + RowCount > last_visible_index) { top_index = SelectedIndex; UpdateTopItem (); } selected_index = SelectedIndex + RowCount; break; } case ItemNavigation.First: { top_index = 0; selected_index = 0; UpdateTopItem (); break; } case ItemNavigation.Last: { int rows = items_area.Height / ItemHeight; if (multicolumn) { selected_index = Items.Count - 1; break; } if (Items.Count < rows) { top_index = 0; selected_index = Items.Count - 1; UpdateTopItem (); } else { top_index = Items.Count - rows; selected_index = Items.Count - 1; UpdateTopItem (); } break; } case ItemNavigation.Next: { if (FocusedItem == Items.Count - 1) return -1; if (multicolumn) { selected_index = FocusedItem + 1; break; } int bottom = 0; ArrayList heights = new ArrayList (); if (draw_mode == DrawMode.OwnerDrawVariable) { for (int i = top_index; i <= FocusedItem + 1; i++) { int h = GetItemHeight (i); bottom += h; heights.Add (h); } } else { bottom = ((FocusedItem + 1) - top_index + 1) * ItemHeight; } if (bottom >= items_area.Height) { int overhang = bottom - items_area.Height; int offset = 0; if (draw_mode == DrawMode.OwnerDrawVariable) while (overhang > 0) overhang -= (int) heights [offset]; else offset = (int) Math.Ceiling ((float)overhang / (float) ItemHeight); top_index += offset; UpdateTopItem (); } selected_index = FocusedItem + 1; break; } case ItemNavigation.Previous: { if (FocusedItem > 0) { if (FocusedItem - 1 < top_index) { top_index--; UpdateTopItem (); } selected_index = FocusedItem - 1; } break; } case ItemNavigation.NextPage: { if (Items.Count < page_size) { NavigateItemVisually (ItemNavigation.Last); break; } if (FocusedItem + page_size - 1 >= Items.Count) { top_index = Items.Count - page_size; UpdateTopItem (); selected_index = Items.Count - 1; } else { if (FocusedItem + page_size - 1 > last_visible_index) { top_index = FocusedItem; UpdateTopItem (); } selected_index = FocusedItem + page_size - 1; } break; } case ItemNavigation.PreviousPage: { int rows = items_area.Height / ItemHeight; if (FocusedItem - (rows - 1) <= 0) { top_index = 0; UpdateTopItem (); selected_index = 0; } else { if (SelectedIndex - (rows - 1) < top_index) { top_index = FocusedItem - (rows - 1); UpdateTopItem (); } selected_index = FocusedItem - (rows - 1); } break; } default: break; } return selected_index; }
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]); }
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]; }