tasn pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=15281561e5f9e00566418450c1206a5de41fb469

commit 15281561e5f9e00566418450c1206a5de41fb469
Author: Youngbok Shin <[email protected]>
Date:   Tue Sep 2 11:42:32 2014 +0100

    evas textblock: fixed ellipsis character cut off issue with complex markup 
text.
    
    Summary:
    Evas Textblock ellipsis is handled in a item.
    When the ellipsis item is added in the text, some characters are cut off
    considering width of ellipsis character.
    But, it is handled in only one text item.
    If there are many short text item, the ellipsis item can be cut off 
visually.
    And there was a bug in the patch when text is displayed in two lines or 
more.
    The bug is also fixed.
    
    Fixes Phab ticket T1213
    
    @fix
    
    Test Plan: This commit includes test case.
    
    Reviewers: woohyun, seoz, sohyun, tasn, raster
    
    Subscribers: cedric, herdsman
    
    Differential Revision: https://phab.enlightenment.org/D1360
---
 src/lib/evas/canvas/evas_object_textblock.c | 72 +++++++++++++++++++++++------
 src/tests/evas/evas_test_textblock.c        | 20 ++++++++
 2 files changed, 79 insertions(+), 13 deletions(-)

diff --git a/src/lib/evas/canvas/evas_object_textblock.c 
b/src/lib/evas/canvas/evas_object_textblock.c
index 9cd26b1..bbe6bea 100644
--- a/src/lib/evas/canvas/evas_object_textblock.c
+++ b/src/lib/evas/canvas/evas_object_textblock.c
@@ -4375,7 +4375,7 @@ _layout_ellipsis_item_new(Ctxt *c, const 
Evas_Object_Textblock_Item *cur_it)
 static inline void
 _layout_handle_ellipsis(Ctxt *c, Evas_Object_Textblock_Item *it, Eina_List *i)
 {
-   Evas_Object_Textblock_Text_Item *ellip_ti;
+   Evas_Object_Textblock_Text_Item *ti, *ellip_ti;
    Evas_Object_Textblock_Item *last_it;
    Evas_Coord save_cx;
    int wrap;
@@ -4385,24 +4385,70 @@ _layout_handle_ellipsis(Ctxt *c, 
Evas_Object_Textblock_Item *it, Eina_List *i)
    save_cx = c->x;
    c->w -= ellip_ti->parent.w;
 
-   if (it->type == EVAS_TEXTBLOCK_ITEM_TEXT)
+   /* If there is no enough space for ellipsis item, remove all of items */
+   if (c->w <= 0)
      {
-        Evas_Object_Textblock_Text_Item *ti = _ITEM_TEXT(it);
-
-        wrap = _layout_text_cutoff_get(c, last_it->format, ti);
-        if ((wrap > 0) && !IS_AT_END(ti, (size_t) wrap))
-          {
-             _layout_item_text_split_strip_white(c, ti, i, wrap);
-          }
-        else if ((wrap == 0) && (c->ln->items))
+        while (c->ln->items)
           {
              last_it = _ITEM(EINA_INLIST_GET(c->ln->items)->last);
+             c->ln->items = _ITEM(eina_inlist_remove(
+                   EINA_INLIST_GET(c->ln->items),
+                   EINA_INLIST_GET(last_it)));
           }
+        last_it = NULL;
      }
-   else if (it->type == EVAS_TEXTBLOCK_ITEM_FORMAT)
+
+   while (last_it)
      {
-        /* We don't want to add this format item. */
-        last_it = NULL;
+        if (last_it->type == EVAS_TEXTBLOCK_ITEM_TEXT)
+          {
+             ti = _ITEM_TEXT(last_it);
+
+             wrap = _layout_text_cutoff_get(c, last_it->format, ti);
+
+             if ((wrap > 0) && !IS_AT_END(ti, (size_t) wrap))
+               {
+                  _layout_item_text_split_strip_white(c, ti, i, wrap);
+                  break;
+               }
+             else if (wrap < 0)
+               {
+                  break;
+               }
+          }
+        else
+          {
+             /* We will ignore format items. ex) tab
+              * But, if there is <item> tag and size is acceptable, we have to 
insert it to line. */
+             if (!strncmp(_ITEM_FORMAT(last_it)->item, "item", 4) &&
+                 ((c->w - c->o->style_pad.l - c->o->style_pad.r - c->marginl - 
c->marginr) >= (c->x + last_it->adv)))
+               {
+                  break;
+               }
+          }
+
+        if (c->ln->items && last_it != it)
+          {
+             c->ln->items = _ITEM(eina_inlist_remove(
+                   EINA_INLIST_GET(c->ln->items),
+                   EINA_INLIST_GET(last_it)));
+          }
+
+        last_it = (c->ln->items) ? _ITEM(EINA_INLIST_GET(c->ln->items)->last) 
: NULL;
+
+        if (last_it)
+          {
+             /* We need to renew ellipsis item.
+              * Because, base format is changed to last_it.
+              * We can't reuse it. */
+             c->w += ellip_ti->parent.w;
+             ellip_ti = _layout_ellipsis_item_new(c, last_it);
+             c->w -= ellip_ti->parent.w;
+             c->x -= last_it->adv;
+             if (c->x < 0)
+               c->x = 0;
+             save_cx = c->x;
+          }
      }
 
    c->x = save_cx;
diff --git a/src/tests/evas/evas_test_textblock.c 
b/src/tests/evas/evas_test_textblock.c
index c740be2..3b49eb9 100644
--- a/src/tests/evas/evas_test_textblock.c
+++ b/src/tests/evas/evas_test_textblock.c
@@ -1763,6 +1763,26 @@ START_TEST(evas_textblock_wrapping)
    evas_object_textblock_size_formatted_get(tb, &w, &h);
    ck_assert_int_le(w, (nw / 2));
 
+   evas_object_textblock_text_markup_set(tb, "a<b>b</b>a<b>b</b>a<b>b</b>");
+   evas_textblock_cursor_format_prepend(cur, "+ font_size=50 ellipsis=1.0");
+   evas_object_textblock_size_native_get(tb, &nw, &nh);
+   evas_object_resize(tb, nw / 2, nh * 2);
+   evas_object_textblock_size_formatted_get(tb, &w, &h);
+   ck_assert_int_le(w, (nw / 2));
+
+   evas_object_textblock_text_markup_set(tb, "<item absize=100x100 
href=item1></item><item absize=100x100 href=item2></item>");
+   evas_textblock_cursor_format_prepend(cur, "+ ellipsis=1.0");
+   evas_object_resize(tb, 101, 100);
+   evas_object_textblock_size_formatted_get(tb, &w, &h);
+   ck_assert_int_le(w, 100);
+
+   evas_object_textblock_text_markup_set(tb, "ab");
+   evas_textblock_cursor_format_prepend(cur, "+ ellipsis=1.0");
+   evas_object_textblock_size_native_get(tb, &nw, &nh);
+   evas_object_resize(tb, nw / 2, nh * 2);
+   evas_object_textblock_size_formatted_get(tb, &w, &h);
+   ck_assert_int_le(w, ellip_w);
+
    {
       double ellip;
       for(ellip = 0.0; ellip <= 1.0; ellip = ellip + 0.1)

-- 


Reply via email to