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, COUNT_SELECTED };
+enum countWhat { COUNT_EXPOSED=0, COUNT_SELECTED=1 };
static int countItems(struct items * item, enum countWhat justExposed);
static struct componentOps ctOps = {
int count = 0;
while (item) {
- if ((!item->branch) || (what == COUNT_EXPOSED))
+ if ((!item->branch && item->selected == what) || (what == COUNT_EXPOSED))
count++;
if (item->branch || (what == COUNT_EXPOSED && item->selected))
count += countItems(item->branch, what);
return NULL;
}
-static void listSelected(struct items * items, int * num, void ** list) {
+static void listSelected(struct items * items, int * num, void ** list, int seqindex) {
while (items) {
- if (items->selected && !items->branch)
+ if ((seqindex ? items->selected==seqindex : items->selected) && !items->branch)
list[(*num)++] = items->data;
if (items->branch)
- listSelected(items->branch, num, list);
+ listSelected(items->branch, num, list, seqindex);
items = items->next;
}
}
void ** newtCheckboxTreeGetSelection(newtComponent co, int *numitems)
+{
+ return newtCheckboxTreeGetMultiSelection(co, numitems, 0);
+}
+
+void ** newtCheckboxTreeGetMultiSelection(newtComponent co, int *numitems, char seqnum)
{
struct CheckboxTree * ct;
void **retval;
+ int seqindex=0;
if(!co || !numitems) return NULL;
ct = co->data;
+
+ if (seqnum) {
+ while( ct->seq[seqindex] && ( ct->seq[seqindex] != seqnum )) seqindex++;
+ } else {
+ seqindex = 0;
+ }
- *numitems = countItems(ct->itemlist, COUNT_SELECTED);
+ *numitems = countItems(ct->itemlist, (seqindex ? seqindex : COUNT_SELECTED));
if (!*numitems) return NULL;
retval = malloc(*numitems * sizeof(void *));
*numitems = 0;
- listSelected(ct->itemlist, numitems, retval);
+ listSelected(ct->itemlist, numitems, retval, seqindex);
return retval;
}
newtComponent newtCheckboxTree(int left, int top, int height, int flags) {
+ return newtCheckboxTreeMulti(left, top, height, NULL, flags);
+}
+
+newtComponent newtCheckboxTreeMulti(int left, int top, int height, char *seq, int flags) {
newtComponent co;
struct CheckboxTree * ct;
ct->firstItem = NULL;
ct->currItem = NULL;
ct->flatList = NULL;
+ if (seq)
+ ct->seq = strdup(seq);
+ else
+ ct->seq = strdup(" *");
if (flags & NEWT_FLAG_SCROLL) {
ct->sb = newtVerticalScrollbar(left, top, height,
COLORSET_LISTBOX, COLORSET_ACTLISTBOX);
item->selected = 1;
break;
case NEWT_FLAGS_TOGGLE:
- item->selected = !item->selected;
+ if (item->branch)
+ item->selected = !item->selected;
+ else {
+ item->selected++;
+ if (item->selected==strlen(ct->seq))
+ item->selected = 0;
+ }
break;
}
else
SLsmg_write_string("<+> ");
} else {
- if ((*item)->selected)
- SLsmg_write_string("[*] ");
+ if ((*item)->selected) {
+ char tmp[5];
+ snprintf(tmp,5,"[%c] ",ct->seq[(*item)->selected]);
+ SLsmg_write_string(tmp);
+ }
else
SLsmg_write_string("[ ] ");
}
item = nextitem;
}
+ free(ct->seq);
free(ct);
free(co);
}
enum newtFlagsSense sense);
newtComponent newtCheckboxTree(int left, int top, int height, int flags);
+newtComponent newtCheckboxTreeMulti(int left, int top, int height, char *seq, int flags);
void ** newtCheckboxTreeGetSelection(newtComponent co, int *numitems);
+void ** newtCheckboxTreeGetMultiSelection(newtComponent co, int *numitems, char seqnum);
/* last item is NEWT_ARG_LAST for all of these */
int newtCheckboxTreeAddItem(newtComponent co,
const char * text, const void * data,
newtInit();
newtCls();
- checktree = newtCheckboxTree(-1, -1, 10, NEWT_FLAG_SCROLL);
+ checktree = newtCheckboxTreeMulti(-1, -1, 10, " ab", NEWT_FLAG_SCROLL);
newtCheckboxTreeAddItem(checktree, "Numbers", (void *) 2, 0,
NEWT_ARG_APPEND, NEWT_ARG_LAST);
newtCheckboxTreeAddItem(checktree, "Really really long thing",
if (!result || !numselected)
printf("none selected\n");
else
- printf("Current selection:\n");
+ printf("Current selection (all) (%d):\n", numselected);
for (i = 0; i < numselected; i++) {
j = (int) *ptr++;
printf("%d\n", j);
}
+ result = newtCheckboxTreeGetMultiSelection(checktree, &numselected, 'b');
+ ptr = result;
+ if (!result || !numselected)
+ printf("none selected\n");
+ else
+ printf("Current selection (b) (%d):\n",numselected);
+ for (i = 0; i < numselected; i++) {
+ j = (int) *ptr++;
+ printf("%d\n", j);
+ }
+
if (result)
free(result);