[ctxpopup][access] add outline feature
authorShinwoo Kim <cinoo.kim@samsung.com>
Thu, 2 May 2013 06:01:54 +0000 (15:01 +0900)
committerSungho Kwak <sungho1.kwak@samsung.com>
Mon, 27 May 2013 05:14:41 +0000 (14:14 +0900)
Change-Id: If558ee0c60bd05b42cde2d24bfa7dd66650fba9e

src/lib/elc_ctxpopup.c

index d759c65..9482ba6 100644 (file)
@@ -2,8 +2,12 @@
 #include "elm_priv.h"
 #include "elm_widget_ctxpopup.h"
 
+#define OUTLINE_TEXT "Center popup is opened, double tap to close the popup"
+
 EAPI const char ELM_CTXPOPUP_SMART_NAME[] = "elm_ctxpopup";
 
+static const char ACCESS_OUTLINE_PART[] = "access.outline";
+
 static const char SIG_DISMISSED[] = "dismissed";
 static const char SIG_LANG_CHANGED[] = "language,changed";
 
@@ -25,6 +29,18 @@ _elm_ctxpopup_smart_translate(Evas_Object *obj)
    return EINA_TRUE;
 }
 
+static Evas_Object *
+_access_object_get(const Evas_Object *obj, const char* part)
+{
+   Evas_Object *po, *ao;
+   ELM_CTXPOPUP_DATA_GET(obj, sd);
+
+   po = (Evas_Object *)edje_object_part_object_get(ELM_WIDGET_DATA(sd)->resize_obj, part);
+   ao = evas_object_data_get(po, "_part_access_obj");
+
+   return ao;
+}
+
 static Eina_Bool
 _elm_ctxpopup_smart_focus_next(const Evas_Object *obj,
                                Elm_Focus_Direction dir,
@@ -33,12 +49,19 @@ _elm_ctxpopup_smart_focus_next(const Evas_Object *obj,
    Eina_List *items = NULL;
    Eina_List *elist = NULL;
    Elm_Ctxpopup_Item *it;
+   Evas_Object *ao;
 
    ELM_CTXPOPUP_DATA_GET(obj, sd);
 
    if (!sd)
      return EINA_FALSE;
 
+   if (_elm_config->access_mode)
+     {
+        ao = _access_object_get(obj, ACCESS_OUTLINE_PART);
+        if (ao) items = eina_list_append(items, ao);
+     }
+
    if (eina_list_count(sd->items))
      {
         EINA_LIST_FOREACH(sd->items, elist, it)
@@ -1444,6 +1467,37 @@ _elm_ctxpopup_smart_disable(Evas_Object *obj)
 }
 
 static void
+_access_outline_activate_cb(void *data,
+                        Evas_Object *part_obj __UNUSED__,
+                        Elm_Object_Item *item __UNUSED__)
+{
+   evas_object_hide(data);
+   evas_object_smart_callback_call(data, SIG_DISMISSED, NULL);
+}
+
+static void
+_access_obj_process(Evas_Object *obj, Eina_Bool is_access)
+{
+   Evas_Object *ao;
+   ELM_CTXPOPUP_DATA_GET(obj, sd);
+
+   if (is_access)
+     {
+        ao = _elm_access_edje_object_part_object_register
+               (obj, ELM_WIDGET_DATA(sd)->resize_obj, ACCESS_OUTLINE_PART);
+        _elm_access_text_set(_elm_access_object_get(ao),
+                             ELM_ACCESS_TYPE, E_(OUTLINE_TEXT));
+        _elm_access_activate_callback_set
+          (_elm_access_object_get(ao), _access_outline_activate_cb, obj);
+     }
+   else
+     {
+        _elm_access_edje_object_part_object_unregister
+               (obj, ELM_WIDGET_DATA(sd)->resize_obj, ACCESS_OUTLINE_PART);
+     }
+}
+
+static void
 _elm_ctxpopup_smart_add(Evas_Object *obj)
 {
    EVAS_SMART_DATA_ALLOC(obj, Elm_Ctxpopup_Smart_Data);
@@ -1511,6 +1565,9 @@ _elm_ctxpopup_smart_add(Evas_Object *obj)
    evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE, _on_move, NULL);
 
    elm_widget_can_focus_set(obj, EINA_TRUE);
+
+   /* access */
+   if (_elm_config->access_mode) _access_obj_process(obj, EINA_TRUE);
 }
 
 static void
@@ -1552,6 +1609,8 @@ _elm_ctxpopup_smart_access(Evas_Object *obj, Eina_Bool is_access)
    ELM_CTXPOPUP_CHECK(obj);
    ELM_CTXPOPUP_DATA_GET(obj, sd);
 
+   _access_obj_process(obj, is_access);
+
    EINA_LIST_FOREACH(sd->items, elist, it)
      _access_widget_item_register(it, is_access);
 }