#ifndef _ELM_INTERFACE_ATSPI_ACCESSIBLE_EO_H_
#define _ELM_INTERFACE_ATSPI_ACCESSIBLE_EO_H_

#ifndef _ELM_INTERFACE_ATSPI_ACCESSIBLE_EO_CLASS_TYPE
#define _ELM_INTERFACE_ATSPI_ACCESSIBLE_EO_CLASS_TYPE

typedef Eo Elm_Interface_Atspi_Accessible;

#endif

#ifndef _ELM_INTERFACE_ATSPI_ACCESSIBLE_EO_TYPES
#define _ELM_INTERFACE_ATSPI_ACCESSIBLE_EO_TYPES

/**
 * @brief The accessible Reading information type that can be read.
 *
 * @if MOBILE @since_tizen 4.0 @elseif WEARABLE @since_tizen 3.0 @endif
 *
 * @ingroup Elm_Accessible_Reading_Info
 */
typedef enum
{
  ELM_ACCESSIBLE_READING_INFO_TYPE_NAME = 1 /* 1 << 0 */, /** Name should be
                                                           * read */
  ELM_ACCESSIBLE_READING_INFO_TYPE_ROLE = 2 /* 1 << 1 */, /** Role should be
                                                           * read */
  ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION = 4 /* 1 << 2 */, /** description should be read. */
  ELM_ACCESSIBLE_READING_INFO_TYPE_STATE = 8 /* 1 << 3 */ /** State should be
                                                           * read. */
} Elm_Accessible_Reading_Info_Type;


#endif
#define ELM_INTERFACE_ATSPI_ACCESSIBLE_MIXIN elm_interface_atspi_accessible_mixin_get()

EAPI const Eo_Class *elm_interface_atspi_accessible_mixin_get(void) EINA_CONST;

/**
 * @brief Defines the relationship between two accessible objects.
 *
 * Adds unique relation between source object and relation_object of a given
 * type.
 *
 * Relationships can be queried by Assistive Technology clients to provide
 * customized feedback, improving overall user experience.
 *
 * Relationship_append API is asymmetric, which means that appending, for
 * example, relation ELM_ATSPI_RELATION_FLOWS_TO from object A to B, do NOT
 * append relation ELM_ATSPI_RELATION_FLOWS_FROM from object B to object A.
 *
 * return: EINA_TRUE is relationship was successfully appended, EINA_FALSE
 * otherwise
 *
 * @if MOBILE @since_tizen 2.4 @elseif WEARABLE @since_tizen 3.0 @endif
 *
 * @param[in] obj The object.
 * @param[in] type Relation type between two objects
 * @param[in] relation_object Relation object of source object
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI Eina_Bool  elm_interface_atspi_accessible_relationship_append(Elm_Atspi_Relation_Type type, const Elm_Interface_Atspi_Accessible *relation_object);

/**
 * @brief Removes the relationship between two accessible objects.
 *
 * If relation_object is NULL function removes all relations of given type.
 *
 * @if MOBILE @since_tizen 2.4 @elseif WEARABLE @since_tizen 3.0 @endif
 *
 * @param[in] obj The object.
 * @param[in] type Relation type between two objects
 * @param[in] relation_object Relation object of source object
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI void  elm_interface_atspi_accessible_relationship_remove(Elm_Atspi_Relation_Type type, const Elm_Interface_Atspi_Accessible *relation_object);

/**
 * @brief Gets the translation domain of "name" and "description" properties.
 *
 * @if MOBILE @since_tizen 2.4 @elseif WEARABLE @since_tizen 3.0 @endif
 *
 * @param[in] obj The object.
 *
 * @return translation domain
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI const char * elm_interface_atspi_accessible_translation_domain_get(void);

/**
 * @brief Sets the translation domain of "name" and "description" properties.
 *
 * Translation domain should be set if application wants to support i18n for
 * accessibily "name" and "description" properties.
 *
 * When translation domain is set values of "name" and "description" properties
 * will be translated with dgettext function using current translation domain
 * as "domainname" parameter.
 *
 * It is application developer responsibility to ensure that translation files
 * are loaded and binded to translation domain when accessibility is enabled.
 *
 * @if MOBILE @since_tizen 2.4 @elseif WEARABLE @since_tizen 3.0 @endif
 *
 * @param[in] obj The object.
 * @param[in] domain translation domain
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI void  elm_interface_atspi_accessible_translation_domain_set(const char *domain);

#ifdef ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED
/**
 * @brief Gets an localized string describing accessible object role name.
 *
 * @internal
 *
 * @param[in] obj The object.
 *
 * @return Localized accessible role name
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI const char * elm_interface_atspi_accessible_localized_role_name_get(void);
#endif

/**
 * @brief Sets an accessible name of the object.
 *
 * @if MOBILE @since_tizen 2.4 @elseif WEARABLE @since_tizen 3.0 @endif
 *
 * @param[in] obj The object.
 * @param[in] name Accessible name
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI void  elm_interface_atspi_accessible_name_set(const char *name);

/**
 * @brief Gets an accessible name of the object.
 *
 * @if MOBILE @since_tizen 2.4 @elseif WEARABLE @since_tizen 3.0 @endif
 *
 * @param[in] obj The object.
 *
 * @return Accessible name
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI const char * elm_interface_atspi_accessible_name_get(void);

/**
 * @brief Sets name information callback about widget.
 *
 * @if MOBILE @since_tizen 4.0 @elseif WEARABLE @since_tizen 3.0 @endif
 *
 * @param[in] obj The object.
 * @param[in] name_cb The function called to provide the accessible name
 * @param[in] data The data passed to @c name_cb
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI void  elm_interface_atspi_accessible_name_cb_set(Elm_Atspi_Reading_Info_Cb name_cb, const void *data);

#ifdef ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED
/**
 * @brief Gets an all relations between accessible object and other accessible
 * objects.
 *
 * @internal
 *
 * @param[in] obj The object.
 *
 * @return Accessible relation set
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI Elm_Atspi_Relation_Set  elm_interface_atspi_accessible_relation_set_get(void);
#endif

/**
 * @brief Sets the role of the object in accessibility domain.
 *
 * @if MOBILE @since_tizen 2.4 @elseif WEARABLE @since_tizen 3.0 @endif
 *
 * @param[in] obj The object.
 * @param[in] role Accessible role
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI void  elm_interface_atspi_accessible_role_set(Elm_Atspi_Role role);

/**
 * @brief Gets the role of the object in accessibility domain.
 *
 * @if MOBILE @since_tizen 2.4 @elseif WEARABLE @since_tizen 3.0 @endif
 *
 * @param[in] obj The object.
 *
 * @return Accessible role
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI Elm_Atspi_Role  elm_interface_atspi_accessible_role_get(void);

#ifdef ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED
/**
 * @brief Gets object's accessible children.
 *
 * @internal
 * @param[in] obj The object.
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI Eina_List * elm_interface_atspi_accessible_children_get(void);
#endif

#ifdef ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED
/**
 * @brief Gets human-readable string indentifying widget accessibility role.
 *
 * @internal
 *
 * @param[in] obj The object.
 *
 * @return Accessible role name
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI const char * elm_interface_atspi_accessible_role_name_get(void);
#endif

#ifdef ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED
/**
 * @brief Gets key-value pairs identifying object extra attributes. Must be
 * free by a user.
 *
 * @internal
 *
 * @param[in] obj The object.
 *
 * @return List of object attributes
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI Eina_List * elm_interface_atspi_accessible_attributes_get(void);
#endif

#ifdef ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED
/**
 * @brief Gets reading information of an accessible object.
 *
 * @if MOBILE @since_tizen 4.0 @elseif WEARABLE @since_tizen 3.0 @endif
 *
 * @param[in] obj The object.
 * @param[in] reading_info Reading information types
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI void  elm_interface_atspi_accessible_reading_info_type_set(Elm_Atspi_Reading_Info_Type_Mask reading_info);
#endif

#ifdef ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED
/**
 * @brief Gets reading information types of an accessible object.
 *
 * @if MOBILE @since_tizen 4.0 @elseif WEARABLE @since_tizen 3.0 @endif
 *
 * @param[in] obj The object.
 *
 * @return Reading information types
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI Elm_Atspi_Reading_Info_Type_Mask  elm_interface_atspi_accessible_reading_info_type_get(void);
#endif

#ifdef ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED
/**
 * @brief Gets index of the child in parent's children list.
 *
 * @internal
 *
 * @param[in] obj The object.
 *
 * @return Index in children list
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI int  elm_interface_atspi_accessible_index_in_parent_get(void);
#endif

/**
 * @brief Sets widget contextual information.
 *
 * @if MOBILE @since_tizen 2.4 @elseif WEARABLE @since_tizen 3.0 @endif
 *
 * @param[in] obj The object.
 * @param[in] description Accessible contextual information
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI void  elm_interface_atspi_accessible_description_set(const char *description);

/**
 * @brief Gets contextual information about object.
 *
 * @if MOBILE @since_tizen 2.4 @elseif WEARABLE @since_tizen 3.0 @endif
 *
 * @param[in] obj The object.
 *
 * @return Accessible contextual information
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI const char * elm_interface_atspi_accessible_description_get(void);

/**
 * @brief Sets contextual information callback about widget.
 *
 * @if MOBILE @since_tizen 4.0 @elseif WEARABLE @since_tizen 3.0 @endif
 *
 * @param[in] obj The object.
 * @param[in] description_cb The function called to provide the accessible
 * description
 * @param[in] data The data passed to @c description_cb
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI void  elm_interface_atspi_accessible_description_cb_set(Elm_Atspi_Reading_Info_Cb description_cb, const void *data);

/**
 * @brief Sets gesture callback to give widget.
 *
 * @warning Please do not abuse this API. The purpose of this API is to support
 * special application such as screen-reader guidance. Before using this API,
 * please check if there is another way.
 *
 * @if MOBILE @since_tizen 4.0 @elseif WEARABLE @since_tizen 3.0 @endif
 *
 * @param[in] obj The object.
 * @param[in] gesutre_cb The function called to get gesture information
 * @param[in] data The data passed to @c description_cb
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI void  elm_interface_atspi_accessible_gesture_cb_set(Elm_Atspi_Gesture_Cb gesutre_cb, const void *data);

#ifdef ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED
/**
 * @brief Sets object's accessible parent.
 *
 * @internal
 *
 * @param[in] obj The object.
 * @param[in] parent
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI void  elm_interface_atspi_accessible_parent_set(Elm_Interface_Atspi_Accessible *parent);
#endif

#ifdef ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED
/**
 * @brief Gets object's accessible parent.
 *
 * @internal
 * @param[in] obj The object.
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI Elm_Interface_Atspi_Accessible * elm_interface_atspi_accessible_parent_get(void);
#endif

#ifdef ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED
/**
 * @brief Gets set describing object accessible states.
 *
 * @internal
 * @param[in] obj The object.
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI Elm_Atspi_State_Set  elm_interface_atspi_accessible_state_set_get(void);
#endif

/**
 * @brief Sets highlightable to given widget.
 *
 * @if MOBILE @since_tizen 4.0 @elseif WEARABLE @since_tizen 3.0 @endif
 *
 * @param[in] obj The object.
 * @param[in] can_highlight If @c true, the object is highlightable
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI void  elm_interface_atspi_accessible_can_highlight_set(Eina_Bool can_highlight);

/**
 * @brief Gets highlightable of given widget.
 *
 * @if MOBILE @since_tizen 4.0 @elseif WEARABLE @since_tizen 3.0 @endif
 *
 * @param[in] obj The object.
 *
 * @return If @c true, the object is highlightable
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI Eina_Bool  elm_interface_atspi_accessible_can_highlight_get(void);

/**
 * @brief Add key-value pair identifying widget extra attribute
 *
 * @if MOBILE @since_tizen 4.0 @elseif WEARABLE @since_tizen 3.0 @endif
 *
 * @param[in] obj The object.
 * @param[in] key The string key to give extra information
 * @param[in] value The string value to give extra information
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI void  elm_interface_atspi_accessible_attribute_append(const char *key, const char *value);

/**
 * @brief Removes all attributes in accessible object.
 *
 * @internal
 * @param[in] obj The object.
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI void  elm_interface_atspi_accessible_attributes_clear(void);

#ifdef ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED
/**
 * @brief Handles gesture on given widget.
 *
 * @internal
 *
 * @param[in] obj The object.
 * @param[in] gesture_info
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI Eina_Bool  elm_interface_atspi_accessible_gesture_do(Elm_Atspi_Gesture_Info gesture_info);
#endif

#ifdef ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED
/**
 * @brief Register accessibility event listener
 *
 * @internal
 *
 * @param[in] cb callback
 * @param[in] data data
 *
 * @return Event handler
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI Elm_Atspi_Event_Handler * elm_interface_atspi_accessible_event_handler_add(Eo_Event_Cb cb, void *data);
#endif

#ifdef ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED
/**
 * @brief Deregister accessibility event listener
 *
 * @internal
 *
 * @param[in] handler Event handler
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI void  elm_interface_atspi_accessible_event_handler_del(Elm_Atspi_Event_Handler *handler);
#endif

#ifdef ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED
/**
 * @brief Emit accessibility event which could occur atspi event
 *
 * @internal
 *
 * @param[in] accessible Accessibility object.
 * @param[in] event Accessibility event type.
 * @param[in] event_info Accessibility event details.
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI void  elm_interface_atspi_accessible_event_emit(Elm_Interface_Atspi_Accessible *accessible, const Eo_Event_Description *event, void *event_info);
#endif

/**
 * @brief Removes all relationships in accessible object.
 *
 * @since_tizen 4.0
 * @param[in] obj The object.
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI void  elm_interface_atspi_accessible_relationships_clear(void);

#ifdef ELM_INTERFACE_ATSPI_ACCESSIBLE_PROTECTED
/**
 * @brief Notifies assistive technology clients about current state of the
 * accessibile object.
 *
 * Function limits information broadcast to clients to types specified by
 * state_types_mask parameter.
 *
 * if recursive parameter is set, function will traverse all accessible
 * children and call state_notify function on them.
 *
 * @internal
 *
 * @param[in] obj The object.
 * @param[in] state_types_mask
 * @param[in] recursive
 *
 * @ingroup Elm_Interface_Atspi_Accessible
 */
EOAPI void  elm_interface_atspi_accessible_state_notify(Elm_Atspi_State_Set state_types_mask, Eina_Bool recursive);
#endif

EOAPI extern const Eo_Event_Description _ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_PROPERTY_CHANGED;
EOAPI extern const Eo_Event_Description _ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_CHILDREN_CHANGED;
EOAPI extern const Eo_Event_Description _ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_STATE_CHANGED;
EOAPI extern const Eo_Event_Description _ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_BOUNDS_CHANGED;
EOAPI extern const Eo_Event_Description _ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_VISIBLE_DATA_CHANGED;
EOAPI extern const Eo_Event_Description _ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_ACTIVE_DESCENDANT_CHANGED;
EOAPI extern const Eo_Event_Description _ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_ADDED;
EOAPI extern const Eo_Event_Description _ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_REMOVED;
EOAPI extern const Eo_Event_Description _ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_MOVE_OUTED;

/**
 * No description
 */
#define ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_PROPERTY_CHANGED (&(_ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_PROPERTY_CHANGED))

/**
 * No description
 */
#define ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_CHILDREN_CHANGED (&(_ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_CHILDREN_CHANGED))

/**
 * No description
 */
#define ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_STATE_CHANGED (&(_ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_STATE_CHANGED))

/**
 * No description
 */
#define ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_BOUNDS_CHANGED (&(_ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_BOUNDS_CHANGED))

/**
 * No description
 */
#define ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_VISIBLE_DATA_CHANGED (&(_ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_VISIBLE_DATA_CHANGED))

/**
 * No description
 */
#define ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_ACTIVE_DESCENDANT_CHANGED (&(_ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_ACTIVE_DESCENDANT_CHANGED))

/**
 * No description
 */
#define ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_ADDED (&(_ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_ADDED))

/**
 * No description
 */
#define ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_REMOVED (&(_ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_REMOVED))

/**
 * No description
 */
#define ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_MOVE_OUTED (&(_ELM_INTERFACE_ATSPI_ACCESSIBLE_EVENT_MOVE_OUTED))

#endif
