text range get works. u can gety it INLCUDING \n's and \t's (simple

formatting) as plain text - for u dj2! :)


SVN revision: 16684
This commit is contained in:
Carsten Haitzler 2005-09-11 03:23:11 +00:00
parent 79127a2267
commit 37d8934a0e
2 changed files with 151 additions and 19 deletions

View File

@ -472,6 +472,12 @@ extern "C" {
Evas_Coord x, y, w, h;
};
typedef enum _Evas_Textblock_Text_Type
{
EVAS_TEXTBLOCK_TEXT_RAW,
EVAS_TEXTBLOCK_TEXT_PLAIN
} Evas_Textblock_Text_Type;
EAPI Evas_Object *evas_object_textblock2_add(Evas *e);
EAPI Evas_Textblock_Style *evas_textblock2_style_new(void);
@ -518,7 +524,7 @@ extern "C" {
EAPI const char *evas_textblock2_cursor_node_text_get(Evas_Textblock_Cursor *cur);
EAPI int evas_textblock2_cursor_node_text_length_get(Evas_Textblock_Cursor *cur);
EAPI const char *evas_textblock2_cursor_node_format_get(Evas_Textblock_Cursor *cur);
EAPI char *evas_textblock2_cursor_range_text_get(Evas_Textblock_Cursor *cur1, Evas_Textblock_Cursor *cur2);
EAPI char *evas_textblock2_cursor_range_text_get(Evas_Textblock_Cursor *cur1, Evas_Textblock_Cursor *cur2, Evas_Textblock_Text_Type format);
EAPI int evas_textblock2_cursor_char_geometry_get(Evas_Textblock_Cursor *cur, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch);
EAPI int evas_textblock2_cursor_line_geometry_get(Evas_Textblock_Cursor *cur, Evas_Coord *cx, Evas_Coord *cy, Evas_Coord *cw, Evas_Coord *ch);

View File

@ -3004,7 +3004,7 @@ evas_textblock2_cursor_text_prepend(Evas_Textblock_Cursor *cur, const char *text
{
if ((o->cursor->node) &&
(o->cursor->node->type == NODE_TEXT) &&
(o->cursor->pos >- cur->pos))
(o->cursor->pos >= cur->pos))
o->cursor->pos += strlen(text);
}
}
@ -3016,7 +3016,7 @@ evas_textblock2_cursor_text_prepend(Evas_Textblock_Cursor *cur, const char *text
{
if ((((Evas_Textblock_Cursor *)l->data)->node) &&
(((Evas_Textblock_Cursor *)l->data)->node->type == NODE_TEXT) &&
(((Evas_Textblock_Cursor *)l->data)->pos >- cur->pos))
(((Evas_Textblock_Cursor *)l->data)->pos >= cur->pos))
((Evas_Textblock_Cursor *)l->data)->pos += strlen(text);
}
}
@ -3219,7 +3219,7 @@ evas_textblock2_cursor_char_delete(Evas_Textblock_Cursor *cur)
{
Evas_Object_Textblock *o;
Evas_Object_Textblock_Node *n, *n2;
int chr, index;
int chr, index, ppos;
if (!cur) return;
o = (Evas_Object_Textblock *)(cur->obj->object_data);
@ -3232,6 +3232,7 @@ evas_textblock2_cursor_char_delete(Evas_Textblock_Cursor *cur)
index = cur->pos;
chr = evas_common_font_utf8_get_next((unsigned char *)n->text, &index);
if (chr == 0) return;
ppos = cur->pos;
n->text = _strbuf_remove(n->text, cur->pos, index, &(n->len), &(n->alloc));
if (!n->text)
{
@ -3253,18 +3254,41 @@ evas_textblock2_cursor_char_delete(Evas_Textblock_Cursor *cur)
}
}
{
Evas_List *l;
if (cur != o->cursor)
{
if ((n == o->cursor->node) &&
(o->cursor->pos > ppos))
{
o->cursor->pos -= (index - ppos);
}
}
for (l = o->cursors; l; l = l->next)
{
if (l->data != cur)
{
if ((n == ((Evas_Textblock_Cursor *)l->data)->node) &&
(((Evas_Textblock_Cursor *)l->data)->pos > ppos))
{
((Evas_Textblock_Cursor *)l->data)->pos -= (index - ppos);
}
}
}
}
o->formatted.valid = 0;
o->native.valid = 0;
o->changed = 1;
evas_object_change(cur->obj);
/* FIXME: adjust cursors that are affected by the change */
}
void
evas_textblock2_cursor_range_delete(Evas_Textblock_Cursor *cur1, Evas_Textblock_Cursor *cur2)
{
Evas_Object_Textblock *o;
Evas_Object_Textblock_Node *n1, *n2, *n;
Evas_Object_Textblock_Node *n1, *n2, *n, *tn;
Evas_Object_List *l;
int chr, index;
@ -3319,7 +3343,7 @@ evas_textblock2_cursor_range_delete(Evas_Textblock_Cursor *cur1, Evas_Textblock_
}
else
{
Evas_List *removes = NULL, *format_hump = NULL;
Evas_List *removes, *format_hump;
Evas_Textblock_Cursor tcur;
tcur.node = n2;
@ -3350,6 +3374,7 @@ evas_textblock2_cursor_range_delete(Evas_Textblock_Cursor *cur1, Evas_Textblock_
}
}
n1->text = _strbuf_remove(n1->text, cur1->pos, n1->len, &(n1->len), &(n1->alloc));
removes = NULL;
for (l = ((Evas_Object_List *)n1)->next; l != (Evas_Object_List *)n2; l = l->next)
removes = evas_list_append(removes, l);
if (n1->type == NODE_TEXT)
@ -3368,6 +3393,7 @@ evas_textblock2_cursor_range_delete(Evas_Textblock_Cursor *cur1, Evas_Textblock_
free(n1);
}
}
format_hump = NULL;
while (removes)
{
n = removes->data;
@ -3380,15 +3406,18 @@ evas_textblock2_cursor_range_delete(Evas_Textblock_Cursor *cur1, Evas_Textblock_
else
{
if (n->text[0] == '+')
format_hump = evas_list_append(format_hump, n);
{
format_hump = evas_list_append(format_hump, n);
}
else if (n->text[0] == '-')
{
o->nodes = evas_object_list_remove(o->nodes, n);
if (n->text) free(n->text);
free(n);
n = evas_list_data(evas_list_last(format_hump));
if (n)
tn = evas_list_data(evas_list_last(format_hump));
if (tn)
{
format_hump = evas_list_remove_list(format_hump, evas_list_last(format_hump));
o->nodes = evas_object_list_remove(o->nodes, tn);
if (tn->text) free(tn->text);
free(tn);
o->nodes = evas_object_list_remove(o->nodes, n);
if (n->text) free(n->text);
free(n);
@ -3396,7 +3425,7 @@ evas_textblock2_cursor_range_delete(Evas_Textblock_Cursor *cur1, Evas_Textblock_
}
else
{
o->nodes = evas_object_list_remove(o->nodes, n);
o->nodes = evas_object_list_remove(o->nodes, n);
if (n->text) free(n->text);
free(n);
}
@ -3437,11 +3466,31 @@ evas_textblock2_cursor_range_delete(Evas_Textblock_Cursor *cur1, Evas_Textblock_
cur2->node = tcur.node;
cur2->pos = tcur.pos;
}
/* FIXME: adjust cursors that are affected by the change */
/* this is temporary just avoiding segv's - it sets all other cursors to
* the same pos as cur1 and cur2
*/
{
Evas_List *l;
if ((cur1 != o->cursor) && (cur2 != o->cursor))
{
evas_textblock2_cursor_copy(cur1, o->cursor);
}
for (l = o->cursors; l; l = l->next)
{
if ((l->data != cur1) && (l->data != cur2))
{
evas_textblock2_cursor_copy(cur1, l->data);
}
}
}
o->formatted.valid = 0;
o->native.valid = 0;
o->changed = 1;
evas_object_change(cur1->obj);
/* FIXME: adjust cursors that are affected by the change */
}
const char *
@ -3481,10 +3530,13 @@ evas_textblock2_cursor_node_format_get(Evas_Textblock_Cursor *cur)
}
char *
evas_textblock2_cursor_range_text_get(Evas_Textblock_Cursor *cur1, Evas_Textblock_Cursor *cur2)
evas_textblock2_cursor_range_text_get(Evas_Textblock_Cursor *cur1, Evas_Textblock_Cursor *cur2, Evas_Textblock_Text_Type format)
{
Evas_Object_Textblock *o;
Evas_Object_Textblock_Node *n1, *n2;
Evas_Object_Textblock_Node *n1, *n2, *n;
Evas_Object_List *l;
char *str = NULL, *s;
int len = 0, alloc = 0, chr, index;
if (!cur1) return NULL;
if (!cur2) return NULL;
@ -3500,8 +3552,52 @@ evas_textblock2_cursor_range_text_get(Evas_Textblock_Cursor *cur1, Evas_Textbloc
}
n1 = cur1->node;
n2 = cur2->node;
/* FIXME: */
return NULL;
index = cur2->pos;
chr = evas_common_font_utf8_get_next((unsigned char *)n2->text, &index);
for (l = (Evas_Object_List *)n1; ;l = l->next)
{
n = (Evas_Object_Textblock_Node *)l;
if (n->type == NODE_TEXT)
{
s = n->text;
if ((n == n1) && (n == n2))
{
s += cur1->pos;
str = _strbuf_append_n(str, s, index - cur1->pos, &len, &alloc);
}
else if (n == n1)
{
s += cur1->pos;
str = _strbuf_append(str, s, &len, &alloc);
}
else if (n == n2)
{
str = _strbuf_append_n(str, s, index, &len, &alloc);
}
else
{
str = _strbuf_append(str, s, &len, &alloc);
}
}
else
{
if (format == EVAS_TEXTBLOCK_TEXT_PLAIN)
{
s = n->text;
while (*s)
{
if (*s == '\n')
str = _strbuf_append(str, "\n", &len, &alloc);
else if (*s == '\t')
str = _strbuf_append(str, "\t", &len, &alloc);
s++;
}
}
}
if (l == (Evas_Object_List *)n2) break;
}
return str;
}
int
@ -3704,8 +3800,11 @@ evas_textblock2_cursor_range_geometry_get(Evas_Textblock_Cursor *cur1, Evas_Text
cur2 = tc;
}
line = evas_textblock2_cursor_char_geometry_get(cur1, &cx, &cy, &cw, &ch);
if (line < 0) return NULL;
line = evas_textblock2_cursor_line_geometry_get(cur1, &lx, &ly, &lw, &lh);
if (line < 0) return NULL;
line2 = evas_textblock2_cursor_line_geometry_get(cur2, NULL, NULL, NULL, NULL);
if (line2 < 0) return NULL;
if (line == line2)
{
tr = calloc(1, sizeof(Evas_Textblock_Rectangle));
@ -3714,6 +3813,15 @@ evas_textblock2_cursor_range_geometry_get(Evas_Textblock_Cursor *cur1, Evas_Text
tr->y = ly;
tr->h = lh;
line = evas_textblock2_cursor_char_geometry_get(cur2, &cx, &cy, &cw, &ch);
if (line < 0)
{
while (rects)
{
free(rects->data);
rects = evas_list_remove_list(rects, rects);
}
return NULL;
}
tr->w = cx + cw - tr->x;
}
else
@ -3735,7 +3843,25 @@ evas_textblock2_cursor_range_geometry_get(Evas_Textblock_Cursor *cur1, Evas_Text
tr->w = lw;
}
line = evas_textblock2_cursor_char_geometry_get(cur2, &cx, &cy, &cw, &ch);
if (line < 0)
{
while (rects)
{
free(rects->data);
rects = evas_list_remove_list(rects, rects);
}
return NULL;
}
line = evas_textblock2_cursor_line_geometry_get(cur2, &lx, &ly, &lw, &lh);
if (line < 0)
{
while (rects)
{
free(rects->data);
rects = evas_list_remove_list(rects, rects);
}
return NULL;
}
tr = calloc(1, sizeof(Evas_Textblock_Rectangle));
rects = evas_list_append(rects, tr);
tr->x = lx;