]> git.deb.at Git - pkg/abook.git/blobdiff - list.c
- add xstrdup to have proper checking for memory allocation failures
[pkg/abook.git] / list.c
diff --git a/list.c b/list.c
index 6cb8ed791b8bd71065d62cd63657e7387cd50210..de47d6b419246c5df21ebf85837bd9312e5514ac 100644 (file)
--- a/list.c
+++ b/list.c
@@ -9,14 +9,15 @@
 
 #include <stdio.h>
 #include <string.h>
-#include <assert.h>
 #include "abook.h"
+#include <assert.h>
 #include "ui.h"
 #include "database.h"
 #include "edit.h"
 #include "list.h"
 #include "misc.h"
 #include "options.h"
+#include "xmalloc.h"
 
 #define MIN_EXTRA_COLUMN       ADDRESS /* 2 */
 #define MAX_EXTRA_COLUMN       LAST_FIELD
@@ -32,17 +33,15 @@ extern int items;
 extern list_item *database;
 extern struct abook_field abook_fields[];
 
-WINDOW *list = NULL;
+static WINDOW *list = NULL;
 
 static int
-init_extra_field(char *option_name)
+init_extra_field(enum str_opts option)
 {
        int i, ret = -1;
        char *option_str;
 
-       assert(option_name != NULL);
-       
-       option_str = options_get_str(option_name);
+       option_str = opt_get_str(option);
 
        if(option_str && *option_str) {
                for(i = 0; i < ITEM_FIELDS; i++) {
@@ -69,8 +68,8 @@ init_list()
         * init extra_column and extra alternative
         */
 
-       extra_column = init_extra_field("extra_column");
-       extra_alternative = init_extra_field("extra_alternative");
+       extra_column = init_extra_field(STR_EXTRA_COLUMN);
+       extra_alternative = init_extra_field(STR_EXTRA_ALTERNATIVE);
 }
 
 void
@@ -84,17 +83,17 @@ void
 refresh_list()
 {
        int i, line;
-       
+
        werase(list);
 
        ui_print_number_of_items();
-       
-       if( items < 1 ) {
+
+       if(list_is_empty()) {
                refresh();
                wrefresh(list);
                return;
        }
-       
+
        if(curitem < 0)
                curitem = 0;
 
@@ -109,19 +108,19 @@ 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);
         }
 
+       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];
@@ -129,46 +128,56 @@ print_list_line(int i, int line)
                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, NAMEPOS, database[i][NAME],
+               bytes2width(database[i][NAME], NAMELEN));
+       if(opt_get_bool(BOOL_SHOW_ALL_EMAILS))
                mvwaddnstr(list, line, EMAILPOS, database[i][EMAIL],
-                               real_emaillen);
+                               bytes2width(database[i][EMAIL], 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 < 0 || !database[i][extra])
                extra = extra_alternative;
        if(extra >= 0)
                mvwaddnstr(list, line, EXTRAPOS,
-                               safe_str(database[i][extra]),
-                               EXTRALEN);
+                       safe_str(database[i][extra]),
+                       bytes2width(safe_str(database[i][extra]), EXTRALEN));
 
        scrollok(list, TRUE);
+       if(highlight)
+               wstandend(list);
 }
-       
+
 
 void
 list_headerline()
 {
+#if defined(A_BOLD) && defined(A_NORMAL)
        attrset(A_BOLD);
+#endif
        mvaddstr(2, NAMEPOS, abook_fields[NAME].name);
        mvaddstr(2, EMAILPOS, abook_fields[EMAIL].name);
        if(extra_column > 0)
                mvaddnstr(2, EXTRAPOS, abook_fields[extra_column].name,
                                COLS-EXTRAPOS);
+#if defined(A_BOLD) && defined(A_NORMAL)
        attrset(A_NORMAL);
+#endif
 }
 
 void
 scroll_up()
 {
-       if( curitem < 1 )
+       if(curitem < 1)
                return;
 
        curitem--;
@@ -179,7 +188,7 @@ scroll_up()
 void
 scroll_down()
 {
-       if( curitem > items - 2 )
+       if(curitem > items - 2)
                return;
 
        curitem++;
@@ -191,19 +200,19 @@ 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 > items - 2)
                return;
 
        curitem = curitem == LAST_LIST_ITEM ?
@@ -213,17 +222,16 @@ page_down()
        refresh_list();
 }
 
-
 void
 select_none()
 {
-        memset( selected, 0, items );
+        memset(selected, 0, items);
 }
 
 void
 select_all()
 {
-        memset( selected, 1, items );
+        memset(selected, 1, items);
 }
 
 void
@@ -260,7 +268,7 @@ goto_home()
 {
        if(items > 0)
                curitem = 0;
-       
+
        refresh_list();
 }
 
@@ -278,8 +286,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
        /*
@@ -314,7 +326,7 @@ invert_selection()
 {
        int i;
 
-       if( items < 1 )
+       if(items < 1)
                return;
 
        for(i = 0; i < items; i++)
@@ -333,4 +345,25 @@ 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] ? xstrdup(database[curitem][i]) :
+                       NULL;
+
+       if(add_item2database(item))
+               return 1;
+
+       curitem = LAST_ITEM;
+       refresh_list();
+
+       return 0;
+}
+