From c6751884b09d0267abe7f511c9d398db74859708 Mon Sep 17 00:00:00 2001 From: Tom Hacohen Date: Thu, 5 May 2011 13:38:04 +0000 Subject: [PATCH] Evas textblock: Use more relevant replacement chars for formats. For example we use 0x2029 (PS char) for paragraph separator, \n for newline and \t for tab. This lets us handle their bidi and line break properties in a more correct manner. SVN revision: 59214 --- legacy/evas/src/lib/canvas/evas_object_textblock.c | 31 +++++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/legacy/evas/src/lib/canvas/evas_object_textblock.c b/legacy/evas/src/lib/canvas/evas_object_textblock.c index bef7bc4..dee1091 100644 --- a/legacy/evas/src/lib/canvas/evas_object_textblock.c +++ b/legacy/evas/src/lib/canvas/evas_object_textblock.c @@ -79,6 +79,12 @@ static const char o_type[] = "textblock"; /* The char to be inserted instead of visible formats */ #define EVAS_TEXTBLOCK_REPLACEMENT_CHAR 0xFFFC +#define _PARAGRAPH_SEPARATOR 0x2029 +#define EVAS_TEXTBLOCK_IS_VISIBLE_FORMAT_CHAR(ch) \ + (((ch) == EVAS_TEXTBLOCK_REPLACEMENT_CHAR) || \ + ((ch) == '\n') || \ + ((ch) == '\t') || \ + ((ch) == _PARAGRAPH_SEPARATOR)) /* private struct for textblock object internal data */ /** @@ -2800,6 +2806,13 @@ _layout_format_item_add(Ctxt *c, Evas_Object_Textblock_Node_Format *n, const cha /** * @internal + * Returns true if the item is a tab + * @def _IS_TAB(item) + */ +#define _IS_TAB(item) \ + (!strcmp(item, "\t") || !strcmp(item, "\\t")) +/** + * @internal * Returns true if the item is a line spearator, false otherwise * @def _IS_LINE_SEPARATOR(item) */ @@ -6498,8 +6511,19 @@ evas_textblock_cursor_format_append(Evas_Textblock_Cursor *cur, const char *form } if (is_visible && cur->node) { - eina_ustrbuf_insert_char(cur->node->unicode, - EVAS_TEXTBLOCK_REPLACEMENT_CHAR, cur->pos); + Eina_Unicode insert_char; + /* Insert a visual representation according to the type of the + format */ + if (_IS_PARAGRAPH_SEPARATOR(o, format)) + insert_char = _PARAGRAPH_SEPARATOR; + else if (_IS_LINE_SEPARATOR(format)) + insert_char = '\n'; + else if (_IS_TAB(format)) + insert_char = '\t'; + else + insert_char = EVAS_TEXTBLOCK_REPLACEMENT_CHAR; + + eina_ustrbuf_insert_char(cur->node->unicode, insert_char, cur->pos); /* Advance all the cursors after our cursor */ _evas_textblock_cursors_update_offset(cur, cur->node, cur->pos, 1); @@ -6910,8 +6934,7 @@ evas_textblock_cursor_format_is_visible_get(const Evas_Textblock_Cursor *cur) if (!cur) return EINA_FALSE; if (!cur->node) return EINA_FALSE; text = eina_ustrbuf_string_get(cur->node->unicode); - return (text[cur->pos] == EVAS_TEXTBLOCK_REPLACEMENT_CHAR) ? - EINA_TRUE : EINA_FALSE; + return EVAS_TEXTBLOCK_IS_VISIBLE_FORMAT_CHAR(text[cur->pos]); } EAPI int -- 2.7.4