diff --git a/legacy/edje/ChangeLog b/legacy/edje/ChangeLog index 5a8c7e68fa..dec9817fe3 100644 --- a/legacy/edje/ChangeLog +++ b/legacy/edje/ChangeLog @@ -696,3 +696,7 @@ * Fix inheriting gorups with programs that have after programs where after programs are duplicated in the list. + +2012-12-12 Cedric Bail + + * Use Evas to compute Ellipsis. diff --git a/legacy/edje/NEWS b/legacy/edje/NEWS index 07f3fa62ba..7b596925d4 100644 --- a/legacy/edje/NEWS +++ b/legacy/edje/NEWS @@ -22,6 +22,7 @@ Improvements: * Less memory used per callbacks. * Don't generate an annotate file if edje_cc failed. * Lua 5.2 support added, still works fine with 5.1. + * Evas now does compute Ellipsis. Fixes: * fix scale_set with edje containing boxes and/or tables diff --git a/legacy/edje/src/lib/edje_text.c b/legacy/edje/src/lib/edje_text.c index 0b26580cdc..907f5d21be 100644 --- a/legacy/edje/src/lib/edje_text.c +++ b/legacy/edje/src/lib/edje_text.c @@ -77,52 +77,12 @@ _edje_text_part_on_del(Edje *ed, Edje_Part *pt) } } -static void -_edje_text_fit_set(char *buf, const char *text, int c1, int c2) -{ - /* helper function called from _edje_text_fit_x(). - * note that we can use strcpy()/strcat() safely, the buffer lengths - * are checked in the caller. - */ - - if (c1 >= 0) - { - strcpy(buf, _ELLIP_STR); - - if (c2 >= 0) - { - strncat(buf, text + c1, c2 - c1); - strcat(buf, _ELLIP_STR); - } - else - strcat(buf, text + c1); - } - else - { - if (c2 >= 0) - { - strncpy(buf, text, c2); - buf[c2] = 0; - strcat(buf, _ELLIP_STR); - } - else - strcpy(buf, text); - } -} - static const char * _edje_text_fit_x(Edje *ed, Edje_Real_Part *ep, Edje_Calc_Params *params, const char *text, const char *font, int size, - Evas_Coord sw, int *free_text) + Evas_Coord sw, Evas_Coord sh, int *free_text) { - Evas_Coord tw = 0, th = 0, p; - int l, r; - int i; - char *buf; - int uc1 = -1, uc2 = -1, c1 = -1, c2 = -1; - int loop = 0, extra; - size_t orig_len; FLOAT_T sc; sc = ed->scale; @@ -134,148 +94,12 @@ _edje_text_fit_x(Edje *ed, Edje_Real_Part *ep, if (ep->part->scale) evas_object_scale_set(ep->object, TO_DOUBLE(sc)); eo_do(ep->object, - evas_obj_text_font_set(font, size), + evas_obj_text_ellipsis_set(params->type.text.elipsis), + evas_obj_text_font_set(font, size), evas_obj_text_text_set(text), - evas_obj_text_style_pad_get(&l, &r, NULL, NULL)); - part_get_geometry(ep, &tw, &th); + evas_obj_size_set(sw, sh)); - p = ((sw - tw) * params->type.text.elipsis); - - /* chop chop */ - if (tw > sw) - { - if (params->type.text.elipsis != 0.0) - /* should be the last in text! not the rightmost */ - uc1 = evas_object_text_last_up_to_pos(ep->object, - -p + l, th / 2); - if (params->type.text.elipsis != 1.0) - { - /* should be the last in text! not the rightmost */ - if ((-p + sw -r) < 0) - uc2 = evas_object_text_last_up_to_pos(ep->object, 0, th / 2); - else - uc2 = evas_object_text_last_up_to_pos(ep->object, - -p + sw - r, th / 2); - } - if ((uc1 < 0) && (uc2 < 0)) - { - uc1 = 0; - uc2 = 0; - } - } - - if (!(((uc1 >= 0) || (uc2 >= 0)) && (tw > sw))) - return text; - - if ((uc1 == 0) && (uc2 == 0)) - return text; - - orig_len = strlen(text); - - /* don't overflow orig_len by adding extra - * FIXME: we might want to set a max string length somewhere... - */ - extra = 1 + 3 + 3; /* terminator, leading and trailing ellipsis */ - orig_len = MIN(orig_len, ((size_t) 8192 - extra)); - - if (!(buf = malloc(orig_len + extra))) - return text; - - /* Convert uc1, uc2 -> c1, c2 */ - i = 0; - if (uc1 >= 0) - { - c1 = 0; - for ( ; i < uc1 ; i++) - { - c1 = evas_string_char_next_get(text, c1, NULL); - } - } - if (uc2 >= 0) - { - if (c1 >= 0) - { - c2 = c1; - } - else - { - c2 = 0; - } - for ( ; i < uc2 ; i++) - { - c2 = evas_string_char_next_get(text, c2, NULL); - } - } - - buf[0] = '\0'; - - while (((c1 >= 0) || (c2 >= 0)) && (tw > sw)) - { - loop++; - if (sw <= 0.0) - { - buf[0] = 0; - break; - } - if ((c1 >= 0) && (c2 >= 0)) - { - if ((loop & 0x1)) - { - if (c1 >= 0) - c1 = evas_string_char_next_get(text, c1, NULL); - } - else - { - if (c2 >= 0) - { - c2 = evas_string_char_prev_get(text, c2, NULL); - if (c2 < 0) - { - buf[0] = 0; - break; - } - } - } - } - else - { - if (c1 >= 0) - c1 = evas_string_char_next_get(text, c1, NULL); - else if (c2 >= 0) - { - c2 = evas_string_char_prev_get(text, c2, NULL); - if (c2 < 0) - { - buf[0] = 0; - break; - } - } - } - if ((c1 >= 0) && (c2 >= 0)) - { - if (c1 >= c2) - { - buf[0] = 0; - break; - } - } - else if ((c1 > 0 && (size_t) c1 >= orig_len) || c2 == 0) - { - buf[0] = 0; - break; - } - - buf[0] = 0; - - _edje_text_fit_set(buf, text, c1, c2); - - evas_object_text_text_set(ep->object, buf); - part_get_geometry(ep, &tw, &th); - } - - *free_text = 1; - - return buf; + return text; } static const char * @@ -569,7 +393,9 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep, if (inlined_font) evas_object_text_font_source_set(ep->object, ed->path); else evas_object_text_font_source_set(ep->object, NULL); - text = _edje_text_fit_x(ed, ep, params, text, font, size, sw, &free_text); + text = _edje_text_fit_x(ed, ep, params, + text, font, size, + sw, sh, &free_text); } eina_stringshare_replace(&ep->typedata.text->cache.out_str, text);