#ifndef _ELM_GENLIST_EO_LEGACY_H_
#define _ELM_GENLIST_EO_LEGACY_H_

#ifndef _ELM_GENLIST_EO_CLASS_TYPE
#define _ELM_GENLIST_EO_CLASS_TYPE

typedef Eo Elm_Genlist;

#endif

#ifndef _ELM_GENLIST_EO_TYPES
#define _ELM_GENLIST_EO_TYPES


#endif

/**
 * @brief Enable/disable homogeneous mode.
 *
 * This will enable the homogeneous mode where items are of the same height and
 * width so that genlist may do the lazy-loading at its maximum (which
 * increases the performance for scrolling the list). In the normal mode,
 * genlist will pre-calculate all the items' sizes even though they are not in
 * use. So items' callbacks are called many times than expected. But
 * homogeneous mode will skip the item size pre-calculation  process so items'
 * callbacks are called only when the item is needed.
 *
 * @note This also works well with group index.
 *
 * @param[in] obj The object.
 * @param[in] homogeneous Assume the items within the genlist are of the same
 * height and width. Default is @c false.
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI void elm_genlist_homogeneous_set(Elm_Genlist *obj, Eina_Bool homogeneous);

/**
 * @brief Get whether the homogeneous mode is enabled.
 *
 * @param[in] obj The object.
 *
 * @return Assume the items within the genlist are of the same height and
 * width. Default is @c false.
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI Eina_Bool elm_genlist_homogeneous_get(const Elm_Genlist *obj);

/**
 * @brief Set the genlist select mode.
 *
 * #ELM_OBJECT_SELECT_MODE_DEFAULT means that items will call their selection
 * func and callback once when first becoming selected. Any further clicks will
 * do nothing, unless you set always select mode. ELM_OBJECT_SELECT_MODE_ALWAYS
 * means that even if selected, every click will make the selected callbacks be
 * called. #ELM_OBJECT_SELECT_MODE_NONE will turn off the ability to select
 * items entirely and they will neither appear selected nor call selected
 * callback functions.
 *
 * @param[in] obj The object.
 * @param[in] mode The select mode.
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI void elm_genlist_select_mode_set(Elm_Genlist *obj, Elm_Object_Select_Mode mode);

/**
 * @brief Get the genlist select mode.
 *
 * @param[in] obj The object.
 *
 * @return The select mode.
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI Elm_Object_Select_Mode elm_genlist_select_mode_get(const Elm_Genlist *obj);

/**
 * @brief Set focus upon items selection mode
 *
 * When enabled, every selection of an item inside the genlist will
 * automatically set focus to its first focusable widget from the left. This is
 * true of course if the selection was made by clicking an unfocusable area in
 * an item or selecting it with a key movement. Clicking on a focusable widget
 * inside an item will cause this particular item to get focus as usual.
 *
 * @param[in] obj The object.
 * @param[in] enabled The tree effect status.
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI void elm_genlist_focus_on_selection_set(Elm_Genlist *obj, Eina_Bool enabled);

/**
 * @brief Get whether focus upon item's selection mode is enabled.
 *
 * @param[in] obj The object.
 *
 * @return The tree effect status.
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI Eina_Bool elm_genlist_focus_on_selection_get(const Elm_Genlist *obj);

/**
 * @brief Set the timeout in seconds for the longpress event.
 *
 * This option will change how long it takes to send an event "longpressed"
 * after the mouse down signal is sent to the list. If this event occurs, no
 * "clicked" event will be sent.
 *
 * @warning If you set the longpress timeout value with this API, your genlist
 * will not be affected by the longpress value of elementary config value
 * later.
 *
 * @param[in] obj The object.
 * @param[in] timeout Timeout in seconds. Default is elm config value (1.0).
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI void elm_genlist_longpress_timeout_set(Elm_Genlist *obj, double timeout);

/**
 * @brief Get the timeout in seconds for the longpress event.
 *
 * @param[in] obj The object.
 *
 * @return Timeout in seconds. Default is elm config value (1.0).
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI double elm_genlist_longpress_timeout_get(const Elm_Genlist *obj);

/**
 * @brief Enable or disable multi-selection in the genlist.
 *
 * This enables ($true) or disables ($false) multi-selection in the list. This
 * allows more than 1 item to be selected. To retrieve the list of selected
 * items, use @ref elm_genlist_selected_items_get.
 *
 * @param[in] obj The object.
 * @param[in] multi Multi-select enable/disable. Default is disabled.
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI void elm_genlist_multi_select_set(Elm_Genlist *obj, Eina_Bool multi);

/**
 * @brief Get if multi-selection in genlist is enabled or disabled.
 *
 * @param[in] obj The object.
 *
 * @return Multi-select enable/disable. Default is disabled.
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI Eina_Bool elm_genlist_multi_select_get(const Elm_Genlist *obj);

/**
 * @brief Set reorder mode.
 *
 * After turning on the reorder mode, longpress on normal item will trigger
 * reordering of the item. You can move the item up and down. However, reorder
 * does not work with group item.
 *
 * @param[in] obj The object.
 * @param[in] reorder_mode The reorder mode.
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI void elm_genlist_reorder_mode_set(Elm_Genlist *obj, Eina_Bool reorder_mode);

/**
 * @brief Get the reorder mode.
 *
 * @param[in] obj The object.
 *
 * @return The reorder mode.
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI Eina_Bool elm_genlist_reorder_mode_get(const Elm_Genlist *obj);

/**
 * @brief Set Genlist decorate mode.
 *
 * This sets Genlist decorate mode to all items.
 *
 * @param[in] obj The object.
 * @param[in] decorated The decorate mode status.
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI void elm_genlist_decorate_mode_set(Elm_Genlist *obj, Eina_Bool decorated);

/**
 * @brief Get Genlist decorate mode.
 *
 * @param[in] obj The object.
 *
 * @return The decorate mode status.
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI Eina_Bool elm_genlist_decorate_mode_get(const Elm_Genlist *obj);

/**
 * @brief Set the genlist multi select mode.
 *
 * #ELM_OBJECT_MULTI_SELECT_MODE_DEFAULT means that select/unselect items
 * whenever each item is clicked. #ELM_OBJECT_MULTI_SELECT_MODE_WITH_CONTROL
 * means that only one item will be selected although multi-selection is
 * enabled, if clicked without pressing control key. This mode is only
 * available with multi-selection.
 *
 * @param[in] obj The object.
 * @param[in] mode The multi select mode
 *
 * @since 1.8
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI void elm_genlist_multi_select_mode_set(Elm_Genlist *obj, Elm_Object_Multi_Select_Mode mode);

/**
 * @brief Get the genlist multi select mode.
 *
 * @param[in] obj The object.
 *
 * @return The multi select mode
 *
 * @since 1.8
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI Elm_Object_Multi_Select_Mode elm_genlist_multi_select_mode_get(const Elm_Genlist *obj);

/**
 * @brief Set the maximum number of items within an item block.
 *
 * This will configure the block count to tune to the target with particular
 * performance matrix.
 *
 * A block of objects will be used to reduce the number of operations due to
 * many objects in the screen. It can determine the visibility, or if the
 * object has changed, it theme needs to be updated, etc. doing this kind of
 * calculation to the entire block, instead of per object.
 *
 * The default value for the block count is enough for most lists, so unless
 * you know you will have a lot of objects visible in the screen at the same
 * time, don't try to change this.
 *
 * @param[in] obj The object.
 * @param[in] count Maximum number of items within an item block. Default is
 * 32.
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI void elm_genlist_block_count_set(Elm_Genlist *obj, int count);

/**
 * @brief Get the maximum number of items within an item block.
 *
 * @param[in] obj The object.
 *
 * @return Maximum number of items within an item block. Default is 32.
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI int elm_genlist_block_count_get(const Elm_Genlist *obj);

/**
 * @brief Control genlist tree effect.
 *
 * @param[in] obj The object.
 * @param[in] enabled The tree effect status.
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI void elm_genlist_tree_effect_enabled_set(Elm_Genlist *obj, Eina_Bool enabled);

/**
 * @brief Control genlist tree effect.
 *
 * @param[in] obj The object.
 *
 * @return The tree effect status.
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI Eina_Bool elm_genlist_tree_effect_enabled_get(const Elm_Genlist *obj);

/**
 * @brief Set whether the genlist items should be highlighted on item
 * selection.
 *
 * This will turn on/off the highlight effect on item selection. The selected
 * and clicked callback functions will still be called.
 *
 * Highlight is enabled by default.
 *
 * @param[in] obj The object.
 * @param[in] highlight @c true to enable highlighting or @c false to disable
 * it.
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI void elm_genlist_highlight_mode_set(Elm_Genlist *obj, Eina_Bool highlight);

/**
 * @brief Get whether the genlist items' should be highlighted when item
 * selected.
 *
 * @param[in] obj The object.
 *
 * @return @c true to enable highlighting or @c false to disable it.
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI Eina_Bool elm_genlist_highlight_mode_get(const Elm_Genlist *obj);

/**
 * @brief This sets the horizontal stretching mode.
 *
 * This sets the mode used for sizing items horizontally. Valid modes are
 * @ref ELM_LIST_LIMIT, @ref ELM_LIST_SCROLL, and @ref ELM_LIST_COMPRESS. The
 * default is @ref ELM_LIST_SCROLL. This mode means that if items are too wide
 * to fit, the scroller will scroll horizontally. Otherwise items are expanded
 * to fill the width of the viewport of the scroller. If it is
 * @ref ELM_LIST_LIMIT, items will be expanded to the viewport width and
 * limited to that size. If it is @ref ELM_LIST_COMPRESS, the item width will
 * be fixed (restricted to a minimum of) to the list width when calculating its
 * size in order to allow the height to be calculated based on it. This allows,
 * for instance, text block to wrap lines if the Edje part is configured with
 * "text.min: 0 1".
 *
 * @note @ref ELM_LIST_COMPRESS will make list resize slower as it will have to
 * recalculate every item height again whenever the list width changes!
 *
 * @note Homogeneous mode gives all items in the genlist the same width/height.
 * With @ref ELM_LIST_COMPRESS, genlist items initialize fast, but there cannot
 * be any sub-objects in the genlist which require on-the-fly resizing (such as
 * TEXTBLOCK). In this case some dynamic resizable objects in the genlist might
 * not diplay properly.
 *
 * @param[in] obj The object.
 * @param[in] mode The mode to use (one of @ref ELM_LIST_SCROLL or
 * @ref ELM_LIST_LIMIT).
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI void elm_genlist_mode_set(Elm_Genlist *obj, Elm_List_Mode mode);

/**
 * @brief Get the horizontal stretching mode.
 *
 * @param[in] obj The object.
 *
 * @return The mode to use (one of @ref ELM_LIST_SCROLL or
 * @ref ELM_LIST_LIMIT).
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI Elm_List_Mode elm_genlist_mode_get(const Elm_Genlist *obj);

/**
 * @brief Get active genlist mode item.
 *
 * This function returns the item that was activated with a mode, by the
 * function @ref elm_genlist_decorate_mode_set.
 *
 * @param[in] obj The object.
 *
 * @return The active item for that current mode. Or @c null if no item is
 * activated with any mode.
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI Elm_Widget_Item *elm_genlist_decorated_item_get(const Elm_Genlist *obj);

/**
 * @brief Get the selected item in the genlist.
 *
 * This gets the selected item in the list (if multi-selection is enabled, only
 * the item that was first selected in the list is returned - which is not very
 * useful, so see @ref elm_genlist_selected_items_get for when multi-selection
 * is used).
 *
 * If no item is selected, @c null is returned.
 *
 * @param[in] obj The object.
 *
 * @return The selected item, or @c null if none is selected.
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI Elm_Widget_Item *elm_genlist_selected_item_get(const Elm_Genlist *obj);

/**
 * @brief Get the first item in the genlist.
 *
 * This returns the first item in the list.
 *
 * If filter is set on genlist, it returns the first filtered item in the list.
 *
 * @param[in] obj The object.
 *
 * @return The first item or @c null.
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI Elm_Widget_Item *elm_genlist_first_item_get(const Elm_Genlist *obj);

/**
 * @brief Get a list of realized items in genlist.
 *
 * This returns a list of the realized items in the genlist. The list contains
 * genlist item pointers. The list must be freed by the caller when done with
 * @ref eina_list_free. The item pointers in the list are only valid so long as
 * those items are not deleted or the genlist is not deleted.
 *
 * @param[in] obj The object.
 *
 * @return List of realized items
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI Eina_List *elm_genlist_realized_items_get(const Elm_Genlist *obj) EINA_WARN_UNUSED_RESULT;

/**
 * @brief Get a list of selected items in the genlist.
 *
 * It returns a list of the selected items. This list pointer is only valid so
 * long as the selection doesn't change (no items are selected or unselected,
 * or unselected implicitl by deletion). The list contains genlist items
 * pointers. The order of the items in this list is the order which they were
 * selected, i.e. the first item in this list is the first item that was
 * selected, and so on.
 *
 * @note If not in multi-select mode, consider using function
 * @ref elm_genlist_selected_item_get instead.
 *
 * @param[in] obj The object.
 *
 * @return List of selected items
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI const Eina_List *elm_genlist_selected_items_get(const Elm_Genlist *obj);

/**
 * @brief Get the last item in the genlist
 *
 * This returns the last item in the list.
 *
 * If filter is set to genlist, it returns last filtered item in the list.
 *
 * @param[in] obj The object.
 *
 * @return Last item in list
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI Elm_Widget_Item *elm_genlist_last_item_get(const Elm_Genlist *obj);

/**
 * @brief Insert an item before another in a genlist widget
 *
 * This inserts an item before another in the list. It will be in the same tree
 * level or group as the item it is inserted before.
 *
 * @param[in] obj The object.
 * @param[in] itc The item class for the item.
 * @param[in] data The item data.
 * @param[in] parent The parent item, or @c null if none.
 * @param[in] before_it The item to place this new one before.
 * @param[in] type Item type.
 * @param[in] func Convenience function called when the item is selected.
 * @param[in] func_data Data passed to @c func above.
 *
 * @return Handle to inserted item
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI Elm_Widget_Item *elm_genlist_item_insert_before(Elm_Genlist *obj, const Elm_Genlist_Item_Class *itc, const void *data, Elm_Widget_Item *parent, Elm_Widget_Item *before_it, Elm_Genlist_Item_Type type, Evas_Smart_Cb func, const void *func_data);

/**
 * @brief Update the contents of all realized items.
 *
 * This updates all realized items by calling all the item class functions
 * again to get the contents, texts and states. Use this when the original item
 * data has changed and the changes are desired to be reflected.
 *
 * To update just one item, use @ref elm_genlist_item_update.
 * @param[in] obj The object.
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI void elm_genlist_realized_items_update(Elm_Genlist *obj);

/**
 * @brief Insert an item after another in a genlist widget
 *
 * This inserts an item after another in the list. It will be in the same tree
 * level or group as the item it is inserted after.
 *
 * @param[in] obj The object.
 * @param[in] itc The item class for the item.
 * @param[in] data The item data.
 * @param[in] parent The parent item, or @c null if none.
 * @param[in] after_it The item to place this new one after.
 * @param[in] type Item type.
 * @param[in] func Convenience function called when the item is selected.
 * @param[in] func_data Data passed to @c func above.
 *
 * @return Handle to inserted item
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI Elm_Widget_Item *elm_genlist_item_insert_after(Elm_Genlist *obj, const Elm_Genlist_Item_Class *itc, const void *data, Elm_Widget_Item *parent, Elm_Widget_Item *after_it, Elm_Genlist_Item_Type type, Evas_Smart_Cb func, const void *func_data);

/**
 * @brief Get the item that is at the x, y canvas coords.
 *
 * This returns the item at the given coordinates (which are canvas relative,
 * not object-relative). If an item is at that coordinate, that item handle is
 * returned, and if @c posret is not NULL, the integer pointed to is set to a
 * value of -1, 0 or 1, depending if the coordinate is on the upper portion of
 * that item (-1), on the middle section (0) or on the lower part (1). If NULL
 * is returned as an item (no item found there), then posret may indicate -1 or
 * 1 based if the coordinate is above or below all items respectively in the
 * genlist.
 *
 * @param[in] obj The object.
 * @param[in] x The input x coordinate.
 * @param[in] y The input y coordinate.
 * @param[out] posret The position relative to the item returned here.
 *
 * @return Item at position
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI Elm_Widget_Item *elm_genlist_at_xy_item_get(const Elm_Genlist *obj, int x, int y, int *posret);

/**
 * @brief Set filter mode with key.
 *
 * This initiates the filter mode of genlist with user/application provided
 * key. If key is NULL, the filter mode is turned off.
 *
 * The filter data passed has to be managed by application itself and should
 * not be deleted before genlist is deleted(or while filtering is not done.
 *
 * @param[in] obj The object.
 * @param[in] key Filter key
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI void elm_genlist_filter_set(Elm_Genlist *obj, void *key);

/**
 * @brief Returns an iterator over the list of filtered items.
 *
 * Return NULL if filter is not set. Application must take care of the case
 * while calling the API. Must be freed after use.
 *
 * @param[in] obj The object.
 *
 * @return Iterator on genlist
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI Eina_Iterator *elm_genlist_filter_iterator_new(Elm_Genlist *obj);

/**
 * @brief Return how many items have passed the filter currently.
 *
 * This behaviour is O(1) and returns the count of items which are currently
 * passed by the filter. After "filter,done", the call returns total count of
 * the filtered items.
 *
 * @param[in] obj The object.
 *
 * @return Count of items passing the filter
 *
 * @since 1.18
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI unsigned int elm_genlist_filtered_items_count(const Elm_Genlist *obj);

/**
 * @brief Return how many items are currently in a list.
 *
 * This behavior is O(1) and includes items which may or may not be realized.
 *
 * @param[in] obj The object.
 *
 * @return Item in list
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI unsigned int elm_genlist_items_count(const Elm_Genlist *obj);

/**
 * @brief Prepend a new item in a given genlist widget.
 *
 * This adds an item to the beginning of the list or beginning of the children
 * of the parent if given.
 *
 * @param[in] obj The object.
 * @param[in] itc The item class for the item.
 * @param[in] data The item data.
 * @param[in] parent The parent item, or @c null if none.
 * @param[in] type Item type.
 * @param[in] func Convenience function called when the item is selected.
 * @param[in] func_data Data passed to @c func above.
 *
 * @return Handle to prepended item
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI Elm_Widget_Item *elm_genlist_item_prepend(Elm_Genlist *obj, const Elm_Genlist_Item_Class *itc, const void *data, Elm_Widget_Item *parent, Elm_Genlist_Item_Type type, Evas_Smart_Cb func, const void *func_data);

/**
 * @brief Remove all items from a given genlist widget.
 *
 * This removes (and deletes) all items in @c obj, leaving it empty.
 * @param[in] obj The object.
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI void elm_genlist_clear(Elm_Genlist *obj);

/**
 * @brief Append a new item in a given genlist widget.
 *
 * This adds the given item to the end of the list or the end of the children
 * list if the @c parent is given.
 *
 * @param[in] obj The object.
 * @param[in] itc The item class for the item.
 * @param[in] data The item data.
 * @param[in] parent The parent item, or @c null if none.
 * @param[in] type Item type.
 * @param[in] func Convenience function called when the item is selected.
 * @param[in] func_data Data passed to @c func above.
 *
 * @return Handle to appended item
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI Elm_Widget_Item *elm_genlist_item_append(Elm_Genlist *obj, const Elm_Genlist_Item_Class *itc, const void *data, Elm_Widget_Item *parent, Elm_Genlist_Item_Type type, Evas_Smart_Cb func, const void *func_data);

/**
 * @brief Insert a new item into the sorted genlist object
 *
 * This inserts an item in the genlist based on user defined comparison
 * function. The two arguments passed to the function @c func are genlist item
 * handles to compare.
 *
 * @param[in] obj The object.
 * @param[in] itc The item class for the item.
 * @param[in] data The item data.
 * @param[in] parent The parent item, or @c null if none.
 * @param[in] type Item type.
 * @param[in] comp The function called for the sort.
 * @param[in] func Convenience function called when the item is selected.
 * @param[in] func_data Data passed to @c func above.
 *
 * @return Handle to inserted item
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI Elm_Widget_Item *elm_genlist_item_sorted_insert(Elm_Genlist *obj, const Elm_Genlist_Item_Class *itc, const void *data, Elm_Widget_Item *parent, Elm_Genlist_Item_Type type, Eina_Compare_Cb comp, Evas_Smart_Cb func, const void *func_data);

/**
 * @brief Get genlist item by given string.
 *
 * It takes pointer to the genlist item that will be used to start search from
 * it.
 *
 * This function uses globs (like "*.jpg") for searching and takes search flags
 * as last parameter That is a bitfield with values to be ored together or 0
 * for no flags.
 *
 * @param[in] obj The object.
 * @param[in] item_to_search_from Pointer to item to start search from. If
 * @c null, search will be started from the first item of the genlist.
 * @param[in] part_name Name of the TEXT part of genlist item to search string
 * in.
 * @param[in] pattern The search pattern.
 * @param[in] flags Search flags.
 *
 * @return Searched item
 *
 * @since 1.11
 *
 * @ingroup Elm_Genlist_Group
 */
EAPI Elm_Widget_Item *elm_genlist_search_by_text_item_get(Elm_Genlist *obj, Elm_Widget_Item *item_to_search_from, const char *part_name, const char *pattern, Elm_Glob_Match_Flags flags);

#endif
