diff --git a/src/bin/elementary/test_efl_ui_text.c b/src/bin/elementary/test_efl_ui_text.c index e7e909b84f..d56fddb78d 100644 --- a/src/bin/elementary/test_efl_ui_text.c +++ b/src/bin/elementary/test_efl_ui_text.c @@ -8,18 +8,18 @@ static void _apply_style(Eo *obj, size_t start_pos, size_t end_pos, const char *style) { - Efl_Text_Cursor_Cursor *start, *end; + Efl_Text_Cursor *start, *end; - start = efl_text_cursor_new(obj); - end = efl_text_cursor_new(obj); + start = efl_ui_text_cursor_create(obj); + end = efl_ui_text_cursor_create(obj); - efl_text_cursor_position_set(obj, start, start_pos); - efl_text_cursor_position_set(obj, end, end_pos); + efl_text_cursor_position_set(start, start_pos); + efl_text_cursor_position_set(end, end_pos); - efl_text_annotation_insert(obj, start, end, style); + efl_text_annotation_insert(obj, efl_text_cursor_handle_get(start), efl_text_cursor_handle_get(end), style); - efl_text_cursor_free(obj, start); - efl_text_cursor_free(obj, end); + efl_del(start); + efl_del(end); } static Eo * @@ -98,15 +98,15 @@ typedef struct static void _on_bt3_clicked(void *data, const Efl_Event *event EINA_UNUSED) { - Efl_Text_Cursor_Cursor *sel_start, *sel_end; + Efl_Text_Cursor *sel_start, *sel_end; Eo *en = data; - efl_text_interactive_selection_cursors_get(data, &sel_start, &sel_end); - const char *s = efl_canvas_text_range_text_get(data, sel_start, sel_end); + efl_text_interactive_selection_cursors_get(en, &sel_start, &sel_end); + const char *s = efl_text_cursor_range_text_get(sel_start, sel_end); printf("SELECTION REGION: %d - %d\n", - efl_text_cursor_position_get(en, sel_start), - efl_text_cursor_position_get(en, sel_end)); + efl_text_cursor_position_get( sel_start), + efl_text_cursor_position_get(sel_end)); printf("SELECTION:\n"); if (s) printf("%s\n", s); } @@ -248,9 +248,9 @@ _on_factory_bt_image_clicked(void *data, const Efl_Event *event EINA_UNUSED) static int image_idx = 0; image_idx = (image_idx + 1) % IMAGES_SZ; - efl_text_cursor_item_insert(en, - efl_text_cursor_get(en, EFL_TEXT_CURSOR_GET_TYPE_MAIN), - images[image_idx], "size=32x32"); + + efl_text_cursor_item_insert(en, efl_text_cursor_handle_get(efl_text_interactive_main_cursor_get(en)), + images[image_idx], "size=32x32"); printf("Inserted image: key = %s\n", images[image_idx]); } @@ -258,8 +258,8 @@ static void _on_factory_bt_emoticon_clicked(void *data, const Efl_Event *event EINA_UNUSED) { Evas_Object *en = data; - efl_text_cursor_item_insert(en, efl_text_cursor_get(en, EFL_TEXT_CURSOR_GET_TYPE_MAIN), - "emoticon/evil-laugh", "size=32x32"); + efl_text_cursor_item_insert(en, efl_text_cursor_handle_get(efl_text_interactive_main_cursor_get(en)), + "emoticon/evil-laugh", "size=32x32"); } static struct @@ -287,7 +287,7 @@ void test_ui_text_item_factory(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED) { Evas_Object *win, *bx, *bx2, *bt, *en; - Efl_Text_Cursor_Cursor *main_cur, *cur; + Efl_Text_Cursor *main_cur, *cur; char buf[128]; Eina_File *f; @@ -350,16 +350,16 @@ test_ui_text_item_factory(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, efl_text_font_set(en, "Sans", 14); efl_text_normal_color_set(en, 255, 255, 255, 255); - main_cur = efl_text_cursor_get(en, EFL_TEXT_CURSOR_GET_TYPE_MAIN); - cur = efl_text_cursor_new(en); + main_cur = efl_text_interactive_main_cursor_get(en); + cur = efl_ui_text_cursor_create(en); - efl_text_cursor_position_set(en, cur, 2); - efl_text_cursor_item_insert(en, cur, "emoticon/happy", "size=32x32"); - efl_text_cursor_position_set(en, cur, 50); + efl_text_cursor_position_set(cur, 2); + efl_text_cursor_item_insert(en, efl_text_cursor_handle_get(cur), "emoticon/happy", "size=32x32"); + efl_text_cursor_position_set(cur, 50); snprintf(buf, sizeof(buf), "file://%s/images/sky_01.jpg", elm_app_data_dir_get()); - efl_text_cursor_item_insert(en, cur, buf, "size=32x32"); - efl_text_cursor_position_set(en, main_cur, 5); + efl_text_cursor_item_insert(en, efl_text_cursor_handle_get(cur), buf, "size=32x32"); + efl_text_cursor_position_set(main_cur, 5); efl_text_interactive_editable_set(en, EINA_TRUE); efl_ui_text_scrollable_set(en, EINA_TRUE); diff --git a/src/lib/edje/edje_entry.c b/src/lib/edje/edje_entry.c index a15bd64678..29e0f10c96 100644 --- a/src/lib/edje/edje_entry.c +++ b/src/lib/edje/edje_entry.c @@ -4083,7 +4083,7 @@ _cursor_get(Edje_Real_Part *rp, Edje_Cursor cur) } Eina_Bool -_edje_text_cursor_next(Edje_Real_Part *rp, Efl_Text_Cursor_Cursor *c) +_edje_text_cursor_next(Edje_Real_Part *rp, Efl_Text_Cursor_Handle *c) { Entry *en; @@ -4117,7 +4117,7 @@ _edje_entry_cursor_next(Edje_Real_Part *rp, Edje_Cursor cur) Eina_Bool -_edje_text_cursor_prev(Edje_Real_Part *rp, Efl_Text_Cursor_Cursor *c) +_edje_text_cursor_prev(Edje_Real_Part *rp, Efl_Text_Cursor_Handle *c) { Entry *en; @@ -4152,7 +4152,7 @@ _edje_entry_cursor_prev(Edje_Real_Part *rp, Edje_Cursor cur) } Eina_Bool -_edje_text_cursor_up(Edje_Real_Part *rp, Efl_Text_Cursor_Cursor *c) +_edje_text_cursor_up(Edje_Real_Part *rp, Efl_Text_Cursor_Handle *c) { Entry *en; Evas_Coord lx, ly, lw, lh, cx, cy, cw, ch; @@ -4192,7 +4192,7 @@ _edje_entry_cursor_up(Edje_Real_Part *rp, Edje_Cursor cur) } Eina_Bool -_edje_text_cursor_down(Edje_Real_Part *rp, Efl_Text_Cursor_Cursor *c) +_edje_text_cursor_down(Edje_Real_Part *rp, Efl_Text_Cursor_Handle *c) { Entry *en; Evas_Coord lx, ly, lw, lh, cx, cy, cw, ch; @@ -4231,7 +4231,7 @@ _edje_entry_cursor_down(Edje_Real_Part *rp, Edje_Cursor cur) } void -_edje_text_cursor_begin(Edje_Real_Part *rp, Efl_Text_Cursor_Cursor *c) +_edje_text_cursor_begin(Edje_Real_Part *rp, Efl_Text_Cursor_Handle *c) { Entry *en; int old_cur_pos; @@ -4266,7 +4266,7 @@ _edje_entry_cursor_begin(Edje_Real_Part *rp, Edje_Cursor cur) } void -_edje_text_cursor_end(Edje_Real_Part *rp, Efl_Text_Cursor_Cursor *c) +_edje_text_cursor_end(Edje_Real_Part *rp, Efl_Text_Cursor_Handle *c) { Entry *en; int old_cur_pos; @@ -4300,7 +4300,7 @@ _edje_entry_cursor_end(Edje_Real_Part *rp, Edje_Cursor cur) } void -_edje_text_cursor_copy(Edje_Real_Part *rp, Efl_Text_Cursor_Cursor *d, Efl_Text_Cursor_Cursor *c) +_edje_text_cursor_copy(Edje_Real_Part *rp, Efl_Text_Cursor_Handle *d, Efl_Text_Cursor_Handle *c) { Entry *en; @@ -4330,7 +4330,7 @@ _edje_entry_cursor_copy(Edje_Real_Part *rp, Edje_Cursor cur, Edje_Cursor dst) } void -_edje_text_cursor_line_begin(Edje_Real_Part *rp, Efl_Text_Cursor_Cursor *c) +_edje_text_cursor_line_begin(Edje_Real_Part *rp, Efl_Text_Cursor_Handle *c) { Entry *en; int old_cur_pos; @@ -4364,7 +4364,7 @@ _edje_entry_cursor_line_begin(Edje_Real_Part *rp, Edje_Cursor cur) } void -_edje_text_cursor_line_end(Edje_Real_Part *rp, Efl_Text_Cursor_Cursor *c) +_edje_text_cursor_line_end(Edje_Real_Part *rp, Efl_Text_Cursor_Handle *c) { Entry *en; int old_cur_pos; @@ -4397,7 +4397,7 @@ _edje_entry_cursor_line_end(Edje_Real_Part *rp, Edje_Cursor cur) } Eina_Bool -_edje_text_cursor_coord_set(Edje_Real_Part *rp, Efl_Text_Cursor_Cursor *c, +_edje_text_cursor_coord_set(Edje_Real_Part *rp, Efl_Text_Cursor_Handle *c, Evas_Coord x, Evas_Coord y) { Entry *en = rp->typedata.text->entry_data; @@ -4444,7 +4444,7 @@ _edje_entry_cursor_is_visible_format_get(Edje_Real_Part *rp, Edje_Cursor cur) } char * -_edje_text_cursor_content_get(Edje_Real_Part *rp EINA_UNUSED, Efl_Text_Cursor_Cursor *c) +_edje_text_cursor_content_get(Edje_Real_Part *rp EINA_UNUSED, Efl_Text_Cursor_Handle *c) { return evas_textblock_cursor_content_get(c); } @@ -4460,7 +4460,7 @@ _edje_entry_cursor_content_get(Edje_Real_Part *rp, Edje_Cursor cur) } void -_edje_text_cursor_pos_set(Edje_Real_Part *rp, Efl_Text_Cursor_Cursor *c, int pos) +_edje_text_cursor_pos_set(Edje_Real_Part *rp, Efl_Text_Cursor_Handle *c, int pos) { if ((rp->type != EDJE_RP_TYPE_TEXT) || (!rp->typedata.text)) return; @@ -4489,7 +4489,7 @@ _edje_entry_cursor_pos_set(Edje_Real_Part *rp, Edje_Cursor cur, int pos) } int -_edje_text_cursor_pos_get(Edje_Real_Part *rp EINA_UNUSED, Efl_Text_Cursor_Cursor *c) +_edje_text_cursor_pos_get(Edje_Real_Part *rp EINA_UNUSED, Efl_Text_Cursor_Handle *c) { return evas_textblock_cursor_pos_get(c); } diff --git a/src/lib/edje/edje_legacy.c b/src/lib/edje/edje_legacy.c index 5ac97c706c..f3a692b5a0 100644 --- a/src/lib/edje/edje_legacy.c +++ b/src/lib/edje/edje_legacy.c @@ -1,6 +1,14 @@ /* Legacy API implementations based on internal EO calls */ #include "edje_private.h" +#include "edje_part_helper.h" + +#define GET_REAL_PART_ON_FAIL_RETURN(x) Edje_Real_Part *rp;\ + Edje *ed;\ + ed = _edje_fetch(obj);\ + if ((!ed) || (!part)) return x;\ + rp = _edje_real_part_recursive_get(&ed, part);\ + if (!rp) return x;\ EAPI Edje_Load_Error edje_object_load_error_get(const Eo *obj) @@ -275,147 +283,93 @@ edje_object_part_drag_page(Evas_Object *obj, const char *part, double dx, double } EAPI void -edje_object_part_text_cursor_begin_set(Edje_Object *obj, const char *part, Edje_Cursor cur) +edje_object_part_text_cursor_begin_set(Edje_Object *obj, const char *part EINA_UNUSED, Edje_Cursor cur) { - efl_text_cursor_paragraph_first(efl_part(obj, part), - efl_text_cursor_get(efl_part(obj, part), (int) cur)); + GET_REAL_PART_ON_FAIL_RETURN() + _edje_text_cursor_begin(rp, _edje_text_cursor_get(rp, cur)); } EAPI void -edje_object_part_text_cursor_end_set(Edje_Object *obj, const char *part, Edje_Cursor cur) +edje_object_part_text_cursor_end_set(Edje_Object *obj, const char *part EINA_UNUSED, Edje_Cursor cur) { - efl_text_cursor_paragraph_last(efl_part(obj, part), - efl_text_cursor_get(efl_part(obj, part), (int) cur)); + GET_REAL_PART_ON_FAIL_RETURN() + _edje_text_cursor_end(rp, _edje_text_cursor_get(rp, cur)); } EAPI void -edje_object_part_text_cursor_pos_set(Edje_Object *obj, const char * part, Edje_Cursor cur, int pos) +edje_object_part_text_cursor_pos_set(Edje_Object *obj, const char * part EINA_UNUSED, Edje_Cursor cur, int pos) { - efl_text_cursor_position_set(efl_part(obj, part), - efl_text_cursor_get(efl_part(obj, part), (int) cur), pos); + GET_REAL_PART_ON_FAIL_RETURN() + _edje_text_cursor_pos_set(rp, _edje_text_cursor_get(rp, cur), pos); } EAPI int -edje_object_part_text_cursor_pos_get(const Edje_Object *obj, const char * part, Edje_Cursor cur) +edje_object_part_text_cursor_pos_get(const Edje_Object *obj, const char * part EINA_UNUSED, Edje_Cursor cur) { - return efl_text_cursor_position_get(efl_part(obj, part), - efl_text_cursor_get(efl_part(obj, part), (int) cur)); - + GET_REAL_PART_ON_FAIL_RETURN(0) + return _edje_text_cursor_pos_get(rp, _edje_text_cursor_get(rp, cur)); } EAPI Eina_Bool -edje_object_part_text_cursor_coord_set(Edje_Object *obj, const char *part, Edje_Cursor cur, int x, int y) +edje_object_part_text_cursor_coord_set(Edje_Object *obj, const char *part EINA_UNUSED, Edje_Cursor cur, int x, int y) { - efl_text_cursor_coord_set(efl_part(obj, part), - efl_text_cursor_get(efl_part(obj, part), (int) cur), x, y); - return EINA_TRUE; + GET_REAL_PART_ON_FAIL_RETURN(EINA_FALSE) + return _edje_text_cursor_coord_set(rp, _edje_text_cursor_get(rp, cur), x, y); } EAPI void -edje_object_part_text_cursor_line_begin_set(Edje_Object *obj, const char *part, Edje_Cursor cur) +edje_object_part_text_cursor_line_begin_set(Edje_Object *obj, const char *part EINA_UNUSED, Edje_Cursor cur) { - efl_text_cursor_line_char_first(efl_part(obj, part), - efl_text_cursor_get(efl_part(obj, part), (int) cur)); + GET_REAL_PART_ON_FAIL_RETURN() + _edje_text_cursor_line_begin(rp, _edje_text_cursor_get(rp, cur)); } EAPI void -edje_object_part_text_cursor_line_end_set(Edje_Object *obj, const char *part, Edje_Cursor cur) +edje_object_part_text_cursor_line_end_set(Edje_Object *obj, const char *part EINA_UNUSED, Edje_Cursor cur) { - efl_text_cursor_line_char_last(efl_part(obj, part), - efl_text_cursor_get(efl_part(obj, part), (int) cur)); + GET_REAL_PART_ON_FAIL_RETURN() + _edje_text_cursor_line_end(rp, _edje_text_cursor_get(rp, cur)); } EAPI Eina_Bool -edje_object_part_text_cursor_prev(Edje_Object *obj, const char *part, Edje_Cursor cur) +edje_object_part_text_cursor_prev(Edje_Object *obj, const char *part EINA_UNUSED, Edje_Cursor cur) { - Efl_Text_Cursor_Cursor *c; - int old_pos, new_pos; - - c = efl_text_cursor_get(efl_part(obj, part), (int) cur); - - old_pos = efl_text_cursor_position_get(efl_part(obj, part), c); - efl_text_cursor_char_prev(efl_part(obj, part), c); - new_pos = efl_text_cursor_position_get(efl_part(obj, part), c); - - if (old_pos != new_pos) - return EINA_TRUE; - - return EINA_FALSE; + GET_REAL_PART_ON_FAIL_RETURN(EINA_FALSE) + return _edje_text_cursor_prev(rp, _edje_text_cursor_get(rp, cur)); } EAPI Eina_Bool -edje_object_part_text_cursor_next(Edje_Object *obj, const char *part, Edje_Cursor cur) +edje_object_part_text_cursor_next(Edje_Object *obj, const char *part EINA_UNUSED, Edje_Cursor cur) { - Efl_Text_Cursor_Cursor *c; - int old_pos, new_pos; - - c = efl_text_cursor_get(efl_part(obj, part), (int) cur); - - old_pos = efl_text_cursor_position_get(efl_part(obj, part), c); - efl_text_cursor_char_next(efl_part(obj, part), c); - new_pos = efl_text_cursor_position_get(efl_part(obj, part), c); - - if (old_pos != new_pos) - return EINA_TRUE; - - return EINA_FALSE; + GET_REAL_PART_ON_FAIL_RETURN(EINA_FALSE) + return _edje_text_cursor_next(rp, _edje_text_cursor_get(rp, cur)); } EAPI Eina_Bool -edje_object_part_text_cursor_down(Edje_Object *obj, const char *part, Edje_Cursor cur) +edje_object_part_text_cursor_down(Edje_Object *obj, const char *part EINA_UNUSED, Edje_Cursor cur) { - Efl_Text_Cursor_Cursor *c; - int old_pos, new_pos; - - c = efl_text_cursor_get(efl_part(obj, part), (int) cur); - - old_pos = efl_text_cursor_position_get(efl_part(obj, part), c); - efl_text_cursor_line_jump_by(efl_part(obj, part), c, 1); - new_pos = efl_text_cursor_position_get(efl_part(obj, part), c); - - if (old_pos != new_pos) - return EINA_TRUE; - - return EINA_FALSE; + GET_REAL_PART_ON_FAIL_RETURN(EINA_FALSE) + return _edje_text_cursor_down(rp, _edje_text_cursor_get(rp, cur)); } EAPI Eina_Bool -edje_object_part_text_cursor_up(Edje_Object *obj, const char *part, Edje_Cursor cur) +edje_object_part_text_cursor_up(Edje_Object *obj, const char *part EINA_UNUSED, Edje_Cursor cur) { - Efl_Text_Cursor_Cursor *c; - int old_pos, new_pos; - - c = efl_text_cursor_get(efl_part(obj, part), (int) cur); - - old_pos = efl_text_cursor_position_get(efl_part(obj, part), c); - efl_text_cursor_line_jump_by(efl_part(obj, part), c, -1); - new_pos = efl_text_cursor_position_get(efl_part(obj, part), c); - - if (old_pos != new_pos) - return EINA_TRUE; - - return EINA_FALSE; + GET_REAL_PART_ON_FAIL_RETURN(EINA_FALSE) + return _edje_text_cursor_up(rp, _edje_text_cursor_get(rp, cur)); } EAPI void -edje_object_part_text_cursor_copy(Edje_Object *obj, const char *part, Edje_Cursor cur, Edje_Cursor dst) +edje_object_part_text_cursor_copy(Edje_Object *obj, const char *part EINA_UNUSED, Edje_Cursor cur, Edje_Cursor dst) { - efl_text_cursor_copy(efl_part(obj, part), - efl_text_cursor_get(efl_part(obj, part), (int) dst), - efl_text_cursor_get(efl_part(obj, part), (int) cur) - ); + GET_REAL_PART_ON_FAIL_RETURN() + _edje_text_cursor_copy(rp, _edje_text_cursor_get(rp, cur), _edje_text_cursor_get(rp, dst)); } EAPI char * -edje_object_part_text_cursor_content_get(const Edje_Object *obj, const char *part, Edje_Cursor cur) +edje_object_part_text_cursor_content_get(const Edje_Object *obj, const char *part EINA_UNUSED, Edje_Cursor cur) { - Edje_Real_Part *rp; - Edje *ed; - - ed = efl_data_scope_get(obj, EFL_CANVAS_LAYOUT_CLASS); - if ((!ed) || (!part)) return NULL; - rp = _edje_real_part_recursive_get(&ed, part); - if (!rp) return NULL; + GET_REAL_PART_ON_FAIL_RETURN(NULL) if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE) { return _edje_entry_cursor_content_get(rp, cur); @@ -425,27 +379,18 @@ edje_object_part_text_cursor_content_get(const Edje_Object *obj, const char *par } EAPI void -edje_object_part_text_cursor_geometry_get(const Edje_Object *obj, const char * part, int *x, int *y, int *w, int *h) +edje_object_part_text_cursor_geometry_get(const Edje_Object *obj, const char * part EINA_UNUSED, int *x, int *y, int *w, int *h) { - efl_text_cursor_geometry_get(efl_part(obj, part), - efl_text_cursor_get(efl_part(obj, part), EFL_TEXT_CURSOR_GET_TYPE_MAIN), - EFL_TEXT_CURSOR_TYPE_BEFORE, - x, y, w, h, NULL, NULL, NULL, NULL - ); + GET_REAL_PART_ON_FAIL_RETURN() + evas_textblock_cursor_geometry_bidi_get(_edje_text_cursor_get(rp, EDJE_CURSOR_MAIN), + x, y, w, h, NULL, NULL, NULL, NULL, EVAS_TEXTBLOCK_CURSOR_BEFORE); } EAPI Eina_Bool edje_object_part_text_hide_visible_password(Eo *obj, const char *part) { - Edje_Real_Part *rp; + GET_REAL_PART_ON_FAIL_RETURN(EINA_FALSE) Eina_Bool int_ret = EINA_FALSE; - Edje *ed; - - ed = efl_data_scope_get(obj, EFL_CANVAS_LAYOUT_CLASS); - - if ((!ed) || (!part)) return EINA_FALSE; - rp = _edje_real_part_recursive_get(&ed, part); - if (!rp) return EINA_FALSE; if (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK) return EINA_FALSE; if ((rp->type != EDJE_RP_TYPE_TEXT) || (!rp->typedata.text)) @@ -462,13 +407,7 @@ edje_object_part_text_hide_visible_password(Eo *obj, const char *part) EAPI Eina_Bool edje_object_part_text_cursor_is_format_get(const Eo *obj, const char *part, Edje_Cursor cur) { - Edje_Real_Part *rp; - Edje *ed; - - ed = _edje_fetch(obj); - if ((!ed) || (!part)) return EINA_FALSE; - rp = _edje_real_part_recursive_get(&ed, part); - if (!rp) return EINA_FALSE; + GET_REAL_PART_ON_FAIL_RETURN(EINA_FALSE) if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE) { return _edje_entry_cursor_is_format_get(rp, cur); @@ -479,13 +418,7 @@ edje_object_part_text_cursor_is_format_get(const Eo *obj, const char *part, Edje EAPI Eina_Bool edje_object_part_text_cursor_is_visible_format_get(const Eo *obj, const char *part, Edje_Cursor cur) { - Edje_Real_Part *rp; - Edje *ed; - - ed = _edje_fetch(obj); - if ((!ed) || (!part)) return EINA_FALSE; - rp = _edje_real_part_recursive_get(&ed, part); - if (!rp) return EINA_FALSE; + GET_REAL_PART_ON_FAIL_RETURN(EINA_FALSE) if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE) { return _edje_entry_cursor_is_visible_format_get(rp, cur); @@ -497,13 +430,7 @@ edje_object_part_text_cursor_is_visible_format_get(const Eo *obj, const char *pa EAPI const Eina_List * edje_object_part_text_anchor_list_get(const Eo *obj, const char *part) { - Edje_Real_Part *rp; - Edje *ed; - - ed = _edje_fetch(obj); - if ((!ed) || (!part)) return NULL; - rp = _edje_real_part_recursive_get(&ed, part); - if (!rp) return NULL; + GET_REAL_PART_ON_FAIL_RETURN(NULL) if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE) return _edje_entry_anchors_list(rp); @@ -513,13 +440,7 @@ edje_object_part_text_anchor_list_get(const Eo *obj, const char *part) EAPI const Eina_List * edje_object_part_text_anchor_geometry_get(const Eo *obj, const char *part, const char *anchor) { - Edje_Real_Part *rp; - Edje *ed; - - ed = _edje_fetch(obj); - if ((!ed) || (!part)) return NULL; - rp = _edje_real_part_recursive_get(&ed, part); - if (!rp) return NULL; + GET_REAL_PART_ON_FAIL_RETURN(NULL) if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE) return _edje_entry_anchor_geometry_get(rp, anchor); @@ -529,15 +450,9 @@ edje_object_part_text_anchor_geometry_get(const Eo *obj, const char *part, const EAPI void edje_object_part_text_style_user_push(Eo *obj EINA_UNUSED, const char *part, const char *style) { - Edje_Real_Part *rp; Evas_Textblock_Style *ts; - Edje *ed; + GET_REAL_PART_ON_FAIL_RETURN() - ed = efl_data_scope_get(obj, EFL_CANVAS_LAYOUT_CLASS); - - if ((!ed) || (!part) || (!style)) return; - rp = _edje_real_part_recursive_get(&ed, part); - if (!rp) return; if (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK) return; ts = evas_textblock_style_new(); @@ -552,16 +467,9 @@ edje_object_part_text_style_user_push(Eo *obj EINA_UNUSED, const char *part, con } EAPI void -edje_object_part_text_style_user_pop(Eo *obj EINA_UNUSED, const char *part) +edje_object_part_text_style_user_pop(Eo *obj, const char *part) { - Edje_Real_Part *rp; - Edje *ed; - - ed = efl_data_scope_get(obj, EFL_CANVAS_LAYOUT_CLASS); - - if ((!ed) || (!part)) return; - rp = _edje_real_part_recursive_get(&ed, part); - if (!rp) return; + GET_REAL_PART_ON_FAIL_RETURN() if (rp->part->type != EDJE_PART_TYPE_TEXTBLOCK) return; evas_object_textblock_style_user_pop(rp->object); @@ -579,7 +487,7 @@ edje_object_part_text_style_user_peek(const Eo *obj EINA_UNUSED, const char *par const Evas_Textblock_Style *ts; Edje *ed; - ed = efl_data_scope_get(obj, EFL_CANVAS_LAYOUT_CLASS); + ed = _edje_fetch(obj); if ((!ed) || (!part)) return NULL; rp = _edje_real_part_recursive_get(&ed, part); @@ -596,14 +504,7 @@ edje_object_part_text_style_user_peek(const Eo *obj EINA_UNUSED, const char *par EAPI const Eina_List * edje_object_part_text_item_list_get(const Eo *obj EINA_UNUSED, const char *part) { - Edje_Real_Part *rp; - Edje *ed; - - ed = efl_data_scope_get(obj, EFL_CANVAS_LAYOUT_CLASS); - - if ((!ed) || (!part)) return NULL; - rp = _edje_real_part_recursive_get(&ed, part); - if (!rp) return NULL; + GET_REAL_PART_ON_FAIL_RETURN(NULL) if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE) return _edje_entry_items_list(rp); @@ -613,14 +514,7 @@ edje_object_part_text_item_list_get(const Eo *obj EINA_UNUSED, const char *part) EAPI Eina_Bool edje_object_part_text_item_geometry_get(const Eo *obj EINA_UNUSED, const char *part, const char *item, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) { - Edje_Real_Part *rp; - Edje *ed; - - ed = efl_data_scope_get(obj, EFL_CANVAS_LAYOUT_CLASS); - - if ((!ed) || (!part)) return EINA_FALSE; - rp = _edje_real_part_recursive_get(&ed, part); - if (!rp) return EINA_FALSE; + GET_REAL_PART_ON_FAIL_RETURN(EINA_FALSE) if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE) { return _edje_entry_item_geometry_get(rp, item, cx, cy, cw, ch); @@ -635,7 +529,7 @@ edje_object_text_insert_filter_callback_add(Eo *obj EINA_UNUSED, const char *par Edje_Text_Insert_Filter_Callback *cb; Edje *ed; - ed = efl_data_scope_get(obj, EFL_CANVAS_LAYOUT_CLASS); + ed = _edje_fetch(obj); if ((!ed) || (!part)) return; cb = calloc(1, sizeof(Edje_Text_Insert_Filter_Callback)); @@ -653,7 +547,7 @@ edje_object_text_insert_filter_callback_del(Eo *obj EINA_UNUSED, const char *par Eina_List *l; Edje *ed; - ed = efl_data_scope_get(obj, EFL_CANVAS_LAYOUT_CLASS); + ed = _edje_fetch(obj); if ((!ed) || (!part)) return NULL; EINA_LIST_FOREACH(ed->text_insert_filter_callbacks, l, cb) @@ -679,7 +573,7 @@ edje_object_text_insert_filter_callback_del_full(Eo *obj EINA_UNUSED, const char Eina_List *l; Edje *ed; - ed = efl_data_scope_get(obj, EFL_CANVAS_LAYOUT_CLASS); + ed = _edje_fetch(obj); if ((!ed) || (!part)) return NULL; EINA_LIST_FOREACH(ed->text_insert_filter_callbacks, l, cb) @@ -705,7 +599,7 @@ edje_object_text_markup_filter_callback_add(Eo *obj EINA_UNUSED, const char *par Edje_Markup_Filter_Callback *cb; Edje *ed; - ed = efl_data_scope_get(obj, EFL_CANVAS_LAYOUT_CLASS); + ed = _edje_fetch(obj); if ((!ed) || (!part)) return; cb = calloc(1, sizeof(Edje_Markup_Filter_Callback)); @@ -723,7 +617,7 @@ edje_object_text_markup_filter_callback_del(Eo *obj EINA_UNUSED, const char *par Eina_List *l; Edje *ed; - ed = efl_data_scope_get(obj, EFL_CANVAS_LAYOUT_CLASS); + ed = _edje_fetch(obj); if ((!ed) || (!part)) return NULL; EINA_LIST_FOREACH(ed->markup_filter_callbacks, l, cb) @@ -749,7 +643,7 @@ edje_object_text_markup_filter_callback_del_full(Eo *obj EINA_UNUSED, const char Eina_List *l; Edje *ed; - ed = efl_data_scope_get(obj, EFL_CANVAS_LAYOUT_CLASS); + ed = _edje_fetch(obj); if ((!ed) || (!part)) return NULL; EINA_LIST_FOREACH(ed->markup_filter_callbacks, l, cb) @@ -775,7 +669,7 @@ edje_object_part_text_user_insert(const Eo *obj, const char *part, const char *t Edje_Real_Part *rp; Edje *ed; - ed = efl_data_scope_get(obj, EFL_CANVAS_LAYOUT_CLASS); + ed = _edje_fetch(obj); if ((!ed) || (!part)) return; rp = _edje_real_part_recursive_get(&ed, part); @@ -828,7 +722,7 @@ edje_object_part_text_append(Eo *obj, const char *part, const char *text) Edje *ed; - ed = efl_data_scope_get(obj, EFL_CANVAS_LAYOUT_CLASS); + ed = _edje_fetch(obj); if ((!ed) || (!part)) return; rp = _edje_real_part_recursive_get(&ed, part); if (!rp) return; @@ -852,7 +746,7 @@ edje_object_part_text_escaped_set(Eo *obj, const char *part, const char *text) Eina_Bool int_ret; Edje *ed; - ed = efl_data_scope_get(obj, EFL_CANVAS_LAYOUT_CLASS); + ed = _edje_fetch(obj); if ((!ed) || (!part)) return EINA_FALSE; rp = _edje_real_part_recursive_get(&ed, part); @@ -1038,7 +932,7 @@ edje_object_part_text_unescaped_set(Eo *obj, const char *part, const char *text_ Eina_Bool int_ret = EINA_FALSE; Edje *ed; - ed = efl_data_scope_get(obj, EFL_CANVAS_LAYOUT_CLASS); + ed = _edje_fetch(obj); if ((!ed) || (!part)) return EINA_FALSE; rp = _edje_real_part_recursive_get(&ed, part); @@ -1065,7 +959,7 @@ edje_object_part_text_unescaped_get(const Eo *obj EINA_UNUSED, const char *part) Edje_Real_Part *rp; Edje *ed; - ed = efl_data_scope_get(obj, EFL_CANVAS_LAYOUT_CLASS); + ed = _edje_fetch(obj); if ((!ed) || (!part)) return NULL; @@ -1119,7 +1013,7 @@ edje_object_part_text_insert(Eo *obj, const char *part, const char *text) Edje_Real_Part *rp; Edje *ed; - ed = efl_data_scope_get(obj, EFL_CANVAS_LAYOUT_CLASS); + ed = _edje_fetch(obj); if ((!ed) || (!part)) return; rp = _edje_real_part_recursive_get(&ed, part); diff --git a/src/lib/edje/edje_part_invalid.c b/src/lib/edje/edje_part_invalid.c index 4c62204709..9b939d9f72 100644 --- a/src/lib/edje/edje_part_invalid.c +++ b/src/lib/edje/edje_part_invalid.c @@ -62,21 +62,6 @@ EDJE_PART_INVALID_VOID(efl_text_set, _efl_canvas_layout_part_invalid_efl_text_te EDJE_PART_INVALID_CONST(const char *, 0, efl_text_get, _efl_canvas_layout_part_invalid_efl_text_text_get) EDJE_PART_INVALID_VOID(efl_text_markup_set, _efl_canvas_layout_part_invalid_efl_text_markup_markup_set, const char *text) EDJE_PART_INVALID_CONST(const char *, 0, efl_text_markup_get, _efl_canvas_layout_part_invalid_efl_text_markup_markup_get) -EDJE_PART_INVALID_CONST(Efl_Text_Cursor_Cursor *, 0, efl_text_cursor_get, _efl_canvas_layout_part_invalid_efl_text_cursor_text_cursor_get, Efl_Text_Cursor_Get_Type get_type) -EDJE_PART_INVALID_VOID(efl_text_cursor_paragraph_first, _efl_canvas_layout_part_invalid_efl_text_cursor_cursor_paragraph_first, Efl_Text_Cursor_Cursor *cur) -EDJE_PART_INVALID_VOID(efl_text_cursor_paragraph_last, _efl_canvas_layout_part_invalid_efl_text_cursor_cursor_paragraph_last, Efl_Text_Cursor_Cursor *cur) -EDJE_PART_INVALID_VOID(efl_text_cursor_position_set, _efl_canvas_layout_part_invalid_efl_text_cursor_cursor_position_set, Efl_Text_Cursor_Cursor *cur, int position) -EDJE_PART_INVALID_CONST(int, 0, efl_text_cursor_position_get, _efl_canvas_layout_part_invalid_efl_text_cursor_cursor_position_get, Efl_Text_Cursor_Cursor *cur) -EDJE_PART_INVALID_VOID(efl_text_cursor_coord_set, _efl_canvas_layout_part_invalid_efl_text_cursor_cursor_coord_set, Efl_Text_Cursor_Cursor *cur, int x, int y) -EDJE_PART_INVALID_VOID(efl_text_cursor_line_char_first, _efl_canvas_layout_part_invalid_efl_text_cursor_cursor_line_char_first, Efl_Text_Cursor_Cursor *cur) -EDJE_PART_INVALID_VOID(efl_text_cursor_line_char_last, _efl_canvas_layout_part_invalid_efl_text_cursor_cursor_line_char_last, Efl_Text_Cursor_Cursor *cur) -EDJE_PART_INVALID_VOID(efl_text_cursor_char_next, _efl_canvas_layout_part_invalid_efl_text_cursor_cursor_char_next, Efl_Text_Cursor_Cursor *cur) -EDJE_PART_INVALID_VOID(efl_text_cursor_char_prev, _efl_canvas_layout_part_invalid_efl_text_cursor_cursor_char_prev, Efl_Text_Cursor_Cursor *cur) -EDJE_PART_INVALID_VOID(efl_text_cursor_line_jump_by, _efl_canvas_layout_part_invalid_efl_text_cursor_cursor_line_jump_by, Efl_Text_Cursor_Cursor *cur, int by) -EDJE_PART_INVALID_VOID(efl_text_cursor_copy, _efl_canvas_layout_part_invalid_efl_text_cursor_cursor_copy, Efl_Text_Cursor_Cursor *dst, const Efl_Text_Cursor_Cursor *src) -EDJE_PART_INVALID_CONST(Eina_Unicode, 0, efl_text_cursor_content_get, _efl_canvas_layout_part_invalid_efl_text_cursor_cursor_content_get, const Efl_Text_Cursor_Cursor *cur) -EDJE_PART_INVALID_CONST(Eina_Bool, 0, efl_text_cursor_geometry_get, _efl_canvas_layout_part_invalid_efl_text_cursor_cursor_geometry_get, const Efl_Text_Cursor_Cursor *cur, Efl_Text_Cursor_Type ctype, int *cx, int *cy, int *cw, int *ch, int *cx2, int *cy2, int *cw2, int *ch2) -EDJE_PART_INVALID_VOID(efl_text_markup_interactive_cursor_markup_insert, _efl_canvas_layout_part_invalid_efl_text_markup_interactive_cursor_markup_insert, Efl_Text_Cursor_Cursor *cur, const char *markup) EDJE_PART_INVALID(Eina_Iterator *, 0, efl_content_iterate, _efl_canvas_layout_part_invalid_efl_container_content_iterate) EDJE_PART_INVALID(int, 0, efl_content_count, _efl_canvas_layout_part_invalid_efl_container_content_count) EDJE_PART_INVALID(Eina_Bool, 0, efl_pack_clear, _efl_canvas_layout_part_invalid_efl_pack_pack_clear) diff --git a/src/lib/edje/edje_part_text.c b/src/lib/edje/edje_part_text.c index 8f7d936cb6..01bca325c1 100644 --- a/src/lib/edje/edje_part_text.c +++ b/src/lib/edje/edje_part_text.c @@ -38,165 +38,6 @@ _efl_canvas_layout_part_text_efl_text_markup_markup_set(Eo *obj, _edje_efl_text_text_set(obj, pd->ed, pd->part, text, EINA_FALSE, EINA_TRUE); } - -EOLIAN static Efl_Text_Cursor_Cursor * -_efl_canvas_layout_part_text_efl_text_cursor_text_cursor_get(const Eo *obj, - void *_pd EINA_UNUSED, Efl_Text_Cursor_Get_Type get_type) -{ - PROXY_DATA_GET(obj, pd); - return _edje_text_cursor_get(pd->rp, (int) get_type); -} - -EOLIAN static void -_efl_canvas_layout_part_text_efl_text_cursor_cursor_paragraph_first(Eo *obj, - void *_pd EINA_UNUSED, Efl_Text_Cursor_Cursor *cur) -{ - PROXY_DATA_GET(obj, pd); - _edje_text_cursor_begin(pd->rp, cur); -} - -EOLIAN static void -_efl_canvas_layout_part_text_efl_text_cursor_cursor_paragraph_last(Eo *obj, - void *_pd EINA_UNUSED, Efl_Text_Cursor_Cursor *cur) -{ - PROXY_DATA_GET(obj, pd); - _edje_text_cursor_end(pd->rp, cur); -} - -EOLIAN static void -_efl_canvas_layout_part_text_efl_text_cursor_cursor_position_set(Eo *obj, - void *_pd EINA_UNUSED, Efl_Text_Cursor_Cursor *cur, int pos) -{ - PROXY_DATA_GET(obj, pd); - _edje_text_cursor_pos_set(pd->rp, cur, pos); -} - -EOLIAN static int -_efl_canvas_layout_part_text_efl_text_cursor_cursor_position_get(const Eo *obj, - void *_pd EINA_UNUSED, Efl_Text_Cursor_Cursor *cur) -{ - PROXY_DATA_GET(obj, pd); - return _edje_text_cursor_pos_get(pd->rp, cur); -} - -EOLIAN static void -_efl_canvas_layout_part_text_efl_text_cursor_cursor_coord_set(Eo *obj, - void *_pd EINA_UNUSED, Efl_Text_Cursor_Cursor *cur, - int x, int y) -{ - PROXY_DATA_GET(obj, pd); - _edje_text_cursor_coord_set(pd->rp, cur, x, y); -} - -EOLIAN static void -_efl_canvas_layout_part_text_efl_text_cursor_cursor_line_char_first(Eo *obj, - void *_pd EINA_UNUSED, Efl_Text_Cursor_Cursor *cur) -{ - PROXY_DATA_GET(obj, pd); - _edje_text_cursor_line_begin(pd->rp, cur); -} - -EOLIAN static void -_efl_canvas_layout_part_text_efl_text_cursor_cursor_line_char_last(Eo *obj, - void *_pd EINA_UNUSED, Efl_Text_Cursor_Cursor *cur) -{ - PROXY_DATA_GET(obj, pd); - _edje_text_cursor_line_end(pd->rp, cur); -} - -EOLIAN static void -_efl_canvas_layout_part_text_efl_text_cursor_cursor_char_prev(Eo *obj, - void *_pd EINA_UNUSED, Efl_Text_Cursor_Cursor *cur) -{ - PROXY_DATA_GET(obj, pd); - _edje_text_cursor_prev(pd->rp, cur); -} - -EOLIAN static void -_efl_canvas_layout_part_text_efl_text_cursor_cursor_char_next(Eo *obj, - void *_pd EINA_UNUSED, Efl_Text_Cursor_Cursor *cur) -{ - PROXY_DATA_GET(obj, pd); - _edje_text_cursor_next(pd->rp, cur); -} - -EOLIAN static void -_efl_canvas_layout_part_text_efl_text_cursor_cursor_line_jump_by(Eo *obj, - void *_pd EINA_UNUSED, Efl_Text_Cursor_Cursor *cur, int by) -{ - PROXY_DATA_GET(obj, pd); - if (by == 1) - { - _edje_text_cursor_down(pd->rp, cur); - } - else if (by == -1) - { - _edje_text_cursor_up(pd->rp, cur); - } -} - -EOLIAN static void -_efl_canvas_layout_part_text_efl_text_cursor_cursor_copy(Eo *obj, - void *_pd EINA_UNUSED, - Efl_Text_Cursor_Cursor *dst, - const Efl_Text_Cursor_Cursor *cur) -{ - PROXY_DATA_GET(obj, pd); - _edje_text_cursor_copy(pd->rp, (Efl_Text_Cursor_Cursor *) cur, dst); -} - -EOLIAN static Eina_Unicode -_efl_canvas_layout_part_text_efl_text_cursor_cursor_content_get(const Eo *obj, - void *_pd EINA_UNUSED, - const Efl_Text_Cursor_Cursor *cur) -{ - Eina_Unicode *ustr; - Eina_Unicode uc = { 0 }; - char *c; - int len; - - PROXY_DATA_GET(obj, pd); - c = _edje_text_cursor_content_get(pd->rp, (Efl_Text_Cursor_Cursor *) cur); - ustr = eina_unicode_utf8_to_unicode(c, &len); - free(c); - if (ustr) - { - uc = *ustr; - free(ustr); - } - return uc; -} - -EOLIAN static Eina_Bool -_efl_canvas_layout_part_text_efl_text_cursor_cursor_geometry_get(const Eo *obj, - void *_pd EINA_UNUSED, - const Efl_Text_Cursor_Cursor *cur EINA_UNUSED, - Efl_Text_Cursor_Type ctype EINA_UNUSED, - Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch, - Evas_Coord *cx2 EINA_UNUSED, Evas_Coord *cy2 EINA_UNUSED, - Evas_Coord *cw2 EINA_UNUSED, Evas_Coord *ch2 EINA_UNUSED) -{ - PROXY_DATA_GET(obj, pd); - if (pd->rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE) - { - _edje_entry_cursor_geometry_get(pd->rp, cx, cy, cw, ch, NULL); - if (cx) *cx -= pd->ed->x; - if (cy) *cy -= pd->ed->y; - } - return EINA_FALSE; -} - -EOLIAN static void -_efl_canvas_layout_part_text_efl_text_markup_interactive_cursor_markup_insert(Eo *obj, - void *_pd EINA_UNUSED, Efl_Text_Cursor_Cursor *cur EINA_UNUSED, - const char *text) -{ - PROXY_DATA_GET(obj, pd); - // Ignoring cursor type and always inserting with main cursor - _edje_object_part_text_insert(pd->ed, pd->rp, text); - // FIXME: entry should report the length of inserted text (after filtering) -} - /* More Efl.Text.* API (@since 1.22) */ EOLIAN static void diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h index 676231512f..33b07a2c26 100644 --- a/src/lib/edje/edje_private.h +++ b/src/lib/edje/edje_private.h @@ -3303,19 +3303,19 @@ const char *_edje_efl_text_text_get(const Eo *obj, Edje *ed, const char *part, E Eina_Bool _edje_efl_text_markup_set(Eo *obj, Edje *ed, const char *part, const char *markup); const char *_edje_efl_text_markup_get(Eo *obj, Edje *ed, const char *part); Evas_Textblock_Cursor *_edje_text_cursor_get(Edje_Real_Part *rp, Edje_Cursor cur); -void _edje_text_cursor_begin(Edje_Real_Part *rp, Efl_Text_Cursor_Cursor *cur); -void _edje_text_cursor_end(Edje_Real_Part *rp, Efl_Text_Cursor_Cursor *cur); -void _edje_text_cursor_pos_set(Edje_Real_Part *rp, Efl_Text_Cursor_Cursor *cur, int pos); -int _edje_text_cursor_pos_get(Edje_Real_Part *rp, Efl_Text_Cursor_Cursor *cur); -Eina_Bool _edje_text_cursor_coord_set(Edje_Real_Part *rp, Efl_Text_Cursor_Cursor *cur, int x, int y); -void _edje_text_cursor_line_begin(Edje_Real_Part *rp, Efl_Text_Cursor_Cursor *cur); -void _edje_text_cursor_line_end(Edje_Real_Part *rp, Efl_Text_Cursor_Cursor *cur); -Eina_Bool _edje_text_cursor_next(Edje_Real_Part *rp, Efl_Text_Cursor_Cursor *cur); -Eina_Bool _edje_text_cursor_prev(Edje_Real_Part *rp, Efl_Text_Cursor_Cursor *cur); -Eina_Bool _edje_text_cursor_up(Edje_Real_Part *rp, Efl_Text_Cursor_Cursor *cur); -Eina_Bool _edje_text_cursor_down(Edje_Real_Part *rp, Efl_Text_Cursor_Cursor *cur); -void _edje_text_cursor_copy(Edje_Real_Part *rp, Efl_Text_Cursor_Cursor *dst, Efl_Text_Cursor_Cursor *cur); -char * _edje_text_cursor_content_get(Edje_Real_Part *rp, Efl_Text_Cursor_Cursor *cur); +void _edje_text_cursor_begin(Edje_Real_Part *rp, Efl_Text_Cursor_Handle *cur); +void _edje_text_cursor_end(Edje_Real_Part *rp, Efl_Text_Cursor_Handle *cur); +void _edje_text_cursor_pos_set(Edje_Real_Part *rp, Efl_Text_Cursor_Handle *cur, int pos); +int _edje_text_cursor_pos_get(Edje_Real_Part *rp, Efl_Text_Cursor_Handle *cur); +Eina_Bool _edje_text_cursor_coord_set(Edje_Real_Part *rp, Efl_Text_Cursor_Handle *cur, int x, int y); +void _edje_text_cursor_line_begin(Edje_Real_Part *rp, Efl_Text_Cursor_Handle *cur); +void _edje_text_cursor_line_end(Edje_Real_Part *rp, Efl_Text_Cursor_Handle *cur); +Eina_Bool _edje_text_cursor_next(Edje_Real_Part *rp, Efl_Text_Cursor_Handle *cur); +Eina_Bool _edje_text_cursor_prev(Edje_Real_Part *rp, Efl_Text_Cursor_Handle *cur); +Eina_Bool _edje_text_cursor_up(Edje_Real_Part *rp, Efl_Text_Cursor_Handle *cur); +Eina_Bool _edje_text_cursor_down(Edje_Real_Part *rp, Efl_Text_Cursor_Handle *cur); +void _edje_text_cursor_copy(Edje_Real_Part *rp, Efl_Text_Cursor_Handle *dst, Efl_Text_Cursor_Handle *cur); +char * _edje_text_cursor_content_get(Edje_Real_Part *rp, Efl_Text_Cursor_Handle *cur); void _edje_object_part_text_insert(Edje *ed, Edje_Real_Part *rp, const char *text); void _edje_internal_proxy_shutdown(void); diff --git a/src/lib/edje/edje_textblock.c b/src/lib/edje/edje_textblock.c index ce1015e065..8b9d97ebe1 100644 --- a/src/lib/edje/edje_textblock.c +++ b/src/lib/edje/edje_textblock.c @@ -34,7 +34,8 @@ _edje_part_recalc_single_textblock_min_max_calc_legacy(Edje_Real_Part *ep, int *minw, int *minh, int *maxw, int *maxh) { - Evas_Coord tw, th, ins_l, ins_r, ins_t, ins_b; + Eina_Size2D size; + Evas_Coord ins_l, ins_r, ins_t, ins_b; unsigned char minx2 = 0, miny2 = 0, maxx2 = 0, maxy2 = 0; minx2 = chosen_desc->text.min_x; @@ -57,18 +58,18 @@ _edje_part_recalc_single_textblock_min_max_calc_legacy(Edje_Real_Part *ep, { int mw = 0, mh = 0; - tw = th = 0; + size.w = size.h = 0; if (!minx2) { efl_gfx_entity_size_set(ep->object, EINA_SIZE2D(TO_INT(params->eval.w), TO_INT(params->eval.h))); - efl_canvas_text_size_formatted_get(ep->object, &tw, &th); + size = efl_canvas_text_size_formatted_get(ep->object); } else - evas_object_textblock_size_native_get(ep->object, &tw, &th); + size = efl_canvas_text_size_native_get(ep->object); evas_object_textblock_style_insets_get(ep->object, &ins_l, &ins_r, &ins_t, &ins_b); - mw = ins_l + tw + ins_r; - mh = ins_t + th + ins_b; + mw = ins_l + size.w + ins_r; + mh = ins_t + size.h + ins_b; if (minw && minx2) { if (mw > *minw) *minw = mw; @@ -83,18 +84,18 @@ _edje_part_recalc_single_textblock_min_max_calc_legacy(Edje_Real_Part *ep, { int mw = 0, mh = 0; - tw = th = 0; + size.w = size.h = 0; if (!maxx2) { efl_gfx_entity_size_set(ep->object, EINA_SIZE2D(TO_INT(params->eval.w), TO_INT(params->eval.h))); - efl_canvas_text_size_formatted_get(ep->object, &tw, &th); + size = efl_canvas_text_size_formatted_get(ep->object); } else - evas_object_textblock_size_native_get(ep->object, &tw, &th); + size = efl_canvas_text_size_native_get(ep->object); evas_object_textblock_style_insets_get(ep->object, &ins_l, &ins_r, &ins_t, &ins_b); - mw = ins_l + tw + ins_r; - mh = ins_t + th + ins_b; + mw = ins_l + size.w + ins_r; + mh = ins_t + size.h + ins_b; if (maxw && maxx2) { if (mw > *maxw) *maxw = mw; @@ -115,6 +116,7 @@ _edje_part_recalc_single_textblock_min_max_calc(Edje_Real_Part *ep, int *minw, int *minh, int *maxw, int *maxh) { + Eina_Size2D size; Evas_Coord tw, th, ins_l, ins_r, ins_t, ins_b; Evas_Coord min_calc_w = 0, min_calc_h = 0; @@ -178,14 +180,17 @@ _edje_part_recalc_single_textblock_min_max_calc(Edje_Real_Part *ep, if (temp_w > 0) { efl_gfx_entity_size_set(ep->object, EINA_SIZE2D(temp_w, temp_h)); - efl_canvas_text_size_formatted_get(ep->object, &tw, &th); + size = efl_canvas_text_size_formatted_get(ep->object); + tw = size.w; + th = size.h; tw += ins_l + ins_r; th += ins_t + ins_b; } else { - efl_canvas_text_size_native_get(ep->object, NULL, &th); + size = efl_canvas_text_size_native_get(ep->object); + th = size.h; th += ins_t + ins_b; } @@ -216,7 +221,9 @@ _edje_part_recalc_single_textblock_min_max_calc(Edje_Real_Part *ep, } efl_gfx_entity_size_set(ep->object, EINA_SIZE2D(temp_w, temp_h)); - efl_canvas_text_size_formatted_get(ep->object, &tw, &th); + size = efl_canvas_text_size_formatted_get(ep->object); + tw = size.w; + th = size.h; tw += ins_l + ins_r; th += ins_t + ins_b; @@ -225,7 +232,8 @@ _edje_part_recalc_single_textblock_min_max_calc(Edje_Real_Part *ep, * don't get meaningless height for multiline */ if (temp_w <= 0) { - efl_canvas_text_size_native_get(ep->object, NULL, &th); + size = efl_canvas_text_size_native_get(ep->object); + th = size.h; th += ins_t + ins_b; } @@ -238,7 +246,9 @@ _edje_part_recalc_single_textblock_min_max_calc(Edje_Real_Part *ep, * text.min: 1 X * text.max: 0 X without max width. * It is a singleline Textblock. */ - efl_canvas_text_size_native_get(ep->object, &tw, &th); + size = efl_canvas_text_size_native_get(ep->object); + tw = size.w; + th = size.h; tw += ins_l + ins_r; th += ins_t + ins_b; @@ -301,14 +311,17 @@ _edje_part_recalc_single_textblock_min_max_calc(Edje_Real_Part *ep, if (temp_w > 0) { efl_gfx_entity_size_set(ep->object, EINA_SIZE2D(temp_w, temp_h)); - efl_canvas_text_size_formatted_get(ep->object, &tw, &th); + size = efl_canvas_text_size_formatted_get(ep->object); + tw = size.w; + th = size.h; tw += ins_l + ins_r; th += ins_t + ins_b; } else { - efl_canvas_text_size_native_get(ep->object, NULL, &th); + size = efl_canvas_text_size_native_get(ep->object); + th = size.h; th += ins_t + ins_b; } @@ -322,7 +335,9 @@ _edje_part_recalc_single_textblock_min_max_calc(Edje_Real_Part *ep, /* text.min: 1 X * text.max: 1 X * Singleline. */ - efl_canvas_text_size_native_get(ep->object, &tw, &th); + size = efl_canvas_text_size_native_get(ep->object); + tw = size.w; + th = size.h; tw += ins_l + ins_r; th += ins_t + ins_b; @@ -359,7 +374,9 @@ _edje_part_recalc_single_textblock_min_max_calc(Edje_Real_Part *ep, * text.max: 1 1 */ efl_gfx_entity_size_set(ep->object, EINA_SIZE2D(temp_w, temp_h)); - efl_canvas_text_size_formatted_get(ep->object, &tw, &th); + size = efl_canvas_text_size_formatted_get(ep->object); + tw = size.w; + th = size.h; tw += ins_l + ins_r; th += ins_t + ins_b; @@ -368,7 +385,8 @@ _edje_part_recalc_single_textblock_min_max_calc(Edje_Real_Part *ep, * don't get meaningless height for multiline */ if (temp_w <= 0) { - efl_canvas_text_size_native_get(ep->object, NULL, &th); + size = efl_canvas_text_size_native_get(ep->object); + th = size.h; th += ins_t + ins_b; } @@ -386,7 +404,9 @@ _edje_part_recalc_single_textblock_min_max_calc(Edje_Real_Part *ep, temp_h = efl_gfx_entity_size_get(ep->object).h; efl_gfx_entity_size_set(ep->object, EINA_SIZE2D(temp_w, temp_h)); - efl_canvas_text_size_formatted_get(ep->object, &tw, &th); + size = efl_canvas_text_size_formatted_get(ep->object); + tw = size.w; + th = size.h; tw += ins_l + ins_r; th += ins_t + ins_b; @@ -395,7 +415,8 @@ _edje_part_recalc_single_textblock_min_max_calc(Edje_Real_Part *ep, * don't get meaningless height for multiline */ if (temp_w <= 0) { - efl_canvas_text_size_native_get(ep->object, NULL, &th); + size = efl_canvas_text_size_native_get(ep->object); + th = size.h; th += ins_t + ins_b; } @@ -429,9 +450,7 @@ _edje_part_textblock_style_text_set(Edje *ed, if (chosen_desc->text.id_source >= 0) { Edje_Part_Description_Text *et; - ep->typedata.text->source = ed->table_parts[chosen_desc->text.id_source % ed->table_parts_size]; - et = _edje_real_part_text_source_description_get(ep, NULL); tmp = edje_string_get(&et->text.style); if (tmp) style = tmp; @@ -509,7 +528,7 @@ _edje_part_recalc_single_textblock(FLOAT_T sc, if (chosen_desc) { - Evas_Coord tw, th; + Eina_Size2D size; if (ep->part->scale) evas_object_scale_set(ep->object, TO_DOUBLE(sc)); @@ -526,33 +545,33 @@ _edje_part_recalc_single_textblock(FLOAT_T sc, if (ep->part->scale) base_s = TO_DOUBLE(sc); efl_gfx_entity_scale_set(ep->object, base_s); - efl_canvas_text_size_native_get(ep->object, &tw, &th); + size = efl_canvas_text_size_native_get(ep->object); orig_s = base_s; /* Now make it bigger so calculations will be more accurate * and less influenced by hinting... */ { orig_s = _edje_part_recalc_single_textblock_scale_range_adjust(chosen_desc, base_s, - orig_s * TO_INT(params->eval.w) / tw); + orig_s * TO_INT(params->eval.w) / size.w); efl_gfx_entity_scale_set(ep->object, orig_s); - efl_canvas_text_size_native_get(ep->object, &tw, &th); + size = efl_canvas_text_size_native_get(ep->object); } if (chosen_desc->text.fit_x) { - if (tw > 0) + if (size.w > 0) { s = _edje_part_recalc_single_textblock_scale_range_adjust(chosen_desc, base_s, - orig_s * TO_INT(params->eval.w) / tw); + orig_s * TO_INT(params->eval.w) / size.w); efl_gfx_entity_scale_set(ep->object, s); - efl_canvas_text_size_native_get(ep->object, NULL, NULL); + efl_canvas_text_size_native_get(ep->object); } } if (chosen_desc->text.fit_y) { - if (th > 0) + if (size.h > 0) { double tmp_s = _edje_part_recalc_single_textblock_scale_range_adjust(chosen_desc, base_s, - orig_s * TO_INT(params->eval.h) / th); + orig_s * TO_INT(params->eval.h) / size.h); /* If we already have X fit, restrict Y to be no bigger * than what we got with X. */ if (!((chosen_desc->text.fit_x) && (tmp_s > s))) @@ -561,7 +580,7 @@ _edje_part_recalc_single_textblock(FLOAT_T sc, } efl_gfx_entity_scale_set(ep->object, s); - efl_canvas_text_size_native_get(ep->object, NULL, NULL); + efl_canvas_text_size_native_get(ep->object); } } @@ -569,14 +588,14 @@ _edje_part_recalc_single_textblock(FLOAT_T sc, * actually end up being correct. */ { int i = 5; /* Tries before we give up. */ - Evas_Coord fw, fh; - efl_canvas_text_size_native_get(ep->object, &fw, &fh); + Eina_Size2D size; + size = efl_canvas_text_size_native_get(ep->object); /* If we are still too big, try reducing the size to * 95% each try. */ while ((i > 0) && - ((chosen_desc->text.fit_x && (fw > TO_INT(params->eval.w))) || - (chosen_desc->text.fit_y && (fh > TO_INT(params->eval.h))))) + ((chosen_desc->text.fit_x && (size.w > TO_INT(params->eval.w))) || + (chosen_desc->text.fit_y && (size.h > TO_INT(params->eval.h))))) { double tmp_s = _edje_part_recalc_single_textblock_scale_range_adjust(chosen_desc, base_s, s * 0.95); @@ -586,7 +605,7 @@ _edje_part_recalc_single_textblock(FLOAT_T sc, s = tmp_s; efl_gfx_entity_scale_set(ep->object, s); - efl_canvas_text_size_native_get(ep->object, &fw, &fh); + size = efl_canvas_text_size_native_get(ep->object); i--; } } diff --git a/src/lib/edje/efl_canvas_layout_part_invalid.eo b/src/lib/edje/efl_canvas_layout_part_invalid.eo index 62a1afcbe1..306b585b7b 100644 --- a/src/lib/edje/efl_canvas_layout_part_invalid.eo +++ b/src/lib/edje/efl_canvas_layout_part_invalid.eo @@ -1,7 +1,7 @@ class @beta Efl.Canvas.Layout_Part_Invalid extends Efl.Canvas.Layout_Part implements Efl.Content, Efl.Pack_Linear, Efl.Ui.Layout_Orientable_Readonly, Efl.Pack_Table, Efl.Text, - Efl.Text_Markup, Efl.Text_Markup_Interactive + Efl.Text_Markup { [[Common class for part proxy objects for @Efl.Canvas.Layout. @@ -29,20 +29,6 @@ class @beta Efl.Canvas.Layout_Part_Invalid extends Efl.Canvas.Layout_Part implem // Efl.Canvas.Layout_Part_Text Efl.Text.text { set; get; } Efl.Text_Markup.markup { get; set; } - Efl.Text_Markup_Interactive.cursor_markup_insert; - Efl.Text_Cursor.text_cursor { get; } - Efl.Text_Cursor.cursor_paragraph_first; - Efl.Text_Cursor.cursor_paragraph_last; - Efl.Text_Cursor.cursor_position { set; get; } - Efl.Text_Cursor.cursor_coord_set; - Efl.Text_Cursor.cursor_line_char_first; - Efl.Text_Cursor.cursor_line_char_last; - Efl.Text_Cursor.cursor_char_next; - Efl.Text_Cursor.cursor_char_prev; - Efl.Text_Cursor.cursor_line_jump_by; - Efl.Text_Cursor.cursor_copy; - Efl.Text_Cursor.cursor_content { get; } - Efl.Text_Cursor.cursor_geometry { get; } // Efl.Canvas.Layout_Part_Box Efl.Container.content_iterate; Efl.Container.content_count; diff --git a/src/lib/edje/efl_canvas_layout_part_text.eo b/src/lib/edje/efl_canvas_layout_part_text.eo index 95a484cc43..e1593addcf 100644 --- a/src/lib/edje/efl_canvas_layout_part_text.eo +++ b/src/lib/edje/efl_canvas_layout_part_text.eo @@ -11,7 +11,7 @@ enum @beta Efl.Canvas.Layout_Part_Text_Expand } class @beta Efl.Canvas.Layout_Part_Text extends Efl.Canvas.Layout_Part implements Efl.Text, -Efl.Text_Markup, Efl.Text_Markup_Interactive, Efl.Text_Format, Efl.Text_Font, Efl.Text_Style +Efl.Text_Markup, Efl.Text_Format, Efl.Text_Font, Efl.Text_Style { [[Represents a TEXT part of a layout @@ -36,20 +36,6 @@ Efl.Text_Markup, Efl.Text_Markup_Interactive, Efl.Text_Format, Efl.Text_Font, Ef implements { Efl.Text.text { set; get; } Efl.Text_Markup.markup { get; set; } - Efl.Text_Markup_Interactive.cursor_markup_insert; - Efl.Text_Cursor.text_cursor { get; } - Efl.Text_Cursor.cursor_paragraph_first; - Efl.Text_Cursor.cursor_paragraph_last; - Efl.Text_Cursor.cursor_position { set; get; } - Efl.Text_Cursor.cursor_coord_set; - Efl.Text_Cursor.cursor_line_char_first; - Efl.Text_Cursor.cursor_line_char_last; - Efl.Text_Cursor.cursor_char_next; - Efl.Text_Cursor.cursor_char_prev; - Efl.Text_Cursor.cursor_line_jump_by; - Efl.Text_Cursor.cursor_copy; - Efl.Text_Cursor.cursor_content { get; } - Efl.Text_Cursor.cursor_geometry { get; } Efl.Text_Format.ellipsis { set; get; } Efl.Text_Format.wrap { set; get; } Efl.Text_Font.font { set; get; } diff --git a/src/lib/efl/Efl.h b/src/lib/efl/Efl.h index bcdaef98b8..c78d105c5b 100644 --- a/src/lib/efl/Efl.h +++ b/src/lib/efl/Efl.h @@ -68,7 +68,8 @@ extern "C" { */ typedef struct tm Efl_Time; -typedef struct _Efl_Text_Cursor_Cursor Efl_Text_Cursor_Cursor; +typedef struct _Efl_Text_Cursor_Handle Efl_Text_Cursor_Handle; +typedef struct _Efl_Text_Cursor_Handle _Efl_Text_Cursor_Handle; typedef struct _Efl_Text_Annotate_Annotation Efl_Text_Annotate_Annotation; #include "interfaces/efl_types.eot.h" @@ -210,10 +211,8 @@ typedef Efl_Gfx_Path_Command_Type Efl_Gfx_Path_Command; #include "interfaces/efl_text_font.eo.h" #include "interfaces/efl_text_style.eo.h" #include "interfaces/efl_text_format.eo.h" -#include "interfaces/efl_text_cursor.eo.h" #include "interfaces/efl_text_annotate.eo.h" #include "interfaces/efl_text_markup.eo.h" -#include "interfaces/efl_text_markup_interactive.eo.h" #include "interfaces/efl_text_markup_util.eo.h" #ifdef EFL_BETA_API_SUPPORT diff --git a/src/lib/efl/interfaces/efl_interfaces_main.c b/src/lib/efl/interfaces/efl_interfaces_main.c index f1bff04ff5..71162b94fe 100644 --- a/src/lib/efl/interfaces/efl_interfaces_main.c +++ b/src/lib/efl/interfaces/efl_interfaces_main.c @@ -24,10 +24,8 @@ #include "interfaces/efl_text_font.eo.c" #include "interfaces/efl_text_style.eo.c" #include "interfaces/efl_text_format.eo.c" -#include "interfaces/efl_text_cursor.eo.c" #include "interfaces/efl_text_annotate.eo.c" #include "interfaces/efl_text_markup.eo.c" -#include "interfaces/efl_text_markup_interactive.eo.c" #include "interfaces/efl_gfx_entity.eo.c" #include "interfaces/efl_gfx_buffer.eo.c" diff --git a/src/lib/efl/interfaces/efl_text_annotate.eo b/src/lib/efl/interfaces/efl_text_annotate.eo index 1226628683..5ca1df8eb8 100644 --- a/src/lib/efl/interfaces/efl_text_annotate.eo +++ b/src/lib/efl/interfaces/efl_text_annotate.eo @@ -30,8 +30,8 @@ interface @beta Efl.Text_Annotate { [[Returns an iterator of all the handles in a range. ]] params { - @in start: ptr(const(Efl.Text_Cursor_Cursor)); [[Start of range]] - @in end: ptr(const(Efl.Text_Cursor_Cursor)); [[End of range]] + @in start: ptr(const(Efl.Text_Cursor_Handle)); [[Start of range]] + @in end: ptr(const(Efl.Text_Cursor_Handle)); [[End of range]] } return: iterator @move; [[Handle of the Annotation]] } @@ -42,8 +42,8 @@ interface @beta Efl.Text_Annotate { handle will be returned for further handling. ]] params { - @in start: ptr(Efl.Text_Cursor_Cursor); [[Start of range]] - @in end: ptr(Efl.Text_Cursor_Cursor); [[End of range]] + @in start: ptr(Efl.Text_Cursor_Handle); [[Start of range]] + @in end: ptr(Efl.Text_Cursor_Handle); [[End of range]] @in format: string; [[Annotation format]] } return: ptr(Efl.Text_Annotate_Annotation); [[Handle of inserted annotation]] @@ -69,9 +69,9 @@ interface @beta Efl.Text_Annotate { params { @in annotation: ptr(const(Efl.Text_Annotate_Annotation)); [[Annotation handle to query]] - @in start: ptr(Efl.Text_Cursor_Cursor); [[Cursor to be set to the start + @in start: ptr(Efl.Text_Cursor_Handle); [[Cursor to be set to the start position of the annotation in the text]] - @in end: ptr(Efl.Text_Cursor_Cursor); [[Cursor to be set to the end + @in end: ptr(Efl.Text_Cursor_Handle); [[Cursor to be set to the end position of the annotation in the text]] } } @@ -111,7 +111,7 @@ interface @beta Efl.Text_Annotate { annotation: ptr(Efl.Text_Annotate_Annotation); [[Annotation]] } keys { - cur: ptr(Efl.Text_Cursor_Cursor); [[Cursor object]] + cur: ptr(Efl.Text_Cursor_Handle); [[Cursor object]] } } cursor_item_insert { @@ -122,7 +122,7 @@ interface @beta Efl.Text_Annotate { OBJECT REPLACEMENT CHARACTER and set a special annotation to it. ]] params { - cur: ptr(Efl.Text_Cursor_Cursor); [[Cursor object]] + cur: ptr(Efl.Text_Cursor_Handle); [[Cursor object]] @in item: string; [[Item key to be used in higher-up code to query and decided what image, emoticon etc. to embed.]] diff --git a/src/lib/efl/interfaces/efl_text_cursor.eo b/src/lib/efl/interfaces/efl_text_cursor.eo deleted file mode 100644 index cef645a173..0000000000 --- a/src/lib/efl/interfaces/efl_text_cursor.eo +++ /dev/null @@ -1,246 +0,0 @@ -import eina_types; -import efl_text_types; - -enum @beta Efl.Text_Cursor_Get_Type { - [[All available cursor states]] - default = 0, [[Main cursor state (alias to "main")]] - main, [[Main cursor state]] - selection_begin, [[Selection begin cursor state]] - selection_end, [[Selection end cursor state]] - preedit_start, [[Pre-edit start cursor state]] - preedit_end, [[Pre-edit end cursor state]] - user, [[User cursor state]] - user_extra [[User extra cursor state]] -} - -enum @beta Efl.Text_Cursor_Type -{ - [[Text cursor types]] - before, [[Cursor type before]] - under [[Cursor type under]] -} - -interface @beta Efl.Text_Cursor { - [[Cursor API - ]] - methods { - // Cursor - @property text_cursor { - [[The object's main cursor. - ]] - get { - return: ptr(Efl.Text_Cursor_Cursor); [[Text cursor object]] - } - keys { - get_type: Efl.Text_Cursor_Get_Type; [[Cursor type]] - } - } - @property cursor_position { - [[Cursor position]] - set { } - get { } - values { - position: int; [[Cursor position]] - } - keys { - cur: ptr(Efl.Text_Cursor_Cursor); [[Cursor object]] - } - } - @property cursor_content { - [[The content of the cursor (the character under the cursor)]] - get { - } - values { - content: Eina.Unicode; [[The unicode codepoint of the character]] - } - keys { - cur: ptr(const(Efl.Text_Cursor_Cursor)); [[Cursor object]] - } - } - @property cursor_geometry { - [[Returns the geometry of two cursors ("split cursor"), if logical cursor is - between LTR/RTL text, also considering paragraph direction. - Upper cursor is shown for the text of the same direction as paragraph, - lower cursor - for opposite. - - Split cursor geometry is valid only in '|' cursor mode. - In this case $true is returned and $cx2, $cy2, $cw2, $ch2 are set. - ]] - get { - return: bool; [[ $true if split cursor, $false otherwise.]] - } - keys { - cur: ptr(const(Efl.Text_Cursor_Cursor)); [[Cursor object]] - ctype: Efl.Text_Cursor_Type; [[The type of the cursor.]] - } - values { - cx: int; [[The x of the cursor (or upper cursor)]] - cy: int; [[The y of the cursor (or upper cursor)]] - cw: int; [[The width of the cursor (or upper cursor)]] - ch: int; [[The height of the cursor (or upper cursor)]] - cx2: int; [[The x of the lower cursor]] - cy2: int; [[The y of the lower cursor]] - cw2: int; [[The width of the lower cursor]] - ch2: int; [[The height of the lower cursor]] - } - } - cursor_new { - [[Create new cursor]] - return: ptr(Efl.Text_Cursor_Cursor); [[Cursor object]] - } - cursor_free { - [[Free existing cursor]] - params { - cur: ptr(Efl.Text_Cursor_Cursor); [[Cursor object]] - } - } - cursor_equal { - [[Check if two cursors are equal]] - params { - @in cur1: ptr(const(Efl.Text_Cursor_Cursor)); [[Cursor 1 object]] - @in cur2: ptr(const(Efl.Text_Cursor_Cursor)); [[Cursor 2 object]] - } - return: bool; [[$true if cursors are equal, $false otherwise]] - } - cursor_compare { - [[Compare two cursors]] - params { - @in cur1: ptr(const(Efl.Text_Cursor_Cursor)); [[Cursor 1 object]] - @in cur2: ptr(const(Efl.Text_Cursor_Cursor)); [[Cursor 2 object]] - } - return: int; [[Difference between cursors]] - } - cursor_copy { - [[Copy existing cursor]] - params { - /* @out */ dst: ptr(Efl.Text_Cursor_Cursor); [[Destination cursor]] - @in src: ptr(const(Efl.Text_Cursor_Cursor)); [[Source cursor]] - } - } - cursor_char_next { - [[Advances to the next character]] - params { - /* @inout */ cur: ptr(Efl.Text_Cursor_Cursor); [[Cursor object]] - } - } - cursor_char_prev { - [[Advances to the previous character]] - params { - /* @inout */ cur: ptr(Efl.Text_Cursor_Cursor); [[Cursor object]] - } - } - cursor_cluster_next { - [[Advances to the next grapheme cluster]] - params { - /* @inout */ cur: ptr(Efl.Text_Cursor_Cursor); [[Cursor object]] - } - } - cursor_cluster_prev { - [[Advances to the previous grapheme cluster]] - params { - /* @inout */ cur: ptr(Efl.Text_Cursor_Cursor); [[Cursor object]] - } - } - cursor_paragraph_char_first { - [[Advances to the first character in this paragraph]] - params { - /* @inout */ cur: ptr(Efl.Text_Cursor_Cursor); [[Cursor object]] - } - } - cursor_paragraph_char_last { - [[Advances to the last character in this paragraph]] - params { - /* @inout */ cur: ptr(Efl.Text_Cursor_Cursor); [[Cursor object]] - } - } - cursor_word_start { - [[Advance to current word start]] - params { - /* @inout */ cur: ptr(Efl.Text_Cursor_Cursor); [[Cursor object]] - } - } - cursor_word_end { - [[Advance to current word end]] - params { - /* @inout */ cur: ptr(Efl.Text_Cursor_Cursor); [[Cursor object]] - } - } - cursor_line_char_first { - [[Advance to current line first character]] - params { - /* @inout */ cur: ptr(Efl.Text_Cursor_Cursor); [[Cursor object]] - } - } - cursor_line_char_last { - [[Advance to current line last character]] - params { - /* @inout */ cur: ptr(Efl.Text_Cursor_Cursor); [[Cursor object]] - } - } - cursor_paragraph_first { - [[Advance to current paragraph first character]] - params { - /* @inout */ cur: ptr(Efl.Text_Cursor_Cursor); [[Cursor object]] - } - } - cursor_paragraph_last { - [[Advance to current paragraph last character]] - params { - /* @inout */ cur: ptr(Efl.Text_Cursor_Cursor); [[Cursor object]] - } - } - cursor_paragraph_next { - [[Advances to the start of the next text node]] - params { - /* @inout */ cur: ptr(Efl.Text_Cursor_Cursor); [[Cursor object]] - } - } - cursor_paragraph_prev { - [[Advances to the end of the previous text node]] - params { - /* @inout */ cur: ptr(Efl.Text_Cursor_Cursor); [[Cursor object]] - } - } - cursor_line_jump_by { - [[Jump the cursor by the given number of lines]] - params { - /* @inout */ cur: ptr(Efl.Text_Cursor_Cursor); [[Cursor object]] - by: int; [[Number of lines]] - } - } - cursor_coord_set { - [[Set cursor coordinates]] - params { - /* @inout */ cur: ptr(Efl.Text_Cursor_Cursor); [[Cursor object]] - @in x: int; [[X coord to set by.]] - @in y: int; [[Y coord to set by.]] - } - } - cursor_cluster_coord_set { - [[Set cursor coordinates according to grapheme clusters. - It does not allow to put a cursor to the middle of a grapheme cluster. - ]] - params { - /* @inout */ cur: ptr(Efl.Text_Cursor_Cursor); [[Cursor object]] - @in x: int; [[X coord to set by.]] - @in y: int; [[Y coord to set by.]] - } - } - cursor_text_insert { - [[Adds text to the current cursor position and set the cursor to - *after* the start of the text just added. - ]] - params { - /* @inout */ cur: ptr(Efl.Text_Cursor_Cursor); [[Cursor object]] - @in text: string; [[Text to append (UTF-8 format).]] - } - return: int; [[Length of the appended text.]] - } - cursor_char_delete { - [[Deletes a single character from position pointed by given cursor.]] - params { - /* @inout */ cur: ptr(Efl.Text_Cursor_Cursor); [[Cursor object]] - } - } - } -} diff --git a/src/lib/efl/interfaces/efl_text_markup_interactive.eo b/src/lib/efl/interfaces/efl_text_markup_interactive.eo deleted file mode 100644 index 7b2da3a2fe..0000000000 --- a/src/lib/efl/interfaces/efl_text_markup_interactive.eo +++ /dev/null @@ -1,25 +0,0 @@ -interface @beta Efl.Text_Markup_Interactive extends Efl.Text_Cursor { - [[Markup data that populates the text object's style and format - ]] - methods { - @property markup_range { - [[Markup of a given range in the text]] - values { - markup: mstring @move; [[The markup-text representation set to - this text of a given range]] - } - keys { - start: ptr(Efl.Text_Cursor_Cursor); [[Start of the markup region]] - end: ptr(Efl.Text_Cursor_Cursor); [[End of markup region]] - } - } - cursor_markup_insert { - [[Inserts a markup text to the text object in a given cursor position]] - params { - cur: ptr(Efl.Text_Cursor_Cursor); [[Cursor position to insert markup]] - @in markup: string; [[The markup text to insert]] - } - } - } -} - diff --git a/src/lib/efl/interfaces/efl_text_types.eot b/src/lib/efl/interfaces/efl_text_types.eot index b71272073e..d8d2ce3a52 100644 --- a/src/lib/efl/interfaces/efl_text_types.eot +++ b/src/lib/efl/interfaces/efl_text_types.eot @@ -24,5 +24,5 @@ struct @beta Efl.Ui.Text_Change_Info { type @extern @beta Efl.Text_Annotate_Annotation: __undefined_type; [[EFL text annotations data structure]] -type @extern @beta Efl.Text_Cursor_Cursor: __undefined_type; [[Text cursor data structure]] +type @extern @beta Efl.Text_Cursor_Handle: __undefined_type; [[Text cursor data structure]] diff --git a/src/lib/efl/interfaces/meson.build b/src/lib/efl/interfaces/meson.build index ccbab1c1bd..f45e743f94 100644 --- a/src/lib/efl/interfaces/meson.build +++ b/src/lib/efl/interfaces/meson.build @@ -44,10 +44,8 @@ pub_eo_files = [ 'efl_text_font.eo', 'efl_text_style.eo', 'efl_text_format.eo', - 'efl_text_cursor.eo', 'efl_text_annotate.eo', 'efl_text_markup.eo', - 'efl_text_markup_interactive.eo', 'efl_text_markup_util.eo', 'efl_gfx_stack.eo', 'efl_gfx_view.eo', diff --git a/src/lib/elementary/efl_text_interactive.eo b/src/lib/elementary/efl_text_interactive.eo index 4d8d96d832..d5c261f5a2 100644 --- a/src/lib/elementary/efl_text_interactive.eo +++ b/src/lib/elementary/efl_text_interactive.eo @@ -5,6 +5,13 @@ interface @beta Efl.Text_Interactive extends Efl.Text, Efl.Text_Font, { [[This is an interface interactive text inputs should implement]] methods { + @property main_cursor { + [[The user visible cursor.]] + get {} + values { + cursor: Efl.Text.Cursor; [[The user visible cursor.]] + } + } @property selection_allowed { [[Whether or not selection is allowed on this object]] set {} @@ -24,8 +31,8 @@ interface @beta Efl.Text_Interactive extends Efl.Text, Efl.Text_Font, ]] get {} values { - start: ptr(Efl.Text_Cursor_Cursor); [[The start of the selection]] - end: ptr(Efl.Text_Cursor_Cursor); [[The end of the selection]] + start: Efl.Text.Cursor; [[The start of the selection]] + end: Efl.Text.Cursor; [[The end of the selection]] } } @property editable { diff --git a/src/lib/elementary/efl_ui_internal_text_interactive.c b/src/lib/elementary/efl_ui_internal_text_interactive.c index f66f3b7656..51c66b5cbb 100644 --- a/src/lib/elementary/efl_ui_internal_text_interactive.c +++ b/src/lib/elementary/efl_ui_internal_text_interactive.c @@ -12,8 +12,9 @@ typedef struct _Efl_Ui_Internal_Text_Interactive_Data { - Evas_Textblock_Cursor *sel_start, *sel_end; - Evas_Textblock_Cursor *preedit_start, *preedit_end; + Efl_Text_Cursor *sel_start, *sel_end; + Efl_Text_Cursor *main_cursor; + Efl_Text_Cursor *preedit_start, *preedit_end; Eina_List *seq; char *selection; Eina_Bool composing : 1; @@ -34,12 +35,12 @@ typedef struct _Efl_Ui_Internal_Text_Interactive_Data } Efl_Ui_Internal_Text_Interactive_Data; static void _sel_range_del_emit(Evas_Object *obj, Efl_Ui_Internal_Text_Interactive_Data *en); -static void _sel_init(Evas_Textblock_Cursor *c, Evas_Object *o, Efl_Ui_Internal_Text_Interactive_Data *en); -static void _sel_enable(Evas_Textblock_Cursor *c EINA_UNUSED, Evas_Object *o EINA_UNUSED, Efl_Ui_Internal_Text_Interactive_Data *en); -static void _sel_extend(Evas_Textblock_Cursor *c, Evas_Object *o, Efl_Ui_Internal_Text_Interactive_Data *en); +static void _sel_init(Efl_Text_Cursor *c, Evas_Object *o, Efl_Ui_Internal_Text_Interactive_Data *en); +static void _sel_enable(Efl_Text_Cursor *c EINA_UNUSED, Evas_Object *o EINA_UNUSED, Efl_Ui_Internal_Text_Interactive_Data *en); +static void _sel_extend(Efl_Text_Cursor *c, Evas_Object *o, Efl_Ui_Internal_Text_Interactive_Data *en); static void _sel_clear(Evas_Object *o EINA_UNUSED, Efl_Ui_Internal_Text_Interactive_Data *en); static const char *_entry_selection_get(Efl_Ui_Internal_Text_Interactive *obj, Efl_Ui_Internal_Text_Interactive_Data *en); -static void _entry_imf_cursor_info_set(Eo *obj, Evas_Textblock_Cursor *cur, Efl_Ui_Internal_Text_Interactive_Data *en); +static void _entry_imf_cursor_info_set(Eo *obj, Efl_Text_Cursor *cur, Efl_Ui_Internal_Text_Interactive_Data *en); #ifdef HAVE_ECORE_IMF static void @@ -47,13 +48,13 @@ _preedit_clear(Efl_Ui_Internal_Text_Interactive_Data *en) { if (en->preedit_start) { - evas_textblock_cursor_free(en->preedit_start); + efl_del(en->preedit_start); en->preedit_start = NULL; } if (en->preedit_end) { - evas_textblock_cursor_free(en->preedit_end); + efl_del(en->preedit_end); en->preedit_end = NULL; } @@ -61,21 +62,21 @@ _preedit_clear(Efl_Ui_Internal_Text_Interactive_Data *en) } static void -_preedit_del(Eo *obj, Efl_Ui_Internal_Text_Interactive_Data *en) +_preedit_del(Eo *obj EINA_UNUSED, Efl_Ui_Internal_Text_Interactive_Data *en) { if (!en || !en->have_preedit) return; if (!en->preedit_start || !en->preedit_end) return; - if (efl_text_cursor_equal(obj, en->preedit_start, en->preedit_end)) return; + if (efl_text_cursor_equal(en->preedit_start, en->preedit_end)) return; /* delete the preedit characters */ - evas_textblock_cursor_range_delete(en->preedit_start, en->preedit_end); + efl_text_cursor_range_delete(en->preedit_start, en->preedit_end); } static Eina_Bool _entry_imf_retrieve_surrounding_cb(void *data, Ecore_IMF_Context *ctx EINA_UNUSED, char **text, int *cursor_pos) { Efl_Canvas_Text *obj = data; - Efl_Text_Cursor_Cursor *cur = efl_text_cursor_get(obj, EFL_TEXT_CURSOR_GET_TYPE_MAIN); + Efl_Text_Cursor *cur = efl_text_interactive_main_cursor_get(obj); const char *str; if (text) @@ -92,7 +93,7 @@ _entry_imf_retrieve_surrounding_cb(void *data, Ecore_IMF_Context *ctx EINA_UNUSE if (cursor_pos) { if (cur) - *cursor_pos = evas_textblock_cursor_pos_get(cur); + *cursor_pos = efl_text_cursor_position_get(cur); else *cursor_pos = 0; } @@ -177,7 +178,7 @@ static void _entry_imf_event_preedit_changed_cb(void *data, Ecore_IMF_Context *ctx EINA_UNUSED, void *event_info EINA_UNUSED) { Efl_Canvas_Text *obj = data; - Efl_Text_Cursor_Cursor *cur = efl_text_cursor_get(obj, EFL_TEXT_CURSOR_GET_TYPE_MAIN); + Efl_Text_Cursor *cur = efl_text_interactive_main_cursor_get(obj); Efl_Ui_Internal_Text_Interactive_Data *en = efl_data_scope_get(obj, MY_CLASS); int cursor_pos; int preedit_start_pos, preedit_end_pos; @@ -215,7 +216,7 @@ _entry_imf_event_preedit_changed_cb(void *data, Ecore_IMF_Context *ctx EINA_UNUS /* delete preedit characters */ _preedit_del(obj, en); - preedit_start_pos = evas_textblock_cursor_pos_get(cur); + preedit_start_pos = efl_text_cursor_position_get(cur); /* insert preedit character(s) */ if (strlen(preedit_string) > 0) @@ -293,25 +294,25 @@ _entry_imf_event_preedit_changed_cb(void *data, Ecore_IMF_Context *ctx EINA_UNUS { /* set preedit start cursor */ if (!en->preedit_start) - en->preedit_start = evas_object_textblock_cursor_new(obj); - evas_textblock_cursor_copy(cur, en->preedit_start); + en->preedit_start = efl_canvas_text_cursor_create(obj); + efl_text_cursor_copy(cur, en->preedit_start); /* set preedit end cursor */ if (!en->preedit_end) - en->preedit_end = evas_object_textblock_cursor_new(obj); - evas_textblock_cursor_copy(cur, en->preedit_end); + en->preedit_end = efl_canvas_text_cursor_create(obj); + efl_text_cursor_copy(cur, en->preedit_end); - preedit_end_pos = evas_textblock_cursor_pos_get(cur); + preedit_end_pos = efl_text_cursor_position_get(cur); for (i = 0; i < (preedit_end_pos - preedit_start_pos); i++) { - evas_textblock_cursor_char_prev(en->preedit_start); + efl_text_cursor_move(en->preedit_start, EFL_TEXT_CURSOR_MOVE_TYPE_CHAR_PREV); } en->have_preedit = EINA_TRUE; /* set cursor position */ - evas_textblock_cursor_pos_set(cur, preedit_start_pos + cursor_pos); + efl_text_cursor_position_set(cur, preedit_start_pos + cursor_pos); } _entry_imf_cursor_info_set(obj, cur, en); @@ -330,35 +331,35 @@ static void _entry_imf_event_delete_surrounding_cb(void *data, Ecore_IMF_Context *ctx EINA_UNUSED, void *event_info) { Efl_Canvas_Text *obj = data; - Efl_Text_Cursor_Cursor *cur = efl_text_cursor_get(obj, EFL_TEXT_CURSOR_GET_TYPE_MAIN); + Efl_Text_Cursor *cur = efl_text_interactive_main_cursor_get(obj); Efl_Ui_Internal_Text_Interactive_Data *en = efl_data_scope_get(obj, MY_CLASS); Ecore_IMF_Event_Delete_Surrounding *ev = event_info; - Evas_Textblock_Cursor *del_start, *del_end; + Efl_Text_Cursor *del_start, *del_end; Efl_Ui_Text_Change_Info info = { NULL, 0, 0, 0, 0 }; int cursor_pos; int start, end; char *tmp; - cursor_pos = evas_textblock_cursor_pos_get(cur); + cursor_pos = efl_text_cursor_position_get(cur); - del_start = evas_object_textblock_cursor_new(obj); - evas_textblock_cursor_pos_set(del_start, cursor_pos + ev->offset); + del_start = efl_canvas_text_cursor_create(obj); + efl_text_cursor_position_set(del_start, cursor_pos + ev->offset); - del_end = evas_object_textblock_cursor_new(obj); - evas_textblock_cursor_pos_set(del_end, cursor_pos + ev->offset + ev->n_chars); + del_end = efl_canvas_text_cursor_create(obj); + efl_text_cursor_position_set(del_end, cursor_pos + ev->offset + ev->n_chars); - start = evas_textblock_cursor_pos_get(del_start); - end = evas_textblock_cursor_pos_get(del_end); + start = efl_text_cursor_position_get(del_start); + end = efl_text_cursor_position_get(del_end); if (start == end) goto end; - tmp = efl_canvas_text_range_text_get(obj, del_start, del_end); + tmp = efl_text_cursor_range_text_get(del_start, del_end); info.insert = EINA_FALSE; info.position = start; info.length = end - start; info.content = tmp; - evas_textblock_cursor_range_delete(del_start, del_end); + efl_text_cursor_range_delete(del_start, del_end); efl_event_callback_call(obj, EFL_UI_TEXT_EVENT_CHANGED_USER, &info); free(tmp); @@ -366,29 +367,29 @@ _entry_imf_event_delete_surrounding_cb(void *data, Ecore_IMF_Context *ctx EINA_U _entry_imf_cursor_info_set(obj, cur, en); end: - evas_textblock_cursor_free(del_start); - evas_textblock_cursor_free(del_end); + efl_del(del_start); + efl_del(del_end); } static void _entry_imf_event_selection_set_cb(void *data, Ecore_IMF_Context *ctx EINA_UNUSED, void *event_info) { Efl_Canvas_Text *obj = data; - Efl_Text_Cursor_Cursor *cur = efl_text_cursor_get(obj, EFL_TEXT_CURSOR_GET_TYPE_MAIN); + Efl_Text_Cursor *cur = efl_text_interactive_main_cursor_get(obj); Efl_Ui_Internal_Text_Interactive_Data *en = efl_data_scope_get(obj, MY_CLASS); Ecore_IMF_Event_Selection *ev = event_info; if (ev->start == ev->end) { - efl_text_cursor_position_set(obj, cur, ev->start); + efl_text_cursor_position_set(cur, ev->start); } else { _sel_clear(obj, en); - evas_textblock_cursor_pos_set(cur, ev->start); + efl_text_cursor_position_set(cur, ev->start); _sel_enable(cur, obj, en); _sel_init(cur, obj, en); - evas_textblock_cursor_pos_set(cur, ev->end); + efl_text_cursor_position_set(cur, ev->end); _sel_extend(cur, obj, en); } } @@ -416,14 +417,14 @@ _entry_imf_retrieve_selection_cb(void *data, Ecore_IMF_Context *ctx EINA_UNUSED, #endif static void -_entry_imf_cursor_location_set(Eo *obj, Efl_Text_Cursor_Cursor *cur, Efl_Ui_Internal_Text_Interactive_Data *en) +_entry_imf_cursor_location_set(Eo *obj EINA_UNUSED, Efl_Text_Cursor *cur, Efl_Ui_Internal_Text_Interactive_Data *en) { #ifdef HAVE_ECORE_IMF - Evas_Coord cx = 0, cy = 0, cw = 0, ch = 0; + Eina_Rect rect; if (!en->imf_context) return; - efl_text_cursor_geometry_get(obj, cur, EFL_TEXT_CURSOR_TYPE_BEFORE, &cx, &cy, &cw, &ch, NULL, NULL, NULL, NULL); - ecore_imf_context_cursor_location_set(en->imf_context, cx, cy, cw, ch); + rect = efl_text_cursor_geometry_get(cur, EFL_TEXT_CURSOR_TYPE_BEFORE); + ecore_imf_context_cursor_location_set(en->imf_context, rect.x, rect.y, rect.w, rect.h); // FIXME: ecore_imf_context_bidi_direction_set(en->imf_context, (Ecore_IMF_BiDi_Direction)dir); #else (void)en; @@ -431,7 +432,7 @@ _entry_imf_cursor_location_set(Eo *obj, Efl_Text_Cursor_Cursor *cur, Efl_Ui_Inte } static void -_entry_imf_cursor_info_set(Eo *obj, Evas_Textblock_Cursor *cur, Efl_Ui_Internal_Text_Interactive_Data *en) +_entry_imf_cursor_info_set(Eo *obj, Efl_Text_Cursor *cur, Efl_Ui_Internal_Text_Interactive_Data *en) { int cursor_pos; @@ -440,13 +441,13 @@ _entry_imf_cursor_info_set(Eo *obj, Evas_Textblock_Cursor *cur, Efl_Ui_Internal_ if (en->have_selection) { - if (evas_textblock_cursor_compare(en->sel_start, en->sel_end) < 0) - cursor_pos = evas_textblock_cursor_pos_get(en->sel_start); + if (efl_text_cursor_compare(en->sel_start, en->sel_end) < 0) + cursor_pos = efl_text_cursor_position_get(en->sel_start); else - cursor_pos = evas_textblock_cursor_pos_get(en->sel_end); + cursor_pos = efl_text_cursor_position_get(en->sel_end); } else - cursor_pos = evas_textblock_cursor_pos_get(cur); + cursor_pos = efl_text_cursor_position_get(cur); ecore_imf_context_cursor_position_set(en->imf_context, cursor_pos); @@ -461,11 +462,11 @@ _focus_in_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void { #ifdef HAVE_ECORE_IMF Efl_Ui_Internal_Text_Interactive_Data *en = efl_data_scope_get(obj, MY_CLASS); - Efl_Text_Cursor_Cursor *cur; + Efl_Text_Cursor *cur; if (!en->imf_context) return; - cur = efl_text_cursor_get(obj, EFL_TEXT_CURSOR_GET_TYPE_MAIN); + cur = efl_text_interactive_main_cursor_get(obj); ecore_imf_context_focus_in(en->imf_context); _entry_imf_cursor_info_set(obj, cur, en); #endif @@ -497,10 +498,10 @@ _focus_out_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, voi } static const char * -_entry_selection_get(Efl_Ui_Internal_Text_Interactive *obj, Efl_Ui_Internal_Text_Interactive_Data *en) +_entry_selection_get(Efl_Ui_Internal_Text_Interactive *obj EINA_UNUSED, Efl_Ui_Internal_Text_Interactive_Data *en) { if ((!en->selection) && (en->have_selection)) - en->selection = efl_canvas_text_range_text_get(obj, en->sel_start, en->sel_end); + en->selection = efl_text_cursor_range_text_get(en->sel_start, en->sel_end); return en->selection; } @@ -511,13 +512,13 @@ _sel_cursor_changed(void *data EINA_UNUSED, const Efl_Event *event EINA_UNUSED) } static void -_sel_init(Evas_Textblock_Cursor *c, Evas_Object *o EINA_UNUSED, Efl_Ui_Internal_Text_Interactive_Data *en) +_sel_init(Efl_Text_Cursor *c, Evas_Object *o EINA_UNUSED, Efl_Ui_Internal_Text_Interactive_Data *en) { if (en->have_selection) return; - evas_textblock_cursor_copy(c, en->sel_start); - evas_textblock_cursor_copy(c, en->sel_end); + efl_text_cursor_copy(c, en->sel_start); + efl_text_cursor_copy(c, en->sel_end); en->have_selection = EINA_FALSE; if (en->selection) @@ -528,7 +529,7 @@ _sel_init(Evas_Textblock_Cursor *c, Evas_Object *o EINA_UNUSED, Efl_Ui_Internal_ } static void -_sel_enable(Evas_Textblock_Cursor *c EINA_UNUSED, +_sel_enable(Efl_Text_Cursor *c EINA_UNUSED, Evas_Object *o EINA_UNUSED, Efl_Ui_Internal_Text_Interactive_Data *en) { if (en->have_selection) return; @@ -543,13 +544,13 @@ _sel_enable(Evas_Textblock_Cursor *c EINA_UNUSED, } static void -_sel_extend(Evas_Textblock_Cursor *c, Evas_Object *o, Efl_Ui_Internal_Text_Interactive_Data *en) +_sel_extend(Efl_Text_Cursor *c, Evas_Object *o, Efl_Ui_Internal_Text_Interactive_Data *en) { if (!en->sel_end) return; _sel_enable(c, o, en); - if (efl_text_cursor_equal(o, c, en->sel_end)) return; + if (efl_text_cursor_equal(c, en->sel_end)) return; - evas_textblock_cursor_copy(c, en->sel_end); + efl_text_cursor_copy(c, en->sel_end); _entry_imf_cursor_info_set(o, c, en); @@ -573,7 +574,7 @@ _sel_clear(Evas_Object *o EINA_UNUSED, Efl_Ui_Internal_Text_Interactive_Data *en if (en->have_selection) { en->have_selection = EINA_FALSE; - efl_text_cursor_copy(o, en->sel_start, en->sel_end); + efl_text_cursor_copy(en->sel_start, en->sel_end); efl_event_callback_call(o, EFL_TEXT_INTERACTIVE_EVENT_TEXT_SELECTION_CHANGED, NULL); } } @@ -586,14 +587,14 @@ _efl_ui_internal_text_interactive_efl_text_interactive_select_none( } static void -_range_del_emit(Evas_Object *obj, Efl_Text_Cursor_Cursor *cur1, Efl_Text_Cursor_Cursor *cur2) +_range_del_emit(Evas_Object *obj, Efl_Text_Cursor *cur1, Efl_Text_Cursor *cur2) { size_t start, end; char *tmp; Efl_Ui_Text_Change_Info info = { NULL, 0, 0, 0, 0 }; - start = evas_textblock_cursor_pos_get(cur1); - end = evas_textblock_cursor_pos_get(cur2); + start = efl_text_cursor_position_get(cur1); + end = efl_text_cursor_position_get(cur2); if (start == end) return; @@ -601,10 +602,10 @@ _range_del_emit(Evas_Object *obj, Efl_Text_Cursor_Cursor *cur1, Efl_Text_Cursor_ info.position = start; info.length = end - start; - tmp = efl_canvas_text_range_text_get(obj, cur1, cur2); + tmp = efl_text_cursor_range_text_get(cur1, cur2); info.content = tmp; - evas_textblock_cursor_range_delete(cur1, cur2); + efl_text_cursor_range_delete(cur1, cur2); efl_event_callback_call(obj, EFL_UI_TEXT_EVENT_CHANGED_USER, &info); efl_event_callback_call(obj, EFL_UI_TEXT_EVENT_CHANGED, NULL); @@ -619,11 +620,11 @@ _sel_range_del_emit(Evas_Object *obj, Efl_Ui_Internal_Text_Interactive_Data *en) } static void -_delete_emit(Eo *obj, Evas_Textblock_Cursor *c, Efl_Ui_Internal_Text_Interactive_Data *en EINA_UNUSED, size_t pos) +_delete_emit(Eo *obj, Efl_Text_Cursor *c, Efl_Ui_Internal_Text_Interactive_Data *en EINA_UNUSED, size_t pos) { Efl_Ui_Text_Change_Info info = { NULL, 0, 0, 0, 0 }; Eina_Unicode content[2]; - content[0] = efl_text_cursor_content_get(obj, c); + content[0] = efl_text_cursor_content_get(c); content[1] = 0; if (!content[0]) return; @@ -635,7 +636,7 @@ _delete_emit(Eo *obj, Evas_Textblock_Cursor *c, Efl_Ui_Internal_Text_Interactive info.length = 1; info.content = tmp; - evas_textblock_cursor_char_delete(c); + efl_text_cursor_char_delete(c); efl_event_callback_call(obj, EFL_UI_TEXT_EVENT_CHANGED_USER, &info); efl_event_callback_call(obj, EFL_UI_TEXT_EVENT_CHANGED, NULL); @@ -673,7 +674,7 @@ _compose_seq_reset(Efl_Ui_Internal_Text_Interactive_Data *en) * movement_forward: if the movement we are going to do is forward (towards the end of the textblock) */ static void -_key_down_sel_pre(Efl_Ui_Internal_Text_Interactive *obj, Efl_Text_Cursor_Cursor *cur, Efl_Ui_Internal_Text_Interactive_Data *en, Eina_Bool shift, Eina_Bool movement_forward) +_key_down_sel_pre(Efl_Ui_Internal_Text_Interactive *obj, Efl_Text_Cursor *cur, Efl_Ui_Internal_Text_Interactive_Data *en, Eina_Bool shift, Eina_Bool movement_forward) { if (en->select_allow) { @@ -683,18 +684,18 @@ _key_down_sel_pre(Efl_Ui_Internal_Text_Interactive *obj, Efl_Text_Cursor_Cursor } else if (en->have_selection) { - Eina_Bool sel_forward = evas_textblock_cursor_compare(en->sel_start, en->sel_end); + Eina_Bool sel_forward = efl_text_cursor_compare(en->sel_start, en->sel_end); if ((sel_forward && movement_forward) || (!sel_forward && !movement_forward)) - evas_textblock_cursor_copy(en->sel_end, cur); + efl_text_cursor_copy(en->sel_end, cur); else - evas_textblock_cursor_copy(en->sel_start, cur); + efl_text_cursor_copy(en->sel_start, cur); _sel_clear(obj, en); } } } static void -_key_down_sel_post(Efl_Ui_Internal_Text_Interactive *obj, Efl_Text_Cursor_Cursor *cur, Efl_Ui_Internal_Text_Interactive_Data *en, Eina_Bool shift) +_key_down_sel_post(Efl_Ui_Internal_Text_Interactive *obj, Efl_Text_Cursor *cur, Efl_Ui_Internal_Text_Interactive_Data *en, Eina_Bool shift) { if (en->select_allow) { @@ -707,7 +708,7 @@ static void _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void *event_info) { Evas_Event_Key_Down *ev = event_info; - Efl_Text_Cursor_Cursor *cur; + Efl_Text_Cursor *cur; Eina_Bool control, alt, shift; #if defined(__APPLE__) && defined(__MACH__) Eina_Bool super, altgr; @@ -727,8 +728,8 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void /* FIXME: Maybe allow selctions to happen even when not editable. */ if (!en->editable) return; - cur = efl_text_cursor_get(obj, EFL_TEXT_CURSOR_GET_TYPE_MAIN); - old_cur_pos = evas_textblock_cursor_pos_get(cur); + cur = efl_text_interactive_main_cursor_get(obj); + old_cur_pos = efl_text_cursor_position_get(cur); if (old_cur_pos < 0) return; control = evas_key_modifier_is_set(ev->modifiers, "Control"); @@ -752,7 +753,7 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void { if (multiline) { - if (shift || efl_canvas_text_legacy_newline_get(obj)) + if (shift || efl_canvas_text_newline_as_paragraph_separator_get(obj)) { string = "\n"; } @@ -779,7 +780,7 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void { _key_down_sel_pre(obj, cur, en, shift, EINA_FALSE); - efl_text_cursor_line_jump_by(obj, cur, -1); + efl_text_cursor_line_jump_by(cur, -1); ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; _key_down_sel_post(obj, cur, en, shift); @@ -793,7 +794,7 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void { _key_down_sel_pre(obj, cur, en, shift, EINA_TRUE); - efl_text_cursor_line_jump_by(obj, cur, 1); + efl_text_cursor_line_jump_by(cur, 1); ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; _key_down_sel_post(obj, cur, en, shift); @@ -805,12 +806,12 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void _compose_seq_reset(en); _key_down_sel_pre(obj, cur, en, shift, EINA_FALSE); - efl_text_cursor_char_prev(obj, cur); + efl_text_cursor_move(cur,EFL_TEXT_CURSOR_MOVE_TYPE_CHAR_PREV); #if defined(__APPLE__) && defined(__MACH__) - if (altgr) efl_text_cursor_word_start(obj, cur); + if (altgr) efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_WORD_START); #else /* If control is pressed, go to the start of the word */ - if (control) efl_text_cursor_word_start(obj, cur); + if (control) efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_WORD_START); #endif ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; @@ -823,12 +824,12 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void _key_down_sel_pre(obj, cur, en, shift, EINA_TRUE); #if defined(__APPLE__) && defined(__MACH__) - if (altgr) efl_text_cursor_word_end(obj, cur); + if (altgr) efl_text_cursor_word_end(cur); #else /* If control is pressed, go to the end of the word */ - if (control) efl_text_cursor_word_end(obj, cur); + if (control) efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_WORD_END); #endif - efl_text_cursor_char_next(obj, cur); + efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_CHAR_NEXT); ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; _key_down_sel_post(obj, cur, en, shift); @@ -839,16 +840,16 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void if (control && !en->have_selection) { // del to start of previous word - Evas_Textblock_Cursor *tc = evas_object_textblock_cursor_new(obj); + Efl_Text_Cursor *tc = efl_canvas_text_cursor_create(obj); - efl_text_cursor_copy(obj, tc, cur); - evas_textblock_cursor_char_prev(cur); - evas_textblock_cursor_word_start(cur); + efl_text_cursor_copy(tc, cur); + efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_CHAR_PREV); + efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_WORD_START); _range_del_emit(obj, cur, tc); //efl_del(tc); - efl_text_cursor_free(obj, tc); + efl_del(tc); } else if ((alt) && (shift)) { @@ -862,7 +863,7 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void } else { - if (evas_textblock_cursor_char_prev(cur)) + if (efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_CHAR_PREV)) { _delete_emit(obj, cur, en, old_cur_pos - 1); } @@ -878,16 +879,16 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void if (control) { // del to end of next word - Evas_Textblock_Cursor *tc = evas_object_textblock_cursor_new(obj); + Efl_Text_Cursor *tc = efl_canvas_text_cursor_create(obj); - efl_text_cursor_copy(obj, tc, cur); - evas_textblock_cursor_word_end(cur); - evas_textblock_cursor_char_next(cur); + efl_text_cursor_copy(tc, cur); + efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_WORD_END); + efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_CHAR_NEXT); _range_del_emit(obj, cur, tc); //efl_del(tc); - efl_text_cursor_free(obj, tc); + efl_del(tc); } else if (shift) { @@ -915,9 +916,9 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void _key_down_sel_pre(obj, cur, en, shift, EINA_FALSE); if ((control) && (multiline)) - efl_text_cursor_paragraph_first(obj, cur); + efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_PARAGRAPH_FIRST); else - efl_text_cursor_line_char_first(obj, cur); + efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_LINE_START); _key_down_sel_post(obj, cur, en, shift); ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; @@ -930,9 +931,9 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void _key_down_sel_pre(obj, cur, en, shift, EINA_TRUE); if ((control) && (multiline)) - efl_text_cursor_paragraph_last(obj, cur); + efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_PARAGRAPH_LAST); else - efl_text_cursor_line_char_last(obj, cur); + efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_LINE_END); _key_down_sel_post(obj, cur, en, shift); ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; @@ -957,7 +958,7 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void _compose_seq_reset(en); _key_down_sel_pre(obj, cur, en, shift, EINA_FALSE); - efl_text_cursor_line_jump_by(obj, cur, -10); + efl_text_cursor_line_jump_by(cur, -10); _key_down_sel_post(obj, cur, en, shift); ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; @@ -968,7 +969,7 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void _compose_seq_reset(en); _key_down_sel_pre(obj, cur, en, shift, EINA_TRUE); - efl_text_cursor_line_jump_by(obj, cur, 10); + efl_text_cursor_line_jump_by(cur, 10); _key_down_sel_post(obj, cur, en, shift); ev->event_flags |= EVAS_EVENT_FLAG_ON_HOLD; @@ -1046,11 +1047,11 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void } info.insert = EINA_TRUE; info.content = string; - info.position = efl_text_cursor_position_get(obj, cur); + info.position = efl_text_cursor_position_get(cur); info.length = eina_unicode_utf8_get_len(string); efl_event_freeze(obj); - efl_text_cursor_text_insert(obj, cur, string); + efl_text_cursor_text_insert(cur, string); efl_event_thaw(obj); changed_user = EINA_TRUE; @@ -1070,38 +1071,38 @@ end: } static void -_cursor_char_coord_set(Efl_Canvas_Text *obj, Efl_Text_Cursor_Cursor *cur, Evas_Coord canvasx, Evas_Coord canvasy, Evas_Coord *_cx, Evas_Coord *_cy) +_cursor_char_coord_set(Efl_Canvas_Text *obj, Efl_Text_Cursor *cur, Evas_Coord canvasx, Evas_Coord canvasy, Evas_Coord *_cx, Evas_Coord *_cy) { Evas_Coord cx, cy; Evas_Coord x, y, lh = 0, cly = 0; - Evas_Textblock_Cursor *line_cur; - Evas_Textblock_Cursor *tc; + Efl_Text_Cursor *line_cur; + Efl_Text_Cursor *tc; - tc = evas_object_textblock_cursor_new(obj); - evas_textblock_cursor_copy(cur, tc); + tc = efl_canvas_text_cursor_create(obj); + efl_text_cursor_copy(cur, tc); evas_object_geometry_get(obj, &x, &y, NULL, NULL); cx = canvasx - x; cy = canvasy - y; - line_cur = evas_object_textblock_cursor_new(obj); - evas_textblock_cursor_paragraph_last(line_cur); - evas_textblock_cursor_line_geometry_get(line_cur, NULL, &cly, NULL, &lh); + line_cur = efl_canvas_text_cursor_create(obj); + efl_text_cursor_move(line_cur, EFL_TEXT_CURSOR_MOVE_TYPE_PARAGRAPH_LAST); + evas_textblock_cursor_line_geometry_get(efl_text_cursor_handle_get(line_cur), NULL, &cly, NULL, &lh); /* Consider a threshold of half the line height */ if (cy > (cly + lh) && cy < (cly + lh + lh / 2)) { cy = cly + lh - 1; // Make it inside Textblock } - evas_textblock_cursor_paragraph_first(line_cur); - evas_textblock_cursor_line_geometry_get(line_cur, NULL, &cly, NULL, NULL); + efl_text_cursor_move(line_cur, EFL_TEXT_CURSOR_MOVE_TYPE_PARAGRAPH_FIRST); + evas_textblock_cursor_line_geometry_get(efl_text_cursor_handle_get(line_cur), NULL, &cly, NULL, NULL); if (cy < cly && cy > (cly - lh / 2)) { cy = cly; } - evas_textblock_cursor_free(line_cur); + efl_del(line_cur); /* No need to check return value if not able to set the char coord Textblock * will take care */ - evas_textblock_cursor_char_coord_set(cur, cx, cy); + efl_text_cursor_char_coord_set(cur, EINA_POSITION2D(cx, cy)); if (_cx) *_cx = cx; if (_cy) *_cy = cy; } @@ -1112,8 +1113,8 @@ _mouse_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EIN Evas_Coord cx, cy; Evas_Event_Mouse_Down *ev = event_info; Efl_Ui_Internal_Text_Interactive_Data *en = efl_data_scope_get(obj, MY_CLASS); - Efl_Text_Cursor_Cursor *cur = efl_text_cursor_get(obj, EFL_TEXT_CURSOR_GET_TYPE_MAIN); - Evas_Textblock_Cursor *tc = NULL; + Efl_Text_Cursor *cur = efl_text_interactive_main_cursor_get(obj); + Efl_Text_Cursor *tc = NULL; Eina_Bool dosel = EINA_FALSE; Eina_Bool shift; @@ -1142,12 +1143,12 @@ _mouse_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EIN { if (shift) { - tc = evas_object_textblock_cursor_new(obj); - evas_textblock_cursor_copy(cur, tc); - if (evas_textblock_cursor_compare(cur, en->sel_start) < 0) - evas_textblock_cursor_line_char_first(cur); + tc = efl_canvas_text_cursor_create(obj); + efl_text_cursor_copy(cur, tc); + if (efl_text_cursor_compare(cur, en->sel_start) < 0) + efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_LINE_START); else - evas_textblock_cursor_line_char_last(cur); + efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_LINE_END); _sel_extend(cur, obj, en); } else @@ -1155,11 +1156,11 @@ _mouse_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EIN en->have_selection = EINA_FALSE; en->selecting = EINA_FALSE; _sel_clear(obj, en); - tc = evas_object_textblock_cursor_new(obj); - evas_textblock_cursor_copy(cur, tc); - evas_textblock_cursor_line_char_first(cur); + tc = efl_canvas_text_cursor_create(obj); + efl_text_cursor_copy(cur, tc); + efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_LINE_START); _sel_init(cur, obj, en); - evas_textblock_cursor_line_char_last(cur); + efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_LINE_END); _sel_extend(cur, obj, en); } goto end; @@ -1168,14 +1169,14 @@ _mouse_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EIN { if (shift) { - tc = evas_object_textblock_cursor_new(obj); - evas_textblock_cursor_copy(cur, tc); - if (evas_textblock_cursor_compare(cur, en->sel_start) < 0) - evas_textblock_cursor_word_start(cur); + tc = efl_canvas_text_cursor_create(obj); + efl_text_cursor_copy(cur, tc); + if (efl_text_cursor_compare(cur, en->sel_start) < 0) + efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_WORD_START); else { - evas_textblock_cursor_word_end(cur); - evas_textblock_cursor_char_next(cur); + efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_WORD_END); + efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_CHAR_NEXT); } _sel_extend(cur, obj, en); } @@ -1184,12 +1185,12 @@ _mouse_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EIN en->have_selection = EINA_FALSE; en->selecting = EINA_FALSE; _sel_clear(obj, en); - tc = evas_object_textblock_cursor_new(obj); - evas_textblock_cursor_copy(cur, tc); - evas_textblock_cursor_word_start(cur); + tc = efl_canvas_text_cursor_create(obj); + efl_text_cursor_copy(cur, tc); + efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_WORD_START); _sel_init(cur, obj, en); - evas_textblock_cursor_word_end(cur); - evas_textblock_cursor_char_next(cur); + efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_WORD_END); + efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_CHAR_NEXT); _sel_extend(cur, obj, en); } goto end; @@ -1223,7 +1224,7 @@ _mouse_up_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void { Evas_Coord cx, cy; Efl_Ui_Internal_Text_Interactive_Data *en = efl_data_scope_get(obj, MY_CLASS); - Efl_Text_Cursor_Cursor *cur = efl_text_cursor_get(obj, EFL_TEXT_CURSOR_GET_TYPE_MAIN); + Efl_Text_Cursor *cur = efl_text_interactive_main_cursor_get(obj); Evas_Event_Mouse_Up *ev = event_info; if ((!ev) || (ev->button != 1)) return; @@ -1247,7 +1248,7 @@ _mouse_up_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void if (en->select_allow) { - efl_text_cursor_copy(obj, en->sel_end, cur); + efl_text_cursor_copy(en->sel_end, cur); } if (en->selecting) { @@ -1264,10 +1265,10 @@ _mouse_move_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, vo { Evas_Coord cx, cy; Efl_Ui_Internal_Text_Interactive_Data *en = efl_data_scope_get(obj, MY_CLASS); - Efl_Text_Cursor_Cursor *cur = efl_text_cursor_get(obj, EFL_TEXT_CURSOR_GET_TYPE_MAIN); + Efl_Text_Cursor *cur = efl_text_interactive_main_cursor_get(obj); Evas_Event_Mouse_Move *ev = event_info; Evas_Coord x, y, w, h; - Evas_Textblock_Cursor *tc; + Efl_Text_Cursor *tc; Eina_Bool multiline; multiline = efl_text_multiline_get(obj); @@ -1286,35 +1287,41 @@ _mouse_move_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, vo if (en->selecting) { - tc = evas_object_textblock_cursor_new(obj); - evas_textblock_cursor_copy(cur, tc); + tc = efl_canvas_text_cursor_create(obj); + efl_text_cursor_copy(cur, tc); evas_object_geometry_get(obj, &x, &y, &w, &h); cx = ev->cur.canvas.x - x; cy = ev->cur.canvas.y - y; if (multiline) { - efl_text_cursor_coord_set(obj, cur, cx, cy); + efl_text_cursor_char_coord_set(cur, EINA_POSITION2D(cx, cy)); } else { Evas_Coord lx, ly, lw, lh; - evas_textblock_cursor_paragraph_first(cur); - evas_textblock_cursor_line_geometry_get(cur, &lx, &ly, &lw, &lh); - efl_text_cursor_coord_set(obj, cur, cx, ly + (lh / 2)); + efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_PARAGRAPH_FIRST); + evas_textblock_cursor_line_geometry_get(efl_text_cursor_handle_get(cur), &lx, &ly, &lw, &lh); + efl_text_cursor_char_coord_set(cur, EINA_POSITION2D(cx, ly + (lh / 2))); } if (en->select_allow) { _sel_extend(cur, obj, en); - if (!efl_text_cursor_equal(obj, en->sel_start, en->sel_end)) + if (!efl_text_cursor_equal(en->sel_start, en->sel_end)) _sel_enable(cur, obj, en); } - evas_textblock_cursor_free(tc); + efl_del(tc); } } +EOLIAN static Efl_Text_Cursor * +_efl_ui_internal_text_interactive_efl_text_interactive_main_cursor_get(const Eo *obj EINA_UNUSED, Efl_Ui_Internal_Text_Interactive_Data *pd) +{ + return pd->main_cursor; +} + EOLIAN static Efl_Object * _efl_ui_internal_text_interactive_efl_object_constructor(Eo *obj, Efl_Ui_Internal_Text_Interactive_Data *en) { @@ -1334,12 +1341,11 @@ _efl_ui_internal_text_interactive_efl_object_finalize(Eo *obj, Efl_Ui_Internal_T evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_UP, _mouse_up_cb, NULL); evas_object_event_callback_add(obj, EVAS_CALLBACK_MOUSE_MOVE, _mouse_move_cb, NULL); - en->sel_start = evas_object_textblock_cursor_new(obj); - en->sel_end = evas_object_textblock_cursor_new(obj); + en->main_cursor = efl_canvas_text_cursor_create(obj); + en->sel_start = efl_canvas_text_cursor_create(obj); + en->sel_end = efl_canvas_text_cursor_create(obj); - efl_event_callback_add(obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, - _sel_cursor_changed, obj); - efl_event_callback_add(obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, + efl_event_callback_add(efl_text_interactive_main_cursor_get(obj), EFL_TEXT_CURSOR_EVENT_CHANGED, _sel_cursor_changed, obj); en->input_panel_enable = EINA_TRUE; @@ -1422,10 +1428,10 @@ _efl_ui_internal_text_interactive_efl_text_interactive_selection_allowed_get(con } EOLIAN static void -_efl_ui_internal_text_interactive_efl_text_interactive_selection_cursors_get(const Eo *obj EINA_UNUSED, Efl_Ui_Internal_Text_Interactive_Data *pd, Efl_Text_Cursor_Cursor **start, Evas_Textblock_Cursor **end) +_efl_ui_internal_text_interactive_efl_text_interactive_selection_cursors_get(const Eo *obj EINA_UNUSED, Efl_Ui_Internal_Text_Interactive_Data *pd, Efl_Text_Cursor **start, Efl_Text_Cursor **end) { - if (efl_text_cursor_position_get(obj, pd->sel_start) > - efl_text_cursor_position_get(obj, pd->sel_end)) + if (efl_text_cursor_position_get(pd->sel_start) > + efl_text_cursor_position_get(pd->sel_end)) { if (start) *start = pd->sel_end; if (end) *end = pd->sel_start; diff --git a/src/lib/elementary/efl_ui_internal_text_interactive.eo b/src/lib/elementary/efl_ui_internal_text_interactive.eo index a7bf52293c..666cd83a0f 100644 --- a/src/lib/elementary/efl_ui_internal_text_interactive.eo +++ b/src/lib/elementary/efl_ui_internal_text_interactive.eo @@ -7,6 +7,7 @@ class @beta Efl.Ui.Internal.Text.Interactive extends Efl.Canvas.Text implements implements { Efl.Object.constructor; Efl.Object.finalize; + Efl.Text_Interactive.main_cursor { get; } Efl.Text_Interactive.selection_allowed { get; set; } Efl.Text_Interactive.selection_cursors { get; } Efl.Text_Interactive.editable { get; set; } diff --git a/src/lib/elementary/efl_ui_internal_text_scroller.c b/src/lib/elementary/efl_ui_internal_text_scroller.c index b5888f5a60..f5e366deb0 100644 --- a/src/lib/elementary/efl_ui_internal_text_scroller.c +++ b/src/lib/elementary/efl_ui_internal_text_scroller.c @@ -101,7 +101,7 @@ _efl_ui_internal_text_scroller_efl_canvas_group_group_calculate(Eo *obj, efl_event_freeze(sd->text_obj); efl_gfx_entity_size_set(sd->text_table, view.size); efl_gfx_entity_size_set(sd->text_obj, view.size); - efl_canvas_text_size_formatted_get(sd->text_obj, &fsz.w, &fsz.h); + fsz = efl_canvas_text_size_formatted_get(sd->text_obj); efl_gfx_entity_size_set(sd->text_table, sz); efl_gfx_entity_size_set(sd->text_obj, sz); efl_event_thaw(sd->text_obj); diff --git a/src/lib/elementary/efl_ui_text.c b/src/lib/elementary/efl_ui_text.c index caf84c225d..e57fc9c23d 100644 --- a/src/lib/elementary/efl_ui_text.c +++ b/src/lib/elementary/efl_ui_text.c @@ -18,6 +18,7 @@ #include "elm_hoversel_eo.h" #include "efl_ui_text_part.eo.h" #include "elm_part_helper.h" +#include "efl_canvas_text_internal.h" typedef struct _Efl_Ui_Text_Data Efl_Ui_Text_Data; typedef struct _Efl_Ui_Text_Rectangle Efl_Ui_Text_Rectangle; @@ -77,7 +78,7 @@ struct _Efl_Ui_Text_Data Efl_Ui_Input_Panel_Language_Type input_panel_lang; Efl_Ui_Input_Panel_Return_Key_Type input_panel_return_key_type; Efl_Ui_Input_Hints input_hints; - Efl_Text_Cursor_Cursor *sel_handler_cursor; + Efl_Text_Cursor *sel_handler_cursor; void *input_panel_imdata; int input_panel_imdata_len; int input_panel_layout_variation; @@ -514,7 +515,8 @@ _update_selection_handler(Eo *obj) Eina_Position2D off; Evas_Coord hx, hy; Eina_Bool hidden = EINA_FALSE; - Efl_Text_Cursor_Cursor *sel_start, *sel_end; + Efl_Text_Cursor *sel_start, *sel_end; + Eina_Rect rc_tmp; efl_text_interactive_selection_cursors_get(obj, &sel_start, &sel_end); @@ -523,10 +525,11 @@ _update_selection_handler(Eo *obj) //evas_object_geometry_get(sd->entry_edje, &ent_x, &ent_y, NULL, NULL); - efl_text_cursor_geometry_get(obj, sel_start, - EFL_TEXT_CURSOR_TYPE_BEFORE, - &sx, &sy, NULL, &sh, - NULL, NULL, NULL, NULL); + rc_tmp = efl_text_cursor_geometry_get(sel_start, EFL_TEXT_CURSOR_TYPE_BEFORE); + sx = rc_tmp.x; + sy = rc_tmp.y; + sh = rc_tmp.h; + off = _decoration_calc_offset(sd); hx = off.x + sx; hy = off.y + sy + sh; @@ -553,10 +556,11 @@ _update_selection_handler(Eo *obj) } hidden = EINA_FALSE; - efl_text_cursor_geometry_get(obj, sel_end, - EFL_TEXT_CURSOR_TYPE_BEFORE, - &ex, &ey, NULL, &eh, - NULL, NULL, NULL, NULL); + rc_tmp = efl_text_cursor_geometry_get(sel_end, EFL_TEXT_CURSOR_TYPE_BEFORE); + ex = rc_tmp.x; + ey = rc_tmp.y; + eh = rc_tmp.h; + hx = off.x + ex; hy = off.y + ey + eh; evas_object_move(sd->end_handler, hx, hy); @@ -600,31 +604,31 @@ static void _selection_data_cb(void *data EINA_UNUSED, Eo *obj, Efl_Ui_Selection_Data *sel_data) { - Efl_Text_Cursor_Cursor *cur, *start, *end; + Efl_Text_Cursor *cur, *start, *end; Efl_Ui_Text_Change_Info info = { NULL, 0, 0, 0, 0 }; char *buf = eina_slice_strdup(sel_data->content); size_t len = sel_data->content.len; efl_text_interactive_selection_cursors_get(obj, &start, &end); - if (!efl_text_cursor_equal(obj, start, end)) + if (!efl_text_cursor_equal(start, end)) { - efl_canvas_text_range_delete(obj, start, end); + efl_text_cursor_range_delete(start, end); EFL_UI_TEXT_DATA_GET(obj, sd); _efl_ui_text_select_none(obj, sd); } - cur = efl_text_cursor_get(obj, EFL_TEXT_CURSOR_GET_TYPE_MAIN); + cur = efl_text_interactive_main_cursor_get(obj); info.insert = EINA_TRUE; - info.position = efl_text_cursor_position_get(obj, cur); + info.position = efl_text_cursor_position_get(cur); info.length = len; info.content = buf; if (sel_data->format == EFL_UI_SELECTION_FORMAT_MARKUP) { - efl_text_markup_interactive_cursor_markup_insert(obj, cur, buf); + efl_text_cursor_markup_insert(cur, buf); } else // TEXT { - efl_text_cursor_text_insert(obj, cur, buf); + efl_text_cursor_text_insert(cur, buf); } efl_event_callback_call(obj, EFL_UI_TEXT_EVENT_CHANGED_USER, &info); free(buf); @@ -829,6 +833,7 @@ _cursor_geometry_recalc(Evas_Object *obj) Evas_Coord x, y, w, h; Evas_Coord x2, y2, w2, h2; Evas_Coord cx, cy, cw, ch; + Eina_Rect rc; if (!sd->editable) return; @@ -836,12 +841,15 @@ _cursor_geometry_recalc(Evas_Object *obj) x2 = y2 = w2 = h2 = 0; x = y = w = h = 0; - Efl_Text_Cursor_Cursor *main_cur = - efl_text_cursor_get(obj, EFL_TEXT_CURSOR_GET_TYPE_MAIN); + Efl_Text_Cursor *main_cur = + efl_text_interactive_main_cursor_get(obj); + + rc = efl_text_cursor_geometry_get(main_cur, EFL_TEXT_CURSOR_TYPE_BEFORE); + cx = rc.x; + cy = rc.y; + cw = rc.w; + ch = rc.h; - efl_text_cursor_geometry_get(obj, main_cur, - EFL_TEXT_CURSOR_TYPE_BEFORE, - &cx, &cy, &cw, &ch, NULL, NULL, NULL, NULL); edje_object_size_min_restricted_calc(sd->cursor, &cw, NULL, cw, 0); if (cw < 1) cw = 1; if (ch < 1) ch = 1; @@ -918,9 +926,9 @@ _efl_ui_text_efl_canvas_group_group_calculate(Eo *obj, Efl_Ui_Text_Data *sd) efl_gfx_entity_size_set(sd->text_obj, EINA_SIZE2D(sz.w, 0)); /* ignore current object size for single-line since we always need to know the actual size */ if (sd->single_line) - efl_canvas_text_size_native_get(sd->text_obj, &min.w, &min.h); + min = efl_canvas_text_size_native_get(sd->text_obj); else - efl_canvas_text_size_formatted_get(sd->text_obj, &min.w, &min.h); + min = efl_canvas_text_size_formatted_get(sd->text_obj); efl_gfx_entity_size_set(sd->text_obj, text_sz); efl_event_thaw(sd->text_obj); min.w += edmin.w; @@ -1008,11 +1016,8 @@ _efl_ui_text_efl_ui_widget_interest_region_get(const Eo *obj EINA_UNUSED, Efl_Ui Evas_Coord edje_x, edje_y, elm_x, elm_y; Eina_Rect r = {}; - efl_text_cursor_geometry_get(obj, - efl_text_cursor_get(obj, EFL_TEXT_CURSOR_GET_TYPE_MAIN), - EFL_TEXT_CURSOR_TYPE_BEFORE, - &r.x, &r.y, &r.w, &r.h, - NULL, NULL, NULL, NULL); + r = efl_text_cursor_geometry_get( + efl_text_interactive_main_cursor_get(obj), EFL_TEXT_CURSOR_TYPE_BEFORE); if (sd->single_line) { @@ -1172,7 +1177,7 @@ _selection_store(Efl_Ui_Selection_Type seltype, Evas_Object *obj) { char *sel; - Efl_Text_Cursor_Cursor *start, *end; + Efl_Text_Cursor *start, *end; Efl_Ui_Selection_Format selformat = EFL_UI_SELECTION_FORMAT_MARKUP; Eina_Slice slice; Selection_Loss_Data *ldata; @@ -1181,7 +1186,7 @@ _selection_store(Efl_Ui_Selection_Type seltype, EFL_UI_TEXT_DATA_GET(obj, sd); efl_text_interactive_selection_cursors_get(obj, &start, &end); - sel = efl_text_markup_interactive_markup_range_get(obj, start, end); + sel = efl_text_cursor_range_markup_get(start, end); if ((!sel) || (!sel[0])) return; /* avoid deleting our own selection */ @@ -1228,7 +1233,7 @@ end: static void _cut_cb(Eo *obj) { - Efl_Text_Cursor_Cursor *start, *end; + Efl_Text_Cursor *start, *end; EFL_UI_TEXT_DATA_GET(obj, sd); efl_event_callback_call(obj, EFL_UI_EVENT_SELECTION_CUT, NULL); @@ -1244,7 +1249,7 @@ _cut_cb(Eo *obj) _selection_store(EFL_UI_SELECTION_TYPE_CLIPBOARD, obj); efl_text_interactive_selection_cursors_get(obj, &start, &end); - efl_canvas_text_range_delete(obj, start, end); + efl_text_cursor_range_delete(start, end); _efl_ui_text_select_none(obj, sd); } @@ -1686,15 +1691,18 @@ _selection_handlers_offset_calc(Evas_Object *obj, Evas_Object *handler) Evas_Coord cx, cy, cw, ch; Evas_Coord hh; Eina_Position2D pos; + Eina_Rect rc; EFL_UI_TEXT_DATA_GET(obj, sd); pos = efl_gfx_entity_position_get(sd->text_obj); - efl_text_cursor_geometry_get(obj, - efl_text_cursor_get(obj, EFL_TEXT_CURSOR_GET_TYPE_MAIN), - EFL_TEXT_CURSOR_TYPE_BEFORE, - &cx, &cy, &cw, &ch, - NULL, NULL, NULL, NULL); + rc = efl_text_cursor_geometry_get( + efl_text_interactive_main_cursor_get(obj), EFL_TEXT_CURSOR_TYPE_BEFORE); + cx = rc.x; + cy = rc.y; + cw = rc.w; + ch = rc.h; + edje_object_size_min_calc(handler, NULL, &hh); sd->ox = pos.x + cx + (cw / 2); @@ -1720,8 +1728,8 @@ _start_handler_mouse_down_cb(void *data, EFL_UI_TEXT_DATA_GET(data, sd); int start_pos, end_pos, pos; - Efl_Text_Cursor_Cursor *sel_start, *sel_end; - Efl_Text_Cursor_Cursor *main_cur; + Efl_Text_Cursor *sel_start, *sel_end; + Efl_Text_Cursor *main_cur; Eo *text_obj = sd->text_obj; @@ -1729,10 +1737,10 @@ _start_handler_mouse_down_cb(void *data, /* Get the cursors */ efl_text_interactive_selection_cursors_get(text_obj, &sel_start, &sel_end); - main_cur = efl_text_cursor_get(text_obj, EFL_TEXT_CURSOR_GET_TYPE_MAIN); + main_cur = efl_text_interactive_main_cursor_get(text_obj); - start_pos = efl_text_cursor_position_get(text_obj, sel_start); - end_pos = efl_text_cursor_position_get(text_obj, sel_end); + start_pos = efl_text_cursor_position_get(sel_start); + end_pos = efl_text_cursor_position_get(sel_end); if (start_pos <= end_pos) { @@ -1744,7 +1752,7 @@ _start_handler_mouse_down_cb(void *data, pos = end_pos; sd->sel_handler_cursor = sel_end; } - efl_text_cursor_position_set(text_obj, main_cur, pos); + efl_text_cursor_position_set(main_cur, pos); _selection_handlers_offset_calc(data, sd->start_handler); } @@ -1783,12 +1791,12 @@ _start_handler_mouse_move_cb(void *data, cy = ev->cur.canvas.y - sd->oy - ey; if (cx <= 0) cx = 1; - efl_text_cursor_coord_set(sd->text_obj, sd->sel_handler_cursor, cx, cy); - pos = efl_text_cursor_position_get(sd->text_obj, sd->sel_handler_cursor); + efl_text_cursor_char_coord_set(sd->sel_handler_cursor, EINA_POSITION2D(cx, cy)); + pos = efl_text_cursor_position_get(sd->sel_handler_cursor); /* Set the main cursor. */ - efl_text_cursor_position_set(sd->text_obj, - efl_text_cursor_get(sd->text_obj, EFL_TEXT_CURSOR_GET_TYPE_MAIN), pos); + efl_text_cursor_position_set( + efl_text_interactive_main_cursor_get(sd->text_obj), pos); efl_input_clickable_longpress_abort(data, 1); sd->long_pressed = EINA_FALSE; @@ -1802,8 +1810,8 @@ _end_handler_mouse_down_cb(void *data, { EFL_UI_TEXT_DATA_GET(data, sd); - Efl_Text_Cursor_Cursor *sel_start, *sel_end; - Efl_Text_Cursor_Cursor *main_cur; + Efl_Text_Cursor *sel_start, *sel_end; + Efl_Text_Cursor *main_cur; int pos, start_pos, end_pos; sd->end_handler_down = EINA_TRUE; @@ -1811,10 +1819,10 @@ _end_handler_mouse_down_cb(void *data, Eo *text_obj = sd->text_obj; efl_text_interactive_selection_cursors_get(text_obj, &sel_start, &sel_end); - main_cur = efl_text_cursor_get(text_obj, EFL_TEXT_CURSOR_GET_TYPE_MAIN); + main_cur = efl_text_interactive_main_cursor_get(text_obj); - start_pos = efl_text_cursor_position_get(text_obj, sel_start); - end_pos = efl_text_cursor_position_get(text_obj, sel_end); + start_pos = efl_text_cursor_position_get(sel_start); + end_pos = efl_text_cursor_position_get(sel_end); if (start_pos < end_pos) { @@ -1827,7 +1835,7 @@ _end_handler_mouse_down_cb(void *data, sd->sel_handler_cursor = sel_start; } - efl_text_cursor_position_set(text_obj, main_cur, pos); + efl_text_cursor_position_set(main_cur, pos); _selection_handlers_offset_calc(data, sd->end_handler); } @@ -1866,10 +1874,10 @@ _end_handler_mouse_move_cb(void *data, cy = ev->cur.canvas.y - sd->oy - ey; if (cx <= 0) cx = 1; - efl_text_cursor_coord_set(sd->text_obj, sd->sel_handler_cursor, cx, cy); - pos = efl_text_cursor_position_get(sd->text_obj, sd->sel_handler_cursor); + efl_text_cursor_char_coord_set(sd->sel_handler_cursor, EINA_POSITION2D(cx, cy)); + pos = efl_text_cursor_position_get(sd->sel_handler_cursor); /* Set the main cursor. */ - efl_text_cursor_position_set(sd->text_obj, efl_text_cursor_get(data, EFL_TEXT_CURSOR_GET_TYPE_MAIN), pos); + efl_text_cursor_position_set(efl_text_interactive_main_cursor_get(data), pos); efl_input_clickable_longpress_abort(data, 1); sd->long_pressed = EINA_FALSE; } @@ -2195,7 +2203,7 @@ _efl_ui_text_efl_object_finalize(Eo *obj, _efl_ui_text_changed_cb, obj); efl_event_callback_add(sd->text_obj, EFL_TEXT_INTERACTIVE_EVENT_TEXT_SELECTION_CHANGED, _efl_ui_text_selection_changed_cb, obj); - efl_event_callback_add(sd->text_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, + efl_event_callback_add(efl_text_interactive_main_cursor_get(sd->text_obj), EFL_TEXT_CURSOR_EVENT_CHANGED, _efl_ui_text_cursor_changed_cb, obj); efl_event_callback_add(sd->text_obj, EFL_GFX_ENTITY_EVENT_POSITION_CHANGED, _text_position_changed_cb, obj); @@ -2353,12 +2361,12 @@ _efl_ui_text_calc_force(Eo *obj, Efl_Ui_Text_Data *sd) static const char* _efl_ui_text_selection_get(const Eo *obj, Efl_Ui_Text_Data *sd) { - Efl_Text_Cursor_Cursor *start_obj, *end_obj; + Efl_Text_Cursor *start_obj, *end_obj; if ((sd->password)) return NULL; efl_text_interactive_selection_cursors_get(obj, &start_obj, &end_obj); - return efl_canvas_text_range_text_get(obj, start_obj, end_obj); + return efl_text_cursor_range_text_get(start_obj, end_obj); } EOLIAN static void @@ -2377,12 +2385,26 @@ _efl_ui_text_selection_handler_disabled_get(const Eo *obj EINA_UNUSED, Efl_Ui_Te static void _efl_ui_text_entry_insert(Eo *obj, Efl_Ui_Text_Data *sd, const char *entry) { - Efl_Text_Cursor_Cursor *cur_obj = efl_text_cursor_get(obj, EFL_TEXT_CURSOR_GET_TYPE_MAIN); - efl_text_cursor_text_insert(obj, cur_obj, entry); + Efl_Text_Cursor *cur_obj = efl_text_interactive_main_cursor_get(obj); + efl_text_cursor_text_insert(cur_obj, entry); sd->text_changed = EINA_TRUE; efl_canvas_group_change(obj); } +EOLIAN static void +_efl_ui_text_cursor_add(Eo *obj, Efl_Ui_Text_Data *pd, Efl_Text_Cursor *cursor) +{ + efl_text_cursor_text_object_set(cursor, pd->text_obj, obj); +} + +EOLIAN static Efl_Text_Cursor * +_efl_ui_text_cursor_create(Eo *obj, Efl_Ui_Text_Data *pd) +{ + Eo* cursor = efl_add(EFL_TEXT_CURSOR_CLASS, pd->text_obj); + efl_text_cursor_text_object_set(cursor, pd->text_obj, obj); + return cursor; +} + EOLIAN static void _efl_ui_text_efl_text_interactive_editable_set(Eo *obj, Efl_Ui_Text_Data *sd, Eina_Bool editable) { @@ -2443,14 +2465,14 @@ _efl_ui_text_select_none(Eo *obj EINA_UNUSED, Efl_Ui_Text_Data *sd) static void _efl_ui_text_select_region_set(Eo *obj, Efl_Ui_Text_Data *sd, int start, int end) { - Efl_Text_Cursor_Cursor *sel_start, *sel_end; + Efl_Text_Cursor *sel_start, *sel_end; if ((sd->password)) return; efl_text_interactive_selection_cursors_get(obj, &sel_start, &sel_end); - efl_text_cursor_position_set(obj, sel_start, start); - efl_text_cursor_position_set(obj, sel_end, end); + efl_text_cursor_position_set(sel_start, start); + efl_text_cursor_position_set(sel_end, end); } EOLIAN static void @@ -2989,13 +3011,13 @@ fail: EOLIAN static int _efl_ui_text_efl_access_text_caret_offset_get(const Eo *obj, Efl_Ui_Text_Data *_pd EINA_UNUSED) { - return efl_text_cursor_position_get(obj, efl_text_cursor_get(obj, EFL_TEXT_CURSOR_GET_TYPE_MAIN)); + return efl_text_cursor_position_get(efl_text_interactive_main_cursor_get(obj)); } EOLIAN static Eina_Bool _efl_ui_text_efl_access_text_caret_offset_set(Eo *obj, Efl_Ui_Text_Data *_pd EINA_UNUSED, int offset) { - efl_text_cursor_position_set(obj, efl_text_cursor_get(obj, EFL_TEXT_CURSOR_GET_TYPE_MAIN), offset); + efl_text_cursor_position_set(efl_text_interactive_main_cursor_get(obj), offset); return EINA_TRUE; } @@ -3267,19 +3289,19 @@ _efl_ui_text_efl_access_text_default_attributes_get(const Eo *obj, Efl_Ui_Text_D { Eina_List *ret = NULL; Efl_Access_Text_Attribute *attr; - Efl_Text_Cursor_Cursor *start, *end; + Efl_Text_Cursor *start, *end; Eina_Iterator *annotations; Efl_Text_Annotate_Annotation *an; /* Retrieve all annotations in the text. */ Eo *mobj = (Eo *)obj; /* XXX const */ - start = efl_text_cursor_new(mobj); - end = efl_text_cursor_new(mobj); + start = efl_ui_text_cursor_create(mobj); + end = efl_ui_text_cursor_create(mobj); - efl_text_cursor_paragraph_first(mobj, start); - efl_text_cursor_paragraph_last(mobj, end); + efl_text_cursor_move(start, EFL_TEXT_CURSOR_MOVE_TYPE_PARAGRAPH_FIRST); + efl_text_cursor_move(end, EFL_TEXT_CURSOR_MOVE_TYPE_PARAGRAPH_LAST); - annotations = efl_text_range_annotations_get(obj, start, end); + annotations = efl_text_range_annotations_get(obj, efl_text_cursor_handle_get(start), efl_text_cursor_handle_get(end)); EINA_ITERATOR_FOREACH(annotations, an) { @@ -3302,8 +3324,8 @@ _efl_ui_text_efl_access_editable_text_text_content_set(Eo *obj, Efl_Ui_Text_Data EOLIAN static Eina_Bool _efl_ui_text_efl_access_editable_text_insert(Eo *obj, Efl_Ui_Text_Data *pd, const char *string, int position) { - Efl_Text_Cursor_Cursor *cur_obj = efl_text_cursor_get(obj, EFL_TEXT_CURSOR_GET_TYPE_MAIN); - efl_text_cursor_position_set(obj, cur_obj, position); + Efl_Text_Cursor *cur_obj = efl_text_interactive_main_cursor_get(obj); + efl_text_cursor_position_set(cur_obj, position); _efl_ui_text_entry_insert(obj, pd, string); return EINA_TRUE; @@ -3352,8 +3374,8 @@ _efl_ui_text_efl_access_editable_text_delete(Eo *obj, Efl_Ui_Text_Data *pd, int EOLIAN static Eina_Bool _efl_ui_text_efl_access_editable_text_paste(Eo *obj, Efl_Ui_Text_Data *_pd EINA_UNUSED, int position) { - Efl_Text_Cursor_Cursor *cur_obj = efl_text_cursor_get(obj, EFL_TEXT_CURSOR_GET_TYPE_MAIN); - efl_text_cursor_position_set(obj, cur_obj, position); + Efl_Text_Cursor *cur_obj = efl_text_interactive_main_cursor_get(obj); + efl_text_cursor_position_set(cur_obj, position); efl_ui_text_selection_paste(obj); return EINA_TRUE; } @@ -3451,11 +3473,11 @@ static void _update_text_cursors(Eo *obj) { Evas_Coord xx, yy, ww, hh; - Evas_Coord xx2, yy2; Eina_Position2D off; - Eina_Bool bidi_cursor; Eo *text_obj; - + Eina_Rect rc_tmp1; + Eina_Rect rc_tmp2; + Eina_Bool bidi_cursor; EFL_UI_TEXT_DATA_GET(obj, sd); if (!sd->deferred_decoration_cursor) return; @@ -3465,10 +3487,13 @@ _update_text_cursors(Eo *obj) xx = yy = ww = hh = -1; off =_decoration_calc_offset(sd); - bidi_cursor = efl_text_cursor_geometry_get(obj, - efl_text_cursor_get(text_obj, EFL_TEXT_CURSOR_GET_TYPE_MAIN), - EFL_TEXT_CURSOR_TYPE_BEFORE, &xx, &yy, &ww, &hh, &xx2, &yy2, - NULL, NULL); + rc_tmp1 = efl_text_cursor_geometry_get(efl_text_interactive_main_cursor_get(text_obj), EFL_TEXT_CURSOR_TYPE_BEFORE); + bidi_cursor = efl_text_cursor_lower_cursor_geometry_get(efl_text_interactive_main_cursor_get(text_obj), &rc_tmp2); + xx = rc_tmp1.x; + yy = rc_tmp1.y; + ww = rc_tmp1.w; + hh = rc_tmp1.h; + if (ww < 1) ww = 1; if (hh < 1) hh = 1; if (sd->cursor) @@ -3480,7 +3505,7 @@ _update_text_cursors(Eo *obj) if (bidi_cursor) { evas_object_geometry_set(sd->cursor_bidi, - off.x + xx2, off.y + yy2 + (hh / 2), + off.x + rc_tmp2.x, off.y + rc_tmp2.y + (hh / 2), ww, hh / 2); evas_object_resize(sd->cursor, ww, hh / 2); evas_object_show(sd->cursor_bidi); @@ -3513,7 +3538,7 @@ static void _update_text_selection(Eo *obj, Eo *text_obj) { Eina_Position2D off; - Efl_Text_Cursor_Cursor *sel_start, *sel_end; + Efl_Text_Cursor *sel_start, *sel_end; Eina_List *l; Eina_Iterator *range; @@ -3529,8 +3554,7 @@ _update_text_selection(Eo *obj, Eo *text_obj) efl_text_interactive_selection_cursors_get(text_obj, &sel_start, &sel_end); - range = efl_canvas_text_range_simple_geometry_get(text_obj, - sel_start, sel_end); + range = efl_text_cursor_range_geometry_get(sel_start, sel_end); l = sd->sel; EINA_ITERATOR_FOREACH(range, r) @@ -3680,7 +3704,7 @@ _anchors_update(Eo *obj, Efl_Ui_Text_Data *sd) Evas_Object *smart, *clip; Eina_Iterator *it; Eina_Position2D off; - Efl_Text_Cursor_Cursor *start, *end; + Efl_Text_Cursor *start, *end; Efl_Text_Annotate_Annotation *an; Eina_List *i, *ii; Anchor *anc; @@ -3692,16 +3716,16 @@ _anchors_update(Eo *obj, Efl_Ui_Text_Data *sd) sd->gen++; - start = efl_text_cursor_new(sd->text_obj); - end = efl_text_cursor_new(sd->text_obj); + start = efl_canvas_text_cursor_create(sd->text_obj); + end = efl_canvas_text_cursor_create(sd->text_obj); /* Retrieve all annotations in the text. */ - efl_text_cursor_paragraph_first(obj, start); - efl_text_cursor_paragraph_last(obj, end); + efl_text_cursor_move(start, EFL_TEXT_CURSOR_MOVE_TYPE_PARAGRAPH_FIRST); + efl_text_cursor_move(end, EFL_TEXT_CURSOR_MOVE_TYPE_PARAGRAPH_LAST); - it = efl_text_range_annotations_get(obj, start, end); - efl_text_cursor_free(sd->text_obj, start); - efl_text_cursor_free(sd->text_obj, end); + it = efl_text_range_annotations_get(obj, efl_text_cursor_handle_get(start), efl_text_cursor_handle_get(end)); + efl_del(start); + efl_del(end); smart = evas_object_smart_parent_get(obj); clip = evas_object_clip_get(sd->text_obj); @@ -3754,12 +3778,12 @@ _anchors_update(Eo *obj, Efl_Ui_Text_Data *sd) Eina_List *l; Eina_Rectangle *r; size_t count; - start = efl_text_cursor_new(obj); - end = efl_text_cursor_new(obj); + start = efl_ui_text_cursor_create(obj); + end = efl_ui_text_cursor_create(obj); efl_text_annotation_positions_get(obj, anc->annotation, - start, end); + efl_text_cursor_handle_get(start), efl_text_cursor_handle_get(end)); - range = efl_canvas_text_range_geometry_get(obj, start, end); + range = efl_text_cursor_range_geometry_get(start, end); count = eina_list_count(eina_iterator_container_get(range)); // Add additional rectangles if needed @@ -3967,13 +3991,13 @@ _efl_ui_text_selection_changed_cb(void *data, const Efl_Event *event EINA_UNUSED { if (efl_invalidated_get(event->object)) return; Eo *obj = data; - Efl_Text_Cursor_Cursor *start, *end; + Efl_Text_Cursor *start, *end; char *text; EFL_UI_TEXT_DATA_GET(obj, sd); efl_text_interactive_selection_cursors_get(obj, &start, &end); - text = efl_canvas_text_range_text_get(obj, start, end); + text = efl_text_cursor_range_text_get(start, end); if (!text || (text[0] == '\0')) { _edje_signal_emit(sd, "selection,cleared", "efl.text"); diff --git a/src/lib/elementary/efl_ui_text.eo b/src/lib/elementary/efl_ui_text.eo index e718d42b51..19c05c42d2 100644 --- a/src/lib/elementary/efl_ui_text.eo +++ b/src/lib/elementary/efl_ui_text.eo @@ -86,7 +86,7 @@ class @beta Efl.Ui.Text extends Efl.Ui.Layout_Base implements Efl.Input.Clickabl Efl.Access.Text, Efl.Access.Editable.Text, Efl.File, Efl.Ui.Text_Selectable composites - Efl.Text_Interactive, Efl.Text_Markup, Efl.Text_Cursor + Efl.Text_Interactive, Efl.Text_Markup { [[A flexible text widget which can be static (as a label) or editable by the user (as a text entry). It provides all sorts of editing facilities @@ -286,6 +286,17 @@ class @beta Efl.Ui.Text extends Efl.Ui.Layout_Base implements Efl.Input.Clickabl item_factory: Efl.Canvas.Text_Factory; [[Factory to create items]] } } + cursor_add { + [[Add cursor that will manipulate and iterate content of the text object. + It is typically more convenient to obtain a cursor directly from the text object using @.cursor_create.]] + params { + cursor: Efl.Text.Cursor; [[Text cursor.]] + } + } + cursor_create { + [[Creates and returns a new cursor for the text.]] + return: Efl.Text.Cursor @move; [[Text cursor.]] + } input_panel_show { [[Show the input panel (virtual keyboard) based on the input panel property of entry such as layout, autocapital types and so on. diff --git a/src/lib/evas/Efl_Canvas.h b/src/lib/evas/Efl_Canvas.h index cf0db0c2f4..a82d6a31cd 100644 --- a/src/lib/evas/Efl_Canvas.h +++ b/src/lib/evas/Efl_Canvas.h @@ -83,6 +83,7 @@ extern "C" { #include */ #include +#include #include #include #include diff --git a/src/lib/evas/Evas.h b/src/lib/evas/Evas.h index 4b94bd6601..e00d1b3916 100644 --- a/src/lib/evas/Evas.h +++ b/src/lib/evas/Evas.h @@ -210,7 +210,6 @@ extern "C" { #include #include - #ifndef EFL_NOLEGACY_API_SUPPORT #include #endif diff --git a/src/lib/evas/Evas_Common.h b/src/lib/evas/Evas_Common.h index 632260fbe0..23a481bf80 100644 --- a/src/lib/evas/Evas_Common.h +++ b/src/lib/evas/Evas_Common.h @@ -3510,11 +3510,6 @@ typedef enum #endif - -#ifndef _EFL_TEXT_CURSOR_EO_H_ -#define _EFL_TEXT_CURSOR_EO_H_ - -#endif #ifndef _EFL_GFX_ENTITY_EO_H_ #define _EFL_GFX_ENTITY_EO_H_ diff --git a/src/lib/evas/Evas_Eo.h b/src/lib/evas/Evas_Eo.h index 5f8d0b45bc..7b5db77653 100644 --- a/src/lib/evas/Evas_Eo.h +++ b/src/lib/evas/Evas_Eo.h @@ -154,7 +154,7 @@ struct _Efl_Canvas_Object_Animation_Event * * @{ */ -//#include "canvas/efl_canvas_text_cursor.eo.h" +#include "canvas/efl_text_cursor.eo.h" #include "canvas/efl_canvas_text.eo.h" #include "canvas/efl_canvas_text_factory.eo.h" /** diff --git a/src/lib/evas/canvas/efl_canvas_text.eo b/src/lib/evas/canvas/efl_canvas_text.eo index 9bac9feb8e..1e53fdbc93 100644 --- a/src/lib/evas/canvas/efl_canvas_text.eo +++ b/src/lib/evas/canvas/efl_canvas_text.eo @@ -2,8 +2,8 @@ import efl_text_types; class @beta Efl.Canvas.Text extends Efl.Canvas.Object implements Efl.Text, Efl.Canvas.Filter.Internal, Efl.Text_Font, - Efl.Text_Style, Efl.Text_Format, Efl.Text_Cursor, - Efl.Text_Annotate, Efl.Text_Markup, Efl.Text_Markup_Interactive, Efl.Ui.I18n + Efl.Text_Style, Efl.Text_Format, + Efl.Text_Annotate, Efl.Text_Markup, Efl.Ui.I18n { [[Efl canvas text class]] methods { @@ -16,6 +16,18 @@ class @beta Efl.Canvas.Text extends Efl.Canvas.Object implements Efl.Text, is_empty: bool; [[$true if empty, $false otherwise]] } } + cursor_add { + [[Add cursor that will manipulate and iterate content of the text object + It is typically more convenient to obtain a cursor directly from the text object using @.cursor_create.]] + params { + cursor: Efl.Text.Cursor; [[Text cursor.]] + } + } + cursor_create { + [[ Create new cursor and add it to text object + ]] + return: Efl.Text.Cursor @move; [[Text cursor.]] + } visible_range_get { [[Returns the currently visible range. @@ -25,8 +37,8 @@ class @beta Efl.Canvas.Text extends Efl.Canvas.Object implements Efl.Text, ]] return: bool; [[$true on success, $false otherwise]] params { - @in start: ptr(Efl.Text_Cursor_Cursor); [[Range start position]] - @in end: ptr(Efl.Text_Cursor_Cursor); [[Range end position]] + @in start: Efl.Text.Cursor; [[Range start position]] + @in end: Efl.Text.Cursor; [[Range end position]] } } @property style_insets { @@ -54,7 +66,7 @@ class @beta Efl.Canvas.Text extends Efl.Canvas.Object implements Efl.Text, delim: string; [[A null terminated string of delimiters, e.g ",|" or $null if empty]] } } - @property legacy_newline { + @property newline_as_paragraph_separator { [[When $true, newline character will behave as a paragraph separator. ]] set {} @@ -105,8 +117,7 @@ class @beta Efl.Canvas.Text extends Efl.Canvas.Object implements Efl.Text, ]] get {} values { - w: int; [[The width of the object.]] - h: int; [[The height of the object.]] + size: Eina.Size2D; [[The size of the object]] } } @property size_native { @@ -129,56 +140,7 @@ class @beta Efl.Canvas.Text extends Efl.Canvas.Object implements Efl.Text, ]] get {} values { - w: int; [[The width returned.]] - h: int; [[The height returned.]] - } - } - range_text_get @const { - [[Returns the text in the range between $cur1 and $cur2. - ]] - return: mstring @move; [[The text in the given range]] - params { - @in cur1: ptr(const(Efl.Text_Cursor_Cursor)); [[Start of range]] - @in cur2: ptr(const(Efl.Text_Cursor_Cursor)); [[End of range]] - } - } - range_geometry_get { - [[Get the geometry of a range in the text. - - The geometry is represented as rectangles for each of the line - segments in the given range [$cur1, $cur2]. - ]] - params { - @in cur1: ptr(const(Efl.Text_Cursor_Cursor)); [[Start of range]] - @in cur2: ptr(const(Efl.Text_Cursor_Cursor)); [[End of range]] - } - return: iterator @move; [[ - Iterator on all geoemtries of the given range - ]] - } - range_simple_geometry_get { - [[Get the "simple" geometry of a range. - - The geometry is the geometry in which rectangles in middle lines of - range are merged into one big rectangle. This is an optimized - version of @.range_geometry_get. - ]] - params { - @in cur1: ptr(const(Efl.Text_Cursor_Cursor)); [[Start of range]] - @in cur2: ptr(const(Efl.Text_Cursor_Cursor)); [[End of range]] - } - return: iterator @move; [[ - Iterator on all simple geometries of the given range - ]] - } - range_delete { - [[Deletes the range between given cursors. - - This removes all the text in given range [$start,$end]. - ]] - params { - @in cur1: ptr(Efl.Text_Cursor_Cursor); [[Range start position]] - @in cur2: ptr(Efl.Text_Cursor_Cursor); [[Range end position]] + size: Eina.Size2D; [[The size of the object]] } } // Obstacles @@ -274,34 +236,6 @@ class @beta Efl.Canvas.Text extends Efl.Canvas.Object implements Efl.Text, Efl.Text_Format.tabstops { get; set; } Efl.Text_Format.password { get; set; } Efl.Text_Format.replacement_char { get; set; } - Efl.Text_Cursor.text_cursor { get; } - Efl.Text_Cursor.cursor_position { set; get; } - Efl.Text_Cursor.cursor_content { get; } - Efl.Text_Cursor.cursor_geometry { get; } - Efl.Text_Cursor.cursor_new; - Efl.Text_Cursor.cursor_free; - Efl.Text_Cursor.cursor_equal; - Efl.Text_Cursor.cursor_compare; - Efl.Text_Cursor.cursor_copy; - Efl.Text_Cursor.cursor_char_next; - Efl.Text_Cursor.cursor_char_prev; - Efl.Text_Cursor.cursor_cluster_next; - Efl.Text_Cursor.cursor_cluster_prev; - Efl.Text_Cursor.cursor_paragraph_char_first; - Efl.Text_Cursor.cursor_paragraph_char_last; - Efl.Text_Cursor.cursor_word_start; - Efl.Text_Cursor.cursor_word_end; - Efl.Text_Cursor.cursor_line_char_first; - Efl.Text_Cursor.cursor_line_char_last; - Efl.Text_Cursor.cursor_paragraph_first; - Efl.Text_Cursor.cursor_paragraph_last; - Efl.Text_Cursor.cursor_paragraph_next; - Efl.Text_Cursor.cursor_paragraph_prev; - Efl.Text_Cursor.cursor_line_jump_by; - Efl.Text_Cursor.cursor_coord_set; - Efl.Text_Cursor.cursor_cluster_coord_set; - Efl.Text_Cursor.cursor_text_insert; - Efl.Text_Cursor.cursor_char_delete; Efl.Text_Annotate.annotation { set; get; } Efl.Text_Annotate.range_annotations_get; Efl.Text_Annotate.annotation_insert; @@ -312,13 +246,12 @@ class @beta Efl.Canvas.Text extends Efl.Canvas.Object implements Efl.Text, Efl.Text_Annotate.cursor_item_annotation { get; } Efl.Text_Annotate.cursor_item_insert; Efl.Text_Markup.markup { set; get; } - Efl.Text_Markup_Interactive.cursor_markup_insert; - Efl.Text_Markup_Interactive.markup_range { get;} Efl.Gfx.Entity.scale { set; } } events { - cursor,changed: void; [[Called when cursor changed]] changed: void; [[Called when canvas text changed ]] + attributes,changed: void; [[Called when attributes change]] + layout,finished: void; [[Called when the object has been layed out]] style_insets,changed: void; [[Called when the property @.style_insets changed.]] } } diff --git a/src/lib/evas/canvas/efl_canvas_text_eo.legacy.c b/src/lib/evas/canvas/efl_canvas_text_eo.legacy.c index 326707b30c..f2ee487218 100644 --- a/src/lib/evas/canvas/efl_canvas_text_eo.legacy.c +++ b/src/lib/evas/canvas/efl_canvas_text_eo.legacy.c @@ -1,8 +1,8 @@ EAPI Eina_Bool -evas_object_textblock_visible_range_get(Efl_Canvas_Text *obj, Efl_Text_Cursor_Cursor *start, Efl_Text_Cursor_Cursor *end) +evas_object_textblock_visible_range_get(Efl_Canvas_Text *obj EINA_UNUSED, Efl_Text_Cursor_Handle *start, Efl_Text_Cursor_Handle *end) { - return efl_canvas_text_visible_range_get(obj, start, end); + return evas_textblock_cursor_visible_range_get(start, end); } EAPI void @@ -26,25 +26,31 @@ evas_object_textblock_bidi_delimiters_get(const Efl_Canvas_Text *obj) EAPI void evas_object_textblock_legacy_newline_set(Efl_Canvas_Text *obj, Eina_Bool mode) { - efl_canvas_text_legacy_newline_set(obj, mode); + efl_canvas_text_newline_as_paragraph_separator_set(obj, mode); } EAPI Eina_Bool evas_object_textblock_legacy_newline_get(const Efl_Canvas_Text *obj) { - return efl_canvas_text_legacy_newline_get(obj); + return efl_canvas_text_newline_as_paragraph_separator_get(obj); } EAPI void evas_object_textblock_size_formatted_get(const Efl_Canvas_Text *obj, int *w, int *h) { - efl_canvas_text_size_formatted_get(obj, w, h); + Eina_Size2D size; + size = efl_canvas_text_size_formatted_get(obj); + if (w) *w = size.w; + if (h) *h = size.h; } EAPI void evas_object_textblock_size_native_get(const Efl_Canvas_Text *obj, int *w, int *h) { - efl_canvas_text_size_native_get(obj, w, h); + Eina_Size2D size; + size = efl_canvas_text_size_native_get(obj); + if (w) *w = size.w; + if (h) *h = size.h; } EAPI Eina_Bool diff --git a/src/lib/evas/canvas/efl_canvas_text_eo.legacy.h b/src/lib/evas/canvas/efl_canvas_text_eo.legacy.h index 41ac844358..e527595a71 100644 --- a/src/lib/evas/canvas/efl_canvas_text_eo.legacy.h +++ b/src/lib/evas/canvas/efl_canvas_text_eo.legacy.h @@ -32,7 +32,7 @@ typedef Eo Efl_Canvas_Text; * * @ingroup Evas_Object_Textblock_Group */ -EAPI Eina_Bool evas_object_textblock_visible_range_get(Efl_Canvas_Text *obj, Efl_Text_Cursor_Cursor *start, Efl_Text_Cursor_Cursor *end); +EAPI Eina_Bool evas_object_textblock_visible_range_get(Efl_Canvas_Text *obj, Efl_Text_Cursor_Handle *start, Efl_Text_Cursor_Handle *end); /** * @brief Gets the left, right, top and bottom insets of the text. diff --git a/src/lib/evas/canvas/efl_canvas_text_internal.h b/src/lib/evas/canvas/efl_canvas_text_internal.h new file mode 100644 index 0000000000..64659ec887 --- /dev/null +++ b/src/lib/evas/canvas/efl_canvas_text_internal.h @@ -0,0 +1,219 @@ +#ifndef _EFL_CANVAS_TEXT_INTERNAL_H +#define _EFL_CANVAS_TEXT_INTERNAL_H + +#include + +#define _REPLACEMENT_CHAR_UTF8 "\xEF\xBF\xBC" +#define _PARAGRAPH_SEPARATOR_UTF8 "\xE2\x80\xA9" +#define _NEWLINE_UTF8 "\n" +#define _TAB_UTF8 "\t" + +/* private struct for textblock object internal data */ +/** + * @internal + * @typedef Efl_Canvas_Text_Data + * The actual textblock object. + */ +typedef struct _Evas_Object_Textblock Efl_Canvas_Text_Data; +/** + * @internal + * @typedef Evas_Object_Style_Tag + * The structure used for finding style tags. + */ +typedef struct _Evas_Object_Style_Tag Evas_Object_Style_Tag; +/** + * @internal + * @typedef Evas_Object_Style_Tag + * The structure used for finding style tags. + */ +typedef struct _Evas_Object_Style_Tag_Base Evas_Object_Style_Tag_Base; +/** + * @internal + * @typedef Evas_Object_Textblock_Node_Text + * A text node. + */ +typedef struct _Evas_Object_Textblock_Node_Text Evas_Object_Textblock_Node_Text; +/* + * Defined in Evas.h +typedef struct _Evas_Object_Textblock_Node_Format Evas_Object_Textblock_Node_Format; +*/ +typedef struct _Evas_Textblock_Node_Format Evas_Textblock_Node_Format; + +/** + * @internal + * @typedef Evas_Object_Textblock_Paragraph + * A layouting paragraph. + */ +typedef struct _Evas_Object_Textblock_Paragraph Evas_Object_Textblock_Paragraph; +/** + * @internal + * @typedef Evas_Object_Textblock_Line + * A layouting line. + */ +typedef struct _Evas_Object_Textblock_Line Evas_Object_Textblock_Line; +/** + * @internal + * @typedef Evas_Object_Textblock_Item + * A layouting item. + */ +typedef struct _Evas_Object_Textblock_Item Evas_Object_Textblock_Item; +/** + * @internal + * @typedef Evas_Object_Textblock_Item + * A layouting text item. + */ +typedef struct _Evas_Object_Textblock_Text_Item Evas_Object_Textblock_Text_Item; +/** + * @internal + * @typedef Evas_Object_Textblock_Format_Item + * A layouting format item. + */ +typedef struct _Evas_Object_Textblock_Format_Item Evas_Object_Textblock_Format_Item; +/** + * @internal + * @typedef Evas_Object_Textblock_Format + * A textblock format. + */ +typedef struct _Evas_Object_Textblock_Format Evas_Object_Textblock_Format; +/** + * @internal + * @typedef Evas_Textblock_Selection_Iterator + * A textblock selection iterator. + */ +typedef struct _Evas_Textblock_Selection_Iterator Evas_Textblock_Selection_Iterator; +/** + * @internal + * @typedef Efl_Text_Annotate_Annotation_Iterator + * A textblock annotation iterator. + */ +typedef struct _Efl_Text_Annotate_Annotation_Iterator Efl_Text_Annotate_Annotation_Iterator; +/** + * @internal + * @typedef Efl_Canvas_Text_Filter + * A structure holding gfx filter information for a text item + */ +typedef struct _Efl_Canvas_Text_Filter Efl_Canvas_Text_Filter; +/** + * @internal + * @typedef Efl_Canvas_Text_Filter_Post_Render + * Post-render data for async rendering of gfx filters + */ +typedef struct _Efl_Canvas_Text_Filter_Post_Render Efl_Canvas_Text_Filter_Post_Render; +/** + * @internal + * @typedef Efl_Canvas_Text_Filter_Program + * Filter name - code database + */ +typedef struct _Efl_Canvas_Text_Filter_Program Efl_Canvas_Text_Filter_Program; +/** + * @internal + * @typedef Text_Item_Filter + * Text item filter properties (run context, output buffer, ...) + */ +typedef struct _Text_Item_Filter Text_Item_Filter; + + +struct _Evas_Object_Style_Tag_Base +{ + const char *tag; /**< Format Identifier: b=Bold, i=Italic etc. */ + const char *replace; /**< Replacement string. "font_weight=Bold", "font_style=Italic" etc. */ + size_t tag_len; /**< Strlen of tag. */ +}; + +struct _Evas_Object_Style_Tag +{ + EINA_INLIST; + Evas_Object_Style_Tag_Base tag; /**< Base style object for holding style information. */ +}; + +struct _Evas_Object_Textblock_Node_Text +{ + EINA_INLIST; + Eina_UStrbuf *unicode; /**< Actual paragraph text. */ + char *utf8; /**< Text in utf8 format. */ + Evas_Object_Textblock_Node_Format *format_node; /**< Points to the last format node before the paragraph, or if there is none, to the first format node within the paragraph.*/ + Evas_Object_Textblock_Paragraph *par; /**< Points to the paragraph node of which this node is a part. */ + Eina_Bool dirty : 1; /**< EINA_TRUE if already handled/format changed, else EINA_FALSE. */ + Eina_Bool is_new : 1; /**< EINA_TRUE if its a new paragraph, else EINA_FALSE. */ +}; + +struct _Evas_Textblock_Node_Format +{ + EINA_INLIST; + const char *format; /**< Cached, parsed and translated version of orig_format. */ + const char *orig_format; /**< Original format information. */ + Evas_Object_Textblock_Node_Text *text_node; /**< The text node it's pointing to. */ + Efl_Text_Annotate_Annotation *annotation; /**< Pointer to this node's annotation handle (if exists). */ + size_t offset; /**< Offset from the last format node of the same text. */ + struct { + unsigned char l, r, t, b; + } pad; /**< Amount of padding required. */ + unsigned char anchor : 2; /**< ANCHOR_NONE, ANCHOR_A or ANCHOR_ITEM. */ + Eina_Bool opener : 1; /**< EINA_TRUE if opener, else EINA_FALSE. */ + Eina_Bool own_closer : 1; /**< EINA_TRUE if own_closer, else EINA_FALSE. */ + Eina_Bool visible : 1; /**< EINA_TRUE if format is visible format, else EINA_FALSE. */ + Eina_Bool format_change : 1; /**< EINA_TRUE if the format of the textblock has changed, else EINA_FALSE. */ + Eina_Bool is_new : 1; /**< EINA_TRUE if its a new format node, else EINA_FALSE */ +}; + +struct _Efl_Text_Cursor_Handle +{ + Evas_Object *obj; + Eina_List *cur_objs; + size_t pos; + Evas_Object_Textblock_Node_Text *node; + unsigned int ref_count; + Eina_Bool changed : 1; +}; + +void evas_textblock_cursor_line_jump_by(Efl_Text_Cursor_Handle *cur, int by); +int _cursor_text_append(Efl_Text_Cursor_Handle *cur, const char *text); + + +// Used in Efl.Text.Cursor, where multible objects can have same handle. +Efl_Text_Cursor_Handle * +evas_textblock_cursor_ref(Efl_Text_Cursor_Handle *cursor, Eo * cursor_obj); + +// Used in Efl.Text.Cursor, where multible objects can have same handle. +void +evas_textblock_cursor_unref(Efl_Text_Cursor_Handle *cursor, Eo * cursor_obj); + +#ifdef EAPI +# undef EAPI +#endif + +#ifdef _WIN32 +# ifdef EFL_BUILD +# ifdef DLL_EXPORT +# define EAPI __declspec(dllexport) +# else +# define EAPI +# endif +# else +# define EAPI __declspec(dllimport) +# endif +#else +# ifdef __GNUC__ +# if __GNUC__ >= 4 +# define EAPI __attribute__ ((visibility("default"))) +# else +# define EAPI +# endif +# else +# define EAPI +# endif +#endif + +/** + * Internally sets given text_object into cursor object. + * + * @param canvas_text_obj the cursor object. + * @param canvas_text_obj the canvas text object, where cursor methods will take effect. + * @param text_obj the text_object that user can get using cursor text_object property. + */ +EAPI void efl_text_cursor_text_object_set(Eo *cursor, Eo *canvas_text_obj, Eo *text_obj); + +#undef EAPI +#define EAPI + +#endif \ No newline at end of file diff --git a/src/lib/evas/canvas/efl_text_cursor.c b/src/lib/evas/canvas/efl_text_cursor.c new file mode 100644 index 0000000000..cfa87d7bba --- /dev/null +++ b/src/lib/evas/canvas/efl_text_cursor.c @@ -0,0 +1,476 @@ +#include "evas_common_private.h" +#include "evas_private.h" +#include "efl_canvas_text_internal.h" + +#define MY_CLASS EFL_TEXT_CURSOR_CLASS +#define MY_CLASS_NAME "Efl.Text.Cursor" + +typedef struct +{ + Efl_Text_Cursor_Handle *handle; + Efl_Canvas_Object *text_obj; +} Efl_Text_Cursor_Data; + +struct _Evas_Textblock_Selection_Iterator +{ + Eina_Iterator iterator; /**< Eina Iterator. */ + Eina_List *list; /**< Head of list. */ + Eina_List *current; /**< Current node in loop. */ +}; + +typedef struct _Evas_Textblock_Selection_Iterator Evas_Textblock_Selection_Iterator; + +EOLIAN static void +_efl_text_cursor_position_set(Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd, int position) +{ + evas_textblock_cursor_pos_set(pd->handle, position); +} + +EOLIAN static int +_efl_text_cursor_position_get(const Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd) +{ + return evas_textblock_cursor_pos_get(pd->handle); +} + +EOLIAN static Eina_Unicode +_efl_text_cursor_content_get(const Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd) +{ + if (pd->handle && pd->handle->node) + return eina_ustrbuf_string_get(pd->handle->node->unicode)[pd->handle->pos]; + else + return 0; +} + +EOLIAN static Eina_Rect +_efl_text_cursor_content_geometry_get(const Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd) +{ + Eina_Rect rect = {0}; + Eina_Bool item_is = evas_textblock_cursor_format_item_geometry_get(pd->handle, &(rect.x), &(rect.y), &(rect.w), &(rect.h)); + if (item_is) + return rect; + + evas_textblock_cursor_pen_geometry_get(pd->handle, &(rect.x), &(rect.y), &(rect.w), &(rect.h)); + + return rect; +} + +EOLIAN static void +_efl_text_cursor_line_number_set(Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd, int line_number) +{ + evas_textblock_cursor_line_set(pd->handle, line_number); +} + +EOLIAN static int +_efl_text_cursor_line_number_get(const Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd) +{ + Eina_Rect rect = {0}; + + return evas_textblock_cursor_line_geometry_get(pd->handle, &(rect.x), &(rect.y), &(rect.w), &(rect.h)); +} + +EOLIAN static Eina_Rect +_efl_text_cursor_cursor_geometry_get(const Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd, Efl_Text_Cursor_Type ctype) +{ + Eina_Rect rc = {0}; + Evas_Textblock_Cursor_Type cursor_type = (ctype == EFL_TEXT_CURSOR_TYPE_BEFORE) ? EVAS_TEXTBLOCK_CURSOR_BEFORE : EVAS_TEXTBLOCK_CURSOR_UNDER; + evas_textblock_cursor_geometry_bidi_get(pd->handle, &rc.x, &rc.y, &rc.w, &rc.h, NULL, NULL, NULL, NULL, cursor_type); + return rc; +} + +EOLIAN static Eina_Bool +_efl_text_cursor_lower_cursor_geometry_get(const Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd, Eina_Rect *geometry2) +{ + Eina_Rect rc = {0}; + Eina_Bool b_ret = EINA_FALSE; + b_ret = evas_textblock_cursor_geometry_bidi_get(pd->handle, NULL, NULL, NULL, NULL, &rc.x, &rc.y, &rc.w, &rc.h, EVAS_TEXTBLOCK_CURSOR_BEFORE); + if (geometry2) + { + *geometry2 = rc; + } + return b_ret; +} + +EOLIAN static Eina_Bool +_efl_text_cursor_equal(const Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd, const Efl_Text_Cursor *dst) +{ + return evas_textblock_cursor_equal(pd->handle, efl_text_cursor_handle_get(dst)); +} + +EOLIAN static int +_efl_text_cursor_compare(const Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd, const Efl_Text_Cursor *dst) +{ + return evas_textblock_cursor_compare(pd->handle, efl_text_cursor_handle_get(dst)); +} + +EOLIAN static void +_efl_text_cursor_copy(const Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd, Efl_Text_Cursor *dst) +{ + if (!pd->handle) return; + + Efl_Text_Cursor_Handle *handle = evas_object_textblock_cursor_new(pd->handle->obj); + evas_textblock_cursor_copy(pd->handle, handle); + efl_text_cursor_handle_set(dst, handle); + evas_textblock_cursor_unref(handle, NULL); +} + +EOLIAN static Efl_Text_Cursor * +_efl_text_cursor_efl_duplicate_duplicate(const Eo *obj, Efl_Text_Cursor_Data *pd EINA_UNUSED) +{ + Efl_Text_Cursor *dup = efl_new(MY_CLASS); + + efl_text_cursor_copy(obj, dup); + + return dup; +} + +EOLIAN static Eina_Bool +_efl_text_cursor_move(Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd, Efl_Text_Cursor_Move_Type type) +{ + Eina_Bool moved = EINA_FALSE; + int pos = evas_textblock_cursor_pos_get(pd->handle); + + switch (type) { + case EFL_TEXT_CURSOR_MOVE_TYPE_CHAR_NEXT : + moved = evas_textblock_cursor_char_next(pd->handle); + break; + case EFL_TEXT_CURSOR_MOVE_TYPE_CHAR_PREV : + moved = evas_textblock_cursor_char_prev(pd->handle); + break; + case EFL_TEXT_CURSOR_MOVE_TYPE_CLUSTER_NEXT : + moved = evas_textblock_cursor_cluster_next(pd->handle); + break; + case EFL_TEXT_CURSOR_MOVE_TYPE_CLUSTER_PREV : + moved = evas_textblock_cursor_cluster_prev(pd->handle); + break; + case EFL_TEXT_CURSOR_MOVE_TYPE_PARAGRAPH_START : + evas_textblock_cursor_paragraph_char_first(pd->handle); + if (pos != evas_textblock_cursor_pos_get(pd->handle)) + moved = EINA_TRUE; + break; + case EFL_TEXT_CURSOR_MOVE_TYPE_PARAGRAPH_END : + evas_textblock_cursor_paragraph_char_last(pd->handle); + if (pos != evas_textblock_cursor_pos_get(pd->handle)) + moved = EINA_TRUE; + break; + case EFL_TEXT_CURSOR_MOVE_TYPE_WORD_START : + moved = evas_textblock_cursor_word_start(pd->handle); + break; + case EFL_TEXT_CURSOR_MOVE_TYPE_WORD_END : + moved = evas_textblock_cursor_word_end(pd->handle); + break; + case EFL_TEXT_CURSOR_MOVE_TYPE_LINE_START : + evas_textblock_cursor_line_char_first(pd->handle); + if (pos != evas_textblock_cursor_pos_get(pd->handle)) + moved = EINA_TRUE; + break; + case EFL_TEXT_CURSOR_MOVE_TYPE_LINE_END : + evas_textblock_cursor_line_char_last(pd->handle); + if (pos != evas_textblock_cursor_pos_get(pd->handle)) + moved = EINA_TRUE; + break; + case EFL_TEXT_CURSOR_MOVE_TYPE_PARAGRAPH_FIRST : + evas_textblock_cursor_paragraph_first(pd->handle); + if (pos != evas_textblock_cursor_pos_get(pd->handle)) + moved = EINA_TRUE; + break; + case EFL_TEXT_CURSOR_MOVE_TYPE_PARAGRAPH_LAST : + evas_textblock_cursor_paragraph_last(pd->handle); + if (pos != evas_textblock_cursor_pos_get(pd->handle)) + moved = EINA_TRUE; + break; + case EFL_TEXT_CURSOR_MOVE_TYPE_PARAGRAPH_NEXT : + moved = evas_textblock_cursor_paragraph_next(pd->handle); + break; + case EFL_TEXT_CURSOR_MOVE_TYPE_PARAGRAPH_PREV : + moved = evas_textblock_cursor_paragraph_prev(pd->handle); + break; + } + + return moved; +} + +EOLIAN static void +_efl_text_cursor_char_delete(Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd) +{ + evas_textblock_cursor_char_delete(pd->handle); +} + +EOLIAN static Eina_Bool +_efl_text_cursor_line_jump_by(Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd, int by) +{ + if (!pd->handle) return EINA_FALSE; + + Eina_Bool moved = EINA_FALSE; + int pos = evas_textblock_cursor_pos_get(pd->handle); + evas_textblock_cursor_line_jump_by(pd->handle, by); + moved = (pos == evas_textblock_cursor_pos_get(pd->handle)); + return moved; +} + +EOLIAN static void +_efl_text_cursor_char_coord_set(Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd, Eina_Position2D coord) +{ + evas_textblock_cursor_char_coord_set(pd->handle, coord.x, coord.y); +} + +EOLIAN static void +_efl_text_cursor_cluster_coord_set(Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd, Eina_Position2D coord) +{ + evas_textblock_cursor_cluster_coord_set(pd->handle, coord.x, coord.y); +} + +static int +_prepend_text_run2(Efl_Text_Cursor_Handle *cur, const char *s, const char *p) +{ + if ((s) && (p > s)) + { + char *ts; + + ts = alloca(p - s + 1); + strncpy(ts, s, p - s); + ts[p - s] = 0; + return evas_textblock_cursor_text_prepend(cur, ts); + } + return 0; +} + +int +_cursor_text_append(Efl_Text_Cursor_Handle *cur, + const char *text) +{ + if (!text || !cur) return 0; + + const char *off = text; + int len = 0; + + Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); + evas_object_async_block(obj); + + while (*off) + { + char *format = NULL; + int n = 1; + if (!strncmp(_PARAGRAPH_SEPARATOR_UTF8, off, + strlen(_PARAGRAPH_SEPARATOR_UTF8))) + { + format = "ps"; + n = strlen(_PARAGRAPH_SEPARATOR_UTF8); + } + else if (!strncmp(_NEWLINE_UTF8, off, strlen(_NEWLINE_UTF8))) + { + format = "br"; + n = strlen(_NEWLINE_UTF8); + } + else if (!strncmp(_TAB_UTF8, off, strlen(_TAB_UTF8))) + { + format = "tab"; + n = strlen(_TAB_UTF8); + } + + if (format) + { + len += _prepend_text_run2(cur, text, off); + if (evas_textblock_cursor_format_prepend(cur, format)) + { + len++; + } + text = off + n; /* sync text with next segment */ + } + off += n; + } + len += _prepend_text_run2(cur, text, off); + return len; +} + +EOLIAN static void +_efl_text_cursor_text_insert(Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd, const char *text) +{ + _cursor_text_append(pd->handle, text); +} + +EOLIAN static char * +_efl_text_cursor_range_text_get(const Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd, Efl_Text_Cursor *cur2) +{ + return evas_textblock_cursor_range_text_get(pd->handle, efl_text_cursor_handle_get(cur2), EVAS_TEXTBLOCK_TEXT_PLAIN); +} + +EOLIAN static void +_efl_text_cursor_markup_insert(Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd, const char *markup) +{ + evas_object_textblock_text_markup_prepend(pd->handle, markup); +} + +EOLIAN static char * +_efl_text_cursor_range_markup_get(const Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd, Efl_Text_Cursor *cur2) +{ + return evas_textblock_cursor_range_text_get(pd->handle,efl_text_cursor_handle_get(cur2), EVAS_TEXTBLOCK_TEXT_MARKUP); +} + +EOLIAN static Eina_Iterator * +_efl_text_cursor_range_geometry_get(Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd, Efl_Text_Cursor *cur2) +{ + return evas_textblock_cursor_range_simple_geometry_get(pd->handle, efl_text_cursor_handle_get(cur2)); +} + +/** selection iterator */ +/** + * @internal + * Returns the value of the current data of list node, + * and goes to the next list node. + * + * @param it the iterator. + * @param data the data of the current list node. + * @return EINA_FALSE if the current list node does not exists. + * Otherwise, returns EINA_TRUE. + */ +static Eina_Bool +_evas_textblock_selection_iterator_next(Evas_Textblock_Selection_Iterator *it, void **data) +{ + if (!it->current) + return EINA_FALSE; + + *data = eina_list_data_get(it->current); + it->current = eina_list_next(it->current); + + return EINA_TRUE; +} + +/** + * @internal + * Gets the iterator container (Eina_List) which created the iterator. + * @param it the iterator. + * @return A pointer to Eina_List. + */ +static Eina_List * +_evas_textblock_selection_iterator_get_container(Evas_Textblock_Selection_Iterator *it) +{ + return it->list; +} + +/** + * @internal + * Frees the iterator container (Eina_List). + * @param it the iterator. + */ +static void +_evas_textblock_selection_iterator_free(Evas_Textblock_Selection_Iterator *it) +{ + Eina_Rectangle *tr; + + EINA_LIST_FREE(it->list, tr) + free(tr); + EINA_MAGIC_SET(&it->iterator, 0); + free(it); +} + +/** + * @internal + * Creates newly allocated iterator associated to a list. + * @param list The list. + * @return If the memory cannot be allocated, NULL is returned. + * Otherwise, a valid iterator is returned. + */ +static Eina_Iterator * +_evas_textblock_selection_iterator_new(Eina_List *list) +{ + Evas_Textblock_Selection_Iterator *it; + + it = calloc(1, sizeof(Evas_Textblock_Selection_Iterator)); + if (!it) return NULL; + + EINA_MAGIC_SET(&it->iterator, EINA_MAGIC_ITERATOR); + it->list = list; + it->current = list; + + it->iterator.version = EINA_ITERATOR_VERSION; + it->iterator.next = FUNC_ITERATOR_NEXT( + _evas_textblock_selection_iterator_next); + it->iterator.get_container = FUNC_ITERATOR_GET_CONTAINER( + _evas_textblock_selection_iterator_get_container); + it->iterator.free = FUNC_ITERATOR_FREE( + _evas_textblock_selection_iterator_free); + + return &it->iterator; +} + +EOLIAN static Eina_Iterator * +_efl_text_cursor_range_precise_geometry_get(Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd, Efl_Text_Cursor *cur2) +{ + Eina_List *rects = evas_textblock_cursor_range_geometry_get(pd->handle, efl_text_cursor_handle_get(cur2)); + return _evas_textblock_selection_iterator_new(rects); +} + +EOLIAN static void +_efl_text_cursor_range_delete(Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd, Efl_Text_Cursor *cur2) +{ + evas_textblock_cursor_range_delete(pd->handle, efl_text_cursor_handle_get(cur2)); +} + +EOLIAN static void +_efl_text_cursor_handle_set(Eo *obj, Efl_Text_Cursor_Data *pd, Efl_Text_Cursor_Handle *handle) +{ + if (handle == pd->handle) + return; + + Efl_Text_Cursor_Handle *old_handle = pd->handle; + + pd->handle = evas_textblock_cursor_ref(handle, obj); + + if (old_handle) + { + evas_textblock_cursor_unref(old_handle, obj); + } +} + +EOLIAN static Efl_Text_Cursor_Handle * +_efl_text_cursor_handle_get(const Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd) +{ + return pd->handle; +} + +void efl_text_cursor_text_object_set(Eo *cursor, Eo *canvas_text_obj, Eo *text_obj) +{ + Efl_Text_Cursor_Data *pd = efl_data_scope_get(cursor, MY_CLASS); + Efl_Text_Cursor_Handle *handle = NULL; + if (efl_isa(canvas_text_obj, EFL_CANVAS_TEXT_CLASS)) + { + pd->text_obj = text_obj; + handle = evas_object_textblock_cursor_new(canvas_text_obj); + } + else + { + ERR("Expect Canvas Text Object"); + } + + if (handle) + { + efl_text_cursor_handle_set(cursor, handle); + evas_textblock_cursor_unref(handle, NULL); + } +} + +EOLIAN static Efl_Canvas_Object * +_efl_text_cursor_text_object_get(const Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd) +{ + return pd->text_obj; +} + +EOLIAN static void +_efl_text_cursor_efl_object_destructor(Eo *obj, Efl_Text_Cursor_Data *pd) +{ + if (pd->handle) + { + evas_textblock_cursor_unref(pd->handle, obj); + pd->handle = NULL; + } + + if (pd->text_obj) + { + pd->text_obj = NULL; + } + + efl_destructor(efl_super(obj, MY_CLASS)); + +} + +#include "efl_text_cursor.eo.c" diff --git a/src/lib/evas/canvas/efl_text_cursor.eo b/src/lib/evas/canvas/efl_text_cursor.eo new file mode 100644 index 0000000000..28247522f3 --- /dev/null +++ b/src/lib/evas/canvas/efl_text_cursor.eo @@ -0,0 +1,250 @@ +struct @beta Efl_Text_Cursor_Handle; + +enum @beta Efl.Text.Cursor_Type +{ + [[Text cursor types.]] + before, [[Cursor type before.]] + under [[Cursor type under.]] +} + +enum @beta Efl.Text.Cursor_Move_Type +{ + [[Text cursor movement types.]] + char_next, [[Advances to the next character.]] + char_prev, [[Advances to the previous character.]] + cluster_next, [[Advances to the next grapheme cluster, Grapheme cluster (A character sequence rendered together. See https://unicode.org/reports/tr29/).]] + cluster_prev, [[Advances to the previous grapheme cluster, Grapheme cluster (A character sequence rendered together. See https://unicode.org/reports/tr29/).]] + paragraph_start, [[Advances to the first character in this paragraph.]] + paragraph_end, [[Advances to the last character in this paragraph.]] + word_start, [[Advance to current word start.]] + word_end, [[Advance to current word end.]] + line_start, [[Advance to current line first character.]] + line_end, [[Advance to current line last character.]] + paragraph_first, [[Advance to first character in the first paragraph.]] + paragraph_last, [[Advance to last character in the last paragraph.]] + paragraph_next, [[Advances to the start of the next paragraph.]] + paragraph_prev [[Advances to the end of the previous paragraph.]] +} + +// Missing pen_geometry get? - probably not, that's the cursor geometry with under. +// Should we always do split cursor and "under" should just be content geometry? -- probably! +// Problem with this is that it doesn't necessarily work correctly vertically. +class @beta Efl.Text.Cursor extends Efl.Object implements Efl.Duplicate{ + [[Cursor API.]] + c_prefix: efl_text_cursor; + methods { + @property position { + [[Cursor position.]] + set { } + get { } + values { + position: int; [[Cursor position.]] + } + } + @property content { + [[The content of the cursor (the character under the cursor).]] + get { + } + values { + content: Eina.Unicode; [[The unicode codepoint of the character.]] + } + } + @property content_geometry { + [[The geometry of the item/char pointed by the cursor.]] + get { } + values { + geometry: Eina.Rect; [[The geometry in pixels.]] + } + } + @property line_number { + [[The line the cursor is on.]] + set { } + get { } + values { + line_number: int; [[The line number.]] + } + } + + @property cursor_geometry { + [[Returns the geometry of cursor, if cursor is shown for the text + of the same direction as paragraph,else ("split cursor") will return + and you need to consider the lower ("split cursor") @.lower_cursor_geometry + + Split cursor geometry is valid only in @Efl.Text.Cursor_Type.before cursor mode.]] + get { + } + keys { + ctype: Efl.Text.Cursor_Type; [[The type of the cursor.]] + } + values { + geometry: Eina.Rect; [[The geometry of the cursor (or upper cursor) in pixels.]] + } + } + + @property lower_cursor_geometry { + [[Returns the geometry of the lower ("split cursor"), if logical cursor is + between LTR/RTL text. + + To get the upper ("split cursor") @.cursor_geometry with @Efl.Text.Cursor_Type.before cursor mode.]] + get { + return: bool; [[$true if split cursor, $false otherwise.]] + } + values { + geometry: Eina.Rect; [[The geometry of the lower cursor in pixels.]] + } + } + + equal @const { + [[Check if two cursors are equal - faster than compare if all you want is equality.]] + params { + dst: const(Efl.Text.Cursor); [[Destination Cursor.]] + } + return: bool; [[$true if cursors are equal, $false otherwise.]] + } + compare @const { + [[Compare two cursors + Return <0 if cursor position less than dst, 0 if cursor == dest and >0 otherwise.]] + params { + dst: const(Efl.Text.Cursor); [[Destination Cursor.]] + } + return: int; [[Difference between cursors.]] + } + copy @const { + [[Copy existing cursor to destination cursor, like position and cursor text object.]] + params { + dst: Efl.Text.Cursor; [[Destination Cursor.]] + } + } + move { + [[Move the cursor.]] + params { + @in type: Efl.Text.Cursor_Move_Type; [[The type of movement.]] + } + return: bool; [[True if actually moved.]] + } + char_delete { + [[Deletes a single character from position pointed by given cursor.]] + } + + // FIXME: It's just implemented as range delete with cluster start + end. + // Sholud we have convenience wrappers for those though? This and cluster prev/next? + // cluster_delete { + + line_jump_by { + [[Jump the cursor by the given number of lines.]] + params { + by: int; [[Number of lines.]] + } + return: bool; [[True if actually moved.]] + } + + char_coord_set { + [[Set cursor coordinates.]] + params { + @in coord: Eina.Position2D; [[The coordinates to set to.]] + } + } + + cluster_coord_set { + [[Set cursor coordinates according to grapheme clusters. + It does not allow to put a cursor to the middle of a grapheme cluster.]] + params { + @in coord: Eina.Position2D; [[The coordinates to set to.]] + } + } + + // FIXME: Add a way to add with a length parameter (always have it?) so we just copy n characters, or all if -1. Useful for saving copies when inserting from another source. + text_insert { + [[Adds text to the current cursor position and set the cursor to + *after* the start of the text just added.]] + params { + @in text: string; [[Text to append (UTF-8 format).]] + } + } + + markup_insert { + [[Inserts a markup text at cursor position.]] + params { + @in markup: string; [[Text to append (UTF-8 format).]] + } + } + + range_markup_get @const { + [[Markup of a given range in the text.]] + return: mstring @move; [[The markup in the given range.]] + params { + cur2: Efl.Text.Cursor; [[End of range.]] + } + } + + range_text_get @const { + [[Returns the text in the range between cursor and $cur2.]] + return: mstring @move; [[The text in the given range.]] + params { + cur2: Efl.Text.Cursor; [[End of range.]] + } + } + // FIXME: returning an iterator here feels a bit stupid + range_geometry_get { + [[Get the simple geometry in pixels of a range in the text. + + The geometry is the geometry in which rectangles in middle lines of + range are merged into one big rectangle. This is an optimized + version of @.range_precise_geometry_get.]] + params { + cur2: Efl.Text.Cursor; [[End of range.]] + } + return: iterator @move; [[ + Iterator on all geoemtries of the given range.]] + } + range_precise_geometry_get { + [[Get the "precise" geometry in pixels of a range. + + The geometry is represented as rectangles for each of the line + segments in the given range [$cur1, $cur2].]] + params { + cur2: Efl.Text.Cursor; [[End of range.]] + } + return: iterator @move; [[ + Iterator on all simple geometries of the given range.]] + } + range_delete { + [[Deletes the range between given cursors. + + This removes all the text in given range [$start,$end].]] + params { + @in cur2: Efl.Text.Cursor; [[Range end position.]] + } + } + + @property handle { + [[This method should rarely be used by users. It gives you a lightweight handle to a cursor. + + You can either replace the handle to change the object this is working on, or get it for caching + + The handle is freed when the object is freed if set, but otherwise it remains under the control of the caller.]] + set { } + get { } + values { + handle: Efl_Text_Cursor_Handle @by_ref; [[The handle of the cursor object.]] + } + } + + @property text_object { + [[The text object this cursor is associated with.]] + get { } + values { + text_obj: Efl.Canvas.Object; [[The text object.]] + } + } + } + events { + // FIXME: Needed for people who cache the position. + changed: void; [[Called when its position has changed.]] + } + + implements { + Efl.Object.destructor; + Efl.Duplicate.duplicate; + } +} \ No newline at end of file diff --git a/src/lib/evas/canvas/evas_object_textblock.c b/src/lib/evas/canvas/evas_object_textblock.c index 1ec71f2f53..487df68179 100644 --- a/src/lib/evas/canvas/evas_object_textblock.c +++ b/src/lib/evas/canvas/evas_object_textblock.c @@ -66,6 +66,9 @@ #include "evas_common_private.h" #include "evas_private.h" +#include "efl_text_cursor.eo.h" +#include "Efl.h" +#include "efl_canvas_text_internal.h" //#define LYDBG(f, args...) printf(f, ##args) #define LYDBG(f, args...) @@ -90,10 +93,6 @@ static const char o_type[] = "textblock"; #define _NEWLINE '\n' #define _TAB '\t' -#define _REPLACEMENT_CHAR_UTF8 "\xEF\xBF\xBC" -#define _PARAGRAPH_SEPARATOR_UTF8 "\xE2\x80\xA9" -#define _NEWLINE_UTF8 "\n" -#define _TAB_UTF8 "\t" #define EVAS_TEXTBLOCK_IS_VISIBLE_FORMAT_CHAR(ch) \ (((ch) == _REPLACEMENT_CHAR) || \ ((ch) == _NEWLINE) || \ @@ -140,109 +139,7 @@ static const char o_type[] = "textblock"; #define EINA_INLIST_REMOVE(l,i) do { l = (__typeof__(l)) eina_inlist_remove(EINA_INLIST_GET(l), EINA_INLIST_GET(i)); } while (0) #define EINA_INLIST_APPEND(l,i) do { l = (__typeof__(l)) eina_inlist_append(EINA_INLIST_GET(l), EINA_INLIST_GET(i)); } while (0) -/* private struct for textblock object internal data */ -/** - * @internal - * @typedef Efl_Canvas_Text_Data - * The actual textblock object. - */ -typedef struct _Evas_Object_Textblock Efl_Canvas_Text_Data; -/** - * @internal - * @typedef Evas_Object_Style_Tag - * The structure used for finding style tags. - */ -typedef struct _Evas_Object_Style_Tag Evas_Object_Style_Tag; -/** - * @internal - * @typedef Evas_Object_Style_Tag - * The structure used for finding style tags. - */ -typedef struct _Evas_Object_Style_Tag_Base Evas_Object_Style_Tag_Base; -/** - * @internal - * @typedef Evas_Object_Textblock_Node_Text - * A text node. - */ -typedef struct _Evas_Object_Textblock_Node_Text Evas_Object_Textblock_Node_Text; -/* - * Defined in Evas.h -typedef struct _Evas_Object_Textblock_Node_Format Evas_Object_Textblock_Node_Format; -*/ -typedef struct _Evas_Textblock_Node_Format Evas_Textblock_Node_Format; -/** - * @internal - * @typedef Evas_Object_Textblock_Paragraph - * A layouting paragraph. - */ -typedef struct _Evas_Object_Textblock_Paragraph Evas_Object_Textblock_Paragraph; -/** - * @internal - * @typedef Evas_Object_Textblock_Line - * A layouting line. - */ -typedef struct _Evas_Object_Textblock_Line Evas_Object_Textblock_Line; -/** - * @internal - * @typedef Evas_Object_Textblock_Item - * A layouting item. - */ -typedef struct _Evas_Object_Textblock_Item Evas_Object_Textblock_Item; -/** - * @internal - * @typedef Evas_Object_Textblock_Item - * A layouting text item. - */ -typedef struct _Evas_Object_Textblock_Text_Item Evas_Object_Textblock_Text_Item; -/** - * @internal - * @typedef Evas_Object_Textblock_Format_Item - * A layouting format item. - */ -typedef struct _Evas_Object_Textblock_Format_Item Evas_Object_Textblock_Format_Item; -/** - * @internal - * @typedef Evas_Object_Textblock_Format - * A textblock format. - */ -typedef struct _Evas_Object_Textblock_Format Evas_Object_Textblock_Format; -/** - * @internal - * @typedef Evas_Textblock_Selection_Iterator - * A textblock selection iterator. - */ -typedef struct _Evas_Textblock_Selection_Iterator Evas_Textblock_Selection_Iterator; -/** - * @internal - * @typedef Efl_Text_Annotate_Annotation_Iterator - * A textblock annotation iterator. - */ -typedef struct _Efl_Text_Annotate_Annotation_Iterator Efl_Text_Annotate_Annotation_Iterator; -/** - * @internal - * @typedef Efl_Canvas_Text_Filter - * A structure holding gfx filter information for a text item - */ -typedef struct _Efl_Canvas_Text_Filter Efl_Canvas_Text_Filter; -/** - * @internal - * @typedef Efl_Canvas_Text_Filter_Post_Render - * Post-render data for async rendering of gfx filters - */ -typedef struct _Efl_Canvas_Text_Filter_Post_Render Efl_Canvas_Text_Filter_Post_Render; -/** - * @internal - * @typedef Efl_Canvas_Text_Filter_Program - * Filter name - code database - */ -typedef struct _Efl_Canvas_Text_Filter_Program Efl_Canvas_Text_Filter_Program; -/** - * @internal - * @typedef Text_Item_Filter - * Text item filter properties (run context, output buffer, ...) - */ -typedef struct _Text_Item_Filter Text_Item_Filter; /** * @internal * @def IS_AT_END(ti, ind) @@ -305,48 +202,6 @@ typedef struct _Text_Item_Filter Text_Item_Filter; (base[closer_len] == '=') || \ _is_white(base[closer_len]))) -struct _Evas_Object_Style_Tag_Base -{ - const char *tag; /**< Format Identifier: b=Bold, i=Italic etc. */ - const char *replace; /**< Replacement string. "font_weight=Bold", "font_style=Italic" etc. */ - size_t tag_len; /**< Strlen of tag. */ -}; - -struct _Evas_Object_Style_Tag -{ - EINA_INLIST; - Evas_Object_Style_Tag_Base tag; /**< Base style object for holding style information. */ -}; - -struct _Evas_Object_Textblock_Node_Text -{ - EINA_INLIST; - Eina_UStrbuf *unicode; /**< Actual paragraph text. */ - char *utf8; /**< Text in utf8 format. */ - Evas_Object_Textblock_Node_Format *format_node; /**< Points to the last format node before the paragraph, or if there is none, to the first format node within the paragraph.*/ - Evas_Object_Textblock_Paragraph *par; /**< Points to the paragraph node of which this node is a part. */ - Eina_Bool dirty : 1; /**< EINA_TRUE if already handled/format changed, else EINA_FALSE. */ - Eina_Bool is_new : 1; /**< EINA_TRUE if its a new paragraph, else EINA_FALSE. */ -}; - -struct _Evas_Textblock_Node_Format -{ - EINA_INLIST; - const char *format; /**< Cached, parsed and translated version of orig_format. */ - const char *orig_format; /**< Original format information. */ - Evas_Object_Textblock_Node_Text *text_node; /**< The text node it's pointing to. */ - Efl_Text_Annotate_Annotation *annotation; /**< Pointer to this node's annotation handle (if exists). */ - size_t offset; /**< Offset from the last format node of the same text. */ - struct { - unsigned char l, r, t, b; - } pad; /**< Amount of padding required. */ - unsigned char anchor : 2; /**< ANCHOR_NONE, ANCHOR_A or ANCHOR_ITEM. */ - Eina_Bool opener : 1; /**< EINA_TRUE if opener, else EINA_FALSE. */ - Eina_Bool own_closer : 1; /**< EINA_TRUE if own_closer, else EINA_FALSE. */ - Eina_Bool visible : 1; /**< EINA_TRUE if format is visible format, else EINA_FALSE. */ - Eina_Bool format_change : 1; /**< EINA_TRUE if the format of the textblock has changed, else EINA_FALSE. */ - Eina_Bool is_new : 1; /**< EINA_TRUE if its a new format node, else EINA_FALSE */ -}; /* The default tags to use */ static const Evas_Object_Style_Tag_Base default_tags[] = { @@ -564,15 +419,6 @@ typedef struct _User_Style_Entry Evas_Textblock_Style *st; const char *key; } User_Style_Entry; - -struct _Efl_Text_Cursor_Cursor -{ - Evas_Object *obj; - size_t pos; - Evas_Object_Textblock_Node_Text *node; - Eina_Bool changed : 1; -}; - struct _Efl_Text_Annotate_Annotation { EINA_INLIST; @@ -601,7 +447,7 @@ struct _Evas_Object_Textblock int layout_jobs; Evas_Textblock_Style *style; Eina_List *styles; - Efl_Text_Cursor_Cursor *cursor; + Efl_Text_Cursor_Handle *cursor; Eina_List *cursors; Evas_Object_Textblock_Node_Text *text_nodes; Evas_Object_Textblock_Node_Format *format_nodes; @@ -747,23 +593,23 @@ static const Evas_Object_Func object_func = MAGIC_CHECK(eo_obj, Evas_Object, MAGIC_OBJ); \ return (x); \ MAGIC_CHECK_END(); -static Eina_Bool _evas_textblock_cursor_is_at_the_end(const Efl_Text_Cursor_Cursor *cur); +static Eina_Bool _evas_textblock_cursor_is_at_the_end(const Efl_Text_Cursor_Handle *cur); static void _evas_textblock_node_text_remove(Efl_Canvas_Text_Data *o, Evas_Object_Textblock_Node_Text *n); -static Evas_Object_Textblock_Node_Format *_evas_textblock_cursor_node_format_before_or_at_pos_get(const Efl_Text_Cursor_Cursor *cur); +static Evas_Object_Textblock_Node_Format *_evas_textblock_cursor_node_format_before_or_at_pos_get(const Efl_Text_Cursor_Handle *cur); static size_t _evas_textblock_node_format_pos_get(const Evas_Object_Textblock_Node_Format *fmt); static void _evas_textblock_node_format_remove(Efl_Canvas_Text_Data *o, Evas_Object_Textblock_Node_Format *n, int visual_adjustment); static void _evas_textblock_node_format_free(Efl_Canvas_Text_Data *o, Evas_Object_Textblock_Node_Format *n); static void _evas_textblock_node_text_free(Evas_Object_Textblock_Node_Text *n); static void _evas_textblock_changed(Efl_Canvas_Text_Data *o, Evas_Object *eo_obj); static void _evas_textblock_invalidate_all(Efl_Canvas_Text_Data *o); -static void _evas_textblock_cursors_update_offset(const Efl_Text_Cursor_Cursor *cur, const Evas_Object_Textblock_Node_Text *n, size_t start, int offset); +static void _evas_textblock_cursors_update_offset(const Efl_Text_Cursor_Handle *cur, const Evas_Object_Textblock_Node_Text *n, size_t start, int offset); static void _evas_textblock_cursors_set_node(Efl_Canvas_Text_Data *o, const Evas_Object_Textblock_Node_Text *n, Evas_Object_Textblock_Node_Text *new_node); static void _evas_textblock_annotations_clear(Efl_Canvas_Text_Data *o); static void _evas_textblock_annotation_remove(Efl_Canvas_Text_Data *o, Efl_Text_Annotate_Annotation *an, Eina_Bool remove_nodes); -static Eina_Bool _evas_textblock_cursor_format_is_visible_get(const Efl_Text_Cursor_Cursor *cur); -static void _evas_textblock_cursor_at_format_set(Efl_Text_Cursor_Cursor *cur, const Evas_Object_Textblock_Node_Format *fmt); -static void _evas_textblock_cursor_init(Efl_Text_Cursor_Cursor *cur, const Evas_Object *tb); +static Eina_Bool _evas_textblock_cursor_format_is_visible_get(const Efl_Text_Cursor_Handle *cur); +static void _evas_textblock_cursor_at_format_set(Efl_Text_Cursor_Handle *cur, const Evas_Object_Textblock_Node_Format *fmt); +static void _evas_textblock_cursor_init(Efl_Text_Cursor_Handle *cur, const Evas_Object *tb); static Evas_Filter_Program *_format_filter_program_get(Efl_Canvas_Text_Data *o, Evas_Object_Textblock_Format *fmt); static const char *_textblock_format_node_from_style_tag(Efl_Canvas_Text_Data *o, Evas_Object_Textblock_Node_Format *fnode, const char *format, size_t format_len); #ifdef HAVE_HYPHEN @@ -771,15 +617,14 @@ static const char *_textblock_format_node_from_style_tag(Efl_Canvas_Text_Data *o #include "evas_textblock_hyphenation.x" #endif -static int _efl_canvas_text_cursor_text_append(Efl_Text_Cursor_Cursor *cur, const char *text); -static Eina_Bool _evas_textblock_cursor_format_append(Efl_Text_Cursor_Cursor *cur, const char *format, Evas_Object_Textblock_Node_Format **_fnode, Eina_Bool is_item); +static Eina_Bool _evas_textblock_cursor_format_append(Efl_Text_Cursor_Handle *cur, const char *format, Evas_Object_Textblock_Node_Format **_fnode, Eina_Bool is_item); EAPI Eina_Bool evas_textblock_cursor_eol_get(const Evas_Textblock_Cursor *cur); -static void _evas_textblock_cursor_init(Efl_Text_Cursor_Cursor *cur, const Evas_Object *tb); -static Eina_Bool _evas_textblock_cursor_format_is_visible_get(const Efl_Text_Cursor_Cursor *cur); +static void _evas_textblock_cursor_init(Efl_Text_Cursor_Handle *cur, const Evas_Object *tb); +static Eina_Bool _evas_textblock_cursor_format_is_visible_get(const Efl_Text_Cursor_Handle *cur); static void _find_layout_item_line_match(Evas_Object *eo_obj, Evas_Object_Textblock_Node_Text *n, size_t pos, Evas_Object_Textblock_Line **lnr, Evas_Object_Textblock_Item **itr); -static Evas_Object_Textblock_Node_Format *_evas_textblock_cursor_node_format_at_pos_get(const Efl_Text_Cursor_Cursor *cur); -static int _evas_textblock_cursor_text_prepend(Efl_Text_Cursor_Cursor *cur, const char *_text); -static void _evas_textblock_cursor_copy(Efl_Text_Cursor_Cursor *dst, const Efl_Text_Cursor_Cursor *src); +static Evas_Object_Textblock_Node_Format *_evas_textblock_cursor_node_format_at_pos_get(const Efl_Text_Cursor_Handle *cur); +static int _evas_textblock_cursor_text_prepend(Efl_Text_Cursor_Handle *cur, const char *_text); +static void _evas_textblock_cursor_copy(Efl_Text_Cursor_Handle *dst, const Efl_Text_Cursor_Handle *src); static void _textblock_style_generic_set(Evas_Object *eo_obj, Evas_Textblock_Style *ts, const char *key); @@ -1500,7 +1345,7 @@ _is_white(Eina_Unicode c) * @param[in] p end of the string */ static void -_prepend_text_run(Efl_Text_Cursor_Cursor *cur, const char *s, const char *p) +_prepend_text_run(Efl_Text_Cursor_Handle *cur, const char *s, const char *p) { if ((s) && (p > s)) { @@ -7666,6 +7511,20 @@ _efl_canvas_text_style_get(const Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o return ts ? ts->style_text : NULL; } +EOLIAN static void +_efl_canvas_text_cursor_add(Eo *obj, Efl_Canvas_Text_Data *pd EINA_UNUSED, Efl_Text_Cursor *cursor) +{ + efl_text_cursor_text_object_set(cursor, obj, obj); +} + +EOLIAN static Efl_Text_Cursor * +_efl_canvas_text_cursor_create(Eo *obj, Efl_Canvas_Text_Data *pd EINA_UNUSED) +{ + Eo* cursor = efl_add(EFL_TEXT_CURSOR_CLASS, obj); + efl_text_cursor_text_object_set(cursor, obj, obj); + return cursor; +} + #define _STYLE_USER "_style_user" EAPI void evas_object_textblock_style_user_push(Eo *eo_obj, Evas_Textblock_Style *ts) @@ -7714,7 +7573,7 @@ evas_object_textblock_replace_char_set(Efl_Canvas_Text *eo_obj, const char *ch) EOLIAN static void -_efl_canvas_text_legacy_newline_set(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o, Eina_Bool mode) +_efl_canvas_text_newline_as_paragraph_separator_set(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o, Eina_Bool mode) { Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); evas_object_async_block(obj); @@ -7727,7 +7586,7 @@ _efl_canvas_text_legacy_newline_set(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data } EOLIAN static Eina_Bool -_efl_canvas_text_legacy_newline_get(const Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o) +_efl_canvas_text_newline_as_paragraph_separator_get(const Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o) { return o->legacy_newline; } @@ -7761,7 +7620,7 @@ evas_object_textblock_valign_get(const Efl_Canvas_Text *obj) } EOLIAN static void -_efl_canvas_text_bidi_delimiters_set(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o, const char *delim) +_efl_canvas_text_bidi_delimiters_set(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, const char *delim) { Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); evas_object_async_block(obj); @@ -8009,13 +7868,23 @@ evas_textblock_string_escape_get(const char *string, int *len_ret) return _escaped_char_match(string, len_ret); } +static void _evas_textblock_cursor_object_changed(Efl_Text_Cursor_Handle *cur) +{ + if (!cur || !cur->cur_objs) return; + Eina_List *l; + Eo *cur_obj; + + EINA_LIST_FOREACH(cur->cur_objs, l, cur_obj) + efl_event_callback_call(cur_obj, EFL_TEXT_CURSOR_EVENT_CHANGED, NULL); +} + static void -_cursor_emit_if_changed(Efl_Text_Cursor_Cursor *cur) +_cursor_emit_if_changed(Efl_Text_Cursor_Handle *cur) { if (cur->changed) { cur->changed = EINA_FALSE; - efl_event_callback_legacy_call(cur->obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); + _evas_textblock_cursor_object_changed(cur); } } @@ -8028,7 +7897,7 @@ _cursor_emit_if_changed(Efl_Text_Cursor_Cursor *cur) * @param s_end the end of the string. */ static inline void -_prepend_escaped_char(Efl_Text_Cursor_Cursor *cur_obj, const char *s, +_prepend_escaped_char(Efl_Text_Cursor_Handle *cur_obj, const char *s, const char *s_end) { const char *escape; @@ -8065,7 +7934,7 @@ _evas_object_textblock_text_markup_set(Eo *eo_obj, Efl_Canvas_Text_Data *o, _nodes_clear(eo_obj); - Efl_Text_Cursor_Cursor *co = o->cursor; + Efl_Text_Cursor_Handle *co = o->cursor; co->node = _evas_textblock_node_text_new(); o->text_nodes = _NODE_TEXT(eina_inlist_append( EINA_INLIST_GET(o->text_nodes), @@ -8078,17 +7947,17 @@ _evas_object_textblock_text_markup_set(Eo *eo_obj, Efl_Canvas_Text_Data *o, /* Point all the cursors to the starrt */ { Eina_List *l; - Efl_Text_Cursor_Cursor *data; + Efl_Text_Cursor_Handle *cur; evas_textblock_cursor_paragraph_first(o->cursor); - EINA_LIST_FOREACH(o->cursors, l, data) + EINA_LIST_FOREACH(o->cursors, l, cur) { - evas_textblock_cursor_paragraph_first(data); + evas_textblock_cursor_paragraph_first(cur); + _evas_textblock_cursor_object_changed(cur); } } efl_event_thaw(eo_obj); - efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); o->markup_text = text; } @@ -8112,7 +7981,7 @@ _efl_canvas_text_efl_text_markup_markup_set(Eo *eo_obj, Efl_Canvas_Text_Data *o, static void _evas_object_textblock_text_markup_prepend(Eo *eo_obj, - Efl_Text_Cursor_Cursor *cur, const char *text) + Efl_Text_Cursor_Handle *cur, const char *text) { if (!cur) return; Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); @@ -8259,21 +8128,12 @@ _evas_object_textblock_text_markup_prepend(Eo *eo_obj, } EAPI void -evas_object_textblock_text_markup_prepend(Efl_Text_Cursor_Cursor *cur, const char *text) +evas_object_textblock_text_markup_prepend(Efl_Text_Cursor_Handle *cur, const char *text) { EINA_SAFETY_ON_NULL_RETURN(cur); _evas_object_textblock_text_markup_prepend(cur->obj, cur, text); } -EOLIAN static void -_efl_canvas_text_efl_text_markup_interactive_cursor_markup_insert(Eo *eo_obj, - Efl_Canvas_Text_Data *o EINA_UNUSED, - Efl_Text_Cursor_Cursor *cur, const char *markup) -{ - ASYNC_BLOCK; - _evas_object_textblock_text_markup_prepend(eo_obj, cur, markup); - efl_event_callback_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CHANGED, NULL); -} /** * @internal @@ -8898,7 +8758,7 @@ _evas_textblock_nodes_merge(Efl_Canvas_Text_Data *o, Evas_Object_Textblock_Node_ * @param cur the cursor that points to the current node */ static void -_evas_textblock_cursor_nodes_merge(Efl_Text_Cursor_Cursor *cur) +_evas_textblock_cursor_nodes_merge(Efl_Text_Cursor_Handle *cur) { Evas_Object_Textblock_Node_Text *nnode; int len; @@ -8911,7 +8771,7 @@ _evas_textblock_cursor_nodes_merge(Efl_Text_Cursor_Cursor *cur) _evas_textblock_nodes_merge(o, cur->node); _evas_textblock_cursors_update_offset(cur, nnode, 0, len); _evas_textblock_cursors_set_node(o, nnode, cur->node); - Efl_Text_Cursor_Cursor *co = o->cursor; + Efl_Text_Cursor_Handle *co = o->cursor; if (nnode == co->node) { co->node = cur->node; @@ -8927,7 +8787,7 @@ _evas_textblock_cursor_nodes_merge(Efl_Text_Cursor_Cursor *cur) * @return the format node at the specific position or NULL if not found. */ static Evas_Object_Textblock_Node_Format * -_evas_textblock_cursor_node_format_at_pos_get(const Efl_Text_Cursor_Cursor *cur) +_evas_textblock_cursor_node_format_at_pos_get(const Efl_Text_Cursor_Handle *cur) { Evas_Object_Textblock_Node_Format *node; Evas_Object_Textblock_Node_Format *itr; @@ -9018,7 +8878,7 @@ _evas_textblock_node_visible_at_pos_get(const Evas_Object_Textblock_Node_Format * @return the format node found. */ static Evas_Object_Textblock_Node_Format * -_evas_textblock_cursor_node_format_before_or_at_pos_get(const Efl_Text_Cursor_Cursor *cur) +_evas_textblock_cursor_node_format_before_or_at_pos_get(const Efl_Text_Cursor_Handle *cur) { Evas_Object_Textblock_Node_Format *node, *pitr = NULL; Evas_Object_Textblock_Node_Format *itr; @@ -9068,9 +8928,9 @@ _evas_textblock_cursor_node_format_before_or_at_pos_get(const Efl_Text_Cursor_Cu * otherwise. */ static Eina_Bool -_find_layout_item_match(const Efl_Text_Cursor_Cursor *cur, Evas_Object_Textblock_Line **lnr, Evas_Object_Textblock_Item **itr) +_find_layout_item_match(const Efl_Text_Cursor_Handle *cur, Evas_Object_Textblock_Line **lnr, Evas_Object_Textblock_Item **itr) { - Efl_Text_Cursor_Cursor cur2; + Efl_Text_Cursor_Handle cur2; Eina_Bool previous_format = EINA_FALSE; _evas_textblock_cursor_init(&cur2, cur->obj); @@ -9094,34 +8954,87 @@ _find_layout_item_match(const Efl_Text_Cursor_Cursor *cur, Evas_Object_Textblock } static void -_evas_textblock_cursor_init(Efl_Text_Cursor_Cursor *cur, const Evas_Object *tb) +_evas_textblock_cursor_init(Efl_Text_Cursor_Handle *cur, const Evas_Object *tb) { + memset(cur, 0, sizeof(Efl_Text_Cursor_Handle)); cur->obj = (Eo *) tb; + cur->cur_objs = NULL; + cur->ref_count = 1; + Efl_Canvas_Text_Data *o = efl_data_scope_safe_get(cur->obj, MY_CLASS); + if (!o) return; - Efl_Canvas_Text_Data *o = efl_data_scope_get(cur->obj, MY_CLASS); cur->node = o->text_nodes; cur->pos = 0; } -EAPI Efl_Text_Cursor_Cursor * +EAPI Efl_Text_Cursor_Handle * evas_object_textblock_cursor_new(const Evas_Object *eo_obj) { EINA_SAFETY_ON_NULL_RETURN_VAL(eo_obj, NULL); - return efl_text_cursor_new((Eo *) eo_obj); + Efl_Text_Cursor_Handle *cur; + Evas_Object_Protected_Data *obj = efl_data_scope_safe_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); + if (!obj) return NULL; + evas_object_async_block(obj); + + Efl_Canvas_Text_Data *o = efl_data_scope_safe_get(eo_obj, MY_CLASS); + if (!o) return NULL; + + cur = calloc(1, sizeof(Efl_Text_Cursor_Handle)); + if (!cur) return NULL; + _evas_textblock_cursor_init(cur, eo_obj); + + o->cursors = eina_list_append(o->cursors, cur); + return cur; } EAPI void evas_textblock_cursor_free(Evas_Textblock_Cursor *cur) { if (!cur) return; - Efl_Canvas_Text_Data *o = efl_data_scope_get(cur->obj, MY_CLASS); + Efl_Canvas_Text_Data *o = efl_data_scope_safe_get(cur->obj, MY_CLASS); + if (!o) return; if (cur == o->cursor) return; o->cursors = eina_list_remove(o->cursors, cur); free(cur); } +Efl_Text_Cursor_Handle * +evas_textblock_cursor_ref(Efl_Text_Cursor_Handle *cur, Eo * cur_obj) +{ + if (!cur) return NULL; + /* Does not work with TextBlock Main Cursor*/ + Efl_Canvas_Text_Data *o = efl_data_scope_safe_get(cur->obj, MY_CLASS); + if (!o) return NULL; + + if (cur == o->cursor) return NULL; + + cur->ref_count++; + if (cur_obj) cur->cur_objs = eina_list_append(cur->cur_objs, cur_obj); + + return cur; +} + +void +evas_textblock_cursor_unref(Efl_Text_Cursor_Handle *cursor, Eo * cur_obj) +{ + if (!cursor) return; + /* Does not work with TextBlock Main Cursor*/ + Efl_Canvas_Text_Data *o = efl_data_scope_safe_get(cursor->obj, MY_CLASS); + if (!o) return; + + if (cursor == o->cursor) return; + + cursor->ref_count--; + if (cur_obj) cursor->cur_objs = eina_list_remove(cursor->cur_objs, cur_obj); + + if (cursor->ref_count == 0) + { + evas_textblock_cursor_free(cursor); + } +} + EAPI Eina_Bool -_evas_textblock_cursor_is_format(const Efl_Text_Cursor_Cursor *cur) +_evas_textblock_cursor_is_format(const Efl_Text_Cursor_Handle *cur) { if ((!cur) || (!cur->node)) return EINA_FALSE; Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); @@ -9257,7 +9170,7 @@ found: { size_t ind = _evas_textblock_node_format_pos_get(n); const char *format = n->format; - Efl_Text_Cursor_Cursor cur; + Efl_Text_Cursor_Handle cur; _evas_textblock_cursor_init(&cur, eo_obj); eina_ustrbuf_remove(n->text_node->unicode, ind, ind + 1); @@ -9295,7 +9208,7 @@ found: } EAPI void -evas_textblock_cursor_paragraph_first(Efl_Text_Cursor_Cursor *cur) +evas_textblock_cursor_paragraph_first(Efl_Text_Cursor_Handle *cur) { if (!cur) return; Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); @@ -9303,18 +9216,11 @@ evas_textblock_cursor_paragraph_first(Efl_Text_Cursor_Cursor *cur) Efl_Canvas_Text_Data *o = efl_data_scope_get(cur->obj, MY_CLASS); cur->node = o->text_nodes; cur->pos = 0; -} - -EOLIAN static void -_efl_canvas_text_efl_text_cursor_cursor_paragraph_first(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Cursor *cur) -{ - ASYNC_BLOCK; - evas_textblock_cursor_paragraph_first(cur); - efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); + _evas_textblock_cursor_object_changed(cur); } EAPI void -evas_textblock_cursor_paragraph_last(Efl_Text_Cursor_Cursor *cur) +evas_textblock_cursor_paragraph_last(Efl_Text_Cursor_Handle *cur) { Evas_Object_Textblock_Node_Text *node; @@ -9335,18 +9241,11 @@ evas_textblock_cursor_paragraph_last(Efl_Text_Cursor_Cursor *cur) cur->node = NULL; cur->pos = 0; } -} - -EOLIAN static void -_efl_canvas_text_efl_text_cursor_cursor_paragraph_last(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Cursor *cur) -{ - ASYNC_BLOCK; - evas_textblock_cursor_paragraph_last(cur); - efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); + _evas_textblock_cursor_object_changed(cur); } static Eina_Bool -_evas_textblock_cursor_paragraph_next(Efl_Text_Cursor_Cursor *cur) +_evas_textblock_cursor_paragraph_next(Efl_Text_Cursor_Handle *cur) { if (!cur) return EINA_FALSE; Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); @@ -9370,22 +9269,17 @@ _evas_textblock_cursor_paragraph_next(Efl_Text_Cursor_Cursor *cur) } EAPI Eina_Bool -evas_textblock_cursor_paragraph_next(Efl_Text_Cursor_Cursor *cur) +evas_textblock_cursor_paragraph_next(Efl_Text_Cursor_Handle *cur) { - if (!cur) return EINA_FALSE; - return _evas_textblock_cursor_paragraph_next(cur); -} - -EOLIAN static void -_efl_canvas_text_efl_text_cursor_cursor_paragraph_next(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, Evas_Textblock_Cursor *cur) -{ - ASYNC_BLOCK; - evas_textblock_cursor_paragraph_next(cur); - efl_event_callback_legacy_call(obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); + Eina_Bool b_ret = EINA_FALSE; + if (!cur) return b_ret; + b_ret = _evas_textblock_cursor_paragraph_next(cur); + if (b_ret) _evas_textblock_cursor_object_changed(cur); + return b_ret; } static Eina_Bool -_evas_textblock_cursor_paragraph_prev(Efl_Text_Cursor_Cursor *cur) +_evas_textblock_cursor_paragraph_prev(Efl_Text_Cursor_Handle *cur) { Evas_Object_Textblock_Node_Text *node; if (!cur) return EINA_FALSE; @@ -9414,19 +9308,13 @@ _evas_textblock_cursor_paragraph_prev(Efl_Text_Cursor_Cursor *cur) EAPI Eina_Bool -evas_textblock_cursor_paragraph_prev(Efl_Text_Cursor_Cursor *cur) +evas_textblock_cursor_paragraph_prev(Efl_Text_Cursor_Handle *cur) { - if (!cur) return EINA_FALSE; - return _evas_textblock_cursor_paragraph_prev(cur); -} - -EOLIAN static void -_efl_canvas_text_efl_text_cursor_cursor_paragraph_prev(Eo *obj EINA_UNUSED, - Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Cursor *cur) -{ - ASYNC_BLOCK; - _evas_textblock_cursor_paragraph_prev(cur); - efl_event_callback_legacy_call(obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); + Eina_Bool b_ret = EINA_FALSE; + if (!cur) return b_ret; + b_ret = _evas_textblock_cursor_paragraph_prev(cur); + if (b_ret) _evas_textblock_cursor_object_changed(cur); + return b_ret; } EAPI void @@ -9517,7 +9405,7 @@ evas_textblock_cursor_format_prev(Evas_Textblock_Cursor *cur) (breaks[i] == WORDBREAK_BREAK) EAPI Eina_Bool -evas_textblock_cursor_word_start(Efl_Text_Cursor_Cursor *cur) +evas_textblock_cursor_word_start(Efl_Text_Cursor_Handle *cur) { if (!cur) return EINA_FALSE; const Eina_Unicode *text; @@ -9573,19 +9461,12 @@ evas_textblock_cursor_word_start(Efl_Text_Cursor_Cursor *cur) cur->pos = i; free(breaks); + _evas_textblock_cursor_object_changed(cur); return EINA_TRUE; } -EOLIAN static void -_efl_canvas_text_efl_text_cursor_cursor_word_start(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Cursor *cur EINA_UNUSED) -{ - ASYNC_BLOCK; - evas_textblock_cursor_word_start(cur); - efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); -} - EAPI Eina_Bool -evas_textblock_cursor_word_end(Efl_Text_Cursor_Cursor *cur) +evas_textblock_cursor_word_end(Efl_Text_Cursor_Handle *cur) { if (!cur) return EINA_FALSE; const Eina_Unicode *text; @@ -9635,17 +9516,10 @@ evas_textblock_cursor_word_end(Efl_Text_Cursor_Cursor *cur) cur->pos = i; free(breaks); + _evas_textblock_cursor_object_changed(cur); return EINA_TRUE; } -EOLIAN static void -_efl_canvas_text_efl_text_cursor_cursor_word_end(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Cursor *cur EINA_UNUSED) -{ - ASYNC_BLOCK; - evas_textblock_cursor_word_end(cur); - efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); -} - static char * _evas_textblock_grapheme_breaks_new(Evas_Object_Textblock_Item *it, size_t len) { @@ -9892,80 +9766,49 @@ _evas_textblock_cursor_prev(Evas_Textblock_Cursor *cur, Eina_Bool per_cluster) } EAPI Eina_Bool -evas_textblock_cursor_char_next(Efl_Text_Cursor_Cursor *cur) +evas_textblock_cursor_char_next(Efl_Text_Cursor_Handle *cur) { - return _evas_textblock_cursor_next(cur, EINA_FALSE); -} - -EOLIAN static void -_efl_canvas_text_efl_text_cursor_cursor_char_next(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Cursor *cur) -{ - ASYNC_BLOCK; - if (_evas_textblock_cursor_next(cur, EINA_FALSE)) - efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); + Eina_Bool b_ret = _evas_textblock_cursor_next(cur, EINA_FALSE); + if (b_ret) _evas_textblock_cursor_object_changed(cur); + return b_ret; } EAPI Eina_Bool -evas_textblock_cursor_char_prev(Efl_Text_Cursor_Cursor *cur) +evas_textblock_cursor_char_prev(Efl_Text_Cursor_Handle *cur) { - return _evas_textblock_cursor_prev(cur, EINA_FALSE); -} - -EOLIAN static void -_efl_canvas_text_efl_text_cursor_cursor_char_prev(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Cursor *cur) -{ - ASYNC_BLOCK; - if (_evas_textblock_cursor_prev(cur, EINA_FALSE)) - efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); + Eina_Bool b_ret = _evas_textblock_cursor_prev(cur, EINA_FALSE); + if (b_ret) _evas_textblock_cursor_object_changed(cur); + return b_ret; } EAPI Eina_Bool -evas_textblock_cursor_cluster_next(Efl_Text_Cursor_Cursor *cur) +evas_textblock_cursor_cluster_next(Efl_Text_Cursor_Handle *cur) { - return _evas_textblock_cursor_next(cur, EINA_TRUE); -} - -EOLIAN static void -_efl_canvas_text_efl_text_cursor_cursor_cluster_next(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Cursor *cur) -{ - ASYNC_BLOCK; - if (_evas_textblock_cursor_next(cur, EINA_TRUE)) - efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); + Eina_Bool b_ret = _evas_textblock_cursor_next(cur, EINA_TRUE); + if (b_ret) _evas_textblock_cursor_object_changed(cur); + return b_ret; } EAPI Eina_Bool -evas_textblock_cursor_cluster_prev(Efl_Text_Cursor_Cursor *cur) +evas_textblock_cursor_cluster_prev(Efl_Text_Cursor_Handle *cur) { - return _evas_textblock_cursor_prev(cur, EINA_TRUE); -} - -EOLIAN static void -_efl_canvas_text_efl_text_cursor_cursor_cluster_prev(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Cursor *cur) -{ - ASYNC_BLOCK; - if (_evas_textblock_cursor_prev(cur, EINA_TRUE)) - efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); + Eina_Bool b_ret = _evas_textblock_cursor_prev(cur, EINA_TRUE); + if (b_ret) _evas_textblock_cursor_object_changed(cur); + return b_ret; } EAPI void -evas_textblock_cursor_paragraph_char_first(Efl_Text_Cursor_Cursor *cur) +evas_textblock_cursor_paragraph_char_first(Efl_Text_Cursor_Handle *cur) { if (!cur) return; Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); evas_object_async_block(obj); cur->pos = 0; -} - -EOLIAN static void -_efl_canvas_text_efl_text_cursor_cursor_paragraph_char_first(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Cursor *cur) -{ - ASYNC_BLOCK; - evas_textblock_cursor_paragraph_char_first(cur); - efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); + _evas_textblock_cursor_object_changed(cur); } EAPI void -evas_textblock_cursor_paragraph_char_last(Efl_Text_Cursor_Cursor *cur) +evas_textblock_cursor_paragraph_char_last(Efl_Text_Cursor_Handle *cur) { int ind; @@ -9983,19 +9826,13 @@ evas_textblock_cursor_paragraph_char_last(Efl_Text_Cursor_Cursor *cur) cur->pos = ind; else cur->pos = 0; -} -EOLIAN static void -_efl_canvas_text_efl_text_cursor_cursor_paragraph_char_last(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Cursor *cur) -{ - ASYNC_BLOCK; - evas_textblock_cursor_paragraph_char_last(cur); - efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); + _evas_textblock_cursor_object_changed(cur); } static void _cursor_line_first_char_get(Evas_Object_Textblock_Line *ln, - Efl_Text_Cursor_Cursor *cur, + Efl_Text_Cursor_Handle *cur, Efl_Canvas_Text_Data *o) { if (ln->items) @@ -10021,7 +9858,7 @@ _cursor_line_first_char_get(Evas_Object_Textblock_Line *ln, } EAPI void -evas_textblock_cursor_line_char_first(Efl_Text_Cursor_Cursor *cur) +evas_textblock_cursor_line_char_first(Efl_Text_Cursor_Handle *cur) { Evas_Object_Textblock_Line *ln = NULL; Evas_Object_Textblock_Item *it = NULL; @@ -10041,10 +9878,12 @@ evas_textblock_cursor_line_char_first(Efl_Text_Cursor_Cursor *cur) if (!ln) return; _cursor_line_first_char_get(ln, cur, o); + + _evas_textblock_cursor_object_changed(cur); } EAPI void -evas_textblock_cursor_line_char_last(Efl_Text_Cursor_Cursor *cur) +evas_textblock_cursor_line_char_last(Efl_Text_Cursor_Handle *cur) { Evas_Object_Textblock_Line *ln = NULL; Evas_Object_Textblock_Item *it = NULL; @@ -10089,24 +9928,9 @@ evas_textblock_cursor_line_char_last(Efl_Text_Cursor_Cursor *cur) cur->pos++; } } -} -EOLIAN static void -_efl_canvas_text_efl_text_cursor_cursor_line_char_last(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Cursor *cur) -{ - ASYNC_BLOCK; - evas_textblock_cursor_line_char_last(cur); - efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); + _evas_textblock_cursor_object_changed(cur); } - -EOLIAN static void -_efl_canvas_text_efl_text_cursor_cursor_line_char_first(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Cursor *cur) -{ - ASYNC_BLOCK; - evas_textblock_cursor_line_char_first(cur); - efl_event_callback_legacy_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); -} - /** * @internal * checks if a format (as a string) is visible/changes format and sets the @@ -10172,7 +9996,7 @@ _evas_textblock_format_is_visible(Evas_Object_Textblock_Node_Format *fnode, * @return nothing. */ static void EINA_UNUSED -_evas_textblock_cursor_node_text_at_format(Efl_Text_Cursor_Cursor *cur, Evas_Object_Textblock_Node_Format *fmt) +_evas_textblock_cursor_node_text_at_format(Efl_Text_Cursor_Handle *cur, Evas_Object_Textblock_Node_Format *fmt) { Evas_Object_Textblock_Node_Text *text; Evas_Object_Textblock_Node_Format *base_format; @@ -10546,18 +10370,17 @@ _evas_textblock_node_format_pos_get(const Evas_Object_Textblock_Node_Format *fmt return position + fmt->offset; } -EOLIAN static int -_efl_canvas_text_efl_text_cursor_cursor_position_get(const Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Cursor *cur) +EAPI int +evas_textblock_cursor_pos_get(const Efl_Text_Cursor_Handle *cur) { - ASYNC_BLOCK; + if (!cur) return -1; + Evas_Object_Textblock_Node_Text *n; size_t npos = 0; - - if (!cur) return -1; - if (cur->obj != eo_obj) return -1; - Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); + Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); evas_object_async_block(obj); TB_NULL_CHECK(cur->node, 0); + Efl_Canvas_Text_Data *o = efl_data_scope_get(cur->obj, MY_CLASS); n = o->text_nodes; while (n != cur->node) { @@ -10567,16 +10390,8 @@ _efl_canvas_text_efl_text_cursor_cursor_position_get(const Eo *eo_obj EINA_UNUSE return npos + cur->pos; } -EAPI int -evas_textblock_cursor_pos_get(const Efl_Text_Cursor_Cursor *cur) -{ - if (!cur) return -1; - return efl_text_cursor_position_get(cur->obj, - (Efl_Text_Cursor_Cursor *) cur); -} - EAPI void -evas_textblock_cursor_pos_set(Efl_Text_Cursor_Cursor *cur, int _pos) +evas_textblock_cursor_pos_set(Efl_Text_Cursor_Handle *cur, int _pos) { Evas_Object_Textblock_Node_Text *n; size_t pos; @@ -10619,14 +10434,8 @@ evas_textblock_cursor_pos_set(Efl_Text_Cursor_Cursor *cur, int _pos) cur->node = last_n; cur->pos = pos; } -} -EOLIAN static void -_efl_canvas_text_efl_text_cursor_cursor_position_set(Eo *cur_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Cursor *cur, int _pos) -{ - ASYNC_BLOCK; - evas_textblock_cursor_pos_set(cur, _pos); - efl_event_callback_legacy_call(cur_obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); + _evas_textblock_cursor_object_changed(cur); } EAPI Eina_Bool @@ -10650,9 +10459,10 @@ evas_textblock_cursor_line_set(Evas_Textblock_Cursor *cur, int line) return EINA_TRUE; } -EOLIAN static void -_efl_canvas_text_efl_text_cursor_cursor_line_jump_by(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Cursor *cur EINA_UNUSED, int by) +EAPI void +evas_textblock_cursor_line_jump_by(Efl_Text_Cursor_Handle *cur, int by) { + Efl_Canvas_Text_Data *o = efl_data_scope_get(cur->obj, MY_CLASS); ASYNC_BLOCK; int ln; Evas_Coord cx, cw; @@ -10708,14 +10518,13 @@ _efl_canvas_text_efl_text_cursor_cursor_line_jump_by(Eo *eo_obj EINA_UNUSED, Efl if ((pnode != cur->node) || (ppos != cur->pos)) { - efl_event_callback_legacy_call(eo_obj, - EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); + _evas_textblock_cursor_object_changed(cur); } } EAPI int -evas_textblock_cursor_compare(const Efl_Text_Cursor_Cursor *cur1, - const Efl_Text_Cursor_Cursor *cur2) +evas_textblock_cursor_compare(const Efl_Text_Cursor_Handle *cur1, + const Efl_Text_Cursor_Handle *cur2) { Eina_Inlist *l1, *l2; @@ -10742,45 +10551,25 @@ evas_textblock_cursor_compare(const Efl_Text_Cursor_Cursor *cur1, return 0; } -EOLIAN static int -_efl_canvas_text_efl_text_cursor_cursor_compare(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, - const Efl_Text_Cursor_Cursor *cur1, const Efl_Text_Cursor_Cursor *cur2) -{ - ASYNC_BLOCK; - Evas_Object_Protected_Data *obj = efl_data_scope_get(cur1->obj, EFL_CANVAS_OBJECT_CLASS); - evas_object_async_block(obj); - return evas_textblock_cursor_compare(cur1, cur2); -} - EAPI Eina_Bool evas_textblock_cursor_equal(const Evas_Textblock_Cursor *cur1, const Evas_Textblock_Cursor *cur2) { - if (!cur1->obj) return EINA_FALSE; - return efl_text_cursor_equal(cur1->obj, cur1, cur2); -} - -EOLIAN static Eina_Bool -_efl_canvas_text_efl_text_cursor_cursor_equal(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, const Efl_Text_Cursor_Cursor *cur, const Efl_Text_Cursor_Cursor *cur2) -{ - ASYNC_BLOCK; - Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); - evas_object_async_block(obj); - return ((cur->node == cur2->node) && (cur->pos == cur2->pos)); + return ((cur1->node == cur2->node) && (cur1->pos == cur2->pos)); } EAPI void -evas_textblock_cursor_copy(const Evas_Textblock_Cursor *cur_src, Efl_Text_Cursor_Cursor *cur_dest) +evas_textblock_cursor_copy(const Evas_Textblock_Cursor *cur_src, Efl_Text_Cursor_Handle *cur_dest) { if (!cur_src || !cur_dest) return; - if (!efl_text_cursor_equal(cur_src->obj, cur_dest, cur_src)) + if (!evas_textblock_cursor_equal(cur_dest, cur_src)) { _evas_textblock_cursor_copy(cur_dest, cur_src); } } static void -_evas_textblock_cursor_copy(Evas_Textblock_Cursor *dst, const Efl_Text_Cursor_Cursor *src) +_evas_textblock_cursor_copy(Evas_Textblock_Cursor *dst, const Efl_Text_Cursor_Handle *src) { if (!src) return; if (!dst) return; @@ -10793,18 +10582,6 @@ _evas_textblock_cursor_copy(Evas_Textblock_Cursor *dst, const Efl_Text_Cursor_Cu dst->node = src->node; } -EOLIAN static void -_efl_canvas_text_efl_text_cursor_cursor_copy(Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, - Efl_Text_Cursor_Cursor *dst, const Efl_Text_Cursor_Cursor *src) -{ - ASYNC_BLOCK; - if (!efl_text_cursor_equal(obj, dst, src)) - { - _evas_textblock_cursor_copy(dst, src); - efl_event_callback_legacy_call(obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); - } -} - /* text controls */ /** * @internal @@ -10856,7 +10633,7 @@ _evas_textblock_node_text_new(void) * @return Returns no value. */ static void -_evas_textblock_cursor_break_paragraph(Efl_Text_Cursor_Cursor *cur, +_evas_textblock_cursor_break_paragraph(Efl_Text_Cursor_Handle *cur, Evas_Object_Textblock_Node_Format *fnode, Eina_Bool legacy) { @@ -10945,8 +10722,8 @@ _evas_textblock_cursors_set_node(Efl_Canvas_Text_Data *o, Evas_Object_Textblock_Node_Text *new_node) { Eina_List *l; - Efl_Text_Cursor_Cursor *cur = o->cursor; - Efl_Text_Cursor_Cursor *data; + Efl_Text_Cursor_Handle *cur = o->cursor; + Efl_Text_Cursor_Handle *data; if (n == cur->node) { @@ -10966,7 +10743,7 @@ _evas_textblock_cursors_set_node(Efl_Canvas_Text_Data *o, } static inline void -_cursor_update_offset(Efl_Text_Cursor_Cursor *cur, Efl_Canvas_Text_Data *o, +_cursor_update_offset(Efl_Text_Cursor_Handle *cur, Efl_Canvas_Text_Data *o, const Evas_Object_Textblock_Node_Text *n, size_t start, int offset) { if ((n == cur->node) && @@ -11000,12 +10777,12 @@ _cursor_update_offset(Efl_Text_Cursor_Cursor *cur, Efl_Canvas_Text_Data *o, * @param offset how much to adjust (can be negative). */ static void -_evas_textblock_cursors_update_offset(const Efl_Text_Cursor_Cursor *cur, +_evas_textblock_cursors_update_offset(const Efl_Text_Cursor_Handle *cur, const Evas_Object_Textblock_Node_Text *n, size_t start, int offset) { Eina_List *l; - Efl_Text_Cursor_Cursor *ocur; + Efl_Text_Cursor_Handle *ocur; Efl_Canvas_Text_Data *o = efl_data_scope_get(cur->obj, MY_CLASS); ocur = o->cursor; @@ -11035,7 +10812,7 @@ _evas_textblock_changed(Efl_Canvas_Text_Data *o, Evas_Object *eo_obj) { Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); Eina_List *l; - Efl_Text_Cursor_Cursor *data_obj; + Efl_Text_Cursor_Handle *data_obj; LYDBG("ZZ: invalidate 1 %p\n", eo_obj); o->formatted.valid = 0; o->native.valid = 0; @@ -11068,12 +10845,12 @@ _evas_textblock_invalidate_all(Efl_Canvas_Text_Data *o) } static int -_evas_textblock_cursor_text_append(Efl_Text_Cursor_Cursor *cur, const char *_text) +_evas_textblock_cursor_text_append(Efl_Text_Cursor_Handle *cur, const char *_text) { Evas_Object_Textblock_Node_Text *n; Evas_Object_Textblock_Node_Format *fnode = NULL; Eina_Unicode *text; - Efl_Text_Cursor_Cursor *main_cur; + Efl_Text_Cursor_Handle *main_cur; int len = 0; if (!cur) return 0; @@ -11143,6 +10920,8 @@ _evas_textblock_cursor_text_append(Efl_Text_Cursor_Cursor *cur, const char *_tex main_cur = o->cursor; if (!main_cur->node) main_cur->node = o->text_nodes; + + _evas_textblock_cursor_object_changed(cur); return len; } @@ -11153,7 +10932,7 @@ evas_textblock_cursor_text_append(Evas_Textblock_Cursor *cur, const char *_text) } static int -_evas_textblock_cursor_text_prepend(Efl_Text_Cursor_Cursor *cur, const char *_text) +_evas_textblock_cursor_text_prepend(Efl_Text_Cursor_Handle *cur, const char *_text) { int len; /*append is essentially prepend without advancing */ @@ -11167,23 +10946,11 @@ _evas_textblock_cursor_text_prepend(Efl_Text_Cursor_Cursor *cur, const char *_te } EAPI int -evas_textblock_cursor_text_prepend(Efl_Text_Cursor_Cursor *cur, const char *_text) +evas_textblock_cursor_text_prepend(Efl_Text_Cursor_Handle *cur, const char *_text) { return _evas_textblock_cursor_text_prepend(cur, _text); } -EOLIAN static int -_efl_canvas_text_efl_text_cursor_cursor_text_insert(Eo *eo_obj, - Efl_Canvas_Text_Data *o, - Efl_Text_Cursor_Cursor *cur, const char *_text) -{ - ASYNC_BLOCK; - int len = _efl_canvas_text_cursor_text_append(cur, _text); - _evas_textblock_changed(o, eo_obj); - efl_event_callback_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CHANGED, NULL); - return len; -} - /** * @internal * Free a format node @@ -11339,7 +11106,7 @@ _evas_textblock_node_format_new(Efl_Canvas_Text_Data *o, const char *_format, } static Eina_Bool -_evas_textblock_cursor_is_at_the_end(const Efl_Text_Cursor_Cursor *cur) +_evas_textblock_cursor_is_at_the_end(const Efl_Text_Cursor_Handle *cur) { const Eina_Unicode *text; @@ -11352,7 +11119,7 @@ _evas_textblock_cursor_is_at_the_end(const Efl_Text_Cursor_Cursor *cur) } static Eina_Bool -_evas_textblock_cursor_format_append(Efl_Text_Cursor_Cursor *cur, +_evas_textblock_cursor_format_append(Efl_Text_Cursor_Handle *cur, const char *format, Evas_Object_Textblock_Node_Format **_fnode, Eina_Bool is_item) { @@ -11485,7 +11252,7 @@ _evas_textblock_cursor_format_append(Efl_Text_Cursor_Cursor *cur, if (!o->pause_change) _evas_textblock_changed(o, cur->obj); - Efl_Text_Cursor_Cursor *ocur = o->cursor; + Efl_Text_Cursor_Handle *ocur = o->cursor; if (!ocur->node) ocur->node = o->text_nodes; @@ -11500,7 +11267,7 @@ evas_textblock_cursor_format_append(Evas_Textblock_Cursor *cur, const char *form } static Eina_Bool -_evas_textblock_cursor_format_prepend(Efl_Text_Cursor_Cursor *cur, const char *format) +_evas_textblock_cursor_format_prepend(Efl_Text_Cursor_Handle *cur, const char *format) { Eina_Bool is_visible; @@ -11525,7 +11292,7 @@ evas_textblock_cursor_format_prepend(Evas_Textblock_Cursor *cur, const char *for } EAPI void -evas_textblock_cursor_char_delete(Efl_Text_Cursor_Cursor *cur) +evas_textblock_cursor_char_delete(Efl_Text_Cursor_Handle *cur) { Evas_Object_Textblock_Node_Text *n, *n2; const Eina_Unicode *text; @@ -11600,27 +11367,13 @@ evas_textblock_cursor_char_delete(Efl_Text_Cursor_Cursor *cur) _evas_textblock_cursors_update_offset(cur, n, ppos, -(ind - ppos)); _evas_textblock_changed(o, cur->obj); cur->node->dirty = EINA_TRUE; -} - -EOLIAN static void -_efl_canvas_text_efl_text_cursor_cursor_char_delete(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Cursor *cur) -{ - ASYNC_BLOCK; - evas_textblock_cursor_char_delete(cur); - efl_event_callback_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CHANGED, NULL); + _evas_textblock_cursor_object_changed(cur); } EAPI void -evas_textblock_cursor_range_delete(Efl_Text_Cursor_Cursor *cur1, Efl_Text_Cursor_Cursor *cur2) +evas_textblock_cursor_range_delete(Efl_Text_Cursor_Handle *cur1, Efl_Text_Cursor_Handle *cur2) { if (!cur1) return; - efl_canvas_text_range_delete(cur1->obj, cur1, cur2); -} - -EOLIAN static void -_efl_canvas_text_range_delete(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *pd EINA_UNUSED, - Efl_Text_Cursor_Cursor *cur1, Evas_Textblock_Cursor *cur2) -{ Evas_Object_Textblock_Node_Format *fnode = NULL; Evas_Object_Textblock_Node_Text *n1, *n2; Eina_Bool should_merge = EINA_FALSE, reset_cursor = EINA_FALSE; @@ -11633,7 +11386,7 @@ _efl_canvas_text_range_delete(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *pd E Efl_Canvas_Text_Data *o = efl_data_scope_get(cur1->obj, MY_CLASS); if (evas_textblock_cursor_compare(cur1, cur2) > 0) { - Efl_Text_Cursor_Cursor *tc; + Efl_Text_Cursor_Handle *tc; tc = cur1; cur1 = cur2; @@ -11721,15 +11474,7 @@ _efl_canvas_text_range_delete(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *pd E evas_textblock_cursor_copy(cur1, o->cursor); _evas_textblock_changed(o, cur1->obj); - efl_event_callback_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CHANGED, NULL); -} - -EOLIAN static Eina_Unicode -_efl_canvas_text_efl_text_cursor_cursor_content_get(const Eo *obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, - const Efl_Text_Cursor_Cursor *cur) -{ - ASYNC_BLOCK; - return eina_ustrbuf_string_get(cur->node->unicode)[cur->pos]; + efl_event_callback_call(cur1->obj, EFL_CANVAS_TEXT_EVENT_CHANGED, NULL); } EAPI char * @@ -11758,7 +11503,7 @@ evas_textblock_cursor_content_get(const Evas_Textblock_Cursor *cur) Eina_Unicode buf[2]; char *s; - buf[0] = efl_text_cursor_content_get(cur->obj, cur); + buf[0] = eina_ustrbuf_string_get(cur->node->unicode)[cur->pos]; buf[1] = 0; s = eina_unicode_unicode_to_utf8(buf, NULL); @@ -11767,24 +11512,24 @@ evas_textblock_cursor_content_get(const Evas_Textblock_Cursor *cur) } static char * -_evas_textblock_cursor_range_text_markup_get(const Efl_Text_Cursor_Cursor *cur1, const Efl_Text_Cursor_Cursor *_cur2) +_evas_textblock_cursor_range_text_markup_get(const Efl_Text_Cursor_Handle *cur1, const Efl_Text_Cursor_Handle *_cur2) { Evas_Object_Textblock_Node_Text *tnode; Eina_Strbuf *buf; - Efl_Text_Cursor_Cursor *cur2; + Efl_Text_Cursor_Handle *cur2; buf = eina_strbuf_new(); if (evas_textblock_cursor_compare(cur1, _cur2) > 0) { - const Efl_Text_Cursor_Cursor *tc; + const Efl_Text_Cursor_Handle *tc; tc = cur1; cur1 = _cur2; _cur2 = tc; } /* Work on a local copy of the cur */ - cur2 = alloca(sizeof(Efl_Text_Cursor_Cursor)); + cur2 = alloca(sizeof(Efl_Text_Cursor_Handle)); cur2->obj = _cur2->obj; _evas_textblock_cursor_copy(cur2, _cur2); @@ -11874,29 +11619,18 @@ _evas_textblock_cursor_range_text_markup_get(const Efl_Text_Cursor_Cursor *cur1, } } -EOLIAN char * -_efl_canvas_text_efl_text_markup_interactive_markup_range_get(const Eo *eo_obj, - Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Cursor *start, - Efl_Text_Cursor_Cursor *end) -{ - if (!start || !start->node) return NULL; - if (!end || !end->node) return NULL; - if ((start->obj != eo_obj) || (start->obj != end->obj)) return NULL; - return _evas_textblock_cursor_range_text_markup_get(start, end); -} - static char * -_evas_textblock_cursor_range_text_plain_get(const Efl_Text_Cursor_Cursor *cur1, const Efl_Text_Cursor_Cursor *_cur2) +_evas_textblock_cursor_range_text_plain_get(const Efl_Text_Cursor_Handle *cur1, const Efl_Text_Cursor_Handle *_cur2) { Eina_UStrbuf *buf; Evas_Object_Textblock_Node_Text *n1, *n2; - Efl_Text_Cursor_Cursor *cur2; + Efl_Text_Cursor_Handle *cur2; buf = eina_ustrbuf_new(); if (evas_textblock_cursor_compare(cur1, _cur2) > 0) { - const Efl_Text_Cursor_Cursor *tc; + const Efl_Text_Cursor_Handle *tc; tc = cur1; cur1 = _cur2; @@ -11905,7 +11639,7 @@ _evas_textblock_cursor_range_text_plain_get(const Efl_Text_Cursor_Cursor *cur1, n1 = cur1->node; n2 = _cur2->node; /* Work on a local copy of the cur */ - cur2 = alloca(sizeof(Efl_Text_Cursor_Cursor)); + cur2 = alloca(sizeof(Efl_Text_Cursor_Handle)); cur2->obj = _cur2->obj; _evas_textblock_cursor_copy(cur2, _cur2); @@ -11942,7 +11676,7 @@ _evas_textblock_cursor_range_text_plain_get(const Efl_Text_Cursor_Cursor *cur1, } EAPI Eina_List * -evas_textblock_cursor_range_formats_get(const Efl_Text_Cursor_Cursor *cur1, const Evas_Textblock_Cursor *cur2) +evas_textblock_cursor_range_formats_get(const Efl_Text_Cursor_Handle *cur1, const Evas_Textblock_Cursor *cur2) { Evas_Object *eo_obj; Eina_List *ret = NULL; @@ -11959,7 +11693,7 @@ evas_textblock_cursor_range_formats_get(const Efl_Text_Cursor_Cursor *cur1, cons if (evas_textblock_cursor_compare(cur1, cur2) > 0) { - const Efl_Text_Cursor_Cursor *tc; + const Efl_Text_Cursor_Handle *tc; tc = cur1; cur1 = cur2; @@ -12013,7 +11747,7 @@ evas_textblock_cursor_range_formats_get(const Efl_Text_Cursor_Cursor *cur1, cons } static char * -_evas_textblock_cursor_range_text_get(const Efl_Text_Cursor_Cursor *cur1, const Efl_Text_Cursor_Cursor *cur2, Evas_Textblock_Text_Type format) +_evas_textblock_cursor_range_text_get(const Efl_Text_Cursor_Handle *cur1, const Efl_Text_Cursor_Handle *cur2, Evas_Textblock_Text_Type format) { if (!cur1 || !cur1->node) return NULL; if (!cur2 || !cur2->node) return NULL; @@ -12034,24 +11768,15 @@ _evas_textblock_cursor_range_text_get(const Efl_Text_Cursor_Cursor *cur1, const // Add to legacy api EAPI char * -evas_textblock_cursor_range_text_get(const Efl_Text_Cursor_Cursor *cur1, const Evas_Textblock_Cursor *cur2, Evas_Textblock_Text_Type format) +evas_textblock_cursor_range_text_get(const Efl_Text_Cursor_Handle *cur1, const Evas_Textblock_Cursor *cur2, Evas_Textblock_Text_Type format) { return _evas_textblock_cursor_range_text_get(cur1, cur2, format); } -EOLIAN static char * -_efl_canvas_text_range_text_get(const Eo *eo_obj EINA_UNUSED, - Efl_Canvas_Text_Data *pd EINA_UNUSED, - const Efl_Text_Cursor_Cursor *cur1, - const Evas_Textblock_Cursor *cur2) -{ - return _evas_textblock_cursor_range_text_get(cur1, cur2, EVAS_TEXTBLOCK_TEXT_PLAIN); -} - EAPI const char * evas_textblock_cursor_paragraph_text_get(const Evas_Textblock_Cursor *cur) { - Efl_Text_Cursor_Cursor cur1, cur2; + Efl_Text_Cursor_Handle cur1, cur2; if (!cur) return NULL; Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); evas_object_async_block(obj); @@ -12138,7 +11863,7 @@ evas_textblock_node_format_text_get(const Evas_Object_Textblock_Node_Format *fmt } static void -_evas_textblock_cursor_at_format_set(Efl_Text_Cursor_Cursor *cur, +_evas_textblock_cursor_at_format_set(Efl_Text_Cursor_Handle *cur, const Evas_Object_Textblock_Node_Format *fmt) { if (!fmt || !cur) return; @@ -12155,7 +11880,7 @@ evas_textblock_cursor_at_format_set(Evas_Textblock_Cursor *cur, const Evas_Objec } static Eina_Bool -_evas_textblock_cursor_format_is_visible_get(const Efl_Text_Cursor_Cursor *cur) +_evas_textblock_cursor_format_is_visible_get(const Efl_Text_Cursor_Handle *cur) { const Eina_Unicode *text; @@ -12195,26 +11920,18 @@ _find_layout_line_by_item(Evas_Object_Textblock_Paragraph *par, Evas_Object_Text #endif EAPI Eina_Bool -evas_textblock_cursor_geometry_bidi_get(const Efl_Text_Cursor_Cursor *cur, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch, Evas_Coord *cx2, Evas_Coord *cy2, Evas_Coord *cw2, Evas_Coord *ch2, Evas_Textblock_Cursor_Type ctype) +evas_textblock_cursor_geometry_bidi_get(const Efl_Text_Cursor_Handle *cur, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch, Evas_Coord *cx2, Evas_Coord *cy2, Evas_Coord *cw2, Evas_Coord *ch2, Evas_Textblock_Cursor_Type ctype) { if (!cur) return EINA_FALSE; - return efl_text_cursor_geometry_get(cur->obj, cur, - (ctype == EVAS_TEXTBLOCK_CURSOR_BEFORE) ? - EFL_TEXT_CURSOR_TYPE_BEFORE : EFL_TEXT_CURSOR_TYPE_UNDER, - cx, cy, cw, ch, cx2, cy2, cw2, ch2); -} - -EOLIAN static Eina_Bool -_efl_canvas_text_efl_text_cursor_cursor_geometry_get(const Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, const Efl_Text_Cursor_Cursor *cur, Efl_Text_Cursor_Type ctype, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch, Evas_Coord *cx2, Evas_Coord *cy2, Evas_Coord *cw2, Evas_Coord *ch2) -{ + Efl_Canvas_Text_Data *o = efl_data_scope_get(cur->obj, MY_CLASS); ASYNC_BLOCK; - if (!cur) return EINA_FALSE; Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); + evas_object_async_block(obj); if (!_relayout_if_needed(cur->obj, o)) return EINA_FALSE; - if (ctype == EFL_TEXT_CURSOR_TYPE_UNDER) + if (ctype == EVAS_TEXTBLOCK_CURSOR_UNDER) { evas_textblock_cursor_pen_geometry_get(cur, cx, cy, cw, ch); return EINA_FALSE; @@ -12383,14 +12100,12 @@ _efl_canvas_text_efl_text_cursor_cursor_geometry_get(const Eo *eo_obj EINA_UNUSE (void) cw2; (void) ch2; #endif - evas_textblock_cursor_geometry_get(cur, cx, cy, cw, ch, NULL, - (ctype == EFL_TEXT_CURSOR_TYPE_BEFORE) ? - EVAS_TEXTBLOCK_CURSOR_BEFORE : EVAS_TEXTBLOCK_CURSOR_UNDER); + evas_textblock_cursor_geometry_get(cur, cx, cy, cw, ch, NULL,ctype); return EINA_FALSE; } EAPI int -evas_textblock_cursor_geometry_get(const Efl_Text_Cursor_Cursor *cur, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch, Evas_BiDi_Direction *dir, Evas_Textblock_Cursor_Type ctype) +evas_textblock_cursor_geometry_get(const Efl_Text_Cursor_Handle *cur, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch, Evas_BiDi_Direction *dir, Evas_Textblock_Cursor_Type ctype) { int ret = -1; if (!cur) return -1; @@ -12634,16 +12349,9 @@ evas_textblock_cursor_line_geometry_get(const Evas_Textblock_Cursor *cur, Evas_C } EAPI Eina_Bool -evas_textblock_cursor_visible_range_get(Efl_Text_Cursor_Cursor *start, Evas_Textblock_Cursor *end) -{ - return efl_canvas_text_visible_range_get(start->obj, start, end); -} - -EOLIAN static Eina_Bool -_efl_canvas_text_visible_range_get(Eo *eo_obj EINA_UNUSED, - Efl_Canvas_Text_Data *pd EINA_UNUSED, - Efl_Text_Cursor_Cursor *start, Evas_Textblock_Cursor *end) +evas_textblock_cursor_visible_range_get(Efl_Text_Cursor_Handle *start, Evas_Textblock_Cursor *end) { + Eo * eo_obj = start->obj; Evas *eo_e; Evas_Coord cy, ch; Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); @@ -12660,6 +12368,17 @@ _efl_canvas_text_visible_range_get(Eo *eo_obj EINA_UNUSED, return EINA_TRUE; } +EOLIAN static Eina_Bool +_efl_canvas_text_visible_range_get(Eo *eo_obj EINA_UNUSED, + Efl_Canvas_Text_Data *pd EINA_UNUSED, + Efl_Text_Cursor *start, Efl_Text_Cursor *end) +{ + return evas_textblock_cursor_visible_range_get( + efl_text_cursor_handle_get(start), + efl_text_cursor_handle_get(end) + ); +} + static Eina_Bool _evas_textblock_cursor_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord x, Evas_Coord y, Eina_Bool per_cluster) { @@ -12849,7 +12568,7 @@ _evas_textblock_cursor_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord x, Evas_ end: if (ret) { - efl_event_callback_legacy_call(cur->obj, EFL_CANVAS_TEXT_EVENT_CURSOR_CHANGED, NULL); + _evas_textblock_cursor_object_changed(cur); } return ret; } @@ -12866,22 +12585,6 @@ evas_textblock_cursor_cluster_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord return _evas_textblock_cursor_coord_set(cur, x, y, EINA_TRUE); } -EOLIAN static void -_efl_canvas_text_efl_text_cursor_cursor_coord_set(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Cursor *cur EINA_UNUSED, - Evas_Coord x, Evas_Coord y) -{ - ASYNC_BLOCK; - evas_textblock_cursor_char_coord_set(cur, x, y); -} - -EOLIAN static void -_efl_canvas_text_efl_text_cursor_cursor_cluster_coord_set(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Cursor *cur EINA_UNUSED, - Evas_Coord x, Evas_Coord y) -{ - ASYNC_BLOCK; - evas_textblock_cursor_cluster_coord_set(cur, x, y); -} - EAPI int evas_textblock_cursor_line_coord_set(Evas_Textblock_Cursor *cur, Evas_Coord y) { @@ -13018,8 +12721,8 @@ _evas_textblock_range_calc_x_w(const Evas_Object_Textblock_Item *it, */ static Eina_List * _evas_textblock_cursor_range_in_line_geometry_get( - const Evas_Object_Textblock_Line *ln, const Efl_Text_Cursor_Cursor *cur1, - const Efl_Text_Cursor_Cursor *cur2) + const Evas_Object_Textblock_Line *ln, const Efl_Text_Cursor_Handle *cur1, + const Efl_Text_Cursor_Handle *cur2) { Evas_Object_Textblock_Item *it; Evas_Object_Textblock_Item *it1, *it2; @@ -13027,7 +12730,7 @@ _evas_textblock_cursor_range_in_line_geometry_get( Evas_Textblock_Rectangle *tr; size_t start, end; Eina_Bool switch_items; - const Efl_Text_Cursor_Cursor *cur; + const Efl_Text_Cursor_Handle *cur; cur = (cur1) ? cur1 : cur2; @@ -13307,17 +13010,9 @@ _line_fill_rect_get(const Evas_Object_Textblock_Line *ln, } EAPI Eina_Iterator * -evas_textblock_cursor_range_simple_geometry_get(const Efl_Text_Cursor_Cursor *cur1, const Evas_Textblock_Cursor *cur2) +evas_textblock_cursor_range_simple_geometry_get(const Efl_Text_Cursor_Handle *cur1, const Evas_Textblock_Cursor *cur2) { if (!cur1) return NULL; - return efl_canvas_text_range_simple_geometry_get(cur1->obj, cur1, cur2); -} - -EOLIAN static Eina_Iterator * -_efl_canvas_text_range_simple_geometry_get(Eo *eo_obj EINA_UNUSED, - Efl_Canvas_Text_Data *o, const Efl_Text_Cursor_Cursor *cur1, const - Evas_Textblock_Cursor *cur2) -{ Evas_Object_Textblock_Line *ln1, *ln2; Evas_Object_Textblock_Item *it1, *it2; Eina_List *rects = NULL; @@ -13328,12 +13023,12 @@ _efl_canvas_text_range_simple_geometry_get(Eo *eo_obj EINA_UNUSED, if (cur1->obj != cur2->obj) return NULL; Evas_Object_Protected_Data *obj = efl_data_scope_get(cur1->obj, EFL_CANVAS_OBJECT_CLASS); evas_object_async_block(obj); - + Efl_Canvas_Text_Data *o = efl_data_scope_get(cur1->obj, MY_CLASS); _relayout_if_needed(cur1->obj, o); if (evas_textblock_cursor_compare(cur1, cur2) > 0) { - const Efl_Text_Cursor_Cursor *tc; + const Efl_Text_Cursor_Handle *tc; tc = cur1; cur1 = cur2; @@ -13422,7 +13117,7 @@ _efl_canvas_text_range_simple_geometry_get(Eo *eo_obj EINA_UNUSED, static Eina_List * _efl_canvas_text_range_geometry_list_get(Eo *eo_obj EINA_UNUSED, - Efl_Canvas_Text_Data *o, const Efl_Text_Cursor_Cursor *cur1, const + Efl_Canvas_Text_Data *o, const Efl_Text_Cursor_Handle *cur1, const Evas_Textblock_Cursor *cur2) { Evas_Object_Textblock_Line *ln1, *ln2; @@ -13440,7 +13135,7 @@ _efl_canvas_text_range_geometry_list_get(Eo *eo_obj EINA_UNUSED, if (evas_textblock_cursor_compare(cur1, cur2) > 0) { - const Efl_Text_Cursor_Cursor *tc; + const Efl_Text_Cursor_Handle *tc; tc = cur1; cur1 = cur2; @@ -13498,7 +13193,7 @@ _efl_canvas_text_range_geometry_list_get(Eo *eo_obj EINA_UNUSED, } EAPI Eina_List * -evas_textblock_cursor_range_geometry_get(const Efl_Text_Cursor_Cursor *cur1, const Evas_Textblock_Cursor *cur2_obj) +evas_textblock_cursor_range_geometry_get(const Efl_Text_Cursor_Handle *cur1, const Evas_Textblock_Cursor *cur2_obj) { Efl_Canvas_Text_Data *o; @@ -13509,18 +13204,8 @@ evas_textblock_cursor_range_geometry_get(const Efl_Text_Cursor_Cursor *cur1, con return _efl_canvas_text_range_geometry_list_get(cur1->obj, o, cur1, cur2_obj); } -EOLIAN static Eina_Iterator * -_efl_canvas_text_range_geometry_get(Eo *eo_obj EINA_UNUSED, - Efl_Canvas_Text_Data *o, const Efl_Text_Cursor_Cursor *cur1, const - Evas_Textblock_Cursor *cur2) -{ - Eina_List *rects = _efl_canvas_text_range_geometry_list_get(eo_obj, - o, cur1, cur2); - return _evas_textblock_selection_iterator_new(rects); -} - static Eina_Bool -_evas_textblock_cursor_format_item_geometry_get(const Efl_Text_Cursor_Cursor *cur, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) +_evas_textblock_cursor_format_item_geometry_get(const Efl_Text_Cursor_Handle *cur, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) { Evas_Object_Textblock_Line *ln = NULL; Evas_Object_Textblock_Format_Item *fi; @@ -13560,7 +13245,7 @@ EAPI Eina_Bool evas_textblock_cursor_eol_get(const Evas_Textblock_Cursor *cur) { Eina_Bool ret = EINA_FALSE; - Efl_Text_Cursor_Cursor cur2; + Efl_Text_Cursor_Handle cur2; if (!cur) return EINA_FALSE; Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); evas_object_async_block(obj); @@ -13600,8 +13285,8 @@ static void _evas_object_textblock_clear(Evas_Object *eo_obj) { Eina_List *l; - Efl_Text_Cursor_Cursor *cur; - Efl_Text_Cursor_Cursor *co; + Efl_Text_Cursor_Handle *cur; + Efl_Text_Cursor_Handle *co; Evas *eo_e; Evas_Public_Data *evas; @@ -13643,15 +13328,18 @@ evas_object_textblock_clear(Evas_Object *eo_obj) evas_textblock_cursor_text_append(o->cursor, ""); } -EOLIAN static void -_efl_canvas_text_size_formatted_get(const Eo *eo_obj, Efl_Canvas_Text_Data *o, Evas_Coord *w, Evas_Coord *h) +EOLIAN static Eina_Size2D +_efl_canvas_text_size_formatted_get(const Eo *eo_obj, Efl_Canvas_Text_Data *o) { Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); evas_object_async_block(obj); _relayout_if_needed(eo_obj, o); - if (w) *w = o->formatted.w; - if (h) *h = o->formatted.h; + Eina_Size2D ret = { + .w = o->formatted.w, + .h = o->formatted.h, + }; + return ret; } #ifdef BIDI_SUPPORT @@ -13886,8 +13574,8 @@ _size_native_calc_paragraph_size(const Evas_Object *eo_obj, *_w = wmax; } -EOLIAN static void -_efl_canvas_text_size_native_get(const Eo *eo_obj, Efl_Canvas_Text_Data *o, Evas_Coord *w, Evas_Coord *h) +EOLIAN static Eina_Size2D +_efl_canvas_text_size_native_get(const Eo *eo_obj, Efl_Canvas_Text_Data *o) { Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); evas_object_async_block(obj); @@ -13916,8 +13604,12 @@ _efl_canvas_text_size_native_get(const Eo *eo_obj, Efl_Canvas_Text_Data *o, Evas o->content_changed = 0; o->format_changed = EINA_FALSE; } - if (w) *w = o->native.w; - if (h) *h = o->native.h; + + Eina_Size2D ret = { + .w = o->native.w, + .h = o->native.h, + }; + return ret; } EOLIAN static void @@ -13957,19 +13649,19 @@ _efl_canvas_text_efl_object_dbg_info_get(Eo *eo_obj, Efl_Canvas_Text_Data *o EIN EFL_DBG_INFO_APPEND(group, "Text", EINA_VALUE_TYPE_STRING, shorttext); { - int w, h; - efl_canvas_text_size_formatted_get(eo_obj, &w, &h); + Eina_Size2D size; + size = efl_canvas_text_size_formatted_get(eo_obj); node = EFL_DBG_INFO_LIST_APPEND(group, "Formatted size"); - EFL_DBG_INFO_APPEND(node, "w", EINA_VALUE_TYPE_INT, w); - EFL_DBG_INFO_APPEND(node, "h", EINA_VALUE_TYPE_INT, h); + EFL_DBG_INFO_APPEND(node, "w", EINA_VALUE_TYPE_INT, size.w); + EFL_DBG_INFO_APPEND(node, "h", EINA_VALUE_TYPE_INT, size.h); } { - int w, h; - efl_canvas_text_size_native_get(eo_obj, &w, &h); + Eina_Size2D size; + size = efl_canvas_text_size_native_get(eo_obj); node = EFL_DBG_INFO_LIST_APPEND(group, "Native size"); - EFL_DBG_INFO_APPEND(node, "w", EINA_VALUE_TYPE_INT, w); - EFL_DBG_INFO_APPEND(node, "h", EINA_VALUE_TYPE_INT, h); + EFL_DBG_INFO_APPEND(node, "w", EINA_VALUE_TYPE_INT, size.w); + EFL_DBG_INFO_APPEND(node, "h", EINA_VALUE_TYPE_INT, size.h); } } @@ -13990,7 +13682,7 @@ evas_object_textblock_init(Evas_Object *eo_obj) } o = obj->private_data; - Efl_Text_Cursor_Cursor *co = o->cursor; + Efl_Text_Cursor_Handle *co = o->cursor; co->obj = eo_obj; evas_object_textblock_text_markup_set(eo_obj, ""); @@ -14055,9 +13747,9 @@ evas_object_textblock_free(Evas_Object *eo_obj) free(o->cursor); while (o->cursors) { - Efl_Text_Cursor_Cursor *cur; + Efl_Text_Cursor_Handle *cur; - cur = (Efl_Text_Cursor_Cursor *)o->cursors->data; + cur = (Efl_Text_Cursor_Handle *)o->cursors->data; o->cursors = eina_list_remove_list(o->cursors, o->cursors); free(cur); } @@ -15489,83 +15181,24 @@ _efl_canvas_text_efl_canvas_object_paragraph_direction_get(const Eo *eo_obj EINA return (Efl_Text_Bidirectional_Type)o->paragraph_direction; } -static int -_prepend_text_run2(Efl_Text_Cursor_Cursor *cur, const char *s, const char *p) -{ - if ((s) && (p > s)) - { - char *ts; - - ts = alloca(p - s + 1); - strncpy(ts, s, p - s); - ts[p - s] = 0; - return _evas_textblock_cursor_text_prepend(cur, ts); - } - return 0; -} - -static int -_efl_canvas_text_cursor_text_append(Efl_Text_Cursor_Cursor *cur, - const char *text) -{ - if (!text) return 0; - - const char *off = text; - int len = 0; - - Evas_Object_Protected_Data *obj = efl_data_scope_get(cur->obj, EFL_CANVAS_OBJECT_CLASS); - evas_object_async_block(obj); - - while (*off) - { - char *format = NULL; - int n = 1; - if (!strncmp(_PARAGRAPH_SEPARATOR_UTF8, off, - strlen(_PARAGRAPH_SEPARATOR_UTF8))) - { - format = "ps"; - n = strlen(_PARAGRAPH_SEPARATOR_UTF8); - } - else if (!strncmp(_NEWLINE_UTF8, off, strlen(_NEWLINE_UTF8))) - { - format = "br"; - n = strlen(_NEWLINE_UTF8); - } - else if (!strncmp(_TAB_UTF8, off, strlen(_TAB_UTF8))) - { - format = "tab"; - n = strlen(_TAB_UTF8); - } - - if (format) - { - len += _prepend_text_run2(cur, text, off); - if (_evas_textblock_cursor_format_prepend(cur, format)) - { - len++; - } - text = off + n; /* sync text with next segment */ - } - off += n; - } - len += _prepend_text_run2(cur, text, off); - return len; -} - EOLIAN static void _efl_canvas_text_efl_text_text_set(Eo *eo_obj, Efl_Canvas_Text_Data *o, const char *text) { ASYNC_BLOCK; evas_object_textblock_text_markup_set(eo_obj, ""); - efl_text_cursor_text_insert(eo_obj, o->cursor, text); - //efl_event_callback_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CHANGED, NULL); + _cursor_text_append(o->cursor, text); + if (eo_obj) + { + _evas_textblock_changed(o, eo_obj); + efl_event_callback_call(eo_obj, EFL_CANVAS_TEXT_EVENT_CHANGED, NULL); + } } static char * _canvas_text_get_all(const Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED) { - Efl_Text_Cursor_Cursor start, end; + Efl_Text_Cursor_Handle start, end; _evas_textblock_cursor_init(&start, eo_obj); _evas_textblock_cursor_init(&end, eo_obj); @@ -15653,7 +15286,7 @@ _evas_textblock_annotation_iterator_new(Eina_List *list) static void _textblock_cursor_pos_at_fnode_set(const Eo *eo_obj EINA_UNUSED, - Efl_Text_Cursor_Cursor *cur, + Efl_Text_Cursor_Handle *cur, Evas_Object_Textblock_Node_Format *fnode) { cur->node = fnode->text_node; @@ -15663,7 +15296,7 @@ _textblock_cursor_pos_at_fnode_set(const Eo *eo_obj EINA_UNUSED, static Eina_Bool _textblock_annotation_set(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o, Efl_Text_Annotate_Annotation *an, - Efl_Text_Cursor_Cursor *start, Efl_Text_Cursor_Cursor *end, + Efl_Text_Cursor_Handle *start, Efl_Text_Cursor_Handle *end, const char *format, Eina_Bool is_item) { int len; @@ -15719,7 +15352,7 @@ _efl_canvas_text_efl_text_annotate_annotation_set(Eo *eo_obj, const char *format) { ASYNC_BLOCK; - Efl_Text_Cursor_Cursor start, end; + Efl_Text_Cursor_Handle start, end; Eina_Bool ret = EINA_TRUE; if (!annotation || (annotation->obj != eo_obj)) @@ -15759,7 +15392,7 @@ _evas_textblock_annotation_remove(Efl_Canvas_Text_Data *o, if (an->is_item) { /* Remove the OBJ character along with the cursor. */ - Efl_Text_Cursor_Cursor cur; + Efl_Text_Cursor_Handle cur; _evas_textblock_cursor_init(&cur, an->obj); _textblock_cursor_pos_at_fnode_set(an->obj, &cur, an->start_node); evas_textblock_cursor_char_delete(&cur); @@ -15812,7 +15445,7 @@ _efl_canvas_text_efl_text_annotate_annotation_del(Eo *eo_obj EINA_UNUSED, static Efl_Text_Annotate_Annotation * _textblock_annotation_insert(Eo *eo_obj, Efl_Canvas_Text_Data *o, - Efl_Text_Cursor_Cursor *start, Efl_Text_Cursor_Cursor *end, + Efl_Text_Cursor_Handle *start, Efl_Text_Cursor_Handle *end, const char *format, Eina_Bool is_item) { Efl_Text_Annotate_Annotation *ret = NULL; @@ -15877,7 +15510,7 @@ _textblock_annotation_insert(Eo *eo_obj, Efl_Canvas_Text_Data *o, EOLIAN static Efl_Text_Annotate_Annotation * _efl_canvas_text_efl_text_annotate_annotation_insert(Eo *eo_obj, Efl_Canvas_Text_Data *o, - Efl_Text_Cursor_Cursor *start, Efl_Text_Cursor_Cursor *end, + Efl_Text_Cursor_Handle *start, Efl_Text_Cursor_Handle *end, const char *format) { ASYNC_BLOCK; @@ -15898,7 +15531,7 @@ _efl_canvas_text_efl_text_annotate_range_annotations_get(const Eo *eo_obj, Efl_C EINA_INLIST_FOREACH(o->annotations, it) { - Efl_Text_Cursor_Cursor start2, end2; + Efl_Text_Cursor_Handle start2, end2; _evas_textblock_cursor_init(&start2, eo_obj); _evas_textblock_cursor_init(&end2, eo_obj); @@ -15917,7 +15550,7 @@ _efl_canvas_text_efl_text_annotate_range_annotations_get(const Eo *eo_obj, Efl_C EOLIAN static Efl_Text_Annotate_Annotation * _efl_canvas_text_efl_text_annotate_cursor_item_insert(Eo *eo_obj, - Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Cursor *cur, + Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Handle *cur, const char *item, const char *format) { Eina_Strbuf *buf = eina_strbuf_new(); @@ -15934,7 +15567,7 @@ _efl_canvas_text_efl_text_annotate_cursor_item_insert(Eo *eo_obj, EOLIAN static Efl_Text_Annotate_Annotation * _efl_canvas_text_efl_text_annotate_cursor_item_annotation_get(const Eo *eo_obj EINA_UNUSED, - Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Cursor *cur) + Efl_Canvas_Text_Data *o EINA_UNUSED, Efl_Text_Cursor_Handle *cur) { Eina_Iterator *it; Efl_Text_Annotate_Annotation *data, *ret = NULL; @@ -15971,7 +15604,7 @@ EOLIAN static Eina_Bool _efl_canvas_text_efl_text_annotate_item_geometry_get(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, const Efl_Text_Annotate_Annotation *an, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch) { - Efl_Text_Cursor_Cursor cur; + Efl_Text_Cursor_Handle cur; Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); evas_object_async_block(obj); @@ -15986,7 +15619,7 @@ EOLIAN static void _efl_canvas_text_efl_text_annotate_annotation_positions_get(Eo *eo_obj, Efl_Canvas_Text_Data *o EINA_UNUSED, const Efl_Text_Annotate_Annotation *annotation, - Efl_Text_Cursor_Cursor *start, Efl_Text_Cursor_Cursor *end) + Efl_Text_Cursor_Handle *start, Efl_Text_Cursor_Handle *end) { _textblock_cursor_pos_at_fnode_set(eo_obj, start, annotation->start_node); _textblock_cursor_pos_at_fnode_set(eo_obj, end, annotation->end_node); @@ -16904,42 +16537,12 @@ ppar(Evas_Object_Textblock_Paragraph *par) #define EFL_CANVAS_TEXT_EXTRA_OPS \ EFL_OBJECT_OP_FUNC(efl_dbg_info_get, _efl_canvas_text_efl_object_dbg_info_get) -EOLIAN static Efl_Text_Cursor_Cursor * -_efl_canvas_text_efl_text_cursor_text_cursor_get(const Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o, Efl_Text_Cursor_Get_Type get_type) -{ - if (get_type > EFL_TEXT_CURSOR_GET_TYPE_MAIN) - { - ERR("Unsupported cursor types other than main!"); - } - return o->cursor; -} - -EAPI Efl_Text_Cursor_Cursor * +EAPI Efl_Text_Cursor_Handle * evas_object_textblock_cursor_get(const Evas_Object *eo_obj EINA_UNUSED) { - return efl_text_cursor_get(eo_obj, EFL_TEXT_CURSOR_GET_TYPE_MAIN); -} - -EOLIAN static Efl_Text_Cursor_Cursor * -_efl_canvas_text_efl_text_cursor_cursor_new(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o) -{ - Efl_Text_Cursor_Cursor *cur; - Evas_Object_Protected_Data *obj = efl_data_scope_get(eo_obj, EFL_CANVAS_OBJECT_CLASS); - evas_object_async_block(obj); - - cur = calloc(1, sizeof(Efl_Text_Cursor_Cursor)); - if (!cur) return NULL; - _evas_textblock_cursor_init(cur, eo_obj); - - o->cursors = eina_list_append(o->cursors, cur); - return cur; -} - -EOLIAN static void -_efl_canvas_text_efl_text_cursor_cursor_free(Eo *eo_obj EINA_UNUSED, Efl_Canvas_Text_Data *o EINA_UNUSED, - Efl_Text_Cursor_Cursor *cur) -{ - evas_textblock_cursor_free(cur); + TB_HEAD_RETURN(NULL); + Efl_Canvas_Text_Data *o = efl_data_scope_get(eo_obj, MY_CLASS); + return o->cursor; } /* Async Layout */ diff --git a/src/lib/evas/canvas/evas_textblock_legacy.h b/src/lib/evas/canvas/evas_textblock_legacy.h index ae537680c0..83f688d1fd 100644 --- a/src/lib/evas/canvas/evas_textblock_legacy.h +++ b/src/lib/evas/canvas/evas_textblock_legacy.h @@ -147,7 +147,7 @@ typedef struct _Efl_Canvas_Text_Style Evas_Textblock_Style; * @see evas_object_textblock_cursor_new * */ -typedef struct _Efl_Text_Cursor_Cursor Evas_Textblock_Cursor; +typedef struct _Efl_Text_Cursor_Handle Evas_Textblock_Cursor; /** * @typedef Evas_Object_Textblock_Node_Format diff --git a/src/lib/evas/canvas/meson.build b/src/lib/evas/canvas/meson.build index 67134caed9..d9e6798b9b 100644 --- a/src/lib/evas/canvas/meson.build +++ b/src/lib/evas/canvas/meson.build @@ -54,6 +54,7 @@ pub_eo_files = [ 'efl_canvas_group.eo', 'efl_gfx_mapping.eo', 'efl_canvas_event_grabber.eo', + 'efl_text_cursor.eo', 'efl_canvas_text.eo', 'efl_canvas_object_animation.eo', ] @@ -207,6 +208,7 @@ evas_src += files([ 'evas_canvas3d_node_callback.h', 'evas_canvas3d_eet.c', 'efl_canvas_object_animation.c', + 'efl_text_cursor.c' ]) evas_include_directories += include_directories('.') diff --git a/src/tests/evas/evas_test_textblock.c b/src/tests/evas/evas_test_textblock.c index f61574c065..860c674397 100644 --- a/src/tests/evas/evas_test_textblock.c +++ b/src/tests/evas/evas_test_textblock.c @@ -4310,7 +4310,7 @@ _test_check_annotation(Evas_Object *tb, size_t len, const char **formats) { Efl_Text_Annotate_Annotation *an; - Efl_Text_Cursor_Cursor *start, *end; + Efl_Text_Cursor_Handle *start, *end; start = evas_object_textblock_cursor_new(tb); end = evas_object_textblock_cursor_new(tb); @@ -4350,7 +4350,7 @@ EFL_START_TEST(evas_textblock_annotation) { START_TB_TEST(); Efl_Text_Annotate_Annotation *an, *an2; - Efl_Text_Cursor_Cursor *start, *end; + Efl_Text_Cursor_Handle *start, *end; start = evas_object_textblock_cursor_new(tb); end = evas_object_textblock_cursor_new(tb); @@ -4476,7 +4476,7 @@ EFL_START_TEST(evas_textblock_annotation) /* Check that format is not extended if it's an "object item" */ evas_textblock_cursor_pos_set(cur, 5); - efl_text_cursor_text_insert(tb, cur, "a"); + evas_textblock_cursor_text_prepend(cur, "a"); _test_check_annotation(tb, 5, 7, _COMP_PARAMS()); _test_check_annotation(tb, 0, 3, _COMP_PARAMS()); @@ -4499,7 +4499,7 @@ EFL_START_TEST(evas_textblock_annotation) _test_check_annotation(tb, 3, 3, _COMP_PARAMS("color=#fff")); /* Old API */ evas_textblock_cursor_pos_set(cur, 5); - efl_text_cursor_text_insert(tb, cur, "a"); + evas_textblock_cursor_text_prepend(cur, "a"); _test_check_annotation(tb, 0, 0, _COMP_PARAMS("color=#fff")); _test_check_annotation(tb, 5, 5, _COMP_PARAMS()); @@ -4511,7 +4511,7 @@ EFL_START_TEST(evas_textblock_annotation) _test_check_annotation(tb, 4, 4, _COMP_PARAMS("color=#fff")); evas_textblock_cursor_pos_set(cur, 4); /* Cursor position is now: hello|\nworld */ - efl_text_cursor_text_insert(tb, cur, "a"); + evas_textblock_cursor_text_prepend(cur, "a"); _test_check_annotation(tb, 0, 0, _COMP_PARAMS("color=#fff")); _test_check_annotation(tb, 5, 5, _COMP_PARAMS("color=#fff")); @@ -4519,7 +4519,6 @@ EFL_START_TEST(evas_textblock_annotation) evas_textblock_cursor_pos_set(cur, 4); an = efl_text_cursor_item_annotation_get(tb, cur); ck_assert(!an); - an = efl_text_cursor_item_insert(tb, cur, "", "size=16x16"); evas_textblock_cursor_pos_set(cur, 4); an = efl_text_cursor_item_annotation_get(tb, cur); @@ -4533,16 +4532,18 @@ EFL_END_TEST; #define START_EFL_CANVAS_TEXT_TEST() \ Evas *evas; \ Eo *txt; \ - Efl_Text_Cursor_Cursor *cur; \ + Efl_Text_Cursor_Handle *cur; \ + Efl_Text_Cursor *cur_obj; \ evas = EVAS_TEST_INIT_EVAS(); \ evas_font_hinting_set(evas, EVAS_FONT_HINTING_AUTO); \ txt = efl_add(EFL_CANVAS_TEXT_CLASS, evas); \ fail_if(!txt); \ - efl_canvas_text_legacy_newline_set(txt, EINA_FALSE); \ + efl_canvas_text_newline_as_paragraph_separator_set(txt, EINA_FALSE); \ efl_canvas_text_style_set(txt, NULL, style_buf); \ fail_if(!efl_canvas_text_style_get(txt, NULL) || \ - strcmp(style_buf, efl_canvas_text_style_get(txt, NULL))); \ - cur = efl_text_cursor_new(txt); \ + strcmp(style_buf, efl_canvas_text_style_get(txt, NULL))); \ + cur_obj = efl_canvas_text_cursor_create(txt);\ + cur = efl_text_cursor_handle_get(cur_obj); \ fail_if(!cur); \ do \ { \ @@ -4552,7 +4553,7 @@ while (0) #define END_EFL_CANVAS_TEXT_TEST() \ do \ { \ - efl_text_cursor_free(txt, cur); \ + efl_del(cur_obj); \ efl_del(txt); \ evas_free(evas); \ } \ @@ -4580,19 +4581,24 @@ EFL_START_TEST(efl_text) Evas_Coord x, x2; Evas_Coord nw, nh; Evas_Coord cx, cx2; + Eina_Size2D size; /* Split cursor in LTR paragraph. * Russian 't' in the beginnning to create additional item.*/ /*01234 5 6789012345678 19 01234 */ efl_text_set(tb, "тest \u202bנסיוןabcנסיון\u202c bang"); - efl_canvas_text_size_native_get(tb, &nw, &nh); + size = efl_canvas_text_size_native_get(tb); + nw = size.w; + nh = size.h; + efl_gfx_entity_size_set(tb, EINA_SIZE2D(nw, nh)); /* Logical cursor after "test " */ evas_textblock_cursor_pos_set(cur, 6); - fail_if(!efl_text_cursor_geometry_get(tb, cur, - EFL_TEXT_CURSOR_TYPE_BEFORE, &cx, NULL, NULL, NULL, &cx2, - NULL, NULL, NULL)); + fail_if(!evas_textblock_cursor_geometry_bidi_get(cur, + &cx, NULL, NULL, NULL, &cx2, + NULL, NULL, NULL, EVAS_TEXTBLOCK_CURSOR_BEFORE)); + evas_textblock_cursor_pos_set(cur, 18); evas_textblock_cursor_pen_geometry_get(cur, &x, NULL, NULL, NULL); evas_textblock_cursor_pos_set(cur, 20); @@ -4614,13 +4620,26 @@ EFL_START_TEST(efl_canvas_text_cursor) efl_text_set(txt, buf); fail_if(strcmp(efl_text_get(txt), buf)); - efl_text_cursor_line_jump_by(txt, cur, -1); - pos = efl_text_cursor_position_get(txt, cur); + efl_text_cursor_line_jump_by(cur_obj, -1); + pos = efl_text_cursor_position_get(cur_obj); ck_assert_int_eq(pos, 0); - efl_text_cursor_line_jump_by(txt, cur, 1); - pos = efl_text_cursor_position_get(txt, cur); + efl_text_cursor_line_jump_by(cur_obj, 1); + pos = efl_text_cursor_position_get(cur_obj); ck_assert_int_eq(pos, 10); + + Eo * cursor1 = efl_add(EFL_TEXT_CURSOR_CLASS, txt); + pos = efl_text_cursor_position_get(cursor1); + ck_assert_int_eq(pos, -1); + efl_text_cursor_position_set(cursor1, 10); + pos = efl_text_cursor_position_get(cursor1); + ck_assert_int_eq(pos, -1); + + efl_canvas_text_cursor_add(txt, cursor1); + efl_text_cursor_position_set(cursor1, 1); + pos = efl_text_cursor_position_get(cursor1); + ck_assert_int_eq(pos, 1); + END_EFL_CANVAS_TEXT_TEST(); } EFL_END_TEST @@ -4629,24 +4648,24 @@ EFL_END_TEST EFL_START_TEST(efl_canvas_text_markup) { START_EFL_CANVAS_TEXT_TEST(); - Efl_Text_Cursor_Cursor *start, *end; + Efl_Text_Cursor *start, *end; char *res; - start = efl_text_cursor_new(txt); - end = efl_text_cursor_new(txt); + start = efl_canvas_text_cursor_create(txt); + end = efl_canvas_text_cursor_create(txt); efl_text_set(txt, "\n\n\n"); - efl_text_cursor_position_set(txt, start, 1); - efl_text_cursor_position_set(txt, end, 2); - res = efl_text_markup_interactive_markup_range_get(txt, start, end); + efl_text_cursor_position_set(start, 1); + efl_text_cursor_position_set(end, 2); + res = efl_text_cursor_range_markup_get(start, end); ck_assert_str_eq(res, "
"); free(res); efl_text_set(txt, "a\u2029bc\ndef\n\u2029"); - efl_text_cursor_position_set(txt, start, 2); - efl_text_cursor_position_set(txt, end, 5); - res = efl_text_markup_interactive_markup_range_get(txt, start, end); + efl_text_cursor_position_set(start, 2); + efl_text_cursor_position_set(end, 5); + res = efl_text_cursor_range_markup_get(start, end); ck_assert_str_eq(res, "bc
"); free(res); @@ -4661,16 +4680,16 @@ EFL_START_TEST(efl_canvas_text_markup_invalid_escape) char * text1 = "Hello"; char * text2 = "Hello&123"; char * text3 = "Hello&123&456"; - Evas_Coord fw1, fw2, fw3; + Eina_Size2D fw1, fw2, fw3; efl_text_markup_set(txt,text1); - efl_canvas_text_size_native_get(txt, &fw1, NULL); + fw1 = efl_canvas_text_size_native_get(txt); efl_text_markup_set(txt,text2); - efl_canvas_text_size_native_get(txt, &fw2, NULL); - fail_if(fw2 <= fw1); + fw2 = efl_canvas_text_size_native_get(txt); + fail_if(fw2.w <= fw1.w); efl_text_markup_set(txt,text3); - efl_canvas_text_size_native_get(txt, &fw3, NULL); - fail_if(fw3 <= fw2); + fw3 = efl_canvas_text_size_native_get(txt); + fail_if(fw3.w <= fw2.w); END_EFL_CANVAS_TEXT_TEST(); }