
/** \file listbox.h
 *  \brief Header: WListbox widget
 */

#ifndef MC__WIDGET_LISTBOX_H
#define MC__WIDGET_LISTBOX_H

/*** typedefs(not structures) and defined constants **********************************************/

#define LISTBOX(x) ((WListbox *)(x))
#define LENTRY(x) ((WLEntry *)(x))

/*** enums ***************************************************************************************/

/* callback should return one of the following values */
typedef enum
{
    LISTBOX_CONT,               /* continue */
    LISTBOX_DONE                /* finish dialog */
} lcback_ret_t;

typedef enum
{
    LISTBOX_APPEND_AT_END = 0,  /* append at the end */
    LISTBOX_APPEND_BEFORE,      /* insert before current */
    LISTBOX_APPEND_AFTER,       /* insert after current */
    LISTBOX_APPEND_SORTED       /* insert alphabetically */
} listbox_append_t;

/*** structures declarations (and typedefs of structures)*****************************************/

struct WListbox;
typedef lcback_ret_t (*lcback_fn) (struct WListbox * l);

typedef struct WLEntry
{
    char *text;                 /* Text to display */
    int hotkey;
    void *data;                 /* Client information */
    gboolean free_data;         /* Whether to free the data on entry's removal */
} WLEntry;

typedef struct WListbox
{
    Widget widget;
    GQueue *list;               /* Pointer to the list of WLEntry */
    int top;                    /* The first element displayed */
    int current;                /* The current element displayed */
    gboolean allow_duplicates;  /* Do we allow duplicates on the list? */
    gboolean scrollbar;         /* Draw a scrollbar? */
    gboolean deletable;         /* Can list entries be deleted? */
    lcback_fn callback;         /* The callback function */
    int cursor_x, cursor_y;     /* Cache the values */
} WListbox;

/*** global variables defined in .c file *********************************************************/

extern const global_keymap_t *listbox_map;

/*** declarations of public functions ************************************************************/

WListbox *listbox_new (int y, int x, int height, int width, gboolean deletable, lcback_fn callback);
int listbox_search_text (WListbox * l, const char *text);
int listbox_search_data (WListbox * l, const void *data);
void listbox_select_first (WListbox * l);
void listbox_select_last (WListbox * l);
void listbox_set_current (WListbox * l, int dest);
int listbox_get_length (const WListbox * l);
void listbox_get_current (WListbox * l, char **string, void **extra);
WLEntry *listbox_get_nth_entry (const WListbox * l, int pos);
GList *listbox_get_first_link (const WListbox * l);
void listbox_remove_current (WListbox * l);
gboolean listbox_is_empty (const WListbox * l);
void listbox_set_list (WListbox * l, GQueue * list);
void listbox_remove_list (WListbox * l);
char *listbox_add_item (WListbox * l, listbox_append_t pos, int hotkey, const char *text,
                        void *data, gboolean free_data);
char *listbox_add_item_take (WListbox * l, listbox_append_t pos, int hotkey, char *text,
                             void *data, gboolean free_data);

/*** inline functions ****************************************************************************/

#endif /* MC__WIDGET_LISTBOX_H */
