Evas textblock: Fixed evas_textblock_cursor_geometry_get with the cursor type: EVAS_T...
authortasn <tasn@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sun, 30 Jan 2011 10:32:09 +0000 (10:32 +0000)
committertasn <tasn@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sun, 30 Jan 2011 10:32:09 +0000 (10:32 +0000)
git-svn-id: http://svn.enlightenment.org/svn/e/trunk/evas@56414 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/canvas/evas_object_textblock.c

index b139bc7..89ab0d7 100644 (file)
@@ -6704,7 +6704,6 @@ evas_textblock_cursor_geometry_get(const Evas_Textblock_Cursor *cur, Evas_Coord
 {
    int ret = -1;
    const Evas_Textblock_Cursor *dir_cur;
-   Evas_Textblock_Cursor cur2;
 
    dir_cur = cur;
    if (ctype == EVAS_TEXTBLOCK_CURSOR_UNDER)
@@ -6713,42 +6712,59 @@ evas_textblock_cursor_geometry_get(const Evas_Textblock_Cursor *cur, Evas_Coord
      }
    else if (ctype == EVAS_TEXTBLOCK_CURSOR_BEFORE)
      {
-        /*FIXME: Rough sketch, not yet implemented - VERY buggy. */
         /* In the case of a "before cursor", we should get the coordinates
          * of just after the previous char (which in bidi text may not be
          * just before the current char). */
         Evas_Coord x, y, h, w;
+        Evas_Textblock_Cursor cur2;
+        Evas_Object_Textblock_Node_Format *fmt;
+
+        cur2.obj = cur->obj;
+        evas_textblock_cursor_copy(cur, &cur2);
+        cur2.pos--;
+        fmt = _evas_textblock_cursor_node_format_at_pos_get(&cur2);
 
         /* If it's at the end of the line, we want to get the position, not
          * the position of the previous */
         if ((cur->pos > 0) && !_evas_textblock_cursor_is_at_the_end(cur))
           {
-             dir_cur = &cur2;
-             cur2.obj = cur->obj;
-             evas_textblock_cursor_copy(cur, &cur2);
-             cur2.pos--;
-             ret = evas_textblock_cursor_char_geometry_get(&cur2, &x, &y, &w, &h);
+             Eina_Bool before_char = EINA_FALSE;
+             if (!fmt ||
+                   !_IS_LINE_SEPARATOR(eina_strbuf_string_get(fmt->format)))
+               {
+                  dir_cur = &cur2;
+                  before_char = EINA_FALSE;
+               }
+             else
+               {
+                  before_char = EINA_TRUE;
+               }
+             ret = evas_textblock_cursor_char_geometry_get(
+                   dir_cur, &x, &y, &w, &h);
 #ifdef BIDI_SUPPORT
              /* Adjust if the char is an rtl char */
              if (ret >= 0)
                {
                   Evas_BiDi_Props props;
-                  props.props = cur2.node->bidi_props;
+                  props.props = dir_cur->node->bidi_props;
                   props.start = 0;
 
-                  if (evas_bidi_is_rtl_char(&props, cur2.pos))
+                  if ((!before_char &&
+                           evas_bidi_is_rtl_char(&props, dir_cur->pos)) ||
+                        (before_char &&
+                         !evas_bidi_is_rtl_char(&props, dir_cur->pos)))
+
                     {
                        /* Just don't advance the width */
                        w = 0;
                     }
                }
 #endif
-
           }
         else
           {
-             ret = evas_textblock_cursor_char_geometry_get(cur, &x, &y, &w, &h);
-             w = 0;
+             ret = evas_textblock_cursor_char_geometry_get(
+                   dir_cur, &x, &y, &w, &h);
           }
         if (ret >= 0)
           {