@since

Vincent

On Tue, Feb 7, 2012 at 9:49 AM, Enlightenment SVN
<no-re...@enlightenment.org> wrote:
> Log:
> [edje/markup filter] Add new API, edje_object_markup_filter_callback_add. 
> When using
>  edje_object_text_insert_filter_callback_add, a filter function
>  should check the type(format, text, or markup) of text for correct
>  filtering. But in markup filter function(added by new API), text is
>  always markup so no need to check the type of text.
>
>
> Author:       woohyun
> Date:         2012-02-07 00:49:56 -0800 (Tue, 07 Feb 2012)
> New Revision: 67724
> Trac:         http://trac.enlightenment.org/e/changeset/67724
>
> Modified:
>  trunk/edje/src/lib/Edje.h trunk/edje/src/lib/edje_entry.c 
> trunk/edje/src/lib/edje_private.h trunk/edje/src/lib/edje_util.c
>
> Modified: trunk/edje/src/lib/Edje.h
> ===================================================================
> --- trunk/edje/src/lib/Edje.h   2012-02-07 02:30:36 UTC (rev 67723)
> +++ trunk/edje/src/lib/Edje.h   2012-02-07 08:49:56 UTC (rev 67724)
> @@ -1054,6 +1054,7 @@
>  typedef void         (*Edje_Text_Change_Cb)     (void *data, Evas_Object 
> *obj, const char *part);
>  typedef void         (*Edje_Message_Handler_Cb) (void *data, Evas_Object 
> *obj, Edje_Message_Type type, int id, void *msg); /**< Edje message handler 
> callback functions's prototype definition. @c data will have the auxiliary 
> data pointer set at the time the callback registration. @c obj will be a 
> pointer the Edje object where the message comes from. @c type will identify 
> the type of the given message and @c msg will be a pointer the message's 
> contents, de facto, which depend on @c type. */
>  typedef void         (*Edje_Text_Filter_Cb)     (void *data, Evas_Object 
> *obj, const char *part, Edje_Text_Filter_Type type, char **text);
> +typedef void         (*Edje_Markup_Filter_Cb)   (void *data, Evas_Object 
> *obj, const char *part, char **text);
>  typedef Evas_Object *(*Edje_Item_Provider_Cb)   (void *data, Evas_Object 
> *obj, const char *part, const char *item);
>
>  /**
> @@ -2924,8 +2925,20 @@
>  * will make Edje break out of the filter cycle and reject the inserted
>  * text.
>  *
> + * @warning This function will be deprecated because of difficulty in use.
> + *          The type(format, text, or makrup) of text should be always
> + *          checked in the filter function for correct filtering.
> + *          Please use edje_object_markup_filter_callback_add() instead. 
> There
> + *          is no need to check the type of text in the filter function
> + *          because the text is always markup.
> + * @warning If you use this function with
> + *          edje_object_markup_filter_callback_add() togehter, all
> + *          Edje_Text_Filter_Cb functions and Edje_Markup_Filter_Cb functions
> + *          will be executed, and then filtered text will be inserted.
> + *
>  * @see edje_object_text_insert_filter_callback_del
>  * @see edje_object_text_insert_filter_callback_del_full
> + * @see edje_object_markup_filter_callback_add
>  *
>  * @param obj A valid Evas_Object handle
>  * @param part The part name
> @@ -2971,6 +2984,74 @@
>  EAPI void            *edje_object_text_insert_filter_callback_del_full  
> (Evas_Object *obj, const char *part, Edje_Text_Filter_Cb func, void *data);
>
>  /**
> + * Add a markup filter function for newly inserted text.
> + *
> + * Whenever text is inserted (not the same as set) into the given @p part,
> + * the list of markup filter functions will be called to decide if and how
> + * the new text will be accepted.
> + * The text parameter in the @p func filter is always markup. It can be
> + * modified by the user and it's up to him to free the one passed if he's to
> + * change the pointer. If doing so, the newly set text should be malloc'ed,
> + * as once all the filters are called Edje will free it.
> + * If the text is to be rejected, freeing it and setting the pointer to NULL
> + * will make Edje break out of the filter cycle and reject the inserted
> + * text.
> + * This function is different from 
> edje_object_text_insert_filter_callback_add()
> + * in that the text parameter in the @p fucn filter is always markup.
> + *
> + * @warning If you use this function with
> + *          edje_object_text_insert_filter_callback_add() togehter, all
> + *          Edje_Text_Filter_Cb functions and Edje_Markup_Filter_Cb functions
> + *          will be executed, and then filtered text will be inserted.
> + *
> + * @see edje_object_markup_filter_callback_del
> + * @see edje_object_markup_filter_callback_del_full
> + * @see edje_object_text_insert_filter_callback_add
> + *
> + * @param obj A valid Evas_Object handle
> + * @param part The part name
> + * @param func The callback function that will act as markup filter
> + * @param data User provided data to pass to the filter function
> + */
> +EAPI void edje_object_markup_filter_callback_add(Evas_Object *obj, const 
> char *part, Edje_Markup_Filter_Cb func, void *data);
> +
> +/**
> + * Delete a function from the markup filter list.
> + *
> + * Delete the given @p func filter from the list in @p part. Returns
> + * the user data pointer given when added.
> + *
> + * @see edje_object_markup_filter_callback_add
> + * @see edje_object_markup_filter_callback_del_full
> + *
> + * @param obj A valid Evas_Object handle
> + * @param part The part name
> + * @param func The function callback to remove
> + *
> + * @return The user data pointer if succesful, or NULL otherwise
> + */
> +EAPI void *edje_object_markup_filter_callback_del(Evas_Object *obj, const 
> char *part, Edje_Markup_Filter_Cb func);
> +
> +/**
> + * Delete a function and matching user data from the markup filter list.
> + *
> + * Delete the given @p func filter and @p data user data from the list
> + * in @p part.
> + * Returns the user data pointer given when added.
> + *
> + * @see edje_object_markup_filter_callback_add
> + * @see edje_object_markup_filter_callback_del
> + *
> + * @param obj A valid Evas_Object handle
> + * @param part The part name
> + * @param func The function callback to remove
> + * @param data The data passed to the callback function
> + *
> + * @return The same data pointer if succesful, or NULL otherwise
> + */
> +EAPI void *edje_object_markup_filter_callback_del_full(Evas_Object *obj, 
> const char *part, Edje_Markup_Filter_Cb func, void *data);
> +
> +/**
>  * @brief Swallows an object into the edje.
>  *
>  * @param obj A valid Evas_Object handle
>
> Modified: trunk/edje/src/lib/edje_entry.c
> ===================================================================
> --- trunk/edje/src/lib/edje_entry.c     2012-02-07 02:30:36 UTC (rev 67723)
> +++ trunk/edje/src/lib/edje_entry.c     2012-02-07 08:49:56 UTC (rev 67724)
> @@ -180,6 +180,27 @@
>  }
>
>  static void
> +_text_filter_markup_prepend_internal(Entry *en, Evas_Textblock_Cursor *c, 
> char *text)
> +{
> +   Edje_Markup_Filter_Callback *cb;
> +   Eina_List *l;
> +
> +   EINA_LIST_FOREACH(en->rp->edje->markup_filter_callbacks, l, cb)
> +     {
> +        if (!strcmp(cb->part, en->rp->part->name))
> +          {
> +             cb->func(cb->data, en->rp->edje->obj, cb->part, &text);
> +             if (!text) break;
> +          }
> +     }
> +   if (text)
> +     {
> +        evas_object_textblock_text_markup_prepend(c, text);
> +        free(text);
> +     }
> +}
> +
> +static void
>  _text_filter_text_prepend(Entry *en, Evas_Textblock_Cursor *c, const char 
> *text)
>  {
>    char *text2;
> @@ -197,8 +218,11 @@
>      }
>    if (text2)
>      {
> -        evas_textblock_cursor_text_prepend(c, text2);
> +        char *markup_text;
> +        markup_text = evas_textblock_text_utf8_to_markup(NULL, text2);
>         free(text2);
> +        if (markup_text)
> +          _text_filter_markup_prepend_internal(en, c, markup_text);
>      }
>  }
>
> @@ -220,8 +244,61 @@
>      }
>    if (text2)
>      {
> -        evas_textblock_cursor_format_prepend(c, text2);
> +        char *s, *markup_text;
> +
> +        s = text2;
> +        if (*s == '+')
> +          {
> +             s++;
> +             while (*s == ' ') s++;
> +             if (!s)
> +               {
> +                  free(text2);
> +                  return;
> +               }
> +             markup_text = (char*) malloc(strlen(s) + 3);
> +             if (markup_text)
> +               {
> +                  *(markup_text) = '<';
> +                  strncpy((markup_text + 1), s, strlen(s));
> +                  *(markup_text + strlen(s) + 1) = '>';
> +                  *(markup_text + strlen(s) + 2) = '\0';
> +               }
> +          }
> +        else if (s[0] == '-')
> +          {
> +             s++;
> +             while (*s == ' ') s++;
> +             if (!s)
> +               {
> +                  free(text2);
> +                  return;
> +               }
> +             markup_text = (char*) malloc(strlen(s) + 4);
> +             if (markup_text)
> +               {
> +                  *(markup_text) = '<';
> +                  *(markup_text + 1) = '/';
> +                  strncpy((markup_text + 2), s, strlen(s));
> +                  *(markup_text + strlen(s) + 2) = '>';
> +                  *(markup_text + strlen(s) + 3) = '\0';
> +               }
> +          }
> +        else
> +          {
> +             markup_text = (char*) malloc(strlen(s) + 4);
> +             if (markup_text)
> +               {
> +                  *(markup_text) = '<';
> +                  strncpy((markup_text + 1), s, strlen(s));
> +                  *(markup_text + strlen(s) + 1) = '/';
> +                  *(markup_text + strlen(s) + 2) = '>';
> +                  *(markup_text + strlen(s) + 3) = '\0';
> +               }
> +          }
>         free(text2);
> +        if (markup_text)
> +          _text_filter_markup_prepend_internal(en, c, markup_text);
>      }
>  }
>
> @@ -242,10 +319,7 @@
>           }
>      }
>    if (text2)
> -     {
> -        evas_object_textblock_text_markup_prepend(c, text2);
> -        free(text2);
> -     }
> +     _text_filter_markup_prepend_internal(en, c, text2);
>  }
>
>  static void
>
> Modified: trunk/edje/src/lib/edje_private.h
> ===================================================================
> --- trunk/edje/src/lib/edje_private.h   2012-02-07 02:30:36 UTC (rev 67723)
> +++ trunk/edje/src/lib/edje_private.h   2012-02-07 08:49:56 UTC (rev 67724)
> @@ -322,6 +322,7 @@
>  typedef struct _Edje_Var_Pool Edje_Var_Pool;
>  typedef struct _Edje_Signal_Source_Char Edje_Signal_Source_Char;
>  typedef struct _Edje_Text_Insert_Filter_Callback 
> Edje_Text_Insert_Filter_Callback;
> +typedef struct _Edje_Markup_Filter_Callback Edje_Markup_Filter_Callback;
>
>  #define EDJE_INF_MAX_W 100000
>  #define EDJE_INF_MAX_H 100000
> @@ -1077,6 +1078,7 @@
>    Edje_Real_Part       *focused_part;
>    Eina_List            *subobjs;
>    Eina_List            *text_insert_filter_callbacks;
> +   Eina_List            *markup_filter_callbacks;
>    void                 *script_only_data;
>
>    int                   table_programs_size;
> @@ -1337,6 +1339,13 @@
>    void        *data;
>  };
>
> +struct _Edje_Markup_Filter_Callback
> +{
> +   const char  *part;
> +   Edje_Markup_Filter_Cb func;
> +   void        *data;
> +};
> +
>  struct _Edje_Pending_Program
>  {
>    Edje         *edje;
>
> Modified: trunk/edje/src/lib/edje_util.c
> ===================================================================
> --- trunk/edje/src/lib/edje_util.c      2012-02-07 02:30:36 UTC (rev 67723)
> +++ trunk/edje/src/lib/edje_util.c      2012-02-07 08:49:56 UTC (rev 67724)
> @@ -1941,6 +1941,71 @@
>    return NULL;
>  }
>
> +EAPI void
> +edje_object_markup_filter_callback_add(Evas_Object *obj, const char *part, 
> Edje_Markup_Filter_Cb func, void *data)
> +{
> +   Edje *ed;
> +   Edje_Markup_Filter_Callback *cb;
> +
> +   ed = _edje_fetch(obj);
> +   if ((!ed) || (!part)) return;
> +   cb = calloc(1, sizeof(Edje_Markup_Filter_Callback));
> +   cb->part = eina_stringshare_add(part);
> +   cb->func = func;
> +   cb->data = (void *)data;
> +   ed->markup_filter_callbacks =
> +     eina_list_append(ed->markup_filter_callbacks, cb);
> +}
> +
> +EAPI void *
> +edje_object_markup_filter_callback_del(Evas_Object *obj, const char *part, 
> Edje_Markup_Filter_Cb func)
> +{
> +   Edje *ed;
> +   Edje_Markup_Filter_Callback *cb;
> +   Eina_List *l;
> +
> +   ed = _edje_fetch(obj);
> +   if ((!ed) || (!part)) return NULL;
> +   EINA_LIST_FOREACH(ed->markup_filter_callbacks, l, cb)
> +     {
> +        if ((!strcmp(cb->part, part)) && (cb->func == func))
> +          {
> +             void *data = cb->data;
> +             ed->markup_filter_callbacks =
> +                eina_list_remove_list(ed->markup_filter_callbacks, l);
> +             eina_stringshare_del(cb->part);
> +             free(cb);
> +             return data;
> +          }
> +     }
> +   return NULL;
> +}
> +
> +EAPI void *
> +edje_object_markup_filter_callback_del_full(Evas_Object *obj, const char 
> *part, Edje_Markup_Filter_Cb func, void *data)
> +{
> +   Edje *ed;
> +   Edje_Markup_Filter_Callback *cb;
> +   Eina_List *l;
> +
> +   ed = _edje_fetch(obj);
> +   if ((!ed) || (!part)) return NULL;
> +   EINA_LIST_FOREACH(ed->markup_filter_callbacks, l, cb)
> +     {
> +        if ((!strcmp(cb->part, part)) && (cb->func == func) &&
> +            (cb->data == data))
> +          {
> +             void *tmp = cb->data;
> +             ed->markup_filter_callbacks =
> +                eina_list_remove_list(ed->markup_filter_callbacks, l);
> +             eina_stringshare_del(cb->part);
> +             free(cb);
> +             return tmp;
> +          }
> +     }
> +   return NULL;
> +}
> +
>  EAPI Eina_Bool
>  edje_object_part_swallow(Evas_Object *obj, const char *part, Evas_Object 
> *obj_swallow)
>  {
>
>
> ------------------------------------------------------------------------------
> Keep Your Developer Skills Current with LearnDevNow!
> The most comprehensive online learning library for Microsoft developers
> is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
> Metro Style Apps, more. Free future releases when you subscribe now!
> http://p.sf.net/sfu/learndevnow-d2d
> _______________________________________________
> enlightenment-svn mailing list
> enlightenment-...@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/enlightenment-svn

------------------------------------------------------------------------------
Keep Your Developer Skills Current with LearnDevNow!
The most comprehensive online learning library for Microsoft developers
is just $99.99! Visual Studio, SharePoint, SQL - plus HTML5, CSS3, MVC3,
Metro Style Apps, more. Free future releases when you subscribe now!
http://p.sf.net/sfu/learndevnow-d2d
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to