X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Flib%2Felm_check.c;h=efa3ccc9733badf6e7d648a1e2a701f18e58b076;hb=10eabc5bb15be740caa5821f9ee9f38f4dfbb22c;hp=91d7bc160def29bda9220f3c26f323c85ddf9202;hpb=327f42120d173f1acb8b095297a21f004fbe6172;p=framework%2Fuifw%2Felementary.git diff --git a/src/lib/elm_check.c b/src/lib/elm_check.c index 91d7bc1..efa3ccc 100644 --- a/src/lib/elm_check.c +++ b/src/lib/elm_check.c @@ -9,25 +9,33 @@ struct _Widget_Data Eina_Bool state; Eina_Bool *statep; const char *label; + const char *ontext, *offtext; }; static const char *widtype = NULL; +static Eina_Bool _event_hook(Evas_Object *obj, Evas_Object *src, + Evas_Callback_Type type, void *event_info); static void _del_hook(Evas_Object *obj); static void _mirrored_set(Evas_Object *obj, Eina_Bool rtl); static void _theme_hook(Evas_Object *obj); static void _disable_hook(Evas_Object *obj); static void _sizing_eval(Evas_Object *obj); -static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, void *event_info); +static void _changed_size_hints(void *data, Evas *e, Evas_Object *obj, + void *event_info); static void _sub_del(void *data, Evas_Object *obj, void *event_info); -static void _signal_check_off(void *data, Evas_Object *obj, const char *emission, const char *source); -static void _signal_check_on(void *data, Evas_Object *obj, const char *emission, const char *source); -static void _signal_check_toggle(void *data, Evas_Object *obj, const char *emission, const char *source); +static void _signal_check_off(void *data, Evas_Object *obj, + const char *emission, const char *source); +static void _signal_check_on(void *data, Evas_Object *obj, + const char *emission, const char *source); +static void _signal_check_toggle(void *data, Evas_Object *obj, + const char *emission, const char *source); static void _on_focus_hook(void *data, Evas_Object *obj); static void _activate_hook(Evas_Object *obj); +static void _content_set_hook(Evas_Object *obj, const char *part, + Evas_Object *content); +static Evas_Object *_content_get_hook(const Evas_Object *obj, const char *part); +static Evas_Object *_content_unset_hook(Evas_Object *obj, const char *part); static void _activate(Evas_Object *obj); -static Eina_Bool _event_hook(Evas_Object *obj, Evas_Object *src, - Evas_Callback_Type type, void *event_info); - static const char SIG_CHANGED[] = "changed"; static const Evas_Smart_Cb_Description _signals[] = { {SIG_CHANGED, ""}, @@ -35,7 +43,8 @@ static const Evas_Smart_Cb_Description _signals[] = { }; static Eina_Bool -_event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type type, void *event_info) +_event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, + Evas_Callback_Type type, void *event_info) { if (type != EVAS_CALLBACK_KEY_DOWN) return EINA_FALSE; Evas_Event_Key_Down *ev = event_info; @@ -50,13 +59,14 @@ _event_hook(Evas_Object *obj, Evas_Object *src __UNUSED__, Evas_Callback_Type ty return EINA_TRUE; } - static void _del_hook(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return; if (wd->label) eina_stringshare_del(wd->label); + if (wd->ontext) eina_stringshare_del(wd->ontext); + if (wd->offtext) eina_stringshare_del(wd->offtext); free(wd); } @@ -91,13 +101,12 @@ _theme_hook(Evas_Object *obj) unsigned int counter = 0; unsigned int i = 1; unsigned int length = 0; - char *str = NULL; + const char *str = NULL; char labels[128] ; char buffer[PATH_MAX]={'\0',}; char s1[PATH_MAX] = {'\0',}; Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return; - _elm_widget_mirrored_reload(obj); _mirrored_set(obj, elm_widget_mirrored_get(obj)); _elm_theme_object_set(obj, wd->chk, "check", "base", elm_widget_style_get(obj)); @@ -113,12 +122,13 @@ _theme_hook(Evas_Object *obj) edje_object_signal_emit(wd->chk, "elm,state,text,visible", "elm"); else edje_object_signal_emit(wd->chk, "elm,state,text,hidden", "elm"); - edje_object_part_text_set(wd->chk, "elm.text", wd->label); + edje_object_part_text_escaped_set(wd->chk, "elm.text", wd->label); + edje_object_part_text_escaped_set(wd->chk, "elm.ontext", wd->ontext); + edje_object_part_text_escaped_set(wd->chk, "elm.offtext", wd->offtext); if (elm_widget_disabled_get(obj)) edje_object_signal_emit(wd->chk, "elm,state,disabled", "elm"); edje_object_message_signal_process(wd->chk); edje_object_scale_set(wd->chk, elm_widget_scale_get(obj) * _elm_config->scale); - //introduced internationalization of additional text parts used in style while (1) { @@ -169,8 +179,6 @@ _changed_size_hints(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *even Widget_Data *wd = elm_widget_data_get(data); if (!wd) return; if (obj != wd->icon) return; - Evas_Coord mw, mh; - evas_object_size_hint_min_get(obj, &mw, &mh); _sizing_eval(data); } @@ -226,17 +234,121 @@ _activate_hook(Evas_Object *obj) } static void +_signal_emit_hook(Evas_Object *obj, const char *emission, const char *source) +{ + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + + edje_object_signal_emit(wd->chk, emission, source); +} + +static void +_signal_callback_add_hook(Evas_Object *obj, const char *emission, const char *source, Edje_Signal_Cb func_cb, void *data) +{ + Widget_Data *wd = elm_widget_data_get(obj); + if (!wd) return; + edje_object_signal_callback_add(wd->chk, emission, source, func_cb, data); +} + +static void +_signal_callback_del_hook(Evas_Object *obj, const char *emission, const char *source, Edje_Signal_Cb func_cb, void *data) +{ + Widget_Data *wd = elm_widget_data_get(obj); + edje_object_signal_callback_del_full(wd->chk, emission, source, func_cb, + data); +} + +static void +_content_set_hook(Evas_Object *obj, const char *part, Evas_Object *content) +{ + ELM_CHECK_WIDTYPE(obj, widtype); + Widget_Data *wd; + + if (part && strcmp(part, "icon")) return; + wd = elm_widget_data_get(obj); + if (!wd) return; + if (wd->icon == content) return; + if (wd->icon) evas_object_del(wd->icon); + wd->icon = content; + if (content) + { + elm_widget_sub_object_add(obj, content); + evas_object_event_callback_add(content, + EVAS_CALLBACK_CHANGED_SIZE_HINTS, + _changed_size_hints, obj); + edje_object_part_swallow(wd->chk, "elm.swallow.content", content); + edje_object_signal_emit(wd->chk, "elm,state,icon,visible", "elm"); + edje_object_message_signal_process(wd->chk); + } + _sizing_eval(obj); +} + +static Evas_Object * +_content_get_hook(const Evas_Object *obj, const char *part) +{ + ELM_CHECK_WIDTYPE(obj, widtype) NULL; + Widget_Data *wd; + + if (part && strcmp(part, "icon")) return NULL; + wd = elm_widget_data_get(obj); + if (!wd) return NULL; + return wd->icon; +} + +static Evas_Object * +_content_unset_hook(Evas_Object *obj, const char *part) +{ + ELM_CHECK_WIDTYPE(obj, widtype) NULL; + Widget_Data *wd; + + if (part && strcmp(part, "icon")) return NULL; + wd = elm_widget_data_get(obj); + if (!wd) return NULL; + if (!wd->icon) return NULL; + Evas_Object *icon = wd->icon; + elm_widget_sub_object_del(obj, wd->icon); + edje_object_part_unswallow(wd->chk, icon); + return icon; +} + +static void _activate(Evas_Object *obj) { Widget_Data *wd = elm_widget_data_get(obj); if (!wd) return; - wd->state = !wd->state; - if (wd->statep) *wd->statep = wd->state; - if (wd->state) - edje_object_signal_emit(wd->chk, "elm,state,check,on", "elm"); - else - edje_object_signal_emit(wd->chk, "elm,state,check,off", "elm"); - evas_object_smart_callback_call(obj, SIG_CHANGED, NULL); + if ((_elm_config->access_mode == ELM_ACCESS_MODE_OFF) || + (_elm_access_2nd_click_timeout(obj))) + { + wd->state = !wd->state; + if (wd->statep) *wd->statep = wd->state; + if (wd->state) + { + edje_object_signal_emit(wd->chk, "elm,state,check,on", "elm"); + if (_elm_config->access_mode != ELM_ACCESS_MODE_OFF) + { + if (!wd->ontext) + { + _elm_access_say(E_("State: On")); + } + else + _elm_access_say(E_("State: On")); + } + } + else + { + edje_object_signal_emit(wd->chk, "elm,state,check,off", "elm"); + if (_elm_config->access_mode != ELM_ACCESS_MODE_OFF) + { + if (!wd->offtext) + { + _elm_access_say(E_("State: Off")); + } + else + _elm_access_say(E_("State: Off")); + } + } + evas_object_smart_callback_call(obj, SIG_CHANGED, NULL); + } } static void @@ -244,15 +356,27 @@ _elm_check_label_set(Evas_Object *obj, const char *item, const char *label) { ELM_CHECK_WIDTYPE(obj, widtype); Widget_Data *wd = elm_widget_data_get(obj); - if (item && strcmp(item, "default")) return; if (!wd) return; - eina_stringshare_replace(&wd->label, label); - if (label) - edje_object_signal_emit(wd->chk, "elm,state,text,visible", "elm"); - else - edje_object_signal_emit(wd->chk, "elm,state,text,hidden", "elm"); - edje_object_message_signal_process(wd->chk); - edje_object_part_text_set(wd->chk, "elm.text", label); + if ((!item) || (!strcmp(item, "default"))) + { + eina_stringshare_replace(&wd->label, label); + if (label) + edje_object_signal_emit(wd->chk, "elm,state,text,visible", "elm"); + else + edje_object_signal_emit(wd->chk, "elm,state,text,hidden", "elm"); + edje_object_message_signal_process(wd->chk); + edje_object_part_text_escaped_set(wd->chk, "elm.text", label); + } + else if ((item) && (!strcmp(item, "on"))) + { + eina_stringshare_replace(&wd->ontext, label); + edje_object_part_text_escaped_set(wd->chk, "elm.ontext", wd->ontext); + } + else if ((item) && (!strcmp(item, "off"))) + { + eina_stringshare_replace(&wd->offtext, label); + edje_object_part_text_escaped_set(wd->chk, "elm.offtext", wd->offtext); + } _sizing_eval(obj); } @@ -261,9 +385,53 @@ _elm_check_label_get(const Evas_Object *obj, const char *item) { ELM_CHECK_WIDTYPE(obj, widtype) NULL; Widget_Data *wd = elm_widget_data_get(obj); - if (item && strcmp(item, "default")) return NULL; if (!wd) return NULL; - return wd->label; + if ((!item) || (!strcmp(item, "default"))) + return wd->label; + else if ((item) && (!strcmp(item, "on"))) + return wd->ontext; + else if ((item) && (!strcmp(item, "off"))) + return wd->offtext; + return NULL; +} + +static char * +_access_info_cb(void *data __UNUSED__, Evas_Object *obj, Elm_Widget_Item *item __UNUSED__) +{ + const char *txt = elm_widget_access_info_get(obj); + if (!txt) txt = _elm_check_label_get(obj, NULL); + if (txt) return strdup(txt); + return NULL; +} + +static char * +_access_state_cb(void *data, Evas_Object *obj, Elm_Widget_Item *item __UNUSED__) +{ + Evas_Object *o = data; + Widget_Data *wd = elm_widget_data_get(o); + if (!wd) return NULL; + if (elm_widget_disabled_get(obj)) + return strdup(E_("State: Disabled")); + if (wd->state) + { + if (wd->ontext) + { + char buf[1024]; + + snprintf(buf, sizeof(buf), "%s: %s", E_("State"), wd->ontext); + return strdup(buf); + } + else + return strdup(E_("State: On")); + } + if (wd->offtext) + { + char buf[1024]; + + snprintf(buf, sizeof(buf), "%s: %s", E_("State"), wd->offtext); + return strdup(buf); + } + return strdup(E_("State: Off")); } EAPI Evas_Object * @@ -286,8 +454,14 @@ elm_check_add(Evas_Object *parent) elm_widget_can_focus_set(obj, EINA_TRUE); elm_widget_activate_hook_set(obj, _activate_hook); elm_widget_event_hook_set(obj, _event_hook); + elm_widget_signal_emit_hook_set(obj, _signal_emit_hook); + elm_widget_signal_callback_add_hook_set(obj, _signal_callback_add_hook); + elm_widget_signal_callback_del_hook_set(obj, _signal_callback_del_hook); elm_widget_text_set_hook_set(obj, _elm_check_label_set); elm_widget_text_get_hook_set(obj, _elm_check_label_get); + elm_widget_content_set_hook_set(obj, _content_set_hook); + elm_widget_content_get_hook_set(obj, _content_get_hook); + elm_widget_content_unset_hook_set(obj, _content_unset_hook); wd->chk = edje_object_add(e); _elm_theme_object_set(obj, wd->chk, "check", "base", "default"); @@ -307,63 +481,15 @@ elm_check_add(Evas_Object *parent) // TODO: convert Elementary to subclassing of Evas_Smart_Class // TODO: and save some bytes, making descriptions per-class and not instance! evas_object_smart_callbacks_descriptions_set(obj, _signals); - return obj; -} - -EAPI void -elm_check_label_set(Evas_Object *obj, const char *label) -{ - _elm_check_label_set(obj, NULL, label); -} -EAPI const char * -elm_check_label_get(const Evas_Object *obj) -{ - return _elm_check_label_get(obj, NULL); -} - -EAPI void -elm_check_icon_set(Evas_Object *obj, Evas_Object *icon) -{ - ELM_CHECK_WIDTYPE(obj, widtype); - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return; - if (wd->icon == icon) return; - if (wd->icon) evas_object_del(wd->icon); - wd->icon = icon; - if (icon) - { - elm_widget_sub_object_add(obj, icon); - evas_object_event_callback_add(icon, EVAS_CALLBACK_CHANGED_SIZE_HINTS, - _changed_size_hints, obj); - edje_object_part_swallow(wd->chk, "elm.swallow.content", icon); - edje_object_signal_emit(wd->chk, "elm,state,icon,visible", "elm"); - edje_object_message_signal_process(wd->chk); - } - _sizing_eval(obj); -} - -EAPI Evas_Object * -elm_check_icon_get(const Evas_Object *obj) -{ - ELM_CHECK_WIDTYPE(obj, widtype) NULL; - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return NULL; - return wd->icon; -} - -EAPI Evas_Object * -elm_check_icon_unset(Evas_Object *obj) -{ - ELM_CHECK_WIDTYPE(obj, widtype) NULL; - Widget_Data *wd = elm_widget_data_get(obj); - if (!wd) return NULL; - if (!wd->icon) return NULL; - Evas_Object *icon = wd->icon; - elm_widget_sub_object_del(obj, wd->icon); - edje_object_part_unswallow(wd->chk, wd->icon); - wd->icon = NULL; - return icon; + _elm_access_object_register(obj, wd->chk); + _elm_access_text_set(_elm_access_object_get(obj), + ELM_ACCESS_TYPE, E_("Check")); + _elm_access_callback_set(_elm_access_object_get(obj), + ELM_ACCESS_INFO, _access_info_cb, obj); + _elm_access_callback_set(_elm_access_object_get(obj), + ELM_ACCESS_STATE, _access_state_cb, obj); + return obj; } EAPI void @@ -381,6 +507,7 @@ elm_check_state_set(Evas_Object *obj, Eina_Bool state) else edje_object_signal_emit(wd->chk, "elm,state,check,off", "elm"); } + edje_object_message_signal_process(wd->chk); } EAPI Eina_Bool