]> git.deb.at Git - pkg/abook.git/blobdiff - list.c
- don't use items variable outside of database.c
[pkg/abook.git] / list.c
diff --git a/list.c b/list.c
index ce0f9efa6eb3f8304ff8897ae4b65b8ffe19dcb4..57f4b36769a5deb16d33c6ed8dbce4542adb5af5 100644 (file)
--- a/list.c
+++ b/list.c
@@ -1,36 +1,68 @@
 
 /*
- * list.c
- * by JH <jheinonen@bigfoot.com>
+ * $Id$
+ *
+ * by JH <jheinonen@users.sourceforge.net>
  *
  * Copyright (C) Jaakko Heinonen
  */
 
 #include <stdio.h>
 #include <string.h>
-#include "abook_curses.h"
 #include "abook.h"
+#include <assert.h>
+#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
@@ -44,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;
 
@@ -66,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++ ) {
-
-               if(i == curitem)
-                       highlight_line(list, line);
-               
-               print_list_line(i, line);
+        for(line = 0, i = first_list_item;
+                       i <= LAST_LIST_ITEM && i < db_n_items();
+                       line++, i++) {
 
-               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--;
@@ -148,7 +188,7 @@ scroll_up()
 void
 scroll_down()
 {
-       if( curitem > items - 2 )
+       if(curitem > db_n_items() - 2)
                return;
 
        curitem++;
@@ -160,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
@@ -200,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
        /*
@@ -269,13 +336,13 @@ highlight_line(WINDOW *win, int line)
 int
 selected_items()
 {
-       int i, a=0;
+       int i, n = 0;
 
-       for(i = 0; i < items; i++)
+       for(i = 0; i < db_n_items(); i++)
                if(selected[i])
-                       a++;
+                       n++;
 
-       return a;
+       return n;
 }
 
 void
@@ -283,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;
+}
+