#ifndef ROFI_LISTVIEW_H
#define ROFI_LISTVIEW_H

/**
 * @defgroup listview listview
 * @ingroup widget
 *
 * @{
 */

/**
 * Handle to the listview.
 * No internal fields should be accessed directly.
 */
typedef struct _listview   listview;

/**
 * The scrolling type used in the list view
 */
typedef enum
{
    /** Flip through the pages. */
    LISTVIEW_SCROLL_PER_PAGE,
    /** keep selected item centered */
    LISTVIEW_SCROLL_CONTINIOUS
} ScrollType;

/**
 * @param tb The textbox to set
 * @param entry The position of the textbox
 * @param udata User data
 * @param type The textbox font style to apply to this entry (normal, selected, alternative row)
 * @param full If true Set both text and style.
 *
 * Update callback, this is called to set the value of each (visible) element.
 */
typedef void ( *listview_update_callback )( textbox *tb, unsigned int entry, void *udata, TextBoxFontType type, gboolean full );

/**
 * Callback when a element is activated.
 */
typedef void ( *listview_mouse_activated_cb )( listview *, xcb_button_press_event_t *, void * );

/**
 * @param cb The update callback.
 * @param udata The user data to pass to the callback
 * @param eh The height of one element
 *
 * @returns a new listview
 */
listview *listview_create ( listview_update_callback cb, void *udata, unsigned int eh );

/**
 * @param lv The listview handle
 * @param rows Number of elements
 *
 * Set the maximum number of elements to display.
 */
void listview_set_num_elements ( listview *lv, unsigned int rows );

/**
 * @param lv The listview handle
 * @param selected The row index to select
 *
 * Select the row, if selected > the number of rows, it selects the last one.
 */
void listview_set_selected ( listview *lv, unsigned int selected );

/**
 * @param lv The listview handle
 *
 * Returns the selected row.
 *
 * @returns the selected row.
 */
unsigned int listview_get_selected ( listview *lv );

/**
 * @param lv The listview handle
 *
 * Get the desired height of the listview widget.
 *
 * @returns the desired height.
 */
unsigned int listview_get_desired_height ( listview *lv );

/**
 * @param lv The listview handle
 *
 * Move the selection one row up.
 * - Wrap around.
 */
void listview_nav_up ( listview *lv );
/**
 * @param lv listview handle.
 *
 * Move the selection one row down.
 * - Wrap around.
 */
void listview_nav_down ( listview *lv );
/**
 * @param lv The listview handle
 *
 * Move the selection one column to the right.
 * - No wrap around.
 * - Do not move to top row when at start.
 */
void listview_nav_right ( listview *lv );
/**
 * @param lv The listview handle 
 *
 * Move the selection one column to the left.
 * - No wrap around.
 */
void listview_nav_left ( listview *lv );
/**
 * @param lv The listview handle 
 *
 * Move the selection one page down.
 * - No wrap around.
 * - Clip at top/bottom
 */
void listview_nav_page_next ( listview *lv );

/**
 * @param lv The listview handle 
 *
 * Move the selection one page up.
 * - No wrap around.
 * - Clip at top/bottom
 */
void listview_nav_page_prev ( listview *lv );

/**
 * @param lv Handler to the listview object
 * @param padding The padding
 *
 * Padding on between the widgets.
 */
void listview_set_padding (  listview *lv, unsigned int padding );

/**
 * @param lv Handler to the listview object
 * @param lines The maximum number of lines
 *
 * Set the maximum number of lines to show.
 */
void listview_set_max_lines ( listview *lv, unsigned int lines );

/**
 * @param lv Handler to the listview object
 * @param columns The maximum number of columns
 *
 * Set the maximum number of columns to show.
 */
void listview_set_max_columns ( listview *lv, unsigned int columns );

/**
 * @param lv Handler to the listview object
 * @param enabled enable
 *
 * Set fixed num lines mode.
 */
void listview_set_fixed_num_lines ( listview *lv, gboolean enabled );
/**
 * @param lv Handler to the listview object
 * @param enabled enable
 *
 * Hide the scrollbar.
 */
void listview_set_hide_scrollbar ( listview *lv, gboolean enabled );
/**
 * @param lv Handler to the listview object
 * @param width Width in pixels
 *
 * Set the width of the scrollbar
 */
void listview_set_scrollbar_width ( listview *lv, unsigned int width );

/**
 * @param lv Handler to the listview object
 * @param cycle True for cycle mode
 *
 * Set cycle mode. On last entry go to first.
 */
void listview_set_cycle ( listview *lv, gboolean cycle );
/**
 * @param lv Handler to the listview object
 * @param type ScrollType
 *
 * Set the scroll type ScrollType::LISTVIEW_SCROLL_CONTINIOUS or ScrollType::LISTVIEW_SCROLL_PER_PAGE
 */
void listview_set_scroll_type ( listview *lv, ScrollType type );

/**
 * @param lv Handler to the listview object
 * @param cb The callback
 * @param udata User data
 *
 * Set the mouse activated callback.
 */
void listview_set_mouse_activated_cb ( listview *lv, listview_mouse_activated_cb cb, void *udata );
/**
 * @param lv Handler to the listview object
 * @param enable boolean to enable/disable multi-select
 *
 * Enable,disable multi-select.
 */
void listview_set_multi_select ( listview *lv, gboolean enable );
/* @} */

#endif // ROFI_LISTVIEW_H
