static cb_ret_t listbox_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data) { WListbox *l = LISTBOX (w); cb_ret_t ret_code; switch (msg) { case MSG_INIT: return MSG_HANDLED; case MSG_HOTKEY: { int pos; pos = listbox_check_hotkey (l, parm); if (pos < 0) return MSG_NOT_HANDLED; listbox_run_hotkey (l, pos); return MSG_HANDLED; } case MSG_KEY: ret_code = listbox_key (l, parm); if (ret_code != MSG_NOT_HANDLED) listbox_on_change (l); return ret_code; case MSG_ACTION: return listbox_execute_cmd (l, parm); case MSG_CURSOR: widget_move (l, l->cursor_y, 0); return MSG_HANDLED; case MSG_FOCUS: case MSG_UNFOCUS: l->focused = msg == MSG_FOCUS; /* fall through */ case MSG_DRAW: listbox_draw (l, l->focused); return MSG_HANDLED; case MSG_DESTROY: listbox_destroy (l); return MSG_HANDLED; case MSG_RESIZE: return MSG_HANDLED; default: return widget_default_callback (w, sender, msg, parm, data); } }
static int listbox_event (Gpm_Event * event, void *data) { WListbox *l = LISTBOX (data); Widget *w = WIDGET (data); if (!mouse_global_in_widget (event, w)) return MOU_UNHANDLED; /* Single click */ if ((event->type & GPM_DOWN) != 0) dlg_select_widget (l); if (listbox_is_empty (l)) return MOU_NORMAL; if ((event->type & (GPM_DOWN | GPM_DRAG)) != 0) { int ret = MOU_REPEAT; Gpm_Event local; int i; local = mouse_get_local (event, w); if (local.y < 1) for (i = -local.y; i >= 0; i--) listbox_back (l); else if (local.y > w->lines) for (i = local.y - w->lines; i > 0; i--) listbox_fwd (l); else if ((local.buttons & GPM_B_UP) != 0) { listbox_back (l); ret = MOU_NORMAL; } else if ((local.buttons & GPM_B_DOWN) != 0) { listbox_fwd (l); ret = MOU_NORMAL; } else listbox_select_entry (l, listbox_select_pos (l, l->top, local.y - 1)); /* We need to refresh ourselves since the dialog manager doesn't */ /* know about this event */ listbox_draw (l, TRUE); return ret; } /* Double click */ if ((event->type & (GPM_DOUBLE | GPM_UP)) == (GPM_UP | GPM_DOUBLE)) { Gpm_Event local; int action; local = mouse_get_local (event, w); dlg_select_widget (l); listbox_select_entry (l, listbox_select_pos (l, l->top, local.y - 1)); if (l->callback != NULL) action = l->callback (l); else action = LISTBOX_DONE; if (action == LISTBOX_DONE) { w->owner->ret_value = B_ENTER; dlg_stop (w->owner); } } return MOU_NORMAL; }
static cb_ret_t listbox_callback (Widget * w, Widget * sender, widget_msg_t msg, int parm, void *data) { WListbox *l = LISTBOX (w); WDialog *h = w->owner; cb_ret_t ret_code; switch (msg) { case MSG_INIT: return MSG_HANDLED; case MSG_HOTKEY: { int pos, action; pos = listbox_check_hotkey (l, parm); if (pos < 0) return MSG_NOT_HANDLED; listbox_select_entry (l, pos); send_message (h, w, MSG_ACTION, l->pos, NULL); if (l->callback != NULL) action = l->callback (l); else action = LISTBOX_DONE; if (action == LISTBOX_DONE) { h->ret_value = B_ENTER; dlg_stop (h); } return MSG_HANDLED; } case MSG_KEY: ret_code = listbox_key (l, parm); if (ret_code != MSG_NOT_HANDLED) { listbox_draw (l, TRUE); send_message (h, w, MSG_ACTION, l->pos, NULL); } return ret_code; case MSG_ACTION: return listbox_execute_cmd (l, parm); case MSG_CURSOR: widget_move (l, l->cursor_y, 0); send_message (h, w, MSG_ACTION, l->pos, NULL); return MSG_HANDLED; case MSG_FOCUS: case MSG_UNFOCUS: case MSG_DRAW: listbox_draw (l, msg != MSG_UNFOCUS); return MSG_HANDLED; case MSG_DESTROY: listbox_destroy (l); return MSG_HANDLED; case MSG_RESIZE: return MSG_HANDLED; default: return widget_default_callback (w, sender, msg, parm, data); } }
/* Call this whenever the user changes the selected item. */ static void listbox_on_change (WListbox * l) { listbox_draw (l, TRUE); send_message (WIDGET (l)->owner, l, MSG_NOTIFY, l->pos, NULL); }
/*! Callback to draws the listbox \return None \author jfpatry \date Created: 2000-09-17 \date Modified: 2000-09-17 */ static void listbox_draw_cb( void *widget ) { check_assertion( widget != NULL, "widget is NULL" ); listbox_draw( (listbox_t*) widget ); }