/*
- * $Id: list.c,v 1.33 2006/09/05 08:21:35 jheinonen Exp $
+ * $Id$
*
* by JH <jheinonen@users.sourceforge.net>
*
#include "misc.h"
#include "options.h"
#include "xmalloc.h"
+#include "color.h"
int curitem = -1;
int first_list_item = -1;
+int scroll_speed = 2;
char *selected = NULL;
extern abook_field_list *fields_list;
{
list = newwin(LIST_LINES, LIST_COLS, LIST_TOP, 0);
scrollok(list, TRUE);
+ scroll_speed = abs(opt_get_int(INT_SCROLL_SPEED));
}
void
width = len ? bytes2width(s, len) : strwidth(s);
x_start = *x_pos + ((e->d.field.len < 0) ? len - width : 0);
if(width + x_start >= COLS)
- width = COLS - x_start;
+ width = bytes2width(s, COLS - x_start);
if(width)
mvwaddnstr(list, line, x_start, s, width);
static void
highlight_line(WINDOW *win, int line)
{
- wstandout(win);
+ wattrset(win, COLOR_PAIR(CP_LIST_HIGHLIGHT));
+ if(!opt_get_bool(BOOL_USE_COLORS)) {
+ wstandout(win);
+ }
/*
* this is a tricky one
struct index_elem *cur;
int x_pos = 1;
+ if(item % 2 == 0)
+ wattrset(list, COLOR_PAIR(CP_LIST_EVEN));
+ else
+ wattrset(list, COLOR_PAIR(CP_LIST_ODD));
scrollok(list, FALSE);
if(highlight)
highlight_line(list, line);
#if defined(A_BOLD) && defined(A_NORMAL)
attrset(A_BOLD);
#endif
+ attrset(COLOR_PAIR(CP_LIST_HEADER));
+ mvhline(2, 0, ' ', COLS);
for(e = index_elements; e; e = e->next)
if(e->type == INDEX_TEXT)
x_pos += strwidth(e->d.text);
else if(e->type == INDEX_FIELD) {
get_field_info(e->d.field.id, NULL, &str, NULL);
- width = e->d.field.len ? abs(e->d.field.len) : strwidth(str);
+ width = e->d.field.len ?
+ abs(e->d.field.len) : strwidth(str);
+ if(width + x_pos > COLS)
+ width = bytes2width(str, COLS - x_pos);
mvaddnstr(2, x_pos, str, width);
x_pos += width;
} else
refresh_list();
}
+void
+scroll_list_up()
+{
+ if(first_list_item <= 0) {
+ if(curitem != 0) {
+ curitem--;
+ refresh_list();
+ }
+ return;
+ }
+
+ first_list_item -= scroll_speed;
+ if(first_list_item < 0) {
+ first_list_item = 0;
+ }
+ if(curitem > LAST_LIST_ITEM) {
+ curitem = LAST_LIST_ITEM;
+ }
+
+ refresh_list();
+}
+
+void
+scroll_list_down()
+{
+ if(LAST_LIST_ITEM > db_n_items() - 2) {
+ if(curitem < LAST_LIST_ITEM) {
+ curitem++;
+ refresh_list();
+ }
+ return;
+ }
+
+ first_list_item += scroll_speed;
+ if(LAST_LIST_ITEM > db_n_items() - 1) {
+ first_list_item = db_n_items() - LIST_LINES;
+ }
+ if(curitem < first_list_item) {
+ curitem = first_list_item;
+ }
+
+ refresh_list();
+}
void
page_up()
return curitem;
}
+int
+list_get_firstitem()
+{
+ return first_list_item;
+}
+
void
list_set_curitem(int i)
{