forked from enlightenment/efl
- fill in evas_object_textblock_text_del
SVN revision: 13168
This commit is contained in:
parent
abdeedf082
commit
2eded160da
|
@ -966,10 +966,18 @@ evas_object_textblock_text_get(Evas_Object *obj, int start, int len)
|
||||||
return ret;
|
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
|
void
|
||||||
evas_object_textblock_text_del(Evas_Object *obj, int len)
|
evas_object_textblock_text_del(Evas_Object *obj, int len)
|
||||||
{
|
{
|
||||||
Evas_Object_Textblock *o;
|
Evas_Object_Textblock *o;
|
||||||
|
Node *node;
|
||||||
|
int my_len, ps = 0;
|
||||||
|
|
||||||
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
|
MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
|
||||||
return;
|
return;
|
||||||
|
@ -981,7 +989,106 @@ evas_object_textblock_text_del(Evas_Object *obj, int len)
|
||||||
o->native.dirty = 1;
|
o->native.dirty = 1;
|
||||||
o->changed = 1;
|
o->changed = 1;
|
||||||
evas_object_change(obj);
|
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
|
void
|
||||||
|
|
Loading…
Reference in New Issue