1 #include "edje_private.h"
3 static Eina_Hash *type_registry = NULL;
4 static int init_count = 0;
7 edje_external_param_type_str(Edje_External_Param_Type type)
11 case EDJE_EXTERNAL_PARAM_TYPE_INT:
13 case EDJE_EXTERNAL_PARAM_TYPE_DOUBLE:
15 case EDJE_EXTERNAL_PARAM_TYPE_STRING:
17 case EDJE_EXTERNAL_PARAM_TYPE_BOOL:
19 case EDJE_EXTERNAL_PARAM_TYPE_CHOICE:
27 edje_object_part_external_object_get(const Evas_Object *obj, const char *part)
32 ed = _edje_fetch(obj);
33 if ((!ed) || (!part)) return NULL;
35 /* Need to recalc before providing the object. */
38 rp = _edje_real_part_recursive_get(ed, (char *)part);
41 ERR("no part '%s'", part);
44 if (rp->part->type != EDJE_PART_TYPE_EXTERNAL)
46 ERR("cannot get external object of a part '%s' that is not EXTERNAL",
50 return rp->swallowed_object;
54 edje_object_part_external_param_set(Evas_Object *obj, const char *part, const Edje_External_Param *param)
59 if ((!param) || (!param->name)) return EINA_FALSE;
61 ed = _edje_fetch(obj);
62 if ((!ed) || (!part)) return EINA_FALSE;
64 rp = _edje_real_part_recursive_get(ed, (char *)part);
67 ERR("no part '%s'", part);
71 return _edje_external_param_set(obj, rp, param);
75 edje_object_part_external_param_get(const Evas_Object *obj, const char *part, Edje_External_Param *param)
80 if ((!param) || (!param->name)) return EINA_FALSE;
82 ed = _edje_fetch(obj);
83 if ((!ed) || (!part)) return EINA_FALSE;
85 rp = _edje_real_part_recursive_get(ed, (char *)part);
88 ERR("no part '%s'", part);
92 return _edje_external_param_get(obj, rp, param);
98 edje_object_part_external_content_get(const Evas_Object *obj, const char *part, const char *content)
103 if (!content) return EINA_FALSE;
105 ed = _edje_fetch(obj);
106 if ((!ed) || (!part)) return EINA_FALSE;
108 rp = _edje_real_part_recursive_get(ed, (char *)part);
111 ERR("no part '%s'", part);
115 return _edje_external_content_get(rp->swallowed_object, content);
118 EAPI Edje_External_Param_Type
119 edje_object_part_external_param_type_get(const Evas_Object *obj, const char *part, const char *param)
123 Edje_External_Type *type;
124 Edje_External_Param_Info *info;
126 ed = _edje_fetch(obj);
127 if ((!ed) || (!part)) return EDJE_EXTERNAL_PARAM_TYPE_MAX;
129 rp = _edje_real_part_recursive_get(ed, (char *)part);
132 ERR("no part '%s'", part);
133 return EDJE_EXTERNAL_PARAM_TYPE_MAX;
135 type = evas_object_data_get(rp->swallowed_object, "Edje_External_Type");
138 ERR("no external type for object %p", obj);
139 return EDJE_EXTERNAL_PARAM_TYPE_MAX;
141 if (!type->parameters_info)
143 ERR("no parameters information for external type '%s'",
145 return EDJE_EXTERNAL_PARAM_TYPE_MAX;
147 for (info = type->parameters_info; info->name; info++)
148 if (strcmp(info->name, param) == 0)
151 ERR("no parameter '%s' external type '%s'", param, type->module_name);
152 return EDJE_EXTERNAL_PARAM_TYPE_MAX;
157 edje_external_type_register(const char *type_name, const Edje_External_Type *type_info)
164 if (type_info->abi_version != EDJE_EXTERNAL_TYPE_ABI_VERSION)
166 ERR("external type '%s' (%p) has incorrect abi version. "
167 "got %#x where %#x was expected.",
168 type_name, type_info,
169 type_info->abi_version, EDJE_EXTERNAL_TYPE_ABI_VERSION);
173 if (eina_hash_find(type_registry, type_name))
175 ERR("External type '%s' already registered", type_name);
178 return eina_hash_add(type_registry, type_name, type_info);
182 edje_external_type_unregister(const char *type_name)
186 return eina_hash_del_by_key(type_registry, type_name);
190 edje_external_type_array_register(const Edje_External_Type_Info *array)
192 const Edje_External_Type_Info *itr;
197 for (itr = array; itr->name; itr++)
199 if (itr->info->abi_version != EDJE_EXTERNAL_TYPE_ABI_VERSION)
201 ERR("external type '%s' (%p) has incorrect abi "
202 "version. got %#x where %#x was expected.",
203 itr->name, itr->info,
204 itr->info->abi_version, EDJE_EXTERNAL_TYPE_ABI_VERSION);
208 eina_hash_direct_add(type_registry, itr->name, itr->info);
213 edje_external_type_array_unregister(const Edje_External_Type_Info *array)
215 const Edje_External_Type_Info *itr;
220 for (itr = array; itr->name; itr++)
221 eina_hash_del(type_registry, itr->name, itr->info);
225 edje_external_type_abi_version_get(void)
227 return EDJE_EXTERNAL_TYPE_ABI_VERSION;
231 edje_external_iterator_get(void)
233 return eina_hash_iterator_tuple_new(type_registry);
236 EAPI Edje_External_Param *
237 edje_external_param_find(const Eina_List *params, const char *key)
240 Edje_External_Param *param;
242 EINA_LIST_FOREACH(params, l, param)
243 if (!strcmp(param->name, key)) return param;
249 edje_external_param_int_get(const Eina_List *params, const char *key, int *ret)
251 Edje_External_Param *param;
253 if (!params) return EINA_FALSE;
254 param = edje_external_param_find(params, key);
256 if (param && param->type == EDJE_EXTERNAL_PARAM_TYPE_INT && ret)
266 edje_external_param_double_get(const Eina_List *params, const char *key, double *ret)
268 Edje_External_Param *param;
270 if (!params) return EINA_FALSE;
271 param = edje_external_param_find(params, key);
273 if (param && param->type == EDJE_EXTERNAL_PARAM_TYPE_DOUBLE && ret)
283 edje_external_param_string_get(const Eina_List *params, const char *key, const char **ret)
285 Edje_External_Param *param;
287 if (!params) return EINA_FALSE;
288 param = edje_external_param_find(params, key);
290 if (param && param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING && ret)
300 edje_external_param_bool_get(const Eina_List *params, const char *key, Eina_Bool *ret)
302 Edje_External_Param *param;
304 if (!params) return EINA_FALSE;
305 param = edje_external_param_find(params, key);
307 if (param && param->type == EDJE_EXTERNAL_PARAM_TYPE_BOOL && ret)
317 edje_external_param_choice_get(const Eina_List *params, const char *key, const char **ret)
319 Edje_External_Param *param;
321 if (!params) return EINA_FALSE;
322 param = edje_external_param_find(params, key);
324 if (param && param->type == EDJE_EXTERNAL_PARAM_TYPE_CHOICE && ret)
333 EAPI const Edje_External_Param_Info *
334 edje_external_param_info_get(const char *type_name)
336 Edje_External_Type *type;
338 type = eina_hash_find(type_registry, type_name);
341 return type->parameters_info;
344 EAPI const Edje_External_Type *
345 edje_external_type_get(const char *type_name)
347 return eina_hash_find(type_registry, type_name);
351 _edje_external_init()
354 type_registry = eina_hash_string_superfast_new(NULL);
360 _edje_external_shutdown()
362 if (--init_count == 0)
364 eina_hash_free(type_registry);
365 type_registry = NULL;
370 _edje_external_type_add(const char *type_name, Evas *evas, Evas_Object *parent, const Eina_List *params, const char *part_name)
372 Edje_External_Type *type;
375 type = eina_hash_find(type_registry, type_name);
378 ERR("external type '%s' not registered", type_name);
382 obj = type->add(type->data, evas, parent, params, part_name);
385 ERR("External type '%s' returned NULL from constructor", type_name);
389 evas_object_data_set(obj, "Edje_External_Type", type);
395 _edje_external_signal_emit(Evas_Object *obj, const char *emission, const char *source)
397 Edje_External_Type *type;
399 type = evas_object_data_get(obj, "Edje_External_Type");
402 ERR("External type data not found.");
406 type->signal_emit(type->data, obj, emission, source);
410 _edje_external_param_set(Evas_Object *obj, Edje_Real_Part *rp, const Edje_External_Param *param)
412 Evas_Object *swallowed_object = rp->swallowed_object;
413 Edje_External_Type *type = evas_object_data_get(swallowed_object, "Edje_External_Type");
416 if ((rp->part->type == EDJE_PART_TYPE_TEXT) ||
417 (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK))
419 if ((param->type == EDJE_EXTERNAL_PARAM_TYPE_STRING) &&
420 (!strcmp (param->name, "text")) && (obj))
422 return edje_object_part_text_set(obj, rp->part->name, param->s);
426 ERR("no external type for object %p", swallowed_object);
429 if (!type->param_set)
431 ERR("external type '%s' from module '%s' does not provide param_set()",
432 type->module_name, type->module);
435 return type->param_set(type->data, swallowed_object, param);
439 _edje_external_param_get(const Evas_Object *obj, Edje_Real_Part *rp, Edje_External_Param *param)
441 Evas_Object *swallowed_object = rp->swallowed_object;
442 Edje_External_Type *type = evas_object_data_get(swallowed_object, "Edje_External_Type");
445 if ((rp->part->type == EDJE_PART_TYPE_TEXT) ||
446 (rp->part->type == EDJE_PART_TYPE_TEXTBLOCK))
449 param->type = EDJE_EXTERNAL_PARAM_TYPE_STRING;
450 param->name = "text";
451 text = edje_object_part_text_get(obj, rp->part->name);
456 ERR("no external type for object %p", swallowed_object);
459 if (!type->param_get)
461 ERR("external type '%s' from module '%s' does not provide param_get()",
462 type->module_name, type->module);
465 return type->param_get(type->data, swallowed_object, param);
469 _edje_external_content_get(const Evas_Object *obj, const char *content)
471 Edje_External_Type *type = evas_object_data_get(obj, "Edje_External_Type");
474 ERR("no external type for object %p", obj);
477 if (!type->content_get)
479 ERR("external type '%s' from module '%s' does not provide content_get()",
480 type->module_name, type->module);
483 return type->content_get(type->data, obj, content);
487 _edje_external_params_free(Eina_List *external_params, Eina_Bool free_strings)
489 Edje_External_Param *param;
491 EINA_LIST_FREE(external_params, param)
495 if (param->name) eina_stringshare_del(param->name);
496 if (param->s) eina_stringshare_del(param->s);
503 _edje_external_recalc_apply(Edje *ed __UNUSED__, Edje_Real_Part *ep,
504 Edje_Calc_Params *params __UNUSED__,
505 Edje_Part_Description_Common *chosen_desc __UNUSED__)
507 Edje_External_Type *type;
508 Edje_Part_Description_External *ext;
509 void *params1, *params2 = NULL;
511 if (!ep->swallowed_object) return;
512 type = evas_object_data_get(ep->swallowed_object, "Edje_External_Type");
514 if ((!type) || (!type->state_set)) return;
516 ext = (Edje_Part_Description_External*) ep->param1.description;
518 params1 = ep->param1.external_params ?
519 ep->param1.external_params : ext->external_params;
521 if (ep->param2 && ep->param2->description)
523 ext = (Edje_Part_Description_External*) ep->param2->description;
525 params2 = ep->param2->external_params ?
526 ep->param2->external_params : ext->external_params;
529 type->state_set(type->data, ep->swallowed_object,
530 params1, params2, ep->description_pos);
534 _edje_external_params_parse(Evas_Object *obj, const Eina_List *params)
536 Edje_External_Type *type;
538 type = evas_object_data_get(obj, "Edje_External_Type");
539 if (!type) return NULL;
541 if (!type->params_parse) return NULL;
543 return type->params_parse(type->data, obj, params);
547 _edje_external_parsed_params_free(Evas_Object *obj, void *params)
549 Edje_External_Type *type;
553 type = evas_object_data_get(obj, "Edje_External_Type");
556 if (!type->params_free) return;
558 type->params_free(params);