Evas textblock: Use layout paragraphs for faster item locating.

SVN revision: 56487
This commit is contained in:
Tom Hacohen 2011-01-30 10:39:58 +00:00
parent a3698f39a4
commit adeabde88e
1 changed files with 32 additions and 27 deletions

View File

@ -3279,7 +3279,7 @@ _relayout(const Evas_Object *obj)
static void static void
_find_layout_item_line_match(Evas_Object *obj, Evas_Object_Textblock_Node_Text *n, int pos, Evas_Object_Textblock_Line **lnr, Evas_Object_Textblock_Item **itr) _find_layout_item_line_match(Evas_Object *obj, Evas_Object_Textblock_Node_Text *n, int pos, Evas_Object_Textblock_Line **lnr, Evas_Object_Textblock_Item **itr)
{ {
Evas_Object_Textblock_Paragraph *par; Evas_Object_Textblock_Paragraph *par, *found_par = NULL;
Evas_Object_Textblock_Line *ln; Evas_Object_Textblock_Line *ln;
Evas_Object_Textblock *o; Evas_Object_Textblock *o;
@ -3287,7 +3287,15 @@ _find_layout_item_line_match(Evas_Object *obj, Evas_Object_Textblock_Node_Text *
if (!o->formatted.valid) _relayout(obj); if (!o->formatted.valid) _relayout(obj);
EINA_INLIST_FOREACH(o->paragraphs, par) EINA_INLIST_FOREACH(o->paragraphs, par)
{ {
EINA_INLIST_FOREACH(par->lines, ln) if (par->text_node == n)
{
found_par = par;
break;
}
}
if (found_par)
{
EINA_INLIST_FOREACH(found_par->lines, ln)
{ {
Evas_Object_Textblock_Item *it; Evas_Object_Textblock_Item *it;
Evas_Object_Textblock_Line *lnn; Evas_Object_Textblock_Line *lnn;
@ -3295,34 +3303,31 @@ _find_layout_item_line_match(Evas_Object *obj, Evas_Object_Textblock_Node_Text *
lnn = (Evas_Object_Textblock_Line *)(((Eina_Inlist *)ln)->next); lnn = (Evas_Object_Textblock_Line *)(((Eina_Inlist *)ln)->next);
EINA_INLIST_FOREACH(ln->items, it) EINA_INLIST_FOREACH(ln->items, it)
{ {
if (it->text_node == n) /* FIXME: p should be size_t, same goes for pos */
int p = (int) it->text_pos;
if (it->type == EVAS_TEXTBLOCK_ITEM_TEXT)
{ {
/* FIXME: p should be size_t, same goes for pos */ Evas_Object_Textblock_Text_Item *ti =
int p = (int) it->text_pos; _ITEM_TEXT(it);
if (it->type == EVAS_TEXTBLOCK_ITEM_TEXT) p += (int) eina_unicode_strlen(ti->text);
{ }
Evas_Object_Textblock_Text_Item *ti = else
_ITEM_TEXT(it); {
p++;
}
p += (int) eina_unicode_strlen(ti->text); if (((pos >= (int) it->text_pos) && (pos < p)))
} {
else *lnr = ln;
{ *itr = it;
p++; return;
} }
else if (p == pos)
if (((pos >= (int) it->text_pos) && (pos < p))) {
{ *lnr = ln;
*lnr = ln; *itr = it;
*itr = it;
return;
}
else if (p == pos)
{
*lnr = ln;
*itr = it;
}
} }
} }
} }