static newtComponent nmt_newt_listbox_build_component (NmtNewtComponent *component, gboolean sensitive) { NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE (component); newtComponent co; int i, active; if (priv->active == -1) update_active_internal (NMT_NEWT_LISTBOX (component), 0); active = priv->active; co = newtListbox (-1, -1, priv->height, convert_flags (priv->flags)); newtComponentAddCallback (co, selection_changed_callback, component); for (i = 0; i < priv->entries->len; i++) { newtListboxAppendEntry (co, priv->entries->pdata[i], GUINT_TO_POINTER (i)); if (active == -1 && priv->keys->pdata[i] == priv->active_key) active = i; } if (active != -1) newtListboxSetCurrent (co, active); return co; }
void newtListboxSetCurrentByKey(newtComponent co, void * key) { struct listbox * li = co->data; struct items * item; int i; item = li->boxItems, i = 0; while (item && item->data != key) item = item->next, i++; if (item) newtListboxSetCurrent(co, i); }
static void selection_changed_callback (newtComponent co, void *user_data) { NmtNewtListbox *listbox = user_data; NmtNewtListboxPrivate *priv = NMT_NEWT_LISTBOX_GET_PRIVATE (listbox); int new_active; new_active = GPOINTER_TO_UINT (newtListboxGetCurrent (co)); update_active_internal (listbox, new_active); if (priv->active != new_active) newtListboxSetCurrent (co, priv->active); }
// selects the current string in the listbox static void set_lb_cursor(newtComponent lb, char *key) { int cnt, i; fde *sela; cnt=newtListboxItemCount(lb); for(i=0; i < cnt; i++) { newtListboxGetEntry(lb, i, NULL, (void**)&sela); if(strcmp(sela->name,key) == 0) { newtListboxSetCurrent(lb , i); break; } } }
static struct eventResult listboxEvent(newtComponent co, struct event ev) { struct eventResult er; struct listbox * li = co->data; struct items *item; int i; er.result = ER_IGNORED; if(ev.when == EV_EARLY || ev.when == EV_LATE) { return er; } switch(ev.event) { case EV_KEYPRESS: if (!li->isActive) break; switch(ev.u.key) { case ' ': if(!(li->flags & NEWT_FLAG_MULTIPLE)) break; newtListboxSelectItem(co, newtListboxGetCurrent(co), NEWT_FLAGS_TOGGLE); er.result = ER_SWALLOWED; /* We don't break here, because it is cool to be able to hold space to select a bunch of items in a list at once */ case NEWT_KEY_DOWN: if(li->numItems <= 0) break; if(li->currItem < li->numItems - 1) { li->currItem++; if(li->currItem > (li->startShowItem + li->curHeight - 1)) { li->startShowItem = li->currItem - li->curHeight + 1; if(li->startShowItem + li->curHeight > li->numItems) li->startShowItem = li->numItems - li->curHeight; } if(li->sb) newtScrollbarSet(li->sb, li->currItem + 1, li->numItems); listboxDraw(co); } if(co->callback) co->callback(co, co->callbackData); er.result = ER_SWALLOWED; break; case NEWT_KEY_ENTER: 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) li->startShowItem = li->currItem; if(li->sb) newtScrollbarSet(li->sb, li->currItem + 1, li->numItems); listboxDraw(co); } if(co->callback) co->callback(co, co->callbackData); er.result = ER_SWALLOWED; break; case NEWT_KEY_PGUP: if(li->numItems <= 0) break; li->startShowItem -= li->curHeight - 1; if(li->startShowItem < 0) li->startShowItem = 0; li->currItem -= li->curHeight - 1; if(li->currItem < 0) li->currItem = 0; newtListboxRealSetCurrent(co); er.result = ER_SWALLOWED; break; case NEWT_KEY_PGDN: if(li->numItems <= 0) break; li->startShowItem += li->curHeight; if(li->startShowItem > (li->numItems - li->curHeight)) { li->startShowItem = li->numItems - li->curHeight; } li->currItem += li->curHeight; 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->startShowItem = li->numItems - li->curHeight; if(li->startShowItem < 0) li->startShowItem = 0; li->currItem = li->numItems - 1; newtListboxRealSetCurrent(co); er.result = ER_SWALLOWED; break; default: if (li->numItems <= 0) break; if (ev.u.key < NEWT_KEY_EXTRA_BASE && isalpha(ev.u.key)) { for(i = 0, item = li->boxItems; item != NULL && i < li->currItem; i++, item = item->next); if (item && item->text && (toupper(*item->text) == toupper(ev.u.key))) { item = item->next; i++; } else { item = li->boxItems; i = 0; } while (item && item->text && toupper(*item->text) != toupper(ev.u.key)) { item = item->next; i++; } if (item) { li->currItem = i; if(li->currItem < li->startShowItem || li->currItem > li->startShowItem) li->startShowItem = li->currItem > li->numItems - li->curHeight ? li->startShowItem = li->numItems - li->curHeight : li->currItem; if(li->sb) newtScrollbarSet(li->sb, li->currItem + 1, li->numItems); newtListboxRealSetCurrent(co); er.result = ER_SWALLOWED; } } } break; case EV_FOCUS: li->isActive = 1; listboxDraw(co); if(li->flags & NEWT_FLAG_SHOWCURSOR) newtCursorOn(); er.result = ER_SWALLOWED; break; case EV_UNFOCUS: li->isActive = 0; listboxDraw(co); if(li->flags & NEWT_FLAG_SHOWCURSOR) newtCursorOff(); er.result = ER_SWALLOWED; break; case EV_MOUSE: /* if this mouse click was within the listbox, make the current item the item clicked on. */ /* Up scroll arrow */ if (li->sb && ev.u.mouse.x == co->left + co->width - li->bdxAdjust - 1 && ev.u.mouse.y == co->top + li->bdyAdjust) { if(li->numItems <= 0) break; if(li->currItem > 0) { li->currItem--; if(li->currItem < li->startShowItem) li->startShowItem = li->currItem; if(li->sb) newtScrollbarSet(li->sb, li->currItem + 1, li->numItems); listboxDraw(co); } if(co->callback) co->callback(co, co->callbackData); er.result = ER_SWALLOWED; break; } /* Down scroll arrow */ if (li->sb && ev.u.mouse.x == co->left + co->width - li->bdxAdjust - 1 && ev.u.mouse.y == co->top + co->height - li->bdyAdjust - 1) { if(li->numItems <= 0) break; if(li->currItem < li->numItems - 1) { li->currItem++; if(li->currItem > (li->startShowItem + li->curHeight - 1)) { li->startShowItem = li->currItem - li->curHeight + 1; if(li->startShowItem + li->curHeight > li->numItems) li->startShowItem = li->numItems - li->curHeight; } if(li->sb) newtScrollbarSet(li->sb, li->currItem + 1, li->numItems); listboxDraw(co); } if(co->callback) co->callback(co, co->callbackData); er.result = ER_SWALLOWED; break; } if ((ev.u.mouse.y >= co->top + li->bdyAdjust) && (ev.u.mouse.y <= co->top + co->height - (li->bdyAdjust * 2)) && (ev.u.mouse.x >= co->left + li->bdxAdjust) && (ev.u.mouse.x <= co->left + co->width + (li->bdxAdjust * 2))) { li->currItem = li->startShowItem + (ev.u.mouse.y - li->bdyAdjust - co->top); newtListboxRealSetCurrent(co); listboxDraw(co); if(co->callback) co->callback(co, co->callbackData); er.result = ER_SWALLOWED; break; } } return er; }