Enlightenment CVS committal Author : dj2 Project : e17 Module : libs/ewl
Dir : e17/libs/ewl/src/lib Modified Files: ewl_text.c Log Message: - multiline triggers =================================================================== RCS file: /cvsroot/enlightenment/e17/libs/ewl/src/lib/ewl_text.c,v retrieving revision 1.13 retrieving revision 1.14 diff -u -3 -r1.13 -r1.14 --- ewl_text.c 22 Jul 2005 05:07:03 -0000 1.13 +++ ewl_text.c 23 Jul 2005 03:11:38 -0000 1.14 @@ -46,6 +46,8 @@ static void ewl_text_trigger_add(Ewl_Text *t, Ewl_Text_Trigger *trigger); static void ewl_text_trigger_del(Ewl_Text *t, Ewl_Text_Trigger *trigger); +static void ewl_text_trigger_area_add(Ewl_Text *t, Ewl_Text_Trigger *cur, + Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h); /** * @param text: The text to set into the widget @@ -1940,6 +1942,37 @@ DLEAVE_FUNCTION(DLEVEL_STABLE); } +static void +ewl_text_trigger_area_add(Ewl_Text *t, Ewl_Text_Trigger *cur, + Evas_Coord x, Evas_Coord y, + Evas_Coord w, Evas_Coord h) +{ + Ewl_Widget *area; + + DENTER_FUNCTION(DLEVEL_STABLE); + DCHECK_PARAM_PTR("t", t); + DCHECK_PARAM_PTR("cur", cur); + + area = ewl_text_trigger_area_new(cur->type); + ewl_container_child_append(EWL_CONTAINER(t), area); + ewl_widget_internal_set(area, TRUE); + ewl_object_geometry_request(EWL_OBJECT(area), x, y, w, h); + + ewl_callback_append(area, EWL_CALLBACK_FOCUS_IN, + ewl_text_trigger_cb_focus_in, cur); + ewl_callback_append(area, EWL_CALLBACK_FOCUS_OUT, + ewl_text_trigger_cb_focus_out, cur); + ewl_callback_append(area, EWL_CALLBACK_MOUSE_DOWN, + ewl_text_trigger_cb_mouse_down, cur); + ewl_callback_append(area, EWL_CALLBACK_MOUSE_UP, + ewl_text_trigger_cb_mouse_up, cur); + ewl_widget_show(area); + + ecore_list_append(cur->areas, area); + + DLEAVE_FUNCTION(DLEVEL_STABLE); +} + void ewl_text_triggers_realize(Ewl_Text *t) { Ewl_Text_Trigger *cur; @@ -1948,6 +1981,7 @@ Evas_Coord sx, sy, sh, ex, ey, ew, eh; char *ptr; unsigned int cur_idx = 0, cur_tb_idx = 0; + int start_line = 0, end_line = 0; DENTER_FUNCTION(DLEVEL_STABLE); DCHECK_PARAM_PTR("t", t); @@ -1986,6 +2020,10 @@ evas_object_textblock_char_pos_get(t->textblock, cur_tb_idx, &sx, &sy, NULL, &sh); + /* get the line number we're on */ + evas_object_textblock_cursor_pos_set(t->textblock, cur_tb_idx); + start_line = evas_object_textblock_cursor_line_get(t->textblock); + /* get the index of the end of the trigger */ for (ptr = (t->text + cur_idx); cur_idx < (cur->pos + cur->len); cur_idx++) @@ -2005,38 +2043,62 @@ evas_object_textblock_char_pos_get(t->textblock, cur_tb_idx, &ex, &ey, &ew, &eh); + /* get the line number we're on */ + evas_object_textblock_cursor_pos_set(t->textblock, cur_tb_idx); + end_line = evas_object_textblock_cursor_line_get(t->textblock); + if (fiddled) ex += ew; /* whole trigger is on one line */ - if (sy == ey) + if (start_line == end_line) { - Ewl_Widget *area; + ewl_text_trigger_area_add(t, cur, sx, sy, (ex - sx), + (ey - sy) + eh); + } + /* multiline trigger */ + else + { + int i, missed = 0; + Evas_Coord lx, ly, lw, lh; + Evas_Coord llx = 0, lly = 0, llw = 0, llh = 0; + + /* get the coords for all the lines and deal with + * them */ + for (i = start_line; i <= end_line; i++) + { + if (!evas_object_textblock_line_get(t->textblock, i, + &lx, &ly, &lw, &lh)) + { + /* if we don't get a response from + * evas then this is a blank line. + * wait until we get the next real line + * to deal with it */ + missed = 1; + + llx = lx; + lly = ly + lh; + llw = lw; + llh = lh; - area = ewl_text_trigger_area_new(cur->type); - ewl_container_child_append(EWL_CONTAINER(t), area); - ewl_widget_internal_set(area, TRUE); - ewl_object_geometry_request(EWL_OBJECT(area), sx, sy, - (ex - sx), (ey - sy) + eh); - - ewl_callback_append(area, EWL_CALLBACK_FOCUS_IN, - ewl_text_trigger_cb_focus_in, cur); - ewl_callback_append(area, EWL_CALLBACK_FOCUS_OUT, - ewl_text_trigger_cb_focus_out, cur); - ewl_callback_append(area, EWL_CALLBACK_MOUSE_DOWN, - ewl_text_trigger_cb_mouse_down, cur); - ewl_callback_append(area, EWL_CALLBACK_MOUSE_UP, - ewl_text_trigger_cb_mouse_up, cur); - ewl_widget_show(area); + continue; + } + else + { + ewl_text_trigger_area_add(t, cur, lx, ly, lw, lh); + } - ecore_list_append(cur->areas, area); - } - else /* multline trigger .... ?? */ - { - printf("FIXME: multline triggers aren't done yet ...\n"); + /* deal with the missed line */ + if (missed) + { + ewl_text_trigger_area_add(t, cur, llx, lly, 2, ly - lly); + + missed = 0; + llx = lly = llw = llh = 0; + } + } } } - DLEAVE_FUNCTION(DLEVEL_STABLE); } ------------------------------------------------------- SF.Net email is sponsored by: Discover Easy Linux Migration Strategies from IBM. Find simple to follow Roadmaps, straightforward articles, informative Webcasts and more! Get everything you need to get up to speed, fast. http://ads.osdn.com/?ad_id=7477&alloc_id=16492&op=click _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs