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

Reply via email to