Enlightenment CVS committal

Author  : raster
Project : e17
Module  : libs/evas

Dir     : e17/libs/evas/src/lib/canvas


Modified Files:
        evas_object_textblock.c 


Log Message:


wrap correctly

===================================================================
RCS file: 
/cvsroot/enlightenment/e17/libs/evas/src/lib/canvas/evas_object_textblock.c,v
retrieving revision 1.63
retrieving revision 1.64
diff -u -3 -r1.63 -r1.64
--- evas_object_textblock.c     8 Aug 2005 10:55:35 -0000       1.63
+++ evas_object_textblock.c     8 Aug 2005 12:43:59 -0000       1.64
@@ -118,6 +118,7 @@
    Evas_List                   *cursors;
    Evas_Object_Textblock_Node  *nodes;
    Evas_Object_Textblock_Line *lines;
+   int                         last_w;
    char                        *markup_text;
    char                         changed : 1;
    void                        *engine_data;
@@ -539,6 +540,17 @@
 }
 
 static void
+_format_free(Evas_Object *obj, Evas_Object_Textblock_Format *fmt)
+{
+   fmt->ref--;
+   if (fmt->ref > 0) return;
+   if (fmt->font.name) free(fmt->font.name);
+   if (fmt->font.source) free(fmt->font.source);
+   evas_font_free(obj->layer->evas, fmt->font.font);
+   free(fmt);
+}
+
+static void
 _lines_clear(Evas_Object *obj)
 {
    Evas_Object_Textblock *o;
@@ -550,7 +562,16 @@
        
        ln = (Evas_Object_Textblock_Line *)o->lines;
        o->lines = evas_object_list_remove(o->lines, ln);
-       /* FIXME: free line->items */
+       while (ln->items)
+         {
+            Evas_Object_Textblock_Item *it;
+            
+            it = (Evas_Object_Textblock_Item *)ln->items;
+            ln->items = evas_object_list_remove(ln->items, ln->items);
+            if (it->text) free(it->text);
+            _format_free(obj, it->format);
+            free(it);
+         }
        free(ln);
      }
 }
@@ -1273,6 +1294,7 @@
      }
    else if (!strcmp(cmd, "wrap"))
      {
+       printf("WRAP \"%s\"\n", param);
        if (!strcmp(param, "word"))
          {
             fmt->wrap_word = 1;
@@ -1428,17 +1450,6 @@
    return fmt2;
 }
 
-static void
-_format_free(Evas_Object *obj, Evas_Object_Textblock_Format *fmt)
-{
-   fmt->ref--;
-   if (fmt->ref > 0) return;
-   if (fmt->font.name) free(fmt->font.name);
-   if (fmt->font.source) free(fmt->font.source);
-   evas_font_free(obj->layer->evas, fmt->font.font);
-   free(fmt);
-}
-
 static int
 _is_white(int c)
 {
@@ -1480,7 +1491,7 @@
 _layout(Evas_Object *obj, int calc_only, int w, int h, int *w_ret, int *h_ret)
 {
    Evas_Object_Textblock *o;
-   Evas_Object_List *l;
+   Evas_Object_List *l, *ll;
    Evas_Object_Textblock_Line *lines = NULL, *ln = NULL;
    int x, y, wmax, hmax, ascent, descent, maxascent, maxdescent, advance, 
      maxadvance, maxh, line_no;
@@ -1569,10 +1580,6 @@
                       _format_command(obj, fmt, key, val);
                       free(key);
                       free(val);
-                      ascent = ENFN->font_max_ascent_get(ENDT, fmt->font.font);
-                      descent = ENFN->font_max_descent_get(ENDT, 
fmt->font.font);
-                      if (maxascent < ascent) maxascent = ascent;
-                      if (maxdescent < descent) maxdescent = descent;
                       ln->align = fmt->halign;
                    }
                  else
@@ -1582,6 +1589,17 @@
                       if (!strcmp(item, "\n"))
                         {
                            /* finish line */
+                           maxascent = 0;
+                           maxdescent = 0;
+                           for (ll = (Evas_Object_List *)ln->items; ll; ll = 
ll->next)
+                             {
+                                it = (Evas_Object_Textblock_Item *)ll;
+                                
+                                ascent = ENFN->font_max_ascent_get(ENDT, 
it->format->font.font);
+                                descent = ENFN->font_max_descent_get(ENDT, 
it->format->font.font);
+                                if (maxascent < ascent) maxascent = ascent;
+                                if (maxdescent < descent) maxdescent = descent;
+                             }
                            if (ln->w > wmax) wmax = ln->w;
                            ln->y = y;
                            ln->h = maxascent + maxdescent;
@@ -1595,12 +1613,6 @@
                            ln = calloc(1, sizeof(Evas_Object_Textblock_Line));
                            ln->align = fmt->halign;
                            lines = evas_object_list_append(lines, ln);
-                           maxascent = 0;
-                           maxdescent = 0;
-                           ascent = ENFN->font_max_ascent_get(ENDT, 
fmt->font.font);
-                           descent = ENFN->font_max_descent_get(ENDT, 
fmt->font.font);
-                           if (maxascent < ascent) maxascent = ascent;
-                           if (maxdescent < descent) maxdescent = descent;
                         }
                       else if (!strcmp(item, "\t"))
                         {
@@ -1633,27 +1645,24 @@
                      ((x + tw) > w))
                    {
                       int wrap, twrap, cx, cy, cw, ch;
+                      char *ts;
                       
                       wrap = ENFN->font_char_at_coords_get(ENDT,
                                                            fmt->font.font,
                                                            it->text, w - x, 0,
                                                            &cx, &cy,
                                                            &cw, &ch);
-                      if (wrap >= 0)
+                      if (wrap > 0)
                         {
-                           char *ts;
-                           
+                           printf("WRAP AT %i [%c]\n", wrap, str[wrap]);
                            /* FIXME: handle wrap */
                            if (fmt->wrap_word)
                              {
                                 /* walk pack to start of word */
                                 while ((wrap >= 0) &&
-                                       (!_is_white(str[wrap])))
-                                  {
-                                     printf("- %i %c\n", wrap, str[wrap]);
-                                     wrap--;
-                                  }
+                                       (!_is_white(str[wrap]))) wrap--;
                                 wrap++;
+                                printf("back to [%c]\n", str[wrap]);
                                 /* wrap now is the index of the word START */
                                 /* cut of pointless whitespace at end of
                                  * previous line
@@ -1662,22 +1671,58 @@
                                   {
                                      twrap = wrap - 1;
                                      while ((twrap > 0) &&
-                                            _is_white(str[twrap]))
-                                       {
-                                          twrap--;
-                                       }
+                                            _is_white(str[twrap])) twrap--;
                                      ts = it->text;
+                                     while (!_is_white(str[twrap])) twrap++;
+                                     printf("ts[twrap] = %c\n", ts[twrap]);
                                      ts[twrap] = 0;
                                      it->text = strdup(ts);
                                      free(ts);
+                                     str = str + wrap;
                                   }
                                 else
                                   {
-                                     /* FIXME: last text item on line - remove 
remaining spaces and recalc size */
-                                     empty_item = 1;
+                                     printf("%p\n", ln->items);
+                                     if (ln->items != NULL)
+                                       {
+                                          printf("EMPTY\n");
+                                          empty_item = 1;
+                                          if (it->text) free(it->text);
+                                          _format_free(obj, it->format);
+                                          free(it);
+                                          if (ln->items)
+                                            {
+                                               it = 
(Evas_Object_Textblock_Item *)((Evas_Object_List *)ln->items)->last;
+                                               twrap = strlen(it->text) - 1;
+                                               while ((twrap > 0) &&
+                                                      
(_is_white(it->text[twrap])))
+                                                 twrap--;
+                                               if ((twrap > 0) && 
+                                                   
(_is_white(it->text[twrap])))
+                                                 it->text[twrap] = 0;
+                                               
ENFN->font_string_size_get(ENDT, fmt->font.font,
+                                                                          
it->text, &tw, &th);
+                                               ln->w -= it->w - tw;
+                                               it->w = tw;
+                                               it->h = th;
+                                            }
+                                          str = str + wrap;
+                                       }
+                                     /* this is the last word on a line.
+                                      * no choice. just put it on anyway */
+                                     else
+                                       {
+                                          str = str + 1;
+                                          if (*str == 0) str = NULL;
+                                          else
+                                            {
+                                               ts = it->text;
+                                               ts[1] = 0;
+                                               it->text = strdup(ts);
+                                               free(ts);
+                                            }
+                                       }
                                   }
-                                str = str + wrap;
-                                printf("WWRAP %s\n", str);
                              }
                            else if (fmt->wrap_char)
                              {
@@ -1689,18 +1734,55 @@
                              }
                            new_line = 1;
                         }
-                      ENFN->font_string_size_get(ENDT, fmt->font.font,
-                                                 it->text, &tw, &th);
+                      else
+                        {
+                           printf("NO WRAP!\n");
+                           if (ln->items != NULL)
+                             {
+                                empty_item = 1;
+                                if (it->text) free(it->text);
+                                _format_free(obj, it->format);
+                                free(it);
+                                if (ln->items)
+                                  {
+                                     it = (Evas_Object_Textblock_Item 
*)((Evas_Object_List *)ln->items)->last;
+                                     twrap = strlen(it->text) - 1;
+                                     while ((twrap > 0) &&
+                                            (_is_white(it->text[twrap])))
+                                       twrap--;
+                                     if ((twrap > 0) && 
+                                         (_is_white(it->text[twrap])))
+                                       it->text[twrap] = 0;
+                                     ENFN->font_string_size_get(ENDT, 
fmt->font.font,
+                                                                it->text, &tw, 
&th);
+                                     ln->w -= it->w - tw;
+                                     it->w = tw;
+                                     it->h = th;
+                                  }
+                                new_line = 1;
+                             }
+                           else
+                             {
+                                str = str + 1;
+                                if (*str == 0) str = NULL;
+                                else
+                                  {
+                                     ts = it->text;
+                                     ts[1] = 0;
+                                     it->text = strdup(ts);
+                                     free(ts);
+                                  }
+                             }
+                        }
+                      if (!empty_item)
+                        ENFN->font_string_size_get(ENDT, fmt->font.font,
+                                                   it->text, &tw, &th);
                    }
                  else
                    str = NULL;
                  if (empty_item)
                    {
                       empty_item = 0;
-                      
-                      if (it->text) free(it->text);
-                      _format_free(obj, it->format);
-                      free(it);
                    }
                  else
                    {
@@ -1719,6 +1801,17 @@
                    {
                       new_line = 0;
                       /* finish line */
+                      maxascent = 0;
+                      maxdescent = 0;
+                      for (ll = (Evas_Object_List *)ln->items; ll; ll = 
ll->next)
+                        {
+                           it = (Evas_Object_Textblock_Item *)ll;
+                           
+                           ascent = ENFN->font_max_ascent_get(ENDT, 
it->format->font.font);
+                           descent = ENFN->font_max_descent_get(ENDT, 
it->format->font.font);
+                           if (maxascent < ascent) maxascent = ascent;
+                           if (maxdescent < descent) maxdescent = descent;
+                        }
                       if (ln->w > wmax) wmax = ln->w;
                       ln->y = y;
                       ln->h = maxascent + maxdescent;
@@ -1732,12 +1825,6 @@
                       ln = calloc(1, sizeof(Evas_Object_Textblock_Line));
                       ln->align = fmt->halign;
                       lines = evas_object_list_append(lines, ln);
-                      maxascent = 0;
-                      maxdescent = 0;
-                      ascent = ENFN->font_max_ascent_get(ENDT, fmt->font.font);
-                      descent = ENFN->font_max_descent_get(ENDT, 
fmt->font.font);
-                      if (maxascent < ascent) maxascent = ascent;
-                      if (maxdescent < descent) maxdescent = descent;
                    }
               }
          }
@@ -1884,13 +1971,18 @@
    /* then when this is done the object needs to figure if it changed and */
    /* if so what and where and add the appropriate redraw textblocks */
    o = (Evas_Object_Textblock *)(obj->object_data);
-   if (o->changed)
+   if ((o->changed) ||
+       (o->last_w != obj->cur.geometry.w))
      {
+       _lines_clear(obj);
        _layout(obj, 
                0,
                obj->cur.geometry.w, obj->cur.geometry.h,
                NULL, NULL);
+       o->last_w = obj->cur.geometry.w;
+       updates = evas_object_render_pre_prev_cur_add(updates, obj);
        o->changed = 0;
+       goto done;
      }
    /* if someone is clipping this obj - go calculate the clipper */
    if (obj->cur.clipper)




-------------------------------------------------------
SF.Net email is Sponsored by the Better Software Conference & EXPO
September 19-22, 2005 * San Francisco, CA * Development Lifecycle Practices
Agile & Plan-Driven Development * Managing Projects & Teams * Testing & QA
Security * Process Improvement & Measurement * http://www.sqe.com/bsce5sf
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to