static void listboxDraw(newtComponent co);
static void listboxDestroy(newtComponent co);
static struct eventResult listboxEvent(newtComponent co, struct event ev);
+static void newtListboxRealSetCurrent(newtComponent co);
static struct componentOps listboxOps = {
listboxDraw,
return co;
}
-void newtListboxSetCurrent(newtComponent co, int num) {
+void newtListboxSetCurrent(newtComponent co, int num)
+{
struct listbox * li = co->data;
if (num >= li->numItems)
li->currItem = li->numItems - 1;
li->startShowItem = li->numItems - co->height;
if(li->startShowItem < 0)
li->startShowItem = 0;
+ newtListboxRealSetCurrent(co);
+}
+
+static void
+newtListboxRealSetCurrent(newtComponent co)
+{
+ struct listbox * li = co->data;
if(li->sb)
newtScrollbarSet(li->sb, li->currItem + 1, li->numItems);
listboxDraw(co);
if(co->callback) co->callback(co, co->callbackData);
}
-
void newtListboxSetWidth(newtComponent co , int width) {
struct listbox * li = co->data;
switch(ev.u.key) {
case NEWT_KEY_ENTER:
- if(li-> flags & NEWT_FLAG_RETURNEXIT)
+ if(li->numItems <= 0) break;
+ if(li->flags & NEWT_FLAG_RETURNEXIT)
er.result = ER_EXITFORM;
break;
case NEWT_KEY_UP:
+ if(li->numItems <= 0) break;
if(li->currItem > 0) {
li->currItem--;
if(li->currItem < li->startShowItem)
break;
case NEWT_KEY_DOWN:
+ if(li->numItems <= 0) break;
if(li->currItem < li->numItems - 1) {
li->currItem++;
if(li->currItem > (li->startShowItem + co->height - 1)) {
break;
case NEWT_KEY_PGUP:
- newtListboxSetCurrent(co, li->currItem - co->height + 1);
+ if(li->numItems <= 0) break;
+ li->startShowItem -= co->height - 1;
+ if(li->startShowItem < 0)
+ li->startShowItem = 0;
+ li->currItem -= co->height - 1;
+ if(li->currItem < 0)
+ li->currItem = 0;
+ newtListboxRealSetCurrent(co);
er.result = ER_SWALLOWED;
break;
case NEWT_KEY_PGDN:
- newtListboxSetCurrent(co, li->currItem + co->height - 1);
+ if(li->numItems <= 0) break;
+ li->startShowItem += co->height;
+ if(li->startShowItem > (li->numItems - co->height)) {
+ li->startShowItem = li->numItems - co->height;
+ }
+ li->currItem += co->height;
+ if(li->currItem > li->numItems) {
+ li->currItem = li->numItems - 1;
+ }
+ newtListboxRealSetCurrent(co);
er.result = ER_SWALLOWED;
break;
case NEWT_KEY_HOME:
+ if(li->numItems <= 0) break;
newtListboxSetCurrent(co, 0);
er.result = ER_SWALLOWED;
break;
case NEWT_KEY_END:
+ if(li->numItems <= 0) break;
+ li->currItem = li->numItems - 1;
+ li->startShowItem = li->numItems - co->height - 1;
+ newtListboxRealSetCurrent(co);
newtListboxSetCurrent(co, li->numItems - 1);
er.result = ER_SWALLOWED;
break;