//Tizen only(20160729): attributes_get, append, reading_information set APIs added/updated.
enum Elm.Accessible.Reading.Info.Type
{
   [[The accessible Reading information type that can be read.

     \@if MOBILE \@since_tizen 4.0
     \@elseif WEARABLE \@since_tizen 3.0
     \@endif
   ]]

   name = 1 << 0, [[Name should be read]]
   role = 1 << 1, [[Role should be read]]
   description = 1 << 2, [[description should be read.]]
   state = 1 << 3, [[State should be read.]]
}
//
mixin Elm_Interface_Atspi_Accessible ()
{
   //TIZEN_ONLY(20160329): atspi: mark atspi API as public (b9a544128dfb4d23e06995a233e166b0a166ae86)
   legacy_prefix: elm_atspi_accessible;
   //
   eo_prefix: elm_interface_atspi_accessible;
   data: Elm_Interface_Atspi_Accessible_Data;
   methods {
      @property localized_role_name @protected {
         get {
            [[Gets an localized string describing accessible object role name.

              \@internal
            ]]
         }
         values {
            localized_name: const(char)*; [[Localized accessible role name]]
         }
      }
      @property name {
         get {
            [[Gets an accessible name of the object.

              \@if MOBILE \@since_tizen 2.4
              \@elseif WEARABLE \@since_tizen 3.0
              \@endif
            ]]
         }
         set {
            [[Sets an accessible name of the object.

              \@if MOBILE \@since_tizen 2.4
              \@elseif WEARABLE \@since_tizen 3.0
              \@endif
            ]]
         }
         values {
            name: const(char)*; [[Accessible name]]
         }
      }
      //TIZEN_ONLY(20190922): add name callback, description callback.
      @property name_cb {
         set {
            [[Sets name information callback about widget.

              \@if MOBILE \@since_tizen 4.0
              \@elseif WEARABLE \@since_tizen 3.0
              \@endif
            ]]
         }
         values {
            name_cb: Elm_Atspi_Reading_Info_Cb; [[The function called to provide the accessible name]]
            data: const(void)*; [[The data passed to \@c name_cb]]
         }
      }
      //
      @property relation_set @protected {
         get {
            [[Gets an all relations between accessible object and other accessible objects.

              \@internal
            ]]
         }
         values {
            relations: Elm_Atspi_Relation_Set; [[Accessible relation set]]
         }
      }
      @property role {
         get {
            [[Gets the role of the object in accessibility domain.

              \@if MOBILE \@since_tizen 2.4
              \@elseif WEARABLE \@since_tizen 3.0
              \@endif
            ]]
         }
         set {
            [[Sets the role of the object in accessibility domain.

              \@if MOBILE \@since_tizen 2.4
              \@elseif WEARABLE \@since_tizen 3.0
              \@endif
            ]]
         }
         values {
            role: Elm_Atspi_Role; [[Accessible role]]
         }
      }
      @property children @protected {
         get {
            [[Gets object's accessible children.

              \@internal
            ]]
         }
         values {
            children: free(own(list<Elm_Interface_Atspi_Accessible *> *), eina_list_free);
         }
      }
      @property role_name @protected {
         get {
            [[Gets human-readable string indentifying widget accessibility role.

              \@internal
            ]]
         }
         values {
            role_name: const(char)*; [[Accessible role name]]
         }
      }
      @property attributes @protected {
         get {
            [[Gets key-value pairs identifying object extra attributes. Must be free by a user.

              \@internal
            ]]
         }
         values {
            attributes: free(own(list<own(Elm_Atspi_Attribute *)> *), elm_atspi_attributes_list_free); [[List of object attributes]]
         }
      }
      //TIZEN_ONLY(20160729): attributes_get, append, reading_information set APIs added/updated.
      attribute_append {
         [[Add key-value pair identifying widget extra attribute

           \@if MOBILE \@since_tizen 4.0
           \@elseif WEARABLE \@since_tizen 3.0
           \@endif
         ]]
         params {
            @in key: const(char)*; [[The string key to give extra information]]
            @in value: const(char)*; [[The string value to give extra information]]
         }
      }

      //TIZEN_ONLY(20160926): attributes, endless recursion fix
      attributes_clear {
         [[Removes all attributes in accessible object.

           \@internal
         ]]
      }

      @property reading_info_type @protected {
         get {
            [[Gets reading information types of an accessible object.

              \@if MOBILE \@since_tizen 4.0
              \@elseif WEARABLE \@since_tizen 3.0
              \@endif
            ]]
         }
         set {
            [[Gets reading information of an accessible object.

              \@if MOBILE \@since_tizen 4.0
              \@elseif WEARABLE \@since_tizen 3.0
              \@endif
            ]]
         }
         values {
            reading_info: Elm_Atspi_Reading_Info_Type_Mask; [[Reading information types]]
         }
      }
      //
      @property index_in_parent @protected {
         get {
            [[Gets index of the child in parent's children list.

              \@internal
            ]]
         }
         values {
            idx: int; [[Index in children list]]
         }
      }
      @property description {
         get {
            [[Gets contextual information about object.

              \@if MOBILE \@since_tizen 2.4
              \@elseif WEARABLE \@since_tizen 3.0
              \@endif
            ]]
         }
         set {
            [[Sets widget contextual information.

              \@if MOBILE \@since_tizen 2.4
              \@elseif WEARABLE \@since_tizen 3.0
              \@endif
            ]]
         }
         values {
            description: const(char)*; [[Accessible contextual information]]
         }
      }
      //TIZEN_ONLY(20190922): add name callback, description callback.
      @property description_cb {
         set {
            [[Sets contextual information callback about widget.

              \@if MOBILE \@since_tizen 4.0
              \@elseif WEARABLE \@since_tizen 3.0
              \@endif
            ]]
         }
         values {
            description_cb: Elm_Atspi_Reading_Info_Cb; [[The function called to provide the accessible description]]
            data: const(void)*; [[The data passed to \@c description_cb]]
         }
      }
      //
      //TIZEN_ONLY(20170405) Add gesture method to accessible interface
      @property gesture_cb {
         set {
            [[Sets gesture callback to give widget.

              \@if MOBILE \@since_tizen 4.0
              \@elseif WEARABLE \@since_tizen 3.0
              \@endif
            ]]
         }
         values {
            gesutre_cb: Elm_Atspi_Gesture_Cb; [[The function called to get gesture information]]
            data: const(void)*; [[The data passed to \@c description_cb]]
         }
      }
      gesture_do @protected {
         [[Handles gesture on given widget.

           \@internal
         ]]
         legacy: null;
         params {
            @in gesture_info: Elm_Atspi_Gesture_Info;
         }
         return: bool;
      }
      //
      @property parent @protected {
         get {
            [[Gets object's accessible parent.

              \@internal
            ]]
         }
         set {
            [[Sets object's accessible parent.

              \@internal
            ]]
         }
         values {
            parent: Elm_Interface_Atspi_Accessible *;
         }
      }
      @property state_set @protected {
         get {
            [[Gets set describing object accessible states.

              \@internal
            ]]
         }
         values {
            states: Elm_Atspi_State_Set;
         }
      }
      //TIZEN_ONLY(20160726): add API elm_atspi_accessible_can_highlight_set/get
      @property can_highlight {
         get {
            [[Gets highlightable of given widget.

              \@if MOBILE \@since_tizen 4.0
              \@elseif WEARABLE \@since_tizen 3.0
              \@endif
            ]]
         }
         set {
            [[Sets highlightable to given widget.

              \@if MOBILE \@since_tizen 4.0
              \@elseif WEARABLE \@since_tizen 3.0
              \@endif
            ]]
         }
         values {
            can_highlight: bool; [[If \@c true, the object is highlightable]]
         }
      }
      //
      event_handler_add @class @protected {
         [[Register accessibility event listener

           \@internal
         ]]
         params {
              @in cb: Eo_Event_Cb; [[callback]]
              @in data: void*; [[data]]
         }
         return: Elm_Atspi_Event_Handler*; [[Event handler]]
      }
      event_handler_del @class @protected {
         [[Deregister accessibility event listener

           \@internal
         ]]
         params {
              @in handler: Elm_Atspi_Event_Handler *; [[Event handler]]
         }
      }
      event_emit @class @protected {
         [[Emit accessibility event which could occur atspi event

           \@internal
         ]]
         params {
            @in accessible: Elm_Interface_Atspi_Accessible *; [[Accessibility object.]]
            @in event: const(Eo_Event_Description)*; [[Accessibility event type.]]
            @in event_info: void*; [[Accessibility event details.]]
         }
      }
      @property translation_domain {
         get {
            [[Gets the translation domain of "name" and "description"
              properties.

              \@if MOBILE \@since_tizen 2.4
              \@elseif WEARABLE \@since_tizen 3.0
              \@endif
            ]]
         }
         set {
            [[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
            ]]
         }
         values {
            domain: const(char)*; [[ translation domain ]]
         }
      }
      relationship_append {
         [[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
         ]]
         return: bool;
         params {
            @in type: Elm_Atspi_Relation_Type; [[Relation type between two objects]]
            @in relation_object: const(Elm_Interface_Atspi_Accessible)*; [[Relation object of source object]]
         }
      }
      relationship_remove {
         [[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
         ]]
         params {
            @in type: Elm_Atspi_Relation_Type; [[Relation type between two objects]]
            @in relation_object: const(Elm_Interface_Atspi_Accessible)*; [[Relation object of source object]]
         }
      }
      relationships_clear {
         [[Removes all relationships in accessible object.

           \@internal
         ]]
      }
      //TIZEN_ONLY(20161122): add state_notify api
      state_notify @protected {
           [[ 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
           ]]
           params {
                @in state_types_mask: Elm_Atspi_State_Set;
                @in recursive: bool;
           }
      }
      //
   }
   events {
      property,changed: const(char)*;
      children,changed: Elm_Atspi_Event_Children_Changed_Data;
      state,changed: Elm_Atspi_Event_State_Changed_Data;
      bounds,changed: Elm_Atspi_Event_Geometry_Changed_Data;
      visible,data,changed;
      active,descendant,changed;
      added;
      removed;
      move,outed;
   }
   //TIZEN_ONLY(20150709) : atspi relations api
   implements {
      @virtual .relationship_append;
      @virtual .relationship_remove;
      @virtual .translation_domain.get;
      @virtual .translation_domain.set;
   }
   //////////
}
