Lines Matching +full:k +full:- +full:to +full:- +full:j
4 * buildlist.c -- implements the buildlist dialog
6 * Copyright 2012-2019,2020 Thomas E. Dickey
18 * License along with this program; if not, write to
31 #define sLEFT (-2)
32 #define sRIGHT (-1)
45 DIALOG_LISTITEM **ip; /* pointers to items in this list */
54 #define okIndex(all,index) ((index) >= 0 && (index) < (all)->item_no)
56 #define myItem(p,n) ((p)->ip)[n]
72 * Translate a choice from items[] to a row-number in an unbounded column,
78 MY_DATA *data = all->list + selected; in index2row()
79 int result = -1; in index2row()
84 for (row = 0; row < all->item_no; ++row) { in index2row()
86 choice, all->items + choice, in index2row()
88 if (myItem(data, row) == all->items + choice) { in index2row()
99 * Convert a row-number back to an item number, i.e., index into items[].
104 MY_DATA *data = all->list + selected; in row2index()
105 int result = -1; in row2index()
107 for (n = 0; n < all->item_no; ++n) { in row2index()
110 n, all->items + n)); in row2index()
111 if (myItem(data, row) == all->items + n) { in row2index()
135 int climit = (all->item_x - all->check_x - 1); in print_item()
137 ? item->name in print_item()
138 : item->text); in print_item()
146 (void) wmove(win, row, all->check_x); in print_item()
150 dlg_print_listitem(win, item->name, climit, first, selected); in print_item()
155 (void) wmove(win, row, all->item_x); in print_item()
156 climit = (getmaxx(win) - all->item_x + 1); in print_item()
160 dlg_item_help(item->help); in print_item()
173 MY_DATA *data = all->list + selected; in print_1_list()
175 ? all->items + choice in print_1_list()
177 WINDOW *win = data->win; in print_1_list()
178 int i, j; in print_1_list() local
180 int top_row = index2row(all, data->top_index, selected); in print_1_list()
184 for (i = j = 0; j < max_rows; i++) { in print_1_list()
192 j, myItem(data, ii) == target); in print_1_list()
193 last = ++j; in print_1_list()
216 row--; in prev_item()
255 MY_DATA *data = all->list + selected; in next_item()
258 TRACE(("! given item %d, testing next-item on row %d\n", choice, row + 1)); in next_item()
262 TRACE(("! next_item(%d, %s) ->%d\n", choice, mySide(selected), result)); in next_item()
272 MY_DATA *data = all->list + selected; in first_item()
273 int result = -1; in first_item()
278 for (n = 0; n < all->item_no; ++n) { in first_item()
279 if (myItem(data, 0) == &all->items[n]) { in first_item()
295 MY_DATA *data = all->list + selected; in last_item()
296 int result = -1; in last_item()
312 MY_DATA *data = all->list + selected; in skip_rows()
318 for (n = row + 1; (n < all->item_no) && (n <= row + skip); ++n) { in skip_rows()
324 result -= skip; in skip_rows()
344 for (n = choice; n >= 0; --n) { in closest_item()
345 if ((all->items[n].state != 0) == selected) { in closest_item()
350 for (n = choice; n < all->item_no; ++n) { in closest_item()
351 if ((all->items[n].state != 0) == selected) { in closest_item()
359 if ((choice - prev) > (next - choice)) { in closest_item()
377 WINDOW *dialog = wgetparent(all->list[0].win); in print_both()
382 MY_DATA *data = all->list + selected; in print_both()
383 WINDOW *win = data->win; in print_both()
384 int thumb_top = index2row(all, data->top_index, selected); in print_both()
385 int thumb_max = index2row(all, -1, selected); in print_both()
392 (long) (data->top_index), in print_both()
396 data->box_x + all->check_x, in print_both()
397 data->box_x + getmaxx(win), in print_both()
398 data->box_y, in print_both()
399 data->box_y + getmaxy(win) + 1, in print_both()
410 if (choice != all->list[selected].top_index) { in set_top_item()
411 DLG_TRACE(("# set top of %s column to %d\n", in set_top_item()
414 all->list[selected].top_index = choice; in set_top_item()
419 * Adjust the top-index as needed to ensure that it and the given item are
425 int top_item = all->list[selected].top_index; in fix_top_item()
431 } else if ((cur_row - top_row) >= all->use_height) { in fix_top_item()
432 top_item = row2index(all, cur_row + 1 - all->use_height, selected); in fix_top_item()
434 if (cur_row < all->use_height) { in fix_top_item()
437 DLG_TRACE(("# fix_top_item(cur_item %d, %s) ->top_item %d\n", in fix_top_item()
445 MY_DATA *data = &all->list[1]; in append_right_side()
446 int j; in append_right_side() local
447 for (j = 0; j < all->item_no; ++j) { in append_right_side()
448 if (myItem(data, j) == 0) { in append_right_side()
449 myItem(data, j) = &all->items[choice]; in append_right_side()
458 MY_DATA *data = &all->list[1]; in amend_right_side()
459 int j, k; in amend_right_side() local
460 for (j = 0; j < all->item_no; ++j) { in amend_right_side()
461 if (myItem(data, j) == &all->items[choice]) { in amend_right_side()
462 for (k = j; k < all->item_no; ++k) { in amend_right_side()
463 if ((myItem(data, k) = myItem(data, k + 1)) == 0) in amend_right_side()
474 int i, j; in fill_one_side() local
475 MY_DATA *data = all->list + selected; in fill_one_side()
477 for (i = j = 0; j < all->item_no; ++j) { in fill_one_side()
479 if ((all->items[j].state != 0) == selected) { in fill_one_side()
480 myItem(data, i) = all->items + j; in fill_one_side()
484 j, all->items + j)); in fill_one_side()
494 int k; in fill_both_sides() local
496 for (k = 0; k < 2; ++k) { in fill_both_sides()
497 fill_one_side(all, k); in fill_both_sides()
502 * This is an alternate interface to 'buildlist' which allows the application
503 * to read the list item states back directly without putting them in the
519 /* *INDENT-OFF* */ in dlg_buildlist()
533 DLG_KEYS_DATA( DLGK_ITEM_PREV, '-' ), in dlg_buildlist()
547 /* *INDENT-ON* */ in dlg_buildlist()
555 int i, j, k, key2, found, x, y, cur_x, cur_y; in dlg_buildlist() local
572 * Unlike other uses of --visit-items, we have two windows to visit. in dlg_buildlist()
580 for (k = 0; k < 2; ++k) { in dlg_buildlist()
581 data[k].ip = dlg_calloc(DIALOG_LISTITEM *, (item_no + 2)); in dlg_buildlist()
644 list_width = (width - 6 * MARGIN - 2) / 2; in dlg_buildlist()
653 * Limit the list to avoid overwriting the ok-button. in dlg_buildlist()
655 all.use_height = height - MIN_HIGH - cur_y; in dlg_buildlist()
659 for (k = 0; k < 2; ++k) { in dlg_buildlist()
661 data[k].win = dlg_sub_window(dialog, all.use_height, list_width, in dlg_buildlist()
662 y + data[k].box_y + 1, in dlg_buildlist()
663 x + data[k].box_x + 1); in dlg_buildlist()
666 dlg_draw_box(dialog, data[k].box_y, data[k].box_x, in dlg_buildlist()
674 /* Find length of longest item to center buildlist */ in dlg_buildlist()
684 all.use_width = (list_width - 6 * MARGIN); in dlg_buildlist()
700 text_width = all.use_width - name_width; in dlg_buildlist()
705 all.check_x = (all.use_width - full_width) / 2; in dlg_buildlist()
713 /* ensure we are scrolled to show the current choice */ in dlg_buildlist()
714 j = MIN(all.use_height, item_no); in dlg_buildlist()
717 int top_item = cur_item - j + 1; in dlg_buildlist()
738 dlg_draw_buttons(dialog, height - 2, 0, buttons, button, FALSE, width); in dlg_buildlist()
743 int at_top = index2row(&all, moi->top_index, which); in dlg_buildlist()
744 int at_end = index2row(&all, -1, which); in dlg_buildlist()
749 cur_item, item_no - 1, in dlg_buildlist()
750 moi->top_index, in dlg_buildlist()
760 if (button < 0) { /* --visit-items */ in dlg_buildlist()
766 cur_y -= at_top; in dlg_buildlist()
781 key -= M_EVENT; in dlg_buildlist()
786 i = (key - 2 * KEY_MAX) % (1 + all.use_height); in dlg_buildlist()
787 j = (key - 2 * KEY_MAX) / (1 + all.use_height); in dlg_buildlist()
788 k = row2index(&all, i + at_top, j); in dlg_buildlist()
789 DLG_TRACE(("# MOUSE column %d, row %d ->item %d\n", j, i, k)); in dlg_buildlist()
790 if (k >= 0 && j < 2) { in dlg_buildlist()
791 if (j != which) { in dlg_buildlist()
795 moi = data + j; in dlg_buildlist()
796 fix_top_item(&all, k, j); in dlg_buildlist()
798 which = j; in dlg_buildlist()
799 at_top = index2row(&all, moi->top_index, which); in dlg_buildlist()
801 cur_item = k; in dlg_buildlist()
803 key = DLGK_TOGGLE; /* force the selected item to toggle */ in dlg_buildlist()
812 key = KEY_RIGHTCOL; /* switch to right-column */ in dlg_buildlist()
815 key -= KEY_MAX; in dlg_buildlist()
819 key = KEY_LEFTCOL; /* switch to left-column */ in dlg_buildlist()
829 * more items in the column, move the cursor to the other column. in dlg_buildlist()
839 /* FIXME - how to test and handle multiple states? */ in dlg_buildlist()
854 if (cur_item == moi->top_index) { in dlg_buildlist()
875 for (j = cur_item + 1; j < item_no; j++) { in dlg_buildlist()
876 if (check_hotkey(items, j, which)) { in dlg_buildlist()
878 i = j; in dlg_buildlist()
883 for (j = 0; j <= cur_item; j++) { in dlg_buildlist()
884 if (check_hotkey(items, j, which)) { in dlg_buildlist()
886 i = j; in dlg_buildlist()
893 } else if ((j = dlg_char_to_button(key, buttons)) >= 0) { in dlg_buildlist()
894 button = j; in dlg_buildlist()
901 * A single digit (1-9) positions the selection to that line in the in dlg_buildlist()
907 && (key - '1' < at_bot)) { in dlg_buildlist()
909 i = key - '1'; in dlg_buildlist()
920 dlg_draw_buttons(dialog, height - 2, 0, buttons, button, in dlg_buildlist()
935 dlg_draw_buttons(dialog, height - 2, 0, buttons, button, in dlg_buildlist()
964 if (cur_item > moi->top_index) { in dlg_buildlist()
965 i = moi->top_index; in dlg_buildlist()
966 } else if (moi->top_index != 0) { in dlg_buildlist()
968 if ((temp -= all.use_height) < 0) in dlg_buildlist()
974 if ((at_end - at_bot) < all.use_height) { in dlg_buildlist()
1018 DLG_TRACE(("# <--CHOICE %d\n", i)); in dlg_buildlist()
1019 DLG_TRACE(("# <--topITM %d\n", moi->top_index)); in dlg_buildlist()
1020 DLG_TRACE(("# <--now_at %d\n", now_at)); in dlg_buildlist()
1021 DLG_TRACE(("# <--at_top %d\n", at_top)); in dlg_buildlist()
1022 DLG_TRACE(("# <--at_bot %d\n", at_bot)); in dlg_buildlist()
1026 if ((at_bot - at_top) >= all.use_height) { in dlg_buildlist()
1028 next_item(&all, moi->top_index, which), in dlg_buildlist()
1031 at_top = index2row(&all, moi->top_index, which); in dlg_buildlist()
1036 DLG_TRACE(("# ...topITM %d\n", moi->top_index)); in dlg_buildlist()
1038 at_bot - at_top)); in dlg_buildlist()
1042 * If we bumped into the end, move the top-item in dlg_buildlist()
1046 if ((at_bot - at_top) > all.use_height) { in dlg_buildlist()
1048 next_item(&all, moi->top_index, which), in dlg_buildlist()
1051 (at_bot - at_top) >= all.use_height) { in dlg_buildlist()
1053 next_item(&all, moi->top_index, which), in dlg_buildlist()
1058 if (--oops < 0) { in dlg_buildlist()
1059 DLG_TRACE(("# OOPS-forward\n")); in dlg_buildlist()
1065 old_item = moi->top_index; in dlg_buildlist()
1067 prev_item(&all, moi->top_index, which), in dlg_buildlist()
1069 at_top = index2row(&all, moi->top_index, which); in dlg_buildlist()
1072 DLG_TRACE(("# ...topITM %d\n", moi->top_index)); in dlg_buildlist()
1074 if (moi->top_index >= old_item) in dlg_buildlist()
1078 if (--oops < 0) { in dlg_buildlist()
1079 DLG_TRACE(("# OOPS-backward\n")); in dlg_buildlist()
1084 DLG_TRACE(("# -->now_at %d\n", now_at)); in dlg_buildlist()
1127 * If told to re-order the list, update it to reflect the current display: in dlg_buildlist()
1128 * a) The left-side will be at the beginning, without gaps. in dlg_buildlist()
1129 * b) The right-side will follow, in display-order. in dlg_buildlist()
1140 j = 0; in dlg_buildlist()
1141 for (k = 0; k < 2; ++k) { in dlg_buildlist()
1143 if (myItem(all.list + k, row) == 0) in dlg_buildlist()
1145 choice = row2index(&all, row, k); in dlg_buildlist()
1147 new_item = j; in dlg_buildlist()
1148 redo[j++] = items[choice]; in dlg_buildlist()
1158 for (k = 0; k < 2; ++k) { in dlg_buildlist()
1159 free(data[k].ip); in dlg_buildlist()
1187 int i, j; in dialog_buildlist() local
1207 for (i = j = 0; i < item_no; ++i) { in dialog_buildlist()
1208 listitems[i].name = items[j++]; in dialog_buildlist()
1211 : items[j++]); in dialog_buildlist()
1212 listitems[i].state = !dlg_strcmp(items[j++], "on"); in dialog_buildlist()
1214 ? items[j++] in dialog_buildlist()