Enlightenment CVS committal

Author  : dj2
Project : e17
Module  : libs/evas

Dir     : e17/libs/evas/src/lib/canvas


Modified Files:
        evas_object_textblock.c 


Log Message:
- fill in evas_object_textblock_text_del

===================================================================
RCS file: 
/cvsroot/enlightenment/e17/libs/evas/src/lib/canvas/evas_object_textblock.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -3 -r1.16 -r1.17
--- evas_object_textblock.c     1 Feb 2005 07:17:00 -0000       1.16
+++ evas_object_textblock.c     1 Feb 2005 07:58:02 -0000       1.17
@@ -966,11 +966,19 @@
    return ret;
 }
 
+/**
+ * Removes length bytes from the textblock from the current cursor position.
+ * @param   obj The given textblock.
+ * @param   len The number of bytes to remove
+ * @return  Returns no value.
+ */
 void
 evas_object_textblock_text_del(Evas_Object *obj, int len)
 {
    Evas_Object_Textblock *o;
-   
+   Node *node;
+   int my_len, ps = 0;
+
    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
    return;
    MAGIC_CHECK_END();
@@ -981,7 +989,106 @@
    o->native.dirty = 1;
    o->changed = 1;
    evas_object_change(obj);
-   /* FIXME: delete len bytes of string starting at pos */
+
+   if (len <= 0) return;
+   if (o->pos >= o->len) return;
+
+   /* deleting everything */
+   if ((o->pos == 0) && (len >= o->len))
+     {
+       evas_object_textblock_clear(obj);
+       return;
+     }
+
+   /* make sure we have enough to remove */
+   my_len = len;
+   if ((o->len - o->pos) < len) my_len = o->len - o->pos;
+
+   node = evas_object_textblock_node_pos_get(obj, o->pos, &ps);
+   if (node)
+     {
+       int remaining;
+       char *tmp;
+
+       remaining = my_len;
+
+       if (remaining <= (node->text_len - (o->pos - ps)))
+         {
+            tmp = node->text;
+            node->text = malloc(sizeof(char) * (node->text_len - my_len + 1));
+
+            /* any begining text */
+            if ((o->pos - ps) > 0)
+              strncpy(node->text, tmp, o->pos - ps);
+
+            /* any ending text */
+            if (((o->pos - ps) + remaining) < node->text_len)
+              strncpy(node->text + (o->pos - ps), tmp + remaining + (o->pos - 
ps), 
+                    node->text_len - remaining - (o->pos - ps));
+
+            free(tmp);
+            node->text_len -= remaining;
+            o->len -= remaining;
+
+            /* is the node now empty? */
+            if (node->text_len == 0)
+              {
+                 o->nodes = evas_object_list_remove(o->nodes, node);
+                 if (node->format) free(node->format);
+                 if (node->text) free(node->text);
+                 free(node);
+              }
+         }
+       else
+         {
+            tmp = node->text;
+            node->text = malloc(sizeof(char) * (o->pos - ps + 1));
+
+            /* save the start part */
+            strncpy(node->text, tmp, o->pos - ps);
+
+            o->len -= node->text_len - (o->pos - ps);
+            remaining -= node->text_len - (o->pos - ps);
+
+            node->text_len = o->pos - ps;
+            node->text[node->text_len] = '\0';
+            free(tmp);
+
+            ps += node->text_len;
+            while(remaining > 0)
+              {
+                 node = evas_object_textblock_node_pos_get(obj, ps, &ps);
+                 if (!node)
+                   {
+                      /* ran out of nodes ... */
+                      break;
+                   }
+
+                 if (remaining < node->text_len)
+                   {
+                      tmp = node->text;
+                      node->text = malloc(sizeof(char) * (node->text_len - 
remaining + 1));
+                      strncpy(node->text, tmp + remaining, node->text_len - 
remaining);
+                      node->text_len -= remaining;
+                      node->text[node->text_len] = '\0';
+                      free(tmp);
+
+                      o->len -= remaining;
+                      remaining -= remaining;
+                   }
+                 else
+                   {
+                      o->nodes = evas_object_list_remove(o->nodes, node);
+                      o->len -= node->text_len;
+                      remaining -= node->text_len;
+
+                      if (node->format) free(node->format);
+                      if (node->text) free(node->text);
+                      free(node);
+                   }
+              }
+         }
+     }
 }
 
 void




-------------------------------------------------------
This SF.Net email is sponsored by: IntelliVIEW -- Interactive Reporting
Tool for open source databases. Create drag-&-drop reports. Save time
by over 75%! Publish reports on the web. Export to DOC, XLS, RTF, etc.
Download a FREE copy at http://www.intelliview.com/go/osdn_nl
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to