From 1a02745a88eb863cad307f0ba9fd386594ce4e82 Mon Sep 17 00:00:00 2001 From: Ali Alzyod Date: Thu, 9 Jan 2020 22:33:07 +0900 Subject: [PATCH] efl.text.cursor: change to abstract class Summary: 1- Change cursor to abstract class 2- Remove copy method from cursor 3- remove cursor_Add method from efl.canvas.textblock and efl.ui.textbox Reviewers: woohyun, segfaultxavi, bu5hm4n Reviewed By: bu5hm4n Subscribers: lauromoura, YOhoho, cedric, #reviewers, #committers Tags: #efl Maniphest Tasks: T8299, T8454 Differential Revision: https://phab.enlightenment.org/D11034 --- .../efl_ui_internal_text_interactive.c | 40 +++++++++++-------- src/lib/elementary/efl_ui_textbox.c | 8 +--- src/lib/elementary/efl_ui_textbox.eo | 7 ---- src/lib/evas/canvas/efl_canvas_textblock.eo | 9 ----- .../canvas/efl_canvas_textblock_internal.h | 8 ++++ src/lib/evas/canvas/efl_text_cursor.c | 20 ++++++++-- src/lib/evas/canvas/efl_text_cursor.eo | 9 +---- src/lib/evas/canvas/evas_object_textblock.c | 8 +--- src/tests/evas/evas_test_textblock.c | 21 +++++----- 9 files changed, 59 insertions(+), 71 deletions(-) diff --git a/src/lib/elementary/efl_ui_internal_text_interactive.c b/src/lib/elementary/efl_ui_internal_text_interactive.c index 3212632532..54b29f2712 100644 --- a/src/lib/elementary/efl_ui_internal_text_interactive.c +++ b/src/lib/elementary/efl_ui_internal_text_interactive.c @@ -76,6 +76,12 @@ _text_filter_markup_prepend(Efl_Canvas_Textblock *obj, Efl_Ui_Internal_Text_Inte const char *fmtpre, const char *fmtpost, Eina_Bool clearsel, Eina_Bool changeinfo); +static void +_cur_pos_copy(Efl_Text_Cursor *src, Efl_Text_Cursor *dest) +{ + efl_text_cursor_position_set(dest, efl_text_cursor_position_get(src)); +} + #ifdef HAVE_ECORE_IMF static void _preedit_clear(Efl_Ui_Internal_Text_Interactive_Data *en) @@ -523,12 +529,12 @@ _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 = efl_canvas_textblock_cursor_create(obj); - efl_text_cursor_copy(cur, en->preedit_start); + _cur_pos_copy(cur, en->preedit_start); /* set preedit end cursor */ if (!en->preedit_end) en->preedit_end = efl_canvas_textblock_cursor_create(obj); - efl_text_cursor_copy(cur, en->preedit_end); + _cur_pos_copy(cur, en->preedit_end); preedit_end_pos = efl_text_cursor_position_get(cur); @@ -752,8 +758,8 @@ _sel_init(Efl_Text_Cursor *c, Evas_Object *o EINA_UNUSED, Efl_Ui_Internal_Text_I if (en->have_selection) return; - efl_text_cursor_copy(c, en->sel_start); - efl_text_cursor_copy(c, en->sel_end); + _cur_pos_copy(c, en->sel_start); + _cur_pos_copy(c, en->sel_end); en->have_selection = EINA_FALSE; if (en->selection) @@ -804,7 +810,7 @@ _sel_extend(Efl_Text_Cursor *c, Evas_Object *o, Efl_Ui_Internal_Text_Interactive _sel_enable(c, o, en); if (efl_text_cursor_equal(c, en->sel_end)) return; - efl_text_cursor_copy(c, en->sel_end); + _cur_pos_copy(c, en->sel_end); _entry_imf_cursor_info_set(en); @@ -830,7 +836,7 @@ _sel_clear(Evas_Object *o EINA_UNUSED, Efl_Ui_Internal_Text_Interactive_Data *en { en->have_selection = EINA_FALSE; Eina_Bool b_value = en->have_selection; - efl_text_cursor_copy(en->sel_start, en->sel_end); + _cur_pos_copy(en->sel_start, en->sel_end); efl_event_callback_call(o, EFL_TEXT_INTERACTIVE_EVENT_HAVE_SELECTION_CHANGED, &b_value); } } @@ -1024,9 +1030,9 @@ _key_down_sel_pre(Efl_Ui_Internal_Text_Interactive *obj, Efl_Text_Cursor *cur, E { Eina_Bool sel_forward = efl_text_cursor_compare(en->sel_start, en->sel_end); if ((sel_forward && movement_forward) || (!sel_forward && !movement_forward)) - efl_text_cursor_copy(en->sel_end, cur); + _cur_pos_copy(en->sel_end, cur); else - efl_text_cursor_copy(en->sel_start, cur); + _cur_pos_copy(en->sel_start, cur); _sel_clear(obj, en); } } @@ -1207,7 +1213,7 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void // del to start of previous word Efl_Text_Cursor *tc = efl_canvas_textblock_cursor_create(obj); - efl_text_cursor_copy(tc, cur); + _cur_pos_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); @@ -1242,7 +1248,7 @@ _key_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void // del to end of next word Efl_Text_Cursor *tc = efl_canvas_textblock_cursor_create(obj); - efl_text_cursor_copy(tc, cur); + _cur_pos_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); @@ -1484,7 +1490,7 @@ _cursor_char_coord_set(Efl_Canvas_Textblock *obj, Efl_Text_Cursor *cur, Evas_Coo Efl_Text_Cursor *tc; tc = efl_canvas_textblock_cursor_create(obj); - efl_text_cursor_copy(cur, tc); + _cur_pos_copy(cur, tc); evas_object_geometry_get(obj, &x, &y, NULL, NULL); cx = canvasx - x; cy = canvasy - y; @@ -1549,7 +1555,7 @@ _mouse_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EIN if (shift) { tc = efl_canvas_textblock_cursor_create(obj); - efl_text_cursor_copy(cur, tc); + _cur_pos_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 @@ -1562,7 +1568,7 @@ _mouse_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EIN en->selecting = EINA_FALSE; _sel_clear(obj, en); tc = efl_canvas_textblock_cursor_create(obj); - efl_text_cursor_copy(cur, tc); + _cur_pos_copy(cur, tc); efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_LINE_START); _sel_init(cur, obj, en); efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_LINE_END); @@ -1575,7 +1581,7 @@ _mouse_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EIN if (shift) { tc = efl_canvas_textblock_cursor_create(obj); - efl_text_cursor_copy(cur, tc); + _cur_pos_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 @@ -1591,7 +1597,7 @@ _mouse_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj EIN en->selecting = EINA_FALSE; _sel_clear(obj, en); tc = efl_canvas_textblock_cursor_create(obj); - efl_text_cursor_copy(cur, tc); + _cur_pos_copy(cur, tc); efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_WORD_START); _sel_init(cur, obj, en); efl_text_cursor_move(cur, EFL_TEXT_CURSOR_MOVE_TYPE_WORD_END); @@ -1650,7 +1656,7 @@ _mouse_up_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, void if (en->select_allow) { - efl_text_cursor_copy(en->sel_end, cur); + _cur_pos_copy(en->sel_end, cur); } if (en->selecting) { @@ -1690,7 +1696,7 @@ _mouse_move_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED, Evas_Object *obj, vo if (en->selecting) { tc = efl_canvas_textblock_cursor_create(obj); - efl_text_cursor_copy(cur, tc); + _cur_pos_copy(cur, tc); evas_object_geometry_get(obj, &x, &y, &w, &h); cx = ev->cur.canvas.x - x; cy = ev->cur.canvas.y - y; diff --git a/src/lib/elementary/efl_ui_textbox.c b/src/lib/elementary/efl_ui_textbox.c index 0f545e319f..ea26e3ce0b 100644 --- a/src/lib/elementary/efl_ui_textbox.c +++ b/src/lib/elementary/efl_ui_textbox.c @@ -2108,16 +2108,10 @@ _efl_ui_textbox_entry_insert(Eo *obj, Efl_Ui_Textbox_Data *sd, const char *entry efl_canvas_group_change(obj); } -EOLIAN static void -_efl_ui_textbox_cursor_add(Eo *obj, Efl_Ui_Textbox_Data *pd, Efl_Text_Cursor *cursor) -{ - efl_text_cursor_text_object_set(cursor, pd->text_obj, obj); -} - EOLIAN static Efl_Text_Cursor * _efl_ui_textbox_cursor_create(Eo *obj, Efl_Ui_Textbox_Data *pd) { - Eo* cursor = efl_add(EFL_TEXT_CURSOR_CLASS, pd->text_obj); + Eo* cursor = efl_text_cursor_create(pd->text_obj);; efl_text_cursor_text_object_set(cursor, pd->text_obj, obj); return cursor; } diff --git a/src/lib/elementary/efl_ui_textbox.eo b/src/lib/elementary/efl_ui_textbox.eo index 3f8097a90a..aa3a5dd5be 100644 --- a/src/lib/elementary/efl_ui_textbox.eo +++ b/src/lib/elementary/efl_ui_textbox.eo @@ -64,13 +64,6 @@ class @beta Efl.Ui.Textbox extends Efl.Ui.Layout_Base implements Efl.Input.Click item_factory: Efl.Canvas.Textblock_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.]] diff --git a/src/lib/evas/canvas/efl_canvas_textblock.eo b/src/lib/evas/canvas/efl_canvas_textblock.eo index c9ed381e95..edc170ba81 100644 --- a/src/lib/evas/canvas/efl_canvas_textblock.eo +++ b/src/lib/evas/canvas/efl_canvas_textblock.eo @@ -23,15 +23,6 @@ class @beta Efl.Canvas.Textblock extends Efl.Canvas.Object implements Efl.Text, is_empty: bool; [[$true if empty.]] } } - cursor_add { - [[Adds an existing cursor to the text object. - If the cursor already belonged to another text object it will be reassigned to the new one. - It is typically more convenient to obtain a cursor directly from the text object using @.cursor_create. - ]] - params { - cursor: Efl.Text.Cursor; [[The text cursor to use.]] - } - } cursor_create { [[Creates a new cursor and adds it to the text object. This cursor can be used to manipulate and iterate the content of the text object. diff --git a/src/lib/evas/canvas/efl_canvas_textblock_internal.h b/src/lib/evas/canvas/efl_canvas_textblock_internal.h index a4f03fcef8..eb137455ea 100644 --- a/src/lib/evas/canvas/efl_canvas_textblock_internal.h +++ b/src/lib/evas/canvas/efl_canvas_textblock_internal.h @@ -293,6 +293,14 @@ _evas_textblock_relayout_if_needed(Evas_Object *o); EAPI void efl_text_cursor_text_object_set(Eo *cursor, Eo *canvas_text_obj, Eo *text_obj); +/** + * Internally create instance of cursor object. + * + * @param parent the parent of the cursor object. + */ +EAPI Eo* efl_text_cursor_create(Eo *parent); + + /** * Internally sets cursor handle(legacy textblock cursor) into cursor object. * diff --git a/src/lib/evas/canvas/efl_text_cursor.c b/src/lib/evas/canvas/efl_text_cursor.c index eb699728b8..c0a6c627d9 100644 --- a/src/lib/evas/canvas/efl_text_cursor.c +++ b/src/lib/evas/canvas/efl_text_cursor.c @@ -1,6 +1,7 @@ #include "evas_common_private.h" #include "evas_private.h" #include "efl_canvas_textblock_internal.h" +#include "eo_internal.h" #define MY_CLASS EFL_TEXT_CURSOR_CLASS #define MY_CLASS_NAME "Efl.Text.Cursor" @@ -20,6 +21,8 @@ struct _Evas_Textblock_Selection_Iterator typedef struct _Evas_Textblock_Selection_Iterator Evas_Textblock_Selection_Iterator; +EFL_CLASS_SIMPLE_CLASS(efl_text_cursor, "efl_text_cursor", EFL_TEXT_CURSOR_CLASS) + EOLIAN static void _efl_text_cursor_position_set(Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd, int position) { @@ -102,11 +105,15 @@ _efl_text_cursor_compare(const Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd, co 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) +static void +_efl_text_cursor_copy(const Efl_Text_Cursor *obj, Efl_Text_Cursor *dst) { + Efl_Text_Cursor_Data *pd = efl_data_scope_safe_get(obj, MY_CLASS); + EINA_SAFETY_ON_NULL_RETURN(pd); + Efl_Text_Cursor_Data *pd_dest = efl_data_scope_safe_get(dst, MY_CLASS); EINA_SAFETY_ON_NULL_RETURN(pd_dest); + if (!pd->handle) return; Efl_Text_Cursor_Handle *handle = evas_object_textblock_cursor_new(pd->handle->obj); @@ -119,9 +126,9 @@ _efl_text_cursor_copy(const Eo *obj EINA_UNUSED, Efl_Text_Cursor_Data *pd, Efl_T 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 *dup = efl_text_cursor_create(efl_parent_get(obj)); - efl_text_cursor_copy(obj, dup); + _efl_text_cursor_copy(obj, dup); return dup; } @@ -436,6 +443,11 @@ efl_text_cursor_handle_get(const Eo *obj) return pd->handle; } +Eo* efl_text_cursor_create(Eo *parent) +{ + return efl_add(efl_text_cursor_realized_class_get(), parent); +} + void efl_text_cursor_text_object_set(Eo *cursor, Eo *canvas_text_obj, Eo *text_obj) { Efl_Text_Cursor_Data *pd = efl_data_scope_safe_get(cursor, MY_CLASS); diff --git a/src/lib/evas/canvas/efl_text_cursor.eo b/src/lib/evas/canvas/efl_text_cursor.eo index 70cfdfad21..00dcbd6e63 100644 --- a/src/lib/evas/canvas/efl_text_cursor.eo +++ b/src/lib/evas/canvas/efl_text_cursor.eo @@ -26,7 +26,7 @@ enum @beta Efl.Text.Cursor_Move_Type paragraph_prev [[Advances to the end of the previous paragraph.]] } -class @beta Efl.Text.Cursor extends Efl.Object implements Efl.Duplicate{ +abstract @beta Efl.Text.Cursor extends Efl.Object implements Efl.Duplicate{ [[Cursor API.]] c_prefix: efl_text_cursor; methods { @@ -112,13 +112,6 @@ class @beta Efl.Text.Cursor extends Efl.Object implements Efl.Duplicate{ 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 { diff --git a/src/lib/evas/canvas/evas_object_textblock.c b/src/lib/evas/canvas/evas_object_textblock.c index 1996134966..f4d6cfb88f 100644 --- a/src/lib/evas/canvas/evas_object_textblock.c +++ b/src/lib/evas/canvas/evas_object_textblock.c @@ -8077,16 +8077,10 @@ _efl_canvas_textblock_all_styles_get(const Eo *eo_obj EINA_UNUSED, Efl_Canvas_Te return o->default_format.default_style_str; } -EOLIAN static void -_efl_canvas_textblock_cursor_add(Eo *obj, Efl_Canvas_Textblock_Data *pd EINA_UNUSED, Efl_Text_Cursor *cursor) -{ - efl_text_cursor_text_object_set(cursor, obj, obj); -} - EOLIAN static Efl_Text_Cursor * _efl_canvas_textblock_cursor_create(Eo *obj, Efl_Canvas_Textblock_Data *pd EINA_UNUSED) { - Eo* cursor = efl_add(EFL_TEXT_CURSOR_CLASS, obj); + Eo* cursor = efl_text_cursor_create(obj); efl_text_cursor_text_object_set(cursor, obj, obj); return cursor; } diff --git a/src/tests/evas/evas_test_textblock.c b/src/tests/evas/evas_test_textblock.c index c23eb65caa..b51f149174 100644 --- a/src/tests/evas/evas_test_textblock.c +++ b/src/tests/evas/evas_test_textblock.c @@ -4515,14 +4515,12 @@ EFL_START_TEST(efl_canvas_textblock_cursor) efl_text_cursor_line_number_set(cur_obj, 0); ck_assert_int_eq(efl_text_cursor_position_get(cur_obj), 0); - 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); + Eo * cursor_temp = efl_duplicate(cur_obj); + ck_assert_ptr_ne(cursor_temp, NULL); + efl_del(cursor_temp); + cursor_temp = NULL; - efl_canvas_textblock_cursor_add(txt, cursor1); + Eo * cursor1 = efl_canvas_textblock_cursor_create(txt); efl_text_cursor_position_set(cursor1, 1); pos = efl_text_cursor_position_get(cursor1); ck_assert_int_eq(pos, 1); @@ -4633,13 +4631,12 @@ EFL_START_TEST(efl_canvas_textblock_cursor) ck_assert_int_eq(efl_text_cursor_position_get(cur_obj), 0); #endif - Eo *nCur = efl_add(EFL_TEXT_CURSOR_CLASS, txt), *nCur2 = efl_add(EFL_TEXT_CURSOR_CLASS, txt), *nCur3 = efl_add(EFL_TEXT_CURSOR_CLASS, txt); + Eo *nCur = efl_canvas_textblock_cursor_create(txt); + Eo *nCur2 = efl_canvas_textblock_cursor_create(txt); + Eo *nCur3 = efl_canvas_textblock_cursor_create(txt); efl_text_markup_set(txt, "Hello WorldThis is EFL
Enlightenment"); efl_text_cursor_position_set(cur_obj, 0); - efl_text_cursor_copy(cur_obj, nCur); ck_assert_ptr_ne(nCur, NULL); - efl_text_cursor_copy(cur_obj, nCur2); - efl_text_cursor_copy(cur_obj, nCur3); ck_assert_ptr_ne(nCur2, NULL); ck_assert_ptr_ne(nCur3, NULL); @@ -4655,7 +4652,7 @@ EFL_START_TEST(efl_canvas_textblock_cursor) ck_assert(efl_text_cursor_move(nCur, EFL_TEXT_CURSOR_MOVE_TYPE_PARAGRAPH_NEXT)); ck_assert_int_lt(efl_text_cursor_compare(cur_obj, nCur), 0); ck_assert_int_gt(efl_text_cursor_compare(nCur, cur_obj), 0); - efl_text_cursor_copy(nCur, nCur2); + efl_text_cursor_position_set(nCur2, efl_text_cursor_position_get(nCur)); ck_assert_int_lt(efl_text_cursor_compare(cur_obj, nCur2), 0); ck_assert_int_gt(efl_text_cursor_compare(nCur2, cur_obj), 0); ck_assert(!efl_text_cursor_equal(nCur2, nCur3));