]> git.deb.at Git - pkg/abook.git/blobdiff - list.c
cleanup
[pkg/abook.git] / list.c
diff --git a/list.c b/list.c
index 39bf4422fcd755d3b8315ade75142dfdc2a07b20..dddb84f45ddc0dc7a30a45ba6dc3aff10ab95a33 100644 (file)
--- a/list.c
+++ b/list.c
@@ -2,13 +2,14 @@
 /*
  * $Id$
  *
- * by JH <jheinonen@bigfoot.com>
+ * by JH <jheinonen@users.sourceforge.net>
  *
  * Copyright (C) Jaakko Heinonen
  */
 
 #include <stdio.h>
 #include <string.h>
+#include <assert.h>
 #include "abook.h"
 #include "ui.h"
 #include "database.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(char *option_name)
+{
+       int i, ret = -1;
+       char *option_str;
+
+       assert(option_name != NULL);
+       
+       option_str = options_get_str(option_name);
+
+       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("extra_column");
+       extra_alternative = init_extra_field("extra_alternative");
 }
 
 void
@@ -70,10 +109,7 @@ 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);
+               print_list_line(i, line, i == curitem);
 
                wstandend(list);
         }
@@ -82,14 +118,16 @@ refresh_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) ?
+       int real_emaillen = (extra_column > 0 || extra_alternative > 0) ?
                EMAILLEN : COLS - EMAILPOS;
 
        scrollok(list, FALSE);
+       if(highlight)
+               highlight_line(list, line);
 
        if( selected[i] )
                mvwaddch(list, line, 0, '*' );
@@ -103,33 +141,26 @@ 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_line)
+               wstandend(list);
 }
        
 
 void
 list_headerline()
 {
-       int extra_column = options_get_int("extra_column");
-
        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 )
+       if(extra_column > 0)
                mvaddnstr(2, EXTRAPOS, abook_fields[extra_column].name,
                                COLS-EXTRAPOS);
        attrset(A_NORMAL);
@@ -291,13 +322,13 @@ invert_selection()
                selected[i] = !selected[i];
 }
 
-inline int
+int
 list_current_item()
 {
        return curitem;
 }
 
-inline int
+int
 list_is_empty()
 {
        return items < 1;