@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