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
This commit is contained in:
Ali Alzyod 2020-01-09 22:33:07 +09:00 committed by WooHyun Jung
parent 7b0a44dd33
commit 1a02745a88
9 changed files with 59 additions and 71 deletions

View File

@ -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;

View File

@ -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;
}

View File

@ -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.]]

View File

@ -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.

View File

@ -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.
*

View File

@ -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);

View File

@ -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 {

View File

@ -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;
}

View File

@ -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 World<ps/>This is EFL<br/>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));