Update access object deleting code
[apps/native/widget/widget-edje.git] / src / script_port.c
index a3f857a..bbacbd3 100644 (file)
@@ -223,6 +223,20 @@ static void activate_cb(void *data, Evas_Object *part_obj, Elm_Object_Item *item
        evas_event_feed_mouse_up(e, 1, EVAS_BUTTON_NONE, (timestamp + 0.03f) * 1000, NULL);
 }
 
+static void access_del_cb(void *_info, Evas *e, Evas_Object *ao, void *event_info)
+{
+       struct info *handle = _info;
+       Evas_Object *edje_part;
+       Evas_Object *edje;
+
+       edje_part = evas_object_data_del(ao, "edje,part");
+       edje = evas_object_data_del(ao, "edje");
+       (void)evas_object_data_del(edje_part, "ao");
+
+       handle->access_chain = eina_list_remove(handle->access_chain, edje_part);
+       DbgPrint("AO(%p) is removed from local access chain\n", ao);
+}
+
 PUBLIC int script_update_text(void *h, Evas *e, const char *id, const char *part, const char *text)
 {
        struct obj_info *obj_info;
@@ -253,24 +267,32 @@ PUBLIC int script_update_text(void *h, Evas *e, const char *id, const char *part
                if (!ao) {
                        ao = elm_access_object_register(edje_part, handle->parent);
                        if (!ao) {
-                               ErrPrint("Unable to add ao: %s\n", part);
+                               ErrPrint("Unable to register an access object(%s)\n", part);
                                goto out;
                        }
                        handle->access_chain = eina_list_append(handle->access_chain, edje_part);
-                       (void)evas_object_data_set(edje_part, "ao", ao);
-                       (void)evas_object_data_set(ao, "edje", edje);
+                       evas_object_data_set(edje_part, "ao", ao);
+                       evas_object_data_set(ao, "edje", edje);
+                       evas_object_data_set(ao, "edje,part", edje_part);
                        elm_access_activate_cb_set(ao, activate_cb, NULL);
                        elm_object_focus_custom_chain_append(handle->parent, ao, NULL);
+                       evas_object_event_callback_add(ao, EVAS_CALLBACK_DEL, access_del_cb, handle);
 
                        DbgPrint("[%s] Register access info: (%s) to, %p\n", part, text, handle->parent);
                }
 
                if (!text || !strlen(text)) {
+                       /*
                        handle->access_chain = eina_list_remove(handle->access_chain, edje_part);
                        (void)evas_object_data_del(edje_part, "ao");
                        (void)evas_object_data_del(ao, "edje");
+                       */
+                       /*!
+                        * \note
+                        * Delete callback will be called
+                        */
+                       DbgPrint("[%s] Remove access object(%p)\n", part, ao);
                        elm_access_object_unregister(ao);
-                       DbgPrint("[%s] Remove access object\n", part);
 
                        goto out;
                }
@@ -279,11 +301,17 @@ PUBLIC int script_update_text(void *h, Evas *e, const char *id, const char *part
                if ((!utf8 || !strlen(utf8))) {
                        free(utf8);
 
+                       /*
                        handle->access_chain = eina_list_remove(handle->access_chain, edje_part);
                        (void)evas_object_data_del(edje_part, "ao");
                        (void)evas_object_data_del(ao, "edje");
+                       */
+                       /*!
+                        * \note
+                        * Delete callback will be called
+                        */
+                       DbgPrint("[%s] Remove access object(%p)\n", part, ao);
                        elm_access_object_unregister(ao);
-                       DbgPrint("[%s] Remove access object\n", part);
 
                        goto out;
                }
@@ -550,23 +578,31 @@ PUBLIC int script_update_access(void *_h, Evas *e, const char *id, const char *p
                                elm_access_info_set(ao, ELM_ACCESS_INFO, text);
                                DbgPrint("Access info is updated: [%s]\n", text);
                        } else {
+                               /*
                                handle->access_chain = eina_list_remove(handle->access_chain, edje_part);
                                (void)evas_object_data_del(edje_part, "ao");
                                (void)evas_object_data_del(ao, "edje");
+                               */
+                               /*!
+                                * \note
+                                * Delete clalback will be called
+                                */
+                               DbgPrint("[%s] Remove access object(%p)\n", part, ao);
                                elm_access_object_unregister(ao);
-                               DbgPrint("Successfully unregistered\n");
                        }
                } else if (text && strlen(text)) {
                        ao = elm_access_object_register(edje_part, handle->parent);
                        if (!ao) {
-                               ErrPrint("Unable to register an access object\n");
+                               ErrPrint("Unable to register an access object(%s)\n", part);
                        } else {
                                elm_access_info_set(ao, ELM_ACCESS_INFO, text);
                                handle->access_chain = eina_list_append(handle->access_chain, edje_part);
                                evas_object_data_set(edje_part, "ao", ao);
                                evas_object_data_set(ao, "edje", edje);
+                               evas_object_data_set(ao, "edje,part", edje_part);
                                elm_object_focus_custom_chain_append(handle->parent, ao, NULL);
                                elm_access_activate_cb_set(ao, activate_cb, NULL);
+                               evas_object_event_callback_add(ao, EVAS_CALLBACK_DEL, access_del_cb, handle);
                                DbgPrint("[%s] Register access info: (%s) to, %p\n", part, text, handle->parent);
                        }
                }
@@ -1084,9 +1120,15 @@ static void edje_del_cb(void *_info, Evas *e, Evas_Object *obj, void *event_info
                }
 
                if (edje == obj) {
+                       /*!
                        handle->access_chain = eina_list_remove(handle->access_chain, edje_part);
                        (void)evas_object_data_del(edje_part, "ao");
                        (void)evas_object_data_del(ao, "edje");
+                       */
+                       /*!
+                        * Delete callback will be called
+                        */
+                       DbgPrint("Remove access object(%p)\n", ao);
                        elm_access_object_unregister(ao);
                }
        }