refactor directory structure 84/103684/9
authorSungtaek Hong <sth253.hong@samsung.com>
Fri, 9 Dec 2016 06:45:54 +0000 (15:45 +0900)
committerGeunsik Lim <geunsik.lim@samsung.com>
Mon, 19 Dec 2016 13:00:25 +0000 (05:00 -0800)
Change-Id: I733ecc07db051c8a4807d7234571bb6e22290f31
Signed-off-by: Sungtaek Hong <sth253.hong@samsung.com>
133 files changed:
common/CMakeLists.txt [deleted file]
common/src/CMakeLists.txt [deleted file]
common/src/include/CMakeLists.txt [deleted file]
common/src/include/efl_extension.h.in [deleted file]
common/src/include/efl_extension_events.h [deleted file]
common/src/include/efl_extension_private.h [deleted file]
common/src/lib/CMakeLists.txt [deleted file]
common/src/lib/eext_events.c [deleted file]
common/src/lib/efl_extension.c [deleted file]
data/mobile/HD-inc.edc [new file with mode: 0644]
data/mobile/efl-extension.edc.in [new file with mode: 0644]
data/mobile/groups/floatingbutton.edc [new file with mode: 0644]
data/mobile/images/date_picker_day_28_bg.png [new file with mode: 0755]
data/mobile/images/date_picker_day_29_bg.png [new file with mode: 0755]
data/mobile/images/date_picker_day_30_bg.png [new file with mode: 0755]
data/mobile/images/date_picker_day_31_bg.png [new file with mode: 0755]
data/mobile/images/date_picker_month_bg.png [new file with mode: 0755]
data/mobile/images/date_picker_year_bg.png [new file with mode: 0755]
data/mobile/images/time_picker_bg.png [new file with mode: 0755]
data/wearable/images/date_picker_day_28_bg.png [new file with mode: 0755]
data/wearable/images/date_picker_day_29_bg.png [new file with mode: 0755]
data/wearable/images/date_picker_day_30_bg.png [new file with mode: 0755]
data/wearable/images/date_picker_day_31_bg.png [new file with mode: 0755]
data/wearable/images/date_picker_month_bg.png [new file with mode: 0755]
data/wearable/images/date_picker_year_bg.png [new file with mode: 0755]
data/wearable/images/time_picker_bg.png [new file with mode: 0755]
inc/efl_extension.h.in [new file with mode: 0644]
inc/efl_extension_events.h [new file with mode: 0644]
inc/efl_extension_private.h [new file with mode: 0644]
inc/mobile/eext_floatingbutton.h [new file with mode: 0644]
inc/mobile/eext_floatingbutton_common.h [new file with mode: 0644]
inc/mobile/eext_floatingbutton_eo.h [new file with mode: 0644]
inc/mobile/eext_floatingbutton_legacy.h [new file with mode: 0644]
inc/wearable/circle/efl_extension_circle_object.h [new file with mode: 0644]
inc/wearable/circle/efl_extension_circle_object_datetime.h [new file with mode: 0644]
inc/wearable/circle/efl_extension_circle_object_genlist.h [new file with mode: 0644]
inc/wearable/circle/efl_extension_circle_object_progressbar.h [new file with mode: 0644]
inc/wearable/circle/efl_extension_circle_object_scroller.h [new file with mode: 0644]
inc/wearable/circle/efl_extension_circle_object_slider.h [new file with mode: 0644]
inc/wearable/circle/efl_extension_circle_object_spinner.h [new file with mode: 0644]
inc/wearable/circle/efl_extension_circle_private.h [new file with mode: 0644]
inc/wearable/circle/efl_extension_circle_surface.h [new file with mode: 0644]
inc/wearable/circle/efl_extension_rotary.h [new file with mode: 0644]
inc/wearable/common/efl_extension_common.h [new file with mode: 0644]
inc/wearable/common/efl_extension_common_private.h [new file with mode: 0644]
inc/wearable/common/efl_extension_index_layout.h [new file with mode: 0644]
inc/wearable/common/efl_extension_more_option.h [new file with mode: 0644]
inc/wearable/common/efl_extension_rotary_selector.h [new file with mode: 0644]
inc/wearable/efl_extension.h.in [new file with mode: 0644]
inc/wearable/efl_extension_events.h [new file with mode: 0644]
inc/wearable/efl_extension_private.h [new file with mode: 0644]
mobile/CMakeLists.txt [deleted file]
mobile/data/CMakeLists.txt [deleted file]
mobile/data/HD-inc.edc [deleted file]
mobile/data/efl-extension.edc.in [deleted file]
mobile/data/groups/floatingbutton.edc [deleted file]
mobile/data/images/date_picker_day_28_bg.png [deleted file]
mobile/data/images/date_picker_day_29_bg.png [deleted file]
mobile/data/images/date_picker_day_30_bg.png [deleted file]
mobile/data/images/date_picker_day_31_bg.png [deleted file]
mobile/data/images/date_picker_month_bg.png [deleted file]
mobile/data/images/date_picker_year_bg.png [deleted file]
mobile/data/images/time_picker_bg.png [deleted file]
mobile/src/CMakeLists.txt [deleted file]
mobile/src/include/CMakeLists.txt [deleted file]
mobile/src/include/eext_floatingbutton.h [deleted file]
mobile/src/include/eext_floatingbutton_common.h [deleted file]
mobile/src/include/eext_floatingbutton_eo.h [deleted file]
mobile/src/include/eext_floatingbutton_legacy.h [deleted file]
mobile/src/lib/CMakeLists.txt [deleted file]
mobile/src/lib/eext_floatingbutton.c [deleted file]
mobile/src/lib/eext_floatingbutton.eo [deleted file]
src/eext_events.c [new file with mode: 0644]
src/efl_extension.c [new file with mode: 0644]
src/mobile/CMakeLists.txt [new file with mode: 0644]
src/mobile/eext_floatingbutton.c [new file with mode: 0644]
src/mobile/eext_floatingbutton.eo [new file with mode: 0644]
src/wearable/circle/efl_extension_circle_object.c [new file with mode: 0644]
src/wearable/circle/efl_extension_circle_object_datetime.c [new file with mode: 0644]
src/wearable/circle/efl_extension_circle_object_genlist.c [new file with mode: 0644]
src/wearable/circle/efl_extension_circle_object_item.c [new file with mode: 0644]
src/wearable/circle/efl_extension_circle_object_progressbar.c [new file with mode: 0644]
src/wearable/circle/efl_extension_circle_object_scroller.c [new file with mode: 0644]
src/wearable/circle/efl_extension_circle_object_slider.c [new file with mode: 0644]
src/wearable/circle/efl_extension_circle_object_spinner.c [new file with mode: 0644]
src/wearable/circle/efl_extension_circle_surface.c [new file with mode: 0644]
src/wearable/circle/efl_extension_rotary.c [new file with mode: 0644]
src/wearable/efl_extension.c [new file with mode: 0644]
src/wearable/efl_extension_events.c [new file with mode: 0644]
src/wearable/efl_extension_more_option.c [new file with mode: 0644]
src/wearable/efl_extension_rotary_selector.c [new file with mode: 0644]
wearable/data/images/date_picker_day_28_bg.png [deleted file]
wearable/data/images/date_picker_day_29_bg.png [deleted file]
wearable/data/images/date_picker_day_30_bg.png [deleted file]
wearable/data/images/date_picker_day_31_bg.png [deleted file]
wearable/data/images/date_picker_month_bg.png [deleted file]
wearable/data/images/date_picker_year_bg.png [deleted file]
wearable/data/images/time_picker_bg.png [deleted file]
wearable/src/CMakeLists.txt [deleted file]
wearable/src/include/CMakeLists.txt [deleted file]
wearable/src/include/circle/efl_extension_circle_object.h [deleted file]
wearable/src/include/circle/efl_extension_circle_object_datetime.h [deleted file]
wearable/src/include/circle/efl_extension_circle_object_genlist.h [deleted file]
wearable/src/include/circle/efl_extension_circle_object_progressbar.h [deleted file]
wearable/src/include/circle/efl_extension_circle_object_scroller.h [deleted file]
wearable/src/include/circle/efl_extension_circle_object_slider.h [deleted file]
wearable/src/include/circle/efl_extension_circle_object_spinner.h [deleted file]
wearable/src/include/circle/efl_extension_circle_private.h [deleted file]
wearable/src/include/circle/efl_extension_circle_surface.h [deleted file]
wearable/src/include/circle/efl_extension_rotary.h [deleted file]
wearable/src/include/common/efl_extension_common.h [deleted file]
wearable/src/include/common/efl_extension_common_private.h [deleted file]
wearable/src/include/common/efl_extension_index_layout.h [deleted file]
wearable/src/include/common/efl_extension_more_option.h [deleted file]
wearable/src/include/common/efl_extension_rotary_selector.h [deleted file]
wearable/src/include/efl_extension.h.in [deleted file]
wearable/src/include/efl_extension_events.h [deleted file]
wearable/src/include/efl_extension_private.h [deleted file]
wearable/src/lib/CMakeLists.txt [deleted file]
wearable/src/lib/circle/efl_extension_circle_object.c [deleted file]
wearable/src/lib/circle/efl_extension_circle_object_datetime.c [deleted file]
wearable/src/lib/circle/efl_extension_circle_object_genlist.c [deleted file]
wearable/src/lib/circle/efl_extension_circle_object_item.c [deleted file]
wearable/src/lib/circle/efl_extension_circle_object_progressbar.c [deleted file]
wearable/src/lib/circle/efl_extension_circle_object_scroller.c [deleted file]
wearable/src/lib/circle/efl_extension_circle_object_slider.c [deleted file]
wearable/src/lib/circle/efl_extension_circle_object_spinner.c [deleted file]
wearable/src/lib/circle/efl_extension_circle_surface.c [deleted file]
wearable/src/lib/circle/efl_extension_rotary.c [deleted file]
wearable/src/lib/common/efl_extension_more_option.c [deleted file]
wearable/src/lib/common/efl_extension_rotary_selector.c [deleted file]
wearable/src/lib/efl_extension.c [deleted file]
wearable/src/lib/efl_extension_events.c [deleted file]

diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt
deleted file mode 100644 (file)
index 4b7537b..0000000
+++ /dev/null
@@ -1 +0,0 @@
-ADD_SUBDIRECTORY(src)
diff --git a/common/src/CMakeLists.txt b/common/src/CMakeLists.txt
deleted file mode 100644 (file)
index 542d457..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-ADD_SUBDIRECTORY(include)
-ADD_SUBDIRECTORY(lib)
diff --git a/common/src/include/CMakeLists.txt b/common/src/include/CMakeLists.txt
deleted file mode 100644 (file)
index a058bdb..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-SET(HEADER_FILES
-       efl_extension_events.h
-       )
-
-SET(COMMON_HEADERS
-       ${HEADER_FILES}
-       CACHE
-       INTERNAL
-       "COMMON_HEADERS"
-       )
-
-FOREACH(files ${HEADER_FILES})
-       GET_FILENAME_COMPONENT(dir ${files} PATH)
-       INSTALL(FILES ${files} DESTINATION include/${LIB_NAME}/${dir})
-ENDFOREACH()
diff --git a/common/src/include/efl_extension.h.in b/common/src/include/efl_extension.h.in
deleted file mode 100644 (file)
index a060aa2..0000000
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __EFL_EXTENSION_H__
-#define __EFL_EXTENSION_H__
-
-#ifdef EAPI
-# undef EAPI
-#endif
-
-#ifdef _WIN32
-# ifdef EFL_EXTENSION_BUILD
-#  ifdef DLL_EXPORT
-#   define EAPI __declspec(dllexport)
-#  else
-#   define EAPI
-#  endif /* ! DLL_EXPORT */
-# else
-#  define EAPI __declspec(dllimport)
-# endif /* ! EFL_EXTENSION_BUILD */
-#else
-# ifdef __GNUC__
-#  if __GNUC__ >= 4
-#   define EAPI __attribute__ ((visibility("default")))
-#  else
-#   define EAPI
-#  endif
-# else
-#  define EAPI
-# endif
-#endif /* ! _WIN32 */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-@HEADER_INCS@
-
-/**
- * @defgroup EFL_EXTENSION_HARDWARE_KEYEVENT_GROUP Efl Extension Hardware Keyevent
- * @ingroup CAPI_EFL_EXTENSION_MODULE
- * @brief This group provides functionalities to grab hardware key events.
- * @since_tizen 2.4
- *
- * @{
- */
-
-/**
- * @brief Set the keygrab of the Elm_Win object
- *
- * @details This API returns the sucessness of keygrab_set.
- *          Key callback is only called when the window located in topmost(top of the window stack).
- *
- * @param[in] obj object to set the keygrab
- *            The widget type of this object should be elm_win
- * @param[in] key keyname string to set keygrab
- *
- * @return    The result of keygrab set
- *
- * @since_tizen 2.4
- */
-EAPI Eina_Bool eext_win_keygrab_set(Elm_Win *obj, const char *key);
-
-/**
- * @brief Unset the keygrab of the Elm_Win object
- *
- * @details This API returns the sucessness of keygrab_unset.
- *
- * @param[in] obj object to unset the keygrab
- *            The widget type of this object should be elm_win
- * @param[in] key keyname string to unset keygrab
- *
- * @return    The result of keygrab unset
- *
- * @since_tizen 2.4
- */
-EAPI Eina_Bool eext_win_keygrab_unset(Elm_Win *obj, const char *key);
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_H__ */
-
diff --git a/common/src/include/efl_extension_events.h b/common/src/include/efl_extension_events.h
deleted file mode 100644 (file)
index 7fc995a..0000000
+++ /dev/null
@@ -1,364 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __EFL_EXTENSION_EVENTS_H__
-#define __EFL_EXTENSION_EVENTS_H__
-
-#include <Elementary.h>
-
-#ifdef EAPI
-# undef EAPI
-#endif
-
-#ifdef _WIN32
-# ifdef EFL_EXTENSION_BUILD
-#  ifdef DLL_EXPORT
-#   define EAPI __declspec(dllexport)
-#  else
-#   define EAPI
-#  endif /* ! DLL_EXPORT */
-# else
-#  define EAPI __declspec(dllimport)
-# endif /* ! EFL_EXTENSION_BUILD */
-#else
-# ifdef __GNUC__
-#  if __GNUC__ >= 4
-#   define EAPI __attribute__ ((visibility("default")))
-#  else
-#   define EAPI
-#  endif
-# else
-#  define EAPI
-# endif
-#endif /* ! _WIN32 */
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup EFL_EXTENSION_EVENTS_GROUP Efl Extension Event
- * @ingroup CAPI_EFL_EXTENSION_MODULE
- * @brief This module provides functionalities to handle back/send key events.
- * @since_tizen 2.3
- *
- * @{
- */
-
-/**
- * @brief Convenient macro function that sends back key events to the popup
- *        to be removed.
- *
- * @details Popup will be removed when it has the back key event with
- *          eext_object_event_callback_add()
- *
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information
- *
- * @see   eext_object_event_callback_add()
- * @if MOBILE @since_tizen 2.3
- * @elseif TV @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_popup_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
-   evas_object_del(obj);
-}
-
-/**
- * @brief Convenient macro function that sends back key events to the ctxpopup
- *        to be dismissed.
- *
- * @details Ctxpopup will be dismissed when it has the back key event with
- *          eext_object_event_callback_add()
- *
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information
- *
- * @see   eext_object_event_callback_add()
- * @if MOBILE @since_tizen 2.3
- * @elseif TV @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_ctxpopup_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
-   elm_ctxpopup_dismiss(obj);
-}
-
-/**
- * @brief Convenient macro function that sends more key events to the naviframe
- *        top item.
- *
- * @details More key action of naviframe will be executed when naviframe has the
- *          more key event with eext_object_event_callback_add()
- *
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information
- *
- * @see   eext_object_event_callback_add()
- * @if MOBILE @since_tizen 2.3
- * @elseif TV @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_naviframe_more_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
-   Elm_Object_Item *top = elm_naviframe_top_item_get(obj);
-   if (!top) return;
-   Evas_Object *more_btn = elm_object_item_part_content_get(top,
-                                                            "toolbar_more_btn");
-   if (more_btn)
-     evas_object_smart_callback_call(more_btn, "clicked", NULL);
-   else
-     elm_object_item_signal_emit(top, "elm,action,more_event", "");
-}
-
-/**
- * @brief Convenient macro function that pop the naviframe item.
- *
- * @details Naviframe will be popped when naviframe has the back key event
- *          with eext_object_event_callback_add()
- *
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information
- *
- * @see   eext_object_event_callback_add()
- * @if MOBILE @since_tizen 2.3
- * @elseif TV @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_naviframe_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
-   elm_naviframe_item_pop(obj);
-}
-
-/**
- * Identifier of callbacks to be set for Ea events.
- *
- * @see eext_object_event_callback_add()
- * @see eext_object_event_callback_del()
- * @if MOBILE @since_tizen 2.3
- * @elseif TV @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-typedef enum _Eext_Callback_Type
-{
-   EEXT_CALLBACK_BACK,    /**< H/W Back Key Event */
-   EEXT_CALLBACK_MORE,    /**< H/W More Key Event */
-   EEXT_CALLBACK_LAST     /**< Reserved value. Acutally This is not matched to
-                            any meaningful behavior. */
-} Eext_Callback_Type;
-
-/**
- * @brief Ea event callback function signature.
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information (if the event passes an additional in
-              formation.)
- * @see eext_object_event_callback_add()
- * @if MOBILE @since_tizen 2.3
- * @elseif TV @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-typedef void (*Eext_Event_Cb)(void *data, Evas_Object *obj, void *event_info);
-
-/**
- * @brief Delete a callback function from an object.
- *
- * @details This function removes the most recently added callback from the
- *          object @p obj which was triggered by the type @p type and
- *          was calling the function @p func when triggered. If the removal is
- *          successful it will also return the data pointer that was passed to
- *          eext_object_event_callback_add() when the callback was added to
- *          the object. If not successful @c NULl will be returned.
- *
- * @param[in] obj Object to remove a callback from.
- * @param[in] type The type of event that was triggering the callback.
- * @param[in] func The function that was to be called when the event was
- *            triggered
- * @return    data The data pointer that was to be passed to the callback.
- *
- * @see eext_object_event_callback_add()
- * @if MOBILE @since_tizen 2.3
- * @elseif TV @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void *eext_object_event_callback_del(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func);
-
-/**
- * @brief Add (register) a callback function to a given evas object.
- *
- * @details This function adds a function callback to an object when the key
- *          event occurs on object @p obj. The key event on the object is only
- *          triggered when the object is the most top in objects stack and
- *          visible. This means, like the naviframe widget, if your application
- *          needs to have the events based on the view but not focus, you can
- *          use this callback. A callback function must have the Eext_Event_Cb
- *          prototype definition. The first parameter (@p data) in this
- *          definition will have the same value passed to
- *          eext_object_event_callback_add() as the @p data parameter, at
- *          runtime. The second parameter @p obj is the evas object on which
- *          event occurred. Finally, the third parameter @p event_info is a
- *          pointer to a data structure that may or may not be passed to the
- *          callback, depending on the event type that triggered the callback.
- *          This is so because some events don't carry extra context with them,
- *          but others do.
- *
- * @param[in] obj evas object.
- * @param[in] type The type of event that will trigger the callback.
- * @param[in] func The function to be called when the key event is triggered.
- * @param[in] data The data pointer to be passed to @p func.
- *
- * @see eext_object_event_callback_del()
- * @if MOBILE @since_tizen 2.3
- * @elseif TV @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_object_event_callback_add(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func, void *data);
-
-/**
- * @brief Convenient macro function that cancels the selection of the entry.
- *
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information
- *
- * @see   eext_entry_selection_back_event_allow_set()
- * @if MOBILE @since_tizen 2.3
- * @elseif TV @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_entry_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
-   if (elm_entry_selection_get(obj))
-     elm_entry_select_none(obj);
-
-   eext_object_event_callback_del(obj, EEXT_CALLBACK_BACK, eext_entry_back_cb);
-   evas_object_data_set(obj, "eext_entry", NULL);
-}
-
-/**
- * @brief Convenient macro function that registers back key callback for entry.
- *
- * @details If the selection handler should be canceled when back key event is
- *          triggered, then use this API.
- *
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information
- *
- * @see   eext_entry_selection_back_event_allow_set()
- * @if MOBILE @since_tizen 2.3
- * @elseif TV @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_entry_selection_start_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
-   if (!evas_object_data_get(obj, "eext_entry"))
-     {
-        evas_object_data_set(obj, "eext_entry", (void *) 1);
-        eext_object_event_callback_add(obj, EEXT_CALLBACK_BACK, eext_entry_back_cb,
-                                     NULL);
-     }
-}
-
-/**
- * @brief Convenient macro function that clears back key callback for entry.
- *
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information
- *
- * @see   eext_entry_selection_back_event_allow_set()
- * @see   eext_object_event_callback_add()
- * @if MOBILE @since_tizen 2.3
- * @elseif TV @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_entry_selection_cleared_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
-   if (evas_object_data_get(obj, "eext_entry"))
-     {
-        eext_object_event_callback_del(obj, EEXT_CALLBACK_BACK, eext_entry_back_cb);
-        evas_object_data_set(obj, "eext_entry", NULL);
-     }
-}
-
-/**
- * @brief Convenient macro function that handle the back event to cancel the
- *        selection handler of the entry.
- * @details If the selection handler should be canceled (or not) when back key
- *          event is triggered, then use this API.
- * @param[in] obj Entry object.
- * @param[in] allow @c EINA_TRUE allows the back event handling, @c EINA_FALSE
- *              otherwise.
- * @see   eext_object_event_callback_add()
- * @see   eext_object_event_callback_del()
- * @if MOBILE @since_tizen 2.3
- * @elseif TV @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_entry_selection_back_event_allow_set(Evas_Object *obj, Eina_Bool allow)
-{
-   if (allow)
-     {
-        evas_object_smart_callback_add(obj, "selection,start",
-                                       eext_entry_selection_start_cb, NULL);
-        evas_object_smart_callback_add(obj, "selection,cleared",
-                                       eext_entry_selection_cleared_cb, NULL);
-     }
-   else
-     {
-        evas_object_smart_callback_del(obj, "selection,start",
-                                       eext_entry_selection_start_cb);
-        evas_object_smart_callback_del(obj, "selection,cleared",
-                                       eext_entry_selection_cleared_cb);
-     }
-}
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_EVENTS_H__ */
diff --git a/common/src/include/efl_extension_private.h b/common/src/include/efl_extension_private.h
deleted file mode 100644 (file)
index 8fd149f..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __EFL_EXTENSION_PRIVATE_H__
-#define __EFL_EXTENSION_PRIVATE_H__
-
-#include <syslog.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <strings.h>
-#include <dlog.h>
-#include <unistd.h>
-#include <fontconfig/fontconfig.h>
-#include <fontconfig/fcfreetype.h>
-#include <glib.h>
-
-#define _(str) (gettext(str))
-#define LOCALE_DIR "/usr/share/locale"
-
-#ifdef EAPI
-# undef EAPI
-#endif
-
-#ifdef _WIN32
-# ifdef EFL_EXTENSION_BUILD
-#  ifdef DLL_EXPORT
-#   define EAPI __declspec(dllexport)
-#  else
-#   define EAPI
-#  endif /* ! DLL_EXPORT */
-# else
-#  define EAPI __declspec(dllimport)
-# endif /* ! EFL_EXTENSION_BUILD */
-#else
-# ifdef __GNUC__
-#  if __GNUC__ >= 4
-#   define EAPI __attribute__ ((visibility("default")))
-#  else
-#   define EAPI
-#  endif
-# else
-#  define EAPI
-# endif
-#endif /* ! _WIN32 */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @internal
- *
- * @ {
- */
-
-#ifdef LOG_TAG
-#undef LOG_TAG
-#endif
-
-extern int _eext_log_dom;
-#define CRI(...)      EINA_LOG_DOM_CRIT(_eext_log_dom, __VA_ARGS__)
-#define ERR(...)      EINA_LOG_DOM_ERR(_eext_log_dom, __VA_ARGS__)
-#define WRN(...)      EINA_LOG_DOM_WARN(_eext_log_dom, __VA_ARGS__)
-#define INF(...)      EINA_LOG_DOM_INFO(_eext_log_dom, __VA_ARGS__)
-#define DBG(...)      EINA_LOG_DOM_DBG(_eext_log_dom, __VA_ARGS__)
-
-#define LOG_TAG "efl-extension"
-#define __CONSTRUCTOR__ __attribute__ ((constructor))
-#define __DESTRUCTOR__ __attribute__ ((destructor))
-
-/* eina magic types */
-#define EEXT_MAGIC_NONE 0x87657890
-
-typedef unsigned int eext_magic;
-#define EEXT_MAGIC                eext_magic __magic
-
-#define EEXT_MAGIC_SET(d, m)      (d)->__magic = (m)
-#define EEXT_MAGIC_CHECK(d, m)    ((d) && ((d)->__magic == (m)))
-#define EEXT_MAGIC_FAIL(d, m, fn) \
-               _eext_magic_fail((d), (d) ? (d)->__magic : 0, (m), (fn));
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_PRIVATE_H__ */
diff --git a/common/src/lib/CMakeLists.txt b/common/src/lib/CMakeLists.txt
deleted file mode 100644 (file)
index 8ab7dc5..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-add_definitions(-DEFL_EO_API_SUPPORT=1 -DEFL_BETA_API_SUPPORT=1)
-
-SET(LIB_SRCS
-       ${COMMON_DIR}/lib/efl_extension.c
-       ${COMMON_DIR}/lib/eext_events.c
-       CACHE
-       INTERNAL
-       "LIB_SRCS"
-       )
diff --git a/common/src/lib/eext_events.c b/common/src/lib/eext_events.c
deleted file mode 100644 (file)
index 254646b..0000000
+++ /dev/null
@@ -1,460 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "efl_extension.h"
-#include "efl_extension_private.h"
-
-typedef struct _Eext_Event_Mgr Eext_Event_Mgr;
-
-struct _Eext_Event_Mgr
-{
-   Eina_List *obj_events;
-   Evas *e;
-   Evas_Object *key_grab_rect;
-};
-
-typedef struct _Eext_Object_Event
-{
-   Evas_Object *obj;
-   Evas_Object *parent;
-   Eina_List *callbacks;
-   Eina_Bool delete_me : 1;
-   Eina_Bool on_callback : 1;
-} Eext_Object_Event;
-
-typedef struct _Eext_Event_Callback
-{
-   Eext_Callback_Type type;
-   void (*func)(void *data, Evas_Object *obj, void *event_info);
-   void *data;
-} Eext_Event_Callback;
-
-const char *EEXT_OBJ_KEY_EVENT_MGR = "_eext_obj_key_event_mgr";
-const char *EEXT_OBJ_KEY_OBJ_EVENT = "_eext_obj_key_obj_event";
-const char *EEXT_KEY_BACK = "XF86Back";
-const char *EEXT_KEY_BACK2 = "XF86Stop";
-const char *EEXT_KEY_BACK3 = "Escape";
-const char *EEXT_KEY_MENU = "XF86Menu";
-const char *EEXT_KEY_MENU2 = "XF86Send";
-const char *EEXT_KEY_MENU3 = "Menu";
-
-
-static Eina_List *event_mgrs = NULL;
-
-static void
-_eext_event_mgr_del(Eext_Event_Mgr *event_mgr)
-{
-   if (event_mgr->obj_events) return;
-
-   //Redundant Event Mgr. Remove it.
-   evas_object_del(event_mgr->key_grab_rect);
-   event_mgrs = eina_list_remove(event_mgrs, event_mgr);
-   free(event_mgr);
-}
-
-static void
-_eext_object_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
-   Eext_Event_Mgr *event_mgr = evas_object_data_get(obj, EEXT_OBJ_KEY_EVENT_MGR);
-   Eext_Object_Event *obj_event = data;
-   Eina_List *l;
-   Eext_Event_Callback *callback;
-
-   l = eina_list_data_find_list(event_mgr->obj_events, obj_event);
-   if (!l) return;
-
-   event_mgr->obj_events = eina_list_remove_list(event_mgr->obj_events, l);
-
-   EINA_LIST_FREE(obj_event->callbacks, callback) free(callback);
-   obj_event->callbacks = NULL;
-
-   if (obj_event->on_callback) obj_event->delete_me = EINA_TRUE;
-   else free(obj_event);
-
-   _eext_event_mgr_del(event_mgr);
-}
-
-static int
-_eext_layer_sort_cb(const void *data1, const void *data2)
-{
-   const Eext_Object_Event *obj_event = data1;
-   const Eext_Object_Event *obj_event2 = data2;
-
-   //1. Layer Compare
-   int layer1 = evas_object_layer_get(obj_event->obj);
-   int layer2 = evas_object_layer_get(obj_event2->obj);
-
-   return (layer1 < layer2) ? -1 : 1;
-}
-
-static Evas_Object *
-_eext_top_parent_candidates(Eina_List **candidates, Evas *e)
-{
-   Evas_Object *temp;
-   Evas_Object *parent;
-   Eina_List *l, *l_next;
-   Eext_Object_Event *obj_event;
-   Eina_List *_candidates = *candidates;
-   Eina_Bool found = EINA_FALSE;
-
-   //Get the top parent lists
-   EINA_LIST_FOREACH(_candidates, l, obj_event)
-     {
-        temp = obj_event->obj;
-        parent = obj_event->obj;
-        while (temp)
-          {
-             parent = temp;
-             temp = evas_object_smart_parent_get(temp);
-          }
-        obj_event->parent = parent;
-     }
-
-   //Leave only parent candidates.
-   parent = evas_object_top_get(e);
-
-   while (parent)
-     {
-        EINA_LIST_FOREACH(_candidates, l, obj_event)
-          {
-             if (parent == obj_event->parent)
-               {
-                  found = EINA_TRUE;
-                  obj_event->parent = NULL;
-               }
-          }
-        if (found) break;
-        parent = evas_object_below_get(parent);
-     }
-
-   //Redundant parents (no candidates)
-   EINA_LIST_FOREACH_SAFE(_candidates, l, l_next, obj_event)
-     {
-        if (!obj_event->parent) continue;
-        _candidates = eina_list_remove_list(_candidates, l);
-     }
-
-   *candidates = _candidates;
-   return parent;
-}
-
-static Eext_Object_Event *
-_eext_find_event_target(Eina_List *candidates, Evas_Object *parent, Eext_Callback_Type type)
-{
-   Eext_Object_Event *obj_event = NULL;
-   Eina_List *l, *ll;
-   Evas_Object *obj;
-   Eina_List *members = NULL;
-   Eext_Event_Callback *callback;
-
-   if (eo_isa(parent, EVAS_OBJECT_SMART_CLASS))
-     members = evas_object_smart_members_get(parent);
-
-   if (members)
-     {
-        EINA_LIST_REVERSE_FOREACH(members, l, obj)
-          {
-             obj_event = _eext_find_event_target(candidates, obj, type);
-             //got you!
-             if (obj_event)
-               {
-                  EINA_LIST_FOREACH(obj_event->callbacks, ll, callback)
-                    {
-                       if (callback->type == type)
-                         {
-                            eina_list_free(members);
-                            return obj_event;
-                         }
-                    }
-               }
-          }
-        eina_list_free(members);
-     }
-
-   EINA_LIST_REVERSE_FOREACH(candidates, l, obj_event)
-     {
-        //got you!
-        if (parent == obj_event->obj)
-          {
-             EINA_LIST_FOREACH(obj_event->callbacks, ll, callback)
-               {
-                  if (callback->type == type)
-                    return obj_event;
-               }
-          }
-     }
-
-   return NULL;
-}
-
-static Eext_Object_Event *
-_eext_top_obj_event_find(Eext_Event_Mgr *event_mgr, Eext_Callback_Type type)
-{
-   Eext_Object_Event *obj_event = NULL;
-   Eina_List *l, *l_next;
-   Eina_List *candidates = NULL;
-   Evas_Object *parent;
-   int top_layer;
-   Eina_Bool invisible;
-
-   //1. filter the invisible objs
-   EINA_LIST_FOREACH(event_mgr->obj_events, l, obj_event)
-     {
-        parent = obj_event->obj;
-        invisible = EINA_FALSE;
-
-        while (parent)
-          {
-             if (!evas_object_visible_get(parent))
-               {
-                  invisible = EINA_TRUE;
-                  break;
-               }
-             parent = evas_object_smart_parent_get(parent);
-          }
-        if (invisible) continue;
-        candidates = eina_list_append(candidates, obj_event);
-     }
-   if (!candidates) return NULL;   //no visible objects.
-   if (eina_list_count(candidates) == 1) goto found;
-
-   //2.1. sort by layer order
-   candidates = eina_list_sort(candidates, eina_list_count(candidates),
-                               _eext_layer_sort_cb);
-
-   //2.2. leave the only top layer
-   obj_event = eina_list_data_get(eina_list_last(candidates));
-   top_layer = evas_object_layer_get(obj_event->obj);
-
-   EINA_LIST_FOREACH_SAFE(candidates, l, l_next, obj_event)
-     {
-        if (evas_object_layer_get(obj_event->obj) < top_layer)
-          candidates = eina_list_remove_list(candidates, l);
-     }
-   if (eina_list_count(candidates) == 1) goto found;
-
-   //3. find the top parent candidate.
-   parent = _eext_top_parent_candidates(&candidates, event_mgr->e);
-   if (eina_list_count(candidates) == 1) goto found;
-
-   //4. find the target in this parent tree.
-   obj_event = _eext_find_event_target(candidates, parent, type);
-   eina_list_free(candidates);
-   return obj_event;
-
-found:
-   obj_event = eina_list_data_get(candidates);
-   eina_list_free(candidates);
-   return obj_event;
-}
-
-static void
-_eext_key_grab_rect_key_up_cb(void *data, Evas *e, Evas_Object *obj,
-                            void *event_info)
-{
-   Evas_Event_Key_Down *ev = event_info;
-   Eext_Event_Mgr *event_mgr = data;
-   Eext_Object_Event *obj_event;
-   Eext_Event_Callback *callback;
-   Eext_Callback_Type type;
-   Eina_List *l;
-
-   if (!strcmp(ev->keyname, EEXT_KEY_BACK) ||
-       !strcmp(ev->keyname, EEXT_KEY_BACK2) ||
-       !strcmp(ev->keyname, EEXT_KEY_BACK3))
-     type = EEXT_CALLBACK_BACK;
-   else if (!strcmp(ev->keyname, EEXT_KEY_MENU) ||
-            !strcmp(ev->keyname, EEXT_KEY_MENU2) ||
-            !strcmp(ev->keyname, EEXT_KEY_MENU3))
-     type = EEXT_CALLBACK_MORE;
-   else return;
-
-   obj_event = _eext_top_obj_event_find(event_mgr, type);
-   if (!obj_event) return;
-
-   obj_event->on_callback = EINA_TRUE;
-   EINA_LIST_FOREACH(obj_event->callbacks, l, callback)
-     {
-        if (callback->type != type) continue;
-        callback->func(callback->data, obj_event->obj, (void*) type);
-        if (obj_event->delete_me) break;
-     }
-   if (obj_event->delete_me) free(obj_event);
-   else obj_event->on_callback = EINA_FALSE;
-}
-
-static void
-_eext_key_grab_obj_create(Eext_Event_Mgr *event_mgr)
-{
-   Evas_Object *key_grab_rect = evas_object_rectangle_add(event_mgr->e);
-
-   evas_object_event_callback_add(key_grab_rect, EVAS_CALLBACK_KEY_UP,
-                                  _eext_key_grab_rect_key_up_cb, event_mgr);
-   if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_BACK, 0, 0, EINA_FALSE))
-     LOGE("Failed to grab BACK KEY\n");
-
-   if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_BACK2, 0, 0, EINA_FALSE))
-     LOGE("Failed to grab BACK KEY\n");
-
-   if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_BACK3, 0, 0, EINA_FALSE))
-     LOGE("Failed to grab BACK KEY\n");
-
-   if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_MENU, 0, 0, EINA_FALSE))
-     LOGE("Failed to grab MENU KEY\n");
-
-   if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_MENU2, 0, 0, EINA_FALSE))
-     LOGE("Failed to grab MENU KEY\n");
-
-   if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_MENU3, 0, 0, EINA_FALSE))
-     LOGE("Failed to grab MENU KEY\n");
-
-   event_mgr->key_grab_rect = key_grab_rect;
-}
-
-static Eext_Event_Mgr *
-_eext_event_mgr_new(Evas *e)
-{
-   Eext_Event_Mgr *event_mgr = calloc(1, sizeof(Eext_Event_Mgr));
-   if (!event_mgr)
-     {
-        LOGE("Failed to allocate event manager");
-        return NULL;
-     }
-   event_mgr->e = e;
-   _eext_key_grab_obj_create(event_mgr);
-
-   return event_mgr;
-}
-
-EAPI void *
-eext_object_event_callback_del(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func)
-{
-   Eext_Object_Event *obj_event;
-   Eext_Event_Mgr *event_mgr;
-   Eina_List *l;
-   Eext_Event_Callback *callback;
-   void *data;
-
-   //Check the validation
-   event_mgr = evas_object_data_get(obj, EEXT_OBJ_KEY_EVENT_MGR);
-   obj_event = evas_object_data_get(obj, EEXT_OBJ_KEY_OBJ_EVENT);
-
-   if (!event_mgr || !obj_event)
-     {
-        LOGW("This object(%p) hasn't been registered before", obj);
-        return NULL;
-     }
-
-   //Remove the callback data
-   EINA_LIST_REVERSE_FOREACH(obj_event->callbacks, l, callback)
-     {
-        if ((callback->func == func) && (callback->type == type)) break;
-     }
-
-   if (!callback)
-     {
-        LOGW("This object(%p) hasn't been registered before with the given type(%d) and func(%p)", obj, type, func);
-        return NULL;
-     }
-
-   data = callback->data;
-   obj_event->callbacks = eina_list_remove_list(obj_event->callbacks, l);
-   free(callback);
-
-   //This object is not managed anymore.
-   if (!obj_event->callbacks)
-     {
-        evas_object_data_set(obj, EEXT_OBJ_KEY_OBJ_EVENT, NULL);
-        evas_object_data_set(obj, EEXT_OBJ_KEY_EVENT_MGR, NULL);
-        Eina_List *l = eina_list_data_find_list(event_mgr->obj_events,
-                                                obj_event);
-        if (l)
-          event_mgr->obj_events = eina_list_remove_list(event_mgr->obj_events,
-                                                        l);
-        if (obj_event->on_callback) obj_event->delete_me = EINA_TRUE;
-        else free(obj_event);
-
-        evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL, _eext_object_del_cb);
-     }
-
-   _eext_event_mgr_del(event_mgr);
-
-   return data;
-}
-
-EAPI void
-eext_object_event_callback_add(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func, void *data)
-{
-   Eext_Event_Mgr *event_mgr;
-   Evas *e;
-   Eext_Object_Event *obj_event = NULL;
-   Eina_List *l;
-   Eext_Event_Callback *callback;
-   Eina_Bool new_event_mgr = EINA_TRUE;
-
-   //Check the registered event manager for this Evas.
-   e = evas_object_evas_get(obj);
-
-   EINA_LIST_FOREACH(event_mgrs, l, event_mgr)
-     {
-        if (event_mgr->e == e)
-          {
-             new_event_mgr = EINA_FALSE;
-             break;
-          }
-     }
-
-   //New Evas comes. Create new event manager for this Evas.
-   if (new_event_mgr)
-     {
-        if (!(event_mgr = _eext_event_mgr_new(e))) return;
-        event_mgrs = eina_list_append(event_mgrs, event_mgr);
-     }
-
-   obj_event = evas_object_data_get(obj, EEXT_OBJ_KEY_OBJ_EVENT);
-
-   //New Object Event. Probably user adds eext_object_event_callback first time.
-   if (!obj_event)
-     {
-        obj_event = calloc(1, sizeof(Eext_Object_Event));
-        if (!obj_event)
-          {
-             LOGE("Failed to allocate object event");
-             return;
-          }
-        evas_object_data_set(obj, EEXT_OBJ_KEY_OBJ_EVENT, obj_event);
-        evas_object_data_set(obj, EEXT_OBJ_KEY_EVENT_MGR, event_mgr);
-        evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
-                                       _eext_object_del_cb,
-                                       obj_event);
-        event_mgr->obj_events = eina_list_append(event_mgr->obj_events,
-                                                 obj_event);
-        obj_event->obj = obj;
-     }
-
-   //Append this callback.
-   callback = calloc(1, sizeof(Eext_Event_Callback));
-   if (!callback)
-     {
-        LOGE("Failed to allocate event callback");
-        return;
-     }
-   callback->type = type;
-   callback->func = func;
-   callback->data = data;
-
-   obj_event->callbacks = eina_list_append(obj_event->callbacks, callback);
-}
diff --git a/common/src/lib/efl_extension.c b/common/src/lib/efl_extension.c
deleted file mode 100644 (file)
index 32b7984..0000000
+++ /dev/null
@@ -1,125 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "efl_extension.h"
-#include "efl_extension_private.h"
-
-/*===========================================================================*
- *                                 Local                                     *
- *===========================================================================*/
-
-static const char *
-_magic_string_get(eext_magic m)
-{
-       switch (m) {
-       case EEXT_MAGIC_NONE:
-               return "None (Freed Object)";
-
-       default:
-               return "<UNKNOWN>";
-     }
-}
-
-__CONSTRUCTOR__ static void
-eext_mod_init(void)
-{
-}
-
-__DESTRUCTOR__ static void
-eext_mod_shutdown(void)
-{
-}
-
-
-/*===========================================================================*
- *                                Global                                     *
- *===========================================================================*/
-
-void
-_eext_magic_fail(const void *d, eext_magic m, eext_magic req_m, const char *fname)
-{
-       LOGE("\n*** MAGIC FAIL (%s) ***\n", fname);
-
-       if (!d)
-               LOGE("  Input handle pointer is NULL!");
-       else if (m == EEXT_MAGIC_NONE)
-               LOGE("  Input handle has already been freed!");
-       else if (m != req_m)
-               LOGE("  Input handle is wrong type\n"
-                   "    Expected: %08x - %s\n"
-                   "    Supplied: %08x - %s",
-                   (unsigned int)req_m, _magic_string_get(req_m),
-                   (unsigned int)m, _magic_string_get(m));
-
-        gchar **envp = g_get_environ();
-        if (g_environ_getenv(envp, "EEXT_ERROR_ABORT")) abort();
-}
-
-/*===========================================================================*
- *                                  API                                      *
- *===========================================================================*/
-#if 0 //This API will be not used. For history, keep this codes
-
-EAPI tzsh_native_window
-eext_win_tzsh_native_window_get(const Elm_Win *obj)
-{
-   Evas *e = evas_object_evas_get(obj);
-   Ecore_Evas *ee = ecore_evas_ecore_evas_get(e);
-   const char *engine_name = ecore_evas_engine_name_get(ee);
-
-   if (strcmp(elm_object_widget_type_get(obj), "Elm_Win"))
-     {
-        LOGE("  Input object is not elm_win widget");
-        return 0;
-     }
-   if (engine_name &&
-       ((!strcmp(engine_name, "opengl_x11")) ||
-        (!strcmp(engine_name, "software_x11"))))
-     return (tzsh_native_window) elm_win_xwindow_get(obj);
-#ifdef HAVE_ELEMENTARY_WAYLAND
-   else if (engine_name &&
-            ((!strcmp(engine_name, "wayland_shm")) ||
-             (!strcmp(engine_name, "wayland_egl"))))
-     {
-        Ecore_Wl_Window wl_win;
-        wl_win = elm_win_wl_window_get(obj);
-        return (tzsh_native_window)ecore_wl_window_surface_get(wl_win);
-     }
-#endif
-   LOGE("  Do not support %s window system", engine_name);
-   return 0;
-}
-#endif
-
-EAPI Eina_Bool
-eext_win_keygrab_set(Elm_Win *obj, const char *key)
-{
-   Eina_Bool ret = EINA_FALSE;
-   ret = elm_win_keygrab_set(obj, key, 0, 0, 0, ELM_WIN_KEYGRAB_TOPMOST);
-   if (!ret)
-     LOGE("  Can't set keygrab of [%s].", key);
-   return ret;
-}
-
-EAPI Eina_Bool
-eext_win_keygrab_unset(Elm_Win *obj, const char *key)
-{
-   Eina_Bool ret = EINA_FALSE;
-   ret = elm_win_keygrab_unset(obj, key, 0, 0);
-   if (!ret)
-     LOGE("  Can't unset keygrab of [%s].", key);
-   return ret;
-}
diff --git a/data/mobile/HD-inc.edc b/data/mobile/HD-inc.edc
new file mode 100644 (file)
index 0000000..410d2ef
--- /dev/null
@@ -0,0 +1,31 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define BASE_SCALE_INC 2.6
+
+//****************************************************************************//
+// Floatingbutton
+//****************************************************************************//
+#define FLOATINGBUTTON_LAYOUT_LR_WIDTH 64
+#define FLOATINGBUTTON_LR_WIDTH 50
+#define FLOATINGBUTTON_LR_MAX_VARIATION 20
+#define FLOATINGBUTTON_MID_WIDTH 20
+#define FLOATINGBUTTON_1BTN_WIDTH 180
+#define FLOATINGBUTTON_2BTN_WIDTH 280
+#define FLOATINGBUTTON_HEIGHT 120
+#define FLOATINGBUTTON_HANDLER_SIZE 32
+#define FLOATINGBUTTON_SIDE_MARGIN 20
+#define FLOATINGBUTTON_LAYOUT_SIDE_MARGIN 34
diff --git a/data/mobile/efl-extension.edc.in b/data/mobile/efl-extension.edc.in
new file mode 100644 (file)
index 0000000..63ec201
--- /dev/null
@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "HD-inc.edc"
+
+collections {
+   base_scale: BASE_SCALE_INC;
+@EDC_INCS@
+}
+
diff --git a/data/mobile/groups/floatingbutton.edc b/data/mobile/groups/floatingbutton.edc
new file mode 100644 (file)
index 0000000..2e4c610
--- /dev/null
@@ -0,0 +1,568 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+   group { name: "elm/floatingbutton/base/default";
+      script {
+         public mouse_down, g_prev_x, g_width, g_btns;
+         public left_timer, right_timer;
+         public g_visible;
+         public g_expand;
+
+         public message(Msg_Type:type, id, ...) {
+            if ((type == MSG_INT) && (id == 0)) {
+               new width;
+               width = getarg(2);
+               set_int(g_width, width);
+            }
+         }
+         public left_anim_go() {
+            run_program(PROGRAM:"left_spacer_animation");
+         }
+         public right_anim_go() {
+            run_program(PROGRAM:"right_spacer_animation");
+         }
+      }
+      parts {
+         part { name: "elm.swallow.vg";
+            type: SWALLOW;
+            scale: 1;
+            clip_to: "vg_clipper";
+            description { state: "default" 0.0;
+               fixed: 1 1;
+               rel1.to: "left_expand";
+               rel2.to: "right_expand";
+            }
+            description { state: "hidden" 0.0;
+               inherit: "default" 0.0;
+               visible: 0;
+            }
+         }
+         part { name: "vg_clipper";
+            type: RECT;
+            clip_to: "clipper";
+            description { state: "default" 0.0;
+               fixed: 1 1;
+               color: 78 97 173 255;
+               rel1.to: "elm.swallow.vg";
+               rel2.to: "elm.swallow.vg";
+            }
+            description { state: "disabled" 0.0;
+               inherit: "default";
+               color: 131 145 201 255;
+            }
+         }
+         part { name: "elm.track.left_hidden";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               min: (FLOATINGBUTTON_1BTN_WIDTH+FLOATINGBUTTON_SIDE_MARGIN-FLOATINGBUTTON_HANDLER_SIZE) 0;
+               fixed: 1 1;
+               align: 1.0 0.5;
+               rel1.relative: 0.0 0.0;
+               rel2.relative: 0.0 1.0;
+            }
+            description { state: "2buttons" 0.0;
+               inherit: "default" 0.0;
+               min: (FLOATINGBUTTON_2BTN_WIDTH+FLOATINGBUTTON_SIDE_MARGIN-FLOATINGBUTTON_HANDLER_SIZE) 0;
+            }
+         }
+         part { name: "elm.track.right_hidden";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               min: (FLOATINGBUTTON_1BTN_WIDTH+FLOATINGBUTTON_SIDE_MARGIN-FLOATINGBUTTON_HANDLER_SIZE) 0;
+               fixed: 1 1;
+               align: 0.0 0.5;
+               rel1.relative: 1.0 0.0;
+               rel2.relative: 1.0 1.0;
+            }
+            description { state: "2buttons" 0.0;
+               inherit: "default" 0.0;
+               min: (FLOATINGBUTTON_2BTN_WIDTH+FLOATINGBUTTON_SIDE_MARGIN-FLOATINGBUTTON_HANDLER_SIZE) 0;
+            }
+         }
+         part { name: "elm.track.fb";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               rel1.to: "elm.track.left_hidden";
+               rel2.to: "elm.track.right_hidden";
+            }
+         }
+         part { name: "left_expand";
+            type: SPACER;
+            description { state: "default" 0.0;
+               fixed: 1 1;
+               align: 1.0 0.5;
+               rel1 { to: "left_spacer"; relative: 0.0 0.0; }
+               rel2 { to: "left_spacer"; relative: 0.0 1.0; }
+            }
+         }
+         part { name: "right_expand";
+            type: SPACER;
+            description { state: "default" 0.0;
+               fixed: 1 1;
+               align: 0.0 0.5;
+               rel1 { to: "right_spacer"; relative: 1.0 0.0; }
+               rel2 { to: "right_spacer"; relative: 1.0 1.0; }
+            }
+         }
+         part { name: "left_spacer";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               min: FLOATINGBUTTON_LR_WIDTH 0;
+               fixed: 1 1;
+               align: 1.0 0.5;
+               rel1 { to_x: "elm.swallow.box"; to_y: "elm.dragable.fb"; relative: 0.0 0.0; }
+               rel2 { to_x: "elm.swallow.box"; to_y: "elm.dragable.fb"; relative: 0.0 1.0; }
+            }
+            description { state: "expand" 0.0;
+               inherit: "default" 0.0;
+               min: (FLOATINGBUTTON_LR_WIDTH+FLOATINGBUTTON_LAYOUT_SIDE_MARGIN) 0;
+            }
+         }
+         part { name: "right_spacer";
+            type: SPACER;
+            scale: 1;
+            description { state: "default" 0.0;
+               min: FLOATINGBUTTON_LR_WIDTH 0;
+               fixed: 1 1;
+               align: 0.0 0.5;
+               rel1 { to_x: "elm.swallow.box"; to_y: "elm.dragable.fb"; relative: 1.0 0.0; }
+               rel2 { to_x: "elm.swallow.box"; to_y: "elm.dragable.fb"; relative: 1.0 1.0; }
+            }
+            description { state: "expand" 0.0;
+               inherit: "default" 0.0;
+               min: (FLOATINGBUTTON_LR_WIDTH+FLOATINGBUTTON_LAYOUT_SIDE_MARGIN) 0;
+            }
+         }
+         part { name: "elm.swallow.box";
+            type: SWALLOW;
+            scale: 1;
+            clip_to: "clipper";
+            description { state: "default" 0.0;
+               min: 0 0;
+               fixed: 1 1;
+               align: 0.5 0.5;
+               rel1 { to: "elm.dragable.fb"; relative: 0.5 0.5; }
+               rel2 { to: "elm.dragable.fb"; relative: 0.5 0.5; }
+            }
+            description { state: "hidden" 0.0;
+               inherit: "default" 0.0;
+               visible: 0;
+            }
+         }
+         part { name: "elm.dragable.fb";
+            type: RECT;
+            scale: 1;
+            clip_to: "clipper";
+            repeat_events: 1;
+            description { state: "default" 0.0;
+               min: FLOATINGBUTTON_1BTN_WIDTH FLOATINGBUTTON_HEIGHT;
+               fixed: 1 1;
+               align: 0.5 0.5;
+               rel1 { to: "elm.track.fb"; relative: 0.5 0.0; }
+               rel2 { to: "elm.track.fb"; relative: 0.5 1.0; }
+               color: 0 0 0 0;
+            }
+            description { state: "expand" 0.0;
+               inherit: "default" 0.0;
+               min: (FLOATINGBUTTON_1BTN_WIDTH+FLOATINGBUTTON_SIDE_MARGIN) FLOATINGBUTTON_HEIGHT;
+            }
+            description { state: "2buttons" 0.0;
+               inherit: "default" 0.0;
+               min: FLOATINGBUTTON_2BTN_WIDTH FLOATINGBUTTON_HEIGHT;
+            }
+            description { state: "2buttons_expand" 0.0;
+               inherit: "default" 0.0;
+               min: (FLOATINGBUTTON_2BTN_WIDTH+FLOATINGBUTTON_SIDE_MARGIN) FLOATINGBUTTON_HEIGHT;
+            }
+            description { state: "hidden" 0.0;
+               inherit: "default" 0.0;
+               visible: 0;
+            }
+            dragable {
+               x: 1 1 0;
+               y: 0 0 0;
+               confine: "elm.track.fb";
+               threshold: "elm.threshold.fb";
+            }
+         }
+         part { name : "elm.threshold.fb";
+            type: RECT;
+            scale: 1;
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               min: 0 FLOATINGBUTTON_HEIGHT;
+               fixed: 1 1;
+               align: 0.5 0.5;
+               rel1 { to: "elm.track.fb"; relative: 0.5 0.0; }
+               rel2 { to: "elm.track.fb"; relative: 0.5 1.0; }
+               color: 0 0 0 0;
+            }
+         }
+         part { name: "clipper";
+            type: RECT;
+            mouse_events: 0;
+            description { state: "default" 0.0;
+               color: 255 255 255 255;
+            }
+         }
+      }
+      programs {
+         program {
+            signal: "load";
+            script {
+               custom_state(PART:"left_expand", "default", 0.0);
+               custom_state(PART:"right_expand", "default", 0.0);
+               custom_state(PART:"elm.threshold.fb", "default", 0.0);
+               set_state(PART:"elm.threshold.fb", "custom", 0.0);
+               set_int(g_visible, 1);
+            }
+         }
+         program {
+            signal: "elm,state,floatingbutton,*,1btn";
+            source: "elm";
+            script {
+               set_state(PART:"elm.track.left_hidden", "default", 0.0);
+               set_state(PART:"elm.track.right_hidden", "default", 0.0);
+               set_int(g_btns, 1);
+            }
+         }
+         program {
+            signal: "elm,state,floatingbutton,*,2btn";
+            source: "elm";
+            script {
+               set_state(PART:"elm.track.left_hidden", "2buttons", 0.0);
+               set_state(PART:"elm.track.right_hidden", "2buttons", 0.0);
+               set_int(g_btns, 2);
+            }
+         }
+         program {
+            signal: "elm,floatingbutton,threshold,update";
+            source: "elm";
+            script {
+               new width, Float:pos;
+               new x, y, w, h;
+               new x1, y1, w1, h1;
+
+               width = get_int(g_width);
+               set_state_val(PART:"elm.threshold.fb", STATE_MIN, width, 0);
+
+               get_geometry(PART:"elm.track.fb", x, y, w, h);
+               get_geometry(PART:"elm.dragable.fb", x1, y1, w1, h1);
+
+               pos = ((x1 - x) + float(w1) / 2) / w;
+
+               set_state_val(PART:"elm.threshold.fb", STATE_REL1, pos, 0.0);
+               set_state_val(PART:"elm.threshold.fb", STATE_REL2, pos, 1.0);
+            }
+         }
+         program { name: "mouse_down";
+            signal: "mouse,down,1";
+            source: "elm.dragable.fb";
+            script {
+               new x, y, w, h;
+               get_geometry(PART:"elm.dragable.fb", x, y, w, h);
+               set_int(g_prev_x, x);
+               set_int(mouse_down, 1);
+            }
+         }
+         program { name: "mouse_up";
+            signal: "mouse,up,1";
+            source: "elm.dragable.fb";
+            script {
+               set_int(mouse_down, 0);
+            }
+         }
+         program { name: "mouse_move";
+            signal: "mouse,move";
+            source: "elm.dragable.fb";
+            script {
+               new prev_x;
+               prev_x = get_int(g_prev_x);
+
+               if (get_int(mouse_down) == 1) {
+                  new x, y, w, h;
+                  new x1, y1, w1, h1;
+
+                  get_geometry(PART:"elm.dragable.fb", x, y, w, h);
+
+                  if (prev_x < x)
+                  {
+                     get_geometry(PART:"left_expand", x1, y1, w1, h1);
+
+                     if ((w1 + x - prev_x) < FLOATINGBUTTON_LR_MAX_VARIATION)
+                       set_state_val(PART:"left_expand", STATE_MIN, (w1 + x - prev_x), 0);
+                     else
+                       set_state_val(PART:"left_expand", STATE_MIN, FLOATINGBUTTON_LR_MAX_VARIATION, 0);
+
+                     set_state(PART:"left_expand", "custom", 0.0);
+
+                     new id;
+                     id = get_int(left_timer);
+                     cancel_timer(id);
+
+                     id = timer(0.01, "left_anim_go", 1);
+                     set_int(left_timer, id);
+                  }
+                  else if (prev_x > x)
+                  {
+                     get_geometry(PART:"right_expand", x1, y1, w1, h1);
+
+                     if ((w1 + prev_x - x) < FLOATINGBUTTON_LR_MAX_VARIATION)
+                       set_state_val(PART:"right_expand", STATE_MIN, (w1 + prev_x - x), 0);
+                     else
+                       set_state_val(PART:"right_expand", STATE_MIN, FLOATINGBUTTON_LR_MAX_VARIATION, 0);
+
+                     set_state(PART:"right_expand", "custom", 0.0);
+
+                     new id;
+                     id = get_int(right_timer);
+                     cancel_timer(id);
+
+                     id = timer(0.01, "right_anim_go", 1);
+                     set_int(right_timer, id);
+                  }
+                  set_int(g_prev_x, x);
+               }
+            }
+         }
+         program { name: "left_spacer_animation";
+            action: STATE_SET "default" 0.0;
+            transition: DECEL 0.4;
+            target: "left_expand";
+         }
+         program { name: "right_spacer_animation";
+            action: STATE_SET "default" 0.0;
+            transition: DECEL 0.4;
+            target: "right_expand";
+         }
+         program { name: "left_spacer_stretch";
+            action: STATE_SET "custom" 0.0;
+            transition: ACCEL 0.2;
+            target: "left_expand";
+            after: "left_spacer_animation";
+         }
+         program { name: "right_spacer_stretch";
+            action: STATE_SET "custom" 0.0;
+            transition: ACCEL 0.2;
+            target: "right_expand";
+            after: "right_spacer_animation";
+         }
+         program { name: "block";
+            signal: "elm,state,floatingbutton,block";
+            source: "elm";
+            script {
+               set_mouse_events(PART:"elm.dragable.fb", 0);
+            }
+         }
+         program { name: "unblock";
+            signal: "elm,state,floatingbutton,unblock";
+            source: "elm";
+            script {
+               set_mouse_events(PART:"elm.dragable.fb", 1);
+            }
+         }
+         program {
+            signal: "elm,state,floatingbutton,freeze";
+            source: "elm";
+            script {
+               set_mask_flags(PART:"elm.dragable.fb", 1);
+            }
+         }
+         program {
+            signal: "elm,state,floatingbutton,thaw";
+            source: "elm";
+            script {
+               set_mask_flags(PART:"elm.dragable.fb", 0);
+            }
+         }
+         program {
+            signal: "elm,state,show";
+            source: "";
+            script {
+               set_int(g_visible, 1);
+               run_program(PROGRAM:"visible");
+            }
+         }
+         program {
+            signal: "elm,state,hide";
+            source: "";
+            script {
+               set_int(g_visible, 0);
+               run_program(PROGRAM:"hidden");
+            }
+         }
+         program { name: "visible";
+            signal: "elm,state,floatingbutton,visible";
+            source: "elm";
+            script {
+               if (get_int(g_visible) == 1) {
+                  set_state(PART:"elm.swallow.vg", "default", 0.0);
+                  set_state(PART:"elm.swallow.box", "default", 0.0);
+                  if (get_int(g_btns) < 2) {
+                     if (get_int(g_expand) == 0) {
+                        set_state(PART:"elm.dragable.fb", "default", 0.0);
+                     }
+                     else {
+                        set_state(PART:"elm.dragable.fb", "expand", 0.0);
+                     }
+                  }
+                  else {
+                     if (get_int(g_expand) == 0) {
+                        set_state(PART:"elm.dragable.fb", "2buttons", 0.0);
+                     }
+                     else {
+                        set_state(PART:"elm.dragable.fb", "2buttons_expand", 0.0);
+                     }
+                  }
+               }
+            }
+         }
+         program { name: "hidden";
+            signal: "elm,state,floatingbutton,hidden";
+            source: "elm";
+            script {
+               set_state(PART:"elm.swallow.vg", "hidden", 0.0);
+               set_state(PART:"elm.swallow.box", "hidden", 0.0);
+               set_state(PART:"elm.dragable.fb", "hidden", 0.0);
+            }
+         }
+         program { name: "left_bring_in";
+            signal: "elm,action,floatingbutton,left";
+            source: "elm";
+            script {
+               set_state_val(PART:"right_expand", STATE_MIN, FLOATINGBUTTON_LR_MAX_VARIATION, 0);
+               run_program(PROGRAM:"right_spacer_stretch");
+            }
+         }
+         program { name: "right_bring_in";
+            signal: "elm,action,floatingbutton,right";
+            source: "elm";
+            script {
+               set_state_val(PART:"left_expand", STATE_MIN, FLOATINGBUTTON_LR_MAX_VARIATION, 0);
+               run_program(PROGRAM:"left_spacer_stretch");
+            }
+         }
+         program { name: "move_to_left";
+            signal: "elm,state,floatingbutton,left,*";
+            source: "elm";
+            action: STATE_SET "expand" 0.0;
+            target: "left_spacer";
+            transition: DECEL 0.4;
+         }
+         program {
+            signal: "elm,state,floatingbutton,left,*";
+            source: "elm";
+            script {
+               set_int(g_expand, 1);
+            }
+         }
+         program { name: "move_to_left_1btn";
+            signal: "elm,state,floatingbutton,left,1btn";
+            source: "elm";
+            action: STATE_SET "expand" 0.0;
+            target: "elm.dragable.fb";
+            transition: DECEL 0.4;
+         }
+         program { name: "move_to_left_2btn";
+            signal: "elm,state,floatingbutton,left,2btn";
+            source: "elm";
+            action: STATE_SET "2buttons_expand" 0.0;
+            target: "elm.dragable.fb";
+            transition: DECEL 0.4;
+         }
+         program { name: "move_to_right";
+            signal: "elm,state,floatingbutton,right,*";
+            source: "elm";
+            action: STATE_SET "expand" 0.0;
+            target: "right_spacer";
+            transition: DECEL 0.4;
+         }
+         program {
+            signal: "elm,state,floatingbutton,right,*";
+            source: "elm";
+            script {
+               set_int(g_expand, 1);
+            }
+         }
+         program { name: "move_to_right_1btn";
+            signal: "elm,state,floatingbutton,right,1btn";
+            source: "elm";
+            action: STATE_SET "expand" 0.0;
+            target: "elm.dragable.fb";
+            transition: DECEL 0.4;
+         }
+         program { name: "move_to_right_2btn";
+            signal: "elm,state,floatingbutton,right,2btn";
+            source: "elm";
+            action: STATE_SET "2buttons_expand" 0.0;
+            target: "elm.dragable.fb";
+            transition: DECEL 0.4;
+         }
+         program { name: "move_to_center";
+            signal: "elm,state,floatingbutton,center,*";
+            source: "elm";
+            action: STATE_SET "default" 0.0;
+            target: "left_spacer";
+            target: "right_spacer";
+            transition: DECEL 0.4;
+         }
+         program {
+            signal: "elm,state,floatingbutton,center,*";
+            source: "elm";
+            script {
+               set_int(g_expand, 0);
+            }
+         }
+         program { name: "move_to_center_1btn";
+            signal: "elm,state,floatingbutton,center,1btn";
+            source: "elm";
+            action: STATE_SET "default" 0.0;
+            target: "elm.dragable.fb";
+            transition: DECEL 0.4;
+         }
+         program { name: "move_to_center_2btn";
+            signal: "elm,state,floatingbutton,center,2btn";
+            source: "elm";
+            action: STATE_SET "2buttons" 0.0;
+            target: "elm.dragable.fb";
+            transition: DECEL 0.4;
+         }
+      }
+   }
+
+   group { name: "elm/floatingbutton/base/white_bg";
+      inherit: "elm/floatingbutton/base/default";
+      parts {
+         part { name: "vg_clipper";
+            type: RECT;
+            clip_to: "clipper";
+            description { state: "default" 0.0;
+               fixed: 1 1;
+               color: 250 250 250 255;
+               rel1.to: "elm.swallow.vg";
+               rel2.to: "elm.swallow.vg";
+            }
+            description { state: "disabled" 0.0;
+               inherit: "default";
+               color: 250 250 250 77;
+            }
+         }
+      }
+   }
diff --git a/data/mobile/images/date_picker_day_28_bg.png b/data/mobile/images/date_picker_day_28_bg.png
new file mode 100755 (executable)
index 0000000..8756a60
Binary files /dev/null and b/data/mobile/images/date_picker_day_28_bg.png differ
diff --git a/data/mobile/images/date_picker_day_29_bg.png b/data/mobile/images/date_picker_day_29_bg.png
new file mode 100755 (executable)
index 0000000..1bda653
Binary files /dev/null and b/data/mobile/images/date_picker_day_29_bg.png differ
diff --git a/data/mobile/images/date_picker_day_30_bg.png b/data/mobile/images/date_picker_day_30_bg.png
new file mode 100755 (executable)
index 0000000..c212e09
Binary files /dev/null and b/data/mobile/images/date_picker_day_30_bg.png differ
diff --git a/data/mobile/images/date_picker_day_31_bg.png b/data/mobile/images/date_picker_day_31_bg.png
new file mode 100755 (executable)
index 0000000..5b62106
Binary files /dev/null and b/data/mobile/images/date_picker_day_31_bg.png differ
diff --git a/data/mobile/images/date_picker_month_bg.png b/data/mobile/images/date_picker_month_bg.png
new file mode 100755 (executable)
index 0000000..8edc8df
Binary files /dev/null and b/data/mobile/images/date_picker_month_bg.png differ
diff --git a/data/mobile/images/date_picker_year_bg.png b/data/mobile/images/date_picker_year_bg.png
new file mode 100755 (executable)
index 0000000..3840024
Binary files /dev/null and b/data/mobile/images/date_picker_year_bg.png differ
diff --git a/data/mobile/images/time_picker_bg.png b/data/mobile/images/time_picker_bg.png
new file mode 100755 (executable)
index 0000000..351f917
Binary files /dev/null and b/data/mobile/images/time_picker_bg.png differ
diff --git a/data/wearable/images/date_picker_day_28_bg.png b/data/wearable/images/date_picker_day_28_bg.png
new file mode 100755 (executable)
index 0000000..8756a60
Binary files /dev/null and b/data/wearable/images/date_picker_day_28_bg.png differ
diff --git a/data/wearable/images/date_picker_day_29_bg.png b/data/wearable/images/date_picker_day_29_bg.png
new file mode 100755 (executable)
index 0000000..1bda653
Binary files /dev/null and b/data/wearable/images/date_picker_day_29_bg.png differ
diff --git a/data/wearable/images/date_picker_day_30_bg.png b/data/wearable/images/date_picker_day_30_bg.png
new file mode 100755 (executable)
index 0000000..c212e09
Binary files /dev/null and b/data/wearable/images/date_picker_day_30_bg.png differ
diff --git a/data/wearable/images/date_picker_day_31_bg.png b/data/wearable/images/date_picker_day_31_bg.png
new file mode 100755 (executable)
index 0000000..5b62106
Binary files /dev/null and b/data/wearable/images/date_picker_day_31_bg.png differ
diff --git a/data/wearable/images/date_picker_month_bg.png b/data/wearable/images/date_picker_month_bg.png
new file mode 100755 (executable)
index 0000000..8edc8df
Binary files /dev/null and b/data/wearable/images/date_picker_month_bg.png differ
diff --git a/data/wearable/images/date_picker_year_bg.png b/data/wearable/images/date_picker_year_bg.png
new file mode 100755 (executable)
index 0000000..3840024
Binary files /dev/null and b/data/wearable/images/date_picker_year_bg.png differ
diff --git a/data/wearable/images/time_picker_bg.png b/data/wearable/images/time_picker_bg.png
new file mode 100755 (executable)
index 0000000..351f917
Binary files /dev/null and b/data/wearable/images/time_picker_bg.png differ
diff --git a/inc/efl_extension.h.in b/inc/efl_extension.h.in
new file mode 100644 (file)
index 0000000..a060aa2
--- /dev/null
@@ -0,0 +1,101 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __EFL_EXTENSION_H__
+#define __EFL_EXTENSION_H__
+
+#ifdef EAPI
+# undef EAPI
+#endif
+
+#ifdef _WIN32
+# ifdef EFL_EXTENSION_BUILD
+#  ifdef DLL_EXPORT
+#   define EAPI __declspec(dllexport)
+#  else
+#   define EAPI
+#  endif /* ! DLL_EXPORT */
+# else
+#  define EAPI __declspec(dllimport)
+# endif /* ! EFL_EXTENSION_BUILD */
+#else
+# ifdef __GNUC__
+#  if __GNUC__ >= 4
+#   define EAPI __attribute__ ((visibility("default")))
+#  else
+#   define EAPI
+#  endif
+# else
+#  define EAPI
+# endif
+#endif /* ! _WIN32 */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+@HEADER_INCS@
+
+/**
+ * @defgroup EFL_EXTENSION_HARDWARE_KEYEVENT_GROUP Efl Extension Hardware Keyevent
+ * @ingroup CAPI_EFL_EXTENSION_MODULE
+ * @brief This group provides functionalities to grab hardware key events.
+ * @since_tizen 2.4
+ *
+ * @{
+ */
+
+/**
+ * @brief Set the keygrab of the Elm_Win object
+ *
+ * @details This API returns the sucessness of keygrab_set.
+ *          Key callback is only called when the window located in topmost(top of the window stack).
+ *
+ * @param[in] obj object to set the keygrab
+ *            The widget type of this object should be elm_win
+ * @param[in] key keyname string to set keygrab
+ *
+ * @return    The result of keygrab set
+ *
+ * @since_tizen 2.4
+ */
+EAPI Eina_Bool eext_win_keygrab_set(Elm_Win *obj, const char *key);
+
+/**
+ * @brief Unset the keygrab of the Elm_Win object
+ *
+ * @details This API returns the sucessness of keygrab_unset.
+ *
+ * @param[in] obj object to unset the keygrab
+ *            The widget type of this object should be elm_win
+ * @param[in] key keyname string to unset keygrab
+ *
+ * @return    The result of keygrab unset
+ *
+ * @since_tizen 2.4
+ */
+EAPI Eina_Bool eext_win_keygrab_unset(Elm_Win *obj, const char *key);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_H__ */
+
diff --git a/inc/efl_extension_events.h b/inc/efl_extension_events.h
new file mode 100644 (file)
index 0000000..7fc995a
--- /dev/null
@@ -0,0 +1,364 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __EFL_EXTENSION_EVENTS_H__
+#define __EFL_EXTENSION_EVENTS_H__
+
+#include <Elementary.h>
+
+#ifdef EAPI
+# undef EAPI
+#endif
+
+#ifdef _WIN32
+# ifdef EFL_EXTENSION_BUILD
+#  ifdef DLL_EXPORT
+#   define EAPI __declspec(dllexport)
+#  else
+#   define EAPI
+#  endif /* ! DLL_EXPORT */
+# else
+#  define EAPI __declspec(dllimport)
+# endif /* ! EFL_EXTENSION_BUILD */
+#else
+# ifdef __GNUC__
+#  if __GNUC__ >= 4
+#   define EAPI __attribute__ ((visibility("default")))
+#  else
+#   define EAPI
+#  endif
+# else
+#  define EAPI
+# endif
+#endif /* ! _WIN32 */
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup EFL_EXTENSION_EVENTS_GROUP Efl Extension Event
+ * @ingroup CAPI_EFL_EXTENSION_MODULE
+ * @brief This module provides functionalities to handle back/send key events.
+ * @since_tizen 2.3
+ *
+ * @{
+ */
+
+/**
+ * @brief Convenient macro function that sends back key events to the popup
+ *        to be removed.
+ *
+ * @details Popup will be removed when it has the back key event with
+ *          eext_object_event_callback_add()
+ *
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information
+ *
+ * @see   eext_object_event_callback_add()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif TV @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_popup_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   evas_object_del(obj);
+}
+
+/**
+ * @brief Convenient macro function that sends back key events to the ctxpopup
+ *        to be dismissed.
+ *
+ * @details Ctxpopup will be dismissed when it has the back key event with
+ *          eext_object_event_callback_add()
+ *
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information
+ *
+ * @see   eext_object_event_callback_add()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif TV @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_ctxpopup_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   elm_ctxpopup_dismiss(obj);
+}
+
+/**
+ * @brief Convenient macro function that sends more key events to the naviframe
+ *        top item.
+ *
+ * @details More key action of naviframe will be executed when naviframe has the
+ *          more key event with eext_object_event_callback_add()
+ *
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information
+ *
+ * @see   eext_object_event_callback_add()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif TV @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_naviframe_more_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   Elm_Object_Item *top = elm_naviframe_top_item_get(obj);
+   if (!top) return;
+   Evas_Object *more_btn = elm_object_item_part_content_get(top,
+                                                            "toolbar_more_btn");
+   if (more_btn)
+     evas_object_smart_callback_call(more_btn, "clicked", NULL);
+   else
+     elm_object_item_signal_emit(top, "elm,action,more_event", "");
+}
+
+/**
+ * @brief Convenient macro function that pop the naviframe item.
+ *
+ * @details Naviframe will be popped when naviframe has the back key event
+ *          with eext_object_event_callback_add()
+ *
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information
+ *
+ * @see   eext_object_event_callback_add()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif TV @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_naviframe_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   elm_naviframe_item_pop(obj);
+}
+
+/**
+ * Identifier of callbacks to be set for Ea events.
+ *
+ * @see eext_object_event_callback_add()
+ * @see eext_object_event_callback_del()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif TV @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+typedef enum _Eext_Callback_Type
+{
+   EEXT_CALLBACK_BACK,    /**< H/W Back Key Event */
+   EEXT_CALLBACK_MORE,    /**< H/W More Key Event */
+   EEXT_CALLBACK_LAST     /**< Reserved value. Acutally This is not matched to
+                            any meaningful behavior. */
+} Eext_Callback_Type;
+
+/**
+ * @brief Ea event callback function signature.
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information (if the event passes an additional in
+              formation.)
+ * @see eext_object_event_callback_add()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif TV @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+typedef void (*Eext_Event_Cb)(void *data, Evas_Object *obj, void *event_info);
+
+/**
+ * @brief Delete a callback function from an object.
+ *
+ * @details This function removes the most recently added callback from the
+ *          object @p obj which was triggered by the type @p type and
+ *          was calling the function @p func when triggered. If the removal is
+ *          successful it will also return the data pointer that was passed to
+ *          eext_object_event_callback_add() when the callback was added to
+ *          the object. If not successful @c NULl will be returned.
+ *
+ * @param[in] obj Object to remove a callback from.
+ * @param[in] type The type of event that was triggering the callback.
+ * @param[in] func The function that was to be called when the event was
+ *            triggered
+ * @return    data The data pointer that was to be passed to the callback.
+ *
+ * @see eext_object_event_callback_add()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif TV @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void *eext_object_event_callback_del(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func);
+
+/**
+ * @brief Add (register) a callback function to a given evas object.
+ *
+ * @details This function adds a function callback to an object when the key
+ *          event occurs on object @p obj. The key event on the object is only
+ *          triggered when the object is the most top in objects stack and
+ *          visible. This means, like the naviframe widget, if your application
+ *          needs to have the events based on the view but not focus, you can
+ *          use this callback. A callback function must have the Eext_Event_Cb
+ *          prototype definition. The first parameter (@p data) in this
+ *          definition will have the same value passed to
+ *          eext_object_event_callback_add() as the @p data parameter, at
+ *          runtime. The second parameter @p obj is the evas object on which
+ *          event occurred. Finally, the third parameter @p event_info is a
+ *          pointer to a data structure that may or may not be passed to the
+ *          callback, depending on the event type that triggered the callback.
+ *          This is so because some events don't carry extra context with them,
+ *          but others do.
+ *
+ * @param[in] obj evas object.
+ * @param[in] type The type of event that will trigger the callback.
+ * @param[in] func The function to be called when the key event is triggered.
+ * @param[in] data The data pointer to be passed to @p func.
+ *
+ * @see eext_object_event_callback_del()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif TV @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_object_event_callback_add(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func, void *data);
+
+/**
+ * @brief Convenient macro function that cancels the selection of the entry.
+ *
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information
+ *
+ * @see   eext_entry_selection_back_event_allow_set()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif TV @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_entry_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   if (elm_entry_selection_get(obj))
+     elm_entry_select_none(obj);
+
+   eext_object_event_callback_del(obj, EEXT_CALLBACK_BACK, eext_entry_back_cb);
+   evas_object_data_set(obj, "eext_entry", NULL);
+}
+
+/**
+ * @brief Convenient macro function that registers back key callback for entry.
+ *
+ * @details If the selection handler should be canceled when back key event is
+ *          triggered, then use this API.
+ *
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information
+ *
+ * @see   eext_entry_selection_back_event_allow_set()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif TV @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_entry_selection_start_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   if (!evas_object_data_get(obj, "eext_entry"))
+     {
+        evas_object_data_set(obj, "eext_entry", (void *) 1);
+        eext_object_event_callback_add(obj, EEXT_CALLBACK_BACK, eext_entry_back_cb,
+                                     NULL);
+     }
+}
+
+/**
+ * @brief Convenient macro function that clears back key callback for entry.
+ *
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information
+ *
+ * @see   eext_entry_selection_back_event_allow_set()
+ * @see   eext_object_event_callback_add()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif TV @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_entry_selection_cleared_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   if (evas_object_data_get(obj, "eext_entry"))
+     {
+        eext_object_event_callback_del(obj, EEXT_CALLBACK_BACK, eext_entry_back_cb);
+        evas_object_data_set(obj, "eext_entry", NULL);
+     }
+}
+
+/**
+ * @brief Convenient macro function that handle the back event to cancel the
+ *        selection handler of the entry.
+ * @details If the selection handler should be canceled (or not) when back key
+ *          event is triggered, then use this API.
+ * @param[in] obj Entry object.
+ * @param[in] allow @c EINA_TRUE allows the back event handling, @c EINA_FALSE
+ *              otherwise.
+ * @see   eext_object_event_callback_add()
+ * @see   eext_object_event_callback_del()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif TV @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_entry_selection_back_event_allow_set(Evas_Object *obj, Eina_Bool allow)
+{
+   if (allow)
+     {
+        evas_object_smart_callback_add(obj, "selection,start",
+                                       eext_entry_selection_start_cb, NULL);
+        evas_object_smart_callback_add(obj, "selection,cleared",
+                                       eext_entry_selection_cleared_cb, NULL);
+     }
+   else
+     {
+        evas_object_smart_callback_del(obj, "selection,start",
+                                       eext_entry_selection_start_cb);
+        evas_object_smart_callback_del(obj, "selection,cleared",
+                                       eext_entry_selection_cleared_cb);
+     }
+}
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_EVENTS_H__ */
diff --git a/inc/efl_extension_private.h b/inc/efl_extension_private.h
new file mode 100644 (file)
index 0000000..8fd149f
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __EFL_EXTENSION_PRIVATE_H__
+#define __EFL_EXTENSION_PRIVATE_H__
+
+#include <syslog.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <dlog.h>
+#include <unistd.h>
+#include <fontconfig/fontconfig.h>
+#include <fontconfig/fcfreetype.h>
+#include <glib.h>
+
+#define _(str) (gettext(str))
+#define LOCALE_DIR "/usr/share/locale"
+
+#ifdef EAPI
+# undef EAPI
+#endif
+
+#ifdef _WIN32
+# ifdef EFL_EXTENSION_BUILD
+#  ifdef DLL_EXPORT
+#   define EAPI __declspec(dllexport)
+#  else
+#   define EAPI
+#  endif /* ! DLL_EXPORT */
+# else
+#  define EAPI __declspec(dllimport)
+# endif /* ! EFL_EXTENSION_BUILD */
+#else
+# ifdef __GNUC__
+#  if __GNUC__ >= 4
+#   define EAPI __attribute__ ((visibility("default")))
+#  else
+#   define EAPI
+#  endif
+# else
+#  define EAPI
+# endif
+#endif /* ! _WIN32 */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @internal
+ *
+ * @ {
+ */
+
+#ifdef LOG_TAG
+#undef LOG_TAG
+#endif
+
+extern int _eext_log_dom;
+#define CRI(...)      EINA_LOG_DOM_CRIT(_eext_log_dom, __VA_ARGS__)
+#define ERR(...)      EINA_LOG_DOM_ERR(_eext_log_dom, __VA_ARGS__)
+#define WRN(...)      EINA_LOG_DOM_WARN(_eext_log_dom, __VA_ARGS__)
+#define INF(...)      EINA_LOG_DOM_INFO(_eext_log_dom, __VA_ARGS__)
+#define DBG(...)      EINA_LOG_DOM_DBG(_eext_log_dom, __VA_ARGS__)
+
+#define LOG_TAG "efl-extension"
+#define __CONSTRUCTOR__ __attribute__ ((constructor))
+#define __DESTRUCTOR__ __attribute__ ((destructor))
+
+/* eina magic types */
+#define EEXT_MAGIC_NONE 0x87657890
+
+typedef unsigned int eext_magic;
+#define EEXT_MAGIC                eext_magic __magic
+
+#define EEXT_MAGIC_SET(d, m)      (d)->__magic = (m)
+#define EEXT_MAGIC_CHECK(d, m)    ((d) && ((d)->__magic == (m)))
+#define EEXT_MAGIC_FAIL(d, m, fn) \
+               _eext_magic_fail((d), (d) ? (d)->__magic : 0, (m), (fn));
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_PRIVATE_H__ */
diff --git a/inc/mobile/eext_floatingbutton.h b/inc/mobile/eext_floatingbutton.h
new file mode 100644 (file)
index 0000000..13b9f0a
--- /dev/null
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @defgroup Floatingbutton Floatingbutton
+ * @ingroup CAPI_EFL_EXTENSION_MODULE
+ *
+ * @brief Widget to add floating area for buttons
+ *
+ * The Floatingbutton widget is not a real button, but only provides areas
+ * where application adds (maximum 2) buttons to.
+ *
+ * This widget inherits from the Layout one, so that all the Layout functions
+ * can be used on it. However, it includes not only visible floating area,
+ * but invisible track for moving floating area, so there is a possibility that
+ * it works differently from that you intended.
+ *
+ * Default content parts of the floatingbutton widget that you can use for are:
+ * @li "button1" - left area for button
+ * @li "button2" - right area for button
+ *
+ * Floatingbutton can be hidden by siganl emission.
+ * @li show - elm_object_signal_emit(fb, "elm,state,show", "");
+ * @li hide - elm_object_signal_emit(fb, "elm,state,hide", "");
+ */
+
+/**
+ * addtogroup Floatingbutton
+ * @{
+ */
+#include "eext_floatingbutton_common.h"
+#ifdef EFL_EO_API_SUPPORT
+#include "eext_floatingbutton_eo.h"
+#endif
+#ifndef EFL_NOLEGACY_API_SUPPORT
+#include "eext_floatingbutton_legacy.h"
+#endif
+/**
+ * @}
+ */
+
diff --git a/inc/mobile/eext_floatingbutton_common.h b/inc/mobile/eext_floatingbutton_common.h
new file mode 100644 (file)
index 0000000..3e633ac
--- /dev/null
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @addtogroup Floatingbutton
+ *
+ * @{
+ */
+
+/**
+ * Positions where floatingbutton can be placed on
+ */
+typedef enum {
+   EEXT_FLOATINGBUTTON_LEFT_OUT = 0, /**< hides in the left, but small handler will show only */
+   EEXT_FLOATINGBUTTON_LEFT, /**< shows all of buttons, but lies on the left */
+   EEXT_FLOATINGBUTTON_CENTER, /**< shows all of buttons, but lies on the center */
+   EEXT_FLOATINGBUTTON_RIGHT, /**< shows all of buttons, but lies on the right */
+   EEXT_FLOATINGBUTTON_RIGHT_OUT, /**< hides in the right, but small handler will show only */
+   EEXT_FLOATINGBUTTON_LAST /**< indicates the last, do not use this **/
+} Eext_Floatingbutton_Pos;
+
+typedef enum {
+   EEXT_FLOATINGBUTTON_MODE_DEFAULT = 0, /**< allows all positions */
+   EEXT_FLOATINGBUTTON_MODE_BOTH_SIDES, /**< allows LEFT and RIGHT positions only */
+   EEXT_FLOATINGBUTTON_MODE_LAST /**< indicates the last, do not use this **/
+} Eext_Floatingbutton_Mode;
+
+/**
+ * @}
+ */
diff --git a/inc/mobile/eext_floatingbutton_eo.h b/inc/mobile/eext_floatingbutton_eo.h
new file mode 100644 (file)
index 0000000..7ebcd09
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "eext_floatingbutton.eo.h"
diff --git a/inc/mobile/eext_floatingbutton_legacy.h b/inc/mobile/eext_floatingbutton_legacy.h
new file mode 100644 (file)
index 0000000..9e9c77c
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/**
+ * @MOBILE_ONLY
+ *
+ * @brief Add a new floatingbutton to the parent
+ *
+ * @if MOBILE @since_tizen 2.4
+ * @endif
+ *
+ * @param[in] parent The parent object
+ * @return The new object or NULL if it cannot be created
+ *
+ * @ingroup Floatingbutton
+ */
+EAPI Evas_Object *eext_floatingbutton_add(Evas_Object *parent);
+
+#include "eext_floatingbutton.eo.legacy.h"
diff --git a/inc/wearable/circle/efl_extension_circle_object.h b/inc/wearable/circle/efl_extension_circle_object.h
new file mode 100644 (file)
index 0000000..d58071c
--- /dev/null
@@ -0,0 +1,600 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __EFL_EXTENSION_CIRCLE_OBJECT_H__
+#define __EFL_EXTENSION_CIRCLE_OBJECT_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup CAPI_EFL_EXTENSION_CIRCLE_OBJECT_MODULE Efl Extension Circle Object
+ * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
+ * @brief Circle object is used for circular design of circular ui-controls.
+ *        It can be combined with elementary widgets and be a part of design.
+ *        Or it can make itself as a ui-control which is operated by rotary event.
+ *
+ * @details A Circle object extends elementary widgets in a form of circular design.
+ *          It can be rendered either independently or by @ref Eext_Circle_Surface.
+ *          When a circle object handle is added with surface parameter of @c NULL,
+ *          it is rendered independently along with Evas_Object. On the other hand,
+ *          if a circle object is created with surface parameter of @ref Eext_Circle_Surface,
+ *          passed surface will render the circle object.
+ *
+ *          eext_circle_object functions are same with eext_circle_object_item functions
+ *          with "default" for item_name parameter. You can check what is the meaning of "default" item
+ *          in each circle object's documentation.
+ *
+ * @{
+ */
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the line width of the circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] line_width The line width value of the circle object
+ *
+ * @see eext_circle_line_width_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_line_width_set(Evas_Object *obj, int line_width);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the line width of a given circle object.
+ *
+ * @param[in] obj The circle object
+ * @return The line width value of the circle object
+ *
+ * @see eext_circle_line_width_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI int eext_circle_object_line_width_get(const Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the angle in degree of a given circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] angle The angle in degree of the circle object
+ *
+ * @see eext_circle_angle_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_angle_set(Evas_Object *obj, double angle);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the angle in degree of a given circle object.
+ *
+ * @param[in] obj The circle object
+ * @return The angle of circle
+ *
+ * @see eext_circle_angle_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI double eext_circle_object_angle_get(const Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the angle offset of a given circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] angle_offset The angle offset value of the circle object
+ *
+ * @see eext_circle_angle_offset_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_angle_offset_set(Evas_Object *obj, double angle_offset);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the angle offset of a given circle object.
+ *
+ * @param[in] obj The circle object
+ * @return The angle offset of the circle object
+ *
+ * @see eext_circle_angle_offset_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI double eext_circle_object_angle_offset_get(const Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the minimum and maximum angle for the circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] min_angle The minimum angle in degree
+ * @param[in] max_angle The maximum angle in degree
+ *
+ * @see eext_circle_angle_min_max_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_angle_min_max_set(Evas_Object *obj, double min_angle, double max_angle);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the minimum and maximum angle of a given circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[out] min_angle The pointer to store the minimum angle in degree
+ * @param[out] max_angle The pointer to store the minimum angle in degree
+ *
+ * @see eext_circle_angle_min_max_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_angle_min_max_get(const Evas_Object *obj, double *min_angle, double *max_angle);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the minimum and maximum value for the circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] min_value The minimum value
+ * @param[in] max_value The maximum value
+ *
+ * @see eext_circle_value_min_max_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_value_min_max_set(Evas_Object *obj, double min_value, double max_value);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the minimum and maximum value of a given circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[out] min_value The pointer to store the minimum value
+ * @param[out] max_value The pointer to store the minimum value
+ *
+ * @see eext_circle_value_min_max_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_value_min_max_get(const Evas_Object *obj, double *min_value, double *max_value);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the value of a given circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] value The value of circle object
+ *
+ * @see eext_circle_object_value_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_value_set(Evas_Object *obj, double value);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the value of a given circle object.
+ *
+ * @param[in] obj The circle object
+ * @return The value of circle
+ *
+ * @see eext_circle_object_value_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI double eext_circle_object_value_get(const Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the color of circle line and font in a given circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] r The red component of the given color
+ * @param[in] g The green component of the given color
+ * @param[in] b The blue component of the given color
+ * @param[in] a The alpha component of the given color
+ *
+ * @see eext_circle_color_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_color_set(Evas_Object *obj, int r, int g, int b, int a);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get color of circle line and font color in a given circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[out]   r    The pointer to an integer in which to store the red component
+ *               of the color
+ * @param[out]   g    The pointer to an integer in which to store the green
+ *               component of the color
+ * @param[out]   b    The pointer to an integer in which to store the blue component
+ *               of the color
+ * @param[out]   a    The pointer to an integer in which to store the alpha
+ *               component of the color
+ *
+ * @see eext_circle_color_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_color_get(const Evas_Object *obj, int *r, int *g, int *b, int *a);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set circle radius of a given circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] radius The radius value of a given circle object
+ *
+ * @see eext_circle_radius_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_radius_set(Evas_Object *obj, double radius);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get circle radius of a given circle object.
+ *
+ * @param[in] obj The circle object
+ * @return The radius of circle
+ *
+ * @see eext_circle_color_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI double eext_circle_object_radius_get(const Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the disabled state of the circle object.
+ *
+ * @details This sets the disabled state of the circle object.
+ *          If @c EINA_TRUE, circle object will be disabled
+ *          and will not recieve any event. If @c EINA_FALSE,
+ *          circle object will be enabled.
+ *
+ * @param[in] obj The circle object
+ * @param[in] disabled The disabled state
+ *
+ * @see eext_circle_object_disabled_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_disabled_set(Evas_Object *obj, Eina_Bool disabled);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the disabled state of the circle object.
+ *
+ * @param[in] obj The circle object
+ * @return Disabled state. If @c EINA_TRUE, circle object will be disabled
+ *         and will not recieve any event. If @c EINA_FALSE, circle object
+ *         will be enabled.
+ *
+ * @see eext_circle_object_disabled_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eina_Bool eext_circle_object_disabled_get(Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add a new circle object.
+ *
+ * @param[in] parent The parent object
+ * @param[in] surface The @ref Eext_Circle_Surface object to render the circle object.
+ *                    If @c NULL, circle object will be rendered independently.
+ *
+ * @return A new circle object handle, otherwise
+ *         @c NULL if it cannot be created
+ *
+ * @see @ref CAPI_EFL_EXTENSION_CIRCLE_SURFACE_MODULE
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Evas_Object *eext_circle_object_add(Evas_Object *parent, Eext_Circle_Surface *surface);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the line width of a given item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @param[in] line_width The line width value of the circle object
+ *
+ * @see eext_circle_object_item_line_width_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_item_line_width_set(Evas_Object *obj, const char *item_name, int line_width);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the line width of a given item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @return The line width value of the circle object if it succeeds to find the item,
+ *         otherwise -1 if it fails to find the item.
+ *
+ * @see eext_circle_object_item_line_width_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI int eext_circle_object_item_line_width_get(const Evas_Object *obj, const char *item_name);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the angle in degree of a given item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @param[in] angle The angle in degree of the circle object
+ *
+ * @see eext_circle_object_item_angle_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_item_angle_set(Evas_Object *obj, const char *item_name, double angle);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the angle in degree of a given item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @return The angle of circle
+ *
+ * @see eext_circle_object_item_angle_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI double eext_circle_object_item_angle_get(const Evas_Object *obj, const char *item_name);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the angle offset of a given item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @param[in] angle_offset The angle offset value of the circle object
+ *
+ * @see eext_circle_object_item_angle_offset_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_item_angle_offset_set(Evas_Object *obj, const char *item_name, double angle_offset);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the angle offset of a given item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @return The angle offset of the circle object
+ *
+ * @see eext_circle_object_item_angle_offset_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI double eext_circle_object_item_angle_offset_get(const Evas_Object *obj, const char *item_name);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the minimum and maximum angle for the item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @param[in] min_angle The minimum angle in degree
+ * @param[in] max_angle The maximum angle in degree
+ *
+ * @see eext_circle_object_item_angle_min_max_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_item_angle_min_max_set(Evas_Object *obj, const char *item_name, double min_angle, double max_angle);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the minimum and maximum angle of a given item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @param[out] min_angle The pointer to store the minimum angle in degree
+ * @param[out] max_angle The pointer to store the minimum angle in degree
+ *
+ * @see eext_circle_object_item_angle_min_max_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_item_angle_min_max_get(const Evas_Object *obj, const char *item_name, double *min_angle, double *max_angle);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the minimum and maximum value for the item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @param[in] min_value The minimum value
+ * @param[in] max_value The maximum value
+ *
+ * @see eext_circle_object_item_value_min_max_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_item_value_min_max_set(Evas_Object *obj, const char *item_name, double min_value, double max_value);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the minimum and maximum value of a given item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @param[out] min_value The pointer to store the minimum value
+ * @param[out] max_value The pointer to store the minimum value
+ *
+ * @see eext_circle_object_item_value_min_max_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_item_value_min_max_get(const Evas_Object *obj, const char *item_name, double *min_value, double *max_value);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the value of a given item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @param[in] value The value of circle object
+ *
+ * @see eext_circle_object_item_value_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_item_value_set(Evas_Object *obj, const char *item_name, double value);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the value of a given item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @return The value of circle
+ *
+ * @see eext_circle_object_item_value_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI double eext_circle_object_item_value_get(const Evas_Object *obj, const char *item_name);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the color of circle line and font in a given item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @param[in] r The red component of the given color
+ * @param[in] g The green component of the given color
+ * @param[in] b The blue component of the given color
+ * @param[in] a The alpha component of the given color
+ *
+ * @see eext_circle_object_item_color_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_item_color_set(Evas_Object *obj, const char *item_name, int r, int g, int b, int a);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get color of circle line and font color in a given item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @param[out]   r    The pointer to an integer in which to store the red component
+ *               of the color
+ * @param[out]   g    The pointer to an integer in which to store the green
+ *               component of the color
+ * @param[out]   b    The pointer to an integer in which to store the blue component
+ *               of the color
+ * @param[out]   a    The pointer to an integer in which to store the alpha
+ *               component of the color
+ *
+ * @see eext_circle_object_item_color_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_item_color_get(const Evas_Object *obj, const char *item_name, int *r, int *g, int *b, int *a);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set circle radius of a given item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @param[in] radius The radius value of a given circle object
+ *
+ * @see eext_circle_object_item_radius_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_item_radius_set(Evas_Object *obj, const char *item_name, double radius);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get circle radius of a given item of circle object.
+ *
+ * @param[in] obj The circle object
+ * @param[in] item_name The item name of circle object
+ * @return The radius of the circle object if it succeeds to find the item,
+ *         otherwise -1.0 if it fails to find the item.
+ *
+ * @see eext_circle_object_item_radius_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI double eext_circle_object_item_radius_get(const Evas_Object *obj, const char *item_name);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_CIRCLE_H__ */
diff --git a/inc/wearable/circle/efl_extension_circle_object_datetime.h b/inc/wearable/circle/efl_extension_circle_object_datetime.h
new file mode 100644 (file)
index 0000000..20ecbf5
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __EFL_EXTENSION_CIRCLE_OBJECT_DATETIME_H__
+#define __EFL_EXTENSION_CIRCLE_OBJECT_DATETIME_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup CAPI_EFL_EXTENSION_CIRCLE_DATETIME_MODULE Efl Extension Circle Datetime
+ * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
+ * @brief Circle datetime is based on elm_datetime and is operated by rotary event.
+ *
+ * @details Circle datetime is to utilize selected field in elm_datetime.
+ *          If rotary event is activated by eext_rotary_object_event_activated_set(),
+ *          circle datetime increases/decreases value of selected field in elm_datetime
+ *          by the clockwise/counter clockwise rotary event.
+ *
+ *          The available circle object items are as follows:
+ *          @li @c "default": Default circle item. It draws a marker.
+ *
+ * @{
+ */
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add a new circle datetime object.
+ *
+ * @param[in] datetime The datetime object
+ * @param[in] surface The @ref Eext_Circle_Surface object to render the circle object.
+ *                    If @c NULL, circle object will be rendered independently.
+ * @return A new circle object handle, otherwise @c NULL if it cannot be created
+ *
+ * @see @ref CAPI_EFL_EXTENSION_CIRCLE_OBJECT_MODULE
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Evas_Object *eext_circle_object_datetime_add(Evas_Object *datetime, Eext_Circle_Surface *surface);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_CIRCLE_OBJECT_DATETIME_H__ */
diff --git a/inc/wearable/circle/efl_extension_circle_object_genlist.h b/inc/wearable/circle/efl_extension_circle_object_genlist.h
new file mode 100644 (file)
index 0000000..795d056
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __EFL_EXTENSION_CIRCLE_OBJECT_GENLIST_H__
+#define __EFL_EXTENSION_CIRCLE_OBJECT_GENLIST_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup CAPI_EFL_EXTENSION_CIRCLE_GENLIST_MODULE Efl Extension Circle Genlist
+ * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
+ * @brief Circle genlist is based on elm_genlist and is scrolled by rotary event.
+ *
+ * @details Circle genlist is to visualize and utilize scroll effect for elm_genlist.
+ *          While elm_genlist provides scrollbar with straight horizontal/vertical
+ *          movement, circle genlist provides scrollbar with circular movement.
+ *          Rotary event can be activated by eext_rotary_object_event_activated_set(),
+ *          circle genlist scrolls genlist items upward/leftward responding to
+ *          counter clockwise rotary event, and scrolls downward/rightward responding
+ *          to clockwise rotary event.
+ *
+ *          The available circle object items are as follows:
+ *          @li @c "default": Default circle item. It draws vertical scroll bar.
+ *          @li @c "vertical,scroll,bg": Vertical scroll background circle item.
+ *
+ * @{
+ */
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add a new circle genlist object.
+ *
+ * @param[in] genlist The genlist object
+ * @param[in] surface The @ref Eext_Circle_Surface object to render the circle object.
+ *                    If @c NULL, circle object will be rendered independently.
+ * @return A new circle object handle, otherwise @c NULL if it cannot be created
+ *
+ * @see @ref CAPI_EFL_EXTENSION_CIRCLE_OBJECT_MODULE
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Evas_Object *eext_circle_object_genlist_add(Evas_Object *genlist, Eext_Circle_Surface *surface);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the scrollbar visibility policy.
+ *
+ * @details This sets the scrollbar visibility policy for a given scroller.
+ *          @c ELM_SCROLLER_POLICY_AUTO means the scrollbar is made visible if it is
+ *          needed, and otherwise kept hidden. @c ELM_SCROLLER_POLICY_ON turns it on all
+ *          the time, and @c ELM_SCROLLER_POLICY_OFF always keeps it off. This applies
+ *          respectively for the vertical scrollbars.
+ *
+ * @param[in] obj The circle genlist object
+ * @param[in] policy_h The horizontal scrollbar policy
+ * @param[in] policy_v The vertical scrollbar policy
+ *
+ * @see eext_circle_object_genlist_scroller_policy_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_genlist_scroller_policy_set(Evas_Object *obj, Elm_Scroller_Policy policy_h, Elm_Scroller_Policy policy_v);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the scrollbar visibility policy.
+ *
+ * @param[in] obj The circle genlist object
+ * @param[out] policy_h The horizontal scrollbar policy
+ * @param[out] policy_v The vertical scrollbar policy
+ *
+ * @see eext_circle_object_genlist_scroller_policy_set();
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_genlist_scroller_policy_get(const Evas_Object *obj, Elm_Scroller_Policy *policy_h, Elm_Scroller_Policy *policy_v);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_CIRCLE_OBJECT_GENLIST_H__ */
diff --git a/inc/wearable/circle/efl_extension_circle_object_progressbar.h b/inc/wearable/circle/efl_extension_circle_object_progressbar.h
new file mode 100644 (file)
index 0000000..ee060f5
--- /dev/null
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __EFL_EXTENSION_CIRCLE_OBJECT_PROGRESSBAR_H__
+#define __EFL_EXTENSION_CIRCLE_OBJECT_PROGRESSBAR_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup CAPI_EFL_EXTENSION_CIRCLE_PROGRESSBAR_MODULE Efl Extension Circle Progressbar
+ * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
+ * @brief Circle progressbar aims to show the progress status of a given task with circular design.
+ *        It visualizes progress status within a range set by eext_circle_object_angle_min_max_set()
+ *        as an arc of a circle.
+ *
+ * @details The available circle object items are as follows:
+ *          @li @c "default": Default circle item. It draws progress bar.
+ *          @li @c "bg": Progress bar background circle item.
+ *
+ * @{
+ */
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add a new circle progressbar to a given surface.
+ *
+ * @param[in] parent The parent object
+ * @param[in] surface The @ref Eext_Circle_Surface object to render the circle object.
+ *                    If @c NULL, circle object will be rendered independently.
+ * @return A new circle object handle, otherwise @c NULL in case of an error
+ *
+ * @see @ref CAPI_EFL_EXTENSION_CIRCLE_OBJECT_MODULE
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Evas_Object *eext_circle_object_progressbar_add(Evas_Object *parent, Eext_Circle_Surface *surface);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_CIRCLE_OBJECT_PROGRESSBAR_H__ */
diff --git a/inc/wearable/circle/efl_extension_circle_object_scroller.h b/inc/wearable/circle/efl_extension_circle_object_scroller.h
new file mode 100644 (file)
index 0000000..d151916
--- /dev/null
@@ -0,0 +1,110 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __EFL_EXTENSION_CIRCLE_OBJECT_SCROLLER_H__
+#define __EFL_EXTENSION_CIRCLE_OBJECT_SCROLLER_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup CAPI_EFL_EXTENSION_CIRCLE_SCROLLER_MODULE Efl Extension Circle Scroller
+ * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
+ * @brief Circle scroller is based on elm_scroller and is scrolled by rotary event.
+ *
+ * @details Circle scroller is to visualize and utilize scroll effect for elm_scroller.
+ *          While elm_scroller provides scrollbar with straight horizontal/vertical
+ *          movement, circle scroller provides scrollbar with circular movement.
+ *          Rotary event can be activated by eext_rotary_object_event_activated_set(),
+ *          circle scroller scrolls items upward/leftward responding to counter clockwise
+ *          rotary event, and scrolls downward/rightward responding to clockwise rotary event.
+ *
+ *          The available circle object items are as follows:
+ *          @li @c "default": Default circle item. It draws vertical scroll bar.
+ *          @li @c "vertical,scroll,bg": Vertical scroll background circle item.
+ *          @li @c "horizontal,scroll,bar": Horizontal scroll bar circle item.
+ *          @li @c "horizontal,scroll,bg": Horizontal scroll background circle item.
+ *
+ * @{
+ */
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add a new circle scroller object.
+ *
+ * @param[in] scroller The scroller object
+ * @param[in] surface The @ref Eext_Circle_Surface object to render the circle object.
+ *                    If @c NULL, circle object will be rendered independently.
+ * @return A new circle object handle, otherwise @c NULL if it cannot be created
+ *
+ * @see @ref CAPI_EFL_EXTENSION_CIRCLE_OBJECT_MODULE
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Evas_Object *eext_circle_object_scroller_add(Evas_Object *scroller, Eext_Circle_Surface *surface);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the scrollbar visibility policy.
+ *
+ * @details This sets the scrollbar visibility policy of a given scroller.
+ *          @c ELM_SCROLLER_POLICY_AUTO indicates the scrollbar is made visible
+ *          if it is needed, and otherwise is kept hidden. @c ELM_SCROLLER_POLICY_ON
+ *          turns the scrollbar on all the time, and @c ELM_SCROLLER_POLICY_OFF
+ *          turns it off. This applies to the horizontal and vertical scrollbars
+ *          respectively.
+ *
+ * @param[in] obj The circle scroller object
+ * @param[in] policy_h The horizontal scrollbar policy
+ * @param[in] policy_v The vertical scrollbar policy
+ *
+ * @see eext_circle_object_scroller_policy_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_scroller_policy_set(Evas_Object *obj,
+                                                 Elm_Scroller_Policy policy_h,
+                                                 Elm_Scroller_Policy policy_v);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the scrollbar visibility policy.
+ *
+ * @param[in] obj The circle scroller object
+ * @param[out] policy_h The horizontal scrollbar policy
+ * @param[out] policy_v The vertical scrollbar policy
+ *
+ * @see eext_circle_object_scroller_policy_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_scroller_policy_get(const Evas_Object *obj,
+                                                 Elm_Scroller_Policy *policy_h,
+                                                 Elm_Scroller_Policy *policy_v);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_CIRCLE_OBJECT_SCROLLER_H__ */
diff --git a/inc/wearable/circle/efl_extension_circle_object_slider.h b/inc/wearable/circle/efl_extension_circle_object_slider.h
new file mode 100644 (file)
index 0000000..ab2b248
--- /dev/null
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __EFL_EXTENSION_CIRCLE_OBJECT_SLIDER_H__
+#define __EFL_EXTENSION_CIRCLE_OBJECT_SLIDER_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup CAPI_EFL_EXTENSION_CIRCLE_SLIDER_MODULE Efl Extension Circle Slider
+ * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
+ * @brief Circle slider is circular designed widget to select a value in a range
+ *        by rotary event.
+ *
+ * @details Circle slider visualizes and utilizess slider as an arc of a circle.
+ *          Length of an arc indicates a value in a range set by
+ *          eext_circle_object_angle_min_max_set(). If rotary event is activated
+ *          by eext_rotary_object_event_activated_set(), Circle slider increases
+ *          its value by step value from eext_circle_object_slider_step_set()
+ *          when clockwise rotary event is received, vice versa.
+ *
+ *          This widget emits the following signals:
+ *          @li "value,changed": Whenever the slider value is changed by the user.
+ *
+ *          The available circle object items are as follows:
+ *          @li @c "default": Default circle item. It draws slider bar.
+ *          @li @c "bg": Background circle item.
+ *
+ * @{
+ */
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add a new circle slider object.
+ *
+ * @param[in] parent The parent object
+ * @param[in] surface The @ref Eext_Circle_Surface object to render the circle object.
+ *                    If @c NULL, circle object will be rendered independently.
+ * @return A new circle object handle, otherwise @c NULL in case of an error
+ *
+ * @see @ref CAPI_EFL_EXTENSION_CIRCLE_OBJECT_MODULE
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Evas_Object *eext_circle_object_slider_add(Evas_Object *parent, Eext_Circle_Surface *surface);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the step value of the circle slider object.
+ *
+ * @details This value is used when circle slider object's value is changed
+ *          by an event. The value of eext_circle_object_slider is increased/decreased
+ *          by the step value.
+ *
+ * @param[in] obj The circle slider object
+ * @param[in] step The step value of the eext_circle_slider object
+ *
+ * @see eext_circle_object_slider_step_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_object_slider_step_set(Evas_Object *obj, double step);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the step value of the circle slider object.
+ *
+ * @param[in] obj The circle slider object
+ * @return The step value of the circle slider object
+ *
+ * @see eext_circle_object_slider_step_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI double eext_circle_object_slider_step_get(const Evas_Object *obj);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_CIRCLE_OBJECT_SLIDER_H__ */
diff --git a/inc/wearable/circle/efl_extension_circle_object_spinner.h b/inc/wearable/circle/efl_extension_circle_object_spinner.h
new file mode 100644 (file)
index 0000000..db70496
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __EFL_EXTENSION_CIRCLE_OBJECT_SPINNER_H__
+#define __EFL_EXTENSION_CIRCLE_OBJECT_SPINNER_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup CAPI_EFL_EXTENSION_CIRCLE_SPINNER_MODULE Efl Extension Circle Spinner
+ * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
+ * @brief Circle spinner is based on elm_spinner and is operated by rotary event.
+ *
+ * @details Circle spinner is to display and handle spinner value by rotary event.
+ *          If rotary event is activated by eext_rotary_object_event_activated_set(),
+ *          circle spinner increases/decreases value of elm_spinner
+ *          by the clockwise/counter clockwise rotary event.
+ *
+ *          The available circle object items are as follows:
+ *          @li @c "default": Default circle item. It draws a marker.
+ *
+ * @{
+ */
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add a new circle spinner object.
+ *
+ * @param[in] spinner The spinner object
+ * @param[in] surface The @ref Eext_Circle_Surface object to render the circle object.
+ *                    If @c NULL, circle object will be rendered independently.
+ * @return A new circle object handle, otherwise @c NULL if it cannot be created
+ *
+ * @see @ref CAPI_EFL_EXTENSION_CIRCLE_OBJECT_MODULE
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Evas_Object *eext_circle_object_spinner_add(Evas_Object *spinner, Eext_Circle_Surface *surface);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the circle spinner angle per each spinner value.
+ *
+ * @details This is not set a circle spinner picker angle offset.
+ *          It's set the angle per each spinner value.
+ *          default angle per each spinner value is calculated below formula.
+ *          (360/ max - min) * step
+ *
+ * @param[in] obj The circle spinner object
+ * @param[in] angle The angle value per each spinner value.
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+
+EAPI void eext_circle_object_spinner_angle_set(Evas_Object *obj, double angle);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_CIRCLE_OBJECT_SPINNER_H__ */
diff --git a/inc/wearable/circle/efl_extension_circle_private.h b/inc/wearable/circle/efl_extension_circle_private.h
new file mode 100644 (file)
index 0000000..168e06d
--- /dev/null
@@ -0,0 +1,369 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __EFL_EXTENSION_CIRCLE_PRIVATE_H__
+#define __EFL_EXTENSION_CIRCLE_PRIVATE_H__
+
+#include <cairo.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#define EEXT_CIRCLE_OBJECT_TYPE "Eext_Circle_Object"
+
+#define EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) \
+     Eext_Circle_Object *circle_obj = NULL; \
+     circle_obj = evas_object_data_get(obj, EEXT_CIRCLE_OBJECT_TYPE); \
+     if (!circle_obj)
+/**
+ * Put Document
+ */
+typedef struct _Eext_Circle_Object Eext_Circle_Object;
+
+typedef enum
+{
+   EEXT_CIRCLE_SURFACE_TYPE_DEFAULT,
+   EEXT_CIRCLE_SURFACE_TYPE_PRIVATE,
+   EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME,
+   EEXT_CIRCLE_SURFACE_TYPE_LAST
+} Eext_Circle_Surface_Type;
+
+struct _Eext_Circle_Surface {
+   Evas_Object         *parent;
+   Evas_Object         *image_widget;
+   cairo_surface_t     *cairo_surface;
+   cairo_t             *cairo;
+   unsigned char       *buffer;
+   Evas_Coord           w, h;
+   Evas_Coord           center_x, center_y;
+   Eext_Circle_Surface_Type type;
+
+   Eina_List           *render_objs;
+
+   Ecore_Job           *render_job;
+
+   Eext_Circle_Surface *parent_surface;
+   Eina_List           *sub_surfaces;
+   Eext_Circle_Object  *deactivated_obj;
+};
+
+typedef struct _Eext_Circle_Color Eext_Circle_Color;
+struct _Eext_Circle_Color {
+   int r, g, b, a;
+};
+
+struct _Eext_Circle_Object {
+   Evas_Object          *image_widget;
+   Evas_Object          *widget_object;
+   void                 *widget_data;
+   const char           *widget_type;
+
+   Eina_List           *bg_image_objs;
+   int                  bg_image_index;
+
+   Eext_Circle_Surface  *surface;
+   Eina_List            *items;
+   Eina_List            *text_items;
+
+   // del_func: Do only for widget_data.
+   // Other things are handled by Eext_Circle_Object.
+   void                (*del_func)(Eext_Circle_Object *obj);
+   // disabled_func: When disabled state is changed, it will be called.
+   void                (*disabled_func)(Eext_Circle_Object *obj);
+   // color_changed_func: When color of an item is changed, it will be called.
+   void                (*color_changed_func)(Eext_Circle_Object *obj, const char *item_name);
+
+   Eina_Bool             visible : 1;
+   Eina_Bool             disabled : 1;
+   Eina_Bool             visible_on_activate: 1;
+   Eina_Bool             is_active: 1;
+};
+
+typedef struct _Eext_Circle_Object_Item Eext_Circle_Object_Item;
+struct _Eext_Circle_Object_Item {
+   Eext_Circle_Object *obj;
+   const char *name;
+   void *data;
+
+   // For text draw
+   const char *text;
+   const char *font;
+   const char *selected_font;
+   int font_size;
+
+   double radius;
+   int line_width;
+
+   int center_x;
+   int center_y;
+
+   double min_angle;
+   double max_angle;
+
+   double value;
+   double min_value;
+   double max_value;
+
+   double angle;
+   double angle_offset;
+
+   Eext_Circle_Color color;
+
+   struct {
+      double angle;
+      double angle_offset;
+      Eext_Circle_Color color;
+   } draw;
+
+   struct {
+      Ecore_Animator *animator_cb;
+      double          duration;
+      double          start_time;
+      double          current_animator_pos;
+      Eext_Circle_Color from_color;
+      double          cubic_bezier_v[4];
+      Eina_Bool       cubic_bezier_enabled : 1;
+   } color_transit;
+
+   struct {
+      Ecore_Animator *animator_cb;
+      double          duration;
+      double          start_time;
+      double          current_animator_pos;
+      double          from_angle, from_angle_offset;
+      double          cubic_bezier_v[4];
+      Eina_Bool       cubic_bezier_enabled : 1;
+   } angle_transit;
+
+   Eina_Bool round_cap;
+};
+
+/* Datetime widget data */
+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 rotary_angle;
+   double type_current_angle;
+
+   Eina_Bool circle_changed : 1;
+};
+
+/* Progressbar widget data */
+typedef struct _Eext_Circle_Object_Progressbar_Data Eext_Circle_Object_Progressbar_Data;
+struct _Eext_Circle_Object_Progressbar_Data {
+   Eext_Circle_Color color;
+   Eext_Circle_Color bg_color;
+   Eext_Circle_Color disabled_color;
+   Eext_Circle_Color disabled_bg_color;
+};
+
+/* Slider widget data */
+typedef struct _Eext_Circle_Object_Slider_Data Eext_Circle_Object_Slider_Data;
+struct _Eext_Circle_Object_Slider_Data {
+   double value_step;
+
+   Eext_Circle_Color color;
+   Eext_Circle_Color bg_color;
+   Eext_Circle_Color disabled_color;
+   Eext_Circle_Color disabled_bg_color;
+};
+
+/* Genlist widget data */
+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;
+
+   Eext_Circle_Color color;
+   Eext_Circle_Color bg_color;
+   Eext_Circle_Color disabled_color;
+   Eext_Circle_Color disabled_bg_color;
+
+   Eina_Bool realized_callback_added : 1;
+};
+
+/* Scroller widget data */
+typedef struct _Eext_Circle_Object_Scroller_Data Eext_Circle_Object_Scroller_Data;
+struct _Eext_Circle_Object_Scroller_Data {
+   Ecore_Timer *bar_hide_timer;
+   Elm_Scroller_Policy policy_v, policy_h;
+
+   Eext_Circle_Color vertical_color;
+   Eext_Circle_Color vertical_bg_color;
+   Eext_Circle_Color horizontal_color;
+   Eext_Circle_Color horizontal_bg_color;
+   Eext_Circle_Color disabled_color;
+   Eext_Circle_Color disabled_bg_color;
+
+   int step_x, step_y;
+   int line_width;
+   double radius;
+};
+
+/* 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;
+     double angle;
+     double to_angle_offset;
+     double end_effect_angle;
+};
+
+///////////////////////////////
+// Internal APIs //////////////
+///////////////////////////////
+
+// Surface
+Eext_Circle_Surface *_eext_circle_surface_init(Evas_Object *image_widget, Evas_Object *parent, Eext_Circle_Surface_Type type);
+
+void _eext_circle_surface_finish(Eext_Circle_Surface *surface);
+
+void _eext_circle_surface_object_remove(Eext_Circle_Surface *surface, Eext_Circle_Object *obj);
+
+void _eext_circle_surface_object_append(Eext_Circle_Surface *surface, Eext_Circle_Object *obj);
+
+void _eext_circle_surface_changed(Eext_Circle_Surface *surface);
+
+Eext_Circle_Surface *_eext_circle_surface_add(Evas_Object *parent, Eext_Circle_Surface_Type type);
+
+void _eext_circle_surface_object_exclusive_show(Eext_Circle_Surface *surface, Eext_Circle_Object *obj);
+
+// Item
+double _eext_circle_object_item_value_angle_get(const Eext_Circle_Object_Item *item, double value);
+
+double _eext_circle_object_item_angle_value_get(const Eext_Circle_Object_Item *item, double angle);
+
+const char *_eext_circle_text_font_get(const char *text, const char *font_family);
+
+void _eext_circle_object_item_name_set(Eext_Circle_Object_Item *item, const char *name);
+
+const char *_eext_circle_object_item_name_get(const Eext_Circle_Object_Item *item);
+
+Eext_Circle_Object_Item *_eext_circle_object_item_new(void);
+
+void _eext_circle_object_item_free(Eext_Circle_Object_Item *item);
+
+void _eext_circle_object_item_prepend(Eext_Circle_Object *obj, Eext_Circle_Object_Item *item);
+
+void _eext_circle_object_item_append(Eext_Circle_Object *obj, Eext_Circle_Object_Item *item);
+
+void _eext_circle_object_item_insert_before(Eext_Circle_Object *obj, Eext_Circle_Object *before, Eext_Circle_Object_Item *item);
+
+void _eext_circle_object_item_insert_after(Eext_Circle_Object *obj, Eext_Circle_Object *after, Eext_Circle_Object_Item *item);
+
+void _eext_circle_object_item_remove(Eext_Circle_Object_Item *item);
+
+void _eext_circle_object_item_line_width_set(Eext_Circle_Object_Item *item, int line_width);
+
+int _eext_circle_object_item_line_width_get(const Eext_Circle_Object_Item *item);
+
+void _eext_circle_object_item_angle_set(Eext_Circle_Object_Item *item, double angle);
+
+double _eext_circle_object_item_angle_get(const Eext_Circle_Object_Item *item);
+
+void _eext_circle_object_item_angle_offset_set(Eext_Circle_Object_Item *item, double angle_offset);
+
+double _eext_circle_object_item_angle_offset_get(const Eext_Circle_Object_Item *item);
+
+void _eext_circle_object_item_angle_min_max_set(Eext_Circle_Object_Item *item,
+                                                double min_angle, double max_angle);
+
+void _eext_circle_object_item_angle_min_max_get(const Eext_Circle_Object_Item *item,
+                                                double *min_angle, double *max_angle);
+
+void _eext_circle_object_item_value_min_max_set(Eext_Circle_Object_Item *item,
+                                                double min_value, double max_value);
+
+void _eext_circle_object_item_value_min_max_get(const Eext_Circle_Object_Item *item,
+                                                double *min_value, double *max_value);
+
+void _eext_circle_object_item_value_set(Eext_Circle_Object_Item *item, double value);
+
+double _eext_circle_object_item_value_get(const Eext_Circle_Object_Item *item);
+
+void _eext_circle_object_item_color_set(Eext_Circle_Object_Item *item,
+                                        int r, int g, int b, int a);
+
+void _eext_circle_object_item_color_get(const Eext_Circle_Object_Item *item,
+                                        int *r, int *g, int *b, int *a);
+
+void _eext_circle_object_item_radius_set(Eext_Circle_Object_Item *item, double radius);
+
+double _eext_circle_object_item_radius_get(const Eext_Circle_Object_Item *item);
+
+void _eext_circle_object_item_text_set(Eext_Circle_Object_Item *item,
+                                       const char *text,
+                                       const char *font);
+
+void _eext_circle_object_item_text_get(const Eext_Circle_Object_Item *item,
+                                       const char **text,
+                                       const char **font);
+
+void _eext_circle_object_item_font_size_set(Eext_Circle_Object_Item *item,
+                                            int font_size);
+
+int _eext_circle_object_item_font_size_get(const Eext_Circle_Object_Item *item);
+
+void _eext_circle_object_item_color_transit_set(Eext_Circle_Object_Item *item, double duration,
+                                                int to_r, int to_g, int to_b, int to_a,
+                                                Eina_Bool cubic_bezier_enabled,
+                                                double cubic_bezier_p1_x, double cubic_bezier_p1_y,
+                                                double cubic_bezier_p2_x, double cubic_bezier_p2_y
+                                               );
+
+void _eext_circle_object_item_angle_transit_set(Eext_Circle_Object_Item *item, double duration,
+                                                double to_angle, double to_angle_offset,
+                                                Eina_Bool cubic_bezier_enabled,
+                                                double cubic_bezier_p1_x, double cubic_bezier_p1_y,
+                                                double cubic_bezier_p2_x, double cubic_bezier_p2_y);
+
+void _eext_circle_object_item_value_transit_set(Eext_Circle_Object_Item *item, double duration,
+                                                double to_value,
+                                                Eina_Bool cubic_bezier_enabled,
+                                                double cubic_bezier_p1_x, double cubic_bezier_p1_y,
+                                                double cubic_bezier_p2_x, double cubic_bezier_p2_y);
+
+void _eext_circle_object_item_round_cap_enable_set(Eext_Circle_Object_Item *item, Eina_Bool round_cap);
+
+Eina_Bool _eext_circle_object_item_round_cap_enable_get(const Eext_Circle_Object_Item *item);
+
+// Circle Common Private
+void _eext_circle_object_init(Evas_Object *obj, Evas_Object *widget_object, Eext_Circle_Surface *surface);
+
+void _eext_circle_object_finish(Evas_Object *obj, Eext_Circle_Object *circle_obj);
+
+void _eext_circle_object_changed(Eext_Circle_Object *obj);
+
+Eext_Circle_Object_Item *_eext_circle_object_item_get(const Eext_Circle_Object *obj, const char *name);
+
+void _eext_circle_object_hide(Eext_Circle_Object *obj);
+
+void _eext_circle_object_show(Eext_Circle_Object *obj);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* __EFL_EXTENSION_CIRCLE_PRIVATE_H__ */
diff --git a/inc/wearable/circle/efl_extension_circle_surface.h b/inc/wearable/circle/efl_extension_circle_surface.h
new file mode 100644 (file)
index 0000000..c50d954
--- /dev/null
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __EFL_EXTENSION_CIRCLE_SURFACE_H__
+#define __EFL_EXTENSION_CIRCLE_SURFACE_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE Efl Extension Circle UI
+ * @ingroup CAPI_EFL_EXTENSION_MODULE
+ * @brief This module provides circular ui-controls which are for the devices with circular display.
+ */
+
+/**
+ * @defgroup CAPI_EFL_EXTENSION_CIRCLE_SURFACE_MODULE Efl Extension Circle Surface
+ * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
+ * @brief Surface aims to show one of its connected circle objects.
+ *
+ * @details The circle surface manages connected circle objects.
+ *          When a circle object is chosen to be shown,
+ *          the surface shows the circle object and hides the others.
+ *          A circle object can be shown and received the rotary event on the surface by
+ *          @ref eext_rotary_object_event_activated_set() or @ref evas_object_show().
+ *
+ *          The circle surface can be created by @ref eext_circle_surface_conformant_add()
+ *          and @ref eext_circle_surface_layout_add().
+ * @{
+ */
+
+/**
+ * @WEARABLE_ONLY
+ * @typedef Eext_Circle_Surface
+ * @brief The structure of circle surface to render a connected circle object.
+ *
+ * @details The circle surface manages and shows a connected circle object.
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+typedef struct _Eext_Circle_Surface Eext_Circle_Surface;
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add a new circle surface to the given comformant.
+ *
+ * @details The circle surface needs the conformant to be seen in upper layer.
+ *
+ * @remarks The confom parameter is a conformant object pointer
+ *          which is created by @ref elm_conformant_add()
+ *          and the conformant's style should not be changed
+ *          because in eext_circle_surface_conformant_add()
+ *          it will be changed to circle style for circle surface.
+ *
+ * @param[in] conform The conformant
+ * @return An @ref Eext_Circle_Surface handle, otherwise @c NULL in case of an error
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Circle_Surface *eext_circle_surface_conformant_add(Evas_Object *conform);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add a new circle surface to the given layout.
+ *
+ * @details The circle surface needs the layout to be set to the given layout.
+ *
+ * @remarks The layout parameter is a layout object pointer which is created by @ref elm_layout_add()
+ *          and the style of it should not change because in @ref eext_circle_surface_layout_add()
+ *          it will be changed to circle style for circle surface.
+ *
+ * @param[in] layout The layout
+ * @return An @ref Eext_Circle_Surface handle, otherwise @c NULL in case of an error
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Circle_Surface *eext_circle_surface_layout_add(Evas_Object *layout);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add a new circle surface to the given naviframe.
+ *
+ * @details The circle surface needs the naviframe to be set to the pushed naviframe items.
+ *
+ * @remarks The naviframe parameter is a naviframe object pointer
+ *          which is created by @ref elm_naviframe_add()
+ *
+ * @param[in] naviframe The naviframe
+ * @return An @ref Eext_Circle_Surface handle, otherwise @c NULL in case of an error
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Circle_Surface *eext_circle_surface_naviframe_add(Evas_Object *naviframe);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Delete the given circle surface.
+ *
+ * @param[in] surface The @ref Eext_Circle_Surface
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_circle_surface_del(Eext_Circle_Surface *surface);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_CIRCLE_H__ */
diff --git a/inc/wearable/circle/efl_extension_rotary.h b/inc/wearable/circle/efl_extension_rotary.h
new file mode 100644 (file)
index 0000000..f3a98ba
--- /dev/null
@@ -0,0 +1,299 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __EFL_EXTENSION_ROTARY_H__
+#define __EFL_EXTENSION_ROTARY_H__
+
+#include "Evas.h"
+
+#ifdef EAPI
+# undef EAPI
+#endif
+
+#ifdef _WIN32
+# ifdef EFL_EXTENSION_BUILD
+#  ifdef DLL_EXPORT
+#   define EAPI __declspec(dllexport)
+#  else
+#   define EAPI
+#  endif /* ! DLL_EXPORT */
+# else
+#  define EAPI __declspec(dllimport)
+# endif /* ! EFL_EXTENSION_BUILD */
+#else
+# ifdef __GNUC__
+#  if __GNUC__ >= 4
+#   define EAPI __attribute__ ((visibility("default")))
+#  else
+#   define EAPI
+#  endif
+# else
+#  define EAPI
+# endif
+#endif /* ! _WIN32 */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup CAPI_EFL_EXTENSION_ROTARY_EVENT_MODULE Efl Extension Rotary Event
+ * @ingroup CAPI_EFL_EXTENSION_MODULE
+ * @brief This module provides functionalities to handle rotary events.
+ *
+ * @details This rotary object emits the following signals.
+ *
+ *          @li "rotary,activated": A circle object is activated.
+ *          @li "rotary,deactivated": A circle object is deactivated.
+ *
+ * @{
+ *
+ */
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Enumeration of rotary direction
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+typedef enum _Eext_Rotary_Event_Direction
+{
+   EEXT_ROTARY_DIRECTION_CLOCKWISE, /**< Rotary is rotated clockwise direction */
+   EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE /**< Rotary is rotated counter clockwise direction */
+} Eext_Rotary_Event_Direction;
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Rotary event information structure
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+typedef struct _Eext_Rotary_Event_Info
+{
+   Eext_Rotary_Event_Direction direction; /**< Direction of rotary event */
+   unsigned int                time_stamp; /**< Timestamp of rotary event */
+} Eext_Rotary_Event_Info;
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Rotary object event callback function signature
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+typedef Eina_Bool (*Eext_Rotary_Event_Cb)(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Rotary event handler function signature
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+typedef Eina_Bool (*Eext_Rotary_Handler_Cb)(void *data, Eext_Rotary_Event_Info *info);
+
+/**
+ * @WEARABLE_ONLY
+ * @def EEXT_CALLBACK_PRIORITY_BEFORE
+ * Slightly more prioritized than default.
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+#define EEXT_CALLBACK_PRIORITY_BEFORE  -100
+
+/**
+ * @WEARABLE_ONLY
+ * @def EEXT_CALLBACK_PRIORITY_DEFAULT
+ * Default callback priority level
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+#define EEXT_CALLBACK_PRIORITY_DEFAULT 0
+
+/**
+ * @WEARABLE_ONLY
+ * @def EEXT_CALLBACK_PRIORITY_AFTER
+ * Slightly less prioritized than default.
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+#define EEXT_CALLBACK_PRIORITY_AFTER   100
+
+/**
+ * @WEARABLE_ONLY
+ * @typedef Eext_Callback_Priority
+ *
+ * Callback priority value. Range is -32k - 32k. The lower the number, the
+ * higher the priority.
+ *
+ * @see EEXT_CALLBACK_PRIORITY_AFTER
+ * @see EEXT_CALLBACK_PRIORITY_BEFORE
+ * @see EEXT_CALLBACK_PRIORITY_DEFAULT
+ *
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+typedef short Eext_Callback_Priority;
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add (register) a rotary event callback for evas object @a obj.
+ *
+ * @details This function adds a callback function to object with default
+ * priority level, so that when rotary event happens,
+ * the callback can be called for that object.
+ * A callback function must have the ::Eext_Rotary_Event_Cb prototype
+ * definition.
+ * @note Be carefull not to add the same callback multiple times, if
+ * that is not what you want, because Eext won't check if a callback
+ * existed before exactly as the one being registered (and thus, call
+ * it more than once on the event, in this case).
+ *
+ * @param[in] obj The object that will receive rotary event.
+ * @param[in] func Callback function.
+ * @param[in] data User data to pass to callback function @a func.
+ *
+ * @return @c EINA_TRUE if the callback is successfully registered.
+ *         @c EINA_FALSE otherwise.
+ *
+ * @see eext_rotary_object_event_callback_priority_add
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eina_Bool eext_rotary_object_event_callback_add(Evas_Object *obj, Eext_Rotary_Event_Cb func, void *data);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add (register) a rotary event callback for evas object @a obj
+ * with priority @a priority.
+ *
+ * @details This function adds a callback function to object with
+ * priority level @a priority, so that when rotary event happens,
+ * the callback can be called for that object. Except for the priority field,
+ * it is exactly the same as @ref eext_rotary_object_event_callback_add.
+ *
+ * @param[in] obj The object that will receive rotary event.
+ * @param[in] priority The priority of the callback, lower values called first.
+ * @param[in] func Callback function.
+ * @param[in] data User data to pass to callback function @a func.
+ *
+ * @return @c EINA_TRUE if the callback is successfully registered.
+ *         @c EINA_FALSE otherwise.
+ *
+ * @see eext_rotary_object_event_callback_add
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eina_Bool eext_rotary_object_event_callback_priority_add(Evas_Object *obj, Eext_Callback_Priority priority, Eext_Rotary_Event_Cb func, void *data);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Remove registered rotary event callback from evas object @a obj.
+ *
+ * @param[in] obj The object from which the callback function is removed.
+ * @param[in] func Callback function.
+ *
+ * @return The data which is passed when registers callback function.
+ *
+ * @see eext_rotary_object_event_callback_add.
+ * @see eext_rotary_object_event_callback_priority_add.
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void *eext_rotary_object_event_callback_del(Evas_Object *obj, Eext_Rotary_Event_Cb func);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add (register) a handler for rotary event.
+ *
+ * @details This function adds a handler function for the rotary event,
+ * so that when rotary event happens, the handler can be called.
+ * A handler function must have the ::Eext_Rotary_Handler_Cb prototype
+ * definition.
+ * @note Be carefull not to add the same handler multiple times, if
+ * that is not what you want, because Eext won't check if a handler
+ * existed before exactly as the one being registered (and thus, call
+ * it more than once on the event, in this case).
+ *
+ * @param[in] func Handler function.
+ * @param[in] data User data to pass to handler function @a func.
+ *
+ * @return @c EINA_TRUE if the handler is successfully registered.
+ *         @c EINA_FALSE otherwise.
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eina_Bool eext_rotary_event_handler_add(Eext_Rotary_Handler_Cb func, void *data);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Remove registered rotary event handler.
+ *
+ * @param[in] func Handler function.
+ *
+ * @return The data which is passed when registers callback function.
+ *
+ * @see eext_rotary_event_handler_add.
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void *eext_rotary_event_handler_del(Eext_Rotary_Handler_Cb func);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set an object @a obj as activated object.
+ *
+ * @details This function sets object as an activated object.
+ * The activated object and its parent are only objects to receive rotary event.
+ * Only one object is registered as activated object. If the new object is
+ * registered as activated object, the previous activated object will be
+ * de-activated. Set EINA_FALSE to activated parameter will set current activated
+ * object as non-activated object also.
+ * A signal named "rotary,activated" is emitted to the object when it is set as
+ * activated object and similar for "rotary,deactivated" signal.
+ * To receive the rotary event, the object must be visible and a callback function
+ * must be registered to the object with
+ * @ref eext_rotary_object_event_callback_add or
+ * @ref eext_rotary_object_event_callback_priority_add.
+ *
+ * @param[in] obj The object to set as activated object.
+ * @param[in] activated Set EINA_TRUE to activate or EINA_FALSE to de-activate object.
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_rotary_object_event_activated_set(Evas_Object *obj, Eina_Bool activated);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // __EFL_EXTENSION_ROTARY_H__
diff --git a/inc/wearable/common/efl_extension_common.h b/inc/wearable/common/efl_extension_common.h
new file mode 100644 (file)
index 0000000..816c824
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __EFL_EXTENSION_COMMON_H__
+#define __EFL_EXTENSION_COMMON_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup CAPI_EFL_EXTENSION_COMMON_UI_MODULE Efl Extension Common UI
+ * @ingroup CAPI_EFL_EXTENSION_MODULE
+ * @brief This module provides common ui-controls which are compatible for various devices.
+ * @{
+ */
+
+/**
+ * @WEARABLE_ONLY
+ * @typedef Eext_Object_Item
+ * @brief An efl-extension object item handle.
+
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+typedef struct _Eext_Object_Item Eext_Object_Item;
+
+#define EEXT_OBJECT_ITEM       Eext_Object_Item base
+
+struct _Eext_Object_Item {
+   Evas_Object *obj;
+   void *data;
+};
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_COMMON_H__ */
diff --git a/inc/wearable/common/efl_extension_common_private.h b/inc/wearable/common/efl_extension_common_private.h
new file mode 100644 (file)
index 0000000..8c221df
--- /dev/null
@@ -0,0 +1,205 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __EFL_EXTENSION_COMMON_PRIVATE_H__
+#define __EFL_EXTENSION_COMMON_PRIVATE_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct _Eext_Index_Layout_Item Eext_Index_Layout_Item;
+struct _Eext_Index_Layout_Item {
+   EEXT_OBJECT_ITEM;
+   Eext_Circle_Object_Item *item;
+
+   const char *letter;
+   int priority;
+   Eina_Bool selected;
+
+   Evas_Smart_Cb func;
+};
+
+/* Index Layout data */
+typedef struct _Eext_Index_Layout_Data Eext_Index_Layout_Data;
+struct _Eext_Index_Layout_Data {
+   Evas_Object *main_ly;
+   Evas_Object *panel;
+   Evas_Object *index;
+   Evas_Object *cue;
+   Ecore_Timer *hide_timer;
+
+   int max_index;
+   int max_item;
+   int highlighted_index;
+   int index_priority;
+   int *item_index;
+   int default_item_count;
+
+   Eina_List *current_list;
+   Eina_List *item_list;
+   Eina_List *omit_list;
+
+   Eina_Bool panel_hide;
+   Eina_Bool second_list_exist;
+};
+
+/* Rotary Selector data */
+typedef struct _Eext_Rotary_Selector_Selector_Color Eext_Rotary_Selector_Selector_Color;
+struct _Eext_Rotary_Selector_Selector_Color {
+   int r;
+   int g;
+   int b;
+   int a;
+   Eina_Bool set_flag;
+};
+
+typedef struct _Eext_Rotary_Selector_State_Data Eext_Rotary_Selector_State_Data;
+struct _Eext_Rotary_Selector_State_Data {
+   Evas_Object *normal;
+   Evas_Object *pressed;
+};
+
+typedef struct _Eext_Rotary_Selector_Selector_State_Color Eext_Rotary_Selector_Selector_State_Color;
+struct _Eext_Rotary_Selector_Selector_State_Color {
+   Eext_Rotary_Selector_Selector_Color normal_color;
+   Eext_Rotary_Selector_Selector_Color pressed_color;
+   Eext_Rotary_Selector_Selector_Color disabled_color;
+};
+
+//for accessibility
+typedef enum
+{
+   EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_NORMAL = 0,
+   EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_LEFT,
+   EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_RIGHT,
+} Eext_Rotary_Selector_Accessibility_Eventarea_Hightlihgted_State;
+//
+
+typedef struct _Eext_Rotary_Selector_Data Eext_Rotary_Selector_Data;
+struct _Eext_Rotary_Selector_Data {
+   Evas_Object *parent;
+   Evas_Object *rotary_selector;
+   Evas_Object *event_area;
+   Eina_List *item_list;
+   int item_count;
+   int selected_index;
+   int current_page;
+   Eina_Bool animation_direction;
+   Ecore_Animator *previous_page_animator;
+   Ecore_Animator *next_page_animator;
+   double previous_page_animator_start_time;
+   double next_page_animator_start_time;
+   Eina_Bool next_page_animation_started;
+   Eina_Bool previous_page_animation_started;
+   Ecore_Timer *next_page_timer;
+   Eina_Bool end_effect_animation_started;
+   double end_effect_animator_start_time;
+   Ecore_Animator *end_effect_animator;
+   Ecore_Animator *item_update_animator;
+   Eext_Rotary_Selector_Selector_State state;
+   Eext_Rotary_Selector_Selector_State_Color selector_bg_image_color;
+   Eext_Rotary_Selector_State_Data custom_content;
+   Eina_Bool pressed;
+   int pressed_item_index;
+   Eina_Bool touched_item_changed;
+   int radius;
+   Evas_Coord item_width;
+   Evas_Coord item_height;
+   unsigned int rotary_event_time_stamp;
+   Eina_Bool acceleration;
+   //for accessibility
+   Evas_Object *event_area_access_object;
+   Eext_Rotary_Selector_Accessibility_Eventarea_Hightlihgted_State event_area_highlighted_state;
+   Evas_Object *backup_first_item_for_atspi;
+   Evas_Object *backup_last_item_for_atspi;
+   int reading_page_number;
+   Eina_Bool from_moreoption;
+   Eina_Bool control_by_rotary
+   //
+};
+
+typedef struct _Eext_Rotary_Selector_Item_Coords Eext_Rotary_Selector_Item_Coords;
+struct _Eext_Rotary_Selector_Item_Coords {
+   double x;
+   double y;
+};
+
+typedef struct _Eext_Rotary_Selector_Item_Color Eext_Rotary_Selector_Item_Color;
+struct _Eext_Rotary_Selector_Item_Color {
+   int r;
+   int g;
+   int b;
+   int a;
+   Eina_Bool set_flag;
+};
+
+typedef struct _Eext_Rotary_Selector_Item_State_Color Eext_Rotary_Selector_Item_State_Color;
+struct _Eext_Rotary_Selector_Item_State_Color {
+   Eext_Rotary_Selector_Item_Color normal_color;
+   Eext_Rotary_Selector_Item_Color pressed_color;
+   Eext_Rotary_Selector_Item_Color disabled_color;
+};
+
+typedef struct _Eext_Rotary_Selector_Item Eext_Rotary_Selector_Item;
+struct _Eext_Rotary_Selector_Item {
+   EEXT_OBJECT_ITEM;
+   int index;
+   Evas_Object *parent;
+   Evas_Object *rotary_selector;
+   Eext_Rotary_Selector_Item_Coords coords;
+   char *domain;
+   char *text1;
+   char *text2;
+   Eext_Rotary_Selector_Item_State state;
+   Eext_Rotary_Selector_Item_Color color;
+   Eext_Rotary_Selector_State_Data item_bg_image;
+   Eext_Rotary_Selector_State_Data item_icon;
+   Eext_Rotary_Selector_State_Data selector_icon;
+   Eext_Rotary_Selector_State_Data selector_content;
+   Eext_Rotary_Selector_Item_State_Color item_bg_image_color;
+   Eext_Rotary_Selector_Item_State_Color item_icon_color;
+   Eext_Rotary_Selector_Item_State_Color selector_icon_color;
+   Eext_Rotary_Selector_Item_State_Color custom_content_color;
+   Evas_Object *content_icon;
+   Evas_Object *custom_content;
+};
+
+
+/* More Option data */
+typedef struct _Eext_More_Option_Data Eext_More_Option_Data;
+struct _Eext_More_Option_Data {
+   Evas_Object* parent;
+   Evas_Object* more_option;
+   Eina_List *item_list;
+   Evas_Object* panel;
+   Evas_Object* rotary_selector;
+   Eext_More_Option_Direction direction;
+   //for accessibility
+   Evas_Object* cue_access_object;
+   //
+};
+
+//for accessibility(internal API)
+void _rotary_selector_from_moreoption_set(Evas_Object *rotary_selector, Eina_Bool from_more_option);
+//
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* __EFL_EXTENSION_COMMON_PRIVATE_H__ */
diff --git a/inc/wearable/common/efl_extension_index_layout.h b/inc/wearable/common/efl_extension_index_layout.h
new file mode 100644 (file)
index 0000000..abbcebe
--- /dev/null
@@ -0,0 +1,218 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __EFL_EXTENSION_INDEX_H__
+#define __EFL_EXTENSION_INDEX_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup CAPI_EFL_EXTENSION_INDEX_LAYOUT_MODULE Efl Extension Index Layout
+ * @ingroup CAPI_EFL_EXTENSION_COMMON_UI_MODULE
+ * @brief Index layout is based on elm_layout with draggable index view, and an item of index
+ *        can be selected by rotary event.
+ *
+ * @details This widget emits the following signals.
+ *
+ *          @li "changed": The index layout item is changed.
+ *          @li "index,show": The index layout item is shown.
+ *          @li "index,hide": The index layout item is hidden.
+ *
+ * @{
+ */
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add a new index layout to the given parent
+ *        Elementary object.
+ *
+ * @param[in] parent The parent object
+ * @return A new index layout handle,
+ *         otherwise @c NULL in case of an error
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Evas_Object* eext_index_layout_add(Evas_Object *parent);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Append a new item on a given index layout.
+ *
+ * @param[in] obj The index layout
+ * @param[in] text The text under which the item should be indexed
+ * @param[in] func The function to call when the item is clicked
+ * @param[in] data The item data to set for the index's item
+ * @return A handle to the item added, otherwise @c NULL in case of an error
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Object_Item* eext_index_layout_item_append(Evas_Object *obj, const char *text, Evas_Smart_Cb func, void *data);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Prepend a new item on a given index layout.
+ *
+ * @param[in] obj The index layout object
+ * @param[in] text The text under which the item should be indexed
+ * @param[in] func The function to call when the item is clicked
+ * @param[in] data The item data to set for the index's item
+ * @return A handle to the item added, otherwise @c NULL in case of an error
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Object_Item* eext_index_layout_item_prepend(Evas_Object *obj, const char *text, Evas_Smart_Cb func, void *data);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Insert a new item into the index object before the input index layout item.
+ *
+ * @param[in] obj The index layout object
+ * @param[in] before The index layout item to insert before
+ * @param[in] text The text under which the item should be indexed
+ * @param[in] priority The priority of index layout item
+ * @param[in] func The function to call when the item is clicked
+ * @param[in] data The item data to set for the index's item
+ * @return A handle to the item added, otherwise @c NULL in case of an error
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Object_Item* eext_index_layout_item_insert_before(Evas_Object *obj, Eext_Object_Item *before, const char *text, Evas_Smart_Cb func, void *data);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Insert a new item into the index object after the input index layout item.
+ *
+ * @param[in] obj The index layout object
+ * @param[in] after The index layout item to insert after
+ * @param[in] text The text under which the item should be indexed
+ * @param[in] priority The priority of index layout item
+ * @param[in] func The function to call when the item is clicked
+ * @param[in] data The item data to set for the index's item
+ * @return A handle to the item added, otherwise @c NULL in case of an error
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Object_Item* eext_index_layout_item_insert_after(Evas_Object *obj, Eext_Object_Item *after, const char *text, Evas_Smart_Cb func, void *data);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Remove all items from a given index layout object.
+ *
+ * @param[in] obj The index layout
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_index_layout_items_clear(Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Delete an item which is the given index layout item.
+ *
+ * @param[in] item The index layout item
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_index_layout_item_del(Eext_Object_Item *item);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Find a given index widget's item using item data.
+ *
+ * @param[in] obj The index layout
+ * @param[in] data The item data pointed by the desired index layout item
+ * @return The index layout item handle if found, otherwise @c NULL
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Object_Item* eext_index_layout_item_find(Evas_Object *obj, const void *data);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the last selected item, for a given index layout object.
+ *
+ * @param[in] obj The index layout object
+ * @return The index layout item handle if selected, otherwise @c NULL
+ *
+ * @see eext_index_layout_item_selected_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Object_Item* eext_index_layout_selected_item_get(Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the selected state of an item.
+ *
+ * @remarks Selected item will be highlighted.
+ *
+ * @param[in] item The index layout item
+ * @param[in] selected The selected state
+ *
+ * @see eext_index_layout_selected_item_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_index_layout_selected_item_set(Eext_Object_Item *item);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the text to the given index layout item.
+ *
+ * @param[in] item The index layout item
+ * @param[in] text The text under which the item should be indexed
+ *
+ * @see eext_index_layout_item_text_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_index_layout_item_text_set(Eext_Object_Item *item, const char *text);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the text (string) set on a given index layout item.
+ *
+ * @param[in] item The index layout item
+ * @return The text string set on @a item
+ *
+ * @see eext_index_layout_item_text_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI const char* eext_index_layout_item_text_get(Eext_Object_Item *item);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_INDEX_H__ */
diff --git a/inc/wearable/common/efl_extension_more_option.h b/inc/wearable/common/efl_extension_more_option.h
new file mode 100644 (file)
index 0000000..1ec1c37
--- /dev/null
@@ -0,0 +1,344 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __EFL_EXTENSION_MORE_OPTION_H__
+#define __EFL_EXTENSION_MORE_OPTION_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup CAPI_EFL_EXTENSION_MORE_OPTION_MODULE Efl Extension More Option
+ * @ingroup CAPI_EFL_EXTENSION_COMMON_UI_MODULE
+ * @brief More option is composed of the toggle(cue button) and more option view,
+ *        and more option can change a visibility through the toggle.
+ *
+ * @details More option is based on elm_panel, but more option is different
+ *          from elm_panel in that the former does not set the scrollable option.
+ *          To show the more option view, select the toggle or manually use
+ *          eext_more_option_opened_set(). To hide the more option view,
+ *          trigger the back event or manually use eext_more_option_opened_set().
+ *          Additionally, the toggle disappears when more option view appears.
+ *          On the other hand, the toggle appears when more option view disappears.
+ *          The more option view can be manually set by eext_more_option_opened_set() API.
+ *          An item of more option object can be selected by rotary event.
+ *
+ *          This widget emits the following signals:
+ *          @li "item,selected": When the user selects an item.
+ *          @li "item,clicked": When the user selects the already selected item again
+ *                              or selects a selector.
+ *          @li "more,option,opened": When more option view is shown.
+ *          @li "more,option,closed": When more option view is hidden.
+ *
+ * @{
+ */
+
+/**
+ * @brief Enumeration of More Option Diection type
+ */
+typedef enum
+{
+   EEXT_MORE_OPTION_DIRECTION_TOP,  /**< More option (dis)appears from the top */
+   EEXT_MORE_OPTION_DIRECTION_BOTTOM,  /**< More option (dis)appears from the bottom */
+   EEXT_MORE_OPTION_DIRECTION_LEFT,  /**< More option (dis)appears from the left */
+   EEXT_MORE_OPTION_DIRECTION_RIGHT  /**< More option (dis)appears from the right */
+} Eext_More_Option_Direction;
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add a new more option.
+ *
+ * @details Because the return value is the elm_layout handle,
+ *          the elm_layout APIs can be applicable to more option handle.
+ *
+ * @param[in] parent The parent object
+ * @return A new more option handle, otherwise @c NULL if it cannot be created
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Evas_Object * eext_more_option_add(Evas_Object *parent);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the direction of more option.
+ *
+ * @param[in] obj The more option
+ * @param[in] direction The direction of more option
+ *
+ * @see eext_more_option_direction_get()
+ *      @ref Eext_More_Option_Direction
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_more_option_direction_set(Evas_Object *obj, Eext_More_Option_Direction direction);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get @ref Eext_More_Option_Direction.
+ *
+ * @param[in] obj The more option
+ * @return A direction of more option
+ *
+ * @see eext_more_option_direction_set()
+ *      @ref Eext_More_Option_Direction
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_More_Option_Direction eext_more_option_direction_get(const Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Append a new item to a more option.
+ *
+ * @param[in] obj The more option
+ * @return A handle to the item added, otherwise @c NULL in case of an error
+ *
+ * @see @ref Eext_Object_Item
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Object_Item * eext_more_option_item_append(Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief prepend a new item to a more option.
+ *
+ * @param[in] obj The more option
+ * @return A handle to the item added, otherwise @c NULL in case of an error
+ *
+ * @see @ref Eext_Object_Item
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Object_Item * eext_more_option_item_prepend(Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Insert a new item into the more option after more option item @a after.
+ *
+ * @param[in] obj The more option
+ * @param[in] after The more option item to insert after
+ * @return A handle to the item added, otherwise @c NULL in case of an error
+ *
+ * @see @ref Eext_Object_Item
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Object_Item * eext_more_option_item_insert_after(Evas_Object *obj, Eext_Object_Item *after);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Insert a new item into the more option before more option item @a before.
+ *
+ * @param[in] obj The more option
+ * @param[in] before The more option item to insert before
+ * @return A handle to the item added, otherwise @c NULL in case of an error
+ *
+ * @see @ref Eext_Object_Item
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Object_Item * eext_more_option_item_insert_before(Evas_Object *obj, Eext_Object_Item *before);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Delete an item which is the given more option item @a item.
+ *
+ * @param[in] item The more option item
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_more_option_item_del(Eext_Object_Item *item);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Remove all items from a given more option object.
+ *
+ * @param[in] obj The more option
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_more_option_items_clear(Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the text of a more option object.
+ *
+ * @details The part name exists with the next.
+ *          @li "selector,main_text": This locates in the middle of the selector.
+ *          @li "selector,sub_text": This locates under the main_text.
+ *
+ * @param[in] item The more option item
+ * @param[in] part_name The text part name to set (@c NULL for the default part)
+ * @param[in] text The new text of the part
+ *
+ * @see eext_more_option_item_part_text_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_more_option_item_part_text_set(Eext_Object_Item *item, const char *part_name, const char *text);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the text of a more option object.
+ *
+ * @details The part name exists with the next.
+ *          @li "selector,main_text": This locates in the middle of the selector.
+ *          @li "selector,sub_text": This locates under the main_text.
+ *
+ * @param[in] item The more option item
+ * @param[in] part_name The text part name to get (@c NULL for the default part)
+ * @return The text of the part, otherwise @c NULL in case of an error
+ *
+ * @see eext_more_option_item_part_text_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI const char * eext_more_option_item_part_text_get(const Eext_Object_Item *item, const char *part_name);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the translatable text of a more option object.
+ *
+ * @details The part name exists with the next.
+ *          @li "selector,main_text": This locates in the middle of the selector.
+ *          @li "selector,sub_text": This locates under the main_text.
+ *
+ * @param[in] item The more option item
+ * @param[in] part_name The text part name to set (@c NULL for the default part)
+ * @param[in] domain The name of the domain which contains translatable text
+ * @param[in] text ID of the new translatable text
+ *
+ * @see eext_more_option_item_part_text_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_more_option_item_domain_translatable_part_text_set(Eext_Object_Item *item, const char *part_name, const char *domain, const char *text);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the content to the part of a given container widget.
+ *
+ * @details The part name exists with the next.
+ *          @li "item,icon": This locates in the middle of the selector.
+ *
+ * @remarks The more option item may hold child objects as content at given parts.
+ *          This sets new content to a given part.
+ *          If any object is already set as a content object in the same part,
+ *          the previous object is automatically deleted. with this call.
+ *
+ * @param[in] item The more option item
+ * @param[in] part_name The more option item's part name to set
+ * @param[in] content The new content for that part
+ *
+ * @see eext_more_option_item_part_content_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_more_option_item_part_content_set(Eext_Object_Item *item, const char *part_name, Evas_Object *content);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the content from the part of a given container widget.
+ *
+ * @details The part name exists with the next.
+ *          @li "item,icon": This locates in the middle of the selector.
+ *
+ * @param[in] item The more option item
+ * @param[in] part_name The more option item's part name to get
+ * @return The content of the object at the given part,
+ *         otherwise @c NULL in case of an error
+ *
+ * @see eext_more_option_item_part_content_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Evas_Object * eext_more_option_item_part_content_get(const Eext_Object_Item *item, const char *part_name);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the visibility of more option view.
+ *
+ * @details If opened is @c EINA_TRUE, more option view in which
+ *          the rotary selector is included disappears and toggle appears.
+ *          If opened is @c EINA_FALSE, more option view in which
+ *          the rotary selector is included appears and toggle disappear.
+ *
+ * @remarks When more option is closed and opened again, the first item
+ *          is always selected.
+ *
+ * @param[in] obj The more option object
+ * @param[in] opened If @c EINA_TRUE, the more option runs the animation to appear,
+ *                   If @c EINA_FALSE, the more option runs the animation to disappear
+ *
+ * @see eext_more_option_opened_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_more_option_opened_set(Evas_Object *obj, Eina_Bool opened);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get whether the more option is set to be shown or to be hidden.
+ *
+ * @param[in] obj The more option object
+ * @return If @c EINA_TRUE, more option is shown.
+ *         Otherwise @c EINA_FALSE, more option is hidden.
+ *
+ * @see eext_more_option_opened_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eina_Bool eext_more_option_opened_get(Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the list of all items from a given more option object.
+ *
+ * @param[in] obj The more option object
+ * @return All item lists of the more option..
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI const Eina_List* eext_more_option_items_get(const Evas_Object *obj);
+/**
+ * @}
+ */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_MORE_OPTION_H__ */
diff --git a/inc/wearable/common/efl_extension_rotary_selector.h b/inc/wearable/common/efl_extension_rotary_selector.h
new file mode 100644 (file)
index 0000000..1ac2c2f
--- /dev/null
@@ -0,0 +1,456 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __EFL_EXTENSION_ROTARY_SELECTOR_H__
+#define __EFL_EXTENSION_ROTARY_SELECTOR_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup CAPI_EFL_EXTENSION_ROTARY_SELECTOR_MODULE Efl Extension Rotary Selector
+ * @ingroup CAPI_EFL_EXTENSION_COMMON_UI_MODULE
+ * @brief Rotary Selector is based on elm_layout, and an item can be
+ *        selected by rotary event or user item click.
+ *
+ * @details This widget emits the following signals.
+ *
+ *          @li "item,selected": When the user selected an item.
+ *          @li "item,clicked": When selecting again the alredy selected item or selecting a selector.
+ *
+ * @{
+ */
+
+/**
+ * @brief Enumeration of Rotary Selector state
+ */
+typedef enum
+{
+   EEXT_ROTARY_SELECTOR_SELECTOR_STATE_NORMAL = 0, /**< Selector is normal state */
+   EEXT_ROTARY_SELECTOR_SELECTOR_STATE_PRESSED, /**< Selector is pressed state */
+   EEXT_ROTARY_SELECTOR_SELECTOR_STATE_DISABLED, /**< Selector is disabled state */
+} Eext_Rotary_Selector_Selector_State;
+
+/**
+ * @brief Enumeration of Rotary Selector item state
+ */
+typedef enum
+{
+   EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL = 0, /**< Selector Item is normal state */
+   EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED, /**< Selector Item is pressed state */
+   EEXT_ROTARY_SELECTOR_ITEM_STATE_DISABLED, /**< Selector Item is disabled state */
+} Eext_Rotary_Selector_Item_State;
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Add a new Rotary Selector.
+ * @details Because the return value is the elm_layout handle,
+            the elm_layout APIs can be applicable to rotary selector handle.
+ *
+ * @param[in] parent The parent object
+ *
+ * @return A new rotary selector handle, otherwise @c NULL if it cannot be created
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Evas_Object* eext_rotary_selector_add(Evas_Object *parent);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Append a new item to a rotary selector.
+ *
+ * @param[in] obj The rotary selector
+ * @return A handle to the item added, otherwise @c NULL in case of an error
+ *
+ * @see @ref Eext_Object_Item
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Object_Item* eext_rotary_selector_item_append(Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Prepend a new item to a rotary selector.
+ *
+ * @param[in] obj The rotary selector
+ * @return A handle to the item added, otherwise @c NULL in case of an error
+ *
+ * @see @ref Eext_Object_Item
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Object_Item * eext_rotary_selector_item_prepend(Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Insert a new item into a rotary selector after rotary selector item @a after.
+ *
+ * @param[in] obj The rotary selector
+ * @param[in] after The rotary selector item to insert after
+ * @return A handle to the item added, otherwise @c NULL in case of an error
+ *
+ * @see @ref Eext_Object_Item
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Object_Item * eext_rotary_selector_item_insert_after(Evas_Object *obj, Eext_Object_Item *after);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Insert a new item into a rotary selector before rotary selector item @a before.
+ *
+ * @param[in] obj The rotary selector
+ * @param[in] before The rotary selector item to insert before
+ * @return A handle to the item added, otherwise @c NULL in case of an error
+ *
+ * @see @ref Eext_Object_Item
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Object_Item * eext_rotary_selector_item_insert_before(Evas_Object *obj, Eext_Object_Item *before);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Delete an item which is the given rotary selector item.
+ *
+ * @param[in] item The rotary selector item
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_rotary_selector_item_del(Eext_Object_Item *item);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Remove all items from a given rotary selector object.
+ *
+ * @param[in] obj The rotary selector
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_rotary_selector_items_clear(Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the text of a rotary selector object.
+ *
+ * @param[in] item The rotary selector item
+ * @param[in] part_name The text part name to set (@c NULL for the default part)
+ * @param[in] text The new text of the part
+ *
+ * @details This api supports following part names by default.
+ *
+ *          @li "selector,main_text": Selector main text.
+ *          @li "selector,sub_text": Selector sub text.
+ *
+ * @see eext_rotary_selector_item_part_text_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_rotary_selector_item_part_text_set(Eext_Object_Item *item, const char *part_name, const char *text);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the text of a rotary selector object.
+ *
+ * @param[in] item The rotary selector item
+ * @param[in] part_name The text part name to get (@c NULL for the default part)
+ * @return The text of the part, otherwise @c NULL for any error
+ *
+ * @details This api supports following part names by default.
+ *
+ *          @li "selector,main_text": Selector main text.
+ *          @li "selector,sub_text": Selector sub text.
+ *
+ * @see eext_rotary_selector_item_part_text_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI const char* eext_rotary_selector_item_part_text_get(const Eext_Object_Item *item, const char *part_name);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the translatable text of a rotary selector object.
+ *
+ * @param[in] item The rotary selector item
+ * @param[in] part_name The text part name to set (@c NULL for the default part)
+ * @param[in] domain The name of the domain which contains translatable text
+ * @param[in] text ID of the new translatable text
+ *
+ * @details This api supports following part names by default.
+ *
+ *          @li "selector,main_text": Selector main text.
+ *          @li "selector,sub_text": Selector sub text.
+ *
+ * @see eext_rotary_selector_item_part_text_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_rotary_selector_item_domain_translatable_part_text_set(Eext_Object_Item *item, const char *part_name, const char *domain, const char *text);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the content at a part of a given container widget.
+ *
+ * @remarks The rotary selector item may hold child objects as its contents in given parts.
+ *          This new content to a given part. If any object is already set as a content
+ *          object in the given part, the previous object is automatically deleted
+ *          with this call.
+ *
+ * @param[in] item The rotary selector item
+ * @param[in] part_name The rotary selector item's part name to set
+ * @param[in] state The rotary selector item part
+ * @param[in] content The new content for that part
+ *
+ * @details This api supports following part names by default.
+ *
+ *          @li "item,bg_image": Selector Item background image
+ *          @li "item,icon": Selector item icon
+ *          @li "selector,icon": Selector icon
+ *          @li "selector,content": Selector content
+ *
+ * @see eext_rotary_selector_item_part_content_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_rotary_selector_item_part_content_set(Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state, Evas_Object *content);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the content at a part of a given container widget.
+ *
+ * @param[in] item The rotary selector item
+ * @param[in] part_name The rotary selector item's part name to get
+ * @param[in] state The rotary selector item part
+ * @return The content of the object at the given part, otherwise @c NULL in case of an error
+ *
+ * @details This api supports following part names by default.
+ *
+ *          @li "item,bg_image": Selector Item background image
+ *          @li "item,icon": Selector item icon
+ *          @li "selector,icon": Selector icon
+ *          @li "selector,content": Selector content
+ *
+ * @see eext_rotary_selector_item_part_content_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Evas_Object* eext_rotary_selector_item_part_content_get(const Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the content at a part of a given container widget.
+ *
+ * @remarks The rotary selector may hold child objects as its contents in given parts.
+ *          This sets a new content to a given part. If any object is already set as a content
+ *          object in the given part, the previous object is automatically deleted
+ *          with this call.
+ *
+ * @param[in] obj The rotary selector
+ * @param[in] part_name The rotary selector part name to set
+ * @param[in] state The selector part
+ * @param[in] content The new content for that part
+ * @details This api supports following part names by default.
+ *
+ *          @li "selector,bg_image": Selector background image.
+ *
+ * @see eext_rotary_selector_selector_part_content_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_rotary_selector_part_content_set(Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state, Evas_Object *content);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the content from the part of the given container widget.
+ *
+ * @param[in] obj The rotary selector.
+ * @param[in] part_name The rotary selector part name to set
+ * @param[in] state The selector part
+ * @return The content of the object at the given part, otherwise @c NULL in case of an error
+ *
+ * @details This api supports following part names by default.
+ *
+ *          @li "selector,bg_image": Selector background image.
+ *
+ * @see eext_rotary_selector_selector_part_content_set()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Evas_Object* eext_rotary_selector_part_content_get(const Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state);
+
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the item part color of a rotary selector object.
+ *
+ * @param[in] item The rotary selector item
+ * @param[in] part_name The item part name to set
+ * @param[in] state The rotary selector item part
+ * @param[in] r Red (0 - 255)
+ * @param[in] g Green (0 - 255)
+ * @param[in] b Blue (0 - 255)
+ * @param[in] a Alpha (0 - 255)
+ *
+ * @details This api supports following part names by default.
+ *
+ *          @li "item,bg_image": Selector Item background image
+ *          @li "item,icon": Selector item icon
+ *          @li "selector,icon": Selector icon
+ *          @li "selector,content": Selector content
+ *          @li "selector,main_text": Selector main text.
+ *          @li "selector,sub_text": Selector sub text.
+ *
+ * @see eext_rotary_selector_item_part_color_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_rotary_selector_item_part_color_set(Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state, int r, int g, int b, int a);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the item part color of a rotary selector object.
+ *
+ * @param[in] item The rotary selector item
+ * @param[in] part_name The item part name to get
+ * @param[in] state The rotary selector item part
+ * @param[out] r A pointer to Red (0 - 255)
+ * @param[out] g A pointer to Green (0 - 255)
+ * @param[out] b A pointer to Blue (0 - 255)
+ * @param[out] a A pointer to Alpha (0 - 255)
+ * @see eext_rotary_selector_item_part_color_set()
+ *
+ * @details This api supports following part names by default.
+ *
+ *          @li "item,bg_image": Selector Item background image
+ *          @li "item,icon": Selector item icon
+ *          @li "selector,icon": Selector icon
+ *          @li "selector,content": Selector content
+ *          @li "selector,main_text": Selector main text.
+ *          @li "selector,sub_text": Selector sub text.
+ *
+ * @see eext_rotary_selector_item_part_color_get()
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_rotary_selector_item_part_color_get(const Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state, int *r, int *g, int *b, int *a);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the selector part color of a rotary selector object.
+ *
+ * @param[in] obj The rotary selector
+ * @param[in] part_name The selector part name to set
+ * @param[in] state The selector part
+ * @param[in] r Red (0 - 255)
+ * @param[in] g Green (0 - 255)
+ * @param[in] b Blue (0 - 255)
+ * @param[in] a Alpha (0 - 255)
+ *
+ * @details This api defualt support part names.
+ *
+ *          @li "selector,bg_image": Selector background image.
+ *
+ * @see eext_rotary_selector_part_color_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_rotary_selector_part_color_set(Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state, int r, int g, int b, int a);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the selector part color of a rotary selector object.
+ *
+ * @param[in] obj The rotary selector
+ * @param[in] part_name The selector part name to get
+ * @param[in] state The selector part
+ * @param[out] r A pointer to Red (0 - 255)
+ * @param[out] g A pointer to Green (0 - 255)
+ * @param[out] b A pointer to Blue (0 - 255)
+ * @param[out] a A pointer to Alpha (0 - 255)
+ * @see eext_rotary_selector_item_part_color_set()
+ *
+ * @details This api defualt support part names.
+ *
+ *          @li "selector,bg_image": Selector background image.
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_rotary_selector_part_color_get(const Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state, int *r, int *g, int *b, int *a);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Set the selected item of a rotary selector object.
+ *
+ * @param[in] obj The rotary selector
+ * @param[in] item The rotary selector item
+ * @see eext_rotary_selector_selected_item_get()
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_rotary_selector_selected_item_set(Evas_Object *obj, Eext_Object_Item *item);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the selected item of a rotary selector object.
+ *
+ * @param[in] obj The rotary selector
+ * @see eext_rotary_selector_selected_item_set()
+ * @return A selected item handle, otherwise @c NULL if it cannot be created
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI Eext_Object_Item* eext_rotary_selector_selected_item_get(const Evas_Object *obj);
+
+/**
+ * @WEARABLE_ONLY
+ * @brief Get the rotary selector item list of a rotary selector object.
+ *
+ * @param[in] obj The rotary selector
+ * @return A rotary selector item list handle, otherwise @c NULL if it cannot be created
+ *
+ * @if WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI const Eina_List* eext_rotary_selector_items_get(const Evas_Object *obj);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_ROTARY_SELECTOR_H__ */
diff --git a/inc/wearable/efl_extension.h.in b/inc/wearable/efl_extension.h.in
new file mode 100644 (file)
index 0000000..f460ac9
--- /dev/null
@@ -0,0 +1,108 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __EFL_EXTENSION_H__
+#define __EFL_EXTENSION_H__
+
+#ifdef EAPI
+# undef EAPI
+#endif
+
+#ifdef _WIN32
+# ifdef EFL_EXTENSION_BUILD
+#  ifdef DLL_EXPORT
+#   define EAPI __declspec(dllexport)
+#  else
+#   define EAPI
+#  endif /* ! DLL_EXPORT */
+# else
+#  define EAPI __declspec(dllimport)
+# endif /* ! EFL_EXTENSION_BUILD */
+#else
+# ifdef __GNUC__
+#  if __GNUC__ >= 4
+#   define EAPI __attribute__ ((visibility("default")))
+#  else
+#   define EAPI
+#  endif
+# else
+#  define EAPI
+# endif
+#endif /* ! _WIN32 */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+@HEADER_INCS@
+@LIB_HEADERS@
+
+/**
+ * @defgroup EFL_EXTENSION_HARDWARE_KEYEVENT_GROUP Efl Extension Hardware Keyevent
+ * @ingroup CAPI_EFL_EXTENSION_MODULE
+ * @brief This group provides functionalities to grab hardware key events.
+ * @if MOBILE @since_tizen 2.4
+ * @elseif WEARABLE @since_tizen 3.0
+ * @endif
+ *
+ * @{
+ */
+
+/**
+ * @brief Set the keygrab of the Elm_Win object
+ *
+ * @details This API returns the sucessness of keygrab_set.
+ *          Key callback is only called when the window located in topmost(top of the window stack).
+ *
+ * @param[in] obj object to set the keygrab
+ *            The widget type of this object should be elm_win
+ * @param[in] key keyname string to set keygrab
+ *
+ * @return    The result of keygrab set
+ *
+ * @if MOBILE @since_tizen 2.4
+ * @elseif WEARABLE @since_tizen 3.0
+ * @endif
+ */
+EAPI Eina_Bool eext_win_keygrab_set(Elm_Win *obj, const char *key);
+
+/**
+ * @brief Unset the keygrab of the Elm_Win object
+ *
+ * @details This API returns the sucessness of keygrab_unset.
+ *
+ * @param[in] obj object to unset the keygrab
+ *            The widget type of this object should be elm_win
+ * @param[in] key keyname string to unset keygrab
+ *
+ * @return    The result of keygrab unset
+ *
+ * @if MOBILE @since_tizen 2.4
+ * @elseif WEARABLE @since_tizen 3.0
+ * @endif
+ */
+EAPI Eina_Bool eext_win_keygrab_unset(Elm_Win *obj, const char *key);
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_H__ */
+
diff --git a/inc/wearable/efl_extension_events.h b/inc/wearable/efl_extension_events.h
new file mode 100644 (file)
index 0000000..128ba2d
--- /dev/null
@@ -0,0 +1,347 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __EFL_EXTENSION_EVENTS_H__
+#define __EFL_EXTENSION_EVENTS_H__
+
+#include <Elementary.h>
+
+#ifdef EAPI
+# undef EAPI
+#endif
+
+#ifdef _WIN32
+# ifdef EFL_EXTENSION_BUILD
+#  ifdef DLL_EXPORT
+#   define EAPI __declspec(dllexport)
+#  else
+#   define EAPI
+#  endif /* ! DLL_EXPORT */
+# else
+#  define EAPI __declspec(dllimport)
+# endif /* ! EFL_EXTENSION_BUILD */
+#else
+# ifdef __GNUC__
+#  if __GNUC__ >= 4
+#   define EAPI __attribute__ ((visibility("default")))
+#  else
+#   define EAPI
+#  endif
+# else
+#  define EAPI
+# endif
+#endif /* ! _WIN32 */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @defgroup CAPI_EFL_EXTENSION_EVENT_MODULE Efl Extension Event
+ * @ingroup CAPI_EFL_EXTENSION_MODULE
+ * @brief This module provides functionalities to handle back/send key events.
+ * @{
+ */
+
+/**
+ * @brief Convenient macro function that sends back key events to the popup
+ *        to be removed.
+ *
+ * @details Popup will be removed when it has the back key event with
+ *          eext_object_event_callback_add()
+ *
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information
+ *
+ * @see   eext_object_event_callback_add()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_popup_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   evas_object_del(obj);
+}
+
+/**
+ * @brief Convenient macro function that sends back key events to the ctxpopup
+ *        to be dismissed.
+ *
+ * @details Ctxpopup will be dismissed when it has the back key event with
+ *          eext_object_event_callback_add()
+ *
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information
+ *
+ * @see   eext_object_event_callback_add()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_ctxpopup_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   elm_ctxpopup_dismiss(obj);
+}
+
+/**
+ * @brief Convenient macro function that sends more key events to the naviframe
+ *        top item.
+ *
+ * @details More key action of naviframe will be executed when naviframe has the
+ *          more key event with eext_object_event_callback_add()
+ *
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information
+ *
+ * @see   eext_object_event_callback_add()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_naviframe_more_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   Elm_Object_Item *top = elm_naviframe_top_item_get(obj);
+   if (!top) return;
+   Evas_Object *more_btn = elm_object_item_part_content_get(top,
+                                                            "toolbar_more_btn");
+   if (more_btn)
+     evas_object_smart_callback_call(more_btn, "clicked", NULL);
+}
+
+/**
+ * @brief Convenient macro function that pop the naviframe item.
+ *
+ * @details Naviframe will be popped when naviframe has the back key event
+ *          with eext_object_event_callback_add()
+ *
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information
+ *
+ * @see   eext_object_event_callback_add()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_naviframe_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   elm_naviframe_item_pop(obj);
+}
+
+/**
+ * Identifier of callbacks to be set for Ea events.
+ *
+ * @see eext_object_event_callback_add()
+ * @see eext_object_event_callback_del()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+typedef enum _Eext_Callback_Type
+{
+   EEXT_CALLBACK_BACK,    /**< H/W Back Key Event */
+   EEXT_CALLBACK_MORE,    /**< H/W More Key Event */
+   EEXT_CALLBACK_LAST     /**< Reserved value. Acutally This is not matched to
+                            any meaningful behavior. */
+} Eext_Callback_Type;
+
+/**
+ * @brief Ea event callback function signature.
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information (if the event passes an additional in
+              formation.)
+ * @see eext_object_event_callback_add()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+typedef void (*Eext_Event_Cb)(void *data, Evas_Object *obj, void *event_info);
+
+/**
+ * @brief Delete a callback function from an object.
+ *
+ * @details This function removes the most recently added callback from the
+ *          object @p obj which was triggered by the type @p type and
+ *          was calling the function @p func when triggered. If the removal is
+ *          successful it will also return the data pointer that was passed to
+ *          eext_object_event_callback_add() when the callback was added to
+ *          the object. If not successful @c NULl will be returned.
+ *
+ * @param[in] obj Object to remove a callback from.
+ * @param[in] type The type of event that was triggering the callback.
+ * @param[in] func The function that was to be called when the event was
+ *            triggered
+ * @return    data The data pointer that was to be passed to the callback.
+ *
+ * @see eext_object_event_callback_add()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void *eext_object_event_callback_del(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func);
+
+/**
+ * @brief Add (register) a callback function to a given evas object.
+ *
+ * @details This function adds a function callback to an object when the key
+ *          event occurs on object @p obj. The key event on the object is only
+ *          triggered when the object is the most top in objects stack and
+ *          visible. This means, like the naviframe widget, if your application
+ *          needs to have the events based on the view but not focus, you can
+ *          use this callback. A callback function must have the Eext_Event_Cb
+ *          prototype definition. The first parameter (@p data) in this
+ *          definition will have the same value passed to
+ *          eext_object_event_callback_add() as the @p data parameter, at
+ *          runtime. The second parameter @p obj is the evas object on which
+ *          event occurred. Finally, the third parameter @p event_info is a
+ *          pointer to a data structure that may or may not be passed to the
+ *          callback, depending on the event type that triggered the callback.
+ *          This is so because some events don't carry extra context with them,
+ *          but others do.
+ *
+ * @param[in] obj evas object.
+ * @param[in] type The type of event that will trigger the callback.
+ * @param[in] func The function to be called when the key event is triggered.
+ * @param[in] data The data pointer to be passed to @p func.
+ *
+ * @see eext_object_event_callback_del()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+EAPI void eext_object_event_callback_add(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func, void *data);
+
+/**
+ * @brief Convenient macro function that cancels the selection of the entry.
+ *
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information
+ *
+ * @see   eext_entry_selection_back_event_allow_set()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_entry_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   if (elm_entry_selection_get(obj))
+     elm_entry_select_none(obj);
+
+   eext_object_event_callback_del(obj, EEXT_CALLBACK_BACK, eext_entry_back_cb);
+   evas_object_data_set(obj, "eext_entry", NULL);
+}
+
+/**
+ * @brief Convenient macro function that registers back key callback for entry.
+ *
+ * @details If the selection handler should be canceled when back key event is
+ *          triggered, then use this API.
+ *
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information
+ *
+ * @see   eext_entry_selection_back_event_allow_set()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_entry_selection_start_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   if (!evas_object_data_get(obj, "eext_entry"))
+     {
+        evas_object_data_set(obj, "eext_entry", (void *) 1);
+        eext_object_event_callback_add(obj, EEXT_CALLBACK_BACK, eext_entry_back_cb,
+                                     NULL);
+     }
+}
+
+/**
+ * @brief Convenient macro function that clears back key callback for entry.
+ *
+ * @param[in] data user data
+ * @param[in] obj target object
+ * @param[in] event_info event information
+ *
+ * @see   eext_entry_selection_back_event_allow_set()
+ * @see   eext_object_event_callback_add()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_entry_selection_cleared_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   if (evas_object_data_get(obj, "eext_entry"))
+     {
+        eext_object_event_callback_del(obj, EEXT_CALLBACK_BACK, eext_entry_back_cb);
+        evas_object_data_set(obj, "eext_entry", NULL);
+     }
+}
+
+/**
+ * @brief Convenient macro function that handle the back event to cancel the
+ *        selection handler of the entry.
+ * @details If the selection handler should be canceled (or not) when back key
+ *          event is triggered, then use this API.
+ * @param[in] obj Entry object.
+ * @param[in] allow @c EINA_TRUE allows the back event handling, @c EINA_FALSE
+ *              otherwise.
+ * @see   eext_object_event_callback_add()
+ * @see   eext_object_event_callback_del()
+ * @if MOBILE @since_tizen 2.3
+ * @elseif WEARABLE @since_tizen 2.3.1
+ * @endif
+ */
+static inline void
+eext_entry_selection_back_event_allow_set(Evas_Object *obj, Eina_Bool allow)
+{
+   if (allow)
+     {
+        evas_object_smart_callback_add(obj, "selection,start",
+                                       eext_entry_selection_start_cb, NULL);
+        evas_object_smart_callback_add(obj, "selection,cleared",
+                                       eext_entry_selection_cleared_cb, NULL);
+     }
+   else
+     {
+        evas_object_smart_callback_del(obj, "selection,start",
+                                       eext_entry_selection_start_cb);
+        evas_object_smart_callback_del(obj, "selection,cleared",
+                                       eext_entry_selection_cleared_cb);
+     }
+}
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_EVENTS_H__ */
diff --git a/inc/wearable/efl_extension_private.h b/inc/wearable/efl_extension_private.h
new file mode 100644 (file)
index 0000000..ca7f8be
--- /dev/null
@@ -0,0 +1,97 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef __EFL_EXTENSION_PRIVATE_H__
+#define __EFL_EXTENSION_PRIVATE_H__
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <strings.h>
+#include <unistd.h>
+#include <fontconfig/fontconfig.h>
+#include <fontconfig/fcfreetype.h>
+
+#define _(str) (gettext(str))
+#define LOCALE_DIR "/usr/share/locale"
+
+#ifdef EAPI
+# undef EAPI
+#endif
+
+#ifdef _WIN32
+# ifdef EFL_EXTENSION_BUILD
+#  ifdef DLL_EXPORT
+#   define EAPI __declspec(dllexport)
+#  else
+#   define EAPI
+#  endif /* ! DLL_EXPORT */
+# else
+#  define EAPI __declspec(dllimport)
+# endif /* ! EFL_EXTENSION_BUILD */
+#else
+# ifdef __GNUC__
+#  if __GNUC__ >= 4
+#   define EAPI __attribute__ ((visibility("default")))
+#  else
+#   define EAPI
+#  endif
+# else
+#  define EAPI
+# endif
+#endif /* ! _WIN32 */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/**
+ * @internal
+ *
+ * @ {
+ */
+
+extern int _eext_log_dom;
+
+#define CRI(...)      EINA_LOG_DOM_CRIT(_eext_log_dom, __VA_ARGS__)
+#define ERR(...)      EINA_LOG_DOM_ERR(_eext_log_dom, __VA_ARGS__)
+#define WRN(...)      EINA_LOG_DOM_WARN(_eext_log_dom, __VA_ARGS__)
+#define INF(...)      EINA_LOG_DOM_INFO(_eext_log_dom, __VA_ARGS__)
+#define DBG(...)      EINA_LOG_DOM_DBG(_eext_log_dom, __VA_ARGS__)
+
+#define __CONSTRUCTOR__ __attribute__ ((constructor))
+#define __DESTRUCTOR__ __attribute__ ((destructor))
+
+/* eina magic types */
+#define EEXT_MAGIC_NONE 0x87657890
+
+typedef unsigned int eext_magic;
+#define EEXT_MAGIC                eext_magic __magic
+
+#define EEXT_MAGIC_SET(d, m)      (d)->__magic = (m)
+#define EEXT_MAGIC_CHECK(d, m)    ((d) && ((d)->__magic == (m)))
+#define EEXT_MAGIC_FAIL(d, m, fn) \
+               _eext_magic_fail((d), (d) ? (d)->__magic : 0, (m), (fn));
+
+/**
+ * @}
+ */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __EFL_EXTENSION_PRIVATE_H__ */
diff --git a/mobile/CMakeLists.txt b/mobile/CMakeLists.txt
deleted file mode 100644 (file)
index 5b3445b..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-ADD_SUBDIRECTORY(src)
-ADD_SUBDIRECTORY(data)
diff --git a/mobile/data/CMakeLists.txt b/mobile/data/CMakeLists.txt
deleted file mode 100644 (file)
index b4dac83..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-SET(EDC_FILES
-       groups/floatingbutton.edc
-       )
-
-FOREACH(edc ${EDC_FILES})
-       SET(EDC_INCS "${EDC_INCS}\n   #include \"${edc}\"")
-ENDFOREACH(edc)
-
-CONFIGURE_FILE(
-       efl-extension.edc.in efl-extension.edc
-       @ONLY)
-
-ADD_CUSTOM_TARGET(${PROJECT_NAME}.edj
-   COMMAND edje_cc -id ./images/ ${PROJECT_NAME}.edc ${PROJECT_NAME}.edj
-)
-ADD_DEPENDENCIES(${PROJECT_NAME} ${PROJECT_NAME}.edj)
-
-INSTALL(FILES ${PROJECT_NAME}.edj DESTINATION ${EDJDIR})
diff --git a/mobile/data/HD-inc.edc b/mobile/data/HD-inc.edc
deleted file mode 100644 (file)
index 410d2ef..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define BASE_SCALE_INC 2.6
-
-//****************************************************************************//
-// Floatingbutton
-//****************************************************************************//
-#define FLOATINGBUTTON_LAYOUT_LR_WIDTH 64
-#define FLOATINGBUTTON_LR_WIDTH 50
-#define FLOATINGBUTTON_LR_MAX_VARIATION 20
-#define FLOATINGBUTTON_MID_WIDTH 20
-#define FLOATINGBUTTON_1BTN_WIDTH 180
-#define FLOATINGBUTTON_2BTN_WIDTH 280
-#define FLOATINGBUTTON_HEIGHT 120
-#define FLOATINGBUTTON_HANDLER_SIZE 32
-#define FLOATINGBUTTON_SIDE_MARGIN 20
-#define FLOATINGBUTTON_LAYOUT_SIDE_MARGIN 34
diff --git a/mobile/data/efl-extension.edc.in b/mobile/data/efl-extension.edc.in
deleted file mode 100644 (file)
index 63ec201..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "HD-inc.edc"
-
-collections {
-   base_scale: BASE_SCALE_INC;
-@EDC_INCS@
-}
-
diff --git a/mobile/data/groups/floatingbutton.edc b/mobile/data/groups/floatingbutton.edc
deleted file mode 100644 (file)
index 2e4c610..0000000
+++ /dev/null
@@ -1,568 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-   group { name: "elm/floatingbutton/base/default";
-      script {
-         public mouse_down, g_prev_x, g_width, g_btns;
-         public left_timer, right_timer;
-         public g_visible;
-         public g_expand;
-
-         public message(Msg_Type:type, id, ...) {
-            if ((type == MSG_INT) && (id == 0)) {
-               new width;
-               width = getarg(2);
-               set_int(g_width, width);
-            }
-         }
-         public left_anim_go() {
-            run_program(PROGRAM:"left_spacer_animation");
-         }
-         public right_anim_go() {
-            run_program(PROGRAM:"right_spacer_animation");
-         }
-      }
-      parts {
-         part { name: "elm.swallow.vg";
-            type: SWALLOW;
-            scale: 1;
-            clip_to: "vg_clipper";
-            description { state: "default" 0.0;
-               fixed: 1 1;
-               rel1.to: "left_expand";
-               rel2.to: "right_expand";
-            }
-            description { state: "hidden" 0.0;
-               inherit: "default" 0.0;
-               visible: 0;
-            }
-         }
-         part { name: "vg_clipper";
-            type: RECT;
-            clip_to: "clipper";
-            description { state: "default" 0.0;
-               fixed: 1 1;
-               color: 78 97 173 255;
-               rel1.to: "elm.swallow.vg";
-               rel2.to: "elm.swallow.vg";
-            }
-            description { state: "disabled" 0.0;
-               inherit: "default";
-               color: 131 145 201 255;
-            }
-         }
-         part { name: "elm.track.left_hidden";
-            type: SPACER;
-            scale: 1;
-            description { state: "default" 0.0;
-               min: (FLOATINGBUTTON_1BTN_WIDTH+FLOATINGBUTTON_SIDE_MARGIN-FLOATINGBUTTON_HANDLER_SIZE) 0;
-               fixed: 1 1;
-               align: 1.0 0.5;
-               rel1.relative: 0.0 0.0;
-               rel2.relative: 0.0 1.0;
-            }
-            description { state: "2buttons" 0.0;
-               inherit: "default" 0.0;
-               min: (FLOATINGBUTTON_2BTN_WIDTH+FLOATINGBUTTON_SIDE_MARGIN-FLOATINGBUTTON_HANDLER_SIZE) 0;
-            }
-         }
-         part { name: "elm.track.right_hidden";
-            type: SPACER;
-            scale: 1;
-            description { state: "default" 0.0;
-               min: (FLOATINGBUTTON_1BTN_WIDTH+FLOATINGBUTTON_SIDE_MARGIN-FLOATINGBUTTON_HANDLER_SIZE) 0;
-               fixed: 1 1;
-               align: 0.0 0.5;
-               rel1.relative: 1.0 0.0;
-               rel2.relative: 1.0 1.0;
-            }
-            description { state: "2buttons" 0.0;
-               inherit: "default" 0.0;
-               min: (FLOATINGBUTTON_2BTN_WIDTH+FLOATINGBUTTON_SIDE_MARGIN-FLOATINGBUTTON_HANDLER_SIZE) 0;
-            }
-         }
-         part { name: "elm.track.fb";
-            type: SPACER;
-            scale: 1;
-            description { state: "default" 0.0;
-               rel1.to: "elm.track.left_hidden";
-               rel2.to: "elm.track.right_hidden";
-            }
-         }
-         part { name: "left_expand";
-            type: SPACER;
-            description { state: "default" 0.0;
-               fixed: 1 1;
-               align: 1.0 0.5;
-               rel1 { to: "left_spacer"; relative: 0.0 0.0; }
-               rel2 { to: "left_spacer"; relative: 0.0 1.0; }
-            }
-         }
-         part { name: "right_expand";
-            type: SPACER;
-            description { state: "default" 0.0;
-               fixed: 1 1;
-               align: 0.0 0.5;
-               rel1 { to: "right_spacer"; relative: 1.0 0.0; }
-               rel2 { to: "right_spacer"; relative: 1.0 1.0; }
-            }
-         }
-         part { name: "left_spacer";
-            type: SPACER;
-            scale: 1;
-            description { state: "default" 0.0;
-               min: FLOATINGBUTTON_LR_WIDTH 0;
-               fixed: 1 1;
-               align: 1.0 0.5;
-               rel1 { to_x: "elm.swallow.box"; to_y: "elm.dragable.fb"; relative: 0.0 0.0; }
-               rel2 { to_x: "elm.swallow.box"; to_y: "elm.dragable.fb"; relative: 0.0 1.0; }
-            }
-            description { state: "expand" 0.0;
-               inherit: "default" 0.0;
-               min: (FLOATINGBUTTON_LR_WIDTH+FLOATINGBUTTON_LAYOUT_SIDE_MARGIN) 0;
-            }
-         }
-         part { name: "right_spacer";
-            type: SPACER;
-            scale: 1;
-            description { state: "default" 0.0;
-               min: FLOATINGBUTTON_LR_WIDTH 0;
-               fixed: 1 1;
-               align: 0.0 0.5;
-               rel1 { to_x: "elm.swallow.box"; to_y: "elm.dragable.fb"; relative: 1.0 0.0; }
-               rel2 { to_x: "elm.swallow.box"; to_y: "elm.dragable.fb"; relative: 1.0 1.0; }
-            }
-            description { state: "expand" 0.0;
-               inherit: "default" 0.0;
-               min: (FLOATINGBUTTON_LR_WIDTH+FLOATINGBUTTON_LAYOUT_SIDE_MARGIN) 0;
-            }
-         }
-         part { name: "elm.swallow.box";
-            type: SWALLOW;
-            scale: 1;
-            clip_to: "clipper";
-            description { state: "default" 0.0;
-               min: 0 0;
-               fixed: 1 1;
-               align: 0.5 0.5;
-               rel1 { to: "elm.dragable.fb"; relative: 0.5 0.5; }
-               rel2 { to: "elm.dragable.fb"; relative: 0.5 0.5; }
-            }
-            description { state: "hidden" 0.0;
-               inherit: "default" 0.0;
-               visible: 0;
-            }
-         }
-         part { name: "elm.dragable.fb";
-            type: RECT;
-            scale: 1;
-            clip_to: "clipper";
-            repeat_events: 1;
-            description { state: "default" 0.0;
-               min: FLOATINGBUTTON_1BTN_WIDTH FLOATINGBUTTON_HEIGHT;
-               fixed: 1 1;
-               align: 0.5 0.5;
-               rel1 { to: "elm.track.fb"; relative: 0.5 0.0; }
-               rel2 { to: "elm.track.fb"; relative: 0.5 1.0; }
-               color: 0 0 0 0;
-            }
-            description { state: "expand" 0.0;
-               inherit: "default" 0.0;
-               min: (FLOATINGBUTTON_1BTN_WIDTH+FLOATINGBUTTON_SIDE_MARGIN) FLOATINGBUTTON_HEIGHT;
-            }
-            description { state: "2buttons" 0.0;
-               inherit: "default" 0.0;
-               min: FLOATINGBUTTON_2BTN_WIDTH FLOATINGBUTTON_HEIGHT;
-            }
-            description { state: "2buttons_expand" 0.0;
-               inherit: "default" 0.0;
-               min: (FLOATINGBUTTON_2BTN_WIDTH+FLOATINGBUTTON_SIDE_MARGIN) FLOATINGBUTTON_HEIGHT;
-            }
-            description { state: "hidden" 0.0;
-               inherit: "default" 0.0;
-               visible: 0;
-            }
-            dragable {
-               x: 1 1 0;
-               y: 0 0 0;
-               confine: "elm.track.fb";
-               threshold: "elm.threshold.fb";
-            }
-         }
-         part { name : "elm.threshold.fb";
-            type: RECT;
-            scale: 1;
-            mouse_events: 0;
-            description { state: "default" 0.0;
-               min: 0 FLOATINGBUTTON_HEIGHT;
-               fixed: 1 1;
-               align: 0.5 0.5;
-               rel1 { to: "elm.track.fb"; relative: 0.5 0.0; }
-               rel2 { to: "elm.track.fb"; relative: 0.5 1.0; }
-               color: 0 0 0 0;
-            }
-         }
-         part { name: "clipper";
-            type: RECT;
-            mouse_events: 0;
-            description { state: "default" 0.0;
-               color: 255 255 255 255;
-            }
-         }
-      }
-      programs {
-         program {
-            signal: "load";
-            script {
-               custom_state(PART:"left_expand", "default", 0.0);
-               custom_state(PART:"right_expand", "default", 0.0);
-               custom_state(PART:"elm.threshold.fb", "default", 0.0);
-               set_state(PART:"elm.threshold.fb", "custom", 0.0);
-               set_int(g_visible, 1);
-            }
-         }
-         program {
-            signal: "elm,state,floatingbutton,*,1btn";
-            source: "elm";
-            script {
-               set_state(PART:"elm.track.left_hidden", "default", 0.0);
-               set_state(PART:"elm.track.right_hidden", "default", 0.0);
-               set_int(g_btns, 1);
-            }
-         }
-         program {
-            signal: "elm,state,floatingbutton,*,2btn";
-            source: "elm";
-            script {
-               set_state(PART:"elm.track.left_hidden", "2buttons", 0.0);
-               set_state(PART:"elm.track.right_hidden", "2buttons", 0.0);
-               set_int(g_btns, 2);
-            }
-         }
-         program {
-            signal: "elm,floatingbutton,threshold,update";
-            source: "elm";
-            script {
-               new width, Float:pos;
-               new x, y, w, h;
-               new x1, y1, w1, h1;
-
-               width = get_int(g_width);
-               set_state_val(PART:"elm.threshold.fb", STATE_MIN, width, 0);
-
-               get_geometry(PART:"elm.track.fb", x, y, w, h);
-               get_geometry(PART:"elm.dragable.fb", x1, y1, w1, h1);
-
-               pos = ((x1 - x) + float(w1) / 2) / w;
-
-               set_state_val(PART:"elm.threshold.fb", STATE_REL1, pos, 0.0);
-               set_state_val(PART:"elm.threshold.fb", STATE_REL2, pos, 1.0);
-            }
-         }
-         program { name: "mouse_down";
-            signal: "mouse,down,1";
-            source: "elm.dragable.fb";
-            script {
-               new x, y, w, h;
-               get_geometry(PART:"elm.dragable.fb", x, y, w, h);
-               set_int(g_prev_x, x);
-               set_int(mouse_down, 1);
-            }
-         }
-         program { name: "mouse_up";
-            signal: "mouse,up,1";
-            source: "elm.dragable.fb";
-            script {
-               set_int(mouse_down, 0);
-            }
-         }
-         program { name: "mouse_move";
-            signal: "mouse,move";
-            source: "elm.dragable.fb";
-            script {
-               new prev_x;
-               prev_x = get_int(g_prev_x);
-
-               if (get_int(mouse_down) == 1) {
-                  new x, y, w, h;
-                  new x1, y1, w1, h1;
-
-                  get_geometry(PART:"elm.dragable.fb", x, y, w, h);
-
-                  if (prev_x < x)
-                  {
-                     get_geometry(PART:"left_expand", x1, y1, w1, h1);
-
-                     if ((w1 + x - prev_x) < FLOATINGBUTTON_LR_MAX_VARIATION)
-                       set_state_val(PART:"left_expand", STATE_MIN, (w1 + x - prev_x), 0);
-                     else
-                       set_state_val(PART:"left_expand", STATE_MIN, FLOATINGBUTTON_LR_MAX_VARIATION, 0);
-
-                     set_state(PART:"left_expand", "custom", 0.0);
-
-                     new id;
-                     id = get_int(left_timer);
-                     cancel_timer(id);
-
-                     id = timer(0.01, "left_anim_go", 1);
-                     set_int(left_timer, id);
-                  }
-                  else if (prev_x > x)
-                  {
-                     get_geometry(PART:"right_expand", x1, y1, w1, h1);
-
-                     if ((w1 + prev_x - x) < FLOATINGBUTTON_LR_MAX_VARIATION)
-                       set_state_val(PART:"right_expand", STATE_MIN, (w1 + prev_x - x), 0);
-                     else
-                       set_state_val(PART:"right_expand", STATE_MIN, FLOATINGBUTTON_LR_MAX_VARIATION, 0);
-
-                     set_state(PART:"right_expand", "custom", 0.0);
-
-                     new id;
-                     id = get_int(right_timer);
-                     cancel_timer(id);
-
-                     id = timer(0.01, "right_anim_go", 1);
-                     set_int(right_timer, id);
-                  }
-                  set_int(g_prev_x, x);
-               }
-            }
-         }
-         program { name: "left_spacer_animation";
-            action: STATE_SET "default" 0.0;
-            transition: DECEL 0.4;
-            target: "left_expand";
-         }
-         program { name: "right_spacer_animation";
-            action: STATE_SET "default" 0.0;
-            transition: DECEL 0.4;
-            target: "right_expand";
-         }
-         program { name: "left_spacer_stretch";
-            action: STATE_SET "custom" 0.0;
-            transition: ACCEL 0.2;
-            target: "left_expand";
-            after: "left_spacer_animation";
-         }
-         program { name: "right_spacer_stretch";
-            action: STATE_SET "custom" 0.0;
-            transition: ACCEL 0.2;
-            target: "right_expand";
-            after: "right_spacer_animation";
-         }
-         program { name: "block";
-            signal: "elm,state,floatingbutton,block";
-            source: "elm";
-            script {
-               set_mouse_events(PART:"elm.dragable.fb", 0);
-            }
-         }
-         program { name: "unblock";
-            signal: "elm,state,floatingbutton,unblock";
-            source: "elm";
-            script {
-               set_mouse_events(PART:"elm.dragable.fb", 1);
-            }
-         }
-         program {
-            signal: "elm,state,floatingbutton,freeze";
-            source: "elm";
-            script {
-               set_mask_flags(PART:"elm.dragable.fb", 1);
-            }
-         }
-         program {
-            signal: "elm,state,floatingbutton,thaw";
-            source: "elm";
-            script {
-               set_mask_flags(PART:"elm.dragable.fb", 0);
-            }
-         }
-         program {
-            signal: "elm,state,show";
-            source: "";
-            script {
-               set_int(g_visible, 1);
-               run_program(PROGRAM:"visible");
-            }
-         }
-         program {
-            signal: "elm,state,hide";
-            source: "";
-            script {
-               set_int(g_visible, 0);
-               run_program(PROGRAM:"hidden");
-            }
-         }
-         program { name: "visible";
-            signal: "elm,state,floatingbutton,visible";
-            source: "elm";
-            script {
-               if (get_int(g_visible) == 1) {
-                  set_state(PART:"elm.swallow.vg", "default", 0.0);
-                  set_state(PART:"elm.swallow.box", "default", 0.0);
-                  if (get_int(g_btns) < 2) {
-                     if (get_int(g_expand) == 0) {
-                        set_state(PART:"elm.dragable.fb", "default", 0.0);
-                     }
-                     else {
-                        set_state(PART:"elm.dragable.fb", "expand", 0.0);
-                     }
-                  }
-                  else {
-                     if (get_int(g_expand) == 0) {
-                        set_state(PART:"elm.dragable.fb", "2buttons", 0.0);
-                     }
-                     else {
-                        set_state(PART:"elm.dragable.fb", "2buttons_expand", 0.0);
-                     }
-                  }
-               }
-            }
-         }
-         program { name: "hidden";
-            signal: "elm,state,floatingbutton,hidden";
-            source: "elm";
-            script {
-               set_state(PART:"elm.swallow.vg", "hidden", 0.0);
-               set_state(PART:"elm.swallow.box", "hidden", 0.0);
-               set_state(PART:"elm.dragable.fb", "hidden", 0.0);
-            }
-         }
-         program { name: "left_bring_in";
-            signal: "elm,action,floatingbutton,left";
-            source: "elm";
-            script {
-               set_state_val(PART:"right_expand", STATE_MIN, FLOATINGBUTTON_LR_MAX_VARIATION, 0);
-               run_program(PROGRAM:"right_spacer_stretch");
-            }
-         }
-         program { name: "right_bring_in";
-            signal: "elm,action,floatingbutton,right";
-            source: "elm";
-            script {
-               set_state_val(PART:"left_expand", STATE_MIN, FLOATINGBUTTON_LR_MAX_VARIATION, 0);
-               run_program(PROGRAM:"left_spacer_stretch");
-            }
-         }
-         program { name: "move_to_left";
-            signal: "elm,state,floatingbutton,left,*";
-            source: "elm";
-            action: STATE_SET "expand" 0.0;
-            target: "left_spacer";
-            transition: DECEL 0.4;
-         }
-         program {
-            signal: "elm,state,floatingbutton,left,*";
-            source: "elm";
-            script {
-               set_int(g_expand, 1);
-            }
-         }
-         program { name: "move_to_left_1btn";
-            signal: "elm,state,floatingbutton,left,1btn";
-            source: "elm";
-            action: STATE_SET "expand" 0.0;
-            target: "elm.dragable.fb";
-            transition: DECEL 0.4;
-         }
-         program { name: "move_to_left_2btn";
-            signal: "elm,state,floatingbutton,left,2btn";
-            source: "elm";
-            action: STATE_SET "2buttons_expand" 0.0;
-            target: "elm.dragable.fb";
-            transition: DECEL 0.4;
-         }
-         program { name: "move_to_right";
-            signal: "elm,state,floatingbutton,right,*";
-            source: "elm";
-            action: STATE_SET "expand" 0.0;
-            target: "right_spacer";
-            transition: DECEL 0.4;
-         }
-         program {
-            signal: "elm,state,floatingbutton,right,*";
-            source: "elm";
-            script {
-               set_int(g_expand, 1);
-            }
-         }
-         program { name: "move_to_right_1btn";
-            signal: "elm,state,floatingbutton,right,1btn";
-            source: "elm";
-            action: STATE_SET "expand" 0.0;
-            target: "elm.dragable.fb";
-            transition: DECEL 0.4;
-         }
-         program { name: "move_to_right_2btn";
-            signal: "elm,state,floatingbutton,right,2btn";
-            source: "elm";
-            action: STATE_SET "2buttons_expand" 0.0;
-            target: "elm.dragable.fb";
-            transition: DECEL 0.4;
-         }
-         program { name: "move_to_center";
-            signal: "elm,state,floatingbutton,center,*";
-            source: "elm";
-            action: STATE_SET "default" 0.0;
-            target: "left_spacer";
-            target: "right_spacer";
-            transition: DECEL 0.4;
-         }
-         program {
-            signal: "elm,state,floatingbutton,center,*";
-            source: "elm";
-            script {
-               set_int(g_expand, 0);
-            }
-         }
-         program { name: "move_to_center_1btn";
-            signal: "elm,state,floatingbutton,center,1btn";
-            source: "elm";
-            action: STATE_SET "default" 0.0;
-            target: "elm.dragable.fb";
-            transition: DECEL 0.4;
-         }
-         program { name: "move_to_center_2btn";
-            signal: "elm,state,floatingbutton,center,2btn";
-            source: "elm";
-            action: STATE_SET "2buttons" 0.0;
-            target: "elm.dragable.fb";
-            transition: DECEL 0.4;
-         }
-      }
-   }
-
-   group { name: "elm/floatingbutton/base/white_bg";
-      inherit: "elm/floatingbutton/base/default";
-      parts {
-         part { name: "vg_clipper";
-            type: RECT;
-            clip_to: "clipper";
-            description { state: "default" 0.0;
-               fixed: 1 1;
-               color: 250 250 250 255;
-               rel1.to: "elm.swallow.vg";
-               rel2.to: "elm.swallow.vg";
-            }
-            description { state: "disabled" 0.0;
-               inherit: "default";
-               color: 250 250 250 77;
-            }
-         }
-      }
-   }
diff --git a/mobile/data/images/date_picker_day_28_bg.png b/mobile/data/images/date_picker_day_28_bg.png
deleted file mode 100755 (executable)
index 8756a60..0000000
Binary files a/mobile/data/images/date_picker_day_28_bg.png and /dev/null differ
diff --git a/mobile/data/images/date_picker_day_29_bg.png b/mobile/data/images/date_picker_day_29_bg.png
deleted file mode 100755 (executable)
index 1bda653..0000000
Binary files a/mobile/data/images/date_picker_day_29_bg.png and /dev/null differ
diff --git a/mobile/data/images/date_picker_day_30_bg.png b/mobile/data/images/date_picker_day_30_bg.png
deleted file mode 100755 (executable)
index c212e09..0000000
Binary files a/mobile/data/images/date_picker_day_30_bg.png and /dev/null differ
diff --git a/mobile/data/images/date_picker_day_31_bg.png b/mobile/data/images/date_picker_day_31_bg.png
deleted file mode 100755 (executable)
index 5b62106..0000000
Binary files a/mobile/data/images/date_picker_day_31_bg.png and /dev/null differ
diff --git a/mobile/data/images/date_picker_month_bg.png b/mobile/data/images/date_picker_month_bg.png
deleted file mode 100755 (executable)
index 8edc8df..0000000
Binary files a/mobile/data/images/date_picker_month_bg.png and /dev/null differ
diff --git a/mobile/data/images/date_picker_year_bg.png b/mobile/data/images/date_picker_year_bg.png
deleted file mode 100755 (executable)
index 3840024..0000000
Binary files a/mobile/data/images/date_picker_year_bg.png and /dev/null differ
diff --git a/mobile/data/images/time_picker_bg.png b/mobile/data/images/time_picker_bg.png
deleted file mode 100755 (executable)
index 351f917..0000000
Binary files a/mobile/data/images/time_picker_bg.png and /dev/null differ
diff --git a/mobile/src/CMakeLists.txt b/mobile/src/CMakeLists.txt
deleted file mode 100644 (file)
index 542d457..0000000
+++ /dev/null
@@ -1,2 +0,0 @@
-ADD_SUBDIRECTORY(include)
-ADD_SUBDIRECTORY(lib)
diff --git a/mobile/src/include/CMakeLists.txt b/mobile/src/include/CMakeLists.txt
deleted file mode 100644 (file)
index 1d6d322..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-SET(HEADER_FILES
-       eext_floatingbutton.h
-       )
-
-SET(COMMON_HEADERS
-       ${COMMON_HEADERS}
-       ${HEADER_FILES}
-       )
-
-FOREACH(files ${COMMON_HEADERS})
-       SET(HEADER_INCS "${HEADER_INCS}#include \"${files}\"\n")
-ENDFOREACH(files)
-
-CONFIGURE_FILE(
-       ${COMMON_DIR}/include/efl_extension.h.in ${COMMON_DIR}/include/efl_extension.h
-       @ONLY)
-
-SET(HEADER_FILES
-       ${HEADER_FILES}
-       eext_floatingbutton_common.h
-       eext_floatingbutton_legacy.h
-       eext_floatingbutton.eo.legacy.h
-       eext_floatingbutton_eo.h
-       eext_floatingbutton.eo.h
-       )
-
-FOREACH(files ${HEADER_FILES})
-       GET_FILENAME_COMPONENT(dir ${files} PATH)
-       INSTALL(FILES ${files} DESTINATION include/${LIB_NAME}/${dir})
-ENDFOREACH()
-INSTALL(FILES ${COMMON_DIR}/include/efl_extension.h DESTINATION include/${LIB_NAME})
diff --git a/mobile/src/include/eext_floatingbutton.h b/mobile/src/include/eext_floatingbutton.h
deleted file mode 100644 (file)
index 13b9f0a..0000000
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * @defgroup Floatingbutton Floatingbutton
- * @ingroup CAPI_EFL_EXTENSION_MODULE
- *
- * @brief Widget to add floating area for buttons
- *
- * The Floatingbutton widget is not a real button, but only provides areas
- * where application adds (maximum 2) buttons to.
- *
- * This widget inherits from the Layout one, so that all the Layout functions
- * can be used on it. However, it includes not only visible floating area,
- * but invisible track for moving floating area, so there is a possibility that
- * it works differently from that you intended.
- *
- * Default content parts of the floatingbutton widget that you can use for are:
- * @li "button1" - left area for button
- * @li "button2" - right area for button
- *
- * Floatingbutton can be hidden by siganl emission.
- * @li show - elm_object_signal_emit(fb, "elm,state,show", "");
- * @li hide - elm_object_signal_emit(fb, "elm,state,hide", "");
- */
-
-/**
- * addtogroup Floatingbutton
- * @{
- */
-#include "eext_floatingbutton_common.h"
-#ifdef EFL_EO_API_SUPPORT
-#include "eext_floatingbutton_eo.h"
-#endif
-#ifndef EFL_NOLEGACY_API_SUPPORT
-#include "eext_floatingbutton_legacy.h"
-#endif
-/**
- * @}
- */
-
diff --git a/mobile/src/include/eext_floatingbutton_common.h b/mobile/src/include/eext_floatingbutton_common.h
deleted file mode 100644 (file)
index 3e633ac..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * @addtogroup Floatingbutton
- *
- * @{
- */
-
-/**
- * Positions where floatingbutton can be placed on
- */
-typedef enum {
-   EEXT_FLOATINGBUTTON_LEFT_OUT = 0, /**< hides in the left, but small handler will show only */
-   EEXT_FLOATINGBUTTON_LEFT, /**< shows all of buttons, but lies on the left */
-   EEXT_FLOATINGBUTTON_CENTER, /**< shows all of buttons, but lies on the center */
-   EEXT_FLOATINGBUTTON_RIGHT, /**< shows all of buttons, but lies on the right */
-   EEXT_FLOATINGBUTTON_RIGHT_OUT, /**< hides in the right, but small handler will show only */
-   EEXT_FLOATINGBUTTON_LAST /**< indicates the last, do not use this **/
-} Eext_Floatingbutton_Pos;
-
-typedef enum {
-   EEXT_FLOATINGBUTTON_MODE_DEFAULT = 0, /**< allows all positions */
-   EEXT_FLOATINGBUTTON_MODE_BOTH_SIDES, /**< allows LEFT and RIGHT positions only */
-   EEXT_FLOATINGBUTTON_MODE_LAST /**< indicates the last, do not use this **/
-} Eext_Floatingbutton_Mode;
-
-/**
- * @}
- */
diff --git a/mobile/src/include/eext_floatingbutton_eo.h b/mobile/src/include/eext_floatingbutton_eo.h
deleted file mode 100644 (file)
index 7ebcd09..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "eext_floatingbutton.eo.h"
diff --git a/mobile/src/include/eext_floatingbutton_legacy.h b/mobile/src/include/eext_floatingbutton_legacy.h
deleted file mode 100644 (file)
index 9e9c77c..0000000
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/**
- * @MOBILE_ONLY
- *
- * @brief Add a new floatingbutton to the parent
- *
- * @if MOBILE @since_tizen 2.4
- * @endif
- *
- * @param[in] parent The parent object
- * @return The new object or NULL if it cannot be created
- *
- * @ingroup Floatingbutton
- */
-EAPI Evas_Object *eext_floatingbutton_add(Evas_Object *parent);
-
-#include "eext_floatingbutton.eo.legacy.h"
diff --git a/mobile/src/lib/CMakeLists.txt b/mobile/src/lib/CMakeLists.txt
deleted file mode 100644 (file)
index 41a6f9d..0000000
+++ /dev/null
@@ -1,49 +0,0 @@
-add_definitions(-DEFL_EO_API_SUPPORT=1 -DEFL_BETA_API_SUPPORT=1)
-
-SET(LIB_SRCS
-       ${LIB_SRCS}
-       eext_floatingbutton.c
-       )
-SET (ALL_EO_FILES
-       eext_floatingbutton.eo
-       )
-
-foreach(eo_file ${ALL_EO_FILES})
-       string(REPLACE .eo .eo.c out_c_file ${eo_file})
-       string(REPLACE .eo .eo.h out_h_file ${eo_file})
-       string(REPLACE .eo .eo.legacy.h out_legacy_file ${eo_file})
-       string(REPLACE .eo .c c_file ${eo_file})
-       add_custom_command(
-               OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/${out_c_file}
-               COMMAND /usr/bin/eolian_gen ${eo_file} --eo --legacy --gc -I /usr/share/eolian/include -o ${out_c_file}
-               COMMAND /usr/bin/eolian_gen ${eo_file} --eo --gh -I /usr/share/eolian/include -o "../include/${out_h_file}"
-               COMMAND /usr/bin/eolian_gen ${eo_file} --legacy --gh -I /usr/share/eolian/include -o "../include/${out_legacy_file}"
-               DEPENDS ${eo_file} ${CMAKE_CURRENT_SOURCE_DIR}/*.eo
-               COMMENT "Compiling Eo: ${eo_file}, Output eo : ${out_c_file}"
-               VERBATIM)
-       add_custom_target(target_${eo_file} ALL DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${out_c_file})
-       SET (ALL_EO_TARGETS ${ALL_EO_TARGETS} target_${eo_file})
-endforeach(eo_file)
-
-ADD_LIBRARY(${LIB_NAME} SHARED ${LIB_SRCS})
-ADD_DEPENDENCIES(${LIB_NAME} ${ALL_EO_TARGETS})
-
-ADD_DEFINITIONS("-DEXPORT_API=__attribute__((visibility(\"default\")))")
-PKG_CHECK_MODULES(LIB_PKGS REQUIRED
-               elementary
-               dlog
-               fontconfig
-               glib-2.0
-               )
-
-FOREACH(flag ${LIB_PKGS_CFLAGS})
-       SET(LIB_CFLAGS "${LIB_CFLAGS} ${flag}")
-ENDFOREACH(flag)
-
-SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES COMPILE_FLAGS "${LIB_CFLAGS}")
-SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES VERSION ${VERSION})
-SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES SOVERSION ${VERSION_MAJOR})
-TARGET_LINK_LIBRARIES(${LIB_NAME} ${LIB_PKGS_LDFLAGS} ${LIB_TARGET_PKGS_LDFLAGS})
-
-INSTALL(TARGETS ${LIB_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR})
-#INSTALL(FILES ${ALL_EO_FILES} DESTINATION share/eolian/include/efl-extension)
diff --git a/mobile/src/lib/eext_floatingbutton.c b/mobile/src/lib/eext_floatingbutton.c
deleted file mode 100644 (file)
index 1f44c4e..0000000
+++ /dev/null
@@ -1,712 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#define ELM_INTERNAL_API_ARGESFSDFEFC 1
-
-#include <Eo.h>
-
-#include "efl_extension.h"
-#include "efl_extension_private.h"
-#include "../../data/HD-inc.edc"
-
-#include <elm_widget.h>
-
-#define MY_CLASS EEXT_FLOATINGBUTTON_CLASS
-
-#define MY_CLASS_NAME "Eext_Floatingbutton"
-#define MY_CLASS_NAME_LEGACY "eext_floatingbutton"
-
-static const char SIG_PRESSED[] = "pressed";
-static const char SIG_UNPRESSED[] = "unpressed";
-
-static const Evas_Smart_Cb_Description _smart_callbacks[] = {
-   {SIG_PRESSED, ""},
-   {SIG_UNPRESSED, ""},
-   {NULL, NULL}
-};
-
-#define EEXT_SCALE_SIZE(x, obj) ((x) / edje_object_base_scale_get(elm_layout_edje_get(obj)) \
-                                     * elm_config_scale_get() \
-                                     * elm_object_scale_get(obj))
-
-#define EEXT_SCALE_SIZE_INVERSE(x, obj) ((x) * edje_object_base_scale_get(elm_layout_edje_get(obj)) \
-                                             / elm_config_scale_get() \
-                                             / elm_object_scale_get(obj))
-
-#define MSG_THRESHOLD 0
-
-static const char *BTN1_PART = "button1";
-static const char *BTN2_PART = "button2";
-static const char *DRAGABLE_PART = "elm.dragable.fb";
-static const char *TRACK_PART = "elm.track.fb";
-
-typedef struct _Eext_Floatingbutton_Data {
-
-   Eo                      *obj;
-   Elm_Theme               *th;
-   Evas_Object             *box;
-   Evas_Object             *vg;
-   Efl_VG_Shape            *base_shape;
-   Ecore_Animator          *anim;
-
-   Evas_Object             *btn1;
-   Evas_Object             *btn2;
-
-   Evas_Coord               x;
-   int                      dir;
-
-   Eext_Floatingbutton_Mode mode;
-   Eext_Floatingbutton_Pos  pos;
-   double                   last_pos;
-   double                   pos_table[EEXT_FLOATINGBUTTON_LAST];
-   Eina_Bool                pos_disabled[EEXT_FLOATINGBUTTON_LAST];
-
-   Eina_Bool                on_update  : 1;
-   Eina_Bool                mouse_down : 1;
-   Eina_Bool                block      : 1;
-   Eina_Bool                center     : 1;
-
-} Eext_Floatingbutton_Data;
-
-static void
-_signal_emit(Eo *obj, Eext_Floatingbutton_Data *sd)
-{
-   int count = 0;
-   char buf[200];
-   Evas_Object *edje = elm_layout_edje_get(obj);
-
-   count = !!(sd->btn1) + !!(sd->btn2);
-
-   switch (sd->pos)
-     {
-      case EEXT_FLOATINGBUTTON_LEFT_OUT:
-      case EEXT_FLOATINGBUTTON_LEFT:
-         snprintf(buf, sizeof(buf), "elm,state,floatingbutton,left,%s", ((count >= 2) ? "2btn" : "1btn"));
-         edje_object_signal_emit(edje, buf, "elm");
-         sd->center = EINA_FALSE;
-         break;
-      case EEXT_FLOATINGBUTTON_CENTER:
-         snprintf(buf, sizeof(buf), "elm,state,floatingbutton,center,%s", ((count >= 2) ? "2btn" : "1btn"));
-         edje_object_signal_emit(edje, buf, "elm");
-         sd->center = EINA_TRUE;
-         break;
-      case EEXT_FLOATINGBUTTON_RIGHT:
-      case EEXT_FLOATINGBUTTON_RIGHT_OUT:
-         snprintf(buf, sizeof(buf), "elm,state,floatingbutton,right,%s", ((count >= 2) ? "2btn" : "1btn"));
-         edje_object_signal_emit(edje, buf, "elm");
-         sd->center = EINA_FALSE;
-         break;
-      case EEXT_FLOATINGBUTTON_LAST:
-         /* you must not reach here */
-         break;
-     }
-
-   sd->on_update = EINA_TRUE;
-
-   edje_object_message_signal_process(edje);
-}
-
-static void
-_pos_recalc(Eo *obj, Eext_Floatingbutton_Data *sd)
-{
-   int count = 0;
-   Evas_Coord w, w1;
-   Evas_Object *edje = elm_layout_edje_get(obj);
-
-   edje_object_part_geometry_get(edje, TRACK_PART, NULL, NULL, &w, NULL);
-
-   count = !!(sd->btn1) + !!(sd->btn2);
-
-   if (count >= 2) w1 = EEXT_SCALE_SIZE(FLOATINGBUTTON_2BTN_WIDTH, obj);
-   else w1 = EEXT_SCALE_SIZE(FLOATINGBUTTON_1BTN_WIDTH, obj);
-
-   sd->pos_table[EEXT_FLOATINGBUTTON_LEFT] = (w1 - EEXT_SCALE_SIZE(FLOATINGBUTTON_LR_WIDTH, obj)) / (double)(w - w1);
-   sd->pos_table[EEXT_FLOATINGBUTTON_RIGHT] = (w - w1 * 2 + EEXT_SCALE_SIZE(FLOATINGBUTTON_LR_WIDTH, obj)) / (double)(w - w1);
-}
-
-static void
-_threshold_update(Eo *obj, Eext_Floatingbutton_Data *sd)
-{
-   Evas_Coord w1;
-   Evas_Object *edje = elm_layout_edje_get(obj);
-   Edje_Message_Int *msg = calloc(1, sizeof(*msg) + sizeof(int));
-
-   if (!msg) return;
-
-   edje_object_part_geometry_get(edje, DRAGABLE_PART, NULL, NULL, &w1, NULL);
-   w1 = EEXT_SCALE_SIZE_INVERSE(w1, obj);
-
-   msg->val = w1 + 30;
-   edje_object_message_send(edje, EDJE_MESSAGE_INT, MSG_THRESHOLD, msg);
-   free(msg);
-
-   elm_layout_signal_emit(obj, "elm,floatingbutton,threshold,update", "elm");
-}
-
-static void
-_box_recalc(Eo *obj, Eext_Floatingbutton_Data *sd)
-{
-   _signal_emit(obj, sd);
-   _pos_recalc(obj, sd);
-   _threshold_update(obj, sd);
-}
-
-static void
-_vg_resize_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
-   Eext_Floatingbutton_Data *fbd = data;
-   Evas_Coord x, y, w, h;
-
-   evas_object_geometry_get(obj, &x, &y, &w, &h);
-
-   evas_vg_shape_reset(fbd->base_shape);
-   evas_vg_shape_append_rect(fbd->base_shape, 0, 0, w, h,
-                             EEXT_SCALE_SIZE(FLOATINGBUTTON_LAYOUT_LR_WIDTH, fbd->obj),
-                             (EEXT_SCALE_SIZE(FLOATINGBUTTON_HEIGHT, fbd->obj)/2));
-}
-
-static Eina_Bool
-_anim_cb(void *data, double pos)
-{
-   Eext_Floatingbutton_Data *fbd = data;
-   double cur_pos;
-   double pivot;
-
-   pivot = ecore_animator_pos_map(pos, ECORE_POS_MAP_DECELERATE, 0.2, 0.0);
-
-   if (fbd->pos_table[fbd->pos] > fbd->last_pos)
-     cur_pos = fbd->last_pos + (fbd->pos_table[fbd->pos] - fbd->last_pos) * pivot;
-   else
-     cur_pos = fbd->last_pos - (fbd->last_pos - fbd->pos_table[fbd->pos]) * pivot;
-
-   edje_object_part_drag_value_set(elm_layout_edje_get(fbd->obj), DRAGABLE_PART, cur_pos, 0.5);
-
-   if (pos >= 1.0)
-     fbd->anim = NULL;
-
-   return ECORE_CALLBACK_RENEW;
-}
-
-static Eina_Bool
-_message_send(void *data)
-{
-   Eext_Floatingbutton_Data *fbd = data;
-
-   _threshold_update(fbd->obj, fbd);
-
-   return ECORE_CALLBACK_CANCEL;
-}
-
-static void
-_update_pos(Eo *obj, Eext_Floatingbutton_Data *fbd, Eina_Bool anim)
-{
-   edje_object_part_drag_value_get(elm_layout_edje_get(obj), DRAGABLE_PART, &fbd->last_pos, NULL);
-
-   if (!anim)
-     edje_object_part_drag_value_set(elm_layout_edje_get(obj), DRAGABLE_PART, fbd->pos_table[fbd->pos], 0.5);
-   else
-     {
-        if (fbd->anim)
-          {
-             ecore_animator_del(fbd->anim);
-             fbd->anim = NULL;
-          }
-
-        if ((fbd->last_pos - fbd->pos_table[fbd->pos] >= 0.005) ||
-            (fbd->last_pos - fbd->pos_table[fbd->pos] <= -0.005))
-          fbd->anim = ecore_animator_timeline_add(0.4, _anim_cb, fbd);
-        else
-          edje_object_part_drag_value_set(elm_layout_edje_get(obj), DRAGABLE_PART, fbd->pos_table[fbd->pos], 0.5);
-     }
-
-   if (!anim || !fbd->on_update)
-     _signal_emit(obj, fbd);
-
-   fbd->on_update = EINA_FALSE;
-
-   if (!anim || fbd->anim)
-     ecore_timer_add(0.4, _message_send, fbd);
-}
-
-static void
-_resize_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
-   _pos_recalc(obj, data);
-   _update_pos(obj, data, EINA_FALSE);
-}
-
-static void
-_size_hints_changed_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
-   Evas_Display_Mode dispmode;
-
-   dispmode = evas_object_size_hint_display_mode_get(obj);
-
-   if (dispmode == EVAS_DISPLAY_MODE_COMPRESS)
-     elm_layout_signal_emit(obj, "elm,state,floatingbutton,hidden", "elm");
-   else
-     elm_layout_signal_emit(obj, "elm,state,floatingbutton,visible", "elm");
-}
-
-static void
-_on_mouse_down(void *data, Evas_Object *obj, const char *emission, const char *source)
-{
-   Eext_Floatingbutton_Data *fbd = data;
-   Evas_Object *edje = elm_layout_edje_get(obj);
-
-   fbd->mouse_down = EINA_TRUE;
-
-   edje_object_part_geometry_get(edje, DRAGABLE_PART, &fbd->x, NULL, NULL, NULL);
-
-   fbd->dir = 0;
-
-   if (!elm_widget_disabled_get(obj) && !evas_object_freeze_events_get(obj))
-     evas_object_smart_callback_call(obj, SIG_PRESSED, NULL);
-}
-
-static void
-_on_mouse_move(void *data, Evas_Object *obj, const char *emission, const char *source)
-{
-   Eext_Floatingbutton_Data *fbd = data;
-
-   double dx;
-
-   if (fbd->mouse_down)
-     {
-        Evas_Object *edje = elm_layout_edje_get(obj);
-
-        if (!fbd->dir)
-          {
-             Evas_Coord x, finger_size = elm_config_finger_size_get();
-
-             edje_object_part_geometry_get(edje, DRAGABLE_PART, &x, NULL, NULL, NULL);
-
-             if (x > (fbd->x + finger_size)) fbd->dir = 1;
-             else if(x < (fbd->x - finger_size)) fbd->dir = -1;
-
-             if (fbd->dir)
-               {
-                  Eina_List *l;
-                  Evas_Object *btn;
-
-                  edje_object_signal_emit(edje, "elm,state,floatingbutton,freeze", "elm");
-                  edje_object_message_signal_process(edje);
-
-                  l = elm_box_children_get(fbd->box);
-                  EINA_LIST_FREE(l, btn)
-                    elm_layout_signal_emit(btn, "elm,state,default", "elm");
-               }
-          }
-
-        if (!fbd->center)
-          {
-             int count;
-             char buf[200];
-
-             count = !!(fbd->btn1) + !!(fbd->btn2);
-
-             edje_object_part_drag_value_get(edje, DRAGABLE_PART, &dx, NULL);
-
-             if ((dx > fbd->pos_table[EEXT_FLOATINGBUTTON_LEFT] + 0.02) &&
-                 (dx < fbd->pos_table[EEXT_FLOATINGBUTTON_RIGHT] - 0.02))
-               {
-                  snprintf(buf, sizeof(buf), "elm,state,floatingbutton,center,%s", ((count >= 2) ? "2btn" : "1btn"));
-                  edje_object_signal_emit(edje, buf, "elm");
-                  fbd->center = EINA_TRUE;
-               }
-          }
-     }
-}
-
-static void
-_on_mouse_up(void *data, Evas_Object *obj, const char *emission, const char *source)
-{
-   Eext_Floatingbutton_Data *fbd = data;
-   Evas_Object *edje = elm_layout_edje_get(obj);
-   Evas_Coord track_x, track_w, drag_x, drag_w;
-   double cur_pos;
-   int i;
-
-   fbd->mouse_down = EINA_FALSE;
-
-   if (fbd->dir)
-     {
-        edje_object_part_geometry_get(edje, DRAGABLE_PART, &drag_x, NULL, &drag_w, NULL);
-        edje_object_part_geometry_get(edje, TRACK_PART, &track_x, NULL, &track_w, NULL);
-
-        cur_pos = (drag_x - track_x) / (double)(track_w - drag_w);
-
-        if (fbd->dir > 0)
-          {
-             for (i = EEXT_FLOATINGBUTTON_LEFT_OUT; i < EEXT_FLOATINGBUTTON_RIGHT_OUT; ++i)
-               if (!fbd->pos_disabled[i] &&
-                    cur_pos < (fbd->pos_table[i] + ((i == 1 || i == 2) ? 0.12 : 0)))
-                 break;
-
-             if (i == EEXT_FLOATINGBUTTON_RIGHT_OUT && fbd->pos_disabled[i])
-               while (--i > EEXT_FLOATINGBUTTON_LEFT_OUT)
-                 if (!fbd->pos_disabled[i]) break;
-          }
-        else
-          {
-             for (i = EEXT_FLOATINGBUTTON_RIGHT_OUT; i > EEXT_FLOATINGBUTTON_LEFT_OUT; --i)
-               if (!fbd->pos_disabled[i] &&
-                    cur_pos > (fbd->pos_table[i] - ((i == 3 || i == 2) ? 0.12 : 0)))
-                 break;
-
-             if (i == EEXT_FLOATINGBUTTON_LEFT_OUT && fbd->pos_disabled[i])
-               while (++i <= EEXT_FLOATINGBUTTON_RIGHT_OUT)
-                 if (!fbd->pos_disabled[i]) break;
-          }
-
-        //just for exceptional case.
-        if (i == EEXT_FLOATINGBUTTON_LAST) i = EEXT_FLOATINGBUTTON_RIGHT_OUT;
-
-        fbd->pos = i;
-
-        edje_object_signal_emit(edje, "elm,state,floatingbutton,thaw", "elm");
-     }
-
-   _update_pos(obj, fbd, EINA_TRUE);
-
-   if (!elm_widget_disabled_get(obj) && !evas_object_freeze_events_get(obj))
-     evas_object_smart_callback_call(obj, SIG_UNPRESSED, NULL);
-}
-
-EOLIAN static void
-_eext_floatingbutton_evas_object_smart_del(Eo *obj, Eext_Floatingbutton_Data *sd)
-{
-   eo_do_super(obj, MY_CLASS, evas_obj_smart_del());
-
-   elm_theme_extension_del(sd->th, EFL_EXTENSION_EDJ);
-   elm_theme_free(sd->th);
-}
-
-EOLIAN static void
-_eext_floatingbutton_movement_block_set(Eo *obj, Eext_Floatingbutton_Data *sd, Eina_Bool block)
-{
-   char buf[200];
-
-   block = !!block;
-   sd->block = block;
-
-   if (block)
-     snprintf(buf, sizeof(buf), "elm,state,floatingbutton,block");
-   else
-     snprintf(buf, sizeof(buf), "elm,state,floatingbutton,unblock");
-
-   elm_layout_signal_emit(obj, buf, "elm");
-}
-
-EOLIAN static Eina_Bool
-_eext_floatingbutton_movement_block_get(Eo *obj EINA_UNUSED, Eext_Floatingbutton_Data *sd)
-{
-   return sd->block;
-}
-
-EOLIAN static Eina_Bool
-_eext_floatingbutton_pos_set(Eo *obj, Eext_Floatingbutton_Data *sd, Eext_Floatingbutton_Pos pos)
-{
-   if ((pos < EEXT_FLOATINGBUTTON_LEFT_OUT) || (pos > EEXT_FLOATINGBUTTON_RIGHT_OUT))
-     return EINA_FALSE;
-
-   if ((sd->block) || (sd->pos_disabled[pos]))
-     return EINA_FALSE;
-
-   sd->pos = pos;
-
-   _update_pos(obj, sd, EINA_FALSE);
-
-   return EINA_TRUE;
-}
-
-EOLIAN static Eext_Floatingbutton_Pos
-_eext_floatingbutton_pos_get(Eo *obj EINA_UNUSED, Eext_Floatingbutton_Data *sd)
-{
-   return sd->pos;
-}
-
-EOLIAN static Eina_Bool
-_eext_floatingbutton_pos_bring_in(Eo *obj, Eext_Floatingbutton_Data *sd, Eext_Floatingbutton_Pos pos)
-{
-   if ((pos < EEXT_FLOATINGBUTTON_LEFT_OUT) || (pos > EEXT_FLOATINGBUTTON_RIGHT_OUT))
-     return EINA_FALSE;
-
-   if ((sd->block) || (sd->pos_disabled[pos]))
-     return EINA_FALSE;
-
-   if (sd->pos > pos)
-     elm_layout_signal_emit(obj, "elm,action,floatingbutton,left", "elm");
-   else if (sd->pos < pos)
-     elm_layout_signal_emit(obj, "elm,action,floatingbutton,right", "elm");
-
-   edje_object_message_signal_process(elm_layout_edje_get(obj));
-
-   sd->pos = pos;
-
-   _update_pos(obj, sd, EINA_TRUE);
-
-   return EINA_TRUE;
-}
-
-EAPI Evas_Object *
-eext_floatingbutton_add(Evas_Object *parent)
-{
-   if (!parent) return NULL;
-   Evas_Object *obj = eo_add(MY_CLASS, parent);
-
-   return obj;
-}
-
-EOLIAN static Eo *
-_eext_floatingbutton_eo_base_constructor(Eo *obj, Eext_Floatingbutton_Data *sd EINA_UNUSED)
-{
-   obj = eo_do_super_ret(obj, MY_CLASS, obj, eo_constructor());
-   eo_do(obj,
-         evas_obj_type_set(MY_CLASS_NAME_LEGACY),
-         evas_obj_smart_callbacks_descriptions_set(_smart_callbacks));
-
-   return obj;
-}
-
-EOLIAN static void
-_eext_floatingbutton_evas_object_smart_add(Eo *obj, Eext_Floatingbutton_Data *priv)
-{
-   eo_do_super(obj, MY_CLASS, evas_obj_smart_add());
-   elm_widget_sub_object_parent_add(obj);
-
-   priv->obj = obj;
-   priv->pos = EEXT_FLOATINGBUTTON_RIGHT;
-
-   priv->th = elm_theme_new();
-   elm_theme_ref_set(priv->th, NULL);
-   elm_theme_extension_add(priv->th, EFL_EXTENSION_EDJ);
-
-   elm_object_theme_set(obj, priv->th);
-   elm_layout_theme_set(obj, "floatingbutton", "base", elm_object_style_get(obj));
-   evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _resize_cb, priv);
-   evas_object_event_callback_add(obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _size_hints_changed_cb, priv);
-
-   elm_layout_signal_callback_add(obj, "mouse,down,1", DRAGABLE_PART, _on_mouse_down, priv);
-   elm_layout_signal_callback_add(obj, "mouse,up,1", DRAGABLE_PART, _on_mouse_up, priv);
-   elm_layout_signal_callback_add(obj, "mouse,move", DRAGABLE_PART, _on_mouse_move, priv);
-
-   priv->vg = evas_object_vg_add(evas_object_evas_get(obj));
-   elm_layout_content_set(obj, "elm.swallow.vg", priv->vg);
-   Efl_VG *base_root = evas_object_vg_root_node_get(priv->vg);
-   priv->base_shape = evas_vg_shape_add(base_root);
-   evas_vg_node_color_set(priv->base_shape, 255, 255, 255, 255);
-   evas_object_event_callback_add(priv->vg, EVAS_CALLBACK_RESIZE, _vg_resize_cb, priv);
-
-   priv->box = elm_box_add(obj);
-   elm_box_horizontal_set(priv->box, EINA_TRUE);
-   elm_box_padding_set(priv->box, EEXT_SCALE_SIZE(FLOATINGBUTTON_MID_WIDTH, obj), 0);
-   elm_object_part_content_set(obj, "elm.swallow.box", priv->box);
-
-   priv->block = EINA_FALSE;
-
-   priv->pos_table[EEXT_FLOATINGBUTTON_LEFT_OUT] = 0.0;
-   priv->pos_table[EEXT_FLOATINGBUTTON_CENTER] = 0.5;
-   priv->pos_table[EEXT_FLOATINGBUTTON_RIGHT_OUT] = 1.0;
-
-   _pos_recalc(obj, priv);
-   _update_pos(obj, priv, EINA_FALSE);
-
-   _threshold_update(obj, priv);
-}
-
-EOLIAN static void
-_eext_floatingbutton_class_constructor(Eo_Class *klass)
-{
-   evas_smart_legacy_type_register(MY_CLASS_NAME_LEGACY, klass);
-}
-
-static void
-_btn_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
-   Eext_Floatingbutton_Data *fbd = eo_data_scope_get((Eo *)data, EEXT_FLOATINGBUTTON_CLASS);
-
-   if (!fbd) return;
-
-   elm_box_unpack(fbd->box, obj);
-   _box_recalc(data, fbd);
-
-   if (fbd->btn1 == obj) fbd->btn1 = NULL;
-   else if (fbd->btn2 == obj) fbd->btn2 = NULL;
-
-   _update_pos(obj, fbd, EINA_FALSE);
-}
-
-EOLIAN static Eina_Bool
-_eext_floatingbutton_elm_container_content_set(Eo *obj, Eext_Floatingbutton_Data *sd, const char *part, Evas_Object *content)
-{
-   Eina_Bool int_ret = EINA_FALSE;
-   char buf[256];
-
-   if ((!part) || (!content)) return int_ret;
-
-   if (!strcmp(part, BTN1_PART))
-     {
-        snprintf(buf, sizeof(buf), "floatingbutton/%s", elm_object_style_get(obj));
-        elm_object_style_set(content, buf);
-
-        if (sd->btn1) evas_object_del(sd->btn1);
-
-        sd->btn1 = content;
-
-        evas_object_show(sd->btn1);
-        elm_box_pack_start(sd->box, content);
-
-        evas_object_event_callback_add(content, EVAS_CALLBACK_DEL, _btn_del_cb, obj);
-
-        int_ret = EINA_TRUE;
-     }
-   else if (!strcmp(part, BTN2_PART))
-     {
-        snprintf(buf, sizeof(buf), "floatingbutton/%s", elm_object_style_get(obj));
-        elm_object_style_set(content, buf);
-
-        if (sd->btn2) evas_object_del(sd->btn2);
-
-        sd->btn2 = content;
-
-        evas_object_show(sd->btn2);
-        elm_box_pack_end(sd->box, content);
-
-        evas_object_event_callback_add(content, EVAS_CALLBACK_DEL, _btn_del_cb, obj);
-
-        int_ret = EINA_TRUE;
-     }
-   else
-     eo_do_super(obj, MY_CLASS, int_ret = elm_obj_container_content_set(part, content));
-
-   _box_recalc(obj, sd);
-   _update_pos(obj, sd, EINA_TRUE);
-
-   return int_ret;
-}
-
-EOLIAN static Evas_Object *
-_eext_floatingbutton_elm_container_content_get(Eo *obj, Eext_Floatingbutton_Data *sd, const char *part)
-{
-   Evas_Object *ret = NULL;
-
-   if (!part) return ret;
-
-   if (!strcmp(part, BTN1_PART))
-     ret = sd->btn1;
-   else if (!strcmp(part, BTN2_PART))
-     ret = sd->btn2;
-   else
-     eo_do_super(obj, MY_CLASS, ret = elm_obj_container_content_get(part));
-
-   return ret;
-}
-
-EOLIAN static Evas_Object *
-_eext_floatingbutton_elm_container_content_unset(Eo *obj, Eext_Floatingbutton_Data *sd, const char *part)
-{
-   Evas_Object *ret = NULL;
-
-   if (!part) return ret;
-
-   if (!strcmp(part, BTN1_PART) && sd->btn1)
-     {
-        elm_box_unpack(sd->box, sd->btn1);
-        evas_object_event_callback_del_full(sd->btn1, EVAS_CALLBACK_DEL, _btn_del_cb, obj);
-
-        ret = sd->btn1;
-        sd->btn1 = NULL;
-     }
-   else if (!strcmp(part, BTN2_PART) && sd->btn2)
-     {
-        elm_box_unpack(sd->box, sd->btn2);
-        evas_object_event_callback_del_full(sd->btn2, EVAS_CALLBACK_DEL, _btn_del_cb, obj);
-
-        ret = sd->btn2;
-        sd->btn2 = NULL;
-     }
-   else
-     eo_do_super(obj, MY_CLASS, ret = elm_obj_container_content_unset(part));
-
-   _box_recalc(obj, sd);
-   _update_pos(obj, sd, EINA_TRUE);
-
-   return ret;
-}
-
-EOLIAN static Elm_Theme_Apply
-_eext_floatingbutton_elm_widget_theme_apply(Eo *obj, Eext_Floatingbutton_Data *sd)
-{
-   Elm_Theme_Apply int_ret = ELM_THEME_APPLY_FAILED;
-   char buf[256];
-
-   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_theme_apply());
-   if (!int_ret) return ELM_THEME_APPLY_FAILED;
-
-   snprintf(buf, sizeof(buf), "floatingbutton/%s", elm_object_style_get(obj));
-
-   if (sd->btn1) elm_object_style_set(sd->btn1, buf);
-   if (sd->btn2) elm_object_style_set(sd->btn2, buf);
-
-   _box_recalc(obj, sd);
-
-   return int_ret;
-}
-
-EOLIAN static void
-_eext_floatingbutton_mode_set(Eo *obj,
-                              Eext_Floatingbutton_Data *sd,
-                              Eext_Floatingbutton_Mode mode)
-{
-   if (sd->mode == mode) return;
-
-   if ((mode < EEXT_FLOATINGBUTTON_MODE_DEFAULT) ||
-       (mode >= EEXT_FLOATINGBUTTON_MODE_LAST))
-     return;
-
-   sd->mode = mode;
-
-   switch(mode)
-     {
-      case EEXT_FLOATINGBUTTON_MODE_DEFAULT:
-        sd->pos_disabled[EEXT_FLOATINGBUTTON_LEFT_OUT] = 0;
-        sd->pos_disabled[EEXT_FLOATINGBUTTON_LEFT] = 0;
-        sd->pos_disabled[EEXT_FLOATINGBUTTON_CENTER] = 0;
-        sd->pos_disabled[EEXT_FLOATINGBUTTON_RIGHT] = 0;
-        sd->pos_disabled[EEXT_FLOATINGBUTTON_RIGHT_OUT] = 0;
-        break;
-      case EEXT_FLOATINGBUTTON_MODE_BOTH_SIDES:
-        sd->pos_disabled[EEXT_FLOATINGBUTTON_LEFT_OUT] = 1;
-        sd->pos_disabled[EEXT_FLOATINGBUTTON_LEFT] = 0;
-        sd->pos_disabled[EEXT_FLOATINGBUTTON_CENTER] = 1;
-        sd->pos_disabled[EEXT_FLOATINGBUTTON_RIGHT] = 0;
-        sd->pos_disabled[EEXT_FLOATINGBUTTON_RIGHT_OUT] = 1;
-        break;
-      case EEXT_FLOATINGBUTTON_MODE_LAST:
-        /* you must not reach here */
-        break;
-     }
-}
-
-EOLIAN static Eext_Floatingbutton_Mode
-_eext_floatingbutton_mode_get(Eo *obj,
-                              Eext_Floatingbutton_Data *sd)
-{
-   return sd->mode;
-}
-
-#include "eext_floatingbutton.eo.c"
diff --git a/mobile/src/lib/eext_floatingbutton.eo b/mobile/src/lib/eext_floatingbutton.eo
deleted file mode 100644 (file)
index 3e9445b..0000000
+++ /dev/null
@@ -1,99 +0,0 @@
-class Eext.Floatingbutton (Elm.Layout) {
-   eo_prefix: eext_obj_floatingbutton;
-   methods {
-      @property pos {
-         set {
-            [[
-            Set the floatingbutton position
-
-            The floatingbutton can be moved among predefined positions
-            (LEFT_OUT, LEFT, CENTER, RIGHT, RIGHT_OUT),
-            eext_floatingbutton_pos_set() moves floatingbutton to a given position immediately
-            (without animation).
-
-            return EINA_TRUE on success, EINA_FALSE otherwise.
-            ]]
-            return: bool;
-         }
-         get {
-            [[
-            Get the floatingbutton position
-
-            return Floatingbutton position with Eext_Floatingbutton_Pos enumeration
-
-            see eext_floatingbutton_pos_set()
-            ]]
-         }
-         values {
-            pos: Eext_Floatingbutton_Pos; [[ the floatingbutton position ]]
-         }
-      }
-      @property movement_block {
-         set {
-            [[
-            Set whether floatingbutton can be moved or not.
-
-            By default, floatingbutton are movable by user interaction.
-            ]]
-         }
-         get {
-            [[
-            Get movability for a given floatingbutton widget.
-
-            return EINA_TRUE, if obj is set to be unmovable,
-            EINA_FALSE, if it's movable.
-
-            see eext_floatingbutton_movement_block_set()
-            ]]
-         }
-         values {
-            block: Eina_Bool; [[ the floatingbutton movability ]]
-         }
-      }
-      @property mode {
-         set {
-            [[
-            Set floatingbutton mode.
-
-            Positions where floatingbutton can stop are restrained by mode.
-            ]]
-         }
-         get {
-            [[
-            Get floatingbutton mode.
-
-            see eext_floatingbutton_mode_set()
-            ]]
-         }
-         values {
-            mode: Eext_Floatingbutton_Mode; [[ floatingbutton mode ]]
-         }
-      }
-      pos_bring_in {
-         [[
-         Set the floatingbutton position with animation
-
-         Move floatingbutton similar to eext_floatingbutton_pos_set(),
-         but with animation.
-
-         return EINA_TRUE on success, EINA_FALSE otherwise.
-
-         see eext_floatingbutton_pos_set()
-         ]]
-         return: Eina_Bool;
-         params {
-            @in pos: const(Eext_Floatingbutton_Pos); [[ the floatingbutton position ]]
-         }
-      }
-   }
-   implements {
-      class.constructor;
-      Eo.Base.constructor;
-      Evas.Object_Smart.add;
-      Evas.Object_Smart.del;
-      Elm.Container.content_set;
-      Elm.Container.content_get;
-      Elm.Container.content_unset;
-      Elm.Widget.theme_apply;
-   }
-}
diff --git a/src/eext_events.c b/src/eext_events.c
new file mode 100644 (file)
index 0000000..254646b
--- /dev/null
@@ -0,0 +1,460 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "efl_extension.h"
+#include "efl_extension_private.h"
+
+typedef struct _Eext_Event_Mgr Eext_Event_Mgr;
+
+struct _Eext_Event_Mgr
+{
+   Eina_List *obj_events;
+   Evas *e;
+   Evas_Object *key_grab_rect;
+};
+
+typedef struct _Eext_Object_Event
+{
+   Evas_Object *obj;
+   Evas_Object *parent;
+   Eina_List *callbacks;
+   Eina_Bool delete_me : 1;
+   Eina_Bool on_callback : 1;
+} Eext_Object_Event;
+
+typedef struct _Eext_Event_Callback
+{
+   Eext_Callback_Type type;
+   void (*func)(void *data, Evas_Object *obj, void *event_info);
+   void *data;
+} Eext_Event_Callback;
+
+const char *EEXT_OBJ_KEY_EVENT_MGR = "_eext_obj_key_event_mgr";
+const char *EEXT_OBJ_KEY_OBJ_EVENT = "_eext_obj_key_obj_event";
+const char *EEXT_KEY_BACK = "XF86Back";
+const char *EEXT_KEY_BACK2 = "XF86Stop";
+const char *EEXT_KEY_BACK3 = "Escape";
+const char *EEXT_KEY_MENU = "XF86Menu";
+const char *EEXT_KEY_MENU2 = "XF86Send";
+const char *EEXT_KEY_MENU3 = "Menu";
+
+
+static Eina_List *event_mgrs = NULL;
+
+static void
+_eext_event_mgr_del(Eext_Event_Mgr *event_mgr)
+{
+   if (event_mgr->obj_events) return;
+
+   //Redundant Event Mgr. Remove it.
+   evas_object_del(event_mgr->key_grab_rect);
+   event_mgrs = eina_list_remove(event_mgrs, event_mgr);
+   free(event_mgr);
+}
+
+static void
+_eext_object_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   Eext_Event_Mgr *event_mgr = evas_object_data_get(obj, EEXT_OBJ_KEY_EVENT_MGR);
+   Eext_Object_Event *obj_event = data;
+   Eina_List *l;
+   Eext_Event_Callback *callback;
+
+   l = eina_list_data_find_list(event_mgr->obj_events, obj_event);
+   if (!l) return;
+
+   event_mgr->obj_events = eina_list_remove_list(event_mgr->obj_events, l);
+
+   EINA_LIST_FREE(obj_event->callbacks, callback) free(callback);
+   obj_event->callbacks = NULL;
+
+   if (obj_event->on_callback) obj_event->delete_me = EINA_TRUE;
+   else free(obj_event);
+
+   _eext_event_mgr_del(event_mgr);
+}
+
+static int
+_eext_layer_sort_cb(const void *data1, const void *data2)
+{
+   const Eext_Object_Event *obj_event = data1;
+   const Eext_Object_Event *obj_event2 = data2;
+
+   //1. Layer Compare
+   int layer1 = evas_object_layer_get(obj_event->obj);
+   int layer2 = evas_object_layer_get(obj_event2->obj);
+
+   return (layer1 < layer2) ? -1 : 1;
+}
+
+static Evas_Object *
+_eext_top_parent_candidates(Eina_List **candidates, Evas *e)
+{
+   Evas_Object *temp;
+   Evas_Object *parent;
+   Eina_List *l, *l_next;
+   Eext_Object_Event *obj_event;
+   Eina_List *_candidates = *candidates;
+   Eina_Bool found = EINA_FALSE;
+
+   //Get the top parent lists
+   EINA_LIST_FOREACH(_candidates, l, obj_event)
+     {
+        temp = obj_event->obj;
+        parent = obj_event->obj;
+        while (temp)
+          {
+             parent = temp;
+             temp = evas_object_smart_parent_get(temp);
+          }
+        obj_event->parent = parent;
+     }
+
+   //Leave only parent candidates.
+   parent = evas_object_top_get(e);
+
+   while (parent)
+     {
+        EINA_LIST_FOREACH(_candidates, l, obj_event)
+          {
+             if (parent == obj_event->parent)
+               {
+                  found = EINA_TRUE;
+                  obj_event->parent = NULL;
+               }
+          }
+        if (found) break;
+        parent = evas_object_below_get(parent);
+     }
+
+   //Redundant parents (no candidates)
+   EINA_LIST_FOREACH_SAFE(_candidates, l, l_next, obj_event)
+     {
+        if (!obj_event->parent) continue;
+        _candidates = eina_list_remove_list(_candidates, l);
+     }
+
+   *candidates = _candidates;
+   return parent;
+}
+
+static Eext_Object_Event *
+_eext_find_event_target(Eina_List *candidates, Evas_Object *parent, Eext_Callback_Type type)
+{
+   Eext_Object_Event *obj_event = NULL;
+   Eina_List *l, *ll;
+   Evas_Object *obj;
+   Eina_List *members = NULL;
+   Eext_Event_Callback *callback;
+
+   if (eo_isa(parent, EVAS_OBJECT_SMART_CLASS))
+     members = evas_object_smart_members_get(parent);
+
+   if (members)
+     {
+        EINA_LIST_REVERSE_FOREACH(members, l, obj)
+          {
+             obj_event = _eext_find_event_target(candidates, obj, type);
+             //got you!
+             if (obj_event)
+               {
+                  EINA_LIST_FOREACH(obj_event->callbacks, ll, callback)
+                    {
+                       if (callback->type == type)
+                         {
+                            eina_list_free(members);
+                            return obj_event;
+                         }
+                    }
+               }
+          }
+        eina_list_free(members);
+     }
+
+   EINA_LIST_REVERSE_FOREACH(candidates, l, obj_event)
+     {
+        //got you!
+        if (parent == obj_event->obj)
+          {
+             EINA_LIST_FOREACH(obj_event->callbacks, ll, callback)
+               {
+                  if (callback->type == type)
+                    return obj_event;
+               }
+          }
+     }
+
+   return NULL;
+}
+
+static Eext_Object_Event *
+_eext_top_obj_event_find(Eext_Event_Mgr *event_mgr, Eext_Callback_Type type)
+{
+   Eext_Object_Event *obj_event = NULL;
+   Eina_List *l, *l_next;
+   Eina_List *candidates = NULL;
+   Evas_Object *parent;
+   int top_layer;
+   Eina_Bool invisible;
+
+   //1. filter the invisible objs
+   EINA_LIST_FOREACH(event_mgr->obj_events, l, obj_event)
+     {
+        parent = obj_event->obj;
+        invisible = EINA_FALSE;
+
+        while (parent)
+          {
+             if (!evas_object_visible_get(parent))
+               {
+                  invisible = EINA_TRUE;
+                  break;
+               }
+             parent = evas_object_smart_parent_get(parent);
+          }
+        if (invisible) continue;
+        candidates = eina_list_append(candidates, obj_event);
+     }
+   if (!candidates) return NULL;   //no visible objects.
+   if (eina_list_count(candidates) == 1) goto found;
+
+   //2.1. sort by layer order
+   candidates = eina_list_sort(candidates, eina_list_count(candidates),
+                               _eext_layer_sort_cb);
+
+   //2.2. leave the only top layer
+   obj_event = eina_list_data_get(eina_list_last(candidates));
+   top_layer = evas_object_layer_get(obj_event->obj);
+
+   EINA_LIST_FOREACH_SAFE(candidates, l, l_next, obj_event)
+     {
+        if (evas_object_layer_get(obj_event->obj) < top_layer)
+          candidates = eina_list_remove_list(candidates, l);
+     }
+   if (eina_list_count(candidates) == 1) goto found;
+
+   //3. find the top parent candidate.
+   parent = _eext_top_parent_candidates(&candidates, event_mgr->e);
+   if (eina_list_count(candidates) == 1) goto found;
+
+   //4. find the target in this parent tree.
+   obj_event = _eext_find_event_target(candidates, parent, type);
+   eina_list_free(candidates);
+   return obj_event;
+
+found:
+   obj_event = eina_list_data_get(candidates);
+   eina_list_free(candidates);
+   return obj_event;
+}
+
+static void
+_eext_key_grab_rect_key_up_cb(void *data, Evas *e, Evas_Object *obj,
+                            void *event_info)
+{
+   Evas_Event_Key_Down *ev = event_info;
+   Eext_Event_Mgr *event_mgr = data;
+   Eext_Object_Event *obj_event;
+   Eext_Event_Callback *callback;
+   Eext_Callback_Type type;
+   Eina_List *l;
+
+   if (!strcmp(ev->keyname, EEXT_KEY_BACK) ||
+       !strcmp(ev->keyname, EEXT_KEY_BACK2) ||
+       !strcmp(ev->keyname, EEXT_KEY_BACK3))
+     type = EEXT_CALLBACK_BACK;
+   else if (!strcmp(ev->keyname, EEXT_KEY_MENU) ||
+            !strcmp(ev->keyname, EEXT_KEY_MENU2) ||
+            !strcmp(ev->keyname, EEXT_KEY_MENU3))
+     type = EEXT_CALLBACK_MORE;
+   else return;
+
+   obj_event = _eext_top_obj_event_find(event_mgr, type);
+   if (!obj_event) return;
+
+   obj_event->on_callback = EINA_TRUE;
+   EINA_LIST_FOREACH(obj_event->callbacks, l, callback)
+     {
+        if (callback->type != type) continue;
+        callback->func(callback->data, obj_event->obj, (void*) type);
+        if (obj_event->delete_me) break;
+     }
+   if (obj_event->delete_me) free(obj_event);
+   else obj_event->on_callback = EINA_FALSE;
+}
+
+static void
+_eext_key_grab_obj_create(Eext_Event_Mgr *event_mgr)
+{
+   Evas_Object *key_grab_rect = evas_object_rectangle_add(event_mgr->e);
+
+   evas_object_event_callback_add(key_grab_rect, EVAS_CALLBACK_KEY_UP,
+                                  _eext_key_grab_rect_key_up_cb, event_mgr);
+   if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_BACK, 0, 0, EINA_FALSE))
+     LOGE("Failed to grab BACK KEY\n");
+
+   if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_BACK2, 0, 0, EINA_FALSE))
+     LOGE("Failed to grab BACK KEY\n");
+
+   if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_BACK3, 0, 0, EINA_FALSE))
+     LOGE("Failed to grab BACK KEY\n");
+
+   if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_MENU, 0, 0, EINA_FALSE))
+     LOGE("Failed to grab MENU KEY\n");
+
+   if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_MENU2, 0, 0, EINA_FALSE))
+     LOGE("Failed to grab MENU KEY\n");
+
+   if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_MENU3, 0, 0, EINA_FALSE))
+     LOGE("Failed to grab MENU KEY\n");
+
+   event_mgr->key_grab_rect = key_grab_rect;
+}
+
+static Eext_Event_Mgr *
+_eext_event_mgr_new(Evas *e)
+{
+   Eext_Event_Mgr *event_mgr = calloc(1, sizeof(Eext_Event_Mgr));
+   if (!event_mgr)
+     {
+        LOGE("Failed to allocate event manager");
+        return NULL;
+     }
+   event_mgr->e = e;
+   _eext_key_grab_obj_create(event_mgr);
+
+   return event_mgr;
+}
+
+EAPI void *
+eext_object_event_callback_del(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func)
+{
+   Eext_Object_Event *obj_event;
+   Eext_Event_Mgr *event_mgr;
+   Eina_List *l;
+   Eext_Event_Callback *callback;
+   void *data;
+
+   //Check the validation
+   event_mgr = evas_object_data_get(obj, EEXT_OBJ_KEY_EVENT_MGR);
+   obj_event = evas_object_data_get(obj, EEXT_OBJ_KEY_OBJ_EVENT);
+
+   if (!event_mgr || !obj_event)
+     {
+        LOGW("This object(%p) hasn't been registered before", obj);
+        return NULL;
+     }
+
+   //Remove the callback data
+   EINA_LIST_REVERSE_FOREACH(obj_event->callbacks, l, callback)
+     {
+        if ((callback->func == func) && (callback->type == type)) break;
+     }
+
+   if (!callback)
+     {
+        LOGW("This object(%p) hasn't been registered before with the given type(%d) and func(%p)", obj, type, func);
+        return NULL;
+     }
+
+   data = callback->data;
+   obj_event->callbacks = eina_list_remove_list(obj_event->callbacks, l);
+   free(callback);
+
+   //This object is not managed anymore.
+   if (!obj_event->callbacks)
+     {
+        evas_object_data_set(obj, EEXT_OBJ_KEY_OBJ_EVENT, NULL);
+        evas_object_data_set(obj, EEXT_OBJ_KEY_EVENT_MGR, NULL);
+        Eina_List *l = eina_list_data_find_list(event_mgr->obj_events,
+                                                obj_event);
+        if (l)
+          event_mgr->obj_events = eina_list_remove_list(event_mgr->obj_events,
+                                                        l);
+        if (obj_event->on_callback) obj_event->delete_me = EINA_TRUE;
+        else free(obj_event);
+
+        evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL, _eext_object_del_cb);
+     }
+
+   _eext_event_mgr_del(event_mgr);
+
+   return data;
+}
+
+EAPI void
+eext_object_event_callback_add(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func, void *data)
+{
+   Eext_Event_Mgr *event_mgr;
+   Evas *e;
+   Eext_Object_Event *obj_event = NULL;
+   Eina_List *l;
+   Eext_Event_Callback *callback;
+   Eina_Bool new_event_mgr = EINA_TRUE;
+
+   //Check the registered event manager for this Evas.
+   e = evas_object_evas_get(obj);
+
+   EINA_LIST_FOREACH(event_mgrs, l, event_mgr)
+     {
+        if (event_mgr->e == e)
+          {
+             new_event_mgr = EINA_FALSE;
+             break;
+          }
+     }
+
+   //New Evas comes. Create new event manager for this Evas.
+   if (new_event_mgr)
+     {
+        if (!(event_mgr = _eext_event_mgr_new(e))) return;
+        event_mgrs = eina_list_append(event_mgrs, event_mgr);
+     }
+
+   obj_event = evas_object_data_get(obj, EEXT_OBJ_KEY_OBJ_EVENT);
+
+   //New Object Event. Probably user adds eext_object_event_callback first time.
+   if (!obj_event)
+     {
+        obj_event = calloc(1, sizeof(Eext_Object_Event));
+        if (!obj_event)
+          {
+             LOGE("Failed to allocate object event");
+             return;
+          }
+        evas_object_data_set(obj, EEXT_OBJ_KEY_OBJ_EVENT, obj_event);
+        evas_object_data_set(obj, EEXT_OBJ_KEY_EVENT_MGR, event_mgr);
+        evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
+                                       _eext_object_del_cb,
+                                       obj_event);
+        event_mgr->obj_events = eina_list_append(event_mgr->obj_events,
+                                                 obj_event);
+        obj_event->obj = obj;
+     }
+
+   //Append this callback.
+   callback = calloc(1, sizeof(Eext_Event_Callback));
+   if (!callback)
+     {
+        LOGE("Failed to allocate event callback");
+        return;
+     }
+   callback->type = type;
+   callback->func = func;
+   callback->data = data;
+
+   obj_event->callbacks = eina_list_append(obj_event->callbacks, callback);
+}
diff --git a/src/efl_extension.c b/src/efl_extension.c
new file mode 100644 (file)
index 0000000..32b7984
--- /dev/null
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "efl_extension.h"
+#include "efl_extension_private.h"
+
+/*===========================================================================*
+ *                                 Local                                     *
+ *===========================================================================*/
+
+static const char *
+_magic_string_get(eext_magic m)
+{
+       switch (m) {
+       case EEXT_MAGIC_NONE:
+               return "None (Freed Object)";
+
+       default:
+               return "<UNKNOWN>";
+     }
+}
+
+__CONSTRUCTOR__ static void
+eext_mod_init(void)
+{
+}
+
+__DESTRUCTOR__ static void
+eext_mod_shutdown(void)
+{
+}
+
+
+/*===========================================================================*
+ *                                Global                                     *
+ *===========================================================================*/
+
+void
+_eext_magic_fail(const void *d, eext_magic m, eext_magic req_m, const char *fname)
+{
+       LOGE("\n*** MAGIC FAIL (%s) ***\n", fname);
+
+       if (!d)
+               LOGE("  Input handle pointer is NULL!");
+       else if (m == EEXT_MAGIC_NONE)
+               LOGE("  Input handle has already been freed!");
+       else if (m != req_m)
+               LOGE("  Input handle is wrong type\n"
+                   "    Expected: %08x - %s\n"
+                   "    Supplied: %08x - %s",
+                   (unsigned int)req_m, _magic_string_get(req_m),
+                   (unsigned int)m, _magic_string_get(m));
+
+        gchar **envp = g_get_environ();
+        if (g_environ_getenv(envp, "EEXT_ERROR_ABORT")) abort();
+}
+
+/*===========================================================================*
+ *                                  API                                      *
+ *===========================================================================*/
+#if 0 //This API will be not used. For history, keep this codes
+
+EAPI tzsh_native_window
+eext_win_tzsh_native_window_get(const Elm_Win *obj)
+{
+   Evas *e = evas_object_evas_get(obj);
+   Ecore_Evas *ee = ecore_evas_ecore_evas_get(e);
+   const char *engine_name = ecore_evas_engine_name_get(ee);
+
+   if (strcmp(elm_object_widget_type_get(obj), "Elm_Win"))
+     {
+        LOGE("  Input object is not elm_win widget");
+        return 0;
+     }
+   if (engine_name &&
+       ((!strcmp(engine_name, "opengl_x11")) ||
+        (!strcmp(engine_name, "software_x11"))))
+     return (tzsh_native_window) elm_win_xwindow_get(obj);
+#ifdef HAVE_ELEMENTARY_WAYLAND
+   else if (engine_name &&
+            ((!strcmp(engine_name, "wayland_shm")) ||
+             (!strcmp(engine_name, "wayland_egl"))))
+     {
+        Ecore_Wl_Window wl_win;
+        wl_win = elm_win_wl_window_get(obj);
+        return (tzsh_native_window)ecore_wl_window_surface_get(wl_win);
+     }
+#endif
+   LOGE("  Do not support %s window system", engine_name);
+   return 0;
+}
+#endif
+
+EAPI Eina_Bool
+eext_win_keygrab_set(Elm_Win *obj, const char *key)
+{
+   Eina_Bool ret = EINA_FALSE;
+   ret = elm_win_keygrab_set(obj, key, 0, 0, 0, ELM_WIN_KEYGRAB_TOPMOST);
+   if (!ret)
+     LOGE("  Can't set keygrab of [%s].", key);
+   return ret;
+}
+
+EAPI Eina_Bool
+eext_win_keygrab_unset(Elm_Win *obj, const char *key)
+{
+   Eina_Bool ret = EINA_FALSE;
+   ret = elm_win_keygrab_unset(obj, key, 0, 0);
+   if (!ret)
+     LOGE("  Can't unset keygrab of [%s].", key);
+   return ret;
+}
diff --git a/src/mobile/CMakeLists.txt b/src/mobile/CMakeLists.txt
new file mode 100644 (file)
index 0000000..41a6f9d
--- /dev/null
@@ -0,0 +1,49 @@
+add_definitions(-DEFL_EO_API_SUPPORT=1 -DEFL_BETA_API_SUPPORT=1)
+
+SET(LIB_SRCS
+       ${LIB_SRCS}
+       eext_floatingbutton.c
+       )
+SET (ALL_EO_FILES
+       eext_floatingbutton.eo
+       )
+
+foreach(eo_file ${ALL_EO_FILES})
+       string(REPLACE .eo .eo.c out_c_file ${eo_file})
+       string(REPLACE .eo .eo.h out_h_file ${eo_file})
+       string(REPLACE .eo .eo.legacy.h out_legacy_file ${eo_file})
+       string(REPLACE .eo .c c_file ${eo_file})
+       add_custom_command(
+               OUTPUT ${CMAKE_CURRENT_SOURCE_DIR}/${out_c_file}
+               COMMAND /usr/bin/eolian_gen ${eo_file} --eo --legacy --gc -I /usr/share/eolian/include -o ${out_c_file}
+               COMMAND /usr/bin/eolian_gen ${eo_file} --eo --gh -I /usr/share/eolian/include -o "../include/${out_h_file}"
+               COMMAND /usr/bin/eolian_gen ${eo_file} --legacy --gh -I /usr/share/eolian/include -o "../include/${out_legacy_file}"
+               DEPENDS ${eo_file} ${CMAKE_CURRENT_SOURCE_DIR}/*.eo
+               COMMENT "Compiling Eo: ${eo_file}, Output eo : ${out_c_file}"
+               VERBATIM)
+       add_custom_target(target_${eo_file} ALL DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/${out_c_file})
+       SET (ALL_EO_TARGETS ${ALL_EO_TARGETS} target_${eo_file})
+endforeach(eo_file)
+
+ADD_LIBRARY(${LIB_NAME} SHARED ${LIB_SRCS})
+ADD_DEPENDENCIES(${LIB_NAME} ${ALL_EO_TARGETS})
+
+ADD_DEFINITIONS("-DEXPORT_API=__attribute__((visibility(\"default\")))")
+PKG_CHECK_MODULES(LIB_PKGS REQUIRED
+               elementary
+               dlog
+               fontconfig
+               glib-2.0
+               )
+
+FOREACH(flag ${LIB_PKGS_CFLAGS})
+       SET(LIB_CFLAGS "${LIB_CFLAGS} ${flag}")
+ENDFOREACH(flag)
+
+SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES COMPILE_FLAGS "${LIB_CFLAGS}")
+SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES VERSION ${VERSION})
+SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES SOVERSION ${VERSION_MAJOR})
+TARGET_LINK_LIBRARIES(${LIB_NAME} ${LIB_PKGS_LDFLAGS} ${LIB_TARGET_PKGS_LDFLAGS})
+
+INSTALL(TARGETS ${LIB_NAME} DESTINATION ${CMAKE_INSTALL_LIBDIR})
+#INSTALL(FILES ${ALL_EO_FILES} DESTINATION share/eolian/include/efl-extension)
diff --git a/src/mobile/eext_floatingbutton.c b/src/mobile/eext_floatingbutton.c
new file mode 100644 (file)
index 0000000..1f44c4e
--- /dev/null
@@ -0,0 +1,712 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#define ELM_INTERNAL_API_ARGESFSDFEFC 1
+
+#include <Eo.h>
+
+#include "efl_extension.h"
+#include "efl_extension_private.h"
+#include "../../data/HD-inc.edc"
+
+#include <elm_widget.h>
+
+#define MY_CLASS EEXT_FLOATINGBUTTON_CLASS
+
+#define MY_CLASS_NAME "Eext_Floatingbutton"
+#define MY_CLASS_NAME_LEGACY "eext_floatingbutton"
+
+static const char SIG_PRESSED[] = "pressed";
+static const char SIG_UNPRESSED[] = "unpressed";
+
+static const Evas_Smart_Cb_Description _smart_callbacks[] = {
+   {SIG_PRESSED, ""},
+   {SIG_UNPRESSED, ""},
+   {NULL, NULL}
+};
+
+#define EEXT_SCALE_SIZE(x, obj) ((x) / edje_object_base_scale_get(elm_layout_edje_get(obj)) \
+                                     * elm_config_scale_get() \
+                                     * elm_object_scale_get(obj))
+
+#define EEXT_SCALE_SIZE_INVERSE(x, obj) ((x) * edje_object_base_scale_get(elm_layout_edje_get(obj)) \
+                                             / elm_config_scale_get() \
+                                             / elm_object_scale_get(obj))
+
+#define MSG_THRESHOLD 0
+
+static const char *BTN1_PART = "button1";
+static const char *BTN2_PART = "button2";
+static const char *DRAGABLE_PART = "elm.dragable.fb";
+static const char *TRACK_PART = "elm.track.fb";
+
+typedef struct _Eext_Floatingbutton_Data {
+
+   Eo                      *obj;
+   Elm_Theme               *th;
+   Evas_Object             *box;
+   Evas_Object             *vg;
+   Efl_VG_Shape            *base_shape;
+   Ecore_Animator          *anim;
+
+   Evas_Object             *btn1;
+   Evas_Object             *btn2;
+
+   Evas_Coord               x;
+   int                      dir;
+
+   Eext_Floatingbutton_Mode mode;
+   Eext_Floatingbutton_Pos  pos;
+   double                   last_pos;
+   double                   pos_table[EEXT_FLOATINGBUTTON_LAST];
+   Eina_Bool                pos_disabled[EEXT_FLOATINGBUTTON_LAST];
+
+   Eina_Bool                on_update  : 1;
+   Eina_Bool                mouse_down : 1;
+   Eina_Bool                block      : 1;
+   Eina_Bool                center     : 1;
+
+} Eext_Floatingbutton_Data;
+
+static void
+_signal_emit(Eo *obj, Eext_Floatingbutton_Data *sd)
+{
+   int count = 0;
+   char buf[200];
+   Evas_Object *edje = elm_layout_edje_get(obj);
+
+   count = !!(sd->btn1) + !!(sd->btn2);
+
+   switch (sd->pos)
+     {
+      case EEXT_FLOATINGBUTTON_LEFT_OUT:
+      case EEXT_FLOATINGBUTTON_LEFT:
+         snprintf(buf, sizeof(buf), "elm,state,floatingbutton,left,%s", ((count >= 2) ? "2btn" : "1btn"));
+         edje_object_signal_emit(edje, buf, "elm");
+         sd->center = EINA_FALSE;
+         break;
+      case EEXT_FLOATINGBUTTON_CENTER:
+         snprintf(buf, sizeof(buf), "elm,state,floatingbutton,center,%s", ((count >= 2) ? "2btn" : "1btn"));
+         edje_object_signal_emit(edje, buf, "elm");
+         sd->center = EINA_TRUE;
+         break;
+      case EEXT_FLOATINGBUTTON_RIGHT:
+      case EEXT_FLOATINGBUTTON_RIGHT_OUT:
+         snprintf(buf, sizeof(buf), "elm,state,floatingbutton,right,%s", ((count >= 2) ? "2btn" : "1btn"));
+         edje_object_signal_emit(edje, buf, "elm");
+         sd->center = EINA_FALSE;
+         break;
+      case EEXT_FLOATINGBUTTON_LAST:
+         /* you must not reach here */
+         break;
+     }
+
+   sd->on_update = EINA_TRUE;
+
+   edje_object_message_signal_process(edje);
+}
+
+static void
+_pos_recalc(Eo *obj, Eext_Floatingbutton_Data *sd)
+{
+   int count = 0;
+   Evas_Coord w, w1;
+   Evas_Object *edje = elm_layout_edje_get(obj);
+
+   edje_object_part_geometry_get(edje, TRACK_PART, NULL, NULL, &w, NULL);
+
+   count = !!(sd->btn1) + !!(sd->btn2);
+
+   if (count >= 2) w1 = EEXT_SCALE_SIZE(FLOATINGBUTTON_2BTN_WIDTH, obj);
+   else w1 = EEXT_SCALE_SIZE(FLOATINGBUTTON_1BTN_WIDTH, obj);
+
+   sd->pos_table[EEXT_FLOATINGBUTTON_LEFT] = (w1 - EEXT_SCALE_SIZE(FLOATINGBUTTON_LR_WIDTH, obj)) / (double)(w - w1);
+   sd->pos_table[EEXT_FLOATINGBUTTON_RIGHT] = (w - w1 * 2 + EEXT_SCALE_SIZE(FLOATINGBUTTON_LR_WIDTH, obj)) / (double)(w - w1);
+}
+
+static void
+_threshold_update(Eo *obj, Eext_Floatingbutton_Data *sd)
+{
+   Evas_Coord w1;
+   Evas_Object *edje = elm_layout_edje_get(obj);
+   Edje_Message_Int *msg = calloc(1, sizeof(*msg) + sizeof(int));
+
+   if (!msg) return;
+
+   edje_object_part_geometry_get(edje, DRAGABLE_PART, NULL, NULL, &w1, NULL);
+   w1 = EEXT_SCALE_SIZE_INVERSE(w1, obj);
+
+   msg->val = w1 + 30;
+   edje_object_message_send(edje, EDJE_MESSAGE_INT, MSG_THRESHOLD, msg);
+   free(msg);
+
+   elm_layout_signal_emit(obj, "elm,floatingbutton,threshold,update", "elm");
+}
+
+static void
+_box_recalc(Eo *obj, Eext_Floatingbutton_Data *sd)
+{
+   _signal_emit(obj, sd);
+   _pos_recalc(obj, sd);
+   _threshold_update(obj, sd);
+}
+
+static void
+_vg_resize_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   Eext_Floatingbutton_Data *fbd = data;
+   Evas_Coord x, y, w, h;
+
+   evas_object_geometry_get(obj, &x, &y, &w, &h);
+
+   evas_vg_shape_reset(fbd->base_shape);
+   evas_vg_shape_append_rect(fbd->base_shape, 0, 0, w, h,
+                             EEXT_SCALE_SIZE(FLOATINGBUTTON_LAYOUT_LR_WIDTH, fbd->obj),
+                             (EEXT_SCALE_SIZE(FLOATINGBUTTON_HEIGHT, fbd->obj)/2));
+}
+
+static Eina_Bool
+_anim_cb(void *data, double pos)
+{
+   Eext_Floatingbutton_Data *fbd = data;
+   double cur_pos;
+   double pivot;
+
+   pivot = ecore_animator_pos_map(pos, ECORE_POS_MAP_DECELERATE, 0.2, 0.0);
+
+   if (fbd->pos_table[fbd->pos] > fbd->last_pos)
+     cur_pos = fbd->last_pos + (fbd->pos_table[fbd->pos] - fbd->last_pos) * pivot;
+   else
+     cur_pos = fbd->last_pos - (fbd->last_pos - fbd->pos_table[fbd->pos]) * pivot;
+
+   edje_object_part_drag_value_set(elm_layout_edje_get(fbd->obj), DRAGABLE_PART, cur_pos, 0.5);
+
+   if (pos >= 1.0)
+     fbd->anim = NULL;
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+static Eina_Bool
+_message_send(void *data)
+{
+   Eext_Floatingbutton_Data *fbd = data;
+
+   _threshold_update(fbd->obj, fbd);
+
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+_update_pos(Eo *obj, Eext_Floatingbutton_Data *fbd, Eina_Bool anim)
+{
+   edje_object_part_drag_value_get(elm_layout_edje_get(obj), DRAGABLE_PART, &fbd->last_pos, NULL);
+
+   if (!anim)
+     edje_object_part_drag_value_set(elm_layout_edje_get(obj), DRAGABLE_PART, fbd->pos_table[fbd->pos], 0.5);
+   else
+     {
+        if (fbd->anim)
+          {
+             ecore_animator_del(fbd->anim);
+             fbd->anim = NULL;
+          }
+
+        if ((fbd->last_pos - fbd->pos_table[fbd->pos] >= 0.005) ||
+            (fbd->last_pos - fbd->pos_table[fbd->pos] <= -0.005))
+          fbd->anim = ecore_animator_timeline_add(0.4, _anim_cb, fbd);
+        else
+          edje_object_part_drag_value_set(elm_layout_edje_get(obj), DRAGABLE_PART, fbd->pos_table[fbd->pos], 0.5);
+     }
+
+   if (!anim || !fbd->on_update)
+     _signal_emit(obj, fbd);
+
+   fbd->on_update = EINA_FALSE;
+
+   if (!anim || fbd->anim)
+     ecore_timer_add(0.4, _message_send, fbd);
+}
+
+static void
+_resize_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   _pos_recalc(obj, data);
+   _update_pos(obj, data, EINA_FALSE);
+}
+
+static void
+_size_hints_changed_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   Evas_Display_Mode dispmode;
+
+   dispmode = evas_object_size_hint_display_mode_get(obj);
+
+   if (dispmode == EVAS_DISPLAY_MODE_COMPRESS)
+     elm_layout_signal_emit(obj, "elm,state,floatingbutton,hidden", "elm");
+   else
+     elm_layout_signal_emit(obj, "elm,state,floatingbutton,visible", "elm");
+}
+
+static void
+_on_mouse_down(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+   Eext_Floatingbutton_Data *fbd = data;
+   Evas_Object *edje = elm_layout_edje_get(obj);
+
+   fbd->mouse_down = EINA_TRUE;
+
+   edje_object_part_geometry_get(edje, DRAGABLE_PART, &fbd->x, NULL, NULL, NULL);
+
+   fbd->dir = 0;
+
+   if (!elm_widget_disabled_get(obj) && !evas_object_freeze_events_get(obj))
+     evas_object_smart_callback_call(obj, SIG_PRESSED, NULL);
+}
+
+static void
+_on_mouse_move(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+   Eext_Floatingbutton_Data *fbd = data;
+
+   double dx;
+
+   if (fbd->mouse_down)
+     {
+        Evas_Object *edje = elm_layout_edje_get(obj);
+
+        if (!fbd->dir)
+          {
+             Evas_Coord x, finger_size = elm_config_finger_size_get();
+
+             edje_object_part_geometry_get(edje, DRAGABLE_PART, &x, NULL, NULL, NULL);
+
+             if (x > (fbd->x + finger_size)) fbd->dir = 1;
+             else if(x < (fbd->x - finger_size)) fbd->dir = -1;
+
+             if (fbd->dir)
+               {
+                  Eina_List *l;
+                  Evas_Object *btn;
+
+                  edje_object_signal_emit(edje, "elm,state,floatingbutton,freeze", "elm");
+                  edje_object_message_signal_process(edje);
+
+                  l = elm_box_children_get(fbd->box);
+                  EINA_LIST_FREE(l, btn)
+                    elm_layout_signal_emit(btn, "elm,state,default", "elm");
+               }
+          }
+
+        if (!fbd->center)
+          {
+             int count;
+             char buf[200];
+
+             count = !!(fbd->btn1) + !!(fbd->btn2);
+
+             edje_object_part_drag_value_get(edje, DRAGABLE_PART, &dx, NULL);
+
+             if ((dx > fbd->pos_table[EEXT_FLOATINGBUTTON_LEFT] + 0.02) &&
+                 (dx < fbd->pos_table[EEXT_FLOATINGBUTTON_RIGHT] - 0.02))
+               {
+                  snprintf(buf, sizeof(buf), "elm,state,floatingbutton,center,%s", ((count >= 2) ? "2btn" : "1btn"));
+                  edje_object_signal_emit(edje, buf, "elm");
+                  fbd->center = EINA_TRUE;
+               }
+          }
+     }
+}
+
+static void
+_on_mouse_up(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+   Eext_Floatingbutton_Data *fbd = data;
+   Evas_Object *edje = elm_layout_edje_get(obj);
+   Evas_Coord track_x, track_w, drag_x, drag_w;
+   double cur_pos;
+   int i;
+
+   fbd->mouse_down = EINA_FALSE;
+
+   if (fbd->dir)
+     {
+        edje_object_part_geometry_get(edje, DRAGABLE_PART, &drag_x, NULL, &drag_w, NULL);
+        edje_object_part_geometry_get(edje, TRACK_PART, &track_x, NULL, &track_w, NULL);
+
+        cur_pos = (drag_x - track_x) / (double)(track_w - drag_w);
+
+        if (fbd->dir > 0)
+          {
+             for (i = EEXT_FLOATINGBUTTON_LEFT_OUT; i < EEXT_FLOATINGBUTTON_RIGHT_OUT; ++i)
+               if (!fbd->pos_disabled[i] &&
+                    cur_pos < (fbd->pos_table[i] + ((i == 1 || i == 2) ? 0.12 : 0)))
+                 break;
+
+             if (i == EEXT_FLOATINGBUTTON_RIGHT_OUT && fbd->pos_disabled[i])
+               while (--i > EEXT_FLOATINGBUTTON_LEFT_OUT)
+                 if (!fbd->pos_disabled[i]) break;
+          }
+        else
+          {
+             for (i = EEXT_FLOATINGBUTTON_RIGHT_OUT; i > EEXT_FLOATINGBUTTON_LEFT_OUT; --i)
+               if (!fbd->pos_disabled[i] &&
+                    cur_pos > (fbd->pos_table[i] - ((i == 3 || i == 2) ? 0.12 : 0)))
+                 break;
+
+             if (i == EEXT_FLOATINGBUTTON_LEFT_OUT && fbd->pos_disabled[i])
+               while (++i <= EEXT_FLOATINGBUTTON_RIGHT_OUT)
+                 if (!fbd->pos_disabled[i]) break;
+          }
+
+        //just for exceptional case.
+        if (i == EEXT_FLOATINGBUTTON_LAST) i = EEXT_FLOATINGBUTTON_RIGHT_OUT;
+
+        fbd->pos = i;
+
+        edje_object_signal_emit(edje, "elm,state,floatingbutton,thaw", "elm");
+     }
+
+   _update_pos(obj, fbd, EINA_TRUE);
+
+   if (!elm_widget_disabled_get(obj) && !evas_object_freeze_events_get(obj))
+     evas_object_smart_callback_call(obj, SIG_UNPRESSED, NULL);
+}
+
+EOLIAN static void
+_eext_floatingbutton_evas_object_smart_del(Eo *obj, Eext_Floatingbutton_Data *sd)
+{
+   eo_do_super(obj, MY_CLASS, evas_obj_smart_del());
+
+   elm_theme_extension_del(sd->th, EFL_EXTENSION_EDJ);
+   elm_theme_free(sd->th);
+}
+
+EOLIAN static void
+_eext_floatingbutton_movement_block_set(Eo *obj, Eext_Floatingbutton_Data *sd, Eina_Bool block)
+{
+   char buf[200];
+
+   block = !!block;
+   sd->block = block;
+
+   if (block)
+     snprintf(buf, sizeof(buf), "elm,state,floatingbutton,block");
+   else
+     snprintf(buf, sizeof(buf), "elm,state,floatingbutton,unblock");
+
+   elm_layout_signal_emit(obj, buf, "elm");
+}
+
+EOLIAN static Eina_Bool
+_eext_floatingbutton_movement_block_get(Eo *obj EINA_UNUSED, Eext_Floatingbutton_Data *sd)
+{
+   return sd->block;
+}
+
+EOLIAN static Eina_Bool
+_eext_floatingbutton_pos_set(Eo *obj, Eext_Floatingbutton_Data *sd, Eext_Floatingbutton_Pos pos)
+{
+   if ((pos < EEXT_FLOATINGBUTTON_LEFT_OUT) || (pos > EEXT_FLOATINGBUTTON_RIGHT_OUT))
+     return EINA_FALSE;
+
+   if ((sd->block) || (sd->pos_disabled[pos]))
+     return EINA_FALSE;
+
+   sd->pos = pos;
+
+   _update_pos(obj, sd, EINA_FALSE);
+
+   return EINA_TRUE;
+}
+
+EOLIAN static Eext_Floatingbutton_Pos
+_eext_floatingbutton_pos_get(Eo *obj EINA_UNUSED, Eext_Floatingbutton_Data *sd)
+{
+   return sd->pos;
+}
+
+EOLIAN static Eina_Bool
+_eext_floatingbutton_pos_bring_in(Eo *obj, Eext_Floatingbutton_Data *sd, Eext_Floatingbutton_Pos pos)
+{
+   if ((pos < EEXT_FLOATINGBUTTON_LEFT_OUT) || (pos > EEXT_FLOATINGBUTTON_RIGHT_OUT))
+     return EINA_FALSE;
+
+   if ((sd->block) || (sd->pos_disabled[pos]))
+     return EINA_FALSE;
+
+   if (sd->pos > pos)
+     elm_layout_signal_emit(obj, "elm,action,floatingbutton,left", "elm");
+   else if (sd->pos < pos)
+     elm_layout_signal_emit(obj, "elm,action,floatingbutton,right", "elm");
+
+   edje_object_message_signal_process(elm_layout_edje_get(obj));
+
+   sd->pos = pos;
+
+   _update_pos(obj, sd, EINA_TRUE);
+
+   return EINA_TRUE;
+}
+
+EAPI Evas_Object *
+eext_floatingbutton_add(Evas_Object *parent)
+{
+   if (!parent) return NULL;
+   Evas_Object *obj = eo_add(MY_CLASS, parent);
+
+   return obj;
+}
+
+EOLIAN static Eo *
+_eext_floatingbutton_eo_base_constructor(Eo *obj, Eext_Floatingbutton_Data *sd EINA_UNUSED)
+{
+   obj = eo_do_super_ret(obj, MY_CLASS, obj, eo_constructor());
+   eo_do(obj,
+         evas_obj_type_set(MY_CLASS_NAME_LEGACY),
+         evas_obj_smart_callbacks_descriptions_set(_smart_callbacks));
+
+   return obj;
+}
+
+EOLIAN static void
+_eext_floatingbutton_evas_object_smart_add(Eo *obj, Eext_Floatingbutton_Data *priv)
+{
+   eo_do_super(obj, MY_CLASS, evas_obj_smart_add());
+   elm_widget_sub_object_parent_add(obj);
+
+   priv->obj = obj;
+   priv->pos = EEXT_FLOATINGBUTTON_RIGHT;
+
+   priv->th = elm_theme_new();
+   elm_theme_ref_set(priv->th, NULL);
+   elm_theme_extension_add(priv->th, EFL_EXTENSION_EDJ);
+
+   elm_object_theme_set(obj, priv->th);
+   elm_layout_theme_set(obj, "floatingbutton", "base", elm_object_style_get(obj));
+   evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, _resize_cb, priv);
+   evas_object_event_callback_add(obj, EVAS_CALLBACK_CHANGED_SIZE_HINTS, _size_hints_changed_cb, priv);
+
+   elm_layout_signal_callback_add(obj, "mouse,down,1", DRAGABLE_PART, _on_mouse_down, priv);
+   elm_layout_signal_callback_add(obj, "mouse,up,1", DRAGABLE_PART, _on_mouse_up, priv);
+   elm_layout_signal_callback_add(obj, "mouse,move", DRAGABLE_PART, _on_mouse_move, priv);
+
+   priv->vg = evas_object_vg_add(evas_object_evas_get(obj));
+   elm_layout_content_set(obj, "elm.swallow.vg", priv->vg);
+   Efl_VG *base_root = evas_object_vg_root_node_get(priv->vg);
+   priv->base_shape = evas_vg_shape_add(base_root);
+   evas_vg_node_color_set(priv->base_shape, 255, 255, 255, 255);
+   evas_object_event_callback_add(priv->vg, EVAS_CALLBACK_RESIZE, _vg_resize_cb, priv);
+
+   priv->box = elm_box_add(obj);
+   elm_box_horizontal_set(priv->box, EINA_TRUE);
+   elm_box_padding_set(priv->box, EEXT_SCALE_SIZE(FLOATINGBUTTON_MID_WIDTH, obj), 0);
+   elm_object_part_content_set(obj, "elm.swallow.box", priv->box);
+
+   priv->block = EINA_FALSE;
+
+   priv->pos_table[EEXT_FLOATINGBUTTON_LEFT_OUT] = 0.0;
+   priv->pos_table[EEXT_FLOATINGBUTTON_CENTER] = 0.5;
+   priv->pos_table[EEXT_FLOATINGBUTTON_RIGHT_OUT] = 1.0;
+
+   _pos_recalc(obj, priv);
+   _update_pos(obj, priv, EINA_FALSE);
+
+   _threshold_update(obj, priv);
+}
+
+EOLIAN static void
+_eext_floatingbutton_class_constructor(Eo_Class *klass)
+{
+   evas_smart_legacy_type_register(MY_CLASS_NAME_LEGACY, klass);
+}
+
+static void
+_btn_del_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   Eext_Floatingbutton_Data *fbd = eo_data_scope_get((Eo *)data, EEXT_FLOATINGBUTTON_CLASS);
+
+   if (!fbd) return;
+
+   elm_box_unpack(fbd->box, obj);
+   _box_recalc(data, fbd);
+
+   if (fbd->btn1 == obj) fbd->btn1 = NULL;
+   else if (fbd->btn2 == obj) fbd->btn2 = NULL;
+
+   _update_pos(obj, fbd, EINA_FALSE);
+}
+
+EOLIAN static Eina_Bool
+_eext_floatingbutton_elm_container_content_set(Eo *obj, Eext_Floatingbutton_Data *sd, const char *part, Evas_Object *content)
+{
+   Eina_Bool int_ret = EINA_FALSE;
+   char buf[256];
+
+   if ((!part) || (!content)) return int_ret;
+
+   if (!strcmp(part, BTN1_PART))
+     {
+        snprintf(buf, sizeof(buf), "floatingbutton/%s", elm_object_style_get(obj));
+        elm_object_style_set(content, buf);
+
+        if (sd->btn1) evas_object_del(sd->btn1);
+
+        sd->btn1 = content;
+
+        evas_object_show(sd->btn1);
+        elm_box_pack_start(sd->box, content);
+
+        evas_object_event_callback_add(content, EVAS_CALLBACK_DEL, _btn_del_cb, obj);
+
+        int_ret = EINA_TRUE;
+     }
+   else if (!strcmp(part, BTN2_PART))
+     {
+        snprintf(buf, sizeof(buf), "floatingbutton/%s", elm_object_style_get(obj));
+        elm_object_style_set(content, buf);
+
+        if (sd->btn2) evas_object_del(sd->btn2);
+
+        sd->btn2 = content;
+
+        evas_object_show(sd->btn2);
+        elm_box_pack_end(sd->box, content);
+
+        evas_object_event_callback_add(content, EVAS_CALLBACK_DEL, _btn_del_cb, obj);
+
+        int_ret = EINA_TRUE;
+     }
+   else
+     eo_do_super(obj, MY_CLASS, int_ret = elm_obj_container_content_set(part, content));
+
+   _box_recalc(obj, sd);
+   _update_pos(obj, sd, EINA_TRUE);
+
+   return int_ret;
+}
+
+EOLIAN static Evas_Object *
+_eext_floatingbutton_elm_container_content_get(Eo *obj, Eext_Floatingbutton_Data *sd, const char *part)
+{
+   Evas_Object *ret = NULL;
+
+   if (!part) return ret;
+
+   if (!strcmp(part, BTN1_PART))
+     ret = sd->btn1;
+   else if (!strcmp(part, BTN2_PART))
+     ret = sd->btn2;
+   else
+     eo_do_super(obj, MY_CLASS, ret = elm_obj_container_content_get(part));
+
+   return ret;
+}
+
+EOLIAN static Evas_Object *
+_eext_floatingbutton_elm_container_content_unset(Eo *obj, Eext_Floatingbutton_Data *sd, const char *part)
+{
+   Evas_Object *ret = NULL;
+
+   if (!part) return ret;
+
+   if (!strcmp(part, BTN1_PART) && sd->btn1)
+     {
+        elm_box_unpack(sd->box, sd->btn1);
+        evas_object_event_callback_del_full(sd->btn1, EVAS_CALLBACK_DEL, _btn_del_cb, obj);
+
+        ret = sd->btn1;
+        sd->btn1 = NULL;
+     }
+   else if (!strcmp(part, BTN2_PART) && sd->btn2)
+     {
+        elm_box_unpack(sd->box, sd->btn2);
+        evas_object_event_callback_del_full(sd->btn2, EVAS_CALLBACK_DEL, _btn_del_cb, obj);
+
+        ret = sd->btn2;
+        sd->btn2 = NULL;
+     }
+   else
+     eo_do_super(obj, MY_CLASS, ret = elm_obj_container_content_unset(part));
+
+   _box_recalc(obj, sd);
+   _update_pos(obj, sd, EINA_TRUE);
+
+   return ret;
+}
+
+EOLIAN static Elm_Theme_Apply
+_eext_floatingbutton_elm_widget_theme_apply(Eo *obj, Eext_Floatingbutton_Data *sd)
+{
+   Elm_Theme_Apply int_ret = ELM_THEME_APPLY_FAILED;
+   char buf[256];
+
+   eo_do_super(obj, MY_CLASS, int_ret = elm_obj_widget_theme_apply());
+   if (!int_ret) return ELM_THEME_APPLY_FAILED;
+
+   snprintf(buf, sizeof(buf), "floatingbutton/%s", elm_object_style_get(obj));
+
+   if (sd->btn1) elm_object_style_set(sd->btn1, buf);
+   if (sd->btn2) elm_object_style_set(sd->btn2, buf);
+
+   _box_recalc(obj, sd);
+
+   return int_ret;
+}
+
+EOLIAN static void
+_eext_floatingbutton_mode_set(Eo *obj,
+                              Eext_Floatingbutton_Data *sd,
+                              Eext_Floatingbutton_Mode mode)
+{
+   if (sd->mode == mode) return;
+
+   if ((mode < EEXT_FLOATINGBUTTON_MODE_DEFAULT) ||
+       (mode >= EEXT_FLOATINGBUTTON_MODE_LAST))
+     return;
+
+   sd->mode = mode;
+
+   switch(mode)
+     {
+      case EEXT_FLOATINGBUTTON_MODE_DEFAULT:
+        sd->pos_disabled[EEXT_FLOATINGBUTTON_LEFT_OUT] = 0;
+        sd->pos_disabled[EEXT_FLOATINGBUTTON_LEFT] = 0;
+        sd->pos_disabled[EEXT_FLOATINGBUTTON_CENTER] = 0;
+        sd->pos_disabled[EEXT_FLOATINGBUTTON_RIGHT] = 0;
+        sd->pos_disabled[EEXT_FLOATINGBUTTON_RIGHT_OUT] = 0;
+        break;
+      case EEXT_FLOATINGBUTTON_MODE_BOTH_SIDES:
+        sd->pos_disabled[EEXT_FLOATINGBUTTON_LEFT_OUT] = 1;
+        sd->pos_disabled[EEXT_FLOATINGBUTTON_LEFT] = 0;
+        sd->pos_disabled[EEXT_FLOATINGBUTTON_CENTER] = 1;
+        sd->pos_disabled[EEXT_FLOATINGBUTTON_RIGHT] = 0;
+        sd->pos_disabled[EEXT_FLOATINGBUTTON_RIGHT_OUT] = 1;
+        break;
+      case EEXT_FLOATINGBUTTON_MODE_LAST:
+        /* you must not reach here */
+        break;
+     }
+}
+
+EOLIAN static Eext_Floatingbutton_Mode
+_eext_floatingbutton_mode_get(Eo *obj,
+                              Eext_Floatingbutton_Data *sd)
+{
+   return sd->mode;
+}
+
+#include "eext_floatingbutton.eo.c"
diff --git a/src/mobile/eext_floatingbutton.eo b/src/mobile/eext_floatingbutton.eo
new file mode 100644 (file)
index 0000000..3e9445b
--- /dev/null
@@ -0,0 +1,99 @@
+class Eext.Floatingbutton (Elm.Layout) {
+   eo_prefix: eext_obj_floatingbutton;
+   methods {
+      @property pos {
+         set {
+            [[
+            Set the floatingbutton position
+
+            The floatingbutton can be moved among predefined positions
+            (LEFT_OUT, LEFT, CENTER, RIGHT, RIGHT_OUT),
+            eext_floatingbutton_pos_set() moves floatingbutton to a given position immediately
+            (without animation).
+
+            return EINA_TRUE on success, EINA_FALSE otherwise.
+            ]]
+            return: bool;
+         }
+         get {
+            [[
+            Get the floatingbutton position
+
+            return Floatingbutton position with Eext_Floatingbutton_Pos enumeration
+
+            see eext_floatingbutton_pos_set()
+            ]]
+         }
+         values {
+            pos: Eext_Floatingbutton_Pos; [[ the floatingbutton position ]]
+         }
+      }
+      @property movement_block {
+         set {
+            [[
+            Set whether floatingbutton can be moved or not.
+
+            By default, floatingbutton are movable by user interaction.
+            ]]
+         }
+         get {
+            [[
+            Get movability for a given floatingbutton widget.
+
+            return EINA_TRUE, if obj is set to be unmovable,
+            EINA_FALSE, if it's movable.
+
+            see eext_floatingbutton_movement_block_set()
+            ]]
+         }
+         values {
+            block: Eina_Bool; [[ the floatingbutton movability ]]
+         }
+      }
+      @property mode {
+         set {
+            [[
+            Set floatingbutton mode.
+
+            Positions where floatingbutton can stop are restrained by mode.
+            ]]
+         }
+         get {
+            [[
+            Get floatingbutton mode.
+
+            see eext_floatingbutton_mode_set()
+            ]]
+         }
+         values {
+            mode: Eext_Floatingbutton_Mode; [[ floatingbutton mode ]]
+         }
+      }
+      pos_bring_in {
+         [[
+         Set the floatingbutton position with animation
+
+         Move floatingbutton similar to eext_floatingbutton_pos_set(),
+         but with animation.
+
+         return EINA_TRUE on success, EINA_FALSE otherwise.
+
+         see eext_floatingbutton_pos_set()
+         ]]
+         return: Eina_Bool;
+         params {
+            @in pos: const(Eext_Floatingbutton_Pos); [[ the floatingbutton position ]]
+         }
+      }
+   }
+   implements {
+      class.constructor;
+      Eo.Base.constructor;
+      Evas.Object_Smart.add;
+      Evas.Object_Smart.del;
+      Elm.Container.content_set;
+      Elm.Container.content_get;
+      Elm.Container.content_unset;
+      Elm.Widget.theme_apply;
+   }
+}
diff --git a/src/wearable/circle/efl_extension_circle_object.c b/src/wearable/circle/efl_extension_circle_object.c
new file mode 100644 (file)
index 0000000..8f8f798
--- /dev/null
@@ -0,0 +1,677 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "efl_extension.h"
+#include "efl_extension_private.h"
+#include "circle/efl_extension_circle_private.h"
+
+static void
+_eext_circle_object_del_cb(void *data,
+                           Evas *e,
+                           Evas_Object *obj,
+                           void *event_info)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+   Eext_Circle_Object_Item *item;
+   Eina_List *l, *l_next;
+
+   if (!circle_obj)
+     {
+        ERR("Eext_Circle_Object is NULL");
+        return;
+     }
+
+   if (circle_obj->del_func)
+     circle_obj->del_func(circle_obj);
+
+   EINA_LIST_FOREACH_SAFE(circle_obj->items, l, l_next, item)
+     {
+        _eext_circle_object_item_free(item);
+     }
+
+   if (circle_obj->surface)
+     {
+        _eext_circle_surface_object_remove(circle_obj->surface, circle_obj);
+        circle_obj->surface = NULL;
+     }
+
+   circle_obj->visible = EINA_FALSE;
+
+   if (obj)
+     evas_object_data_del(obj, EEXT_CIRCLE_OBJECT_TYPE);
+
+   free(circle_obj);
+}
+
+static void
+_eext_circle_object_show_cb(void *data,
+                            Evas *e,
+                            Evas_Object *obj,
+                            void *event_info)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+   if (!circle_obj) return;
+   if (circle_obj->visible) return;
+
+   if (circle_obj->widget_object)
+     {
+        if (evas_object_visible_get(circle_obj->widget_object))
+          {
+             circle_obj->visible = EINA_TRUE;
+             _eext_circle_object_changed(circle_obj);
+          }
+     }
+   else
+     {
+        circle_obj->visible = EINA_TRUE;
+        _eext_circle_object_changed(circle_obj);
+     }
+}
+
+static void
+_eext_circle_object_hide_cb(void *data,
+                            Evas *e,
+                            Evas_Object *obj,
+                            void *event_info)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+   if (!circle_obj) return;
+   if (!circle_obj->visible) return;
+
+   circle_obj->visible = EINA_FALSE;
+   _eext_circle_object_changed(circle_obj);
+}
+
+static void
+_eext_circle_object_widget_object_show_cb(void *data,
+                                          Evas *e,
+                                          Evas_Object *obj,
+                                          void *event_info)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+   if (!circle_obj) return;
+   if (circle_obj->visible) return;
+
+   if (evas_object_visible_get(circle_obj->image_widget))
+     {
+        circle_obj->visible = EINA_TRUE;
+        _eext_circle_object_changed(circle_obj);
+     }
+   else
+     {
+        evas_object_show(circle_obj->image_widget);
+     }
+}
+
+static void
+_eext_circle_object_widget_object_hide_cb(void *data,
+                                          Evas *e,
+                                          Evas_Object *obj,
+                                          void *event_info)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+   evas_object_hide(circle_obj->image_widget);
+}
+
+static void
+_eext_circle_object_widget_object_disabled_cb(void *data, Evas_Object *obj, void *event_info)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+   Evas_Object *main_obj = circle_obj->image_widget;
+
+   if (eext_circle_object_disabled_get(main_obj) != elm_object_disabled_get(obj))
+     eext_circle_object_disabled_set(main_obj, EINA_TRUE);
+}
+
+static void
+_eext_circle_object_widget_object_enabled_cb(void *data, Evas_Object *obj, void *event_info)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+   Evas_Object *main_obj = circle_obj->image_widget;
+
+   if (eext_circle_object_disabled_get(main_obj) != elm_object_disabled_get(obj))
+     eext_circle_object_disabled_set(main_obj, EINA_FALSE);
+}
+
+//////////////////////////////
+// Internal API //////////////
+//////////////////////////////
+void
+_eext_circle_object_init(Evas_Object *obj, Evas_Object *widget_obj, Eext_Circle_Surface *surface)
+{
+   Eext_Circle_Object *circle_obj;
+
+   circle_obj = (Eext_Circle_Object *)calloc(1, sizeof(Eext_Circle_Object));
+   // Obj is expected to be elm_image object.
+   circle_obj->image_widget = obj;
+   circle_obj->widget_object = widget_obj;
+   circle_obj->widget_data = NULL;
+   circle_obj->widget_type = EEXT_CIRCLE_OBJECT_TYPE;
+   circle_obj->del_func = NULL;
+   circle_obj->disabled_func = NULL;
+
+   evas_object_data_set(obj, EEXT_CIRCLE_OBJECT_TYPE, circle_obj);
+
+   //FIXME: It's for adjusting evas_image geometry.
+   //       Image object has weird geometry during the window calc own size.
+   //       We need to recalc image object after buffer memory copy in render time.
+   //       But now we don't have any way to call image's internal sizing eval function.
+   elm_image_aspect_fixed_set(obj, EINA_FALSE);
+   evas_object_repeat_events_set(obj, EINA_TRUE);
+
+   evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _eext_circle_object_del_cb, circle_obj);
+   evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _eext_circle_object_show_cb, circle_obj);
+   evas_object_event_callback_add(obj, EVAS_CALLBACK_HIDE, _eext_circle_object_hide_cb, circle_obj);
+
+   if (widget_obj)
+     {
+        evas_object_event_callback_add(widget_obj, EVAS_CALLBACK_SHOW,
+                                       _eext_circle_object_widget_object_show_cb, circle_obj);
+        evas_object_event_callback_add(widget_obj, EVAS_CALLBACK_HIDE,
+                                       _eext_circle_object_widget_object_hide_cb, circle_obj);
+        evas_object_smart_callback_add(widget_obj, "disabled", _eext_circle_object_widget_object_disabled_cb, circle_obj);
+        evas_object_smart_callback_add(widget_obj, "enabled", _eext_circle_object_widget_object_enabled_cb, circle_obj);
+     }
+
+   if (surface)
+     _eext_circle_surface_object_append(surface, circle_obj);
+   else
+     {
+        Eext_Circle_Surface *private_surface =
+           _eext_circle_surface_init(circle_obj->image_widget, NULL, EEXT_CIRCLE_SURFACE_TYPE_PRIVATE);
+        _eext_circle_surface_object_append(private_surface, circle_obj);
+     }
+}
+
+void
+_eext_circle_object_changed(Eext_Circle_Object *obj)
+{
+   if (!obj) return;
+
+   if (obj->surface)
+     _eext_circle_surface_changed(obj->surface);
+}
+
+Eext_Circle_Object_Item *
+_eext_circle_object_item_get(const Eext_Circle_Object *obj, const char *name)
+{
+   Eina_List *l;
+   Eext_Circle_Object_Item *item;
+
+   if (!obj)
+     {
+        ERR("Eext_Circle_Object is NULL! It returns NULL!");
+        return NULL;
+     }
+
+   if (!name)
+     {
+        ERR("The given item name is NULL! It returns NULL!");
+        return NULL;
+     }
+
+   EINA_LIST_FOREACH(obj->items, l, item)
+     {
+        const char *item_name = _eext_circle_object_item_name_get(item);
+        if (item_name &&
+            (name && !strcmp(_eext_circle_object_item_name_get(item), name)))
+          return item;
+     }
+
+   ERR("There is no [%s] item in the given object[%p:%s]! It returns NULL!", name, obj->image_widget, obj->widget_type);
+   return NULL;
+}
+
+void
+_eext_circle_object_hide(Eext_Circle_Object *obj)
+{
+   if (!obj) return;
+   if (!obj->visible) return;
+
+   obj->visible = EINA_FALSE;
+
+   _eext_circle_object_changed(obj);
+}
+
+void
+_eext_circle_object_show(Eext_Circle_Object *obj)
+{
+   if (!obj) return;
+   if (obj->visible) return;
+
+   obj->visible = EINA_TRUE;
+
+   if (obj->surface)
+     _eext_circle_surface_object_exclusive_show(obj->surface, obj);
+
+   _eext_circle_object_changed(obj);
+}
+
+/////////////////////////////////////////////////
+// EAPI /////////////////////////////////////////
+/////////////////////////////////////////////////
+EAPI void
+eext_circle_object_line_width_set(Evas_Object *obj, int line_width)
+{
+   eext_circle_object_item_line_width_set(obj, "default", line_width);
+}
+
+EAPI int
+eext_circle_object_line_width_get(const Evas_Object *obj)
+{
+   return eext_circle_object_item_line_width_get(obj, "default");
+}
+
+EAPI void
+eext_circle_object_angle_set(Evas_Object *obj, double angle)
+{
+   eext_circle_object_item_angle_set(obj, "default", angle);
+}
+
+EAPI double
+eext_circle_object_angle_get(const Evas_Object *obj)
+{
+   return eext_circle_object_item_angle_get(obj, "default");
+}
+
+EAPI void
+eext_circle_object_angle_offset_set(Evas_Object *obj, double angle_offset)
+{
+   eext_circle_object_item_angle_offset_set(obj, "default", angle_offset);
+}
+
+EAPI double
+eext_circle_object_angle_offset_get(const Evas_Object *obj)
+{
+   return eext_circle_object_item_angle_offset_get(obj, "default");
+}
+
+EAPI void
+eext_circle_object_angle_min_max_set(Evas_Object *obj, double min_angle, double max_angle)
+{
+   eext_circle_object_item_angle_min_max_set(obj, "default", min_angle, max_angle);
+}
+
+EAPI void
+eext_circle_object_angle_min_max_get(const Evas_Object *obj, double *min_angle, double *max_angle)
+{
+   eext_circle_object_item_angle_min_max_get(obj, "default", min_angle, max_angle);
+}
+
+EAPI void
+eext_circle_object_value_min_max_set(Evas_Object *obj, double min_value, double max_value)
+{
+   eext_circle_object_item_value_min_max_set(obj, "default", min_value, max_value);
+}
+
+EAPI void
+eext_circle_object_value_min_max_get(const Evas_Object *obj, double *min_value, double *max_value)
+{
+   eext_circle_object_item_value_min_max_get(obj, "default", min_value, max_value);
+}
+
+EAPI void
+eext_circle_object_value_set(Evas_Object *obj, double value)
+{
+   eext_circle_object_item_value_set(obj, "default", value);
+}
+
+EAPI double
+eext_circle_object_value_get(const Evas_Object *obj)
+{
+   return eext_circle_object_item_value_get(obj, "default");
+}
+
+EAPI void
+eext_circle_object_color_set(Evas_Object *obj, int r, int g, int b, int a)
+{
+   eext_circle_object_item_color_set(obj, "default", r, g, b, a);
+}
+
+EAPI void
+eext_circle_object_color_get(const Evas_Object *obj, int *r, int *g, int *b, int *a)
+{
+   eext_circle_object_item_color_get(obj, "default", r, g, b, a);
+}
+
+EAPI void
+eext_circle_object_radius_set(Evas_Object *obj, double radius)
+{
+   eext_circle_object_item_radius_set(obj, "default", radius);
+}
+
+EAPI double
+eext_circle_object_radius_get(const Evas_Object *obj)
+{
+   return eext_circle_object_item_radius_get(obj, "default");
+}
+
+EAPI void
+eext_circle_object_disabled_set(Evas_Object *obj, Eina_Bool disabled)
+{
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+
+   if (circle_obj->disabled == disabled) return;
+
+   circle_obj->disabled = disabled;
+
+   if (circle_obj->disabled_func)
+     circle_obj->disabled_func(circle_obj);
+
+   if (circle_obj->widget_object &&
+       (elm_object_disabled_get(circle_obj->widget_object) != disabled))
+     elm_object_disabled_set(circle_obj->widget_object, disabled);
+}
+
+EAPI Eina_Bool
+eext_circle_object_disabled_get(Evas_Object *obj)
+{
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return EINA_FALSE;
+
+   return circle_obj->disabled;
+}
+
+EAPI Evas_Object *
+eext_circle_object_add(Evas_Object *parent, Eext_Circle_Surface *surface)
+{
+   Evas_Object *obj;
+   Eext_Circle_Object_Item *item;
+
+   obj = elm_image_add(parent);
+   _eext_circle_object_init(obj, NULL, surface);
+
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
+
+   item = _eext_circle_object_item_new();
+   _eext_circle_object_item_append(circle_obj, item);
+
+   return obj;
+}
+
+EAPI void
+eext_circle_object_item_line_width_set(Evas_Object *obj, const char *item_name, int line_width)
+{
+   Eext_Circle_Object_Item *item = NULL;
+
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+
+   item = _eext_circle_object_item_get(circle_obj, item_name);
+
+   if (item)
+     _eext_circle_object_item_line_width_set(item, line_width);
+}
+
+EAPI int
+eext_circle_object_item_line_width_get(const Evas_Object *obj, const char *item_name)
+{
+   Eext_Circle_Object_Item *item = NULL;
+
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return -1;
+
+   item = _eext_circle_object_item_get(circle_obj, item_name);
+
+   if (item)
+     return _eext_circle_object_item_line_width_get(item);
+
+   return -1;
+}
+
+EAPI void
+eext_circle_object_item_angle_set(Evas_Object *obj, const char *item_name, double angle)
+{
+   Eext_Circle_Object_Item *item = NULL;
+
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+
+   item = _eext_circle_object_item_get(circle_obj, item_name);
+
+   if (item)
+     _eext_circle_object_item_angle_set(item, angle);
+}
+
+EAPI double
+eext_circle_object_item_angle_get(const Evas_Object *obj, const char *item_name)
+{
+   Eext_Circle_Object_Item *item = NULL;
+
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return -1.0;
+
+   item = _eext_circle_object_item_get(circle_obj, item_name);
+
+   if (item)
+     return _eext_circle_object_item_angle_get(item);
+
+   return -1.0;
+}
+
+EAPI void
+eext_circle_object_item_angle_offset_set(Evas_Object *obj, const char *item_name, double angle_offset)
+{
+   Eext_Circle_Object_Item *item = NULL;
+
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+
+   item = _eext_circle_object_item_get(circle_obj, item_name);
+
+   if (item)
+     _eext_circle_object_item_angle_offset_set(item, angle_offset);
+}
+
+EAPI double
+eext_circle_object_item_angle_offset_get(const Evas_Object *obj, const char *item_name)
+{
+   Eext_Circle_Object_Item *item = NULL;
+
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return -1.0;
+
+   item = _eext_circle_object_item_get(circle_obj, item_name);
+
+   if (item)
+     return _eext_circle_object_item_angle_offset_get(item);
+
+   return -1.0;
+}
+
+EAPI void
+eext_circle_object_item_angle_min_max_set(Evas_Object *obj, const char *item_name, double min_angle, double max_angle)
+{
+   Eext_Circle_Object_Item *item = NULL;
+
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+
+   item = _eext_circle_object_item_get(circle_obj, item_name);
+
+   if (item)
+     _eext_circle_object_item_angle_min_max_set(item, min_angle, max_angle);
+}
+
+EAPI void
+eext_circle_object_item_angle_min_max_get(const Evas_Object *obj, const char *item_name, double *min_angle, double *max_angle)
+{
+   Eext_Circle_Object_Item *item = NULL;
+
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj)
+     {
+        if (min_angle) *min_angle = 0;
+        if (max_angle) *max_angle = 0;
+
+        return;
+     }
+
+   item = _eext_circle_object_item_get(circle_obj, item_name);
+
+   if (item)
+     {
+        _eext_circle_object_item_angle_min_max_get(item, min_angle, max_angle);
+     }
+   else
+     {
+        if (min_angle) *min_angle = 0;
+        if (max_angle) *max_angle = 0;
+     }
+}
+
+EAPI void
+eext_circle_object_item_value_min_max_set(Evas_Object *obj, const char *item_name, double min_value, double max_value)
+{
+   Eext_Circle_Object_Item *item = NULL;
+
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+
+   item = _eext_circle_object_item_get(circle_obj, item_name);
+
+   if (item)
+     _eext_circle_object_item_value_min_max_set(item, min_value, max_value);
+}
+
+EAPI void
+eext_circle_object_item_value_min_max_get(const Evas_Object *obj, const char *item_name, double *min_value, double *max_value)
+{
+   Eext_Circle_Object_Item *item = NULL;
+
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj)
+     {
+        if (min_value) *min_value = 0;
+        if (max_value) *max_value = 0;
+
+        return;
+     }
+
+   item = _eext_circle_object_item_get(circle_obj, item_name);
+
+   if (item)
+     {
+        _eext_circle_object_item_value_min_max_get(item, min_value, max_value);
+     }
+   else
+     {
+        if (min_value) *min_value = 0;
+        if (max_value) *max_value = 0;
+     }
+}
+
+EAPI void
+eext_circle_object_item_value_set(Evas_Object *obj, const char *item_name, double value)
+{
+   Eext_Circle_Object_Item *item = NULL;
+
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+
+   item = _eext_circle_object_item_get(circle_obj, item_name);
+
+   if (item)
+     _eext_circle_object_item_value_set(item, value);
+}
+
+EAPI double
+eext_circle_object_item_value_get(const Evas_Object *obj, const char *item_name)
+{
+   Eext_Circle_Object_Item *item = NULL;
+
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return -1.0;
+
+   item = _eext_circle_object_item_get(circle_obj, item_name);
+
+   if (item)
+     return _eext_circle_object_item_value_get(item);
+
+   return -1.0;
+}
+
+EAPI void
+eext_circle_object_item_color_set(Evas_Object *obj, const char *item_name, int r, int g, int b, int a)
+{
+   Eext_Circle_Object_Item *item = NULL;
+
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+
+   item = _eext_circle_object_item_get(circle_obj, item_name);
+
+   if (item)
+     {
+        _eext_circle_object_item_color_set(item, r, g, b, a);
+
+        if (circle_obj->color_changed_func)
+          {
+             if (item_name)
+               circle_obj->color_changed_func(circle_obj, item_name);
+             else
+               circle_obj->color_changed_func(circle_obj, "default");
+          }
+     }
+}
+
+EAPI void
+eext_circle_object_item_color_get(const Evas_Object *obj, const char *item_name, int *r, int *g, int *b, int *a)
+{
+   Eext_Circle_Object_Item *item = NULL;
+
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj)
+     {
+        if (r) *r = 0;
+        if (g) *g = 0;
+        if (b) *b = 0;
+        if (a) *a = 0;
+
+        return;
+     }
+
+   item = _eext_circle_object_item_get(circle_obj, item_name);
+
+   if (item)
+     {
+        _eext_circle_object_item_color_get(item, r, g, b, a);
+     }
+   else
+     {
+        if (r) *r = 0;
+        if (g) *g = 0;
+        if (b) *b = 0;
+        if (a) *a = 0;
+     }
+}
+
+EAPI void
+eext_circle_object_item_radius_set(Evas_Object *obj, const char *item_name, double radius)
+{
+   Eext_Circle_Object_Item *item = NULL;
+
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+
+   item = _eext_circle_object_item_get(circle_obj, item_name);
+
+   if (item)
+     _eext_circle_object_item_radius_set(item, radius);
+}
+
+EAPI double
+eext_circle_object_item_radius_get(const Evas_Object *obj, const char *item_name)
+{
+   Eext_Circle_Object_Item *item = NULL;
+
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return -1.0;
+
+   item = _eext_circle_object_item_get(circle_obj, item_name);
+
+   if (item)
+     return _eext_circle_object_item_radius_get(item);
+
+   return -1.0;
+}
diff --git a/src/wearable/circle/efl_extension_circle_object_datetime.c b/src/wearable/circle/efl_extension_circle_object_datetime.c
new file mode 100644 (file)
index 0000000..4ab21ac
--- /dev/null
@@ -0,0 +1,808 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "efl_extension.h"
+#include "efl_extension_private.h"
+#include "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; \
+   if (circle_obj && circle_obj->widget_data && \
+       circle_obj->widget_type && !strcmp(circle_obj->widget_type, EEXT_CIRCLE_OBJECT_DATETIME_TYPE)) \
+      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_WIDTH = 360.0;
+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 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 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}};
+
+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);
+     }
+   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_current_type_update(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;
+   double picker_angle = 0.0;
+
+   elm_datetime_value_get(datetime, &t);
+
+   radio = _eext_circle_object_datetime_selected_field_object_get(datetime);
+   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:
+         obj->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:
+         obj->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);
+         obj->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);
+         obj->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);
+         obj->bg_image_index = 6;
+         break;
+      case ELM_DATETIME_AMPM:
+      default:
+         break;
+     }
+
+   _eext_circle_object_changed(obj);
+
+}
+
+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);
+
+   _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_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(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 min, max;
+   int max_day;
+   double picker_angle = 0.0;
+
+   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:
+           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 Eina_Bool
+_rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info* info)
+{
+   char buf[DATETIME_FIELD_NAME_BUF_MAX];
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+   Evas_Object *selected_radio;
+
+   //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
+   Eext_Circle_Object_Datetime_Data *datetime_data = (Eext_Circle_Object_Datetime_Data *)circle_obj->widget_data;
+   Evas_Object *datetime = circle_obj->widget_object;
+   struct tm t;
+   char buf_read_text[255];
+   char buf_month[255];
+   char buf_ampm[3];
+   int idx = 0;
+
+   elm_datetime_value_get(datetime, &t);
+
+   bindtextdomain (PACKAGE, LOCALE_DIR);
+   textdomain (PACKAGE);
+   elm_atspi_accessible_translation_domain_set(obj, PACKAGE);
+
+   switch(datetime_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), _("WDS_TTS_TBBODY_JANUARY"));
+           else if(t.tm_mon == 1)
+              snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_FEBRUARY"));
+           else if(t.tm_mon == 2)
+              snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_MARCH"));
+           else if(t.tm_mon == 3)
+              snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_APRIL"));
+           else if(t.tm_mon == 4)
+              snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_MAY"));
+           else if(t.tm_mon == 5)
+              snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_JUNE"));
+           else if(t.tm_mon == 6)
+              snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_JULY"));
+           else if(t.tm_mon == 7)
+              snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_AUGUST"));
+           else if(t.tm_mon == 8)
+              snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_SEPTEMBER"));
+           else if(t.tm_mon == 9)
+              snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_OCTOBER"));
+           else if(t.tm_mon == 10)
+              snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_NOVEMBER"));
+           else if(t.tm_mon == 11)
+              snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_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), _("WDS_TTS_TBBODY_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), _("WDS_TTS_TBBODY_AM"));
+           else
+              snprintf(buf_ampm, sizeof(buf_ampm), "");
+
+           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;
+     }
+   elm_atspi_bridge_utils_say(buf_read_text, EINA_TRUE, NULL, NULL);
+   //
+
+   return EINA_TRUE;
+}
+
+static void
+_eext_circle_object_datetime_del_cb(Eext_Circle_Object *obj)
+{
+   if (!obj) return;
+
+   if (obj->widget_data)
+     {
+        free(obj->widget_data);
+        obj->widget_data = NULL;
+     }
+
+   if (obj->bg_image_objs)
+     {
+        eina_list_free(obj->bg_image_objs);
+        obj->bg_image_objs = NULL;
+     }
+}
+
+static void
+_eext_circle_object_datetime_disabled_cb(Eext_Circle_Object *obj)
+{
+   if (obj->disabled)
+     {
+        eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb);
+        eext_rotary_object_event_callback_del(obj->image_widget, _rotary_changed_cb);
+     }
+   else
+     {
+        eext_rotary_object_event_callback_add(obj->image_widget, _rotary_changed_cb, obj);
+        eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
+     }
+}
+
+static void
+_eext_circle_object_datetime_bg_image_append(Eext_Circle_Object *obj)
+{
+   Evas_Object *bg_image;
+   char buf[PATH_MAX];
+   int i;
+
+   for (i = 0; i <= BG_FILE_COUNT; i++)
+     {
+        bg_image = elm_image_add(obj->widget_object);
+        snprintf(buf, sizeof(buf), "%s/%s.png", IMG_DIR, bg_file_name[i]);
+        elm_image_file_set(bg_image, buf, NULL);
+        obj->bg_image_objs = eina_list_append(obj->bg_image_objs, bg_image);
+     }
+
+   obj->bg_image_index = BG_FILE_COUNT;
+}
+static char *
+_accessibility_item_make_trait(char *trait, char *unit)
+{
+   sprintf(trait, _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_ADJUST_PS"), unit);
+   return strdup(trait);
+}
+
+//for accessibility
+static char *
+_accessibility_item_name_set_cb(void *data, Evas_Object *obj)
+{
+   char buf[255] = "";
+   char buf_month[255];
+   char buf_unit[255];
+   char buf_ampm[255];
+   char buf_trait[255];
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+   Evas_Object *datetime = circle_obj->widget_object;
+   int idx = 0;
+   int selected = -1;
+   struct tm t;
+   Evas_Object *radio;
+
+   if(obj == elm_object_part_content_get(datetime, "field0"))
+     {
+        selected = ELM_DATETIME_DATE;
+     }
+   else if(obj == elm_object_part_content_get(datetime, "field1"))
+     {
+        selected = ELM_DATETIME_MONTH;
+     }
+   else if(obj == elm_object_part_content_get(datetime, "field2"))
+     {
+        selected = ELM_DATETIME_YEAR;
+     }
+   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)
+          {
+              if(obj == field_obj)
+                {
+                   selected = idx;
+                }
+          }
+     }
+
+   elm_datetime_value_get(datetime, &t);
+
+   bindtextdomain (PACKAGE, LOCALE_DIR);
+   textdomain (PACKAGE);
+
+   switch(selected)
+     {
+        case ELM_DATETIME_DATE:
+           sprintf(buf_unit, _("WDS_TTS_TBBODY_DAY"));
+           strcpy(_accessibility_item_make_trait(buf_trait, buf_unit), buf_trait);
+           sprintf(buf, "%2.0f %s %s",(double)t.tm_mday, buf_unit, buf_trait);
+           break;
+        case ELM_DATETIME_MONTH:
+           if(t.tm_mon == 0)
+              sprintf(buf_month, _("WDS_TTS_TBBODY_JANUARY"));
+           else if(t.tm_mon == 1)
+              sprintf(buf_month, _("WDS_TTS_TBBODY_FEBRUARY"));
+           else if(t.tm_mon == 2)
+              sprintf(buf_month, _("WDS_TTS_TBBODY_MARCH"));
+           else if(t.tm_mon == 3)
+              sprintf(buf_month, _("WDS_TTS_TBBODY_APRIL"));
+           else if(t.tm_mon == 4)
+              sprintf(buf_month, _("WDS_TTS_TBBODY_MAY"));
+           else if(t.tm_mon == 5)
+              sprintf(buf_month, _("WDS_TTS_TBBODY_JUNE"));
+           else if(t.tm_mon == 6)
+              sprintf(buf_month, _("WDS_TTS_TBBODY_JULY"));
+           else if(t.tm_mon == 7)
+              sprintf(buf_month, _("WDS_TTS_TBBODY_AUGUST"));
+           else if(t.tm_mon == 8)
+              sprintf(buf_month, _("WDS_TTS_TBBODY_SEPTEMBER"));
+           else if(t.tm_mon == 9)
+              sprintf(buf_month, _("WDS_TTS_TBBODY_OCTOBER"));
+           else if(t.tm_mon == 10)
+              sprintf(buf_month, _("WDS_TTS_TBBODY_NOVEMBER"));
+           else if(t.tm_mon == 11)
+              sprintf(buf_month, _("WDS_TTS_TBBODY_DECEMBER"));
+           sprintf(buf_unit, _("WDS_TTS_TBBODY_MONTH"));
+           strcpy(_accessibility_item_make_trait(buf_trait, buf_unit), buf_trait);
+           sprintf(buf, "%s %s %s",buf_month, buf_unit, buf_trait);
+           break;
+        case ELM_DATETIME_YEAR:
+           sprintf(buf_unit, _("WDS_TTS_TBBODY_YEAR"));
+           strcpy(_accessibility_item_make_trait(buf_trait, buf_unit), buf_trait);
+           sprintf(buf, "%4.0f %s %s",(double)t.tm_year + (double)1900.0f, buf_unit, buf_trait);
+           break;
+        case ELM_DATETIME_AMPM:
+           sprintf(buf_trait, _("WDS_TTS_TBBODY_DOUBLE_TAP_TO_CHANGE"));
+           if((double)t.tm_hour <= 12.0f)
+              sprintf(buf_unit, _("WDS_TTS_TBBODY_AM"));
+           else
+              sprintf(buf_unit, _("WDS_TTS_TBBODY_PM"));
+           strcpy(_accessibility_item_make_trait(buf_trait, buf_unit), buf_trait);
+           sprintf(buf, "%s %s",buf_unit, buf_trait);
+           break;
+        case ELM_DATETIME_HOUR:
+           sprintf(buf_unit, _("WDS_TTS_TBBODY_HOUR"));
+           if((double)t.tm_hour <= 12.0f)
+             {
+                sprintf(buf_ampm, _("WDS_TTS_TBBODY_AM"));
+                strcpy(_accessibility_item_make_trait(buf_trait, buf_unit), buf_trait);
+                sprintf(buf, "%2.0f %s %s %s",(double)t.tm_hour, buf_ampm, buf_unit, buf_trait);
+             }
+           else
+             {
+                sprintf(buf_ampm, _("WDS_TTS_TBBODY_PM"));
+                strcpy(_accessibility_item_make_trait(buf_trait, buf_unit), buf_trait);
+                sprintf(buf, "%2.0f %s %s %s",(double)t.tm_hour - (double)12.0f, buf_ampm, buf_unit, buf_trait);
+             }
+           break;
+        case ELM_DATETIME_MINUTE:
+           sprintf(buf_unit, _("WDS_TTS_TBBODY_MINUTE"));
+           strcpy(_accessibility_item_make_trait(buf_trait, buf_unit), buf_trait);
+           sprintf(buf, "%2.0f %s %s",(double)t.tm_min, buf_unit, buf_trait);
+           break;
+     }
+
+   return strdup(buf);
+
+}
+static void
+_accessibility_datetime_radio_highlighted_cb(void *data, Evas_Object *obj, void *event_info)
+{
+   char buf[255] = "";
+   char buf_month[255];
+   char buf_unit[255];
+   char buf_ampm[255];
+   char buf_trait[255];
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+   Evas_Object *datetime = circle_obj->widget_object;
+   int idx = 0;
+   int selected = -1;
+   struct tm t;
+   Evas_Object *radio;
+
+   if(obj == elm_object_part_content_get(datetime, "field0"))
+     selected = ELM_DATETIME_DATE;
+   else if(obj == elm_object_part_content_get(datetime, "field1"))
+     selected = ELM_DATETIME_MONTH;
+   else if(obj == elm_object_part_content_get(datetime, "field2"))
+     selected = ELM_DATETIME_YEAR;
+
+   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)
+          {
+              if(obj == field_obj)
+                {
+                   selected = idx;
+                }
+          }
+     }
+
+   radio = _eext_circle_object_datetime_selected_field_object_get(datetime);
+   if(selected == ELM_DATETIME_AMPM)
+      elm_radio_value_set(radio, ELM_DATETIME_HOUR);
+   else
+      elm_radio_value_set(radio, selected);
+
+   _eext_circle_object_datetime_current_type_update(circle_obj, EINA_FALSE);
+
+   elm_atspi_accessible_name_cb_set(obj, _accessibility_item_name_set_cb, (Eext_Circle_Object*)circle_obj);
+   elm_atspi_accessible_reading_info_type_set(obj, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME);
+
+   return EINA_TRUE;
+}
+//
+
+static void
+_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;
+
+   data = (Eext_Circle_Object_Datetime_Data *)calloc(1, sizeof(Eext_Circle_Object_Datetime_Data));
+   obj->widget_data = (void *)data;
+
+   item = _eext_circle_object_item_new();
+   _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_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);
+   //for accessibility
+   evas_object_smart_callback_add(elm_object_part_content_get(datetime, "field0"), "atspi,highlighted", _accessibility_datetime_radio_highlighted_cb, obj);
+   evas_object_smart_callback_add(elm_object_part_content_get(datetime, "field1"), "atspi,highlighted", _accessibility_datetime_radio_highlighted_cb, obj);
+   evas_object_smart_callback_add(elm_object_part_content_get(datetime, "field2"), "atspi,highlighted", _accessibility_datetime_radio_highlighted_cb, 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
+             evas_object_smart_callback_add(field_obj, "atspi,highlighted", _accessibility_datetime_radio_highlighted_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);
+   _eext_circle_object_datetime_circle_update(obj);
+
+   eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
+
+   _eext_circle_object_datetime_bg_image_append(obj);
+
+}
+
+EAPI Evas_Object *
+eext_circle_object_datetime_add(Evas_Object *datetime, Eext_Circle_Surface *surface)
+{
+   Evas_Object *obj;
+
+   if (!datetime) return NULL;
+
+   obj = elm_image_add(datetime);
+   _eext_circle_object_init(obj, datetime, surface);
+
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
+
+   _eext_circle_object_datetime_init(circle_obj, datetime);
+
+   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);
+}
+*/
diff --git a/src/wearable/circle/efl_extension_circle_object_genlist.c b/src/wearable/circle/efl_extension_circle_object_genlist.c
new file mode 100644 (file)
index 0000000..a2d90c7
--- /dev/null
@@ -0,0 +1,521 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "efl_extension.h"
+#include "efl_extension_private.h"
+#include "circle/efl_extension_circle_private.h"
+
+#define EEXT_CIRCLE_OBJECT_GENLIST_TYPE "Eext_Circle_Object_Genlist"
+
+#define VERTICAL_BAR_ANGLE_START 60.0
+#define VERTICAL_BAR_ANGLE_RANGE 60.0
+#define VERTICAL_BAR_ANGLE_MAX_SIZE 60.0
+#define VERTICAL_BAR_ANGLE_MIN_SIZE 6.0
+#define VERTICAL_BAR_TRANSIT_TIME 0.2
+#define VERTICAL_BAR_HIDE_WAITTING_TIME 0.2
+#define VERTICAL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING 1.0
+#define VERTICAL_BAR_WIDTH_SIZE 10
+#define VERTICAL_BAR_RADIUS_SIZE 174 // (180 - (BAR_WIDTH / 2) - 1)
+
+#define SCROLL_BAR_COLOR_R 14
+#define SCROLL_BAR_COLOR_G 137
+#define SCROLL_BAR_COLOR_B 181
+#define SCROLL_BAR_COLOR_A 255
+
+#define SCROLL_BAR_BG_COLOR_R 250
+#define SCROLL_BAR_BG_COLOR_G 250
+#define SCROLL_BAR_BG_COLOR_B 250
+#define SCROLL_BAR_BG_COLOR_A 38
+
+#define SCROLL_BAR_COLOR_DISABLED_R 45
+#define SCROLL_BAR_COLOR_DISABLED_G 45
+#define SCROLL_BAR_COLOR_DISABLED_B 45
+#define SCROLL_BAR_COLOR_DISABLED_A 255
+
+#define SCROLL_BAR_BG_COLOR_DISABLED_R 45
+#define SCROLL_BAR_BG_COLOR_DISABLED_G 45
+#define SCROLL_BAR_BG_COLOR_DISABLED_B 45
+#define SCROLL_BAR_BG_COLOR_DISABLED_A 63
+
+#define EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, data) \
+   Eext_Circle_Object_Genlist_Data *data = NULL; \
+   if (circle_obj && circle_obj->widget_data && \
+       circle_obj->widget_type && !strcmp(circle_obj->widget_type, EEXT_CIRCLE_OBJECT_GENLIST_TYPE)) \
+      data = (Eext_Circle_Object_Genlist_Data *)circle_obj->widget_data; \
+   if (!data)
+
+#define GENLIST_ITEM_NAME "default"
+#define GENLIST_BG_ITEM_NAME "vertical,scroll,bg"
+
+static void
+_eext_circle_object_genlist_region_show(void *data, Eina_Bool clockwise)
+{
+   Eext_Circle_Object *obj = (Eext_Circle_Object *)data;
+   Evas_Coord x, y, vw, vh;
+   Elm_Object_Item *next_item;
+
+   if (!obj) return;
+
+   elm_scroller_region_get(obj->widget_object, NULL, NULL, &vw, &vh);
+   evas_object_geometry_get(obj->widget_object, &x, &y, NULL, NULL);
+
+   next_item = elm_genlist_at_xy_item_get(obj->widget_object, (vw / 2) + x, (vh / 2) + y, 0);
+
+   if (!next_item) return;
+
+   if (clockwise)
+     next_item = elm_genlist_item_next_get(next_item);
+   else
+     next_item = elm_genlist_item_prev_get(next_item);
+
+   if (!next_item) return;
+
+   elm_genlist_item_bring_in(next_item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
+}
+
+static Eina_Bool
+_rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info)
+{
+   if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
+     _eext_circle_object_genlist_region_show(data, EINA_TRUE);
+   else
+     _eext_circle_object_genlist_region_show(data, EINA_FALSE);
+
+   return EINA_TRUE;
+}
+
+static void
+_eext_circle_object_genlist_scrollbar_update(Eext_Circle_Object *obj)
+{
+   Eext_Circle_Object_Item *item;
+   Evas_Coord ch; /* content h */
+   Evas_Coord py, vh; /* postion y, viewport h*/
+   double ratio;
+   double bar_pos_y = VERTICAL_BAR_ANGLE_START;
+   double bar_size_y = VERTICAL_BAR_ANGLE_RANGE;
+   double vertical_bar_angle_range = VERTICAL_BAR_ANGLE_RANGE;
+
+   if (!obj) return;
+
+   item = _eext_circle_object_item_get(obj, GENLIST_ITEM_NAME);
+
+   elm_scroller_child_size_get(obj->widget_object, NULL, &ch);
+   elm_scroller_region_get(obj->widget_object, NULL, &py, NULL, &vh);
+
+   if (ch > 0)
+     {
+        ratio = (double)ch / (double)vh;
+
+        if (ratio == 0) return;
+
+        if (ch > vh)
+          {
+             bar_size_y = vertical_bar_angle_range / ratio;
+
+             if (bar_size_y > VERTICAL_BAR_ANGLE_MAX_SIZE)
+               bar_size_y = VERTICAL_BAR_ANGLE_MAX_SIZE;
+             if (bar_size_y < VERTICAL_BAR_ANGLE_MIN_SIZE)
+               bar_size_y = VERTICAL_BAR_ANGLE_MIN_SIZE;
+          }
+        bar_pos_y += (double)py / ch * vertical_bar_angle_range;
+
+        _eext_circle_object_item_angle_set(item, bar_size_y);
+        _eext_circle_object_item_angle_offset_set(item, bar_pos_y);
+     }
+}
+
+static void
+_eext_circle_object_genlist_realized_cb(void *data,
+                                        Evas_Object *obj,
+                                        void *event_info)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+
+   if (widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) return;
+
+   _eext_circle_object_genlist_scrollbar_update(circle_obj);
+}
+
+static void
+_eext_circle_object_genlist_color_changed_cb(Eext_Circle_Object *obj, const char *item_name)
+{
+   Eext_Circle_Object_Item *item;
+   int r, g, b, a;
+
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, widget_data) return;
+
+   item = _eext_circle_object_item_get(obj, item_name);
+   if (!item) return;
+
+   _eext_circle_object_item_color_get(item, &r, &g, &b, &a);
+
+   if (!strcmp(item_name, GENLIST_ITEM_NAME))
+     {
+        widget_data->color.r = r;
+        widget_data->color.g = g;
+        widget_data->color.b = b;
+        widget_data->color.a = a;
+
+        return;
+     }
+
+   if (!strcmp(item_name, GENLIST_BG_ITEM_NAME))
+     {
+        widget_data->bg_color.r = r;
+        widget_data->bg_color.g = g;
+        widget_data->bg_color.b = b;
+        widget_data->bg_color.a = a;
+
+        return;
+     }
+}
+
+static Eina_Bool
+_eext_circle_object_genlist_scrollbar_policy_hide_cb(void *data)
+{
+   Eext_Circle_Object *obj = (Eext_Circle_Object *)data;
+   Eext_Circle_Object_Item *item;
+   Eina_List *l;
+
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, widget_data) return ECORE_CALLBACK_CANCEL;
+
+   if (widget_data->realized_callback_added)
+     {
+        evas_object_smart_callback_del_full(obj->widget_object, "realized", _eext_circle_object_genlist_realized_cb, obj);
+        widget_data->realized_callback_added = EINA_FALSE;
+     }
+
+   EINA_LIST_FOREACH(obj->items, l, item)
+     {
+        _eext_circle_object_item_color_transit_set(item, VERTICAL_BAR_TRANSIT_TIME,
+                                                   0, 0, 0, 0,
+                                                   EINA_TRUE,
+                                                   0.25, 0.46, 0.45, 1.0);
+     }
+
+   if (widget_data->bar_hide_timer)
+     {
+         ecore_timer_del(widget_data->bar_hide_timer);
+         widget_data->bar_hide_timer = NULL;
+     }
+
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+_eext_circle_object_genlist_scrollbar_show(Eext_Circle_Object *obj,
+                                           double hide_waiting_time)
+{
+   Eext_Circle_Object_Item *item;
+
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, widget_data) return;
+
+   if (widget_data->realized_callback_added)
+     {
+        evas_object_smart_callback_del_full(obj->widget_object, "realized", _eext_circle_object_genlist_realized_cb, obj);
+        widget_data->realized_callback_added = EINA_FALSE;
+     }
+
+   if (widget_data->bar_hide_timer)
+     {
+         ecore_timer_del(widget_data->bar_hide_timer);
+         widget_data->bar_hide_timer = NULL;
+     }
+
+   item = _eext_circle_object_item_get(obj, GENLIST_BG_ITEM_NAME);
+   if (obj->disabled)
+     _eext_circle_object_item_color_set(item,
+                                        widget_data->disabled_bg_color.r,
+                                        widget_data->disabled_bg_color.g,
+                                        widget_data->disabled_bg_color.b,
+                                        widget_data->disabled_bg_color.a);
+   else
+     _eext_circle_object_item_color_set(item,
+                                        widget_data->bg_color.r,
+                                        widget_data->bg_color.g,
+                                        widget_data->bg_color.b,
+                                        widget_data->bg_color.a);
+
+   item = _eext_circle_object_item_get(obj, GENLIST_ITEM_NAME);
+   if (obj->disabled)
+     _eext_circle_object_item_color_set(item,
+                                        widget_data->disabled_color.r,
+                                        widget_data->disabled_color.g,
+                                        widget_data->disabled_color.b,
+                                        widget_data->disabled_color.a);
+   else
+     _eext_circle_object_item_color_set(item,
+                                        widget_data->color.r,
+                                        widget_data->color.g,
+                                        widget_data->color.b,
+                                        widget_data->color.a);
+
+   if (widget_data->policy_v == ELM_SCROLLER_POLICY_AUTO)
+     {
+        widget_data->bar_hide_timer = ecore_timer_add(hide_waiting_time,
+                                                      _eext_circle_object_genlist_scrollbar_policy_hide_cb,
+                                                      obj);
+     }
+}
+
+static void
+_eext_circle_object_genlist_show_cb(void *data,
+                                    Evas *e,
+                                    Evas_Object *obj,
+                                    void *event_info)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+
+   if (widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) return;
+
+   _eext_circle_object_genlist_scrollbar_update(circle_obj);
+   _eext_circle_object_genlist_scrollbar_show(circle_obj,
+                                              VERTICAL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING);
+   if (!widget_data->realized_callback_added)
+     {
+        evas_object_smart_callback_add(circle_obj->widget_object, "realized", _eext_circle_object_genlist_realized_cb, circle_obj);
+        widget_data->realized_callback_added = EINA_TRUE;
+     }
+}
+
+static void
+_eext_circle_object_genlist_scroll_cb(void *data,
+                                      Evas_Object *obj,
+                                      void *event_info)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
+
+   if (widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) return;
+
+   _eext_circle_object_genlist_scrollbar_update(circle_obj);
+   _eext_circle_object_genlist_scrollbar_show(circle_obj,
+                                              VERTICAL_BAR_HIDE_WAITTING_TIME);
+}
+
+static void
+_eext_circle_object_genlist_del_cb(Eext_Circle_Object *obj)
+{
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, widget_data) return;
+
+   evas_object_event_callback_del_full(obj->widget_object, EVAS_CALLBACK_SHOW, _eext_circle_object_genlist_show_cb, obj);
+   evas_object_smart_callback_del_full(obj->widget_object, "scroll", _eext_circle_object_genlist_scroll_cb, obj);
+
+   if (widget_data->realized_callback_added)
+     {
+        evas_object_smart_callback_del_full(obj->widget_object, "realized", _eext_circle_object_genlist_realized_cb, obj);
+        widget_data->realized_callback_added = EINA_FALSE;
+     }
+
+   if (widget_data->bar_hide_timer)
+     {
+        ecore_timer_del(widget_data->bar_hide_timer);
+        widget_data->bar_hide_timer = NULL;
+     }
+
+   free(obj->widget_data);
+   obj->widget_data = NULL;
+
+   eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb);
+}
+
+static void
+_eext_circle_object_genlist_disabled_cb(Eext_Circle_Object *obj)
+{
+   Eext_Circle_Object_Item *item;
+
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, data) return;
+
+   if (obj->disabled)
+     {
+        item = _eext_circle_object_item_get(obj, GENLIST_ITEM_NAME);
+        _eext_circle_object_item_color_set(item,
+                                           data->disabled_color.r,
+                                           data->disabled_color.g,
+                                           data->disabled_color.b,
+                                           data->disabled_color.a);
+
+        item = _eext_circle_object_item_get(obj, GENLIST_BG_ITEM_NAME);
+        _eext_circle_object_item_color_set(item,
+                                           data->disabled_bg_color.r,
+                                           data->disabled_bg_color.g,
+                                           data->disabled_bg_color.b,
+                                           data->disabled_bg_color.a);
+
+        eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb);
+        eext_rotary_object_event_callback_del(obj->image_widget, _rotary_changed_cb);
+     }
+   else
+     {
+        item = _eext_circle_object_item_get(obj, GENLIST_ITEM_NAME);
+        _eext_circle_object_item_color_set(item,
+                                           data->color.r,
+                                           data->color.g,
+                                           data->color.b,
+                                           data->color.a);
+
+        item = _eext_circle_object_item_get(obj, GENLIST_BG_ITEM_NAME);
+        _eext_circle_object_item_color_set(item,
+                                           data->bg_color.r,
+                                           data->bg_color.g,
+                                           data->bg_color.b,
+                                           data->bg_color.a);
+
+        eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
+        eext_rotary_object_event_callback_add(obj->image_widget, _rotary_changed_cb, obj);
+     }
+}
+
+static void
+_eext_circle_object_genlist_init(Eext_Circle_Object *obj, Evas_Object *genlist)
+{
+   Eext_Circle_Object_Genlist_Data *data;
+   Eext_Circle_Object_Item *item;
+
+   obj->widget_type = EEXT_CIRCLE_OBJECT_GENLIST_TYPE;
+   obj->del_func = _eext_circle_object_genlist_del_cb;
+   obj->disabled_func = _eext_circle_object_genlist_disabled_cb;
+   obj->color_changed_func = _eext_circle_object_genlist_color_changed_cb;
+
+   data = (Eext_Circle_Object_Genlist_Data *)calloc(1, sizeof(Eext_Circle_Object_Genlist_Data));
+   data->policy_v = ELM_SCROLLER_POLICY_AUTO;
+   data->color.r = SCROLL_BAR_COLOR_R;
+   data->color.g = SCROLL_BAR_COLOR_G;
+   data->color.b = SCROLL_BAR_COLOR_B;
+   data->color.a = SCROLL_BAR_COLOR_A;
+   data->bg_color.r = SCROLL_BAR_BG_COLOR_R;
+   data->bg_color.g = SCROLL_BAR_BG_COLOR_G;
+   data->bg_color.b = SCROLL_BAR_BG_COLOR_B;
+   data->bg_color.a = SCROLL_BAR_BG_COLOR_A;
+   data->disabled_color.r = SCROLL_BAR_COLOR_DISABLED_R;
+   data->disabled_color.g = SCROLL_BAR_COLOR_DISABLED_G;
+   data->disabled_color.b = SCROLL_BAR_COLOR_DISABLED_B;
+   data->disabled_color.a = SCROLL_BAR_COLOR_DISABLED_A;
+   data->disabled_bg_color.r = SCROLL_BAR_BG_COLOR_DISABLED_R;
+   data->disabled_bg_color.g = SCROLL_BAR_BG_COLOR_DISABLED_G;
+   data->disabled_bg_color.b = SCROLL_BAR_BG_COLOR_DISABLED_B;
+   data->disabled_bg_color.a = SCROLL_BAR_BG_COLOR_DISABLED_A;
+   obj->widget_data = (void *)data;
+
+   item = _eext_circle_object_item_new();
+   _eext_circle_object_item_name_set(item, GENLIST_BG_ITEM_NAME);
+   _eext_circle_object_item_color_set(item,
+                                      data->bg_color.r,
+                                      data->bg_color.g,
+                                      data->bg_color.b,
+                                      data->bg_color.a);
+   _eext_circle_object_item_line_width_set(item, VERTICAL_BAR_WIDTH_SIZE);
+   _eext_circle_object_item_radius_set(item, VERTICAL_BAR_RADIUS_SIZE);
+   _eext_circle_object_item_angle_set(item, VERTICAL_BAR_ANGLE_RANGE);
+   _eext_circle_object_item_angle_offset_set(item, VERTICAL_BAR_ANGLE_START);
+   _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE);
+   _eext_circle_object_item_append(obj, item);
+
+   item = _eext_circle_object_item_new();
+   _eext_circle_object_item_name_set(item, GENLIST_ITEM_NAME);
+   _eext_circle_object_item_color_set(item,
+                                      data->color.r,
+                                      data->color.g,
+                                      data->color.b,
+                                      data->color.a);
+   _eext_circle_object_item_line_width_set(item, VERTICAL_BAR_WIDTH_SIZE);
+   _eext_circle_object_item_radius_set(item, VERTICAL_BAR_RADIUS_SIZE);
+   _eext_circle_object_item_angle_offset_set(item, VERTICAL_BAR_ANGLE_START);
+   _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE);
+   _eext_circle_object_item_append(obj, item);
+
+   elm_scroller_policy_set(obj->widget_object, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+   evas_object_event_callback_add(obj->widget_object, EVAS_CALLBACK_SHOW, _eext_circle_object_genlist_show_cb, obj);
+   evas_object_smart_callback_add(obj->widget_object, "scroll", _eext_circle_object_genlist_scroll_cb, obj);
+   eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
+   eext_rotary_object_event_callback_add(obj->image_widget, _rotary_changed_cb, obj);
+}
+
+EAPI Evas_Object *
+eext_circle_object_genlist_add(Evas_Object *genlist, Eext_Circle_Surface *surface)
+{
+   Evas_Object *obj;
+
+   if (!genlist) return NULL;
+
+   obj = elm_image_add(genlist);
+   _eext_circle_object_init(obj, genlist, surface);
+
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
+
+   _eext_circle_object_genlist_init(circle_obj, genlist);
+
+   return obj;
+}
+
+
+EAPI void
+eext_circle_object_genlist_scroller_policy_set(Evas_Object *obj,
+                                               Elm_Scroller_Policy policy_h,
+                                               Elm_Scroller_Policy policy_v)
+{
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, data)
+     {
+        ERR("Eext_Circle_Object type mismatch: expected type [%s], given type [%s]",
+             EEXT_CIRCLE_OBJECT_GENLIST_TYPE, circle_obj->widget_type);
+        return;
+     }
+
+   if ((policy_h >= ELM_SCROLLER_POLICY_LAST) ||
+       (policy_v >= ELM_SCROLLER_POLICY_LAST))
+     return;
+
+   data->policy_h = policy_h;
+   data->policy_v = policy_v;
+
+   if (data->policy_v == ELM_SCROLLER_POLICY_ON)
+     {
+        _eext_circle_object_genlist_scrollbar_update(circle_obj);
+        _eext_circle_object_genlist_scrollbar_show(circle_obj,
+                                                   VERTICAL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING);
+     }
+}
+
+EAPI void
+eext_circle_object_genlist_scroller_policy_get(const Evas_Object *obj,
+                                               Elm_Scroller_Policy *policy_h,
+                                               Elm_Scroller_Policy *policy_v)
+{
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj)
+     {
+        if (policy_h) *policy_h = ELM_SCROLLER_POLICY_AUTO;
+        if (policy_v) *policy_v = ELM_SCROLLER_POLICY_AUTO;
+        return;
+     }
+
+   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, data)
+     {
+        ERR("Eext_Circle_Object type mismatch: expected type [%s], given type [%s]",
+             EEXT_CIRCLE_OBJECT_GENLIST_TYPE, circle_obj->widget_type);
+        if (policy_h) *policy_h = ELM_SCROLLER_POLICY_AUTO;
+        if (policy_v) *policy_v = ELM_SCROLLER_POLICY_AUTO;
+        return;
+     }
+
+   if (policy_h) *policy_h = data->policy_h;
+   if (policy_v) *policy_v = data->policy_v;
+}
diff --git a/src/wearable/circle/efl_extension_circle_object_item.c b/src/wearable/circle/efl_extension_circle_object_item.c
new file mode 100644 (file)
index 0000000..82f4437
--- /dev/null
@@ -0,0 +1,942 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "efl_extension.h"
+#include "efl_extension_private.h"
+#include "circle/efl_extension_circle_private.h"
+
+static void _eext_circle_object_item_color_transit_animator_del(Eext_Circle_Object_Item *item);
+static void _eext_circle_object_item_angle_transit_animator_del(Eext_Circle_Object_Item *item);
+
+static Eina_Bool
+_eext_circle_object_item_color_transit_animator_cb(void *data, double pos)
+{
+   Eext_Circle_Object_Item *item = (Eext_Circle_Object_Item *)data;
+   int diff_r, diff_g, diff_b, diff_a;
+   double mapped_pos;
+
+   diff_r = item->color_transit.from_color.r - item->color.r;
+   diff_g = item->color_transit.from_color.g - item->color.g;
+   diff_b = item->color_transit.from_color.b - item->color.b;
+   diff_a = item->color_transit.from_color.a - item->color.a;
+
+   item->color_transit.current_animator_pos = pos;
+
+   if (item->color_transit.cubic_bezier_enabled)
+     mapped_pos = ecore_animator_pos_map_n(pos,
+                                           ECORE_POS_MAP_CUBIC_BEZIER,
+                                           4,
+                                           item->color_transit.cubic_bezier_v);
+   else
+     mapped_pos = pos;
+
+   item->draw.color.r = item->color_transit.from_color.r - diff_r * mapped_pos;
+   item->draw.color.g = item->color_transit.from_color.g - diff_g * mapped_pos;
+   item->draw.color.b = item->color_transit.from_color.b - diff_b * mapped_pos;
+   item->draw.color.a = item->color_transit.from_color.a - diff_a * mapped_pos;
+
+   _eext_circle_object_changed(item->obj);
+
+   if (pos >= 1.0)
+     {
+        _eext_circle_object_item_color_transit_animator_del(item);
+        return ECORE_CALLBACK_CANCEL;
+     }
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+static Eina_Bool
+_eext_circle_object_item_angle_transit_animator_cb(void *data, double pos)
+{
+   Eext_Circle_Object_Item *item = (Eext_Circle_Object_Item *)data;
+   double diff_angle, diff_angle_offset;
+   double mapped_pos;
+
+   diff_angle = item->angle_transit.from_angle - item->angle;
+   diff_angle_offset =
+      item->angle_transit.from_angle_offset - item->angle_offset;
+
+   item->angle_transit.current_animator_pos = pos;
+
+   if (item->angle_transit.cubic_bezier_enabled)
+     mapped_pos = ecore_animator_pos_map_n(pos,
+                                           ECORE_POS_MAP_CUBIC_BEZIER,
+                                           4,
+                                           item->angle_transit.cubic_bezier_v);
+   else
+     mapped_pos = pos;
+
+   item->draw.angle = item->angle_transit.from_angle - diff_angle * mapped_pos;
+   item->draw.angle_offset = item->angle_transit.from_angle_offset - diff_angle_offset * mapped_pos;
+
+   _eext_circle_object_changed(item->obj);
+
+   if (pos >= 1.0)
+     {
+        _eext_circle_object_item_angle_transit_animator_del(item);
+        return ECORE_CALLBACK_CANCEL;
+     }
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+static Eina_Bool
+_eext_circle_object_item_angle_set_internal(Eext_Circle_Object_Item *item, double angle)
+{
+   double temp_angle;
+
+   if (item->angle == angle) return EINA_FALSE;
+
+   temp_angle = angle;
+
+   if (angle < item->min_angle) temp_angle = item->min_angle;
+   if (angle > item->max_angle) temp_angle = item->max_angle;
+
+   if (item->angle == temp_angle) return EINA_FALSE;
+
+   item->angle = temp_angle;
+   item->value = _eext_circle_object_item_angle_value_get(item, item->angle);
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_eext_circle_object_item_angle_offset_set_internal(Eext_Circle_Object_Item *item, double angle_offset)
+{
+   if (item->angle_offset == angle_offset) return EINA_FALSE;
+
+   item->angle_offset = angle_offset;
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_eext_circle_object_item_value_set_internal(Eext_Circle_Object_Item *item, double value)
+{
+   double angle;
+
+   if (item->value == value) return EINA_FALSE;
+
+   item->value = value;
+
+   if (item->value < item->min_value) item->value = item->min_value;
+   if (item->value > item->max_value) item->value = item->max_value;
+
+   angle = _eext_circle_object_item_value_angle_get(item, item->value);
+
+   if (item->angle == angle) return EINA_FALSE;
+
+   item->angle = angle;
+
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_eext_circle_object_item_color_set_internal(Eext_Circle_Object_Item *item,
+                                            int r, int g, int b, int a)
+{
+   if (r > 255) r = 255; if (r < 0) r = 0;
+   if (g > 255) g = 255; if (g < 0) g = 0;
+   if (b > 255) b = 255; if (b < 0) b = 0;
+   if (a > 255) a = 255; if (a < 0) a = 0;
+
+   if ((item->color.r == r) && (item->color.g == g) && (item->color.b == b) && (item->color.a == a))
+     return EINA_FALSE;
+
+   item->color.r = r;
+   item->color.g = g;
+   item->color.b = b;
+   item->color.a = a;
+
+   return EINA_TRUE;
+}
+
+static void
+_eext_circle_object_item_color_transit_animator_del(Eext_Circle_Object_Item *item)
+{
+   if (!item) return;
+
+   if (item->color_transit.animator_cb)
+     ecore_animator_del(item->color_transit.animator_cb);
+
+   item->color_transit.animator_cb = NULL;
+}
+
+static void
+_eext_circle_object_item_angle_transit_animator_del(Eext_Circle_Object_Item *item)
+{
+   if (!item) return;
+
+   if (item->angle_transit.animator_cb)
+     ecore_animator_del(item->angle_transit.animator_cb);
+
+   item->angle_transit.animator_cb = NULL;
+}
+
+static Eina_Bool
+_eext_circle_object_item_angle_transit_set_internal(Eext_Circle_Object_Item *item, double duration,
+                                                    double to_angle, double to_angle_offset,
+                                                    Eina_Bool cubic_bezier_enabled,
+                                                    double cubic_bezier_p1_x, double cubic_bezier_p1_y,
+                                                    double cubic_bezier_p2_x, double cubic_bezier_p2_y)
+{
+   if (duration == 0.0) return EINA_FALSE;
+   if ((item->angle_transit.duration == duration) &&
+       (item->angle == to_angle) &&
+       (item->angle_offset == to_angle_offset))
+     return EINA_FALSE;
+
+   if (item->angle_transit.animator_cb)
+     {
+        _eext_circle_object_item_angle_transit_animator_del(item);
+
+        // If previous animator is never excuted, run animator callback manually once.
+        if (item->angle_transit.current_animator_pos == 0.0)
+          {
+             double current_time = ecore_time_unix_get();
+
+             if (item->angle_transit.start_time != current_time)
+               {
+                  double pos = (current_time - item->angle_transit.start_time) /
+                     item->angle_transit.duration;
+
+                  _eext_circle_object_item_angle_transit_animator_cb(item, pos);
+               }
+          }
+     }
+
+   _eext_circle_object_item_angle_set_internal(item, to_angle);
+   _eext_circle_object_item_angle_offset_set_internal(item, to_angle_offset);
+
+   item->angle_transit.start_time = ecore_time_unix_get();
+   item->angle_transit.current_animator_pos = 0.0;
+   item->angle_transit.duration = duration;
+   item->angle_transit.from_angle = item->draw.angle;
+   item->angle_transit.from_angle_offset = item->draw.angle_offset;
+   item->angle_transit.cubic_bezier_enabled = cubic_bezier_enabled;
+
+   if (cubic_bezier_enabled)
+     {
+        item->angle_transit.cubic_bezier_v[0] = cubic_bezier_p1_x;
+        item->angle_transit.cubic_bezier_v[1] = cubic_bezier_p1_y;
+        item->angle_transit.cubic_bezier_v[2] = cubic_bezier_p2_x;
+        item->angle_transit.cubic_bezier_v[3] = cubic_bezier_p2_y;
+     }
+
+   item->angle_transit.animator_cb = ecore_animator_timeline_add(duration,
+                                                                 _eext_circle_object_item_angle_transit_animator_cb,
+                                                                 item);
+
+   return EINA_TRUE;
+}
+
+//////////////////////////////
+// Internal API //////////////
+//////////////////////////////
+double
+_eext_circle_object_item_value_angle_get(const Eext_Circle_Object_Item *item, double value)
+{
+   double angle;
+
+   angle = item->min_angle;
+   if (item->max_value != item->min_value)
+     angle += (value - item->min_value) * (item->max_angle - item->min_angle) / (item->max_value - item->min_value);
+
+   if (angle < item->min_angle) angle = item->min_angle;
+   if (angle > item->max_angle) angle = item->max_angle;
+
+   return angle;
+}
+
+double
+_eext_circle_object_item_angle_value_get(const Eext_Circle_Object_Item *item, double angle)
+{
+   double value;
+
+   value = item->min_value;
+   if (item->max_angle != item->min_angle)
+     value += (angle - item->min_angle) * (item->max_value - item->min_value) / (item->max_angle - item->min_angle);
+
+   if (value < item->min_value) value = item->min_value;
+   if (value > item->max_value) value = item->max_value;
+
+   return value;
+}
+
+const char *
+_eext_circle_text_font_get(const char *text, const char *font_family)
+{
+   FcFontSet *set = NULL;
+   FcPattern *p_nm = NULL;
+   FcCharSet *c_set = NULL;
+   FcValue family;
+   FcResult result;
+   Eina_Unicode u_str;
+   int u_str_index = 0;
+
+   if (!text || !font_family)
+     return NULL;
+
+   // Going to use first character.
+   u_str = eina_unicode_utf8_next_get(text, &u_str_index);
+
+   // Query font using FontConfig.
+   c_set = FcCharSetCreate();
+   p_nm = FcPatternBuild (NULL,
+                          FC_WEIGHT, FcTypeInteger, FC_WEIGHT_NORMAL,
+                          FC_SLANT,  FcTypeInteger, FC_SLANT_ROMAN,
+                          FC_WIDTH,  FcTypeInteger, FC_WIDTH_NORMAL,
+                          NULL);
+
+   FcCharSetAddChar(c_set, (FcChar32)u_str);
+   FcPatternAddCharSet(p_nm, FC_CHARSET, c_set);
+   FcPatternAddString(p_nm, FC_FAMILY, (FcChar8 *)font_family);
+   FcConfigSubstitute(NULL, p_nm, FcMatchPattern);
+   FcDefaultSubstitute(p_nm);
+   set = FcFontSort(NULL, p_nm, FcTrue, NULL, &result);
+
+   FcCharSetDestroy(c_set);
+   FcPatternDestroy(p_nm);
+
+   result = FcPatternGet(set->fonts[0], FC_FAMILY, 0, &family);
+   FcFontSetSortDestroy(set);
+
+   if (result == FcResultNoMatch)
+     {
+        ERR("Fail to Load Family Name to draw %s [%X]", text, u_str);
+        return NULL;
+     }
+
+   return (const char *)family.u.s;
+}
+
+Eext_Circle_Object_Item *
+_eext_circle_object_item_new(void)
+{
+   Eext_Circle_Object_Item *item;
+
+   item = (Eext_Circle_Object_Item *)calloc(1, sizeof(Eext_Circle_Object_Item));
+
+   // Initialize...
+   item->name = eina_stringshare_add("default");
+   item->angle = item->draw.angle = 0.0;
+   item->angle_offset = item->draw.angle_offset = 0.0;
+   item->min_angle = 0;
+   item->max_angle = 360;
+   item->min_value = 0;
+   item->max_value = 360;
+   item->radius = 176;
+   item->line_width = 8;
+   item->color.r = item->draw.color.r = 102;
+   item->color.g = item->draw.color.g = 179;
+   item->color.b = item->draw.color.b = 230;
+   item->color.a = item->draw.color.a = 255;
+
+   return item;
+}
+
+void
+_eext_circle_object_item_free(Eext_Circle_Object_Item *item)
+{
+   if (!item) return;
+
+   eina_stringshare_del(item->name);
+
+   if (item->color_transit.animator_cb)
+     _eext_circle_object_item_color_transit_animator_del(item);
+
+   if (item->angle_transit.animator_cb)
+     _eext_circle_object_item_angle_transit_animator_del(item);
+
+   if (item->obj)
+     _eext_circle_object_item_remove(item);
+
+   free(item);
+}
+
+void
+_eext_circle_object_item_append(Eext_Circle_Object *obj, Eext_Circle_Object_Item *item)
+{
+   if (!obj || !item) return;
+
+   if (obj == item->obj)
+     {
+        ERR("You are trying to append the item that is already appended");
+        return;
+     }
+
+   if (item->obj)
+     {
+        ERR("You are trying to append the item that is already appended to the other object!");
+        return;
+     }
+
+   obj->items = eina_list_append(obj->items, item);
+   item->obj = obj;
+
+   _eext_circle_object_changed(item->obj);
+}
+
+void
+_eext_circle_object_item_prepend(Eext_Circle_Object *obj, Eext_Circle_Object_Item *item)
+{
+   if (!obj || !item) return;
+
+   if (obj == item->obj)
+     {
+        ERR("You are trying to append the item that is already appended");
+        return;
+     }
+
+   if (item->obj)
+     {
+        ERR("You are trying to append the item that is already appended to the other object!");
+        return;
+     }
+
+   obj->items = eina_list_prepend(obj->items, item);
+   item->obj = obj;
+
+   _eext_circle_object_changed(item->obj);
+}
+
+void
+_eext_circle_object_item_insert_before(Eext_Circle_Object *obj, Eext_Circle_Object *before, Eext_Circle_Object_Item *item)
+{
+   if (!obj || !item) return;
+
+   if (obj == item->obj)
+     {
+        ERR("You are trying to append the item that is already appended");
+        return;
+     }
+
+   if (item->obj)
+     {
+        ERR("You are trying to append the item that is already appended to the other object!");
+        return;
+     }
+
+   if (!before) _eext_circle_object_item_prepend(obj, item);
+
+   obj->items = eina_list_prepend_relative(obj->items, item, before);
+   item->obj = obj;
+
+   _eext_circle_object_changed(item->obj);
+}
+
+void
+_eext_circle_object_item_insert_after(Eext_Circle_Object *obj, Eext_Circle_Object *after, Eext_Circle_Object_Item *item)
+{
+   if (!obj || !item) return;
+
+   if (obj == item->obj)
+     {
+        ERR("You are trying to append the item that is already appended");
+        return;
+     }
+
+   if (item->obj)
+     {
+        ERR("You are trying to append the item that is already appended to the other object!");
+        return;
+     }
+
+   if (!after) _eext_circle_object_item_append(obj, item);
+
+   obj->items = eina_list_append_relative(obj->items, item, after);
+   item->obj = obj;
+
+   _eext_circle_object_changed(item->obj);
+}
+
+void
+_eext_circle_object_item_remove(Eext_Circle_Object_Item *item)
+{
+   if (!item || !item->obj) return;
+
+   // You must have to free this item.
+   item->obj->items = eina_list_remove(item->obj->items, item);
+
+   _eext_circle_object_changed(item->obj);
+   item->obj = NULL;
+}
+
+void
+_eext_circle_object_item_name_set(Eext_Circle_Object_Item *item, const char *name)
+{
+   if (!item) return;
+
+   if (name)
+     eina_stringshare_replace(&item->name, name);
+   else
+     eina_stringshare_replace(&item->name, "default");
+}
+
+const char *
+_eext_circle_object_item_name_get(const Eext_Circle_Object_Item *item)
+{
+   if (!item) return NULL;
+
+   return item->name;
+}
+
+void
+_eext_circle_object_item_line_width_set(Eext_Circle_Object_Item *item, int line_width)
+{
+   if (!item) return;
+
+   if ((line_width <= 0) || (item->line_width == line_width)) return;
+
+   item->line_width = line_width;
+
+   _eext_circle_object_changed(item->obj);
+}
+
+int
+_eext_circle_object_item_line_width_get(const Eext_Circle_Object_Item *item)
+{
+   if (!item) return -1;
+
+   return item->line_width;
+}
+
+void
+_eext_circle_object_item_angle_set(Eext_Circle_Object_Item *item, double angle)
+{
+   if (!item) return;
+
+   if (item->angle_transit.animator_cb)
+     {
+        _eext_circle_object_item_angle_transit_animator_del(item);
+        item->draw.angle = item->angle;
+        _eext_circle_object_changed(item->obj);
+     }
+
+   if (_eext_circle_object_item_angle_set_internal(item, angle))
+     {
+        item->draw.angle = item->angle;
+        _eext_circle_object_changed(item->obj);
+     }
+}
+
+double
+_eext_circle_object_item_angle_get(const Eext_Circle_Object_Item *item)
+{
+   if (!item) return -1.0;
+
+   return item->angle;
+}
+
+void
+_eext_circle_object_item_angle_offset_set(Eext_Circle_Object_Item *item, double angle_offset)
+{
+   if (!item) return;
+
+   if (_eext_circle_object_item_angle_offset_set_internal(item, angle_offset))
+     {
+        item->draw.angle_offset = item->angle_offset;
+        _eext_circle_object_changed(item->obj);
+     }
+}
+
+double
+_eext_circle_object_item_angle_offset_get(const Eext_Circle_Object_Item *item)
+{
+   if (!item) return -1.0;
+
+   return item->angle_offset;
+}
+
+void
+_eext_circle_object_item_angle_min_max_set(Eext_Circle_Object_Item *item, double min_angle, double max_angle)
+{
+   double angle = 0.0;
+
+   if (!item) return;
+
+   if (item->angle_transit.animator_cb)
+     {
+        _eext_circle_object_item_angle_transit_animator_del(item);
+        item->draw.angle = item->angle;
+        _eext_circle_object_changed(item->obj);
+     }
+
+   if ((item->min_angle == min_angle) && (item->max_angle == max_angle)) return;
+
+   item->min_angle = min_angle;
+   item->max_angle = max_angle;
+
+   if (item->angle < item->min_angle) angle = item->min_angle;
+   if (item->angle > item->max_angle) angle = item->max_angle;
+
+   if (item->angle == angle) return;
+
+   item->angle = angle;
+   item->value = _eext_circle_object_item_angle_value_get(item, item->angle);
+   item->draw.angle = item->angle;
+
+   _eext_circle_object_changed(item->obj);
+}
+
+void
+_eext_circle_object_item_angle_min_max_get(const Eext_Circle_Object_Item *item, double *min_angle, double *max_angle)
+{
+   if (!item)
+     {
+        if (min_angle) *min_angle = 0.0;
+        if (max_angle) *max_angle = 0.0;
+
+        return;
+     }
+
+   if (min_angle) *min_angle = item->min_angle;
+   if (max_angle) *max_angle = item->max_angle;
+}
+
+void
+_eext_circle_object_item_value_min_max_set(Eext_Circle_Object_Item *item, double min_value, double max_value)
+{
+   double angle;
+
+   if (!item) return;
+
+   if (item->angle_transit.animator_cb)
+     {
+        _eext_circle_object_item_angle_transit_animator_del(item);
+        item->draw.angle = item->angle;
+        _eext_circle_object_changed(item->obj);
+     }
+
+   if ((item->min_value == min_value) && (item->max_value == max_value)) return;
+
+   item->min_value = min_value;
+   item->max_value = max_value;
+
+   if (item->value < item->min_value) item->value = item->min_value;
+   if (item->value > item->max_value) item->value = item->max_value;
+
+   angle = _eext_circle_object_item_value_angle_get(item, item->value);
+
+   if (item->angle == angle) return;
+
+   item->angle = angle;
+   item->draw.angle = item->angle;
+
+   _eext_circle_object_changed(item->obj);
+}
+
+void
+_eext_circle_object_item_value_min_max_get(const Eext_Circle_Object_Item *item, double *min_value, double *max_value)
+{
+   if (!item)
+     {
+        if (min_value) *min_value = 0.0;
+        if (max_value) *max_value = 0.0;
+
+        return;
+     }
+
+   if (min_value) *min_value = item->min_value;
+   if (max_value) *max_value = item->max_value;
+}
+
+void
+_eext_circle_object_item_value_set(Eext_Circle_Object_Item *item, double value)
+{
+   if (!item) return;
+
+   if (item->angle_transit.animator_cb)
+     {
+        _eext_circle_object_item_angle_transit_animator_del(item);
+        item->draw.angle = item->angle;
+        _eext_circle_object_changed(item->obj);
+     }
+
+   if (_eext_circle_object_item_value_set_internal(item, value))
+     {
+        item->draw.angle = item->angle;
+        _eext_circle_object_changed(item->obj);
+     }
+}
+
+double
+_eext_circle_object_item_value_get(const Eext_Circle_Object_Item *item)
+{
+   if (!item) return -1.0;
+
+   return item->value;
+}
+
+void
+_eext_circle_object_item_color_set(Eext_Circle_Object_Item *item,
+                                   int r, int g, int b, int a)
+{
+   if (!item) return;
+
+   if (item->color_transit.animator_cb)
+     {
+        _eext_circle_object_item_color_transit_animator_del(item);
+        item->draw.color.r = item->color.r;
+        item->draw.color.g = item->color.g;
+        item->draw.color.b = item->color.b;
+        item->draw.color.a = item->color.a;
+
+        _eext_circle_object_changed(item->obj);
+     }
+
+   if (_eext_circle_object_item_color_set_internal(item, r, g, b, a))
+     {
+        item->draw.color.r = item->color.r;
+        item->draw.color.g = item->color.g;
+        item->draw.color.b = item->color.b;
+        item->draw.color.a = item->color.a;
+
+        _eext_circle_object_changed(item->obj);
+     }
+}
+
+void
+_eext_circle_object_item_color_get(const Eext_Circle_Object_Item *item,
+                                   int *r, int *g, int *b, int *a)
+{
+   if (!item)
+     {
+        if (r) *r = 0;
+        if (g) *g = 0;
+        if (b) *b = 0;
+        if (a) *a = 0;
+
+        return;
+     }
+
+   if (r) *r = item->color.r;
+   if (g) *g = item->color.g;
+   if (b) *b = item->color.b;
+   if (a) *a = item->color.a;
+}
+
+void
+_eext_circle_object_item_radius_set(Eext_Circle_Object_Item *item, double radius)
+{
+   if (!item) return;
+
+   if (radius < 0.0) radius = 0.0; if (radius > 180.0) radius = 180.0;
+
+   if (item->radius == radius) return;
+
+   item->radius = radius;
+
+   _eext_circle_object_changed(item->obj);
+}
+
+double
+_eext_circle_object_item_radius_get(const Eext_Circle_Object_Item *item)
+{
+   if (!item) return -1.0;
+
+   return item->radius;
+}
+
+void
+_eext_circle_object_item_text_set(Eext_Circle_Object_Item *item,
+                                  const char *text,
+                                  const char *font)
+{
+   const char *selected_font;
+
+   if (!item) return;
+
+   if (font)
+     eina_stringshare_replace(&item->font, font);
+   else
+     eina_stringshare_replace(&item->font, "Tizen");
+
+   eina_stringshare_replace(&item->text, text);
+
+   selected_font = _eext_circle_text_font_get(item->text, item->font);
+
+   if (!selected_font)
+     {
+        ERR("There is no font for the text: %s", text);
+     }
+
+   eina_stringshare_replace(&item->selected_font, selected_font);
+
+   _eext_circle_object_changed(item->obj);
+}
+
+void
+_eext_circle_object_item_text_get(const Eext_Circle_Object_Item *item,
+                                  const char **text,
+                                  const char **font)
+{
+   if (!item)
+     {
+        if (text) *text = NULL;
+        if (font) *font = NULL;
+
+        return;
+     }
+
+   if (text) *text = item->text;
+   if (font) *font = item->font;
+}
+
+void
+_eext_circle_object_item_font_size_set(Eext_Circle_Object_Item *item,
+                                       int font_size)
+{
+   if (!item) return;
+
+   if (item->font_size == font_size) return;
+
+   item->font_size = font_size;
+
+   _eext_circle_object_changed(item->obj);
+}
+
+int
+_eext_circle_object_item_font_size_get(const Eext_Circle_Object_Item *item)
+{
+   if (!item) return -1;
+
+   return item->font_size;
+}
+
+void
+_eext_circle_object_item_color_transit_set(Eext_Circle_Object_Item *item, double duration,
+                                           int to_r, int to_g, int to_b, int to_a,
+                                           Eina_Bool cubic_bezier_enabled,
+                                           double cubic_bezier_p1_x, double cubic_bezier_p1_y,
+                                           double cubic_bezier_p2_x, double cubic_bezier_p2_y)
+{
+   if (!item) return;
+
+   if (duration == 0.0) return;
+   if ((item->color_transit.duration == duration) &&
+       (item->color.r == to_r) && (item->color.g == to_g) && (item->color.b == to_b) && (item->color.a == to_a))
+     return;
+
+   if (item->color_transit.animator_cb)
+     {
+        _eext_circle_object_item_color_transit_animator_del(item);
+
+        if (item->color_transit.current_animator_pos == 0.0)
+          {
+             double current_time = ecore_time_unix_get();
+
+             if (item->color_transit.start_time != current_time)
+               {
+                  double pos = (current_time - item->color_transit.start_time) /
+                     item->color_transit.duration;
+
+                  _eext_circle_object_item_color_transit_animator_cb(item, pos);
+               }
+          }
+     }
+
+   _eext_circle_object_item_color_set_internal(item, to_r, to_g, to_b, to_a);
+
+   item->color_transit.start_time = ecore_time_unix_get();
+   item->color_transit.current_animator_pos = 0.0;
+   item->color_transit.duration = duration;
+   item->color_transit.from_color.r = item->draw.color.r;
+   item->color_transit.from_color.g = item->draw.color.g;
+   item->color_transit.from_color.b = item->draw.color.b;
+   item->color_transit.from_color.a = item->draw.color.a;
+   item->color_transit.cubic_bezier_enabled = cubic_bezier_enabled;
+
+   if (cubic_bezier_enabled)
+     {
+        item->color_transit.cubic_bezier_v[0] = cubic_bezier_p1_x;
+        item->color_transit.cubic_bezier_v[1] = cubic_bezier_p1_y;
+        item->color_transit.cubic_bezier_v[2] = cubic_bezier_p2_x;
+        item->color_transit.cubic_bezier_v[3] = cubic_bezier_p2_y;
+     }
+
+   item->color_transit.animator_cb = ecore_animator_timeline_add(duration,
+                                                                 _eext_circle_object_item_color_transit_animator_cb,
+                                                                 item);
+}
+
+
+void
+_eext_circle_object_item_angle_transit_set(Eext_Circle_Object_Item *item, double duration,
+                                           double to_angle, double to_angle_offset,
+                                           Eina_Bool cubic_bezier_enabled,
+                                           double cubic_bezier_p1_x, double cubic_bezier_p1_y,
+                                           double cubic_bezier_p2_x, double cubic_bezier_p2_y)
+{
+   Eina_Bool ret;
+
+   if (!item) return;
+
+   ret = _eext_circle_object_item_angle_transit_set_internal(item, duration,
+                                                             to_angle, to_angle_offset,
+                                                             cubic_bezier_enabled,
+                                                             cubic_bezier_p1_x, cubic_bezier_p1_y,
+                                                             cubic_bezier_p2_x, cubic_bezier_p2_y);
+
+   if (ret)
+     item->value = _eext_circle_object_item_angle_value_get(item, item->angle);
+}
+
+void
+_eext_circle_object_item_value_transit_set(Eext_Circle_Object_Item *item, double duration,
+                                           double to_value,
+                                           Eina_Bool cubic_bezier_enabled,
+                                           double cubic_bezier_p1_x, double cubic_bezier_p1_y,
+                                           double cubic_bezier_p2_x, double cubic_bezier_p2_y)
+{
+   Eina_Bool ret;
+   double to_angle, to_angle_offset;
+
+   if (!item) return;
+
+   to_angle = _eext_circle_object_item_value_angle_get(item, to_value);
+   to_angle_offset = item->angle_offset;
+
+   ret = _eext_circle_object_item_angle_transit_set_internal(item, duration,
+                                                             to_angle, to_angle_offset,
+                                                             cubic_bezier_enabled,
+                                                             cubic_bezier_p1_x, cubic_bezier_p1_y,
+                                                             cubic_bezier_p2_x, cubic_bezier_p2_y);
+
+   if (ret)
+     item->value = to_value;
+}
+
+void
+_eext_circle_object_item_round_cap_enable_set(Eext_Circle_Object_Item *item, Eina_Bool enable)
+{
+   if (!item) return;
+
+   if (item->round_cap == enable) return;
+
+   item->round_cap = enable;
+
+   _eext_circle_object_changed(item->obj);
+}
+
+Eina_Bool
+_eext_circle_object_item_round_cap_enable_get(const Eext_Circle_Object_Item *item)
+{
+   if (!item) return -1;
+
+   return item->round_cap;
+}
diff --git a/src/wearable/circle/efl_extension_circle_object_progressbar.c b/src/wearable/circle/efl_extension_circle_object_progressbar.c
new file mode 100644 (file)
index 0000000..ec85a99
--- /dev/null
@@ -0,0 +1,230 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "efl_extension.h"
+#include "efl_extension_private.h"
+#include "circle/efl_extension_circle_private.h"
+
+#define EEXT_CIRCLE_OBJECT_PROGRESSBAR_TYPE "Eext_Circle_Progressbar"
+
+#define EEXT_CIRCLE_OBJECT_PROGRESSBAR_DATA_GET(circle_obj, data) \
+      Eext_Circle_Object_Progressbar_Data *data = NULL; \
+   if (circle_obj && circle_obj->widget_data && \
+              circle_obj->widget_type && !strcmp(circle_obj->widget_type, EEXT_CIRCLE_OBJECT_PROGRESSBAR_TYPE)) \
+      data = (Eext_Circle_Object_Progressbar_Data *)circle_obj->widget_data; \
+   if (!data)
+
+#define PROGRESSBAR_ITEM_NAME "default"
+#define PROGRESSBAR_BG_ITEM_NAME "bg"
+
+#define PROGRESSBAR_COLOR_R 77
+#define PROGRESSBAR_COLOR_G 207
+#define PROGRESSBAR_COLOR_B 255
+#define PROGRESSBAR_COLOR_A 255
+
+#define PROGRESSBAR_BG_COLOR_R 0
+#define PROGRESSBAR_BG_COLOR_G 67
+#define PROGRESSBAR_BG_COLOR_B 115
+#define PROGRESSBAR_BG_COLOR_A 255
+
+#define PROGRESSBAR_COLOR_DISABLED_R 77
+#define PROGRESSBAR_COLOR_DISABLED_G 207
+#define PROGRESSBAR_COLOR_DISABLED_B 255
+#define PROGRESSBAR_COLOR_DISABLED_A 153
+
+#define PROGRESSBAR_BG_COLOR_DISABLED_R 64
+#define PROGRESSBAR_BG_COLOR_DISABLED_G 64
+#define PROGRESSBAR_BG_COLOR_DISABLED_B 64
+#define PROGRESSBAR_BG_COLOR_DISABLED_A 255
+
+#define PROGRESSBAR_WIDTH_SIZE 8
+#define PROGRESSBAR_RADIUS_SIZE 176
+
+static void
+_eext_circle_object_progressbar_del_cb(Eext_Circle_Object *obj)
+{
+   if (obj->widget_data)
+     {
+        free(obj->widget_data);
+        obj->widget_data = NULL;
+     }
+}
+
+static void
+_eext_circle_object_progressbar_color_changed_cb(Eext_Circle_Object *obj, const char *item_name)
+{
+   Eext_Circle_Object_Item *item;
+   int r, g, b, a;
+
+   EEXT_CIRCLE_OBJECT_PROGRESSBAR_DATA_GET(obj, widget_data) return;
+
+   item = _eext_circle_object_item_get(obj, item_name);
+   if (!item) return;
+
+   _eext_circle_object_item_color_get(item, &r, &g, &b, &a);
+
+   if (!strcmp(item_name, PROGRESSBAR_ITEM_NAME))
+     {
+        widget_data->color.r = r;
+        widget_data->color.g = g;
+        widget_data->color.b = b;
+        widget_data->color.a = a;
+
+        return;
+     }
+
+   if (!strcmp(item_name, PROGRESSBAR_BG_ITEM_NAME))
+     {
+        widget_data->bg_color.r = r;
+        widget_data->bg_color.g = g;
+        widget_data->bg_color.b = b;
+        widget_data->bg_color.a = a;
+
+        return;
+     }
+}
+
+static void
+_eext_circle_object_progressbar_disabled_cb(Eext_Circle_Object *obj)
+{
+   Eext_Circle_Object_Item *item, *bg_item;
+
+   EEXT_CIRCLE_OBJECT_PROGRESSBAR_DATA_GET(obj, data) return;
+
+   item = _eext_circle_object_item_get(obj, PROGRESSBAR_ITEM_NAME);
+   bg_item = _eext_circle_object_item_get(obj, PROGRESSBAR_BG_ITEM_NAME);
+
+   if (obj->disabled)
+     {
+        if (item)
+          _eext_circle_object_item_color_set(item,
+                                             data->disabled_color.r,
+                                             data->disabled_color.g,
+                                             data->disabled_color.b,
+                                             data->disabled_color.a);
+        if (bg_item)
+          _eext_circle_object_item_color_set(bg_item,
+                                             data->disabled_bg_color.r,
+                                             data->disabled_bg_color.g,
+                                             data->disabled_bg_color.b,
+                                             data->disabled_bg_color.a);
+     }
+   else
+     {
+        if (item)
+          _eext_circle_object_item_color_set(item,
+                                             data->color.r,
+                                             data->color.g,
+                                             data->color.b,
+                                             data->color.a);
+        if (bg_item)
+          _eext_circle_object_item_color_set(bg_item,
+                                             data->bg_color.r,
+                                             data->bg_color.g,
+                                             data->bg_color.b,
+                                             data->bg_color.a);
+     }
+}
+
+static void
+_eext_circle_object_progressbar_init(Eext_Circle_Object *obj)
+{
+   Eext_Circle_Object_Item *item;
+   Eext_Circle_Object_Progressbar_Data *data;
+
+   obj->widget_object = NULL;
+   obj->widget_type = EEXT_CIRCLE_OBJECT_PROGRESSBAR_TYPE;
+   obj->del_func = _eext_circle_object_progressbar_del_cb;
+   obj->disabled_func = _eext_circle_object_progressbar_disabled_cb;
+   obj->color_changed_func = _eext_circle_object_progressbar_color_changed_cb;
+
+   data = (Eext_Circle_Object_Progressbar_Data *)calloc(1, sizeof(Eext_Circle_Object_Progressbar_Data));
+   data->color.r = PROGRESSBAR_COLOR_R;
+   data->color.g = PROGRESSBAR_COLOR_G;
+   data->color.b = PROGRESSBAR_COLOR_B;
+   data->color.a = PROGRESSBAR_COLOR_A;
+   data->bg_color.r = PROGRESSBAR_BG_COLOR_R;
+   data->bg_color.g = PROGRESSBAR_BG_COLOR_G;
+   data->bg_color.b = PROGRESSBAR_BG_COLOR_B;
+   data->bg_color.a = PROGRESSBAR_BG_COLOR_A;
+   data->disabled_color.r = PROGRESSBAR_COLOR_DISABLED_R;
+   data->disabled_color.g = PROGRESSBAR_COLOR_DISABLED_G;
+   data->disabled_color.b = PROGRESSBAR_COLOR_DISABLED_B;
+   data->disabled_color.a = PROGRESSBAR_COLOR_DISABLED_A;
+   data->disabled_bg_color.r = PROGRESSBAR_BG_COLOR_DISABLED_R;
+   data->disabled_bg_color.g = PROGRESSBAR_BG_COLOR_DISABLED_G;
+   data->disabled_bg_color.b = PROGRESSBAR_BG_COLOR_DISABLED_B;
+   data->disabled_bg_color.a = PROGRESSBAR_BG_COLOR_DISABLED_A;
+   obj->widget_data = (void *)data;
+
+   item = _eext_circle_object_item_new();
+   _eext_circle_object_item_name_set(item, PROGRESSBAR_BG_ITEM_NAME);
+   _eext_circle_object_item_color_set(item, data->bg_color.r, data->bg_color.g, data->bg_color.b, data->bg_color.a);
+   _eext_circle_object_item_radius_set(item, PROGRESSBAR_RADIUS_SIZE);
+   _eext_circle_object_item_line_width_set(item, PROGRESSBAR_WIDTH_SIZE);
+   _eext_circle_object_item_angle_set(item, 360);
+   _eext_circle_object_item_append(obj, item);
+
+   item = _eext_circle_object_item_new();
+   _eext_circle_object_item_name_set(item, PROGRESSBAR_ITEM_NAME);
+   _eext_circle_object_item_color_set(item, data->color.r, data->color.g, data->color.b, data->color.a);
+   _eext_circle_object_item_radius_set(item, PROGRESSBAR_RADIUS_SIZE);
+   _eext_circle_object_item_line_width_set(item, PROGRESSBAR_WIDTH_SIZE);
+   _eext_circle_object_item_append(obj, item);
+}
+
+static char *
+_accessible_name_cb(void *data, Evas_Object *obj)
+{
+   Evas_Object *progressbar;
+   double value;
+   char ret[255];
+
+   progressbar = data;
+   value = eext_circle_object_value_get(progressbar);
+
+   snprintf(ret, sizeof(ret), "%d Percent", (int)value);
+   return strdup(ret);
+}
+
+EAPI Evas_Object *
+eext_circle_object_progressbar_add(Evas_Object *parent, Eext_Circle_Surface *surface)
+{
+   Evas_Object *obj;
+
+   if (!parent) return NULL;
+
+   obj = elm_image_add(parent);
+   _eext_circle_object_init(obj, NULL, surface);
+
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
+
+   _eext_circle_object_progressbar_init(circle_obj);
+
+   /* Accessibility */
+   if (!surface)
+     {
+        elm_atspi_accessible_role_set(obj, ELM_ATSPI_ROLE_PROGRESS_BAR);
+        elm_atspi_accessible_name_cb_set(obj, _accessible_name_cb, obj);
+     }
+   else
+     {
+        elm_atspi_accessible_role_set(parent, ELM_ATSPI_ROLE_PROGRESS_BAR);
+        elm_atspi_accessible_name_cb_set(parent, _accessible_name_cb, obj);
+     }
+
+   return obj;
+}
diff --git a/src/wearable/circle/efl_extension_circle_object_scroller.c b/src/wearable/circle/efl_extension_circle_object_scroller.c
new file mode 100644 (file)
index 0000000..78228b7
--- /dev/null
@@ -0,0 +1,703 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "efl_extension.h"
+#include "efl_extension_private.h"
+#include "circle/efl_extension_circle_private.h"
+
+#define EEXT_CIRCLE_OBJECT_SCROLLER_TYPE "Eext_Circle_Object_Scroller"
+
+#define VERTICAL_BAR_NAME "default"
+#define VERTICAL_BAR_BG_NAME "vertical,scroll,bg"
+#define VERTICAL_BAR_ANGLE_START 60.0
+#define VERTICAL_BAR_ANGLE_RANGE 60.0
+#define VERTICAL_BAR_ANGLE_MAX_SIZE 60.0
+#define VERTICAL_BAR_ANGLE_MIN_SIZE 6.0
+
+#define HORIZONTAL_BAR_NAME "horizontal,scroll,bar"
+#define HORIZONTAL_BAR_BG_NAME "horizontal,scroll,bg"
+#define HORIZONTAL_BAR_ANGLE_START -30.0
+#define HORIZONTAL_BAR_ANGLE_RANGE 60.0
+#define HORIZONTAL_BAR_ANGLE_MAX_SIZE 60.0
+#define HORIZONTAL_BAR_ANGLE_MIN_SIZE 6.0
+
+#define SCROLL_BAR_TRANSIT_TIME 0.2
+#define SCROLL_BAR_HIDE_WAITTING_TIME 10.2
+#define SCROLL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING 1.0
+#define SCROLL_BAR_WIDTH_SIZE 10
+#define SCROLL_BAR_RADIUS_SIZE 174 // (180 - (BAR_WIDTH / 2) - 1)
+
+#define SCROLL_BAR_COLOR_R 14
+#define SCROLL_BAR_COLOR_G 137
+#define SCROLL_BAR_COLOR_B 181
+#define SCROLL_BAR_COLOR_A 255
+
+#define SCROLL_BAR_BG_COLOR_R 250
+#define SCROLL_BAR_BG_COLOR_G 250
+#define SCROLL_BAR_BG_COLOR_B 250
+#define SCROLL_BAR_BG_COLOR_A 38
+
+#define SCROLL_BAR_COLOR_DISABLED_R 45
+#define SCROLL_BAR_COLOR_DISABLED_G 45
+#define SCROLL_BAR_COLOR_DISABLED_B 45
+#define SCROLL_BAR_COLOR_DISABLED_A 255
+
+#define SCROLL_BAR_BG_COLOR_DISABLED_R 45
+#define SCROLL_BAR_BG_COLOR_DISABLED_G 45
+#define SCROLL_BAR_BG_COLOR_DISABLED_B 45
+#define SCROLL_BAR_BG_COLOR_DISABLED_A 63
+
+#define EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, data) \
+   Eext_Circle_Object_Scroller_Data *data = NULL; \
+   if (circle_obj && circle_obj->widget_data && \
+       circle_obj->widget_type && !strcmp(circle_obj->widget_type, EEXT_CIRCLE_OBJECT_SCROLLER_TYPE)) \
+      data = (Eext_Circle_Object_Scroller_Data *)circle_obj->widget_data; \
+   if (!data)
+
+static void
+_eext_circle_object_scroller_color_changed_cb(Eext_Circle_Object *obj, const char *item_name)
+{
+   Eext_Circle_Object_Item *item;
+   int r, g, b, a;
+
+   EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(obj, widget_data) return;
+
+   item = _eext_circle_object_item_get(obj, item_name);
+   if (!item) return;
+
+   _eext_circle_object_item_color_get(item, &r, &g, &b, &a);
+
+   if (!strcmp(item_name, VERTICAL_BAR_NAME))
+     {
+        widget_data->vertical_color.r = r;
+        widget_data->vertical_color.g = g;
+        widget_data->vertical_color.b = b;
+        widget_data->vertical_color.a = a;
+
+        return;
+     }
+
+   if (!strcmp(item_name, VERTICAL_BAR_BG_NAME))
+     {
+        widget_data->vertical_bg_color.r = r;
+        widget_data->vertical_bg_color.g = g;
+        widget_data->vertical_bg_color.b = b;
+        widget_data->vertical_bg_color.a = a;
+
+        return;
+     }
+
+   if (!strcmp(item_name, HORIZONTAL_BAR_NAME))
+     {
+        widget_data->horizontal_color.r = r;
+        widget_data->horizontal_color.g = g;
+        widget_data->horizontal_color.b = b;
+        widget_data->horizontal_color.a = a;
+
+        return;
+     }
+
+   if (!strcmp(item_name, HORIZONTAL_BAR_BG_NAME))
+     {
+        widget_data->horizontal_bg_color.r = r;
+        widget_data->horizontal_bg_color.g = g;
+        widget_data->horizontal_bg_color.b = b;
+        widget_data->horizontal_bg_color.a = a;
+
+        return;
+     }
+}
+
+static Eina_Bool
+_eext_circle_object_scroller_scrollbar_policy_hide_cb(void *data)
+{
+   Eext_Circle_Object *obj = (Eext_Circle_Object *)data;
+   Eext_Circle_Object_Item *item, *bg_item;
+
+   EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(obj, widget_data) return ECORE_CALLBACK_CANCEL;
+
+   if (widget_data->policy_v == ELM_SCROLLER_POLICY_AUTO)
+     {
+        item = _eext_circle_object_item_get(obj, VERTICAL_BAR_NAME);
+        bg_item = _eext_circle_object_item_get(obj, VERTICAL_BAR_BG_NAME);
+
+        _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
+                                                   0, 0, 0, 0,
+                                                   EINA_TRUE,
+                                                   0.25, 0.46, 0.45, 1.0);
+        _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
+                                                   0, 0, 0, 0,
+                                                   EINA_TRUE,
+                                                   0.25, 0.46, 0.45, 1.0);
+     }
+
+   if (widget_data->policy_h == ELM_SCROLLER_POLICY_AUTO)
+     {
+        item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_NAME);
+        bg_item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_BG_NAME);
+
+        _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
+                                                   0, 0, 0, 0,
+                                                   EINA_TRUE,
+                                                   0.25, 0.46, 0.45, 1.0);
+        _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
+                                                   0, 0, 0, 0,
+                                                   EINA_TRUE,
+                                                   0.25, 0.46, 0.45, 1.0);
+     }
+
+   if (widget_data->bar_hide_timer)
+     {
+         ecore_timer_del(widget_data->bar_hide_timer);
+         widget_data->bar_hide_timer = NULL;
+     }
+
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+_eext_circle_object_scroller_scrollbar_update(Eext_Circle_Object *obj,
+                                              double hide_waiting_time)
+{
+   Eext_Circle_Object_Item *item, *bg_item;
+   Evas_Object *scroller = obj->widget_object;
+   Evas_Coord cont_v = 0, cont_h = 0; /* content v/h */
+   Evas_Coord pos_x = 0, pos_y = 0;   /* postion x/y */
+   Evas_Coord vp_v = 0, vp_h = 0;     /* viewport v/h */
+   double bar_pos_v = 0.0, bar_pos_h = 0.0;   /* bar position v/h */
+   double bar_size_v = 0.0, bar_size_h = 0.0; /* bar size v/h */
+
+   EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(obj, data) return;
+
+   elm_scroller_child_size_get(scroller, &cont_h, &cont_v);
+   elm_scroller_region_get(scroller, &pos_y, &pos_x, &vp_h, &vp_v);
+
+   item = _eext_circle_object_item_get(obj, VERTICAL_BAR_NAME);
+   bg_item = _eext_circle_object_item_get(obj, VERTICAL_BAR_BG_NAME);
+
+   if ((cont_v > 0.0) && (vp_v > 0.0) &&
+       (data->policy_v != ELM_SCROLLER_POLICY_OFF))
+     {
+        if (cont_v > vp_v)
+          {
+             bar_size_v = VERTICAL_BAR_ANGLE_RANGE / ((double)cont_v / (double)vp_v);
+
+             if (bar_size_v > VERTICAL_BAR_ANGLE_MAX_SIZE)
+                bar_size_v = VERTICAL_BAR_ANGLE_MAX_SIZE;
+             if (bar_size_v < VERTICAL_BAR_ANGLE_MIN_SIZE)
+                bar_size_v = VERTICAL_BAR_ANGLE_MIN_SIZE;
+          }
+        else
+           bar_size_v = VERTICAL_BAR_ANGLE_MAX_SIZE;
+
+        bar_pos_v = (VERTICAL_BAR_ANGLE_RANGE / (double)cont_v) * (double)pos_x;
+        bar_pos_v += VERTICAL_BAR_ANGLE_START;
+
+        _eext_circle_object_item_angle_offset_set(item, bar_pos_v);
+        _eext_circle_object_item_angle_set(item, bar_size_v);
+
+        if (obj->disabled)
+          {
+             _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
+                                                        data->disabled_color.r,
+                                                        data->disabled_color.g,
+                                                        data->disabled_color.b,
+                                                        data->disabled_color.a,
+                                                        EINA_TRUE,
+                                                        0.25, 0.46, 0.45, 1.0);
+             _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
+                                                        data->disabled_bg_color.r,
+                                                        data->disabled_bg_color.g,
+                                                        data->disabled_bg_color.b,
+                                                        data->disabled_bg_color.a,
+                                                        EINA_TRUE,
+                                                        0.25, 0.46, 0.45, 1.0);
+          }
+        else
+          {
+             _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
+                                                        data->vertical_color.r,
+                                                        data->vertical_color.g,
+                                                        data->vertical_color.b,
+                                                        data->vertical_color.a,
+                                                        EINA_TRUE,
+                                                        0.25, 0.46, 0.45, 1.0);
+             _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
+                                                        data->vertical_bg_color.r,
+                                                        data->vertical_bg_color.g,
+                                                        data->vertical_bg_color.b,
+                                                        data->vertical_bg_color.a,
+                                                        EINA_TRUE,
+                                                        0.25, 0.46, 0.45, 1.0);
+          }
+     }
+   else
+     {
+        _eext_circle_object_item_color_set(item, 0, 0, 0, 0);
+        _eext_circle_object_item_color_set(bg_item, 0, 0, 0, 0);
+     }
+
+   item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_NAME);
+   bg_item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_BG_NAME);
+
+   if ((cont_h > 0.0) && (vp_h > 0.0) &&
+       (data->policy_h != ELM_SCROLLER_POLICY_OFF))
+     {
+        if (cont_h > vp_h)
+          {
+             bar_size_h = HORIZONTAL_BAR_ANGLE_RANGE / ((double)cont_h / (double)vp_h);
+
+             if (bar_size_h > HORIZONTAL_BAR_ANGLE_MAX_SIZE)
+                bar_size_h = HORIZONTAL_BAR_ANGLE_MAX_SIZE;
+             if (bar_size_h < HORIZONTAL_BAR_ANGLE_MIN_SIZE)
+                bar_size_h = HORIZONTAL_BAR_ANGLE_MIN_SIZE;
+          }
+        else
+           bar_size_h = HORIZONTAL_BAR_ANGLE_MAX_SIZE;
+
+        bar_pos_h = (HORIZONTAL_BAR_ANGLE_RANGE / (double)cont_h) * (double)pos_y;
+        bar_pos_h += HORIZONTAL_BAR_ANGLE_START;
+
+        _eext_circle_object_item_angle_offset_set(item, bar_pos_h);
+        _eext_circle_object_item_angle_set(item, bar_size_h);
+
+        if (obj->disabled)
+          {
+             _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
+                                                        data->disabled_color.r,
+                                                        data->disabled_color.g,
+                                                        data->disabled_color.b,
+                                                        data->disabled_color.a,
+                                                        EINA_TRUE,
+                                                        0.25, 0.46, 0.45, 1.0);
+             _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
+                                                        data->disabled_bg_color.r,
+                                                        data->disabled_bg_color.g,
+                                                        data->disabled_bg_color.b,
+                                                        data->disabled_bg_color.a,
+                                                        EINA_TRUE,
+                                                        0.25, 0.46, 0.45, 1.0);
+          }
+        else
+          {
+             _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
+                                                        data->horizontal_color.r,
+                                                        data->horizontal_color.g,
+                                                        data->horizontal_color.b,
+                                                        data->horizontal_color.a,
+                                                        EINA_TRUE,
+                                                        0.25, 0.46, 0.45, 1.0);
+             _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
+                                                        data->horizontal_bg_color.r,
+                                                        data->horizontal_bg_color.g,
+                                                        data->horizontal_bg_color.b,
+                                                        data->horizontal_bg_color.a,
+                                                        EINA_TRUE,
+                                                        0.25, 0.46, 0.45, 1.0);
+          }
+     }
+   else
+     {
+        _eext_circle_object_item_color_set(item, 0, 0, 0, 0);
+        _eext_circle_object_item_color_set(bg_item, 0, 0, 0, 0);
+     }
+
+   if ((hide_waiting_time > 0.0) &&
+       ((data->policy_v == ELM_SCROLLER_POLICY_AUTO) ||
+        (data->policy_h == ELM_SCROLLER_POLICY_AUTO)))
+     {
+        if (data->bar_hide_timer)
+          ecore_timer_del(data->bar_hide_timer);
+
+        data->bar_hide_timer = ecore_timer_add(hide_waiting_time,
+                                               _eext_circle_object_scroller_scrollbar_policy_hide_cb,
+                                               obj);
+     }
+}
+
+static void
+_eext_circle_object_scroller_scroll_cb(void *data,
+                                                 Evas_Object *obj,
+                                                 void *event_info)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+   EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return;
+
+   if ((widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) &&
+       (widget_data->policy_h == ELM_SCROLLER_POLICY_OFF))
+     return;
+
+   _eext_circle_object_scroller_scrollbar_update(circle_obj,
+                                                 SCROLL_BAR_HIDE_WAITTING_TIME);
+}
+
+static void
+_eext_circle_object_scroller_show_cb(void *data,
+                                     Evas *e,
+                                     Evas_Object *obj,
+                                     void *event_info)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+   EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return;
+
+   if ((widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) &&
+       (widget_data->policy_h == ELM_SCROLLER_POLICY_OFF))
+     return;
+
+   _eext_circle_object_scroller_scrollbar_update(circle_obj,
+                                                 SCROLL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING);
+}
+
+static void
+_eext_circle_object_scroller_content_resize_cb(void *data,
+                                               Evas_Object *obj,
+                                               void *event_info)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+   EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return;
+
+   if ((widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) &&
+       (widget_data->policy_h == ELM_SCROLLER_POLICY_OFF))
+     return;
+
+   _eext_circle_object_scroller_scrollbar_update(circle_obj,
+                                                 SCROLL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING);
+}
+
+static Eina_Bool
+_eext_circle_object_scroller_rotary_changed_cb(void *data,
+                                               Evas_Object *obj,
+                                               Eext_Rotary_Event_Info *info)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+   Evas_Object *scroller = circle_obj->widget_object;
+   int h_pagesize, v_pagesize;
+   int cw, ch;
+   int x, y, w, h;
+   int d = (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE) ? 1 : -1;
+   Elm_Scroller_Movement_Block scroller_block;
+   Eina_Bool scroll_locked_x, scroll_locked_y;
+
+   EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return EINA_TRUE;
+
+   if (elm_object_scroll_freeze_get(scroller))
+     return EINA_TRUE;
+
+   elm_scroller_page_size_get(scroller, &h_pagesize, &v_pagesize);
+   elm_scroller_child_size_get(scroller, &cw, &ch);
+   elm_scroller_region_get(scroller, &x, &y, &w, &h);
+
+   scroller_block = elm_scroller_movement_block_get(scroller);
+   scroll_locked_x = elm_object_scroll_lock_x_get(scroller);
+   scroll_locked_y = elm_object_scroll_lock_y_get(scroller);
+
+   if ((h_pagesize > 0) || (v_pagesize > 0))
+     {
+        int h_current_page, v_current_page;
+
+        // Handle scroll per page
+        elm_scroller_current_page_get(scroller, &h_current_page, &v_current_page);
+
+        if (!scroll_locked_y &&
+            !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL) &&
+            (ch > h) && (v_pagesize > 0))
+          {
+             v_current_page += d;
+          }
+        else if (!scroll_locked_x &&
+                 !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL) &&
+                 (cw > w) && (h_pagesize > 0))
+          {
+             h_current_page += d;
+          }
+
+        if (v_current_page < 0) v_current_page = 0;
+        if (h_current_page < 0) h_current_page = 0;
+
+        elm_scroller_page_bring_in(scroller, h_current_page,v_current_page);
+     }
+   else
+     {
+        // Handle scroll
+        if (!scroll_locked_y &&
+            !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL) &&
+            (ch > h))
+          {
+             y += d * widget_data->step_y;
+          }
+        else if (!scroll_locked_x &&
+                 !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL) &&
+                 (cw > w))
+          {
+             x += d * widget_data->step_x;
+          }
+
+        if (y < 0) y = 0;
+        if (x < 0) x = 0;
+
+        elm_scroller_region_bring_in(scroller, x, y, w, h);
+     }
+
+   return EINA_TRUE;
+}
+
+static void
+_eext_circle_object_scroller_del_cb(Eext_Circle_Object *obj)
+{
+   EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(obj, data) return;
+
+   evas_object_event_callback_del_full(obj->widget_object, EVAS_CALLBACK_SHOW, _eext_circle_object_scroller_show_cb, obj);
+   evas_object_smart_callback_del_full(obj->widget_object, "scroll", _eext_circle_object_scroller_scroll_cb, obj);
+   evas_object_smart_callback_del_full(obj->widget_object, "content,resize", _eext_circle_object_scroller_content_resize_cb, obj);
+   eext_rotary_object_event_callback_del(obj->widget_object, _eext_circle_object_scroller_rotary_changed_cb);
+   eext_rotary_object_event_callback_del(obj->image_widget, _eext_circle_object_scroller_rotary_changed_cb);
+
+   if (data->bar_hide_timer)
+     {
+        ecore_timer_del(data->bar_hide_timer);
+        data->bar_hide_timer = NULL;
+     }
+
+   free(obj->widget_data);
+   obj->widget_data = NULL;
+}
+
+static void
+_eext_circle_object_scroller_disabled_cb(Eext_Circle_Object *obj)
+{
+   Eext_Circle_Object_Item *item;
+
+   EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(obj, data) return;
+
+   if (obj->disabled)
+     {
+        item = _eext_circle_object_item_get(obj, VERTICAL_BAR_NAME);
+        _eext_circle_object_item_color_set(item,
+                                           data->disabled_color.r,
+                                           data->disabled_color.g,
+                                           data->disabled_color.b,
+                                           data->disabled_color.a);
+
+        item = _eext_circle_object_item_get(obj, VERTICAL_BAR_BG_NAME);
+        _eext_circle_object_item_color_set(item,
+                                           data->disabled_bg_color.r,
+                                           data->disabled_bg_color.g,
+                                           data->disabled_bg_color.b,
+                                           data->disabled_bg_color.a);
+
+        item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_NAME);
+        _eext_circle_object_item_color_set(item,
+                                           data->disabled_color.r,
+                                           data->disabled_color.g,
+                                           data->disabled_color.b,
+                                           data->disabled_color.a);
+
+        item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_BG_NAME);
+        _eext_circle_object_item_color_set(item,
+                                           data->disabled_bg_color.r,
+                                           data->disabled_bg_color.g,
+                                           data->disabled_bg_color.b,
+                                           data->disabled_bg_color.a);
+
+        eext_rotary_object_event_callback_del(obj->widget_object, _eext_circle_object_scroller_rotary_changed_cb);
+        eext_rotary_object_event_callback_del(obj->image_widget, _eext_circle_object_scroller_rotary_changed_cb);
+     }
+   else
+     {
+        item = _eext_circle_object_item_get(obj, VERTICAL_BAR_NAME);
+        _eext_circle_object_item_color_set(item,
+                                           data->vertical_color.r,
+                                           data->vertical_color.g,
+                                           data->vertical_color.b,
+                                           data->vertical_color.a);
+
+        item = _eext_circle_object_item_get(obj, VERTICAL_BAR_BG_NAME);
+        _eext_circle_object_item_color_set(item,
+                                           data->vertical_bg_color.r,
+                                           data->vertical_bg_color.g,
+                                           data->vertical_bg_color.b,
+                                           data->vertical_bg_color.a);
+
+        item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_NAME);
+        _eext_circle_object_item_color_set(item,
+                                           data->horizontal_color.r,
+                                           data->horizontal_color.g,
+                                           data->horizontal_color.b,
+                                           data->horizontal_color.a);
+
+        item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_BG_NAME);
+        _eext_circle_object_item_color_set(item,
+                                           data->horizontal_bg_color.r,
+                                           data->horizontal_bg_color.g,
+                                           data->horizontal_bg_color.b,
+                                           data->horizontal_bg_color.a);
+
+        eext_rotary_object_event_callback_add(obj->widget_object, _eext_circle_object_scroller_rotary_changed_cb, obj);
+        eext_rotary_object_event_callback_add(obj->image_widget, _eext_circle_object_scroller_rotary_changed_cb, obj);
+     }
+}
+
+static void
+_eext_circle_object_scroller_init(Eext_Circle_Object *obj, Evas_Object *scroller)
+{
+   Eext_Circle_Object_Scroller_Data *data;
+   Eext_Circle_Object_Item *item;
+
+   obj->widget_type = EEXT_CIRCLE_OBJECT_SCROLLER_TYPE;
+   obj->del_func = _eext_circle_object_scroller_del_cb;
+   obj->disabled_func = _eext_circle_object_scroller_disabled_cb;
+   obj->color_changed_func = _eext_circle_object_scroller_color_changed_cb;
+
+   data = (Eext_Circle_Object_Scroller_Data *)calloc(1, sizeof(Eext_Circle_Object_Scroller_Data));
+   data->policy_v = ELM_SCROLLER_POLICY_AUTO;
+   data->policy_h = ELM_SCROLLER_POLICY_AUTO;
+   data->line_width = SCROLL_BAR_WIDTH_SIZE;
+   data->radius = SCROLL_BAR_RADIUS_SIZE;
+   data->step_x = data->step_y = 32;
+   data->vertical_color.r = data->horizontal_color.r = SCROLL_BAR_COLOR_R;
+   data->vertical_color.g = data->horizontal_color.g = SCROLL_BAR_COLOR_G;
+   data->vertical_color.b = data->horizontal_color.b = SCROLL_BAR_COLOR_B;
+   data->vertical_color.a = data->horizontal_color.a = SCROLL_BAR_COLOR_A;
+   data->vertical_bg_color.r = data->horizontal_bg_color.r = SCROLL_BAR_BG_COLOR_R;
+   data->vertical_bg_color.g = data->horizontal_bg_color.g = SCROLL_BAR_BG_COLOR_G;
+   data->vertical_bg_color.b = data->horizontal_bg_color.b = SCROLL_BAR_BG_COLOR_B;
+   data->vertical_bg_color.a = data->horizontal_bg_color.a = SCROLL_BAR_BG_COLOR_A;
+   data->disabled_color.r = SCROLL_BAR_COLOR_DISABLED_R;
+   data->disabled_color.g = SCROLL_BAR_COLOR_DISABLED_G;
+   data->disabled_color.b = SCROLL_BAR_COLOR_DISABLED_B;
+   data->disabled_color.a = SCROLL_BAR_COLOR_DISABLED_A;
+   data->disabled_bg_color.r = SCROLL_BAR_BG_COLOR_DISABLED_R;
+   data->disabled_bg_color.g = SCROLL_BAR_BG_COLOR_DISABLED_G;
+   data->disabled_bg_color.b = SCROLL_BAR_BG_COLOR_DISABLED_B;
+   data->disabled_bg_color.a = SCROLL_BAR_BG_COLOR_DISABLED_A;
+   obj->widget_data = (void *)data;
+
+   // We don't want to allow to change properties of these items.
+   // There is no item with "default" as its name.
+   // So, eext_circle_object_* APIs is meaningless in here.
+   item = _eext_circle_object_item_new();
+   _eext_circle_object_item_name_set(item, VERTICAL_BAR_BG_NAME);
+   _eext_circle_object_item_color_set(item,
+                                      data->vertical_bg_color.r,
+                                      data->vertical_bg_color.g,
+                                      data->vertical_bg_color.b,
+                                      0);
+   _eext_circle_object_item_line_width_set(item, data->line_width);
+   _eext_circle_object_item_radius_set(item, data->radius);
+   _eext_circle_object_item_angle_offset_set(item, VERTICAL_BAR_ANGLE_START);
+   _eext_circle_object_item_angle_set(item, VERTICAL_BAR_ANGLE_RANGE);
+   _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE);
+   _eext_circle_object_item_append(obj, item);
+
+   item = _eext_circle_object_item_new();
+   _eext_circle_object_item_name_set(item, HORIZONTAL_BAR_BG_NAME);
+   _eext_circle_object_item_color_set(item,
+                                      data->horizontal_bg_color.r,
+                                      data->horizontal_bg_color.g,
+                                      data->horizontal_bg_color.b,
+                                      0);
+   _eext_circle_object_item_line_width_set(item, data->line_width);
+   _eext_circle_object_item_radius_set(item, data->radius);
+   _eext_circle_object_item_angle_offset_set(item, HORIZONTAL_BAR_ANGLE_START);
+   _eext_circle_object_item_angle_set(item, HORIZONTAL_BAR_ANGLE_RANGE);
+   _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE);
+   _eext_circle_object_item_append(obj, item);
+
+   item = _eext_circle_object_item_new();
+   _eext_circle_object_item_name_set(item, VERTICAL_BAR_NAME);
+   _eext_circle_object_item_color_set(item,
+                                      data->vertical_color.r,
+                                      data->vertical_color.g,
+                                      data->vertical_color.b,
+                                      data->vertical_color.a);
+   _eext_circle_object_item_line_width_set(item, data->line_width);
+   _eext_circle_object_item_radius_set(item, data->radius);
+   _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE);
+   _eext_circle_object_item_append(obj, item);
+
+   item = _eext_circle_object_item_new();
+   _eext_circle_object_item_name_set(item, HORIZONTAL_BAR_NAME);
+   _eext_circle_object_item_color_set(item,
+                                      data->horizontal_color.r,
+                                      data->horizontal_color.g,
+                                      data->horizontal_color.b,
+                                      data->horizontal_color.a);
+   _eext_circle_object_item_line_width_set(item, data->line_width);
+   _eext_circle_object_item_radius_set(item, data->radius);
+   _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE);
+   _eext_circle_object_item_append(obj, item);
+
+   elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
+   evas_object_event_callback_add(scroller, EVAS_CALLBACK_SHOW, _eext_circle_object_scroller_show_cb, obj);
+   evas_object_smart_callback_add(scroller, "scroll", _eext_circle_object_scroller_scroll_cb, obj);
+   evas_object_smart_callback_add(scroller, "content,resize", _eext_circle_object_scroller_content_resize_cb, obj);
+
+   eext_rotary_object_event_callback_add(scroller, _eext_circle_object_scroller_rotary_changed_cb, obj);
+   eext_rotary_object_event_callback_add(obj->image_widget, _eext_circle_object_scroller_rotary_changed_cb, obj);
+}
+
+EAPI Evas_Object *
+eext_circle_object_scroller_add(Evas_Object *scroller, Eext_Circle_Surface *surface)
+{
+   Evas_Object *obj;
+
+   if (!scroller) return NULL;
+
+   obj = elm_image_add(scroller);
+   _eext_circle_object_init(obj, scroller, surface);
+
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
+
+   _eext_circle_object_scroller_init(circle_obj, scroller);
+
+   return obj;
+}
+
+EAPI void
+eext_circle_object_scroller_policy_set(Evas_Object *obj,
+                                       Elm_Scroller_Policy policy_h,
+                                       Elm_Scroller_Policy policy_v)
+{
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+   EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, data) return;
+
+   if ((data->policy_v == policy_v) && (data->policy_h == policy_h))
+     return;
+
+   if (policy_v < ELM_SCROLLER_POLICY_LAST)
+     data->policy_v = policy_v;
+
+   if (policy_h < ELM_SCROLLER_POLICY_LAST)
+     data->policy_h = policy_h;
+
+   _eext_circle_object_scroller_scrollbar_update(circle_obj,
+                                                 SCROLL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING);
+}
+
+EAPI void
+eext_circle_object_scroller_policy_get(const Evas_Object *obj,
+                                       Elm_Scroller_Policy *policy_h,
+                                       Elm_Scroller_Policy *policy_v)
+{
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+   EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, data) return;
+
+   if (policy_v) *policy_v = data->policy_v;
+   if (policy_h) *policy_h = data->policy_h;
+}
diff --git a/src/wearable/circle/efl_extension_circle_object_slider.c b/src/wearable/circle/efl_extension_circle_object_slider.c
new file mode 100644 (file)
index 0000000..daca6d7
--- /dev/null
@@ -0,0 +1,326 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "efl_extension.h"
+#include "efl_extension_private.h"
+#include "circle/efl_extension_circle_private.h"
+
+#define EEXT_CIRCLE_OBJECT_SLIDER_TYPE "Eext_Circle_Object_Slider"
+
+#define SLIDER_TRANSIT_TIME 0.3
+
+#define EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, data) \
+      Eext_Circle_Object_Slider_Data *data = NULL; \
+   if (circle_obj && circle_obj->widget_data && \
+              circle_obj->widget_type && !strcmp(circle_obj->widget_type, EEXT_CIRCLE_OBJECT_SLIDER_TYPE)) \
+      data = (Eext_Circle_Object_Slider_Data *)circle_obj->widget_data; \
+   if (!data)
+
+#define SLIDER_ITEM_NAME "default"
+#define SLIDER_BG_ITEM_NAME "bg"
+
+#define SLIDER_COLOR_R 77
+#define SLIDER_COLOR_G 207
+#define SLIDER_COLOR_B 255
+#define SLIDER_COLOR_A 255
+
+#define SLIDER_BG_COLOR_R 0
+#define SLIDER_BG_COLOR_G 67
+#define SLIDER_BG_COLOR_B 115
+#define SLIDER_BG_COLOR_A 255
+
+#define SLIDER_COLOR_DISABLED_R 77
+#define SLIDER_COLOR_DISABLED_G 207
+#define SLIDER_COLOR_DISABLED_B 255
+#define SLIDER_COLOR_DISABLED_A 153
+
+#define SLIDER_BG_COLOR_DISABLED_R 64
+#define SLIDER_BG_COLOR_DISABLED_G 64
+#define SLIDER_BG_COLOR_DISABLED_B 64
+#define SLIDER_BG_COLOR_DISABLED_A 255
+
+#define SLIDER_WIDTH_SIZE 8
+#define SLIDER_RADIUS_SIZE 176
+
+static const char SIG_VALUE_CHANGED[] = "value,changed";
+
+static void
+_eext_circle_object_slider_del_cb(Eext_Circle_Object *obj)
+{
+   if (obj->widget_data)
+     {
+        free(obj->widget_data);
+        obj->widget_data = NULL;
+     }
+}
+
+static Eina_Bool
+_rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info)
+{
+   Evas_Object *slider = obj;
+   double current_value;
+   double next_value;
+   double min, max;
+
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj);
+   EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data);
+
+   Eext_Circle_Object_Item *item = NULL;
+   item = _eext_circle_object_item_get(circle_obj, SLIDER_ITEM_NAME);
+
+   current_value = _eext_circle_object_item_value_get(item);
+
+   if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
+     next_value = current_value + widget_data->value_step;
+   else
+     next_value = current_value - widget_data->value_step;
+
+   _eext_circle_object_item_value_min_max_get(item, &min, &max);
+
+   if (next_value < min) next_value = min;
+   else if (next_value > max) next_value = max;
+
+   _eext_circle_object_item_value_transit_set(item, SLIDER_TRANSIT_TIME,
+                                              next_value,
+                                              EINA_TRUE,
+                                              0.25, 0.46, 0.45, 1.0);
+
+   evas_object_smart_callback_call(slider, SIG_VALUE_CHANGED, NULL);
+
+   /* Accessibility */
+   if (elm_atspi_bridge_utils_is_screen_reader_enabled())
+     {
+        const char *slider_desc = NULL;
+        slider_desc = elm_atspi_accessible_description_get(slider);
+        if (slider_desc && strlen(slider_desc) > 0)
+          elm_atspi_bridge_utils_say(slider_desc, EINA_TRUE, NULL, NULL);
+     }
+
+   return EINA_TRUE;
+}
+
+static void
+_eext_circle_object_slider_color_changed_cb(Eext_Circle_Object *obj, const char *item_name)
+{
+   Eext_Circle_Object_Item *item;
+   int r, g, b, a;
+
+   EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(obj, widget_data) return;
+
+   item = _eext_circle_object_item_get(obj, item_name);
+   if (!item) return;
+
+   _eext_circle_object_item_color_get(item, &r, &g, &b, &a);
+
+   if (!strcmp(item_name, SLIDER_ITEM_NAME))
+     {
+        widget_data->color.r = r;
+        widget_data->color.g = g;
+        widget_data->color.b = b;
+        widget_data->color.a = a;
+
+        return;
+     }
+
+   if (!strcmp(item_name, SLIDER_BG_ITEM_NAME))
+     {
+        widget_data->bg_color.r = r;
+        widget_data->bg_color.g = g;
+        widget_data->bg_color.b = b;
+        widget_data->bg_color.a = a;
+
+        return;
+     }
+}
+
+static void
+_eext_circle_object_slider_disabled_cb(Eext_Circle_Object *obj)
+{
+   Eext_Circle_Object_Item *item, *bg_item;
+
+   EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(obj, data) return;
+
+   item = _eext_circle_object_item_get(obj, SLIDER_ITEM_NAME);
+   bg_item = _eext_circle_object_item_get(obj, SLIDER_BG_ITEM_NAME);
+
+   if (obj->disabled)
+     {
+        if (item)
+          _eext_circle_object_item_color_set(item,
+                                             data->disabled_color.r,
+                                             data->disabled_color.g,
+                                             data->disabled_color.b,
+                                             data->disabled_color.a);
+        if (bg_item)
+          _eext_circle_object_item_color_set(bg_item,
+                                             data->disabled_bg_color.r,
+                                             data->disabled_bg_color.g,
+                                             data->disabled_bg_color.b,
+                                             data->disabled_bg_color.a);
+
+        eext_rotary_object_event_callback_del(obj->image_widget, _rotary_changed_cb);
+     }
+   else
+     {
+        if (item)
+          _eext_circle_object_item_color_set(item,
+                                             data->color.r,
+                                             data->color.g,
+                                             data->color.b,
+                                             data->color.a);
+        if (bg_item)
+          _eext_circle_object_item_color_set(bg_item,
+                                             data->bg_color.r,
+                                             data->bg_color.g,
+                                             data->bg_color.b,
+                                             data->bg_color.a);
+
+        eext_rotary_object_event_callback_add(obj->image_widget, _rotary_changed_cb, NULL);
+     }
+}
+
+static void
+_eext_circle_object_slider_init(Eext_Circle_Object *obj)
+{
+   Eext_Circle_Object_Slider_Data *data;
+   Eext_Circle_Object_Item *item;
+
+   obj->widget_object = NULL;
+   obj->widget_type = EEXT_CIRCLE_OBJECT_SLIDER_TYPE;
+   obj->del_func = _eext_circle_object_slider_del_cb;
+   obj->disabled_func = _eext_circle_object_slider_disabled_cb;
+   obj->color_changed_func = _eext_circle_object_slider_color_changed_cb;
+
+   data = (Eext_Circle_Object_Slider_Data *)calloc(1, sizeof(Eext_Circle_Object_Slider_Data));
+   data->value_step = 1.0;
+   data->color.r = SLIDER_COLOR_R;
+   data->color.g = SLIDER_COLOR_G;
+   data->color.b = SLIDER_COLOR_B;
+   data->color.a = SLIDER_COLOR_A;
+   data->bg_color.r = SLIDER_BG_COLOR_R;
+   data->bg_color.g = SLIDER_BG_COLOR_G;
+   data->bg_color.b = SLIDER_BG_COLOR_B;
+   data->bg_color.a = SLIDER_BG_COLOR_A;
+   data->disabled_color.r = SLIDER_COLOR_DISABLED_R;
+   data->disabled_color.g = SLIDER_COLOR_DISABLED_G;
+   data->disabled_color.b = SLIDER_COLOR_DISABLED_B;
+   data->disabled_color.a = SLIDER_COLOR_DISABLED_A;
+   data->disabled_bg_color.r = SLIDER_BG_COLOR_DISABLED_R;
+   data->disabled_bg_color.g = SLIDER_BG_COLOR_DISABLED_G;
+   data->disabled_bg_color.b = SLIDER_BG_COLOR_DISABLED_B;
+   data->disabled_bg_color.a = SLIDER_BG_COLOR_DISABLED_A;
+   obj->widget_data = data;
+
+   item = _eext_circle_object_item_new();
+   _eext_circle_object_item_name_set(item, SLIDER_BG_ITEM_NAME);
+   _eext_circle_object_item_color_set(item, data->bg_color.r, data->bg_color.g, data->bg_color.b, data->bg_color.a);
+   _eext_circle_object_item_radius_set(item, SLIDER_RADIUS_SIZE);
+   _eext_circle_object_item_line_width_set(item, SLIDER_WIDTH_SIZE);
+   _eext_circle_object_item_angle_set(item, 360);
+   _eext_circle_object_item_append(obj, item);
+
+   item = _eext_circle_object_item_new();
+   _eext_circle_object_item_name_set(item, SLIDER_ITEM_NAME);
+   _eext_circle_object_item_color_set(item, data->color.r, data->color.g, data->color.b, data->color.a);
+   _eext_circle_object_item_radius_set(item, SLIDER_RADIUS_SIZE);
+   _eext_circle_object_item_line_width_set(item, SLIDER_WIDTH_SIZE);
+   _eext_circle_object_item_value_min_max_set(item, 0, 10);
+   _eext_circle_object_item_value_set(item, 0);
+   _eext_circle_object_item_append(obj, item);
+
+   eext_rotary_object_event_callback_add(obj->image_widget, _rotary_changed_cb, NULL);
+}
+
+static char *
+_accessible_description_cb(void *data, Evas_Object *obj)
+{
+   char *ret;
+   char *buf[255];
+   Eina_Strbuf *sbuf;
+   const char *slider_name;
+   Evas_Object *slider;
+
+   sbuf = eina_strbuf_new();
+   slider = data;
+   slider_name = elm_atspi_accessible_name_get(slider);
+
+   bindtextdomain (PACKAGE, LOCALE_DIR);
+   textdomain (PACKAGE);
+   if (!slider_name) slider = "Slider";
+
+   eina_strbuf_append(sbuf, slider_name);
+   eina_strbuf_append(sbuf, ", ");
+
+   snprintf(buf, sizeof(buf), _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_ADJUST_PS"), slider_name);
+   eina_strbuf_append(sbuf, buf);
+
+   ret = eina_strbuf_string_steal(sbuf);
+   eina_strbuf_free(sbuf);
+   return ret;
+}
+
+EAPI Evas_Object *
+eext_circle_object_slider_add(Evas_Object *parent, Eext_Circle_Surface *surface)
+{
+   Evas_Object *obj;
+
+   if (!parent) return NULL;
+
+   obj = elm_image_add(parent);
+   _eext_circle_object_init(obj, NULL, surface);
+
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
+
+   _eext_circle_object_slider_init(circle_obj);
+
+   /* TODO: Reading information should be changed with UX team */
+   /* ELM_ATSPI_ROLE_PUSH_BUTTON to make layout grab highlight */
+   elm_atspi_accessible_role_set(parent, ELM_ATSPI_ROLE_PUSH_BUTTON);
+   elm_atspi_accessible_description_cb_set(parent, _accessible_description_cb, obj);
+   elm_atspi_accessible_reading_info_type_set(parent, ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
+
+   return obj;
+}
+
+EAPI void
+eext_circle_object_slider_step_set(Evas_Object *obj, double step)
+{
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
+   EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return;
+
+   double min, max;
+   Eext_Circle_Object_Item *item = NULL;
+   item = _eext_circle_object_item_get(circle_obj, SLIDER_ITEM_NAME);
+
+   if (widget_data->value_step == step) return;
+
+   _eext_circle_object_item_value_min_max_get(item, &min, &max);
+
+   if (step < min) step = min;
+   else if (step > max) step = max;
+
+   widget_data->value_step = step;
+}
+
+EAPI double
+eext_circle_object_slider_step_get(const Evas_Object *obj)
+{
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return -1.0;
+   EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return -1.0;
+
+   return widget_data->value_step;
+}
+
diff --git a/src/wearable/circle/efl_extension_circle_object_spinner.c b/src/wearable/circle/efl_extension_circle_object_spinner.c
new file mode 100644 (file)
index 0000000..da491e6
--- /dev/null
@@ -0,0 +1,496 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "efl_extension.h"
+#include "efl_extension_private.h"
+#include "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; \
+   if (circle_obj && circle_obj->widget_data && \
+       circle_obj->widget_type && !strcmp(circle_obj->widget_type, EEXT_CIRCLE_OBJECT_SPINNER_TYPE)) \
+      data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data; \
+   if (!data)
+
+static const double MARK_WIDTH = 6.0;
+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;
+
+// ----------------------------------------- animation API --------------------------------------//
+static void _accessibility_spinner_highlighted_cb(void *data, Evas_Object *obj, void *event_info);
+
+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 *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;
+
+   return angle_offset;
+}
+
+static void
+_eext_circle_object_spinner_update(Eext_Circle_Object *obj)
+{
+   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_spinner_mark_update(obj, EINA_FALSE);
+}
+
+static void
+_eext_circle_object_spinner_changed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+   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 double
+_looping_angle_distance_get(double from_angle_offset, double to_angle_offset, Eina_Bool value_up)
+{
+   double angle_distance = 0;
+
+   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;
+     }
+
+   return angle_distance;
+}
+
+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)
+{
+   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;
+   double angle_offset_diff;
+
+   item = _eext_circle_object_item_get(circle_obj, SPINNER_ITEM_NAME);
+   if (!item) return ECORE_CALLBACK_CANCEL;
+
+   angle_offset_diff = fabs(_eext_circle_object_item_angle_offset_get(item)
+                       - item->draw.angle_offset);
+
+   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");
+
+   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 *circle_obj = (Eext_Circle_Object *)data;
+   Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data;
+
+   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)
+     {
+        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];
+        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);
+     }
+   return EINA_TRUE;
+}
+
+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;
+        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;
+          }
+
+        free(obj->widget_data);
+        obj->widget_data = NULL;
+     }
+}
+
+static void
+_eext_circle_object_spinner_disabled_cb(Eext_Circle_Object *obj)
+{
+   if (obj->disabled)
+     eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb);
+   else
+     eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, 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;
+   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);
+
+   evas_object_smart_callback_add(spinner, "changed", _eext_circle_object_spinner_changed_cb, obj);
+
+   //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);
+   //
+
+   eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
+}
+
+EAPI Evas_Object *
+eext_circle_object_spinner_add(Evas_Object *spinner, Eext_Circle_Surface *surface)
+{
+   Evas_Object *obj;
+
+   if (!spinner) return NULL;
+
+   obj = elm_image_add(spinner);
+   _eext_circle_object_init(obj, spinner, surface);
+
+   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
+
+   _eext_circle_object_spinner_init(circle_obj, spinner);
+
+   return obj;
+}
+
+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];
+   char *buf_val = NULL;
+   char *buf_unit = 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_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);
+   textdomain (PACKAGE);
+   if(buf_unit)
+     {
+        snprintf(buf_desc, sizeof(buf_desc), _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_ADJUST_PS"),buf_unit);
+        if(buf_val)
+           snprintf(buf, sizeof(buf), "%s %s %s",buf_val, buf_unit, buf_desc);
+        else
+           snprintf(buf, sizeof(buf), "%.0f %s %s",val, buf_unit, buf_desc);
+     }
+   else
+     {
+        snprintf(buf_desc, sizeof(buf_desc), _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_ADJUST_PS"),"");
+        if(buf_val)
+           snprintf(buf, sizeof(buf), "%s %s",buf_val, buf_desc);
+        else
+           snprintf(buf, sizeof(buf), "%.0f %s",val, buf_desc);
+     }
+   return strdup(buf);
+}
+static void
+_accessibility_spinner_highlighted_cb(void *data, Evas_Object *obj, void *event_info)
+{
+   if(!elm_atspi_bridge_utils_is_screen_reader_enabled())
+      return ;
+
+   Eext_Circle_Object *circle_obj = 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);
+
+   evas_object_smart_callback_call(circle_obj->widget_object, "focused",NULL);
+}
diff --git a/src/wearable/circle/efl_extension_circle_surface.c b/src/wearable/circle/efl_extension_circle_surface.c
new file mode 100644 (file)
index 0000000..90dbc70
--- /dev/null
@@ -0,0 +1,874 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "efl_extension.h"
+#include "efl_extension_private.h"
+#include "circle/efl_extension_circle_private.h"
+
+static void _eext_circle_surface_del_internal(Eext_Circle_Surface *surface);
+static void _eext_circle_surface_render(void *data);
+
+static Evas_Object *
+_eext_circle_surface_image_widget_add(Evas_Object *parent)
+{
+   Evas_Object *image_widget;
+
+   image_widget = elm_image_add(parent);
+
+   if (!image_widget)
+     {
+        ERR("Failed to create elm_image_object");
+        return NULL;
+     }
+
+   //for accessibility
+   elm_atspi_accessible_role_set(image_widget, ELM_ATSPI_ROLE_REDUNDANT_OBJECT);
+
+   //FIXME: It's for adjusting evas_image geometry.
+   //       Image object has weird geometry during the window calc own size.
+   //       We need to recalc image object after buffer memory copy in render time.
+   //       But now we don't have any way to call image's internal sizing eval function.
+   elm_image_aspect_fixed_set(image_widget, EINA_FALSE);
+   evas_object_repeat_events_set(image_widget, EINA_TRUE);
+
+   return image_widget;
+}
+
+static void
+_eext_circle_surface_cairo_draw_arc(cairo_t *cairo,
+                                    int line_width,
+                                    double center_x, double center_y, double radius,
+                                    double r, double g, double b, double a,
+                                    double angle1, double angle2, Eina_Bool round_cap)
+{
+   cairo_set_line_width(cairo, line_width);
+
+   if (round_cap) cairo_set_line_cap(cairo, CAIRO_LINE_CAP_ROUND);
+
+   cairo_set_source_rgba(cairo, r, g, b, a);
+
+   cairo_arc(cairo, center_x, center_y, radius,
+             angle1 * M_PI / 180, angle2 * M_PI / 180);
+   cairo_stroke(cairo);
+}
+
+static void
+_eext_circle_surface_cairo_draw_text(cairo_t *cairo,
+                                     const char *text, const char *font, int font_size,
+                                     cairo_font_slant_t slant, cairo_font_weight_t weight,
+                                     double center_x, double center_y, double radius,
+                                     double r, double g, double b, double a,
+                                     double angle, double rotate_angle)
+{
+   int x, y;
+
+   x = radius * cos(angle * M_PI / 180);
+   y = radius * sin(angle * M_PI / 180);
+   x += center_x;
+   y += center_y;
+
+   cairo_set_source_rgba(cairo, r, g, b, a);
+   cairo_set_font_size(cairo, font_size);
+   cairo_select_font_face(cairo, font, slant, weight);
+   cairo_move_to(cairo, x, y);
+   cairo_rotate(cairo, rotate_angle * M_PI / 180);
+   cairo_show_text(cairo, text);
+   cairo_stroke(cairo);
+}
+
+static void
+_eext_circle_surface_clear(Eext_Circle_Surface *surface)
+{
+   Evas_Object *image_object;
+   unsigned char *buffer;
+
+   if (!surface || !surface->image_widget) return;
+
+   image_object = elm_image_object_get(surface->image_widget);
+
+   buffer = (unsigned char *)evas_object_image_data_get(image_object, 1);
+   memset(buffer, 0, surface->w * surface->h * 4);
+   cairo_set_source_rgba(surface->cairo, 0, 0, 0, 0);
+   cairo_rectangle(surface->cairo, 0.0, 0.0, surface->w, surface->h);
+   cairo_fill(surface->cairo);
+}
+
+static void
+_eext_circle_bg_surface_memcpy(Eext_Circle_Surface *surface, Eext_Circle_Object *obj)
+{
+   Evas_Object *image_object, *bg_image, *bg_image_object;
+   unsigned char *buffer, *bg_buffer;
+
+   if (!surface || !surface->image_widget) return;
+
+   image_object = elm_image_object_get(surface->image_widget);
+   buffer = (unsigned char *)evas_object_image_data_get(image_object, 1);
+
+   bg_image = eina_list_nth(obj->bg_image_objs, obj->bg_image_index);
+   bg_image_object = elm_image_object_get(bg_image);
+   evas_object_image_size_set(bg_image_object, surface->w, surface->h);
+   evas_object_image_fill_set(bg_image_object, 0, 0, surface->w, surface->h);
+   bg_buffer = (unsigned char *)evas_object_image_data_get(bg_image_object, 0);
+
+   memcpy(buffer, bg_buffer, surface->w * surface->h * 4);
+}
+
+static void
+_eext_circle_surface_render(void *data)
+{
+   Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
+   Eext_Circle_Object *render_obj;
+   Eina_List *l, *ll;
+   Eina_Bool skip_surface_clear = EINA_FALSE;
+
+   if (!surface)
+     {
+        ERR("Surface is NULL... Going to remove surface render function.");
+        return;
+     }
+
+   surface->render_job = NULL;
+
+   EINA_LIST_FOREACH(surface->render_objs, l, render_obj)
+     {
+        if (!render_obj->visible)
+          continue;
+
+        if (render_obj->bg_image_objs)
+          {
+             _eext_circle_bg_surface_memcpy(surface, render_obj);
+             skip_surface_clear = EINA_TRUE;
+             break;
+          }
+     }
+
+   if (!skip_surface_clear)
+     _eext_circle_surface_clear(surface);
+
+   EINA_LIST_FOREACH(surface->render_objs, l, render_obj)
+     {
+        Eext_Circle_Object_Item *item;
+
+        if (!render_obj->visible)
+          continue;
+        if (render_obj->visible_on_activate && !(render_obj->is_active))
+          continue;
+
+        EINA_LIST_FOREACH(render_obj->items, ll, item)
+          {
+             // Skip invisible item.
+             if (item->draw.color.a == 0) continue;
+
+             // If there is no text, the item is arc item.
+             if (!item->text)
+               {
+                  // Draw Arc
+                  if (item->line_width)
+                    {
+                       cairo_save(surface->cairo);
+                       _eext_circle_surface_cairo_draw_arc(surface->cairo, item->line_width,
+                                                           surface->center_x, surface->center_y, item->radius,
+                                                           (double)item->draw.color.r / 255,
+                                                           (double)item->draw.color.g / 255,
+                                                           (double)item->draw.color.b / 255,
+                                                           (double)item->draw.color.a / 255,
+                                                           item->draw.angle_offset + item->min_angle - 90.0,
+                                                           item->draw.angle_offset + item->draw.angle - 90.0,
+                                                           item->round_cap);
+                       cairo_restore(surface->cairo);
+                    }
+               }
+             else if (item->font_size)
+               {
+                  // Draw Text
+                  cairo_save(surface->cairo);
+                  _eext_circle_surface_cairo_draw_text(surface->cairo,
+                                                       item->text, item->selected_font, item->font_size,
+                                                       CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL,
+                                                       surface->center_x, surface->center_y, item->radius,
+                                                       (double)item->draw.color.r / 255,
+                                                       (double)item->draw.color.g / 255,
+                                                       (double)item->draw.color.b / 255,
+                                                       (double)item->draw.color.a / 255,
+                                                       item->draw.angle_offset + item->draw.angle - 90.0,
+                                                       item->draw.angle_offset + item->draw.angle);
+                  cairo_restore(surface->cairo);
+               }
+          }
+     }
+
+   evas_object_image_data_update_add(elm_image_object_get(surface->image_widget),
+                                     0, 0, surface->w, surface->h);
+}
+
+static void
+_eext_circle_surface_render_finish(Eext_Circle_Surface *surface)
+{
+   if (!surface) return;
+
+   if (surface->render_job) ecore_job_del(surface->render_job);
+   surface->render_job = NULL;
+}
+
+static void
+_eext_circle_surface_cairo_finish(Eext_Circle_Surface *surface)
+{
+   if (surface->cairo) cairo_destroy(surface->cairo);
+   if (surface->cairo_surface) cairo_surface_destroy(surface->cairo_surface);
+
+   surface->cairo = NULL;
+   surface->cairo_surface = NULL;
+}
+
+static void
+_eext_circle_surface_cairo_init(Eext_Circle_Surface *surface)
+{
+   Evas_Object *image_object;
+   cairo_surface_t *cairo_surface;
+   cairo_t *cairo;
+   unsigned char *buffer;
+   int stride;
+
+   if (surface->cairo_surface || surface->cairo)
+     _eext_circle_surface_cairo_finish(surface);
+
+   if (surface->image_widget == NULL)
+     {
+        ERR("Fail to get buffer from image object!");
+        return;
+     }
+
+   image_object = elm_image_object_get(surface->image_widget);
+
+   buffer = (unsigned char *)evas_object_image_data_get(image_object, 1);
+   stride = evas_object_image_stride_get(image_object);
+   cairo_surface = cairo_image_surface_create_for_data(buffer, CAIRO_FORMAT_ARGB32,
+                                                       surface->w, surface->h, stride);
+   cairo = cairo_create(cairo_surface);
+   cairo_set_antialias(cairo, CAIRO_ANTIALIAS_BEST);
+
+   surface->cairo_surface = cairo_surface;
+   surface->cairo = cairo;
+}
+
+static void
+_eext_circle_surface_update(Eext_Circle_Surface *surface)
+{
+   Evas_Object *image_object;
+
+   if (!surface) return;
+   if (!evas_object_visible_get(surface->image_widget)) return;
+
+   image_object = elm_image_object_get(surface->image_widget);
+   evas_object_geometry_get(surface->image_widget, NULL, NULL, &surface->w, &surface->h);
+
+   surface->center_x = surface->w / 2;
+   surface->center_y = surface->h / 2;
+
+   evas_object_image_size_set(image_object, surface->w, surface->h);
+   evas_object_image_fill_set(image_object, 0, 0, surface->w, surface->h);
+
+   if ((surface->w != 0) && (surface->h != 0))
+     {
+        INF("Surface will be initialized!");
+        _eext_circle_surface_cairo_init(surface);
+        _eext_circle_surface_changed(surface);
+     }
+}
+
+static void
+_eext_circle_surface_resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
+
+   _eext_circle_surface_update(surface);
+}
+
+static void
+_eext_circle_surface_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
+
+   INF("Surface is going to free in delete callback for image widget.");
+   _eext_circle_surface_del_internal(surface);
+}
+
+static void
+_eext_circle_surface_parent_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
+
+   surface->parent = NULL;
+}
+
+static void
+_eext_circle_surface_hide_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
+
+   _eext_circle_surface_cairo_finish(surface);
+   _eext_circle_surface_render_finish(surface);
+}
+
+static void
+_eext_circle_surface_show_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
+
+   _eext_circle_surface_update(surface);
+}
+
+static void
+_eext_circle_surface_object_rotary_activated_cb(void *data, Evas_Object *obj, void *event_info)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+   evas_object_show(circle_obj->image_widget);
+   circle_obj->is_active = EINA_TRUE;
+
+   // Previous view's circle object should not be disappeared while naviframe effect.
+   // At here, show the latest deactivated object if the conditions are satisfied.
+   if (circle_obj->surface)
+     {
+        if (circle_obj->surface->parent_surface &&
+            (circle_obj->surface->parent_surface->type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME))
+          {
+             Eext_Circle_Object *deact_obj = circle_obj->surface->parent_surface->deactivated_obj;
+
+             if (deact_obj && (deact_obj->surface->parent != circle_obj->surface->parent))
+               {
+                  evas_object_show(deact_obj->image_widget);
+               }
+          }
+        else if (circle_obj->surface->type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME)
+          {
+             if (circle_obj->surface->deactivated_obj)
+               evas_object_show(circle_obj->surface->deactivated_obj->image_widget);
+          }
+     }
+}
+
+static void
+_deactivated_obj_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+   if (circle_obj && circle_obj->surface && circle_obj->surface->parent_surface &&
+       (circle_obj->surface->parent_surface->type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME))
+     {
+        if (circle_obj->surface->parent_surface->deactivated_obj == circle_obj)
+          circle_obj->surface->parent_surface->deactivated_obj = NULL;
+     }
+}
+
+static void
+_eext_circle_surface_object_rotary_deactivated_cb(void *data, Evas_Object *obj, void *event_info)
+{
+   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
+
+   evas_object_hide(circle_obj->image_widget);
+   circle_obj->is_active = EINA_FALSE;
+
+   // Previous view's circle object should not be disappeared while naviframe effect.
+   // At here, just keep the current deactivated object.
+   if (circle_obj->surface && circle_obj->surface->parent_surface &&
+       (circle_obj->surface->parent_surface->type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME))
+     {
+        Eext_Circle_Object *deactivated_obj = circle_obj->surface->parent_surface->deactivated_obj;
+
+        if (deactivated_obj == circle_obj)
+          return;
+
+        if (deactivated_obj)
+          evas_object_event_callback_del_full(deactivated_obj->image_widget, EVAS_CALLBACK_DEL, _deactivated_obj_del_cb, deactivated_obj);
+        circle_obj->surface->parent_surface->deactivated_obj = circle_obj;
+        evas_object_event_callback_add(circle_obj->image_widget, EVAS_CALLBACK_DEL, _deactivated_obj_del_cb, circle_obj);
+     }
+}
+
+static Eext_Circle_Surface *
+_eext_circle_surface_naviframe_item_view_add(Evas_Object *layout)
+{
+   Eext_Circle_Surface *surface;
+
+   if (!layout)
+     {
+        ERR("The given Evas_Object is NULL! It returns NULL.");
+        return NULL;
+     }
+
+   if (edje_object_part_exists(elm_layout_edje_get(layout), "elm.swallow.circle"))
+     {
+        surface = _eext_circle_surface_add(layout, EEXT_CIRCLE_SURFACE_TYPE_DEFAULT);
+
+        if (!surface->image_widget)
+          {
+             ERR("Surface doesn't have image widget for drawing. It returns NULL.");
+             return NULL;
+          }
+
+        INF("Put the surface[%p]'s widget[%p] to layout widget[%p]", surface, surface->image_widget, layout);
+        elm_object_part_content_set(layout, "elm.swallow.circle", surface->image_widget);
+
+        return surface;
+     }
+   else
+     {
+        ERR("There is no \"elm.swallow.circle\" part in elm_layout widget! It returns NULL.");
+        return NULL;
+     }
+}
+
+static void _naviframe_item_push_cb(void *data, Evas_Object *obj, void *event_info)
+{
+   Evas_Object *view = (Evas_Object *)event_info;
+   Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
+   Eext_Circle_Surface *view_surface;
+   Eext_Circle_Object *circle_obj;
+   Eina_List *l, *l_next;
+
+   if (!surface)
+     {
+        ERR("No matched surface exists for the naviframe:%p", obj);
+        return;
+     }
+
+   view_surface = _eext_circle_surface_naviframe_item_view_add(view);
+   view_surface->parent_surface = surface;
+   surface->sub_surfaces = eina_list_append(surface->sub_surfaces, view_surface);
+
+   EINA_LIST_FOREACH_SAFE(surface->render_objs, l, l_next, circle_obj)
+     {
+        Evas_Object *parent;
+        parent = elm_object_parent_widget_get(circle_obj->image_widget);
+
+        while (parent)
+          {
+             if (parent == view)
+               {
+                  _eext_circle_surface_object_remove(surface, circle_obj);
+                  _eext_circle_surface_object_append(view_surface, circle_obj);
+                  circle_obj->surface = view_surface;
+                  break;
+               }
+
+             parent = elm_object_parent_widget_get(parent);
+             if (parent == obj) break;
+          }
+     }
+}
+
+static void
+_eext_circle_surface_del_internal(Eext_Circle_Surface *surface)
+{
+   Eext_Circle_Object *obj;
+   Eina_List *l, *l_next;
+
+   if (surface->type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME)
+     {
+        Eext_Circle_Surface *cur_surface;
+
+        evas_object_smart_callback_del_full(surface->parent, "item,pushed,internal", _naviframe_item_push_cb, surface);
+        evas_object_event_callback_del_full(surface->parent, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb, surface);
+
+        EINA_LIST_FOREACH_SAFE(surface->sub_surfaces, l, l_next, cur_surface)
+          {
+             _eext_circle_surface_del_internal(cur_surface);
+          }
+
+     }
+   else if (surface->parent)
+     {
+        evas_object_event_callback_del(surface->parent, EVAS_CALLBACK_DEL, _eext_circle_surface_parent_del_cb);
+     }
+
+   _eext_circle_surface_cairo_finish(surface);
+   _eext_circle_surface_render_finish(surface);
+
+   if (surface->image_widget)
+     {
+        evas_object_event_callback_del(surface->image_widget, EVAS_CALLBACK_RESIZE, _eext_circle_surface_resize_cb);
+        evas_object_event_callback_del(surface->image_widget, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb);
+        evas_object_event_callback_del(surface->image_widget, EVAS_CALLBACK_HIDE, _eext_circle_surface_hide_cb);
+        evas_object_event_callback_del(surface->image_widget, EVAS_CALLBACK_SHOW, _eext_circle_surface_show_cb);
+        surface->image_widget = NULL;
+        surface->w = surface->h = 0;
+     }
+
+   if (surface->parent_surface)
+     surface->parent_surface->sub_surfaces = eina_list_remove(surface->parent_surface->sub_surfaces, surface);
+
+   // If public surface is deleted, prepare a private surface.
+   EINA_LIST_FOREACH_SAFE(surface->render_objs, l, l_next, obj)
+     {
+        if (surface->type != EEXT_CIRCLE_SURFACE_TYPE_PRIVATE)
+          {
+             Eext_Circle_Surface *private_surface;
+             INF("Private Surface will be initialized for widget[%p], circle_obj[%p]!",
+                  obj->image_widget, obj);
+
+             surface->render_objs = eina_list_remove_list(surface->render_objs, l);
+
+             private_surface =
+                _eext_circle_surface_init(obj->image_widget, NULL, EEXT_CIRCLE_SURFACE_TYPE_PRIVATE);
+             _eext_circle_surface_object_append(private_surface, obj);
+
+             evas_object_smart_callback_del(obj->image_widget, "rotary,activated",
+                                            _eext_circle_surface_object_rotary_activated_cb);
+             if (obj->widget_object)
+               {
+                  evas_object_smart_callback_del(obj->widget_object, "rotary,activated",
+                                                 _eext_circle_surface_object_rotary_activated_cb);
+               }
+
+             _eext_circle_surface_update(private_surface);
+          }
+        else
+          {
+             _eext_circle_surface_object_remove(surface, obj);
+          }
+     }
+
+   free(surface);
+}
+
+//////////////////////////
+// Internal API //////////
+//////////////////////////
+Eext_Circle_Surface *
+_eext_circle_surface_init(Evas_Object *image_widget, Evas_Object *parent, Eext_Circle_Surface_Type type)
+{
+   Eext_Circle_Surface *surface;
+
+   surface = (Eext_Circle_Surface *)calloc(1, sizeof(Eext_Circle_Surface));
+   if (!surface)
+     {
+        ERR("Fail to calloc for (Eext_Circle_Surface)");
+        return NULL;
+     }
+
+   surface->type = type;
+   surface->parent = parent;
+
+   if (type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME)
+     {
+        // If the surface is created with elm_naviframe.
+        evas_object_smart_callback_add(surface->parent, "item,pushed,internal", _naviframe_item_push_cb, surface);
+        evas_object_event_callback_add(surface->parent, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb, surface);
+     }
+   else if (type == EEXT_CIRCLE_SURFACE_TYPE_PRIVATE)
+     {
+        surface->image_widget = image_widget;
+        evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_RESIZE, _eext_circle_surface_resize_cb, surface);
+        evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb, surface);
+        evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_HIDE, _eext_circle_surface_hide_cb, surface);
+        evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_SHOW, _eext_circle_surface_show_cb, surface);
+        evas_object_image_alpha_set(elm_image_object_get(surface->image_widget), EINA_TRUE);
+     }
+   else
+     {
+        surface->image_widget = image_widget;
+        evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_RESIZE, _eext_circle_surface_resize_cb, surface);
+        evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb, surface);
+        evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_HIDE, _eext_circle_surface_hide_cb, surface);
+        evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_SHOW, _eext_circle_surface_show_cb, surface);
+        evas_object_event_callback_add(surface->parent, EVAS_CALLBACK_DEL, _eext_circle_surface_parent_del_cb, surface);
+        evas_object_image_alpha_set(elm_image_object_get(surface->image_widget), EINA_TRUE);
+     }
+
+   return surface;
+}
+
+void
+_eext_circle_surface_finish(Eext_Circle_Surface *surface)
+{
+   _eext_circle_surface_del_internal(surface);
+}
+
+void
+_eext_circle_surface_object_remove(Eext_Circle_Surface *surface, Eext_Circle_Object *obj)
+{
+   if (!surface) return;
+   if (!obj) return;
+
+   surface->render_objs = eina_list_remove(surface->render_objs, obj);
+   obj->surface = NULL;
+   _eext_circle_surface_changed(surface);
+
+   if (surface->type != EEXT_CIRCLE_SURFACE_TYPE_PRIVATE)
+     {
+        evas_object_smart_callback_del(obj->image_widget, "rotary,activated",
+                                       _eext_circle_surface_object_rotary_activated_cb);
+        evas_object_smart_callback_del(obj->image_widget, "rotary,deactivated",
+                                       _eext_circle_surface_object_rotary_deactivated_cb);
+
+        if (obj->widget_object)
+          {
+             evas_object_smart_callback_del(obj->widget_object, "rotary,activated",
+                                            _eext_circle_surface_object_rotary_activated_cb);
+             evas_object_smart_callback_del(obj->widget_object, "rotary,deactivated",
+                                            _eext_circle_surface_object_rotary_deactivated_cb);
+          }
+     }
+}
+
+void
+_eext_circle_surface_object_append(Eext_Circle_Surface *surface, Eext_Circle_Object *obj)
+{
+   if (!surface) return;
+   if (!obj) return;
+
+   if (obj->surface)
+     _eext_circle_surface_object_remove(obj->surface, obj);
+
+   // Search whether proper sub-surface exists or not for the circle object.
+   if ((surface->type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME) && surface->sub_surfaces)
+     {
+        Eina_List *l, *l_next;
+        Eext_Circle_Surface *cur_surface;
+
+        EINA_LIST_FOREACH_SAFE(surface->sub_surfaces, l, l_next, cur_surface)
+          {
+             Evas_Object *parent;
+             parent = elm_object_parent_widget_get(obj->image_widget);
+
+             while (parent)
+               {
+                  if (parent == cur_surface->parent)
+                    {
+                       _eext_circle_surface_object_append(cur_surface, obj);
+                       obj->surface = cur_surface;
+                       return;
+                    }
+
+                  parent = elm_object_parent_widget_get(parent);
+                  if (parent == surface->parent) break;
+               }
+
+          }
+     }
+
+   surface->render_objs = eina_list_append(surface->render_objs, obj);
+   _eext_circle_surface_changed(surface);
+   obj->surface = surface;
+
+   if (obj->surface->type != EEXT_CIRCLE_SURFACE_TYPE_PRIVATE)
+     {
+        evas_object_smart_callback_add(obj->image_widget, "rotary,activated",
+                                       _eext_circle_surface_object_rotary_activated_cb, obj);
+        evas_object_smart_callback_add(obj->image_widget, "rotary,deactivated",
+                                       _eext_circle_surface_object_rotary_deactivated_cb, obj);
+
+        if (obj->widget_object)
+          {
+             evas_object_smart_callback_add(obj->widget_object, "rotary,activated",
+                                            _eext_circle_surface_object_rotary_activated_cb, obj);
+             evas_object_smart_callback_add(obj->widget_object, "rotary,deactivated",
+                                            _eext_circle_surface_object_rotary_deactivated_cb, obj);
+          }
+     }
+}
+
+void
+_eext_circle_surface_object_exclusive_show(Eext_Circle_Surface *surface, Eext_Circle_Object *obj)
+{
+   Eext_Circle_Object *render_obj;
+   Eina_List *l;
+
+   if (!surface) return;
+   if (!obj) return;
+
+   if (!evas_object_visible_get(obj->image_widget) &&
+       (obj->widget_object && evas_object_visible_get(obj->widget_object)))
+     evas_object_show(obj->image_widget);
+
+   EINA_LIST_FOREACH(surface->render_objs, l, render_obj)
+     {
+        if (render_obj != obj)
+          evas_object_hide(render_obj->image_widget);
+     }
+}
+
+void
+_eext_circle_surface_changed(Eext_Circle_Surface *surface)
+{
+   if (!surface) return;
+
+   if (!surface->render_job && surface->image_widget &&
+       evas_object_visible_get(surface->image_widget) &&
+       (surface->w != 0) && (surface->h != 0))
+     surface->render_job = ecore_job_add(_eext_circle_surface_render, surface);
+}
+
+Eext_Circle_Surface *
+_eext_circle_surface_add(Evas_Object *parent, Eext_Circle_Surface_Type type)
+{
+   Eext_Circle_Surface *surface;
+   Evas_Object *image_widget = NULL;
+
+   if (!parent) return NULL;
+
+   if (type != EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME)
+     image_widget = _eext_circle_surface_image_widget_add(parent);
+
+   surface = _eext_circle_surface_init(image_widget, parent, type);
+
+   return surface;
+}
+
+////////////////////////
+// EAPI ////////////////
+////////////////////////
+EAPI Eext_Circle_Surface *
+eext_circle_surface_conformant_add(Evas_Object *conform)
+{
+   Eext_Circle_Surface *surface;
+   const char *type = NULL;
+
+   if (!conform)
+     {
+        ERR("The given Evas_Object is NULL! It returns NULL.");
+        return NULL;
+     }
+
+   type = evas_object_type_get(conform);
+
+   if (type && (!strcmp(type, "Elm_Conformant") || !strcmp(type, "elm_conformant")))
+     {
+        if (elm_object_style_set(conform, "circle"))
+          {
+             if (!edje_object_part_exists(elm_layout_edje_get(conform), "elm.swallow.circle"))
+               {
+                  ERR("There is no \"elm.swallow.circle\" part in elm_conformant widget! It returns NULL.");
+                  return NULL;
+               }
+
+             surface = _eext_circle_surface_add(conform, EEXT_CIRCLE_SURFACE_TYPE_DEFAULT);
+
+             if (!surface->image_widget)
+               {
+                  ERR("Surface doesn't have image widget for drawing. It returns NULL.");
+                  return NULL;
+               }
+
+             INF("Put the surface[%p]'s widget[%p] to elm_conformant widget[%p]", surface, surface->image_widget, conform);
+             elm_object_part_content_set(conform, "elm.swallow.circle", surface->image_widget);
+
+             return surface;
+          }
+        else
+          {
+             ERR("elm_object_style_set is failed! The theme doesn't have \"elm/conformant/base/circle\" group. It returns NULL.");
+             return NULL;
+          }
+     }
+
+   ERR("The given Evas_Object[%p] is not elm_conformant widget! It returns NULL.", conform);
+   return NULL;
+}
+
+EAPI Eext_Circle_Surface *
+eext_circle_surface_layout_add(Evas_Object *layout)
+{
+   Eext_Circle_Surface *surface;
+   const char *type = NULL;
+
+   if (!layout)
+     {
+        ERR("The given Evas_Object is NULL! It returns NULL.");
+        return NULL;
+     }
+
+   type = evas_object_type_get(layout);
+
+   if (type && (!strcmp(type, "Elm_Layout") || !strcmp(type, "elm_layout")))
+     {
+        if (elm_layout_theme_set(layout, "layout", "circle", "surface"))
+          {
+             if (!edje_object_part_exists(elm_layout_edje_get(layout), "elm.swallow.circle"))
+               {
+                  ERR("There is no \"elm.swallow.circle\" part in elm_layout widget! It returns NULL.");
+                  return NULL;
+               }
+
+             surface = _eext_circle_surface_add(layout, EEXT_CIRCLE_SURFACE_TYPE_DEFAULT);
+
+             if (!surface->image_widget)
+               {
+                  ERR("Surface doesn't have image widget for drawing. It returns NULL.");
+                  return NULL;
+               }
+
+             INF("Put the surface[%p]'s widget[%p] to layout widget[%p]", surface, surface->image_widget, layout);
+             elm_object_part_content_set(layout, "elm.swallow.circle", surface->image_widget);
+
+             return surface;
+          }
+        else
+          {
+             ERR("elm_layout_theme_set is failed! The theme doesn't have \"elm/layout/circle/surface\" group. It returns NULL.");
+             return NULL;
+          }
+     }
+
+   ERR("The given Evas_Object[%p] is not elm_layout widget! It returns NULL.", layout);
+   return NULL;
+}
+
+EAPI Eext_Circle_Surface *
+eext_circle_surface_naviframe_add(Evas_Object *naviframe)
+{
+   Eext_Circle_Surface *surface;
+   const char *type = NULL;
+
+   if (!naviframe)
+     {
+        ERR("The given Evas_Object is NULL! It returns NULL.");
+        return NULL;
+     }
+
+   type = evas_object_type_get(naviframe);
+
+   if (type && (!strcmp(type, "Elm_Naviframe") || !strcmp(type, "elm_naviframe")))
+     {
+        surface = _eext_circle_surface_add(naviframe, EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME);
+        return surface;
+     }
+
+   ERR("The given Evas_Object[%p] is not elm_naviframe widget! It returns NULL.", naviframe);
+   return NULL;
+}
+
+EAPI void
+eext_circle_surface_del(Eext_Circle_Surface *surface)
+{
+   if (!surface)
+     {
+        ERR("Surface is already NULL");
+        return;
+     }
+
+   if (surface->image_widget)
+     {
+        evas_object_event_callback_del(surface->image_widget, EVAS_CALLBACK_RESIZE, _eext_circle_surface_resize_cb);
+        evas_object_event_callback_del(surface->image_widget, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb);
+        evas_object_del(surface->image_widget);
+        surface->image_widget = NULL;
+     }
+
+   INF("Surface[%p] is going to free in eext_circle_surface_del API.", surface);
+   _eext_circle_surface_del_internal(surface);
+}
diff --git a/src/wearable/circle/efl_extension_rotary.c b/src/wearable/circle/efl_extension_rotary.c
new file mode 100644 (file)
index 0000000..754fe95
--- /dev/null
@@ -0,0 +1,725 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include <Elementary.h>
+#include "circle/efl_extension_rotary.h"
+#include "efl_extension_private.h"
+#ifdef WITH_X
+ #include <Ecore_X.h>
+ #include <X11/Xlib.h>
+ #include <X11/extensions/XInput2.h>
+ #include <X11/extensions/XI2.h>
+#elif WITH_WAYLAND
+ #include <Ecore_Wayland.h>
+ #include <Ecore_Input.h>
+#endif
+
+
+#define TIZEN_DEV "tizen_detent"
+
+static const char SIG_ACTIVATED[] = "rotary,activated";
+static const char SIG_DEACTIVATED[] = "rotary,deactivated";
+
+static int EEXT_EVENT_ROTARY_ROTATE = 0;
+static Eina_List *_callbacks = NULL;
+static Eina_List *_obj_pri_callbacks = NULL;
+#ifdef WITH_X
+static XIEventMask *_xi_event_mask = NULL;
+#endif
+static Evas_Object *_activated_obj = NULL;
+static int _init_count = 0;
+#ifdef WITH_X
+static Ecore_Event_Handler *_motion_handler = NULL;
+#endif
+#ifdef WITH_WAYLAND
+static Ecore_Event_Handler *_ecore_detent_handler = NULL;
+#endif
+static Ecore_Event_Handler *_rotate_handler = NULL;
+static Eina_Bool _handler_registered = EINA_FALSE;
+static Eina_List *handlers = NULL;
+
+typedef struct _Eext_Rotary_Cb Eext_Rotary_Cb;
+struct _Eext_Rotary_Cb
+{
+   Evas_Object            *obj;
+   Eext_Rotary_Event_Cb    func;
+   void                   *data;
+   Eext_Callback_Priority  pri;
+   Eina_Bool               del_registered;
+};
+
+typedef struct _Rotary_Raw_Info Rotary_Raw_Info;
+struct _Rotary_Raw_Info
+{
+   int                         devid;
+   Eext_Rotary_Event_Direction direction;
+   unsigned int                time_stamp;
+};
+
+typedef struct _Eext_Rotary_Handler Eext_Rotary_Handler;
+struct _Eext_Rotary_Handler
+{
+   Eext_Rotary_Handler_Cb  func;
+   void                   *data;
+};
+
+typedef struct _Eext_Rotary_Obj_Pri Eext_Rotary_Obj_Pri;
+struct _Eext_Rotary_Obj_Pri
+{
+   Evas_Object *obj;
+   Eina_List   *pri_callbacks;
+};
+
+#ifdef WITH_X
+static Eina_Bool _init_Xi2_system(void);
+static Eina_Bool _motion_changed_cb(void *data, int type, void *event_info);
+static void _process_raw_event(void *data, int type, void *raw_event);
+#endif
+#ifdef WITH_WAYLAND
+static Eina_Bool _init_ecore_event(void);
+static Eina_Bool _ecore_detent_cb(void *data, int type, void *event_info);
+#endif
+static Eina_Bool _rotary_rotate_event_cb(void *data, int type, void *event_info);
+static void _object_deleted_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _remove_ecore_handlers(void);
+static Eina_Bool _rotary_rotate_handler_cb(void *data, Eext_Rotary_Event_Info *info);
+static int _pri_compare(const void *data1, const void *data2);
+static void _activated_obj_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+
+EAPI Eina_Bool
+eext_rotary_event_handler_add(Eext_Rotary_Handler_Cb func, void *data)
+{
+   Eext_Rotary_Handler *new_hd = NULL;
+   if (!func) return EINA_FALSE;
+
+   ERR("detent: In");
+   /* init event registration */
+   if (!_init_count)
+     {
+        ERR("init_count: %d", _init_count);
+#ifdef WITH_X
+        if (!_init_Xi2_system())
+          {
+             ERR("Failed to init Xi2 system");
+             return EINA_FALSE;
+          }
+#endif
+#ifdef WITH_WAYLAND
+        if (!_init_ecore_event())
+          {
+             ERR("Failed to init ecore_event");
+             return EINA_FALSE;
+          }
+#endif
+     }
+
+#ifdef WITH_X
+   /* register event handlers */
+   if (!_motion_handler)
+     {
+        _motion_handler = ecore_event_handler_add(ECORE_X_EVENT_GENERIC,
+                                                  _motion_changed_cb, NULL);
+        if (!_motion_handler)
+          {
+             ERR("Cannot register generic ecore event handler");
+             return EINA_FALSE;
+          }
+     }
+#endif
+#ifdef WITH_WAYLAND
+   if (!_ecore_detent_handler)
+     {
+        _ecore_detent_handler = ecore_event_handler_add(ECORE_EVENT_DETENT_ROTATE,
+                                                        _ecore_detent_cb, NULL);
+        if (!_ecore_detent_handler)
+          {
+             ERR("Cannot register ecore detent handler");
+             return EINA_FALSE;
+          }
+     }
+#endif
+   if (!_rotate_handler)
+     {
+        _rotate_handler = ecore_event_handler_add(EEXT_EVENT_ROTARY_ROTATE,
+                                                  _rotary_rotate_event_cb, NULL);
+        if (!_rotate_handler)
+          {
+             ERR("Cannot register eext rotate event handler");
+             return EINA_FALSE;
+          }
+     }
+
+   new_hd = malloc(sizeof(Eext_Rotary_Handler));
+   if (!new_hd)
+     {
+        ERR("Cannot allocate memory");
+        return EINA_FALSE;
+     }
+   new_hd->func = func;
+   new_hd->data = data;
+   handlers = eina_list_append(handlers, new_hd);
+
+   return EINA_TRUE;
+}
+
+EAPI void *
+eext_rotary_event_handler_del(Eext_Rotary_Handler_Cb func)
+{
+   ERR("detent: In");
+   Eina_List *l = NULL;
+   Eext_Rotary_Handler *hd = NULL;
+   void *data = NULL;
+
+   EINA_LIST_FOREACH(handlers, l, hd)
+     {
+        if (hd->func == func)
+          {
+             data = hd->data;
+             handlers = eina_list_remove(handlers, hd);
+             free(hd);
+             if (!handlers)
+               {
+                  _remove_ecore_handlers();
+               }
+             break;
+          }
+     }
+   return data;
+}
+
+EAPI Eina_Bool
+eext_rotary_object_event_callback_add(Evas_Object *obj, Eext_Rotary_Event_Cb func, void *data)
+{
+   INF("In");
+   return eext_rotary_object_event_callback_priority_add(obj, 0, func, data);
+}
+
+EAPI Eina_Bool
+eext_rotary_object_event_callback_priority_add(Evas_Object *obj, Eext_Callback_Priority priority, Eext_Rotary_Event_Cb func, void *data)
+{
+   ERR("detent: In");
+   Eina_List *l;
+   Eext_Rotary_Obj_Pri *op = NULL;
+   Eext_Rotary_Cb *cb = NULL, *new_cb = NULL;
+   Eina_Bool registered = EINA_FALSE;
+   Eina_Bool added = EINA_FALSE;
+
+   if ((!obj) || (!func)) return EINA_FALSE;
+
+   if (!_handler_registered)
+     {
+        if (!eext_rotary_event_handler_add(_rotary_rotate_handler_cb, NULL))
+          {
+             ERR("Cannot register rotary handler");
+             return EINA_FALSE;
+          }
+        _handler_registered = EINA_TRUE;
+     }
+
+   new_cb = malloc(sizeof(Eext_Rotary_Cb));
+   if (!new_cb)
+     {
+        ERR("Cannot allocate memory");
+        return EINA_FALSE;
+     }
+   new_cb->obj = obj;
+   new_cb->func = func;
+   new_cb->data = data;
+   new_cb->pri = priority;
+   new_cb->del_registered = EINA_FALSE;
+
+   EINA_LIST_FOREACH(_obj_pri_callbacks, l, op)
+     {
+        if (op->obj == obj)
+          {
+             added = EINA_TRUE;
+             op->pri_callbacks = eina_list_sorted_insert(op->pri_callbacks,
+                                                         _pri_compare, new_cb);
+             break;
+          }
+     }
+   if (!added)
+     {
+        Eext_Rotary_Obj_Pri *new_op = NULL;
+
+        new_op = calloc(1, sizeof(Eext_Rotary_Obj_Pri));
+        if (!new_op)
+          {
+             ERR("Cannot allocate memory");
+             free(new_cb);
+             return EINA_FALSE;
+          }
+        new_op->obj = obj;
+        new_op->pri_callbacks = eina_list_append(new_op->pri_callbacks, new_cb);
+        _obj_pri_callbacks = eina_list_append(_obj_pri_callbacks, new_op);
+     }
+   _callbacks = eina_list_append(_callbacks, new_cb);
+
+   EINA_LIST_FOREACH(_callbacks, l, cb)
+     {
+        if (cb->obj == obj)
+          {
+             if (cb->del_registered)
+               {
+                  registered = EINA_TRUE;
+                  break;
+               }
+          }
+     }
+   if (!registered)
+     {
+        evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
+                                       _object_deleted_cb, obj);
+        new_cb->del_registered = EINA_TRUE;
+     }
+
+   return EINA_TRUE;
+}
+
+EAPI void *
+eext_rotary_object_event_callback_del(Evas_Object *obj, Eext_Rotary_Event_Cb func)
+{
+   INF("In");
+   Eina_List *l = NULL;
+   Eext_Rotary_Cb *cb = NULL;
+   void *data = NULL;
+
+   ERR("callback del 0x%x, %s, func : 0x%x", obj, evas_object_type_get(obj), func);
+
+   EINA_LIST_FOREACH(_callbacks, l, cb)
+     {
+        if ((cb->func == func) && (cb->obj == obj))
+          {
+             data = cb->data;
+             _callbacks = eina_list_remove(_callbacks, cb);
+             INF("Removed cb from callbacks");
+             break;
+          }
+        cb = NULL;
+     }
+   if (cb)
+     {
+        Eext_Rotary_Obj_Pri *op = NULL;
+
+        EINA_LIST_FOREACH(_obj_pri_callbacks, l, op)
+          {
+             if (op->obj == obj)
+               {
+                  op->pri_callbacks = eina_list_remove(op->pri_callbacks, cb);
+                  break;
+               }
+          }
+        free(cb);
+        INF("Freed cb");
+     }
+   if (!_callbacks)
+     {
+        eext_rotary_event_handler_del(_rotary_rotate_handler_cb);
+        _handler_registered = EINA_FALSE;
+     }
+   INF("done");
+
+   return data;
+}
+
+EAPI void
+eext_rotary_object_event_activated_set(Evas_Object *obj, Eina_Bool activated)
+{
+   if (!obj) return;
+
+   ERR("eext_rotary_object_event_activated_set : 0x%x, %s, _activated_obj : 0x%x, activated : %d", obj, evas_object_type_get(obj), _activated_obj, activated);
+
+   if (activated)
+     {
+        if (_activated_obj != obj)
+          {
+             if (_activated_obj != NULL)
+               {
+                  ERR("Activation delete!!!!");
+                  evas_object_event_callback_del(_activated_obj, EVAS_CALLBACK_DEL, _activated_obj_del_cb);
+                  evas_object_smart_callback_call(_activated_obj, SIG_DEACTIVATED, NULL);
+               }
+             _activated_obj = obj;
+             evas_object_event_callback_add(_activated_obj, EVAS_CALLBACK_DEL, _activated_obj_del_cb, NULL);
+          }
+        evas_object_smart_callback_call(_activated_obj, SIG_ACTIVATED, NULL);
+     }
+   else
+     {
+        if (obj == _activated_obj && _activated_obj != NULL)
+          {
+             evas_object_event_callback_del(_activated_obj, EVAS_CALLBACK_DEL, _activated_obj_del_cb);
+             evas_object_smart_callback_call(_activated_obj, SIG_DEACTIVATED, NULL);
+             _activated_obj = NULL;
+          }
+     }
+}
+
+#ifdef WITH_WAYLAND
+static void
+_rotary_rotate_event_free(void *udata EINA_UNUSED, void *fdata)
+{
+   ERR("detent: In");
+   INF("In: ddata: %p", fdata);
+   free(fdata);
+}
+
+static Eina_Bool
+_init_ecore_event(void)
+{
+   ERR("detent: In");
+   if (!ecore_event_init()) return EINA_FALSE;
+   EEXT_EVENT_ROTARY_ROTATE = ecore_event_type_new();
+   return EINA_TRUE;
+}
+static Eina_Bool
+_ecore_detent_cb(void *data, int type, void *event_info)
+{
+   ERR("detent: In");
+   Ecore_Event_Detent_Rotate *e = event_info;
+   Rotary_Raw_Info *event = NULL;
+
+   event = calloc(1, sizeof(Rotary_Raw_Info));
+   if (!event)
+     {
+        ERR("Cannot allocate memory");
+        return ECORE_CALLBACK_PASS_ON;
+     }
+   if (e->direction == ECORE_DETENT_DIRECTION_CLOCKWISE)
+     event->direction =  EEXT_ROTARY_DIRECTION_CLOCKWISE;
+   else
+     event->direction =  EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE;
+   event->time_stamp = e->timestamp;
+   ERR("detent: new EEXT_EVENT_ROTARY_ROTATE ecore event");
+   ecore_event_add(EEXT_EVENT_ROTARY_ROTATE, event, _rotary_rotate_event_free, NULL);
+
+   return ECORE_CALLBACK_PASS_ON;
+}
+#endif
+
+#ifdef WITH_X
+static Eina_Bool
+_init_Xi2_system(void)
+{
+   INF("In");
+   Ecore_X_Display *display = NULL;
+   Ecore_X_Window root_win;
+   int opcode = 0, event = 0, error = 0;
+   int major = XI_2_Major;
+   int minor = XI_2_Minor;
+   int dev_count = 0;
+   int i = 0;
+
+   if (_init_count > 0) return EINA_TRUE;
+   _init_count++;
+
+   EEXT_EVENT_ROTARY_ROTATE = ecore_event_type_new();
+   _xi_event_mask = (XIEventMask *)calloc(1, sizeof(XIEventMask));
+   display = ecore_x_display_get();
+   root_win = ecore_x_window_root_first_get();
+
+   /* Initialize Xi2 system */
+   /* Check if X input extension available */
+   if (!XQueryExtension((Display *)display, "XInputExtension", &opcode,
+                        &event, &error))
+     {
+        ERR("Failed to query XInputExtension");
+        return EINA_FALSE;
+     }
+
+   /* We support version 2.0 */
+   if (XIQueryVersion((Display *)display, &major, &minor) == BadRequest)
+     {
+        ERR("Failed to query XI Version");
+        return EINA_FALSE;
+     }
+
+   _xi_event_mask->deviceid = XIAllDevices;
+
+   /* Check device id */
+   XIDeviceInfo *dev_info = NULL;
+   dev_info = XIQueryDevice(display, XIAllDevices, &dev_count);
+
+   for (i = 0; i < dev_count; i++)
+     {
+        XIDeviceInfo *di = &(dev_info[i]);
+        if (!strncmp(di->name, TIZEN_DEV, sizeof(TIZEN_DEV)))
+          {
+             _xi_event_mask->deviceid = di->deviceid;
+             break;
+          }
+     }
+
+   if (dev_info) XIFreeDeviceInfo(dev_info);
+   /* SelectXi2Event */
+   _xi_event_mask->mask = (unsigned char *)(calloc(1, XIMaskLen(XI_LASTEVENT)));
+   XISetMask(_xi_event_mask->mask, XI_RawMotion);
+   _xi_event_mask->mask_len = sizeof(_xi_event_mask->mask);
+   int ret = XISelectEvents((Display *)display, (Window)root_win, _xi_event_mask, 1);
+   if (ret != 0)
+     {
+        ERR("Failed to Select Events");
+        return EINA_FALSE;
+     }
+
+   INF("Done");
+   return EINA_TRUE;
+}
+
+static Eina_Bool
+_motion_changed_cb(void *data, int type, void *event_info)
+{
+   Ecore_X_Event_Generic *ev = event_info;
+
+   switch((int)(ev->evtype))
+     {
+      case XI_RawMotion:
+         _process_raw_event(data, type, (XIRawEvent *)ev->data);
+         break;
+     }
+
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static void
+_rotary_rotate_event_free(void *udata EINA_UNUSED, void *fdata)
+{
+   INF("In: ddata: %p", fdata);
+   free(fdata);
+}
+
+static void
+_process_raw_event(void *data EINA_UNUSED, int type EINA_UNUSED, void *raw_event)
+{
+   XIRawEvent *xi_raw_event = raw_event;
+   double *value = xi_raw_event->raw_values;
+   Rotary_Raw_Info *event = NULL;
+
+   if (_xi_event_mask->deviceid != xi_raw_event->deviceid)
+     {
+        return;
+     }
+
+   INF("In");
+   event = calloc(1, sizeof(Rotary_Raw_Info));
+   if (!event)
+     {
+        ERR("Cannot allocate memory");
+        return;
+     }
+   event->devid = xi_raw_event->deviceid;
+   /** X(0): rotate: NOT USED;
+     Y(1): timestamp;
+     Z(2): direction (-1: counter clockwise, 1: clockwise, 0: None)
+    **/
+   if (XIMaskIsSet(xi_raw_event->valuators.mask, 1))
+     {
+        event->time_stamp = (unsigned int)(*(value + 1));
+        INF("time stamp: %d", event->time_stamp);
+     }
+   if (XIMaskIsSet(xi_raw_event->valuators.mask, 2))
+     {
+        int dir = (int)(*(value + 2));
+        INF("raw dir: %d", dir);
+        switch (dir)
+          {
+           case -1:
+              event->direction =  EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE;
+              INF("direction: Counter Clockwise");
+              ecore_event_add(EEXT_EVENT_ROTARY_ROTATE, event,
+                              _rotary_rotate_event_free, NULL);
+              break;
+           case 1:
+              event->direction = EEXT_ROTARY_DIRECTION_CLOCKWISE;
+              INF("direction: Clockwise");
+              ecore_event_add(EEXT_EVENT_ROTARY_ROTATE, event,
+                              _rotary_rotate_event_free, NULL);
+              break;
+           case 0:
+              INF("Not detent");
+              free(event);
+              break;
+           default:
+              INF("Should not get in here");
+              free(event);
+          }
+     }
+   else
+     {
+        free(event);
+     }
+}
+#endif
+
+static Eina_Bool
+_rotary_rotate_event_cb(void *data EINA_UNUSED, int type EINA_UNUSED, void *event_info)
+{
+   INF("In");
+   Eina_List *l;
+   Eext_Rotary_Handler *hd;
+   Rotary_Raw_Info *ev = event_info;
+   Eext_Rotary_Event_Info info;
+   info.direction = ev->direction;
+   info.time_stamp = ev->time_stamp;
+
+   EINA_LIST_FOREACH(handlers, l, hd)
+     {
+        if (!hd->func(hd->data, &info))
+          {
+             return ECORE_CALLBACK_DONE;
+          }
+     }
+
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static int
+_pri_compare(const void *data1, const void *data2)
+{
+   const Eext_Rotary_Cb *cb1 = data1;
+   const Eext_Rotary_Cb *cb2 = data2;
+   if (cb1 && cb2)
+     {
+        if (cb1->pri < cb2->pri)
+          return -1;
+        else if (cb1->pri > cb2->pri)
+          return 1;
+        else
+          return 0;
+     }
+
+   return 0;
+}
+
+static Eina_Bool
+_rotary_rotate_handler_cb(void *data EINA_UNUSED, Eext_Rotary_Event_Info *info)
+{
+   ERR("_rotary_rotate_handler_cb : 0x%x, %s, %d", _activated_obj, evas_object_type_get(_activated_obj), evas_object_visible_get(_activated_obj));
+   Eina_List *l;
+   Eext_Rotary_Cb *cb;
+
+   if (!info) return EINA_TRUE;
+
+   /* Deliver to the activated object and its parents */
+   if ((_activated_obj) &&
+       (evas_focus_state_get(evas_object_evas_get(_activated_obj))) &&
+       (evas_object_visible_get(_activated_obj)))
+     {
+        Evas_Object *obj = NULL;
+        Eext_Rotary_Obj_Pri *op = NULL;
+
+        obj = _activated_obj;
+        while(obj)
+          {
+             if (obj == _activated_obj)
+               {
+                 if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
+                    INF("Deliver clockwise rotary event to object: %p, %s, time_stamp : %d", obj, evas_object_type_get(obj), info->time_stamp);
+                 else
+                    INF("Deliver counter clockwise rotary event to object: %p, %s, time_stamp : %d", obj, evas_object_type_get(obj), info->time_stamp);
+               }
+             EINA_LIST_FOREACH(_obj_pri_callbacks, l, op)
+               {
+                  if (op->obj == obj)
+                    {
+                       EINA_LIST_FOREACH(op->pri_callbacks, l, cb)
+                         {
+                            if (!cb->func(cb->data, obj, info))
+                              {
+                                 return EINA_FALSE;
+                              }
+                         }
+                       break;
+                    }
+               }
+             obj = elm_object_parent_widget_get(obj);
+          }
+     }
+
+   return EINA_TRUE;
+}
+
+static void
+_remove_ecore_handlers(void)
+{
+   INF("In");
+#ifdef HAVE_X
+   if (_motion_handler)
+     {
+        ecore_event_handler_del(_motion_handler);
+        _motion_handler = NULL;
+        INF("removed _motion_handler");
+     }
+#endif
+#ifdef HAVE_WAYLAND
+   if (_ecore_detent_handler)
+     {
+        ecore_event_handler_del(_ecore_detent_handler);
+        _ecore_detent_handler = NULL;
+        INF("removed _ecore_detent_handler");
+     }
+#endif
+   if (_rotate_handler)
+     {
+        ecore_event_handler_del(_rotate_handler);
+        _rotate_handler = NULL;
+        INF("removed _rotate_handler");
+     }
+}
+
+static void
+_object_deleted_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
+{
+   ERR("In: data: %p, obj: %p", data, obj);
+   Eina_List *l = NULL;
+
+   Eext_Rotary_Obj_Pri *op = NULL;
+   EINA_LIST_FOREACH(_obj_pri_callbacks, l, op)
+     {
+        if (op->obj == obj)
+          {
+             Eina_List *l1 = NULL;
+             Eext_Rotary_Cb *cb = NULL;
+
+             EINA_LIST_FOREACH(op->pri_callbacks, l1, cb)
+               {
+                  _callbacks = eina_list_remove(_callbacks, cb);
+                  op->pri_callbacks = eina_list_remove(op->pri_callbacks, cb);
+                  free(cb);
+               }
+             _obj_pri_callbacks = eina_list_remove(_obj_pri_callbacks, op);
+             free(op);
+             break;
+          }
+     }
+   if (!_callbacks)
+     {
+        eext_rotary_event_handler_del(_rotary_rotate_handler_cb);
+        _handler_registered = EINA_FALSE;
+     }
+   if (_activated_obj == obj)
+     _activated_obj = NULL;
+   INF("done");
+}
+
+static void
+_activated_obj_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+   ERR("_activated_obj_del_cb : 0x%x", _activated_obj);
+
+   evas_object_event_callback_del(_activated_obj, EVAS_CALLBACK_DEL, _activated_obj_del_cb);
+   _activated_obj = NULL;
+}
diff --git a/src/wearable/efl_extension.c b/src/wearable/efl_extension.c
new file mode 100644 (file)
index 0000000..2bfc0a3
--- /dev/null
@@ -0,0 +1,109 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "efl_extension.h"
+#include "efl_extension_private.h"
+
+/*===========================================================================*
+ *                                 Local                                     *
+ *===========================================================================*/
+
+int _eext_log_dom = -1;
+
+static const char *
+_magic_string_get(eext_magic m)
+{
+       switch (m) {
+       case EEXT_MAGIC_NONE:
+               return "None (Freed Object)";
+
+       default:
+               return "<UNKNOWN>";
+     }
+}
+
+__CONSTRUCTOR__ static void
+eext_mod_init(void)
+{
+   eina_init();
+   _eext_log_dom = eina_log_domain_register("efl-extension", EINA_COLOR_LIGHTBLUE);
+   if (!_eext_log_dom)
+     {
+        EINA_LOG_ERR("could not register efl-extension log domain.");
+        _eext_log_dom = EINA_LOG_DOMAIN_GLOBAL;
+     }
+   INF("Init");
+}
+
+__DESTRUCTOR__ static void
+eext_mod_shutdown(void)
+{
+   INF("Shutdown\n");
+   if ((_eext_log_dom > -1) && (_eext_log_dom != EINA_LOG_DOMAIN_GLOBAL))
+     {
+        eina_log_domain_unregister(_eext_log_dom);
+        _eext_log_dom = -1;
+     }
+
+   eina_shutdown();
+}
+
+
+/*===========================================================================*
+ *                                Global                                     *
+ *===========================================================================*/
+
+void
+_eext_magic_fail(const void *d, eext_magic m, eext_magic req_m, const char *fname)
+{
+       ERR("\n*** MAGIC FAIL (%s) ***\n", fname);
+
+       if (!d)
+               ERR("  Input handle pointer is NULL!");
+       else if (m == EEXT_MAGIC_NONE)
+               ERR("  Input handle has already been freed!");
+       else if (m != req_m)
+               ERR("  Input handle is wrong type\n"
+                   "    Expected: %08x - %s\n"
+                   "    Supplied: %08x - %s",
+                   (unsigned int)req_m, _magic_string_get(req_m),
+                   (unsigned int)m, _magic_string_get(m));
+
+   if (getenv("EEXT_ERROR_ABORT")) abort();
+}
+
+/*===========================================================================*
+ *                                  API                                      *
+ *===========================================================================*/
+
+EAPI Eina_Bool
+eext_win_keygrab_set(Elm_Win *obj, const char *key)
+{
+       Eina_Bool ret = EINA_FALSE;
+       ret = elm_win_keygrab_set(obj, key, 0, 0, 0, ELM_WIN_KEYGRAB_TOPMOST);
+       if (!ret)
+               ERR("  Can't set keygrab of [%s].", key);
+       return ret;
+}
+EAPI Eina_Bool
+eext_win_keygrab_unset(Elm_Win *obj, const char *key)
+{
+       Eina_Bool ret = EINA_FALSE;
+       ret = elm_win_keygrab_unset(obj, key, 0, 0);
+       if (!ret)
+               ERR("  Can't unset keygrab of [%s].", key);
+       return ret;
+}
diff --git a/src/wearable/efl_extension_events.c b/src/wearable/efl_extension_events.c
new file mode 100644 (file)
index 0000000..132ee3a
--- /dev/null
@@ -0,0 +1,442 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "efl_extension.h"
+#include "efl_extension_private.h"
+
+typedef struct _Eext_Event_Mgr Eext_Event_Mgr;
+
+struct _Eext_Event_Mgr
+{
+   Eina_List *obj_events;
+   Evas *e;
+   Evas_Object *key_grab_rect;
+};
+
+typedef struct _Eext_Object_Event
+{
+   Evas_Object *obj;
+   Evas_Object *parent;
+   Eina_List *callbacks;
+   Eina_Bool delete_me : 1;
+   Eina_Bool on_callback : 1;
+} Eext_Object_Event;
+
+typedef struct _Eext_Event_Callback
+{
+   Eext_Callback_Type type;
+   void (*func)(void *data, Evas_Object *obj, void *event_info);
+   void *data;
+} Eext_Event_Callback;
+
+const char *EEXT_OBJ_KEY_EVENT_MGR = "_eext_obj_key_event_mgr";
+const char *EEXT_OBJ_KEY_OBJ_EVENT = "_eext_obj_key_obj_event";
+const char *EEXT_KEY_STOP = "XF86Stop";
+const char *EEXT_KEY_STOP2 = "Escape";
+const char *EEXT_KEY_STOP3 = "XF86Back";
+const char *EEXT_KEY_SEND = "XF86Send";
+const char *EEXT_KEY_SEND2 = "Menu";
+const char *EEXT_KEY_SEND3 = "XF86Menu";
+
+
+static Eina_List *event_mgrs = NULL;
+
+static void
+_eext_event_mgr_del(Eext_Event_Mgr *event_mgr)
+{
+   if (event_mgr->obj_events) return;
+
+   //Redundant Event Mgr. Remove it.
+   evas_object_del(event_mgr->key_grab_rect);
+   event_mgrs = eina_list_remove(event_mgrs, event_mgr);
+   free(event_mgr);
+}
+
+static void
+_eext_object_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   Eext_Event_Mgr *event_mgr = evas_object_data_get(obj, EEXT_OBJ_KEY_EVENT_MGR);
+   Eext_Object_Event *obj_event = data;
+   Eina_List *l;
+   Eext_Event_Callback *callback;
+
+   l = eina_list_data_find_list(event_mgr->obj_events, obj_event);
+   if (!l) return;
+
+   event_mgr->obj_events = eina_list_remove_list(event_mgr->obj_events, l);
+
+   EINA_LIST_FREE(obj_event->callbacks, callback) free(callback);
+   obj_event->callbacks = NULL;
+
+   if (obj_event->on_callback) obj_event->delete_me = EINA_TRUE;
+   else free(obj_event);
+
+   _eext_event_mgr_del(event_mgr);
+}
+
+static int
+_eext_layer_sort_cb(const void *data1, const void *data2)
+{
+   const Eext_Object_Event *obj_event = data1;
+   const Eext_Object_Event *obj_event2 = data2;
+
+   //1. Layer Compare
+   int layer1 = evas_object_layer_get(obj_event->obj);
+   int layer2 = evas_object_layer_get(obj_event2->obj);
+
+   return (layer1 < layer2) ? -1 : 1;
+}
+
+static Evas_Object *
+_eext_top_parent_candidates(Eina_List **candidates, Evas *e)
+{
+   Evas_Object *temp;
+   Evas_Object *parent;
+   Eina_List *l, *l_next;
+   Eext_Object_Event *obj_event;
+   Eina_List *_candidates = *candidates;
+   Eina_Bool found = EINA_FALSE;
+
+   //Get the top parent lists
+   EINA_LIST_FOREACH(_candidates, l, obj_event)
+     {
+        temp = obj_event->obj;
+        parent = obj_event->obj;
+        while (temp)
+          {
+             parent = temp;
+             temp = evas_object_smart_parent_get(temp);
+          }
+        obj_event->parent = parent;
+     }
+
+   //Leave only parent candidates.
+   parent = evas_object_top_get(e);
+
+   while (parent)
+     {
+        EINA_LIST_FOREACH(_candidates, l, obj_event)
+          {
+             if (parent == obj_event->parent)
+               {
+                  found = EINA_TRUE;
+                  obj_event->parent = NULL;
+               }
+          }
+        if (found) break;
+        parent = evas_object_below_get(parent);
+     }
+
+   //Redundant parents (no candidates)
+   EINA_LIST_FOREACH_SAFE(_candidates, l, l_next, obj_event)
+     {
+        if (!obj_event->parent) continue;
+        _candidates = eina_list_remove_list(_candidates, l);
+     }
+
+   *candidates = _candidates;
+   return parent;
+}
+
+static Eext_Object_Event *
+_eext_find_event_target(Eina_List *candidates, Evas_Object *parent)
+{
+   Eext_Object_Event *obj_event = NULL;
+   Eina_List *l;
+   Evas_Object *obj;
+   Eina_List *members = evas_object_smart_members_get(parent);
+   if (members)
+     {
+        EINA_LIST_REVERSE_FOREACH(members, l, obj)
+          {
+             obj_event = _eext_find_event_target(candidates, obj);
+             //got you!
+             if (obj_event)
+               {
+                  eina_list_free(members);
+                  return obj_event;
+               }
+          }
+        eina_list_free(members);
+     }
+
+   EINA_LIST_REVERSE_FOREACH(candidates, l, obj_event)
+     {
+        //got you!
+        if (parent == obj_event->obj) return obj_event;
+     }
+
+   return NULL;
+}
+
+static Eext_Object_Event *
+_eext_top_obj_event_find(Eext_Event_Mgr *event_mgr)
+{
+   Eext_Object_Event *obj_event = NULL;
+   Eina_List *l, *l_next;
+   Eina_List *candidates = NULL;
+   Evas_Object *parent;
+   int top_layer;
+   Eina_Bool invisible;
+
+   //1. filter the invisible objs
+   EINA_LIST_FOREACH(event_mgr->obj_events, l, obj_event)
+     {
+        parent = obj_event->obj;
+        invisible = EINA_FALSE;
+
+        while (parent)
+          {
+             if (!evas_object_visible_get(parent))
+               {
+                  invisible = EINA_TRUE;
+                  break;
+               }
+             parent = evas_object_smart_parent_get(parent);
+          }
+        if (invisible) continue;
+        candidates = eina_list_append(candidates, obj_event);
+     }
+   if (!candidates) return NULL;   //no visible objects.
+   if (eina_list_count(candidates) == 1) goto found;
+
+   //2.1. sort by layer order
+   candidates = eina_list_sort(candidates, eina_list_count(candidates),
+                               _eext_layer_sort_cb);
+
+   //2.2. leave the only top layer
+   obj_event = eina_list_data_get(eina_list_last(candidates));
+   top_layer = evas_object_layer_get(obj_event->obj);
+
+   EINA_LIST_FOREACH_SAFE(candidates, l, l_next, obj_event)
+     {
+        if (evas_object_layer_get(obj_event->obj) < top_layer)
+          candidates = eina_list_remove_list(candidates, l);
+     }
+   if (eina_list_count(candidates) == 1) goto found;
+
+   //3. find the top parent candidate.
+   parent = _eext_top_parent_candidates(&candidates, event_mgr->e);
+   if (eina_list_count(candidates) == 1) goto found;
+
+   //4. find the target in this parent tree.
+   obj_event = _eext_find_event_target(candidates, parent);
+   eina_list_free(candidates);
+   return obj_event;
+
+found:
+   obj_event = eina_list_data_get(candidates);
+   eina_list_free(candidates);
+   return obj_event;
+}
+
+static void
+_eext_key_grab_rect_key_up_cb(void *data, Evas *e, Evas_Object *obj,
+                            void *event_info)
+{
+   Evas_Event_Key_Down *ev = event_info;
+   Eext_Event_Mgr *event_mgr = data;
+   Eext_Object_Event *obj_event;
+   Eext_Event_Callback *callback;
+   Eext_Callback_Type type;
+   Eina_List *l;
+
+   obj_event = _eext_top_obj_event_find(event_mgr);
+   if (!obj_event) return;
+
+   if (!strcmp(ev->keyname, EEXT_KEY_STOP) ||
+       !strcmp(ev->keyname, EEXT_KEY_STOP2) ||
+       !strcmp(ev->keyname, EEXT_KEY_STOP3))
+     type = EEXT_CALLBACK_BACK;
+   else if (!strcmp(ev->keyname, EEXT_KEY_SEND) ||
+            !strcmp(ev->keyname, EEXT_KEY_SEND2) ||
+            !strcmp(ev->keyname, EEXT_KEY_SEND3))
+     type = EEXT_CALLBACK_MORE;
+   else return;
+
+   obj_event->on_callback = EINA_TRUE;
+   EINA_LIST_FOREACH(obj_event->callbacks, l, callback)
+     {
+        if (callback->type != type) continue;
+        callback->func(callback->data, obj_event->obj, (void*) type);
+        if (obj_event->delete_me) break;
+     }
+   if (obj_event->delete_me) free(obj_event);
+   else obj_event->on_callback = EINA_FALSE;
+}
+
+static void
+_eext_key_grab_obj_create(Eext_Event_Mgr *event_mgr)
+{
+   Evas_Object *key_grab_rect = evas_object_rectangle_add(event_mgr->e);
+
+   evas_object_event_callback_add(key_grab_rect, EVAS_CALLBACK_KEY_UP,
+                                  _eext_key_grab_rect_key_up_cb, event_mgr);
+   if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_STOP, 0, 0, EINA_FALSE))
+     ERR("Failed to grab END KEY\n");
+
+   if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_STOP2, 0, 0, EINA_FALSE))
+     ERR("Failed to grab END KEY\n");
+
+   if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_STOP3, 0, 0, EINA_FALSE))
+     ERR("Failed to grab END KEY\n");
+
+   if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_SEND, 0, 0, EINA_FALSE))
+     ERR("Failed to grab MORE KEY\n");
+
+   if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_SEND2, 0, 0, EINA_FALSE))
+     ERR("Failed to grab MORE KEY\n");
+
+   if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_SEND3, 0, 0, EINA_FALSE))
+     ERR("Failed to grab MORE KEY\n");
+
+   event_mgr->key_grab_rect = key_grab_rect;
+}
+
+static Eext_Event_Mgr *
+_eext_event_mgr_new(Evas *e)
+{
+   Eext_Event_Mgr *event_mgr = calloc(1, sizeof(Eext_Event_Mgr));
+   if (!event_mgr)
+     {
+        ERR("Failed to allocate event manager");
+        return NULL;
+     }
+   event_mgr->e = e;
+   _eext_key_grab_obj_create(event_mgr);
+
+   return event_mgr;
+}
+
+EAPI void *
+eext_object_event_callback_del(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func)
+{
+   Eext_Object_Event *obj_event;
+   Eext_Event_Mgr *event_mgr;
+   Eina_List *l;
+   Eext_Event_Callback *callback;
+   void *data;
+
+   //Check the validation
+   event_mgr = evas_object_data_get(obj, EEXT_OBJ_KEY_EVENT_MGR);
+   obj_event = evas_object_data_get(obj, EEXT_OBJ_KEY_OBJ_EVENT);
+
+   if (!event_mgr || !obj_event)
+     {
+        WRN("This object(%p) hasn't been registered before", obj);
+        return NULL;
+     }
+
+   //Remove the callback data
+   EINA_LIST_REVERSE_FOREACH(obj_event->callbacks, l, callback)
+     {
+        if ((callback->func == func) && (callback->type == type)) break;
+     }
+
+   if (!callback)
+     {
+        WRN("This object(%p) hasn't been registered before with the given type(%d) and func(%p)", obj, type, func);
+        return NULL;
+     }
+
+   data = callback->data;
+   obj_event->callbacks = eina_list_remove_list(obj_event->callbacks, l);
+   free(callback);
+
+   //This object is not managed anymore.
+   if (!obj_event->callbacks)
+     {
+        evas_object_data_set(obj, EEXT_OBJ_KEY_OBJ_EVENT, NULL);
+        evas_object_data_set(obj, EEXT_OBJ_KEY_EVENT_MGR, NULL);
+        Eina_List *l = eina_list_data_find_list(event_mgr->obj_events,
+                                                obj_event);
+        if (l)
+          event_mgr->obj_events = eina_list_remove_list(event_mgr->obj_events,
+                                                        l);
+        if (obj_event->on_callback) obj_event->delete_me = EINA_TRUE;
+        else free(obj_event);
+
+        evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL, _eext_object_del_cb);
+     }
+
+   _eext_event_mgr_del(event_mgr);
+
+   return data;
+}
+
+EAPI void
+eext_object_event_callback_add(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func, void *data)
+{
+   Eext_Event_Mgr *event_mgr;
+   Evas *e;
+   Eext_Object_Event *obj_event = NULL;
+   Eina_List *l;
+   Eext_Event_Callback *callback;
+   Eina_Bool new_event_mgr = EINA_TRUE;
+
+   //Check the registered event manager for this Evas.
+   e = evas_object_evas_get(obj);
+
+   EINA_LIST_FOREACH(event_mgrs, l, event_mgr)
+     {
+        if (event_mgr->e == e)
+          {
+             new_event_mgr = EINA_FALSE;
+             break;
+          }
+     }
+
+   //New Evas comes. Create new event manager for this Evas.
+   if (new_event_mgr)
+     {
+        if (!(event_mgr = _eext_event_mgr_new(e))) return;
+        event_mgrs = eina_list_append(event_mgrs, event_mgr);
+     }
+
+   obj_event = evas_object_data_get(obj, EEXT_OBJ_KEY_OBJ_EVENT);
+
+   //New Object Event. Probably user adds eext_object_event_callback first time.
+   if (!obj_event)
+     {
+        obj_event = calloc(1, sizeof(Eext_Object_Event));
+        if (!obj_event)
+          {
+             ERR("Failed to allocate object event");
+             return;
+          }
+        evas_object_data_set(obj, EEXT_OBJ_KEY_OBJ_EVENT, obj_event);
+        evas_object_data_set(obj, EEXT_OBJ_KEY_EVENT_MGR, event_mgr);
+        evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
+                                       _eext_object_del_cb,
+                                       obj_event);
+        event_mgr->obj_events = eina_list_append(event_mgr->obj_events,
+                                                 obj_event);
+        obj_event->obj = obj;
+     }
+
+   //Append this callback.
+   callback = calloc(1, sizeof(Eext_Event_Callback));
+   if (!callback)
+     {
+        ERR("Failed to allocate event callback");
+        return;
+     }
+   callback->type = type;
+   callback->func = func;
+   callback->data = data;
+
+   obj_event->callbacks = eina_list_append(obj_event->callbacks, callback);
+}
diff --git a/src/wearable/efl_extension_more_option.c b/src/wearable/efl_extension_more_option.c
new file mode 100644 (file)
index 0000000..1855fbf
--- /dev/null
@@ -0,0 +1,676 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "efl_extension.h"
+#include "efl_extension_private.h"
+#include "circle/efl_extension_circle_private.h"
+#include "common/efl_extension_common_private.h"
+
+#define EEXT_MORE_OPTION_DATA_KEY "eext_more_option_data"
+
+/* === /internal object cb & util === */
+static void _drawer_back_cb(void *data, Evas_Object *obj, void *event_info);
+static void _panel_active_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
+static void _panel_inactive_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
+static void _panel_cue_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
+static void _panel_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _cue_hide_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
+static void _cue_show_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
+
+/* === internal object creation (elm-demo-tizen/drawer.c) === */
+static Evas_Object *_drawer_layout_create(Evas_Object *parent);
+static Evas_Object *_panel_create(Evas_Object *parent, Eext_More_Option_Data *mold);
+
+/* === more option API === */
+static Eext_More_Option_Data *_more_option_data_init(Evas_Object *obj, Evas_Object *parent);
+static Eext_More_Option_Data *_more_option_data_get(const Evas_Object *more_option);
+static void _more_option_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+
+/* === Accessibility === */
+static Eina_Bool _access_action_cb(void *data, Evas_Object *obj, Elm_Access_Action_Info *action_info);
+static char * _accessibility_name_set_cb(void *data, Evas_Object *obj);
+
+/* === internal object cb & util === */
+static void
+_drawer_back_cb(void *data, Evas_Object *obj, void *event_info)
+{
+   Evas_Object *panel = obj;
+   if (!panel)
+     {
+        ERR("panel is NULL!!");
+        return;
+     }
+
+   Eext_More_Option_Data *mold = data;
+   if (!mold)
+     {
+        ERR("mold is NULL!!");
+        return;
+     }
+
+   if (!elm_panel_hidden_get(panel)) elm_panel_toggle(panel);
+}
+
+static void
+_panel_active_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+   Eext_More_Option_Data *mold = data;
+
+   if (mold)
+     {
+        evas_object_smart_callback_call(mold->more_option, "more,option,opened", NULL);
+        eext_rotary_object_event_activated_set(mold->rotary_selector, EINA_TRUE);
+        eext_object_event_callback_add(obj, EEXT_CALLBACK_BACK, _drawer_back_cb, mold);
+
+        Edje_Message_Int_Set *msg = malloc(sizeof(Edje_Message_Int_Set));
+        if (!msg) return;
+
+        msg->count = 1;
+        msg->val[0] = 0;
+
+        Evas_Object* content_part = elm_object_part_content_get(mold->rotary_selector, "content");
+        if (content_part)
+          {
+             edje_object_message_send(elm_layout_edje_get(content_part), EDJE_MESSAGE_INT_SET, 0, msg);
+          }
+        else
+          free(msg);
+        //for accessibility
+        // signal send to rotary selector for highlighted access object
+        if(elm_atspi_bridge_utils_is_screen_reader_enabled())
+          {
+             evas_object_smart_callback_call(mold->rotary_selector, "more,option,opened", NULL);
+             elm_atspi_accessible_can_highlight_set(mold->cue_access_object, EINA_FALSE);
+             evas_object_show(mold->rotary_selector);
+          }
+        //
+     }
+}
+
+static void
+_panel_inactive_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+   Eext_More_Option_Data *mold = data;
+   if (mold)
+     {
+        evas_object_smart_callback_call(mold->more_option, "more,option,closed", NULL);
+        eext_rotary_object_event_activated_set(mold->rotary_selector, EINA_FALSE);
+
+        Edje_Message_Int_Set *msg = malloc(sizeof(Edje_Message_Int_Set));
+        if (!msg) return;
+
+        msg->count = 1;
+        msg->val[0] = 1;
+
+        Evas_Object* content_part = elm_object_part_content_get(mold->rotary_selector, "content");
+        if (content_part)
+          {
+             edje_object_message_send(elm_layout_edje_get(content_part), EDJE_MESSAGE_INT_SET, 0, msg);
+          }
+        else
+          free(msg);
+
+        //item index is initialized as zero.
+        if (mold->rotary_selector)
+          {
+             //Initialize item to zero
+             Eina_List *l = NULL;
+             Eext_Object_Item *item = NULL;
+             EINA_LIST_FOREACH(mold->item_list, l, item)
+               {
+                  break;
+               }
+
+             eext_rotary_selector_selected_item_set(mold->rotary_selector, item);
+          }
+
+        //for accessibility
+        // signal send to rotary selector for highlighted access object
+        if(elm_atspi_bridge_utils_is_screen_reader_enabled())
+          {
+             elm_atspi_accessible_can_highlight_set(mold->cue_access_object, EINA_TRUE);
+             elm_atspi_component_highlight_grab(mold->cue_access_object);
+             evas_object_smart_callback_call(mold->rotary_selector, "more,option,closed", NULL);
+             evas_object_hide(mold->rotary_selector);
+          }
+        //
+     }
+
+   eext_object_event_callback_del(obj, EEXT_CALLBACK_BACK, _drawer_back_cb);
+}
+
+static void
+_panel_cue_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+   INF("more_option cue clicked!!");
+
+   Eext_More_Option_Data *mold = data;
+   if (mold)
+     evas_object_smart_callback_call(mold->more_option, "cue,clicked", NULL);
+}
+
+static void
+_panel_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   elm_layout_signal_callback_del(obj, "elm,state,active,finished", "elm", _panel_active_cb);
+   elm_layout_signal_callback_del(obj, "elm,state,inactive,finished", "elm", _panel_inactive_cb);
+   elm_layout_signal_callback_del(obj, "cue,hide", "ext", _cue_hide_cb);
+   elm_layout_signal_callback_del(obj, "cue,show", "ext", _cue_show_cb);
+}
+
+/* === internal object creation (elm-demo-tizen/drawer.c) === */
+static Evas_Object *
+_drawer_layout_create(Evas_Object *parent)
+{
+   Evas_Object *layout;
+   layout = elm_layout_add(parent);
+   if (!layout)
+     {
+        ERR("drawer layout is NULL");
+        return NULL;
+     }
+
+   elm_layout_theme_set(layout, "layout", "drawer", "panel");
+   evas_object_show(layout);
+
+   return layout;
+}
+
+static Evas_Object *
+_panel_create(Evas_Object *parent, Eext_More_Option_Data *mold)
+{
+   Evas_Object *panel;
+
+   panel = elm_panel_add(parent);
+   if (!panel)
+     {
+        ERR("panel is NULL");
+        return NULL;
+     }
+
+   evas_object_show(panel);
+
+   //Default : right
+   elm_panel_orient_set(panel, ELM_PANEL_ORIENT_RIGHT);
+   elm_object_part_content_set(parent, "elm.swallow.right", panel);
+
+   evas_object_event_callback_add(panel, EVAS_CALLBACK_DEL, _panel_del_cb, NULL);
+
+   return panel;
+}
+
+/* === more option API === */
+static Eext_More_Option_Data *
+_more_option_data_init(Evas_Object *obj, Evas_Object *parent)
+{
+   Eext_More_Option_Data *mold = NULL;
+
+   mold = (Eext_More_Option_Data *)calloc(1, sizeof(Eext_More_Option_Data));
+   if (!mold)
+     {
+        ERR("mold is NULL!!");
+        return NULL;
+     }
+
+   mold->parent = parent;
+   mold->more_option = obj;
+   mold->item_list = NULL;
+   mold->panel = NULL;
+   mold->rotary_selector = NULL;
+   mold->direction = EEXT_MORE_OPTION_DIRECTION_RIGHT;
+
+   return mold;
+}
+
+static Eext_More_Option_Data *
+_more_option_data_get(const Evas_Object *more_option)
+{
+   if (!more_option)
+     {
+        ERR("more_option is NULL!!");
+        return NULL;
+     }
+
+   return evas_object_data_get(more_option, EEXT_MORE_OPTION_DATA_KEY);
+}
+
+static void
+_more_option_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   Eext_More_Option_Data *mold = data;
+
+   if (mold->item_list)
+     {
+        mold->item_list = eina_list_free(mold->item_list);
+     }
+
+   evas_object_data_del(obj, EEXT_MORE_OPTION_DATA_KEY);
+
+   free(mold);
+}
+
+static void
+_cue_hide_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+   INF("called!!");
+
+   Eext_More_Option_Data *mold = data;
+
+   elm_layout_signal_emit(mold->panel, "cue,hide", "elm");
+}
+
+static void
+_cue_show_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+   INF("called!!");
+
+   Eext_More_Option_Data *mold = data;
+
+   elm_layout_signal_emit(mold->panel, "cue,show", "elm");
+}
+
+static void
+_rotary_selector_item_clicked(void *data, Evas_Object *obj, void *event_info)
+{
+   Eext_More_Option_Data *mold = (Eext_More_Option_Data *)data;
+   evas_object_smart_callback_call(mold->more_option, "item,clicked", event_info);
+}
+
+static void
+_rotary_selector_item_selected(void *data, Evas_Object *obj, void *event_info)
+{
+   Eext_More_Option_Data *mold = (Eext_More_Option_Data *)data;
+   evas_object_smart_callback_call(mold->more_option, "item,selected", event_info);
+}
+
+/* === public API implementation === */
+
+EAPI Evas_Object *
+eext_more_option_add(Evas_Object *parent)
+{
+   if (!parent)
+     {
+        ERR("parent is NULL!!");
+        return NULL;
+     }
+
+   Eext_More_Option_Data *mold = NULL;
+   Evas_Object *more_option = NULL;
+
+   more_option = _drawer_layout_create(parent);
+   if (!more_option)
+     {
+        ERR("more_option is NULL!!");
+        return NULL;
+     }
+
+   mold = _more_option_data_init(more_option, parent);
+   if (!mold)
+     {
+        ERR("mold is NULL!!");
+        return NULL;
+     }
+
+   evas_object_data_set(mold->more_option, EEXT_MORE_OPTION_DATA_KEY, mold);
+   elm_layout_signal_callback_add(mold->more_option, "cue,hide", "ext", _cue_hide_cb, mold);
+   elm_layout_signal_callback_add(mold->more_option, "cue,show", "ext", _cue_show_cb, mold);
+   evas_object_event_callback_add(mold->more_option, EVAS_CALLBACK_DEL, _more_option_del_cb, mold);
+
+   mold->panel = _panel_create(mold->more_option, mold);
+   if (!mold->panel)
+     {
+        ERR("panel is NULL!!");
+        return NULL;
+     }
+
+   elm_layout_signal_callback_add(mold->panel, "elm,state,active,finished", "elm", _panel_active_cb, mold);
+   elm_layout_signal_callback_add(mold->panel, "elm,state,inactive,finished", "elm", _panel_inactive_cb, mold);
+   elm_layout_signal_callback_add(mold->panel, "cue,clicked", "elm", _panel_cue_clicked_cb, mold);
+
+   mold->rotary_selector = eext_rotary_selector_add(mold->more_option);
+   if (!mold->rotary_selector)
+     {
+        ERR("rotary_selector is NULL!!");
+        return NULL;
+     }
+   _rotary_selector_from_moreoption_set(mold->rotary_selector, EINA_TRUE);
+
+   evas_object_smart_callback_add(mold->rotary_selector, "item,selected", _rotary_selector_item_selected, mold);
+   evas_object_smart_callback_add(mold->rotary_selector, "item,clicked", _rotary_selector_item_clicked, mold);
+
+   Evas_Object *selector_content = elm_layout_add(mold->rotary_selector);
+   if (!selector_content)
+     {
+        ERR("selector_content is NULL!!");
+        return NULL;
+     }
+
+   elm_layout_theme_set(selector_content, "rotary_selector", "content", "more_option");
+
+   elm_object_part_content_set(mold->rotary_selector, "content", selector_content);
+
+   elm_object_content_set(mold->panel, mold->rotary_selector);
+
+   elm_panel_toggle(mold->panel);
+
+   //for accessibility
+   if(elm_atspi_bridge_utils_is_screen_reader_enabled())
+     {
+        evas_object_hide(mold->rotary_selector);
+
+        Evas_Object *to = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(mold->panel), "access");
+        mold->cue_access_object = elm_access_object_register(to, parent);
+
+        elm_atspi_accessible_name_cb_set(mold->cue_access_object, _accessibility_name_set_cb, (Eext_More_Option_Data*)mold);
+        elm_atspi_accessible_role_set(mold->cue_access_object, ELM_ATSPI_ROLE_PUSH_BUTTON);
+        elm_atspi_accessible_reading_info_type_set(mold->cue_access_object, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME);
+        elm_access_action_cb_set(mold->cue_access_object, ELM_ACCESS_ACTION_ACTIVATE, _access_action_cb, mold);
+     }
+   //
+
+   return mold->more_option;
+}
+
+EAPI void
+eext_more_option_direction_set(Evas_Object *obj, Eext_More_Option_Direction direction)
+{
+   if (!obj)
+     {
+        ERR("obj is NULL!!");
+        return;
+     }
+
+   Eext_More_Option_Data *mold = NULL;
+   mold = _more_option_data_get(obj);
+   if (mold)
+     {
+        elm_panel_orient_set(mold->panel, direction);
+        mold->direction = direction;
+     }
+}
+
+EAPI Eext_More_Option_Direction
+eext_more_option_direction_get(const Evas_Object *obj)
+{
+   if (!obj)
+     {
+        ERR("obj is NULL!!");
+        return EEXT_MORE_OPTION_DIRECTION_RIGHT; // defalut
+     }
+
+   Eext_More_Option_Data *mold = NULL;
+   mold = _more_option_data_get((Evas_Object *)obj);
+   if (mold)
+     {
+        Elm_Panel_Orient orient = elm_panel_orient_get(mold->panel);
+        return (Eext_More_Option_Direction)orient;
+     }
+
+   return EEXT_MORE_OPTION_DIRECTION_RIGHT; // defalut
+}
+
+EAPI Eext_Object_Item *
+eext_more_option_item_append(Evas_Object *obj)
+{
+   Eext_Object_Item *item = NULL;
+   Eext_More_Option_Data *mold = NULL;
+   mold = _more_option_data_get(obj);
+   if (!mold)
+     {
+        ERR("mold is NULL!!");
+        return NULL;
+     }
+
+   item = eext_rotary_selector_item_append(mold->rotary_selector);
+
+   mold->item_list = eina_list_append(mold->item_list, item);
+
+   return item;
+}
+
+EAPI Eext_Object_Item *
+eext_more_option_item_prepend(Evas_Object *obj)
+{
+   Eext_More_Option_Data *mold = NULL;
+   Eext_Object_Item *item = NULL;
+
+   mold = _more_option_data_get(obj);
+   if (!mold)
+     {
+        ERR("mold is NULL!!");
+        return NULL;
+     }
+
+   item = eext_rotary_selector_item_prepend(mold->rotary_selector);
+
+   mold->item_list = eina_list_prepend(mold->item_list, item);
+
+   return item;
+}
+
+EAPI Eext_Object_Item *
+eext_more_option_item_insert_after(Evas_Object *obj, Eext_Object_Item *after)
+{
+   Eext_More_Option_Data *mold = NULL;
+   Eext_Object_Item *item = NULL;
+
+   mold = _more_option_data_get(obj);
+   if (!mold)
+     {
+        ERR("mold is NULL!!");
+        return NULL;
+     }
+
+   item = eext_rotary_selector_item_insert_after(mold->rotary_selector, after);
+
+   mold->item_list = eina_list_append_relative(mold->item_list, item, after);
+
+   return item;
+}
+
+EAPI Eext_Object_Item *
+eext_more_option_item_insert_before(Evas_Object *obj, Eext_Object_Item *before)
+{
+   Eext_More_Option_Data *mold = NULL;
+   Eext_Object_Item *item = NULL;
+
+   mold = _more_option_data_get(obj);
+   if (!mold)
+     {
+        ERR("mold is NULL!!");
+        return NULL;
+     }
+
+   item = eext_rotary_selector_item_insert_before(mold->rotary_selector, before);
+
+   mold->item_list = eina_list_prepend_relative(mold->item_list, item, before);
+
+   return item;
+}
+
+EAPI void
+eext_more_option_item_del(Eext_Object_Item *item)
+{
+   //Temporary
+   Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item;
+   if (!rotary_selector_item)
+     {
+        ERR("rotary_selector_item is NULL!!");
+        return;
+     }
+
+   Eext_More_Option_Data *mold = _more_option_data_get(rotary_selector_item->parent);
+   if (!mold)
+     {
+        ERR("mold is NULL!!");
+        return;
+     }
+
+   eext_rotary_selector_item_del(item);
+
+   mold->item_list = eina_list_remove(mold->item_list, item);
+
+   return;
+}
+
+EAPI void
+eext_more_option_items_clear(Evas_Object *obj)
+{
+   Evas_Object *more_option = obj;
+   Eext_More_Option_Data *mold = NULL;
+
+   if (!more_option)
+     {
+        ERR("more_option is NULL!!");
+        return;
+     }
+
+   mold = _more_option_data_get(more_option);
+   if (!mold)
+     {
+        ERR("mold is NULL!!");
+        return;
+     }
+   eext_rotary_selector_items_clear(mold->rotary_selector);
+
+   mold->item_list = eina_list_free(mold->item_list);
+
+   return;
+}
+
+EAPI void
+eext_more_option_item_part_text_set(Eext_Object_Item *item, const char *part_name, const char *text)
+{
+   eext_rotary_selector_item_part_text_set(item, part_name, text);
+
+   return;
+}
+
+EAPI void
+eext_more_option_item_domain_translatable_part_text_set(Eext_Object_Item *item, const char *part_name, const char *domain, const char *text)
+{
+   eext_rotary_selector_item_domain_translatable_part_text_set(item, part_name, domain, text);
+
+   return;
+}
+
+EAPI const char *
+eext_more_option_item_part_text_get(const Eext_Object_Item *item, const char *part_name)
+{
+   return eext_rotary_selector_item_part_text_get(item, part_name);
+}
+
+EAPI void
+eext_more_option_item_part_content_set(Eext_Object_Item *item, const char *part_name, Evas_Object *content)
+{
+   eext_rotary_selector_item_part_content_set(item, part_name, EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL, content);
+
+   return;
+}
+
+EAPI Evas_Object *
+eext_more_option_item_part_content_get(const Eext_Object_Item *item, const char *part_name)
+{
+   return eext_rotary_selector_item_part_content_get(item, part_name, EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL);
+}
+
+EAPI void
+eext_more_option_opened_set(Evas_Object *obj, Eina_Bool opened)
+{
+   if (!obj)
+     {
+        ERR("obj is NULL!!");
+        return;
+     }
+
+   Eext_More_Option_Data *mold = NULL;
+   mold = _more_option_data_get(obj);
+   if (mold)
+     {
+        if (elm_panel_hidden_get(mold->panel) && opened) elm_panel_toggle(mold->panel);
+        else if (!elm_panel_hidden_get(mold->panel) && !opened) elm_panel_toggle(mold->panel);
+     }
+}
+
+EAPI Eina_Bool
+eext_more_option_opened_get(Evas_Object *obj)
+{
+   if (!obj)
+     {
+        ERR("obj is NULL!!");
+        return EINA_FALSE;
+     }
+
+   Eext_More_Option_Data *mold = NULL;
+   mold = _more_option_data_get(obj);
+   if (mold)
+     {
+        return !elm_panel_hidden_get(mold->panel);
+     }
+
+   return EINA_FALSE;
+}
+
+EAPI const Eina_List*
+eext_more_option_items_get(const Evas_Object *obj)
+{
+   const Evas_Object *more_option = obj;
+   Eext_More_Option_Data *mold = NULL;
+
+   if (!more_option)
+     {
+        ERR("more_option is NULL!!");
+        return NULL;
+     }
+
+   mold = _more_option_data_get(more_option);
+   if (!mold)
+     {
+        ERR("mold is NULL!!");
+        return NULL;
+     }
+
+   return eext_rotary_selector_items_get(mold->rotary_selector);
+}
+
+//for accessibility
+static Eina_Bool
+_access_action_cb(void *data, Evas_Object *obj, Elm_Access_Action_Info *action_info)
+{
+   Eext_More_Option_Data *mold = (Eext_More_Option_Data *)data;
+
+   switch (action_info->action_type)
+     {
+        case ELM_ACCESS_ACTION_ACTIVATE:
+          if (mold)
+            {
+               elm_panel_toggle(mold->panel);
+            }
+        break;
+     }
+   return EINA_FALSE;
+}
+static char *
+_accessibility_name_set_cb(void *data, Evas_Object *obj)
+{
+   char buf[255] = "";
+   bindtextdomain (PACKAGE, LOCALE_DIR);
+   textdomain (PACKAGE);
+
+   snprintf(buf, sizeof(buf), _("WDS_TTS_TBOPT_MORE_OPTIONS"));
+   return strdup(buf);
+}
+//
diff --git a/src/wearable/efl_extension_rotary_selector.c b/src/wearable/efl_extension_rotary_selector.c
new file mode 100644 (file)
index 0000000..b5b0fc1
--- /dev/null
@@ -0,0 +1,3173 @@
+/*
+ * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
+ *
+ * Licensed under the Flora License, Version 1.1 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://floralicense.org/license/
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "efl_extension.h"
+#include "efl_extension_private.h"
+#include "circle/efl_extension_circle_private.h"
+#include "common/efl_extension_common_private.h"
+
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+//
+//                                                                         efl_extension_rotary_selector.c
+//
+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+#define EEXT_ROTARY_SELECTOR_DATA_KEY "eext_rotary_selector_data"
+#define _ROTARY_SELECTOR_SCREEN_WIDTH 360
+#define _ROTARY_SELECTOR_SCREEN_HEIGHT 360
+#define _ROTARY_SELECTOR_SELECTOR_TOUCH_AREA_WIDTH 180
+#define _ROTARY_SELECTOR_SELECTOR_TOUCH_AREA_HEIGHT 180
+#define _ROTARY_SELECTOR_ITEM_DIVISION_ANGLE 30
+#define _ROTARY_SELECTOR_PAGE_ITEM_MAX 11
+#define _ROTARY_SELECTOR_PAGE_ANIMATION_DURATION 0.35
+#define _ROTARY_SELECTOR_NEXT_PAGE_ANIMATION_DELAY_TIME 0.1
+#define _ROTARY_SELECTOR_END_EFFECT_ANIMATION_DURATION 0.6
+#define _ROTARY_SELECTOR_CUBIC_BEZIER_P1_X 0.33
+#define _ROTARY_SELECTOR_CUBIC_BEZIER_P1_Y 0.0
+#define _ROTARY_SELECTOR_CUBIC_BEZIER_P2_X 0.3
+#define _ROTARY_SELECTOR_CUBIC_BEZIER_P2_Y 1.0
+#define _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID -3
+#define _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_PREVIOUS_PAGE_ITEM -2
+#define _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_NEXT_PAGE_ITEM -1
+#define _ROTARY_SELECTOR_ROTARY_EVENT_RESET_TIME 500
+#define _ROTARY_SELECTOR_ROTARY_EVENT_TIME_ACCELERATION_THRESHOLD 60
+
+
+#define _ROTARY_SELECTOR_DEBUG_ENABLED 0
+
+// ====================================== util ==================================== //
+#define _DEGREES_TO_RADIANS(degrees) (degrees * M_PI / 180.0)
+#define _RADIANS_TO_DEGREES(radians) (radians * 180.0 / M_PI)
+#define ALMOST_ZERO_FLOAT   0.00001f
+
+#define ROTARY_SELECTOR_COLOR_VALUE_SET(obj, part, state, r, g, b, a) \
+                               do { \
+                                  obj->part.state.r = r; \
+                                  obj->part.state.g = g; \
+                                  obj->part.state.b = b; \
+                                  obj->part.state.a = a; \
+                                  obj->part.state.set_flag = EINA_TRUE; \
+                               } while (0)
+
+#define ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, obj, part, state) \
+                              do { \
+                                 evas_object_color_set(content, \
+                                       obj->part.state.r, \
+                                       obj->part.state.g, \
+                                       obj->part.state.b, \
+                                       obj->part.state.a); \
+                              } while (0)
+
+#define ROTARY_SELECTOR_COLOR_VALUE_GET(obj, part, state, r, g, b, a) \
+                              do { \
+                                 if (r) *r = obj->part.state.r; \
+                                 if (g) *g = obj->part.state.g; \
+                                 if (b) *b = obj->part.state.b; \
+                                 if (a) *a = obj->part.state.a; \
+                              } while (0)
+
+static double
+_min(const double a, const double b)
+{
+   if (a < b)
+     {
+        return a;
+     }
+   return b;
+}
+
+static Eina_Bool
+_doubleCompare(double p1, double p2)
+{
+   if ((p1 == 0.f) || (p2 == 0.f))
+     {
+        return (p1 == p2 || abs(p1 - p2) <= ALMOST_ZERO_FLOAT);
+     }
+
+   return (p1 == p2 || abs(p1 - p2) <= ALMOST_ZERO_FLOAT * _min(abs(p1), abs(p2)));
+}
+
+static double
+_mouse_event_angle_get(Evas_Coord x, Evas_Coord y)
+{
+   const double center_x = _ROTARY_SELECTOR_SCREEN_WIDTH/2.0f;
+   const double center_y = _ROTARY_SELECTOR_SCREEN_HEIGHT/2.0f;
+
+   double default_angle = 90;
+   if (x < center_x)
+     {
+        default_angle = 270;
+     }
+   double calculated_x = x - center_x;
+   double calculated_y = y - center_y;
+   double radian = atan((double) calculated_y / calculated_x);
+
+   return (_RADIANS_TO_DEGREES(radian) + default_angle);
+}
+
+// ----------------------------------------- interpolator util --------------------------------------//
+
+void
+_circle_path_interpolator(Eext_Rotary_Selector_Data *rsd, double progress, const double startAngle, const double endAngle, const double startRadius, const double endRadius, double* pos_x, double* pos_y)
+{
+   const double center_x = _ROTARY_SELECTOR_SCREEN_WIDTH/2.0f;
+   const double center_y = _ROTARY_SELECTOR_SCREEN_HEIGHT/2.0f;
+
+   // 1. calculate angle
+   double angle = 0.f;
+   if (_doubleCompare(startAngle, endAngle))
+     {
+        angle = startAngle;
+     }
+   else if (startAngle < endAngle)
+     {
+        angle = startAngle + ((endAngle - startAngle) * progress);
+     }
+   else
+     {
+        angle = startAngle - ((startAngle - endAngle) * progress);
+     }
+
+   double radian = _DEGREES_TO_RADIANS(angle);
+   double cosValue = cos(radian);
+   double sinValue = sin(radian);
+
+   // 2. calculate radius
+   float radius = startRadius;
+   if (endRadius >= 0)
+     {
+        if (startRadius <= endRadius)
+          {
+             radius = startRadius + ((endRadius-startRadius)*progress);
+          }
+        else
+          {
+             radius = startRadius - ((startRadius-endRadius)*progress);
+          }
+     }
+
+   // 3. calculate target point
+   *pos_x = center_x + (radius * (float)(cosValue)) - (rsd->item_width / 2.f);
+   *pos_y = center_y + (radius * (float)(sinValue)) - (rsd->item_height / 2.f);
+
+   return;
+}
+// ----------------------------------------- event area API --------------------------------------//
+static void _event_area_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _event_area_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _event_area_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _event_area_mouse_out_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _event_area_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _event_area_callback_add(Eext_Rotary_Selector_Data *rsd);
+
+// ----------------------------------------- internal header --------------------------------------//
+static Eext_Rotary_Selector_Data *_eext_rotary_selector_data_init(Evas_Object *obj, Evas_Object *parent);
+static Eext_Rotary_Selector_Data *_eext_rotary_selector_data_get(Evas_Object *rotary_selector);
+static Eina_Bool _rotary_selector_visible_get(Evas_Object *rotary_selector);
+static Eina_Bool _rotary_selector_rotary_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info);
+static void _rotary_selector_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _rotary_selector_show_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static void _rotary_selector_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+
+// ----------------------------------------- item API --------------------------------------//
+static void _item_coords_update(Eext_Rotary_Selector_Data *rsd, Eext_Rotary_Selector_Item *item);
+static void _items_transformation_update(Eext_Rotary_Selector_Data *rsd);
+static void _items_invalidate(Eext_Rotary_Selector_Data *rsd);
+static void _layer_items_invalidate(Eext_Rotary_Selector_Data *rsd);
+static void _item_rearrange(Eext_Rotary_Selector_Data *rsd, int selected_index);
+static void _item_select(Eext_Rotary_Selector_Data *rsd, int index);
+static void _item_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
+static Eext_Rotary_Selector_Item *_item_create(Eext_Rotary_Selector_Data *rsd);
+static void _item_selected_signal_send(Eext_Rotary_Selector_Data *rsd, int previous_item_index, int current_item_index);
+static void _item_touched_signal_send(Eext_Rotary_Selector_Data *rsd, int index, Eina_Bool pressed, Eina_Bool sound);
+
+static Eext_Rotary_Selector_Item * _item_get(Eext_Rotary_Selector_Data *rsd, int index);
+static void _item_text_copy(char **target, const char* source);
+
+// ----------------------------------------- animation API --------------------------------------//
+static Eina_Bool _previous_page_animator_cb(void *data);
+static Eina_Bool _item_update_animator_cb(void *data);
+static void _page_animation_run(Eext_Rotary_Selector_Data *rsd, Eina_Bool direction);
+static void _end_effect_animation_run(Eext_Rotary_Selector_Data *rsd, Eina_Bool direction);
+static void _item_update_animation_run(Eext_Rotary_Selector_Data *rsd);
+static Eina_Bool _next_page_animator_cb(void *data);
+static Eina_Bool _next_page_timer_cb(void *data);
+static Eina_Bool _end_effect_animator_cb(void *data);
+
+// ----------------------------------------- selector API --------------------------------------//
+static void _selector_update(Eext_Rotary_Selector_Data *rsd, Eina_Bool page_changed, Eina_Bool is_animation);
+static void _selector_content_update(Eext_Rotary_Selector_Data *rsd);
+static void _selector_clicked_signal(void *data, Evas_Object *obj, const char *emission, const char *source);
+static void _selector_animation_finished_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
+
+// ----------------------------------------- Accessibility API --------------------------------------//
+static Eina_Bool _accessibility_event_area_highlighted_cb(void *data, Evas_Object *obj, Elm_Access_Action_Info *action_info);
+static void _accessibility_item_btn_highlighted_cb(void *data, Evas_Object *obj, void *event_info);
+static void _accessibility_set_relationship(Eext_Rotary_Selector_Data *rsd,int current_page);
+static char *_accessibility_item_name_set_cb(void *data, Evas_Object *obj);
+static char *_accessibility_name_set_cb(void *data, Evas_Object *obj);
+static char *_accessibility_description_set_cb(void *data, Evas_Object *obj);
+static void _rotary_selector_moreoption_opened_cb(void *data, Evas_Object *obj, void *event_info);
+static void _rotary_selector_moreoption_closed_cb(void *data, Evas_Object *obj, void *event_info);
+void _rotary_selector_from_moreoption_set(Evas_Object *rotary_selector, Eina_Bool from_more_option);
+static Eina_Bool _rotary_selector_from_moreoption_get(Evas_Object *rotary_selector);
+static void _accessibility_item_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info);
+
+// ----------------------------------------- event area API --------------------------------------//
+static void
+_event_area_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   const double center_x = _ROTARY_SELECTOR_SCREEN_WIDTH/2.0f;
+   const double center_y = _ROTARY_SELECTOR_SCREEN_HEIGHT/2.0f;
+   Evas_Event_Mouse_Down *ev = event_info;
+   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+
+   if (rsd->previous_page_animator || rsd->next_page_animator || rsd->end_effect_animator)
+     {
+        INF("animator is running!!");
+        return;
+     }
+   rsd->pressed = EINA_TRUE;
+
+   int point = sqrt(pow(center_x - ev->canvas.x, 2) + pow(center_y - ev->canvas.y, 2));
+   if (point > _ROTARY_SELECTOR_SELECTOR_TOUCH_AREA_WIDTH/2)
+     {
+        double angle = _mouse_event_angle_get(ev->canvas.x, ev->canvas.y);
+#if _ROTARY_SELECTOR_DEBUG_ENABLED
+        INF("OUTSIDE OF SELECTOR : angle : %f", angle);
+#endif
+
+        int new_index = 0;
+        int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
+        int last_index = 0;
+        int i = 0;
+        if (rsd->current_page == 0)
+          {
+             last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+          }
+        else
+          {
+             last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+          }
+        if (last_index > rsd->item_count - 1)
+          {
+             last_index = rsd->item_count - 1;
+          }
+
+        if (angle < 20.f)
+          {
+             rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_PREVIOUS_PAGE_ITEM;
+          }
+        else if (angle > 340.f)
+          {
+             rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_NEXT_PAGE_ITEM;
+          }
+        else
+          {
+             const float touchAreaAngle[] = { 45.f, 75.f, 105.f, 135.f, 165.f, 195.f, 225.f, 255.f, 285.f, 315.f, 340.f};
+             for(i = 0; i < _ROTARY_SELECTOR_PAGE_ITEM_MAX;i++)
+               {
+                  if(angle < touchAreaAngle[i]) break;
+               }
+
+             new_index = first_index + i;
+
+             if (last_index < new_index)
+               {
+                  rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID;
+               }
+             else
+               {
+                  rsd->pressed_item_index = new_index;
+                  _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_TRUE, EINA_FALSE);
+               }
+#if _ROTARY_SELECTOR_DEBUG_ENABLED
+             INF("pressed_item_index : %d", rsd->pressed_item_index);
+#endif
+          }
+       }
+}
+
+static void
+_event_area_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   const double center_x = _ROTARY_SELECTOR_SCREEN_WIDTH/2.0f;
+   const double center_y = _ROTARY_SELECTOR_SCREEN_HEIGHT/2.0f;
+   Evas_Event_Mouse_Move *ev = event_info;
+   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+
+   if (rsd->previous_page_animator || rsd->next_page_animator || rsd->end_effect_animator)
+     {
+        INF("animator is running!!");
+        return;
+     }
+   if (!rsd->pressed)
+     {
+        return;
+     }
+
+   if (rsd->touched_item_changed || rsd->pressed_item_index == _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID)
+     {
+        return;
+     }
+
+   int point = sqrt(pow(center_x - ev->cur.canvas.x, 2) + pow(center_y - ev->cur.canvas.y, 2));
+   if (point > _ROTARY_SELECTOR_SELECTOR_TOUCH_AREA_WIDTH/2)
+     {
+        double angle = _mouse_event_angle_get(ev->cur.canvas.x, ev->cur.canvas.y);
+#if _ROTARY_SELECTOR_DEBUG_ENABLED
+        INF("OUTSIDE OF SELECTOR : angle : %f", angle);
+#endif
+
+        int new_index = 0;
+        int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
+        int last_index = 0;
+        int i = 0;
+        if (rsd->current_page == 0)
+          {
+             last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+          }
+        else
+          {
+             last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+          }
+        if (last_index > rsd->item_count - 1)
+          {
+             last_index = rsd->item_count - 1;
+          }
+
+        if (angle < 20.f)
+          {
+             if (rsd->pressed_item_index != _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_PREVIOUS_PAGE_ITEM)
+               {
+                  rsd->touched_item_changed = EINA_TRUE;
+                  _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_FALSE, EINA_FALSE);
+               }
+          }
+        else if (angle > 340.f)
+          {
+             if (rsd->pressed_item_index != _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_NEXT_PAGE_ITEM)
+               {
+                  rsd->touched_item_changed = EINA_TRUE;
+                  _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_FALSE, EINA_FALSE);
+               }
+          }
+        else
+          {
+             const float touchAreaAngle[] = { 45.f, 75.f, 105.f, 135.f, 165.f, 195.f, 225.f, 255.f, 285.f, 315.f, 340.f};
+
+             for(i = 0; i < _ROTARY_SELECTOR_PAGE_ITEM_MAX; i++)
+               {
+                  if(angle < touchAreaAngle[i]) break;
+               }
+             new_index = first_index + i;
+
+             if (rsd->pressed_item_index != new_index)
+               {
+                  rsd->touched_item_changed = EINA_TRUE;
+                  _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_FALSE, EINA_FALSE);
+               }
+          }
+     }
+   else
+     {
+        if (rsd->pressed_item_index >= 0)
+          {
+             rsd->touched_item_changed = EINA_TRUE;
+             _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_FALSE, EINA_FALSE);
+          }
+     }
+}
+
+static void
+_event_area_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   const double center_x = _ROTARY_SELECTOR_SCREEN_WIDTH/2.0f;
+   const double center_y = _ROTARY_SELECTOR_SCREEN_HEIGHT/2.0f;
+   Evas_Event_Mouse_Up *ev = event_info;
+   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+
+   if (rsd->previous_page_animator || rsd->next_page_animator || rsd->end_effect_animator)
+     {
+        INF("animator is running!!");
+        return;
+     }
+   if (!rsd->pressed)
+     {
+        return;
+     }
+
+   int point = sqrt(pow(center_x - ev->canvas.x, 2) + pow(center_y - ev->canvas.y, 2));
+   if (point > _ROTARY_SELECTOR_SELECTOR_TOUCH_AREA_WIDTH/2)
+     {
+        if (rsd->touched_item_changed)
+          {
+             rsd->touched_item_changed = EINA_FALSE;
+             rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID;
+             rsd->pressed = EINA_FALSE;
+
+             return;
+          }
+
+        double angle = _mouse_event_angle_get(ev->canvas.x, ev->canvas.y);
+#if _ROTARY_SELECTOR_DEBUG_ENABLED
+        INF("OUTSIDE OF SELECTOR : angle : %f", angle);
+#endif
+
+        int new_index = 0;
+        int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
+        int last_index = 0;
+        int previous_item_index = rsd->selected_index;
+        int i = 0;
+        if (rsd->current_page == 0)
+          {
+             last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+          }
+        else
+          {
+             last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+          }
+        if (last_index > rsd->item_count - 1)
+          {
+             last_index = rsd->item_count - 1;
+          }
+
+        if (angle < 20.f)
+          {
+             if (rsd->current_page> 0)
+               {
+                  rsd->selected_index = first_index - 1;
+                  _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
+                  _page_animation_run(rsd, EINA_FALSE);
+                  _selector_update(rsd, EINA_TRUE, EINA_TRUE);
+                  evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
+               }
+          }
+        else if (angle > 340.f)
+          {
+             if (rsd->current_page < (rsd->item_count/_ROTARY_SELECTOR_PAGE_ITEM_MAX))
+               {
+                  rsd->selected_index = last_index + 1;
+                  _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
+                  _page_animation_run(rsd, EINA_TRUE);
+                  _selector_update(rsd, EINA_TRUE, EINA_TRUE);
+                  evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
+               }
+          }
+        else
+          {
+             const float touchAreaAngle[] = { 45.f, 75.f, 105.f, 135.f, 165.f, 195.f, 225.f, 255.f, 285.f, 315.f, 340.f};
+             for(i = 0; i < _ROTARY_SELECTOR_PAGE_ITEM_MAX; i++)
+               {
+                  if(angle < touchAreaAngle[i]) break;
+               }
+             new_index = first_index + i;
+
+             if (rsd->pressed_item_index == new_index)
+               {
+                  _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_FALSE, EINA_TRUE);
+                  rsd->selected_index = new_index;
+                  _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
+                  _selector_update(rsd, EINA_FALSE, EINA_FALSE);
+                  evas_object_smart_callback_call(rsd->rotary_selector, "item,clicked", (void*)_item_get(rsd, rsd->selected_index));
+               }
+          }
+     }
+
+   rsd->pressed = EINA_FALSE;
+   rsd->touched_item_changed = EINA_FALSE;
+   rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID;
+}
+
+static void
+_event_area_mouse_out_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+
+   if (rsd->pressed_item_index > 0)
+     {
+        _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_FALSE, EINA_FALSE);
+     }
+
+   rsd->pressed = EINA_FALSE;
+   rsd->touched_item_changed = EINA_FALSE;
+   rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID;
+}
+
+static void
+_event_area_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   INF("called!!");
+
+   evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_DOWN, _event_area_mouse_down_cb);
+   evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_MOVE, _event_area_mouse_move_cb);
+   evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_UP, _event_area_mouse_up_cb);
+   evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_OUT, _event_area_mouse_out_cb);
+}
+
+static void
+_event_area_callback_add(Eext_Rotary_Selector_Data *rsd)
+{
+   INF("called!!");
+
+   rsd->event_area = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(rsd->rotary_selector), "event_area");
+
+   if (rsd->event_area)
+     {
+        evas_object_event_callback_add(rsd->event_area, EVAS_CALLBACK_MOUSE_DOWN, _event_area_mouse_down_cb, rsd);
+        evas_object_event_callback_add(rsd->event_area, EVAS_CALLBACK_MOUSE_MOVE, _event_area_mouse_move_cb, rsd);
+        evas_object_event_callback_add(rsd->event_area, EVAS_CALLBACK_MOUSE_UP, _event_area_mouse_up_cb, rsd);
+        evas_object_event_callback_add(rsd->event_area, EVAS_CALLBACK_MOUSE_OUT, _event_area_mouse_out_cb, rsd);
+        evas_object_event_callback_add(rsd->event_area, EVAS_CALLBACK_DEL, _event_area_del_cb, rsd);
+     }
+}
+
+// ----------------------------------------- internal header --------------------------------------//
+static Eext_Rotary_Selector_Data *
+_eext_rotary_selector_data_init(Evas_Object *obj, Evas_Object *parent)
+{
+   Eext_Rotary_Selector_Data *rsd = NULL;
+   const char *radius = NULL;
+   const char *item_width = NULL;
+   const char *item_height = NULL;
+
+   rsd = (Eext_Rotary_Selector_Data *)calloc(1, sizeof(Eext_Rotary_Selector_Data));
+   if (!rsd)
+     {
+        ERR("rsd is NULL!!");
+        return NULL;
+     }
+   rsd->parent = parent;
+   rsd->rotary_selector = obj;
+   rsd->event_area = NULL;
+   rsd->item_list = NULL;
+   rsd->item_count = 0;
+   rsd->selected_index = 0;
+   rsd->current_page = 0;
+   rsd->animation_direction = EINA_TRUE;
+   rsd->previous_page_animator = NULL;
+   rsd->next_page_animator = NULL;
+   rsd->previous_page_animator_start_time = 0.0f;
+   rsd->next_page_animator_start_time = 0.0f;
+   rsd->next_page_animation_started = EINA_FALSE;
+   rsd->previous_page_animation_started = EINA_FALSE;
+   rsd->next_page_timer = NULL;
+   rsd->end_effect_animation_started = EINA_FALSE;
+   rsd->end_effect_animator_start_time = 0.0f;
+   rsd->end_effect_animator = NULL;
+   rsd->item_update_animator = NULL;
+   rsd->selector_bg_image_color.normal_color.set_flag = EINA_FALSE;
+   rsd->selector_bg_image_color.pressed_color.set_flag = EINA_FALSE;
+   rsd->pressed = EINA_FALSE;
+   rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID;
+   rsd->touched_item_changed = EINA_FALSE;
+   rsd->acceleration = EINA_FALSE;
+
+   radius = edje_object_data_get(elm_layout_edje_get(obj), "radius");
+   if (!radius)
+     {
+        ERR("radius is NULL!!");
+        free(rsd);
+        return NULL;
+     }
+   rsd->radius = atoi(radius);
+
+   item_width = edje_object_data_get(elm_layout_edje_get(obj), "item_width");
+   if (!item_width)
+     {
+        ERR("item_width is NULL!!");
+        free(rsd);
+        return NULL;
+     }
+   rsd->item_width = (Evas_Coord)atoi(item_width);
+
+   item_height = edje_object_data_get(elm_layout_edje_get(obj), "item_height");
+   if (!item_height)
+     {
+        ERR("item_height is NULL!!");
+        free(rsd);
+        return NULL;
+     }
+   rsd->item_height = (Evas_Coord)atoi(item_height);
+   rsd->rotary_event_time_stamp = 0.0;
+
+   INF("rsd is initialized!!");
+
+   return rsd;
+}
+
+static Eext_Rotary_Selector_Data *
+_eext_rotary_selector_data_get(Evas_Object *rotary_selector)
+{
+   if (!rotary_selector)
+     {
+        ERR("rotary_selector is NULL!!");
+        return NULL;
+     }
+
+   return evas_object_data_get(rotary_selector, EEXT_ROTARY_SELECTOR_DATA_KEY);
+}
+
+static Eina_Bool
+_rotary_selector_visible_get(Evas_Object *rotary_selector)
+{
+   if (!rotary_selector)
+     {
+        return EINA_FALSE;
+     }
+
+   Evas_Coord x, y, w, h;
+   evas_object_geometry_get(rotary_selector, &x, &y, &w, &h);
+   if (evas_object_visible_get(rotary_selector) && x == 0)
+     {
+        return EINA_TRUE;
+     }
+   else
+     {
+        return EINA_FALSE;
+     }
+
+   return EINA_FALSE;
+}
+
+static Eina_Bool
+_rotary_selector_rotary_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info)
+{
+   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data*)data;
+
+   if (rsd->acceleration)
+     {
+        INF("rotary acceleration!!");
+        return EINA_FALSE;
+     }
+
+   if (elm_object_disabled_get(rsd->rotary_selector))
+     {
+        return ECORE_CALLBACK_PASS_ON;
+     }
+
+   if (rsd->previous_page_animator || rsd->next_page_animator || rsd->end_effect_animator)
+     {
+        return ECORE_CALLBACK_PASS_ON;
+     }
+
+   int previous_item_index = rsd->selected_index;
+   int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
+   int last_index = 0;
+   if (rsd->current_page == 0)
+     {
+        last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+     }
+   else
+     {
+        last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+     }
+   if (last_index > rsd->item_count - 1)
+     {
+        last_index = rsd->item_count - 1;
+     }
+
+   if (rsd->rotary_event_time_stamp == 0 && !rsd->acceleration)
+     {
+        rsd->rotary_event_time_stamp = info->time_stamp;
+        rsd->acceleration = EINA_FALSE;
+     }
+   else
+     {
+        int diff = info->time_stamp - rsd->rotary_event_time_stamp;
+        if (diff < _ROTARY_SELECTOR_ROTARY_EVENT_TIME_ACCELERATION_THRESHOLD)
+          {
+             rsd->acceleration = EINA_TRUE;
+          }
+        else
+          {
+             rsd->rotary_event_time_stamp = info->time_stamp;
+          }
+     }
+
+   if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
+     {
+        if (rsd->selected_index < rsd->item_count - 1)
+          {
+             //for accessibility
+             if(rsd->event_area_highlighted_state != EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_RIGHT)
+             //
+               {
+                  if (!rsd->acceleration)
+                    {
+                       rsd->selected_index += 1;
+                    }
+                  else
+                    {
+                       rsd->selected_index = last_index;
+                    }
+                    _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
+             }
+             if (last_index < rsd->selected_index)
+               {
+                  //for accessibility
+                  if(elm_atspi_bridge_utils_is_screen_reader_enabled())
+                    {
+                       rsd->selected_index -= 1;
+                       rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_RIGHT;
+                       rsd->control_by_rotary = EINA_TRUE;
+                       elm_atspi_component_highlight_grab(rsd->event_area_access_object);
+                       _selector_update(rsd, EINA_TRUE, EINA_TRUE);
+                       evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
+                    }
+                  //
+                  else
+                    {
+                       _page_animation_run(rsd, EINA_TRUE);
+                       _selector_update(rsd, EINA_TRUE, EINA_TRUE);
+
+                       evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
+                    }
+               }
+             else
+               {
+                  _selector_update(rsd, EINA_FALSE, EINA_TRUE);
+
+                  evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
+
+                  //for accessibility
+                  if(elm_atspi_bridge_utils_is_screen_reader_enabled())
+                    {
+                        Eext_Rotary_Selector_Item *_item = _item_get(rsd, rsd->selected_index);
+                        if(_item)
+                          {
+                             rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_NORMAL;
+                             elm_atspi_component_highlight_grab(_item->base.obj);
+                          }
+                    }
+                  //
+               }
+          }
+        else
+          {
+             _end_effect_animation_run(rsd, EINA_TRUE);
+          }
+     }
+   else
+     {
+        if (rsd->selected_index > 0)
+          {
+             //for accessibility
+             if(rsd->event_area_highlighted_state != EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_LEFT)
+             //
+               {
+                  if (!rsd->acceleration)
+                    {
+                       rsd->selected_index -= 1;
+                    }
+                  else
+                    {
+                       rsd->selected_index = first_index;
+                    }
+                  _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
+                }
+             if (first_index > rsd->selected_index)
+               {
+                  //for accessibility
+                  if(elm_atspi_bridge_utils_is_screen_reader_enabled())
+                    {
+                       rsd->selected_index += 1;
+                       rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_LEFT;
+                       rsd->control_by_rotary = EINA_TRUE;
+                       elm_atspi_component_highlight_grab(rsd->event_area_access_object);
+                       _selector_update(rsd, EINA_TRUE, EINA_TRUE);
+                       evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
+                     }
+                  else
+                  //
+                    {
+                       _page_animation_run(rsd, EINA_FALSE);
+                       _selector_update(rsd, EINA_TRUE, EINA_TRUE);
+
+                       evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
+                    }
+               }
+             else
+               {
+                  _selector_update(rsd, EINA_FALSE, EINA_TRUE);
+
+                  evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
+                  //for accessibility
+                  if(elm_atspi_bridge_utils_is_screen_reader_enabled())
+                    {
+                       Eext_Rotary_Selector_Item *_item = _item_get(rsd, rsd->selected_index);
+                       if(_item)
+                         {
+                            rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_NORMAL;
+                            elm_atspi_component_highlight_grab(_item->base.obj);
+                         }
+                    }
+                  //
+               }
+          }
+        else
+          {
+             _end_effect_animation_run(rsd, EINA_FALSE);
+          }
+     }
+
+   return ECORE_CALLBACK_PASS_ON;
+}
+
+static void
+_rotary_selector_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+   if (!rsd)
+     {
+        ERR("rsd is NULL!!");
+        return;
+     }
+
+   _item_select(rsd, rsd->selected_index);
+}
+
+static void
+_rotary_selector_show_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   Eext_Rotary_Selector_Data *rsd = NULL;
+   rsd = data;
+   if (!rsd)
+     {
+        ERR("rsd is NULL!!");
+        return;
+     }
+
+   _item_select(rsd, rsd->selected_index);
+
+   //for accessibility
+   if(elm_atspi_bridge_utils_is_screen_reader_enabled())
+     {
+        rsd->reading_page_number = -1;
+        elm_atspi_accessible_name_cb_set(rsd->event_area_access_object, _accessibility_name_set_cb, (Eext_Rotary_Selector_Data*)rsd);
+        elm_atspi_accessible_description_cb_set(rsd->event_area_access_object, _accessibility_description_set_cb, (Eext_Rotary_Selector_Data*)rsd);
+        elm_atspi_accessible_reading_info_type_set(rsd->event_area_access_object, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME | ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
+
+        if(!_rotary_selector_from_moreoption_get(rsd->rotary_selector))
+            elm_atspi_component_highlight_grab(rsd->event_area_access_object);
+     }
+   //
+
+}
+
+static void
+_rotary_selector_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+   if (!rsd)
+     {
+        ERR("rsd is NULL!!");
+        return;
+     }
+
+   if (rsd->item_list)
+     {
+        Eext_Rotary_Selector_Item *item = NULL;
+        EINA_LIST_FREE(rsd->item_list, item)
+          evas_object_del(item->base.obj);
+        rsd->item_list = NULL;
+     }
+   if (rsd->previous_page_animator)
+     {
+        ecore_animator_del(rsd->previous_page_animator);
+        rsd->previous_page_animator = NULL;
+     }
+   if (rsd->next_page_animator)
+     {
+        ecore_animator_del(rsd->next_page_animator);
+        rsd->next_page_animator = NULL;
+     }
+   if (rsd->next_page_timer)
+     {
+        ecore_timer_del(rsd->next_page_timer);
+        rsd->next_page_timer = NULL;
+     }
+   if (rsd->end_effect_animator)
+     {
+        ecore_animator_del(rsd->end_effect_animator);
+        rsd->end_effect_animator = NULL;
+     }
+   if (rsd->item_update_animator)
+     {
+        ecore_animator_del(rsd->item_update_animator);
+        rsd->item_update_animator = NULL;
+     }
+
+   edje_object_signal_callback_del(elm_layout_edje_get(rsd->rotary_selector), "eext,clicked", "", _selector_clicked_signal);
+   edje_object_signal_callback_del(elm_layout_edje_get(rsd->rotary_selector), "elm,anim,finished", "elm", _selector_animation_finished_cb);
+   eext_rotary_object_event_callback_del(obj, _rotary_selector_rotary_cb);
+   evas_object_event_callback_del(obj, EVAS_CALLBACK_MOVE, _rotary_selector_move_cb);
+   evas_object_event_callback_del(obj, EVAS_CALLBACK_SHOW, _rotary_selector_show_cb);
+
+   evas_object_data_del(obj, EEXT_ROTARY_SELECTOR_DATA_KEY);
+
+   free(rsd);
+}
+
+// ----------------------------------------- item API --------------------------------------//
+static void
+_item_coords_update(Eext_Rotary_Selector_Data *rsd, Eext_Rotary_Selector_Item *item)
+{
+   const float endAngle[] = { 300.f, 330.f, 0.f, 30.f, 60.f, 90.f, 120.f, 150.f, 180.f, 210.f, 240.f };
+
+   Eext_Rotary_Selector_Item_Coords *coords = &item->coords;
+   _circle_path_interpolator(rsd, 1.0f, 0, endAngle[item->index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], 0, rsd->radius, &coords->x, &coords->y);
+
+#if _ROTARY_SELECTOR_DEBUG_ENABLED
+   Evas_Coord x, y, w, h;
+   evas_object_geometry_get(item->base.obj, &x, &y, &w, &h);
+
+   INF("item(0x%x), index(%d), x(%f), y(%f)", item, item->index, coords->x, coords->y);
+#endif
+}
+
+static void
+_items_transformation_update(Eext_Rotary_Selector_Data *rsd)
+{
+   Eina_List *l = NULL;
+   Eext_Rotary_Selector_Item *item = NULL;
+   EINA_LIST_FOREACH(rsd->item_list, l, item)
+     {
+        _item_coords_update(rsd, item);
+     }
+}
+
+static void
+_items_invalidate(Eext_Rotary_Selector_Data *rsd)
+{
+#if _ROTARY_SELECTOR_DEBUG_ENABLED
+   double start_time = ecore_time_unix_get();
+#endif
+   if (rsd->item_count <= 0)
+     {
+        return;
+     }
+   int i = 0;
+   Eina_List *l = NULL;
+   Evas_Coord x, y, w, h;
+   evas_object_geometry_get(rsd->rotary_selector, &x, &y, &w, &h);
+   Eext_Rotary_Selector_Item *item = NULL;
+
+   int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
+   int last_index = 0;
+   if (rsd->current_page == 0)
+     {
+        last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+     }
+   else
+     {
+        last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+     }
+
+   EINA_LIST_FOREACH(rsd->item_list, l, item)
+     {
+        Evas_Object *button = item->base.obj;
+
+        if (i >= first_index && i <= last_index)
+          {
+             evas_object_color_set(button, 255, 255, 255, 255);
+             evas_object_move(button, x + item->coords.x, y + item->coords.y);
+             evas_object_raise(button);
+             evas_object_show(button);
+#if _ROTARY_SELECTOR_DEBUG_ENABLED
+             INF("obj : 0x%x show index : %d x:%f y:%f", item->base.obj, item->index, x + item->coords.x, y + item->coords.y);
+#endif
+          }
+        else
+          {
+             evas_object_hide(button);
+#if _ROTARY_SELECTOR_DEBUG_ENABLED
+             INF("obj : 0x%x hide index : %d", item->base.obj, item->index);
+#endif
+          }
+        i++;
+     }
+
+   _layer_items_invalidate(rsd);
+
+#if _ROTARY_SELECTOR_DEBUG_ENABLED
+   INF("elapsed time(%f)", ecore_time_unix_get() - start_time);
+#endif
+}
+
+static void
+_layer_items_invalidate(Eext_Rotary_Selector_Data *rsd)
+{
+   if (rsd->item_count <= 0)
+     {
+        return;
+     }
+   int i = 0;
+   Eina_List *l = NULL;
+   double coord_x, coord_y;
+   Evas_Coord x, y, w, h;
+   evas_object_geometry_get(rsd->rotary_selector, &x, &y, &w, &h);
+   Eext_Rotary_Selector_Item *item = NULL;
+
+   int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
+   int last_index = 0;
+   if (rsd->current_page == 0)
+     {
+        last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+     }
+   else
+     {
+        last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+     }
+
+   Evas_Object *current_first_item = NULL;
+   Evas_Object *current_last_item = NULL;
+   Evas_Object *second_layer_right_item = NULL;
+   Evas_Object *second_layer_left_item = NULL;
+
+   EINA_LIST_FOREACH(rsd->item_list, l, item)
+     {
+        Evas_Object *button = item->base.obj;
+        if (i == first_index)
+          {
+             current_first_item = button;
+          }
+        else if (i == last_index)
+          {
+             current_last_item = button;
+          }
+
+        if(rsd->current_page > 0 && i == first_index-1) //Second layer Right
+          {
+             second_layer_right_item = button;
+          }
+        else if (last_index < (rsd->item_count - 1) && i == last_index + 1) //Second layer Left
+          {
+             second_layer_left_item = button;
+          }
+        i++;
+     }
+
+   l = NULL;
+   item = NULL;
+   i = 0;
+   EINA_LIST_FOREACH(rsd->item_list, l, item)
+     {
+        Evas_Object *button = item->base.obj;
+        if (rsd->current_page > 0 && i == first_index-1) //Second layer Right
+          {
+             _circle_path_interpolator(rsd, 1, 0, -67, rsd->radius, rsd->radius, &coord_x, &coord_y);
+             evas_object_move(button, x + coord_x, y + coord_y);
+             evas_object_stack_below(button, current_first_item);
+             evas_object_color_set(button, 128, 128, 128, 128);
+             evas_object_show(button);
+          }
+        else if (rsd->current_page > 0 && i == first_index-2) //third layer Right
+          {
+             _circle_path_interpolator(rsd, 1, 0, -70, rsd->radius, rsd->radius, &coord_x, &coord_y);
+             evas_object_move(button, x + coord_x, y + coord_y);
+             evas_object_stack_below(button, second_layer_right_item);
+             evas_object_color_set(button, 102, 102, 102, 102);
+             evas_object_show(button);
+          }
+        else if (last_index < (rsd->item_count - 1) && i == last_index + 1) //Second layer Left
+          {
+             _circle_path_interpolator(rsd, 1, 0, -113, rsd->radius, rsd->radius, &coord_x, &coord_y);
+             evas_object_move(button, x + coord_x, y + coord_y);
+             evas_object_stack_below(button, current_last_item);
+             evas_object_color_set(button, 128, 128, 128, 128);
+             evas_object_show(button);
+          }
+        else if (last_index < (rsd->item_count - 1) && i == last_index + 2) //third layer Left
+          {
+             _circle_path_interpolator(rsd, 1, 0, -110, rsd->radius, rsd->radius, &coord_x, &coord_y);
+             evas_object_move(button, x + coord_x, y + coord_y);
+             evas_object_stack_below(button, second_layer_left_item);
+             evas_object_color_set(button, 102, 102, 102, 102);
+             evas_object_show(button);
+          }
+        i++;
+     }
+}
+
+static void
+_item_rearrange(Eext_Rotary_Selector_Data *rsd, int selected_index)
+{
+   Eina_List *l = NULL;
+   int i = 0;
+   Eext_Rotary_Selector_Item *item = NULL;
+
+   EINA_LIST_FOREACH(rsd->item_list, l, item)
+     {
+        item->index = i;
+        i++;
+     }
+   rsd->item_count = i;
+   rsd->selected_index = selected_index;
+
+#if _ROTARY_SELECTOR_DEBUG_ENABLED
+   INF("item is rearranged!! : item_count(%d)", rsd->item_count);
+#endif
+}
+
+static void
+_item_select(Eext_Rotary_Selector_Data *rsd, int index)
+{
+#if _ROTARY_SELECTOR_DEBUG_ENABLED
+   INF("item is selected!! : index(%d)", index);
+#endif
+   {
+      _item_selected_signal_send(rsd, rsd->selected_index, index);
+      rsd->selected_index = index;
+      _selector_update(rsd, EINA_FALSE, EINA_FALSE);
+      _items_transformation_update(rsd);
+      _items_invalidate(rsd);
+   }
+}
+
+static void
+_item_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
+{
+   Eext_Rotary_Selector_Item *item = data;
+
+   if (item->content_icon)
+     {
+        evas_object_del(item->content_icon);
+        item->content_icon = NULL;
+     }
+   if (item->custom_content)
+     {
+        evas_object_del(item->custom_content);
+        item->custom_content = NULL;
+     }
+   if (item->text1)
+     {
+        free(item->text1);
+        item->text1 = NULL;
+     }
+   if (item->text2)
+     {
+        free(item->text2);
+        item->text2 = NULL;
+     }
+   if (item->domain)
+     {
+        free(item->domain);
+        item->domain = NULL;
+     }
+
+   free(item);
+}
+
+static Eext_Rotary_Selector_Item *
+_item_create(Eext_Rotary_Selector_Data *rsd)
+{
+   Eext_Rotary_Selector_Item *item = NULL;
+   Evas_Object *button = NULL;
+   Evas_Object *rotary_selector = rsd->rotary_selector;
+
+   button = elm_button_add(rotary_selector);
+   if (!button)
+    {
+       ERR("button is NULL!!");
+       return NULL;
+    }
+
+
+   if(!elm_atspi_bridge_utils_is_screen_reader_enabled())
+      evas_object_freeze_events_set(button, EINA_TRUE);
+   evas_object_repeat_events_set(button, EINA_TRUE);
+
+   evas_object_size_hint_weight_set(button,EVAS_HINT_EXPAND,EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_object_style_set(button, "rotary_selector_item");
+   evas_object_move(button, -_ROTARY_SELECTOR_SCREEN_WIDTH, -_ROTARY_SELECTOR_SCREEN_HEIGHT);
+   evas_object_resize(button, rsd->item_width, rsd->item_height);
+   evas_object_smart_member_add(button, rotary_selector);
+
+   Evas_Object *action_bg = elm_layout_add(button);
+   elm_layout_theme_set(action_bg, "rotary_selector", "item", "bg_image");
+   elm_object_part_content_set(button, "item,bg_image", action_bg);
+
+   item = (Eext_Rotary_Selector_Item *)calloc(1, sizeof(Eext_Rotary_Selector_Item));
+   if (!item)
+     {
+        ERR("item is NULL!!");
+        return NULL;
+     }
+
+   //for accessibility
+   if(elm_atspi_bridge_utils_is_screen_reader_enabled())
+      evas_object_smart_callback_add(button, "clicked",_accessibility_item_btn_clicked_cb, (Eext_Rotary_Selector_Data*)rsd);
+   evas_object_smart_callback_add(button, "atspi,highlighted", _accessibility_item_btn_highlighted_cb, (Eext_Rotary_Selector_Data*)rsd);
+   //
+
+   if (item)
+    {
+       item->base.obj = button;
+       item->index = -1;
+       item->parent = rsd->parent;
+       item->rotary_selector = rotary_selector;
+       item->coords.x = 0.0f;
+       item->coords.y = 0.0f;
+       item->domain = NULL;
+       item->text1 = NULL;
+       item->text2 = NULL;
+       item->selector_icon_color.normal_color.set_flag = EINA_FALSE;
+       item->selector_icon_color.pressed_color.set_flag = EINA_FALSE;
+       item->item_bg_image_color.normal_color.set_flag = EINA_FALSE;
+       item->item_bg_image_color.pressed_color.set_flag = EINA_FALSE;
+       item->item_icon_color.normal_color.set_flag = EINA_FALSE;
+       item->item_icon_color.pressed_color.set_flag = EINA_FALSE;
+       item->selector_icon_color.normal_color.set_flag = EINA_FALSE;
+       item->selector_icon_color.pressed_color.set_flag = EINA_FALSE;
+       item->custom_content_color.normal_color.set_flag = EINA_FALSE;
+       item->custom_content_color.pressed_color.set_flag = EINA_FALSE;
+       item->content_icon = NULL;
+       item->custom_content = NULL;
+    }
+   evas_object_event_callback_add(button, EVAS_CALLBACK_DEL, _item_del_cb, item);
+
+   return item;
+}
+
+
+static void
+_item_selected_signal_send(Eext_Rotary_Selector_Data *rsd, int previous_item_index, int current_item_index)
+{
+   Eina_List *l = NULL;
+   int i = 0;
+   Eext_Rotary_Selector_Item *item = NULL;
+
+   EINA_LIST_FOREACH(rsd->item_list, l, item)
+     {
+        if (previous_item_index != -1 && i == previous_item_index)
+          {
+             elm_object_signal_emit(item->base.obj, "elm,action,button,unselected", "");
+#if _ROTARY_SELECTOR_DEBUG_ENABLED
+             INF("item is unselected!! : index(%d)", previous_item_index);
+#endif
+          }
+        if (current_item_index !=-1 && i == current_item_index)
+          {
+             elm_object_signal_emit(item->base.obj, "elm,action,button,selected", "");
+#if _ROTARY_SELECTOR_DEBUG_ENABLED
+             INF("item is selected!! : index(%d)", current_item_index);
+#endif
+          }
+        i++;
+     }
+}
+
+static void
+_item_touched_signal_send(Eext_Rotary_Selector_Data *rsd, int index, Eina_Bool pressed, Eina_Bool sound)
+{
+   Eina_List *l = NULL;
+   int i = 0;
+   Eext_Rotary_Selector_Item *item = NULL;
+
+   if (index < 0)
+     {
+        return;
+     }
+   if (rsd->selected_index == index)
+     {
+        if (!pressed && sound)
+          {
+             EINA_LIST_FOREACH(rsd->item_list, l, item)
+               {
+                  if (i == index)
+                    {
+                       elm_object_signal_emit(item->base.obj, "elm,action,button,sound", "eext");
+                    }
+                  i++;
+               }
+          }
+        return;
+     }
+
+   EINA_LIST_FOREACH(rsd->item_list, l, item)
+     {
+        if (i == index)
+          {
+             if (pressed)
+               {
+                  elm_object_signal_emit(item->base.obj, "elm,action,button,pressed", "eext");
+               }
+             else
+               {
+                  elm_object_signal_emit(item->base.obj, "elm,action,button,unpressed", "eext");
+                  if (sound)
+                    {
+                       elm_object_signal_emit(item->base.obj, "elm,action,button,sound", "eext");
+                    }
+               }
+          }
+        i++;
+     }
+}
+
+static Eext_Rotary_Selector_Item *
+_item_get(Eext_Rotary_Selector_Data *rsd, int index)
+{
+   int i = 0;
+   Eina_List *l = NULL;
+   Eext_Rotary_Selector_Item *item = NULL;
+   EINA_LIST_FOREACH(rsd->item_list, l, item)
+     {
+        if (index == i)
+          {
+             return item;
+          }
+        i++;
+     }
+
+   return NULL;
+}
+
+static void
+_item_text_copy(char **target, const char* source)
+{
+   int size = 0;
+
+   if (*target)
+     {
+        free(*target);
+        *target = NULL;
+     }
+   size = strlen(source) + 1;
+   *target = malloc(sizeof(char)*size);
+   if (!(*target))
+   {
+      ERR("allocation is failed!!");
+      return;
+   }
+   memset(*target, 0, size);
+   strncpy(*target, source, size);
+}
+
+// ----------------------------------------- animation API --------------------------------------//
+static Eina_Bool
+_previous_page_animator_cb(void *data)
+{
+   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+   Eina_List *l = NULL;
+   Eext_Rotary_Selector_Item *item = NULL;
+
+   int i = 0;
+   int last_index = 0;
+   double p = 0.0f;
+   double v[4] = {_ROTARY_SELECTOR_CUBIC_BEZIER_P1_X, _ROTARY_SELECTOR_CUBIC_BEZIER_P1_Y, _ROTARY_SELECTOR_CUBIC_BEZIER_P2_X, _ROTARY_SELECTOR_CUBIC_BEZIER_P2_Y};
+
+   int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
+
+   if (rsd->current_page == 0)
+     {
+        last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+     }
+   else
+     {
+        last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+     }
+
+   if (rsd->previous_page_animation_started)
+     {
+        rsd->previous_page_animation_started = EINA_FALSE;
+        rsd->previous_page_animator_start_time = ecore_time_unix_get();
+     }
+
+   double dt = ecore_time_unix_get() - rsd->previous_page_animator_start_time;
+   p = ecore_animator_pos_map_n(dt /_ROTARY_SELECTOR_PAGE_ANIMATION_DURATION, ECORE_POS_MAP_CUBIC_BEZIER, 4, v);
+
+   if (p <= 1.0f)
+     {
+        const float startAngle[] = { 300.f, 330.f, 0.f, 30.f, 60.f, 90.f, 120.f, 150.f, 180.f, 210.f, 240.f };
+
+        EINA_LIST_FOREACH(rsd->item_list, l, item)
+          {
+             Evas_Coord new_a;
+             Evas_Object *button = item->base.obj;
+             Eext_Rotary_Selector_Item_Coords *coords = &item->coords;
+             evas_object_raise(button);
+
+             //current page
+             if (first_index <= i && i <= last_index)
+               {
+                  //Forward
+                  if (rsd->animation_direction)
+                    {
+                       // page 0 --> 1 : 0page
+                       const float endAngle[] = { 660.f, 660.f, 300.f, 300.f, 300.f, 300.f, 300.f, 300.f, 300.f, 300.f, 300.f };
+                       _circle_path_interpolator(rsd, p, startAngle[item->index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], endAngle[item->index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], rsd->radius, rsd->radius, &coords->x, &coords->y);
+                    }
+                  else
+                    {
+                       // page 1 --> 0 : 1page
+                       const float endAngle[] = { 240.f, 240.f, -120.f, -120.f, -120.f, -120.f, -120.f, -120.f, -120.f, -120.f, -120.f };
+                       _circle_path_interpolator(rsd, p, startAngle[item->index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], endAngle[item->index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], rsd->radius, rsd->radius, &coords->x, &coords->y);
+                    }
+                  new_a = 255*(1-p);
+                  evas_object_move(button, item->coords.x, item->coords.y);
+                  evas_object_color_set(button, new_a, new_a, new_a, new_a);
+               }
+             if (rsd->animation_direction && rsd->current_page > 0 && (i == first_index-1 || i == first_index -2))
+               {
+                  evas_object_color_set(button, 0, 0, 0, 0);
+               }
+             else if (last_index < (rsd->item_count - 1) && (i == last_index + 1 || i == last_index + 2))
+               {
+                  evas_object_color_set(button, 0, 0, 0, 0);
+               }
+             i++;
+          }
+     }
+   if (p >= 1.0f)
+     {
+        rsd->previous_page_animator_start_time = 0.0f;
+        rsd->previous_page_animator = NULL;
+
+        return ECORE_CALLBACK_CANCEL;
+     }
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+static Eina_Bool
+_item_update_animator_cb(void *data)
+{
+   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+
+   _item_rearrange(rsd, rsd->selected_index);
+   _item_select(rsd, rsd->selected_index);
+
+   rsd->item_update_animator = NULL;
+
+#if _ROTARY_SELECTOR_DEBUG_ENABLED
+   INF("item_list(0x%d), count(%d)", rsd->item_list, rsd->item_count);
+#endif
+
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static void
+_page_animation_run(Eext_Rotary_Selector_Data *rsd, Eina_Bool direction)
+{
+   if (direction) //Forward
+     {
+        rsd->animation_direction = EINA_TRUE;
+     }
+   else //Backward
+     {
+        rsd->animation_direction = EINA_FALSE;
+     }
+
+   Edje_Message_Float_Set *msg = malloc(sizeof(Edje_Message_Float_Set));
+   if (!msg) return;
+
+   msg->count = 1;
+   msg->val[0] = 1;
+   edje_object_message_send(elm_layout_edje_get(rsd->rotary_selector), EDJE_MESSAGE_FLOAT_SET, 0, msg);
+
+   rsd->previous_page_animator_start_time = ecore_loop_time_get();
+   rsd->previous_page_animation_started = EINA_TRUE;
+   rsd->previous_page_animator = ecore_animator_add(_previous_page_animator_cb, rsd);
+
+   rsd->next_page_timer = ecore_timer_add(_ROTARY_SELECTOR_NEXT_PAGE_ANIMATION_DELAY_TIME, _next_page_timer_cb, rsd);
+}
+
+static void
+_end_effect_animation_run(Eext_Rotary_Selector_Data *rsd, Eina_Bool direction)
+{
+   if (direction) //Forward
+     {
+        rsd->animation_direction = EINA_TRUE;
+     }
+   else //Backward
+     {
+        rsd->animation_direction = EINA_FALSE;
+     }
+   rsd->end_effect_animation_started = EINA_TRUE;
+   rsd->end_effect_animator = ecore_animator_add(_end_effect_animator_cb, rsd);
+
+   elm_layout_signal_emit(rsd->rotary_selector, "eext,action,haptic,end_effect", "eext");
+}
+
+static void
+_item_update_animation_run(Eext_Rotary_Selector_Data *rsd)
+{
+   if (rsd->item_update_animator)
+     {
+#if _ROTARY_SELECTOR_DEBUG_ENABLED
+        INF("item update animator is already running!!");
+#endif
+        return;
+     }
+
+   rsd->item_update_animator = ecore_animator_add(_item_update_animator_cb, rsd);
+}
+
+static Eina_Bool
+_next_page_animator_cb(void *data)
+{
+   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+   Eina_List *l = NULL;
+   Eext_Rotary_Selector_Item *item = NULL;
+
+   int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
+   int i = 0;
+   Evas_Coord new_a;
+   Eext_Rotary_Selector_Item_Coords *coords = NULL;
+   Evas_Object *button = NULL;
+   int last_index = 0;
+   if (rsd->current_page == 0)
+     {
+        last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+     }
+   else
+     {
+        last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+     }
+
+   double p = 0.0f;
+   double v[4] = {_ROTARY_SELECTOR_CUBIC_BEZIER_P1_X, _ROTARY_SELECTOR_CUBIC_BEZIER_P1_Y, _ROTARY_SELECTOR_CUBIC_BEZIER_P2_X, _ROTARY_SELECTOR_CUBIC_BEZIER_P2_Y};
+
+   if (rsd->next_page_animation_started)
+     {
+        rsd->next_page_animation_started = EINA_FALSE;
+        rsd->next_page_animator_start_time = ecore_time_unix_get();
+     }
+
+   double dt = ecore_time_unix_get() - rsd->next_page_animator_start_time;
+   p = ecore_animator_pos_map_n(dt /_ROTARY_SELECTOR_PAGE_ANIMATION_DURATION, ECORE_POS_MAP_CUBIC_BEZIER, 4, v);
+
+   if (p <= 1.0f)
+     {
+        EINA_LIST_FOREACH(rsd->item_list, l, item)
+          {
+             button = item->base.obj;
+             coords = &item->coords;
+             evas_object_raise(button);
+
+             if (rsd->animation_direction) //Forward
+               {
+                  if (first_index + _ROTARY_SELECTOR_PAGE_ITEM_MAX <= i && i<= last_index + _ROTARY_SELECTOR_PAGE_ITEM_MAX)    //current page+1
+                    {
+                       // page 0 --> 1 : 1page
+                       const float endAngle[] = { 300.f, 330.f, 360.f, 390.f, 420.f, 450.f, 480.f, 510.f, 540.f, 570.f, 600.f };
+                       _circle_path_interpolator(rsd, p, 300, endAngle[item->index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], rsd->radius, rsd->radius, &coords->x, &coords->y);
+                       new_a = 255*p;
+                       evas_object_move(button, item->coords.x, item->coords.y);
+                       evas_object_color_set(button, new_a, new_a, new_a, new_a);
+                       evas_object_show(button);
+                    }
+               }
+             else //Backward
+               {
+                  if (first_index - _ROTARY_SELECTOR_PAGE_ITEM_MAX <= i && i<= last_index - _ROTARY_SELECTOR_PAGE_ITEM_MAX)    //current page-1
+                    {
+                       // page 1 --> 0 : 0page
+                       const float endAngle[] = { -60.f, -30.f, 0.f, 30.f, 60.f, 90.f, 120.f, 150.f, 180.f, 210.f, 240.f };
+                       _circle_path_interpolator(rsd, p, 240, endAngle[item->index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], rsd->radius, rsd->radius, &coords->x, &coords->y);
+                       new_a = 255*p;
+                       evas_object_move(button, item->coords.x, item->coords.y);
+                       evas_object_color_set(button, new_a, new_a, new_a, new_a);
+                       evas_object_show(button);
+                    }
+               }
+             i++;
+          }
+     }
+
+   if (p >= 1.0f)
+     {
+        //Forward
+        if (rsd->animation_direction)
+          {
+             rsd->current_page += 1;
+             _items_invalidate(rsd);
+          }
+        else //Backward
+          {
+             rsd->current_page -= 1;
+             _items_invalidate(rsd);
+          }
+
+        rsd->next_page_animator_start_time = 0.0f;
+        rsd->next_page_animator = NULL;
+
+        return ECORE_CALLBACK_CANCEL;
+     }
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+static Eina_Bool
+_next_page_timer_cb(void *data)
+{
+   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+
+   rsd->next_page_timer = NULL;
+
+   rsd->next_page_animator_start_time = ecore_loop_time_get();
+   rsd->next_page_animation_started = EINA_TRUE;
+   rsd->next_page_animator = ecore_animator_add(_next_page_animator_cb, rsd);
+
+   return ECORE_CALLBACK_CANCEL;
+}
+
+static Eina_Bool
+_end_effect_animator_cb(void *data)
+{
+   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+
+   double p = 0.0f;
+   double v[4] = {_ROTARY_SELECTOR_CUBIC_BEZIER_P1_X, _ROTARY_SELECTOR_CUBIC_BEZIER_P1_Y, _ROTARY_SELECTOR_CUBIC_BEZIER_P2_X, _ROTARY_SELECTOR_CUBIC_BEZIER_P2_Y};
+
+   if (rsd->end_effect_animation_started)
+     {
+        rsd->end_effect_animation_started = EINA_FALSE;
+        rsd->end_effect_animator_start_time = ecore_time_unix_get();
+     }
+
+   double dt = ecore_time_unix_get() - rsd->end_effect_animator_start_time;
+   p = ecore_animator_pos_map_n(dt /_ROTARY_SELECTOR_END_EFFECT_ANIMATION_DURATION, ECORE_POS_MAP_CUBIC_BEZIER, 4, v);
+
+   Evas_Object *selector = elm_object_part_content_get(rsd->rotary_selector, "selector,bg_image");
+   if (!selector)
+     {
+        ERR("selector is NULL!!");
+        return ECORE_CALLBACK_CANCEL;
+     }
+
+   Evas_Map *map = NULL;
+   map = evas_map_new(4);
+   if (!map)
+     {
+        ERR("map is NULL!!");
+        return ECORE_CALLBACK_CANCEL;
+     }
+
+   double selector_angle = ((rsd->selected_index % _ROTARY_SELECTOR_PAGE_ITEM_MAX) + 1) *_ROTARY_SELECTOR_ITEM_DIVISION_ANGLE;
+   double effect_angle = rsd->animation_direction ? _ROTARY_SELECTOR_ITEM_DIVISION_ANGLE/2 : -_ROTARY_SELECTOR_ITEM_DIVISION_ANGLE/2;
+
+   evas_map_util_points_populate_from_object(map, selector);
+
+   if (p <= 0.5f)
+     {
+        evas_map_util_rotate(map, selector_angle + effect_angle*p/0.5, _ROTARY_SELECTOR_SCREEN_WIDTH/2, _ROTARY_SELECTOR_SCREEN_HEIGHT/2);
+        evas_object_map_enable_set(selector, EINA_TRUE);
+        evas_object_map_set(selector, map);
+     }
+   else if (p <= 1.0f)
+     {
+        evas_map_util_rotate(map, selector_angle + effect_angle - effect_angle*(p - 0.5)/0.5, _ROTARY_SELECTOR_SCREEN_WIDTH/2, _ROTARY_SELECTOR_SCREEN_HEIGHT/2);
+        evas_object_map_enable_set(selector, EINA_TRUE);
+        evas_object_map_set(selector, map);
+     }
+
+   if (p >= 1.0f)
+     {
+        rsd->animation_direction = EINA_TRUE;
+        rsd->end_effect_animator_start_time = 0.0f;
+        rsd->end_effect_animator = NULL;
+        if (map) evas_map_free(map);
+
+        return ECORE_CALLBACK_CANCEL;
+     }
+
+   if (map) evas_map_free(map);
+
+   return ECORE_CALLBACK_RENEW;
+}
+
+// ----------------------------------------- new API --------------------------------------//
+static void
+_selector_update(Eext_Rotary_Selector_Data *rsd, Eina_Bool page_changed, Eina_Bool is_animation)
+{
+   Evas_Object *edje = elm_layout_edje_get(rsd->rotary_selector);
+   if (!edje)
+     {
+        ERR("edje is NULL!!");
+        return;
+     }
+
+   const char* signals[] = {"eext,rotate,0", "eext,rotate,30", "eext,rotate,60", "eext,rotate,90", "eext,rotate,120",
+                            "eext,rotate,150", "eext,rotate,180", "eext,rotate,210", "eext,rotate,240", "eext,rotate,270", "eext,rotate,300",};
+
+   if (page_changed)
+     {
+        if (rsd->selected_index%_ROTARY_SELECTOR_PAGE_ITEM_MAX == 0)
+          {
+             edje_object_signal_emit(edje, "eext,rotate,360", "eext");
+          }
+        else
+          {
+             edje_object_signal_emit(edje, "eext,rotate,-60", "eext");
+          }
+     }
+   else
+     {
+        if (is_animation)
+          edje_object_signal_emit(edje, signals[rsd->selected_index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], "eext");
+        else
+          edje_object_signal_emit(edje, signals[rsd->selected_index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], "noanim");
+     }
+
+   _selector_content_update(rsd);
+}
+
+static void
+_selector_content_update(Eext_Rotary_Selector_Data *rsd)
+{
+   int i = 0;
+   Eina_List *l = NULL;
+   Eext_Rotary_Selector_Item *item = NULL;
+
+   Evas_Object *content_icon = elm_object_part_content_unset(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,icon");
+   if (content_icon)
+     {
+        evas_object_hide(content_icon);
+     }
+
+   EINA_LIST_FOREACH(rsd->item_list, l, item)
+     {
+        if (item->index == rsd->selected_index)
+          {
+#if 0
+             if (item->custom_content)
+               {
+                  elm_layout_signal_emit(elm_object_part_content_get(rsd->rotary_selector, "content"), "content,default", "eext");
+                  elm_layout_signal_emit(elm_object_part_content_get(rsd->rotary_selector, "content"), "custom_content,show", "eext");
+                  elm_object_part_content_set(elm_object_part_content_get(rsd->rotary_selector, "content"), "custom_content", item->custom_content);
+               }
+             else
+#endif
+               {
+                  elm_layout_signal_emit(elm_object_part_content_get(rsd->rotary_selector, "content"), "content,default", "eext");
+
+                  if (item->domain)
+                    {
+                       elm_object_domain_translatable_part_text_set(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,main_text", item->domain, item->text1);
+                       elm_object_domain_translatable_part_text_set(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,sub_text", item->domain, item->text2);
+                    }
+                  else
+                    {
+                       elm_object_part_text_set(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,main_text", item->text1);
+                       elm_object_part_text_set(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,sub_text", item->text2);
+                    }
+                  if (item->content_icon)
+                    {
+                       elm_object_part_content_set(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,icon", item->content_icon);
+                       if (item->text1)
+                         {
+                            elm_layout_signal_emit(elm_object_part_content_get(rsd->rotary_selector, "content"), "text1,icon,show", "eext");
+                         }
+                    }
+                  else if (item->text2)
+                    {
+                       elm_layout_signal_emit(elm_object_part_content_get(rsd->rotary_selector, "content"), "text2,show", "eext");
+                    }
+                  else
+                    {
+                       elm_layout_signal_emit(elm_object_part_content_get(rsd->rotary_selector, "content"), "text1,show", "eext");
+                    }
+               }
+          }
+        i++;
+     }
+}
+
+static void
+_selector_clicked_signal(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+   INF("called!!");
+
+   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+   if (rsd)
+     {
+        evas_object_smart_callback_call(rsd->rotary_selector, "item,clicked", (void*)_item_get(rsd, rsd->selected_index));
+     }
+}
+static void
+_selector_animation_finished_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
+{
+   INF("called!!");
+
+   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+   if (rsd)
+     {
+        if (rsd->acceleration)
+          {
+             rsd->acceleration = EINA_FALSE;
+             rsd->rotary_event_time_stamp = 0;
+          }
+     }
+}
+
+// ----------------------------------------- public API implementation --------------------------------------//
+EAPI Evas_Object *
+eext_rotary_selector_add(Evas_Object *parent)
+{
+   if (!parent) return NULL;
+
+   Eext_Rotary_Selector_Data *rsd = NULL;
+
+   Evas_Object *rotary_selector = elm_layout_add(parent);
+   if (!rotary_selector)
+     {
+        ERR("rotary_selector is NULL!!");
+        return NULL;
+     }
+
+   elm_layout_theme_set(rotary_selector, "layout", "rotary_selector", "default");
+   evas_object_move(rotary_selector, 0, 0);
+   evas_object_resize(rotary_selector, _ROTARY_SELECTOR_SCREEN_WIDTH, _ROTARY_SELECTOR_SCREEN_HEIGHT);
+
+   rsd = _eext_rotary_selector_data_init(rotary_selector, parent);
+   if (!rsd)
+     {
+        ERR("rsd is NULL!!");
+        return NULL;
+     }
+
+   evas_object_data_set(rotary_selector, EEXT_ROTARY_SELECTOR_DATA_KEY, rsd);
+
+   edje_object_signal_callback_add(elm_layout_edje_get(rsd->rotary_selector), "eext,clicked", "", _selector_clicked_signal, rsd);
+   edje_object_signal_callback_add(elm_layout_edje_get(rsd->rotary_selector), "elm,anim,finished", "elm", _selector_animation_finished_cb, rsd);
+
+   //default selector bg part
+   Evas_Object *selector_bg = elm_layout_add(rotary_selector);
+   if (!selector_bg)
+     {
+        ERR("selector_bg is NULL!!");
+        return NULL;
+     }
+
+   elm_layout_theme_set(selector_bg, "rotary_selector", "selector", "selector_bg");
+
+   elm_object_part_content_set(rotary_selector, "selector,bg_image", selector_bg);
+
+   //default selector content part
+   Evas_Object *content = elm_layout_add(rotary_selector);
+   if (!content)
+     {
+        ERR("content is NULL!!");
+        return NULL;
+     }
+
+   elm_layout_theme_set(content, "rotary_selector", "content", "default");
+   elm_object_part_content_set(rotary_selector, "content", content);
+
+   eext_rotary_object_event_callback_add(rotary_selector, _rotary_selector_rotary_cb, rsd);
+   evas_object_event_callback_add(rotary_selector, EVAS_CALLBACK_MOVE, _rotary_selector_move_cb, rsd);
+   evas_object_event_callback_add(rotary_selector, EVAS_CALLBACK_DEL, _rotary_selector_del_cb, rsd);
+   evas_object_event_callback_add(rotary_selector, EVAS_CALLBACK_SHOW, _rotary_selector_show_cb, rsd);
+
+   _event_area_callback_add(rsd);
+
+   //for accessibility
+   _rotary_selector_from_moreoption_set(rotary_selector, EINA_FALSE);
+   rsd->event_area_access_object = elm_access_object_register(rsd->event_area, rsd->rotary_selector);
+
+   evas_object_smart_callback_add(rotary_selector, "more,option,opened", _rotary_selector_moreoption_opened_cb, rsd);
+   evas_object_smart_callback_add(rotary_selector, "more,option,closed", _rotary_selector_moreoption_closed_cb, rsd);
+
+   elm_access_action_cb_set(rsd->event_area_access_object, ELM_ACCESS_ACTION_HIGHLIGHT, _accessibility_event_area_highlighted_cb, (Eext_Rotary_Selector_Data*)rsd);
+   elm_access_action_cb_set(rsd->event_area_access_object, ELM_ACCESS_ACTION_HIGHLIGHT_NEXT, _accessibility_event_area_highlighted_cb, (Eext_Rotary_Selector_Data*)rsd);
+   elm_access_action_cb_set(rsd->event_area_access_object, ELM_ACCESS_ACTION_HIGHLIGHT_PREV, _accessibility_event_area_highlighted_cb, (Eext_Rotary_Selector_Data*)rsd);
+   //
+   return rotary_selector;
+}
+
+EAPI Eext_Object_Item *
+eext_rotary_selector_item_append(Evas_Object *obj)
+{
+   int selected_index = 0;
+   Evas_Object* rotary_selector = obj;
+   Eext_Rotary_Selector_Data *rsd = NULL;
+   Eext_Rotary_Selector_Item *item = NULL;
+
+   rsd = _eext_rotary_selector_data_get(rotary_selector);
+   if (!rsd)
+     {
+        ERR("rsd is NULL!!");
+        return NULL;
+     }
+
+   item = _item_create(rsd);
+   if (!item)
+     {
+        ERR("item is NULL!!");
+        return NULL;
+     }
+
+   rsd->item_list = eina_list_append(rsd->item_list, item);
+
+   if (_rotary_selector_visible_get(rotary_selector))
+     {
+        selected_index = rsd->selected_index;
+     }
+
+   rsd->selected_index = selected_index;
+   _item_rearrange(rsd, rsd->selected_index);
+
+   _item_update_animation_run(rsd);
+
+   return (Eext_Object_Item *)item;
+}
+
+EAPI Eext_Object_Item *
+eext_rotary_selector_item_prepend(Evas_Object *obj)
+{
+   int selected_index = 0;
+   Evas_Object* rotary_selector = obj;
+   Eext_Rotary_Selector_Data *rsd = NULL;
+   Eext_Rotary_Selector_Item *item = NULL;
+
+   rsd = _eext_rotary_selector_data_get(rotary_selector);
+   if (!rsd)
+     {
+        ERR("rsd is NULL!!");
+        return NULL;
+     }
+
+   item = _item_create(rsd);
+   if (!item)
+     {
+        ERR("item is NULL!!");
+        return NULL;
+     }
+
+   rsd->item_list = eina_list_prepend(rsd->item_list, item);
+
+   if (_rotary_selector_visible_get(rotary_selector))
+     {
+        selected_index = rsd->selected_index + 1;
+     }
+
+   rsd->selected_index = selected_index;
+   _item_rearrange(rsd, rsd->selected_index);
+
+   _item_update_animation_run(rsd);
+
+   return (Eext_Object_Item *)item;
+}
+
+EAPI Eext_Object_Item *
+eext_rotary_selector_item_insert_after(Evas_Object *obj, Eext_Object_Item *after)
+{
+   int selected_index = 0;
+   Evas_Object* rotary_selector = obj;
+   Eext_Rotary_Selector_Data *rsd = NULL;
+   Eext_Rotary_Selector_Item *item = NULL;
+   Eext_Rotary_Selector_Item *after_item = (Eext_Rotary_Selector_Item *)after;
+
+   rsd = _eext_rotary_selector_data_get(rotary_selector);
+   if (!rsd)
+     {
+        ERR("rsd is NULL!!");
+        return NULL;
+     }
+
+   item = _item_create(rsd);
+   if (!item)
+     {
+        ERR("item is NULL!!");
+        return NULL;
+     }
+
+   rsd->item_list = eina_list_append_relative(rsd->item_list, item, after_item);
+
+   if (_rotary_selector_visible_get(rotary_selector) && rsd->selected_index <= after_item->index)
+     {
+        selected_index = rsd->selected_index;
+     }
+   else if (_rotary_selector_visible_get(rotary_selector) && rsd->selected_index > after_item->index)
+     {
+        selected_index = rsd->selected_index + 1;
+     }
+
+   rsd->selected_index = selected_index;
+   _item_rearrange(rsd, rsd->selected_index);
+
+   _item_update_animation_run(rsd);
+
+   return (Eext_Object_Item *)item;
+}
+
+EAPI Eext_Object_Item *
+eext_rotary_selector_item_insert_before(Evas_Object *obj, Eext_Object_Item *before)
+{
+   int selected_index = 0;
+   Evas_Object* rotary_selector = obj;
+   Eext_Rotary_Selector_Data *rsd = NULL;
+   Eext_Rotary_Selector_Item *item = NULL;
+   Eext_Rotary_Selector_Item *before_item = (Eext_Rotary_Selector_Item *)before;
+
+   rsd = _eext_rotary_selector_data_get(rotary_selector);
+   if (!rsd)
+     {
+        ERR("rsd is NULL!!");
+        return NULL;
+     }
+
+   item = _item_create(rsd);
+   if (!item)
+     {
+        ERR("item is NULL!!");
+        return NULL;
+     }
+
+   rsd->item_list = eina_list_prepend_relative(rsd->item_list, item, before_item);
+
+   if (_rotary_selector_visible_get(rotary_selector)  && rsd->selected_index >= before_item->index)
+     {
+        selected_index = rsd->selected_index + 1;
+     }
+   else if (_rotary_selector_visible_get(rotary_selector)  && rsd->selected_index < before_item->index)
+     {
+        selected_index = rsd->selected_index;
+     }
+
+   rsd->selected_index = selected_index;
+   _item_rearrange(rsd, rsd->selected_index);
+
+   _item_update_animation_run(rsd);
+
+   return (Eext_Object_Item *)item;
+}
+
+EAPI void
+eext_rotary_selector_item_del(Eext_Object_Item *item)
+{
+   int selected_index = 0;
+   Eext_Rotary_Selector_Data *rsd = NULL;
+   Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item;
+
+   if (!rotary_selector_item)
+     {
+        ERR("rotary_selector_item is NULL!!");
+        return;
+     }
+
+   rsd = _eext_rotary_selector_data_get(rotary_selector_item->rotary_selector);
+   if (!rsd)
+     {
+        ERR("rsd is NULL!!");
+        return;
+     }
+
+   if (_rotary_selector_visible_get(rotary_selector_item->rotary_selector) && rsd->selected_index < rotary_selector_item->index)
+     {
+        selected_index = rsd->selected_index;
+     }
+   else if (_rotary_selector_visible_get(rotary_selector_item->rotary_selector) && rsd->selected_index > rotary_selector_item->index)
+     {
+        selected_index = rsd->selected_index - 1;
+     }
+
+   rsd->item_list = eina_list_remove(rsd->item_list, rotary_selector_item);
+   evas_object_del(rotary_selector_item->base.obj);
+
+   rsd->selected_index = selected_index;
+   _item_rearrange(rsd, rsd->selected_index);
+
+   _item_update_animation_run(rsd);
+
+   return;
+}
+
+EAPI void
+eext_rotary_selector_items_clear(Evas_Object *obj)
+{
+   Evas_Object* rotary_selector = obj;
+   Eext_Rotary_Selector_Data *rsd = NULL;
+   Eext_Rotary_Selector_Item *item = NULL;
+
+   if (!rotary_selector)
+     {
+        ERR("rotary_selector is NULL!!");
+        return;
+     }
+
+   rsd = _eext_rotary_selector_data_get(rotary_selector);
+   if (!rsd)
+     {
+        ERR("rsd is NULL!!");
+        return;
+     }
+
+   EINA_LIST_FREE(rsd->item_list, item)
+     evas_object_del(item->base.obj);
+
+   rsd->selected_index = 0;
+
+   _item_update_animation_run(rsd);
+
+   return;
+}
+
+EAPI void
+eext_rotary_selector_item_part_text_set(Eext_Object_Item *item, const char *part_name, const char *text)
+{
+   Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item;
+
+   if (!rotary_selector_item)
+     {
+        ERR("rotary_selector_item is NULL!!");
+        return;
+     }
+   if (!part_name)
+     {
+        ERR("part_name is NULL!!");
+        return;
+     }
+   if (!text)
+     {
+        ERR("text is NULL!!");
+        return;
+     }
+
+   Eext_Rotary_Selector_Data *rsd = NULL;
+   rsd = _eext_rotary_selector_data_get(rotary_selector_item->rotary_selector);
+   if (!rsd)
+     {
+        ERR("rsd is NULL!!");
+        return;
+     }
+
+   if (!strcmp(part_name, "selector,main_text"))
+     {
+        _item_text_copy(&(rotary_selector_item->text1), text);
+     }
+   else if (!strcmp(part_name, "selector,sub_text"))
+     {
+        _item_text_copy(&(rotary_selector_item->text2), text);
+     }
+   else
+     {
+       ERR("Not supported part name [%s]", part_name);
+       return;
+     }
+
+   _selector_content_update(rsd);
+
+   return;
+}
+
+EAPI const char *
+eext_rotary_selector_item_part_text_get(const Eext_Object_Item *item, const char *part_name)
+{
+   Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item*)item;
+
+   if (!rotary_selector_item)
+     {
+        ERR("item is NULL!!");
+        return NULL;
+     }
+   if (!strcmp(part_name, "selector,main_text"))
+     {
+       return rotary_selector_item->text1;
+     }
+   else if (!strcmp(part_name, "selector,sub_text"))
+     {
+        return rotary_selector_item->text2;
+     }
+
+   return NULL;
+}
+
+EAPI void
+eext_rotary_selector_item_domain_translatable_part_text_set(Eext_Object_Item *item, const char *part_name, const char *domain, const char *text)
+{
+   Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item;
+
+   if (!rotary_selector_item)
+     {
+        ERR("rotary_selector_item is NULL!!");
+        return;
+     }
+   if (!part_name)
+     {
+        ERR("part_name is NULL!!");
+        return;
+     }
+   if (!domain)
+     {
+        ERR("domain is NULL!!");
+        return;
+     }
+   if (!text)
+     {
+        ERR("text is NULL!!");
+        return;
+     }
+
+   Eext_Rotary_Selector_Data *rsd = NULL;
+   rsd = _eext_rotary_selector_data_get(rotary_selector_item->rotary_selector);
+   if (!rsd)
+     {
+        ERR("rsd is NULL!!");
+        return;
+     }
+
+   if (!strcmp(part_name, "selector,main_text"))
+     {
+        _item_text_copy(&(rotary_selector_item->domain), domain);
+        _item_text_copy(&(rotary_selector_item->text1), text);
+     }
+   else if (!strcmp(part_name, "selector,sub_text"))
+     {
+        _item_text_copy(&(rotary_selector_item->domain), domain);
+        _item_text_copy(&(rotary_selector_item->text2), text);
+     }
+   else
+     {
+        ERR("Not supported part name [%s]", part_name);
+        return;
+     }
+
+   _selector_content_update(rsd);
+
+   return;
+}
+
+EAPI void
+eext_rotary_selector_item_part_content_set(Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state, Evas_Object *content)
+{
+   //Supported part names : "item,bg_image", "item,icon", "selector,icon", "selector,content"
+
+   Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item;
+   if (!rotary_selector_item)
+     {
+        ERR("rotary_selector_item is NULL!!");
+        return;
+     }
+   if (!part_name)
+     {
+        ERR("part_name is NULL!!");
+        return;
+     }
+   if (!content)
+     {
+        ERR("content is NULL!!");
+        return;
+     }
+   if (state != EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
+     {
+        ERR("Not implemented!!");
+        return;
+     }
+   Eext_Rotary_Selector_Data *rsd = NULL;
+   rsd = _eext_rotary_selector_data_get(rotary_selector_item->rotary_selector);
+   if (!rsd)
+     {
+        ERR("rsd is NULL!!");
+        return;
+     }
+   // for Accessibility
+   if(elm_atspi_bridge_utils_is_screen_reader_enabled())
+      elm_atspi_accessible_role_set(content, ELM_ATSPI_ROLE_REDUNDANT_OBJECT);
+   //
+   if (!strcmp(part_name, "item,bg_image") || !strcmp(part_name, "item,icon"))
+     {
+        elm_object_part_content_set(rotary_selector_item->base.obj, part_name, content);
+     }
+   else if (!strcmp(part_name, "selector,icon"))
+     {
+        if (rotary_selector_item->content_icon)
+          {
+             if (rotary_selector_item->index == rsd->selected_index)
+               {
+                  elm_object_part_content_unset(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,icon");
+               }
+             evas_object_del(rotary_selector_item->content_icon);
+             rotary_selector_item->content_icon = NULL;
+          }
+        rotary_selector_item->content_icon = content;
+     }
+   else if (!strcmp(part_name, "selector,content"))
+     {
+        if (rotary_selector_item->custom_content)
+          {
+             evas_object_del(rotary_selector_item->custom_content);
+             rotary_selector_item->custom_content = NULL;
+          }
+        rotary_selector_item->custom_content = content;
+     }
+   else
+     {
+        ERR("Not supported part name!!");
+        return;
+     }
+
+   _selector_content_update(rsd);
+}
+
+EAPI Evas_Object *
+eext_rotary_selector_item_part_content_get(const Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state)
+{
+   Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item*)item;
+
+   if (!rotary_selector_item)
+     {
+        ERR("rotary_selector_item is NULL!!");
+        return NULL;
+     }
+   if (!part_name)
+     {
+        ERR("part_name is NULL!!");
+        return NULL;
+     }
+   if (state != EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
+     {
+        ERR("Not implemented!!");
+        return NULL;
+     }
+
+   if (!strcmp(part_name, "item,bg_image") || !strcmp(part_name, "item,icon"))
+     {
+        return elm_object_part_content_get(rotary_selector_item->base.obj, part_name);
+     }
+   else if (!strcmp(part_name, "selector,icon"))
+     {
+        return rotary_selector_item->content_icon;
+     }
+   else if (!strcmp(part_name, "selector,content"))
+     {
+        return rotary_selector_item->custom_content;
+     }
+   else
+     {
+       ERR("Not supported part name!!");
+       return NULL;
+     }
+
+   return NULL;
+}
+
+EAPI void
+eext_rotary_selector_part_content_set(Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state, Evas_Object *content)
+{
+   //Supported part names : "selector,bg_image"
+
+   if (!obj)
+     {
+        ERR("obj is NULL!!");
+        return;
+     }
+   if (!part_name)
+     {
+        ERR("part_name is NULL!!");
+        return;
+     }
+   if (!content)
+     {
+        ERR("content is NULL!!");
+        return;
+     }
+
+   if (strcmp(part_name, "selector,bg_image"))
+   {
+      ERR("Not supported part name!!!");
+      return;
+   }
+
+   if (state != EEXT_ROTARY_SELECTOR_SELECTOR_STATE_NORMAL)
+     {
+        ERR("Not implemented!!");
+        return;
+     }
+
+   Eext_Rotary_Selector_Data *rsd = NULL;
+   rsd = _eext_rotary_selector_data_get(obj);
+   if (!rsd)
+     {
+        ERR("rsd is NULL!!");
+        return;
+     }
+
+   elm_object_part_content_set(rsd->rotary_selector, part_name, content);
+
+}
+
+EAPI Evas_Object *
+eext_rotary_selector_part_content_get(const Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state)
+{
+   //Supported part names : "selector,bg_image"
+   if (!obj)
+     {
+        ERR("obj is NULL!!");
+        return NULL;
+     }
+   if (!part_name)
+     {
+        ERR("part_name is NULL!!");
+        return NULL;
+     }
+   if (strcmp(part_name, "selector,bg_image"))
+     {
+        ERR("Not supported part name!!!");
+        return NULL;
+     }
+
+   if (state != EEXT_ROTARY_SELECTOR_SELECTOR_STATE_NORMAL)
+     {
+        ERR("Not implemented!!");
+        return NULL;
+     }
+
+   Eext_Rotary_Selector_Data *rsd = NULL;
+   rsd = _eext_rotary_selector_data_get((Evas_Object *)obj);
+   if (!rsd)
+     {
+        ERR("rsd is NULL!!");
+        return NULL;
+     }
+
+   return elm_object_part_content_get(rsd->rotary_selector, part_name);
+}
+
+EAPI void
+eext_rotary_selector_item_part_color_set(Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state, int r, int g, int b, int a)
+{
+   Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item*)item;
+   Evas_Object *content;
+
+   if (!rotary_selector_item)
+     {
+        ERR("rotary_selector_item is NULL!!");
+        return;
+     }
+   if (!part_name)
+     {
+        ERR("part_name is NULL!!");
+        return;
+     }
+
+   if (!strcmp(part_name, "item,bg_image"))
+     {
+
+        if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
+          {
+             ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, item_bg_image_color, normal_color, r, g, b, a);
+          }
+        else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
+          {
+             ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, item_bg_image_color, pressed_color, r, g, b, a);
+          }
+
+        if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
+          {
+             content = eext_rotary_selector_item_part_content_get(item, "item,bg_image",EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL);
+             ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, item_bg_image_color, normal_color);
+          }
+        else if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
+          {
+             content = eext_rotary_selector_item_part_content_get(item, "item,bg_image",EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED);
+             ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, item_bg_image_color, pressed_color);
+          }
+     }
+   else if (!strcmp(part_name, "item,icon"))
+     {
+
+        if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
+          {
+             ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, item_icon_color, normal_color, r, g, b, a);
+          }
+        else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
+          {
+             ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, item_icon_color, pressed_color, r, g, b, a);
+          }
+
+        if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
+          {
+             content = eext_rotary_selector_item_part_content_get(item, "item,icon",EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL);
+             ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, item_icon_color, normal_color);
+          }
+        else if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
+          {
+             content = eext_rotary_selector_item_part_content_get(item, "item,icon",EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED);
+             ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, item_icon_color, pressed_color);
+          }
+     }
+   else if (!strcmp(part_name, "selector,icon"))
+     {
+        if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
+          {
+             ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, selector_icon_color, normal_color, r, g, b, a);
+          }
+        else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
+          {
+             ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, selector_icon_color, pressed_color, r, g, b, a);
+          }
+
+        if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
+          {
+             content = eext_rotary_selector_item_part_content_get(item, "selector,icon",EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL);
+             ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, selector_icon_color, normal_color);
+          }
+        else if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
+          {
+             content = eext_rotary_selector_item_part_content_get(item, "selector,icon",EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED);
+             ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, selector_icon_color, pressed_color);
+          }
+     }
+   else if (!strcmp(part_name, "selector,content"))
+     {
+        if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
+          {
+             ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, custom_content_color, normal_color, r, g, b, a);
+          }
+        else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
+          {
+             ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, custom_content_color, pressed_color, r, g, b, a);
+          }
+
+        if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
+          {
+             content = eext_rotary_selector_item_part_content_get(item, "selector,content",EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL);
+             ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, custom_content_color, normal_color);
+          }
+        else if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
+          {
+             content = eext_rotary_selector_item_part_content_get(item, "selector,content",EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED);
+             ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, custom_content_color, pressed_color);
+          }
+     }
+   else
+     {
+       ERR("Not supported part name [%s]", part_name);
+       return;
+     }
+
+   return;
+}
+
+EAPI void
+eext_rotary_selector_item_part_color_get(const Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state, int *r, int *g, int *b, int *a)
+{
+   Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item*)item;
+
+   if (!rotary_selector_item)
+     {
+        ERR("rotary_selector_item is NULL!!");
+        return;
+     }
+   if (!part_name)
+     {
+        ERR("part_name is NULL!!");
+        return;
+     }
+
+   if (!strcmp(part_name, "item,bg_image") )
+     {
+        if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
+          {
+             ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, item_bg_image_color, normal_color, r, g, b, a);
+          }
+        else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
+          {
+             ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, item_bg_image_color, pressed_color, r, g, b, a);
+          }
+     }
+   else if (!strcmp(part_name, "item,icon"))
+     {
+        if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
+          {
+             ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, item_icon_color, normal_color, r, g, b, a);
+          }
+        else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
+          {
+             ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, item_icon_color, pressed_color, r, g, b, a);
+          }
+     }
+   else if (!strcmp(part_name, "selector,icon"))
+     {
+        if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
+          {
+             ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, selector_icon_color, normal_color, r, g, b, a);
+          }
+        else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
+          {
+             ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, selector_icon_color, pressed_color, r, g, b, a);
+          }
+     }
+   else if (!strcmp(part_name, "selector,content"))
+     {
+        if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
+          {
+             ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, custom_content_color, normal_color, r, g, b, a);
+          }
+        else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
+          {
+             ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, custom_content_color, pressed_color, r, g, b, a);
+          }
+     }
+   else
+     {
+       ERR("Not supported part name [%s]", part_name);
+       return;
+     }
+}
+
+EAPI void
+eext_rotary_selector_part_color_set(Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state, int r, int g, int b, int a)
+{
+   Evas_Object *content;
+   Eext_Rotary_Selector_Data *rsd = NULL;
+   rsd = _eext_rotary_selector_data_get((Evas_Object *)obj);
+
+   if (!rsd)
+     {
+        ERR("rsd is NULL!!");
+        return;
+     }
+   if (!part_name)
+     {
+        ERR("part_name is NULL!!");
+        return;
+     }
+
+   if (!strcmp(part_name, "item,icon") || !strcmp(part_name, "selector,bg_image"))
+     {
+        if (state == EEXT_ROTARY_SELECTOR_SELECTOR_STATE_NORMAL)
+          {
+             ROTARY_SELECTOR_COLOR_VALUE_SET(rsd, selector_bg_image_color, normal_color, r, g, b, a);
+          }
+        else if (state == EEXT_ROTARY_SELECTOR_SELECTOR_STATE_PRESSED)
+          {
+             ROTARY_SELECTOR_COLOR_VALUE_SET(rsd, selector_bg_image_color, pressed_color, r, g, b, a);
+          }
+
+        content = elm_object_part_content_get(obj, "selector,bg_image");
+
+        if (rsd->state == EEXT_ROTARY_SELECTOR_SELECTOR_STATE_NORMAL)
+          {
+             ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rsd, selector_bg_image_color, normal_color);
+          }
+        else if (rsd->state == EEXT_ROTARY_SELECTOR_SELECTOR_STATE_PRESSED)
+          {
+             ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rsd, selector_bg_image_color, pressed_color);
+          }
+        return;
+     }
+   else
+     {
+       ERR("Not supported part name [%s]", part_name);
+       return;
+     }
+
+   return;
+}
+
+EAPI void
+eext_rotary_selector_part_color_get(const Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state, int *r, int *g, int *b, int *a)
+{
+   Eext_Rotary_Selector_Data *rsd = NULL;
+   rsd = _eext_rotary_selector_data_get((Evas_Object *)obj);
+
+   if (!rsd)
+     {
+        ERR("rsd is NULL!!");
+        return;
+     }
+   if (!part_name)
+     {
+        ERR("part_name is NULL!!");
+        return;
+     }
+
+   if (!strcmp(part_name, "item,icon") || !strcmp(part_name, "selector,bg_image"))
+     {
+        if (state == EEXT_ROTARY_SELECTOR_SELECTOR_STATE_NORMAL)
+          {
+             ROTARY_SELECTOR_COLOR_VALUE_GET(rsd, selector_bg_image_color, normal_color, r, g, b, a);
+          }
+        else if (state == EEXT_ROTARY_SELECTOR_SELECTOR_STATE_PRESSED)
+          {
+             ROTARY_SELECTOR_COLOR_VALUE_GET(rsd, selector_bg_image_color, pressed_color, r, g, b, a);
+          }
+        return;
+     }
+   else
+     {
+       ERR("Not supported part name [%s]", part_name);
+       return;
+     }
+}
+
+EAPI void
+eext_rotary_selector_selected_item_set(Evas_Object *obj, Eext_Object_Item *item)
+{
+   Eext_Rotary_Selector_Data *rsd = NULL;
+   Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item;
+
+   if (!rotary_selector_item)
+     {
+        ERR("rotary_selector_item is NULL!!");
+        return;
+     }
+
+   rsd = _eext_rotary_selector_data_get(obj);
+   if (!rsd)
+     {
+        ERR("rsd is NULL!!");
+        return;
+     }
+   if (rsd->item_update_animator)
+     {
+        return;
+     }
+
+   if (rsd->selected_index != rotary_selector_item->index)
+     {
+        int previous_index = rsd->selected_index;
+        rsd->selected_index = rotary_selector_item->index;
+
+        _item_selected_signal_send(rsd, previous_index, rsd->selected_index);
+        rsd->current_page = rsd->selected_index/_ROTARY_SELECTOR_PAGE_ITEM_MAX;
+        _item_update_animation_run(rsd);
+     }
+
+   INF("selected item index(%d)", rsd->selected_index);
+}
+
+EAPI Eext_Object_Item*
+eext_rotary_selector_selected_item_get(const Evas_Object *obj)
+{
+   Eext_Rotary_Selector_Data *rsd = _eext_rotary_selector_data_get((Evas_Object *)obj);
+   if (!rsd)
+     {
+        ERR("rsd is NULL!!");
+        return NULL;
+     }
+
+   return (Eext_Object_Item*)_item_get(rsd, rsd->selected_index);
+}
+
+EAPI const Eina_List*
+eext_rotary_selector_items_get(const Evas_Object *obj)
+{
+   Eext_Rotary_Selector_Data *rsd = _eext_rotary_selector_data_get((Evas_Object *)obj);
+   if (!rsd)
+     {
+        ERR("rsd is NULL!!");
+        return NULL;
+     }
+
+   return rsd->item_list;
+}
+
+
+// ----------------------------------------- Accessibility API --------------------------------------//
+static void
+_accessibility_item_btn_highlighted_cb(void *data, Evas_Object *obj, void *event_info)
+{
+   Eext_Rotary_Selector_Data *rsd = NULL;
+   Eext_Rotary_Selector_Item *item = NULL;
+   Eina_List *l;
+
+   rsd = (Eext_Rotary_Selector_Data*)data;
+   if(!rsd)
+     return;
+
+   EINA_LIST_FOREACH(rsd->item_list,l,item)
+     {
+        if(item->base.obj == obj)
+           break;
+     }
+
+   int previous_item_index = rsd->selected_index;
+   rsd->selected_index = item->index;
+   _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
+   _selector_update(rsd, EINA_FALSE, EINA_TRUE);
+
+   rsd->control_by_rotary = EINA_FALSE;
+}
+
+void _accessibility_page_change(Eext_Rotary_Selector_Data *rsd, int previous_item_index, Eina_Bool dir)
+{
+   _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
+   _page_animation_run(rsd, dir);
+   _selector_update(rsd, EINA_TRUE, EINA_TRUE);
+}
+
+static Eina_Bool
+_accessibility_event_area_highlighted_cb(void *data, Evas_Object *obj, Elm_Access_Action_Info *action_info)
+{
+   if(!elm_atspi_bridge_utils_is_screen_reader_enabled())
+     return EINA_FALSE;
+
+   Eext_Rotary_Selector_Data *rsd = NULL;
+   rsd = (Eext_Rotary_Selector_Data*)data;
+   if(!rsd)
+     return EINA_FALSE;
+   int current_page = 0;
+   Eina_List *l;
+   int previous_item_index = rsd->selected_index;
+   int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
+   int last_index = 0;
+   int changed_list = 0;
+   Eina_Bool ret = EINA_FALSE;
+
+   if (rsd->current_page == 0)
+        last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+   else
+        last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+   if (last_index > rsd->item_count - 1)
+        last_index = rsd->item_count - 1;
+
+   if (last_index < rsd->selected_index+1 && last_index != rsd->item_count - 1)
+        changed_list = 1;
+   else if (first_index > rsd->selected_index-1 && first_index != 0)
+        changed_list = 2;
+
+   switch (action_info->action_type)
+     {
+        case ELM_ACCESS_ACTION_UNHIGHLIGHT:
+           elm_atspi_accessible_can_highlight_set(rsd->event_area_access_object, EINA_FALSE);
+           break;
+        case ELM_ACCESS_ACTION_HIGHLIGHT:
+           if (action_info->action_by == ELM_ACCESS_ACTION_HIGHLIGHT_NEXT || (changed_list == 1 && rsd->control_by_rotary))
+             {
+                rsd->selected_index += 1;
+                _accessibility_page_change(rsd, previous_item_index, EINA_TRUE);
+                current_page = rsd->current_page + 1;
+                rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_RIGHT;
+                _accessibility_set_relationship(rsd, current_page);
+             }
+           else if (action_info->action_by == ELM_ACCESS_ACTION_HIGHLIGHT_PREV || (changed_list == 2 && rsd->control_by_rotary))
+             {
+                rsd->selected_index -= 1;
+                _accessibility_page_change(rsd, previous_item_index, EINA_FALSE);
+                current_page = rsd->current_page - 1;
+                rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_LEFT;
+                _accessibility_set_relationship(rsd, current_page);
+             }
+           else
+             {
+                Elm_Accessible_Reading_Info_Type type = elm_atspi_accessible_reading_info_type_get(rsd->event_area_access_object);
+                char buf[255] = "";
+                if(type & ELM_ACCESSIBLE_READING_INFO_TYPE_NAME)
+                  {
+                     if(_rotary_selector_from_moreoption_get(rsd->rotary_selector))
+                       {
+                          const char *buf_name;
+                          buf_name = elm_atspi_accessible_name_get(rsd->event_area_access_object);
+                          if(buf_name)
+                            strcat(buf, buf_name);
+                       }
+                  }
+                if(type & ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION)
+                  {
+                     strcat(buf, " ");
+                     const char *buf_desc;
+                     buf_desc = elm_atspi_accessible_description_get(rsd->event_area_access_object);
+                     if(buf_desc)
+                       strcat(buf, buf_desc);
+                  }
+                if(strcmp(buf,""))
+                  elm_atspi_bridge_utils_say(buf, EINA_TRUE, NULL, NULL);
+                _accessibility_set_relationship(rsd, rsd->current_page);
+             }
+           ret = EINA_FALSE;
+        break;
+        case ELM_ACCESS_ACTION_HIGHLIGHT_NEXT:
+           rsd->control_by_rotary = EINA_FALSE;
+           if (rsd->event_area_highlighted_state == EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_LEFT)
+             {
+                rsd->selected_index += 1;
+                _accessibility_page_change(rsd, previous_item_index, EINA_TRUE);
+                current_page = rsd->current_page + 1;
+                rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_RIGHT;
+
+                _accessibility_set_relationship(rsd, current_page);
+                ret = EINA_TRUE;
+                const char *buf_desc;
+                buf_desc = elm_atspi_accessible_description_get(rsd->event_area_access_object);
+                if(buf_desc)
+                   elm_atspi_bridge_utils_say(buf_desc, EINA_TRUE, NULL, NULL);
+             }
+           else if (rsd->event_area_highlighted_state == EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_RIGHT)
+             {
+                rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_NORMAL;
+                ret = EINA_FALSE;
+             }
+        break;
+        case ELM_ACCESS_ACTION_HIGHLIGHT_PREV:
+           rsd->control_by_rotary = EINA_FALSE;
+           if (rsd->event_area_highlighted_state == EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_LEFT)
+             {
+                rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_NORMAL;
+                ret = EINA_FALSE;
+             }
+           else if (rsd->event_area_highlighted_state == EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_RIGHT)
+             {
+                rsd->selected_index -= 1;
+                _accessibility_page_change(rsd, previous_item_index, EINA_FALSE);
+                current_page = rsd->current_page - 1;
+                rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_LEFT;
+
+                _accessibility_set_relationship(rsd, current_page);
+                ret = EINA_TRUE;
+                const char *buf_desc;
+                buf_desc = elm_atspi_accessible_description_get(rsd->event_area_access_object);
+                if(buf_desc)
+                   elm_atspi_bridge_utils_say(buf_desc, EINA_TRUE, NULL, NULL);
+             }
+        break;
+     }
+   return ret;
+}
+
+static void _accessibility_set_relationship(Eext_Rotary_Selector_Data *rsd,int current_page)
+{
+   Eext_Rotary_Selector_Item *item = NULL;
+   Eext_Rotary_Selector_Item *before_item = NULL;
+   Evas_Object *first_item = NULL;
+   Evas_Object *last_item = NULL;
+   Eina_Bool is_next_page = EINA_FALSE;
+   Eina_Bool is_prev_page = EINA_FALSE;
+   int i = 0;
+   Eina_List *l;
+   int first_index = 0;
+   int last_index = 0;
+
+   rsd->reading_page_number = current_page;
+   elm_atspi_accessible_description_cb_set(rsd->event_area_access_object, _accessibility_description_set_cb, (Eext_Rotary_Selector_Data*)rsd);
+   elm_atspi_accessible_reading_info_type_set(rsd->event_area_access_object, ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
+
+   first_index = current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
+
+   if (current_page == 0)
+     {
+        last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+     }
+   else
+     {
+        last_index = (current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
+     }
+   if (last_index > rsd->item_count - 1)
+     {
+        last_index = rsd->item_count - 1;
+     }
+
+   EINA_LIST_FOREACH(rsd->item_list, l, item)
+     {
+        Evas_Object *button = item->base.obj;
+        if (i >= first_index && i <= last_index)
+          {
+             if(before_item)
+               {
+                  elm_atspi_accessible_relationship_append(before_item->base.obj, ELM_ATSPI_RELATION_FLOWS_TO, button);
+                  elm_atspi_accessible_relationship_append(button, ELM_ATSPI_RELATION_FLOWS_FROM, before_item->base.obj);
+               }
+             before_item = item;
+          }
+        if (i == first_index)
+          {
+             first_item = button;
+          }
+        else if (i == last_index)
+          {
+             last_item = button;
+          }
+        if(current_page > 0 && i == first_index-1)
+          {
+             is_prev_page = EINA_TRUE;
+          }
+        else if (last_index < (rsd->item_count - 1) && i == last_index + 1)
+          {
+             is_next_page = EINA_TRUE;
+          }
+        elm_atspi_accessible_name_cb_set(button, _accessibility_item_name_set_cb, (Eext_Rotary_Selector_Item*)item);
+        elm_atspi_accessible_reading_info_type_set(button, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME);
+        i++;
+     }
+
+   if(rsd->backup_first_item_for_atspi)
+   {
+        elm_atspi_accessible_relationship_remove(rsd->event_area_access_object, ELM_ATSPI_RELATION_FLOWS_TO, rsd->backup_first_item_for_atspi);
+        elm_atspi_accessible_relationship_remove(rsd->backup_first_item_for_atspi, ELM_ATSPI_RELATION_FLOWS_FROM, rsd->event_area_access_object);
+   }
+   if(rsd->backup_last_item_for_atspi)
+   {
+        elm_atspi_accessible_relationship_remove(rsd->event_area_access_object, ELM_ATSPI_RELATION_FLOWS_FROM, rsd->backup_last_item_for_atspi);
+        elm_atspi_accessible_relationship_remove(rsd->backup_last_item_for_atspi, ELM_ATSPI_RELATION_FLOWS_TO, rsd->event_area_access_object);
+   }
+
+   if(first_item)
+     {
+          elm_atspi_accessible_relationship_append(rsd->event_area_access_object, ELM_ATSPI_RELATION_FLOWS_TO, first_item);
+          elm_atspi_accessible_relationship_append(first_item, ELM_ATSPI_RELATION_FLOWS_FROM, rsd->event_area_access_object);
+          if(!is_prev_page)
+            {
+               elm_atspi_accessible_relationship_remove(first_item, ELM_ATSPI_RELATION_FLOWS_FROM, rsd->event_area_access_object);
+               elm_atspi_accessible_relationship_append(first_item, ELM_ATSPI_RELATION_FLOWS_FROM, first_item);
+            }
+     }
+   if(last_item)
+     {
+          elm_atspi_accessible_relationship_append(rsd->event_area_access_object, ELM_ATSPI_RELATION_FLOWS_FROM, last_item);
+          elm_atspi_accessible_relationship_append(last_item, ELM_ATSPI_RELATION_FLOWS_TO, rsd->event_area_access_object);
+          if(!is_next_page)
+            {
+               elm_atspi_accessible_relationship_remove(last_item, ELM_ATSPI_RELATION_FLOWS_TO, rsd->event_area_access_object);
+               elm_atspi_accessible_relationship_append(last_item, ELM_ATSPI_RELATION_FLOWS_TO, last_item);
+            }
+     }
+     rsd->backup_first_item_for_atspi = first_item;
+     rsd->backup_last_item_for_atspi = last_item;
+}
+
+static void
+_rotary_selector_moreoption_opened_cb(void *data, Evas_Object *obj, void *event_info)
+{
+   if(!elm_atspi_bridge_utils_is_screen_reader_enabled())
+      return ;
+
+   Eext_Rotary_Selector_Data *rsd = NULL;
+   Eina_List *l = NULL;
+   Eext_Rotary_Selector_Item *item = NULL;
+   rsd = data;
+   if (!rsd)
+     {
+        ERR("rsd is NULL!!");
+        return;
+     }
+   elm_atspi_accessible_can_highlight_set(rsd->event_area_access_object, EINA_TRUE);
+
+   EINA_LIST_FOREACH(rsd->item_list, l, item)
+     {
+        Evas_Object *button = item->base.obj;
+        elm_atspi_accessible_can_highlight_set(button, EINA_TRUE);
+     }
+
+   rsd->reading_page_number = -1;
+   elm_atspi_accessible_name_cb_set(rsd->event_area_access_object, _accessibility_name_set_cb, (Eext_Rotary_Selector_Data*)rsd);
+   elm_atspi_accessible_description_cb_set(rsd->event_area_access_object, _accessibility_description_set_cb, (Eext_Rotary_Selector_Data*)rsd);
+   elm_atspi_accessible_reading_info_type_set(rsd->event_area_access_object, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME | ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
+
+   elm_atspi_component_highlight_grab(rsd->event_area_access_object);
+}
+
+
+static void
+_rotary_selector_moreoption_closed_cb(void *data, Evas_Object *obj, void *event_info)
+{
+   if(!elm_atspi_bridge_utils_is_screen_reader_enabled())
+      return ;
+
+   Eext_Rotary_Selector_Data *rsd = NULL;
+   Eina_List *l = NULL;
+   Eext_Rotary_Selector_Item *item = NULL;
+   rsd = data;
+   if (!rsd)
+     {
+        ERR("rsd is NULL!!");
+        return;
+     }
+
+   elm_atspi_accessible_can_highlight_set(rsd->event_area_access_object, EINA_FALSE);
+
+   EINA_LIST_FOREACH(rsd->item_list, l, item)
+     {
+        Evas_Object *button = item->base.obj;
+        elm_atspi_accessible_can_highlight_set(button, EINA_FALSE);
+     }
+}
+void
+_rotary_selector_from_moreoption_set(Evas_Object *rotary_selector, Eina_Bool from_more_option)
+{
+   Eext_Rotary_Selector_Data *rsd = _eext_rotary_selector_data_get(rotary_selector);
+
+   if(rsd)
+      rsd->from_moreoption = from_more_option;
+}
+
+static Eina_Bool _rotary_selector_from_moreoption_get(Evas_Object *rotary_selector)
+{
+   Eext_Rotary_Selector_Data *rsd = _eext_rotary_selector_data_get(rotary_selector);
+
+   if(rsd)
+      return rsd->from_moreoption;
+   return EINA_FALSE;
+}
+
+static char *
+_accessibility_item_name_set_cb(void *data, Evas_Object *obj)
+{
+   Eext_Rotary_Selector_Item *item = (Eext_Rotary_Selector_Item*)data;
+
+   char buf[255] = "";
+   if(item->text1)
+     {
+        strcat(buf, item->text1);
+     }
+   if(item->text2)
+     {
+        strcat(buf, " ");
+        strcat(buf, item->text2);
+     }
+   return strdup(buf);
+}
+
+static char *
+_accessibility_name_set_cb(void *data, Evas_Object *obj)
+{
+   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+   char buf[255] = "";
+
+   if( _rotary_selector_from_moreoption_get(rsd->rotary_selector))
+     {
+        snprintf(buf, sizeof(buf), _("WDS_TTS_TBOPT_MORE_OPTIONS"));
+     }
+   return strdup(buf);
+}
+
+static char *
+_accessibility_description_set_cb(void *data, Evas_Object *obj)
+{
+   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+   char buf[255] = "";
+
+   bindtextdomain (PACKAGE, LOCALE_DIR);
+   textdomain (PACKAGE);
+
+   if( rsd->reading_page_number == -1)
+     {
+        snprintf(buf, sizeof(buf), _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_NAVIGATE_ITEMS"));
+     }
+   else
+     {
+        snprintf(buf, sizeof(buf), _("WDS_TTS_TBOPT_N_OF_N_PAGE"), rsd->reading_page_number + 1, ((rsd->item_count - 1) / _ROTARY_SELECTOR_PAGE_ITEM_MAX) + 1);
+     }
+
+   return strdup(buf);
+}
+
+static void
+_accessibility_item_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
+{
+   INF("called!!");
+
+   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
+   if (rsd)
+     {
+        evas_object_smart_callback_call(rsd->rotary_selector, "item,clicked", (void*)_item_get(rsd, rsd->selected_index));
+     }
+}
diff --git a/wearable/data/images/date_picker_day_28_bg.png b/wearable/data/images/date_picker_day_28_bg.png
deleted file mode 100755 (executable)
index 8756a60..0000000
Binary files a/wearable/data/images/date_picker_day_28_bg.png and /dev/null differ
diff --git a/wearable/data/images/date_picker_day_29_bg.png b/wearable/data/images/date_picker_day_29_bg.png
deleted file mode 100755 (executable)
index 1bda653..0000000
Binary files a/wearable/data/images/date_picker_day_29_bg.png and /dev/null differ
diff --git a/wearable/data/images/date_picker_day_30_bg.png b/wearable/data/images/date_picker_day_30_bg.png
deleted file mode 100755 (executable)
index c212e09..0000000
Binary files a/wearable/data/images/date_picker_day_30_bg.png and /dev/null differ
diff --git a/wearable/data/images/date_picker_day_31_bg.png b/wearable/data/images/date_picker_day_31_bg.png
deleted file mode 100755 (executable)
index 5b62106..0000000
Binary files a/wearable/data/images/date_picker_day_31_bg.png and /dev/null differ
diff --git a/wearable/data/images/date_picker_month_bg.png b/wearable/data/images/date_picker_month_bg.png
deleted file mode 100755 (executable)
index 8edc8df..0000000
Binary files a/wearable/data/images/date_picker_month_bg.png and /dev/null differ
diff --git a/wearable/data/images/date_picker_year_bg.png b/wearable/data/images/date_picker_year_bg.png
deleted file mode 100755 (executable)
index 3840024..0000000
Binary files a/wearable/data/images/date_picker_year_bg.png and /dev/null differ
diff --git a/wearable/data/images/time_picker_bg.png b/wearable/data/images/time_picker_bg.png
deleted file mode 100755 (executable)
index 351f917..0000000
Binary files a/wearable/data/images/time_picker_bg.png and /dev/null differ
diff --git a/wearable/src/CMakeLists.txt b/wearable/src/CMakeLists.txt
deleted file mode 100644 (file)
index c0201ca..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-SET(LIB_NAME ${PROJECT_NAME})
-
-INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/include)
-LINK_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/lib)
-
-ADD_SUBDIRECTORY(include)
-ADD_SUBDIRECTORY(lib)
diff --git a/wearable/src/include/CMakeLists.txt b/wearable/src/include/CMakeLists.txt
deleted file mode 100644 (file)
index aa95fa2..0000000
+++ /dev/null
@@ -1,31 +0,0 @@
-SET(LIB_INCS
-       efl_extension_events.h
-       circle/efl_extension_circle_surface.h
-       circle/efl_extension_circle_object.h
-       circle/efl_extension_circle_object_progressbar.h
-       circle/efl_extension_circle_object_slider.h
-       circle/efl_extension_circle_object_genlist.h
-       circle/efl_extension_circle_object_datetime.h
-       circle/efl_extension_circle_object_scroller.h
-       circle/efl_extension_circle_object_spinner.h
-       circle/efl_extension_rotary.h
-       common/efl_extension_common.h
-       common/efl_extension_rotary_selector.h
-       common/efl_extension_more_option.h)
-
-FOREACH(inc ${LIB_INCS})
-       SET(LIB_HEADERS "${LIB_HEADERS}#include \"${inc}\"\n")
-ENDFOREACH(inc)
-
-CONFIGURE_FILE(
-       efl_extension.h.in efl_extension.h
-       @ONLY)
-
-SET(LIB_INCS
-       ${LIB_INCS}
-       efl_extension.h)
-
-FOREACH(inc ${LIB_INCS})
-       GET_FILENAME_COMPONENT(dir ${inc} PATH)
-       INSTALL(FILES ${inc} DESTINATION include/${LIB_NAME}/${dir})
-ENDFOREACH()
diff --git a/wearable/src/include/circle/efl_extension_circle_object.h b/wearable/src/include/circle/efl_extension_circle_object.h
deleted file mode 100644 (file)
index d58071c..0000000
+++ /dev/null
@@ -1,600 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __EFL_EXTENSION_CIRCLE_OBJECT_H__
-#define __EFL_EXTENSION_CIRCLE_OBJECT_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup CAPI_EFL_EXTENSION_CIRCLE_OBJECT_MODULE Efl Extension Circle Object
- * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
- * @brief Circle object is used for circular design of circular ui-controls.
- *        It can be combined with elementary widgets and be a part of design.
- *        Or it can make itself as a ui-control which is operated by rotary event.
- *
- * @details A Circle object extends elementary widgets in a form of circular design.
- *          It can be rendered either independently or by @ref Eext_Circle_Surface.
- *          When a circle object handle is added with surface parameter of @c NULL,
- *          it is rendered independently along with Evas_Object. On the other hand,
- *          if a circle object is created with surface parameter of @ref Eext_Circle_Surface,
- *          passed surface will render the circle object.
- *
- *          eext_circle_object functions are same with eext_circle_object_item functions
- *          with "default" for item_name parameter. You can check what is the meaning of "default" item
- *          in each circle object's documentation.
- *
- * @{
- */
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the line width of the circle object.
- *
- * @param[in] obj The circle object
- * @param[in] line_width The line width value of the circle object
- *
- * @see eext_circle_line_width_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_line_width_set(Evas_Object *obj, int line_width);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the line width of a given circle object.
- *
- * @param[in] obj The circle object
- * @return The line width value of the circle object
- *
- * @see eext_circle_line_width_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI int eext_circle_object_line_width_get(const Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the angle in degree of a given circle object.
- *
- * @param[in] obj The circle object
- * @param[in] angle The angle in degree of the circle object
- *
- * @see eext_circle_angle_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_angle_set(Evas_Object *obj, double angle);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the angle in degree of a given circle object.
- *
- * @param[in] obj The circle object
- * @return The angle of circle
- *
- * @see eext_circle_angle_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI double eext_circle_object_angle_get(const Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the angle offset of a given circle object.
- *
- * @param[in] obj The circle object
- * @param[in] angle_offset The angle offset value of the circle object
- *
- * @see eext_circle_angle_offset_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_angle_offset_set(Evas_Object *obj, double angle_offset);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the angle offset of a given circle object.
- *
- * @param[in] obj The circle object
- * @return The angle offset of the circle object
- *
- * @see eext_circle_angle_offset_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI double eext_circle_object_angle_offset_get(const Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the minimum and maximum angle for the circle object.
- *
- * @param[in] obj The circle object
- * @param[in] min_angle The minimum angle in degree
- * @param[in] max_angle The maximum angle in degree
- *
- * @see eext_circle_angle_min_max_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_angle_min_max_set(Evas_Object *obj, double min_angle, double max_angle);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the minimum and maximum angle of a given circle object.
- *
- * @param[in] obj The circle object
- * @param[out] min_angle The pointer to store the minimum angle in degree
- * @param[out] max_angle The pointer to store the minimum angle in degree
- *
- * @see eext_circle_angle_min_max_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_angle_min_max_get(const Evas_Object *obj, double *min_angle, double *max_angle);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the minimum and maximum value for the circle object.
- *
- * @param[in] obj The circle object
- * @param[in] min_value The minimum value
- * @param[in] max_value The maximum value
- *
- * @see eext_circle_value_min_max_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_value_min_max_set(Evas_Object *obj, double min_value, double max_value);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the minimum and maximum value of a given circle object.
- *
- * @param[in] obj The circle object
- * @param[out] min_value The pointer to store the minimum value
- * @param[out] max_value The pointer to store the minimum value
- *
- * @see eext_circle_value_min_max_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_value_min_max_get(const Evas_Object *obj, double *min_value, double *max_value);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the value of a given circle object.
- *
- * @param[in] obj The circle object
- * @param[in] value The value of circle object
- *
- * @see eext_circle_object_value_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_value_set(Evas_Object *obj, double value);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the value of a given circle object.
- *
- * @param[in] obj The circle object
- * @return The value of circle
- *
- * @see eext_circle_object_value_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI double eext_circle_object_value_get(const Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the color of circle line and font in a given circle object.
- *
- * @param[in] obj The circle object
- * @param[in] r The red component of the given color
- * @param[in] g The green component of the given color
- * @param[in] b The blue component of the given color
- * @param[in] a The alpha component of the given color
- *
- * @see eext_circle_color_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_color_set(Evas_Object *obj, int r, int g, int b, int a);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get color of circle line and font color in a given circle object.
- *
- * @param[in] obj The circle object
- * @param[out]   r    The pointer to an integer in which to store the red component
- *               of the color
- * @param[out]   g    The pointer to an integer in which to store the green
- *               component of the color
- * @param[out]   b    The pointer to an integer in which to store the blue component
- *               of the color
- * @param[out]   a    The pointer to an integer in which to store the alpha
- *               component of the color
- *
- * @see eext_circle_color_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_color_get(const Evas_Object *obj, int *r, int *g, int *b, int *a);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set circle radius of a given circle object.
- *
- * @param[in] obj The circle object
- * @param[in] radius The radius value of a given circle object
- *
- * @see eext_circle_radius_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_radius_set(Evas_Object *obj, double radius);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get circle radius of a given circle object.
- *
- * @param[in] obj The circle object
- * @return The radius of circle
- *
- * @see eext_circle_color_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI double eext_circle_object_radius_get(const Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the disabled state of the circle object.
- *
- * @details This sets the disabled state of the circle object.
- *          If @c EINA_TRUE, circle object will be disabled
- *          and will not recieve any event. If @c EINA_FALSE,
- *          circle object will be enabled.
- *
- * @param[in] obj The circle object
- * @param[in] disabled The disabled state
- *
- * @see eext_circle_object_disabled_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_disabled_set(Evas_Object *obj, Eina_Bool disabled);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the disabled state of the circle object.
- *
- * @param[in] obj The circle object
- * @return Disabled state. If @c EINA_TRUE, circle object will be disabled
- *         and will not recieve any event. If @c EINA_FALSE, circle object
- *         will be enabled.
- *
- * @see eext_circle_object_disabled_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eina_Bool eext_circle_object_disabled_get(Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Add a new circle object.
- *
- * @param[in] parent The parent object
- * @param[in] surface The @ref Eext_Circle_Surface object to render the circle object.
- *                    If @c NULL, circle object will be rendered independently.
- *
- * @return A new circle object handle, otherwise
- *         @c NULL if it cannot be created
- *
- * @see @ref CAPI_EFL_EXTENSION_CIRCLE_SURFACE_MODULE
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Evas_Object *eext_circle_object_add(Evas_Object *parent, Eext_Circle_Surface *surface);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the line width of a given item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @param[in] line_width The line width value of the circle object
- *
- * @see eext_circle_object_item_line_width_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_item_line_width_set(Evas_Object *obj, const char *item_name, int line_width);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the line width of a given item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @return The line width value of the circle object if it succeeds to find the item,
- *         otherwise -1 if it fails to find the item.
- *
- * @see eext_circle_object_item_line_width_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI int eext_circle_object_item_line_width_get(const Evas_Object *obj, const char *item_name);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the angle in degree of a given item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @param[in] angle The angle in degree of the circle object
- *
- * @see eext_circle_object_item_angle_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_item_angle_set(Evas_Object *obj, const char *item_name, double angle);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the angle in degree of a given item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @return The angle of circle
- *
- * @see eext_circle_object_item_angle_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI double eext_circle_object_item_angle_get(const Evas_Object *obj, const char *item_name);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the angle offset of a given item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @param[in] angle_offset The angle offset value of the circle object
- *
- * @see eext_circle_object_item_angle_offset_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_item_angle_offset_set(Evas_Object *obj, const char *item_name, double angle_offset);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the angle offset of a given item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @return The angle offset of the circle object
- *
- * @see eext_circle_object_item_angle_offset_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI double eext_circle_object_item_angle_offset_get(const Evas_Object *obj, const char *item_name);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the minimum and maximum angle for the item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @param[in] min_angle The minimum angle in degree
- * @param[in] max_angle The maximum angle in degree
- *
- * @see eext_circle_object_item_angle_min_max_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_item_angle_min_max_set(Evas_Object *obj, const char *item_name, double min_angle, double max_angle);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the minimum and maximum angle of a given item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @param[out] min_angle The pointer to store the minimum angle in degree
- * @param[out] max_angle The pointer to store the minimum angle in degree
- *
- * @see eext_circle_object_item_angle_min_max_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_item_angle_min_max_get(const Evas_Object *obj, const char *item_name, double *min_angle, double *max_angle);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the minimum and maximum value for the item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @param[in] min_value The minimum value
- * @param[in] max_value The maximum value
- *
- * @see eext_circle_object_item_value_min_max_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_item_value_min_max_set(Evas_Object *obj, const char *item_name, double min_value, double max_value);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the minimum and maximum value of a given item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @param[out] min_value The pointer to store the minimum value
- * @param[out] max_value The pointer to store the minimum value
- *
- * @see eext_circle_object_item_value_min_max_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_item_value_min_max_get(const Evas_Object *obj, const char *item_name, double *min_value, double *max_value);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the value of a given item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @param[in] value The value of circle object
- *
- * @see eext_circle_object_item_value_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_item_value_set(Evas_Object *obj, const char *item_name, double value);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the value of a given item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @return The value of circle
- *
- * @see eext_circle_object_item_value_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI double eext_circle_object_item_value_get(const Evas_Object *obj, const char *item_name);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the color of circle line and font in a given item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @param[in] r The red component of the given color
- * @param[in] g The green component of the given color
- * @param[in] b The blue component of the given color
- * @param[in] a The alpha component of the given color
- *
- * @see eext_circle_object_item_color_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_item_color_set(Evas_Object *obj, const char *item_name, int r, int g, int b, int a);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get color of circle line and font color in a given item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @param[out]   r    The pointer to an integer in which to store the red component
- *               of the color
- * @param[out]   g    The pointer to an integer in which to store the green
- *               component of the color
- * @param[out]   b    The pointer to an integer in which to store the blue component
- *               of the color
- * @param[out]   a    The pointer to an integer in which to store the alpha
- *               component of the color
- *
- * @see eext_circle_object_item_color_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_item_color_get(const Evas_Object *obj, const char *item_name, int *r, int *g, int *b, int *a);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set circle radius of a given item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @param[in] radius The radius value of a given circle object
- *
- * @see eext_circle_object_item_radius_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_item_radius_set(Evas_Object *obj, const char *item_name, double radius);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get circle radius of a given item of circle object.
- *
- * @param[in] obj The circle object
- * @param[in] item_name The item name of circle object
- * @return The radius of the circle object if it succeeds to find the item,
- *         otherwise -1.0 if it fails to find the item.
- *
- * @see eext_circle_object_item_radius_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI double eext_circle_object_item_radius_get(const Evas_Object *obj, const char *item_name);
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_CIRCLE_H__ */
diff --git a/wearable/src/include/circle/efl_extension_circle_object_datetime.h b/wearable/src/include/circle/efl_extension_circle_object_datetime.h
deleted file mode 100644 (file)
index 20ecbf5..0000000
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __EFL_EXTENSION_CIRCLE_OBJECT_DATETIME_H__
-#define __EFL_EXTENSION_CIRCLE_OBJECT_DATETIME_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup CAPI_EFL_EXTENSION_CIRCLE_DATETIME_MODULE Efl Extension Circle Datetime
- * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
- * @brief Circle datetime is based on elm_datetime and is operated by rotary event.
- *
- * @details Circle datetime is to utilize selected field in elm_datetime.
- *          If rotary event is activated by eext_rotary_object_event_activated_set(),
- *          circle datetime increases/decreases value of selected field in elm_datetime
- *          by the clockwise/counter clockwise rotary event.
- *
- *          The available circle object items are as follows:
- *          @li @c "default": Default circle item. It draws a marker.
- *
- * @{
- */
-
-/**
- * @WEARABLE_ONLY
- * @brief Add a new circle datetime object.
- *
- * @param[in] datetime The datetime object
- * @param[in] surface The @ref Eext_Circle_Surface object to render the circle object.
- *                    If @c NULL, circle object will be rendered independently.
- * @return A new circle object handle, otherwise @c NULL if it cannot be created
- *
- * @see @ref CAPI_EFL_EXTENSION_CIRCLE_OBJECT_MODULE
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Evas_Object *eext_circle_object_datetime_add(Evas_Object *datetime, Eext_Circle_Surface *surface);
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_CIRCLE_OBJECT_DATETIME_H__ */
diff --git a/wearable/src/include/circle/efl_extension_circle_object_genlist.h b/wearable/src/include/circle/efl_extension_circle_object_genlist.h
deleted file mode 100644 (file)
index 795d056..0000000
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __EFL_EXTENSION_CIRCLE_OBJECT_GENLIST_H__
-#define __EFL_EXTENSION_CIRCLE_OBJECT_GENLIST_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup CAPI_EFL_EXTENSION_CIRCLE_GENLIST_MODULE Efl Extension Circle Genlist
- * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
- * @brief Circle genlist is based on elm_genlist and is scrolled by rotary event.
- *
- * @details Circle genlist is to visualize and utilize scroll effect for elm_genlist.
- *          While elm_genlist provides scrollbar with straight horizontal/vertical
- *          movement, circle genlist provides scrollbar with circular movement.
- *          Rotary event can be activated by eext_rotary_object_event_activated_set(),
- *          circle genlist scrolls genlist items upward/leftward responding to
- *          counter clockwise rotary event, and scrolls downward/rightward responding
- *          to clockwise rotary event.
- *
- *          The available circle object items are as follows:
- *          @li @c "default": Default circle item. It draws vertical scroll bar.
- *          @li @c "vertical,scroll,bg": Vertical scroll background circle item.
- *
- * @{
- */
-
-/**
- * @WEARABLE_ONLY
- * @brief Add a new circle genlist object.
- *
- * @param[in] genlist The genlist object
- * @param[in] surface The @ref Eext_Circle_Surface object to render the circle object.
- *                    If @c NULL, circle object will be rendered independently.
- * @return A new circle object handle, otherwise @c NULL if it cannot be created
- *
- * @see @ref CAPI_EFL_EXTENSION_CIRCLE_OBJECT_MODULE
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Evas_Object *eext_circle_object_genlist_add(Evas_Object *genlist, Eext_Circle_Surface *surface);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the scrollbar visibility policy.
- *
- * @details This sets the scrollbar visibility policy for a given scroller.
- *          @c ELM_SCROLLER_POLICY_AUTO means the scrollbar is made visible if it is
- *          needed, and otherwise kept hidden. @c ELM_SCROLLER_POLICY_ON turns it on all
- *          the time, and @c ELM_SCROLLER_POLICY_OFF always keeps it off. This applies
- *          respectively for the vertical scrollbars.
- *
- * @param[in] obj The circle genlist object
- * @param[in] policy_h The horizontal scrollbar policy
- * @param[in] policy_v The vertical scrollbar policy
- *
- * @see eext_circle_object_genlist_scroller_policy_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_genlist_scroller_policy_set(Evas_Object *obj, Elm_Scroller_Policy policy_h, Elm_Scroller_Policy policy_v);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the scrollbar visibility policy.
- *
- * @param[in] obj The circle genlist object
- * @param[out] policy_h The horizontal scrollbar policy
- * @param[out] policy_v The vertical scrollbar policy
- *
- * @see eext_circle_object_genlist_scroller_policy_set();
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_genlist_scroller_policy_get(const Evas_Object *obj, Elm_Scroller_Policy *policy_h, Elm_Scroller_Policy *policy_v);
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_CIRCLE_OBJECT_GENLIST_H__ */
diff --git a/wearable/src/include/circle/efl_extension_circle_object_progressbar.h b/wearable/src/include/circle/efl_extension_circle_object_progressbar.h
deleted file mode 100644 (file)
index ee060f5..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __EFL_EXTENSION_CIRCLE_OBJECT_PROGRESSBAR_H__
-#define __EFL_EXTENSION_CIRCLE_OBJECT_PROGRESSBAR_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup CAPI_EFL_EXTENSION_CIRCLE_PROGRESSBAR_MODULE Efl Extension Circle Progressbar
- * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
- * @brief Circle progressbar aims to show the progress status of a given task with circular design.
- *        It visualizes progress status within a range set by eext_circle_object_angle_min_max_set()
- *        as an arc of a circle.
- *
- * @details The available circle object items are as follows:
- *          @li @c "default": Default circle item. It draws progress bar.
- *          @li @c "bg": Progress bar background circle item.
- *
- * @{
- */
-
-/**
- * @WEARABLE_ONLY
- * @brief Add a new circle progressbar to a given surface.
- *
- * @param[in] parent The parent object
- * @param[in] surface The @ref Eext_Circle_Surface object to render the circle object.
- *                    If @c NULL, circle object will be rendered independently.
- * @return A new circle object handle, otherwise @c NULL in case of an error
- *
- * @see @ref CAPI_EFL_EXTENSION_CIRCLE_OBJECT_MODULE
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Evas_Object *eext_circle_object_progressbar_add(Evas_Object *parent, Eext_Circle_Surface *surface);
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_CIRCLE_OBJECT_PROGRESSBAR_H__ */
diff --git a/wearable/src/include/circle/efl_extension_circle_object_scroller.h b/wearable/src/include/circle/efl_extension_circle_object_scroller.h
deleted file mode 100644 (file)
index d151916..0000000
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __EFL_EXTENSION_CIRCLE_OBJECT_SCROLLER_H__
-#define __EFL_EXTENSION_CIRCLE_OBJECT_SCROLLER_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup CAPI_EFL_EXTENSION_CIRCLE_SCROLLER_MODULE Efl Extension Circle Scroller
- * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
- * @brief Circle scroller is based on elm_scroller and is scrolled by rotary event.
- *
- * @details Circle scroller is to visualize and utilize scroll effect for elm_scroller.
- *          While elm_scroller provides scrollbar with straight horizontal/vertical
- *          movement, circle scroller provides scrollbar with circular movement.
- *          Rotary event can be activated by eext_rotary_object_event_activated_set(),
- *          circle scroller scrolls items upward/leftward responding to counter clockwise
- *          rotary event, and scrolls downward/rightward responding to clockwise rotary event.
- *
- *          The available circle object items are as follows:
- *          @li @c "default": Default circle item. It draws vertical scroll bar.
- *          @li @c "vertical,scroll,bg": Vertical scroll background circle item.
- *          @li @c "horizontal,scroll,bar": Horizontal scroll bar circle item.
- *          @li @c "horizontal,scroll,bg": Horizontal scroll background circle item.
- *
- * @{
- */
-
-/**
- * @WEARABLE_ONLY
- * @brief Add a new circle scroller object.
- *
- * @param[in] scroller The scroller object
- * @param[in] surface The @ref Eext_Circle_Surface object to render the circle object.
- *                    If @c NULL, circle object will be rendered independently.
- * @return A new circle object handle, otherwise @c NULL if it cannot be created
- *
- * @see @ref CAPI_EFL_EXTENSION_CIRCLE_OBJECT_MODULE
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Evas_Object *eext_circle_object_scroller_add(Evas_Object *scroller, Eext_Circle_Surface *surface);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the scrollbar visibility policy.
- *
- * @details This sets the scrollbar visibility policy of a given scroller.
- *          @c ELM_SCROLLER_POLICY_AUTO indicates the scrollbar is made visible
- *          if it is needed, and otherwise is kept hidden. @c ELM_SCROLLER_POLICY_ON
- *          turns the scrollbar on all the time, and @c ELM_SCROLLER_POLICY_OFF
- *          turns it off. This applies to the horizontal and vertical scrollbars
- *          respectively.
- *
- * @param[in] obj The circle scroller object
- * @param[in] policy_h The horizontal scrollbar policy
- * @param[in] policy_v The vertical scrollbar policy
- *
- * @see eext_circle_object_scroller_policy_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_scroller_policy_set(Evas_Object *obj,
-                                                 Elm_Scroller_Policy policy_h,
-                                                 Elm_Scroller_Policy policy_v);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the scrollbar visibility policy.
- *
- * @param[in] obj The circle scroller object
- * @param[out] policy_h The horizontal scrollbar policy
- * @param[out] policy_v The vertical scrollbar policy
- *
- * @see eext_circle_object_scroller_policy_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_scroller_policy_get(const Evas_Object *obj,
-                                                 Elm_Scroller_Policy *policy_h,
-                                                 Elm_Scroller_Policy *policy_v);
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_CIRCLE_OBJECT_SCROLLER_H__ */
diff --git a/wearable/src/include/circle/efl_extension_circle_object_slider.h b/wearable/src/include/circle/efl_extension_circle_object_slider.h
deleted file mode 100644 (file)
index ab2b248..0000000
+++ /dev/null
@@ -1,103 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __EFL_EXTENSION_CIRCLE_OBJECT_SLIDER_H__
-#define __EFL_EXTENSION_CIRCLE_OBJECT_SLIDER_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup CAPI_EFL_EXTENSION_CIRCLE_SLIDER_MODULE Efl Extension Circle Slider
- * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
- * @brief Circle slider is circular designed widget to select a value in a range
- *        by rotary event.
- *
- * @details Circle slider visualizes and utilizess slider as an arc of a circle.
- *          Length of an arc indicates a value in a range set by
- *          eext_circle_object_angle_min_max_set(). If rotary event is activated
- *          by eext_rotary_object_event_activated_set(), Circle slider increases
- *          its value by step value from eext_circle_object_slider_step_set()
- *          when clockwise rotary event is received, vice versa.
- *
- *          This widget emits the following signals:
- *          @li "value,changed": Whenever the slider value is changed by the user.
- *
- *          The available circle object items are as follows:
- *          @li @c "default": Default circle item. It draws slider bar.
- *          @li @c "bg": Background circle item.
- *
- * @{
- */
-
-/**
- * @WEARABLE_ONLY
- * @brief Add a new circle slider object.
- *
- * @param[in] parent The parent object
- * @param[in] surface The @ref Eext_Circle_Surface object to render the circle object.
- *                    If @c NULL, circle object will be rendered independently.
- * @return A new circle object handle, otherwise @c NULL in case of an error
- *
- * @see @ref CAPI_EFL_EXTENSION_CIRCLE_OBJECT_MODULE
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Evas_Object *eext_circle_object_slider_add(Evas_Object *parent, Eext_Circle_Surface *surface);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the step value of the circle slider object.
- *
- * @details This value is used when circle slider object's value is changed
- *          by an event. The value of eext_circle_object_slider is increased/decreased
- *          by the step value.
- *
- * @param[in] obj The circle slider object
- * @param[in] step The step value of the eext_circle_slider object
- *
- * @see eext_circle_object_slider_step_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_object_slider_step_set(Evas_Object *obj, double step);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the step value of the circle slider object.
- *
- * @param[in] obj The circle slider object
- * @return The step value of the circle slider object
- *
- * @see eext_circle_object_slider_step_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI double eext_circle_object_slider_step_get(const Evas_Object *obj);
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_CIRCLE_OBJECT_SLIDER_H__ */
diff --git a/wearable/src/include/circle/efl_extension_circle_object_spinner.h b/wearable/src/include/circle/efl_extension_circle_object_spinner.h
deleted file mode 100644 (file)
index db70496..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __EFL_EXTENSION_CIRCLE_OBJECT_SPINNER_H__
-#define __EFL_EXTENSION_CIRCLE_OBJECT_SPINNER_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup CAPI_EFL_EXTENSION_CIRCLE_SPINNER_MODULE Efl Extension Circle Spinner
- * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
- * @brief Circle spinner is based on elm_spinner and is operated by rotary event.
- *
- * @details Circle spinner is to display and handle spinner value by rotary event.
- *          If rotary event is activated by eext_rotary_object_event_activated_set(),
- *          circle spinner increases/decreases value of elm_spinner
- *          by the clockwise/counter clockwise rotary event.
- *
- *          The available circle object items are as follows:
- *          @li @c "default": Default circle item. It draws a marker.
- *
- * @{
- */
-
-/**
- * @WEARABLE_ONLY
- * @brief Add a new circle spinner object.
- *
- * @param[in] spinner The spinner object
- * @param[in] surface The @ref Eext_Circle_Surface object to render the circle object.
- *                    If @c NULL, circle object will be rendered independently.
- * @return A new circle object handle, otherwise @c NULL if it cannot be created
- *
- * @see @ref CAPI_EFL_EXTENSION_CIRCLE_OBJECT_MODULE
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Evas_Object *eext_circle_object_spinner_add(Evas_Object *spinner, Eext_Circle_Surface *surface);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the circle spinner angle per each spinner value.
- *
- * @details This is not set a circle spinner picker angle offset.
- *          It's set the angle per each spinner value.
- *          default angle per each spinner value is calculated below formula.
- *          (360/ max - min) * step
- *
- * @param[in] obj The circle spinner object
- * @param[in] angle The angle value per each spinner value.
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-
-EAPI void eext_circle_object_spinner_angle_set(Evas_Object *obj, double angle);
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_CIRCLE_OBJECT_SPINNER_H__ */
diff --git a/wearable/src/include/circle/efl_extension_circle_private.h b/wearable/src/include/circle/efl_extension_circle_private.h
deleted file mode 100644 (file)
index 168e06d..0000000
+++ /dev/null
@@ -1,369 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __EFL_EXTENSION_CIRCLE_PRIVATE_H__
-#define __EFL_EXTENSION_CIRCLE_PRIVATE_H__
-
-#include <cairo.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
-#define EEXT_CIRCLE_OBJECT_TYPE "Eext_Circle_Object"
-
-#define EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) \
-     Eext_Circle_Object *circle_obj = NULL; \
-     circle_obj = evas_object_data_get(obj, EEXT_CIRCLE_OBJECT_TYPE); \
-     if (!circle_obj)
-/**
- * Put Document
- */
-typedef struct _Eext_Circle_Object Eext_Circle_Object;
-
-typedef enum
-{
-   EEXT_CIRCLE_SURFACE_TYPE_DEFAULT,
-   EEXT_CIRCLE_SURFACE_TYPE_PRIVATE,
-   EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME,
-   EEXT_CIRCLE_SURFACE_TYPE_LAST
-} Eext_Circle_Surface_Type;
-
-struct _Eext_Circle_Surface {
-   Evas_Object         *parent;
-   Evas_Object         *image_widget;
-   cairo_surface_t     *cairo_surface;
-   cairo_t             *cairo;
-   unsigned char       *buffer;
-   Evas_Coord           w, h;
-   Evas_Coord           center_x, center_y;
-   Eext_Circle_Surface_Type type;
-
-   Eina_List           *render_objs;
-
-   Ecore_Job           *render_job;
-
-   Eext_Circle_Surface *parent_surface;
-   Eina_List           *sub_surfaces;
-   Eext_Circle_Object  *deactivated_obj;
-};
-
-typedef struct _Eext_Circle_Color Eext_Circle_Color;
-struct _Eext_Circle_Color {
-   int r, g, b, a;
-};
-
-struct _Eext_Circle_Object {
-   Evas_Object          *image_widget;
-   Evas_Object          *widget_object;
-   void                 *widget_data;
-   const char           *widget_type;
-
-   Eina_List           *bg_image_objs;
-   int                  bg_image_index;
-
-   Eext_Circle_Surface  *surface;
-   Eina_List            *items;
-   Eina_List            *text_items;
-
-   // del_func: Do only for widget_data.
-   // Other things are handled by Eext_Circle_Object.
-   void                (*del_func)(Eext_Circle_Object *obj);
-   // disabled_func: When disabled state is changed, it will be called.
-   void                (*disabled_func)(Eext_Circle_Object *obj);
-   // color_changed_func: When color of an item is changed, it will be called.
-   void                (*color_changed_func)(Eext_Circle_Object *obj, const char *item_name);
-
-   Eina_Bool             visible : 1;
-   Eina_Bool             disabled : 1;
-   Eina_Bool             visible_on_activate: 1;
-   Eina_Bool             is_active: 1;
-};
-
-typedef struct _Eext_Circle_Object_Item Eext_Circle_Object_Item;
-struct _Eext_Circle_Object_Item {
-   Eext_Circle_Object *obj;
-   const char *name;
-   void *data;
-
-   // For text draw
-   const char *text;
-   const char *font;
-   const char *selected_font;
-   int font_size;
-
-   double radius;
-   int line_width;
-
-   int center_x;
-   int center_y;
-
-   double min_angle;
-   double max_angle;
-
-   double value;
-   double min_value;
-   double max_value;
-
-   double angle;
-   double angle_offset;
-
-   Eext_Circle_Color color;
-
-   struct {
-      double angle;
-      double angle_offset;
-      Eext_Circle_Color color;
-   } draw;
-
-   struct {
-      Ecore_Animator *animator_cb;
-      double          duration;
-      double          start_time;
-      double          current_animator_pos;
-      Eext_Circle_Color from_color;
-      double          cubic_bezier_v[4];
-      Eina_Bool       cubic_bezier_enabled : 1;
-   } color_transit;
-
-   struct {
-      Ecore_Animator *animator_cb;
-      double          duration;
-      double          start_time;
-      double          current_animator_pos;
-      double          from_angle, from_angle_offset;
-      double          cubic_bezier_v[4];
-      Eina_Bool       cubic_bezier_enabled : 1;
-   } angle_transit;
-
-   Eina_Bool round_cap;
-};
-
-/* Datetime widget data */
-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 rotary_angle;
-   double type_current_angle;
-
-   Eina_Bool circle_changed : 1;
-};
-
-/* Progressbar widget data */
-typedef struct _Eext_Circle_Object_Progressbar_Data Eext_Circle_Object_Progressbar_Data;
-struct _Eext_Circle_Object_Progressbar_Data {
-   Eext_Circle_Color color;
-   Eext_Circle_Color bg_color;
-   Eext_Circle_Color disabled_color;
-   Eext_Circle_Color disabled_bg_color;
-};
-
-/* Slider widget data */
-typedef struct _Eext_Circle_Object_Slider_Data Eext_Circle_Object_Slider_Data;
-struct _Eext_Circle_Object_Slider_Data {
-   double value_step;
-
-   Eext_Circle_Color color;
-   Eext_Circle_Color bg_color;
-   Eext_Circle_Color disabled_color;
-   Eext_Circle_Color disabled_bg_color;
-};
-
-/* Genlist widget data */
-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;
-
-   Eext_Circle_Color color;
-   Eext_Circle_Color bg_color;
-   Eext_Circle_Color disabled_color;
-   Eext_Circle_Color disabled_bg_color;
-
-   Eina_Bool realized_callback_added : 1;
-};
-
-/* Scroller widget data */
-typedef struct _Eext_Circle_Object_Scroller_Data Eext_Circle_Object_Scroller_Data;
-struct _Eext_Circle_Object_Scroller_Data {
-   Ecore_Timer *bar_hide_timer;
-   Elm_Scroller_Policy policy_v, policy_h;
-
-   Eext_Circle_Color vertical_color;
-   Eext_Circle_Color vertical_bg_color;
-   Eext_Circle_Color horizontal_color;
-   Eext_Circle_Color horizontal_bg_color;
-   Eext_Circle_Color disabled_color;
-   Eext_Circle_Color disabled_bg_color;
-
-   int step_x, step_y;
-   int line_width;
-   double radius;
-};
-
-/* 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;
-     double angle;
-     double to_angle_offset;
-     double end_effect_angle;
-};
-
-///////////////////////////////
-// Internal APIs //////////////
-///////////////////////////////
-
-// Surface
-Eext_Circle_Surface *_eext_circle_surface_init(Evas_Object *image_widget, Evas_Object *parent, Eext_Circle_Surface_Type type);
-
-void _eext_circle_surface_finish(Eext_Circle_Surface *surface);
-
-void _eext_circle_surface_object_remove(Eext_Circle_Surface *surface, Eext_Circle_Object *obj);
-
-void _eext_circle_surface_object_append(Eext_Circle_Surface *surface, Eext_Circle_Object *obj);
-
-void _eext_circle_surface_changed(Eext_Circle_Surface *surface);
-
-Eext_Circle_Surface *_eext_circle_surface_add(Evas_Object *parent, Eext_Circle_Surface_Type type);
-
-void _eext_circle_surface_object_exclusive_show(Eext_Circle_Surface *surface, Eext_Circle_Object *obj);
-
-// Item
-double _eext_circle_object_item_value_angle_get(const Eext_Circle_Object_Item *item, double value);
-
-double _eext_circle_object_item_angle_value_get(const Eext_Circle_Object_Item *item, double angle);
-
-const char *_eext_circle_text_font_get(const char *text, const char *font_family);
-
-void _eext_circle_object_item_name_set(Eext_Circle_Object_Item *item, const char *name);
-
-const char *_eext_circle_object_item_name_get(const Eext_Circle_Object_Item *item);
-
-Eext_Circle_Object_Item *_eext_circle_object_item_new(void);
-
-void _eext_circle_object_item_free(Eext_Circle_Object_Item *item);
-
-void _eext_circle_object_item_prepend(Eext_Circle_Object *obj, Eext_Circle_Object_Item *item);
-
-void _eext_circle_object_item_append(Eext_Circle_Object *obj, Eext_Circle_Object_Item *item);
-
-void _eext_circle_object_item_insert_before(Eext_Circle_Object *obj, Eext_Circle_Object *before, Eext_Circle_Object_Item *item);
-
-void _eext_circle_object_item_insert_after(Eext_Circle_Object *obj, Eext_Circle_Object *after, Eext_Circle_Object_Item *item);
-
-void _eext_circle_object_item_remove(Eext_Circle_Object_Item *item);
-
-void _eext_circle_object_item_line_width_set(Eext_Circle_Object_Item *item, int line_width);
-
-int _eext_circle_object_item_line_width_get(const Eext_Circle_Object_Item *item);
-
-void _eext_circle_object_item_angle_set(Eext_Circle_Object_Item *item, double angle);
-
-double _eext_circle_object_item_angle_get(const Eext_Circle_Object_Item *item);
-
-void _eext_circle_object_item_angle_offset_set(Eext_Circle_Object_Item *item, double angle_offset);
-
-double _eext_circle_object_item_angle_offset_get(const Eext_Circle_Object_Item *item);
-
-void _eext_circle_object_item_angle_min_max_set(Eext_Circle_Object_Item *item,
-                                                double min_angle, double max_angle);
-
-void _eext_circle_object_item_angle_min_max_get(const Eext_Circle_Object_Item *item,
-                                                double *min_angle, double *max_angle);
-
-void _eext_circle_object_item_value_min_max_set(Eext_Circle_Object_Item *item,
-                                                double min_value, double max_value);
-
-void _eext_circle_object_item_value_min_max_get(const Eext_Circle_Object_Item *item,
-                                                double *min_value, double *max_value);
-
-void _eext_circle_object_item_value_set(Eext_Circle_Object_Item *item, double value);
-
-double _eext_circle_object_item_value_get(const Eext_Circle_Object_Item *item);
-
-void _eext_circle_object_item_color_set(Eext_Circle_Object_Item *item,
-                                        int r, int g, int b, int a);
-
-void _eext_circle_object_item_color_get(const Eext_Circle_Object_Item *item,
-                                        int *r, int *g, int *b, int *a);
-
-void _eext_circle_object_item_radius_set(Eext_Circle_Object_Item *item, double radius);
-
-double _eext_circle_object_item_radius_get(const Eext_Circle_Object_Item *item);
-
-void _eext_circle_object_item_text_set(Eext_Circle_Object_Item *item,
-                                       const char *text,
-                                       const char *font);
-
-void _eext_circle_object_item_text_get(const Eext_Circle_Object_Item *item,
-                                       const char **text,
-                                       const char **font);
-
-void _eext_circle_object_item_font_size_set(Eext_Circle_Object_Item *item,
-                                            int font_size);
-
-int _eext_circle_object_item_font_size_get(const Eext_Circle_Object_Item *item);
-
-void _eext_circle_object_item_color_transit_set(Eext_Circle_Object_Item *item, double duration,
-                                                int to_r, int to_g, int to_b, int to_a,
-                                                Eina_Bool cubic_bezier_enabled,
-                                                double cubic_bezier_p1_x, double cubic_bezier_p1_y,
-                                                double cubic_bezier_p2_x, double cubic_bezier_p2_y
-                                               );
-
-void _eext_circle_object_item_angle_transit_set(Eext_Circle_Object_Item *item, double duration,
-                                                double to_angle, double to_angle_offset,
-                                                Eina_Bool cubic_bezier_enabled,
-                                                double cubic_bezier_p1_x, double cubic_bezier_p1_y,
-                                                double cubic_bezier_p2_x, double cubic_bezier_p2_y);
-
-void _eext_circle_object_item_value_transit_set(Eext_Circle_Object_Item *item, double duration,
-                                                double to_value,
-                                                Eina_Bool cubic_bezier_enabled,
-                                                double cubic_bezier_p1_x, double cubic_bezier_p1_y,
-                                                double cubic_bezier_p2_x, double cubic_bezier_p2_y);
-
-void _eext_circle_object_item_round_cap_enable_set(Eext_Circle_Object_Item *item, Eina_Bool round_cap);
-
-Eina_Bool _eext_circle_object_item_round_cap_enable_get(const Eext_Circle_Object_Item *item);
-
-// Circle Common Private
-void _eext_circle_object_init(Evas_Object *obj, Evas_Object *widget_object, Eext_Circle_Surface *surface);
-
-void _eext_circle_object_finish(Evas_Object *obj, Eext_Circle_Object *circle_obj);
-
-void _eext_circle_object_changed(Eext_Circle_Object *obj);
-
-Eext_Circle_Object_Item *_eext_circle_object_item_get(const Eext_Circle_Object *obj, const char *name);
-
-void _eext_circle_object_hide(Eext_Circle_Object *obj);
-
-void _eext_circle_object_show(Eext_Circle_Object *obj);
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /* __EFL_EXTENSION_CIRCLE_PRIVATE_H__ */
diff --git a/wearable/src/include/circle/efl_extension_circle_surface.h b/wearable/src/include/circle/efl_extension_circle_surface.h
deleted file mode 100644 (file)
index c50d954..0000000
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __EFL_EXTENSION_CIRCLE_SURFACE_H__
-#define __EFL_EXTENSION_CIRCLE_SURFACE_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE Efl Extension Circle UI
- * @ingroup CAPI_EFL_EXTENSION_MODULE
- * @brief This module provides circular ui-controls which are for the devices with circular display.
- */
-
-/**
- * @defgroup CAPI_EFL_EXTENSION_CIRCLE_SURFACE_MODULE Efl Extension Circle Surface
- * @ingroup CAPI_EFL_EXTENSION_CIRCLE_UI_MODULE
- * @brief Surface aims to show one of its connected circle objects.
- *
- * @details The circle surface manages connected circle objects.
- *          When a circle object is chosen to be shown,
- *          the surface shows the circle object and hides the others.
- *          A circle object can be shown and received the rotary event on the surface by
- *          @ref eext_rotary_object_event_activated_set() or @ref evas_object_show().
- *
- *          The circle surface can be created by @ref eext_circle_surface_conformant_add()
- *          and @ref eext_circle_surface_layout_add().
- * @{
- */
-
-/**
- * @WEARABLE_ONLY
- * @typedef Eext_Circle_Surface
- * @brief The structure of circle surface to render a connected circle object.
- *
- * @details The circle surface manages and shows a connected circle object.
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-typedef struct _Eext_Circle_Surface Eext_Circle_Surface;
-
-/**
- * @WEARABLE_ONLY
- * @brief Add a new circle surface to the given comformant.
- *
- * @details The circle surface needs the conformant to be seen in upper layer.
- *
- * @remarks The confom parameter is a conformant object pointer
- *          which is created by @ref elm_conformant_add()
- *          and the conformant's style should not be changed
- *          because in eext_circle_surface_conformant_add()
- *          it will be changed to circle style for circle surface.
- *
- * @param[in] conform The conformant
- * @return An @ref Eext_Circle_Surface handle, otherwise @c NULL in case of an error
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Circle_Surface *eext_circle_surface_conformant_add(Evas_Object *conform);
-
-/**
- * @WEARABLE_ONLY
- * @brief Add a new circle surface to the given layout.
- *
- * @details The circle surface needs the layout to be set to the given layout.
- *
- * @remarks The layout parameter is a layout object pointer which is created by @ref elm_layout_add()
- *          and the style of it should not change because in @ref eext_circle_surface_layout_add()
- *          it will be changed to circle style for circle surface.
- *
- * @param[in] layout The layout
- * @return An @ref Eext_Circle_Surface handle, otherwise @c NULL in case of an error
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Circle_Surface *eext_circle_surface_layout_add(Evas_Object *layout);
-
-/**
- * @WEARABLE_ONLY
- * @brief Add a new circle surface to the given naviframe.
- *
- * @details The circle surface needs the naviframe to be set to the pushed naviframe items.
- *
- * @remarks The naviframe parameter is a naviframe object pointer
- *          which is created by @ref elm_naviframe_add()
- *
- * @param[in] naviframe The naviframe
- * @return An @ref Eext_Circle_Surface handle, otherwise @c NULL in case of an error
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Circle_Surface *eext_circle_surface_naviframe_add(Evas_Object *naviframe);
-
-/**
- * @WEARABLE_ONLY
- * @brief Delete the given circle surface.
- *
- * @param[in] surface The @ref Eext_Circle_Surface
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_circle_surface_del(Eext_Circle_Surface *surface);
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_CIRCLE_H__ */
diff --git a/wearable/src/include/circle/efl_extension_rotary.h b/wearable/src/include/circle/efl_extension_rotary.h
deleted file mode 100644 (file)
index f3a98ba..0000000
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __EFL_EXTENSION_ROTARY_H__
-#define __EFL_EXTENSION_ROTARY_H__
-
-#include "Evas.h"
-
-#ifdef EAPI
-# undef EAPI
-#endif
-
-#ifdef _WIN32
-# ifdef EFL_EXTENSION_BUILD
-#  ifdef DLL_EXPORT
-#   define EAPI __declspec(dllexport)
-#  else
-#   define EAPI
-#  endif /* ! DLL_EXPORT */
-# else
-#  define EAPI __declspec(dllimport)
-# endif /* ! EFL_EXTENSION_BUILD */
-#else
-# ifdef __GNUC__
-#  if __GNUC__ >= 4
-#   define EAPI __attribute__ ((visibility("default")))
-#  else
-#   define EAPI
-#  endif
-# else
-#  define EAPI
-# endif
-#endif /* ! _WIN32 */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup CAPI_EFL_EXTENSION_ROTARY_EVENT_MODULE Efl Extension Rotary Event
- * @ingroup CAPI_EFL_EXTENSION_MODULE
- * @brief This module provides functionalities to handle rotary events.
- *
- * @details This rotary object emits the following signals.
- *
- *          @li "rotary,activated": A circle object is activated.
- *          @li "rotary,deactivated": A circle object is deactivated.
- *
- * @{
- *
- */
-
-/**
- * @WEARABLE_ONLY
- * @brief Enumeration of rotary direction
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-typedef enum _Eext_Rotary_Event_Direction
-{
-   EEXT_ROTARY_DIRECTION_CLOCKWISE, /**< Rotary is rotated clockwise direction */
-   EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE /**< Rotary is rotated counter clockwise direction */
-} Eext_Rotary_Event_Direction;
-
-/**
- * @WEARABLE_ONLY
- * @brief Rotary event information structure
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-typedef struct _Eext_Rotary_Event_Info
-{
-   Eext_Rotary_Event_Direction direction; /**< Direction of rotary event */
-   unsigned int                time_stamp; /**< Timestamp of rotary event */
-} Eext_Rotary_Event_Info;
-
-/**
- * @WEARABLE_ONLY
- * @brief Rotary object event callback function signature
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-typedef Eina_Bool (*Eext_Rotary_Event_Cb)(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info);
-
-/**
- * @WEARABLE_ONLY
- * @brief Rotary event handler function signature
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-typedef Eina_Bool (*Eext_Rotary_Handler_Cb)(void *data, Eext_Rotary_Event_Info *info);
-
-/**
- * @WEARABLE_ONLY
- * @def EEXT_CALLBACK_PRIORITY_BEFORE
- * Slightly more prioritized than default.
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-#define EEXT_CALLBACK_PRIORITY_BEFORE  -100
-
-/**
- * @WEARABLE_ONLY
- * @def EEXT_CALLBACK_PRIORITY_DEFAULT
- * Default callback priority level
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-#define EEXT_CALLBACK_PRIORITY_DEFAULT 0
-
-/**
- * @WEARABLE_ONLY
- * @def EEXT_CALLBACK_PRIORITY_AFTER
- * Slightly less prioritized than default.
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-#define EEXT_CALLBACK_PRIORITY_AFTER   100
-
-/**
- * @WEARABLE_ONLY
- * @typedef Eext_Callback_Priority
- *
- * Callback priority value. Range is -32k - 32k. The lower the number, the
- * higher the priority.
- *
- * @see EEXT_CALLBACK_PRIORITY_AFTER
- * @see EEXT_CALLBACK_PRIORITY_BEFORE
- * @see EEXT_CALLBACK_PRIORITY_DEFAULT
- *
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-typedef short Eext_Callback_Priority;
-
-/**
- * @WEARABLE_ONLY
- * @brief Add (register) a rotary event callback for evas object @a obj.
- *
- * @details This function adds a callback function to object with default
- * priority level, so that when rotary event happens,
- * the callback can be called for that object.
- * A callback function must have the ::Eext_Rotary_Event_Cb prototype
- * definition.
- * @note Be carefull not to add the same callback multiple times, if
- * that is not what you want, because Eext won't check if a callback
- * existed before exactly as the one being registered (and thus, call
- * it more than once on the event, in this case).
- *
- * @param[in] obj The object that will receive rotary event.
- * @param[in] func Callback function.
- * @param[in] data User data to pass to callback function @a func.
- *
- * @return @c EINA_TRUE if the callback is successfully registered.
- *         @c EINA_FALSE otherwise.
- *
- * @see eext_rotary_object_event_callback_priority_add
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eina_Bool eext_rotary_object_event_callback_add(Evas_Object *obj, Eext_Rotary_Event_Cb func, void *data);
-
-/**
- * @WEARABLE_ONLY
- * @brief Add (register) a rotary event callback for evas object @a obj
- * with priority @a priority.
- *
- * @details This function adds a callback function to object with
- * priority level @a priority, so that when rotary event happens,
- * the callback can be called for that object. Except for the priority field,
- * it is exactly the same as @ref eext_rotary_object_event_callback_add.
- *
- * @param[in] obj The object that will receive rotary event.
- * @param[in] priority The priority of the callback, lower values called first.
- * @param[in] func Callback function.
- * @param[in] data User data to pass to callback function @a func.
- *
- * @return @c EINA_TRUE if the callback is successfully registered.
- *         @c EINA_FALSE otherwise.
- *
- * @see eext_rotary_object_event_callback_add
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eina_Bool eext_rotary_object_event_callback_priority_add(Evas_Object *obj, Eext_Callback_Priority priority, Eext_Rotary_Event_Cb func, void *data);
-
-/**
- * @WEARABLE_ONLY
- * @brief Remove registered rotary event callback from evas object @a obj.
- *
- * @param[in] obj The object from which the callback function is removed.
- * @param[in] func Callback function.
- *
- * @return The data which is passed when registers callback function.
- *
- * @see eext_rotary_object_event_callback_add.
- * @see eext_rotary_object_event_callback_priority_add.
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void *eext_rotary_object_event_callback_del(Evas_Object *obj, Eext_Rotary_Event_Cb func);
-
-/**
- * @WEARABLE_ONLY
- * @brief Add (register) a handler for rotary event.
- *
- * @details This function adds a handler function for the rotary event,
- * so that when rotary event happens, the handler can be called.
- * A handler function must have the ::Eext_Rotary_Handler_Cb prototype
- * definition.
- * @note Be carefull not to add the same handler multiple times, if
- * that is not what you want, because Eext won't check if a handler
- * existed before exactly as the one being registered (and thus, call
- * it more than once on the event, in this case).
- *
- * @param[in] func Handler function.
- * @param[in] data User data to pass to handler function @a func.
- *
- * @return @c EINA_TRUE if the handler is successfully registered.
- *         @c EINA_FALSE otherwise.
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eina_Bool eext_rotary_event_handler_add(Eext_Rotary_Handler_Cb func, void *data);
-
-/**
- * @WEARABLE_ONLY
- * @brief Remove registered rotary event handler.
- *
- * @param[in] func Handler function.
- *
- * @return The data which is passed when registers callback function.
- *
- * @see eext_rotary_event_handler_add.
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void *eext_rotary_event_handler_del(Eext_Rotary_Handler_Cb func);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set an object @a obj as activated object.
- *
- * @details This function sets object as an activated object.
- * The activated object and its parent are only objects to receive rotary event.
- * Only one object is registered as activated object. If the new object is
- * registered as activated object, the previous activated object will be
- * de-activated. Set EINA_FALSE to activated parameter will set current activated
- * object as non-activated object also.
- * A signal named "rotary,activated" is emitted to the object when it is set as
- * activated object and similar for "rotary,deactivated" signal.
- * To receive the rotary event, the object must be visible and a callback function
- * must be registered to the object with
- * @ref eext_rotary_object_event_callback_add or
- * @ref eext_rotary_object_event_callback_priority_add.
- *
- * @param[in] obj The object to set as activated object.
- * @param[in] activated Set EINA_TRUE to activate or EINA_FALSE to de-activate object.
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_rotary_object_event_activated_set(Evas_Object *obj, Eina_Bool activated);
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // __EFL_EXTENSION_ROTARY_H__
diff --git a/wearable/src/include/common/efl_extension_common.h b/wearable/src/include/common/efl_extension_common.h
deleted file mode 100644 (file)
index 816c824..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __EFL_EXTENSION_COMMON_H__
-#define __EFL_EXTENSION_COMMON_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup CAPI_EFL_EXTENSION_COMMON_UI_MODULE Efl Extension Common UI
- * @ingroup CAPI_EFL_EXTENSION_MODULE
- * @brief This module provides common ui-controls which are compatible for various devices.
- * @{
- */
-
-/**
- * @WEARABLE_ONLY
- * @typedef Eext_Object_Item
- * @brief An efl-extension object item handle.
-
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-typedef struct _Eext_Object_Item Eext_Object_Item;
-
-#define EEXT_OBJECT_ITEM       Eext_Object_Item base
-
-struct _Eext_Object_Item {
-   Evas_Object *obj;
-   void *data;
-};
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_COMMON_H__ */
diff --git a/wearable/src/include/common/efl_extension_common_private.h b/wearable/src/include/common/efl_extension_common_private.h
deleted file mode 100644 (file)
index 8c221df..0000000
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __EFL_EXTENSION_COMMON_PRIVATE_H__
-#define __EFL_EXTENSION_COMMON_PRIVATE_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef struct _Eext_Index_Layout_Item Eext_Index_Layout_Item;
-struct _Eext_Index_Layout_Item {
-   EEXT_OBJECT_ITEM;
-   Eext_Circle_Object_Item *item;
-
-   const char *letter;
-   int priority;
-   Eina_Bool selected;
-
-   Evas_Smart_Cb func;
-};
-
-/* Index Layout data */
-typedef struct _Eext_Index_Layout_Data Eext_Index_Layout_Data;
-struct _Eext_Index_Layout_Data {
-   Evas_Object *main_ly;
-   Evas_Object *panel;
-   Evas_Object *index;
-   Evas_Object *cue;
-   Ecore_Timer *hide_timer;
-
-   int max_index;
-   int max_item;
-   int highlighted_index;
-   int index_priority;
-   int *item_index;
-   int default_item_count;
-
-   Eina_List *current_list;
-   Eina_List *item_list;
-   Eina_List *omit_list;
-
-   Eina_Bool panel_hide;
-   Eina_Bool second_list_exist;
-};
-
-/* Rotary Selector data */
-typedef struct _Eext_Rotary_Selector_Selector_Color Eext_Rotary_Selector_Selector_Color;
-struct _Eext_Rotary_Selector_Selector_Color {
-   int r;
-   int g;
-   int b;
-   int a;
-   Eina_Bool set_flag;
-};
-
-typedef struct _Eext_Rotary_Selector_State_Data Eext_Rotary_Selector_State_Data;
-struct _Eext_Rotary_Selector_State_Data {
-   Evas_Object *normal;
-   Evas_Object *pressed;
-};
-
-typedef struct _Eext_Rotary_Selector_Selector_State_Color Eext_Rotary_Selector_Selector_State_Color;
-struct _Eext_Rotary_Selector_Selector_State_Color {
-   Eext_Rotary_Selector_Selector_Color normal_color;
-   Eext_Rotary_Selector_Selector_Color pressed_color;
-   Eext_Rotary_Selector_Selector_Color disabled_color;
-};
-
-//for accessibility
-typedef enum
-{
-   EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_NORMAL = 0,
-   EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_LEFT,
-   EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_RIGHT,
-} Eext_Rotary_Selector_Accessibility_Eventarea_Hightlihgted_State;
-//
-
-typedef struct _Eext_Rotary_Selector_Data Eext_Rotary_Selector_Data;
-struct _Eext_Rotary_Selector_Data {
-   Evas_Object *parent;
-   Evas_Object *rotary_selector;
-   Evas_Object *event_area;
-   Eina_List *item_list;
-   int item_count;
-   int selected_index;
-   int current_page;
-   Eina_Bool animation_direction;
-   Ecore_Animator *previous_page_animator;
-   Ecore_Animator *next_page_animator;
-   double previous_page_animator_start_time;
-   double next_page_animator_start_time;
-   Eina_Bool next_page_animation_started;
-   Eina_Bool previous_page_animation_started;
-   Ecore_Timer *next_page_timer;
-   Eina_Bool end_effect_animation_started;
-   double end_effect_animator_start_time;
-   Ecore_Animator *end_effect_animator;
-   Ecore_Animator *item_update_animator;
-   Eext_Rotary_Selector_Selector_State state;
-   Eext_Rotary_Selector_Selector_State_Color selector_bg_image_color;
-   Eext_Rotary_Selector_State_Data custom_content;
-   Eina_Bool pressed;
-   int pressed_item_index;
-   Eina_Bool touched_item_changed;
-   int radius;
-   Evas_Coord item_width;
-   Evas_Coord item_height;
-   unsigned int rotary_event_time_stamp;
-   Eina_Bool acceleration;
-   //for accessibility
-   Evas_Object *event_area_access_object;
-   Eext_Rotary_Selector_Accessibility_Eventarea_Hightlihgted_State event_area_highlighted_state;
-   Evas_Object *backup_first_item_for_atspi;
-   Evas_Object *backup_last_item_for_atspi;
-   int reading_page_number;
-   Eina_Bool from_moreoption;
-   Eina_Bool control_by_rotary
-   //
-};
-
-typedef struct _Eext_Rotary_Selector_Item_Coords Eext_Rotary_Selector_Item_Coords;
-struct _Eext_Rotary_Selector_Item_Coords {
-   double x;
-   double y;
-};
-
-typedef struct _Eext_Rotary_Selector_Item_Color Eext_Rotary_Selector_Item_Color;
-struct _Eext_Rotary_Selector_Item_Color {
-   int r;
-   int g;
-   int b;
-   int a;
-   Eina_Bool set_flag;
-};
-
-typedef struct _Eext_Rotary_Selector_Item_State_Color Eext_Rotary_Selector_Item_State_Color;
-struct _Eext_Rotary_Selector_Item_State_Color {
-   Eext_Rotary_Selector_Item_Color normal_color;
-   Eext_Rotary_Selector_Item_Color pressed_color;
-   Eext_Rotary_Selector_Item_Color disabled_color;
-};
-
-typedef struct _Eext_Rotary_Selector_Item Eext_Rotary_Selector_Item;
-struct _Eext_Rotary_Selector_Item {
-   EEXT_OBJECT_ITEM;
-   int index;
-   Evas_Object *parent;
-   Evas_Object *rotary_selector;
-   Eext_Rotary_Selector_Item_Coords coords;
-   char *domain;
-   char *text1;
-   char *text2;
-   Eext_Rotary_Selector_Item_State state;
-   Eext_Rotary_Selector_Item_Color color;
-   Eext_Rotary_Selector_State_Data item_bg_image;
-   Eext_Rotary_Selector_State_Data item_icon;
-   Eext_Rotary_Selector_State_Data selector_icon;
-   Eext_Rotary_Selector_State_Data selector_content;
-   Eext_Rotary_Selector_Item_State_Color item_bg_image_color;
-   Eext_Rotary_Selector_Item_State_Color item_icon_color;
-   Eext_Rotary_Selector_Item_State_Color selector_icon_color;
-   Eext_Rotary_Selector_Item_State_Color custom_content_color;
-   Evas_Object *content_icon;
-   Evas_Object *custom_content;
-};
-
-
-/* More Option data */
-typedef struct _Eext_More_Option_Data Eext_More_Option_Data;
-struct _Eext_More_Option_Data {
-   Evas_Object* parent;
-   Evas_Object* more_option;
-   Eina_List *item_list;
-   Evas_Object* panel;
-   Evas_Object* rotary_selector;
-   Eext_More_Option_Direction direction;
-   //for accessibility
-   Evas_Object* cue_access_object;
-   //
-};
-
-//for accessibility(internal API)
-void _rotary_selector_from_moreoption_set(Evas_Object *rotary_selector, Eina_Bool from_more_option);
-//
-
-#ifdef __cplusplus
-}
-#endif
-
-
-#endif /* __EFL_EXTENSION_COMMON_PRIVATE_H__ */
diff --git a/wearable/src/include/common/efl_extension_index_layout.h b/wearable/src/include/common/efl_extension_index_layout.h
deleted file mode 100644 (file)
index abbcebe..0000000
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __EFL_EXTENSION_INDEX_H__
-#define __EFL_EXTENSION_INDEX_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup CAPI_EFL_EXTENSION_INDEX_LAYOUT_MODULE Efl Extension Index Layout
- * @ingroup CAPI_EFL_EXTENSION_COMMON_UI_MODULE
- * @brief Index layout is based on elm_layout with draggable index view, and an item of index
- *        can be selected by rotary event.
- *
- * @details This widget emits the following signals.
- *
- *          @li "changed": The index layout item is changed.
- *          @li "index,show": The index layout item is shown.
- *          @li "index,hide": The index layout item is hidden.
- *
- * @{
- */
-
-/**
- * @WEARABLE_ONLY
- * @brief Add a new index layout to the given parent
- *        Elementary object.
- *
- * @param[in] parent The parent object
- * @return A new index layout handle,
- *         otherwise @c NULL in case of an error
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Evas_Object* eext_index_layout_add(Evas_Object *parent);
-
-/**
- * @WEARABLE_ONLY
- * @brief Append a new item on a given index layout.
- *
- * @param[in] obj The index layout
- * @param[in] text The text under which the item should be indexed
- * @param[in] func The function to call when the item is clicked
- * @param[in] data The item data to set for the index's item
- * @return A handle to the item added, otherwise @c NULL in case of an error
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Object_Item* eext_index_layout_item_append(Evas_Object *obj, const char *text, Evas_Smart_Cb func, void *data);
-
-/**
- * @WEARABLE_ONLY
- * @brief Prepend a new item on a given index layout.
- *
- * @param[in] obj The index layout object
- * @param[in] text The text under which the item should be indexed
- * @param[in] func The function to call when the item is clicked
- * @param[in] data The item data to set for the index's item
- * @return A handle to the item added, otherwise @c NULL in case of an error
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Object_Item* eext_index_layout_item_prepend(Evas_Object *obj, const char *text, Evas_Smart_Cb func, void *data);
-
-/**
- * @WEARABLE_ONLY
- * @brief Insert a new item into the index object before the input index layout item.
- *
- * @param[in] obj The index layout object
- * @param[in] before The index layout item to insert before
- * @param[in] text The text under which the item should be indexed
- * @param[in] priority The priority of index layout item
- * @param[in] func The function to call when the item is clicked
- * @param[in] data The item data to set for the index's item
- * @return A handle to the item added, otherwise @c NULL in case of an error
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Object_Item* eext_index_layout_item_insert_before(Evas_Object *obj, Eext_Object_Item *before, const char *text, Evas_Smart_Cb func, void *data);
-
-/**
- * @WEARABLE_ONLY
- * @brief Insert a new item into the index object after the input index layout item.
- *
- * @param[in] obj The index layout object
- * @param[in] after The index layout item to insert after
- * @param[in] text The text under which the item should be indexed
- * @param[in] priority The priority of index layout item
- * @param[in] func The function to call when the item is clicked
- * @param[in] data The item data to set for the index's item
- * @return A handle to the item added, otherwise @c NULL in case of an error
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Object_Item* eext_index_layout_item_insert_after(Evas_Object *obj, Eext_Object_Item *after, const char *text, Evas_Smart_Cb func, void *data);
-
-/**
- * @WEARABLE_ONLY
- * @brief Remove all items from a given index layout object.
- *
- * @param[in] obj The index layout
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_index_layout_items_clear(Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Delete an item which is the given index layout item.
- *
- * @param[in] item The index layout item
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_index_layout_item_del(Eext_Object_Item *item);
-
-/**
- * @WEARABLE_ONLY
- * @brief Find a given index widget's item using item data.
- *
- * @param[in] obj The index layout
- * @param[in] data The item data pointed by the desired index layout item
- * @return The index layout item handle if found, otherwise @c NULL
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Object_Item* eext_index_layout_item_find(Evas_Object *obj, const void *data);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the last selected item, for a given index layout object.
- *
- * @param[in] obj The index layout object
- * @return The index layout item handle if selected, otherwise @c NULL
- *
- * @see eext_index_layout_item_selected_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Object_Item* eext_index_layout_selected_item_get(Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the selected state of an item.
- *
- * @remarks Selected item will be highlighted.
- *
- * @param[in] item The index layout item
- * @param[in] selected The selected state
- *
- * @see eext_index_layout_selected_item_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_index_layout_selected_item_set(Eext_Object_Item *item);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the text to the given index layout item.
- *
- * @param[in] item The index layout item
- * @param[in] text The text under which the item should be indexed
- *
- * @see eext_index_layout_item_text_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_index_layout_item_text_set(Eext_Object_Item *item, const char *text);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the text (string) set on a given index layout item.
- *
- * @param[in] item The index layout item
- * @return The text string set on @a item
- *
- * @see eext_index_layout_item_text_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI const char* eext_index_layout_item_text_get(Eext_Object_Item *item);
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_INDEX_H__ */
diff --git a/wearable/src/include/common/efl_extension_more_option.h b/wearable/src/include/common/efl_extension_more_option.h
deleted file mode 100644 (file)
index 1ec1c37..0000000
+++ /dev/null
@@ -1,344 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __EFL_EXTENSION_MORE_OPTION_H__
-#define __EFL_EXTENSION_MORE_OPTION_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup CAPI_EFL_EXTENSION_MORE_OPTION_MODULE Efl Extension More Option
- * @ingroup CAPI_EFL_EXTENSION_COMMON_UI_MODULE
- * @brief More option is composed of the toggle(cue button) and more option view,
- *        and more option can change a visibility through the toggle.
- *
- * @details More option is based on elm_panel, but more option is different
- *          from elm_panel in that the former does not set the scrollable option.
- *          To show the more option view, select the toggle or manually use
- *          eext_more_option_opened_set(). To hide the more option view,
- *          trigger the back event or manually use eext_more_option_opened_set().
- *          Additionally, the toggle disappears when more option view appears.
- *          On the other hand, the toggle appears when more option view disappears.
- *          The more option view can be manually set by eext_more_option_opened_set() API.
- *          An item of more option object can be selected by rotary event.
- *
- *          This widget emits the following signals:
- *          @li "item,selected": When the user selects an item.
- *          @li "item,clicked": When the user selects the already selected item again
- *                              or selects a selector.
- *          @li "more,option,opened": When more option view is shown.
- *          @li "more,option,closed": When more option view is hidden.
- *
- * @{
- */
-
-/**
- * @brief Enumeration of More Option Diection type
- */
-typedef enum
-{
-   EEXT_MORE_OPTION_DIRECTION_TOP,  /**< More option (dis)appears from the top */
-   EEXT_MORE_OPTION_DIRECTION_BOTTOM,  /**< More option (dis)appears from the bottom */
-   EEXT_MORE_OPTION_DIRECTION_LEFT,  /**< More option (dis)appears from the left */
-   EEXT_MORE_OPTION_DIRECTION_RIGHT  /**< More option (dis)appears from the right */
-} Eext_More_Option_Direction;
-
-/**
- * @WEARABLE_ONLY
- * @brief Add a new more option.
- *
- * @details Because the return value is the elm_layout handle,
- *          the elm_layout APIs can be applicable to more option handle.
- *
- * @param[in] parent The parent object
- * @return A new more option handle, otherwise @c NULL if it cannot be created
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Evas_Object * eext_more_option_add(Evas_Object *parent);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the direction of more option.
- *
- * @param[in] obj The more option
- * @param[in] direction The direction of more option
- *
- * @see eext_more_option_direction_get()
- *      @ref Eext_More_Option_Direction
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_more_option_direction_set(Evas_Object *obj, Eext_More_Option_Direction direction);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get @ref Eext_More_Option_Direction.
- *
- * @param[in] obj The more option
- * @return A direction of more option
- *
- * @see eext_more_option_direction_set()
- *      @ref Eext_More_Option_Direction
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_More_Option_Direction eext_more_option_direction_get(const Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Append a new item to a more option.
- *
- * @param[in] obj The more option
- * @return A handle to the item added, otherwise @c NULL in case of an error
- *
- * @see @ref Eext_Object_Item
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Object_Item * eext_more_option_item_append(Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief prepend a new item to a more option.
- *
- * @param[in] obj The more option
- * @return A handle to the item added, otherwise @c NULL in case of an error
- *
- * @see @ref Eext_Object_Item
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Object_Item * eext_more_option_item_prepend(Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Insert a new item into the more option after more option item @a after.
- *
- * @param[in] obj The more option
- * @param[in] after The more option item to insert after
- * @return A handle to the item added, otherwise @c NULL in case of an error
- *
- * @see @ref Eext_Object_Item
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Object_Item * eext_more_option_item_insert_after(Evas_Object *obj, Eext_Object_Item *after);
-
-/**
- * @WEARABLE_ONLY
- * @brief Insert a new item into the more option before more option item @a before.
- *
- * @param[in] obj The more option
- * @param[in] before The more option item to insert before
- * @return A handle to the item added, otherwise @c NULL in case of an error
- *
- * @see @ref Eext_Object_Item
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Object_Item * eext_more_option_item_insert_before(Evas_Object *obj, Eext_Object_Item *before);
-
-/**
- * @WEARABLE_ONLY
- * @brief Delete an item which is the given more option item @a item.
- *
- * @param[in] item The more option item
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_more_option_item_del(Eext_Object_Item *item);
-
-/**
- * @WEARABLE_ONLY
- * @brief Remove all items from a given more option object.
- *
- * @param[in] obj The more option
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_more_option_items_clear(Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the text of a more option object.
- *
- * @details The part name exists with the next.
- *          @li "selector,main_text": This locates in the middle of the selector.
- *          @li "selector,sub_text": This locates under the main_text.
- *
- * @param[in] item The more option item
- * @param[in] part_name The text part name to set (@c NULL for the default part)
- * @param[in] text The new text of the part
- *
- * @see eext_more_option_item_part_text_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_more_option_item_part_text_set(Eext_Object_Item *item, const char *part_name, const char *text);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the text of a more option object.
- *
- * @details The part name exists with the next.
- *          @li "selector,main_text": This locates in the middle of the selector.
- *          @li "selector,sub_text": This locates under the main_text.
- *
- * @param[in] item The more option item
- * @param[in] part_name The text part name to get (@c NULL for the default part)
- * @return The text of the part, otherwise @c NULL in case of an error
- *
- * @see eext_more_option_item_part_text_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI const char * eext_more_option_item_part_text_get(const Eext_Object_Item *item, const char *part_name);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the translatable text of a more option object.
- *
- * @details The part name exists with the next.
- *          @li "selector,main_text": This locates in the middle of the selector.
- *          @li "selector,sub_text": This locates under the main_text.
- *
- * @param[in] item The more option item
- * @param[in] part_name The text part name to set (@c NULL for the default part)
- * @param[in] domain The name of the domain which contains translatable text
- * @param[in] text ID of the new translatable text
- *
- * @see eext_more_option_item_part_text_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_more_option_item_domain_translatable_part_text_set(Eext_Object_Item *item, const char *part_name, const char *domain, const char *text);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the content to the part of a given container widget.
- *
- * @details The part name exists with the next.
- *          @li "item,icon": This locates in the middle of the selector.
- *
- * @remarks The more option item may hold child objects as content at given parts.
- *          This sets new content to a given part.
- *          If any object is already set as a content object in the same part,
- *          the previous object is automatically deleted. with this call.
- *
- * @param[in] item The more option item
- * @param[in] part_name The more option item's part name to set
- * @param[in] content The new content for that part
- *
- * @see eext_more_option_item_part_content_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_more_option_item_part_content_set(Eext_Object_Item *item, const char *part_name, Evas_Object *content);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the content from the part of a given container widget.
- *
- * @details The part name exists with the next.
- *          @li "item,icon": This locates in the middle of the selector.
- *
- * @param[in] item The more option item
- * @param[in] part_name The more option item's part name to get
- * @return The content of the object at the given part,
- *         otherwise @c NULL in case of an error
- *
- * @see eext_more_option_item_part_content_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Evas_Object * eext_more_option_item_part_content_get(const Eext_Object_Item *item, const char *part_name);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the visibility of more option view.
- *
- * @details If opened is @c EINA_TRUE, more option view in which
- *          the rotary selector is included disappears and toggle appears.
- *          If opened is @c EINA_FALSE, more option view in which
- *          the rotary selector is included appears and toggle disappear.
- *
- * @remarks When more option is closed and opened again, the first item
- *          is always selected.
- *
- * @param[in] obj The more option object
- * @param[in] opened If @c EINA_TRUE, the more option runs the animation to appear,
- *                   If @c EINA_FALSE, the more option runs the animation to disappear
- *
- * @see eext_more_option_opened_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_more_option_opened_set(Evas_Object *obj, Eina_Bool opened);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get whether the more option is set to be shown or to be hidden.
- *
- * @param[in] obj The more option object
- * @return If @c EINA_TRUE, more option is shown.
- *         Otherwise @c EINA_FALSE, more option is hidden.
- *
- * @see eext_more_option_opened_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eina_Bool eext_more_option_opened_get(Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the list of all items from a given more option object.
- *
- * @param[in] obj The more option object
- * @return All item lists of the more option..
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI const Eina_List* eext_more_option_items_get(const Evas_Object *obj);
-/**
- * @}
- */
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_MORE_OPTION_H__ */
diff --git a/wearable/src/include/common/efl_extension_rotary_selector.h b/wearable/src/include/common/efl_extension_rotary_selector.h
deleted file mode 100644 (file)
index 1ac2c2f..0000000
+++ /dev/null
@@ -1,456 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __EFL_EXTENSION_ROTARY_SELECTOR_H__
-#define __EFL_EXTENSION_ROTARY_SELECTOR_H__
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup CAPI_EFL_EXTENSION_ROTARY_SELECTOR_MODULE Efl Extension Rotary Selector
- * @ingroup CAPI_EFL_EXTENSION_COMMON_UI_MODULE
- * @brief Rotary Selector is based on elm_layout, and an item can be
- *        selected by rotary event or user item click.
- *
- * @details This widget emits the following signals.
- *
- *          @li "item,selected": When the user selected an item.
- *          @li "item,clicked": When selecting again the alredy selected item or selecting a selector.
- *
- * @{
- */
-
-/**
- * @brief Enumeration of Rotary Selector state
- */
-typedef enum
-{
-   EEXT_ROTARY_SELECTOR_SELECTOR_STATE_NORMAL = 0, /**< Selector is normal state */
-   EEXT_ROTARY_SELECTOR_SELECTOR_STATE_PRESSED, /**< Selector is pressed state */
-   EEXT_ROTARY_SELECTOR_SELECTOR_STATE_DISABLED, /**< Selector is disabled state */
-} Eext_Rotary_Selector_Selector_State;
-
-/**
- * @brief Enumeration of Rotary Selector item state
- */
-typedef enum
-{
-   EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL = 0, /**< Selector Item is normal state */
-   EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED, /**< Selector Item is pressed state */
-   EEXT_ROTARY_SELECTOR_ITEM_STATE_DISABLED, /**< Selector Item is disabled state */
-} Eext_Rotary_Selector_Item_State;
-
-/**
- * @WEARABLE_ONLY
- * @brief Add a new Rotary Selector.
- * @details Because the return value is the elm_layout handle,
-            the elm_layout APIs can be applicable to rotary selector handle.
- *
- * @param[in] parent The parent object
- *
- * @return A new rotary selector handle, otherwise @c NULL if it cannot be created
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Evas_Object* eext_rotary_selector_add(Evas_Object *parent);
-
-/**
- * @WEARABLE_ONLY
- * @brief Append a new item to a rotary selector.
- *
- * @param[in] obj The rotary selector
- * @return A handle to the item added, otherwise @c NULL in case of an error
- *
- * @see @ref Eext_Object_Item
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Object_Item* eext_rotary_selector_item_append(Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Prepend a new item to a rotary selector.
- *
- * @param[in] obj The rotary selector
- * @return A handle to the item added, otherwise @c NULL in case of an error
- *
- * @see @ref Eext_Object_Item
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Object_Item * eext_rotary_selector_item_prepend(Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Insert a new item into a rotary selector after rotary selector item @a after.
- *
- * @param[in] obj The rotary selector
- * @param[in] after The rotary selector item to insert after
- * @return A handle to the item added, otherwise @c NULL in case of an error
- *
- * @see @ref Eext_Object_Item
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Object_Item * eext_rotary_selector_item_insert_after(Evas_Object *obj, Eext_Object_Item *after);
-
-/**
- * @WEARABLE_ONLY
- * @brief Insert a new item into a rotary selector before rotary selector item @a before.
- *
- * @param[in] obj The rotary selector
- * @param[in] before The rotary selector item to insert before
- * @return A handle to the item added, otherwise @c NULL in case of an error
- *
- * @see @ref Eext_Object_Item
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Object_Item * eext_rotary_selector_item_insert_before(Evas_Object *obj, Eext_Object_Item *before);
-
-/**
- * @WEARABLE_ONLY
- * @brief Delete an item which is the given rotary selector item.
- *
- * @param[in] item The rotary selector item
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_rotary_selector_item_del(Eext_Object_Item *item);
-
-/**
- * @WEARABLE_ONLY
- * @brief Remove all items from a given rotary selector object.
- *
- * @param[in] obj The rotary selector
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_rotary_selector_items_clear(Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the text of a rotary selector object.
- *
- * @param[in] item The rotary selector item
- * @param[in] part_name The text part name to set (@c NULL for the default part)
- * @param[in] text The new text of the part
- *
- * @details This api supports following part names by default.
- *
- *          @li "selector,main_text": Selector main text.
- *          @li "selector,sub_text": Selector sub text.
- *
- * @see eext_rotary_selector_item_part_text_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_rotary_selector_item_part_text_set(Eext_Object_Item *item, const char *part_name, const char *text);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the text of a rotary selector object.
- *
- * @param[in] item The rotary selector item
- * @param[in] part_name The text part name to get (@c NULL for the default part)
- * @return The text of the part, otherwise @c NULL for any error
- *
- * @details This api supports following part names by default.
- *
- *          @li "selector,main_text": Selector main text.
- *          @li "selector,sub_text": Selector sub text.
- *
- * @see eext_rotary_selector_item_part_text_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI const char* eext_rotary_selector_item_part_text_get(const Eext_Object_Item *item, const char *part_name);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the translatable text of a rotary selector object.
- *
- * @param[in] item The rotary selector item
- * @param[in] part_name The text part name to set (@c NULL for the default part)
- * @param[in] domain The name of the domain which contains translatable text
- * @param[in] text ID of the new translatable text
- *
- * @details This api supports following part names by default.
- *
- *          @li "selector,main_text": Selector main text.
- *          @li "selector,sub_text": Selector sub text.
- *
- * @see eext_rotary_selector_item_part_text_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_rotary_selector_item_domain_translatable_part_text_set(Eext_Object_Item *item, const char *part_name, const char *domain, const char *text);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the content at a part of a given container widget.
- *
- * @remarks The rotary selector item may hold child objects as its contents in given parts.
- *          This new content to a given part. If any object is already set as a content
- *          object in the given part, the previous object is automatically deleted
- *          with this call.
- *
- * @param[in] item The rotary selector item
- * @param[in] part_name The rotary selector item's part name to set
- * @param[in] state The rotary selector item part
- * @param[in] content The new content for that part
- *
- * @details This api supports following part names by default.
- *
- *          @li "item,bg_image": Selector Item background image
- *          @li "item,icon": Selector item icon
- *          @li "selector,icon": Selector icon
- *          @li "selector,content": Selector content
- *
- * @see eext_rotary_selector_item_part_content_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_rotary_selector_item_part_content_set(Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state, Evas_Object *content);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the content at a part of a given container widget.
- *
- * @param[in] item The rotary selector item
- * @param[in] part_name The rotary selector item's part name to get
- * @param[in] state The rotary selector item part
- * @return The content of the object at the given part, otherwise @c NULL in case of an error
- *
- * @details This api supports following part names by default.
- *
- *          @li "item,bg_image": Selector Item background image
- *          @li "item,icon": Selector item icon
- *          @li "selector,icon": Selector icon
- *          @li "selector,content": Selector content
- *
- * @see eext_rotary_selector_item_part_content_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Evas_Object* eext_rotary_selector_item_part_content_get(const Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the content at a part of a given container widget.
- *
- * @remarks The rotary selector may hold child objects as its contents in given parts.
- *          This sets a new content to a given part. If any object is already set as a content
- *          object in the given part, the previous object is automatically deleted
- *          with this call.
- *
- * @param[in] obj The rotary selector
- * @param[in] part_name The rotary selector part name to set
- * @param[in] state The selector part
- * @param[in] content The new content for that part
- * @details This api supports following part names by default.
- *
- *          @li "selector,bg_image": Selector background image.
- *
- * @see eext_rotary_selector_selector_part_content_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_rotary_selector_part_content_set(Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state, Evas_Object *content);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the content from the part of the given container widget.
- *
- * @param[in] obj The rotary selector.
- * @param[in] part_name The rotary selector part name to set
- * @param[in] state The selector part
- * @return The content of the object at the given part, otherwise @c NULL in case of an error
- *
- * @details This api supports following part names by default.
- *
- *          @li "selector,bg_image": Selector background image.
- *
- * @see eext_rotary_selector_selector_part_content_set()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Evas_Object* eext_rotary_selector_part_content_get(const Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state);
-
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the item part color of a rotary selector object.
- *
- * @param[in] item The rotary selector item
- * @param[in] part_name The item part name to set
- * @param[in] state The rotary selector item part
- * @param[in] r Red (0 - 255)
- * @param[in] g Green (0 - 255)
- * @param[in] b Blue (0 - 255)
- * @param[in] a Alpha (0 - 255)
- *
- * @details This api supports following part names by default.
- *
- *          @li "item,bg_image": Selector Item background image
- *          @li "item,icon": Selector item icon
- *          @li "selector,icon": Selector icon
- *          @li "selector,content": Selector content
- *          @li "selector,main_text": Selector main text.
- *          @li "selector,sub_text": Selector sub text.
- *
- * @see eext_rotary_selector_item_part_color_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_rotary_selector_item_part_color_set(Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state, int r, int g, int b, int a);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the item part color of a rotary selector object.
- *
- * @param[in] item The rotary selector item
- * @param[in] part_name The item part name to get
- * @param[in] state The rotary selector item part
- * @param[out] r A pointer to Red (0 - 255)
- * @param[out] g A pointer to Green (0 - 255)
- * @param[out] b A pointer to Blue (0 - 255)
- * @param[out] a A pointer to Alpha (0 - 255)
- * @see eext_rotary_selector_item_part_color_set()
- *
- * @details This api supports following part names by default.
- *
- *          @li "item,bg_image": Selector Item background image
- *          @li "item,icon": Selector item icon
- *          @li "selector,icon": Selector icon
- *          @li "selector,content": Selector content
- *          @li "selector,main_text": Selector main text.
- *          @li "selector,sub_text": Selector sub text.
- *
- * @see eext_rotary_selector_item_part_color_get()
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_rotary_selector_item_part_color_get(const Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state, int *r, int *g, int *b, int *a);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the selector part color of a rotary selector object.
- *
- * @param[in] obj The rotary selector
- * @param[in] part_name The selector part name to set
- * @param[in] state The selector part
- * @param[in] r Red (0 - 255)
- * @param[in] g Green (0 - 255)
- * @param[in] b Blue (0 - 255)
- * @param[in] a Alpha (0 - 255)
- *
- * @details This api defualt support part names.
- *
- *          @li "selector,bg_image": Selector background image.
- *
- * @see eext_rotary_selector_part_color_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_rotary_selector_part_color_set(Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state, int r, int g, int b, int a);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the selector part color of a rotary selector object.
- *
- * @param[in] obj The rotary selector
- * @param[in] part_name The selector part name to get
- * @param[in] state The selector part
- * @param[out] r A pointer to Red (0 - 255)
- * @param[out] g A pointer to Green (0 - 255)
- * @param[out] b A pointer to Blue (0 - 255)
- * @param[out] a A pointer to Alpha (0 - 255)
- * @see eext_rotary_selector_item_part_color_set()
- *
- * @details This api defualt support part names.
- *
- *          @li "selector,bg_image": Selector background image.
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_rotary_selector_part_color_get(const Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state, int *r, int *g, int *b, int *a);
-
-/**
- * @WEARABLE_ONLY
- * @brief Set the selected item of a rotary selector object.
- *
- * @param[in] obj The rotary selector
- * @param[in] item The rotary selector item
- * @see eext_rotary_selector_selected_item_get()
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_rotary_selector_selected_item_set(Evas_Object *obj, Eext_Object_Item *item);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the selected item of a rotary selector object.
- *
- * @param[in] obj The rotary selector
- * @see eext_rotary_selector_selected_item_set()
- * @return A selected item handle, otherwise @c NULL if it cannot be created
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI Eext_Object_Item* eext_rotary_selector_selected_item_get(const Evas_Object *obj);
-
-/**
- * @WEARABLE_ONLY
- * @brief Get the rotary selector item list of a rotary selector object.
- *
- * @param[in] obj The rotary selector
- * @return A rotary selector item list handle, otherwise @c NULL if it cannot be created
- *
- * @if WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI const Eina_List* eext_rotary_selector_items_get(const Evas_Object *obj);
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_ROTARY_SELECTOR_H__ */
diff --git a/wearable/src/include/efl_extension.h.in b/wearable/src/include/efl_extension.h.in
deleted file mode 100644 (file)
index f460ac9..0000000
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __EFL_EXTENSION_H__
-#define __EFL_EXTENSION_H__
-
-#ifdef EAPI
-# undef EAPI
-#endif
-
-#ifdef _WIN32
-# ifdef EFL_EXTENSION_BUILD
-#  ifdef DLL_EXPORT
-#   define EAPI __declspec(dllexport)
-#  else
-#   define EAPI
-#  endif /* ! DLL_EXPORT */
-# else
-#  define EAPI __declspec(dllimport)
-# endif /* ! EFL_EXTENSION_BUILD */
-#else
-# ifdef __GNUC__
-#  if __GNUC__ >= 4
-#   define EAPI __attribute__ ((visibility("default")))
-#  else
-#   define EAPI
-#  endif
-# else
-#  define EAPI
-# endif
-#endif /* ! _WIN32 */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-@HEADER_INCS@
-@LIB_HEADERS@
-
-/**
- * @defgroup EFL_EXTENSION_HARDWARE_KEYEVENT_GROUP Efl Extension Hardware Keyevent
- * @ingroup CAPI_EFL_EXTENSION_MODULE
- * @brief This group provides functionalities to grab hardware key events.
- * @if MOBILE @since_tizen 2.4
- * @elseif WEARABLE @since_tizen 3.0
- * @endif
- *
- * @{
- */
-
-/**
- * @brief Set the keygrab of the Elm_Win object
- *
- * @details This API returns the sucessness of keygrab_set.
- *          Key callback is only called when the window located in topmost(top of the window stack).
- *
- * @param[in] obj object to set the keygrab
- *            The widget type of this object should be elm_win
- * @param[in] key keyname string to set keygrab
- *
- * @return    The result of keygrab set
- *
- * @if MOBILE @since_tizen 2.4
- * @elseif WEARABLE @since_tizen 3.0
- * @endif
- */
-EAPI Eina_Bool eext_win_keygrab_set(Elm_Win *obj, const char *key);
-
-/**
- * @brief Unset the keygrab of the Elm_Win object
- *
- * @details This API returns the sucessness of keygrab_unset.
- *
- * @param[in] obj object to unset the keygrab
- *            The widget type of this object should be elm_win
- * @param[in] key keyname string to unset keygrab
- *
- * @return    The result of keygrab unset
- *
- * @if MOBILE @since_tizen 2.4
- * @elseif WEARABLE @since_tizen 3.0
- * @endif
- */
-EAPI Eina_Bool eext_win_keygrab_unset(Elm_Win *obj, const char *key);
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_H__ */
-
diff --git a/wearable/src/include/efl_extension_events.h b/wearable/src/include/efl_extension_events.h
deleted file mode 100644 (file)
index 128ba2d..0000000
+++ /dev/null
@@ -1,347 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __EFL_EXTENSION_EVENTS_H__
-#define __EFL_EXTENSION_EVENTS_H__
-
-#include <Elementary.h>
-
-#ifdef EAPI
-# undef EAPI
-#endif
-
-#ifdef _WIN32
-# ifdef EFL_EXTENSION_BUILD
-#  ifdef DLL_EXPORT
-#   define EAPI __declspec(dllexport)
-#  else
-#   define EAPI
-#  endif /* ! DLL_EXPORT */
-# else
-#  define EAPI __declspec(dllimport)
-# endif /* ! EFL_EXTENSION_BUILD */
-#else
-# ifdef __GNUC__
-#  if __GNUC__ >= 4
-#   define EAPI __attribute__ ((visibility("default")))
-#  else
-#   define EAPI
-#  endif
-# else
-#  define EAPI
-# endif
-#endif /* ! _WIN32 */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @defgroup CAPI_EFL_EXTENSION_EVENT_MODULE Efl Extension Event
- * @ingroup CAPI_EFL_EXTENSION_MODULE
- * @brief This module provides functionalities to handle back/send key events.
- * @{
- */
-
-/**
- * @brief Convenient macro function that sends back key events to the popup
- *        to be removed.
- *
- * @details Popup will be removed when it has the back key event with
- *          eext_object_event_callback_add()
- *
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information
- *
- * @see   eext_object_event_callback_add()
- * @if MOBILE @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_popup_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
-   evas_object_del(obj);
-}
-
-/**
- * @brief Convenient macro function that sends back key events to the ctxpopup
- *        to be dismissed.
- *
- * @details Ctxpopup will be dismissed when it has the back key event with
- *          eext_object_event_callback_add()
- *
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information
- *
- * @see   eext_object_event_callback_add()
- * @if MOBILE @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_ctxpopup_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
-   elm_ctxpopup_dismiss(obj);
-}
-
-/**
- * @brief Convenient macro function that sends more key events to the naviframe
- *        top item.
- *
- * @details More key action of naviframe will be executed when naviframe has the
- *          more key event with eext_object_event_callback_add()
- *
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information
- *
- * @see   eext_object_event_callback_add()
- * @if MOBILE @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_naviframe_more_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
-   Elm_Object_Item *top = elm_naviframe_top_item_get(obj);
-   if (!top) return;
-   Evas_Object *more_btn = elm_object_item_part_content_get(top,
-                                                            "toolbar_more_btn");
-   if (more_btn)
-     evas_object_smart_callback_call(more_btn, "clicked", NULL);
-}
-
-/**
- * @brief Convenient macro function that pop the naviframe item.
- *
- * @details Naviframe will be popped when naviframe has the back key event
- *          with eext_object_event_callback_add()
- *
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information
- *
- * @see   eext_object_event_callback_add()
- * @if MOBILE @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_naviframe_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
-   elm_naviframe_item_pop(obj);
-}
-
-/**
- * Identifier of callbacks to be set for Ea events.
- *
- * @see eext_object_event_callback_add()
- * @see eext_object_event_callback_del()
- * @if MOBILE @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-typedef enum _Eext_Callback_Type
-{
-   EEXT_CALLBACK_BACK,    /**< H/W Back Key Event */
-   EEXT_CALLBACK_MORE,    /**< H/W More Key Event */
-   EEXT_CALLBACK_LAST     /**< Reserved value. Acutally This is not matched to
-                            any meaningful behavior. */
-} Eext_Callback_Type;
-
-/**
- * @brief Ea event callback function signature.
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information (if the event passes an additional in
-              formation.)
- * @see eext_object_event_callback_add()
- * @if MOBILE @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-typedef void (*Eext_Event_Cb)(void *data, Evas_Object *obj, void *event_info);
-
-/**
- * @brief Delete a callback function from an object.
- *
- * @details This function removes the most recently added callback from the
- *          object @p obj which was triggered by the type @p type and
- *          was calling the function @p func when triggered. If the removal is
- *          successful it will also return the data pointer that was passed to
- *          eext_object_event_callback_add() when the callback was added to
- *          the object. If not successful @c NULl will be returned.
- *
- * @param[in] obj Object to remove a callback from.
- * @param[in] type The type of event that was triggering the callback.
- * @param[in] func The function that was to be called when the event was
- *            triggered
- * @return    data The data pointer that was to be passed to the callback.
- *
- * @see eext_object_event_callback_add()
- * @if MOBILE @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void *eext_object_event_callback_del(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func);
-
-/**
- * @brief Add (register) a callback function to a given evas object.
- *
- * @details This function adds a function callback to an object when the key
- *          event occurs on object @p obj. The key event on the object is only
- *          triggered when the object is the most top in objects stack and
- *          visible. This means, like the naviframe widget, if your application
- *          needs to have the events based on the view but not focus, you can
- *          use this callback. A callback function must have the Eext_Event_Cb
- *          prototype definition. The first parameter (@p data) in this
- *          definition will have the same value passed to
- *          eext_object_event_callback_add() as the @p data parameter, at
- *          runtime. The second parameter @p obj is the evas object on which
- *          event occurred. Finally, the third parameter @p event_info is a
- *          pointer to a data structure that may or may not be passed to the
- *          callback, depending on the event type that triggered the callback.
- *          This is so because some events don't carry extra context with them,
- *          but others do.
- *
- * @param[in] obj evas object.
- * @param[in] type The type of event that will trigger the callback.
- * @param[in] func The function to be called when the key event is triggered.
- * @param[in] data The data pointer to be passed to @p func.
- *
- * @see eext_object_event_callback_del()
- * @if MOBILE @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-EAPI void eext_object_event_callback_add(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func, void *data);
-
-/**
- * @brief Convenient macro function that cancels the selection of the entry.
- *
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information
- *
- * @see   eext_entry_selection_back_event_allow_set()
- * @if MOBILE @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_entry_back_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
-   if (elm_entry_selection_get(obj))
-     elm_entry_select_none(obj);
-
-   eext_object_event_callback_del(obj, EEXT_CALLBACK_BACK, eext_entry_back_cb);
-   evas_object_data_set(obj, "eext_entry", NULL);
-}
-
-/**
- * @brief Convenient macro function that registers back key callback for entry.
- *
- * @details If the selection handler should be canceled when back key event is
- *          triggered, then use this API.
- *
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information
- *
- * @see   eext_entry_selection_back_event_allow_set()
- * @if MOBILE @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_entry_selection_start_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
-   if (!evas_object_data_get(obj, "eext_entry"))
-     {
-        evas_object_data_set(obj, "eext_entry", (void *) 1);
-        eext_object_event_callback_add(obj, EEXT_CALLBACK_BACK, eext_entry_back_cb,
-                                     NULL);
-     }
-}
-
-/**
- * @brief Convenient macro function that clears back key callback for entry.
- *
- * @param[in] data user data
- * @param[in] obj target object
- * @param[in] event_info event information
- *
- * @see   eext_entry_selection_back_event_allow_set()
- * @see   eext_object_event_callback_add()
- * @if MOBILE @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_entry_selection_cleared_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
-   if (evas_object_data_get(obj, "eext_entry"))
-     {
-        eext_object_event_callback_del(obj, EEXT_CALLBACK_BACK, eext_entry_back_cb);
-        evas_object_data_set(obj, "eext_entry", NULL);
-     }
-}
-
-/**
- * @brief Convenient macro function that handle the back event to cancel the
- *        selection handler of the entry.
- * @details If the selection handler should be canceled (or not) when back key
- *          event is triggered, then use this API.
- * @param[in] obj Entry object.
- * @param[in] allow @c EINA_TRUE allows the back event handling, @c EINA_FALSE
- *              otherwise.
- * @see   eext_object_event_callback_add()
- * @see   eext_object_event_callback_del()
- * @if MOBILE @since_tizen 2.3
- * @elseif WEARABLE @since_tizen 2.3.1
- * @endif
- */
-static inline void
-eext_entry_selection_back_event_allow_set(Evas_Object *obj, Eina_Bool allow)
-{
-   if (allow)
-     {
-        evas_object_smart_callback_add(obj, "selection,start",
-                                       eext_entry_selection_start_cb, NULL);
-        evas_object_smart_callback_add(obj, "selection,cleared",
-                                       eext_entry_selection_cleared_cb, NULL);
-     }
-   else
-     {
-        evas_object_smart_callback_del(obj, "selection,start",
-                                       eext_entry_selection_start_cb);
-        evas_object_smart_callback_del(obj, "selection,cleared",
-                                       eext_entry_selection_cleared_cb);
-     }
-}
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_EVENTS_H__ */
diff --git a/wearable/src/include/efl_extension_private.h b/wearable/src/include/efl_extension_private.h
deleted file mode 100644 (file)
index ca7f8be..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef __EFL_EXTENSION_PRIVATE_H__
-#define __EFL_EXTENSION_PRIVATE_H__
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <strings.h>
-#include <unistd.h>
-#include <fontconfig/fontconfig.h>
-#include <fontconfig/fcfreetype.h>
-
-#define _(str) (gettext(str))
-#define LOCALE_DIR "/usr/share/locale"
-
-#ifdef EAPI
-# undef EAPI
-#endif
-
-#ifdef _WIN32
-# ifdef EFL_EXTENSION_BUILD
-#  ifdef DLL_EXPORT
-#   define EAPI __declspec(dllexport)
-#  else
-#   define EAPI
-#  endif /* ! DLL_EXPORT */
-# else
-#  define EAPI __declspec(dllimport)
-# endif /* ! EFL_EXTENSION_BUILD */
-#else
-# ifdef __GNUC__
-#  if __GNUC__ >= 4
-#   define EAPI __attribute__ ((visibility("default")))
-#  else
-#   define EAPI
-#  endif
-# else
-#  define EAPI
-# endif
-#endif /* ! _WIN32 */
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/**
- * @internal
- *
- * @ {
- */
-
-extern int _eext_log_dom;
-
-#define CRI(...)      EINA_LOG_DOM_CRIT(_eext_log_dom, __VA_ARGS__)
-#define ERR(...)      EINA_LOG_DOM_ERR(_eext_log_dom, __VA_ARGS__)
-#define WRN(...)      EINA_LOG_DOM_WARN(_eext_log_dom, __VA_ARGS__)
-#define INF(...)      EINA_LOG_DOM_INFO(_eext_log_dom, __VA_ARGS__)
-#define DBG(...)      EINA_LOG_DOM_DBG(_eext_log_dom, __VA_ARGS__)
-
-#define __CONSTRUCTOR__ __attribute__ ((constructor))
-#define __DESTRUCTOR__ __attribute__ ((destructor))
-
-/* eina magic types */
-#define EEXT_MAGIC_NONE 0x87657890
-
-typedef unsigned int eext_magic;
-#define EEXT_MAGIC                eext_magic __magic
-
-#define EEXT_MAGIC_SET(d, m)      (d)->__magic = (m)
-#define EEXT_MAGIC_CHECK(d, m)    ((d) && ((d)->__magic == (m)))
-#define EEXT_MAGIC_FAIL(d, m, fn) \
-               _eext_magic_fail((d), (d) ? (d)->__magic : 0, (m), (fn));
-
-/**
- * @}
- */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* __EFL_EXTENSION_PRIVATE_H__ */
diff --git a/wearable/src/lib/CMakeLists.txt b/wearable/src/lib/CMakeLists.txt
deleted file mode 100644 (file)
index 4862a39..0000000
+++ /dev/null
@@ -1,79 +0,0 @@
-SET(LIB_SRCS
-       efl_extension.c
-       efl_extension_events.c
-       circle/efl_extension_circle_surface.c
-       circle/efl_extension_circle_object.c
-       circle/efl_extension_circle_object_item.c
-       circle/efl_extension_circle_object_progressbar.c
-       circle/efl_extension_circle_object_slider.c
-       circle/efl_extension_circle_object_genlist.c
-       circle/efl_extension_circle_object_datetime.c
-       circle/efl_extension_circle_object_scroller.c
-       circle/efl_extension_circle_object_spinner.c
-       circle/efl_extension_rotary.c
-       common/efl_extension_rotary_selector.c
-       common/efl_extension_more_option.c)
-
-ADD_LIBRARY(${LIB_NAME} SHARED ${LIB_SRCS})
-
-ADD_DEFINITIONS("-DEFL_EXTENSION_BUILD")
-IF(DEFINED WITH_X)
-       message("Build with X")
-       ADD_DEFINITIONS("-DWITH_X")
-       PKG_CHECK_MODULES(LIB_PKGS REQUIRED
-               eina
-               ecore
-               ecore-x
-               elementary
-               cairo
-               x11
-               xext
-               xi
-               inputproto
-               fontconfig
-               )
-ELSEIF(DEFINED WITH_WAYLAND)
-       message("Build with Wayland")
-       ADD_DEFINITIONS("-DWITH_WAYLAND")
-       PKG_CHECK_MODULES(LIB_PKGS REQUIRED
-               eina
-               ecore
-               ecore-wayland
-               ecore-input
-               elementary
-               cairo
-               fontconfig
-               )
-ELSEIF(DEFINED WIN32)
-       message("Build on Windows")
-       ADD_DEFINITIONS("-DDLL_EXPORT")
-       PKG_CHECK_MODULES(LIB_PKGS REQUIRED
-               eina
-               ecore
-               elementary
-               evil
-               cairo
-               fontconfig
-               )
-ELSE()
-       message("Build without X and Wayland")
-       PKG_CHECK_MODULES(LIB_PKGS REQUIRED
-               eina
-               ecore
-               elementary
-               cairo
-               fontconfig
-               )
-ENDIF()
-
-FOREACH(flag ${LIB_PKGS_CFLAGS})
-       SET(LIB_CFLAGS "${LIB_CFLAGS} ${flag}")
-ENDFOREACH(flag)
-
-SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES COMPILE_FLAGS "${LIB_CFLAGS}")
-SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES VERSION ${VERSION})
-SET_TARGET_PROPERTIES(${LIB_NAME} PROPERTIES SOVERSION ${VERSION_MAJOR})
-TARGET_LINK_LIBRARIES(${LIB_NAME} ${LIB_PKGS_LDFLAGS} ${LIB_TARGET_PKGS_LDFLAGS})
-
-INSTALL(TARGETS ${LIB_NAME} DESTINATION lib)
-
diff --git a/wearable/src/lib/circle/efl_extension_circle_object.c b/wearable/src/lib/circle/efl_extension_circle_object.c
deleted file mode 100644 (file)
index 8f8f798..0000000
+++ /dev/null
@@ -1,677 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "efl_extension.h"
-#include "efl_extension_private.h"
-#include "circle/efl_extension_circle_private.h"
-
-static void
-_eext_circle_object_del_cb(void *data,
-                           Evas *e,
-                           Evas_Object *obj,
-                           void *event_info)
-{
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-   Eext_Circle_Object_Item *item;
-   Eina_List *l, *l_next;
-
-   if (!circle_obj)
-     {
-        ERR("Eext_Circle_Object is NULL");
-        return;
-     }
-
-   if (circle_obj->del_func)
-     circle_obj->del_func(circle_obj);
-
-   EINA_LIST_FOREACH_SAFE(circle_obj->items, l, l_next, item)
-     {
-        _eext_circle_object_item_free(item);
-     }
-
-   if (circle_obj->surface)
-     {
-        _eext_circle_surface_object_remove(circle_obj->surface, circle_obj);
-        circle_obj->surface = NULL;
-     }
-
-   circle_obj->visible = EINA_FALSE;
-
-   if (obj)
-     evas_object_data_del(obj, EEXT_CIRCLE_OBJECT_TYPE);
-
-   free(circle_obj);
-}
-
-static void
-_eext_circle_object_show_cb(void *data,
-                            Evas *e,
-                            Evas_Object *obj,
-                            void *event_info)
-{
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
-   if (!circle_obj) return;
-   if (circle_obj->visible) return;
-
-   if (circle_obj->widget_object)
-     {
-        if (evas_object_visible_get(circle_obj->widget_object))
-          {
-             circle_obj->visible = EINA_TRUE;
-             _eext_circle_object_changed(circle_obj);
-          }
-     }
-   else
-     {
-        circle_obj->visible = EINA_TRUE;
-        _eext_circle_object_changed(circle_obj);
-     }
-}
-
-static void
-_eext_circle_object_hide_cb(void *data,
-                            Evas *e,
-                            Evas_Object *obj,
-                            void *event_info)
-{
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
-   if (!circle_obj) return;
-   if (!circle_obj->visible) return;
-
-   circle_obj->visible = EINA_FALSE;
-   _eext_circle_object_changed(circle_obj);
-}
-
-static void
-_eext_circle_object_widget_object_show_cb(void *data,
-                                          Evas *e,
-                                          Evas_Object *obj,
-                                          void *event_info)
-{
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
-   if (!circle_obj) return;
-   if (circle_obj->visible) return;
-
-   if (evas_object_visible_get(circle_obj->image_widget))
-     {
-        circle_obj->visible = EINA_TRUE;
-        _eext_circle_object_changed(circle_obj);
-     }
-   else
-     {
-        evas_object_show(circle_obj->image_widget);
-     }
-}
-
-static void
-_eext_circle_object_widget_object_hide_cb(void *data,
-                                          Evas *e,
-                                          Evas_Object *obj,
-                                          void *event_info)
-{
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
-   evas_object_hide(circle_obj->image_widget);
-}
-
-static void
-_eext_circle_object_widget_object_disabled_cb(void *data, Evas_Object *obj, void *event_info)
-{
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-   Evas_Object *main_obj = circle_obj->image_widget;
-
-   if (eext_circle_object_disabled_get(main_obj) != elm_object_disabled_get(obj))
-     eext_circle_object_disabled_set(main_obj, EINA_TRUE);
-}
-
-static void
-_eext_circle_object_widget_object_enabled_cb(void *data, Evas_Object *obj, void *event_info)
-{
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-   Evas_Object *main_obj = circle_obj->image_widget;
-
-   if (eext_circle_object_disabled_get(main_obj) != elm_object_disabled_get(obj))
-     eext_circle_object_disabled_set(main_obj, EINA_FALSE);
-}
-
-//////////////////////////////
-// Internal API //////////////
-//////////////////////////////
-void
-_eext_circle_object_init(Evas_Object *obj, Evas_Object *widget_obj, Eext_Circle_Surface *surface)
-{
-   Eext_Circle_Object *circle_obj;
-
-   circle_obj = (Eext_Circle_Object *)calloc(1, sizeof(Eext_Circle_Object));
-   // Obj is expected to be elm_image object.
-   circle_obj->image_widget = obj;
-   circle_obj->widget_object = widget_obj;
-   circle_obj->widget_data = NULL;
-   circle_obj->widget_type = EEXT_CIRCLE_OBJECT_TYPE;
-   circle_obj->del_func = NULL;
-   circle_obj->disabled_func = NULL;
-
-   evas_object_data_set(obj, EEXT_CIRCLE_OBJECT_TYPE, circle_obj);
-
-   //FIXME: It's for adjusting evas_image geometry.
-   //       Image object has weird geometry during the window calc own size.
-   //       We need to recalc image object after buffer memory copy in render time.
-   //       But now we don't have any way to call image's internal sizing eval function.
-   elm_image_aspect_fixed_set(obj, EINA_FALSE);
-   evas_object_repeat_events_set(obj, EINA_TRUE);
-
-   evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _eext_circle_object_del_cb, circle_obj);
-   evas_object_event_callback_add(obj, EVAS_CALLBACK_SHOW, _eext_circle_object_show_cb, circle_obj);
-   evas_object_event_callback_add(obj, EVAS_CALLBACK_HIDE, _eext_circle_object_hide_cb, circle_obj);
-
-   if (widget_obj)
-     {
-        evas_object_event_callback_add(widget_obj, EVAS_CALLBACK_SHOW,
-                                       _eext_circle_object_widget_object_show_cb, circle_obj);
-        evas_object_event_callback_add(widget_obj, EVAS_CALLBACK_HIDE,
-                                       _eext_circle_object_widget_object_hide_cb, circle_obj);
-        evas_object_smart_callback_add(widget_obj, "disabled", _eext_circle_object_widget_object_disabled_cb, circle_obj);
-        evas_object_smart_callback_add(widget_obj, "enabled", _eext_circle_object_widget_object_enabled_cb, circle_obj);
-     }
-
-   if (surface)
-     _eext_circle_surface_object_append(surface, circle_obj);
-   else
-     {
-        Eext_Circle_Surface *private_surface =
-           _eext_circle_surface_init(circle_obj->image_widget, NULL, EEXT_CIRCLE_SURFACE_TYPE_PRIVATE);
-        _eext_circle_surface_object_append(private_surface, circle_obj);
-     }
-}
-
-void
-_eext_circle_object_changed(Eext_Circle_Object *obj)
-{
-   if (!obj) return;
-
-   if (obj->surface)
-     _eext_circle_surface_changed(obj->surface);
-}
-
-Eext_Circle_Object_Item *
-_eext_circle_object_item_get(const Eext_Circle_Object *obj, const char *name)
-{
-   Eina_List *l;
-   Eext_Circle_Object_Item *item;
-
-   if (!obj)
-     {
-        ERR("Eext_Circle_Object is NULL! It returns NULL!");
-        return NULL;
-     }
-
-   if (!name)
-     {
-        ERR("The given item name is NULL! It returns NULL!");
-        return NULL;
-     }
-
-   EINA_LIST_FOREACH(obj->items, l, item)
-     {
-        const char *item_name = _eext_circle_object_item_name_get(item);
-        if (item_name &&
-            (name && !strcmp(_eext_circle_object_item_name_get(item), name)))
-          return item;
-     }
-
-   ERR("There is no [%s] item in the given object[%p:%s]! It returns NULL!", name, obj->image_widget, obj->widget_type);
-   return NULL;
-}
-
-void
-_eext_circle_object_hide(Eext_Circle_Object *obj)
-{
-   if (!obj) return;
-   if (!obj->visible) return;
-
-   obj->visible = EINA_FALSE;
-
-   _eext_circle_object_changed(obj);
-}
-
-void
-_eext_circle_object_show(Eext_Circle_Object *obj)
-{
-   if (!obj) return;
-   if (obj->visible) return;
-
-   obj->visible = EINA_TRUE;
-
-   if (obj->surface)
-     _eext_circle_surface_object_exclusive_show(obj->surface, obj);
-
-   _eext_circle_object_changed(obj);
-}
-
-/////////////////////////////////////////////////
-// EAPI /////////////////////////////////////////
-/////////////////////////////////////////////////
-EAPI void
-eext_circle_object_line_width_set(Evas_Object *obj, int line_width)
-{
-   eext_circle_object_item_line_width_set(obj, "default", line_width);
-}
-
-EAPI int
-eext_circle_object_line_width_get(const Evas_Object *obj)
-{
-   return eext_circle_object_item_line_width_get(obj, "default");
-}
-
-EAPI void
-eext_circle_object_angle_set(Evas_Object *obj, double angle)
-{
-   eext_circle_object_item_angle_set(obj, "default", angle);
-}
-
-EAPI double
-eext_circle_object_angle_get(const Evas_Object *obj)
-{
-   return eext_circle_object_item_angle_get(obj, "default");
-}
-
-EAPI void
-eext_circle_object_angle_offset_set(Evas_Object *obj, double angle_offset)
-{
-   eext_circle_object_item_angle_offset_set(obj, "default", angle_offset);
-}
-
-EAPI double
-eext_circle_object_angle_offset_get(const Evas_Object *obj)
-{
-   return eext_circle_object_item_angle_offset_get(obj, "default");
-}
-
-EAPI void
-eext_circle_object_angle_min_max_set(Evas_Object *obj, double min_angle, double max_angle)
-{
-   eext_circle_object_item_angle_min_max_set(obj, "default", min_angle, max_angle);
-}
-
-EAPI void
-eext_circle_object_angle_min_max_get(const Evas_Object *obj, double *min_angle, double *max_angle)
-{
-   eext_circle_object_item_angle_min_max_get(obj, "default", min_angle, max_angle);
-}
-
-EAPI void
-eext_circle_object_value_min_max_set(Evas_Object *obj, double min_value, double max_value)
-{
-   eext_circle_object_item_value_min_max_set(obj, "default", min_value, max_value);
-}
-
-EAPI void
-eext_circle_object_value_min_max_get(const Evas_Object *obj, double *min_value, double *max_value)
-{
-   eext_circle_object_item_value_min_max_get(obj, "default", min_value, max_value);
-}
-
-EAPI void
-eext_circle_object_value_set(Evas_Object *obj, double value)
-{
-   eext_circle_object_item_value_set(obj, "default", value);
-}
-
-EAPI double
-eext_circle_object_value_get(const Evas_Object *obj)
-{
-   return eext_circle_object_item_value_get(obj, "default");
-}
-
-EAPI void
-eext_circle_object_color_set(Evas_Object *obj, int r, int g, int b, int a)
-{
-   eext_circle_object_item_color_set(obj, "default", r, g, b, a);
-}
-
-EAPI void
-eext_circle_object_color_get(const Evas_Object *obj, int *r, int *g, int *b, int *a)
-{
-   eext_circle_object_item_color_get(obj, "default", r, g, b, a);
-}
-
-EAPI void
-eext_circle_object_radius_set(Evas_Object *obj, double radius)
-{
-   eext_circle_object_item_radius_set(obj, "default", radius);
-}
-
-EAPI double
-eext_circle_object_radius_get(const Evas_Object *obj)
-{
-   return eext_circle_object_item_radius_get(obj, "default");
-}
-
-EAPI void
-eext_circle_object_disabled_set(Evas_Object *obj, Eina_Bool disabled)
-{
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
-
-   if (circle_obj->disabled == disabled) return;
-
-   circle_obj->disabled = disabled;
-
-   if (circle_obj->disabled_func)
-     circle_obj->disabled_func(circle_obj);
-
-   if (circle_obj->widget_object &&
-       (elm_object_disabled_get(circle_obj->widget_object) != disabled))
-     elm_object_disabled_set(circle_obj->widget_object, disabled);
-}
-
-EAPI Eina_Bool
-eext_circle_object_disabled_get(Evas_Object *obj)
-{
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return EINA_FALSE;
-
-   return circle_obj->disabled;
-}
-
-EAPI Evas_Object *
-eext_circle_object_add(Evas_Object *parent, Eext_Circle_Surface *surface)
-{
-   Evas_Object *obj;
-   Eext_Circle_Object_Item *item;
-
-   obj = elm_image_add(parent);
-   _eext_circle_object_init(obj, NULL, surface);
-
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
-
-   item = _eext_circle_object_item_new();
-   _eext_circle_object_item_append(circle_obj, item);
-
-   return obj;
-}
-
-EAPI void
-eext_circle_object_item_line_width_set(Evas_Object *obj, const char *item_name, int line_width)
-{
-   Eext_Circle_Object_Item *item = NULL;
-
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
-
-   item = _eext_circle_object_item_get(circle_obj, item_name);
-
-   if (item)
-     _eext_circle_object_item_line_width_set(item, line_width);
-}
-
-EAPI int
-eext_circle_object_item_line_width_get(const Evas_Object *obj, const char *item_name)
-{
-   Eext_Circle_Object_Item *item = NULL;
-
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return -1;
-
-   item = _eext_circle_object_item_get(circle_obj, item_name);
-
-   if (item)
-     return _eext_circle_object_item_line_width_get(item);
-
-   return -1;
-}
-
-EAPI void
-eext_circle_object_item_angle_set(Evas_Object *obj, const char *item_name, double angle)
-{
-   Eext_Circle_Object_Item *item = NULL;
-
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
-
-   item = _eext_circle_object_item_get(circle_obj, item_name);
-
-   if (item)
-     _eext_circle_object_item_angle_set(item, angle);
-}
-
-EAPI double
-eext_circle_object_item_angle_get(const Evas_Object *obj, const char *item_name)
-{
-   Eext_Circle_Object_Item *item = NULL;
-
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return -1.0;
-
-   item = _eext_circle_object_item_get(circle_obj, item_name);
-
-   if (item)
-     return _eext_circle_object_item_angle_get(item);
-
-   return -1.0;
-}
-
-EAPI void
-eext_circle_object_item_angle_offset_set(Evas_Object *obj, const char *item_name, double angle_offset)
-{
-   Eext_Circle_Object_Item *item = NULL;
-
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
-
-   item = _eext_circle_object_item_get(circle_obj, item_name);
-
-   if (item)
-     _eext_circle_object_item_angle_offset_set(item, angle_offset);
-}
-
-EAPI double
-eext_circle_object_item_angle_offset_get(const Evas_Object *obj, const char *item_name)
-{
-   Eext_Circle_Object_Item *item = NULL;
-
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return -1.0;
-
-   item = _eext_circle_object_item_get(circle_obj, item_name);
-
-   if (item)
-     return _eext_circle_object_item_angle_offset_get(item);
-
-   return -1.0;
-}
-
-EAPI void
-eext_circle_object_item_angle_min_max_set(Evas_Object *obj, const char *item_name, double min_angle, double max_angle)
-{
-   Eext_Circle_Object_Item *item = NULL;
-
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
-
-   item = _eext_circle_object_item_get(circle_obj, item_name);
-
-   if (item)
-     _eext_circle_object_item_angle_min_max_set(item, min_angle, max_angle);
-}
-
-EAPI void
-eext_circle_object_item_angle_min_max_get(const Evas_Object *obj, const char *item_name, double *min_angle, double *max_angle)
-{
-   Eext_Circle_Object_Item *item = NULL;
-
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj)
-     {
-        if (min_angle) *min_angle = 0;
-        if (max_angle) *max_angle = 0;
-
-        return;
-     }
-
-   item = _eext_circle_object_item_get(circle_obj, item_name);
-
-   if (item)
-     {
-        _eext_circle_object_item_angle_min_max_get(item, min_angle, max_angle);
-     }
-   else
-     {
-        if (min_angle) *min_angle = 0;
-        if (max_angle) *max_angle = 0;
-     }
-}
-
-EAPI void
-eext_circle_object_item_value_min_max_set(Evas_Object *obj, const char *item_name, double min_value, double max_value)
-{
-   Eext_Circle_Object_Item *item = NULL;
-
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
-
-   item = _eext_circle_object_item_get(circle_obj, item_name);
-
-   if (item)
-     _eext_circle_object_item_value_min_max_set(item, min_value, max_value);
-}
-
-EAPI void
-eext_circle_object_item_value_min_max_get(const Evas_Object *obj, const char *item_name, double *min_value, double *max_value)
-{
-   Eext_Circle_Object_Item *item = NULL;
-
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj)
-     {
-        if (min_value) *min_value = 0;
-        if (max_value) *max_value = 0;
-
-        return;
-     }
-
-   item = _eext_circle_object_item_get(circle_obj, item_name);
-
-   if (item)
-     {
-        _eext_circle_object_item_value_min_max_get(item, min_value, max_value);
-     }
-   else
-     {
-        if (min_value) *min_value = 0;
-        if (max_value) *max_value = 0;
-     }
-}
-
-EAPI void
-eext_circle_object_item_value_set(Evas_Object *obj, const char *item_name, double value)
-{
-   Eext_Circle_Object_Item *item = NULL;
-
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
-
-   item = _eext_circle_object_item_get(circle_obj, item_name);
-
-   if (item)
-     _eext_circle_object_item_value_set(item, value);
-}
-
-EAPI double
-eext_circle_object_item_value_get(const Evas_Object *obj, const char *item_name)
-{
-   Eext_Circle_Object_Item *item = NULL;
-
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return -1.0;
-
-   item = _eext_circle_object_item_get(circle_obj, item_name);
-
-   if (item)
-     return _eext_circle_object_item_value_get(item);
-
-   return -1.0;
-}
-
-EAPI void
-eext_circle_object_item_color_set(Evas_Object *obj, const char *item_name, int r, int g, int b, int a)
-{
-   Eext_Circle_Object_Item *item = NULL;
-
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
-
-   item = _eext_circle_object_item_get(circle_obj, item_name);
-
-   if (item)
-     {
-        _eext_circle_object_item_color_set(item, r, g, b, a);
-
-        if (circle_obj->color_changed_func)
-          {
-             if (item_name)
-               circle_obj->color_changed_func(circle_obj, item_name);
-             else
-               circle_obj->color_changed_func(circle_obj, "default");
-          }
-     }
-}
-
-EAPI void
-eext_circle_object_item_color_get(const Evas_Object *obj, const char *item_name, int *r, int *g, int *b, int *a)
-{
-   Eext_Circle_Object_Item *item = NULL;
-
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj)
-     {
-        if (r) *r = 0;
-        if (g) *g = 0;
-        if (b) *b = 0;
-        if (a) *a = 0;
-
-        return;
-     }
-
-   item = _eext_circle_object_item_get(circle_obj, item_name);
-
-   if (item)
-     {
-        _eext_circle_object_item_color_get(item, r, g, b, a);
-     }
-   else
-     {
-        if (r) *r = 0;
-        if (g) *g = 0;
-        if (b) *b = 0;
-        if (a) *a = 0;
-     }
-}
-
-EAPI void
-eext_circle_object_item_radius_set(Evas_Object *obj, const char *item_name, double radius)
-{
-   Eext_Circle_Object_Item *item = NULL;
-
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
-
-   item = _eext_circle_object_item_get(circle_obj, item_name);
-
-   if (item)
-     _eext_circle_object_item_radius_set(item, radius);
-}
-
-EAPI double
-eext_circle_object_item_radius_get(const Evas_Object *obj, const char *item_name)
-{
-   Eext_Circle_Object_Item *item = NULL;
-
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return -1.0;
-
-   item = _eext_circle_object_item_get(circle_obj, item_name);
-
-   if (item)
-     return _eext_circle_object_item_radius_get(item);
-
-   return -1.0;
-}
diff --git a/wearable/src/lib/circle/efl_extension_circle_object_datetime.c b/wearable/src/lib/circle/efl_extension_circle_object_datetime.c
deleted file mode 100644 (file)
index 4ab21ac..0000000
+++ /dev/null
@@ -1,808 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "efl_extension.h"
-#include "efl_extension_private.h"
-#include "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; \
-   if (circle_obj && circle_obj->widget_data && \
-       circle_obj->widget_type && !strcmp(circle_obj->widget_type, EEXT_CIRCLE_OBJECT_DATETIME_TYPE)) \
-      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_WIDTH = 360.0;
-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 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 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}};
-
-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);
-     }
-   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_current_type_update(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;
-   double picker_angle = 0.0;
-
-   elm_datetime_value_get(datetime, &t);
-
-   radio = _eext_circle_object_datetime_selected_field_object_get(datetime);
-   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:
-         obj->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:
-         obj->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);
-         obj->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);
-         obj->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);
-         obj->bg_image_index = 6;
-         break;
-      case ELM_DATETIME_AMPM:
-      default:
-         break;
-     }
-
-   _eext_circle_object_changed(obj);
-
-}
-
-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);
-
-   _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_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(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 min, max;
-   int max_day;
-   double picker_angle = 0.0;
-
-   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:
-           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 Eina_Bool
-_rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info* info)
-{
-   char buf[DATETIME_FIELD_NAME_BUF_MAX];
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-   Evas_Object *selected_radio;
-
-   //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
-   Eext_Circle_Object_Datetime_Data *datetime_data = (Eext_Circle_Object_Datetime_Data *)circle_obj->widget_data;
-   Evas_Object *datetime = circle_obj->widget_object;
-   struct tm t;
-   char buf_read_text[255];
-   char buf_month[255];
-   char buf_ampm[3];
-   int idx = 0;
-
-   elm_datetime_value_get(datetime, &t);
-
-   bindtextdomain (PACKAGE, LOCALE_DIR);
-   textdomain (PACKAGE);
-   elm_atspi_accessible_translation_domain_set(obj, PACKAGE);
-
-   switch(datetime_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), _("WDS_TTS_TBBODY_JANUARY"));
-           else if(t.tm_mon == 1)
-              snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_FEBRUARY"));
-           else if(t.tm_mon == 2)
-              snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_MARCH"));
-           else if(t.tm_mon == 3)
-              snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_APRIL"));
-           else if(t.tm_mon == 4)
-              snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_MAY"));
-           else if(t.tm_mon == 5)
-              snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_JUNE"));
-           else if(t.tm_mon == 6)
-              snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_JULY"));
-           else if(t.tm_mon == 7)
-              snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_AUGUST"));
-           else if(t.tm_mon == 8)
-              snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_SEPTEMBER"));
-           else if(t.tm_mon == 9)
-              snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_OCTOBER"));
-           else if(t.tm_mon == 10)
-              snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_NOVEMBER"));
-           else if(t.tm_mon == 11)
-              snprintf(buf_month, sizeof(buf_month), _("WDS_TTS_TBBODY_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), _("WDS_TTS_TBBODY_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), _("WDS_TTS_TBBODY_AM"));
-           else
-              snprintf(buf_ampm, sizeof(buf_ampm), "");
-
-           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;
-     }
-   elm_atspi_bridge_utils_say(buf_read_text, EINA_TRUE, NULL, NULL);
-   //
-
-   return EINA_TRUE;
-}
-
-static void
-_eext_circle_object_datetime_del_cb(Eext_Circle_Object *obj)
-{
-   if (!obj) return;
-
-   if (obj->widget_data)
-     {
-        free(obj->widget_data);
-        obj->widget_data = NULL;
-     }
-
-   if (obj->bg_image_objs)
-     {
-        eina_list_free(obj->bg_image_objs);
-        obj->bg_image_objs = NULL;
-     }
-}
-
-static void
-_eext_circle_object_datetime_disabled_cb(Eext_Circle_Object *obj)
-{
-   if (obj->disabled)
-     {
-        eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb);
-        eext_rotary_object_event_callback_del(obj->image_widget, _rotary_changed_cb);
-     }
-   else
-     {
-        eext_rotary_object_event_callback_add(obj->image_widget, _rotary_changed_cb, obj);
-        eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
-     }
-}
-
-static void
-_eext_circle_object_datetime_bg_image_append(Eext_Circle_Object *obj)
-{
-   Evas_Object *bg_image;
-   char buf[PATH_MAX];
-   int i;
-
-   for (i = 0; i <= BG_FILE_COUNT; i++)
-     {
-        bg_image = elm_image_add(obj->widget_object);
-        snprintf(buf, sizeof(buf), "%s/%s.png", IMG_DIR, bg_file_name[i]);
-        elm_image_file_set(bg_image, buf, NULL);
-        obj->bg_image_objs = eina_list_append(obj->bg_image_objs, bg_image);
-     }
-
-   obj->bg_image_index = BG_FILE_COUNT;
-}
-static char *
-_accessibility_item_make_trait(char *trait, char *unit)
-{
-   sprintf(trait, _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_ADJUST_PS"), unit);
-   return strdup(trait);
-}
-
-//for accessibility
-static char *
-_accessibility_item_name_set_cb(void *data, Evas_Object *obj)
-{
-   char buf[255] = "";
-   char buf_month[255];
-   char buf_unit[255];
-   char buf_ampm[255];
-   char buf_trait[255];
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-   Evas_Object *datetime = circle_obj->widget_object;
-   int idx = 0;
-   int selected = -1;
-   struct tm t;
-   Evas_Object *radio;
-
-   if(obj == elm_object_part_content_get(datetime, "field0"))
-     {
-        selected = ELM_DATETIME_DATE;
-     }
-   else if(obj == elm_object_part_content_get(datetime, "field1"))
-     {
-        selected = ELM_DATETIME_MONTH;
-     }
-   else if(obj == elm_object_part_content_get(datetime, "field2"))
-     {
-        selected = ELM_DATETIME_YEAR;
-     }
-   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)
-          {
-              if(obj == field_obj)
-                {
-                   selected = idx;
-                }
-          }
-     }
-
-   elm_datetime_value_get(datetime, &t);
-
-   bindtextdomain (PACKAGE, LOCALE_DIR);
-   textdomain (PACKAGE);
-
-   switch(selected)
-     {
-        case ELM_DATETIME_DATE:
-           sprintf(buf_unit, _("WDS_TTS_TBBODY_DAY"));
-           strcpy(_accessibility_item_make_trait(buf_trait, buf_unit), buf_trait);
-           sprintf(buf, "%2.0f %s %s",(double)t.tm_mday, buf_unit, buf_trait);
-           break;
-        case ELM_DATETIME_MONTH:
-           if(t.tm_mon == 0)
-              sprintf(buf_month, _("WDS_TTS_TBBODY_JANUARY"));
-           else if(t.tm_mon == 1)
-              sprintf(buf_month, _("WDS_TTS_TBBODY_FEBRUARY"));
-           else if(t.tm_mon == 2)
-              sprintf(buf_month, _("WDS_TTS_TBBODY_MARCH"));
-           else if(t.tm_mon == 3)
-              sprintf(buf_month, _("WDS_TTS_TBBODY_APRIL"));
-           else if(t.tm_mon == 4)
-              sprintf(buf_month, _("WDS_TTS_TBBODY_MAY"));
-           else if(t.tm_mon == 5)
-              sprintf(buf_month, _("WDS_TTS_TBBODY_JUNE"));
-           else if(t.tm_mon == 6)
-              sprintf(buf_month, _("WDS_TTS_TBBODY_JULY"));
-           else if(t.tm_mon == 7)
-              sprintf(buf_month, _("WDS_TTS_TBBODY_AUGUST"));
-           else if(t.tm_mon == 8)
-              sprintf(buf_month, _("WDS_TTS_TBBODY_SEPTEMBER"));
-           else if(t.tm_mon == 9)
-              sprintf(buf_month, _("WDS_TTS_TBBODY_OCTOBER"));
-           else if(t.tm_mon == 10)
-              sprintf(buf_month, _("WDS_TTS_TBBODY_NOVEMBER"));
-           else if(t.tm_mon == 11)
-              sprintf(buf_month, _("WDS_TTS_TBBODY_DECEMBER"));
-           sprintf(buf_unit, _("WDS_TTS_TBBODY_MONTH"));
-           strcpy(_accessibility_item_make_trait(buf_trait, buf_unit), buf_trait);
-           sprintf(buf, "%s %s %s",buf_month, buf_unit, buf_trait);
-           break;
-        case ELM_DATETIME_YEAR:
-           sprintf(buf_unit, _("WDS_TTS_TBBODY_YEAR"));
-           strcpy(_accessibility_item_make_trait(buf_trait, buf_unit), buf_trait);
-           sprintf(buf, "%4.0f %s %s",(double)t.tm_year + (double)1900.0f, buf_unit, buf_trait);
-           break;
-        case ELM_DATETIME_AMPM:
-           sprintf(buf_trait, _("WDS_TTS_TBBODY_DOUBLE_TAP_TO_CHANGE"));
-           if((double)t.tm_hour <= 12.0f)
-              sprintf(buf_unit, _("WDS_TTS_TBBODY_AM"));
-           else
-              sprintf(buf_unit, _("WDS_TTS_TBBODY_PM"));
-           strcpy(_accessibility_item_make_trait(buf_trait, buf_unit), buf_trait);
-           sprintf(buf, "%s %s",buf_unit, buf_trait);
-           break;
-        case ELM_DATETIME_HOUR:
-           sprintf(buf_unit, _("WDS_TTS_TBBODY_HOUR"));
-           if((double)t.tm_hour <= 12.0f)
-             {
-                sprintf(buf_ampm, _("WDS_TTS_TBBODY_AM"));
-                strcpy(_accessibility_item_make_trait(buf_trait, buf_unit), buf_trait);
-                sprintf(buf, "%2.0f %s %s %s",(double)t.tm_hour, buf_ampm, buf_unit, buf_trait);
-             }
-           else
-             {
-                sprintf(buf_ampm, _("WDS_TTS_TBBODY_PM"));
-                strcpy(_accessibility_item_make_trait(buf_trait, buf_unit), buf_trait);
-                sprintf(buf, "%2.0f %s %s %s",(double)t.tm_hour - (double)12.0f, buf_ampm, buf_unit, buf_trait);
-             }
-           break;
-        case ELM_DATETIME_MINUTE:
-           sprintf(buf_unit, _("WDS_TTS_TBBODY_MINUTE"));
-           strcpy(_accessibility_item_make_trait(buf_trait, buf_unit), buf_trait);
-           sprintf(buf, "%2.0f %s %s",(double)t.tm_min, buf_unit, buf_trait);
-           break;
-     }
-
-   return strdup(buf);
-
-}
-static void
-_accessibility_datetime_radio_highlighted_cb(void *data, Evas_Object *obj, void *event_info)
-{
-   char buf[255] = "";
-   char buf_month[255];
-   char buf_unit[255];
-   char buf_ampm[255];
-   char buf_trait[255];
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-   Evas_Object *datetime = circle_obj->widget_object;
-   int idx = 0;
-   int selected = -1;
-   struct tm t;
-   Evas_Object *radio;
-
-   if(obj == elm_object_part_content_get(datetime, "field0"))
-     selected = ELM_DATETIME_DATE;
-   else if(obj == elm_object_part_content_get(datetime, "field1"))
-     selected = ELM_DATETIME_MONTH;
-   else if(obj == elm_object_part_content_get(datetime, "field2"))
-     selected = ELM_DATETIME_YEAR;
-
-   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)
-          {
-              if(obj == field_obj)
-                {
-                   selected = idx;
-                }
-          }
-     }
-
-   radio = _eext_circle_object_datetime_selected_field_object_get(datetime);
-   if(selected == ELM_DATETIME_AMPM)
-      elm_radio_value_set(radio, ELM_DATETIME_HOUR);
-   else
-      elm_radio_value_set(radio, selected);
-
-   _eext_circle_object_datetime_current_type_update(circle_obj, EINA_FALSE);
-
-   elm_atspi_accessible_name_cb_set(obj, _accessibility_item_name_set_cb, (Eext_Circle_Object*)circle_obj);
-   elm_atspi_accessible_reading_info_type_set(obj, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME);
-
-   return EINA_TRUE;
-}
-//
-
-static void
-_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;
-
-   data = (Eext_Circle_Object_Datetime_Data *)calloc(1, sizeof(Eext_Circle_Object_Datetime_Data));
-   obj->widget_data = (void *)data;
-
-   item = _eext_circle_object_item_new();
-   _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_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);
-   //for accessibility
-   evas_object_smart_callback_add(elm_object_part_content_get(datetime, "field0"), "atspi,highlighted", _accessibility_datetime_radio_highlighted_cb, obj);
-   evas_object_smart_callback_add(elm_object_part_content_get(datetime, "field1"), "atspi,highlighted", _accessibility_datetime_radio_highlighted_cb, obj);
-   evas_object_smart_callback_add(elm_object_part_content_get(datetime, "field2"), "atspi,highlighted", _accessibility_datetime_radio_highlighted_cb, 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
-             evas_object_smart_callback_add(field_obj, "atspi,highlighted", _accessibility_datetime_radio_highlighted_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);
-   _eext_circle_object_datetime_circle_update(obj);
-
-   eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
-
-   _eext_circle_object_datetime_bg_image_append(obj);
-
-}
-
-EAPI Evas_Object *
-eext_circle_object_datetime_add(Evas_Object *datetime, Eext_Circle_Surface *surface)
-{
-   Evas_Object *obj;
-
-   if (!datetime) return NULL;
-
-   obj = elm_image_add(datetime);
-   _eext_circle_object_init(obj, datetime, surface);
-
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
-
-   _eext_circle_object_datetime_init(circle_obj, datetime);
-
-   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);
-}
-*/
diff --git a/wearable/src/lib/circle/efl_extension_circle_object_genlist.c b/wearable/src/lib/circle/efl_extension_circle_object_genlist.c
deleted file mode 100644 (file)
index a2d90c7..0000000
+++ /dev/null
@@ -1,521 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "efl_extension.h"
-#include "efl_extension_private.h"
-#include "circle/efl_extension_circle_private.h"
-
-#define EEXT_CIRCLE_OBJECT_GENLIST_TYPE "Eext_Circle_Object_Genlist"
-
-#define VERTICAL_BAR_ANGLE_START 60.0
-#define VERTICAL_BAR_ANGLE_RANGE 60.0
-#define VERTICAL_BAR_ANGLE_MAX_SIZE 60.0
-#define VERTICAL_BAR_ANGLE_MIN_SIZE 6.0
-#define VERTICAL_BAR_TRANSIT_TIME 0.2
-#define VERTICAL_BAR_HIDE_WAITTING_TIME 0.2
-#define VERTICAL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING 1.0
-#define VERTICAL_BAR_WIDTH_SIZE 10
-#define VERTICAL_BAR_RADIUS_SIZE 174 // (180 - (BAR_WIDTH / 2) - 1)
-
-#define SCROLL_BAR_COLOR_R 14
-#define SCROLL_BAR_COLOR_G 137
-#define SCROLL_BAR_COLOR_B 181
-#define SCROLL_BAR_COLOR_A 255
-
-#define SCROLL_BAR_BG_COLOR_R 250
-#define SCROLL_BAR_BG_COLOR_G 250
-#define SCROLL_BAR_BG_COLOR_B 250
-#define SCROLL_BAR_BG_COLOR_A 38
-
-#define SCROLL_BAR_COLOR_DISABLED_R 45
-#define SCROLL_BAR_COLOR_DISABLED_G 45
-#define SCROLL_BAR_COLOR_DISABLED_B 45
-#define SCROLL_BAR_COLOR_DISABLED_A 255
-
-#define SCROLL_BAR_BG_COLOR_DISABLED_R 45
-#define SCROLL_BAR_BG_COLOR_DISABLED_G 45
-#define SCROLL_BAR_BG_COLOR_DISABLED_B 45
-#define SCROLL_BAR_BG_COLOR_DISABLED_A 63
-
-#define EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, data) \
-   Eext_Circle_Object_Genlist_Data *data = NULL; \
-   if (circle_obj && circle_obj->widget_data && \
-       circle_obj->widget_type && !strcmp(circle_obj->widget_type, EEXT_CIRCLE_OBJECT_GENLIST_TYPE)) \
-      data = (Eext_Circle_Object_Genlist_Data *)circle_obj->widget_data; \
-   if (!data)
-
-#define GENLIST_ITEM_NAME "default"
-#define GENLIST_BG_ITEM_NAME "vertical,scroll,bg"
-
-static void
-_eext_circle_object_genlist_region_show(void *data, Eina_Bool clockwise)
-{
-   Eext_Circle_Object *obj = (Eext_Circle_Object *)data;
-   Evas_Coord x, y, vw, vh;
-   Elm_Object_Item *next_item;
-
-   if (!obj) return;
-
-   elm_scroller_region_get(obj->widget_object, NULL, NULL, &vw, &vh);
-   evas_object_geometry_get(obj->widget_object, &x, &y, NULL, NULL);
-
-   next_item = elm_genlist_at_xy_item_get(obj->widget_object, (vw / 2) + x, (vh / 2) + y, 0);
-
-   if (!next_item) return;
-
-   if (clockwise)
-     next_item = elm_genlist_item_next_get(next_item);
-   else
-     next_item = elm_genlist_item_prev_get(next_item);
-
-   if (!next_item) return;
-
-   elm_genlist_item_bring_in(next_item, ELM_GENLIST_ITEM_SCROLLTO_MIDDLE);
-}
-
-static Eina_Bool
-_rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info)
-{
-   if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
-     _eext_circle_object_genlist_region_show(data, EINA_TRUE);
-   else
-     _eext_circle_object_genlist_region_show(data, EINA_FALSE);
-
-   return EINA_TRUE;
-}
-
-static void
-_eext_circle_object_genlist_scrollbar_update(Eext_Circle_Object *obj)
-{
-   Eext_Circle_Object_Item *item;
-   Evas_Coord ch; /* content h */
-   Evas_Coord py, vh; /* postion y, viewport h*/
-   double ratio;
-   double bar_pos_y = VERTICAL_BAR_ANGLE_START;
-   double bar_size_y = VERTICAL_BAR_ANGLE_RANGE;
-   double vertical_bar_angle_range = VERTICAL_BAR_ANGLE_RANGE;
-
-   if (!obj) return;
-
-   item = _eext_circle_object_item_get(obj, GENLIST_ITEM_NAME);
-
-   elm_scroller_child_size_get(obj->widget_object, NULL, &ch);
-   elm_scroller_region_get(obj->widget_object, NULL, &py, NULL, &vh);
-
-   if (ch > 0)
-     {
-        ratio = (double)ch / (double)vh;
-
-        if (ratio == 0) return;
-
-        if (ch > vh)
-          {
-             bar_size_y = vertical_bar_angle_range / ratio;
-
-             if (bar_size_y > VERTICAL_BAR_ANGLE_MAX_SIZE)
-               bar_size_y = VERTICAL_BAR_ANGLE_MAX_SIZE;
-             if (bar_size_y < VERTICAL_BAR_ANGLE_MIN_SIZE)
-               bar_size_y = VERTICAL_BAR_ANGLE_MIN_SIZE;
-          }
-        bar_pos_y += (double)py / ch * vertical_bar_angle_range;
-
-        _eext_circle_object_item_angle_set(item, bar_size_y);
-        _eext_circle_object_item_angle_offset_set(item, bar_pos_y);
-     }
-}
-
-static void
-_eext_circle_object_genlist_realized_cb(void *data,
-                                        Evas_Object *obj,
-                                        void *event_info)
-{
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
-   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
-
-   if (widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) return;
-
-   _eext_circle_object_genlist_scrollbar_update(circle_obj);
-}
-
-static void
-_eext_circle_object_genlist_color_changed_cb(Eext_Circle_Object *obj, const char *item_name)
-{
-   Eext_Circle_Object_Item *item;
-   int r, g, b, a;
-
-   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, widget_data) return;
-
-   item = _eext_circle_object_item_get(obj, item_name);
-   if (!item) return;
-
-   _eext_circle_object_item_color_get(item, &r, &g, &b, &a);
-
-   if (!strcmp(item_name, GENLIST_ITEM_NAME))
-     {
-        widget_data->color.r = r;
-        widget_data->color.g = g;
-        widget_data->color.b = b;
-        widget_data->color.a = a;
-
-        return;
-     }
-
-   if (!strcmp(item_name, GENLIST_BG_ITEM_NAME))
-     {
-        widget_data->bg_color.r = r;
-        widget_data->bg_color.g = g;
-        widget_data->bg_color.b = b;
-        widget_data->bg_color.a = a;
-
-        return;
-     }
-}
-
-static Eina_Bool
-_eext_circle_object_genlist_scrollbar_policy_hide_cb(void *data)
-{
-   Eext_Circle_Object *obj = (Eext_Circle_Object *)data;
-   Eext_Circle_Object_Item *item;
-   Eina_List *l;
-
-   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, widget_data) return ECORE_CALLBACK_CANCEL;
-
-   if (widget_data->realized_callback_added)
-     {
-        evas_object_smart_callback_del_full(obj->widget_object, "realized", _eext_circle_object_genlist_realized_cb, obj);
-        widget_data->realized_callback_added = EINA_FALSE;
-     }
-
-   EINA_LIST_FOREACH(obj->items, l, item)
-     {
-        _eext_circle_object_item_color_transit_set(item, VERTICAL_BAR_TRANSIT_TIME,
-                                                   0, 0, 0, 0,
-                                                   EINA_TRUE,
-                                                   0.25, 0.46, 0.45, 1.0);
-     }
-
-   if (widget_data->bar_hide_timer)
-     {
-         ecore_timer_del(widget_data->bar_hide_timer);
-         widget_data->bar_hide_timer = NULL;
-     }
-
-   return ECORE_CALLBACK_CANCEL;
-}
-
-static void
-_eext_circle_object_genlist_scrollbar_show(Eext_Circle_Object *obj,
-                                           double hide_waiting_time)
-{
-   Eext_Circle_Object_Item *item;
-
-   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, widget_data) return;
-
-   if (widget_data->realized_callback_added)
-     {
-        evas_object_smart_callback_del_full(obj->widget_object, "realized", _eext_circle_object_genlist_realized_cb, obj);
-        widget_data->realized_callback_added = EINA_FALSE;
-     }
-
-   if (widget_data->bar_hide_timer)
-     {
-         ecore_timer_del(widget_data->bar_hide_timer);
-         widget_data->bar_hide_timer = NULL;
-     }
-
-   item = _eext_circle_object_item_get(obj, GENLIST_BG_ITEM_NAME);
-   if (obj->disabled)
-     _eext_circle_object_item_color_set(item,
-                                        widget_data->disabled_bg_color.r,
-                                        widget_data->disabled_bg_color.g,
-                                        widget_data->disabled_bg_color.b,
-                                        widget_data->disabled_bg_color.a);
-   else
-     _eext_circle_object_item_color_set(item,
-                                        widget_data->bg_color.r,
-                                        widget_data->bg_color.g,
-                                        widget_data->bg_color.b,
-                                        widget_data->bg_color.a);
-
-   item = _eext_circle_object_item_get(obj, GENLIST_ITEM_NAME);
-   if (obj->disabled)
-     _eext_circle_object_item_color_set(item,
-                                        widget_data->disabled_color.r,
-                                        widget_data->disabled_color.g,
-                                        widget_data->disabled_color.b,
-                                        widget_data->disabled_color.a);
-   else
-     _eext_circle_object_item_color_set(item,
-                                        widget_data->color.r,
-                                        widget_data->color.g,
-                                        widget_data->color.b,
-                                        widget_data->color.a);
-
-   if (widget_data->policy_v == ELM_SCROLLER_POLICY_AUTO)
-     {
-        widget_data->bar_hide_timer = ecore_timer_add(hide_waiting_time,
-                                                      _eext_circle_object_genlist_scrollbar_policy_hide_cb,
-                                                      obj);
-     }
-}
-
-static void
-_eext_circle_object_genlist_show_cb(void *data,
-                                    Evas *e,
-                                    Evas_Object *obj,
-                                    void *event_info)
-{
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
-   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
-
-   if (widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) return;
-
-   _eext_circle_object_genlist_scrollbar_update(circle_obj);
-   _eext_circle_object_genlist_scrollbar_show(circle_obj,
-                                              VERTICAL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING);
-   if (!widget_data->realized_callback_added)
-     {
-        evas_object_smart_callback_add(circle_obj->widget_object, "realized", _eext_circle_object_genlist_realized_cb, circle_obj);
-        widget_data->realized_callback_added = EINA_TRUE;
-     }
-}
-
-static void
-_eext_circle_object_genlist_scroll_cb(void *data,
-                                      Evas_Object *obj,
-                                      void *event_info)
-{
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
-   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, widget_data) return;
-
-   if (widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) return;
-
-   _eext_circle_object_genlist_scrollbar_update(circle_obj);
-   _eext_circle_object_genlist_scrollbar_show(circle_obj,
-                                              VERTICAL_BAR_HIDE_WAITTING_TIME);
-}
-
-static void
-_eext_circle_object_genlist_del_cb(Eext_Circle_Object *obj)
-{
-   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, widget_data) return;
-
-   evas_object_event_callback_del_full(obj->widget_object, EVAS_CALLBACK_SHOW, _eext_circle_object_genlist_show_cb, obj);
-   evas_object_smart_callback_del_full(obj->widget_object, "scroll", _eext_circle_object_genlist_scroll_cb, obj);
-
-   if (widget_data->realized_callback_added)
-     {
-        evas_object_smart_callback_del_full(obj->widget_object, "realized", _eext_circle_object_genlist_realized_cb, obj);
-        widget_data->realized_callback_added = EINA_FALSE;
-     }
-
-   if (widget_data->bar_hide_timer)
-     {
-        ecore_timer_del(widget_data->bar_hide_timer);
-        widget_data->bar_hide_timer = NULL;
-     }
-
-   free(obj->widget_data);
-   obj->widget_data = NULL;
-
-   eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb);
-}
-
-static void
-_eext_circle_object_genlist_disabled_cb(Eext_Circle_Object *obj)
-{
-   Eext_Circle_Object_Item *item;
-
-   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(obj, data) return;
-
-   if (obj->disabled)
-     {
-        item = _eext_circle_object_item_get(obj, GENLIST_ITEM_NAME);
-        _eext_circle_object_item_color_set(item,
-                                           data->disabled_color.r,
-                                           data->disabled_color.g,
-                                           data->disabled_color.b,
-                                           data->disabled_color.a);
-
-        item = _eext_circle_object_item_get(obj, GENLIST_BG_ITEM_NAME);
-        _eext_circle_object_item_color_set(item,
-                                           data->disabled_bg_color.r,
-                                           data->disabled_bg_color.g,
-                                           data->disabled_bg_color.b,
-                                           data->disabled_bg_color.a);
-
-        eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb);
-        eext_rotary_object_event_callback_del(obj->image_widget, _rotary_changed_cb);
-     }
-   else
-     {
-        item = _eext_circle_object_item_get(obj, GENLIST_ITEM_NAME);
-        _eext_circle_object_item_color_set(item,
-                                           data->color.r,
-                                           data->color.g,
-                                           data->color.b,
-                                           data->color.a);
-
-        item = _eext_circle_object_item_get(obj, GENLIST_BG_ITEM_NAME);
-        _eext_circle_object_item_color_set(item,
-                                           data->bg_color.r,
-                                           data->bg_color.g,
-                                           data->bg_color.b,
-                                           data->bg_color.a);
-
-        eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
-        eext_rotary_object_event_callback_add(obj->image_widget, _rotary_changed_cb, obj);
-     }
-}
-
-static void
-_eext_circle_object_genlist_init(Eext_Circle_Object *obj, Evas_Object *genlist)
-{
-   Eext_Circle_Object_Genlist_Data *data;
-   Eext_Circle_Object_Item *item;
-
-   obj->widget_type = EEXT_CIRCLE_OBJECT_GENLIST_TYPE;
-   obj->del_func = _eext_circle_object_genlist_del_cb;
-   obj->disabled_func = _eext_circle_object_genlist_disabled_cb;
-   obj->color_changed_func = _eext_circle_object_genlist_color_changed_cb;
-
-   data = (Eext_Circle_Object_Genlist_Data *)calloc(1, sizeof(Eext_Circle_Object_Genlist_Data));
-   data->policy_v = ELM_SCROLLER_POLICY_AUTO;
-   data->color.r = SCROLL_BAR_COLOR_R;
-   data->color.g = SCROLL_BAR_COLOR_G;
-   data->color.b = SCROLL_BAR_COLOR_B;
-   data->color.a = SCROLL_BAR_COLOR_A;
-   data->bg_color.r = SCROLL_BAR_BG_COLOR_R;
-   data->bg_color.g = SCROLL_BAR_BG_COLOR_G;
-   data->bg_color.b = SCROLL_BAR_BG_COLOR_B;
-   data->bg_color.a = SCROLL_BAR_BG_COLOR_A;
-   data->disabled_color.r = SCROLL_BAR_COLOR_DISABLED_R;
-   data->disabled_color.g = SCROLL_BAR_COLOR_DISABLED_G;
-   data->disabled_color.b = SCROLL_BAR_COLOR_DISABLED_B;
-   data->disabled_color.a = SCROLL_BAR_COLOR_DISABLED_A;
-   data->disabled_bg_color.r = SCROLL_BAR_BG_COLOR_DISABLED_R;
-   data->disabled_bg_color.g = SCROLL_BAR_BG_COLOR_DISABLED_G;
-   data->disabled_bg_color.b = SCROLL_BAR_BG_COLOR_DISABLED_B;
-   data->disabled_bg_color.a = SCROLL_BAR_BG_COLOR_DISABLED_A;
-   obj->widget_data = (void *)data;
-
-   item = _eext_circle_object_item_new();
-   _eext_circle_object_item_name_set(item, GENLIST_BG_ITEM_NAME);
-   _eext_circle_object_item_color_set(item,
-                                      data->bg_color.r,
-                                      data->bg_color.g,
-                                      data->bg_color.b,
-                                      data->bg_color.a);
-   _eext_circle_object_item_line_width_set(item, VERTICAL_BAR_WIDTH_SIZE);
-   _eext_circle_object_item_radius_set(item, VERTICAL_BAR_RADIUS_SIZE);
-   _eext_circle_object_item_angle_set(item, VERTICAL_BAR_ANGLE_RANGE);
-   _eext_circle_object_item_angle_offset_set(item, VERTICAL_BAR_ANGLE_START);
-   _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE);
-   _eext_circle_object_item_append(obj, item);
-
-   item = _eext_circle_object_item_new();
-   _eext_circle_object_item_name_set(item, GENLIST_ITEM_NAME);
-   _eext_circle_object_item_color_set(item,
-                                      data->color.r,
-                                      data->color.g,
-                                      data->color.b,
-                                      data->color.a);
-   _eext_circle_object_item_line_width_set(item, VERTICAL_BAR_WIDTH_SIZE);
-   _eext_circle_object_item_radius_set(item, VERTICAL_BAR_RADIUS_SIZE);
-   _eext_circle_object_item_angle_offset_set(item, VERTICAL_BAR_ANGLE_START);
-   _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE);
-   _eext_circle_object_item_append(obj, item);
-
-   elm_scroller_policy_set(obj->widget_object, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
-   evas_object_event_callback_add(obj->widget_object, EVAS_CALLBACK_SHOW, _eext_circle_object_genlist_show_cb, obj);
-   evas_object_smart_callback_add(obj->widget_object, "scroll", _eext_circle_object_genlist_scroll_cb, obj);
-   eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
-   eext_rotary_object_event_callback_add(obj->image_widget, _rotary_changed_cb, obj);
-}
-
-EAPI Evas_Object *
-eext_circle_object_genlist_add(Evas_Object *genlist, Eext_Circle_Surface *surface)
-{
-   Evas_Object *obj;
-
-   if (!genlist) return NULL;
-
-   obj = elm_image_add(genlist);
-   _eext_circle_object_init(obj, genlist, surface);
-
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
-
-   _eext_circle_object_genlist_init(circle_obj, genlist);
-
-   return obj;
-}
-
-
-EAPI void
-eext_circle_object_genlist_scroller_policy_set(Evas_Object *obj,
-                                               Elm_Scroller_Policy policy_h,
-                                               Elm_Scroller_Policy policy_v)
-{
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
-   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, data)
-     {
-        ERR("Eext_Circle_Object type mismatch: expected type [%s], given type [%s]",
-             EEXT_CIRCLE_OBJECT_GENLIST_TYPE, circle_obj->widget_type);
-        return;
-     }
-
-   if ((policy_h >= ELM_SCROLLER_POLICY_LAST) ||
-       (policy_v >= ELM_SCROLLER_POLICY_LAST))
-     return;
-
-   data->policy_h = policy_h;
-   data->policy_v = policy_v;
-
-   if (data->policy_v == ELM_SCROLLER_POLICY_ON)
-     {
-        _eext_circle_object_genlist_scrollbar_update(circle_obj);
-        _eext_circle_object_genlist_scrollbar_show(circle_obj,
-                                                   VERTICAL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING);
-     }
-}
-
-EAPI void
-eext_circle_object_genlist_scroller_policy_get(const Evas_Object *obj,
-                                               Elm_Scroller_Policy *policy_h,
-                                               Elm_Scroller_Policy *policy_v)
-{
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj)
-     {
-        if (policy_h) *policy_h = ELM_SCROLLER_POLICY_AUTO;
-        if (policy_v) *policy_v = ELM_SCROLLER_POLICY_AUTO;
-        return;
-     }
-
-   EEXT_CIRCLE_OBJECT_GENLIST_DATA_GET(circle_obj, data)
-     {
-        ERR("Eext_Circle_Object type mismatch: expected type [%s], given type [%s]",
-             EEXT_CIRCLE_OBJECT_GENLIST_TYPE, circle_obj->widget_type);
-        if (policy_h) *policy_h = ELM_SCROLLER_POLICY_AUTO;
-        if (policy_v) *policy_v = ELM_SCROLLER_POLICY_AUTO;
-        return;
-     }
-
-   if (policy_h) *policy_h = data->policy_h;
-   if (policy_v) *policy_v = data->policy_v;
-}
diff --git a/wearable/src/lib/circle/efl_extension_circle_object_item.c b/wearable/src/lib/circle/efl_extension_circle_object_item.c
deleted file mode 100644 (file)
index 82f4437..0000000
+++ /dev/null
@@ -1,942 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "efl_extension.h"
-#include "efl_extension_private.h"
-#include "circle/efl_extension_circle_private.h"
-
-static void _eext_circle_object_item_color_transit_animator_del(Eext_Circle_Object_Item *item);
-static void _eext_circle_object_item_angle_transit_animator_del(Eext_Circle_Object_Item *item);
-
-static Eina_Bool
-_eext_circle_object_item_color_transit_animator_cb(void *data, double pos)
-{
-   Eext_Circle_Object_Item *item = (Eext_Circle_Object_Item *)data;
-   int diff_r, diff_g, diff_b, diff_a;
-   double mapped_pos;
-
-   diff_r = item->color_transit.from_color.r - item->color.r;
-   diff_g = item->color_transit.from_color.g - item->color.g;
-   diff_b = item->color_transit.from_color.b - item->color.b;
-   diff_a = item->color_transit.from_color.a - item->color.a;
-
-   item->color_transit.current_animator_pos = pos;
-
-   if (item->color_transit.cubic_bezier_enabled)
-     mapped_pos = ecore_animator_pos_map_n(pos,
-                                           ECORE_POS_MAP_CUBIC_BEZIER,
-                                           4,
-                                           item->color_transit.cubic_bezier_v);
-   else
-     mapped_pos = pos;
-
-   item->draw.color.r = item->color_transit.from_color.r - diff_r * mapped_pos;
-   item->draw.color.g = item->color_transit.from_color.g - diff_g * mapped_pos;
-   item->draw.color.b = item->color_transit.from_color.b - diff_b * mapped_pos;
-   item->draw.color.a = item->color_transit.from_color.a - diff_a * mapped_pos;
-
-   _eext_circle_object_changed(item->obj);
-
-   if (pos >= 1.0)
-     {
-        _eext_circle_object_item_color_transit_animator_del(item);
-        return ECORE_CALLBACK_CANCEL;
-     }
-
-   return ECORE_CALLBACK_RENEW;
-}
-
-static Eina_Bool
-_eext_circle_object_item_angle_transit_animator_cb(void *data, double pos)
-{
-   Eext_Circle_Object_Item *item = (Eext_Circle_Object_Item *)data;
-   double diff_angle, diff_angle_offset;
-   double mapped_pos;
-
-   diff_angle = item->angle_transit.from_angle - item->angle;
-   diff_angle_offset =
-      item->angle_transit.from_angle_offset - item->angle_offset;
-
-   item->angle_transit.current_animator_pos = pos;
-
-   if (item->angle_transit.cubic_bezier_enabled)
-     mapped_pos = ecore_animator_pos_map_n(pos,
-                                           ECORE_POS_MAP_CUBIC_BEZIER,
-                                           4,
-                                           item->angle_transit.cubic_bezier_v);
-   else
-     mapped_pos = pos;
-
-   item->draw.angle = item->angle_transit.from_angle - diff_angle * mapped_pos;
-   item->draw.angle_offset = item->angle_transit.from_angle_offset - diff_angle_offset * mapped_pos;
-
-   _eext_circle_object_changed(item->obj);
-
-   if (pos >= 1.0)
-     {
-        _eext_circle_object_item_angle_transit_animator_del(item);
-        return ECORE_CALLBACK_CANCEL;
-     }
-
-   return ECORE_CALLBACK_RENEW;
-}
-
-static Eina_Bool
-_eext_circle_object_item_angle_set_internal(Eext_Circle_Object_Item *item, double angle)
-{
-   double temp_angle;
-
-   if (item->angle == angle) return EINA_FALSE;
-
-   temp_angle = angle;
-
-   if (angle < item->min_angle) temp_angle = item->min_angle;
-   if (angle > item->max_angle) temp_angle = item->max_angle;
-
-   if (item->angle == temp_angle) return EINA_FALSE;
-
-   item->angle = temp_angle;
-   item->value = _eext_circle_object_item_angle_value_get(item, item->angle);
-
-   return EINA_TRUE;
-}
-
-static Eina_Bool
-_eext_circle_object_item_angle_offset_set_internal(Eext_Circle_Object_Item *item, double angle_offset)
-{
-   if (item->angle_offset == angle_offset) return EINA_FALSE;
-
-   item->angle_offset = angle_offset;
-
-   return EINA_TRUE;
-}
-
-static Eina_Bool
-_eext_circle_object_item_value_set_internal(Eext_Circle_Object_Item *item, double value)
-{
-   double angle;
-
-   if (item->value == value) return EINA_FALSE;
-
-   item->value = value;
-
-   if (item->value < item->min_value) item->value = item->min_value;
-   if (item->value > item->max_value) item->value = item->max_value;
-
-   angle = _eext_circle_object_item_value_angle_get(item, item->value);
-
-   if (item->angle == angle) return EINA_FALSE;
-
-   item->angle = angle;
-
-   return EINA_TRUE;
-}
-
-static Eina_Bool
-_eext_circle_object_item_color_set_internal(Eext_Circle_Object_Item *item,
-                                            int r, int g, int b, int a)
-{
-   if (r > 255) r = 255; if (r < 0) r = 0;
-   if (g > 255) g = 255; if (g < 0) g = 0;
-   if (b > 255) b = 255; if (b < 0) b = 0;
-   if (a > 255) a = 255; if (a < 0) a = 0;
-
-   if ((item->color.r == r) && (item->color.g == g) && (item->color.b == b) && (item->color.a == a))
-     return EINA_FALSE;
-
-   item->color.r = r;
-   item->color.g = g;
-   item->color.b = b;
-   item->color.a = a;
-
-   return EINA_TRUE;
-}
-
-static void
-_eext_circle_object_item_color_transit_animator_del(Eext_Circle_Object_Item *item)
-{
-   if (!item) return;
-
-   if (item->color_transit.animator_cb)
-     ecore_animator_del(item->color_transit.animator_cb);
-
-   item->color_transit.animator_cb = NULL;
-}
-
-static void
-_eext_circle_object_item_angle_transit_animator_del(Eext_Circle_Object_Item *item)
-{
-   if (!item) return;
-
-   if (item->angle_transit.animator_cb)
-     ecore_animator_del(item->angle_transit.animator_cb);
-
-   item->angle_transit.animator_cb = NULL;
-}
-
-static Eina_Bool
-_eext_circle_object_item_angle_transit_set_internal(Eext_Circle_Object_Item *item, double duration,
-                                                    double to_angle, double to_angle_offset,
-                                                    Eina_Bool cubic_bezier_enabled,
-                                                    double cubic_bezier_p1_x, double cubic_bezier_p1_y,
-                                                    double cubic_bezier_p2_x, double cubic_bezier_p2_y)
-{
-   if (duration == 0.0) return EINA_FALSE;
-   if ((item->angle_transit.duration == duration) &&
-       (item->angle == to_angle) &&
-       (item->angle_offset == to_angle_offset))
-     return EINA_FALSE;
-
-   if (item->angle_transit.animator_cb)
-     {
-        _eext_circle_object_item_angle_transit_animator_del(item);
-
-        // If previous animator is never excuted, run animator callback manually once.
-        if (item->angle_transit.current_animator_pos == 0.0)
-          {
-             double current_time = ecore_time_unix_get();
-
-             if (item->angle_transit.start_time != current_time)
-               {
-                  double pos = (current_time - item->angle_transit.start_time) /
-                     item->angle_transit.duration;
-
-                  _eext_circle_object_item_angle_transit_animator_cb(item, pos);
-               }
-          }
-     }
-
-   _eext_circle_object_item_angle_set_internal(item, to_angle);
-   _eext_circle_object_item_angle_offset_set_internal(item, to_angle_offset);
-
-   item->angle_transit.start_time = ecore_time_unix_get();
-   item->angle_transit.current_animator_pos = 0.0;
-   item->angle_transit.duration = duration;
-   item->angle_transit.from_angle = item->draw.angle;
-   item->angle_transit.from_angle_offset = item->draw.angle_offset;
-   item->angle_transit.cubic_bezier_enabled = cubic_bezier_enabled;
-
-   if (cubic_bezier_enabled)
-     {
-        item->angle_transit.cubic_bezier_v[0] = cubic_bezier_p1_x;
-        item->angle_transit.cubic_bezier_v[1] = cubic_bezier_p1_y;
-        item->angle_transit.cubic_bezier_v[2] = cubic_bezier_p2_x;
-        item->angle_transit.cubic_bezier_v[3] = cubic_bezier_p2_y;
-     }
-
-   item->angle_transit.animator_cb = ecore_animator_timeline_add(duration,
-                                                                 _eext_circle_object_item_angle_transit_animator_cb,
-                                                                 item);
-
-   return EINA_TRUE;
-}
-
-//////////////////////////////
-// Internal API //////////////
-//////////////////////////////
-double
-_eext_circle_object_item_value_angle_get(const Eext_Circle_Object_Item *item, double value)
-{
-   double angle;
-
-   angle = item->min_angle;
-   if (item->max_value != item->min_value)
-     angle += (value - item->min_value) * (item->max_angle - item->min_angle) / (item->max_value - item->min_value);
-
-   if (angle < item->min_angle) angle = item->min_angle;
-   if (angle > item->max_angle) angle = item->max_angle;
-
-   return angle;
-}
-
-double
-_eext_circle_object_item_angle_value_get(const Eext_Circle_Object_Item *item, double angle)
-{
-   double value;
-
-   value = item->min_value;
-   if (item->max_angle != item->min_angle)
-     value += (angle - item->min_angle) * (item->max_value - item->min_value) / (item->max_angle - item->min_angle);
-
-   if (value < item->min_value) value = item->min_value;
-   if (value > item->max_value) value = item->max_value;
-
-   return value;
-}
-
-const char *
-_eext_circle_text_font_get(const char *text, const char *font_family)
-{
-   FcFontSet *set = NULL;
-   FcPattern *p_nm = NULL;
-   FcCharSet *c_set = NULL;
-   FcValue family;
-   FcResult result;
-   Eina_Unicode u_str;
-   int u_str_index = 0;
-
-   if (!text || !font_family)
-     return NULL;
-
-   // Going to use first character.
-   u_str = eina_unicode_utf8_next_get(text, &u_str_index);
-
-   // Query font using FontConfig.
-   c_set = FcCharSetCreate();
-   p_nm = FcPatternBuild (NULL,
-                          FC_WEIGHT, FcTypeInteger, FC_WEIGHT_NORMAL,
-                          FC_SLANT,  FcTypeInteger, FC_SLANT_ROMAN,
-                          FC_WIDTH,  FcTypeInteger, FC_WIDTH_NORMAL,
-                          NULL);
-
-   FcCharSetAddChar(c_set, (FcChar32)u_str);
-   FcPatternAddCharSet(p_nm, FC_CHARSET, c_set);
-   FcPatternAddString(p_nm, FC_FAMILY, (FcChar8 *)font_family);
-   FcConfigSubstitute(NULL, p_nm, FcMatchPattern);
-   FcDefaultSubstitute(p_nm);
-   set = FcFontSort(NULL, p_nm, FcTrue, NULL, &result);
-
-   FcCharSetDestroy(c_set);
-   FcPatternDestroy(p_nm);
-
-   result = FcPatternGet(set->fonts[0], FC_FAMILY, 0, &family);
-   FcFontSetSortDestroy(set);
-
-   if (result == FcResultNoMatch)
-     {
-        ERR("Fail to Load Family Name to draw %s [%X]", text, u_str);
-        return NULL;
-     }
-
-   return (const char *)family.u.s;
-}
-
-Eext_Circle_Object_Item *
-_eext_circle_object_item_new(void)
-{
-   Eext_Circle_Object_Item *item;
-
-   item = (Eext_Circle_Object_Item *)calloc(1, sizeof(Eext_Circle_Object_Item));
-
-   // Initialize...
-   item->name = eina_stringshare_add("default");
-   item->angle = item->draw.angle = 0.0;
-   item->angle_offset = item->draw.angle_offset = 0.0;
-   item->min_angle = 0;
-   item->max_angle = 360;
-   item->min_value = 0;
-   item->max_value = 360;
-   item->radius = 176;
-   item->line_width = 8;
-   item->color.r = item->draw.color.r = 102;
-   item->color.g = item->draw.color.g = 179;
-   item->color.b = item->draw.color.b = 230;
-   item->color.a = item->draw.color.a = 255;
-
-   return item;
-}
-
-void
-_eext_circle_object_item_free(Eext_Circle_Object_Item *item)
-{
-   if (!item) return;
-
-   eina_stringshare_del(item->name);
-
-   if (item->color_transit.animator_cb)
-     _eext_circle_object_item_color_transit_animator_del(item);
-
-   if (item->angle_transit.animator_cb)
-     _eext_circle_object_item_angle_transit_animator_del(item);
-
-   if (item->obj)
-     _eext_circle_object_item_remove(item);
-
-   free(item);
-}
-
-void
-_eext_circle_object_item_append(Eext_Circle_Object *obj, Eext_Circle_Object_Item *item)
-{
-   if (!obj || !item) return;
-
-   if (obj == item->obj)
-     {
-        ERR("You are trying to append the item that is already appended");
-        return;
-     }
-
-   if (item->obj)
-     {
-        ERR("You are trying to append the item that is already appended to the other object!");
-        return;
-     }
-
-   obj->items = eina_list_append(obj->items, item);
-   item->obj = obj;
-
-   _eext_circle_object_changed(item->obj);
-}
-
-void
-_eext_circle_object_item_prepend(Eext_Circle_Object *obj, Eext_Circle_Object_Item *item)
-{
-   if (!obj || !item) return;
-
-   if (obj == item->obj)
-     {
-        ERR("You are trying to append the item that is already appended");
-        return;
-     }
-
-   if (item->obj)
-     {
-        ERR("You are trying to append the item that is already appended to the other object!");
-        return;
-     }
-
-   obj->items = eina_list_prepend(obj->items, item);
-   item->obj = obj;
-
-   _eext_circle_object_changed(item->obj);
-}
-
-void
-_eext_circle_object_item_insert_before(Eext_Circle_Object *obj, Eext_Circle_Object *before, Eext_Circle_Object_Item *item)
-{
-   if (!obj || !item) return;
-
-   if (obj == item->obj)
-     {
-        ERR("You are trying to append the item that is already appended");
-        return;
-     }
-
-   if (item->obj)
-     {
-        ERR("You are trying to append the item that is already appended to the other object!");
-        return;
-     }
-
-   if (!before) _eext_circle_object_item_prepend(obj, item);
-
-   obj->items = eina_list_prepend_relative(obj->items, item, before);
-   item->obj = obj;
-
-   _eext_circle_object_changed(item->obj);
-}
-
-void
-_eext_circle_object_item_insert_after(Eext_Circle_Object *obj, Eext_Circle_Object *after, Eext_Circle_Object_Item *item)
-{
-   if (!obj || !item) return;
-
-   if (obj == item->obj)
-     {
-        ERR("You are trying to append the item that is already appended");
-        return;
-     }
-
-   if (item->obj)
-     {
-        ERR("You are trying to append the item that is already appended to the other object!");
-        return;
-     }
-
-   if (!after) _eext_circle_object_item_append(obj, item);
-
-   obj->items = eina_list_append_relative(obj->items, item, after);
-   item->obj = obj;
-
-   _eext_circle_object_changed(item->obj);
-}
-
-void
-_eext_circle_object_item_remove(Eext_Circle_Object_Item *item)
-{
-   if (!item || !item->obj) return;
-
-   // You must have to free this item.
-   item->obj->items = eina_list_remove(item->obj->items, item);
-
-   _eext_circle_object_changed(item->obj);
-   item->obj = NULL;
-}
-
-void
-_eext_circle_object_item_name_set(Eext_Circle_Object_Item *item, const char *name)
-{
-   if (!item) return;
-
-   if (name)
-     eina_stringshare_replace(&item->name, name);
-   else
-     eina_stringshare_replace(&item->name, "default");
-}
-
-const char *
-_eext_circle_object_item_name_get(const Eext_Circle_Object_Item *item)
-{
-   if (!item) return NULL;
-
-   return item->name;
-}
-
-void
-_eext_circle_object_item_line_width_set(Eext_Circle_Object_Item *item, int line_width)
-{
-   if (!item) return;
-
-   if ((line_width <= 0) || (item->line_width == line_width)) return;
-
-   item->line_width = line_width;
-
-   _eext_circle_object_changed(item->obj);
-}
-
-int
-_eext_circle_object_item_line_width_get(const Eext_Circle_Object_Item *item)
-{
-   if (!item) return -1;
-
-   return item->line_width;
-}
-
-void
-_eext_circle_object_item_angle_set(Eext_Circle_Object_Item *item, double angle)
-{
-   if (!item) return;
-
-   if (item->angle_transit.animator_cb)
-     {
-        _eext_circle_object_item_angle_transit_animator_del(item);
-        item->draw.angle = item->angle;
-        _eext_circle_object_changed(item->obj);
-     }
-
-   if (_eext_circle_object_item_angle_set_internal(item, angle))
-     {
-        item->draw.angle = item->angle;
-        _eext_circle_object_changed(item->obj);
-     }
-}
-
-double
-_eext_circle_object_item_angle_get(const Eext_Circle_Object_Item *item)
-{
-   if (!item) return -1.0;
-
-   return item->angle;
-}
-
-void
-_eext_circle_object_item_angle_offset_set(Eext_Circle_Object_Item *item, double angle_offset)
-{
-   if (!item) return;
-
-   if (_eext_circle_object_item_angle_offset_set_internal(item, angle_offset))
-     {
-        item->draw.angle_offset = item->angle_offset;
-        _eext_circle_object_changed(item->obj);
-     }
-}
-
-double
-_eext_circle_object_item_angle_offset_get(const Eext_Circle_Object_Item *item)
-{
-   if (!item) return -1.0;
-
-   return item->angle_offset;
-}
-
-void
-_eext_circle_object_item_angle_min_max_set(Eext_Circle_Object_Item *item, double min_angle, double max_angle)
-{
-   double angle = 0.0;
-
-   if (!item) return;
-
-   if (item->angle_transit.animator_cb)
-     {
-        _eext_circle_object_item_angle_transit_animator_del(item);
-        item->draw.angle = item->angle;
-        _eext_circle_object_changed(item->obj);
-     }
-
-   if ((item->min_angle == min_angle) && (item->max_angle == max_angle)) return;
-
-   item->min_angle = min_angle;
-   item->max_angle = max_angle;
-
-   if (item->angle < item->min_angle) angle = item->min_angle;
-   if (item->angle > item->max_angle) angle = item->max_angle;
-
-   if (item->angle == angle) return;
-
-   item->angle = angle;
-   item->value = _eext_circle_object_item_angle_value_get(item, item->angle);
-   item->draw.angle = item->angle;
-
-   _eext_circle_object_changed(item->obj);
-}
-
-void
-_eext_circle_object_item_angle_min_max_get(const Eext_Circle_Object_Item *item, double *min_angle, double *max_angle)
-{
-   if (!item)
-     {
-        if (min_angle) *min_angle = 0.0;
-        if (max_angle) *max_angle = 0.0;
-
-        return;
-     }
-
-   if (min_angle) *min_angle = item->min_angle;
-   if (max_angle) *max_angle = item->max_angle;
-}
-
-void
-_eext_circle_object_item_value_min_max_set(Eext_Circle_Object_Item *item, double min_value, double max_value)
-{
-   double angle;
-
-   if (!item) return;
-
-   if (item->angle_transit.animator_cb)
-     {
-        _eext_circle_object_item_angle_transit_animator_del(item);
-        item->draw.angle = item->angle;
-        _eext_circle_object_changed(item->obj);
-     }
-
-   if ((item->min_value == min_value) && (item->max_value == max_value)) return;
-
-   item->min_value = min_value;
-   item->max_value = max_value;
-
-   if (item->value < item->min_value) item->value = item->min_value;
-   if (item->value > item->max_value) item->value = item->max_value;
-
-   angle = _eext_circle_object_item_value_angle_get(item, item->value);
-
-   if (item->angle == angle) return;
-
-   item->angle = angle;
-   item->draw.angle = item->angle;
-
-   _eext_circle_object_changed(item->obj);
-}
-
-void
-_eext_circle_object_item_value_min_max_get(const Eext_Circle_Object_Item *item, double *min_value, double *max_value)
-{
-   if (!item)
-     {
-        if (min_value) *min_value = 0.0;
-        if (max_value) *max_value = 0.0;
-
-        return;
-     }
-
-   if (min_value) *min_value = item->min_value;
-   if (max_value) *max_value = item->max_value;
-}
-
-void
-_eext_circle_object_item_value_set(Eext_Circle_Object_Item *item, double value)
-{
-   if (!item) return;
-
-   if (item->angle_transit.animator_cb)
-     {
-        _eext_circle_object_item_angle_transit_animator_del(item);
-        item->draw.angle = item->angle;
-        _eext_circle_object_changed(item->obj);
-     }
-
-   if (_eext_circle_object_item_value_set_internal(item, value))
-     {
-        item->draw.angle = item->angle;
-        _eext_circle_object_changed(item->obj);
-     }
-}
-
-double
-_eext_circle_object_item_value_get(const Eext_Circle_Object_Item *item)
-{
-   if (!item) return -1.0;
-
-   return item->value;
-}
-
-void
-_eext_circle_object_item_color_set(Eext_Circle_Object_Item *item,
-                                   int r, int g, int b, int a)
-{
-   if (!item) return;
-
-   if (item->color_transit.animator_cb)
-     {
-        _eext_circle_object_item_color_transit_animator_del(item);
-        item->draw.color.r = item->color.r;
-        item->draw.color.g = item->color.g;
-        item->draw.color.b = item->color.b;
-        item->draw.color.a = item->color.a;
-
-        _eext_circle_object_changed(item->obj);
-     }
-
-   if (_eext_circle_object_item_color_set_internal(item, r, g, b, a))
-     {
-        item->draw.color.r = item->color.r;
-        item->draw.color.g = item->color.g;
-        item->draw.color.b = item->color.b;
-        item->draw.color.a = item->color.a;
-
-        _eext_circle_object_changed(item->obj);
-     }
-}
-
-void
-_eext_circle_object_item_color_get(const Eext_Circle_Object_Item *item,
-                                   int *r, int *g, int *b, int *a)
-{
-   if (!item)
-     {
-        if (r) *r = 0;
-        if (g) *g = 0;
-        if (b) *b = 0;
-        if (a) *a = 0;
-
-        return;
-     }
-
-   if (r) *r = item->color.r;
-   if (g) *g = item->color.g;
-   if (b) *b = item->color.b;
-   if (a) *a = item->color.a;
-}
-
-void
-_eext_circle_object_item_radius_set(Eext_Circle_Object_Item *item, double radius)
-{
-   if (!item) return;
-
-   if (radius < 0.0) radius = 0.0; if (radius > 180.0) radius = 180.0;
-
-   if (item->radius == radius) return;
-
-   item->radius = radius;
-
-   _eext_circle_object_changed(item->obj);
-}
-
-double
-_eext_circle_object_item_radius_get(const Eext_Circle_Object_Item *item)
-{
-   if (!item) return -1.0;
-
-   return item->radius;
-}
-
-void
-_eext_circle_object_item_text_set(Eext_Circle_Object_Item *item,
-                                  const char *text,
-                                  const char *font)
-{
-   const char *selected_font;
-
-   if (!item) return;
-
-   if (font)
-     eina_stringshare_replace(&item->font, font);
-   else
-     eina_stringshare_replace(&item->font, "Tizen");
-
-   eina_stringshare_replace(&item->text, text);
-
-   selected_font = _eext_circle_text_font_get(item->text, item->font);
-
-   if (!selected_font)
-     {
-        ERR("There is no font for the text: %s", text);
-     }
-
-   eina_stringshare_replace(&item->selected_font, selected_font);
-
-   _eext_circle_object_changed(item->obj);
-}
-
-void
-_eext_circle_object_item_text_get(const Eext_Circle_Object_Item *item,
-                                  const char **text,
-                                  const char **font)
-{
-   if (!item)
-     {
-        if (text) *text = NULL;
-        if (font) *font = NULL;
-
-        return;
-     }
-
-   if (text) *text = item->text;
-   if (font) *font = item->font;
-}
-
-void
-_eext_circle_object_item_font_size_set(Eext_Circle_Object_Item *item,
-                                       int font_size)
-{
-   if (!item) return;
-
-   if (item->font_size == font_size) return;
-
-   item->font_size = font_size;
-
-   _eext_circle_object_changed(item->obj);
-}
-
-int
-_eext_circle_object_item_font_size_get(const Eext_Circle_Object_Item *item)
-{
-   if (!item) return -1;
-
-   return item->font_size;
-}
-
-void
-_eext_circle_object_item_color_transit_set(Eext_Circle_Object_Item *item, double duration,
-                                           int to_r, int to_g, int to_b, int to_a,
-                                           Eina_Bool cubic_bezier_enabled,
-                                           double cubic_bezier_p1_x, double cubic_bezier_p1_y,
-                                           double cubic_bezier_p2_x, double cubic_bezier_p2_y)
-{
-   if (!item) return;
-
-   if (duration == 0.0) return;
-   if ((item->color_transit.duration == duration) &&
-       (item->color.r == to_r) && (item->color.g == to_g) && (item->color.b == to_b) && (item->color.a == to_a))
-     return;
-
-   if (item->color_transit.animator_cb)
-     {
-        _eext_circle_object_item_color_transit_animator_del(item);
-
-        if (item->color_transit.current_animator_pos == 0.0)
-          {
-             double current_time = ecore_time_unix_get();
-
-             if (item->color_transit.start_time != current_time)
-               {
-                  double pos = (current_time - item->color_transit.start_time) /
-                     item->color_transit.duration;
-
-                  _eext_circle_object_item_color_transit_animator_cb(item, pos);
-               }
-          }
-     }
-
-   _eext_circle_object_item_color_set_internal(item, to_r, to_g, to_b, to_a);
-
-   item->color_transit.start_time = ecore_time_unix_get();
-   item->color_transit.current_animator_pos = 0.0;
-   item->color_transit.duration = duration;
-   item->color_transit.from_color.r = item->draw.color.r;
-   item->color_transit.from_color.g = item->draw.color.g;
-   item->color_transit.from_color.b = item->draw.color.b;
-   item->color_transit.from_color.a = item->draw.color.a;
-   item->color_transit.cubic_bezier_enabled = cubic_bezier_enabled;
-
-   if (cubic_bezier_enabled)
-     {
-        item->color_transit.cubic_bezier_v[0] = cubic_bezier_p1_x;
-        item->color_transit.cubic_bezier_v[1] = cubic_bezier_p1_y;
-        item->color_transit.cubic_bezier_v[2] = cubic_bezier_p2_x;
-        item->color_transit.cubic_bezier_v[3] = cubic_bezier_p2_y;
-     }
-
-   item->color_transit.animator_cb = ecore_animator_timeline_add(duration,
-                                                                 _eext_circle_object_item_color_transit_animator_cb,
-                                                                 item);
-}
-
-
-void
-_eext_circle_object_item_angle_transit_set(Eext_Circle_Object_Item *item, double duration,
-                                           double to_angle, double to_angle_offset,
-                                           Eina_Bool cubic_bezier_enabled,
-                                           double cubic_bezier_p1_x, double cubic_bezier_p1_y,
-                                           double cubic_bezier_p2_x, double cubic_bezier_p2_y)
-{
-   Eina_Bool ret;
-
-   if (!item) return;
-
-   ret = _eext_circle_object_item_angle_transit_set_internal(item, duration,
-                                                             to_angle, to_angle_offset,
-                                                             cubic_bezier_enabled,
-                                                             cubic_bezier_p1_x, cubic_bezier_p1_y,
-                                                             cubic_bezier_p2_x, cubic_bezier_p2_y);
-
-   if (ret)
-     item->value = _eext_circle_object_item_angle_value_get(item, item->angle);
-}
-
-void
-_eext_circle_object_item_value_transit_set(Eext_Circle_Object_Item *item, double duration,
-                                           double to_value,
-                                           Eina_Bool cubic_bezier_enabled,
-                                           double cubic_bezier_p1_x, double cubic_bezier_p1_y,
-                                           double cubic_bezier_p2_x, double cubic_bezier_p2_y)
-{
-   Eina_Bool ret;
-   double to_angle, to_angle_offset;
-
-   if (!item) return;
-
-   to_angle = _eext_circle_object_item_value_angle_get(item, to_value);
-   to_angle_offset = item->angle_offset;
-
-   ret = _eext_circle_object_item_angle_transit_set_internal(item, duration,
-                                                             to_angle, to_angle_offset,
-                                                             cubic_bezier_enabled,
-                                                             cubic_bezier_p1_x, cubic_bezier_p1_y,
-                                                             cubic_bezier_p2_x, cubic_bezier_p2_y);
-
-   if (ret)
-     item->value = to_value;
-}
-
-void
-_eext_circle_object_item_round_cap_enable_set(Eext_Circle_Object_Item *item, Eina_Bool enable)
-{
-   if (!item) return;
-
-   if (item->round_cap == enable) return;
-
-   item->round_cap = enable;
-
-   _eext_circle_object_changed(item->obj);
-}
-
-Eina_Bool
-_eext_circle_object_item_round_cap_enable_get(const Eext_Circle_Object_Item *item)
-{
-   if (!item) return -1;
-
-   return item->round_cap;
-}
diff --git a/wearable/src/lib/circle/efl_extension_circle_object_progressbar.c b/wearable/src/lib/circle/efl_extension_circle_object_progressbar.c
deleted file mode 100644 (file)
index ec85a99..0000000
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "efl_extension.h"
-#include "efl_extension_private.h"
-#include "circle/efl_extension_circle_private.h"
-
-#define EEXT_CIRCLE_OBJECT_PROGRESSBAR_TYPE "Eext_Circle_Progressbar"
-
-#define EEXT_CIRCLE_OBJECT_PROGRESSBAR_DATA_GET(circle_obj, data) \
-      Eext_Circle_Object_Progressbar_Data *data = NULL; \
-   if (circle_obj && circle_obj->widget_data && \
-              circle_obj->widget_type && !strcmp(circle_obj->widget_type, EEXT_CIRCLE_OBJECT_PROGRESSBAR_TYPE)) \
-      data = (Eext_Circle_Object_Progressbar_Data *)circle_obj->widget_data; \
-   if (!data)
-
-#define PROGRESSBAR_ITEM_NAME "default"
-#define PROGRESSBAR_BG_ITEM_NAME "bg"
-
-#define PROGRESSBAR_COLOR_R 77
-#define PROGRESSBAR_COLOR_G 207
-#define PROGRESSBAR_COLOR_B 255
-#define PROGRESSBAR_COLOR_A 255
-
-#define PROGRESSBAR_BG_COLOR_R 0
-#define PROGRESSBAR_BG_COLOR_G 67
-#define PROGRESSBAR_BG_COLOR_B 115
-#define PROGRESSBAR_BG_COLOR_A 255
-
-#define PROGRESSBAR_COLOR_DISABLED_R 77
-#define PROGRESSBAR_COLOR_DISABLED_G 207
-#define PROGRESSBAR_COLOR_DISABLED_B 255
-#define PROGRESSBAR_COLOR_DISABLED_A 153
-
-#define PROGRESSBAR_BG_COLOR_DISABLED_R 64
-#define PROGRESSBAR_BG_COLOR_DISABLED_G 64
-#define PROGRESSBAR_BG_COLOR_DISABLED_B 64
-#define PROGRESSBAR_BG_COLOR_DISABLED_A 255
-
-#define PROGRESSBAR_WIDTH_SIZE 8
-#define PROGRESSBAR_RADIUS_SIZE 176
-
-static void
-_eext_circle_object_progressbar_del_cb(Eext_Circle_Object *obj)
-{
-   if (obj->widget_data)
-     {
-        free(obj->widget_data);
-        obj->widget_data = NULL;
-     }
-}
-
-static void
-_eext_circle_object_progressbar_color_changed_cb(Eext_Circle_Object *obj, const char *item_name)
-{
-   Eext_Circle_Object_Item *item;
-   int r, g, b, a;
-
-   EEXT_CIRCLE_OBJECT_PROGRESSBAR_DATA_GET(obj, widget_data) return;
-
-   item = _eext_circle_object_item_get(obj, item_name);
-   if (!item) return;
-
-   _eext_circle_object_item_color_get(item, &r, &g, &b, &a);
-
-   if (!strcmp(item_name, PROGRESSBAR_ITEM_NAME))
-     {
-        widget_data->color.r = r;
-        widget_data->color.g = g;
-        widget_data->color.b = b;
-        widget_data->color.a = a;
-
-        return;
-     }
-
-   if (!strcmp(item_name, PROGRESSBAR_BG_ITEM_NAME))
-     {
-        widget_data->bg_color.r = r;
-        widget_data->bg_color.g = g;
-        widget_data->bg_color.b = b;
-        widget_data->bg_color.a = a;
-
-        return;
-     }
-}
-
-static void
-_eext_circle_object_progressbar_disabled_cb(Eext_Circle_Object *obj)
-{
-   Eext_Circle_Object_Item *item, *bg_item;
-
-   EEXT_CIRCLE_OBJECT_PROGRESSBAR_DATA_GET(obj, data) return;
-
-   item = _eext_circle_object_item_get(obj, PROGRESSBAR_ITEM_NAME);
-   bg_item = _eext_circle_object_item_get(obj, PROGRESSBAR_BG_ITEM_NAME);
-
-   if (obj->disabled)
-     {
-        if (item)
-          _eext_circle_object_item_color_set(item,
-                                             data->disabled_color.r,
-                                             data->disabled_color.g,
-                                             data->disabled_color.b,
-                                             data->disabled_color.a);
-        if (bg_item)
-          _eext_circle_object_item_color_set(bg_item,
-                                             data->disabled_bg_color.r,
-                                             data->disabled_bg_color.g,
-                                             data->disabled_bg_color.b,
-                                             data->disabled_bg_color.a);
-     }
-   else
-     {
-        if (item)
-          _eext_circle_object_item_color_set(item,
-                                             data->color.r,
-                                             data->color.g,
-                                             data->color.b,
-                                             data->color.a);
-        if (bg_item)
-          _eext_circle_object_item_color_set(bg_item,
-                                             data->bg_color.r,
-                                             data->bg_color.g,
-                                             data->bg_color.b,
-                                             data->bg_color.a);
-     }
-}
-
-static void
-_eext_circle_object_progressbar_init(Eext_Circle_Object *obj)
-{
-   Eext_Circle_Object_Item *item;
-   Eext_Circle_Object_Progressbar_Data *data;
-
-   obj->widget_object = NULL;
-   obj->widget_type = EEXT_CIRCLE_OBJECT_PROGRESSBAR_TYPE;
-   obj->del_func = _eext_circle_object_progressbar_del_cb;
-   obj->disabled_func = _eext_circle_object_progressbar_disabled_cb;
-   obj->color_changed_func = _eext_circle_object_progressbar_color_changed_cb;
-
-   data = (Eext_Circle_Object_Progressbar_Data *)calloc(1, sizeof(Eext_Circle_Object_Progressbar_Data));
-   data->color.r = PROGRESSBAR_COLOR_R;
-   data->color.g = PROGRESSBAR_COLOR_G;
-   data->color.b = PROGRESSBAR_COLOR_B;
-   data->color.a = PROGRESSBAR_COLOR_A;
-   data->bg_color.r = PROGRESSBAR_BG_COLOR_R;
-   data->bg_color.g = PROGRESSBAR_BG_COLOR_G;
-   data->bg_color.b = PROGRESSBAR_BG_COLOR_B;
-   data->bg_color.a = PROGRESSBAR_BG_COLOR_A;
-   data->disabled_color.r = PROGRESSBAR_COLOR_DISABLED_R;
-   data->disabled_color.g = PROGRESSBAR_COLOR_DISABLED_G;
-   data->disabled_color.b = PROGRESSBAR_COLOR_DISABLED_B;
-   data->disabled_color.a = PROGRESSBAR_COLOR_DISABLED_A;
-   data->disabled_bg_color.r = PROGRESSBAR_BG_COLOR_DISABLED_R;
-   data->disabled_bg_color.g = PROGRESSBAR_BG_COLOR_DISABLED_G;
-   data->disabled_bg_color.b = PROGRESSBAR_BG_COLOR_DISABLED_B;
-   data->disabled_bg_color.a = PROGRESSBAR_BG_COLOR_DISABLED_A;
-   obj->widget_data = (void *)data;
-
-   item = _eext_circle_object_item_new();
-   _eext_circle_object_item_name_set(item, PROGRESSBAR_BG_ITEM_NAME);
-   _eext_circle_object_item_color_set(item, data->bg_color.r, data->bg_color.g, data->bg_color.b, data->bg_color.a);
-   _eext_circle_object_item_radius_set(item, PROGRESSBAR_RADIUS_SIZE);
-   _eext_circle_object_item_line_width_set(item, PROGRESSBAR_WIDTH_SIZE);
-   _eext_circle_object_item_angle_set(item, 360);
-   _eext_circle_object_item_append(obj, item);
-
-   item = _eext_circle_object_item_new();
-   _eext_circle_object_item_name_set(item, PROGRESSBAR_ITEM_NAME);
-   _eext_circle_object_item_color_set(item, data->color.r, data->color.g, data->color.b, data->color.a);
-   _eext_circle_object_item_radius_set(item, PROGRESSBAR_RADIUS_SIZE);
-   _eext_circle_object_item_line_width_set(item, PROGRESSBAR_WIDTH_SIZE);
-   _eext_circle_object_item_append(obj, item);
-}
-
-static char *
-_accessible_name_cb(void *data, Evas_Object *obj)
-{
-   Evas_Object *progressbar;
-   double value;
-   char ret[255];
-
-   progressbar = data;
-   value = eext_circle_object_value_get(progressbar);
-
-   snprintf(ret, sizeof(ret), "%d Percent", (int)value);
-   return strdup(ret);
-}
-
-EAPI Evas_Object *
-eext_circle_object_progressbar_add(Evas_Object *parent, Eext_Circle_Surface *surface)
-{
-   Evas_Object *obj;
-
-   if (!parent) return NULL;
-
-   obj = elm_image_add(parent);
-   _eext_circle_object_init(obj, NULL, surface);
-
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
-
-   _eext_circle_object_progressbar_init(circle_obj);
-
-   /* Accessibility */
-   if (!surface)
-     {
-        elm_atspi_accessible_role_set(obj, ELM_ATSPI_ROLE_PROGRESS_BAR);
-        elm_atspi_accessible_name_cb_set(obj, _accessible_name_cb, obj);
-     }
-   else
-     {
-        elm_atspi_accessible_role_set(parent, ELM_ATSPI_ROLE_PROGRESS_BAR);
-        elm_atspi_accessible_name_cb_set(parent, _accessible_name_cb, obj);
-     }
-
-   return obj;
-}
diff --git a/wearable/src/lib/circle/efl_extension_circle_object_scroller.c b/wearable/src/lib/circle/efl_extension_circle_object_scroller.c
deleted file mode 100644 (file)
index 78228b7..0000000
+++ /dev/null
@@ -1,703 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "efl_extension.h"
-#include "efl_extension_private.h"
-#include "circle/efl_extension_circle_private.h"
-
-#define EEXT_CIRCLE_OBJECT_SCROLLER_TYPE "Eext_Circle_Object_Scroller"
-
-#define VERTICAL_BAR_NAME "default"
-#define VERTICAL_BAR_BG_NAME "vertical,scroll,bg"
-#define VERTICAL_BAR_ANGLE_START 60.0
-#define VERTICAL_BAR_ANGLE_RANGE 60.0
-#define VERTICAL_BAR_ANGLE_MAX_SIZE 60.0
-#define VERTICAL_BAR_ANGLE_MIN_SIZE 6.0
-
-#define HORIZONTAL_BAR_NAME "horizontal,scroll,bar"
-#define HORIZONTAL_BAR_BG_NAME "horizontal,scroll,bg"
-#define HORIZONTAL_BAR_ANGLE_START -30.0
-#define HORIZONTAL_BAR_ANGLE_RANGE 60.0
-#define HORIZONTAL_BAR_ANGLE_MAX_SIZE 60.0
-#define HORIZONTAL_BAR_ANGLE_MIN_SIZE 6.0
-
-#define SCROLL_BAR_TRANSIT_TIME 0.2
-#define SCROLL_BAR_HIDE_WAITTING_TIME 10.2
-#define SCROLL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING 1.0
-#define SCROLL_BAR_WIDTH_SIZE 10
-#define SCROLL_BAR_RADIUS_SIZE 174 // (180 - (BAR_WIDTH / 2) - 1)
-
-#define SCROLL_BAR_COLOR_R 14
-#define SCROLL_BAR_COLOR_G 137
-#define SCROLL_BAR_COLOR_B 181
-#define SCROLL_BAR_COLOR_A 255
-
-#define SCROLL_BAR_BG_COLOR_R 250
-#define SCROLL_BAR_BG_COLOR_G 250
-#define SCROLL_BAR_BG_COLOR_B 250
-#define SCROLL_BAR_BG_COLOR_A 38
-
-#define SCROLL_BAR_COLOR_DISABLED_R 45
-#define SCROLL_BAR_COLOR_DISABLED_G 45
-#define SCROLL_BAR_COLOR_DISABLED_B 45
-#define SCROLL_BAR_COLOR_DISABLED_A 255
-
-#define SCROLL_BAR_BG_COLOR_DISABLED_R 45
-#define SCROLL_BAR_BG_COLOR_DISABLED_G 45
-#define SCROLL_BAR_BG_COLOR_DISABLED_B 45
-#define SCROLL_BAR_BG_COLOR_DISABLED_A 63
-
-#define EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, data) \
-   Eext_Circle_Object_Scroller_Data *data = NULL; \
-   if (circle_obj && circle_obj->widget_data && \
-       circle_obj->widget_type && !strcmp(circle_obj->widget_type, EEXT_CIRCLE_OBJECT_SCROLLER_TYPE)) \
-      data = (Eext_Circle_Object_Scroller_Data *)circle_obj->widget_data; \
-   if (!data)
-
-static void
-_eext_circle_object_scroller_color_changed_cb(Eext_Circle_Object *obj, const char *item_name)
-{
-   Eext_Circle_Object_Item *item;
-   int r, g, b, a;
-
-   EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(obj, widget_data) return;
-
-   item = _eext_circle_object_item_get(obj, item_name);
-   if (!item) return;
-
-   _eext_circle_object_item_color_get(item, &r, &g, &b, &a);
-
-   if (!strcmp(item_name, VERTICAL_BAR_NAME))
-     {
-        widget_data->vertical_color.r = r;
-        widget_data->vertical_color.g = g;
-        widget_data->vertical_color.b = b;
-        widget_data->vertical_color.a = a;
-
-        return;
-     }
-
-   if (!strcmp(item_name, VERTICAL_BAR_BG_NAME))
-     {
-        widget_data->vertical_bg_color.r = r;
-        widget_data->vertical_bg_color.g = g;
-        widget_data->vertical_bg_color.b = b;
-        widget_data->vertical_bg_color.a = a;
-
-        return;
-     }
-
-   if (!strcmp(item_name, HORIZONTAL_BAR_NAME))
-     {
-        widget_data->horizontal_color.r = r;
-        widget_data->horizontal_color.g = g;
-        widget_data->horizontal_color.b = b;
-        widget_data->horizontal_color.a = a;
-
-        return;
-     }
-
-   if (!strcmp(item_name, HORIZONTAL_BAR_BG_NAME))
-     {
-        widget_data->horizontal_bg_color.r = r;
-        widget_data->horizontal_bg_color.g = g;
-        widget_data->horizontal_bg_color.b = b;
-        widget_data->horizontal_bg_color.a = a;
-
-        return;
-     }
-}
-
-static Eina_Bool
-_eext_circle_object_scroller_scrollbar_policy_hide_cb(void *data)
-{
-   Eext_Circle_Object *obj = (Eext_Circle_Object *)data;
-   Eext_Circle_Object_Item *item, *bg_item;
-
-   EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(obj, widget_data) return ECORE_CALLBACK_CANCEL;
-
-   if (widget_data->policy_v == ELM_SCROLLER_POLICY_AUTO)
-     {
-        item = _eext_circle_object_item_get(obj, VERTICAL_BAR_NAME);
-        bg_item = _eext_circle_object_item_get(obj, VERTICAL_BAR_BG_NAME);
-
-        _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
-                                                   0, 0, 0, 0,
-                                                   EINA_TRUE,
-                                                   0.25, 0.46, 0.45, 1.0);
-        _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
-                                                   0, 0, 0, 0,
-                                                   EINA_TRUE,
-                                                   0.25, 0.46, 0.45, 1.0);
-     }
-
-   if (widget_data->policy_h == ELM_SCROLLER_POLICY_AUTO)
-     {
-        item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_NAME);
-        bg_item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_BG_NAME);
-
-        _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
-                                                   0, 0, 0, 0,
-                                                   EINA_TRUE,
-                                                   0.25, 0.46, 0.45, 1.0);
-        _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
-                                                   0, 0, 0, 0,
-                                                   EINA_TRUE,
-                                                   0.25, 0.46, 0.45, 1.0);
-     }
-
-   if (widget_data->bar_hide_timer)
-     {
-         ecore_timer_del(widget_data->bar_hide_timer);
-         widget_data->bar_hide_timer = NULL;
-     }
-
-   return ECORE_CALLBACK_CANCEL;
-}
-
-static void
-_eext_circle_object_scroller_scrollbar_update(Eext_Circle_Object *obj,
-                                              double hide_waiting_time)
-{
-   Eext_Circle_Object_Item *item, *bg_item;
-   Evas_Object *scroller = obj->widget_object;
-   Evas_Coord cont_v = 0, cont_h = 0; /* content v/h */
-   Evas_Coord pos_x = 0, pos_y = 0;   /* postion x/y */
-   Evas_Coord vp_v = 0, vp_h = 0;     /* viewport v/h */
-   double bar_pos_v = 0.0, bar_pos_h = 0.0;   /* bar position v/h */
-   double bar_size_v = 0.0, bar_size_h = 0.0; /* bar size v/h */
-
-   EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(obj, data) return;
-
-   elm_scroller_child_size_get(scroller, &cont_h, &cont_v);
-   elm_scroller_region_get(scroller, &pos_y, &pos_x, &vp_h, &vp_v);
-
-   item = _eext_circle_object_item_get(obj, VERTICAL_BAR_NAME);
-   bg_item = _eext_circle_object_item_get(obj, VERTICAL_BAR_BG_NAME);
-
-   if ((cont_v > 0.0) && (vp_v > 0.0) &&
-       (data->policy_v != ELM_SCROLLER_POLICY_OFF))
-     {
-        if (cont_v > vp_v)
-          {
-             bar_size_v = VERTICAL_BAR_ANGLE_RANGE / ((double)cont_v / (double)vp_v);
-
-             if (bar_size_v > VERTICAL_BAR_ANGLE_MAX_SIZE)
-                bar_size_v = VERTICAL_BAR_ANGLE_MAX_SIZE;
-             if (bar_size_v < VERTICAL_BAR_ANGLE_MIN_SIZE)
-                bar_size_v = VERTICAL_BAR_ANGLE_MIN_SIZE;
-          }
-        else
-           bar_size_v = VERTICAL_BAR_ANGLE_MAX_SIZE;
-
-        bar_pos_v = (VERTICAL_BAR_ANGLE_RANGE / (double)cont_v) * (double)pos_x;
-        bar_pos_v += VERTICAL_BAR_ANGLE_START;
-
-        _eext_circle_object_item_angle_offset_set(item, bar_pos_v);
-        _eext_circle_object_item_angle_set(item, bar_size_v);
-
-        if (obj->disabled)
-          {
-             _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
-                                                        data->disabled_color.r,
-                                                        data->disabled_color.g,
-                                                        data->disabled_color.b,
-                                                        data->disabled_color.a,
-                                                        EINA_TRUE,
-                                                        0.25, 0.46, 0.45, 1.0);
-             _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
-                                                        data->disabled_bg_color.r,
-                                                        data->disabled_bg_color.g,
-                                                        data->disabled_bg_color.b,
-                                                        data->disabled_bg_color.a,
-                                                        EINA_TRUE,
-                                                        0.25, 0.46, 0.45, 1.0);
-          }
-        else
-          {
-             _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
-                                                        data->vertical_color.r,
-                                                        data->vertical_color.g,
-                                                        data->vertical_color.b,
-                                                        data->vertical_color.a,
-                                                        EINA_TRUE,
-                                                        0.25, 0.46, 0.45, 1.0);
-             _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
-                                                        data->vertical_bg_color.r,
-                                                        data->vertical_bg_color.g,
-                                                        data->vertical_bg_color.b,
-                                                        data->vertical_bg_color.a,
-                                                        EINA_TRUE,
-                                                        0.25, 0.46, 0.45, 1.0);
-          }
-     }
-   else
-     {
-        _eext_circle_object_item_color_set(item, 0, 0, 0, 0);
-        _eext_circle_object_item_color_set(bg_item, 0, 0, 0, 0);
-     }
-
-   item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_NAME);
-   bg_item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_BG_NAME);
-
-   if ((cont_h > 0.0) && (vp_h > 0.0) &&
-       (data->policy_h != ELM_SCROLLER_POLICY_OFF))
-     {
-        if (cont_h > vp_h)
-          {
-             bar_size_h = HORIZONTAL_BAR_ANGLE_RANGE / ((double)cont_h / (double)vp_h);
-
-             if (bar_size_h > HORIZONTAL_BAR_ANGLE_MAX_SIZE)
-                bar_size_h = HORIZONTAL_BAR_ANGLE_MAX_SIZE;
-             if (bar_size_h < HORIZONTAL_BAR_ANGLE_MIN_SIZE)
-                bar_size_h = HORIZONTAL_BAR_ANGLE_MIN_SIZE;
-          }
-        else
-           bar_size_h = HORIZONTAL_BAR_ANGLE_MAX_SIZE;
-
-        bar_pos_h = (HORIZONTAL_BAR_ANGLE_RANGE / (double)cont_h) * (double)pos_y;
-        bar_pos_h += HORIZONTAL_BAR_ANGLE_START;
-
-        _eext_circle_object_item_angle_offset_set(item, bar_pos_h);
-        _eext_circle_object_item_angle_set(item, bar_size_h);
-
-        if (obj->disabled)
-          {
-             _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
-                                                        data->disabled_color.r,
-                                                        data->disabled_color.g,
-                                                        data->disabled_color.b,
-                                                        data->disabled_color.a,
-                                                        EINA_TRUE,
-                                                        0.25, 0.46, 0.45, 1.0);
-             _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
-                                                        data->disabled_bg_color.r,
-                                                        data->disabled_bg_color.g,
-                                                        data->disabled_bg_color.b,
-                                                        data->disabled_bg_color.a,
-                                                        EINA_TRUE,
-                                                        0.25, 0.46, 0.45, 1.0);
-          }
-        else
-          {
-             _eext_circle_object_item_color_transit_set(item, SCROLL_BAR_TRANSIT_TIME,
-                                                        data->horizontal_color.r,
-                                                        data->horizontal_color.g,
-                                                        data->horizontal_color.b,
-                                                        data->horizontal_color.a,
-                                                        EINA_TRUE,
-                                                        0.25, 0.46, 0.45, 1.0);
-             _eext_circle_object_item_color_transit_set(bg_item, SCROLL_BAR_TRANSIT_TIME,
-                                                        data->horizontal_bg_color.r,
-                                                        data->horizontal_bg_color.g,
-                                                        data->horizontal_bg_color.b,
-                                                        data->horizontal_bg_color.a,
-                                                        EINA_TRUE,
-                                                        0.25, 0.46, 0.45, 1.0);
-          }
-     }
-   else
-     {
-        _eext_circle_object_item_color_set(item, 0, 0, 0, 0);
-        _eext_circle_object_item_color_set(bg_item, 0, 0, 0, 0);
-     }
-
-   if ((hide_waiting_time > 0.0) &&
-       ((data->policy_v == ELM_SCROLLER_POLICY_AUTO) ||
-        (data->policy_h == ELM_SCROLLER_POLICY_AUTO)))
-     {
-        if (data->bar_hide_timer)
-          ecore_timer_del(data->bar_hide_timer);
-
-        data->bar_hide_timer = ecore_timer_add(hide_waiting_time,
-                                               _eext_circle_object_scroller_scrollbar_policy_hide_cb,
-                                               obj);
-     }
-}
-
-static void
-_eext_circle_object_scroller_scroll_cb(void *data,
-                                                 Evas_Object *obj,
-                                                 void *event_info)
-{
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
-   EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return;
-
-   if ((widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) &&
-       (widget_data->policy_h == ELM_SCROLLER_POLICY_OFF))
-     return;
-
-   _eext_circle_object_scroller_scrollbar_update(circle_obj,
-                                                 SCROLL_BAR_HIDE_WAITTING_TIME);
-}
-
-static void
-_eext_circle_object_scroller_show_cb(void *data,
-                                     Evas *e,
-                                     Evas_Object *obj,
-                                     void *event_info)
-{
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
-   EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return;
-
-   if ((widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) &&
-       (widget_data->policy_h == ELM_SCROLLER_POLICY_OFF))
-     return;
-
-   _eext_circle_object_scroller_scrollbar_update(circle_obj,
-                                                 SCROLL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING);
-}
-
-static void
-_eext_circle_object_scroller_content_resize_cb(void *data,
-                                               Evas_Object *obj,
-                                               void *event_info)
-{
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
-   EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return;
-
-   if ((widget_data->policy_v == ELM_SCROLLER_POLICY_OFF) &&
-       (widget_data->policy_h == ELM_SCROLLER_POLICY_OFF))
-     return;
-
-   _eext_circle_object_scroller_scrollbar_update(circle_obj,
-                                                 SCROLL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING);
-}
-
-static Eina_Bool
-_eext_circle_object_scroller_rotary_changed_cb(void *data,
-                                               Evas_Object *obj,
-                                               Eext_Rotary_Event_Info *info)
-{
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-   Evas_Object *scroller = circle_obj->widget_object;
-   int h_pagesize, v_pagesize;
-   int cw, ch;
-   int x, y, w, h;
-   int d = (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE) ? 1 : -1;
-   Elm_Scroller_Movement_Block scroller_block;
-   Eina_Bool scroll_locked_x, scroll_locked_y;
-
-   EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, widget_data) return EINA_TRUE;
-
-   if (elm_object_scroll_freeze_get(scroller))
-     return EINA_TRUE;
-
-   elm_scroller_page_size_get(scroller, &h_pagesize, &v_pagesize);
-   elm_scroller_child_size_get(scroller, &cw, &ch);
-   elm_scroller_region_get(scroller, &x, &y, &w, &h);
-
-   scroller_block = elm_scroller_movement_block_get(scroller);
-   scroll_locked_x = elm_object_scroll_lock_x_get(scroller);
-   scroll_locked_y = elm_object_scroll_lock_y_get(scroller);
-
-   if ((h_pagesize > 0) || (v_pagesize > 0))
-     {
-        int h_current_page, v_current_page;
-
-        // Handle scroll per page
-        elm_scroller_current_page_get(scroller, &h_current_page, &v_current_page);
-
-        if (!scroll_locked_y &&
-            !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL) &&
-            (ch > h) && (v_pagesize > 0))
-          {
-             v_current_page += d;
-          }
-        else if (!scroll_locked_x &&
-                 !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL) &&
-                 (cw > w) && (h_pagesize > 0))
-          {
-             h_current_page += d;
-          }
-
-        if (v_current_page < 0) v_current_page = 0;
-        if (h_current_page < 0) h_current_page = 0;
-
-        elm_scroller_page_bring_in(scroller, h_current_page,v_current_page);
-     }
-   else
-     {
-        // Handle scroll
-        if (!scroll_locked_y &&
-            !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_VERTICAL) &&
-            (ch > h))
-          {
-             y += d * widget_data->step_y;
-          }
-        else if (!scroll_locked_x &&
-                 !(scroller_block & ELM_SCROLLER_MOVEMENT_BLOCK_HORIZONTAL) &&
-                 (cw > w))
-          {
-             x += d * widget_data->step_x;
-          }
-
-        if (y < 0) y = 0;
-        if (x < 0) x = 0;
-
-        elm_scroller_region_bring_in(scroller, x, y, w, h);
-     }
-
-   return EINA_TRUE;
-}
-
-static void
-_eext_circle_object_scroller_del_cb(Eext_Circle_Object *obj)
-{
-   EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(obj, data) return;
-
-   evas_object_event_callback_del_full(obj->widget_object, EVAS_CALLBACK_SHOW, _eext_circle_object_scroller_show_cb, obj);
-   evas_object_smart_callback_del_full(obj->widget_object, "scroll", _eext_circle_object_scroller_scroll_cb, obj);
-   evas_object_smart_callback_del_full(obj->widget_object, "content,resize", _eext_circle_object_scroller_content_resize_cb, obj);
-   eext_rotary_object_event_callback_del(obj->widget_object, _eext_circle_object_scroller_rotary_changed_cb);
-   eext_rotary_object_event_callback_del(obj->image_widget, _eext_circle_object_scroller_rotary_changed_cb);
-
-   if (data->bar_hide_timer)
-     {
-        ecore_timer_del(data->bar_hide_timer);
-        data->bar_hide_timer = NULL;
-     }
-
-   free(obj->widget_data);
-   obj->widget_data = NULL;
-}
-
-static void
-_eext_circle_object_scroller_disabled_cb(Eext_Circle_Object *obj)
-{
-   Eext_Circle_Object_Item *item;
-
-   EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(obj, data) return;
-
-   if (obj->disabled)
-     {
-        item = _eext_circle_object_item_get(obj, VERTICAL_BAR_NAME);
-        _eext_circle_object_item_color_set(item,
-                                           data->disabled_color.r,
-                                           data->disabled_color.g,
-                                           data->disabled_color.b,
-                                           data->disabled_color.a);
-
-        item = _eext_circle_object_item_get(obj, VERTICAL_BAR_BG_NAME);
-        _eext_circle_object_item_color_set(item,
-                                           data->disabled_bg_color.r,
-                                           data->disabled_bg_color.g,
-                                           data->disabled_bg_color.b,
-                                           data->disabled_bg_color.a);
-
-        item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_NAME);
-        _eext_circle_object_item_color_set(item,
-                                           data->disabled_color.r,
-                                           data->disabled_color.g,
-                                           data->disabled_color.b,
-                                           data->disabled_color.a);
-
-        item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_BG_NAME);
-        _eext_circle_object_item_color_set(item,
-                                           data->disabled_bg_color.r,
-                                           data->disabled_bg_color.g,
-                                           data->disabled_bg_color.b,
-                                           data->disabled_bg_color.a);
-
-        eext_rotary_object_event_callback_del(obj->widget_object, _eext_circle_object_scroller_rotary_changed_cb);
-        eext_rotary_object_event_callback_del(obj->image_widget, _eext_circle_object_scroller_rotary_changed_cb);
-     }
-   else
-     {
-        item = _eext_circle_object_item_get(obj, VERTICAL_BAR_NAME);
-        _eext_circle_object_item_color_set(item,
-                                           data->vertical_color.r,
-                                           data->vertical_color.g,
-                                           data->vertical_color.b,
-                                           data->vertical_color.a);
-
-        item = _eext_circle_object_item_get(obj, VERTICAL_BAR_BG_NAME);
-        _eext_circle_object_item_color_set(item,
-                                           data->vertical_bg_color.r,
-                                           data->vertical_bg_color.g,
-                                           data->vertical_bg_color.b,
-                                           data->vertical_bg_color.a);
-
-        item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_NAME);
-        _eext_circle_object_item_color_set(item,
-                                           data->horizontal_color.r,
-                                           data->horizontal_color.g,
-                                           data->horizontal_color.b,
-                                           data->horizontal_color.a);
-
-        item = _eext_circle_object_item_get(obj, HORIZONTAL_BAR_BG_NAME);
-        _eext_circle_object_item_color_set(item,
-                                           data->horizontal_bg_color.r,
-                                           data->horizontal_bg_color.g,
-                                           data->horizontal_bg_color.b,
-                                           data->horizontal_bg_color.a);
-
-        eext_rotary_object_event_callback_add(obj->widget_object, _eext_circle_object_scroller_rotary_changed_cb, obj);
-        eext_rotary_object_event_callback_add(obj->image_widget, _eext_circle_object_scroller_rotary_changed_cb, obj);
-     }
-}
-
-static void
-_eext_circle_object_scroller_init(Eext_Circle_Object *obj, Evas_Object *scroller)
-{
-   Eext_Circle_Object_Scroller_Data *data;
-   Eext_Circle_Object_Item *item;
-
-   obj->widget_type = EEXT_CIRCLE_OBJECT_SCROLLER_TYPE;
-   obj->del_func = _eext_circle_object_scroller_del_cb;
-   obj->disabled_func = _eext_circle_object_scroller_disabled_cb;
-   obj->color_changed_func = _eext_circle_object_scroller_color_changed_cb;
-
-   data = (Eext_Circle_Object_Scroller_Data *)calloc(1, sizeof(Eext_Circle_Object_Scroller_Data));
-   data->policy_v = ELM_SCROLLER_POLICY_AUTO;
-   data->policy_h = ELM_SCROLLER_POLICY_AUTO;
-   data->line_width = SCROLL_BAR_WIDTH_SIZE;
-   data->radius = SCROLL_BAR_RADIUS_SIZE;
-   data->step_x = data->step_y = 32;
-   data->vertical_color.r = data->horizontal_color.r = SCROLL_BAR_COLOR_R;
-   data->vertical_color.g = data->horizontal_color.g = SCROLL_BAR_COLOR_G;
-   data->vertical_color.b = data->horizontal_color.b = SCROLL_BAR_COLOR_B;
-   data->vertical_color.a = data->horizontal_color.a = SCROLL_BAR_COLOR_A;
-   data->vertical_bg_color.r = data->horizontal_bg_color.r = SCROLL_BAR_BG_COLOR_R;
-   data->vertical_bg_color.g = data->horizontal_bg_color.g = SCROLL_BAR_BG_COLOR_G;
-   data->vertical_bg_color.b = data->horizontal_bg_color.b = SCROLL_BAR_BG_COLOR_B;
-   data->vertical_bg_color.a = data->horizontal_bg_color.a = SCROLL_BAR_BG_COLOR_A;
-   data->disabled_color.r = SCROLL_BAR_COLOR_DISABLED_R;
-   data->disabled_color.g = SCROLL_BAR_COLOR_DISABLED_G;
-   data->disabled_color.b = SCROLL_BAR_COLOR_DISABLED_B;
-   data->disabled_color.a = SCROLL_BAR_COLOR_DISABLED_A;
-   data->disabled_bg_color.r = SCROLL_BAR_BG_COLOR_DISABLED_R;
-   data->disabled_bg_color.g = SCROLL_BAR_BG_COLOR_DISABLED_G;
-   data->disabled_bg_color.b = SCROLL_BAR_BG_COLOR_DISABLED_B;
-   data->disabled_bg_color.a = SCROLL_BAR_BG_COLOR_DISABLED_A;
-   obj->widget_data = (void *)data;
-
-   // We don't want to allow to change properties of these items.
-   // There is no item with "default" as its name.
-   // So, eext_circle_object_* APIs is meaningless in here.
-   item = _eext_circle_object_item_new();
-   _eext_circle_object_item_name_set(item, VERTICAL_BAR_BG_NAME);
-   _eext_circle_object_item_color_set(item,
-                                      data->vertical_bg_color.r,
-                                      data->vertical_bg_color.g,
-                                      data->vertical_bg_color.b,
-                                      0);
-   _eext_circle_object_item_line_width_set(item, data->line_width);
-   _eext_circle_object_item_radius_set(item, data->radius);
-   _eext_circle_object_item_angle_offset_set(item, VERTICAL_BAR_ANGLE_START);
-   _eext_circle_object_item_angle_set(item, VERTICAL_BAR_ANGLE_RANGE);
-   _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE);
-   _eext_circle_object_item_append(obj, item);
-
-   item = _eext_circle_object_item_new();
-   _eext_circle_object_item_name_set(item, HORIZONTAL_BAR_BG_NAME);
-   _eext_circle_object_item_color_set(item,
-                                      data->horizontal_bg_color.r,
-                                      data->horizontal_bg_color.g,
-                                      data->horizontal_bg_color.b,
-                                      0);
-   _eext_circle_object_item_line_width_set(item, data->line_width);
-   _eext_circle_object_item_radius_set(item, data->radius);
-   _eext_circle_object_item_angle_offset_set(item, HORIZONTAL_BAR_ANGLE_START);
-   _eext_circle_object_item_angle_set(item, HORIZONTAL_BAR_ANGLE_RANGE);
-   _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE);
-   _eext_circle_object_item_append(obj, item);
-
-   item = _eext_circle_object_item_new();
-   _eext_circle_object_item_name_set(item, VERTICAL_BAR_NAME);
-   _eext_circle_object_item_color_set(item,
-                                      data->vertical_color.r,
-                                      data->vertical_color.g,
-                                      data->vertical_color.b,
-                                      data->vertical_color.a);
-   _eext_circle_object_item_line_width_set(item, data->line_width);
-   _eext_circle_object_item_radius_set(item, data->radius);
-   _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE);
-   _eext_circle_object_item_append(obj, item);
-
-   item = _eext_circle_object_item_new();
-   _eext_circle_object_item_name_set(item, HORIZONTAL_BAR_NAME);
-   _eext_circle_object_item_color_set(item,
-                                      data->horizontal_color.r,
-                                      data->horizontal_color.g,
-                                      data->horizontal_color.b,
-                                      data->horizontal_color.a);
-   _eext_circle_object_item_line_width_set(item, data->line_width);
-   _eext_circle_object_item_radius_set(item, data->radius);
-   _eext_circle_object_item_round_cap_enable_set(item, EINA_TRUE);
-   _eext_circle_object_item_append(obj, item);
-
-   elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_OFF);
-   evas_object_event_callback_add(scroller, EVAS_CALLBACK_SHOW, _eext_circle_object_scroller_show_cb, obj);
-   evas_object_smart_callback_add(scroller, "scroll", _eext_circle_object_scroller_scroll_cb, obj);
-   evas_object_smart_callback_add(scroller, "content,resize", _eext_circle_object_scroller_content_resize_cb, obj);
-
-   eext_rotary_object_event_callback_add(scroller, _eext_circle_object_scroller_rotary_changed_cb, obj);
-   eext_rotary_object_event_callback_add(obj->image_widget, _eext_circle_object_scroller_rotary_changed_cb, obj);
-}
-
-EAPI Evas_Object *
-eext_circle_object_scroller_add(Evas_Object *scroller, Eext_Circle_Surface *surface)
-{
-   Evas_Object *obj;
-
-   if (!scroller) return NULL;
-
-   obj = elm_image_add(scroller);
-   _eext_circle_object_init(obj, scroller, surface);
-
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
-
-   _eext_circle_object_scroller_init(circle_obj, scroller);
-
-   return obj;
-}
-
-EAPI void
-eext_circle_object_scroller_policy_set(Evas_Object *obj,
-                                       Elm_Scroller_Policy policy_h,
-                                       Elm_Scroller_Policy policy_v)
-{
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
-   EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, data) return;
-
-   if ((data->policy_v == policy_v) && (data->policy_h == policy_h))
-     return;
-
-   if (policy_v < ELM_SCROLLER_POLICY_LAST)
-     data->policy_v = policy_v;
-
-   if (policy_h < ELM_SCROLLER_POLICY_LAST)
-     data->policy_h = policy_h;
-
-   _eext_circle_object_scroller_scrollbar_update(circle_obj,
-                                                 SCROLL_BAR_HIDE_WAITTING_TIME_ON_INITIALIZING);
-}
-
-EAPI void
-eext_circle_object_scroller_policy_get(const Evas_Object *obj,
-                                       Elm_Scroller_Policy *policy_h,
-                                       Elm_Scroller_Policy *policy_v)
-{
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
-   EEXT_CIRCLE_OBJECT_SCROLLER_DATA_GET(circle_obj, data) return;
-
-   if (policy_v) *policy_v = data->policy_v;
-   if (policy_h) *policy_h = data->policy_h;
-}
diff --git a/wearable/src/lib/circle/efl_extension_circle_object_slider.c b/wearable/src/lib/circle/efl_extension_circle_object_slider.c
deleted file mode 100644 (file)
index daca6d7..0000000
+++ /dev/null
@@ -1,326 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "efl_extension.h"
-#include "efl_extension_private.h"
-#include "circle/efl_extension_circle_private.h"
-
-#define EEXT_CIRCLE_OBJECT_SLIDER_TYPE "Eext_Circle_Object_Slider"
-
-#define SLIDER_TRANSIT_TIME 0.3
-
-#define EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, data) \
-      Eext_Circle_Object_Slider_Data *data = NULL; \
-   if (circle_obj && circle_obj->widget_data && \
-              circle_obj->widget_type && !strcmp(circle_obj->widget_type, EEXT_CIRCLE_OBJECT_SLIDER_TYPE)) \
-      data = (Eext_Circle_Object_Slider_Data *)circle_obj->widget_data; \
-   if (!data)
-
-#define SLIDER_ITEM_NAME "default"
-#define SLIDER_BG_ITEM_NAME "bg"
-
-#define SLIDER_COLOR_R 77
-#define SLIDER_COLOR_G 207
-#define SLIDER_COLOR_B 255
-#define SLIDER_COLOR_A 255
-
-#define SLIDER_BG_COLOR_R 0
-#define SLIDER_BG_COLOR_G 67
-#define SLIDER_BG_COLOR_B 115
-#define SLIDER_BG_COLOR_A 255
-
-#define SLIDER_COLOR_DISABLED_R 77
-#define SLIDER_COLOR_DISABLED_G 207
-#define SLIDER_COLOR_DISABLED_B 255
-#define SLIDER_COLOR_DISABLED_A 153
-
-#define SLIDER_BG_COLOR_DISABLED_R 64
-#define SLIDER_BG_COLOR_DISABLED_G 64
-#define SLIDER_BG_COLOR_DISABLED_B 64
-#define SLIDER_BG_COLOR_DISABLED_A 255
-
-#define SLIDER_WIDTH_SIZE 8
-#define SLIDER_RADIUS_SIZE 176
-
-static const char SIG_VALUE_CHANGED[] = "value,changed";
-
-static void
-_eext_circle_object_slider_del_cb(Eext_Circle_Object *obj)
-{
-   if (obj->widget_data)
-     {
-        free(obj->widget_data);
-        obj->widget_data = NULL;
-     }
-}
-
-static Eina_Bool
-_rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info)
-{
-   Evas_Object *slider = obj;
-   double current_value;
-   double next_value;
-   double min, max;
-
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj);
-   EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data);
-
-   Eext_Circle_Object_Item *item = NULL;
-   item = _eext_circle_object_item_get(circle_obj, SLIDER_ITEM_NAME);
-
-   current_value = _eext_circle_object_item_value_get(item);
-
-   if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
-     next_value = current_value + widget_data->value_step;
-   else
-     next_value = current_value - widget_data->value_step;
-
-   _eext_circle_object_item_value_min_max_get(item, &min, &max);
-
-   if (next_value < min) next_value = min;
-   else if (next_value > max) next_value = max;
-
-   _eext_circle_object_item_value_transit_set(item, SLIDER_TRANSIT_TIME,
-                                              next_value,
-                                              EINA_TRUE,
-                                              0.25, 0.46, 0.45, 1.0);
-
-   evas_object_smart_callback_call(slider, SIG_VALUE_CHANGED, NULL);
-
-   /* Accessibility */
-   if (elm_atspi_bridge_utils_is_screen_reader_enabled())
-     {
-        const char *slider_desc = NULL;
-        slider_desc = elm_atspi_accessible_description_get(slider);
-        if (slider_desc && strlen(slider_desc) > 0)
-          elm_atspi_bridge_utils_say(slider_desc, EINA_TRUE, NULL, NULL);
-     }
-
-   return EINA_TRUE;
-}
-
-static void
-_eext_circle_object_slider_color_changed_cb(Eext_Circle_Object *obj, const char *item_name)
-{
-   Eext_Circle_Object_Item *item;
-   int r, g, b, a;
-
-   EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(obj, widget_data) return;
-
-   item = _eext_circle_object_item_get(obj, item_name);
-   if (!item) return;
-
-   _eext_circle_object_item_color_get(item, &r, &g, &b, &a);
-
-   if (!strcmp(item_name, SLIDER_ITEM_NAME))
-     {
-        widget_data->color.r = r;
-        widget_data->color.g = g;
-        widget_data->color.b = b;
-        widget_data->color.a = a;
-
-        return;
-     }
-
-   if (!strcmp(item_name, SLIDER_BG_ITEM_NAME))
-     {
-        widget_data->bg_color.r = r;
-        widget_data->bg_color.g = g;
-        widget_data->bg_color.b = b;
-        widget_data->bg_color.a = a;
-
-        return;
-     }
-}
-
-static void
-_eext_circle_object_slider_disabled_cb(Eext_Circle_Object *obj)
-{
-   Eext_Circle_Object_Item *item, *bg_item;
-
-   EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(obj, data) return;
-
-   item = _eext_circle_object_item_get(obj, SLIDER_ITEM_NAME);
-   bg_item = _eext_circle_object_item_get(obj, SLIDER_BG_ITEM_NAME);
-
-   if (obj->disabled)
-     {
-        if (item)
-          _eext_circle_object_item_color_set(item,
-                                             data->disabled_color.r,
-                                             data->disabled_color.g,
-                                             data->disabled_color.b,
-                                             data->disabled_color.a);
-        if (bg_item)
-          _eext_circle_object_item_color_set(bg_item,
-                                             data->disabled_bg_color.r,
-                                             data->disabled_bg_color.g,
-                                             data->disabled_bg_color.b,
-                                             data->disabled_bg_color.a);
-
-        eext_rotary_object_event_callback_del(obj->image_widget, _rotary_changed_cb);
-     }
-   else
-     {
-        if (item)
-          _eext_circle_object_item_color_set(item,
-                                             data->color.r,
-                                             data->color.g,
-                                             data->color.b,
-                                             data->color.a);
-        if (bg_item)
-          _eext_circle_object_item_color_set(bg_item,
-                                             data->bg_color.r,
-                                             data->bg_color.g,
-                                             data->bg_color.b,
-                                             data->bg_color.a);
-
-        eext_rotary_object_event_callback_add(obj->image_widget, _rotary_changed_cb, NULL);
-     }
-}
-
-static void
-_eext_circle_object_slider_init(Eext_Circle_Object *obj)
-{
-   Eext_Circle_Object_Slider_Data *data;
-   Eext_Circle_Object_Item *item;
-
-   obj->widget_object = NULL;
-   obj->widget_type = EEXT_CIRCLE_OBJECT_SLIDER_TYPE;
-   obj->del_func = _eext_circle_object_slider_del_cb;
-   obj->disabled_func = _eext_circle_object_slider_disabled_cb;
-   obj->color_changed_func = _eext_circle_object_slider_color_changed_cb;
-
-   data = (Eext_Circle_Object_Slider_Data *)calloc(1, sizeof(Eext_Circle_Object_Slider_Data));
-   data->value_step = 1.0;
-   data->color.r = SLIDER_COLOR_R;
-   data->color.g = SLIDER_COLOR_G;
-   data->color.b = SLIDER_COLOR_B;
-   data->color.a = SLIDER_COLOR_A;
-   data->bg_color.r = SLIDER_BG_COLOR_R;
-   data->bg_color.g = SLIDER_BG_COLOR_G;
-   data->bg_color.b = SLIDER_BG_COLOR_B;
-   data->bg_color.a = SLIDER_BG_COLOR_A;
-   data->disabled_color.r = SLIDER_COLOR_DISABLED_R;
-   data->disabled_color.g = SLIDER_COLOR_DISABLED_G;
-   data->disabled_color.b = SLIDER_COLOR_DISABLED_B;
-   data->disabled_color.a = SLIDER_COLOR_DISABLED_A;
-   data->disabled_bg_color.r = SLIDER_BG_COLOR_DISABLED_R;
-   data->disabled_bg_color.g = SLIDER_BG_COLOR_DISABLED_G;
-   data->disabled_bg_color.b = SLIDER_BG_COLOR_DISABLED_B;
-   data->disabled_bg_color.a = SLIDER_BG_COLOR_DISABLED_A;
-   obj->widget_data = data;
-
-   item = _eext_circle_object_item_new();
-   _eext_circle_object_item_name_set(item, SLIDER_BG_ITEM_NAME);
-   _eext_circle_object_item_color_set(item, data->bg_color.r, data->bg_color.g, data->bg_color.b, data->bg_color.a);
-   _eext_circle_object_item_radius_set(item, SLIDER_RADIUS_SIZE);
-   _eext_circle_object_item_line_width_set(item, SLIDER_WIDTH_SIZE);
-   _eext_circle_object_item_angle_set(item, 360);
-   _eext_circle_object_item_append(obj, item);
-
-   item = _eext_circle_object_item_new();
-   _eext_circle_object_item_name_set(item, SLIDER_ITEM_NAME);
-   _eext_circle_object_item_color_set(item, data->color.r, data->color.g, data->color.b, data->color.a);
-   _eext_circle_object_item_radius_set(item, SLIDER_RADIUS_SIZE);
-   _eext_circle_object_item_line_width_set(item, SLIDER_WIDTH_SIZE);
-   _eext_circle_object_item_value_min_max_set(item, 0, 10);
-   _eext_circle_object_item_value_set(item, 0);
-   _eext_circle_object_item_append(obj, item);
-
-   eext_rotary_object_event_callback_add(obj->image_widget, _rotary_changed_cb, NULL);
-}
-
-static char *
-_accessible_description_cb(void *data, Evas_Object *obj)
-{
-   char *ret;
-   char *buf[255];
-   Eina_Strbuf *sbuf;
-   const char *slider_name;
-   Evas_Object *slider;
-
-   sbuf = eina_strbuf_new();
-   slider = data;
-   slider_name = elm_atspi_accessible_name_get(slider);
-
-   bindtextdomain (PACKAGE, LOCALE_DIR);
-   textdomain (PACKAGE);
-   if (!slider_name) slider = "Slider";
-
-   eina_strbuf_append(sbuf, slider_name);
-   eina_strbuf_append(sbuf, ", ");
-
-   snprintf(buf, sizeof(buf), _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_ADJUST_PS"), slider_name);
-   eina_strbuf_append(sbuf, buf);
-
-   ret = eina_strbuf_string_steal(sbuf);
-   eina_strbuf_free(sbuf);
-   return ret;
-}
-
-EAPI Evas_Object *
-eext_circle_object_slider_add(Evas_Object *parent, Eext_Circle_Surface *surface)
-{
-   Evas_Object *obj;
-
-   if (!parent) return NULL;
-
-   obj = elm_image_add(parent);
-   _eext_circle_object_init(obj, NULL, surface);
-
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
-
-   _eext_circle_object_slider_init(circle_obj);
-
-   /* TODO: Reading information should be changed with UX team */
-   /* ELM_ATSPI_ROLE_PUSH_BUTTON to make layout grab highlight */
-   elm_atspi_accessible_role_set(parent, ELM_ATSPI_ROLE_PUSH_BUTTON);
-   elm_atspi_accessible_description_cb_set(parent, _accessible_description_cb, obj);
-   elm_atspi_accessible_reading_info_type_set(parent, ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
-
-   return obj;
-}
-
-EAPI void
-eext_circle_object_slider_step_set(Evas_Object *obj, double step)
-{
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return;
-   EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return;
-
-   double min, max;
-   Eext_Circle_Object_Item *item = NULL;
-   item = _eext_circle_object_item_get(circle_obj, SLIDER_ITEM_NAME);
-
-   if (widget_data->value_step == step) return;
-
-   _eext_circle_object_item_value_min_max_get(item, &min, &max);
-
-   if (step < min) step = min;
-   else if (step > max) step = max;
-
-   widget_data->value_step = step;
-}
-
-EAPI double
-eext_circle_object_slider_step_get(const Evas_Object *obj)
-{
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return -1.0;
-   EEXT_CIRCLE_OBJECT_SLIDER_DATA_GET(circle_obj, widget_data) return -1.0;
-
-   return widget_data->value_step;
-}
-
diff --git a/wearable/src/lib/circle/efl_extension_circle_object_spinner.c b/wearable/src/lib/circle/efl_extension_circle_object_spinner.c
deleted file mode 100644 (file)
index da491e6..0000000
+++ /dev/null
@@ -1,496 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "efl_extension.h"
-#include "efl_extension_private.h"
-#include "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; \
-   if (circle_obj && circle_obj->widget_data && \
-       circle_obj->widget_type && !strcmp(circle_obj->widget_type, EEXT_CIRCLE_OBJECT_SPINNER_TYPE)) \
-      data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data; \
-   if (!data)
-
-static const double MARK_WIDTH = 6.0;
-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;
-
-// ----------------------------------------- animation API --------------------------------------//
-static void _accessibility_spinner_highlighted_cb(void *data, Evas_Object *obj, void *event_info);
-
-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 *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;
-
-   return angle_offset;
-}
-
-static void
-_eext_circle_object_spinner_update(Eext_Circle_Object *obj)
-{
-   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_spinner_mark_update(obj, EINA_FALSE);
-}
-
-static void
-_eext_circle_object_spinner_changed_cb(void *data, Evas_Object *obj, void *event_info)
-{
-   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 double
-_looping_angle_distance_get(double from_angle_offset, double to_angle_offset, Eina_Bool value_up)
-{
-   double angle_distance = 0;
-
-   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;
-     }
-
-   return angle_distance;
-}
-
-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)
-{
-   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;
-   double angle_offset_diff;
-
-   item = _eext_circle_object_item_get(circle_obj, SPINNER_ITEM_NAME);
-   if (!item) return ECORE_CALLBACK_CANCEL;
-
-   angle_offset_diff = fabs(_eext_circle_object_item_angle_offset_get(item)
-                       - item->draw.angle_offset);
-
-   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");
-
-   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 *circle_obj = (Eext_Circle_Object *)data;
-   Eext_Circle_Object_Spinner_Data *widget_data = (Eext_Circle_Object_Spinner_Data *)circle_obj->widget_data;
-
-   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)
-     {
-        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];
-        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);
-     }
-   return EINA_TRUE;
-}
-
-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;
-        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;
-          }
-
-        free(obj->widget_data);
-        obj->widget_data = NULL;
-     }
-}
-
-static void
-_eext_circle_object_spinner_disabled_cb(Eext_Circle_Object *obj)
-{
-   if (obj->disabled)
-     eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb);
-   else
-     eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, 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;
-   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);
-
-   evas_object_smart_callback_add(spinner, "changed", _eext_circle_object_spinner_changed_cb, obj);
-
-   //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);
-   //
-
-   eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
-}
-
-EAPI Evas_Object *
-eext_circle_object_spinner_add(Evas_Object *spinner, Eext_Circle_Surface *surface)
-{
-   Evas_Object *obj;
-
-   if (!spinner) return NULL;
-
-   obj = elm_image_add(spinner);
-   _eext_circle_object_init(obj, spinner, surface);
-
-   EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
-
-   _eext_circle_object_spinner_init(circle_obj, spinner);
-
-   return obj;
-}
-
-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];
-   char *buf_val = NULL;
-   char *buf_unit = 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_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);
-   textdomain (PACKAGE);
-   if(buf_unit)
-     {
-        snprintf(buf_desc, sizeof(buf_desc), _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_ADJUST_PS"),buf_unit);
-        if(buf_val)
-           snprintf(buf, sizeof(buf), "%s %s %s",buf_val, buf_unit, buf_desc);
-        else
-           snprintf(buf, sizeof(buf), "%.0f %s %s",val, buf_unit, buf_desc);
-     }
-   else
-     {
-        snprintf(buf_desc, sizeof(buf_desc), _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_ADJUST_PS"),"");
-        if(buf_val)
-           snprintf(buf, sizeof(buf), "%s %s",buf_val, buf_desc);
-        else
-           snprintf(buf, sizeof(buf), "%.0f %s",val, buf_desc);
-     }
-   return strdup(buf);
-}
-static void
-_accessibility_spinner_highlighted_cb(void *data, Evas_Object *obj, void *event_info)
-{
-   if(!elm_atspi_bridge_utils_is_screen_reader_enabled())
-      return ;
-
-   Eext_Circle_Object *circle_obj = 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);
-
-   evas_object_smart_callback_call(circle_obj->widget_object, "focused",NULL);
-}
diff --git a/wearable/src/lib/circle/efl_extension_circle_surface.c b/wearable/src/lib/circle/efl_extension_circle_surface.c
deleted file mode 100644 (file)
index 90dbc70..0000000
+++ /dev/null
@@ -1,874 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "efl_extension.h"
-#include "efl_extension_private.h"
-#include "circle/efl_extension_circle_private.h"
-
-static void _eext_circle_surface_del_internal(Eext_Circle_Surface *surface);
-static void _eext_circle_surface_render(void *data);
-
-static Evas_Object *
-_eext_circle_surface_image_widget_add(Evas_Object *parent)
-{
-   Evas_Object *image_widget;
-
-   image_widget = elm_image_add(parent);
-
-   if (!image_widget)
-     {
-        ERR("Failed to create elm_image_object");
-        return NULL;
-     }
-
-   //for accessibility
-   elm_atspi_accessible_role_set(image_widget, ELM_ATSPI_ROLE_REDUNDANT_OBJECT);
-
-   //FIXME: It's for adjusting evas_image geometry.
-   //       Image object has weird geometry during the window calc own size.
-   //       We need to recalc image object after buffer memory copy in render time.
-   //       But now we don't have any way to call image's internal sizing eval function.
-   elm_image_aspect_fixed_set(image_widget, EINA_FALSE);
-   evas_object_repeat_events_set(image_widget, EINA_TRUE);
-
-   return image_widget;
-}
-
-static void
-_eext_circle_surface_cairo_draw_arc(cairo_t *cairo,
-                                    int line_width,
-                                    double center_x, double center_y, double radius,
-                                    double r, double g, double b, double a,
-                                    double angle1, double angle2, Eina_Bool round_cap)
-{
-   cairo_set_line_width(cairo, line_width);
-
-   if (round_cap) cairo_set_line_cap(cairo, CAIRO_LINE_CAP_ROUND);
-
-   cairo_set_source_rgba(cairo, r, g, b, a);
-
-   cairo_arc(cairo, center_x, center_y, radius,
-             angle1 * M_PI / 180, angle2 * M_PI / 180);
-   cairo_stroke(cairo);
-}
-
-static void
-_eext_circle_surface_cairo_draw_text(cairo_t *cairo,
-                                     const char *text, const char *font, int font_size,
-                                     cairo_font_slant_t slant, cairo_font_weight_t weight,
-                                     double center_x, double center_y, double radius,
-                                     double r, double g, double b, double a,
-                                     double angle, double rotate_angle)
-{
-   int x, y;
-
-   x = radius * cos(angle * M_PI / 180);
-   y = radius * sin(angle * M_PI / 180);
-   x += center_x;
-   y += center_y;
-
-   cairo_set_source_rgba(cairo, r, g, b, a);
-   cairo_set_font_size(cairo, font_size);
-   cairo_select_font_face(cairo, font, slant, weight);
-   cairo_move_to(cairo, x, y);
-   cairo_rotate(cairo, rotate_angle * M_PI / 180);
-   cairo_show_text(cairo, text);
-   cairo_stroke(cairo);
-}
-
-static void
-_eext_circle_surface_clear(Eext_Circle_Surface *surface)
-{
-   Evas_Object *image_object;
-   unsigned char *buffer;
-
-   if (!surface || !surface->image_widget) return;
-
-   image_object = elm_image_object_get(surface->image_widget);
-
-   buffer = (unsigned char *)evas_object_image_data_get(image_object, 1);
-   memset(buffer, 0, surface->w * surface->h * 4);
-   cairo_set_source_rgba(surface->cairo, 0, 0, 0, 0);
-   cairo_rectangle(surface->cairo, 0.0, 0.0, surface->w, surface->h);
-   cairo_fill(surface->cairo);
-}
-
-static void
-_eext_circle_bg_surface_memcpy(Eext_Circle_Surface *surface, Eext_Circle_Object *obj)
-{
-   Evas_Object *image_object, *bg_image, *bg_image_object;
-   unsigned char *buffer, *bg_buffer;
-
-   if (!surface || !surface->image_widget) return;
-
-   image_object = elm_image_object_get(surface->image_widget);
-   buffer = (unsigned char *)evas_object_image_data_get(image_object, 1);
-
-   bg_image = eina_list_nth(obj->bg_image_objs, obj->bg_image_index);
-   bg_image_object = elm_image_object_get(bg_image);
-   evas_object_image_size_set(bg_image_object, surface->w, surface->h);
-   evas_object_image_fill_set(bg_image_object, 0, 0, surface->w, surface->h);
-   bg_buffer = (unsigned char *)evas_object_image_data_get(bg_image_object, 0);
-
-   memcpy(buffer, bg_buffer, surface->w * surface->h * 4);
-}
-
-static void
-_eext_circle_surface_render(void *data)
-{
-   Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
-   Eext_Circle_Object *render_obj;
-   Eina_List *l, *ll;
-   Eina_Bool skip_surface_clear = EINA_FALSE;
-
-   if (!surface)
-     {
-        ERR("Surface is NULL... Going to remove surface render function.");
-        return;
-     }
-
-   surface->render_job = NULL;
-
-   EINA_LIST_FOREACH(surface->render_objs, l, render_obj)
-     {
-        if (!render_obj->visible)
-          continue;
-
-        if (render_obj->bg_image_objs)
-          {
-             _eext_circle_bg_surface_memcpy(surface, render_obj);
-             skip_surface_clear = EINA_TRUE;
-             break;
-          }
-     }
-
-   if (!skip_surface_clear)
-     _eext_circle_surface_clear(surface);
-
-   EINA_LIST_FOREACH(surface->render_objs, l, render_obj)
-     {
-        Eext_Circle_Object_Item *item;
-
-        if (!render_obj->visible)
-          continue;
-        if (render_obj->visible_on_activate && !(render_obj->is_active))
-          continue;
-
-        EINA_LIST_FOREACH(render_obj->items, ll, item)
-          {
-             // Skip invisible item.
-             if (item->draw.color.a == 0) continue;
-
-             // If there is no text, the item is arc item.
-             if (!item->text)
-               {
-                  // Draw Arc
-                  if (item->line_width)
-                    {
-                       cairo_save(surface->cairo);
-                       _eext_circle_surface_cairo_draw_arc(surface->cairo, item->line_width,
-                                                           surface->center_x, surface->center_y, item->radius,
-                                                           (double)item->draw.color.r / 255,
-                                                           (double)item->draw.color.g / 255,
-                                                           (double)item->draw.color.b / 255,
-                                                           (double)item->draw.color.a / 255,
-                                                           item->draw.angle_offset + item->min_angle - 90.0,
-                                                           item->draw.angle_offset + item->draw.angle - 90.0,
-                                                           item->round_cap);
-                       cairo_restore(surface->cairo);
-                    }
-               }
-             else if (item->font_size)
-               {
-                  // Draw Text
-                  cairo_save(surface->cairo);
-                  _eext_circle_surface_cairo_draw_text(surface->cairo,
-                                                       item->text, item->selected_font, item->font_size,
-                                                       CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL,
-                                                       surface->center_x, surface->center_y, item->radius,
-                                                       (double)item->draw.color.r / 255,
-                                                       (double)item->draw.color.g / 255,
-                                                       (double)item->draw.color.b / 255,
-                                                       (double)item->draw.color.a / 255,
-                                                       item->draw.angle_offset + item->draw.angle - 90.0,
-                                                       item->draw.angle_offset + item->draw.angle);
-                  cairo_restore(surface->cairo);
-               }
-          }
-     }
-
-   evas_object_image_data_update_add(elm_image_object_get(surface->image_widget),
-                                     0, 0, surface->w, surface->h);
-}
-
-static void
-_eext_circle_surface_render_finish(Eext_Circle_Surface *surface)
-{
-   if (!surface) return;
-
-   if (surface->render_job) ecore_job_del(surface->render_job);
-   surface->render_job = NULL;
-}
-
-static void
-_eext_circle_surface_cairo_finish(Eext_Circle_Surface *surface)
-{
-   if (surface->cairo) cairo_destroy(surface->cairo);
-   if (surface->cairo_surface) cairo_surface_destroy(surface->cairo_surface);
-
-   surface->cairo = NULL;
-   surface->cairo_surface = NULL;
-}
-
-static void
-_eext_circle_surface_cairo_init(Eext_Circle_Surface *surface)
-{
-   Evas_Object *image_object;
-   cairo_surface_t *cairo_surface;
-   cairo_t *cairo;
-   unsigned char *buffer;
-   int stride;
-
-   if (surface->cairo_surface || surface->cairo)
-     _eext_circle_surface_cairo_finish(surface);
-
-   if (surface->image_widget == NULL)
-     {
-        ERR("Fail to get buffer from image object!");
-        return;
-     }
-
-   image_object = elm_image_object_get(surface->image_widget);
-
-   buffer = (unsigned char *)evas_object_image_data_get(image_object, 1);
-   stride = evas_object_image_stride_get(image_object);
-   cairo_surface = cairo_image_surface_create_for_data(buffer, CAIRO_FORMAT_ARGB32,
-                                                       surface->w, surface->h, stride);
-   cairo = cairo_create(cairo_surface);
-   cairo_set_antialias(cairo, CAIRO_ANTIALIAS_BEST);
-
-   surface->cairo_surface = cairo_surface;
-   surface->cairo = cairo;
-}
-
-static void
-_eext_circle_surface_update(Eext_Circle_Surface *surface)
-{
-   Evas_Object *image_object;
-
-   if (!surface) return;
-   if (!evas_object_visible_get(surface->image_widget)) return;
-
-   image_object = elm_image_object_get(surface->image_widget);
-   evas_object_geometry_get(surface->image_widget, NULL, NULL, &surface->w, &surface->h);
-
-   surface->center_x = surface->w / 2;
-   surface->center_y = surface->h / 2;
-
-   evas_object_image_size_set(image_object, surface->w, surface->h);
-   evas_object_image_fill_set(image_object, 0, 0, surface->w, surface->h);
-
-   if ((surface->w != 0) && (surface->h != 0))
-     {
-        INF("Surface will be initialized!");
-        _eext_circle_surface_cairo_init(surface);
-        _eext_circle_surface_changed(surface);
-     }
-}
-
-static void
-_eext_circle_surface_resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
-   Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
-
-   _eext_circle_surface_update(surface);
-}
-
-static void
-_eext_circle_surface_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
-   Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
-
-   INF("Surface is going to free in delete callback for image widget.");
-   _eext_circle_surface_del_internal(surface);
-}
-
-static void
-_eext_circle_surface_parent_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
-   Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
-
-   surface->parent = NULL;
-}
-
-static void
-_eext_circle_surface_hide_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
-   Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
-
-   _eext_circle_surface_cairo_finish(surface);
-   _eext_circle_surface_render_finish(surface);
-}
-
-static void
-_eext_circle_surface_show_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
-   Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
-
-   _eext_circle_surface_update(surface);
-}
-
-static void
-_eext_circle_surface_object_rotary_activated_cb(void *data, Evas_Object *obj, void *event_info)
-{
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
-   evas_object_show(circle_obj->image_widget);
-   circle_obj->is_active = EINA_TRUE;
-
-   // Previous view's circle object should not be disappeared while naviframe effect.
-   // At here, show the latest deactivated object if the conditions are satisfied.
-   if (circle_obj->surface)
-     {
-        if (circle_obj->surface->parent_surface &&
-            (circle_obj->surface->parent_surface->type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME))
-          {
-             Eext_Circle_Object *deact_obj = circle_obj->surface->parent_surface->deactivated_obj;
-
-             if (deact_obj && (deact_obj->surface->parent != circle_obj->surface->parent))
-               {
-                  evas_object_show(deact_obj->image_widget);
-               }
-          }
-        else if (circle_obj->surface->type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME)
-          {
-             if (circle_obj->surface->deactivated_obj)
-               evas_object_show(circle_obj->surface->deactivated_obj->image_widget);
-          }
-     }
-}
-
-static void
-_deactivated_obj_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
-   if (circle_obj && circle_obj->surface && circle_obj->surface->parent_surface &&
-       (circle_obj->surface->parent_surface->type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME))
-     {
-        if (circle_obj->surface->parent_surface->deactivated_obj == circle_obj)
-          circle_obj->surface->parent_surface->deactivated_obj = NULL;
-     }
-}
-
-static void
-_eext_circle_surface_object_rotary_deactivated_cb(void *data, Evas_Object *obj, void *event_info)
-{
-   Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-
-   evas_object_hide(circle_obj->image_widget);
-   circle_obj->is_active = EINA_FALSE;
-
-   // Previous view's circle object should not be disappeared while naviframe effect.
-   // At here, just keep the current deactivated object.
-   if (circle_obj->surface && circle_obj->surface->parent_surface &&
-       (circle_obj->surface->parent_surface->type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME))
-     {
-        Eext_Circle_Object *deactivated_obj = circle_obj->surface->parent_surface->deactivated_obj;
-
-        if (deactivated_obj == circle_obj)
-          return;
-
-        if (deactivated_obj)
-          evas_object_event_callback_del_full(deactivated_obj->image_widget, EVAS_CALLBACK_DEL, _deactivated_obj_del_cb, deactivated_obj);
-        circle_obj->surface->parent_surface->deactivated_obj = circle_obj;
-        evas_object_event_callback_add(circle_obj->image_widget, EVAS_CALLBACK_DEL, _deactivated_obj_del_cb, circle_obj);
-     }
-}
-
-static Eext_Circle_Surface *
-_eext_circle_surface_naviframe_item_view_add(Evas_Object *layout)
-{
-   Eext_Circle_Surface *surface;
-
-   if (!layout)
-     {
-        ERR("The given Evas_Object is NULL! It returns NULL.");
-        return NULL;
-     }
-
-   if (edje_object_part_exists(elm_layout_edje_get(layout), "elm.swallow.circle"))
-     {
-        surface = _eext_circle_surface_add(layout, EEXT_CIRCLE_SURFACE_TYPE_DEFAULT);
-
-        if (!surface->image_widget)
-          {
-             ERR("Surface doesn't have image widget for drawing. It returns NULL.");
-             return NULL;
-          }
-
-        INF("Put the surface[%p]'s widget[%p] to layout widget[%p]", surface, surface->image_widget, layout);
-        elm_object_part_content_set(layout, "elm.swallow.circle", surface->image_widget);
-
-        return surface;
-     }
-   else
-     {
-        ERR("There is no \"elm.swallow.circle\" part in elm_layout widget! It returns NULL.");
-        return NULL;
-     }
-}
-
-static void _naviframe_item_push_cb(void *data, Evas_Object *obj, void *event_info)
-{
-   Evas_Object *view = (Evas_Object *)event_info;
-   Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
-   Eext_Circle_Surface *view_surface;
-   Eext_Circle_Object *circle_obj;
-   Eina_List *l, *l_next;
-
-   if (!surface)
-     {
-        ERR("No matched surface exists for the naviframe:%p", obj);
-        return;
-     }
-
-   view_surface = _eext_circle_surface_naviframe_item_view_add(view);
-   view_surface->parent_surface = surface;
-   surface->sub_surfaces = eina_list_append(surface->sub_surfaces, view_surface);
-
-   EINA_LIST_FOREACH_SAFE(surface->render_objs, l, l_next, circle_obj)
-     {
-        Evas_Object *parent;
-        parent = elm_object_parent_widget_get(circle_obj->image_widget);
-
-        while (parent)
-          {
-             if (parent == view)
-               {
-                  _eext_circle_surface_object_remove(surface, circle_obj);
-                  _eext_circle_surface_object_append(view_surface, circle_obj);
-                  circle_obj->surface = view_surface;
-                  break;
-               }
-
-             parent = elm_object_parent_widget_get(parent);
-             if (parent == obj) break;
-          }
-     }
-}
-
-static void
-_eext_circle_surface_del_internal(Eext_Circle_Surface *surface)
-{
-   Eext_Circle_Object *obj;
-   Eina_List *l, *l_next;
-
-   if (surface->type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME)
-     {
-        Eext_Circle_Surface *cur_surface;
-
-        evas_object_smart_callback_del_full(surface->parent, "item,pushed,internal", _naviframe_item_push_cb, surface);
-        evas_object_event_callback_del_full(surface->parent, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb, surface);
-
-        EINA_LIST_FOREACH_SAFE(surface->sub_surfaces, l, l_next, cur_surface)
-          {
-             _eext_circle_surface_del_internal(cur_surface);
-          }
-
-     }
-   else if (surface->parent)
-     {
-        evas_object_event_callback_del(surface->parent, EVAS_CALLBACK_DEL, _eext_circle_surface_parent_del_cb);
-     }
-
-   _eext_circle_surface_cairo_finish(surface);
-   _eext_circle_surface_render_finish(surface);
-
-   if (surface->image_widget)
-     {
-        evas_object_event_callback_del(surface->image_widget, EVAS_CALLBACK_RESIZE, _eext_circle_surface_resize_cb);
-        evas_object_event_callback_del(surface->image_widget, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb);
-        evas_object_event_callback_del(surface->image_widget, EVAS_CALLBACK_HIDE, _eext_circle_surface_hide_cb);
-        evas_object_event_callback_del(surface->image_widget, EVAS_CALLBACK_SHOW, _eext_circle_surface_show_cb);
-        surface->image_widget = NULL;
-        surface->w = surface->h = 0;
-     }
-
-   if (surface->parent_surface)
-     surface->parent_surface->sub_surfaces = eina_list_remove(surface->parent_surface->sub_surfaces, surface);
-
-   // If public surface is deleted, prepare a private surface.
-   EINA_LIST_FOREACH_SAFE(surface->render_objs, l, l_next, obj)
-     {
-        if (surface->type != EEXT_CIRCLE_SURFACE_TYPE_PRIVATE)
-          {
-             Eext_Circle_Surface *private_surface;
-             INF("Private Surface will be initialized for widget[%p], circle_obj[%p]!",
-                  obj->image_widget, obj);
-
-             surface->render_objs = eina_list_remove_list(surface->render_objs, l);
-
-             private_surface =
-                _eext_circle_surface_init(obj->image_widget, NULL, EEXT_CIRCLE_SURFACE_TYPE_PRIVATE);
-             _eext_circle_surface_object_append(private_surface, obj);
-
-             evas_object_smart_callback_del(obj->image_widget, "rotary,activated",
-                                            _eext_circle_surface_object_rotary_activated_cb);
-             if (obj->widget_object)
-               {
-                  evas_object_smart_callback_del(obj->widget_object, "rotary,activated",
-                                                 _eext_circle_surface_object_rotary_activated_cb);
-               }
-
-             _eext_circle_surface_update(private_surface);
-          }
-        else
-          {
-             _eext_circle_surface_object_remove(surface, obj);
-          }
-     }
-
-   free(surface);
-}
-
-//////////////////////////
-// Internal API //////////
-//////////////////////////
-Eext_Circle_Surface *
-_eext_circle_surface_init(Evas_Object *image_widget, Evas_Object *parent, Eext_Circle_Surface_Type type)
-{
-   Eext_Circle_Surface *surface;
-
-   surface = (Eext_Circle_Surface *)calloc(1, sizeof(Eext_Circle_Surface));
-   if (!surface)
-     {
-        ERR("Fail to calloc for (Eext_Circle_Surface)");
-        return NULL;
-     }
-
-   surface->type = type;
-   surface->parent = parent;
-
-   if (type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME)
-     {
-        // If the surface is created with elm_naviframe.
-        evas_object_smart_callback_add(surface->parent, "item,pushed,internal", _naviframe_item_push_cb, surface);
-        evas_object_event_callback_add(surface->parent, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb, surface);
-     }
-   else if (type == EEXT_CIRCLE_SURFACE_TYPE_PRIVATE)
-     {
-        surface->image_widget = image_widget;
-        evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_RESIZE, _eext_circle_surface_resize_cb, surface);
-        evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb, surface);
-        evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_HIDE, _eext_circle_surface_hide_cb, surface);
-        evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_SHOW, _eext_circle_surface_show_cb, surface);
-        evas_object_image_alpha_set(elm_image_object_get(surface->image_widget), EINA_TRUE);
-     }
-   else
-     {
-        surface->image_widget = image_widget;
-        evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_RESIZE, _eext_circle_surface_resize_cb, surface);
-        evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb, surface);
-        evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_HIDE, _eext_circle_surface_hide_cb, surface);
-        evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_SHOW, _eext_circle_surface_show_cb, surface);
-        evas_object_event_callback_add(surface->parent, EVAS_CALLBACK_DEL, _eext_circle_surface_parent_del_cb, surface);
-        evas_object_image_alpha_set(elm_image_object_get(surface->image_widget), EINA_TRUE);
-     }
-
-   return surface;
-}
-
-void
-_eext_circle_surface_finish(Eext_Circle_Surface *surface)
-{
-   _eext_circle_surface_del_internal(surface);
-}
-
-void
-_eext_circle_surface_object_remove(Eext_Circle_Surface *surface, Eext_Circle_Object *obj)
-{
-   if (!surface) return;
-   if (!obj) return;
-
-   surface->render_objs = eina_list_remove(surface->render_objs, obj);
-   obj->surface = NULL;
-   _eext_circle_surface_changed(surface);
-
-   if (surface->type != EEXT_CIRCLE_SURFACE_TYPE_PRIVATE)
-     {
-        evas_object_smart_callback_del(obj->image_widget, "rotary,activated",
-                                       _eext_circle_surface_object_rotary_activated_cb);
-        evas_object_smart_callback_del(obj->image_widget, "rotary,deactivated",
-                                       _eext_circle_surface_object_rotary_deactivated_cb);
-
-        if (obj->widget_object)
-          {
-             evas_object_smart_callback_del(obj->widget_object, "rotary,activated",
-                                            _eext_circle_surface_object_rotary_activated_cb);
-             evas_object_smart_callback_del(obj->widget_object, "rotary,deactivated",
-                                            _eext_circle_surface_object_rotary_deactivated_cb);
-          }
-     }
-}
-
-void
-_eext_circle_surface_object_append(Eext_Circle_Surface *surface, Eext_Circle_Object *obj)
-{
-   if (!surface) return;
-   if (!obj) return;
-
-   if (obj->surface)
-     _eext_circle_surface_object_remove(obj->surface, obj);
-
-   // Search whether proper sub-surface exists or not for the circle object.
-   if ((surface->type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME) && surface->sub_surfaces)
-     {
-        Eina_List *l, *l_next;
-        Eext_Circle_Surface *cur_surface;
-
-        EINA_LIST_FOREACH_SAFE(surface->sub_surfaces, l, l_next, cur_surface)
-          {
-             Evas_Object *parent;
-             parent = elm_object_parent_widget_get(obj->image_widget);
-
-             while (parent)
-               {
-                  if (parent == cur_surface->parent)
-                    {
-                       _eext_circle_surface_object_append(cur_surface, obj);
-                       obj->surface = cur_surface;
-                       return;
-                    }
-
-                  parent = elm_object_parent_widget_get(parent);
-                  if (parent == surface->parent) break;
-               }
-
-          }
-     }
-
-   surface->render_objs = eina_list_append(surface->render_objs, obj);
-   _eext_circle_surface_changed(surface);
-   obj->surface = surface;
-
-   if (obj->surface->type != EEXT_CIRCLE_SURFACE_TYPE_PRIVATE)
-     {
-        evas_object_smart_callback_add(obj->image_widget, "rotary,activated",
-                                       _eext_circle_surface_object_rotary_activated_cb, obj);
-        evas_object_smart_callback_add(obj->image_widget, "rotary,deactivated",
-                                       _eext_circle_surface_object_rotary_deactivated_cb, obj);
-
-        if (obj->widget_object)
-          {
-             evas_object_smart_callback_add(obj->widget_object, "rotary,activated",
-                                            _eext_circle_surface_object_rotary_activated_cb, obj);
-             evas_object_smart_callback_add(obj->widget_object, "rotary,deactivated",
-                                            _eext_circle_surface_object_rotary_deactivated_cb, obj);
-          }
-     }
-}
-
-void
-_eext_circle_surface_object_exclusive_show(Eext_Circle_Surface *surface, Eext_Circle_Object *obj)
-{
-   Eext_Circle_Object *render_obj;
-   Eina_List *l;
-
-   if (!surface) return;
-   if (!obj) return;
-
-   if (!evas_object_visible_get(obj->image_widget) &&
-       (obj->widget_object && evas_object_visible_get(obj->widget_object)))
-     evas_object_show(obj->image_widget);
-
-   EINA_LIST_FOREACH(surface->render_objs, l, render_obj)
-     {
-        if (render_obj != obj)
-          evas_object_hide(render_obj->image_widget);
-     }
-}
-
-void
-_eext_circle_surface_changed(Eext_Circle_Surface *surface)
-{
-   if (!surface) return;
-
-   if (!surface->render_job && surface->image_widget &&
-       evas_object_visible_get(surface->image_widget) &&
-       (surface->w != 0) && (surface->h != 0))
-     surface->render_job = ecore_job_add(_eext_circle_surface_render, surface);
-}
-
-Eext_Circle_Surface *
-_eext_circle_surface_add(Evas_Object *parent, Eext_Circle_Surface_Type type)
-{
-   Eext_Circle_Surface *surface;
-   Evas_Object *image_widget = NULL;
-
-   if (!parent) return NULL;
-
-   if (type != EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME)
-     image_widget = _eext_circle_surface_image_widget_add(parent);
-
-   surface = _eext_circle_surface_init(image_widget, parent, type);
-
-   return surface;
-}
-
-////////////////////////
-// EAPI ////////////////
-////////////////////////
-EAPI Eext_Circle_Surface *
-eext_circle_surface_conformant_add(Evas_Object *conform)
-{
-   Eext_Circle_Surface *surface;
-   const char *type = NULL;
-
-   if (!conform)
-     {
-        ERR("The given Evas_Object is NULL! It returns NULL.");
-        return NULL;
-     }
-
-   type = evas_object_type_get(conform);
-
-   if (type && (!strcmp(type, "Elm_Conformant") || !strcmp(type, "elm_conformant")))
-     {
-        if (elm_object_style_set(conform, "circle"))
-          {
-             if (!edje_object_part_exists(elm_layout_edje_get(conform), "elm.swallow.circle"))
-               {
-                  ERR("There is no \"elm.swallow.circle\" part in elm_conformant widget! It returns NULL.");
-                  return NULL;
-               }
-
-             surface = _eext_circle_surface_add(conform, EEXT_CIRCLE_SURFACE_TYPE_DEFAULT);
-
-             if (!surface->image_widget)
-               {
-                  ERR("Surface doesn't have image widget for drawing. It returns NULL.");
-                  return NULL;
-               }
-
-             INF("Put the surface[%p]'s widget[%p] to elm_conformant widget[%p]", surface, surface->image_widget, conform);
-             elm_object_part_content_set(conform, "elm.swallow.circle", surface->image_widget);
-
-             return surface;
-          }
-        else
-          {
-             ERR("elm_object_style_set is failed! The theme doesn't have \"elm/conformant/base/circle\" group. It returns NULL.");
-             return NULL;
-          }
-     }
-
-   ERR("The given Evas_Object[%p] is not elm_conformant widget! It returns NULL.", conform);
-   return NULL;
-}
-
-EAPI Eext_Circle_Surface *
-eext_circle_surface_layout_add(Evas_Object *layout)
-{
-   Eext_Circle_Surface *surface;
-   const char *type = NULL;
-
-   if (!layout)
-     {
-        ERR("The given Evas_Object is NULL! It returns NULL.");
-        return NULL;
-     }
-
-   type = evas_object_type_get(layout);
-
-   if (type && (!strcmp(type, "Elm_Layout") || !strcmp(type, "elm_layout")))
-     {
-        if (elm_layout_theme_set(layout, "layout", "circle", "surface"))
-          {
-             if (!edje_object_part_exists(elm_layout_edje_get(layout), "elm.swallow.circle"))
-               {
-                  ERR("There is no \"elm.swallow.circle\" part in elm_layout widget! It returns NULL.");
-                  return NULL;
-               }
-
-             surface = _eext_circle_surface_add(layout, EEXT_CIRCLE_SURFACE_TYPE_DEFAULT);
-
-             if (!surface->image_widget)
-               {
-                  ERR("Surface doesn't have image widget for drawing. It returns NULL.");
-                  return NULL;
-               }
-
-             INF("Put the surface[%p]'s widget[%p] to layout widget[%p]", surface, surface->image_widget, layout);
-             elm_object_part_content_set(layout, "elm.swallow.circle", surface->image_widget);
-
-             return surface;
-          }
-        else
-          {
-             ERR("elm_layout_theme_set is failed! The theme doesn't have \"elm/layout/circle/surface\" group. It returns NULL.");
-             return NULL;
-          }
-     }
-
-   ERR("The given Evas_Object[%p] is not elm_layout widget! It returns NULL.", layout);
-   return NULL;
-}
-
-EAPI Eext_Circle_Surface *
-eext_circle_surface_naviframe_add(Evas_Object *naviframe)
-{
-   Eext_Circle_Surface *surface;
-   const char *type = NULL;
-
-   if (!naviframe)
-     {
-        ERR("The given Evas_Object is NULL! It returns NULL.");
-        return NULL;
-     }
-
-   type = evas_object_type_get(naviframe);
-
-   if (type && (!strcmp(type, "Elm_Naviframe") || !strcmp(type, "elm_naviframe")))
-     {
-        surface = _eext_circle_surface_add(naviframe, EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME);
-        return surface;
-     }
-
-   ERR("The given Evas_Object[%p] is not elm_naviframe widget! It returns NULL.", naviframe);
-   return NULL;
-}
-
-EAPI void
-eext_circle_surface_del(Eext_Circle_Surface *surface)
-{
-   if (!surface)
-     {
-        ERR("Surface is already NULL");
-        return;
-     }
-
-   if (surface->image_widget)
-     {
-        evas_object_event_callback_del(surface->image_widget, EVAS_CALLBACK_RESIZE, _eext_circle_surface_resize_cb);
-        evas_object_event_callback_del(surface->image_widget, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb);
-        evas_object_del(surface->image_widget);
-        surface->image_widget = NULL;
-     }
-
-   INF("Surface[%p] is going to free in eext_circle_surface_del API.", surface);
-   _eext_circle_surface_del_internal(surface);
-}
diff --git a/wearable/src/lib/circle/efl_extension_rotary.c b/wearable/src/lib/circle/efl_extension_rotary.c
deleted file mode 100644 (file)
index 754fe95..0000000
+++ /dev/null
@@ -1,725 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include <Elementary.h>
-#include "circle/efl_extension_rotary.h"
-#include "efl_extension_private.h"
-#ifdef WITH_X
- #include <Ecore_X.h>
- #include <X11/Xlib.h>
- #include <X11/extensions/XInput2.h>
- #include <X11/extensions/XI2.h>
-#elif WITH_WAYLAND
- #include <Ecore_Wayland.h>
- #include <Ecore_Input.h>
-#endif
-
-
-#define TIZEN_DEV "tizen_detent"
-
-static const char SIG_ACTIVATED[] = "rotary,activated";
-static const char SIG_DEACTIVATED[] = "rotary,deactivated";
-
-static int EEXT_EVENT_ROTARY_ROTATE = 0;
-static Eina_List *_callbacks = NULL;
-static Eina_List *_obj_pri_callbacks = NULL;
-#ifdef WITH_X
-static XIEventMask *_xi_event_mask = NULL;
-#endif
-static Evas_Object *_activated_obj = NULL;
-static int _init_count = 0;
-#ifdef WITH_X
-static Ecore_Event_Handler *_motion_handler = NULL;
-#endif
-#ifdef WITH_WAYLAND
-static Ecore_Event_Handler *_ecore_detent_handler = NULL;
-#endif
-static Ecore_Event_Handler *_rotate_handler = NULL;
-static Eina_Bool _handler_registered = EINA_FALSE;
-static Eina_List *handlers = NULL;
-
-typedef struct _Eext_Rotary_Cb Eext_Rotary_Cb;
-struct _Eext_Rotary_Cb
-{
-   Evas_Object            *obj;
-   Eext_Rotary_Event_Cb    func;
-   void                   *data;
-   Eext_Callback_Priority  pri;
-   Eina_Bool               del_registered;
-};
-
-typedef struct _Rotary_Raw_Info Rotary_Raw_Info;
-struct _Rotary_Raw_Info
-{
-   int                         devid;
-   Eext_Rotary_Event_Direction direction;
-   unsigned int                time_stamp;
-};
-
-typedef struct _Eext_Rotary_Handler Eext_Rotary_Handler;
-struct _Eext_Rotary_Handler
-{
-   Eext_Rotary_Handler_Cb  func;
-   void                   *data;
-};
-
-typedef struct _Eext_Rotary_Obj_Pri Eext_Rotary_Obj_Pri;
-struct _Eext_Rotary_Obj_Pri
-{
-   Evas_Object *obj;
-   Eina_List   *pri_callbacks;
-};
-
-#ifdef WITH_X
-static Eina_Bool _init_Xi2_system(void);
-static Eina_Bool _motion_changed_cb(void *data, int type, void *event_info);
-static void _process_raw_event(void *data, int type, void *raw_event);
-#endif
-#ifdef WITH_WAYLAND
-static Eina_Bool _init_ecore_event(void);
-static Eina_Bool _ecore_detent_cb(void *data, int type, void *event_info);
-#endif
-static Eina_Bool _rotary_rotate_event_cb(void *data, int type, void *event_info);
-static void _object_deleted_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
-static void _remove_ecore_handlers(void);
-static Eina_Bool _rotary_rotate_handler_cb(void *data, Eext_Rotary_Event_Info *info);
-static int _pri_compare(const void *data1, const void *data2);
-static void _activated_obj_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
-
-EAPI Eina_Bool
-eext_rotary_event_handler_add(Eext_Rotary_Handler_Cb func, void *data)
-{
-   Eext_Rotary_Handler *new_hd = NULL;
-   if (!func) return EINA_FALSE;
-
-   ERR("detent: In");
-   /* init event registration */
-   if (!_init_count)
-     {
-        ERR("init_count: %d", _init_count);
-#ifdef WITH_X
-        if (!_init_Xi2_system())
-          {
-             ERR("Failed to init Xi2 system");
-             return EINA_FALSE;
-          }
-#endif
-#ifdef WITH_WAYLAND
-        if (!_init_ecore_event())
-          {
-             ERR("Failed to init ecore_event");
-             return EINA_FALSE;
-          }
-#endif
-     }
-
-#ifdef WITH_X
-   /* register event handlers */
-   if (!_motion_handler)
-     {
-        _motion_handler = ecore_event_handler_add(ECORE_X_EVENT_GENERIC,
-                                                  _motion_changed_cb, NULL);
-        if (!_motion_handler)
-          {
-             ERR("Cannot register generic ecore event handler");
-             return EINA_FALSE;
-          }
-     }
-#endif
-#ifdef WITH_WAYLAND
-   if (!_ecore_detent_handler)
-     {
-        _ecore_detent_handler = ecore_event_handler_add(ECORE_EVENT_DETENT_ROTATE,
-                                                        _ecore_detent_cb, NULL);
-        if (!_ecore_detent_handler)
-          {
-             ERR("Cannot register ecore detent handler");
-             return EINA_FALSE;
-          }
-     }
-#endif
-   if (!_rotate_handler)
-     {
-        _rotate_handler = ecore_event_handler_add(EEXT_EVENT_ROTARY_ROTATE,
-                                                  _rotary_rotate_event_cb, NULL);
-        if (!_rotate_handler)
-          {
-             ERR("Cannot register eext rotate event handler");
-             return EINA_FALSE;
-          }
-     }
-
-   new_hd = malloc(sizeof(Eext_Rotary_Handler));
-   if (!new_hd)
-     {
-        ERR("Cannot allocate memory");
-        return EINA_FALSE;
-     }
-   new_hd->func = func;
-   new_hd->data = data;
-   handlers = eina_list_append(handlers, new_hd);
-
-   return EINA_TRUE;
-}
-
-EAPI void *
-eext_rotary_event_handler_del(Eext_Rotary_Handler_Cb func)
-{
-   ERR("detent: In");
-   Eina_List *l = NULL;
-   Eext_Rotary_Handler *hd = NULL;
-   void *data = NULL;
-
-   EINA_LIST_FOREACH(handlers, l, hd)
-     {
-        if (hd->func == func)
-          {
-             data = hd->data;
-             handlers = eina_list_remove(handlers, hd);
-             free(hd);
-             if (!handlers)
-               {
-                  _remove_ecore_handlers();
-               }
-             break;
-          }
-     }
-   return data;
-}
-
-EAPI Eina_Bool
-eext_rotary_object_event_callback_add(Evas_Object *obj, Eext_Rotary_Event_Cb func, void *data)
-{
-   INF("In");
-   return eext_rotary_object_event_callback_priority_add(obj, 0, func, data);
-}
-
-EAPI Eina_Bool
-eext_rotary_object_event_callback_priority_add(Evas_Object *obj, Eext_Callback_Priority priority, Eext_Rotary_Event_Cb func, void *data)
-{
-   ERR("detent: In");
-   Eina_List *l;
-   Eext_Rotary_Obj_Pri *op = NULL;
-   Eext_Rotary_Cb *cb = NULL, *new_cb = NULL;
-   Eina_Bool registered = EINA_FALSE;
-   Eina_Bool added = EINA_FALSE;
-
-   if ((!obj) || (!func)) return EINA_FALSE;
-
-   if (!_handler_registered)
-     {
-        if (!eext_rotary_event_handler_add(_rotary_rotate_handler_cb, NULL))
-          {
-             ERR("Cannot register rotary handler");
-             return EINA_FALSE;
-          }
-        _handler_registered = EINA_TRUE;
-     }
-
-   new_cb = malloc(sizeof(Eext_Rotary_Cb));
-   if (!new_cb)
-     {
-        ERR("Cannot allocate memory");
-        return EINA_FALSE;
-     }
-   new_cb->obj = obj;
-   new_cb->func = func;
-   new_cb->data = data;
-   new_cb->pri = priority;
-   new_cb->del_registered = EINA_FALSE;
-
-   EINA_LIST_FOREACH(_obj_pri_callbacks, l, op)
-     {
-        if (op->obj == obj)
-          {
-             added = EINA_TRUE;
-             op->pri_callbacks = eina_list_sorted_insert(op->pri_callbacks,
-                                                         _pri_compare, new_cb);
-             break;
-          }
-     }
-   if (!added)
-     {
-        Eext_Rotary_Obj_Pri *new_op = NULL;
-
-        new_op = calloc(1, sizeof(Eext_Rotary_Obj_Pri));
-        if (!new_op)
-          {
-             ERR("Cannot allocate memory");
-             free(new_cb);
-             return EINA_FALSE;
-          }
-        new_op->obj = obj;
-        new_op->pri_callbacks = eina_list_append(new_op->pri_callbacks, new_cb);
-        _obj_pri_callbacks = eina_list_append(_obj_pri_callbacks, new_op);
-     }
-   _callbacks = eina_list_append(_callbacks, new_cb);
-
-   EINA_LIST_FOREACH(_callbacks, l, cb)
-     {
-        if (cb->obj == obj)
-          {
-             if (cb->del_registered)
-               {
-                  registered = EINA_TRUE;
-                  break;
-               }
-          }
-     }
-   if (!registered)
-     {
-        evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
-                                       _object_deleted_cb, obj);
-        new_cb->del_registered = EINA_TRUE;
-     }
-
-   return EINA_TRUE;
-}
-
-EAPI void *
-eext_rotary_object_event_callback_del(Evas_Object *obj, Eext_Rotary_Event_Cb func)
-{
-   INF("In");
-   Eina_List *l = NULL;
-   Eext_Rotary_Cb *cb = NULL;
-   void *data = NULL;
-
-   ERR("callback del 0x%x, %s, func : 0x%x", obj, evas_object_type_get(obj), func);
-
-   EINA_LIST_FOREACH(_callbacks, l, cb)
-     {
-        if ((cb->func == func) && (cb->obj == obj))
-          {
-             data = cb->data;
-             _callbacks = eina_list_remove(_callbacks, cb);
-             INF("Removed cb from callbacks");
-             break;
-          }
-        cb = NULL;
-     }
-   if (cb)
-     {
-        Eext_Rotary_Obj_Pri *op = NULL;
-
-        EINA_LIST_FOREACH(_obj_pri_callbacks, l, op)
-          {
-             if (op->obj == obj)
-               {
-                  op->pri_callbacks = eina_list_remove(op->pri_callbacks, cb);
-                  break;
-               }
-          }
-        free(cb);
-        INF("Freed cb");
-     }
-   if (!_callbacks)
-     {
-        eext_rotary_event_handler_del(_rotary_rotate_handler_cb);
-        _handler_registered = EINA_FALSE;
-     }
-   INF("done");
-
-   return data;
-}
-
-EAPI void
-eext_rotary_object_event_activated_set(Evas_Object *obj, Eina_Bool activated)
-{
-   if (!obj) return;
-
-   ERR("eext_rotary_object_event_activated_set : 0x%x, %s, _activated_obj : 0x%x, activated : %d", obj, evas_object_type_get(obj), _activated_obj, activated);
-
-   if (activated)
-     {
-        if (_activated_obj != obj)
-          {
-             if (_activated_obj != NULL)
-               {
-                  ERR("Activation delete!!!!");
-                  evas_object_event_callback_del(_activated_obj, EVAS_CALLBACK_DEL, _activated_obj_del_cb);
-                  evas_object_smart_callback_call(_activated_obj, SIG_DEACTIVATED, NULL);
-               }
-             _activated_obj = obj;
-             evas_object_event_callback_add(_activated_obj, EVAS_CALLBACK_DEL, _activated_obj_del_cb, NULL);
-          }
-        evas_object_smart_callback_call(_activated_obj, SIG_ACTIVATED, NULL);
-     }
-   else
-     {
-        if (obj == _activated_obj && _activated_obj != NULL)
-          {
-             evas_object_event_callback_del(_activated_obj, EVAS_CALLBACK_DEL, _activated_obj_del_cb);
-             evas_object_smart_callback_call(_activated_obj, SIG_DEACTIVATED, NULL);
-             _activated_obj = NULL;
-          }
-     }
-}
-
-#ifdef WITH_WAYLAND
-static void
-_rotary_rotate_event_free(void *udata EINA_UNUSED, void *fdata)
-{
-   ERR("detent: In");
-   INF("In: ddata: %p", fdata);
-   free(fdata);
-}
-
-static Eina_Bool
-_init_ecore_event(void)
-{
-   ERR("detent: In");
-   if (!ecore_event_init()) return EINA_FALSE;
-   EEXT_EVENT_ROTARY_ROTATE = ecore_event_type_new();
-   return EINA_TRUE;
-}
-static Eina_Bool
-_ecore_detent_cb(void *data, int type, void *event_info)
-{
-   ERR("detent: In");
-   Ecore_Event_Detent_Rotate *e = event_info;
-   Rotary_Raw_Info *event = NULL;
-
-   event = calloc(1, sizeof(Rotary_Raw_Info));
-   if (!event)
-     {
-        ERR("Cannot allocate memory");
-        return ECORE_CALLBACK_PASS_ON;
-     }
-   if (e->direction == ECORE_DETENT_DIRECTION_CLOCKWISE)
-     event->direction =  EEXT_ROTARY_DIRECTION_CLOCKWISE;
-   else
-     event->direction =  EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE;
-   event->time_stamp = e->timestamp;
-   ERR("detent: new EEXT_EVENT_ROTARY_ROTATE ecore event");
-   ecore_event_add(EEXT_EVENT_ROTARY_ROTATE, event, _rotary_rotate_event_free, NULL);
-
-   return ECORE_CALLBACK_PASS_ON;
-}
-#endif
-
-#ifdef WITH_X
-static Eina_Bool
-_init_Xi2_system(void)
-{
-   INF("In");
-   Ecore_X_Display *display = NULL;
-   Ecore_X_Window root_win;
-   int opcode = 0, event = 0, error = 0;
-   int major = XI_2_Major;
-   int minor = XI_2_Minor;
-   int dev_count = 0;
-   int i = 0;
-
-   if (_init_count > 0) return EINA_TRUE;
-   _init_count++;
-
-   EEXT_EVENT_ROTARY_ROTATE = ecore_event_type_new();
-   _xi_event_mask = (XIEventMask *)calloc(1, sizeof(XIEventMask));
-   display = ecore_x_display_get();
-   root_win = ecore_x_window_root_first_get();
-
-   /* Initialize Xi2 system */
-   /* Check if X input extension available */
-   if (!XQueryExtension((Display *)display, "XInputExtension", &opcode,
-                        &event, &error))
-     {
-        ERR("Failed to query XInputExtension");
-        return EINA_FALSE;
-     }
-
-   /* We support version 2.0 */
-   if (XIQueryVersion((Display *)display, &major, &minor) == BadRequest)
-     {
-        ERR("Failed to query XI Version");
-        return EINA_FALSE;
-     }
-
-   _xi_event_mask->deviceid = XIAllDevices;
-
-   /* Check device id */
-   XIDeviceInfo *dev_info = NULL;
-   dev_info = XIQueryDevice(display, XIAllDevices, &dev_count);
-
-   for (i = 0; i < dev_count; i++)
-     {
-        XIDeviceInfo *di = &(dev_info[i]);
-        if (!strncmp(di->name, TIZEN_DEV, sizeof(TIZEN_DEV)))
-          {
-             _xi_event_mask->deviceid = di->deviceid;
-             break;
-          }
-     }
-
-   if (dev_info) XIFreeDeviceInfo(dev_info);
-   /* SelectXi2Event */
-   _xi_event_mask->mask = (unsigned char *)(calloc(1, XIMaskLen(XI_LASTEVENT)));
-   XISetMask(_xi_event_mask->mask, XI_RawMotion);
-   _xi_event_mask->mask_len = sizeof(_xi_event_mask->mask);
-   int ret = XISelectEvents((Display *)display, (Window)root_win, _xi_event_mask, 1);
-   if (ret != 0)
-     {
-        ERR("Failed to Select Events");
-        return EINA_FALSE;
-     }
-
-   INF("Done");
-   return EINA_TRUE;
-}
-
-static Eina_Bool
-_motion_changed_cb(void *data, int type, void *event_info)
-{
-   Ecore_X_Event_Generic *ev = event_info;
-
-   switch((int)(ev->evtype))
-     {
-      case XI_RawMotion:
-         _process_raw_event(data, type, (XIRawEvent *)ev->data);
-         break;
-     }
-
-   return ECORE_CALLBACK_PASS_ON;
-}
-
-static void
-_rotary_rotate_event_free(void *udata EINA_UNUSED, void *fdata)
-{
-   INF("In: ddata: %p", fdata);
-   free(fdata);
-}
-
-static void
-_process_raw_event(void *data EINA_UNUSED, int type EINA_UNUSED, void *raw_event)
-{
-   XIRawEvent *xi_raw_event = raw_event;
-   double *value = xi_raw_event->raw_values;
-   Rotary_Raw_Info *event = NULL;
-
-   if (_xi_event_mask->deviceid != xi_raw_event->deviceid)
-     {
-        return;
-     }
-
-   INF("In");
-   event = calloc(1, sizeof(Rotary_Raw_Info));
-   if (!event)
-     {
-        ERR("Cannot allocate memory");
-        return;
-     }
-   event->devid = xi_raw_event->deviceid;
-   /** X(0): rotate: NOT USED;
-     Y(1): timestamp;
-     Z(2): direction (-1: counter clockwise, 1: clockwise, 0: None)
-    **/
-   if (XIMaskIsSet(xi_raw_event->valuators.mask, 1))
-     {
-        event->time_stamp = (unsigned int)(*(value + 1));
-        INF("time stamp: %d", event->time_stamp);
-     }
-   if (XIMaskIsSet(xi_raw_event->valuators.mask, 2))
-     {
-        int dir = (int)(*(value + 2));
-        INF("raw dir: %d", dir);
-        switch (dir)
-          {
-           case -1:
-              event->direction =  EEXT_ROTARY_DIRECTION_COUNTER_CLOCKWISE;
-              INF("direction: Counter Clockwise");
-              ecore_event_add(EEXT_EVENT_ROTARY_ROTATE, event,
-                              _rotary_rotate_event_free, NULL);
-              break;
-           case 1:
-              event->direction = EEXT_ROTARY_DIRECTION_CLOCKWISE;
-              INF("direction: Clockwise");
-              ecore_event_add(EEXT_EVENT_ROTARY_ROTATE, event,
-                              _rotary_rotate_event_free, NULL);
-              break;
-           case 0:
-              INF("Not detent");
-              free(event);
-              break;
-           default:
-              INF("Should not get in here");
-              free(event);
-          }
-     }
-   else
-     {
-        free(event);
-     }
-}
-#endif
-
-static Eina_Bool
-_rotary_rotate_event_cb(void *data EINA_UNUSED, int type EINA_UNUSED, void *event_info)
-{
-   INF("In");
-   Eina_List *l;
-   Eext_Rotary_Handler *hd;
-   Rotary_Raw_Info *ev = event_info;
-   Eext_Rotary_Event_Info info;
-   info.direction = ev->direction;
-   info.time_stamp = ev->time_stamp;
-
-   EINA_LIST_FOREACH(handlers, l, hd)
-     {
-        if (!hd->func(hd->data, &info))
-          {
-             return ECORE_CALLBACK_DONE;
-          }
-     }
-
-   return ECORE_CALLBACK_PASS_ON;
-}
-
-static int
-_pri_compare(const void *data1, const void *data2)
-{
-   const Eext_Rotary_Cb *cb1 = data1;
-   const Eext_Rotary_Cb *cb2 = data2;
-   if (cb1 && cb2)
-     {
-        if (cb1->pri < cb2->pri)
-          return -1;
-        else if (cb1->pri > cb2->pri)
-          return 1;
-        else
-          return 0;
-     }
-
-   return 0;
-}
-
-static Eina_Bool
-_rotary_rotate_handler_cb(void *data EINA_UNUSED, Eext_Rotary_Event_Info *info)
-{
-   ERR("_rotary_rotate_handler_cb : 0x%x, %s, %d", _activated_obj, evas_object_type_get(_activated_obj), evas_object_visible_get(_activated_obj));
-   Eina_List *l;
-   Eext_Rotary_Cb *cb;
-
-   if (!info) return EINA_TRUE;
-
-   /* Deliver to the activated object and its parents */
-   if ((_activated_obj) &&
-       (evas_focus_state_get(evas_object_evas_get(_activated_obj))) &&
-       (evas_object_visible_get(_activated_obj)))
-     {
-        Evas_Object *obj = NULL;
-        Eext_Rotary_Obj_Pri *op = NULL;
-
-        obj = _activated_obj;
-        while(obj)
-          {
-             if (obj == _activated_obj)
-               {
-                 if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
-                    INF("Deliver clockwise rotary event to object: %p, %s, time_stamp : %d", obj, evas_object_type_get(obj), info->time_stamp);
-                 else
-                    INF("Deliver counter clockwise rotary event to object: %p, %s, time_stamp : %d", obj, evas_object_type_get(obj), info->time_stamp);
-               }
-             EINA_LIST_FOREACH(_obj_pri_callbacks, l, op)
-               {
-                  if (op->obj == obj)
-                    {
-                       EINA_LIST_FOREACH(op->pri_callbacks, l, cb)
-                         {
-                            if (!cb->func(cb->data, obj, info))
-                              {
-                                 return EINA_FALSE;
-                              }
-                         }
-                       break;
-                    }
-               }
-             obj = elm_object_parent_widget_get(obj);
-          }
-     }
-
-   return EINA_TRUE;
-}
-
-static void
-_remove_ecore_handlers(void)
-{
-   INF("In");
-#ifdef HAVE_X
-   if (_motion_handler)
-     {
-        ecore_event_handler_del(_motion_handler);
-        _motion_handler = NULL;
-        INF("removed _motion_handler");
-     }
-#endif
-#ifdef HAVE_WAYLAND
-   if (_ecore_detent_handler)
-     {
-        ecore_event_handler_del(_ecore_detent_handler);
-        _ecore_detent_handler = NULL;
-        INF("removed _ecore_detent_handler");
-     }
-#endif
-   if (_rotate_handler)
-     {
-        ecore_event_handler_del(_rotate_handler);
-        _rotate_handler = NULL;
-        INF("removed _rotate_handler");
-     }
-}
-
-static void
-_object_deleted_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info EINA_UNUSED)
-{
-   ERR("In: data: %p, obj: %p", data, obj);
-   Eina_List *l = NULL;
-
-   Eext_Rotary_Obj_Pri *op = NULL;
-   EINA_LIST_FOREACH(_obj_pri_callbacks, l, op)
-     {
-        if (op->obj == obj)
-          {
-             Eina_List *l1 = NULL;
-             Eext_Rotary_Cb *cb = NULL;
-
-             EINA_LIST_FOREACH(op->pri_callbacks, l1, cb)
-               {
-                  _callbacks = eina_list_remove(_callbacks, cb);
-                  op->pri_callbacks = eina_list_remove(op->pri_callbacks, cb);
-                  free(cb);
-               }
-             _obj_pri_callbacks = eina_list_remove(_obj_pri_callbacks, op);
-             free(op);
-             break;
-          }
-     }
-   if (!_callbacks)
-     {
-        eext_rotary_event_handler_del(_rotary_rotate_handler_cb);
-        _handler_registered = EINA_FALSE;
-     }
-   if (_activated_obj == obj)
-     _activated_obj = NULL;
-   INF("done");
-}
-
-static void
-_activated_obj_del_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
-{
-   ERR("_activated_obj_del_cb : 0x%x", _activated_obj);
-
-   evas_object_event_callback_del(_activated_obj, EVAS_CALLBACK_DEL, _activated_obj_del_cb);
-   _activated_obj = NULL;
-}
diff --git a/wearable/src/lib/common/efl_extension_more_option.c b/wearable/src/lib/common/efl_extension_more_option.c
deleted file mode 100644 (file)
index 1855fbf..0000000
+++ /dev/null
@@ -1,676 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "efl_extension.h"
-#include "efl_extension_private.h"
-#include "circle/efl_extension_circle_private.h"
-#include "common/efl_extension_common_private.h"
-
-#define EEXT_MORE_OPTION_DATA_KEY "eext_more_option_data"
-
-/* === /internal object cb & util === */
-static void _drawer_back_cb(void *data, Evas_Object *obj, void *event_info);
-static void _panel_active_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
-static void _panel_inactive_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
-static void _panel_cue_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
-static void _panel_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
-static void _cue_hide_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
-static void _cue_show_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
-
-/* === internal object creation (elm-demo-tizen/drawer.c) === */
-static Evas_Object *_drawer_layout_create(Evas_Object *parent);
-static Evas_Object *_panel_create(Evas_Object *parent, Eext_More_Option_Data *mold);
-
-/* === more option API === */
-static Eext_More_Option_Data *_more_option_data_init(Evas_Object *obj, Evas_Object *parent);
-static Eext_More_Option_Data *_more_option_data_get(const Evas_Object *more_option);
-static void _more_option_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
-
-/* === Accessibility === */
-static Eina_Bool _access_action_cb(void *data, Evas_Object *obj, Elm_Access_Action_Info *action_info);
-static char * _accessibility_name_set_cb(void *data, Evas_Object *obj);
-
-/* === internal object cb & util === */
-static void
-_drawer_back_cb(void *data, Evas_Object *obj, void *event_info)
-{
-   Evas_Object *panel = obj;
-   if (!panel)
-     {
-        ERR("panel is NULL!!");
-        return;
-     }
-
-   Eext_More_Option_Data *mold = data;
-   if (!mold)
-     {
-        ERR("mold is NULL!!");
-        return;
-     }
-
-   if (!elm_panel_hidden_get(panel)) elm_panel_toggle(panel);
-}
-
-static void
-_panel_active_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
-{
-   Eext_More_Option_Data *mold = data;
-
-   if (mold)
-     {
-        evas_object_smart_callback_call(mold->more_option, "more,option,opened", NULL);
-        eext_rotary_object_event_activated_set(mold->rotary_selector, EINA_TRUE);
-        eext_object_event_callback_add(obj, EEXT_CALLBACK_BACK, _drawer_back_cb, mold);
-
-        Edje_Message_Int_Set *msg = malloc(sizeof(Edje_Message_Int_Set));
-        if (!msg) return;
-
-        msg->count = 1;
-        msg->val[0] = 0;
-
-        Evas_Object* content_part = elm_object_part_content_get(mold->rotary_selector, "content");
-        if (content_part)
-          {
-             edje_object_message_send(elm_layout_edje_get(content_part), EDJE_MESSAGE_INT_SET, 0, msg);
-          }
-        else
-          free(msg);
-        //for accessibility
-        // signal send to rotary selector for highlighted access object
-        if(elm_atspi_bridge_utils_is_screen_reader_enabled())
-          {
-             evas_object_smart_callback_call(mold->rotary_selector, "more,option,opened", NULL);
-             elm_atspi_accessible_can_highlight_set(mold->cue_access_object, EINA_FALSE);
-             evas_object_show(mold->rotary_selector);
-          }
-        //
-     }
-}
-
-static void
-_panel_inactive_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
-{
-   Eext_More_Option_Data *mold = data;
-   if (mold)
-     {
-        evas_object_smart_callback_call(mold->more_option, "more,option,closed", NULL);
-        eext_rotary_object_event_activated_set(mold->rotary_selector, EINA_FALSE);
-
-        Edje_Message_Int_Set *msg = malloc(sizeof(Edje_Message_Int_Set));
-        if (!msg) return;
-
-        msg->count = 1;
-        msg->val[0] = 1;
-
-        Evas_Object* content_part = elm_object_part_content_get(mold->rotary_selector, "content");
-        if (content_part)
-          {
-             edje_object_message_send(elm_layout_edje_get(content_part), EDJE_MESSAGE_INT_SET, 0, msg);
-          }
-        else
-          free(msg);
-
-        //item index is initialized as zero.
-        if (mold->rotary_selector)
-          {
-             //Initialize item to zero
-             Eina_List *l = NULL;
-             Eext_Object_Item *item = NULL;
-             EINA_LIST_FOREACH(mold->item_list, l, item)
-               {
-                  break;
-               }
-
-             eext_rotary_selector_selected_item_set(mold->rotary_selector, item);
-          }
-
-        //for accessibility
-        // signal send to rotary selector for highlighted access object
-        if(elm_atspi_bridge_utils_is_screen_reader_enabled())
-          {
-             elm_atspi_accessible_can_highlight_set(mold->cue_access_object, EINA_TRUE);
-             elm_atspi_component_highlight_grab(mold->cue_access_object);
-             evas_object_smart_callback_call(mold->rotary_selector, "more,option,closed", NULL);
-             evas_object_hide(mold->rotary_selector);
-          }
-        //
-     }
-
-   eext_object_event_callback_del(obj, EEXT_CALLBACK_BACK, _drawer_back_cb);
-}
-
-static void
-_panel_cue_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
-{
-   INF("more_option cue clicked!!");
-
-   Eext_More_Option_Data *mold = data;
-   if (mold)
-     evas_object_smart_callback_call(mold->more_option, "cue,clicked", NULL);
-}
-
-static void
-_panel_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
-   elm_layout_signal_callback_del(obj, "elm,state,active,finished", "elm", _panel_active_cb);
-   elm_layout_signal_callback_del(obj, "elm,state,inactive,finished", "elm", _panel_inactive_cb);
-   elm_layout_signal_callback_del(obj, "cue,hide", "ext", _cue_hide_cb);
-   elm_layout_signal_callback_del(obj, "cue,show", "ext", _cue_show_cb);
-}
-
-/* === internal object creation (elm-demo-tizen/drawer.c) === */
-static Evas_Object *
-_drawer_layout_create(Evas_Object *parent)
-{
-   Evas_Object *layout;
-   layout = elm_layout_add(parent);
-   if (!layout)
-     {
-        ERR("drawer layout is NULL");
-        return NULL;
-     }
-
-   elm_layout_theme_set(layout, "layout", "drawer", "panel");
-   evas_object_show(layout);
-
-   return layout;
-}
-
-static Evas_Object *
-_panel_create(Evas_Object *parent, Eext_More_Option_Data *mold)
-{
-   Evas_Object *panel;
-
-   panel = elm_panel_add(parent);
-   if (!panel)
-     {
-        ERR("panel is NULL");
-        return NULL;
-     }
-
-   evas_object_show(panel);
-
-   //Default : right
-   elm_panel_orient_set(panel, ELM_PANEL_ORIENT_RIGHT);
-   elm_object_part_content_set(parent, "elm.swallow.right", panel);
-
-   evas_object_event_callback_add(panel, EVAS_CALLBACK_DEL, _panel_del_cb, NULL);
-
-   return panel;
-}
-
-/* === more option API === */
-static Eext_More_Option_Data *
-_more_option_data_init(Evas_Object *obj, Evas_Object *parent)
-{
-   Eext_More_Option_Data *mold = NULL;
-
-   mold = (Eext_More_Option_Data *)calloc(1, sizeof(Eext_More_Option_Data));
-   if (!mold)
-     {
-        ERR("mold is NULL!!");
-        return NULL;
-     }
-
-   mold->parent = parent;
-   mold->more_option = obj;
-   mold->item_list = NULL;
-   mold->panel = NULL;
-   mold->rotary_selector = NULL;
-   mold->direction = EEXT_MORE_OPTION_DIRECTION_RIGHT;
-
-   return mold;
-}
-
-static Eext_More_Option_Data *
-_more_option_data_get(const Evas_Object *more_option)
-{
-   if (!more_option)
-     {
-        ERR("more_option is NULL!!");
-        return NULL;
-     }
-
-   return evas_object_data_get(more_option, EEXT_MORE_OPTION_DATA_KEY);
-}
-
-static void
-_more_option_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
-   Eext_More_Option_Data *mold = data;
-
-   if (mold->item_list)
-     {
-        mold->item_list = eina_list_free(mold->item_list);
-     }
-
-   evas_object_data_del(obj, EEXT_MORE_OPTION_DATA_KEY);
-
-   free(mold);
-}
-
-static void
-_cue_hide_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
-{
-   INF("called!!");
-
-   Eext_More_Option_Data *mold = data;
-
-   elm_layout_signal_emit(mold->panel, "cue,hide", "elm");
-}
-
-static void
-_cue_show_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
-{
-   INF("called!!");
-
-   Eext_More_Option_Data *mold = data;
-
-   elm_layout_signal_emit(mold->panel, "cue,show", "elm");
-}
-
-static void
-_rotary_selector_item_clicked(void *data, Evas_Object *obj, void *event_info)
-{
-   Eext_More_Option_Data *mold = (Eext_More_Option_Data *)data;
-   evas_object_smart_callback_call(mold->more_option, "item,clicked", event_info);
-}
-
-static void
-_rotary_selector_item_selected(void *data, Evas_Object *obj, void *event_info)
-{
-   Eext_More_Option_Data *mold = (Eext_More_Option_Data *)data;
-   evas_object_smart_callback_call(mold->more_option, "item,selected", event_info);
-}
-
-/* === public API implementation === */
-
-EAPI Evas_Object *
-eext_more_option_add(Evas_Object *parent)
-{
-   if (!parent)
-     {
-        ERR("parent is NULL!!");
-        return NULL;
-     }
-
-   Eext_More_Option_Data *mold = NULL;
-   Evas_Object *more_option = NULL;
-
-   more_option = _drawer_layout_create(parent);
-   if (!more_option)
-     {
-        ERR("more_option is NULL!!");
-        return NULL;
-     }
-
-   mold = _more_option_data_init(more_option, parent);
-   if (!mold)
-     {
-        ERR("mold is NULL!!");
-        return NULL;
-     }
-
-   evas_object_data_set(mold->more_option, EEXT_MORE_OPTION_DATA_KEY, mold);
-   elm_layout_signal_callback_add(mold->more_option, "cue,hide", "ext", _cue_hide_cb, mold);
-   elm_layout_signal_callback_add(mold->more_option, "cue,show", "ext", _cue_show_cb, mold);
-   evas_object_event_callback_add(mold->more_option, EVAS_CALLBACK_DEL, _more_option_del_cb, mold);
-
-   mold->panel = _panel_create(mold->more_option, mold);
-   if (!mold->panel)
-     {
-        ERR("panel is NULL!!");
-        return NULL;
-     }
-
-   elm_layout_signal_callback_add(mold->panel, "elm,state,active,finished", "elm", _panel_active_cb, mold);
-   elm_layout_signal_callback_add(mold->panel, "elm,state,inactive,finished", "elm", _panel_inactive_cb, mold);
-   elm_layout_signal_callback_add(mold->panel, "cue,clicked", "elm", _panel_cue_clicked_cb, mold);
-
-   mold->rotary_selector = eext_rotary_selector_add(mold->more_option);
-   if (!mold->rotary_selector)
-     {
-        ERR("rotary_selector is NULL!!");
-        return NULL;
-     }
-   _rotary_selector_from_moreoption_set(mold->rotary_selector, EINA_TRUE);
-
-   evas_object_smart_callback_add(mold->rotary_selector, "item,selected", _rotary_selector_item_selected, mold);
-   evas_object_smart_callback_add(mold->rotary_selector, "item,clicked", _rotary_selector_item_clicked, mold);
-
-   Evas_Object *selector_content = elm_layout_add(mold->rotary_selector);
-   if (!selector_content)
-     {
-        ERR("selector_content is NULL!!");
-        return NULL;
-     }
-
-   elm_layout_theme_set(selector_content, "rotary_selector", "content", "more_option");
-
-   elm_object_part_content_set(mold->rotary_selector, "content", selector_content);
-
-   elm_object_content_set(mold->panel, mold->rotary_selector);
-
-   elm_panel_toggle(mold->panel);
-
-   //for accessibility
-   if(elm_atspi_bridge_utils_is_screen_reader_enabled())
-     {
-        evas_object_hide(mold->rotary_selector);
-
-        Evas_Object *to = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(mold->panel), "access");
-        mold->cue_access_object = elm_access_object_register(to, parent);
-
-        elm_atspi_accessible_name_cb_set(mold->cue_access_object, _accessibility_name_set_cb, (Eext_More_Option_Data*)mold);
-        elm_atspi_accessible_role_set(mold->cue_access_object, ELM_ATSPI_ROLE_PUSH_BUTTON);
-        elm_atspi_accessible_reading_info_type_set(mold->cue_access_object, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME);
-        elm_access_action_cb_set(mold->cue_access_object, ELM_ACCESS_ACTION_ACTIVATE, _access_action_cb, mold);
-     }
-   //
-
-   return mold->more_option;
-}
-
-EAPI void
-eext_more_option_direction_set(Evas_Object *obj, Eext_More_Option_Direction direction)
-{
-   if (!obj)
-     {
-        ERR("obj is NULL!!");
-        return;
-     }
-
-   Eext_More_Option_Data *mold = NULL;
-   mold = _more_option_data_get(obj);
-   if (mold)
-     {
-        elm_panel_orient_set(mold->panel, direction);
-        mold->direction = direction;
-     }
-}
-
-EAPI Eext_More_Option_Direction
-eext_more_option_direction_get(const Evas_Object *obj)
-{
-   if (!obj)
-     {
-        ERR("obj is NULL!!");
-        return EEXT_MORE_OPTION_DIRECTION_RIGHT; // defalut
-     }
-
-   Eext_More_Option_Data *mold = NULL;
-   mold = _more_option_data_get((Evas_Object *)obj);
-   if (mold)
-     {
-        Elm_Panel_Orient orient = elm_panel_orient_get(mold->panel);
-        return (Eext_More_Option_Direction)orient;
-     }
-
-   return EEXT_MORE_OPTION_DIRECTION_RIGHT; // defalut
-}
-
-EAPI Eext_Object_Item *
-eext_more_option_item_append(Evas_Object *obj)
-{
-   Eext_Object_Item *item = NULL;
-   Eext_More_Option_Data *mold = NULL;
-   mold = _more_option_data_get(obj);
-   if (!mold)
-     {
-        ERR("mold is NULL!!");
-        return NULL;
-     }
-
-   item = eext_rotary_selector_item_append(mold->rotary_selector);
-
-   mold->item_list = eina_list_append(mold->item_list, item);
-
-   return item;
-}
-
-EAPI Eext_Object_Item *
-eext_more_option_item_prepend(Evas_Object *obj)
-{
-   Eext_More_Option_Data *mold = NULL;
-   Eext_Object_Item *item = NULL;
-
-   mold = _more_option_data_get(obj);
-   if (!mold)
-     {
-        ERR("mold is NULL!!");
-        return NULL;
-     }
-
-   item = eext_rotary_selector_item_prepend(mold->rotary_selector);
-
-   mold->item_list = eina_list_prepend(mold->item_list, item);
-
-   return item;
-}
-
-EAPI Eext_Object_Item *
-eext_more_option_item_insert_after(Evas_Object *obj, Eext_Object_Item *after)
-{
-   Eext_More_Option_Data *mold = NULL;
-   Eext_Object_Item *item = NULL;
-
-   mold = _more_option_data_get(obj);
-   if (!mold)
-     {
-        ERR("mold is NULL!!");
-        return NULL;
-     }
-
-   item = eext_rotary_selector_item_insert_after(mold->rotary_selector, after);
-
-   mold->item_list = eina_list_append_relative(mold->item_list, item, after);
-
-   return item;
-}
-
-EAPI Eext_Object_Item *
-eext_more_option_item_insert_before(Evas_Object *obj, Eext_Object_Item *before)
-{
-   Eext_More_Option_Data *mold = NULL;
-   Eext_Object_Item *item = NULL;
-
-   mold = _more_option_data_get(obj);
-   if (!mold)
-     {
-        ERR("mold is NULL!!");
-        return NULL;
-     }
-
-   item = eext_rotary_selector_item_insert_before(mold->rotary_selector, before);
-
-   mold->item_list = eina_list_prepend_relative(mold->item_list, item, before);
-
-   return item;
-}
-
-EAPI void
-eext_more_option_item_del(Eext_Object_Item *item)
-{
-   //Temporary
-   Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item;
-   if (!rotary_selector_item)
-     {
-        ERR("rotary_selector_item is NULL!!");
-        return;
-     }
-
-   Eext_More_Option_Data *mold = _more_option_data_get(rotary_selector_item->parent);
-   if (!mold)
-     {
-        ERR("mold is NULL!!");
-        return;
-     }
-
-   eext_rotary_selector_item_del(item);
-
-   mold->item_list = eina_list_remove(mold->item_list, item);
-
-   return;
-}
-
-EAPI void
-eext_more_option_items_clear(Evas_Object *obj)
-{
-   Evas_Object *more_option = obj;
-   Eext_More_Option_Data *mold = NULL;
-
-   if (!more_option)
-     {
-        ERR("more_option is NULL!!");
-        return;
-     }
-
-   mold = _more_option_data_get(more_option);
-   if (!mold)
-     {
-        ERR("mold is NULL!!");
-        return;
-     }
-   eext_rotary_selector_items_clear(mold->rotary_selector);
-
-   mold->item_list = eina_list_free(mold->item_list);
-
-   return;
-}
-
-EAPI void
-eext_more_option_item_part_text_set(Eext_Object_Item *item, const char *part_name, const char *text)
-{
-   eext_rotary_selector_item_part_text_set(item, part_name, text);
-
-   return;
-}
-
-EAPI void
-eext_more_option_item_domain_translatable_part_text_set(Eext_Object_Item *item, const char *part_name, const char *domain, const char *text)
-{
-   eext_rotary_selector_item_domain_translatable_part_text_set(item, part_name, domain, text);
-
-   return;
-}
-
-EAPI const char *
-eext_more_option_item_part_text_get(const Eext_Object_Item *item, const char *part_name)
-{
-   return eext_rotary_selector_item_part_text_get(item, part_name);
-}
-
-EAPI void
-eext_more_option_item_part_content_set(Eext_Object_Item *item, const char *part_name, Evas_Object *content)
-{
-   eext_rotary_selector_item_part_content_set(item, part_name, EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL, content);
-
-   return;
-}
-
-EAPI Evas_Object *
-eext_more_option_item_part_content_get(const Eext_Object_Item *item, const char *part_name)
-{
-   return eext_rotary_selector_item_part_content_get(item, part_name, EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL);
-}
-
-EAPI void
-eext_more_option_opened_set(Evas_Object *obj, Eina_Bool opened)
-{
-   if (!obj)
-     {
-        ERR("obj is NULL!!");
-        return;
-     }
-
-   Eext_More_Option_Data *mold = NULL;
-   mold = _more_option_data_get(obj);
-   if (mold)
-     {
-        if (elm_panel_hidden_get(mold->panel) && opened) elm_panel_toggle(mold->panel);
-        else if (!elm_panel_hidden_get(mold->panel) && !opened) elm_panel_toggle(mold->panel);
-     }
-}
-
-EAPI Eina_Bool
-eext_more_option_opened_get(Evas_Object *obj)
-{
-   if (!obj)
-     {
-        ERR("obj is NULL!!");
-        return EINA_FALSE;
-     }
-
-   Eext_More_Option_Data *mold = NULL;
-   mold = _more_option_data_get(obj);
-   if (mold)
-     {
-        return !elm_panel_hidden_get(mold->panel);
-     }
-
-   return EINA_FALSE;
-}
-
-EAPI const Eina_List*
-eext_more_option_items_get(const Evas_Object *obj)
-{
-   const Evas_Object *more_option = obj;
-   Eext_More_Option_Data *mold = NULL;
-
-   if (!more_option)
-     {
-        ERR("more_option is NULL!!");
-        return NULL;
-     }
-
-   mold = _more_option_data_get(more_option);
-   if (!mold)
-     {
-        ERR("mold is NULL!!");
-        return NULL;
-     }
-
-   return eext_rotary_selector_items_get(mold->rotary_selector);
-}
-
-//for accessibility
-static Eina_Bool
-_access_action_cb(void *data, Evas_Object *obj, Elm_Access_Action_Info *action_info)
-{
-   Eext_More_Option_Data *mold = (Eext_More_Option_Data *)data;
-
-   switch (action_info->action_type)
-     {
-        case ELM_ACCESS_ACTION_ACTIVATE:
-          if (mold)
-            {
-               elm_panel_toggle(mold->panel);
-            }
-        break;
-     }
-   return EINA_FALSE;
-}
-static char *
-_accessibility_name_set_cb(void *data, Evas_Object *obj)
-{
-   char buf[255] = "";
-   bindtextdomain (PACKAGE, LOCALE_DIR);
-   textdomain (PACKAGE);
-
-   snprintf(buf, sizeof(buf), _("WDS_TTS_TBOPT_MORE_OPTIONS"));
-   return strdup(buf);
-}
-//
diff --git a/wearable/src/lib/common/efl_extension_rotary_selector.c b/wearable/src/lib/common/efl_extension_rotary_selector.c
deleted file mode 100644 (file)
index b5b0fc1..0000000
+++ /dev/null
@@ -1,3173 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "efl_extension.h"
-#include "efl_extension_private.h"
-#include "circle/efl_extension_circle_private.h"
-#include "common/efl_extension_common_private.h"
-
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-//
-//                                                                         efl_extension_rotary_selector.c
-//
-//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-#define EEXT_ROTARY_SELECTOR_DATA_KEY "eext_rotary_selector_data"
-#define _ROTARY_SELECTOR_SCREEN_WIDTH 360
-#define _ROTARY_SELECTOR_SCREEN_HEIGHT 360
-#define _ROTARY_SELECTOR_SELECTOR_TOUCH_AREA_WIDTH 180
-#define _ROTARY_SELECTOR_SELECTOR_TOUCH_AREA_HEIGHT 180
-#define _ROTARY_SELECTOR_ITEM_DIVISION_ANGLE 30
-#define _ROTARY_SELECTOR_PAGE_ITEM_MAX 11
-#define _ROTARY_SELECTOR_PAGE_ANIMATION_DURATION 0.35
-#define _ROTARY_SELECTOR_NEXT_PAGE_ANIMATION_DELAY_TIME 0.1
-#define _ROTARY_SELECTOR_END_EFFECT_ANIMATION_DURATION 0.6
-#define _ROTARY_SELECTOR_CUBIC_BEZIER_P1_X 0.33
-#define _ROTARY_SELECTOR_CUBIC_BEZIER_P1_Y 0.0
-#define _ROTARY_SELECTOR_CUBIC_BEZIER_P2_X 0.3
-#define _ROTARY_SELECTOR_CUBIC_BEZIER_P2_Y 1.0
-#define _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID -3
-#define _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_PREVIOUS_PAGE_ITEM -2
-#define _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_NEXT_PAGE_ITEM -1
-#define _ROTARY_SELECTOR_ROTARY_EVENT_RESET_TIME 500
-#define _ROTARY_SELECTOR_ROTARY_EVENT_TIME_ACCELERATION_THRESHOLD 60
-
-
-#define _ROTARY_SELECTOR_DEBUG_ENABLED 0
-
-// ====================================== util ==================================== //
-#define _DEGREES_TO_RADIANS(degrees) (degrees * M_PI / 180.0)
-#define _RADIANS_TO_DEGREES(radians) (radians * 180.0 / M_PI)
-#define ALMOST_ZERO_FLOAT   0.00001f
-
-#define ROTARY_SELECTOR_COLOR_VALUE_SET(obj, part, state, r, g, b, a) \
-                               do { \
-                                  obj->part.state.r = r; \
-                                  obj->part.state.g = g; \
-                                  obj->part.state.b = b; \
-                                  obj->part.state.a = a; \
-                                  obj->part.state.set_flag = EINA_TRUE; \
-                               } while (0)
-
-#define ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, obj, part, state) \
-                              do { \
-                                 evas_object_color_set(content, \
-                                       obj->part.state.r, \
-                                       obj->part.state.g, \
-                                       obj->part.state.b, \
-                                       obj->part.state.a); \
-                              } while (0)
-
-#define ROTARY_SELECTOR_COLOR_VALUE_GET(obj, part, state, r, g, b, a) \
-                              do { \
-                                 if (r) *r = obj->part.state.r; \
-                                 if (g) *g = obj->part.state.g; \
-                                 if (b) *b = obj->part.state.b; \
-                                 if (a) *a = obj->part.state.a; \
-                              } while (0)
-
-static double
-_min(const double a, const double b)
-{
-   if (a < b)
-     {
-        return a;
-     }
-   return b;
-}
-
-static Eina_Bool
-_doubleCompare(double p1, double p2)
-{
-   if ((p1 == 0.f) || (p2 == 0.f))
-     {
-        return (p1 == p2 || abs(p1 - p2) <= ALMOST_ZERO_FLOAT);
-     }
-
-   return (p1 == p2 || abs(p1 - p2) <= ALMOST_ZERO_FLOAT * _min(abs(p1), abs(p2)));
-}
-
-static double
-_mouse_event_angle_get(Evas_Coord x, Evas_Coord y)
-{
-   const double center_x = _ROTARY_SELECTOR_SCREEN_WIDTH/2.0f;
-   const double center_y = _ROTARY_SELECTOR_SCREEN_HEIGHT/2.0f;
-
-   double default_angle = 90;
-   if (x < center_x)
-     {
-        default_angle = 270;
-     }
-   double calculated_x = x - center_x;
-   double calculated_y = y - center_y;
-   double radian = atan((double) calculated_y / calculated_x);
-
-   return (_RADIANS_TO_DEGREES(radian) + default_angle);
-}
-
-// ----------------------------------------- interpolator util --------------------------------------//
-
-void
-_circle_path_interpolator(Eext_Rotary_Selector_Data *rsd, double progress, const double startAngle, const double endAngle, const double startRadius, const double endRadius, double* pos_x, double* pos_y)
-{
-   const double center_x = _ROTARY_SELECTOR_SCREEN_WIDTH/2.0f;
-   const double center_y = _ROTARY_SELECTOR_SCREEN_HEIGHT/2.0f;
-
-   // 1. calculate angle
-   double angle = 0.f;
-   if (_doubleCompare(startAngle, endAngle))
-     {
-        angle = startAngle;
-     }
-   else if (startAngle < endAngle)
-     {
-        angle = startAngle + ((endAngle - startAngle) * progress);
-     }
-   else
-     {
-        angle = startAngle - ((startAngle - endAngle) * progress);
-     }
-
-   double radian = _DEGREES_TO_RADIANS(angle);
-   double cosValue = cos(radian);
-   double sinValue = sin(radian);
-
-   // 2. calculate radius
-   float radius = startRadius;
-   if (endRadius >= 0)
-     {
-        if (startRadius <= endRadius)
-          {
-             radius = startRadius + ((endRadius-startRadius)*progress);
-          }
-        else
-          {
-             radius = startRadius - ((startRadius-endRadius)*progress);
-          }
-     }
-
-   // 3. calculate target point
-   *pos_x = center_x + (radius * (float)(cosValue)) - (rsd->item_width / 2.f);
-   *pos_y = center_y + (radius * (float)(sinValue)) - (rsd->item_height / 2.f);
-
-   return;
-}
-// ----------------------------------------- event area API --------------------------------------//
-static void _event_area_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
-static void _event_area_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
-static void _event_area_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
-static void _event_area_mouse_out_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
-static void _event_area_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
-static void _event_area_callback_add(Eext_Rotary_Selector_Data *rsd);
-
-// ----------------------------------------- internal header --------------------------------------//
-static Eext_Rotary_Selector_Data *_eext_rotary_selector_data_init(Evas_Object *obj, Evas_Object *parent);
-static Eext_Rotary_Selector_Data *_eext_rotary_selector_data_get(Evas_Object *rotary_selector);
-static Eina_Bool _rotary_selector_visible_get(Evas_Object *rotary_selector);
-static Eina_Bool _rotary_selector_rotary_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info);
-static void _rotary_selector_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
-static void _rotary_selector_show_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
-static void _rotary_selector_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
-
-// ----------------------------------------- item API --------------------------------------//
-static void _item_coords_update(Eext_Rotary_Selector_Data *rsd, Eext_Rotary_Selector_Item *item);
-static void _items_transformation_update(Eext_Rotary_Selector_Data *rsd);
-static void _items_invalidate(Eext_Rotary_Selector_Data *rsd);
-static void _layer_items_invalidate(Eext_Rotary_Selector_Data *rsd);
-static void _item_rearrange(Eext_Rotary_Selector_Data *rsd, int selected_index);
-static void _item_select(Eext_Rotary_Selector_Data *rsd, int index);
-static void _item_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
-static Eext_Rotary_Selector_Item *_item_create(Eext_Rotary_Selector_Data *rsd);
-static void _item_selected_signal_send(Eext_Rotary_Selector_Data *rsd, int previous_item_index, int current_item_index);
-static void _item_touched_signal_send(Eext_Rotary_Selector_Data *rsd, int index, Eina_Bool pressed, Eina_Bool sound);
-
-static Eext_Rotary_Selector_Item * _item_get(Eext_Rotary_Selector_Data *rsd, int index);
-static void _item_text_copy(char **target, const char* source);
-
-// ----------------------------------------- animation API --------------------------------------//
-static Eina_Bool _previous_page_animator_cb(void *data);
-static Eina_Bool _item_update_animator_cb(void *data);
-static void _page_animation_run(Eext_Rotary_Selector_Data *rsd, Eina_Bool direction);
-static void _end_effect_animation_run(Eext_Rotary_Selector_Data *rsd, Eina_Bool direction);
-static void _item_update_animation_run(Eext_Rotary_Selector_Data *rsd);
-static Eina_Bool _next_page_animator_cb(void *data);
-static Eina_Bool _next_page_timer_cb(void *data);
-static Eina_Bool _end_effect_animator_cb(void *data);
-
-// ----------------------------------------- selector API --------------------------------------//
-static void _selector_update(Eext_Rotary_Selector_Data *rsd, Eina_Bool page_changed, Eina_Bool is_animation);
-static void _selector_content_update(Eext_Rotary_Selector_Data *rsd);
-static void _selector_clicked_signal(void *data, Evas_Object *obj, const char *emission, const char *source);
-static void _selector_animation_finished_cb(void *data, Evas_Object *obj, const char *emission, const char *source);
-
-// ----------------------------------------- Accessibility API --------------------------------------//
-static Eina_Bool _accessibility_event_area_highlighted_cb(void *data, Evas_Object *obj, Elm_Access_Action_Info *action_info);
-static void _accessibility_item_btn_highlighted_cb(void *data, Evas_Object *obj, void *event_info);
-static void _accessibility_set_relationship(Eext_Rotary_Selector_Data *rsd,int current_page);
-static char *_accessibility_item_name_set_cb(void *data, Evas_Object *obj);
-static char *_accessibility_name_set_cb(void *data, Evas_Object *obj);
-static char *_accessibility_description_set_cb(void *data, Evas_Object *obj);
-static void _rotary_selector_moreoption_opened_cb(void *data, Evas_Object *obj, void *event_info);
-static void _rotary_selector_moreoption_closed_cb(void *data, Evas_Object *obj, void *event_info);
-void _rotary_selector_from_moreoption_set(Evas_Object *rotary_selector, Eina_Bool from_more_option);
-static Eina_Bool _rotary_selector_from_moreoption_get(Evas_Object *rotary_selector);
-static void _accessibility_item_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info);
-
-// ----------------------------------------- event area API --------------------------------------//
-static void
-_event_area_mouse_down_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
-   const double center_x = _ROTARY_SELECTOR_SCREEN_WIDTH/2.0f;
-   const double center_y = _ROTARY_SELECTOR_SCREEN_HEIGHT/2.0f;
-   Evas_Event_Mouse_Down *ev = event_info;
-   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
-
-   if (rsd->previous_page_animator || rsd->next_page_animator || rsd->end_effect_animator)
-     {
-        INF("animator is running!!");
-        return;
-     }
-   rsd->pressed = EINA_TRUE;
-
-   int point = sqrt(pow(center_x - ev->canvas.x, 2) + pow(center_y - ev->canvas.y, 2));
-   if (point > _ROTARY_SELECTOR_SELECTOR_TOUCH_AREA_WIDTH/2)
-     {
-        double angle = _mouse_event_angle_get(ev->canvas.x, ev->canvas.y);
-#if _ROTARY_SELECTOR_DEBUG_ENABLED
-        INF("OUTSIDE OF SELECTOR : angle : %f", angle);
-#endif
-
-        int new_index = 0;
-        int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
-        int last_index = 0;
-        int i = 0;
-        if (rsd->current_page == 0)
-          {
-             last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
-          }
-        else
-          {
-             last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
-          }
-        if (last_index > rsd->item_count - 1)
-          {
-             last_index = rsd->item_count - 1;
-          }
-
-        if (angle < 20.f)
-          {
-             rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_PREVIOUS_PAGE_ITEM;
-          }
-        else if (angle > 340.f)
-          {
-             rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_NEXT_PAGE_ITEM;
-          }
-        else
-          {
-             const float touchAreaAngle[] = { 45.f, 75.f, 105.f, 135.f, 165.f, 195.f, 225.f, 255.f, 285.f, 315.f, 340.f};
-             for(i = 0; i < _ROTARY_SELECTOR_PAGE_ITEM_MAX;i++)
-               {
-                  if(angle < touchAreaAngle[i]) break;
-               }
-
-             new_index = first_index + i;
-
-             if (last_index < new_index)
-               {
-                  rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID;
-               }
-             else
-               {
-                  rsd->pressed_item_index = new_index;
-                  _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_TRUE, EINA_FALSE);
-               }
-#if _ROTARY_SELECTOR_DEBUG_ENABLED
-             INF("pressed_item_index : %d", rsd->pressed_item_index);
-#endif
-          }
-       }
-}
-
-static void
-_event_area_mouse_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
-   const double center_x = _ROTARY_SELECTOR_SCREEN_WIDTH/2.0f;
-   const double center_y = _ROTARY_SELECTOR_SCREEN_HEIGHT/2.0f;
-   Evas_Event_Mouse_Move *ev = event_info;
-   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
-
-   if (rsd->previous_page_animator || rsd->next_page_animator || rsd->end_effect_animator)
-     {
-        INF("animator is running!!");
-        return;
-     }
-   if (!rsd->pressed)
-     {
-        return;
-     }
-
-   if (rsd->touched_item_changed || rsd->pressed_item_index == _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID)
-     {
-        return;
-     }
-
-   int point = sqrt(pow(center_x - ev->cur.canvas.x, 2) + pow(center_y - ev->cur.canvas.y, 2));
-   if (point > _ROTARY_SELECTOR_SELECTOR_TOUCH_AREA_WIDTH/2)
-     {
-        double angle = _mouse_event_angle_get(ev->cur.canvas.x, ev->cur.canvas.y);
-#if _ROTARY_SELECTOR_DEBUG_ENABLED
-        INF("OUTSIDE OF SELECTOR : angle : %f", angle);
-#endif
-
-        int new_index = 0;
-        int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
-        int last_index = 0;
-        int i = 0;
-        if (rsd->current_page == 0)
-          {
-             last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
-          }
-        else
-          {
-             last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
-          }
-        if (last_index > rsd->item_count - 1)
-          {
-             last_index = rsd->item_count - 1;
-          }
-
-        if (angle < 20.f)
-          {
-             if (rsd->pressed_item_index != _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_PREVIOUS_PAGE_ITEM)
-               {
-                  rsd->touched_item_changed = EINA_TRUE;
-                  _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_FALSE, EINA_FALSE);
-               }
-          }
-        else if (angle > 340.f)
-          {
-             if (rsd->pressed_item_index != _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_NEXT_PAGE_ITEM)
-               {
-                  rsd->touched_item_changed = EINA_TRUE;
-                  _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_FALSE, EINA_FALSE);
-               }
-          }
-        else
-          {
-             const float touchAreaAngle[] = { 45.f, 75.f, 105.f, 135.f, 165.f, 195.f, 225.f, 255.f, 285.f, 315.f, 340.f};
-
-             for(i = 0; i < _ROTARY_SELECTOR_PAGE_ITEM_MAX; i++)
-               {
-                  if(angle < touchAreaAngle[i]) break;
-               }
-             new_index = first_index + i;
-
-             if (rsd->pressed_item_index != new_index)
-               {
-                  rsd->touched_item_changed = EINA_TRUE;
-                  _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_FALSE, EINA_FALSE);
-               }
-          }
-     }
-   else
-     {
-        if (rsd->pressed_item_index >= 0)
-          {
-             rsd->touched_item_changed = EINA_TRUE;
-             _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_FALSE, EINA_FALSE);
-          }
-     }
-}
-
-static void
-_event_area_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
-   const double center_x = _ROTARY_SELECTOR_SCREEN_WIDTH/2.0f;
-   const double center_y = _ROTARY_SELECTOR_SCREEN_HEIGHT/2.0f;
-   Evas_Event_Mouse_Up *ev = event_info;
-   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
-
-   if (rsd->previous_page_animator || rsd->next_page_animator || rsd->end_effect_animator)
-     {
-        INF("animator is running!!");
-        return;
-     }
-   if (!rsd->pressed)
-     {
-        return;
-     }
-
-   int point = sqrt(pow(center_x - ev->canvas.x, 2) + pow(center_y - ev->canvas.y, 2));
-   if (point > _ROTARY_SELECTOR_SELECTOR_TOUCH_AREA_WIDTH/2)
-     {
-        if (rsd->touched_item_changed)
-          {
-             rsd->touched_item_changed = EINA_FALSE;
-             rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID;
-             rsd->pressed = EINA_FALSE;
-
-             return;
-          }
-
-        double angle = _mouse_event_angle_get(ev->canvas.x, ev->canvas.y);
-#if _ROTARY_SELECTOR_DEBUG_ENABLED
-        INF("OUTSIDE OF SELECTOR : angle : %f", angle);
-#endif
-
-        int new_index = 0;
-        int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
-        int last_index = 0;
-        int previous_item_index = rsd->selected_index;
-        int i = 0;
-        if (rsd->current_page == 0)
-          {
-             last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
-          }
-        else
-          {
-             last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
-          }
-        if (last_index > rsd->item_count - 1)
-          {
-             last_index = rsd->item_count - 1;
-          }
-
-        if (angle < 20.f)
-          {
-             if (rsd->current_page> 0)
-               {
-                  rsd->selected_index = first_index - 1;
-                  _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
-                  _page_animation_run(rsd, EINA_FALSE);
-                  _selector_update(rsd, EINA_TRUE, EINA_TRUE);
-                  evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
-               }
-          }
-        else if (angle > 340.f)
-          {
-             if (rsd->current_page < (rsd->item_count/_ROTARY_SELECTOR_PAGE_ITEM_MAX))
-               {
-                  rsd->selected_index = last_index + 1;
-                  _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
-                  _page_animation_run(rsd, EINA_TRUE);
-                  _selector_update(rsd, EINA_TRUE, EINA_TRUE);
-                  evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
-               }
-          }
-        else
-          {
-             const float touchAreaAngle[] = { 45.f, 75.f, 105.f, 135.f, 165.f, 195.f, 225.f, 255.f, 285.f, 315.f, 340.f};
-             for(i = 0; i < _ROTARY_SELECTOR_PAGE_ITEM_MAX; i++)
-               {
-                  if(angle < touchAreaAngle[i]) break;
-               }
-             new_index = first_index + i;
-
-             if (rsd->pressed_item_index == new_index)
-               {
-                  _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_FALSE, EINA_TRUE);
-                  rsd->selected_index = new_index;
-                  _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
-                  _selector_update(rsd, EINA_FALSE, EINA_FALSE);
-                  evas_object_smart_callback_call(rsd->rotary_selector, "item,clicked", (void*)_item_get(rsd, rsd->selected_index));
-               }
-          }
-     }
-
-   rsd->pressed = EINA_FALSE;
-   rsd->touched_item_changed = EINA_FALSE;
-   rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID;
-}
-
-static void
-_event_area_mouse_out_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
-   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
-
-   if (rsd->pressed_item_index > 0)
-     {
-        _item_touched_signal_send(rsd, rsd->pressed_item_index, EINA_FALSE, EINA_FALSE);
-     }
-
-   rsd->pressed = EINA_FALSE;
-   rsd->touched_item_changed = EINA_FALSE;
-   rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID;
-}
-
-static void
-_event_area_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
-   INF("called!!");
-
-   evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_DOWN, _event_area_mouse_down_cb);
-   evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_MOVE, _event_area_mouse_move_cb);
-   evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_UP, _event_area_mouse_up_cb);
-   evas_object_event_callback_del(obj, EVAS_CALLBACK_MOUSE_OUT, _event_area_mouse_out_cb);
-}
-
-static void
-_event_area_callback_add(Eext_Rotary_Selector_Data *rsd)
-{
-   INF("called!!");
-
-   rsd->event_area = (Evas_Object *)edje_object_part_object_get(elm_layout_edje_get(rsd->rotary_selector), "event_area");
-
-   if (rsd->event_area)
-     {
-        evas_object_event_callback_add(rsd->event_area, EVAS_CALLBACK_MOUSE_DOWN, _event_area_mouse_down_cb, rsd);
-        evas_object_event_callback_add(rsd->event_area, EVAS_CALLBACK_MOUSE_MOVE, _event_area_mouse_move_cb, rsd);
-        evas_object_event_callback_add(rsd->event_area, EVAS_CALLBACK_MOUSE_UP, _event_area_mouse_up_cb, rsd);
-        evas_object_event_callback_add(rsd->event_area, EVAS_CALLBACK_MOUSE_OUT, _event_area_mouse_out_cb, rsd);
-        evas_object_event_callback_add(rsd->event_area, EVAS_CALLBACK_DEL, _event_area_del_cb, rsd);
-     }
-}
-
-// ----------------------------------------- internal header --------------------------------------//
-static Eext_Rotary_Selector_Data *
-_eext_rotary_selector_data_init(Evas_Object *obj, Evas_Object *parent)
-{
-   Eext_Rotary_Selector_Data *rsd = NULL;
-   const char *radius = NULL;
-   const char *item_width = NULL;
-   const char *item_height = NULL;
-
-   rsd = (Eext_Rotary_Selector_Data *)calloc(1, sizeof(Eext_Rotary_Selector_Data));
-   if (!rsd)
-     {
-        ERR("rsd is NULL!!");
-        return NULL;
-     }
-   rsd->parent = parent;
-   rsd->rotary_selector = obj;
-   rsd->event_area = NULL;
-   rsd->item_list = NULL;
-   rsd->item_count = 0;
-   rsd->selected_index = 0;
-   rsd->current_page = 0;
-   rsd->animation_direction = EINA_TRUE;
-   rsd->previous_page_animator = NULL;
-   rsd->next_page_animator = NULL;
-   rsd->previous_page_animator_start_time = 0.0f;
-   rsd->next_page_animator_start_time = 0.0f;
-   rsd->next_page_animation_started = EINA_FALSE;
-   rsd->previous_page_animation_started = EINA_FALSE;
-   rsd->next_page_timer = NULL;
-   rsd->end_effect_animation_started = EINA_FALSE;
-   rsd->end_effect_animator_start_time = 0.0f;
-   rsd->end_effect_animator = NULL;
-   rsd->item_update_animator = NULL;
-   rsd->selector_bg_image_color.normal_color.set_flag = EINA_FALSE;
-   rsd->selector_bg_image_color.pressed_color.set_flag = EINA_FALSE;
-   rsd->pressed = EINA_FALSE;
-   rsd->pressed_item_index = _ROTARY_SELECTOR_PRESSED_ITEM_INDEX_INVALID;
-   rsd->touched_item_changed = EINA_FALSE;
-   rsd->acceleration = EINA_FALSE;
-
-   radius = edje_object_data_get(elm_layout_edje_get(obj), "radius");
-   if (!radius)
-     {
-        ERR("radius is NULL!!");
-        free(rsd);
-        return NULL;
-     }
-   rsd->radius = atoi(radius);
-
-   item_width = edje_object_data_get(elm_layout_edje_get(obj), "item_width");
-   if (!item_width)
-     {
-        ERR("item_width is NULL!!");
-        free(rsd);
-        return NULL;
-     }
-   rsd->item_width = (Evas_Coord)atoi(item_width);
-
-   item_height = edje_object_data_get(elm_layout_edje_get(obj), "item_height");
-   if (!item_height)
-     {
-        ERR("item_height is NULL!!");
-        free(rsd);
-        return NULL;
-     }
-   rsd->item_height = (Evas_Coord)atoi(item_height);
-   rsd->rotary_event_time_stamp = 0.0;
-
-   INF("rsd is initialized!!");
-
-   return rsd;
-}
-
-static Eext_Rotary_Selector_Data *
-_eext_rotary_selector_data_get(Evas_Object *rotary_selector)
-{
-   if (!rotary_selector)
-     {
-        ERR("rotary_selector is NULL!!");
-        return NULL;
-     }
-
-   return evas_object_data_get(rotary_selector, EEXT_ROTARY_SELECTOR_DATA_KEY);
-}
-
-static Eina_Bool
-_rotary_selector_visible_get(Evas_Object *rotary_selector)
-{
-   if (!rotary_selector)
-     {
-        return EINA_FALSE;
-     }
-
-   Evas_Coord x, y, w, h;
-   evas_object_geometry_get(rotary_selector, &x, &y, &w, &h);
-   if (evas_object_visible_get(rotary_selector) && x == 0)
-     {
-        return EINA_TRUE;
-     }
-   else
-     {
-        return EINA_FALSE;
-     }
-
-   return EINA_FALSE;
-}
-
-static Eina_Bool
-_rotary_selector_rotary_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info)
-{
-   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data*)data;
-
-   if (rsd->acceleration)
-     {
-        INF("rotary acceleration!!");
-        return EINA_FALSE;
-     }
-
-   if (elm_object_disabled_get(rsd->rotary_selector))
-     {
-        return ECORE_CALLBACK_PASS_ON;
-     }
-
-   if (rsd->previous_page_animator || rsd->next_page_animator || rsd->end_effect_animator)
-     {
-        return ECORE_CALLBACK_PASS_ON;
-     }
-
-   int previous_item_index = rsd->selected_index;
-   int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
-   int last_index = 0;
-   if (rsd->current_page == 0)
-     {
-        last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
-     }
-   else
-     {
-        last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
-     }
-   if (last_index > rsd->item_count - 1)
-     {
-        last_index = rsd->item_count - 1;
-     }
-
-   if (rsd->rotary_event_time_stamp == 0 && !rsd->acceleration)
-     {
-        rsd->rotary_event_time_stamp = info->time_stamp;
-        rsd->acceleration = EINA_FALSE;
-     }
-   else
-     {
-        int diff = info->time_stamp - rsd->rotary_event_time_stamp;
-        if (diff < _ROTARY_SELECTOR_ROTARY_EVENT_TIME_ACCELERATION_THRESHOLD)
-          {
-             rsd->acceleration = EINA_TRUE;
-          }
-        else
-          {
-             rsd->rotary_event_time_stamp = info->time_stamp;
-          }
-     }
-
-   if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
-     {
-        if (rsd->selected_index < rsd->item_count - 1)
-          {
-             //for accessibility
-             if(rsd->event_area_highlighted_state != EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_RIGHT)
-             //
-               {
-                  if (!rsd->acceleration)
-                    {
-                       rsd->selected_index += 1;
-                    }
-                  else
-                    {
-                       rsd->selected_index = last_index;
-                    }
-                    _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
-             }
-             if (last_index < rsd->selected_index)
-               {
-                  //for accessibility
-                  if(elm_atspi_bridge_utils_is_screen_reader_enabled())
-                    {
-                       rsd->selected_index -= 1;
-                       rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_RIGHT;
-                       rsd->control_by_rotary = EINA_TRUE;
-                       elm_atspi_component_highlight_grab(rsd->event_area_access_object);
-                       _selector_update(rsd, EINA_TRUE, EINA_TRUE);
-                       evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
-                    }
-                  //
-                  else
-                    {
-                       _page_animation_run(rsd, EINA_TRUE);
-                       _selector_update(rsd, EINA_TRUE, EINA_TRUE);
-
-                       evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
-                    }
-               }
-             else
-               {
-                  _selector_update(rsd, EINA_FALSE, EINA_TRUE);
-
-                  evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
-
-                  //for accessibility
-                  if(elm_atspi_bridge_utils_is_screen_reader_enabled())
-                    {
-                        Eext_Rotary_Selector_Item *_item = _item_get(rsd, rsd->selected_index);
-                        if(_item)
-                          {
-                             rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_NORMAL;
-                             elm_atspi_component_highlight_grab(_item->base.obj);
-                          }
-                    }
-                  //
-               }
-          }
-        else
-          {
-             _end_effect_animation_run(rsd, EINA_TRUE);
-          }
-     }
-   else
-     {
-        if (rsd->selected_index > 0)
-          {
-             //for accessibility
-             if(rsd->event_area_highlighted_state != EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_LEFT)
-             //
-               {
-                  if (!rsd->acceleration)
-                    {
-                       rsd->selected_index -= 1;
-                    }
-                  else
-                    {
-                       rsd->selected_index = first_index;
-                    }
-                  _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
-                }
-             if (first_index > rsd->selected_index)
-               {
-                  //for accessibility
-                  if(elm_atspi_bridge_utils_is_screen_reader_enabled())
-                    {
-                       rsd->selected_index += 1;
-                       rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_LEFT;
-                       rsd->control_by_rotary = EINA_TRUE;
-                       elm_atspi_component_highlight_grab(rsd->event_area_access_object);
-                       _selector_update(rsd, EINA_TRUE, EINA_TRUE);
-                       evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
-                     }
-                  else
-                  //
-                    {
-                       _page_animation_run(rsd, EINA_FALSE);
-                       _selector_update(rsd, EINA_TRUE, EINA_TRUE);
-
-                       evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
-                    }
-               }
-             else
-               {
-                  _selector_update(rsd, EINA_FALSE, EINA_TRUE);
-
-                  evas_object_smart_callback_call(rsd->rotary_selector, "item,selected", (void*)_item_get(rsd, rsd->selected_index));
-                  //for accessibility
-                  if(elm_atspi_bridge_utils_is_screen_reader_enabled())
-                    {
-                       Eext_Rotary_Selector_Item *_item = _item_get(rsd, rsd->selected_index);
-                       if(_item)
-                         {
-                            rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_NORMAL;
-                            elm_atspi_component_highlight_grab(_item->base.obj);
-                         }
-                    }
-                  //
-               }
-          }
-        else
-          {
-             _end_effect_animation_run(rsd, EINA_FALSE);
-          }
-     }
-
-   return ECORE_CALLBACK_PASS_ON;
-}
-
-static void
-_rotary_selector_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
-   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
-   if (!rsd)
-     {
-        ERR("rsd is NULL!!");
-        return;
-     }
-
-   _item_select(rsd, rsd->selected_index);
-}
-
-static void
-_rotary_selector_show_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
-   Eext_Rotary_Selector_Data *rsd = NULL;
-   rsd = data;
-   if (!rsd)
-     {
-        ERR("rsd is NULL!!");
-        return;
-     }
-
-   _item_select(rsd, rsd->selected_index);
-
-   //for accessibility
-   if(elm_atspi_bridge_utils_is_screen_reader_enabled())
-     {
-        rsd->reading_page_number = -1;
-        elm_atspi_accessible_name_cb_set(rsd->event_area_access_object, _accessibility_name_set_cb, (Eext_Rotary_Selector_Data*)rsd);
-        elm_atspi_accessible_description_cb_set(rsd->event_area_access_object, _accessibility_description_set_cb, (Eext_Rotary_Selector_Data*)rsd);
-        elm_atspi_accessible_reading_info_type_set(rsd->event_area_access_object, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME | ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
-
-        if(!_rotary_selector_from_moreoption_get(rsd->rotary_selector))
-            elm_atspi_component_highlight_grab(rsd->event_area_access_object);
-     }
-   //
-
-}
-
-static void
-_rotary_selector_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
-   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
-   if (!rsd)
-     {
-        ERR("rsd is NULL!!");
-        return;
-     }
-
-   if (rsd->item_list)
-     {
-        Eext_Rotary_Selector_Item *item = NULL;
-        EINA_LIST_FREE(rsd->item_list, item)
-          evas_object_del(item->base.obj);
-        rsd->item_list = NULL;
-     }
-   if (rsd->previous_page_animator)
-     {
-        ecore_animator_del(rsd->previous_page_animator);
-        rsd->previous_page_animator = NULL;
-     }
-   if (rsd->next_page_animator)
-     {
-        ecore_animator_del(rsd->next_page_animator);
-        rsd->next_page_animator = NULL;
-     }
-   if (rsd->next_page_timer)
-     {
-        ecore_timer_del(rsd->next_page_timer);
-        rsd->next_page_timer = NULL;
-     }
-   if (rsd->end_effect_animator)
-     {
-        ecore_animator_del(rsd->end_effect_animator);
-        rsd->end_effect_animator = NULL;
-     }
-   if (rsd->item_update_animator)
-     {
-        ecore_animator_del(rsd->item_update_animator);
-        rsd->item_update_animator = NULL;
-     }
-
-   edje_object_signal_callback_del(elm_layout_edje_get(rsd->rotary_selector), "eext,clicked", "", _selector_clicked_signal);
-   edje_object_signal_callback_del(elm_layout_edje_get(rsd->rotary_selector), "elm,anim,finished", "elm", _selector_animation_finished_cb);
-   eext_rotary_object_event_callback_del(obj, _rotary_selector_rotary_cb);
-   evas_object_event_callback_del(obj, EVAS_CALLBACK_MOVE, _rotary_selector_move_cb);
-   evas_object_event_callback_del(obj, EVAS_CALLBACK_SHOW, _rotary_selector_show_cb);
-
-   evas_object_data_del(obj, EEXT_ROTARY_SELECTOR_DATA_KEY);
-
-   free(rsd);
-}
-
-// ----------------------------------------- item API --------------------------------------//
-static void
-_item_coords_update(Eext_Rotary_Selector_Data *rsd, Eext_Rotary_Selector_Item *item)
-{
-   const float endAngle[] = { 300.f, 330.f, 0.f, 30.f, 60.f, 90.f, 120.f, 150.f, 180.f, 210.f, 240.f };
-
-   Eext_Rotary_Selector_Item_Coords *coords = &item->coords;
-   _circle_path_interpolator(rsd, 1.0f, 0, endAngle[item->index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], 0, rsd->radius, &coords->x, &coords->y);
-
-#if _ROTARY_SELECTOR_DEBUG_ENABLED
-   Evas_Coord x, y, w, h;
-   evas_object_geometry_get(item->base.obj, &x, &y, &w, &h);
-
-   INF("item(0x%x), index(%d), x(%f), y(%f)", item, item->index, coords->x, coords->y);
-#endif
-}
-
-static void
-_items_transformation_update(Eext_Rotary_Selector_Data *rsd)
-{
-   Eina_List *l = NULL;
-   Eext_Rotary_Selector_Item *item = NULL;
-   EINA_LIST_FOREACH(rsd->item_list, l, item)
-     {
-        _item_coords_update(rsd, item);
-     }
-}
-
-static void
-_items_invalidate(Eext_Rotary_Selector_Data *rsd)
-{
-#if _ROTARY_SELECTOR_DEBUG_ENABLED
-   double start_time = ecore_time_unix_get();
-#endif
-   if (rsd->item_count <= 0)
-     {
-        return;
-     }
-   int i = 0;
-   Eina_List *l = NULL;
-   Evas_Coord x, y, w, h;
-   evas_object_geometry_get(rsd->rotary_selector, &x, &y, &w, &h);
-   Eext_Rotary_Selector_Item *item = NULL;
-
-   int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
-   int last_index = 0;
-   if (rsd->current_page == 0)
-     {
-        last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
-     }
-   else
-     {
-        last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
-     }
-
-   EINA_LIST_FOREACH(rsd->item_list, l, item)
-     {
-        Evas_Object *button = item->base.obj;
-
-        if (i >= first_index && i <= last_index)
-          {
-             evas_object_color_set(button, 255, 255, 255, 255);
-             evas_object_move(button, x + item->coords.x, y + item->coords.y);
-             evas_object_raise(button);
-             evas_object_show(button);
-#if _ROTARY_SELECTOR_DEBUG_ENABLED
-             INF("obj : 0x%x show index : %d x:%f y:%f", item->base.obj, item->index, x + item->coords.x, y + item->coords.y);
-#endif
-          }
-        else
-          {
-             evas_object_hide(button);
-#if _ROTARY_SELECTOR_DEBUG_ENABLED
-             INF("obj : 0x%x hide index : %d", item->base.obj, item->index);
-#endif
-          }
-        i++;
-     }
-
-   _layer_items_invalidate(rsd);
-
-#if _ROTARY_SELECTOR_DEBUG_ENABLED
-   INF("elapsed time(%f)", ecore_time_unix_get() - start_time);
-#endif
-}
-
-static void
-_layer_items_invalidate(Eext_Rotary_Selector_Data *rsd)
-{
-   if (rsd->item_count <= 0)
-     {
-        return;
-     }
-   int i = 0;
-   Eina_List *l = NULL;
-   double coord_x, coord_y;
-   Evas_Coord x, y, w, h;
-   evas_object_geometry_get(rsd->rotary_selector, &x, &y, &w, &h);
-   Eext_Rotary_Selector_Item *item = NULL;
-
-   int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
-   int last_index = 0;
-   if (rsd->current_page == 0)
-     {
-        last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
-     }
-   else
-     {
-        last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
-     }
-
-   Evas_Object *current_first_item = NULL;
-   Evas_Object *current_last_item = NULL;
-   Evas_Object *second_layer_right_item = NULL;
-   Evas_Object *second_layer_left_item = NULL;
-
-   EINA_LIST_FOREACH(rsd->item_list, l, item)
-     {
-        Evas_Object *button = item->base.obj;
-        if (i == first_index)
-          {
-             current_first_item = button;
-          }
-        else if (i == last_index)
-          {
-             current_last_item = button;
-          }
-
-        if(rsd->current_page > 0 && i == first_index-1) //Second layer Right
-          {
-             second_layer_right_item = button;
-          }
-        else if (last_index < (rsd->item_count - 1) && i == last_index + 1) //Second layer Left
-          {
-             second_layer_left_item = button;
-          }
-        i++;
-     }
-
-   l = NULL;
-   item = NULL;
-   i = 0;
-   EINA_LIST_FOREACH(rsd->item_list, l, item)
-     {
-        Evas_Object *button = item->base.obj;
-        if (rsd->current_page > 0 && i == first_index-1) //Second layer Right
-          {
-             _circle_path_interpolator(rsd, 1, 0, -67, rsd->radius, rsd->radius, &coord_x, &coord_y);
-             evas_object_move(button, x + coord_x, y + coord_y);
-             evas_object_stack_below(button, current_first_item);
-             evas_object_color_set(button, 128, 128, 128, 128);
-             evas_object_show(button);
-          }
-        else if (rsd->current_page > 0 && i == first_index-2) //third layer Right
-          {
-             _circle_path_interpolator(rsd, 1, 0, -70, rsd->radius, rsd->radius, &coord_x, &coord_y);
-             evas_object_move(button, x + coord_x, y + coord_y);
-             evas_object_stack_below(button, second_layer_right_item);
-             evas_object_color_set(button, 102, 102, 102, 102);
-             evas_object_show(button);
-          }
-        else if (last_index < (rsd->item_count - 1) && i == last_index + 1) //Second layer Left
-          {
-             _circle_path_interpolator(rsd, 1, 0, -113, rsd->radius, rsd->radius, &coord_x, &coord_y);
-             evas_object_move(button, x + coord_x, y + coord_y);
-             evas_object_stack_below(button, current_last_item);
-             evas_object_color_set(button, 128, 128, 128, 128);
-             evas_object_show(button);
-          }
-        else if (last_index < (rsd->item_count - 1) && i == last_index + 2) //third layer Left
-          {
-             _circle_path_interpolator(rsd, 1, 0, -110, rsd->radius, rsd->radius, &coord_x, &coord_y);
-             evas_object_move(button, x + coord_x, y + coord_y);
-             evas_object_stack_below(button, second_layer_left_item);
-             evas_object_color_set(button, 102, 102, 102, 102);
-             evas_object_show(button);
-          }
-        i++;
-     }
-}
-
-static void
-_item_rearrange(Eext_Rotary_Selector_Data *rsd, int selected_index)
-{
-   Eina_List *l = NULL;
-   int i = 0;
-   Eext_Rotary_Selector_Item *item = NULL;
-
-   EINA_LIST_FOREACH(rsd->item_list, l, item)
-     {
-        item->index = i;
-        i++;
-     }
-   rsd->item_count = i;
-   rsd->selected_index = selected_index;
-
-#if _ROTARY_SELECTOR_DEBUG_ENABLED
-   INF("item is rearranged!! : item_count(%d)", rsd->item_count);
-#endif
-}
-
-static void
-_item_select(Eext_Rotary_Selector_Data *rsd, int index)
-{
-#if _ROTARY_SELECTOR_DEBUG_ENABLED
-   INF("item is selected!! : index(%d)", index);
-#endif
-   {
-      _item_selected_signal_send(rsd, rsd->selected_index, index);
-      rsd->selected_index = index;
-      _selector_update(rsd, EINA_FALSE, EINA_FALSE);
-      _items_transformation_update(rsd);
-      _items_invalidate(rsd);
-   }
-}
-
-static void
-_item_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
-   Eext_Rotary_Selector_Item *item = data;
-
-   if (item->content_icon)
-     {
-        evas_object_del(item->content_icon);
-        item->content_icon = NULL;
-     }
-   if (item->custom_content)
-     {
-        evas_object_del(item->custom_content);
-        item->custom_content = NULL;
-     }
-   if (item->text1)
-     {
-        free(item->text1);
-        item->text1 = NULL;
-     }
-   if (item->text2)
-     {
-        free(item->text2);
-        item->text2 = NULL;
-     }
-   if (item->domain)
-     {
-        free(item->domain);
-        item->domain = NULL;
-     }
-
-   free(item);
-}
-
-static Eext_Rotary_Selector_Item *
-_item_create(Eext_Rotary_Selector_Data *rsd)
-{
-   Eext_Rotary_Selector_Item *item = NULL;
-   Evas_Object *button = NULL;
-   Evas_Object *rotary_selector = rsd->rotary_selector;
-
-   button = elm_button_add(rotary_selector);
-   if (!button)
-    {
-       ERR("button is NULL!!");
-       return NULL;
-    }
-
-
-   if(!elm_atspi_bridge_utils_is_screen_reader_enabled())
-      evas_object_freeze_events_set(button, EINA_TRUE);
-   evas_object_repeat_events_set(button, EINA_TRUE);
-
-   evas_object_size_hint_weight_set(button,EVAS_HINT_EXPAND,EVAS_HINT_EXPAND);
-   evas_object_size_hint_align_set(button, EVAS_HINT_FILL, EVAS_HINT_FILL);
-   elm_object_style_set(button, "rotary_selector_item");
-   evas_object_move(button, -_ROTARY_SELECTOR_SCREEN_WIDTH, -_ROTARY_SELECTOR_SCREEN_HEIGHT);
-   evas_object_resize(button, rsd->item_width, rsd->item_height);
-   evas_object_smart_member_add(button, rotary_selector);
-
-   Evas_Object *action_bg = elm_layout_add(button);
-   elm_layout_theme_set(action_bg, "rotary_selector", "item", "bg_image");
-   elm_object_part_content_set(button, "item,bg_image", action_bg);
-
-   item = (Eext_Rotary_Selector_Item *)calloc(1, sizeof(Eext_Rotary_Selector_Item));
-   if (!item)
-     {
-        ERR("item is NULL!!");
-        return NULL;
-     }
-
-   //for accessibility
-   if(elm_atspi_bridge_utils_is_screen_reader_enabled())
-      evas_object_smart_callback_add(button, "clicked",_accessibility_item_btn_clicked_cb, (Eext_Rotary_Selector_Data*)rsd);
-   evas_object_smart_callback_add(button, "atspi,highlighted", _accessibility_item_btn_highlighted_cb, (Eext_Rotary_Selector_Data*)rsd);
-   //
-
-   if (item)
-    {
-       item->base.obj = button;
-       item->index = -1;
-       item->parent = rsd->parent;
-       item->rotary_selector = rotary_selector;
-       item->coords.x = 0.0f;
-       item->coords.y = 0.0f;
-       item->domain = NULL;
-       item->text1 = NULL;
-       item->text2 = NULL;
-       item->selector_icon_color.normal_color.set_flag = EINA_FALSE;
-       item->selector_icon_color.pressed_color.set_flag = EINA_FALSE;
-       item->item_bg_image_color.normal_color.set_flag = EINA_FALSE;
-       item->item_bg_image_color.pressed_color.set_flag = EINA_FALSE;
-       item->item_icon_color.normal_color.set_flag = EINA_FALSE;
-       item->item_icon_color.pressed_color.set_flag = EINA_FALSE;
-       item->selector_icon_color.normal_color.set_flag = EINA_FALSE;
-       item->selector_icon_color.pressed_color.set_flag = EINA_FALSE;
-       item->custom_content_color.normal_color.set_flag = EINA_FALSE;
-       item->custom_content_color.pressed_color.set_flag = EINA_FALSE;
-       item->content_icon = NULL;
-       item->custom_content = NULL;
-    }
-   evas_object_event_callback_add(button, EVAS_CALLBACK_DEL, _item_del_cb, item);
-
-   return item;
-}
-
-
-static void
-_item_selected_signal_send(Eext_Rotary_Selector_Data *rsd, int previous_item_index, int current_item_index)
-{
-   Eina_List *l = NULL;
-   int i = 0;
-   Eext_Rotary_Selector_Item *item = NULL;
-
-   EINA_LIST_FOREACH(rsd->item_list, l, item)
-     {
-        if (previous_item_index != -1 && i == previous_item_index)
-          {
-             elm_object_signal_emit(item->base.obj, "elm,action,button,unselected", "");
-#if _ROTARY_SELECTOR_DEBUG_ENABLED
-             INF("item is unselected!! : index(%d)", previous_item_index);
-#endif
-          }
-        if (current_item_index !=-1 && i == current_item_index)
-          {
-             elm_object_signal_emit(item->base.obj, "elm,action,button,selected", "");
-#if _ROTARY_SELECTOR_DEBUG_ENABLED
-             INF("item is selected!! : index(%d)", current_item_index);
-#endif
-          }
-        i++;
-     }
-}
-
-static void
-_item_touched_signal_send(Eext_Rotary_Selector_Data *rsd, int index, Eina_Bool pressed, Eina_Bool sound)
-{
-   Eina_List *l = NULL;
-   int i = 0;
-   Eext_Rotary_Selector_Item *item = NULL;
-
-   if (index < 0)
-     {
-        return;
-     }
-   if (rsd->selected_index == index)
-     {
-        if (!pressed && sound)
-          {
-             EINA_LIST_FOREACH(rsd->item_list, l, item)
-               {
-                  if (i == index)
-                    {
-                       elm_object_signal_emit(item->base.obj, "elm,action,button,sound", "eext");
-                    }
-                  i++;
-               }
-          }
-        return;
-     }
-
-   EINA_LIST_FOREACH(rsd->item_list, l, item)
-     {
-        if (i == index)
-          {
-             if (pressed)
-               {
-                  elm_object_signal_emit(item->base.obj, "elm,action,button,pressed", "eext");
-               }
-             else
-               {
-                  elm_object_signal_emit(item->base.obj, "elm,action,button,unpressed", "eext");
-                  if (sound)
-                    {
-                       elm_object_signal_emit(item->base.obj, "elm,action,button,sound", "eext");
-                    }
-               }
-          }
-        i++;
-     }
-}
-
-static Eext_Rotary_Selector_Item *
-_item_get(Eext_Rotary_Selector_Data *rsd, int index)
-{
-   int i = 0;
-   Eina_List *l = NULL;
-   Eext_Rotary_Selector_Item *item = NULL;
-   EINA_LIST_FOREACH(rsd->item_list, l, item)
-     {
-        if (index == i)
-          {
-             return item;
-          }
-        i++;
-     }
-
-   return NULL;
-}
-
-static void
-_item_text_copy(char **target, const char* source)
-{
-   int size = 0;
-
-   if (*target)
-     {
-        free(*target);
-        *target = NULL;
-     }
-   size = strlen(source) + 1;
-   *target = malloc(sizeof(char)*size);
-   if (!(*target))
-   {
-      ERR("allocation is failed!!");
-      return;
-   }
-   memset(*target, 0, size);
-   strncpy(*target, source, size);
-}
-
-// ----------------------------------------- animation API --------------------------------------//
-static Eina_Bool
-_previous_page_animator_cb(void *data)
-{
-   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
-   Eina_List *l = NULL;
-   Eext_Rotary_Selector_Item *item = NULL;
-
-   int i = 0;
-   int last_index = 0;
-   double p = 0.0f;
-   double v[4] = {_ROTARY_SELECTOR_CUBIC_BEZIER_P1_X, _ROTARY_SELECTOR_CUBIC_BEZIER_P1_Y, _ROTARY_SELECTOR_CUBIC_BEZIER_P2_X, _ROTARY_SELECTOR_CUBIC_BEZIER_P2_Y};
-
-   int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
-
-   if (rsd->current_page == 0)
-     {
-        last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
-     }
-   else
-     {
-        last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
-     }
-
-   if (rsd->previous_page_animation_started)
-     {
-        rsd->previous_page_animation_started = EINA_FALSE;
-        rsd->previous_page_animator_start_time = ecore_time_unix_get();
-     }
-
-   double dt = ecore_time_unix_get() - rsd->previous_page_animator_start_time;
-   p = ecore_animator_pos_map_n(dt /_ROTARY_SELECTOR_PAGE_ANIMATION_DURATION, ECORE_POS_MAP_CUBIC_BEZIER, 4, v);
-
-   if (p <= 1.0f)
-     {
-        const float startAngle[] = { 300.f, 330.f, 0.f, 30.f, 60.f, 90.f, 120.f, 150.f, 180.f, 210.f, 240.f };
-
-        EINA_LIST_FOREACH(rsd->item_list, l, item)
-          {
-             Evas_Coord new_a;
-             Evas_Object *button = item->base.obj;
-             Eext_Rotary_Selector_Item_Coords *coords = &item->coords;
-             evas_object_raise(button);
-
-             //current page
-             if (first_index <= i && i <= last_index)
-               {
-                  //Forward
-                  if (rsd->animation_direction)
-                    {
-                       // page 0 --> 1 : 0page
-                       const float endAngle[] = { 660.f, 660.f, 300.f, 300.f, 300.f, 300.f, 300.f, 300.f, 300.f, 300.f, 300.f };
-                       _circle_path_interpolator(rsd, p, startAngle[item->index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], endAngle[item->index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], rsd->radius, rsd->radius, &coords->x, &coords->y);
-                    }
-                  else
-                    {
-                       // page 1 --> 0 : 1page
-                       const float endAngle[] = { 240.f, 240.f, -120.f, -120.f, -120.f, -120.f, -120.f, -120.f, -120.f, -120.f, -120.f };
-                       _circle_path_interpolator(rsd, p, startAngle[item->index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], endAngle[item->index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], rsd->radius, rsd->radius, &coords->x, &coords->y);
-                    }
-                  new_a = 255*(1-p);
-                  evas_object_move(button, item->coords.x, item->coords.y);
-                  evas_object_color_set(button, new_a, new_a, new_a, new_a);
-               }
-             if (rsd->animation_direction && rsd->current_page > 0 && (i == first_index-1 || i == first_index -2))
-               {
-                  evas_object_color_set(button, 0, 0, 0, 0);
-               }
-             else if (last_index < (rsd->item_count - 1) && (i == last_index + 1 || i == last_index + 2))
-               {
-                  evas_object_color_set(button, 0, 0, 0, 0);
-               }
-             i++;
-          }
-     }
-   if (p >= 1.0f)
-     {
-        rsd->previous_page_animator_start_time = 0.0f;
-        rsd->previous_page_animator = NULL;
-
-        return ECORE_CALLBACK_CANCEL;
-     }
-
-   return ECORE_CALLBACK_RENEW;
-}
-
-static Eina_Bool
-_item_update_animator_cb(void *data)
-{
-   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
-
-   _item_rearrange(rsd, rsd->selected_index);
-   _item_select(rsd, rsd->selected_index);
-
-   rsd->item_update_animator = NULL;
-
-#if _ROTARY_SELECTOR_DEBUG_ENABLED
-   INF("item_list(0x%d), count(%d)", rsd->item_list, rsd->item_count);
-#endif
-
-   return ECORE_CALLBACK_CANCEL;
-}
-
-static void
-_page_animation_run(Eext_Rotary_Selector_Data *rsd, Eina_Bool direction)
-{
-   if (direction) //Forward
-     {
-        rsd->animation_direction = EINA_TRUE;
-     }
-   else //Backward
-     {
-        rsd->animation_direction = EINA_FALSE;
-     }
-
-   Edje_Message_Float_Set *msg = malloc(sizeof(Edje_Message_Float_Set));
-   if (!msg) return;
-
-   msg->count = 1;
-   msg->val[0] = 1;
-   edje_object_message_send(elm_layout_edje_get(rsd->rotary_selector), EDJE_MESSAGE_FLOAT_SET, 0, msg);
-
-   rsd->previous_page_animator_start_time = ecore_loop_time_get();
-   rsd->previous_page_animation_started = EINA_TRUE;
-   rsd->previous_page_animator = ecore_animator_add(_previous_page_animator_cb, rsd);
-
-   rsd->next_page_timer = ecore_timer_add(_ROTARY_SELECTOR_NEXT_PAGE_ANIMATION_DELAY_TIME, _next_page_timer_cb, rsd);
-}
-
-static void
-_end_effect_animation_run(Eext_Rotary_Selector_Data *rsd, Eina_Bool direction)
-{
-   if (direction) //Forward
-     {
-        rsd->animation_direction = EINA_TRUE;
-     }
-   else //Backward
-     {
-        rsd->animation_direction = EINA_FALSE;
-     }
-   rsd->end_effect_animation_started = EINA_TRUE;
-   rsd->end_effect_animator = ecore_animator_add(_end_effect_animator_cb, rsd);
-
-   elm_layout_signal_emit(rsd->rotary_selector, "eext,action,haptic,end_effect", "eext");
-}
-
-static void
-_item_update_animation_run(Eext_Rotary_Selector_Data *rsd)
-{
-   if (rsd->item_update_animator)
-     {
-#if _ROTARY_SELECTOR_DEBUG_ENABLED
-        INF("item update animator is already running!!");
-#endif
-        return;
-     }
-
-   rsd->item_update_animator = ecore_animator_add(_item_update_animator_cb, rsd);
-}
-
-static Eina_Bool
-_next_page_animator_cb(void *data)
-{
-   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
-   Eina_List *l = NULL;
-   Eext_Rotary_Selector_Item *item = NULL;
-
-   int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
-   int i = 0;
-   Evas_Coord new_a;
-   Eext_Rotary_Selector_Item_Coords *coords = NULL;
-   Evas_Object *button = NULL;
-   int last_index = 0;
-   if (rsd->current_page == 0)
-     {
-        last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
-     }
-   else
-     {
-        last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
-     }
-
-   double p = 0.0f;
-   double v[4] = {_ROTARY_SELECTOR_CUBIC_BEZIER_P1_X, _ROTARY_SELECTOR_CUBIC_BEZIER_P1_Y, _ROTARY_SELECTOR_CUBIC_BEZIER_P2_X, _ROTARY_SELECTOR_CUBIC_BEZIER_P2_Y};
-
-   if (rsd->next_page_animation_started)
-     {
-        rsd->next_page_animation_started = EINA_FALSE;
-        rsd->next_page_animator_start_time = ecore_time_unix_get();
-     }
-
-   double dt = ecore_time_unix_get() - rsd->next_page_animator_start_time;
-   p = ecore_animator_pos_map_n(dt /_ROTARY_SELECTOR_PAGE_ANIMATION_DURATION, ECORE_POS_MAP_CUBIC_BEZIER, 4, v);
-
-   if (p <= 1.0f)
-     {
-        EINA_LIST_FOREACH(rsd->item_list, l, item)
-          {
-             button = item->base.obj;
-             coords = &item->coords;
-             evas_object_raise(button);
-
-             if (rsd->animation_direction) //Forward
-               {
-                  if (first_index + _ROTARY_SELECTOR_PAGE_ITEM_MAX <= i && i<= last_index + _ROTARY_SELECTOR_PAGE_ITEM_MAX)    //current page+1
-                    {
-                       // page 0 --> 1 : 1page
-                       const float endAngle[] = { 300.f, 330.f, 360.f, 390.f, 420.f, 450.f, 480.f, 510.f, 540.f, 570.f, 600.f };
-                       _circle_path_interpolator(rsd, p, 300, endAngle[item->index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], rsd->radius, rsd->radius, &coords->x, &coords->y);
-                       new_a = 255*p;
-                       evas_object_move(button, item->coords.x, item->coords.y);
-                       evas_object_color_set(button, new_a, new_a, new_a, new_a);
-                       evas_object_show(button);
-                    }
-               }
-             else //Backward
-               {
-                  if (first_index - _ROTARY_SELECTOR_PAGE_ITEM_MAX <= i && i<= last_index - _ROTARY_SELECTOR_PAGE_ITEM_MAX)    //current page-1
-                    {
-                       // page 1 --> 0 : 0page
-                       const float endAngle[] = { -60.f, -30.f, 0.f, 30.f, 60.f, 90.f, 120.f, 150.f, 180.f, 210.f, 240.f };
-                       _circle_path_interpolator(rsd, p, 240, endAngle[item->index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], rsd->radius, rsd->radius, &coords->x, &coords->y);
-                       new_a = 255*p;
-                       evas_object_move(button, item->coords.x, item->coords.y);
-                       evas_object_color_set(button, new_a, new_a, new_a, new_a);
-                       evas_object_show(button);
-                    }
-               }
-             i++;
-          }
-     }
-
-   if (p >= 1.0f)
-     {
-        //Forward
-        if (rsd->animation_direction)
-          {
-             rsd->current_page += 1;
-             _items_invalidate(rsd);
-          }
-        else //Backward
-          {
-             rsd->current_page -= 1;
-             _items_invalidate(rsd);
-          }
-
-        rsd->next_page_animator_start_time = 0.0f;
-        rsd->next_page_animator = NULL;
-
-        return ECORE_CALLBACK_CANCEL;
-     }
-
-   return ECORE_CALLBACK_RENEW;
-}
-
-static Eina_Bool
-_next_page_timer_cb(void *data)
-{
-   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
-
-   rsd->next_page_timer = NULL;
-
-   rsd->next_page_animator_start_time = ecore_loop_time_get();
-   rsd->next_page_animation_started = EINA_TRUE;
-   rsd->next_page_animator = ecore_animator_add(_next_page_animator_cb, rsd);
-
-   return ECORE_CALLBACK_CANCEL;
-}
-
-static Eina_Bool
-_end_effect_animator_cb(void *data)
-{
-   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
-
-   double p = 0.0f;
-   double v[4] = {_ROTARY_SELECTOR_CUBIC_BEZIER_P1_X, _ROTARY_SELECTOR_CUBIC_BEZIER_P1_Y, _ROTARY_SELECTOR_CUBIC_BEZIER_P2_X, _ROTARY_SELECTOR_CUBIC_BEZIER_P2_Y};
-
-   if (rsd->end_effect_animation_started)
-     {
-        rsd->end_effect_animation_started = EINA_FALSE;
-        rsd->end_effect_animator_start_time = ecore_time_unix_get();
-     }
-
-   double dt = ecore_time_unix_get() - rsd->end_effect_animator_start_time;
-   p = ecore_animator_pos_map_n(dt /_ROTARY_SELECTOR_END_EFFECT_ANIMATION_DURATION, ECORE_POS_MAP_CUBIC_BEZIER, 4, v);
-
-   Evas_Object *selector = elm_object_part_content_get(rsd->rotary_selector, "selector,bg_image");
-   if (!selector)
-     {
-        ERR("selector is NULL!!");
-        return ECORE_CALLBACK_CANCEL;
-     }
-
-   Evas_Map *map = NULL;
-   map = evas_map_new(4);
-   if (!map)
-     {
-        ERR("map is NULL!!");
-        return ECORE_CALLBACK_CANCEL;
-     }
-
-   double selector_angle = ((rsd->selected_index % _ROTARY_SELECTOR_PAGE_ITEM_MAX) + 1) *_ROTARY_SELECTOR_ITEM_DIVISION_ANGLE;
-   double effect_angle = rsd->animation_direction ? _ROTARY_SELECTOR_ITEM_DIVISION_ANGLE/2 : -_ROTARY_SELECTOR_ITEM_DIVISION_ANGLE/2;
-
-   evas_map_util_points_populate_from_object(map, selector);
-
-   if (p <= 0.5f)
-     {
-        evas_map_util_rotate(map, selector_angle + effect_angle*p/0.5, _ROTARY_SELECTOR_SCREEN_WIDTH/2, _ROTARY_SELECTOR_SCREEN_HEIGHT/2);
-        evas_object_map_enable_set(selector, EINA_TRUE);
-        evas_object_map_set(selector, map);
-     }
-   else if (p <= 1.0f)
-     {
-        evas_map_util_rotate(map, selector_angle + effect_angle - effect_angle*(p - 0.5)/0.5, _ROTARY_SELECTOR_SCREEN_WIDTH/2, _ROTARY_SELECTOR_SCREEN_HEIGHT/2);
-        evas_object_map_enable_set(selector, EINA_TRUE);
-        evas_object_map_set(selector, map);
-     }
-
-   if (p >= 1.0f)
-     {
-        rsd->animation_direction = EINA_TRUE;
-        rsd->end_effect_animator_start_time = 0.0f;
-        rsd->end_effect_animator = NULL;
-        if (map) evas_map_free(map);
-
-        return ECORE_CALLBACK_CANCEL;
-     }
-
-   if (map) evas_map_free(map);
-
-   return ECORE_CALLBACK_RENEW;
-}
-
-// ----------------------------------------- new API --------------------------------------//
-static void
-_selector_update(Eext_Rotary_Selector_Data *rsd, Eina_Bool page_changed, Eina_Bool is_animation)
-{
-   Evas_Object *edje = elm_layout_edje_get(rsd->rotary_selector);
-   if (!edje)
-     {
-        ERR("edje is NULL!!");
-        return;
-     }
-
-   const char* signals[] = {"eext,rotate,0", "eext,rotate,30", "eext,rotate,60", "eext,rotate,90", "eext,rotate,120",
-                            "eext,rotate,150", "eext,rotate,180", "eext,rotate,210", "eext,rotate,240", "eext,rotate,270", "eext,rotate,300",};
-
-   if (page_changed)
-     {
-        if (rsd->selected_index%_ROTARY_SELECTOR_PAGE_ITEM_MAX == 0)
-          {
-             edje_object_signal_emit(edje, "eext,rotate,360", "eext");
-          }
-        else
-          {
-             edje_object_signal_emit(edje, "eext,rotate,-60", "eext");
-          }
-     }
-   else
-     {
-        if (is_animation)
-          edje_object_signal_emit(edje, signals[rsd->selected_index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], "eext");
-        else
-          edje_object_signal_emit(edje, signals[rsd->selected_index%_ROTARY_SELECTOR_PAGE_ITEM_MAX], "noanim");
-     }
-
-   _selector_content_update(rsd);
-}
-
-static void
-_selector_content_update(Eext_Rotary_Selector_Data *rsd)
-{
-   int i = 0;
-   Eina_List *l = NULL;
-   Eext_Rotary_Selector_Item *item = NULL;
-
-   Evas_Object *content_icon = elm_object_part_content_unset(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,icon");
-   if (content_icon)
-     {
-        evas_object_hide(content_icon);
-     }
-
-   EINA_LIST_FOREACH(rsd->item_list, l, item)
-     {
-        if (item->index == rsd->selected_index)
-          {
-#if 0
-             if (item->custom_content)
-               {
-                  elm_layout_signal_emit(elm_object_part_content_get(rsd->rotary_selector, "content"), "content,default", "eext");
-                  elm_layout_signal_emit(elm_object_part_content_get(rsd->rotary_selector, "content"), "custom_content,show", "eext");
-                  elm_object_part_content_set(elm_object_part_content_get(rsd->rotary_selector, "content"), "custom_content", item->custom_content);
-               }
-             else
-#endif
-               {
-                  elm_layout_signal_emit(elm_object_part_content_get(rsd->rotary_selector, "content"), "content,default", "eext");
-
-                  if (item->domain)
-                    {
-                       elm_object_domain_translatable_part_text_set(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,main_text", item->domain, item->text1);
-                       elm_object_domain_translatable_part_text_set(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,sub_text", item->domain, item->text2);
-                    }
-                  else
-                    {
-                       elm_object_part_text_set(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,main_text", item->text1);
-                       elm_object_part_text_set(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,sub_text", item->text2);
-                    }
-                  if (item->content_icon)
-                    {
-                       elm_object_part_content_set(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,icon", item->content_icon);
-                       if (item->text1)
-                         {
-                            elm_layout_signal_emit(elm_object_part_content_get(rsd->rotary_selector, "content"), "text1,icon,show", "eext");
-                         }
-                    }
-                  else if (item->text2)
-                    {
-                       elm_layout_signal_emit(elm_object_part_content_get(rsd->rotary_selector, "content"), "text2,show", "eext");
-                    }
-                  else
-                    {
-                       elm_layout_signal_emit(elm_object_part_content_get(rsd->rotary_selector, "content"), "text1,show", "eext");
-                    }
-               }
-          }
-        i++;
-     }
-}
-
-static void
-_selector_clicked_signal(void *data, Evas_Object *obj, const char *emission, const char *source)
-{
-   INF("called!!");
-
-   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
-   if (rsd)
-     {
-        evas_object_smart_callback_call(rsd->rotary_selector, "item,clicked", (void*)_item_get(rsd, rsd->selected_index));
-     }
-}
-static void
-_selector_animation_finished_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
-{
-   INF("called!!");
-
-   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
-   if (rsd)
-     {
-        if (rsd->acceleration)
-          {
-             rsd->acceleration = EINA_FALSE;
-             rsd->rotary_event_time_stamp = 0;
-          }
-     }
-}
-
-// ----------------------------------------- public API implementation --------------------------------------//
-EAPI Evas_Object *
-eext_rotary_selector_add(Evas_Object *parent)
-{
-   if (!parent) return NULL;
-
-   Eext_Rotary_Selector_Data *rsd = NULL;
-
-   Evas_Object *rotary_selector = elm_layout_add(parent);
-   if (!rotary_selector)
-     {
-        ERR("rotary_selector is NULL!!");
-        return NULL;
-     }
-
-   elm_layout_theme_set(rotary_selector, "layout", "rotary_selector", "default");
-   evas_object_move(rotary_selector, 0, 0);
-   evas_object_resize(rotary_selector, _ROTARY_SELECTOR_SCREEN_WIDTH, _ROTARY_SELECTOR_SCREEN_HEIGHT);
-
-   rsd = _eext_rotary_selector_data_init(rotary_selector, parent);
-   if (!rsd)
-     {
-        ERR("rsd is NULL!!");
-        return NULL;
-     }
-
-   evas_object_data_set(rotary_selector, EEXT_ROTARY_SELECTOR_DATA_KEY, rsd);
-
-   edje_object_signal_callback_add(elm_layout_edje_get(rsd->rotary_selector), "eext,clicked", "", _selector_clicked_signal, rsd);
-   edje_object_signal_callback_add(elm_layout_edje_get(rsd->rotary_selector), "elm,anim,finished", "elm", _selector_animation_finished_cb, rsd);
-
-   //default selector bg part
-   Evas_Object *selector_bg = elm_layout_add(rotary_selector);
-   if (!selector_bg)
-     {
-        ERR("selector_bg is NULL!!");
-        return NULL;
-     }
-
-   elm_layout_theme_set(selector_bg, "rotary_selector", "selector", "selector_bg");
-
-   elm_object_part_content_set(rotary_selector, "selector,bg_image", selector_bg);
-
-   //default selector content part
-   Evas_Object *content = elm_layout_add(rotary_selector);
-   if (!content)
-     {
-        ERR("content is NULL!!");
-        return NULL;
-     }
-
-   elm_layout_theme_set(content, "rotary_selector", "content", "default");
-   elm_object_part_content_set(rotary_selector, "content", content);
-
-   eext_rotary_object_event_callback_add(rotary_selector, _rotary_selector_rotary_cb, rsd);
-   evas_object_event_callback_add(rotary_selector, EVAS_CALLBACK_MOVE, _rotary_selector_move_cb, rsd);
-   evas_object_event_callback_add(rotary_selector, EVAS_CALLBACK_DEL, _rotary_selector_del_cb, rsd);
-   evas_object_event_callback_add(rotary_selector, EVAS_CALLBACK_SHOW, _rotary_selector_show_cb, rsd);
-
-   _event_area_callback_add(rsd);
-
-   //for accessibility
-   _rotary_selector_from_moreoption_set(rotary_selector, EINA_FALSE);
-   rsd->event_area_access_object = elm_access_object_register(rsd->event_area, rsd->rotary_selector);
-
-   evas_object_smart_callback_add(rotary_selector, "more,option,opened", _rotary_selector_moreoption_opened_cb, rsd);
-   evas_object_smart_callback_add(rotary_selector, "more,option,closed", _rotary_selector_moreoption_closed_cb, rsd);
-
-   elm_access_action_cb_set(rsd->event_area_access_object, ELM_ACCESS_ACTION_HIGHLIGHT, _accessibility_event_area_highlighted_cb, (Eext_Rotary_Selector_Data*)rsd);
-   elm_access_action_cb_set(rsd->event_area_access_object, ELM_ACCESS_ACTION_HIGHLIGHT_NEXT, _accessibility_event_area_highlighted_cb, (Eext_Rotary_Selector_Data*)rsd);
-   elm_access_action_cb_set(rsd->event_area_access_object, ELM_ACCESS_ACTION_HIGHLIGHT_PREV, _accessibility_event_area_highlighted_cb, (Eext_Rotary_Selector_Data*)rsd);
-   //
-   return rotary_selector;
-}
-
-EAPI Eext_Object_Item *
-eext_rotary_selector_item_append(Evas_Object *obj)
-{
-   int selected_index = 0;
-   Evas_Object* rotary_selector = obj;
-   Eext_Rotary_Selector_Data *rsd = NULL;
-   Eext_Rotary_Selector_Item *item = NULL;
-
-   rsd = _eext_rotary_selector_data_get(rotary_selector);
-   if (!rsd)
-     {
-        ERR("rsd is NULL!!");
-        return NULL;
-     }
-
-   item = _item_create(rsd);
-   if (!item)
-     {
-        ERR("item is NULL!!");
-        return NULL;
-     }
-
-   rsd->item_list = eina_list_append(rsd->item_list, item);
-
-   if (_rotary_selector_visible_get(rotary_selector))
-     {
-        selected_index = rsd->selected_index;
-     }
-
-   rsd->selected_index = selected_index;
-   _item_rearrange(rsd, rsd->selected_index);
-
-   _item_update_animation_run(rsd);
-
-   return (Eext_Object_Item *)item;
-}
-
-EAPI Eext_Object_Item *
-eext_rotary_selector_item_prepend(Evas_Object *obj)
-{
-   int selected_index = 0;
-   Evas_Object* rotary_selector = obj;
-   Eext_Rotary_Selector_Data *rsd = NULL;
-   Eext_Rotary_Selector_Item *item = NULL;
-
-   rsd = _eext_rotary_selector_data_get(rotary_selector);
-   if (!rsd)
-     {
-        ERR("rsd is NULL!!");
-        return NULL;
-     }
-
-   item = _item_create(rsd);
-   if (!item)
-     {
-        ERR("item is NULL!!");
-        return NULL;
-     }
-
-   rsd->item_list = eina_list_prepend(rsd->item_list, item);
-
-   if (_rotary_selector_visible_get(rotary_selector))
-     {
-        selected_index = rsd->selected_index + 1;
-     }
-
-   rsd->selected_index = selected_index;
-   _item_rearrange(rsd, rsd->selected_index);
-
-   _item_update_animation_run(rsd);
-
-   return (Eext_Object_Item *)item;
-}
-
-EAPI Eext_Object_Item *
-eext_rotary_selector_item_insert_after(Evas_Object *obj, Eext_Object_Item *after)
-{
-   int selected_index = 0;
-   Evas_Object* rotary_selector = obj;
-   Eext_Rotary_Selector_Data *rsd = NULL;
-   Eext_Rotary_Selector_Item *item = NULL;
-   Eext_Rotary_Selector_Item *after_item = (Eext_Rotary_Selector_Item *)after;
-
-   rsd = _eext_rotary_selector_data_get(rotary_selector);
-   if (!rsd)
-     {
-        ERR("rsd is NULL!!");
-        return NULL;
-     }
-
-   item = _item_create(rsd);
-   if (!item)
-     {
-        ERR("item is NULL!!");
-        return NULL;
-     }
-
-   rsd->item_list = eina_list_append_relative(rsd->item_list, item, after_item);
-
-   if (_rotary_selector_visible_get(rotary_selector) && rsd->selected_index <= after_item->index)
-     {
-        selected_index = rsd->selected_index;
-     }
-   else if (_rotary_selector_visible_get(rotary_selector) && rsd->selected_index > after_item->index)
-     {
-        selected_index = rsd->selected_index + 1;
-     }
-
-   rsd->selected_index = selected_index;
-   _item_rearrange(rsd, rsd->selected_index);
-
-   _item_update_animation_run(rsd);
-
-   return (Eext_Object_Item *)item;
-}
-
-EAPI Eext_Object_Item *
-eext_rotary_selector_item_insert_before(Evas_Object *obj, Eext_Object_Item *before)
-{
-   int selected_index = 0;
-   Evas_Object* rotary_selector = obj;
-   Eext_Rotary_Selector_Data *rsd = NULL;
-   Eext_Rotary_Selector_Item *item = NULL;
-   Eext_Rotary_Selector_Item *before_item = (Eext_Rotary_Selector_Item *)before;
-
-   rsd = _eext_rotary_selector_data_get(rotary_selector);
-   if (!rsd)
-     {
-        ERR("rsd is NULL!!");
-        return NULL;
-     }
-
-   item = _item_create(rsd);
-   if (!item)
-     {
-        ERR("item is NULL!!");
-        return NULL;
-     }
-
-   rsd->item_list = eina_list_prepend_relative(rsd->item_list, item, before_item);
-
-   if (_rotary_selector_visible_get(rotary_selector)  && rsd->selected_index >= before_item->index)
-     {
-        selected_index = rsd->selected_index + 1;
-     }
-   else if (_rotary_selector_visible_get(rotary_selector)  && rsd->selected_index < before_item->index)
-     {
-        selected_index = rsd->selected_index;
-     }
-
-   rsd->selected_index = selected_index;
-   _item_rearrange(rsd, rsd->selected_index);
-
-   _item_update_animation_run(rsd);
-
-   return (Eext_Object_Item *)item;
-}
-
-EAPI void
-eext_rotary_selector_item_del(Eext_Object_Item *item)
-{
-   int selected_index = 0;
-   Eext_Rotary_Selector_Data *rsd = NULL;
-   Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item;
-
-   if (!rotary_selector_item)
-     {
-        ERR("rotary_selector_item is NULL!!");
-        return;
-     }
-
-   rsd = _eext_rotary_selector_data_get(rotary_selector_item->rotary_selector);
-   if (!rsd)
-     {
-        ERR("rsd is NULL!!");
-        return;
-     }
-
-   if (_rotary_selector_visible_get(rotary_selector_item->rotary_selector) && rsd->selected_index < rotary_selector_item->index)
-     {
-        selected_index = rsd->selected_index;
-     }
-   else if (_rotary_selector_visible_get(rotary_selector_item->rotary_selector) && rsd->selected_index > rotary_selector_item->index)
-     {
-        selected_index = rsd->selected_index - 1;
-     }
-
-   rsd->item_list = eina_list_remove(rsd->item_list, rotary_selector_item);
-   evas_object_del(rotary_selector_item->base.obj);
-
-   rsd->selected_index = selected_index;
-   _item_rearrange(rsd, rsd->selected_index);
-
-   _item_update_animation_run(rsd);
-
-   return;
-}
-
-EAPI void
-eext_rotary_selector_items_clear(Evas_Object *obj)
-{
-   Evas_Object* rotary_selector = obj;
-   Eext_Rotary_Selector_Data *rsd = NULL;
-   Eext_Rotary_Selector_Item *item = NULL;
-
-   if (!rotary_selector)
-     {
-        ERR("rotary_selector is NULL!!");
-        return;
-     }
-
-   rsd = _eext_rotary_selector_data_get(rotary_selector);
-   if (!rsd)
-     {
-        ERR("rsd is NULL!!");
-        return;
-     }
-
-   EINA_LIST_FREE(rsd->item_list, item)
-     evas_object_del(item->base.obj);
-
-   rsd->selected_index = 0;
-
-   _item_update_animation_run(rsd);
-
-   return;
-}
-
-EAPI void
-eext_rotary_selector_item_part_text_set(Eext_Object_Item *item, const char *part_name, const char *text)
-{
-   Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item;
-
-   if (!rotary_selector_item)
-     {
-        ERR("rotary_selector_item is NULL!!");
-        return;
-     }
-   if (!part_name)
-     {
-        ERR("part_name is NULL!!");
-        return;
-     }
-   if (!text)
-     {
-        ERR("text is NULL!!");
-        return;
-     }
-
-   Eext_Rotary_Selector_Data *rsd = NULL;
-   rsd = _eext_rotary_selector_data_get(rotary_selector_item->rotary_selector);
-   if (!rsd)
-     {
-        ERR("rsd is NULL!!");
-        return;
-     }
-
-   if (!strcmp(part_name, "selector,main_text"))
-     {
-        _item_text_copy(&(rotary_selector_item->text1), text);
-     }
-   else if (!strcmp(part_name, "selector,sub_text"))
-     {
-        _item_text_copy(&(rotary_selector_item->text2), text);
-     }
-   else
-     {
-       ERR("Not supported part name [%s]", part_name);
-       return;
-     }
-
-   _selector_content_update(rsd);
-
-   return;
-}
-
-EAPI const char *
-eext_rotary_selector_item_part_text_get(const Eext_Object_Item *item, const char *part_name)
-{
-   Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item*)item;
-
-   if (!rotary_selector_item)
-     {
-        ERR("item is NULL!!");
-        return NULL;
-     }
-   if (!strcmp(part_name, "selector,main_text"))
-     {
-       return rotary_selector_item->text1;
-     }
-   else if (!strcmp(part_name, "selector,sub_text"))
-     {
-        return rotary_selector_item->text2;
-     }
-
-   return NULL;
-}
-
-EAPI void
-eext_rotary_selector_item_domain_translatable_part_text_set(Eext_Object_Item *item, const char *part_name, const char *domain, const char *text)
-{
-   Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item;
-
-   if (!rotary_selector_item)
-     {
-        ERR("rotary_selector_item is NULL!!");
-        return;
-     }
-   if (!part_name)
-     {
-        ERR("part_name is NULL!!");
-        return;
-     }
-   if (!domain)
-     {
-        ERR("domain is NULL!!");
-        return;
-     }
-   if (!text)
-     {
-        ERR("text is NULL!!");
-        return;
-     }
-
-   Eext_Rotary_Selector_Data *rsd = NULL;
-   rsd = _eext_rotary_selector_data_get(rotary_selector_item->rotary_selector);
-   if (!rsd)
-     {
-        ERR("rsd is NULL!!");
-        return;
-     }
-
-   if (!strcmp(part_name, "selector,main_text"))
-     {
-        _item_text_copy(&(rotary_selector_item->domain), domain);
-        _item_text_copy(&(rotary_selector_item->text1), text);
-     }
-   else if (!strcmp(part_name, "selector,sub_text"))
-     {
-        _item_text_copy(&(rotary_selector_item->domain), domain);
-        _item_text_copy(&(rotary_selector_item->text2), text);
-     }
-   else
-     {
-        ERR("Not supported part name [%s]", part_name);
-        return;
-     }
-
-   _selector_content_update(rsd);
-
-   return;
-}
-
-EAPI void
-eext_rotary_selector_item_part_content_set(Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state, Evas_Object *content)
-{
-   //Supported part names : "item,bg_image", "item,icon", "selector,icon", "selector,content"
-
-   Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item;
-   if (!rotary_selector_item)
-     {
-        ERR("rotary_selector_item is NULL!!");
-        return;
-     }
-   if (!part_name)
-     {
-        ERR("part_name is NULL!!");
-        return;
-     }
-   if (!content)
-     {
-        ERR("content is NULL!!");
-        return;
-     }
-   if (state != EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
-     {
-        ERR("Not implemented!!");
-        return;
-     }
-   Eext_Rotary_Selector_Data *rsd = NULL;
-   rsd = _eext_rotary_selector_data_get(rotary_selector_item->rotary_selector);
-   if (!rsd)
-     {
-        ERR("rsd is NULL!!");
-        return;
-     }
-   // for Accessibility
-   if(elm_atspi_bridge_utils_is_screen_reader_enabled())
-      elm_atspi_accessible_role_set(content, ELM_ATSPI_ROLE_REDUNDANT_OBJECT);
-   //
-   if (!strcmp(part_name, "item,bg_image") || !strcmp(part_name, "item,icon"))
-     {
-        elm_object_part_content_set(rotary_selector_item->base.obj, part_name, content);
-     }
-   else if (!strcmp(part_name, "selector,icon"))
-     {
-        if (rotary_selector_item->content_icon)
-          {
-             if (rotary_selector_item->index == rsd->selected_index)
-               {
-                  elm_object_part_content_unset(elm_object_part_content_get(rsd->rotary_selector, "content"), "selector,icon");
-               }
-             evas_object_del(rotary_selector_item->content_icon);
-             rotary_selector_item->content_icon = NULL;
-          }
-        rotary_selector_item->content_icon = content;
-     }
-   else if (!strcmp(part_name, "selector,content"))
-     {
-        if (rotary_selector_item->custom_content)
-          {
-             evas_object_del(rotary_selector_item->custom_content);
-             rotary_selector_item->custom_content = NULL;
-          }
-        rotary_selector_item->custom_content = content;
-     }
-   else
-     {
-        ERR("Not supported part name!!");
-        return;
-     }
-
-   _selector_content_update(rsd);
-}
-
-EAPI Evas_Object *
-eext_rotary_selector_item_part_content_get(const Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state)
-{
-   Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item*)item;
-
-   if (!rotary_selector_item)
-     {
-        ERR("rotary_selector_item is NULL!!");
-        return NULL;
-     }
-   if (!part_name)
-     {
-        ERR("part_name is NULL!!");
-        return NULL;
-     }
-   if (state != EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
-     {
-        ERR("Not implemented!!");
-        return NULL;
-     }
-
-   if (!strcmp(part_name, "item,bg_image") || !strcmp(part_name, "item,icon"))
-     {
-        return elm_object_part_content_get(rotary_selector_item->base.obj, part_name);
-     }
-   else if (!strcmp(part_name, "selector,icon"))
-     {
-        return rotary_selector_item->content_icon;
-     }
-   else if (!strcmp(part_name, "selector,content"))
-     {
-        return rotary_selector_item->custom_content;
-     }
-   else
-     {
-       ERR("Not supported part name!!");
-       return NULL;
-     }
-
-   return NULL;
-}
-
-EAPI void
-eext_rotary_selector_part_content_set(Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state, Evas_Object *content)
-{
-   //Supported part names : "selector,bg_image"
-
-   if (!obj)
-     {
-        ERR("obj is NULL!!");
-        return;
-     }
-   if (!part_name)
-     {
-        ERR("part_name is NULL!!");
-        return;
-     }
-   if (!content)
-     {
-        ERR("content is NULL!!");
-        return;
-     }
-
-   if (strcmp(part_name, "selector,bg_image"))
-   {
-      ERR("Not supported part name!!!");
-      return;
-   }
-
-   if (state != EEXT_ROTARY_SELECTOR_SELECTOR_STATE_NORMAL)
-     {
-        ERR("Not implemented!!");
-        return;
-     }
-
-   Eext_Rotary_Selector_Data *rsd = NULL;
-   rsd = _eext_rotary_selector_data_get(obj);
-   if (!rsd)
-     {
-        ERR("rsd is NULL!!");
-        return;
-     }
-
-   elm_object_part_content_set(rsd->rotary_selector, part_name, content);
-
-}
-
-EAPI Evas_Object *
-eext_rotary_selector_part_content_get(const Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state)
-{
-   //Supported part names : "selector,bg_image"
-   if (!obj)
-     {
-        ERR("obj is NULL!!");
-        return NULL;
-     }
-   if (!part_name)
-     {
-        ERR("part_name is NULL!!");
-        return NULL;
-     }
-   if (strcmp(part_name, "selector,bg_image"))
-     {
-        ERR("Not supported part name!!!");
-        return NULL;
-     }
-
-   if (state != EEXT_ROTARY_SELECTOR_SELECTOR_STATE_NORMAL)
-     {
-        ERR("Not implemented!!");
-        return NULL;
-     }
-
-   Eext_Rotary_Selector_Data *rsd = NULL;
-   rsd = _eext_rotary_selector_data_get((Evas_Object *)obj);
-   if (!rsd)
-     {
-        ERR("rsd is NULL!!");
-        return NULL;
-     }
-
-   return elm_object_part_content_get(rsd->rotary_selector, part_name);
-}
-
-EAPI void
-eext_rotary_selector_item_part_color_set(Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state, int r, int g, int b, int a)
-{
-   Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item*)item;
-   Evas_Object *content;
-
-   if (!rotary_selector_item)
-     {
-        ERR("rotary_selector_item is NULL!!");
-        return;
-     }
-   if (!part_name)
-     {
-        ERR("part_name is NULL!!");
-        return;
-     }
-
-   if (!strcmp(part_name, "item,bg_image"))
-     {
-
-        if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
-          {
-             ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, item_bg_image_color, normal_color, r, g, b, a);
-          }
-        else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
-          {
-             ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, item_bg_image_color, pressed_color, r, g, b, a);
-          }
-
-        if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
-          {
-             content = eext_rotary_selector_item_part_content_get(item, "item,bg_image",EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL);
-             ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, item_bg_image_color, normal_color);
-          }
-        else if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
-          {
-             content = eext_rotary_selector_item_part_content_get(item, "item,bg_image",EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED);
-             ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, item_bg_image_color, pressed_color);
-          }
-     }
-   else if (!strcmp(part_name, "item,icon"))
-     {
-
-        if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
-          {
-             ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, item_icon_color, normal_color, r, g, b, a);
-          }
-        else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
-          {
-             ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, item_icon_color, pressed_color, r, g, b, a);
-          }
-
-        if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
-          {
-             content = eext_rotary_selector_item_part_content_get(item, "item,icon",EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL);
-             ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, item_icon_color, normal_color);
-          }
-        else if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
-          {
-             content = eext_rotary_selector_item_part_content_get(item, "item,icon",EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED);
-             ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, item_icon_color, pressed_color);
-          }
-     }
-   else if (!strcmp(part_name, "selector,icon"))
-     {
-        if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
-          {
-             ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, selector_icon_color, normal_color, r, g, b, a);
-          }
-        else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
-          {
-             ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, selector_icon_color, pressed_color, r, g, b, a);
-          }
-
-        if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
-          {
-             content = eext_rotary_selector_item_part_content_get(item, "selector,icon",EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL);
-             ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, selector_icon_color, normal_color);
-          }
-        else if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
-          {
-             content = eext_rotary_selector_item_part_content_get(item, "selector,icon",EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED);
-             ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, selector_icon_color, pressed_color);
-          }
-     }
-   else if (!strcmp(part_name, "selector,content"))
-     {
-        if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
-          {
-             ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, custom_content_color, normal_color, r, g, b, a);
-          }
-        else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
-          {
-             ROTARY_SELECTOR_COLOR_VALUE_SET(rotary_selector_item, custom_content_color, pressed_color, r, g, b, a);
-          }
-
-        if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
-          {
-             content = eext_rotary_selector_item_part_content_get(item, "selector,content",EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL);
-             ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, custom_content_color, normal_color);
-          }
-        else if (rotary_selector_item->state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
-          {
-             content = eext_rotary_selector_item_part_content_get(item, "selector,content",EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED);
-             ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rotary_selector_item, custom_content_color, pressed_color);
-          }
-     }
-   else
-     {
-       ERR("Not supported part name [%s]", part_name);
-       return;
-     }
-
-   return;
-}
-
-EAPI void
-eext_rotary_selector_item_part_color_get(const Eext_Object_Item *item, const char *part_name, Eext_Rotary_Selector_Item_State state, int *r, int *g, int *b, int *a)
-{
-   Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item*)item;
-
-   if (!rotary_selector_item)
-     {
-        ERR("rotary_selector_item is NULL!!");
-        return;
-     }
-   if (!part_name)
-     {
-        ERR("part_name is NULL!!");
-        return;
-     }
-
-   if (!strcmp(part_name, "item,bg_image") )
-     {
-        if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
-          {
-             ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, item_bg_image_color, normal_color, r, g, b, a);
-          }
-        else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
-          {
-             ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, item_bg_image_color, pressed_color, r, g, b, a);
-          }
-     }
-   else if (!strcmp(part_name, "item,icon"))
-     {
-        if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
-          {
-             ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, item_icon_color, normal_color, r, g, b, a);
-          }
-        else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
-          {
-             ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, item_icon_color, pressed_color, r, g, b, a);
-          }
-     }
-   else if (!strcmp(part_name, "selector,icon"))
-     {
-        if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
-          {
-             ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, selector_icon_color, normal_color, r, g, b, a);
-          }
-        else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
-          {
-             ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, selector_icon_color, pressed_color, r, g, b, a);
-          }
-     }
-   else if (!strcmp(part_name, "selector,content"))
-     {
-        if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_NORMAL)
-          {
-             ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, custom_content_color, normal_color, r, g, b, a);
-          }
-        else if (state == EEXT_ROTARY_SELECTOR_ITEM_STATE_PRESSED)
-          {
-             ROTARY_SELECTOR_COLOR_VALUE_GET(rotary_selector_item, custom_content_color, pressed_color, r, g, b, a);
-          }
-     }
-   else
-     {
-       ERR("Not supported part name [%s]", part_name);
-       return;
-     }
-}
-
-EAPI void
-eext_rotary_selector_part_color_set(Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state, int r, int g, int b, int a)
-{
-   Evas_Object *content;
-   Eext_Rotary_Selector_Data *rsd = NULL;
-   rsd = _eext_rotary_selector_data_get((Evas_Object *)obj);
-
-   if (!rsd)
-     {
-        ERR("rsd is NULL!!");
-        return;
-     }
-   if (!part_name)
-     {
-        ERR("part_name is NULL!!");
-        return;
-     }
-
-   if (!strcmp(part_name, "item,icon") || !strcmp(part_name, "selector,bg_image"))
-     {
-        if (state == EEXT_ROTARY_SELECTOR_SELECTOR_STATE_NORMAL)
-          {
-             ROTARY_SELECTOR_COLOR_VALUE_SET(rsd, selector_bg_image_color, normal_color, r, g, b, a);
-          }
-        else if (state == EEXT_ROTARY_SELECTOR_SELECTOR_STATE_PRESSED)
-          {
-             ROTARY_SELECTOR_COLOR_VALUE_SET(rsd, selector_bg_image_color, pressed_color, r, g, b, a);
-          }
-
-        content = elm_object_part_content_get(obj, "selector,bg_image");
-
-        if (rsd->state == EEXT_ROTARY_SELECTOR_SELECTOR_STATE_NORMAL)
-          {
-             ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rsd, selector_bg_image_color, normal_color);
-          }
-        else if (rsd->state == EEXT_ROTARY_SELECTOR_SELECTOR_STATE_PRESSED)
-          {
-             ROTARY_SELECTOR_EVAS_OBJECT_COLOR_SET(content, rsd, selector_bg_image_color, pressed_color);
-          }
-        return;
-     }
-   else
-     {
-       ERR("Not supported part name [%s]", part_name);
-       return;
-     }
-
-   return;
-}
-
-EAPI void
-eext_rotary_selector_part_color_get(const Evas_Object *obj, const char *part_name, Eext_Rotary_Selector_Selector_State state, int *r, int *g, int *b, int *a)
-{
-   Eext_Rotary_Selector_Data *rsd = NULL;
-   rsd = _eext_rotary_selector_data_get((Evas_Object *)obj);
-
-   if (!rsd)
-     {
-        ERR("rsd is NULL!!");
-        return;
-     }
-   if (!part_name)
-     {
-        ERR("part_name is NULL!!");
-        return;
-     }
-
-   if (!strcmp(part_name, "item,icon") || !strcmp(part_name, "selector,bg_image"))
-     {
-        if (state == EEXT_ROTARY_SELECTOR_SELECTOR_STATE_NORMAL)
-          {
-             ROTARY_SELECTOR_COLOR_VALUE_GET(rsd, selector_bg_image_color, normal_color, r, g, b, a);
-          }
-        else if (state == EEXT_ROTARY_SELECTOR_SELECTOR_STATE_PRESSED)
-          {
-             ROTARY_SELECTOR_COLOR_VALUE_GET(rsd, selector_bg_image_color, pressed_color, r, g, b, a);
-          }
-        return;
-     }
-   else
-     {
-       ERR("Not supported part name [%s]", part_name);
-       return;
-     }
-}
-
-EAPI void
-eext_rotary_selector_selected_item_set(Evas_Object *obj, Eext_Object_Item *item)
-{
-   Eext_Rotary_Selector_Data *rsd = NULL;
-   Eext_Rotary_Selector_Item *rotary_selector_item = (Eext_Rotary_Selector_Item *)item;
-
-   if (!rotary_selector_item)
-     {
-        ERR("rotary_selector_item is NULL!!");
-        return;
-     }
-
-   rsd = _eext_rotary_selector_data_get(obj);
-   if (!rsd)
-     {
-        ERR("rsd is NULL!!");
-        return;
-     }
-   if (rsd->item_update_animator)
-     {
-        return;
-     }
-
-   if (rsd->selected_index != rotary_selector_item->index)
-     {
-        int previous_index = rsd->selected_index;
-        rsd->selected_index = rotary_selector_item->index;
-
-        _item_selected_signal_send(rsd, previous_index, rsd->selected_index);
-        rsd->current_page = rsd->selected_index/_ROTARY_SELECTOR_PAGE_ITEM_MAX;
-        _item_update_animation_run(rsd);
-     }
-
-   INF("selected item index(%d)", rsd->selected_index);
-}
-
-EAPI Eext_Object_Item*
-eext_rotary_selector_selected_item_get(const Evas_Object *obj)
-{
-   Eext_Rotary_Selector_Data *rsd = _eext_rotary_selector_data_get((Evas_Object *)obj);
-   if (!rsd)
-     {
-        ERR("rsd is NULL!!");
-        return NULL;
-     }
-
-   return (Eext_Object_Item*)_item_get(rsd, rsd->selected_index);
-}
-
-EAPI const Eina_List*
-eext_rotary_selector_items_get(const Evas_Object *obj)
-{
-   Eext_Rotary_Selector_Data *rsd = _eext_rotary_selector_data_get((Evas_Object *)obj);
-   if (!rsd)
-     {
-        ERR("rsd is NULL!!");
-        return NULL;
-     }
-
-   return rsd->item_list;
-}
-
-
-// ----------------------------------------- Accessibility API --------------------------------------//
-static void
-_accessibility_item_btn_highlighted_cb(void *data, Evas_Object *obj, void *event_info)
-{
-   Eext_Rotary_Selector_Data *rsd = NULL;
-   Eext_Rotary_Selector_Item *item = NULL;
-   Eina_List *l;
-
-   rsd = (Eext_Rotary_Selector_Data*)data;
-   if(!rsd)
-     return;
-
-   EINA_LIST_FOREACH(rsd->item_list,l,item)
-     {
-        if(item->base.obj == obj)
-           break;
-     }
-
-   int previous_item_index = rsd->selected_index;
-   rsd->selected_index = item->index;
-   _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
-   _selector_update(rsd, EINA_FALSE, EINA_TRUE);
-
-   rsd->control_by_rotary = EINA_FALSE;
-}
-
-void _accessibility_page_change(Eext_Rotary_Selector_Data *rsd, int previous_item_index, Eina_Bool dir)
-{
-   _item_selected_signal_send(rsd, previous_item_index, rsd->selected_index);
-   _page_animation_run(rsd, dir);
-   _selector_update(rsd, EINA_TRUE, EINA_TRUE);
-}
-
-static Eina_Bool
-_accessibility_event_area_highlighted_cb(void *data, Evas_Object *obj, Elm_Access_Action_Info *action_info)
-{
-   if(!elm_atspi_bridge_utils_is_screen_reader_enabled())
-     return EINA_FALSE;
-
-   Eext_Rotary_Selector_Data *rsd = NULL;
-   rsd = (Eext_Rotary_Selector_Data*)data;
-   if(!rsd)
-     return EINA_FALSE;
-   int current_page = 0;
-   Eina_List *l;
-   int previous_item_index = rsd->selected_index;
-   int first_index = rsd->current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
-   int last_index = 0;
-   int changed_list = 0;
-   Eina_Bool ret = EINA_FALSE;
-
-   if (rsd->current_page == 0)
-        last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
-   else
-        last_index = (rsd->current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
-   if (last_index > rsd->item_count - 1)
-        last_index = rsd->item_count - 1;
-
-   if (last_index < rsd->selected_index+1 && last_index != rsd->item_count - 1)
-        changed_list = 1;
-   else if (first_index > rsd->selected_index-1 && first_index != 0)
-        changed_list = 2;
-
-   switch (action_info->action_type)
-     {
-        case ELM_ACCESS_ACTION_UNHIGHLIGHT:
-           elm_atspi_accessible_can_highlight_set(rsd->event_area_access_object, EINA_FALSE);
-           break;
-        case ELM_ACCESS_ACTION_HIGHLIGHT:
-           if (action_info->action_by == ELM_ACCESS_ACTION_HIGHLIGHT_NEXT || (changed_list == 1 && rsd->control_by_rotary))
-             {
-                rsd->selected_index += 1;
-                _accessibility_page_change(rsd, previous_item_index, EINA_TRUE);
-                current_page = rsd->current_page + 1;
-                rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_RIGHT;
-                _accessibility_set_relationship(rsd, current_page);
-             }
-           else if (action_info->action_by == ELM_ACCESS_ACTION_HIGHLIGHT_PREV || (changed_list == 2 && rsd->control_by_rotary))
-             {
-                rsd->selected_index -= 1;
-                _accessibility_page_change(rsd, previous_item_index, EINA_FALSE);
-                current_page = rsd->current_page - 1;
-                rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_LEFT;
-                _accessibility_set_relationship(rsd, current_page);
-             }
-           else
-             {
-                Elm_Accessible_Reading_Info_Type type = elm_atspi_accessible_reading_info_type_get(rsd->event_area_access_object);
-                char buf[255] = "";
-                if(type & ELM_ACCESSIBLE_READING_INFO_TYPE_NAME)
-                  {
-                     if(_rotary_selector_from_moreoption_get(rsd->rotary_selector))
-                       {
-                          const char *buf_name;
-                          buf_name = elm_atspi_accessible_name_get(rsd->event_area_access_object);
-                          if(buf_name)
-                            strcat(buf, buf_name);
-                       }
-                  }
-                if(type & ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION)
-                  {
-                     strcat(buf, " ");
-                     const char *buf_desc;
-                     buf_desc = elm_atspi_accessible_description_get(rsd->event_area_access_object);
-                     if(buf_desc)
-                       strcat(buf, buf_desc);
-                  }
-                if(strcmp(buf,""))
-                  elm_atspi_bridge_utils_say(buf, EINA_TRUE, NULL, NULL);
-                _accessibility_set_relationship(rsd, rsd->current_page);
-             }
-           ret = EINA_FALSE;
-        break;
-        case ELM_ACCESS_ACTION_HIGHLIGHT_NEXT:
-           rsd->control_by_rotary = EINA_FALSE;
-           if (rsd->event_area_highlighted_state == EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_LEFT)
-             {
-                rsd->selected_index += 1;
-                _accessibility_page_change(rsd, previous_item_index, EINA_TRUE);
-                current_page = rsd->current_page + 1;
-                rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_RIGHT;
-
-                _accessibility_set_relationship(rsd, current_page);
-                ret = EINA_TRUE;
-                const char *buf_desc;
-                buf_desc = elm_atspi_accessible_description_get(rsd->event_area_access_object);
-                if(buf_desc)
-                   elm_atspi_bridge_utils_say(buf_desc, EINA_TRUE, NULL, NULL);
-             }
-           else if (rsd->event_area_highlighted_state == EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_RIGHT)
-             {
-                rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_NORMAL;
-                ret = EINA_FALSE;
-             }
-        break;
-        case ELM_ACCESS_ACTION_HIGHLIGHT_PREV:
-           rsd->control_by_rotary = EINA_FALSE;
-           if (rsd->event_area_highlighted_state == EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_LEFT)
-             {
-                rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_NORMAL;
-                ret = EINA_FALSE;
-             }
-           else if (rsd->event_area_highlighted_state == EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_RIGHT)
-             {
-                rsd->selected_index -= 1;
-                _accessibility_page_change(rsd, previous_item_index, EINA_FALSE);
-                current_page = rsd->current_page - 1;
-                rsd->event_area_highlighted_state = EEXT_ROTARY_SELECTOR_ACCESSIBILITY_EVENTAREA_HIGHTLIHGTED_STATE_LEFT;
-
-                _accessibility_set_relationship(rsd, current_page);
-                ret = EINA_TRUE;
-                const char *buf_desc;
-                buf_desc = elm_atspi_accessible_description_get(rsd->event_area_access_object);
-                if(buf_desc)
-                   elm_atspi_bridge_utils_say(buf_desc, EINA_TRUE, NULL, NULL);
-             }
-        break;
-     }
-   return ret;
-}
-
-static void _accessibility_set_relationship(Eext_Rotary_Selector_Data *rsd,int current_page)
-{
-   Eext_Rotary_Selector_Item *item = NULL;
-   Eext_Rotary_Selector_Item *before_item = NULL;
-   Evas_Object *first_item = NULL;
-   Evas_Object *last_item = NULL;
-   Eina_Bool is_next_page = EINA_FALSE;
-   Eina_Bool is_prev_page = EINA_FALSE;
-   int i = 0;
-   Eina_List *l;
-   int first_index = 0;
-   int last_index = 0;
-
-   rsd->reading_page_number = current_page;
-   elm_atspi_accessible_description_cb_set(rsd->event_area_access_object, _accessibility_description_set_cb, (Eext_Rotary_Selector_Data*)rsd);
-   elm_atspi_accessible_reading_info_type_set(rsd->event_area_access_object, ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
-
-   first_index = current_page*_ROTARY_SELECTOR_PAGE_ITEM_MAX;
-
-   if (current_page == 0)
-     {
-        last_index = _ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
-     }
-   else
-     {
-        last_index = (current_page + 1)*_ROTARY_SELECTOR_PAGE_ITEM_MAX - 1;
-     }
-   if (last_index > rsd->item_count - 1)
-     {
-        last_index = rsd->item_count - 1;
-     }
-
-   EINA_LIST_FOREACH(rsd->item_list, l, item)
-     {
-        Evas_Object *button = item->base.obj;
-        if (i >= first_index && i <= last_index)
-          {
-             if(before_item)
-               {
-                  elm_atspi_accessible_relationship_append(before_item->base.obj, ELM_ATSPI_RELATION_FLOWS_TO, button);
-                  elm_atspi_accessible_relationship_append(button, ELM_ATSPI_RELATION_FLOWS_FROM, before_item->base.obj);
-               }
-             before_item = item;
-          }
-        if (i == first_index)
-          {
-             first_item = button;
-          }
-        else if (i == last_index)
-          {
-             last_item = button;
-          }
-        if(current_page > 0 && i == first_index-1)
-          {
-             is_prev_page = EINA_TRUE;
-          }
-        else if (last_index < (rsd->item_count - 1) && i == last_index + 1)
-          {
-             is_next_page = EINA_TRUE;
-          }
-        elm_atspi_accessible_name_cb_set(button, _accessibility_item_name_set_cb, (Eext_Rotary_Selector_Item*)item);
-        elm_atspi_accessible_reading_info_type_set(button, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME);
-        i++;
-     }
-
-   if(rsd->backup_first_item_for_atspi)
-   {
-        elm_atspi_accessible_relationship_remove(rsd->event_area_access_object, ELM_ATSPI_RELATION_FLOWS_TO, rsd->backup_first_item_for_atspi);
-        elm_atspi_accessible_relationship_remove(rsd->backup_first_item_for_atspi, ELM_ATSPI_RELATION_FLOWS_FROM, rsd->event_area_access_object);
-   }
-   if(rsd->backup_last_item_for_atspi)
-   {
-        elm_atspi_accessible_relationship_remove(rsd->event_area_access_object, ELM_ATSPI_RELATION_FLOWS_FROM, rsd->backup_last_item_for_atspi);
-        elm_atspi_accessible_relationship_remove(rsd->backup_last_item_for_atspi, ELM_ATSPI_RELATION_FLOWS_TO, rsd->event_area_access_object);
-   }
-
-   if(first_item)
-     {
-          elm_atspi_accessible_relationship_append(rsd->event_area_access_object, ELM_ATSPI_RELATION_FLOWS_TO, first_item);
-          elm_atspi_accessible_relationship_append(first_item, ELM_ATSPI_RELATION_FLOWS_FROM, rsd->event_area_access_object);
-          if(!is_prev_page)
-            {
-               elm_atspi_accessible_relationship_remove(first_item, ELM_ATSPI_RELATION_FLOWS_FROM, rsd->event_area_access_object);
-               elm_atspi_accessible_relationship_append(first_item, ELM_ATSPI_RELATION_FLOWS_FROM, first_item);
-            }
-     }
-   if(last_item)
-     {
-          elm_atspi_accessible_relationship_append(rsd->event_area_access_object, ELM_ATSPI_RELATION_FLOWS_FROM, last_item);
-          elm_atspi_accessible_relationship_append(last_item, ELM_ATSPI_RELATION_FLOWS_TO, rsd->event_area_access_object);
-          if(!is_next_page)
-            {
-               elm_atspi_accessible_relationship_remove(last_item, ELM_ATSPI_RELATION_FLOWS_TO, rsd->event_area_access_object);
-               elm_atspi_accessible_relationship_append(last_item, ELM_ATSPI_RELATION_FLOWS_TO, last_item);
-            }
-     }
-     rsd->backup_first_item_for_atspi = first_item;
-     rsd->backup_last_item_for_atspi = last_item;
-}
-
-static void
-_rotary_selector_moreoption_opened_cb(void *data, Evas_Object *obj, void *event_info)
-{
-   if(!elm_atspi_bridge_utils_is_screen_reader_enabled())
-      return ;
-
-   Eext_Rotary_Selector_Data *rsd = NULL;
-   Eina_List *l = NULL;
-   Eext_Rotary_Selector_Item *item = NULL;
-   rsd = data;
-   if (!rsd)
-     {
-        ERR("rsd is NULL!!");
-        return;
-     }
-   elm_atspi_accessible_can_highlight_set(rsd->event_area_access_object, EINA_TRUE);
-
-   EINA_LIST_FOREACH(rsd->item_list, l, item)
-     {
-        Evas_Object *button = item->base.obj;
-        elm_atspi_accessible_can_highlight_set(button, EINA_TRUE);
-     }
-
-   rsd->reading_page_number = -1;
-   elm_atspi_accessible_name_cb_set(rsd->event_area_access_object, _accessibility_name_set_cb, (Eext_Rotary_Selector_Data*)rsd);
-   elm_atspi_accessible_description_cb_set(rsd->event_area_access_object, _accessibility_description_set_cb, (Eext_Rotary_Selector_Data*)rsd);
-   elm_atspi_accessible_reading_info_type_set(rsd->event_area_access_object, ELM_ACCESSIBLE_READING_INFO_TYPE_NAME | ELM_ACCESSIBLE_READING_INFO_TYPE_DESCRIPTION);
-
-   elm_atspi_component_highlight_grab(rsd->event_area_access_object);
-}
-
-
-static void
-_rotary_selector_moreoption_closed_cb(void *data, Evas_Object *obj, void *event_info)
-{
-   if(!elm_atspi_bridge_utils_is_screen_reader_enabled())
-      return ;
-
-   Eext_Rotary_Selector_Data *rsd = NULL;
-   Eina_List *l = NULL;
-   Eext_Rotary_Selector_Item *item = NULL;
-   rsd = data;
-   if (!rsd)
-     {
-        ERR("rsd is NULL!!");
-        return;
-     }
-
-   elm_atspi_accessible_can_highlight_set(rsd->event_area_access_object, EINA_FALSE);
-
-   EINA_LIST_FOREACH(rsd->item_list, l, item)
-     {
-        Evas_Object *button = item->base.obj;
-        elm_atspi_accessible_can_highlight_set(button, EINA_FALSE);
-     }
-}
-void
-_rotary_selector_from_moreoption_set(Evas_Object *rotary_selector, Eina_Bool from_more_option)
-{
-   Eext_Rotary_Selector_Data *rsd = _eext_rotary_selector_data_get(rotary_selector);
-
-   if(rsd)
-      rsd->from_moreoption = from_more_option;
-}
-
-static Eina_Bool _rotary_selector_from_moreoption_get(Evas_Object *rotary_selector)
-{
-   Eext_Rotary_Selector_Data *rsd = _eext_rotary_selector_data_get(rotary_selector);
-
-   if(rsd)
-      return rsd->from_moreoption;
-   return EINA_FALSE;
-}
-
-static char *
-_accessibility_item_name_set_cb(void *data, Evas_Object *obj)
-{
-   Eext_Rotary_Selector_Item *item = (Eext_Rotary_Selector_Item*)data;
-
-   char buf[255] = "";
-   if(item->text1)
-     {
-        strcat(buf, item->text1);
-     }
-   if(item->text2)
-     {
-        strcat(buf, " ");
-        strcat(buf, item->text2);
-     }
-   return strdup(buf);
-}
-
-static char *
-_accessibility_name_set_cb(void *data, Evas_Object *obj)
-{
-   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
-   char buf[255] = "";
-
-   if( _rotary_selector_from_moreoption_get(rsd->rotary_selector))
-     {
-        snprintf(buf, sizeof(buf), _("WDS_TTS_TBOPT_MORE_OPTIONS"));
-     }
-   return strdup(buf);
-}
-
-static char *
-_accessibility_description_set_cb(void *data, Evas_Object *obj)
-{
-   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
-   char buf[255] = "";
-
-   bindtextdomain (PACKAGE, LOCALE_DIR);
-   textdomain (PACKAGE);
-
-   if( rsd->reading_page_number == -1)
-     {
-        snprintf(buf, sizeof(buf), _("WDS_TTS_TBBODY_ROTATE_BEZEL_TO_NAVIGATE_ITEMS"));
-     }
-   else
-     {
-        snprintf(buf, sizeof(buf), _("WDS_TTS_TBOPT_N_OF_N_PAGE"), rsd->reading_page_number + 1, ((rsd->item_count - 1) / _ROTARY_SELECTOR_PAGE_ITEM_MAX) + 1);
-     }
-
-   return strdup(buf);
-}
-
-static void
-_accessibility_item_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
-{
-   INF("called!!");
-
-   Eext_Rotary_Selector_Data *rsd = (Eext_Rotary_Selector_Data *)data;
-   if (rsd)
-     {
-        evas_object_smart_callback_call(rsd->rotary_selector, "item,clicked", (void*)_item_get(rsd, rsd->selected_index));
-     }
-}
diff --git a/wearable/src/lib/efl_extension.c b/wearable/src/lib/efl_extension.c
deleted file mode 100644 (file)
index 2bfc0a3..0000000
+++ /dev/null
@@ -1,109 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "efl_extension.h"
-#include "efl_extension_private.h"
-
-/*===========================================================================*
- *                                 Local                                     *
- *===========================================================================*/
-
-int _eext_log_dom = -1;
-
-static const char *
-_magic_string_get(eext_magic m)
-{
-       switch (m) {
-       case EEXT_MAGIC_NONE:
-               return "None (Freed Object)";
-
-       default:
-               return "<UNKNOWN>";
-     }
-}
-
-__CONSTRUCTOR__ static void
-eext_mod_init(void)
-{
-   eina_init();
-   _eext_log_dom = eina_log_domain_register("efl-extension", EINA_COLOR_LIGHTBLUE);
-   if (!_eext_log_dom)
-     {
-        EINA_LOG_ERR("could not register efl-extension log domain.");
-        _eext_log_dom = EINA_LOG_DOMAIN_GLOBAL;
-     }
-   INF("Init");
-}
-
-__DESTRUCTOR__ static void
-eext_mod_shutdown(void)
-{
-   INF("Shutdown\n");
-   if ((_eext_log_dom > -1) && (_eext_log_dom != EINA_LOG_DOMAIN_GLOBAL))
-     {
-        eina_log_domain_unregister(_eext_log_dom);
-        _eext_log_dom = -1;
-     }
-
-   eina_shutdown();
-}
-
-
-/*===========================================================================*
- *                                Global                                     *
- *===========================================================================*/
-
-void
-_eext_magic_fail(const void *d, eext_magic m, eext_magic req_m, const char *fname)
-{
-       ERR("\n*** MAGIC FAIL (%s) ***\n", fname);
-
-       if (!d)
-               ERR("  Input handle pointer is NULL!");
-       else if (m == EEXT_MAGIC_NONE)
-               ERR("  Input handle has already been freed!");
-       else if (m != req_m)
-               ERR("  Input handle is wrong type\n"
-                   "    Expected: %08x - %s\n"
-                   "    Supplied: %08x - %s",
-                   (unsigned int)req_m, _magic_string_get(req_m),
-                   (unsigned int)m, _magic_string_get(m));
-
-   if (getenv("EEXT_ERROR_ABORT")) abort();
-}
-
-/*===========================================================================*
- *                                  API                                      *
- *===========================================================================*/
-
-EAPI Eina_Bool
-eext_win_keygrab_set(Elm_Win *obj, const char *key)
-{
-       Eina_Bool ret = EINA_FALSE;
-       ret = elm_win_keygrab_set(obj, key, 0, 0, 0, ELM_WIN_KEYGRAB_TOPMOST);
-       if (!ret)
-               ERR("  Can't set keygrab of [%s].", key);
-       return ret;
-}
-EAPI Eina_Bool
-eext_win_keygrab_unset(Elm_Win *obj, const char *key)
-{
-       Eina_Bool ret = EINA_FALSE;
-       ret = elm_win_keygrab_unset(obj, key, 0, 0);
-       if (!ret)
-               ERR("  Can't unset keygrab of [%s].", key);
-       return ret;
-}
diff --git a/wearable/src/lib/efl_extension_events.c b/wearable/src/lib/efl_extension_events.c
deleted file mode 100644 (file)
index 132ee3a..0000000
+++ /dev/null
@@ -1,442 +0,0 @@
-/*
- * Copyright (c) 2013 Samsung Electronics Co., Ltd. All rights reserved.
- *
- * Licensed under the Flora License, Version 1.1 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://floralicense.org/license/
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#include "efl_extension.h"
-#include "efl_extension_private.h"
-
-typedef struct _Eext_Event_Mgr Eext_Event_Mgr;
-
-struct _Eext_Event_Mgr
-{
-   Eina_List *obj_events;
-   Evas *e;
-   Evas_Object *key_grab_rect;
-};
-
-typedef struct _Eext_Object_Event
-{
-   Evas_Object *obj;
-   Evas_Object *parent;
-   Eina_List *callbacks;
-   Eina_Bool delete_me : 1;
-   Eina_Bool on_callback : 1;
-} Eext_Object_Event;
-
-typedef struct _Eext_Event_Callback
-{
-   Eext_Callback_Type type;
-   void (*func)(void *data, Evas_Object *obj, void *event_info);
-   void *data;
-} Eext_Event_Callback;
-
-const char *EEXT_OBJ_KEY_EVENT_MGR = "_eext_obj_key_event_mgr";
-const char *EEXT_OBJ_KEY_OBJ_EVENT = "_eext_obj_key_obj_event";
-const char *EEXT_KEY_STOP = "XF86Stop";
-const char *EEXT_KEY_STOP2 = "Escape";
-const char *EEXT_KEY_STOP3 = "XF86Back";
-const char *EEXT_KEY_SEND = "XF86Send";
-const char *EEXT_KEY_SEND2 = "Menu";
-const char *EEXT_KEY_SEND3 = "XF86Menu";
-
-
-static Eina_List *event_mgrs = NULL;
-
-static void
-_eext_event_mgr_del(Eext_Event_Mgr *event_mgr)
-{
-   if (event_mgr->obj_events) return;
-
-   //Redundant Event Mgr. Remove it.
-   evas_object_del(event_mgr->key_grab_rect);
-   event_mgrs = eina_list_remove(event_mgrs, event_mgr);
-   free(event_mgr);
-}
-
-static void
-_eext_object_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
-{
-   Eext_Event_Mgr *event_mgr = evas_object_data_get(obj, EEXT_OBJ_KEY_EVENT_MGR);
-   Eext_Object_Event *obj_event = data;
-   Eina_List *l;
-   Eext_Event_Callback *callback;
-
-   l = eina_list_data_find_list(event_mgr->obj_events, obj_event);
-   if (!l) return;
-
-   event_mgr->obj_events = eina_list_remove_list(event_mgr->obj_events, l);
-
-   EINA_LIST_FREE(obj_event->callbacks, callback) free(callback);
-   obj_event->callbacks = NULL;
-
-   if (obj_event->on_callback) obj_event->delete_me = EINA_TRUE;
-   else free(obj_event);
-
-   _eext_event_mgr_del(event_mgr);
-}
-
-static int
-_eext_layer_sort_cb(const void *data1, const void *data2)
-{
-   const Eext_Object_Event *obj_event = data1;
-   const Eext_Object_Event *obj_event2 = data2;
-
-   //1. Layer Compare
-   int layer1 = evas_object_layer_get(obj_event->obj);
-   int layer2 = evas_object_layer_get(obj_event2->obj);
-
-   return (layer1 < layer2) ? -1 : 1;
-}
-
-static Evas_Object *
-_eext_top_parent_candidates(Eina_List **candidates, Evas *e)
-{
-   Evas_Object *temp;
-   Evas_Object *parent;
-   Eina_List *l, *l_next;
-   Eext_Object_Event *obj_event;
-   Eina_List *_candidates = *candidates;
-   Eina_Bool found = EINA_FALSE;
-
-   //Get the top parent lists
-   EINA_LIST_FOREACH(_candidates, l, obj_event)
-     {
-        temp = obj_event->obj;
-        parent = obj_event->obj;
-        while (temp)
-          {
-             parent = temp;
-             temp = evas_object_smart_parent_get(temp);
-          }
-        obj_event->parent = parent;
-     }
-
-   //Leave only parent candidates.
-   parent = evas_object_top_get(e);
-
-   while (parent)
-     {
-        EINA_LIST_FOREACH(_candidates, l, obj_event)
-          {
-             if (parent == obj_event->parent)
-               {
-                  found = EINA_TRUE;
-                  obj_event->parent = NULL;
-               }
-          }
-        if (found) break;
-        parent = evas_object_below_get(parent);
-     }
-
-   //Redundant parents (no candidates)
-   EINA_LIST_FOREACH_SAFE(_candidates, l, l_next, obj_event)
-     {
-        if (!obj_event->parent) continue;
-        _candidates = eina_list_remove_list(_candidates, l);
-     }
-
-   *candidates = _candidates;
-   return parent;
-}
-
-static Eext_Object_Event *
-_eext_find_event_target(Eina_List *candidates, Evas_Object *parent)
-{
-   Eext_Object_Event *obj_event = NULL;
-   Eina_List *l;
-   Evas_Object *obj;
-   Eina_List *members = evas_object_smart_members_get(parent);
-   if (members)
-     {
-        EINA_LIST_REVERSE_FOREACH(members, l, obj)
-          {
-             obj_event = _eext_find_event_target(candidates, obj);
-             //got you!
-             if (obj_event)
-               {
-                  eina_list_free(members);
-                  return obj_event;
-               }
-          }
-        eina_list_free(members);
-     }
-
-   EINA_LIST_REVERSE_FOREACH(candidates, l, obj_event)
-     {
-        //got you!
-        if (parent == obj_event->obj) return obj_event;
-     }
-
-   return NULL;
-}
-
-static Eext_Object_Event *
-_eext_top_obj_event_find(Eext_Event_Mgr *event_mgr)
-{
-   Eext_Object_Event *obj_event = NULL;
-   Eina_List *l, *l_next;
-   Eina_List *candidates = NULL;
-   Evas_Object *parent;
-   int top_layer;
-   Eina_Bool invisible;
-
-   //1. filter the invisible objs
-   EINA_LIST_FOREACH(event_mgr->obj_events, l, obj_event)
-     {
-        parent = obj_event->obj;
-        invisible = EINA_FALSE;
-
-        while (parent)
-          {
-             if (!evas_object_visible_get(parent))
-               {
-                  invisible = EINA_TRUE;
-                  break;
-               }
-             parent = evas_object_smart_parent_get(parent);
-          }
-        if (invisible) continue;
-        candidates = eina_list_append(candidates, obj_event);
-     }
-   if (!candidates) return NULL;   //no visible objects.
-   if (eina_list_count(candidates) == 1) goto found;
-
-   //2.1. sort by layer order
-   candidates = eina_list_sort(candidates, eina_list_count(candidates),
-                               _eext_layer_sort_cb);
-
-   //2.2. leave the only top layer
-   obj_event = eina_list_data_get(eina_list_last(candidates));
-   top_layer = evas_object_layer_get(obj_event->obj);
-
-   EINA_LIST_FOREACH_SAFE(candidates, l, l_next, obj_event)
-     {
-        if (evas_object_layer_get(obj_event->obj) < top_layer)
-          candidates = eina_list_remove_list(candidates, l);
-     }
-   if (eina_list_count(candidates) == 1) goto found;
-
-   //3. find the top parent candidate.
-   parent = _eext_top_parent_candidates(&candidates, event_mgr->e);
-   if (eina_list_count(candidates) == 1) goto found;
-
-   //4. find the target in this parent tree.
-   obj_event = _eext_find_event_target(candidates, parent);
-   eina_list_free(candidates);
-   return obj_event;
-
-found:
-   obj_event = eina_list_data_get(candidates);
-   eina_list_free(candidates);
-   return obj_event;
-}
-
-static void
-_eext_key_grab_rect_key_up_cb(void *data, Evas *e, Evas_Object *obj,
-                            void *event_info)
-{
-   Evas_Event_Key_Down *ev = event_info;
-   Eext_Event_Mgr *event_mgr = data;
-   Eext_Object_Event *obj_event;
-   Eext_Event_Callback *callback;
-   Eext_Callback_Type type;
-   Eina_List *l;
-
-   obj_event = _eext_top_obj_event_find(event_mgr);
-   if (!obj_event) return;
-
-   if (!strcmp(ev->keyname, EEXT_KEY_STOP) ||
-       !strcmp(ev->keyname, EEXT_KEY_STOP2) ||
-       !strcmp(ev->keyname, EEXT_KEY_STOP3))
-     type = EEXT_CALLBACK_BACK;
-   else if (!strcmp(ev->keyname, EEXT_KEY_SEND) ||
-            !strcmp(ev->keyname, EEXT_KEY_SEND2) ||
-            !strcmp(ev->keyname, EEXT_KEY_SEND3))
-     type = EEXT_CALLBACK_MORE;
-   else return;
-
-   obj_event->on_callback = EINA_TRUE;
-   EINA_LIST_FOREACH(obj_event->callbacks, l, callback)
-     {
-        if (callback->type != type) continue;
-        callback->func(callback->data, obj_event->obj, (void*) type);
-        if (obj_event->delete_me) break;
-     }
-   if (obj_event->delete_me) free(obj_event);
-   else obj_event->on_callback = EINA_FALSE;
-}
-
-static void
-_eext_key_grab_obj_create(Eext_Event_Mgr *event_mgr)
-{
-   Evas_Object *key_grab_rect = evas_object_rectangle_add(event_mgr->e);
-
-   evas_object_event_callback_add(key_grab_rect, EVAS_CALLBACK_KEY_UP,
-                                  _eext_key_grab_rect_key_up_cb, event_mgr);
-   if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_STOP, 0, 0, EINA_FALSE))
-     ERR("Failed to grab END KEY\n");
-
-   if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_STOP2, 0, 0, EINA_FALSE))
-     ERR("Failed to grab END KEY\n");
-
-   if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_STOP3, 0, 0, EINA_FALSE))
-     ERR("Failed to grab END KEY\n");
-
-   if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_SEND, 0, 0, EINA_FALSE))
-     ERR("Failed to grab MORE KEY\n");
-
-   if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_SEND2, 0, 0, EINA_FALSE))
-     ERR("Failed to grab MORE KEY\n");
-
-   if (!evas_object_key_grab(key_grab_rect, EEXT_KEY_SEND3, 0, 0, EINA_FALSE))
-     ERR("Failed to grab MORE KEY\n");
-
-   event_mgr->key_grab_rect = key_grab_rect;
-}
-
-static Eext_Event_Mgr *
-_eext_event_mgr_new(Evas *e)
-{
-   Eext_Event_Mgr *event_mgr = calloc(1, sizeof(Eext_Event_Mgr));
-   if (!event_mgr)
-     {
-        ERR("Failed to allocate event manager");
-        return NULL;
-     }
-   event_mgr->e = e;
-   _eext_key_grab_obj_create(event_mgr);
-
-   return event_mgr;
-}
-
-EAPI void *
-eext_object_event_callback_del(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func)
-{
-   Eext_Object_Event *obj_event;
-   Eext_Event_Mgr *event_mgr;
-   Eina_List *l;
-   Eext_Event_Callback *callback;
-   void *data;
-
-   //Check the validation
-   event_mgr = evas_object_data_get(obj, EEXT_OBJ_KEY_EVENT_MGR);
-   obj_event = evas_object_data_get(obj, EEXT_OBJ_KEY_OBJ_EVENT);
-
-   if (!event_mgr || !obj_event)
-     {
-        WRN("This object(%p) hasn't been registered before", obj);
-        return NULL;
-     }
-
-   //Remove the callback data
-   EINA_LIST_REVERSE_FOREACH(obj_event->callbacks, l, callback)
-     {
-        if ((callback->func == func) && (callback->type == type)) break;
-     }
-
-   if (!callback)
-     {
-        WRN("This object(%p) hasn't been registered before with the given type(%d) and func(%p)", obj, type, func);
-        return NULL;
-     }
-
-   data = callback->data;
-   obj_event->callbacks = eina_list_remove_list(obj_event->callbacks, l);
-   free(callback);
-
-   //This object is not managed anymore.
-   if (!obj_event->callbacks)
-     {
-        evas_object_data_set(obj, EEXT_OBJ_KEY_OBJ_EVENT, NULL);
-        evas_object_data_set(obj, EEXT_OBJ_KEY_EVENT_MGR, NULL);
-        Eina_List *l = eina_list_data_find_list(event_mgr->obj_events,
-                                                obj_event);
-        if (l)
-          event_mgr->obj_events = eina_list_remove_list(event_mgr->obj_events,
-                                                        l);
-        if (obj_event->on_callback) obj_event->delete_me = EINA_TRUE;
-        else free(obj_event);
-
-        evas_object_event_callback_del(obj, EVAS_CALLBACK_DEL, _eext_object_del_cb);
-     }
-
-   _eext_event_mgr_del(event_mgr);
-
-   return data;
-}
-
-EAPI void
-eext_object_event_callback_add(Evas_Object *obj, Eext_Callback_Type type, Eext_Event_Cb func, void *data)
-{
-   Eext_Event_Mgr *event_mgr;
-   Evas *e;
-   Eext_Object_Event *obj_event = NULL;
-   Eina_List *l;
-   Eext_Event_Callback *callback;
-   Eina_Bool new_event_mgr = EINA_TRUE;
-
-   //Check the registered event manager for this Evas.
-   e = evas_object_evas_get(obj);
-
-   EINA_LIST_FOREACH(event_mgrs, l, event_mgr)
-     {
-        if (event_mgr->e == e)
-          {
-             new_event_mgr = EINA_FALSE;
-             break;
-          }
-     }
-
-   //New Evas comes. Create new event manager for this Evas.
-   if (new_event_mgr)
-     {
-        if (!(event_mgr = _eext_event_mgr_new(e))) return;
-        event_mgrs = eina_list_append(event_mgrs, event_mgr);
-     }
-
-   obj_event = evas_object_data_get(obj, EEXT_OBJ_KEY_OBJ_EVENT);
-
-   //New Object Event. Probably user adds eext_object_event_callback first time.
-   if (!obj_event)
-     {
-        obj_event = calloc(1, sizeof(Eext_Object_Event));
-        if (!obj_event)
-          {
-             ERR("Failed to allocate object event");
-             return;
-          }
-        evas_object_data_set(obj, EEXT_OBJ_KEY_OBJ_EVENT, obj_event);
-        evas_object_data_set(obj, EEXT_OBJ_KEY_EVENT_MGR, event_mgr);
-        evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
-                                       _eext_object_del_cb,
-                                       obj_event);
-        event_mgr->obj_events = eina_list_append(event_mgr->obj_events,
-                                                 obj_event);
-        obj_event->obj = obj;
-     }
-
-   //Append this callback.
-   callback = calloc(1, sizeof(Eext_Event_Callback));
-   if (!callback)
-     {
-        ERR("Failed to allocate event callback");
-        return;
-     }
-   callback->type = type;
-   callback->func = func;
-   callback->data = data;
-
-   obj_event->callbacks = eina_list_append(obj_event->callbacks, callback);
-}