edje: keep cursor position on mouse down and move
authorYoungbok Shin <youngb.shin@samsung.com>
Thu, 11 Jan 2018 12:29:20 +0000 (21:29 +0900)
committerYoungbok Shin <youngb.shin@samsung.com>
Thu, 11 Jan 2018 12:29:20 +0000 (21:29 +0900)
The new internal API can be used in elemenatry

@tizen_fix

Change-Id: Ifa3e8ea7ed9cf9ca30fbcd2596550c1836fa35f2

src/lib/edje/edje_entry.c
src/lib/edje/edje_private.h
src/lib/edje/edje_util.c
src/lib/edje/efl_canvas_layout.eo

index 41411ed..403960d 100644 (file)
@@ -31,6 +31,13 @@ struct _Entry
    Evas_Textblock_Cursor *sel_start, *sel_end;
    Evas_Textblock_Cursor *cursor_user, *cursor_user_extra;
    Evas_Textblock_Cursor *preedit_start, *preedit_end;
+   /*********************************************************************
+    * TIZEN_ONLY(20161110): keep cursor position on mouse down and move *
+    *********************************************************************/
+   Evas_Textblock_Cursor *cursor_on_mouse;
+   /*******
+    * END *
+    *******/
    Ecore_Timer           *pw_timer;
    Eina_List             *sel;
    Eina_List             *anchors;
@@ -2762,6 +2769,16 @@ _edje_part_mouse_down_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_
      }
    tc = _edje_cursor_char_coord_set(rp, ev->canvas.x, ev->canvas.y, &cx, &cy);
 
+   /*********************************************************************
+    * TIZEN_ONLY(20161110): keep cursor position on mouse down and move *
+    *********************************************************************/
+   if (!en->cursor_on_mouse)
+     en->cursor_on_mouse = evas_object_textblock_cursor_new(rp->object);
+   evas_textblock_cursor_cluster_coord_set(en->cursor_on_mouse, cx, cy);
+   /*******
+    * END *
+    *******/
+
    if (dosel)
      {
         if ((en->have_selection) &&
@@ -2855,8 +2872,17 @@ _edje_part_mouse_up_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UN
 
    if ((!ev) || (ev->button != 1)) return;
    if (!rp) return;
+
+   /*********************************************************************
+    * TIZEN_ONLY(20161110): keep cursor position on mouse down and move *
+    *********************************************************************
    if (ev->flags & EVAS_BUTTON_TRIPLE_CLICK) return;
    if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK) return;
+    */
+   /*******
+    * END *
+    *******/
+
    if ((rp->type != EDJE_RP_TYPE_TEXT) ||
        (!rp->typedata.text)) return;
    en = rp->typedata.text->entry_data;
@@ -2864,6 +2890,22 @@ _edje_part_mouse_up_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UN
        (rp->part->entry_mode < EDJE_ENTRY_EDIT_MODE_SELECTABLE))
      return;
 
+   /*********************************************************************
+    * TIZEN_ONLY(20161110): keep cursor position on mouse down and move *
+    *********************************************************************/
+   if (en->cursor_on_mouse)
+     {
+        evas_textblock_cursor_free(en->cursor_on_mouse);
+        en->cursor_on_mouse = NULL;
+     }
+
+   if (ev->flags & EVAS_BUTTON_TRIPLE_CLICK) return;
+   if (ev->flags & EVAS_BUTTON_DOUBLE_CLICK) return;
+   if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD) return;
+   /*******
+    * END *
+    *******/
+
    /* We don't check for ON_HOLD because we'd like to end selection anyway when
     * mouse is up, even if it's held. */
 
@@ -2943,6 +2985,19 @@ _edje_part_mouse_move_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_
        (rp->part->entry_mode < EDJE_ENTRY_EDIT_MODE_SELECTABLE))
      return;
 
+   /*********************************************************************
+    * TIZEN_ONLY(20161110): keep cursor position on mouse down and move *
+    *********************************************************************/
+   evas_object_geometry_get(rp->object, &x, &y, &w, &h);
+   cx = ev->cur.canvas.x - x;
+   cy = ev->cur.canvas.y - y;
+
+   if (en->cursor_on_mouse)
+     evas_textblock_cursor_cluster_coord_set(en->cursor_on_mouse, cx, cy);
+   /*******
+    * END *
+    *******/
+
 #ifdef HAVE_ECORE_IMF
    if (en->imf_context)
      {
@@ -2959,9 +3014,18 @@ _edje_part_mouse_move_cb(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_
      {
         tc = evas_object_textblock_cursor_new(rp->object);
         evas_textblock_cursor_copy(en->cursor, tc);
+
+        /*********************************************************************
+         * TIZEN_ONLY(20161110): keep cursor position on mouse down and move *
+         *********************************************************************
         evas_object_geometry_get(rp->object, &x, &y, &w, &h);
         cx = ev->cur.canvas.x - x;
         cy = ev->cur.canvas.y - y;
+         */
+        /*******
+         * END *
+         *******/
+
         /* TIZEN_ONLY(20150127): Add evas_textblock_cursor_cluster_* APIs.
         if (!evas_textblock_cursor_char_coord_set(en->cursor, cx, cy))
          */
@@ -3864,6 +3928,59 @@ _edje_entry_cursor_geometry_get(Edje_Real_Part *rp, Edje_Cursor cur, Evas_Coord
    if (cdir) *cdir = dir;
 }
 
+/*********************************************************************
+ * TIZEN_ONLY(20161110): keep cursor position on mouse down and move *
+ *********************************************************************/
+void
+_edje_entry_cursor_on_mouse_geometry_get(Edje_Real_Part *rp, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch, Evas_BiDi_Direction *cdir)
+{
+   Evas_Coord x, y, w, h, xx, yy, ww, hh;
+   Entry *en;
+   Evas_Textblock_Cursor_Type cur_type;
+   Evas_BiDi_Direction dir;
+
+   if ((rp->type != EDJE_RP_TYPE_TEXT) ||
+       (!rp->typedata.text)) return;
+   en = rp->typedata.text->entry_data;
+   if (!en) return;
+
+   if (!en->cursor_on_mouse)
+     {
+        _edje_entry_cursor_geometry_get(rp, EDJE_CURSOR_MAIN, cx, cy, cw, ch, cdir);
+     }
+   else
+     {
+        switch (rp->part->cursor_mode)
+          {
+           case EDJE_ENTRY_CURSOR_MODE_BEFORE:
+              cur_type = EVAS_TEXTBLOCK_CURSOR_BEFORE;
+              break;
+
+           case EDJE_ENTRY_CURSOR_MODE_UNDER:
+              /* no break for a reason */
+           default:
+              cur_type = EVAS_TEXTBLOCK_CURSOR_UNDER;
+          }
+
+        x = y = w = h = -1;
+        xx = yy = ww = hh = -1;
+        evas_object_geometry_get(rp->object, &x, &y, &w, &h);
+        evas_textblock_cursor_geometry_get(en->cursor_on_mouse, &xx, &yy, &ww, &hh, &dir, cur_type);
+        if (ww < 1) ww = 1;
+        if (rp->part->cursor_mode == EDJE_ENTRY_CURSOR_MODE_BEFORE)
+          edje_object_size_min_restricted_calc(en->cursor_fg, &ww, NULL, ww, 0);
+        if (hh < 1) hh = 1;
+        if (cx) *cx = x + xx;
+        if (cy) *cy = y + yy;
+        if (cw) *cw = ww;
+        if (ch) *ch = hh;
+        if (cdir) *cdir = dir;
+     }
+}
+/*******
+ * END *
+ *******/
+
 void
 _edje_entry_user_insert(Edje_Real_Part *rp, const char *text)
 {
index 22cfe61..4988726 100644 (file)
@@ -2990,6 +2990,13 @@ void _edje_entry_cursor_geometry_get(Edje_Real_Part *rp, Edje_Cursor cur, Evas_C
 /*******
  * END *
  *******/
+/*********************************************************************
+ * TIZEN_ONLY(20161110): keep cursor position on mouse down and move *
+ *********************************************************************/
+void _edje_entry_cursor_on_mouse_geometry_get(Edje_Real_Part *rp, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch, Evas_BiDi_Direction *cdir);
+/*******
+ * END *
+ *******/
 void _edje_entry_user_insert(Edje_Real_Part *rp, const char *text);
 void _edje_entry_select_allow_set(Edje_Real_Part *rp, Eina_Bool allow);
 Eina_Bool _edje_entry_select_allow_get(const Edje_Real_Part *rp);
index 561b2ea..03d06eb 100644 (file)
@@ -7054,4 +7054,30 @@ _efl_canvas_layout_part_valign_get(Eo *eo_obj EINA_UNUSED, Edje *ed, const char
  * END *
  *******/
 
+/*********************************************************************
+ * TIZEN_ONLY(20161110): keep cursor position on mouse down and move *
+ *********************************************************************/
+EOLIAN void
+_efl_canvas_layout_part_text_cursor_on_mouse_geometry_get(Eo *obj EINA_UNUSED, Edje *ed, const char *part, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h)
+{
+   Edje_Real_Part *rp;
+
+   if (x) *x = 0;
+   if (y) *y = 0;
+   if (w) *w = 0;
+   if (h) *h = 0;
+   if ((!ed) || (!part)) return;
+   rp = _edje_real_part_recursive_get(&ed, part);
+   if (!rp) return;
+   if (rp->part->entry_mode > EDJE_ENTRY_EDIT_MODE_NONE)
+     {
+        _edje_entry_cursor_on_mouse_geometry_get(rp, x, y, w, h, NULL);
+        if (x) *x -= ed->x;
+        if (y) *y -= ed->y;
+     }
+}
+/*******
+ * END *
+ *******/
+
 /* vim:set ts=8 sw=3 sts=3 expandtab cino=>5n-2f0^-2{2(0W1st0 :*/
index addd805..2274271 100644 (file)
@@ -325,6 +325,29 @@ class Efl.Canvas.Layout (Efl.Canvas.Group, Efl.File, Efl.Container, Efl.Part,
       /*******
        * END *
        *******/
+      /*********************************************************************
+       * TIZEN_ONLY(20161110): keep cursor position on mouse down and move *
+       *********************************************************************/
+      part_text_cursor_on_mouse_geometry_get @const {
+         [[Returns the cursor geometry of the part relative to the edje
+           object. The cursor geometry is kept in mouse down and move.
+
+           \@internal
+           \@if MOBILE \@since_tizen 3.0
+           \@elseif WEARABLE \@since_tizen 3.0
+           \@endif
+         ]]
+         params {
+            @in part: string; [[The part name]]
+            @out x: int;      [[Cursor X position]]
+            @out y: int;      [[Cursor Y position]]
+            @out w: int;      [[Cursor width]]
+            @out h: int;      [[Cursor height]]
+         }
+      }
+      /*******
+       * END *
+       *******/
    }
    implements {
       Efl.Gfx.visible { set; }