return NULL;
}
+void newtListboxSelectItem(newtComponent co, int item)
+{
+ struct listbox * li = co->data;
+ int i;
+ struct items *iitem;
+
+ for(i = 0, iitem = li->boxItems; iitem != NULL && i < item;
+ i++, iitem = iitem->next);
+
+ if (iitem) {
+ if(iitem->isSelected)
+ li->numSelected--;
+ else
+ li->numSelected++;
+ iitem->isSelected = !iitem->isSelected;
+ }
+ listboxDraw(co);
+}
+
+void newtListboxClearSelection(newtComponent co)
+{
+ struct items *item;
+ struct listbox * li = co->data;
+
+ for(item = li->boxItems; item != NULL;
+ item = item->next)
+ item->isSelected = 0;
+
+ listboxDraw(co);
+}
+
/* Free the returned array after use, but NOT the values in the array */
-void ** newtListboxGetSelected(newtComponent co)
+void ** newtListboxGetSelection(newtComponent co)
{
struct listbox * li;
int i;
li = co->data;
if(!li || !li->numSelected) return NULL;
- retval = malloc(li->numSelected * sizeof(void *));
+ retval = malloc((li->numSelected + 1) * sizeof(void *));
for(i = 0, item = li->boxItems; item != NULL;
item = item->next)
if(item->isSelected)
retval[i++] = item->data;
+ retval[i] = NULL;
return retval;
}
li->curWidth = strlen(text) ;
item->key = strdup(text); item->data = data; item->next = NULL;
-
+ item->isSelected = 0;
+
if (li->sb)
li->sb->left = co->left + li->curWidth + 2;
co->width = li->curWidth;
li->numItems++;
+ listboxDraw(co);
+
return li->numItems;
}
li->curWidth = strlen(text);
item->key = strdup(text?text:"(null)"); item->data = data;
-
+ item->isSelected = 0;
+
if (li->sb)
li->sb->left = co->left + li->curWidth + 2;
if (li->userHasSetWidth == 0)
co->width = li->curWidth;
li->numItems++;
+
listboxDraw(co);
return li->numItems;
if (!item->key) continue;
newtGotorc(co->top + i, co->left + 1);
- if(j + i == li->currItem)
- SLsmg_set_color(NEWT_COLORSET_ACTLISTBOX);
-
+ if(j + i == li->currItem) {
+ if(item->isSelected)
+ SLsmg_set_color(NEWT_COLORSET_ACTSELLISTBOX);
+ else
+ SLsmg_set_color(NEWT_COLORSET_ACTLISTBOX);
+ } else if(item->isSelected)
+ SLsmg_set_color(NEWT_COLORSET_SELLISTBOX);
+ else
+ SLsmg_set_color(NEWT_COLORSET_LISTBOX);
+
SLsmg_write_nstring(item->key, li->curWidth);
- if(j + i == li->currItem)
- SLsmg_set_color(NEWT_COLORSET_LISTBOX);
}
newtGotorc(co->top + (li->currItem - li->startShowItem), co->left);
}
if (!li->isActive) break;
switch(ev.u.key) {
+ case ' ':
+ if(!(li->flags & NEWT_FLAG_MULTIPLE)) break;
+ newtListboxSelectItem(co, li->currItem);
+ er.result = ER_SWALLOWED;
+ break;
+
case NEWT_KEY_ENTER:
if(li->numItems <= 0) break;
if(li->flags & NEWT_FLAG_RETURNEXIT)
"red", /* scale empty */
"blue", "lightgray", /* disabled entry fg, bg */
"white", "blue", /* compact button fg, bg */
+ "yellow", "red", /* active & sel listbox */
+ "black", "brown" /* selected listbox */
};
static struct keymap keymap[] = {
SLtt_set_color(NEWT_COLORSET_COMPACTBUTTON, "", colors.compactButtonFg,
colors.compactButtonBg);
+
+ SLtt_set_color(NEWT_COLORSET_ACTSELLISTBOX, "", colors.actSelListboxFg,
+ colors.actSelListboxBg);
+ SLtt_set_color(NEWT_COLORSET_SELLISTBOX, "", colors.selListboxFg,
+ colors.selListboxBg);
}
int newtGetKey(void) {
int newtOpenWindow(int left, int top, int width, int height,
char * title) {
- int i, j, row, col;
+ int j, row, col;
int n;
newtFlushInput();
#define NEWT_COLORSET_FULLSCALE 20
#define NEWT_COLORSET_DISENTRY 21
#define NEWT_COLORSET_COMPACTBUTTON 22
+#define NEWT_COLORSET_ACTSELLISTBOX 23
+#define NEWT_COLORSET_SELLISTBOX 24
struct newtColors {
char * rootFg, * rootBg;
char * emptyScale, * fullScale;
char * disabledEntryFg, * disabledEntryBg;
char * compactButtonFg, * compactButtonBg;
+ char * actSelListboxFg, * actSelListboxBg;
+ char * selListboxFg, * selListboxBg;
};
enum newtFlagsSense { NEWT_FLAGS_SET, NEWT_FLAGS_RESET };
int newtListboxInsertEntry(newtComponent co, char * text, void * data, int num);
int newtListboxDeleteEntry(newtComponent co, int num);
void newtListboxGetEntry(newtComponent co, int num, char **text, void **data);
-
+void **newtListboxGetSelection(newtComponent co);
+void newtListboxClearSelection(newtComponent co);
+
newtComponent newtTextbox(int left, int top, int with, int height, int flags);
void newtTextboxSetText(newtComponent co, const char * text);
void newtTextboxSetHeight(newtComponent co, int height);
struct callbackInfo cbis[3];
char results[10];
char * enr2, * enr3, * scaleVal;
+ void ** selectedList;
int i;
char buf[20];
newtFormAddComponents(f, b1, b2, l1, l2, l3, e1, e2, e3, chklist, NULL);
newtFormAddComponents(f, rsf, scale, NULL);
- lb = newtListbox(45, 3, 4, 0);
- newtListboxAddEntry(lb, "First", NULL);
- newtListboxAddEntry(lb, "Second", NULL);
- newtListboxAddEntry(lb, "Third", NULL);
- newtListboxAddEntry(lb, "Fourth", NULL);
- newtListboxAddEntry(lb, "Fifth", NULL);
- newtListboxAddEntry(lb, "Sixth", NULL);
- newtListboxAddEntry(lb, "Seventh", NULL);
- newtListboxAddEntry(lb, "Eighth", NULL);
- newtListboxAddEntry(lb, "Ninth", NULL);
- newtListboxAddEntry(lb, "Tenth", NULL);
+ lb = newtListbox(45, 3, 4, NEWT_FLAG_MULTIPLE);
+ newtListboxAddEntry(lb, "First", "First");
+ newtListboxAddEntry(lb, "Second", "Second");
+ newtListboxAddEntry(lb, "Third", "Third");
+ newtListboxAddEntry(lb, "Fourth", "Fourth");
+ newtListboxAddEntry(lb, "Fifth", "Fifth");
+ newtListboxAddEntry(lb, "Sixth", "Sixth");
+ newtListboxAddEntry(lb, "Seventh", "Seventh");
+ newtListboxAddEntry(lb, "Eighth", "Eighth");
+ newtListboxAddEntry(lb, "Ninth", "Ninth");
+ newtListboxAddEntry(lb, "Tenth", "Tenth");
t = newtTextbox(45, 10, 17, 5, NEWT_FLAG_WRAP);
newtTextboxSetText(t, "This is some text does it look okay?\nThis should be alone.\nThis shouldn't be printed");
enr2 = strdup(enr2);
enr3 = strdup(enr3);
+ selectedList = newtListboxGetSelection(lb);
+
newtFormDestroy(f);
newtPopWindow();
printf("got string 1: %s\n", scaleVal);
printf("got string 2: %s\n", enr2);
printf("got string 3: %s\n", enr3);
+
+ if(selectedList) {
+ printf("\nSelected listbox items:\n");
+ for(i = 0; selectedList[i]; i++)
+ puts(selectedList[i]);
+ }
}