/*
* ion/mod_query/listing.c
*
- * Copyright (c) Tuomo Valkonen 1999-2006.
+ * Copyright (c) Tuomo Valkonen 1999-2007.
*
- * Ion is free software; you can redistribute it and/or modify it under
- * the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2.1 of the License, or
- * (at your option) any later version.
+ * See the included file LICENSE for details.
*/
#include <string.h>
static void draw_multirow(GrBrush *brush, int x, int y, int h,
char *str, WListingItemInfo *iinf,
- int maxw, int ciw, int wrapw, const char *style)
+ int maxw, int ciw, int wrapw)
{
int i, l;
if(iinf==NULL){
- grbrush_draw_string(brush, x, y, str, strlen(str), TRUE, style);
+ grbrush_draw_string(brush, x, y, str, strlen(str), TRUE);
return;
}
l=iinf->part_lens[0];
}
- grbrush_draw_string(brush, x, y, str, l, TRUE, style);
+ grbrush_draw_string(brush, x, y, str, l, TRUE);
for(i=1; i<iinf->n_parts; i++){
- grbrush_draw_string(brush, x+maxw-wrapw, y, "\\", 1, TRUE, style);
+ grbrush_draw_string(brush, x+maxw-wrapw, y, "\\", 1, TRUE);
y+=h;
str+=l;
}
l=iinf->part_lens[i];
- grbrush_draw_string(brush, x, y, str, l, TRUE, style);
+ grbrush_draw_string(brush, x, y, str, l, TRUE);
}
}
static void do_draw_listing(GrBrush *brush, const WRectangle *geom,
- WListing *l, const char *style,
- const char *selstyle)
+ WListing *l, GrAttr selattr, int mode)
{
int wrapw=grbrush_get_text_width(brush, "\\", 1);
int ciw=grbrush_get_text_width(brush, CONT_INDENT, CONT_INDENT_LEN);
if(i>=l->nstrs)
return;
- draw_multirow(brush, geom->x+x, y, l->itemh, l->strs[i],
- (l->iteminfos!=NULL ? &(l->iteminfos[i]) : NULL),
- geom->w-x, ciw, wrapw,
- (i==l->selected_str ? selstyle : style));
+ if(mode>=0 ||
+ l->selected_str==i ||
+ LISTING_DRAW_GET_SELECTED(mode)==i){
+
+ if(i==l->selected_str)
+ grbrush_set_attr(brush, selattr);
+
+ draw_multirow(brush, geom->x+x, y, l->itemh, l->strs[i],
+ (l->iteminfos!=NULL ? &(l->iteminfos[i]) : NULL),
+ geom->w-x, ciw, wrapw);
+
+ if(i==l->selected_str)
+ grbrush_unset_attr(brush, selattr);
+ }
y+=l->itemh*ITEMROWS(l, i);
r+=ITEMROWS(l, i);
}
+static int prevsel=-1;
+
+static bool filteridx_sel(WListing *l, int i)
+{
+ return (i==prevsel || i==l->selected_str);
+}
+
+
void draw_listing(GrBrush *brush, const WRectangle *geom,
- WListing *l, bool complete, const char *style,
- const char *selstyle)
+ WListing *l, int mode, GrAttr selattr)
{
WRectangle geom2;
GrBorderWidths bdw;
-
- grbrush_begin(brush, geom, GRBRUSH_AMEND|GRBRUSH_NEED_CLIP);
-
- if(complete)
+
+ grbrush_begin(brush, geom, GRBRUSH_AMEND|GRBRUSH_KEEP_ATTR
+ |GRBRUSH_NEED_CLIP);
+
+ if(mode==LISTING_DRAW_COMPLETE)
grbrush_clear_area(brush, geom);
- grbrush_draw_border(brush, geom, style);
+ grbrush_draw_border(brush, geom);
grbrush_get_border_widths(brush, &bdw);
geom2.w=geom->w-bdw.left-bdw.right;
geom2.h=geom->h-bdw.top-bdw.bottom;
- do_draw_listing(brush, &geom2, l, style, selstyle);
+ do_draw_listing(brush, &geom2, l, selattr, mode);
grbrush_end(brush);
}
}
-bool listing_select(WListing *l, int i)
+int listing_select(WListing *l, int i)
{
int irow, frow, lrow;
- bool complredraw=FALSE;
+ int redraw;
+
+ redraw=LISTING_DRAW_SELECTED(l->selected_str);
if(i<0){
l->selected_str=-1;
- return FALSE;
+ return redraw;
}
assert(i<l->nstrs);
while(irow<frow){
one_row_up(l, &(l->firstitem), &(l->firstoff));
frow--;
- complredraw=TRUE;
+ redraw=LISTING_DRAW_COMPLETE;
}
irow+=ITEMROWS(l, i)-1;
while(irow>lrow){
one_row_down(l, &(l->firstitem), &(l->firstoff));
lrow++;
- complredraw=TRUE;
+ redraw=LISTING_DRAW_COMPLETE;
}
- return complredraw;
+ return redraw;
}