[datetime][access] enable access feature on datetime with label,diskselector
authorShinwoo Kim <cinoo.kim@samsung.com>
Tue, 14 May 2013 08:27:52 +0000 (17:27 +0900)
committerSungho Kwak <sungho1.kwak@samsung.com>
Mon, 27 May 2013 05:15:54 +0000 (14:15 +0900)
Change-Id: I7ebf5baba1fe7dc8bd1c9e479d8fe0176adbbff3

src/lib/elm_diskselector.c
src/lib/elm_label.c
src/modules/datetime_input_ctxpopup/datetime_input_ctxpopup.c

index a31089c..fcb929d 100644 (file)
@@ -584,6 +584,14 @@ _access_on_highlight_cb(void *data)
    sd->s_iface->region_bring_in(WIDGET(it), x, y, w, h);
 }
 
+static void
+_access_activate_cb(void *data __UNUSED__,
+                    Evas_Object *part_obj __UNUSED__,
+                    Elm_Object_Item *item)
+{
+   _item_click_cb(item, NULL, NULL, NULL);
+}
+
 static Elm_Diskselector_Item *
 _item_new(Evas_Object *obj,
           Evas_Object *icon,
@@ -591,6 +599,7 @@ _item_new(Evas_Object *obj,
           Evas_Smart_Cb func,
           const void *data)
 {
+   Elm_Access_Info *ai;
    Elm_Diskselector_Item *it;
    const char *style = elm_widget_style_get(obj);
 
@@ -624,19 +633,16 @@ _item_new(Evas_Object *obj,
           (VIEW(it), "elm,action,click", "", _item_click_cb, it);
      }
 
-   //XXX: ACCESS
-   if (_elm_config->access_mode == ELM_ACCESS_MODE_ON)
+   /* access */
+   if (_elm_config->access_mode)
      {
         _elm_access_widget_item_register((Elm_Widget_Item *)it);
+        ai = _elm_access_object_get(it->base.access_obj);
 
-        _elm_access_text_set(_elm_access_object_get(it->base.access_obj),
-                             ELM_ACCESS_TYPE, E_("diskselector item"));
-        _elm_access_callback_set(_elm_access_object_get(it->base.access_obj),
-                                 ELM_ACCESS_INFO,
-                                 _access_info_cb, it);
-        _elm_access_on_highlight_hook_set(
-           _elm_access_object_get(it->base.access_obj), _access_on_highlight_cb,
-           it);
+        _elm_access_text_set(ai, ELM_ACCESS_TYPE, E_("diskselector item"));
+        _elm_access_callback_set(ai, ELM_ACCESS_INFO, _access_info_cb, it);
+        _elm_access_on_highlight_hook_set(ai, _access_on_highlight_cb, it);
+        _elm_access_activate_callback_set(ai, _access_activate_cb, it);
      }
 
    return it;
@@ -1390,7 +1396,7 @@ _elm_diskselector_smart_member_add(Evas_Object *obj,
 }
 
 static void
-_access_hook(Evas_Object *obj, Eina_Bool is_access)
+_elm_diskselector_smart_access(Evas_Object *obj, Eina_Bool is_access)
 {
    ELM_DISKSELECTOR_DATA_GET(obj, sd);
 
@@ -1398,6 +1404,8 @@ _access_hook(Evas_Object *obj, Eina_Bool is_access)
      ELM_WIDGET_CLASS(ELM_WIDGET_DATA(sd)->api)->focus_next =  _elm_diskselector_smart_focus_next;
    else
      ELM_WIDGET_CLASS(ELM_WIDGET_DATA(sd)->api)->focus_next = NULL;
+
+   //TODO: register, unregister item
 }
 
 
@@ -1416,11 +1424,11 @@ _elm_diskselector_smart_set_user(Elm_Diskselector_Smart_Class *sc)
    ELM_WIDGET_CLASS(sc)->theme = _elm_diskselector_smart_theme;
    ELM_WIDGET_CLASS(sc)->event = _elm_diskselector_smart_event;
 
-   //XXX: ACCESS
-   if (_elm_config->access_mode == ELM_ACCESS_MODE_ON)
+   /* access */
+   if (_elm_config->access_mode)
      ELM_WIDGET_CLASS(sc)->focus_next = _elm_diskselector_smart_focus_next;
 
-   ELM_WIDGET_CLASS(sc)->access = _access_hook;
+   ELM_WIDGET_CLASS(sc)->access = _elm_diskselector_smart_access;
 }
 
 EAPI const Elm_Diskselector_Smart_Class *
index 6a1abe7..4860f83 100644 (file)
@@ -398,6 +398,24 @@ _elm_label_smart_add(Evas_Object *obj)
    elm_layout_sizing_eval(obj);
 }
 
+static Eina_Bool
+_elm_label_smart_activate(Evas_Object *obj, Elm_Activate act)
+{
+   Elm_Access_Info *ac;
+
+   if (!_elm_config->access_mode) return EINA_FALSE;
+
+   if (act != ELM_ACTIVATE_DEFAULT) return EINA_FALSE;
+
+   ac = _elm_access_object_get(obj);
+   if (!ac) return EINA_FALSE;
+   if (!ac->activate) return EINA_FALSE;
+
+   ac->activate(ac->activate_data, obj, NULL);
+
+   return EINA_TRUE;
+}
+
 static void
 _elm_label_smart_set_user(Elm_Label_Smart_Class *sc)
 {
@@ -406,6 +424,7 @@ _elm_label_smart_set_user(Elm_Label_Smart_Class *sc)
    /* not a 'focus chain manager' */
    ELM_WIDGET_CLASS(sc)->focus_next = NULL;
    ELM_WIDGET_CLASS(sc)->focus_direction = NULL;
+   ELM_WIDGET_CLASS(sc)->activate = _elm_label_smart_activate;
 
    ELM_WIDGET_CLASS(sc)->theme = _elm_label_smart_theme;
    ELM_WIDGET_CLASS(sc)->translate = _elm_label_smart_translate;
index 2de764f..7863dca 100644 (file)
@@ -374,7 +374,50 @@ _field_mouse_up_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event
 }
 
 static void
-_access_set(Evas_Object *obj, Elm_Datetime_Field_Type field_type)
+_access_activate_cb(void *data,
+                    Evas_Object *part_obj,
+                    Elm_Object_Item *item __UNUSED__)
+{
+   Evas_Object *obj;
+   Ctxpopup_Module_Data *ctx_mod;
+   char buf[BUFF_SIZE];
+
+   ctx_mod = (Ctxpopup_Module_Data *)data;
+   if (!ctx_mod) return;
+
+   obj = part_obj;
+
+   if (!ctx_mod->ctxpopup)
+     {
+        ctx_mod->ctxpopup = elm_ctxpopup_add(obj);
+        snprintf(buf, sizeof(buf), "datetime/%s", elm_object_style_get(ctx_mod->mod_data.base));
+        elm_object_style_set(ctx_mod->ctxpopup, buf);
+        elm_ctxpopup_horizontal_set(ctx_mod->ctxpopup, EINA_TRUE);
+        evas_object_size_hint_weight_set(ctx_mod->ctxpopup, EVAS_HINT_EXPAND,
+                                         EVAS_HINT_EXPAND);
+        evas_object_size_hint_align_set(ctx_mod->ctxpopup, EVAS_HINT_FILL, 0.5);
+        elm_ctxpopup_hover_parent_set(ctx_mod->ctxpopup, elm_widget_top_get(obj));
+        evas_object_event_callback_add(ctx_mod->ctxpopup,  EVAS_CALLBACK_HIDE,
+                                       _ctxpopup_hide_cb, ctx_mod);
+     }
+
+   if (evas_object_visible_get(ctx_mod->ctxpopup) && ctx_mod->sel_field != obj)
+     {
+         if (ctx_mod->sel_field)
+           elm_object_signal_emit(ctx_mod->sel_field, "elm,state,unselect", "elm");
+         ctx_mod->sel_field = obj;
+         ctx_mod->ctxpopup_relaunch = 1;
+         evas_object_hide(ctx_mod->ctxpopup);
+     }
+   else if (ctx_mod->sel_field != obj)
+     {
+        ctx_mod->ctxpopup_relaunch = 0;
+        _field_clicked_cb(ctx_mod, obj);
+     }
+}
+
+static void
+_access_set(Evas_Object *obj, Elm_Datetime_Field_Type field_type, Elm_Datetime_Module_Data *module_data)
 {
    const char* type = NULL;
 
@@ -412,6 +455,11 @@ _access_set(Evas_Object *obj, Elm_Datetime_Field_Type field_type)
      (_elm_access_object_get(obj), ELM_ACCESS_TYPE, type);
    _elm_access_callback_set
      (_elm_access_object_get(obj), ELM_ACCESS_STATE, NULL, NULL);
+
+   if ((field_type >= ELM_DATETIME_YEAR) &&
+       (field_type < ELM_DATETIME_AMPM))
+     _elm_access_activate_callback_set
+       (_elm_access_object_get(obj), _access_activate_cb, module_data);
 }
 
 // module fucns for the specific module type
@@ -468,7 +516,7 @@ field_create(Elm_Datetime_Module_Data *module_data, Elm_Datetime_Field_Type  fie
    evas_object_data_set(field_obj, "_field_type", (void *)field_type);
 
    // ACCESS
-   _access_set(field_obj, field_type);
+   _access_set(field_obj, field_type, ctx_mod);
 
    return field_obj;
 }