static int menu_operation(WINDOW *win, nhmenu *menu, menu_op operation, int page_num) { int first_page, last_page, current_page; nhmenu_item *menu_item_ptr = menu->entries; if (page_num == 0) { /* Operation to occur on all pages */ first_page = 1; last_page = menu->num_pages; } else { first_page = page_num; last_page = page_num; } /* Cycle through entries until we are on the correct page */ while (menu_item_ptr != NULL) { if (menu_item_ptr->page_num == first_page) { break; } menu_item_ptr = menu_item_ptr->next_item; } current_page = first_page; if (page_num == 0) { menu_display_page(menu, win, current_page); } if (menu_item_ptr == NULL) { /* Page not found */ panic("menu_display_page: attempt to display nonexistant page"); } while (menu_item_ptr != NULL) { if (menu_item_ptr->page_num != current_page) { if (menu_item_ptr->page_num > last_page) { break; } current_page = menu_item_ptr->page_num; menu_display_page(menu, win, current_page); } if (menu_item_ptr->identifier.a_void != NULL) { menu_select_deselect(win, menu_item_ptr, operation); } menu_item_ptr = menu_item_ptr->next_item; } return current_page; }
static int menu_get_selections(WINDOW *win, nhmenu *menu, int how) { int curletter; int count = -1; int count_letter = '\0'; int curpage = 1; int num_selected = 0; boolean dismiss = FALSE; char search_key[BUFSZ]; nhmenu_item *menu_item_ptr = menu->entries; menu_display_page(menu, win, 1); while (!dismiss) { curletter = getch(); if (curletter == '\033') { curletter = curses_convert_keys(curletter); } if (isdigit(curletter) && (how != PICK_NONE)) { count = curses_get_count(curletter - '0'); touchwin(win); refresh(); curletter = getch(); if (count > 0) { count_letter = curletter; } } if ((how == PICK_NONE) && (menu->num_pages == 1)) { if (how==PICK_NONE) { if (curletter == KEY_ESC) { num_selected = -1; } else { num_selected = 0; } dismiss = TRUE; break; } } switch (curletter) { case KEY_ESC: { num_selected = -1; dismiss = TRUE; break; } case '\n': case '\r': { dismiss = TRUE; break; } case KEY_RIGHT: case KEY_NPAGE: case MENU_NEXT_PAGE: case ' ': { if (curpage < menu->num_pages) { curpage++; menu_display_page(menu, win, curpage); } else if (curletter == ' ') { dismiss = TRUE; break; } break; } case KEY_LEFT: case KEY_PPAGE: case MENU_PREVIOUS_PAGE: { if (curpage > 1) { curpage--; menu_display_page(menu, win, curpage); } break; } case KEY_END: case MENU_LAST_PAGE: { if (curpage != menu->num_pages) { curpage = menu->num_pages; menu_display_page(menu, win, curpage); } break; } case KEY_HOME: case MENU_FIRST_PAGE: { if (curpage != 1) { curpage = 1; menu_display_page(menu, win, curpage); } break; } case MENU_SEARCH: { curses_line_input_dialog("Search for:", search_key, BUFSZ); refresh(); touchwin(win); wrefresh(win); if (strlen(search_key) == 0) { break; } menu_item_ptr = menu->entries; while (menu_item_ptr != NULL) { if ((menu_item_ptr->identifier.a_void != NULL) && (strstri(menu_item_ptr->str, search_key))) { if (how == PICK_ONE) { menu_clear_selections(menu); menu_select_deselect(win, menu_item_ptr, SELECT); num_selected = 1; dismiss = TRUE; break; } else { menu_select_deselect(win, menu_item_ptr, INVERT); } } menu_item_ptr = menu_item_ptr->next_item; } menu_item_ptr = menu->entries; break; } default: { if (how==PICK_NONE) { num_selected = 0; dismiss = TRUE; break; } } } if (how == PICK_ANY) { switch (curletter) { case MENU_SELECT_PAGE: { (void) menu_operation(win, menu, SELECT, curpage); break; } case MENU_SELECT_ALL: { curpage = menu_operation(win, menu, SELECT, 0); break; } case MENU_UNSELECT_PAGE: { (void) menu_operation(win, menu, DESELECT, curpage); break; } case MENU_UNSELECT_ALL: { curpage = menu_operation(win, menu, DESELECT, 0); break; } case MENU_INVERT_PAGE: { (void) menu_operation(win, menu, INVERT, curpage); break; } case MENU_INVERT_ALL: { curpage = menu_operation(win, menu, INVERT, 0); break; } } } menu_item_ptr = menu->entries; while (menu_item_ptr != NULL) { if (menu_item_ptr->identifier.a_void != NULL) { if (((curletter == menu_item_ptr->accelerator) && ((curpage == menu_item_ptr->page_num) || (!menu->reuse_accels))) || ((menu_item_ptr->group_accel) && (curletter == menu_item_ptr->group_accel))) { if (curpage != menu_item_ptr->page_num) { curpage = menu_item_ptr->page_num; menu_display_page(menu, win, curpage); } if (how == PICK_ONE) { menu_clear_selections(menu); menu_select_deselect(win, menu_item_ptr, SELECT); num_selected = 1; dismiss = TRUE; break; } else { menu_select_deselect(win, menu_item_ptr, INVERT); } } } menu_item_ptr = menu_item_ptr->next_item; } } if ((how == PICK_ANY) && (num_selected != -1)) { num_selected = 0; menu_item_ptr = menu->entries; while (menu_item_ptr != NULL) { if (menu_item_ptr->identifier.a_void != NULL) { if (menu_item_ptr->selected) { num_selected++; if (menu_item_ptr->accelerator == count_letter) { menu_item_ptr->count = count; count = 0; count_letter = '\0'; } } } menu_item_ptr = menu_item_ptr->next_item; } } return num_selected; }