static struct items * findItem(struct items * items, const void * data);
static void buildFlatList(newtComponent co);
static void doBuildFlatList(struct CheckboxTree * ct, struct items * item);
-enum countWhat { COUNT_EXPOSED=0, COUNT_SELECTED=1 };
-static int countItems(struct items * item, enum countWhat justExposed);
+static int countItems(struct items * item, int what);
static inline void updateWidth(newtComponent co, struct CheckboxTree * ct,
int maxField);
ct->sb->left = co->left + co->width - 1;
}
-static int countItems(struct items * item, enum countWhat what) {
+static int countItems(struct items * item, int what) {
int count = 0;
while (item) {
- if ((!item->branch && item->selected == what) || (what == COUNT_EXPOSED))
+ if (what < 0 || (!item->branch && ((what > 0 && item->selected == what)
+ || (what == 0 && item->selected))))
count++;
- if (item->branch || (what == COUNT_EXPOSED && item->selected))
+ if (item->branch && (what >= 0 || (what < 0 && item->selected)))
count += countItems(item->branch, what);
item = item->next;
}
struct CheckboxTree * ct = co->data;
if (ct->flatList) free(ct->flatList);
- ct->flatCount = countItems(ct->itemlist, COUNT_EXPOSED);
+ ct->flatCount = countItems(ct->itemlist, -1);
ct->flatList = malloc(sizeof(*ct->flatList) * (ct->flatCount+1));
ct->flatCount = 0;
va_start(argList, index);
numIndexes = 0;
i = index;
- va_start(argList, index);
while (i != NEWT_ARG_LAST) {
indexes[numIndexes++] = i;
i = va_arg(argList, int);
i++;
if (i < numIndexes) {
+ if (item == NULL)
+ return -1;
curList = item->branch;
listPtr = &item->branch;
if (!curList && (i + 1 != numIndexes)) return -1;
static void listSelected(struct items * items, int * num, const void ** list, int seqindex) {
while (items) {
- if ((seqindex ? items->selected==seqindex : items->selected) && !items->branch)
+ if ((seqindex ? items->selected==seqindex : items->selected) && !items->branch)
list[(*num)++] = (void *) items->data;
if (items->branch)
listSelected(items->branch, num, list, seqindex);
seqindex = 0;
}
- *numitems = countItems(ct->itemlist, (seqindex ? seqindex : COUNT_SELECTED));
+ *numitems = countItems(ct->itemlist, seqindex);
if (!*numitems) return NULL;
retval = malloc(*numitems * sizeof(void *));
co = malloc(sizeof(*co));
ct = malloc(sizeof(struct CheckboxTree));
co->callback = NULL;
+ co->destroyCallback = NULL;
co->data = ct;
co->left = left;
co->top = top;
struct items ** item;
int i, j;
char * spaces;
- int currRow;
+ int currRow = co->top;
if (!co->isMapped) return ;
currRow = co->top + i;
}
- j = 4 + (3 * (*item)->depth);
- SLsmg_write_nstring(NULL, co->width - j);
- newtGotorc(co->top + i, co->left + j);
- if (wstrlen((*item)->text, -1) > co->width - j) {
- char *tmp;
- tmp = strdup((*item)->text);
- trim_string(tmp, co->width - j);
- SLsmg_write_string(tmp);
- free(tmp);
- } else
- SLsmg_write_string((*item)->text);
+ SLsmg_write_nstring((*item)->text, co->width - 4 - (3 * (*item)->depth));
item++;
i++;
list which is the last thing in the tree, and whose elements are
displayed at the bottom of the screen */
if (i < co->height) {
- spaces = alloca(co->width);
+ spaces = alloca(co->width + 1);
memset(spaces, ' ', co->width);
+ spaces[co->width] = '\0';
SLsmg_set_color(NEWT_COLORSET_LISTBOX);
- }
- while (i < co->height) {
- newtGotorc(co->top + i, co->left);
- SLsmg_write_nstring(spaces, co->width);
- i++;
+
+ while (i < co->height) {
+ newtGotorc(co->top + i, co->left);
+ SLsmg_write_nstring(spaces, co->width);
+ i++;
+ }
}
if(ct->sb) {
ct->sb->ops->draw(ct->sb);
}
- newtGotorc(currRow, co->left + 1);
+ newtGotorc(currRow, co->left +
+ (*ct->currItem ? (*ct->currItem)->depth : 0) * 3 + 4);
}
-static void ctDestroy(newtComponent co) {
- struct CheckboxTree * ct = co->data;
- struct items * item, * nextitem;
-
- nextitem = item = ct->itemlist;
+static void destroyItems(struct items * item) {
+ struct items * nextitem;
while (item != NULL) {
nextitem = item->next;
free(item->text);
+ if (item->branch)
+ destroyItems(item->branch);
free(item);
item = nextitem;
}
+}
+
+static void ctDestroy(newtComponent co) {
+ struct CheckboxTree * ct = co->data;
+ destroyItems(ct->itemlist);
+ free(ct->flatList);
+ if (ct->sb)
+ ct->sb->ops->destroy(ct->sb);
free(ct->seq);
free(ct);
free(co);
const void * newtCheckboxTreeGetCurrent(newtComponent co) {
struct CheckboxTree * ct = co->data;
- if (!ct->currItem) return NULL;
+ if (!ct->currItem) {
+ if (ct->itemlist)
+ return ct->itemlist->data;
+ else
+ return NULL;
+ }
+
return (*ct->currItem)->data;
}
treeTop = item->branch;
}
+ free(path);
buildFlatList(co);
item = findItem(ct->itemlist, data);