X-Git-Url: https://git.deb.at/w?p=pkg%2Fabook.git;a=blobdiff_plain;f=list.c;h=99e52f85b6b92ffef58d4bc06ee6e02da9715b30;hp=1c250850402f7399d78a5f1a9abf26e2bd1819f9;hb=7751b3edc145646e6b55e2fda82eb5619fbe0074;hpb=627bebd233fee0136a6ffbef005da3e62a87f99b diff --git a/list.c b/list.c index 1c25085..99e52f8 100644 --- a/list.c +++ b/list.c @@ -1,6 +1,6 @@ /* - * $Id: list.c,v 1.27 2005/09/17 10:10:26 jheinonen Exp $ + * $Id: list.c,v 1.30 2006/08/07 19:20:26 cduval Exp $ * * by JH * @@ -20,8 +20,6 @@ #include "options.h" #include "xmalloc.h" -#define MIN_EXTRA_COLUMN ADDRESS /* 2 */ -#define MAX_EXTRA_COLUMN LAST_FIELD int curitem = -1; int first_list_item = -1; @@ -30,30 +28,24 @@ char *selected = NULL; int extra_column = -1; int extra_alternative = -1; -extern int items; -extern list_item *database; -extern struct abook_field abook_fields[]; +extern abook_field_list *fields_list; static WINDOW *list = NULL; -static int + +int init_extra_field(enum str_opts option) { - int i, ret = -1; + int ret = -1; char *option_str; option_str = opt_get_str(option); if(option_str && *option_str) { - for(i = 0; i < ITEM_FIELDS; i++) { - if(!strcasecmp(option_str, abook_fields[i].key)) { - ret = i; - break; - } - } - if(ret < MIN_EXTRA_COLUMN || ret > MAX_EXTRA_COLUMN) { + find_field_number(option_str, &ret); + + if(!strcmp(option_str, "name") || !strcmp(option_str, "email")) ret = -1; - } } return ret; @@ -106,8 +98,9 @@ refresh_list() else if(curitem > LAST_LIST_ITEM) first_list_item = max(curitem - LIST_LINES + 1, 0); - for( line = 0, i = first_list_item ; i <= LAST_LIST_ITEM && i < items; - line++, i++ ) { + for(line = 0, i = first_list_item; + i <= LAST_LIST_ITEM && i < db_n_items(); + line++, i++) { print_list_line(i, line, i == curitem); } @@ -124,7 +117,7 @@ void print_list_line(int i, int line, int highlight) { int extra = extra_column; - char tmp[MAX_EMAILSTR_LEN]; + char tmp[MAX_EMAILSTR_LEN], *emails; int real_emaillen = (extra_column > 0 || extra_alternative > 0) ? EMAILLEN : COLS - EMAILPOS; @@ -135,41 +128,49 @@ print_list_line(int i, int line, int highlight) if(selected[i]) mvwaddch(list, line, 0, '*' ); - mvwaddnstr(list, line, NAMEPOS, database[i][NAME], - bytes2width(database[i][NAME], NAMELEN)); - if(opt_get_bool(BOOL_SHOW_ALL_EMAILS)) - mvwaddnstr(list, line, EMAILPOS, database[i][EMAIL], - bytes2width(database[i][EMAIL], real_emaillen)); - else { + mvwaddnstr(list, line, NAMEPOS, db_name_get(i), + bytes2width(db_name_get(i), NAMELEN)); + + if(opt_get_bool(BOOL_SHOW_ALL_EMAILS)) { + emails = db_email_get(i); + mvwaddnstr(list, line, EMAILPOS, emails, + bytes2width(emails, real_emaillen)); + free(emails); + } else { get_first_email(tmp, i); mvwaddnstr(list, line, EMAILPOS, tmp, - bytes2width(tmp, real_emaillen)); + bytes2width(tmp, real_emaillen)); } - if(extra < 0 || !database[i][extra]) + if(extra < 0 || !db_fget_byid(i, extra)) extra = extra_alternative; if(extra >= 0) mvwaddnstr(list, line, EXTRAPOS, - safe_str(database[i][extra]), - bytes2width(safe_str(database[i][extra]), EXTRALEN)); + safe_str(db_fget_byid(i, extra)), + bytes2width(safe_str(db_fget_byid(i, extra)), + EXTRALEN)); scrollok(list, TRUE); if(highlight) wstandend(list); } - void list_headerline() { + char *str = NULL; + #if defined(A_BOLD) && defined(A_NORMAL) attrset(A_BOLD); #endif - mvaddstr(2, NAMEPOS, gettext(abook_fields[NAME].name)); - mvaddstr(2, EMAILPOS, gettext(abook_fields[EMAIL].name)); - if(extra_column > 0) - mvaddnstr(2, EXTRAPOS, gettext(abook_fields[extra_column].name), - COLS-EXTRAPOS); + + mvaddstr(2, NAMEPOS, find_field("name", NULL)->name); + mvaddstr(2, EMAILPOS, find_field("email", NULL)->name); + if(extra_column > 0) { + get_field_keyname(extra_column, NULL, &str); + mvaddnstr(2, EXTRAPOS, str, COLS - EXTRAPOS); + } + #if defined(A_BOLD) && defined(A_NORMAL) attrset(A_NORMAL); #endif @@ -189,7 +190,7 @@ scroll_up() void scroll_down() { - if(curitem > items - 2) + if(curitem > db_n_items() - 2) return; curitem++; @@ -213,12 +214,15 @@ page_up() void page_down() { - if(curitem > items - 2) + if(curitem > db_n_items() - 2) return; - curitem = curitem == LAST_LIST_ITEM ? - ((curitem += LIST_LINES) > LAST_ITEM ? LAST_ITEM : curitem) : - min(LAST_LIST_ITEM, LAST_ITEM); + if(curitem == LAST_LIST_ITEM) { + if((curitem += LIST_LINES) > last_item()) + curitem = last_item(); + } else { + curitem = min(LAST_LIST_ITEM, last_item()); + } refresh_list(); } @@ -226,13 +230,29 @@ page_down() void select_none() { - memset(selected, 0, items); + memset(selected, 0, db_n_items()); } void select_all() { - memset(selected, 1, items); + memset(selected, 1, db_n_items()); +} + +void +list_set_selection(int item, int value) +{ + assert(is_valid_item(item)); + + selected[item] = !!value; +} + +void +list_invert_curitem_selection() +{ + assert(is_valid_item(curitem)); + + selected[curitem] = !selected[curitem]; } void @@ -240,34 +260,40 @@ move_curitem(int direction) { list_item tmp; - if( curitem < 0 || curitem > LAST_ITEM ) + if(curitem < 0 || curitem > last_item()) return; - itemcpy(tmp, database[curitem]); - - switch(direction) { - case MOVE_ITEM_UP: - if( curitem < 1 ) - return; - itemcpy(database[curitem], database[curitem - 1]); - itemcpy(database[curitem-1], tmp); - scroll_up(); - break; - - case MOVE_ITEM_DOWN: - if( curitem >= LAST_ITEM ) - return; - itemcpy(database[curitem], database[curitem + 1]); - itemcpy(database[curitem+1], tmp); - scroll_down(); - break; - } + tmp = item_create(); + item_copy(tmp, db_item_get(curitem)); + + switch(direction) { + case MOVE_ITEM_UP: + if( curitem < 1 ) + goto out_move; + item_copy(db_item_get(curitem), + db_item_get(curitem - 1)); + item_copy(db_item_get(curitem-1), tmp); + scroll_up(); + break; + + case MOVE_ITEM_DOWN: + if(curitem >= last_item()) + goto out_move; + item_copy(db_item_get(curitem), + db_item_get(curitem + 1)); + item_copy(db_item_get(curitem + 1), tmp); + scroll_down(); + break; + } + +out_move: + item_free(&tmp); } void goto_home() { - if(items > 0) + if(db_n_items() > 0) curitem = 0; refresh_list(); @@ -276,13 +302,12 @@ goto_home() void goto_end() { - if(items > 0) - curitem = LAST_ITEM; + if(db_n_items() > 0) + curitem = last_item(); refresh_list(); } - void highlight_line(WINDOW *win, int line) { @@ -315,7 +340,7 @@ selected_items() { int i, n = 0; - for(i = 0; i < items; i++) + for(i = 0; i < db_n_items(); i++) if(selected[i]) n++; @@ -327,42 +352,48 @@ invert_selection() { int i; - if(items < 1) + if(list_is_empty()) return; - for(i = 0; i < items; i++) + for(i = 0; i < db_n_items(); i++) selected[i] = !selected[i]; } int -list_current_item() +list_is_empty() { - return curitem; + return db_n_items() < 1; } int -list_is_empty() +list_get_curitem() { - return items < 1; + return curitem; +} + +void +list_set_curitem(int i) +{ + curitem = i; } int duplicate_item() { - int i; list_item item; - + if(curitem < 0) return 1; - for(i = 0; i < ITEM_FIELDS; i++) - item[i] = database[curitem][i] ? xstrdup(database[curitem][i]) : - NULL; - - if(add_item2database(item)) + item = item_create(); + item_duplicate(item, db_item_get(curitem)); + if(add_item2database(item)) { + item_free(&item); return 1; + } + item_free(&item); - curitem = LAST_ITEM; + curitem = last_item(); refresh_list(); return 0;