diff options
Diffstat (limited to 'src/lib/elementary/efl_ui_text.c')
-rw-r--r-- | src/lib/elementary/efl_ui_text.c | 116 |
1 files changed, 30 insertions, 86 deletions
diff --git a/src/lib/elementary/efl_ui_text.c b/src/lib/elementary/efl_ui_text.c index ed4f5d1718..ae74e5c42a 100644 --- a/src/lib/elementary/efl_ui_text.c +++ b/src/lib/elementary/efl_ui_text.c @@ -63,7 +63,8 @@ struct _Efl_Ui_Text_Data Eina_List *sel; Eina_List *items; /** context menu item list */ Item_Obj *item_objs; - Eina_List *item_providers; + Efl_Canvas_Text_Factory *item_factory; + Efl_Canvas_Text_Factory *item_fallback_factory; Eina_List *markup_filters; Ecore_Job *hov_deljob; Mod_Api *api; // module api if supplied @@ -131,6 +132,7 @@ struct _Efl_Ui_Text_Data Eina_Bool scroll : 1; Eina_Bool input_panel_show_on_demand : 1; Eina_Bool anchors_updated : 1; + Eina_Bool fallback_item_provider_disabled : 1; }; struct _Anchor @@ -2485,43 +2487,22 @@ _entry_mouse_triple_signal_cb(void *data, static Evas_Object * _item_get(void *data, const char *item) { - Eina_List *l; - Evas_Object *o; - Elm_Entry_Item_Provider *ip; - const char *style = elm_widget_style_get(data); + Evas_Object *o = NULL; EFL_UI_TEXT_DATA_GET(data, sd); - EINA_LIST_FOREACH(sd->item_providers, l, ip) - { - o = ip->func(ip->data, data, item); - if (o) return o; - } - if (item && !strncmp(item, "file://", 7)) + if (item) { - const char *fname = item + 7; - - o = evas_object_image_filled_add(evas_object_evas_get(data)); - evas_object_image_file_set(o, fname, NULL); - if (evas_object_image_load_error_get(o) == EVAS_LOAD_ERROR_NONE) + if (sd->item_factory) { - evas_object_show(o); + o = efl_canvas_text_factory_create(sd->item_factory, data, item); } - else + else if (sd->item_fallback_factory) { - evas_object_del(o); - o = edje_object_add(evas_object_evas_get(data)); - elm_widget_theme_object_set - (data, o, "text/emoticon", "wtf", style); + o = efl_canvas_text_factory_create(sd->item_fallback_factory, + data, item); } - return o; } - - o = edje_object_add(evas_object_evas_get(data)); - if (!elm_widget_theme_object_set - (data, o, "text", item, style)) - elm_widget_theme_object_set - (data, o, "text/emoticon", "wtf", style); return o; } @@ -3215,6 +3196,7 @@ _efl_ui_text_efl_object_constructor(Eo *obj, Efl_Ui_Text_Data *sd) if (_elm_config->desktop_entry) sd->sel_handler_disabled = EINA_TRUE; + sd->item_fallback_factory = efl_add(EFL_UI_TEXT_FACTORY_FALLBACK_CLASS, obj); _create_text_cursors(obj, sd); return obj; @@ -3224,7 +3206,6 @@ EOLIAN static void _efl_ui_text_efl_object_destructor(Eo *obj, Efl_Ui_Text_Data *sd) { Elm_Entry_Context_Menu_Item *it; - Elm_Entry_Item_Provider *ip; Elm_Entry_Markup_Filter *tf; Eo *text_obj; @@ -3270,10 +3251,6 @@ _efl_ui_text_efl_object_destructor(Eo *obj, Efl_Ui_Text_Data *sd) eina_stringshare_del(it->icon_group); free(it); } - EINA_LIST_FREE(sd->item_providers, ip) - { - free(ip); - } EINA_LIST_FREE(sd->markup_filters, tf) { _filter_free(tf); @@ -3314,6 +3291,9 @@ _efl_ui_text_efl_object_destructor(Eo *obj, Efl_Ui_Text_Data *sd) ecore_job_del(sd->deferred_decoration_job); sd->deferred_decoration_job = NULL; + if (sd->item_factory) efl_unref(sd->item_factory); + if (sd->item_fallback_factory) efl_del(sd->item_fallback_factory); + efl_destructor(efl_super(obj, MY_CLASS)); } @@ -3539,55 +3519,6 @@ _efl_ui_text_context_menu_disabled_get(Eo *obj EINA_UNUSED, Efl_Ui_Text_Data *sd return !sd->context_menu; } -EOLIAN static void -_efl_ui_text_item_provider_append(Eo *obj EINA_UNUSED, Efl_Ui_Text_Data *sd, Elm_Entry_Item_Provider_Cb func, void *data) -{ - Elm_Entry_Item_Provider *ip; - - EINA_SAFETY_ON_NULL_RETURN(func); - - ip = calloc(1, sizeof(Elm_Entry_Item_Provider)); - if (!ip) return; - - ip->func = func; - ip->data = data; - sd->item_providers = eina_list_append(sd->item_providers, ip); -} - -EOLIAN static void -_efl_ui_text_item_provider_prepend(Eo *obj EINA_UNUSED, Efl_Ui_Text_Data *sd, Elm_Entry_Item_Provider_Cb func, void *data) -{ - Elm_Entry_Item_Provider *ip; - - EINA_SAFETY_ON_NULL_RETURN(func); - - ip = calloc(1, sizeof(Elm_Entry_Item_Provider)); - if (!ip) return; - - ip->func = func; - ip->data = data; - sd->item_providers = eina_list_prepend(sd->item_providers, ip); -} - -EOLIAN static void -_efl_ui_text_item_provider_remove(Eo *obj EINA_UNUSED, Efl_Ui_Text_Data *sd, Elm_Entry_Item_Provider_Cb func, void *data) -{ - Eina_List *l; - Elm_Entry_Item_Provider *ip; - - EINA_SAFETY_ON_NULL_RETURN(func); - - EINA_LIST_FOREACH(sd->item_providers, l, ip) - { - if ((ip->func == func) && ((!data) || (ip->data == data))) - { - sd->item_providers = eina_list_remove_list(sd->item_providers, l); - free(ip); - return; - } - } -} - EOLIAN static Eina_Bool _efl_ui_text_efl_file_file_set(Eo *obj, Efl_Ui_Text_Data *sd, const char *file, const char *group EINA_UNUSED) { @@ -4927,8 +4858,7 @@ _anchors_create(Eo *obj, Efl_Ui_Text_Data *sd) Eina_Bool is_anchor = EINA_FALSE; Eina_Bool is_item = EINA_FALSE; - if (efl_text_object_item_geometry_get(obj, anchor, - NULL, NULL, NULL, NULL)) + if (efl_text_annotation_is_item(obj, anchor)) { is_anchor = EINA_TRUE; is_item = EINA_TRUE; @@ -5052,7 +4982,7 @@ _anchors_update(Eo *o, Efl_Ui_Text_Data *sd) { rect->obj = ob; - efl_text_object_item_geometry_get(an->obj, + efl_text_item_geometry_get(an->obj, an->annotation, &cx, &cy, &cw, &ch); evas_object_move(rect->obj, x + cx, y + cy); evas_object_resize(rect->obj, cw, ch); @@ -5296,6 +5226,20 @@ _efl_ui_text_move_cb(void *data, Evas *e EINA_UNUSED, _decoration_defer_all(data); } +static void +_efl_ui_text_item_factory_set(Eo *obj EINA_UNUSED, Efl_Ui_Text_Data *pd, + Efl_Canvas_Text_Factory *item_factory) +{ + if (pd->item_factory) efl_unref(pd->item_factory); + pd->item_factory = efl_ref(item_factory); +} + +static Eo * +_efl_ui_text_item_factory_get(Eo *obj EINA_UNUSED, Efl_Ui_Text_Data *pd) +{ + return pd->item_factory; +} + #if 0 /* Efl.Part begin */ |