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:


complete more of textblock

===================================================================
RCS file: 
/cvsroot/enlightenment/e17/libs/evas/src/lib/canvas/evas_object_textblock.c,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -3 -r1.34 -r1.35
--- evas_object_textblock.c     13 Feb 2005 11:38:38 -0000      1.34
+++ evas_object_textblock.c     16 Feb 2005 10:04:32 -0000      1.35
@@ -11,7 +11,6 @@
  * things to add:
  * 
  * * finish off current api where it is unfinished
- * * height increased by 3 (or 1) even if no underline on last line - fix
  * * get native extents
  * * styles (outline, glow, etxra glow, shadow, soft shadow, etc.)
  * * if a word (or char) doesnt fit at all do something sensible
@@ -401,11 +400,12 @@
      }
 }
 
-static void
-evas_object_textblock_layout_format_modify(Layout *layout, const char *format)
+static Evas_List *
+evas_object_textblock_format_parse(const char *format)
 {
    const char *p, *k1 = NULL, *k2 = NULL, *d1 = NULL, *d2 = NULL;
    int inquote = 0, inescape = 0;
+   Evas_List *params = NULL;
    
    if (!format) return;
    p = format - 1;
@@ -482,13 +482,34 @@
                  k1 = k2 = d1 = d2 = NULL;
                  inquote = 0;
                  inescape = 0;
-                 evas_object_textblock_layout_format_apply(layout, key, data);
-                 free(key);
-                 free(data);
+                 params = evas_list_append(params, key);
+                 params = evas_list_append(params, data);
               }
          }
      }
    while (*p);
+   return params;
+}
+
+static void
+evas_object_textblock_layout_format_modify(Layout *layout, const char *format)
+{
+   Evas_List *params;
+   
+   params = evas_object_textblock_format_parse(format);
+   while (params)
+     {
+       char *key;
+       char *data;
+       
+       key = params->data;
+       params = evas_list_remove_list(params, params);
+       data = params->data;
+       params = evas_list_remove_list(params, params);
+       evas_object_textblock_layout_format_apply(layout, key, data);
+       free(key);
+       free(data);
+     }
 }
 
 static void
@@ -625,6 +646,7 @@
    Evas_Coord w, h;
    Layout_Node *line_start = NULL;
    int text_pos = 0, fh = 0, last_mdescent = 0, line = 0, last_line = 0;
+   int last_line_underline = 0, last_line_double_underline = 0;
 
    o = (Evas_Object_Textblock *)(obj->object_data);
    evas_object_textblock_layout_init(&layout);
@@ -659,6 +681,8 @@
                    {
                       /* FIXME: this node would overflow to the next textblock 
*/
                    }
+                 last_line_underline = 0;
+                 last_line_double_underline = 0;
                  line++;
                  layout.line.y += layout.line.mascent + layout.line.mdescent;
                  fh = layout.line.y;
@@ -666,7 +690,11 @@
                  line_start = NULL;
               }
             else
-              evas_object_textblock_layout_format_modify(&layout, 
node->format);
+              {
+                 evas_object_textblock_layout_format_modify(&layout, 
node->format);
+                 if (layout.underline) last_line_underline = 1;
+                 if (layout.second_underline) last_line_double_underline = 1;
+              }
          }
        if (node->text)
          {
@@ -857,6 +885,8 @@
                         {
                            /* FIXME: this node would overflow to the next 
textblock */
                         }
+                      last_line_underline = 0;
+                      last_line_double_underline = 0;
                       line++;
                       layout.line.y += layout.line.mascent + 
layout.line.mdescent;
                       fh = layout.line.y;
@@ -875,7 +905,14 @@
    evas_object_textblock_layout_clear(obj, &layout);
    o->lines = last_line + 1;
    o->format.w = w;
-   if (last_mdescent < 3) fh += 3 - last_mdescent;
+   if (last_line_double_underline)
+     {
+       if (last_mdescent < 3) fh += 3 - last_mdescent;
+     }
+   else if (last_line_underline)
+     {
+       if (last_mdescent < 1) fh += 1 - last_mdescent;
+     }
    o->format.h = fh;
    o->format.dirty = 0;
 }
@@ -1684,7 +1721,6 @@
        else
          {
             Evas_List *freenodes = NULL, *formatnodes = NULL;
-            Evas_List *ll;
             Node *node_start = NULL, *node_end = NULL, *format_start = NULL;
             Evas_Object_List *l;
             
@@ -1764,30 +1800,10 @@
                  if (node->format) free(node->format);
                  free(node);
               }
-            /* remove formatnodes for now... */
-            /* FIXME: remove */
+            /* remove formatnodes for now... dont do anything... */
              while (formatnodes)
               formatnodes = evas_list_remove_list(formatnodes, formatnodes);
-#if 0       
-            /* find all format nodes leading up to the deleted set of
-             * format nodes
-             */
-            for (l = (Evas_Object_List *)format_node_start; l; l = l->prev)
-              {
-                 node = (Node *)l;               
-                 if (node->format)
-                   formatnodes = evas_list_prepend(formatnodes, node);
-                 else
-                   break;
-              }
-            /* go from last to start and once we have seen a format node
-             * for a ceretain key, mark it as seen then remove occurances
-             * earlier on in the list as we go to the start
-             */
-            for (ll = evas_list_last(formatnodes); ll; ll = ll->prev)
-              {
-              }
-#endif      
+            /* FIXME: merge format nodes... */
          }
      }
    o->native.dirty = 1;
@@ -1882,6 +1898,8 @@
 evas_object_textblock_format_next_pos_get(Evas_Object *obj)
 {
    Evas_Object_Textblock *o;
+   Node *node;
+   int ps, pos;
    
    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
    return -1;
@@ -1890,14 +1908,143 @@
    MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK);
    return -1;
    MAGIC_CHECK_END();
-   /* FIXME: DO */
+   node = evas_object_textblock_node_pos_get(obj, o->pos, &ps);
+   pos = ps;
+   if (node)
+     {
+       pos += node->text_len;
+       node = (Node *)(((Evas_Object_List *)node)->next);
+       while ((node) && (node->text))
+         {
+            pos += node->text_len;
+            node = (Node *)(((Evas_Object_List *)node)->next);
+         }
+       return pos;
+     }
    return -1;
 }
 
 int
+evas_object_textblock_format_next_count_get(Evas_Object *obj)
+{
+   Evas_Object_Textblock *o;
+   Node *node;
+   int ps, num;
+   
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return 0;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Textblock *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK);
+   return 0;
+   MAGIC_CHECK_END();
+   node = evas_object_textblock_node_pos_get(obj, o->pos, &ps);
+   if (node)
+     {
+       node = (Node *)(((Evas_Object_List *)node)->next);
+       while ((node) && (node->text))
+         node = (Node *)(((Evas_Object_List *)node)->next);
+       num = 0;
+       while ((node) && (!node->text))
+         {
+            num++;
+            node = (Node *)(((Evas_Object_List *)node)->next);
+         }
+       return num;
+     }
+   return 0;
+}
+
+const char *
+evas_object_textblock_format_next_get(Evas_Object *obj, int n)
+{
+   Evas_Object_Textblock *o;
+   Node *node;
+   int ps, num;
+   
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Textblock *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK);
+   return NULL;
+   MAGIC_CHECK_END();
+   node = evas_object_textblock_node_pos_get(obj, o->pos, &ps);
+   if (node)
+     {
+       node = (Node *)(((Evas_Object_List *)node)->next);
+       while ((node) && (node->text))
+         node = (Node *)(((Evas_Object_List *)node)->next);
+       num = 0;
+       while ((node) && (!node->text))
+         {
+            if (num == n) return node->format;
+            num++;
+            node = (Node *)(((Evas_Object_List *)node)->next);
+         }
+     }
+   return NULL;
+}
+
+void
+evas_object_textblock_format_next_del(Evas_Object *obj, int n)
+{
+   Evas_Object_Textblock *o;
+   Node *node;
+   int ps, num;
+   
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Textblock *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK);
+   return;
+   MAGIC_CHECK_END();
+   node = evas_object_textblock_node_pos_get(obj, o->pos, &ps);
+   if (node)
+     {
+       node = (Node *)(((Evas_Object_List *)node)->next);
+       while ((node) && (node->text))
+         node = (Node *)(((Evas_Object_List *)node)->next);
+       num = 0;
+       while ((node) && (!node->text))
+         {
+            if (num == n)
+              {
+                 o->nodes = evas_object_list_remove(o->nodes, node);
+                 if (node->format) free(node->format);
+                 free(node);
+                 o->native.dirty = 1;
+                 o->format.dirty = 1;
+                 o->changed = 1;
+                 evas_object_change(obj);
+                 return;
+              }
+            num++;
+            node = (Node *)(((Evas_Object_List *)node)->next);
+         }
+     }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+int
 evas_object_textblock_format_prev_pos_get(Evas_Object *obj)
 {
    Evas_Object_Textblock *o;
+   Node *node;
+   int ps, pos;
    
    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
    return -1;
@@ -1906,30 +2053,58 @@
    MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK);
    return -1;
    MAGIC_CHECK_END();
-   /* FIXME: DO */
+   node = evas_object_textblock_node_pos_get(obj, o->pos, &ps);
+   pos = ps;
+   if (node)
+     {
+       node = (Node *)(((Evas_Object_List *)node)->prev);
+       while ((node) && (node->text))
+         {
+            pos -= node->text_len;
+            node = (Node *)(((Evas_Object_List *)node)->prev);
+         }
+       return pos;
+     }
    return -1;
 }
 
-char *
-evas_object_textblock_format_get(Evas_Object *obj)
+int
+evas_object_textblock_format_prev_count_get(Evas_Object *obj)
 {
    Evas_Object_Textblock *o;
+   Node *node;
+   int ps, num;
    
    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
-   return NULL;
+   return 0;
    MAGIC_CHECK_END();
    o = (Evas_Object_Textblock *)(obj->object_data);
    MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK);
-   return NULL;
+   return 0;
    MAGIC_CHECK_END();
-   /* FIXME: DO */
-   return NULL;
+   node = evas_object_textblock_node_pos_get(obj, o->pos, &ps);
+   if (node)
+     {
+       node = (Node *)(((Evas_Object_List *)node)->prev);
+       while ((node) && (node->text))
+         node = (Node *)(((Evas_Object_List *)node)->prev);
+       num = 0;
+       while ((node) && (!node->text))
+         {
+            num++;
+            node = (Node *)(((Evas_Object_List *)node)->prev);
+         }
+       return num;
+     }
+   return 0;
 }
 
-char *
-evas_object_textblock_current_format_get(Evas_Object *obj)
+const char *
+evas_object_textblock_format_prev_get(Evas_Object *obj, int n)
 {
    Evas_Object_Textblock *o;
+   Node *node;
+   int ps, num;
    
    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
    return NULL;
@@ -1938,14 +2113,29 @@
    MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK);
    return NULL;
    MAGIC_CHECK_END();
-   /* FIXME: DO */
+   node = evas_object_textblock_node_pos_get(obj, o->pos, &ps);
+   if (node)
+     {
+       node = (Node *)(((Evas_Object_List *)node)->prev);
+       while ((node) && (node->text))
+         node = (Node *)(((Evas_Object_List *)node)->prev);
+       num = 0;
+       while ((node) && (!node->text))
+         {
+            if (num == n) return node->format;
+            num++;
+            node = (Node *)(((Evas_Object_List *)node)->prev);
+         }
+     }
    return NULL;
 }
 
 void
-evas_object_textblock_format_del(Evas_Object *obj)
+evas_object_textblock_format_prev_del(Evas_Object *obj, int n)
 {
    Evas_Object_Textblock *o;
+   Node *node;
+   int ps, num;
    
    MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
    return;
@@ -1954,11 +2144,64 @@
    MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK);
    return;
    MAGIC_CHECK_END();
+   node = evas_object_textblock_node_pos_get(obj, o->pos, &ps);
+   if (node)
+     {
+       node = (Node *)(((Evas_Object_List *)node)->prev);
+       while ((node) && (node->text))
+         node = (Node *)(((Evas_Object_List *)node)->prev);
+       num = 0;
+       while ((node) && (!node->text))
+         {
+            if (num == n)
+              {
+                 o->nodes = evas_object_list_remove(o->nodes, node);
+                 if (node->format) free(node->format);
+                 free(node);
+                 o->native.dirty = 1;
+                 o->format.dirty = 1;
+                 o->changed = 1;
+                 evas_object_change(obj);
+                 return;
+              }
+            num++;
+            node = (Node *)(((Evas_Object_List *)node)->prev);
+         }
+     }
+}
+
+
+
+
+
+
+
+
+
+char *
+evas_object_textblock_current_format_get(Evas_Object *obj)
+{
+   Evas_Object_Textblock *o;
+   
+   MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ);
+   return NULL;
+   MAGIC_CHECK_END();
+   o = (Evas_Object_Textblock *)(obj->object_data);
+   MAGIC_CHECK(o, Evas_Object_Textblock, MAGIC_OBJ_TEXTBLOCK);
+   return NULL;
+   MAGIC_CHECK_END();
    /* FIXME: DO */
-   o->native.dirty = 1;
-   o->format.dirty = 1;
-   o->changed = 1;
-   evas_object_change(obj);
+   /* so what do we do eh? do we return 1 string with all "stateful" format
+    * data in it (font, size, color, underline etc.) space delimited... or
+    * what? i am tempted to opt for this solution right now - caller must
+    * free the string when done with free()
+    * 
+    * so to do this. find the layout node at the current pos, check the
+    * layout params, and snprintf all that are not a default value (that u can
+    * set via format parameters), then return a strdup of the buffer. if the
+    * buffer is too small - resize and snprintf again.
+    */
+   return NULL;
 }
 
 void
@@ -2112,7 +2355,7 @@
          evas_object_textblock_format_calc(obj);
        o->changed = 0;
      }
-#if 0   
+#if 0 /* using for some debugging. will go soon */
     obj->layer->evas->engine.func->context_color_set(output,
                                                      context,
                                                      230, 160, 30, 100);
@@ -2216,7 +2459,7 @@
                               ((double)((lnode->layout.line.mascent + 
                                          lnode->layout.line.mdescent) -
                                         (lnode->layout.line.ascent + 
-                                         lnode->layout.line.descent)) * 
+                                         lnode->layout.line.descent) - 1) * 
                                         lnode->layout.valign) +
                               lnode->layout.line.ascent,
                               lnode->w,




-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click
_______________________________________________
enlightenment-cvs mailing list
enlightenment-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to