actually hook in filter callbacks - have 2 types and pass in enum to

each as to what text they are seeing to filter. fix up other typdef
uses.



SVN revision: 52975
This commit is contained in:
Carsten Haitzler 2010-10-02 03:34:00 +00:00
parent 44093c2bdc
commit 57d15d3ef8
5 changed files with 119 additions and 42 deletions

View File

@ -259,6 +259,13 @@ typedef enum _Edje_Load_Error
EDJE_LOAD_ERROR_RECURSIVE_REFERENCE = 9
} Edje_Load_Error;
typedef enum _Edje_Text_Filter_Type
{
EDJE_TEXT_FILTER_TEXT = 0,
EDJE_TEXT_FILTER_FORMAT = 1,
EDJE_TEXT_FILTER_MARKUP = 2
} Edje_Text_Filter_Type;
typedef enum _Edje_External_Param_Type
{
EDJE_EXTERNAL_PARAM_TYPE_INT,
@ -468,9 +475,11 @@ struct _Edje_External_Type_Info
};
typedef struct _Edje_External_Type_Info Edje_External_Type_Info;
typedef void (*Edje_Signal_Cb) (void *data, Evas_Object *obj, const char *emission, const char *source);
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);
typedef void (*Edje_Signal_Cb) (void *data, Evas_Object *obj, const char *emission, const char *source);
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);
typedef void (*Edje_Text_Filter_Cb) (void *data, Evas_Object *obj, const char *part, Edje_Text_Filter_Type type, char **text);
typedef Evas_Object *(*Edje_Item_Provider_Cb) (void *data, Evas_Object *obj, const char *part, const char *item);
/* edje_main.c */
EAPI int edje_init (void);
@ -556,7 +565,7 @@ typedef void (*Edje_Message_Handler_Cb) (void *data, Evas_Object *obj, Edje_Mess
EAPI const Evas_Object *edje_object_part_object_get (const Evas_Object *obj, const char *part);
EAPI Eina_Bool edje_object_part_geometry_get (const Evas_Object *obj, const char *part, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h);
EAPI void edje_object_item_provider_set (Evas_Object *obj, Evas_Object *(*func) (void *data, Evas_Object *obj, const char *part, const char *item), void *data);
EAPI void edje_object_item_provider_set (Evas_Object *obj, Edje_Item_Provider_Cb func, void *data);
EAPI void edje_object_text_change_cb_set (Evas_Object *obj, Edje_Text_Change_Cb func, void *data);
@ -593,8 +602,8 @@ typedef void (*Edje_Message_Handler_Cb) (void *data, Evas_Object *obj, Edje_Mess
EAPI Eina_Bool edje_object_part_text_cursor_is_visible_format_get(const Evas_Object *obj, const char *part, Edje_Cursor cur);
EAPI const char *edje_object_part_text_cursor_content_get (const Evas_Object *obj, const char *part, Edje_Cursor cur);
EAPI void edje_object_text_insert_filter_callback_add (Evas_Object *obj, const char *part, void (*func) (void *data, Evas_Object *obj, const char *part, char **text), const void *data);
EAPI void edje_object_text_insert_filter_callback_del (Evas_Object *obj, const char *part, void (*func) (void *data, Evas_Object *obj, const char *part, char **text), const void *data);
EAPI void edje_object_text_insert_filter_callback_add (Evas_Object *obj, const char *part, Edje_Text_Filter_Cb func, void *data);
EAPI void *edje_object_text_insert_filter_callback_del (Evas_Object *obj, const char *part, Edje_Text_Filter_Cb func);
EAPI Eina_Bool edje_object_part_swallow (Evas_Object *obj, const char *part, Evas_Object *obj_swallow);
EAPI void edje_object_part_unswallow (Evas_Object *obj, Evas_Object *obj_swallow);

View File

@ -153,9 +153,8 @@ _edje_focus_out_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__,
#endif
}
// need one for markup and format too - how to do it? extra type param?
static void __UNUSED__
_text_filter_prepend(Entry *en, const char *text)
static void
_text_filter_text_prepend(Entry *en, const char *text)
{
char *text2;
Edje_Text_Insert_Filter_Callback *cb;
@ -166,7 +165,7 @@ _text_filter_prepend(Entry *en, const char *text)
{
if (!strcmp(cb->part, en->rp->part->name))
{
cb->func(cb->data, en->rp->edje->obj, cb->part, &text2);
cb->func(cb->data, en->rp->edje->obj, cb->part, EDJE_TEXT_FILTER_TEXT, &text2);
if (!text2) break;
}
}
@ -177,6 +176,52 @@ _text_filter_prepend(Entry *en, const char *text)
}
}
static void
_text_filter_format_prepend(Entry *en, const char *text)
{
char *text2;
Edje_Text_Insert_Filter_Callback *cb;
Eina_List *l;
text2 = strdup(text);
EINA_LIST_FOREACH(en->rp->edje->text_insert_filter_callbacks, l, cb)
{
if (!strcmp(cb->part, en->rp->part->name))
{
cb->func(cb->data, en->rp->edje->obj, cb->part, EDJE_TEXT_FILTER_FORMAT, &text2);
if (!text2) break;
}
}
if (text2)
{
evas_textblock_cursor_format_prepend(en->cursor, text2);
free(text2);
}
}
static void
_text_filter_markup_prepend(Entry *en, const char *text)
{
char *text2;
Edje_Text_Insert_Filter_Callback *cb;
Eina_List *l;
text2 = strdup(text);
EINA_LIST_FOREACH(en->rp->edje->text_insert_filter_callbacks, l, cb)
{
if (!strcmp(cb->part, en->rp->part->name))
{
cb->func(cb->data, en->rp->edje->obj, cb->part, EDJE_TEXT_FILTER_MARKUP, &text2);
if (!text2) break;
}
}
if (text2)
{
evas_object_textblock_text_markup_prepend(en->cursor, text2);
free(text2);
}
}
static void
_curs_update_from_curs(Evas_Textblock_Cursor *c, Evas_Object *o __UNUSED__, Entry *en)
{
@ -1163,7 +1208,8 @@ _edje_key_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, v
else
{
//yy
evas_textblock_cursor_format_prepend(en->cursor, "\t");
// evas_textblock_cursor_format_prepend(en->cursor, "\t");
_text_filter_format_prepend(en, "\t");
_curs_update_from_curs(en->cursor, rp->object, en);
_anchors_get(en->cursor, rp->object, en);
_edje_emit(ed, "entry,changed", rp->part->name);
@ -1216,11 +1262,15 @@ _edje_key_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, v
_sel_clear(en->cursor, rp->object, en);
if (shift)
{
evas_textblock_cursor_format_prepend(en->cursor, "\n");
//yy
// evas_textblock_cursor_format_prepend(en->cursor, "\n");
_text_filter_format_prepend(en, "\n");
}
else
{
evas_textblock_cursor_format_prepend(en->cursor, "ps");
//yy
// evas_textblock_cursor_format_prepend(en->cursor, "ps");
_text_filter_format_prepend(en, "ps");
}
_curs_update_from_curs(en->cursor, rp->object, en);
_anchors_get(en->cursor, rp->object, en);
@ -1239,7 +1289,8 @@ _edje_key_down_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, v
_range_del(en->cursor, rp->object, en);
_sel_clear(en->cursor, rp->object, en);
//zz
evas_textblock_cursor_text_prepend(en->cursor, ev->string);
// evas_textblock_cursor_text_prepend(en->cursor, ev->string);
_text_filter_text_prepend(en, ev->string);
_curs_update_from_curs(en->cursor, rp->object, en);
_anchors_get(en->cursor, rp->object, en);
_edje_emit(ed, "entry,changed", rp->part->name);
@ -1879,7 +1930,8 @@ _edje_entry_text_markup_insert(Edje_Real_Part *rp, const char *text)
_range_del(en->cursor, rp->object, en);
_sel_clear(en->cursor, rp->object, en);
//xx
evas_object_textblock_text_markup_prepend(en->cursor, text);
// evas_object_textblock_text_markup_prepend(en->cursor, text);
_text_filter_markup_prepend(en, text);
_curs_update_from_curs(en->cursor, rp->object, en);
_anchors_get(en->cursor, rp->object, en);
_edje_emit(rp->edje, "entry,changed", rp->part->name);
@ -2509,7 +2561,8 @@ _edje_entry_imf_event_commit_cb(void *data, int type __UNUSED__, void *event)
}
//yy
evas_textblock_cursor_text_prepend(en->cursor, ev->str);
// evas_textblock_cursor_text_prepend(en->cursor, ev->str);
_text_filter_text_prepend(en, ev->str);
_curs_update_from_curs(en->cursor, rp->object, en);
_anchors_get(en->cursor, rp->object, en);
@ -2564,7 +2617,8 @@ _edje_entry_imf_event_changed_cb(void *data, int type __UNUSED__, void *event)
en->have_composition = EINA_TRUE;
//xx
evas_object_textblock_text_markup_prepend(en->cursor, preedit_string);
// evas_object_textblock_text_markup_prepend(en->cursor, preedit_string);
_text_filter_markup_prepend(en, preedit_string);
_curs_update_from_curs(en->cursor, rp->object, en);
_anchors_get(en->cursor, rp->object, en);

View File

@ -71,7 +71,7 @@ edje_object_message_send(Evas_Object *obj, Edje_Message_Type type, int id, void
*/
EAPI void
edje_object_message_handler_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, Edje_Message_Type type, int id, void *msg), void *data)
edje_object_message_handler_set(Evas_Object *obj, Edje_Message_Handler_Cb func, void *data)
{
Edje *ed;

View File

@ -983,14 +983,14 @@ struct _Edje
FLOAT_T scale;
struct {
void (*func) (void *data, Evas_Object *obj, const char *part);
void *data;
Edje_Text_Change_Cb func;
void *data;
} text_change;
struct {
void (*func) (void *data, Evas_Object *obj, Edje_Message_Type type, int id, void *msg);
void *data;
int num;
Edje_Message_Handler_Cb func;
void *data;
int num;
} message;
int processing_messages;
@ -1025,8 +1025,8 @@ struct _Edje
int lua_ref;
struct {
Evas_Object *(*func) (void *data, Evas_Object *obj, const char *part, const char *item);
void *data;
Edje_Item_Provider_Cb func;
void *data;
} item_provider;
};
@ -1183,16 +1183,16 @@ struct _Edje_Signal_Callback
{
const char *signal;
const char *source;
void (*func) (void *data, Evas_Object *o, const char *emission, const char *source);
void *data;
unsigned char just_added : 1;
unsigned char delete_me : 1;
Edje_Signal_Cb func;
void *data;
unsigned char just_added : 1;
unsigned char delete_me : 1;
};
struct _Edje_Text_Insert_Filter_Callback
{
const char *part;
void (*func) (void *data, Evas_Object *obj, const char *part, char **text);
Edje_Text_Filter_Cb func;
void *data;
};

View File

@ -1190,7 +1190,7 @@ edje_object_part_geometry_get(const Evas_Object *obj, const char *part, Evas_Coo
* Edje object is deleted (or file is set to a new file).
*/
EAPI void
edje_object_item_provider_set(Evas_Object *obj, Evas_Object *(*func) (void *data, Evas_Object *obj, const char *part, const char *item), void *data)
edje_object_item_provider_set(Evas_Object *obj, Edje_Item_Provider_Cb func, void *data)
{
Edje *ed;
@ -1215,7 +1215,7 @@ edje_object_item_provider_set(Evas_Object *obj, Evas_Object *(*func) (void *data
*
*/
EAPI void
edje_object_text_change_cb_set(Evas_Object *obj, void (*func) (void *data, Evas_Object *obj, const char *part), void *data)
edje_object_text_change_cb_set(Evas_Object *obj, Edje_Text_Change_Cb func, void *data)
{
Edje *ed;
unsigned int i;
@ -1230,8 +1230,8 @@ edje_object_text_change_cb_set(Evas_Object *obj, void (*func) (void *data, Evas_
Edje_Real_Part *rp;
rp = ed->table_parts[i];
if (rp->part->type == EDJE_PART_TYPE_GROUP && rp->swallowed_object)
edje_object_text_change_cb_set(rp->swallowed_object, func, data);
if ((rp->part->type == EDJE_PART_TYPE_GROUP) && (rp->swallowed_object))
edje_object_text_change_cb_set(rp->swallowed_object, func, data);
}
}
@ -2145,8 +2145,14 @@ edje_object_part_text_cursor_content_get(const Evas_Object *obj, const char *par
return NULL;
}
/**
* @brief XX
*
* @param obj A valid Evas_Object handle
* @param part The part name
*/
EAPI void
edje_object_text_insert_filter_callback_add(Evas_Object *obj, const char *part, void (*func) (void *data, Evas_Object *obj, const char *part, char **text), const void *data)
edje_object_text_insert_filter_callback_add(Evas_Object *obj, const char *part, Edje_Text_Filter_Cb func, void *data)
{
Edje *ed;
Edje_Text_Insert_Filter_Callback *cb;
@ -2156,31 +2162,39 @@ edje_object_text_insert_filter_callback_add(Evas_Object *obj, const char *part,
cb = calloc(1, sizeof(Edje_Text_Insert_Filter_Callback));
cb->part = eina_stringshare_add(part);
cb->func = func;
cb->data = (void*) data;
cb->data = (void *)data;
ed->text_insert_filter_callbacks =
eina_list_append(ed->text_insert_filter_callbacks, cb);
}
EAPI void
edje_object_text_insert_filter_callback_del(Evas_Object *obj, const char *part, void (*func) (void *data, Evas_Object *obj, const char *part, char **text), const void *data)
/**
* @brief XX
*
* @param obj A valid Evas_Object handle
* @param part The part name
*/
EAPI void *
edje_object_text_insert_filter_callback_del(Evas_Object *obj, const char *part, Edje_Text_Filter_Cb func)
{
Edje *ed;
Edje_Text_Insert_Filter_Callback *cb;
Eina_List *l;
ed = _edje_fetch(obj);
if ((!ed) || (!part)) return;
if ((!ed) || (!part)) return NULL;
EINA_LIST_FOREACH(ed->text_insert_filter_callbacks, l, cb)
{
if ((!strcmp(cb->part, part)) && (cb->func == func) && (cb->data == data))
if ((!strcmp(cb->part, part)) && (cb->func == func))
{
void *data = cb->data;
ed->text_insert_filter_callbacks =
eina_list_remove_list(ed->text_insert_filter_callbacks, l);
eina_list_remove_list(ed->text_insert_filter_callbacks, l);
eina_stringshare_del(cb->part);
free(cb);
return;
return data;
}
}
return NULL;
}
/**