#include "ui.h"
#include "database.h"
#include "edit.h"
+#include "gettext.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
int curitem = -1;
int first_list_item = -1;
int extra_column = -1;
int extra_alternative = -1;
-extern int items;
-extern list_item *database;
-extern struct abook_field abook_fields[];
+extern abook_field_list *fields_list;
-WINDOW *list = NULL;
+static WINDOW *list = NULL;
-static int
+
+int
init_extra_field(enum str_opts option)
{
- int i, ret = -1;
+ int 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) {
+ find_field_number(option_str, &ret);
+
+ if(!strcmp(option_str, "name") || !strcmp(option_str, "email"))
ret = -1;
- }
}
return ret;
ui_print_number_of_items();
- if(items < 1) {
+ if(list_is_empty()) {
refresh();
wrefresh(list);
return;
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++) {
print_list_line(i, line, i == curitem);
}
if(selected[i])
mvwaddch(list, line, 0, '*' );
- mvwaddnstr(list, line, NAMEPOS, database[i][NAME],
- bytes2width(database[i][NAME], NAMELEN));
+ 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, database[i][EMAIL],
- bytes2width(database[i][EMAIL], real_emaillen));
+ 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,
- bytes2width(tmp, real_emaillen));
+ bytes2width(tmp, real_emaillen));
}
- if(extra < 0 || !database[i][extra])
+ if(extra < 0 || !db_fget_byid(i, extra))
extra = extra_alternative;
if(extra >= 0)
mvwaddnstr(list, line, EXTRAPOS,
- safe_str(database[i][extra]),
- bytes2width(safe_str(database[i][extra]), 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()
{
+ char *str = NULL;
+
#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);
+
+ 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_down()
{
- if(curitem > items - 2)
+ if(curitem > db_n_items() - 2)
return;
curitem++;
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
{
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)
{
{
int i, n = 0;
- for(i = 0; i < items; i++)
+ for(i = 0; i < db_n_items(); i++)
if(selected[i])
n++;
{
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_current_item()
+list_is_empty()
{
- return curitem;
+ return db_n_items() < 1;
}
int
-list_is_empty()
+list_get_curitem()
{
- return items < 1;
+ return curitem;
+}
+
+void
+list_set_curitem(int i)
+{
+ curitem = i;
}
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))
+ 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;
+ curitem = last_item();
refresh_list();
return 0;