Enlightenment CVS committal

Author  : rbdpngn
Project : e17
Module  : libs/etox

Dir     : e17/libs/etox/src


Modified Files:
        etox.c etox_line.c etox_line.h 


Log Message:
Wrap text when it takes up the entire line. This needs further testing, but
works for the trivial case.

===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/etox/src/etox.c,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -3 -r1.48 -r1.49
--- etox.c      29 Jul 2003 04:41:04 -0000      1.48
+++ etox.c      31 Jul 2003 04:57:09 -0000      1.49
@@ -2,8 +2,6 @@
 #include "Etox_private.h"
 
 static Evas_List *_etox_break_text(Etox * et, char *text);
-static void _etox_wrap_lines(Etox * et);
-static void _etox_unwrap_lines(Etox * et);
 
 /**
  * etox_new - create a new etox with default settings
@@ -1016,145 +1014,6 @@
 }
 
 /*
- * _etox_wrap_lines - break lines that are too long if soft wrap flag is set
- * @et: the etox to wrap
- *
- * Returns nothing, modifies the lines of the etox
- */
-void _etox_wrap_lines(Etox *et)
-{
-       Etox_Line *line;
-       Etox_Line *newline;
-       Evas_List *l, *ll;
-
-       CHECK_PARAM_POINTER("et", et);
-  
-       /* if the soft wrap flag is not set, don't do anything */
-       if (!(et->context->flags & ETOX_SOFT_WRAP)) 
-               return;
-
-       /* iterate through the lines */
-       for (l = et->lines; l; l = l->next) {
-               line = l->data;
-
-               /* if the line is wider than the etox */
-               if (line->w > et->w) {
-                       Estyle *bit = NULL, *split = NULL, *marker;
-                       int index = -1;
-      
-                       /* iterate through the bits to find the one on the
-                        * border */
-                       for (ll = line->bits; ll; ll = ll->next) {
-                               bit = ll->data;
-
-                               /* get the index of the character on the edge */
-                               index = estyle_text_at_position(bit,
-                                               et->x + et->w, line->y,
-                                               NULL, NULL, NULL, NULL);
-                               /* if this bit contained the character on the
-                                * edge, break */
-                               if (index >= 0)
-                                       break;
-                       }
-
-                       /* if we have an index */
-                       if (index != -1) {
-                               char *tmp;
-
-                               /* don't start a new line with a space */
-                               tmp = estyle_get_text(bit);
-                               while (tmp[index] == ' ')
-                                       index ++;
-                               FREE(tmp);
-
-                               /* split the edge bit */
-                               split = estyle_split(bit, index);
-                       }
-
-                       /* if split successful, set up the new bit */
-                       if (split) {
-                               /* create a marker bit. */
-                               marker = estyle_new(et->evas,
-                                               et->context->marker.text,
-                                               et->context->marker.style);
-                               estyle_set_color(marker, et->context->marker.r,
-                                               et->context->marker.g,
-                                               et->context->marker.b,
-                                               et->context->marker.a);
-                               estyle_set_clip(marker, et->clip);
-                               estyle_set_font(bit, et->context->font,
-                                               et->context->font_size);
-                               estyle_show(marker);
-
-                               /* create a new line, with the marker and the
-                                * split bits */
-                               newline = etox_line_new(line->flags |
-                                               ETOX_LINE_WRAPPED);
-                               newline->et = et;
-                               etox_line_append(newline, marker);
-                               etox_line_append(newline, split);
-
-                               /* move the remaining bits to the new line */
-                               for (ll = ll->next; ll; ll = ll->next) {
-                                       bit = ll->data;
-                                       etox_line_remove(line, bit);
-                                       etox_line_append(newline, split);
-                               }
-
-                               /* add the newline after the current one */
-                               et->lines = evas_list_append_relative(et->lines,
-                                               newline, line);
-                       }
-               }
-       }
-}
-
-
-/*
- * _etox_unwrap_lines - recombine lines that have been split by soft wrapping
- * @et: the etox to wrap
- *
- * Returns nothing, modifies the lines of the etox
- */
-void _etox_unwrap_lines(Etox *et)
-{
-       Etox_Line *line, *prevline;
-       Evas_List *l;
-       int i = 0;
-
-       CHECK_PARAM_POINTER("et", et);
-
-       if (!et->lines)
-               return;
-
-       prevline = et->lines->data;
-
-       for (l = et->lines->next; l; l = l->next) {
-               i++;
-               line = l->data;
-               if (line->flags & ETOX_LINE_WRAPPED) {
-                       printf("unwrap line: %i\n", i);
-
-                       /* remove the wrap marker bit */
-                       line->bits = evas_list_remove(line->bits, 
-                                       line->bits->data);
-
-                       /* remove the line from the list */
-                       et->lines = evas_list_remove(et->lines, line);
-
-                       /* merge the two lines */
-                       etox_line_merge_append(prevline, line);
-                       etox_line_free(line);
-
-                       /* skip the line we just merged */
-                       l = l->next;
-               }
-               else
-                       prevline = line;
-       }
-}
-
-/*
  * etox_layout - deals with the actual laying out of lines within the etox
  * @et: the etox to be laid out
  *
@@ -1178,24 +1037,38 @@
        if (!et->lines)
                return;
 
-       /*
-        * Begin by rewrapping the necessary lines.
-        */
-        _etox_unwrap_lines(et);
-        _etox_wrap_lines(et);
-
        y = et->y;
 
        /*
         * Traverse the list displaying each line, moving down the screen after
         * each line.
         */
-       for (l = et->lines; l; l = l->next) {
+       l = et->lines;
+       while (l) {
                line = l->data;
                line->x = et->x;
                line->y = y;
 
+               /*
+                * Unwrap lines if they were wrapped
+                */
+               if (l->next) {
+                       Etox_Line *temp = l->next->data;
+
+                       if (temp->flags & ETOX_LINE_WRAPPED)
+                               etox_line_unwrap(et, line);
+               }
+
                etox_line_layout(line);
+
+               /*
+                * If we need to wrap the line, we don't need to re-layout since
+                * the maximal width was used for splitting.
+                */
+               if ((et->context->flags & ETOX_SOFT_WRAP) && (line->w > et->w))
+                               etox_line_wrap(et, line);
+
+               l = l->next;
                y += line->h;
        }
 
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/etox/src/etox_line.c,v
retrieving revision 1.14
retrieving revision 1.15
diff -u -3 -r1.14 -r1.15
--- etox_line.c 28 Jul 2003 22:04:31 -0000      1.14
+++ etox_line.c 31 Jul 2003 04:57:09 -0000      1.15
@@ -1,5 +1,6 @@
 #include "Etox_private.h"
 
+#include <ctype.h>
 #include <string.h>
 
 /*
@@ -154,12 +155,21 @@
  */
 void etox_line_remove(Etox_Line * line, Estyle * bit)
 {
+       int w;
+
        CHECK_PARAM_POINTER("line", line);
        CHECK_PARAM_POINTER("bit", bit);
 
        line->bits = evas_list_remove(line->bits, bit);
        line->length -= estyle_length(bit);
-       etox_line_minimize(line);
+       estyle_geometry(bit, NULL, NULL, &w, NULL);
+       line->w -= w;
+
+       /*
+        * FIXME: Need to fix-up line minimizing to ensure it doesn't stomp on
+        * selections.
+        * etox_line_minimize(line);
+        */
 }
 
 /*
@@ -186,13 +196,17 @@
         * x coordinate appropriately.
         */
        if (line->flags & ETOX_ALIGN_LEFT) {
-               x = line->x;
+               x = line->et->x;
        } else if (line->flags & ETOX_ALIGN_RIGHT) {
                x = line->et->x + line->et->w - line->w;
        } else {
                x = line->et->x + (line->et->w / 2) - (line->w / 2);
        }
 
+       if ((line->et->context->flags & ETOX_SOFT_WRAP) &&
+                       (line->x < line->et->x))
+               x = line->et->x;
+
        /*
         * Determine the veritcal alignment and perform the layout of the
         * bits.
@@ -239,14 +253,23 @@
        CHECK_PARAM_POINTER("line", line);
 
        l = line->bits;
-       while ((bit = l->data)) {
+       if (!l)
+               return;
+
+       last_bit = l->data;
+       l = l->next;
+       while (l) {
+               bit = l->data;
 
                /*
                 * Attempt to merge the bits if possible, remove the second
                 * one if successful.
                 */
-               if (estyle_merge(last_bit, bit))
-                       l = evas_list_remove(l, bit);
+               if (estyle_merge(last_bit, bit)) {
+                       line->bits = evas_list_remove(line->bits, bit);
+                       l = evas_list_find_list(line->bits, last_bit);
+                       l = l->next;
+               }
                else {
                        last_bit = bit;
                        l = l->next;
@@ -347,39 +370,47 @@
        strcat(buf, "\n");
 }
 
-void
+int
 etox_line_wrap(Etox *et, Etox_Line *line)
 {
        Evas_List *ll;
        Etox_Line *newline;
        Estyle *bit = NULL, *split = NULL, *marker;
+       int x, w, y, h;
        int index = -1;
 
        /* iterate through the bits to find the one on the border */
-       for (ll = line->bits; ll; ll = ll->next) {
+       ll = line->bits;
+       while (ll) {
                bit = ll->data;
 
-               /* get the index of the character on the edge */
-               index = estyle_text_at_position(bit, et->x + et->w, line->y,
-                               NULL, NULL, NULL, NULL);
-
-               /* if this bit contained the character on the edge, break */
-               if (index >= 0)
+               estyle_geometry(bit, &x, &y, &w, &h);
+               if (x + w > et->x + et->w)
                        break;
+
+               ll = ll->next;
        }
 
+       /* get the index of the character on the edge */
+       if (bit)
+               index = estyle_text_at_position(bit, et->x + et->w, y + (h / 2),
+                               NULL, NULL, NULL, NULL);
+
        /* if we have an index */
        if (index != -1) {
                char *tmp;
 
                /* don't start a new line with a space */
                tmp = estyle_get_text(bit);
-               while (tmp[index] == ' ')
+               while (isspace(tmp[index]))
                        index++;
                FREE(tmp);
 
+               etox_line_remove(line, bit);
+
                /* split the edge bit */
                split = estyle_split(bit, index);
+               etox_line_append(line, bit);
        }
 
        /* if split successful, set up the new bit */
@@ -400,15 +431,51 @@
                etox_line_append(newline, marker);
                etox_line_append(newline, split);
 
+               ll = evas_list_find_list(line->bits, bit);
+
                /* move the remaining bits to the new line */
                for (ll = ll->next; ll; ll = ll->next) {
                        bit = ll->data;
                        etox_line_remove(line, bit);
-                       etox_line_append(newline, split);
+                       etox_line_append(newline, bit);
                }
 
                /* add the newline after the current one */
                et->lines = evas_list_append_relative(et->lines, newline, line);
+       }
+       else
+               index = 0;
+
+       return index;
+}
+
+void
+etox_line_unwrap(Etox *et, Etox_Line *line)
+{
+       Evas_List *l, *prevline;
+
+       if (!et->lines)
+               return;
+
+       prevline = evas_list_find_list(et->lines, line);
+
+       l = prevline->next;
+       while (l) {
+               line = l->data;
+               if (!(line->flags & ETOX_LINE_WRAPPED))
+                       break;
+
+               /* remove the wrap marker bit */
+               line->bits = evas_list_remove(line->bits, line->bits->data);
+
+               /* remove the line from the list */
+               et->lines = evas_list_remove(et->lines, line);
+
+               /* merge the two lines */
+               etox_line_merge_append(prevline->data, line);
+               etox_line_free(line);
+
+               l = prevline->next;
        }
 }
 
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/etox/src/etox_line.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -3 -r1.6 -r1.7
--- etox_line.h 28 Jul 2003 22:04:31 -0000      1.6
+++ etox_line.h 31 Jul 2003 04:57:09 -0000      1.7
@@ -14,6 +14,8 @@
 void etox_line_minimize(Etox_Line * line);
 void etox_line_get_text(Etox_Line * line, char *buf);
 
+int etox_line_wrap(Etox *et, Etox_Line *line);
+void etox_line_unwrap(Etox *et, Etox_Line *line);
 Estyle *etox_line_coord_to_bit(Etox_Line *line, int x);
 Estyle *etox_line_index_to_bit(Etox_Line *line, int *i);
 




-------------------------------------------------------
This SF.Net email sponsored by: Free pre-built ASP.NET sites including
Data Reports, E-commerce, Portals, and Forums are available now.
Download today and enter to win an XBOX or Visual Studio .NET.
http://aspnet.click-url.com/go/psa00100003ave/direct;at.aspnet_072303_01/01
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to