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
[email protected]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs