[spinner] Activate rotary events on spinner and add circle_spinner over datetime
authorPrasoon Singh <prasoon.16@samsung.com>
Wed, 26 Dec 2018 14:55:17 +0000 (20:25 +0530)
committerJongmin Lee <jm105.lee@samsung.com>
Mon, 30 Dec 2019 00:21:50 +0000 (09:21 +0900)
Change-Id: I9d6f1c35e3d73038af6ae1e41ec994a1a8f39c78
Signed-off-by: Prasoon Singh <prasoon.16@samsung.com>
Signed-off-by: Anuj Asher <anuj.asher@samsung.com>
Signed-off-by: Godly T.Alias <godlytalias@yahoo.co.in>
Signed-off-by: Shilpa Singh <shilpa.singh@samsung.com>
inc/wearable/circle/efl_extension_circle_private.h
src/wearable/circle/efl_extension_circle_object_datetime.c
src/wearable/circle/efl_extension_circle_object_genlist.c
src/wearable/circle/efl_extension_circle_object_spinner.c

index 7a043ac1b2c1a9eab14c9dbe50736eb172f7ab8d..c07ac55512281f6af7595e54b0f6f8df3a01f3a0 100644 (file)
@@ -160,13 +160,7 @@ struct _Eext_Circle_Object_Item {
 typedef struct _Eext_Circle_Object_Datetime_Data Eext_Circle_Object_Datetime_Data;
 struct _Eext_Circle_Object_Datetime_Data {
    Elm_Datetime_Field_Type current_type;
-   double min;
-   double max;
-   double rotary_angle;
-   double type_current_angle;
-   Ecore_Timer *rotary_timer;
-
-   Eina_Bool circle_changed : 1;
+   Eina_Bool activated;
 };
 
 /* Progressbar widget data */
@@ -209,6 +203,7 @@ typedef struct _Eext_Circle_Object_Genlist_Data Eext_Circle_Object_Genlist_Data;
 struct _Eext_Circle_Object_Genlist_Data {
    Ecore_Timer *bar_hide_timer;
    Elm_Scroller_Policy policy_h, policy_v;
+   int dest_y;
 
    Eext_Circle_Color color;
    Eext_Circle_Color bg_color;
@@ -280,13 +275,8 @@ struct _Eext_Circle_Object_Scroller_Data {
 /* Spinner widget data */
 typedef struct _Eext_Circle_Object_Spinner_Data Eext_Circle_Object_Spinner_Data;
 struct _Eext_Circle_Object_Spinner_Data {
-     Ecore_Timer *rotary_timer;
-     Ecore_Timer *end_effect_expired_timer;
-     Eina_Bool rotary_event;
-     Eina_Bool a11y_highlighted;
-     double angle;
-     double to_angle_offset;
-     double end_effect_angle;
+   Evas_Object *genlist, *circle_genlist;
+   Eina_Bool genlist_visible, spinner_activated, genlist_activated;
 };
 
 ///////////////////////////////
index ec07916953331f07ff26599ee26a5e31484bd8b9..b6ad90f0317c02f3ac74ac10fa7d1a692e3b32dc 100755 (executable)
 #include "wearable/circle/efl_extension_circle_private.h"
 
 #define EEXT_CIRCLE_OBJECT_DATETIME_TYPE "Eext_Circle_Object_Datetime"
-#define MIN_DAYS_IN_MONTH 28
-#define MAX_DAYS_IN_MONTH 31
-#define DATETIME_FIELD_NAME_BUF_MAX 8
-
-#define PICKER_MARK_PARTITION_COUNT_YEAR 50
-#define PICKER_MARK_ANGLE_MONTH 30
-#define PICKER_MARK_ANGLE_HOUR 30
-#define PICKER_MARK_ANGLE_MIN 6
 
 #define EEXT_CIRCLE_OBJECT_DATETIME_DATA_GET(circle_obj, data) \
    Eext_Circle_Object_Datetime_Data *data = NULL; \
       data = (Eext_Circle_Object_Datetime_Data *)circle_obj->widget_data; \
    if (!data)
 
-#define BG_FILE_COUNT 7
-
-#define DATETIME_ITEM_NAME "default"
-
-//static const double BG_HEIGHT = 360.0;
-//static const double mark_width = 6;
-static const double mark_height =23;
-static const double radius = 168.5; //BG_HEIGHT / 2 - mark_height / 2;
-static const double mark_radius = 2.000317; //1 / sqrt(1 - pow(mark_width / 2 / radius , 2)) * 2;
-static const double ANIMATION_DURATION = 0.3;
-static const double BLINK_DELAY = 0.3;
-
-static char *bg_file_name[] = {
-   "date_picker_day_28_bg",
-   "date_picker_day_29_bg",
-   "date_picker_day_30_bg",
-   "date_picker_day_31_bg",
-   "date_picker_month_bg",
-   "date_picker_year_bg",
-   "time_picker_bg",
-   NULL
-};
-
-static int datepicker_type = 0;
-
-static const int picker_mark_angle_year[] =
-{0,7,14,21,28,36,43,50,57,64,72,79,86,93,100,108,115,122,129,136,144,151,158,165,172,180,187,194,201,208,216,223,230,237,244,252,259,266,273,280,288,295,302,309,316,324,331,338,345,352};
-
-static const int picker_mark_angle_day[4][31] =
-//28 day
-{{0,13,26,39,52,65,78,90,103,116,129,142,155,168,180,193,206,219,232,245,258,270,283,296,309,322,335,348},
-//29 day
-{0,13,25,38,50,63,75,87,100,112,125,137,149,162,174,187,199,211,224,236,249,261,273,286,298,311,323,335,348},
-//30 day
-{0,12,24,36,48,60,72,84,96,108,120,132,144,156,168,180,192,204,216,228,240,252,264,276,288,300,312,324,336,348},
-//31 day
-{0,12,24,36,47,59,70,82,93,105,116,128,139,151,163,175,186,198,209,221,232,244,255,267,278,290,302,314,325,337,349}};
-
-// for accessibility
-static Eina_Bool _accessibility_datetime_ampm_gesutre_cb(void *data, Elm_Atspi_Gesture_Info gesture_info, Evas_Object *obj);
-static void _accessibility_datetime_radio_highlighted_cb(void *data, Evas_Object *obj, void *event_info);
-//
-
-static void
-_eext_circle_object_datetime_picker_mark_angle_set(Eext_Circle_Object *obj, double angle, Eina_Bool anim)
-{
-   double angle_offset, real_part;
-   Eext_Circle_Object_Item *item;
-
-   item = _eext_circle_object_item_get(obj, DATETIME_ITEM_NAME);
-   if (anim)
-     {
-        angle_offset = _eext_circle_object_item_angle_offset_get(item);
-        real_part = angle_offset - (int)angle_offset;
-
-        angle_offset = (int)angle_offset % 360 + real_part;
-        if (angle_offset < 0.0) angle_offset += 360.0;
-
-        if (angle - angle_offset > 180.0)
-          angle_offset += 360.0;
-        else if (angle_offset - angle > 180.0)
-          angle_offset -= 360.0;
-
-        _eext_circle_object_item_angle_offset_set(item, angle_offset - (mark_radius / 2));
-
-        _eext_circle_object_item_angle_transit_set(item, ANIMATION_DURATION,
-                                              mark_radius, angle - (mark_radius / 2),
-                                              EINA_TRUE,
-                                              0.25, 0.46,
-                                              0.45, 1.0);
-     }
-   // for Accessibility
-   else if (elm_atspi_bridge_utils_is_screen_reader_enabled() && angle == -1.0f) // Do not display circle object(indicator bar in datetime)
-     {
-        _eext_circle_object_item_angle_offset_set(item, 0);
-        _eext_circle_object_item_angle_set(item, 0);
-     }
-   //
-   else
-     {
-        _eext_circle_object_item_angle_offset_set(item, angle -(mark_radius / 2));
-        _eext_circle_object_item_angle_set(item, mark_radius);
-     }
-
-   _eext_circle_object_changed(obj);
-}
-
-static int
-_max_days_get(int year, int month)
-{
-   struct tm time1;
-   time_t t;
-   int day;
-
-   t = time(NULL);
-   localtime_r(&t, &time1);
-   time1.tm_year = year;
-   time1.tm_mon = month;
-   for (day = MIN_DAYS_IN_MONTH; day <= MAX_DAYS_IN_MONTH; day++)
-     {
-        time1.tm_mday = day;
-        /* FIXME: To restrict month wrapping because of summer time in some locales,
-         * ignore day light saving mode in mktime(). */
-        time1.tm_isdst = -1;
-        mktime(&time1);
-        if (time1.tm_mday == 1) break;
-     }
-
-   day--;
-   return day;
-}
-
-static Evas_Object *
-_eext_circle_object_datetime_selected_field_object_get(Evas_Object *datetime)
-{
-   Evas_Object *radio;
-   Elm_Datetime_Field_Type type;
-   char buf[DATETIME_FIELD_NAME_BUF_MAX];
-
-   for (type = ELM_DATETIME_YEAR; type < ELM_DATETIME_AMPM; type++)
-     {
-        snprintf(buf, sizeof(buf), "field%d", type);
-        radio = elm_object_part_content_get(datetime, buf);
-        if (radio)
-          return elm_radio_selected_object_get(radio);
-     }
-
-   return NULL;
-}
-
-static void
-_eext_circle_object_datetime_bg_image_set(Eext_Circle_Object *obj, int index)
-{
-   char buf[PATH_MAX];
-
-   snprintf(buf, sizeof(buf), "%s/%s.png", IMG_DIR, bg_file_name[index]);
-
-   _eext_circle_object_bg_file_path_set(obj, buf);
-}
-
-static void
-_current_type_update_for_datetime(Eext_Circle_Object *obj, Eina_Bool anim)
-{
-   Eext_Circle_Object_Datetime_Data *data = (Eext_Circle_Object_Datetime_Data *)obj->widget_data;
-   Evas_Object *datetime = obj->widget_object;
-   Evas_Object *radio;
-   struct tm t;
-   int max_day;
-   int bg_image_index = BG_FILE_COUNT - 1;
-   double picker_angle = 0.0;
-
-   elm_datetime_value_get(datetime, &t);
-
-   radio = _eext_circle_object_datetime_selected_field_object_get(datetime);
-   if (radio)
-     {
-        data->current_type = elm_radio_state_value_get(radio);
-        data->rotary_angle = eext_circle_object_angle_get(datetime);
-        switch (data->current_type)
-          {
-             case ELM_DATETIME_YEAR:
-                bg_image_index = 5;
-                picker_angle = (double)(picker_mark_angle_year[(int)((t.tm_year + 1900) % PICKER_MARK_PARTITION_COUNT_YEAR)]);
-                _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
-                break;
-             case ELM_DATETIME_MONTH:
-                bg_image_index = 4;
-                picker_angle = (double)((t.tm_mon) * PICKER_MARK_ANGLE_MONTH);
-                _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
-                break;
-             case ELM_DATETIME_DATE:
-                max_day = _max_days_get(t.tm_year, t.tm_mon);
-                bg_image_index = max_day % 28;
-                picker_angle = (double)(picker_mark_angle_day[max_day - MIN_DAYS_IN_MONTH][(t.tm_mday > max_day ? max_day:t.tm_mday) - 1]);
-                _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
-                break;
-             case ELM_DATETIME_HOUR:
-                picker_angle = (double)((t.tm_hour) * PICKER_MARK_ANGLE_HOUR);
-                _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
-                bg_image_index = 6;
-                break;
-             case ELM_DATETIME_MINUTE:
-                picker_angle = (double)(t.tm_min * PICKER_MARK_ANGLE_MIN);
-                _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
-                bg_image_index = 6;
-                break;
-             default:
-                break;
-            }
-        _eext_circle_object_datetime_bg_image_set(obj, bg_image_index);
-     }
-}
-
-static void
-_current_type_update_for_datepicker(Eext_Circle_Object *obj, Eina_Bool anim)
-{
-   Eext_Circle_Object_Datetime_Data *data = (Eext_Circle_Object_Datetime_Data *)obj->widget_data;
-   Evas_Object *datetime = obj->widget_object;
-
-   int max_day;
-   int bg_image_index = BG_FILE_COUNT - 1;
-   double picker_angle = 0.0;
-   int year, month, day;
-   efl_ui_datepicker_date_get(datetime, &year, &month, &day);
-
-   switch (data->current_type)
-     {
-        case ELM_DATETIME_YEAR:
-           bg_image_index = 5;
-           picker_angle = (double)(picker_mark_angle_year[(int)(year) % PICKER_MARK_PARTITION_COUNT_YEAR]);
-           _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
-           break;
-        case ELM_DATETIME_MONTH:
-           bg_image_index = 4;
-           picker_angle = (double)((month) * PICKER_MARK_ANGLE_MONTH);
-           _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
-           break;
-        case ELM_DATETIME_DATE:
-           max_day = _max_days_get(year - 1900, month);
-           bg_image_index = max_day % 28;
-           picker_angle = (double)(picker_mark_angle_day[max_day - MIN_DAYS_IN_MONTH][(day > max_day ? max_day:day) - 1]);
-           _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
-           break;
-        default:
-           break;
-      }
-
-   _eext_circle_object_datetime_bg_image_set(obj, bg_image_index);
-}
-
-static void
-_current_type_update_for_timepicker(Eext_Circle_Object *obj, Eina_Bool anim)
-{
-   Eext_Circle_Object_Datetime_Data *data = (Eext_Circle_Object_Datetime_Data *)obj->widget_data;
-   Evas_Object *datetime = obj->widget_object;
-
-   int bg_image_index = BG_FILE_COUNT - 1;
-   double picker_angle = 0.0;
-   int hour, minute;
-   efl_ui_timepicker_time_get(datetime, &hour, &minute);
-
-   switch (data->current_type)
-     {
-        case ELM_DATETIME_HOUR:
-           picker_angle = (double)((hour) * PICKER_MARK_ANGLE_HOUR);
-           _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
-           bg_image_index = 6;
-           break;
-        case ELM_DATETIME_MINUTE:
-           picker_angle = (double)(minute * PICKER_MARK_ANGLE_MIN);
-           _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
-           bg_image_index = 6;
-           break;
-        default:
-           break;
-      }
-   _eext_circle_object_datetime_bg_image_set(obj, bg_image_index);
-}
-
-static void
-_eext_circle_object_datetime_current_type_update(Eext_Circle_Object *obj, Eina_Bool anim)
-{
-   if (efl_isa(obj->widget_object, EFL_UI_LEGACY_INTERFACE))
-     _current_type_update_for_datetime(obj, anim);
-   else
-     {
-        if (strstr(efl_class_name_get(obj->widget_object), "CircleDatepicker") != NULL)
-          _current_type_update_for_datepicker(obj, anim);
-        else
-          _current_type_update_for_timepicker(obj, anim);
-     }
-}
-
-/**
- * FIXME(171030): This sets eext_circle_object data values with a handle "datetime",
- *       but this is not working because "datetime" is elm_datetime, not circle object.
- *       When fixing "datetime" to circle object, the angle will be doubled.
- *
-static void
-_eext_circle_object_datetime_circle_update(Eext_Circle_Object *obj)
-{
-   Eext_Circle_Object_Datetime_Data *data = (Eext_Circle_Object_Datetime_Data *)obj->widget_data;
-   Evas_Object *datetime = obj->widget_object;
-   struct tm t;
-   int min, max;
-
-   elm_datetime_value_get(datetime, &t);
-   elm_datetime_field_limit_get(datetime, data->current_type, &min, &max);
-
-   switch (data->current_type)
-     {
-        case ELM_DATETIME_YEAR:
-           eext_circle_object_value_min_max_set(datetime, (double)min, (double)max);
-           eext_circle_object_value_set(datetime, (double)t.tm_year);
-           break;
-        case ELM_DATETIME_MONTH:
-           eext_circle_object_value_min_max_set(datetime, (double)min, (double)max);
-           eext_circle_object_value_set(datetime, (double)t.tm_mon);
-           break;
-        case ELM_DATETIME_DATE:
-           min = 1;
-           max = _max_days_get(t.tm_year, t.tm_mon);
-           eext_circle_object_value_min_max_set(datetime, (double)min, (double)max);
-           eext_circle_object_value_set(datetime, (double)t.tm_mday);
-           break;
-        case ELM_DATETIME_HOUR:
-           eext_circle_object_value_min_max_set(datetime, (double)min, (double)max);
-           eext_circle_object_value_set(datetime, (double)t.tm_hour);
-           break;
-        case ELM_DATETIME_MINUTE:
-           eext_circle_object_value_min_max_set(datetime, (double)min, (double)max);
-           eext_circle_object_value_set(datetime, (double)t.tm_min);
-           break;
-        case ELM_DATETIME_AMPM:
-           eext_circle_object_value_min_max_set(datetime, (double)min, (double)max);
-           eext_circle_object_value_set(datetime, (double)t.tm_hour);
-        default:
-           break;
-     }
-
-   data->rotary_angle = eext_circle_object_angle_get(datetime);
-}
-*/
-
-static void
-_eext_circle_object_datetime_radio_changed_cb(void *data, Evas_Object *obj, void *event_info)
-{
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
-   if (circle_obj->widget_object == event_info)
-     _eext_circle_object_datetime_current_type_update(circle_obj, EINA_FALSE);
-   else
-     _eext_circle_object_datetime_current_type_update(circle_obj, EINA_TRUE);
-
-/**
- * FIXME(171030): Comment this function out because eext_circle_object_value_set is not applied to angle.
-   _eext_circle_object_datetime_circle_update(circle_obj);
-*/
-}
-
-static void
-_eext_circle_object_datetime_changed_cb(void *data, Evas_Object *obj, void *event_info)
-{
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-   _eext_circle_object_datetime_current_type_update(circle_obj, EINA_TRUE);
-/**
- * FIXME(171030): Comment this function out because eext_circle_object_value_set is not applied to angle.
-   Eext_Circle_Object_Datetime_Data *widget_data = (Eext_Circle_Object_Datetime_Data *)circle_obj->widget_data;
-   if (!widget_data->circle_changed)
-     _eext_circle_object_datetime_circle_update(circle_obj);
-*/
-}
-
-static void
-_date_update_for_datetime(Eext_Circle_Object *obj, Eina_Bool value_up)
-{
-   Eext_Circle_Object_Datetime_Data *data = (Eext_Circle_Object_Datetime_Data *)obj->widget_data;
-   Evas_Object *datetime = obj->widget_object;
-   struct tm t;
-   int max_day;
-   int min, max;
-
-   elm_datetime_value_get(datetime, &t);
-   elm_datetime_field_limit_get(datetime, data->current_type, &min, &max);
-   double picker_angle = 0.0;
-
-   switch (data->current_type)
-     {
-        case ELM_DATETIME_YEAR:
-           if (value_up) t.tm_year += 1;
-           else t.tm_year -= 1;
-           if (t.tm_year < min) t.tm_year = max;
-           else if (t.tm_year > max) t.tm_year = min;
-
-           picker_angle = (double)(picker_mark_angle_year[(int)((t.tm_year + 1900) % PICKER_MARK_PARTITION_COUNT_YEAR)]);
-           _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, EINA_TRUE);
-           break;
-
-        case ELM_DATETIME_MONTH:
-           if (value_up) t.tm_mon += 1;
-           else t.tm_mon -= 1;
-           if (t.tm_mon < min) t.tm_mon = max;
-           else if (t.tm_mon > max) t.tm_mon = min;
-
-           picker_angle = (double)((t.tm_mon) * PICKER_MARK_ANGLE_MONTH);
-           _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, EINA_TRUE);
-           break;
-
-        case ELM_DATETIME_DATE:
-           if (value_up) t.tm_mday += 1;
-           else t.tm_mday -= 1;
-           int old_mday = t.tm_mday;
-           if (t.tm_mday < min) t.tm_mday = max;
-           else if (t.tm_mday > max) t.tm_mday = min;
-           else
-             {
-                elm_datetime_value_set(datetime, &t);
-                elm_datetime_value_get(datetime, &t);
-                if (t.tm_mday < old_mday)
-                  {
-                     if (value_up) t.tm_mday = min;
-                     else
-                       {
-                          t.tm_mday = max;
-                          elm_datetime_value_set(datetime, &t);
-                          elm_datetime_value_get(datetime, &t);
-                       }
-                  }
-              }
-           max_day = _max_days_get(t.tm_year, t.tm_mon);
-           picker_angle = (double)(picker_mark_angle_day[max_day - MIN_DAYS_IN_MONTH][(t.tm_mday > max_day ? max_day:t.tm_mday) - 1]);
-           _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, EINA_TRUE);
-           break;
-
-        case ELM_DATETIME_HOUR:
-           if (value_up) t.tm_hour += 1;
-           else t.tm_hour -= 1;
-           if (t.tm_hour < min) t.tm_hour = max;
-           else if (t.tm_hour > max) t.tm_hour = min;
-           elm_datetime_value_set(datetime, &t);
-           elm_datetime_value_get(datetime, &t);
-
-           picker_angle = (double)((t.tm_hour) * PICKER_MARK_ANGLE_HOUR);
-           _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, EINA_TRUE);
-           break;
-
-        case ELM_DATETIME_MINUTE:
-           if (value_up) t.tm_min += 1;
-           else t.tm_min -= 1;
-           if (t.tm_min < min) t.tm_min = max;
-           else if (t.tm_min > max) t.tm_min = min;
-
-           elm_datetime_value_set(datetime, &t);
-           elm_datetime_value_get(datetime, &t);
-           picker_angle = (double)(t.tm_min * PICKER_MARK_ANGLE_MIN);
-           _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, EINA_TRUE);
-           break;
-
-        case ELM_DATETIME_AMPM:
-           if (value_up && t.tm_hour < 12) t.tm_hour += 12;
-           else if (t.tm_hour >= 12) t.tm_hour -= 12;
-
-        default:
-            break;
-     }
-
-   elm_datetime_value_set(datetime, &t);
-}
-
-static void
-_date_update_for_datepicker(Eext_Circle_Object *obj, Eina_Bool value_up)
-{
-   Eext_Circle_Object_Datetime_Data *data = (Eext_Circle_Object_Datetime_Data *)obj->widget_data;
-   Evas_Object *datetime = obj->widget_object;
-
-   int max_day;
-   int min, max;
-
-   min = (int)data->min;
-   max = (int)data->max;
-   double picker_angle = 0.0;
-
-   int year, month, day;
-   efl_ui_datepicker_date_get(datetime, &year, &month, &day);
-
-   switch (data->current_type)
-     {
-        case ELM_DATETIME_YEAR:
-           if (value_up) year += 1;
-           else year -= 1;
-           if (year < min) year = max;
-           else if (year > max) year = min;
-           picker_angle = (double)(picker_mark_angle_year[(int)(year) % PICKER_MARK_PARTITION_COUNT_YEAR]);
-           _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, EINA_TRUE);
-           break;
-
-        case ELM_DATETIME_MONTH:
-           if (value_up) month += 1;
-           else month -= 1;
-           if (month < min) month = max;
-           else if (month > max) month = min;
-           picker_angle = (double)((month) * PICKER_MARK_ANGLE_MONTH);
-           _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, EINA_TRUE);
-           break;
-
-        case ELM_DATETIME_DATE:
-           if (value_up) day += 1;
-           else day -= 1;
-           if (day < min) day = max;
-           else if(day > max) day = min;
-           max_day = _max_days_get(year - 1900, month);
-           picker_angle = (double)(picker_mark_angle_day[max_day - MIN_DAYS_IN_MONTH][(day > max_day ? max_day:day) - 1]);
-           _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, EINA_TRUE);
-           break;
-        default:
-           break;
-     }
-
-   efl_ui_datepicker_date_set(datetime, year, month, day);
-}
-
-
-static void
-_date_update_for_timepicker(Eext_Circle_Object *obj, Eina_Bool value_up)
-{
-   Eext_Circle_Object_Datetime_Data *data = (Eext_Circle_Object_Datetime_Data *)obj->widget_data;
-   Evas_Object *datetime = obj->widget_object;
-
-   int max_day;
-   int min, max;
-
-   min = (int)data->min;
-   max = (int)data->max;
-   double picker_angle = 0.0;
-
-   int hour, minute;
-   efl_ui_timepicker_time_get(datetime, &hour, &minute);
-
-   switch (data->current_type)
-     {
-        case ELM_DATETIME_HOUR:
-           if (value_up) hour += 1;
-           else hour -= 1;
-           if (hour < 0 ) hour = max + 11;
-           else if (hour > (max + 11)) hour = 0;
-           picker_angle = (double)((hour) * PICKER_MARK_ANGLE_HOUR);
-           _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, EINA_TRUE);
-           break;
-
-        case ELM_DATETIME_MINUTE:
-           if (value_up) minute += 1;
-           else minute -= 1;
-           if (minute < min) minute = max;
-           else if (minute > max) minute = min;
-           picker_angle = (double)(minute * PICKER_MARK_ANGLE_MIN);
-           _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, EINA_TRUE);
-           break;
-
-        default:
-           break;
-     }
-
-   efl_ui_timepicker_time_set(datetime, hour, minute);
-}
+#define DATETIME_FIELD_NAME_BUF_MAX 8
 
+static const char SIGNAL_ACTIVATED[] = "rotary,activated";
 
 static void
-_date_update(Eext_Circle_Object *obj, Eina_Bool value_up)
-{
-   if (efl_isa(obj->widget_object, EFL_UI_LEGACY_INTERFACE))
-     _date_update_for_datetime(obj, value_up);
-   else
-     {
-        if (strstr(efl_class_name_get(obj->widget_object), "CircleDatepicker") != NULL)
-          _date_update_for_datepicker(obj, value_up);
-        else
-          _date_update_for_timepicker(obj, value_up);
-     }
-}
-
-static Eina_Bool
-_rotary_timer_cb(void *data)
-{
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-   Eext_Circle_Object_Datetime_Data *widget_data = (Eext_Circle_Object_Datetime_Data *)circle_obj->widget_data;
-   Evas_Object *selected_radio;
-
-   selected_radio = _eext_circle_object_datetime_selected_field_object_get(circle_obj->widget_object);
-   elm_layout_signal_emit(selected_radio, "elm,state,rotary,inactive", "eext");
-
-   widget_data->rotary_timer = NULL;
-   return ECORE_CALLBACK_CANCEL;
-}
-
-static Eina_Bool
-_rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info* info)
+_eext_circle_object_datetime_activated_cb(void *data,
+                                         Evas_Object *obj EINA_UNUSED,
+                                         void *event_info EINA_UNUSED)
 {
    Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-   Evas_Object *selected_radio;
-   Eext_Circle_Object_Datetime_Data *widget_data = (Eext_Circle_Object_Datetime_Data *)circle_obj->widget_data;
-   //for accessibility
-   if (elm_atspi_bridge_utils_is_screen_reader_enabled() && widget_data->current_type == ELM_DATETIME_AMPM)
-     {
-        return EINA_TRUE;
-     }
-   //
-
-   if (circle_obj->is_propagated)
-     {
-        circle_obj->is_propagated = EINA_FALSE;
-
-        return EINA_TRUE;
-     }
-   if (obj == circle_obj->main_obj)
-     circle_obj->is_propagated = EINA_TRUE;
-
-   //Send rotary active signal to selected radio to off animation(Tizen_2.3.2 UX)
-   selected_radio = _eext_circle_object_datetime_selected_field_object_get(circle_obj->widget_object);
-   elm_object_signal_emit(selected_radio, "elm,state,rotary,active", "eext");
-
-   if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
-     _date_update(circle_obj, EINA_TRUE);
-   else
-     _date_update(circle_obj, EINA_FALSE);
-
-   //for accessibility
-   if (elm_atspi_bridge_utils_is_screen_reader_enabled())
-     {
-        Evas_Object *datetime = circle_obj->widget_object;
-        struct tm t;
-        char buf_read_text[255];
-        char buf_month[255];
-        char buf_ampm[3];
-
-        elm_datetime_value_get(datetime, &t);
+   EEXT_CIRCLE_OBJECT_DATETIME_DATA_GET(circle_obj, widget_data) return;
 
-        bindtextdomain (PACKAGE, LOCALE_DIR);
-        elm_atspi_accessible_translation_domain_set(obj, PACKAGE);
-
-        switch (widget_data->current_type)
-          {
-             case ELM_DATETIME_DATE:
-                snprintf(buf_read_text, sizeof(buf_read_text), "%2.0f",(double)t.tm_mday);
-                break;
-             case ELM_DATETIME_MONTH:
-                if (t.tm_mon == 0)
-                   snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_JANUARY"));
-                else if (t.tm_mon == 1)
-                   snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_FEBRUARY"));
-                else if (t.tm_mon == 2)
-                   snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_MARCH"));
-                else if (t.tm_mon == 3)
-                   snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_APRIL"));
-                else if (t.tm_mon == 4)
-                   snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_MAY"));
-                else if (t.tm_mon == 5)
-                   snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_JUNE"));
-                else if (t.tm_mon == 6)
-                   snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_JULY"));
-                else if (t.tm_mon == 7)
-                   snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_AUGUST"));
-                else if (t.tm_mon == 8)
-                   snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_SEPTEMBER"));
-                else if (t.tm_mon == 9)
-                   snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_OCTOBER"));
-                else if (t.tm_mon == 10)
-                   snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_NOVEMBER"));
-                else if (t.tm_mon == 11)
-                   snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_DECEMBER"));
-                snprintf(buf_read_text, sizeof(buf_read_text), "%s",buf_month);
-                break;
-             case ELM_DATETIME_YEAR:
-                snprintf(buf_read_text, sizeof(buf_read_text), "%4.0f",(double)t.tm_year + (double)1900.0f);
-                break;
-             case ELM_DATETIME_HOUR:
-                if ((info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE && t.tm_hour == 12) ||
-                    (info->direction == EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE && t.tm_hour == 23))
-                   snprintf(buf_ampm, sizeof(buf_ampm), _("IDS_COM_BODY_PM"));
-                else if ((info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE && t.tm_hour == 0) ||
-                         (info->direction == EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE && t.tm_hour == 11))
-                   snprintf(buf_ampm, sizeof(buf_ampm), _("IDS_COM_BODY_AM"));
-                else
-                   buf_ampm[0] = '\0';
-
-                if (t.tm_hour > 12)
-                   snprintf(buf_read_text, sizeof(buf_read_text), "%2.0f %s",(double)t.tm_hour - 12.0f, buf_ampm);
-                else if (t.tm_hour == 0)
-                   snprintf(buf_read_text, sizeof(buf_read_text), "%2.0f %s",(double)t.tm_hour + 12.0f, buf_ampm);
-                else
-                   snprintf(buf_read_text, sizeof(buf_read_text), "%2.0f %s",(double)t.tm_hour, buf_ampm);
-
-                break;
-             case ELM_DATETIME_MINUTE:
-                snprintf(buf_read_text, sizeof(buf_read_text), "%2.0f",(double)t.tm_min);
-                break;
-             default:
-                break;
-          }
-        elm_atspi_bridge_utils_say(buf_read_text, EINA_TRUE, NULL, NULL);
-     }
-   //
-
-   if (widget_data->rotary_timer)
-     {
-        ecore_timer_del(widget_data->rotary_timer);
-               widget_data->rotary_timer = NULL;
-        }
-
-   widget_data->rotary_timer = ecore_timer_add(BLINK_DELAY, _rotary_timer_cb, circle_obj);
-
-   return EINA_TRUE;
+   widget_data->activated = EINA_TRUE;
 }
 
 static void
@@ -733,339 +47,65 @@ _eext_circle_object_datetime_del_cb(Eext_Circle_Object *obj)
 {
    if (!obj) return;
 
-   //for accessibility
-   char buf[DATETIME_FIELD_NAME_BUF_MAX];
-   int idx = 0;
-   for (idx = ELM_DATETIME_AMPM; idx >= ELM_DATETIME_YEAR; idx--)
-     {
-        snprintf(buf, sizeof(buf), "field%d", idx);
-        Evas_Object *field_obj = elm_object_part_content_get(obj->widget_object, buf);
-        if (field_obj)
-          {
-             Elm_Datetime_Field_Type field_type = (Elm_Datetime_Field_Type)evas_object_data_get(field_obj, "_field_type");
-             if (field_type == ELM_DATETIME_AMPM)
-               elm_atspi_accessible_gesture_cb_set(field_obj, NULL, NULL);
-             evas_object_smart_callback_del(field_obj, "atspi,highlighted", _accessibility_datetime_radio_highlighted_cb);
-          }
-     }
-   //
-
    if (obj->widget_data)
      {
-        Eext_Circle_Object_Datetime_Data *widget_data = (Eext_Circle_Object_Datetime_Data *)obj->widget_data;
-        if (widget_data->rotary_timer)
-          {
-             ecore_timer_del(widget_data->rotary_timer);
-             widget_data->rotary_timer = NULL;
-          }
-
         free(obj->widget_data);
         obj->widget_data = NULL;
      }
-
-   eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb);
-   eext_rotary_object_event_callback_del(obj->main_obj, _rotary_changed_cb);
+   evas_object_smart_callback_del(obj->widget_object, SIGNAL_ACTIVATED, _eext_circle_object_datetime_activated_cb);
+   evas_object_smart_callback_del(obj->main_obj, SIGNAL_ACTIVATED, _eext_circle_object_datetime_activated_cb);
 }
 
 static void
-_eext_circle_object_datetime_disabled_cb(Eext_Circle_Object *obj)
+_spinner_focused_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
 {
-   if (obj->disabled)
-     {
-        eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb);
-        eext_rotary_object_event_callback_del(obj->main_obj, _rotary_changed_cb);
-     }
-   else
-     {
-        eext_rotary_object_event_callback_add(obj->main_obj, _rotary_changed_cb, obj);
-        eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
-     }
-}
-
-static void
-_accessibility_item_make_trait(char *trait, char *unit, int trait_size)
-{
-   const char *format = _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_ADJUST_PS");
-   snprintf(trait, trait_size, format, unit);
-}
-
-//for accessibility
-static char *
-_accessibility_item_name_cb(void *data, Evas_Object *obj)
-{
-   char buf[255] = "";
-   char buf_month[255];
-   char buf_unit[255];
-   char buf_trait[255];
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-   Evas_Object *datetime = circle_obj->widget_object;
-   struct tm t;
-   int ret = 0;
-
-   Elm_Datetime_Field_Type field_type = (Elm_Datetime_Field_Type)evas_object_data_get(obj, "_field_type");
-
-   elm_datetime_value_get(datetime, &t);
-
-   bindtextdomain (PACKAGE, LOCALE_DIR);
-
-   switch (field_type)
-     {
-        case ELM_DATETIME_DATE:
-           snprintf(buf_unit, sizeof(buf_unit), _("IDS_COM_BODY_DAY"));
-           _accessibility_item_make_trait(buf_trait, buf_unit, sizeof(buf_trait));
-           ret = snprintf(buf, sizeof(buf), "%2.0f %s %s",(double)t.tm_mday, buf_unit, buf_trait);
-           break;
-        case ELM_DATETIME_MONTH:
-           if (t.tm_mon == 0)
-              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_JANUARY"));
-           else if (t.tm_mon == 1)
-              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_FEBRUARY"));
-           else if (t.tm_mon == 2)
-              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_MARCH"));
-           else if (t.tm_mon == 3)
-              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_APRIL"));
-           else if (t.tm_mon == 4)
-              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_MAY"));
-           else if (t.tm_mon == 5)
-              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_JUNE"));
-           else if (t.tm_mon == 6)
-              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_JULY"));
-           else if (t.tm_mon == 7)
-              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_AUGUST"));
-           else if (t.tm_mon == 8)
-              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_SEPTEMBER"));
-           else if (t.tm_mon == 9)
-              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_OCTOBER"));
-           else if (t.tm_mon == 10)
-              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_NOVEMBER"));
-           else if (t.tm_mon == 11)
-              snprintf(buf_month, sizeof(buf_month), _("IDS_COM_BODY_DECEMBER"));
-           snprintf(buf_unit, sizeof(buf_unit), _("IDS_COM_BODY_MONTH"));
-           _accessibility_item_make_trait(buf_trait, buf_unit, sizeof(buf_trait));
-           ret = snprintf(buf, sizeof(buf), "%s %s %s",buf_month, buf_unit, buf_trait);
-           break;
-        case ELM_DATETIME_YEAR:
-           snprintf(buf_unit, sizeof(buf_unit), _("IDS_COM_BODY_YEAR"));
-           _accessibility_item_make_trait(buf_trait, buf_unit, sizeof(buf_trait));
-           ret = snprintf(buf, sizeof(buf), "%4.0f %s %s",(double)t.tm_year + (double)1900.0f, buf_unit, buf_trait);
-           break;
-        case ELM_DATETIME_AMPM:
-           snprintf(buf_trait, sizeof(buf_trait), _("WDS_TTS_TBBODY_DOUBLE_TAP_TO_CHANGE"));
-           if ((double)t.tm_hour < 12.0f)
-              snprintf(buf_unit, sizeof(buf_unit), _("IDS_COM_BODY_AM"));
-           else
-              snprintf(buf_unit, sizeof(buf_unit), _("IDS_COM_BODY_PM"));
-           ret = snprintf(buf, sizeof(buf), "%s %s",buf_unit, buf_trait);
-           break;
-        case ELM_DATETIME_HOUR:
-           snprintf(buf_unit, sizeof(buf_unit), _("IDS_COM_BODY_HOUR"));
-           _accessibility_item_make_trait(buf_trait, buf_unit, sizeof(buf_trait));
-           ret = snprintf(buf, sizeof(buf), "%2.0f %s %s",(double)t.tm_hour, buf_unit, buf_trait);
-           break;
-        case ELM_DATETIME_MINUTE:
-           snprintf(buf_unit, sizeof(buf_unit), _("IDS_COM_BODY_MINUTE"));
-           _accessibility_item_make_trait(buf_trait, buf_unit, sizeof(buf_trait));
-           ret = snprintf(buf, sizeof(buf), "%2.0f %s %s",(double)t.tm_min, buf_unit, buf_trait);
-           break;
-     }
-
-   if (ret < 0)
-     WRN("text are truncated (%s)", buf);
-
-   return strdup(buf);
-
-}
-
-static Eina_Bool
-_accessibility_datetime_ampm_gesutre_cb(void *data, Elm_Atspi_Gesture_Info gesture_info, Evas_Object *obj)
-{
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-   Evas_Object *datetime = circle_obj->widget_object;
-   char buf_unit[255];
-   struct tm t;
-
-   switch (gesture_info.type)
-     {
-        case ELM_ATSPI_GESTURE_ONE_FINGER_DOUBLE_TAP:
-           elm_datetime_value_get(datetime, &t);
-
-           if ((double)t.tm_hour < 12.0f)
-              snprintf(buf_unit, sizeof(buf_unit), _("IDS_COM_BODY_PM"));
-           else
-              snprintf(buf_unit, sizeof(buf_unit), _("IDS_COM_BODY_AM"));
-
-           elm_atspi_bridge_utils_say(buf_unit, EINA_TRUE, NULL, NULL);
-           break;
-        default:
-           break;
-     }
+   Eext_Circle_Object *circle_obj = data;
+   EEXT_CIRCLE_OBJECT_DATETIME_DATA_GET(circle_obj, widget_data) return;
 
-   return EINA_FALSE;
+   if (widget_data->activated)
+     eext_rotary_object_event_activated_set(obj, EINA_TRUE);
 }
 
 static void
-_accessibility_datetime_radio_highlighted_cb(void *data, Evas_Object *obj, void *event_info)
+_enable_rotary_event(Evas_Object *datetime, Eext_Circle_Object *circle_obj)
 {
-   char buf[PATH_MAX] = "";
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-   Evas_Object *datetime = circle_obj->widget_object;
-   Elm_Datetime_Field_Type field_type = (Elm_Datetime_Field_Type)evas_object_data_get(obj, "_field_type");
+   int idx;
+   char buf[DATETIME_FIELD_NAME_BUF_MAX];
 
-   if (field_type == ELM_DATETIME_AMPM)
-     {
-        Eext_Circle_Object_Datetime_Data *widget_data = (Eext_Circle_Object_Datetime_Data *)circle_obj->widget_data;
-        widget_data->current_type = field_type;
-        snprintf(buf, sizeof(buf), "field%d", ELM_DATETIME_HOUR);
-        Evas_Object *radio_obj = elm_object_part_content_get(datetime, buf);
-        elm_radio_value_set(radio_obj, -1);
-        _eext_circle_object_datetime_picker_mark_angle_set(circle_obj, -1, EINA_FALSE);
-        _eext_circle_object_datetime_bg_image_set(circle_obj, 6);
-     }
-   else
+   for (idx = ELM_DATETIME_YEAR; idx <= ELM_DATETIME_AMPM; idx++)
      {
-        elm_radio_value_set(obj, field_type);
-        _eext_circle_object_datetime_current_type_update(circle_obj, EINA_TRUE);
-     }
-
-   elm_atspi_accessible_name_cb_set(obj, _accessibility_item_name_cb, (Eext_Circle_Object*)circle_obj);
-   elm_atspi_accessible_reading_info_type_set(obj, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME);
-}
-//
-
-static void
-date_field_focus_cb(void *data, const Efl_Event *event)
-{
-   int type = evas_object_data_get(event->object, "field_type");
-   Eo* spinner = evas_object_data_get(event->object, "field_obj");
-
-   Eext_Circle_Object *circle_obj = data;
-   EEXT_CIRCLE_OBJECT_DATETIME_DATA_GET(circle_obj, circle_data) return;
-   circle_data->current_type = type;
-   efl_ui_range_limits_get(spinner, &circle_data->min, &circle_data->max);
-
-   _eext_circle_object_datetime_current_type_update(circle_obj, EINA_TRUE);
-}
+        snprintf(buf, sizeof(buf), "field%d", idx);
+        Evas_Object *field_obj = elm_object_part_content_get(datetime, buf);
 
-static void add_date_type(Evas_Object *obj, int index, Eext_Circle_Object *circle_obj)
-{
-   //C# FIXME: The text button is used to get focus in Efl.Ui.SpinButton
-   //          since the spin button cannot get the focus,
-   //          Therefore, the text button should be changed to the spin button
-   //          when the spin button's focus is supported.
-   efl_ui_spin_button_direct_text_input_set(obj, EINA_FALSE);
-   Evas_Object *text_btn = elm_layout_content_get(obj, "efl.text_button");
-   evas_object_data_set(text_btn, "field_type", index);
-   evas_object_data_set(text_btn, "field_obj", obj);
-   efl_event_callback_add(text_btn, EFL_UI_FOCUS_OBJECT_EVENT_FOCUS_CHANGED, date_field_focus_cb, circle_obj);
+        if (field_obj)
+          {
+             eext_circle_object_spinner_add(field_obj, circle_obj->surface);
+             evas_object_smart_callback_add(field_obj, "focused", _spinner_focused_cb, circle_obj);
+          }
+     }
 }
 
-static void
+static Eina_Bool
 _eext_circle_object_datetime_init(Eext_Circle_Object *obj, Evas_Object *datetime)
 {
    Eext_Circle_Object_Datetime_Data *data;
-   Eext_Circle_Object_Item *item;
-
-   char buf[DATETIME_FIELD_NAME_BUF_MAX];
-   int idx;
 
    obj->widget_object = datetime;
    obj->widget_type = EEXT_CIRCLE_OBJECT_DATETIME_TYPE;
-   obj->del_func = _eext_circle_object_datetime_del_cb;
-   obj->disabled_func = _eext_circle_object_datetime_disabled_cb;
-   //obj->bg_obj_get_func = _eext_circle_object_datetime_bg_obj_get_cb;
 
    data = (Eext_Circle_Object_Datetime_Data *)calloc(1, sizeof(Eext_Circle_Object_Datetime_Data));
-   obj->widget_data = (void *)data;
+   if (!data) return EINA_FALSE;
 
-   item = _eext_circle_object_item_new();
-   _eext_circle_object_item_name_set(item, DATETIME_ITEM_NAME);
-   _eext_circle_object_item_color_set(item, 250, 125, 47, 255);
-   _eext_circle_object_item_radius_set(item, radius);
-   _eext_circle_object_item_line_width_set(item, mark_height);
-   _eext_circle_object_item_angle_offset_set(item, item->angle_offset -(mark_radius / 2));
-   _eext_circle_object_item_angle_set(item, mark_radius);
-   _eext_circle_object_item_append(obj, item);
-
-   if (efl_isa(datetime, EFL_UI_LEGACY_INTERFACE))
-     {
-
-        elm_object_style_set(datetime, "datepicker/circle");
-        evas_object_smart_callback_add(elm_object_part_content_get(datetime, "field0"), "changed",
-                                       _eext_circle_object_datetime_radio_changed_cb, obj);
-        evas_object_smart_callback_add(elm_object_part_content_get(datetime, "field1"), "changed",
-                                       _eext_circle_object_datetime_radio_changed_cb, obj);
-        evas_object_smart_callback_add(elm_object_part_content_get(datetime, "field2"), "changed",
-                                       _eext_circle_object_datetime_radio_changed_cb, obj);
-        _eext_circle_object_datetime_bg_image_set(obj, BG_FILE_COUNT - 1);
-     }
-   else
-     {
-        if (strstr(efl_class_name_get(datetime), "CircleDatepicker") != NULL)
-          {
-             data->current_type = ELM_DATETIME_YEAR;
-             Evas_Object *date_field0 = efl_content_get(efl_part(datetime, "efl.field0"));
-             add_date_type(date_field0, ELM_DATETIME_MONTH, obj);
-
-             Evas_Object *date_field1 = efl_content_get(efl_part(datetime, "efl.field1"));
-             add_date_type(date_field1, ELM_DATETIME_DATE, obj);
-
-             Evas_Object *date_field2 = efl_content_get(efl_part(datetime, "efl.field2"));
-             add_date_type(date_field2, ELM_DATETIME_YEAR, obj);
-          }
-        else
-          {
-             data->current_type = ELM_DATETIME_HOUR;
-             Evas_Object *date_field0 = efl_content_get(efl_part(datetime, "efl.field1"));
-             add_date_type(date_field0, ELM_DATETIME_HOUR, obj);
-
-             Evas_Object *date_field1 = efl_content_get(efl_part(datetime, "efl.field2"));
-             add_date_type(date_field1, ELM_DATETIME_MINUTE, obj);
-          }
-     }
-
-   for (idx = ELM_DATETIME_HOUR; idx <= ELM_DATETIME_AMPM; idx++)
-     {
-        snprintf(buf, sizeof(buf), "field%d", idx);
-
-        Evas_Object *field_obj = elm_object_part_content_get(datetime, buf);
-        if (field_obj)
-          {
-             Elm_Datetime_Field_Type field_type = (Elm_Datetime_Field_Type)evas_object_data_get(field_obj, "_field_type");
-             if (field_type != ELM_DATETIME_AMPM)
-               evas_object_smart_callback_add(field_obj, "changed",
-                        _eext_circle_object_datetime_radio_changed_cb, obj);
-          }
-     }
-
-   //for accessibility
-   for (idx = ELM_DATETIME_YEAR; idx <= ELM_DATETIME_AMPM; idx++)
-     {
-        snprintf(buf, sizeof(buf), "field%d", idx);
-        Evas_Object *field_obj = elm_object_part_content_get(obj->widget_object, buf);
-        if (field_obj)
-          {
-             evas_object_smart_callback_add(field_obj, "atspi,highlighted", _accessibility_datetime_radio_highlighted_cb, obj);
-             Elm_Datetime_Field_Type field_type = (Elm_Datetime_Field_Type)evas_object_data_get(field_obj, "_field_type");
-             if (field_type == ELM_DATETIME_AMPM)
-               {
-                  elm_atspi_accessible_gesture_cb_set(field_obj, _accessibility_datetime_ampm_gesutre_cb, obj);
-               }
-          }
-     }
-   //
-
-   evas_object_smart_callback_add(datetime, "changed",
-            _eext_circle_object_datetime_changed_cb, obj);
-
-   _eext_circle_object_datetime_current_type_update(obj, EINA_FALSE);
-/**
- * FIXME(171030): Comment this function out because eext_circle_object_value_set is not applied to angle.
-   _eext_circle_object_datetime_circle_update(obj);
-*/
+   obj->widget_data = (void *)data;
+   data->activated = EINA_FALSE;
+   obj->del_func = _eext_circle_object_datetime_del_cb;
+   obj->disabled_func = NULL;
 
-   eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
-   eext_rotary_object_event_callback_add(obj->main_obj, _rotary_changed_cb, obj);
+   _enable_rotary_event(datetime, obj);
+   evas_object_smart_callback_add(obj->widget_object, SIGNAL_ACTIVATED, _eext_circle_object_datetime_activated_cb, obj);
+   evas_object_smart_callback_add(obj->main_obj, SIGNAL_ACTIVATED, _eext_circle_object_datetime_activated_cb, obj);
 
+   return EINA_TRUE;
 }
 
 EAPI Evas_Object *
@@ -1079,36 +119,8 @@ eext_circle_object_datetime_add(Evas_Object *datetime, Eext_Circle_Surface *surf
 
    EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
 
-   _eext_circle_object_datetime_init(circle_obj, datetime);
+   if (!_eext_circle_object_datetime_init(circle_obj, datetime))
+     return NULL;
 
    return obj;
 }
-
-/**
- * FIXME(150420) : After deciding how to support current types to application developer, we will define these APIs' name and parameters.
- *
-EAPI Elm_Datetime_Field_Type
-eext_circle_object_datetime_selected_field_type_get(const Evas_Object *obj)
-{
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return 0;
-   EEXT_CIRCLE_OBJECT_DATETIME_DATA_GET(circle_obj, data) return 0;
-
-   return data->current_type;
-}
-
-EAPI void
-eext_circle_object_datetime_selected_field_type_set(Evas_Object *obj, Elm_Datetime_Field_Type type)
-{
-   Evas_Object *radio;
-
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
-   EEXT_CIRCLE_OBJECT_DATETIME_DATA_GET(circle_obj, data) return;
-
-   if (data->current_type == type) return;
-
-   radio = _eext_circle_object_datetime_selected_field_object_get(obj);
-   elm_radio_value_set(radio, type);
-   data->current_type = type;
-   _eext_circle_object_datetime_circle_update(circle_obj);
-}
-*/
index 1bb9e25ed4af0e8c09fec2fc4150024d4c8d4cdc..ead141f004edf039fba8a9a692cf4c1e20286577 100644 (file)
@@ -593,6 +593,15 @@ eext_circle_object_genlist_scroller_policy_set(Evas_Object *obj,
         _eext_circle_object_genlist_scrollbar_show(circle_obj,
                                                    VERTICAL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING);
      }
+   else
+     {
+        if (data->bar_hide_timer)
+          {
+             ecore_timer_del(data->bar_hide_timer);
+             data->bar_hide_timer = NULL;
+          }
+        _eext_circle_object_genlist_scrollbar_policy_hide_cb(circle_obj);
+     }
 }
 
 EAPI void
index a4930aae1af745704089c40069d30b8b718f496f..d139a15b11c9a7213672bba8b669037b4b66810a 100644 (file)
@@ -19,7 +19,6 @@
 #include "wearable/circle/efl_extension_circle_private.h"
 
 #define EEXT_CIRCLE_OBJECT_SPINNER_TYPE "Eext_Circle_Object_Spinner"
-#define SPINNER_ITEM_NAME "default"
 
 #define EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, data) \
    Eext_Circle_Object_Spinner_Data *data = NULL; \
       data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data; \
    if (!data)
 
-static const double MARK_HEIGHT = 23.0;
-static const double RADIUS = 168.5; //BG_HEIGHT / 2 - MARK_HEIGHT / 2;
-static const double MARK_RADIUS = 2.000317;
-// chord = 2 * radius * sin(x/2), x = arcsin(sin(x)), arcsin(x) = 1 / sqrt(1 - pow(x, 2))
-
-static const double END_EFFECT_ANGLE = 15.0;
-
-static const double ANIMATION_DURATION = 0.3;
-
-// ----------------------------------------- Accessibility API --------------------------------------//
-static void _accessibility_spinner_highlighted_cb(void *data, Evas_Object *obj, void *event_info);
-static void _accessibility_spinner_unhighlighted_cb(void *data, Evas_Object *obj, void *event_info);
-
-// ----------------------------------------- animation API --------------------------------------//
+static const char SIGNAL_ACTIVATED[] = "rotary,activated";
+static const char SIGNAL_DEACTIVATED[] = "rotary,deactivated";
 
 static void
-_eext_circle_object_spinner_mark_angle_offset_set(Eext_Circle_Object *obj, double angle)
-{
-   Eext_Circle_Object_Item *item;
-
-   item = _eext_circle_object_item_get(obj, SPINNER_ITEM_NAME);
-
-   _eext_circle_object_item_angle_offset_set(item, angle - (MARK_RADIUS / 2));
-   _eext_circle_object_item_angle_set(item, MARK_RADIUS);
-}
-
-static Eina_Bool
-_end_effect_expired_timer_cb(void *data)
+_eext_circle_object_spinner_activated_cb(void *data,
+                                         Evas_Object *obj EINA_UNUSED,
+                                         void *event_info EINA_UNUSED)
 {
    Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-   Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data;
-   Eext_Circle_Object_Item *item;
-
-   item = _eext_circle_object_item_get(circle_obj, SPINNER_ITEM_NAME);
-
-   _eext_circle_object_item_angle_transit_set(item, ANIMATION_DURATION,
-                                         MARK_RADIUS, widget_data->to_angle_offset - (MARK_RADIUS / 2),
-                                         EINA_TRUE,
-                                         0.25, 0.46,
-                                         0.45, 1.0);
-
-   widget_data->end_effect_expired_timer = NULL;
-
-   return ECORE_CALLBACK_CANCEL;
-}
-
-static void
-_eext_circle_object_spinner_mark_update(Eext_Circle_Object *obj, Eina_Bool animate)
-{
-   Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)obj->widget_data;
-
-   if (evas_object_visible_get(obj->widget_object) && animate)
-     {
-        Eext_Circle_Object_Item *item;
-
-        item = _eext_circle_object_item_get(obj, SPINNER_ITEM_NAME);
-
-        if (widget_data->end_effect_angle)
-          {
-             if (widget_data->end_effect_expired_timer) return;
-
-             _eext_circle_object_item_angle_transit_set(item, ANIMATION_DURATION,
-                                                   MARK_RADIUS, widget_data->to_angle_offset + widget_data->end_effect_angle - (MARK_RADIUS / 2),
-                                                   EINA_TRUE,
-                                                   0.25, 0.46,
-                                                   0.45, 1.0);
-
-             widget_data->end_effect_expired_timer = ecore_timer_add(ANIMATION_DURATION, _end_effect_expired_timer_cb, obj);
-          }
-        else
-          {
-             if (widget_data->end_effect_expired_timer)
-               {
-                  ecore_timer_del(widget_data->end_effect_expired_timer);
-                  widget_data->end_effect_expired_timer = NULL;
-               }
-
-             _eext_circle_object_item_angle_transit_set(item, ANIMATION_DURATION,
-                                                   MARK_RADIUS, widget_data->to_angle_offset - (MARK_RADIUS / 2),
-                                                   EINA_TRUE,
-                                                   0.25, 0.46,
-                                                   0.45, 1.0);
-          }
-     }
-   else
-     _eext_circle_object_spinner_mark_angle_offset_set(obj, widget_data->to_angle_offset);
-}
-
-static double
-_eext_circle_object_spinner_angle_get(Eext_Circle_Object *obj)
-{
-   Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)obj->widget_data;
-   double min, max, angle;
-
-   if (widget_data->angle) return widget_data->angle;
-
-   elm_spinner_min_max_get(obj->widget_object, &min, &max);
-
-   if (elm_spinner_wrap_get(obj->widget_object))
-     angle = 360 / (max - min + 1);
-   else
-     {
-        if (min == max)
-          angle = 0.0;
-        else
-          angle = 360 / (max - min);
-     }
-
-   return angle;
-}
-
-static double
-_eext_circle_object_spinner_angle_offset_get(Eext_Circle_Object *obj, double val)
-{
-   double min, angle_offset, real_part;
-
-   elm_spinner_min_max_get(obj->widget_object, &min, NULL);
-
-   angle_offset = (val - min) * _eext_circle_object_spinner_angle_get(obj);
-   real_part = angle_offset - (int)angle_offset;
-   angle_offset = (int)angle_offset % 360 + real_part;
+   EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, widget_data) return;
 
-   return angle_offset;
+   widget_data->spinner_activated = EINA_TRUE;
 }
 
 static void
-_eext_circle_object_spinner_update(Eext_Circle_Object *obj)
+_eext_circle_object_spinner_deactivated_cb(void *data,
+                                         Evas_Object *obj EINA_UNUSED,
+                                         void *event_info EINA_UNUSED)
 {
-   Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)obj->widget_data;
-   double val;
-
-   val = elm_spinner_value_get(obj->widget_object);
-
-   widget_data->to_angle_offset = _eext_circle_object_spinner_angle_offset_get(obj, val);
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+   EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, widget_data) return;
 
-   _eext_circle_object_spinner_mark_update(obj, EINA_FALSE);
+   widget_data->spinner_activated = EINA_FALSE;
 }
 
 static void
-_eext_circle_object_spinner_changed_cb(void *data, Evas_Object *obj, void *event_info)
+_eext_circle_object_spinner_genlist_activated_cb(void *data,
+                                         Evas_Object *obj EINA_UNUSED,
+                                         void *event_info EINA_UNUSED)
 {
    Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-   Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data;
+   EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, widget_data) return;
 
-   if (widget_data->rotary_event)
-     _eext_circle_object_spinner_mark_update(circle_obj, EINA_TRUE);
-   else
-     _eext_circle_object_spinner_update(circle_obj);
+   widget_data->genlist_activated = EINA_TRUE;
 }
 
 static void
-_eext_circle_object_spinner_focused_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+_eext_circle_object_spinner_genlist_deactivated_cb(void *data,
+                                         Evas_Object *obj EINA_UNUSED,
+                                         void *event_info EINA_UNUSED)
 {
-   Evas_Object *text_button;
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+   EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, widget_data) return;
 
-   text_button = elm_object_part_content_get(obj, "elm.swallow.text_button");
-   elm_layout_signal_emit(text_button, "elm,state,selected", "elm");
+   widget_data->genlist_activated = EINA_FALSE;
 }
 
 static void
-_eext_circle_object_spinner_unfocused_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+_spinner_genlist_hide_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
 {
-   Evas_Object *text_button;
-
-   text_button = elm_object_part_content_get(obj, "elm.swallow.text_button");
-   elm_layout_signal_emit(text_button, "elm,state,unselected", "elm");
-}
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+   EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, widget_data) return;
 
-static double
-_looping_angle_distance_get(double from_angle_offset, double to_angle_offset, Eina_Bool value_up)
-{
-   double angle_distance = 0;
+   if (!widget_data->circle_genlist) return;
 
-   if (value_up)
-     {
-        if (from_angle_offset > to_angle_offset)
-          angle_distance = 360 - from_angle_offset + to_angle_offset;
-        else if  (from_angle_offset < to_angle_offset)
-          angle_distance = to_angle_offset - from_angle_offset;
-     }
-   else
-     {
-        if (from_angle_offset > to_angle_offset)
-          angle_distance = from_angle_offset - to_angle_offset;
-        else if  (from_angle_offset < to_angle_offset)
-          angle_distance = from_angle_offset + 360 - to_angle_offset;
-     }
+   widget_data->genlist_visible = EINA_FALSE;
 
-   return angle_distance;
+   if (widget_data->genlist_activated) eext_rotary_object_event_activated_set(circle_obj->widget_object, EINA_TRUE);
 }
 
 static void
-_eext_circle_object_spinner_value_update(Eext_Circle_Object *obj, Eina_Bool value_up)
-{
-   Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)obj->widget_data;
-   double val, step, min, max;
-
-   val = elm_spinner_value_get(obj->widget_object);
-
-   step = elm_spinner_step_get(obj->widget_object);
-   elm_spinner_min_max_get(obj->widget_object, &min, &max);
-
-   widget_data->end_effect_angle = 0.0;
-
-   if (elm_spinner_wrap_get(obj->widget_object))
-     {
-        if (value_up)
-          {
-             if (val + step > max)
-               {
-                  widget_data->to_angle_offset += _looping_angle_distance_get(
-                    _eext_circle_object_spinner_angle_offset_get(obj, max),
-                    _eext_circle_object_spinner_angle_offset_get(obj, min),
-                    value_up);
-                  val = min;
-               }
-             else
-               {
-                  widget_data->to_angle_offset += _eext_circle_object_spinner_angle_get(obj) * step;
-                  val += step;
-               }
-          }
-        else
-          {
-             if (val - step < min)
-               {
-                  widget_data->to_angle_offset -= _looping_angle_distance_get(
-                    _eext_circle_object_spinner_angle_offset_get(obj, min),
-                    _eext_circle_object_spinner_angle_offset_get(obj, max),
-                    value_up);
-                  val = max;
-               }
-             else
-               {
-                  widget_data->to_angle_offset -= _eext_circle_object_spinner_angle_get(obj) * step;
-                  val -= step;
-               }
-          }
-     }
-   else
-     {
-        if (value_up)
-          {
-             if (val + step > max)
-               {
-                  if (val == max)
-                    widget_data->end_effect_angle = END_EFFECT_ANGLE;
-                  else
-                    widget_data->to_angle_offset += widget_data->angle * (max - val);
-               }
-             else
-               widget_data->to_angle_offset += _eext_circle_object_spinner_angle_get(obj) * step;
-
-             val += step;
-          }
-        else
-          {
-             if (val - step < min)
-               {
-                  if (val == min)
-                    widget_data->end_effect_angle = -END_EFFECT_ANGLE;
-                  else
-                    widget_data->to_angle_offset -= widget_data->angle * (val - min);
-               }
-             else
-               widget_data->to_angle_offset -= _eext_circle_object_spinner_angle_get(obj) * step;
-
-             val -= step;
-          }
-     }
-
-   widget_data->rotary_event = EINA_TRUE;
-   elm_spinner_value_set(obj->widget_object, val);
-   widget_data->rotary_event = EINA_FALSE;
-}
-
-static Eina_Bool
-_rotary_timer_cb(void *data)
+_spinner_genlist_show_cb(void *data, Evas_Object *obj, void *event_info EINA_UNUSED)
 {
    Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-   Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data;
-   Eext_Circle_Object_Item *item;
-   Evas_Object *btn;
-   double angle_offset_diff;
-
-   btn = elm_object_part_content_get(circle_obj->widget_object, "elm.swallow.text_button");
+   EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, widget_data) return;
 
-   if (!evas_object_focus_get(btn)) return ECORE_CALLBACK_CANCEL;
+   Evas_Object *genlist = NULL;
 
-   item = _eext_circle_object_item_get(circle_obj, SPINNER_ITEM_NAME);
-   if (!item) return ECORE_CALLBACK_CANCEL;
+   if (!widget_data->circle_genlist)
+     {
+        genlist = elm_object_part_content_get(obj, "elm.swallow.genlist");
 
-   angle_offset_diff = fabs(_eext_circle_object_item_angle_offset_get(item)
-                       - item->draw.angle_offset);
+        widget_data->genlist = genlist;
+        widget_data->circle_genlist = eext_circle_object_genlist_add(widget_data->genlist, circle_obj->surface);
 
-   if (angle_offset_diff <= 1.0e-8)
-     elm_layout_signal_emit(elm_object_part_content_get(circle_obj->widget_object, "elm.swallow.text_button"),
-         "elm,state,rotary,inactive", "eext");
+        eext_circle_object_genlist_scroller_policy_set(widget_data->circle_genlist, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
 
-   widget_data->rotary_timer = NULL;
+        evas_object_smart_callback_add(widget_data->genlist, "hide", _spinner_genlist_hide_cb, circle_obj);
+        evas_object_smart_callback_add(widget_data->circle_genlist, SIGNAL_ACTIVATED, _eext_circle_object_spinner_genlist_activated_cb, circle_obj);
+        evas_object_smart_callback_add(widget_data->circle_genlist, SIGNAL_DEACTIVATED, _eext_circle_object_spinner_genlist_deactivated_cb, circle_obj);
+     }
 
-   return ECORE_CALLBACK_CANCEL;
+   widget_data->genlist_visible = EINA_TRUE;
+   if (widget_data->spinner_activated) eext_rotary_object_event_activated_set(widget_data->circle_genlist, EINA_TRUE);
 }
 
 static Eina_Bool
-_rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info)
+_rotary_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, Eext_Rotary_Event_Info *info EINA_UNUSED)
 {
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+   Eext_Circle_Object *circle_obj = data;
    Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data;
-
-   if (circle_obj->is_propagated)
-     {
-        circle_obj->is_propagated = EINA_FALSE;
-
-        return EINA_TRUE;
-     }
-
-   if (elm_atspi_bridge_utils_is_screen_reader_enabled())
-     {
-        if (!widget_data->a11y_highlighted)
-          return EINA_TRUE;
-     }
-
-   if (obj == circle_obj->main_obj)
-     circle_obj->is_propagated = EINA_TRUE;
-
-   elm_layout_signal_emit(elm_object_part_content_get(circle_obj->widget_object, "elm.swallow.text_button"),
-       "elm,state,rotary,active", "eext");
-
-   if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
-     _eext_circle_object_spinner_value_update(circle_obj, EINA_TRUE);
-   else
-     _eext_circle_object_spinner_value_update(circle_obj, EINA_FALSE);
-
-   if (widget_data->rotary_timer)
+   if (!widget_data->genlist_visible)
      {
-        ecore_timer_del(widget_data->rotary_timer);
-        widget_data->rotary_timer = NULL;
-     }
-
-   widget_data->rotary_timer = ecore_timer_add(1.0, _rotary_timer_cb, circle_obj);
-
-   /* Accessibility */
-   if (elm_atspi_bridge_utils_is_screen_reader_enabled())
-     {
-        double val;
-        char buf[255];
-        const char *buf_val = NULL;
-        Evas_Object *btn = elm_object_part_content_get(circle_obj->widget_object, "elm.swallow.text_button");
-        val = elm_spinner_value_get(circle_obj->widget_object);
-        buf_val = elm_layout_text_get(btn, "elm.text");
-        if(buf_val)
-           snprintf(buf, sizeof(buf), "%s",buf_val);
-        else
-           snprintf(buf, sizeof(buf), "%.0f",val);
-        elm_atspi_bridge_utils_say((const char*)buf, EINA_TRUE, NULL, NULL);
+        widget_data->genlist_visible = EINA_TRUE;
+        elm_layout_signal_emit(circle_obj->widget_object, "elm,action,genlist,toggle", "elm");
      }
    return EINA_TRUE;
 }
@@ -391,110 +129,59 @@ _rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info)
 static void
 _eext_circle_object_spinner_del_cb(Eext_Circle_Object *obj)
 {
-   if (!obj) return;
-
-   if (obj->widget_data)
-     {
-        Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)obj->widget_data;
-        // for accessibility
-        Evas_Object *btn = elm_object_part_content_get(obj->widget_object, "elm.swallow.text_button");
-        evas_object_smart_callback_del(btn, "atspi,highlighted", _accessibility_spinner_highlighted_cb);
-        evas_object_smart_callback_del(btn, "atspi,unhighlighted", _accessibility_spinner_unhighlighted_cb);
-        //
-        if (widget_data->end_effect_expired_timer)
-          {
-             ecore_timer_del(widget_data->end_effect_expired_timer);
-             widget_data->end_effect_expired_timer = NULL;
-          }
-
-        if (widget_data->rotary_timer)
-          {
-             ecore_timer_del(widget_data->rotary_timer);
-             widget_data->rotary_timer = NULL;
-          }
+   if (!obj)
+     return;
 
-        free(obj->widget_data);
-        obj->widget_data = NULL;
-     }
+   EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(obj, widget_data) return;
 
-   eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb);
-   eext_rotary_object_event_callback_del(obj->main_obj, _rotary_changed_cb);
-}
+   evas_object_smart_callback_del_full(obj->widget_object, SIGNAL_ACTIVATED, _eext_circle_object_spinner_activated_cb, obj);
+   evas_object_smart_callback_del_full(obj->main_obj, SIGNAL_ACTIVATED, _eext_circle_object_spinner_activated_cb, obj);
+   evas_object_smart_callback_del_full(obj->widget_object, SIGNAL_DEACTIVATED, _eext_circle_object_spinner_deactivated_cb, obj);
+   evas_object_smart_callback_del_full(obj->main_obj, SIGNAL_DEACTIVATED, _eext_circle_object_spinner_deactivated_cb, obj);
 
-static void
-_eext_circle_object_spinner_disabled_cb(Eext_Circle_Object *obj)
-{
-   if (obj->disabled)
+   if (widget_data->circle_genlist)
      {
-        eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb);
-        eext_rotary_object_event_callback_del(obj->main_obj, _rotary_changed_cb);
+        evas_object_smart_callback_del_full(widget_data->circle_genlist, SIGNAL_ACTIVATED, _eext_circle_object_spinner_genlist_activated_cb, obj);
+        evas_object_smart_callback_del_full(widget_data->circle_genlist, SIGNAL_DEACTIVATED, _eext_circle_object_spinner_genlist_deactivated_cb, obj);
      }
-   else
+
+   if (obj->widget_data)
      {
-        eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
-        eext_rotary_object_event_callback_add(obj->main_obj, _rotary_changed_cb, obj);
+        free(obj->widget_data);
+        obj->widget_data = NULL;
      }
 }
 
-static void
-_efl_ui_range_changed_cb(void *data EINA_UNUSED, const Efl_Event *ev)
-{
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-   Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data;
-
-   if (widget_data->rotary_event)
-     _eext_circle_object_spinner_mark_update(circle_obj, EINA_TRUE);
-   else
-     _eext_circle_object_spinner_update(circle_obj);
-}
-
 static void
 _eext_circle_object_spinner_init(Eext_Circle_Object *obj, Evas_Object *spinner)
 {
    Eext_Circle_Object_Spinner_Data *data;
-   Eext_Circle_Object_Item *item;
 
    obj->widget_object = spinner;
    obj->widget_type = EEXT_CIRCLE_OBJECT_SPINNER_TYPE;
    obj->del_func = _eext_circle_object_spinner_del_cb;
-   obj->disabled_func = _eext_circle_object_spinner_disabled_cb;
-   //C# FIXME: If activate is true, efl ui spinner is not shown
-   //obj->visible_on_activate = EINA_TRUE;
-
+   obj->disabled_func = NULL;
+   obj->visible_on_activate = EINA_TRUE;
    data = (Eext_Circle_Object_Spinner_Data *)calloc(1, sizeof(Eext_Circle_Object_Spinner_Data));
-   obj->widget_data = (void *)data;
-
-   item = _eext_circle_object_item_new();
-   _eext_circle_object_item_name_set(item, SPINNER_ITEM_NAME);
-   _eext_circle_object_item_color_set(item, 250, 125, 47, 255);
-   _eext_circle_object_item_radius_set(item, RADIUS);
-   _eext_circle_object_item_line_width_set(item, MARK_HEIGHT);
-   _eext_circle_object_item_angle_offset_set(item, item->angle_offset - (MARK_RADIUS / 2));
-   _eext_circle_object_item_angle_set(item, MARK_RADIUS);
-   _eext_circle_object_item_append(obj, item);
-
-   elm_spinner_editable_set(spinner, EINA_FALSE);
-
-   if (strstr(efl_class_name_get(spinner), "CircleSpinner") != NULL)
-     {
-        efl_event_callback_add(spinner, EFL_UI_RANGE_EVENT_CHANGED, _efl_ui_range_changed_cb, obj);
-        //C# FIXME: consider focus / unfocus
-     }
-   else
+   if (!data)
      {
-        evas_object_smart_callback_add(spinner, "changed", _eext_circle_object_spinner_changed_cb, obj);
-        evas_object_smart_callback_add(spinner, "focused", _eext_circle_object_spinner_focused_cb, NULL);
-        evas_object_smart_callback_add(spinner, "unfocused", _eext_circle_object_spinner_unfocused_cb, NULL);
-
+        ERR("Could not allocate memory for Eext_Circle_Object_Spinner_Data!");
+        return;
      }
 
-   //for accessibility
-   evas_object_smart_callback_add(elm_object_part_content_get(obj->widget_object, "elm.swallow.text_button"), "atspi,highlighted", _accessibility_spinner_highlighted_cb, obj);
-   evas_object_smart_callback_add(elm_object_part_content_get(obj->widget_object, "elm.swallow.text_button"), "atspi,unhighlighted", _accessibility_spinner_unhighlighted_cb, obj);
-   //
+   obj->widget_data = (void *)data;
+   data->genlist_visible = EINA_FALSE;
+   data->spinner_activated = EINA_FALSE;
+   data->genlist_activated = EINA_FALSE;
+   evas_object_smart_callback_add(spinner, "list,show", _spinner_genlist_show_cb, obj);
 
    eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
    eext_rotary_object_event_callback_add(obj->main_obj, _rotary_changed_cb, obj);
+
+   evas_object_smart_callback_add(obj->widget_object, SIGNAL_ACTIVATED, _eext_circle_object_spinner_activated_cb, obj);
+   evas_object_smart_callback_add(obj->main_obj, SIGNAL_ACTIVATED, _eext_circle_object_spinner_activated_cb, obj);
+   evas_object_smart_callback_add(obj->widget_object, SIGNAL_DEACTIVATED, _eext_circle_object_spinner_deactivated_cb, obj);
+   evas_object_smart_callback_add(obj->main_obj, SIGNAL_DEACTIVATED, _eext_circle_object_spinner_deactivated_cb, obj);
 }
 
 EAPI Evas_Object *
@@ -516,76 +203,4 @@ eext_circle_object_spinner_add(Evas_Object *spinner, Eext_Circle_Surface *surfac
 EAPI void
 eext_circle_object_spinner_angle_set(Evas_Object *obj, double angle)
 {
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
-   EEXT_CIRCLE_OBJECT_SPINNER_DATA_GET(circle_obj, widget_data) return;
-
-   if ((angle <= 0) || (widget_data->angle == angle)) return;
-
-   widget_data->angle = angle;
-}
-static char *
-_accessible_description_cb(void *data, Evas_Object *obj)
-{
-   Eext_Circle_Object *circle_obj = data;
-   double val;
-   char buf_desc[255];
-   char buf[255];
-   const char *buf_val = NULL;
-   const char *buf_unit = NULL;
-   const char *format;
-   int ret = 0;
-
-   Evas_Object *btn = elm_object_part_content_get(circle_obj->widget_object, "elm.swallow.text_button");
-
-   val = elm_spinner_value_get(circle_obj->widget_object);
-   buf_unit = elm_object_part_text_get(circle_obj->widget_object, "elm.text");
-   buf_val = elm_layout_text_get(btn, "elm.text");
-
-   bindtextdomain (PACKAGE, LOCALE_DIR);
-   if(buf_unit)
-     {
-        format = _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_ADJUST_PS");
-        snprintf(buf_desc, sizeof(buf_desc), format, buf_unit);
-        if(buf_val)
-           ret = snprintf(buf, sizeof(buf), "%s %s %s",buf_val, buf_unit, buf_desc);
-        else
-           ret = snprintf(buf, sizeof(buf), "%.0f %s %s",val, buf_unit, buf_desc);
-     }
-   else
-     {
-        format = _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_ADJUST_PS");
-        snprintf(buf_desc, sizeof(buf_desc), format, "");
-        if(buf_val)
-           ret = snprintf(buf, sizeof(buf), "%s %s",buf_val, buf_desc);
-        else
-           ret = snprintf(buf, sizeof(buf), "%.0f %s",val, buf_desc);
-     }
-
-   if (ret < 0)
-     WRN("text are truncated (%s)", buf);
-
-   return strdup(buf);
-}
-static void
-_accessibility_spinner_highlighted_cb(void *data, Evas_Object *obj, void *event_info)
-{
-   Eext_Circle_Object *circle_obj = data;
-   Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data;
-   Evas_Object *btn = elm_object_part_content_get(circle_obj->widget_object, "elm.swallow.text_button");
-
-   /* TODO: Reading information should be changed with UX team */
-   elm_atspi_accessible_description_cb_set(btn, _accessible_description_cb, circle_obj);
-   elm_atspi_accessible_reading_info_type_set(btn, ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
-
-   elm_object_focus_set(circle_obj->widget_object, EINA_TRUE);
-   widget_data->a11y_highlighted = EINA_TRUE;
-}
-static void
-_accessibility_spinner_unhighlighted_cb(void *data, Evas_Object *obj, void *event_info)
-{
-   Eext_Circle_Object *circle_obj = data;
-   Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data;
-
-   elm_object_focus_set(circle_obj->widget_object, EINA_FALSE);
-   widget_data->a11y_highlighted = EINA_FALSE;
 }