X-Git-Url: https://git.deb.at/?a=blobdiff_plain;f=list.c;h=57f4b36769a5deb16d33c6ed8dbce4542adb5af5;hb=7d7ae6aab5fb6307328b7cfb193ebce3e2870624;hp=fd1c7069307a23f2b981b2094946fb6029709b9c;hpb=12a57d9405d7910566d5ff888d743d29b0716554;p=pkg%2Fabook.git diff --git a/list.c b/list.c index fd1c706..57f4b36 100644 --- a/list.c +++ b/list.c @@ -2,36 +2,67 @@ /* * $Id$ * - * by JH + * by JH * * Copyright (C) Jaakko Heinonen */ #include #include -#include "abook_curses.h" #include "abook.h" +#include +#include "ui.h" #include "database.h" #include "edit.h" +#include "gettext.h" #include "list.h" #include "misc.h" #include "options.h" +#include "xmalloc.h" + int curitem = -1; int first_list_item = -1; char *selected = NULL; -extern int items; -extern list_item *database; -extern struct abook_field abook_fields[]; +int extra_column = -1; +int extra_alternative = -1; + +extern abook_field_list *fields_list; + +static WINDOW *list = NULL; + + +int +init_extra_field(enum str_opts option) +{ + int ret = -1; + char *option_str; + + option_str = opt_get_str(option); + + if(option_str && *option_str) { + find_field_number(option_str, &ret); + + if(!strcmp(option_str, "name") || !strcmp(option_str, "email")) + ret = -1; + } -WINDOW *list = NULL; + return ret; +} void init_list() { list = newwin(LIST_LINES, LIST_COLS, LIST_TOP, 0); scrollok(list, TRUE); + + /* + * init extra_column and extra alternative + */ + + extra_column = init_extra_field(STR_EXTRA_COLUMN); + extra_alternative = init_extra_field(STR_EXTRA_ALTERNATIVE); } void @@ -45,17 +76,17 @@ void refresh_list() { int i, line; - + werase(list); - print_number_of_items(); - - if( items < 1 ) { + ui_print_number_of_items(); + + if(list_is_empty()) { refresh(); wrefresh(list); return; } - + if(curitem < 0) curitem = 0; @@ -67,78 +98,86 @@ 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++) { - if(i == curitem) - highlight_line(list, line); - - print_list_line(i, line); - - wstandend(list); + print_list_line(i, line, i == curitem); } + if(opt_get_bool(BOOL_SHOW_CURSOR)) { + wmove(list, curitem - first_list_item, 0); + /* need to call refresh() to update the cursor positions */ + refresh(); + } wrefresh(list); } void -print_list_line(int i, int line) +print_list_line(int i, int line, int highlight) { + int extra = extra_column; char tmp[MAX_EMAILSTR_LEN]; - int extra_column = options_get_int("extra_column"); - int real_emaillen = (extra_column > 2 && extra_column < ITEM_FIELDS) ? - EMAILLEN : EMAILPOS - COLS; + int real_emaillen = (extra_column > 0 || extra_alternative > 0) ? + EMAILLEN : COLS - EMAILPOS; scrollok(list, FALSE); + if(highlight) + highlight_line(list, line); - if( selected[i] ) + if(selected[i]) mvwaddch(list, line, 0, '*' ); - - mvwaddnstr(list, line, NAMEPOS, database[i][NAME], NAMELEN); - if( options_get_int( "show_all_emails" ) ) - mvwaddnstr(list, line, EMAILPOS, database[i][EMAIL], - real_emaillen); + + mvwaddnstr(list, line, NAMEPOS, db_name_get(i), + bytes2width(db_name_get(i), NAMELEN)); + + if(opt_get_bool(BOOL_SHOW_ALL_EMAILS)) + mvwaddnstr(list, line, EMAILPOS, db_email_get(i), + bytes2width(db_email_get(i), real_emaillen)); else { get_first_email(tmp, i); - mvwaddnstr(list, line, EMAILPOS, tmp, real_emaillen); + mvwaddnstr(list, line, EMAILPOS, tmp, + bytes2width(tmp, real_emaillen)); } - if(extra_column > 2 && extra_column < ITEM_FIELDS) { - if( !database[i][extra_column] ) { - int extra_alternative = - options_get_int("extra_alternative"); - - if(extra_alternative > 2 && - extra_alternative < ITEM_FIELDS) - extra_column = extra_alternative; - } + if(extra < 0 || !db_fget_byid(i, extra)) + extra = extra_alternative; + if(extra >= 0) mvwaddnstr(list, line, EXTRAPOS, - safe_str(database[i][extra_column]), - 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() { - int extra_column = options_get_int("extra_column"); + char *str = NULL; +#if defined(A_BOLD) && defined(A_NORMAL) attrset(A_BOLD); - mvaddstr(2, NAMEPOS, abook_fields[NAME].name); - mvaddstr(2, EMAILPOS, abook_fields[EMAIL].name); - if( extra_column > 2 && extra_column < ITEM_FIELDS ) - mvaddnstr(2, EXTRAPOS, abook_fields[extra_column].name, - COLS-EXTRAPOS); +#endif + + 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 } void scroll_up() { - if( curitem < 1 ) + if(curitem < 1) return; curitem--; @@ -149,7 +188,7 @@ scroll_up() void scroll_down() { - if( curitem > items - 2 ) + if(curitem > db_n_items() - 2) return; curitem++; @@ -161,39 +200,57 @@ scroll_down() void page_up() { - if( curitem < 1 ) + if(curitem < 1) return; - + curitem = curitem == first_list_item ? ((curitem -= LIST_LINES) < 0 ? 0 : curitem) : first_list_item; - + refresh_list(); } 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(); } - 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 @@ -201,55 +258,64 @@ 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(); } 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) { wstandout(win); - -#ifdef mvwchgat + + /* + * this is a tricky one + */ +#if 0 +/*#ifdef mvwchgat*/ mvwchgat(win, line, 0, -1, A_STANDOUT, 0, NULL); #else /* @@ -272,7 +338,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++; @@ -284,10 +350,50 @@ 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_is_empty() +{ + return db_n_items() < 1; +} + +int +list_get_curitem() +{ + return curitem; +} + +void +list_set_curitem(int i) +{ + curitem = i; +} + +int +duplicate_item() +{ + list_item item; + + if(curitem < 0) + return 1; + + 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(); + refresh_list(); + + return 0; +} +