5 * by JH <jheinonen@users.sourceforge.net>
7 * Copyright (C) Jaakko Heinonen
21 #define MIN_EXTRA_COLUMN ADDRESS /* 2 */
22 #define MAX_EXTRA_COLUMN LAST_FIELD
25 int first_list_item = -1;
26 char *selected = NULL;
28 int extra_column = -1;
29 int extra_alternative = -1;
32 extern list_item *database;
33 extern struct abook_field abook_fields[];
38 init_extra_field(char *option_name)
43 assert(option_name != NULL);
45 option_str = options_get_str(option_name);
47 if(option_str && *option_str) {
48 for(i = 0; i < ITEM_FIELDS; i++) {
49 if(!strcasecmp(option_str, abook_fields[i].key)) {
54 if(ret < MIN_EXTRA_COLUMN || ret > MAX_EXTRA_COLUMN) {
65 list = newwin(LIST_LINES, LIST_COLS, LIST_TOP, 0);
69 * init extra_column and extra alternative
72 extra_column = init_extra_field("extra_column");
73 extra_alternative = init_extra_field("extra_alternative");
90 ui_print_number_of_items();
101 if(first_list_item < 0)
104 if(curitem < first_list_item)
105 first_list_item = curitem;
106 else if(curitem > LAST_LIST_ITEM)
107 first_list_item = max(curitem - LIST_LINES + 1, 0);
109 for( line = 0, i = first_list_item ; i <= LAST_LIST_ITEM && i < items;
112 print_list_line(i, line, i == curitem);
119 print_list_line(int i, int line, int highlight)
121 int extra = extra_column;
122 char tmp[MAX_EMAILSTR_LEN];
123 int real_emaillen = (extra_column > 0 || extra_alternative > 0) ?
124 EMAILLEN : COLS - EMAILPOS;
126 scrollok(list, FALSE);
128 highlight_line(list, line);
131 mvwaddch(list, line, 0, '*' );
133 mvwaddnstr(list, line, NAMEPOS, database[i][NAME], NAMELEN);
134 if( options_get_int( "show_all_emails" ) )
135 mvwaddnstr(list, line, EMAILPOS, database[i][EMAIL],
138 get_first_email(tmp, i);
139 mvwaddnstr(list, line, EMAILPOS, tmp, real_emaillen);
142 if(extra < 0 || !database[i][extra])
143 extra = extra_alternative;
145 mvwaddnstr(list, line, EXTRAPOS,
146 safe_str(database[i][extra]),
149 scrollok(list, TRUE);
161 /* hmm, maybe something here */
163 mvaddstr(2, NAMEPOS, abook_fields[NAME].name);
164 mvaddstr(2, EMAILPOS, abook_fields[EMAIL].name);
166 mvaddnstr(2, EXTRAPOS, abook_fields[extra_column].name,
187 if( curitem > items - 2 )
202 curitem = curitem == first_list_item ?
203 ((curitem -= LIST_LINES) < 0 ? 0 : curitem) : first_list_item;
211 if( curitem > items - 2 )
214 curitem = curitem == LAST_LIST_ITEM ?
215 ((curitem += LIST_LINES) > LAST_ITEM ? LAST_ITEM : curitem) :
216 min(LAST_LIST_ITEM, LAST_ITEM);
225 memset( selected, 0, items );
231 memset( selected, 1, items );
235 move_curitem(int direction)
239 if( curitem < 0 || curitem > LAST_ITEM )
242 itemcpy(tmp, database[curitem]);
248 itemcpy(database[curitem], database[curitem - 1]);
249 itemcpy(database[curitem-1], tmp);
254 if( curitem >= LAST_ITEM )
256 itemcpy(database[curitem], database[curitem + 1]);
257 itemcpy(database[curitem+1], tmp);
283 highlight_line(WINDOW *win, int line)
288 * this is a tricky one
292 mvwchgat(win, line, 0, -1, A_STANDOUT, 0, NULL);
295 * buggy function: FIXME
297 scrollok(win, FALSE);
301 for(i = 0; i < COLS; i++)
303 /*wattrset(win, 0);*/
314 for(i = 0; i < items; i++)
329 for(i = 0; i < items; i++)
330 selected[i] = !selected[i];