+void
+get_list_field(int item, struct index_elem *e, struct list_field *res)
+{
+ char *s;
+
+ res->data = s = NULL;
+
+ do { /* find first non-empty field data in the alternate fields list */
+ s = db_fget_byid(item, e->d.field.id);
+ } while(!(s && *s) && ((e = e->d.field.next) != NULL));
+
+ if(!e || !s || !*s)
+ return;
+
+ res->data = s;
+ get_field_info(e->d.field.id, NULL, NULL, &res->type);
+}
+
+static void
+print_list_field(int item, int line, int *x_pos, struct index_elem *e)
+{
+ char *s, *p;
+ int width, x_start, mustfree = FALSE, len = abs(e->d.field.len);
+ struct list_field f;
+
+ get_list_field(item, e, &f);
+ s = f.data;
+
+ if(!s || !*s) {
+ *x_pos += len;
+ return;
+ }
+
+ if(f.type == FIELD_EMAILS && !opt_get_bool(BOOL_SHOW_ALL_EMAILS))
+ if((p = strchr(s, ',')) != NULL) {
+ s = xstrndup(s, p - s);
+ mustfree = TRUE;
+ }
+
+ 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 = bytes2width(s, COLS - x_start);
+
+ if(width)
+ mvwaddnstr(list, line, x_start, s, width);
+
+ if(mustfree)
+ free(s);
+
+ *x_pos += len ? len : width;
+}
+
+static void
+highlight_line(WINDOW *win, int line)
+{
+ wstandout(win);
+
+ /*
+ * this is a tricky one
+ */
+#if 0
+/*#ifdef mvwchgat*/
+ mvwchgat(win, line, 0, -1, A_STANDOUT, 0, NULL);
+#else
+ /*
+ * buggy function: FIXME
+ */
+ scrollok(win, FALSE);
+ {
+ int i;
+ wmove(win, line, 0);
+ for(i = 0; i < COLS; i++)
+ waddch(win, ' ');
+ /*wattrset(win, 0);*/
+ }
+ scrollok(win, TRUE);
+#endif
+}
+
+static void
+print_list_line(int item, int line, int highlight)
+{
+ struct index_elem *cur;
+ int x_pos = 1;
+
+ scrollok(list, FALSE);
+ if(highlight)
+ highlight_line(list, line);
+
+ if(selected[item])
+ mvwaddch(list, line, 0, '*' );
+
+ for(cur = index_elements; cur; cur = cur->next)
+ switch(cur->type) {
+ case INDEX_TEXT:
+ mvwaddstr(list, line, x_pos, cur->d.text);
+ x_pos += strwidth(cur->d.text);
+ break;
+ case INDEX_FIELD:
+ print_list_field(item, line, &x_pos, cur);
+ break;
+ default:
+ assert(0);
+ }
+
+ scrollok(list, TRUE);
+ if(highlight)
+ wstandend(list);
+}
+