efl.text.cursor: change to abstract class
authorAli Alzyod <ali198724@gmail.com>
Thu, 9 Jan 2020 13:33:07 +0000 (22:33 +0900)
committerJongmin Lee <jm105.lee@samsung.com>
Thu, 9 Jan 2020 21:03:20 +0000 (06:03 +0900)
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

src/lib/elementary/efl_ui_internal_text_interactive.c
src/lib/elementary/efl_ui_textbox.c
src/lib/elementary/efl_ui_textbox.eo
src/lib/evas/canvas/efl_canvas_textblock.eo
src/lib/evas/canvas/efl_canvas_textblock_internal.h
src/lib/evas/canvas/efl_text_cursor.c
src/lib/evas/canvas/efl_text_cursor.eo
src/lib/evas/canvas/evas_object_textblock.c
src/tests/evas/evas_test_textblock.c

index 3212632..54b29f2 100644 (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;
index f58320d..2ed0a21 100644 (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;
 }
index c8f7279..fca43ab 100644 (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.]]
index c9ed381..edc170b 100644 (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.
index a4f03fc..eb13745 100644 (file)
@@ -294,6 +294,14 @@ EAPI void efl_text_cursor_text_object_set(Eo *cursor, Eo *canvas_text_obj, Eo *t
 
 
 /**
+ * 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.
  *
  * @param obj     the cursor object.
index eb69972..c0a6c62 100644 (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);
index 70cfdfa..00dcbd6 100644 (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 {
index 41aff77..e567e8c 100644 (file)
@@ -8336,16 +8336,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;
 }
index c23eb65..b51f149 100644 (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));