X-Git-Url: https://git.deb.at/?a=blobdiff_plain;f=list.c;h=7197723d03fcad6f03f8b5165146e8add20f65e8;hb=208968222b63ab08f95b0ad6d882cfc4ab22dda5;hp=fd1c7069307a23f2b981b2094946fb6029709b9c;hpb=12a57d9405d7910566d5ff888d743d29b0716554;p=pkg%2Fabook.git diff --git a/list.c b/list.c index fd1c706..7197723 100644 --- a/list.c +++ b/list.c @@ -2,36 +2,73 @@ /* * $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 "list.h" #include "misc.h" #include "options.h" +#define MIN_EXTRA_COLUMN ADDRESS /* 2 */ +#define MAX_EXTRA_COLUMN LAST_FIELD + int curitem = -1; int first_list_item = -1; char *selected = NULL; +int extra_column = -1; +int extra_alternative = -1; + extern int items; extern list_item *database; extern struct abook_field abook_fields[]; WINDOW *list = NULL; +static int +init_extra_field(enum str_opts option) +{ + int i, 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) { + ret = -1; + } + } + + 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 @@ -48,9 +85,9 @@ refresh_list() werase(list); - print_number_of_items(); + ui_print_number_of_items(); - if( items < 1 ) { + if(items < 1) { refresh(); wrefresh(list); return; @@ -70,32 +107,29 @@ refresh_list() for( line = 0, i = first_list_item ; i <= LAST_LIST_ITEM && i < items; line++, i++ ) { - if(i == curitem) - highlight_line(list, line); - - print_list_line(i, line); - - wstandend(list); + print_list_line(i, line, i == curitem); } 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" ) ) + if(opt_get_bool(BOOL_SHOW_ALL_EMAILS)) mvwaddnstr(list, line, EMAILPOS, database[i][EMAIL], real_emaillen); else { @@ -103,42 +137,41 @@ print_list_line(int i, int line) mvwaddnstr(list, line, EMAILPOS, 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 || !database[i][extra]) + extra = extra_alternative; + if(extra >= 0) mvwaddnstr(list, line, EXTRAPOS, - safe_str(database[i][extra_column]), + safe_str(database[i][extra]), EXTRALEN); - } scrollok(list, TRUE); + if(highlight) + wstandend(list); } void list_headerline() { - int extra_column = options_get_int("extra_column"); - +#ifdef A_BOLD attrset(A_BOLD); +#else + /* hmm, maybe something here */ +#endif mvaddstr(2, NAMEPOS, abook_fields[NAME].name); mvaddstr(2, EMAILPOS, abook_fields[EMAIL].name); - if( extra_column > 2 && extra_column < ITEM_FIELDS ) + if(extra_column > 0) mvaddnstr(2, EXTRAPOS, abook_fields[extra_column].name, COLS-EXTRAPOS); +#ifdef A_BOLD attrset(A_NORMAL); +#endif } void scroll_up() { - if( curitem < 1 ) + if(curitem < 1) return; curitem--; @@ -149,7 +182,7 @@ scroll_up() void scroll_down() { - if( curitem > items - 2 ) + if(curitem > items - 2) return; curitem++; @@ -161,7 +194,7 @@ scroll_down() void page_up() { - if( curitem < 1 ) + if(curitem < 1) return; curitem = curitem == first_list_item ? @@ -173,7 +206,7 @@ page_up() void page_down() { - if( curitem > items - 2 ) + if(curitem > items - 2) return; curitem = curitem == LAST_LIST_ITEM ? @@ -187,13 +220,13 @@ page_down() void select_none() { - memset( selected, 0, items ); + memset(selected, 0, items); } void select_all() { - memset( selected, 1, items ); + memset(selected, 1, items); } void @@ -248,8 +281,12 @@ 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 /* @@ -284,10 +321,44 @@ invert_selection() { int i; - if( items < 1 ) + if(items < 1) return; for(i = 0; i < items; i++) selected[i] = !selected[i]; } +int +list_current_item() +{ + return curitem; +} + +int +list_is_empty() +{ + return items < 1; +} + +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] ? strdup(database[curitem][i]) : + NULL; + + if(add_item2database(item)) + return 1; + + curitem = LAST_ITEM; + refresh_list(); + + return 0; +} +