evas_textblock: Get rid of code duplication in _nodes_adjacent_merge
authordottedmag <dottedmag@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Thu, 4 Mar 2010 15:01:51 +0000 (15:01 +0000)
committerdottedmag <dottedmag@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Thu, 4 Mar 2010 15:01:51 +0000 (15:01 +0000)
git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/evas@46870 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33

src/lib/canvas/evas_object_textblock.c

index 2cc96f2..5f07a8c 100644 (file)
@@ -352,71 +352,59 @@ _lines_clear(const Evas_Object *obj, Evas_Object_Textblock_Line *lines)
 }
 
 static void
-_nodes_adjacent_merge(const Evas_Object *obj, Evas_Object_Textblock_Node *n1)
-{
-   Evas_Object_Textblock *o;
-   Evas_Object_Textblock_Node *n0, *n2;
-   Eina_List *l;
-   Evas_Textblock_Cursor *data;
-   int plen;
+_nodes_next_merge(const Evas_Object *obj, Evas_Object_Textblock_Node *cur)
+{
+    Evas_Object_Textblock *o;
+    Evas_Object_Textblock_Node *next;
+    Evas_Object_Textblock_Node *nextnext;
+    Eina_List *l;
+    Evas_Textblock_Cursor *cursor;
+    int cur_len;
+
+    if (!cur || cur->type != NODE_TEXT)
+        return;
+
+    next = (Evas_Object_Textblock_Node*)(EINA_INLIST_GET(cur))->next;
+
+    if (!next || next->type != NODE_TEXT)
+        return;
+
+    /* Merge text */
+    cur_len = eina_strbuf_length_get(cur->len);
+    eina_strbuf_append_length(cur->text, eina_strbuf_string_get(next->text),
+                             eina_strbuf_length_get(next->text));
+
+    /* Remove "next" from list */
+    nextnext = (Evas_Object_Textblock_Node*)EINA_INLIST_GET(next)->next;
+    if (nextnext)
+        EINA_INLIST_GET(nextnext)->prev = (void *)cur;
+    EINA_INLIST_GET(cur)->next = (void *)nextnext;
+
+    /* Fixup cursors */
+    o = obj->object_data;
+    if (next == o->cursor->node) {
+       o->cursor->node = cur;
+       o->cursor->pos += cur_len;
+    }
+    EINA_LIST_FOREACH(o->cursors, l, cursor) {
+        if (next == cursor->node) {
+            cursor->node = cur;
+            cursor->pos += cur_len;
+        }
+    }
+
+    /* Free next */
+    if (next->text) free(next->text);
+    free(next);
+}
 
-   if (n1->type != NODE_TEXT) return;
-   o = (Evas_Object_Textblock *)(obj->object_data);
-   n0 = (Evas_Object_Textblock_Node *)(EINA_INLIST_GET(n1))->prev;
-   n2 = (Evas_Object_Textblock_Node *)(EINA_INLIST_GET(n1))->next;
-   if ((n0) && (n0->type == NODE_TEXT))
-     {
-       plen = eina_strbuf_length_get(n0->text);
-       eina_strbuf_append_length(n0->text, eina_strbuf_string_get(n1->text),
-                                 eina_strbuf_length_get(n1->text));
-       (EINA_INLIST_GET(n0))->next = EINA_INLIST_GET(n2);
-       if (n2) (EINA_INLIST_GET(n2))->prev = EINA_INLIST_GET(n0);
-       // fix any cursors in n1
-       if (n1 == o->cursor->node)
-         {
-            o->cursor->node = n0;
-            o->cursor->pos += plen;
-         }
-       EINA_LIST_FOREACH(o->cursors, l, data)
-         {
-            if (n1 == data->node)
-              {
-                 data->node = n0;
-                 data->pos += plen;
-              }
-         }
-       if (n1->text) eina_strbuf_free(n1->text);
-       free(n1);
-       n1 = n0;
-     }
-   if ((n2) && (n2->type == NODE_TEXT))
-     {
-       n0 = n1;
-       n1 = n2;
-       n2 = (Evas_Object_Textblock_Node *)(EINA_INLIST_GET(n1))->next;
-       plen = eina_strbuf_length_get(n0->text);
-       eina_strbuf_append_length(n0->text, eina_strbuf_string_get(n1->text),
-                                 eina_strbuf_length_get(n1->text));
-       (EINA_INLIST_GET(n0))->next = EINA_INLIST_GET(n2);
-       if (n2) (EINA_INLIST_GET(n2))->prev = EINA_INLIST_GET(n0);
-       // fix any cursors in n1
-       if (n1 == o->cursor->node)
-         {
-            o->cursor->node = n0;
-            o->cursor->pos += plen;
-         }
-       EINA_LIST_FOREACH(o->cursors, l, data)
-         {
-            if (n1 == data->node)
-              {
-                 data->node = n0;
-                 data->pos += plen;
-              }
-         }
-       if (n1->text) eina_strbuf_free(n1->text);
-       free(n1);
-       n1 = n0;
-     }
+static void
+_nodes_adjacent_merge(const Evas_Object *obj, Evas_Object_Textblock_Node *cur)
+{
+    Evas_Object_Textblock_Node *prev;
+    prev = (Evas_Object_Textblock_Node *)EINA_INLIST_GET(cur)->prev;
+    _nodes_next_merge(obj, cur);
+    _nodes_next_merge(obj, prev);
 }
 
 /* table of html escapes (that i can find) this should be ordered with the