Check part types before casting descriptions

SVN revision: 50949
This commit is contained in:
Iván Briano 2010-08-09 23:09:24 +00:00
parent ae5a95f108
commit 6d01819c7f
1 changed files with 140 additions and 10 deletions

View File

@ -58,12 +58,15 @@
#define GET_PD_OR_RETURN(RET) \
Edje *ed; \
Edje_Edit *eed; \
Edje_Real_Part *rp; \
Edje_Part_Description_Common *pd; \
if (!evas_object_smart_type_check_ptr(obj, _edje_edit_type)) \
return RET; \
eed = evas_object_smart_data_get(obj); \
if (!eed) return RET; \
ed = (Edje *)eed; \
rp = _edje_real_part_get(ed, part); \
if (!rp) return RET; \
pd = _edje_part_description_find_byname(eed, part, state, value); \
if (!pd) return RET;
@ -3165,6 +3168,16 @@ edje_edit_state_color3_get(Evas_Object *obj, const char *part, const char *state
GET_PD_OR_RETURN();
if ((rp->part->type != EDJE_PART_TYPE_TEXT) &&
(rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
{
if (r) *r = 0;
if (g) *g = 0;
if (b) *b = 0;
if (a) *a = 0;
return;
}
txt = (Edje_Part_Description_Text*) pd;
if (r) *r = txt->text.color3.r;
@ -3180,6 +3193,10 @@ edje_edit_state_color3_set(Evas_Object *obj, const char *part, const char *state
GET_PD_OR_RETURN();
if ((rp->part->type != EDJE_PART_TYPE_TEXT) &&
(rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
return;
txt = (Edje_Part_Description_Text*) pd;
if (r > -1 && r < 256) txt->text.color3.r = r;
@ -3236,6 +3253,9 @@ FUNC_STATE_DOUBLE(aspect, max);
Edje_Part_Description_Image *img; \
\
GET_PD_OR_RETURN(0); \
\
if (rp->part->type != EDJE_PART_TYPE_IMAGE) \
return 0; \
\
img = (Edje_Part_Description_Image*) pd; \
\
@ -3247,6 +3267,9 @@ FUNC_STATE_DOUBLE(aspect, max);
Edje_Part_Description_Image *img; \
\
GET_PD_OR_RETURN(); \
\
if (rp->part->type != EDJE_PART_TYPE_IMAGE) \
return; \
\
img = (Edje_Part_Description_Image*) pd; \
\
@ -3261,6 +3284,9 @@ FUNC_STATE_DOUBLE(aspect, max);
Edje_Part_Description_Image *img; \
\
GET_PD_OR_RETURN(0); \
\
if (rp->part->type != EDJE_PART_TYPE_IMAGE) \
return 0; \
\
img = (Edje_Part_Description_Image*) pd; \
\
@ -3272,6 +3298,9 @@ FUNC_STATE_DOUBLE(aspect, max);
Edje_Part_Description_Image *img; \
\
GET_PD_OR_RETURN(); \
\
if (rp->part->type != EDJE_PART_TYPE_IMAGE) \
return; \
\
img = (Edje_Part_Description_Image*) pd; \
\
@ -3349,6 +3378,9 @@ edje_edit_state_external_params_list_get(Evas_Object *obj, const char *part, con
GET_PD_OR_RETURN(NULL);
if (rp->part->type != EDJE_PART_TYPE_EXTERNAL)
return NULL;
external = (Edje_Part_Description_External *) pd;
return external->external_params;
@ -3363,6 +3395,9 @@ edje_edit_state_external_param_get(Evas_Object *obj, const char *part, const cha
GET_PD_OR_RETURN(EINA_FALSE);
if (rp->part->type != EDJE_PART_TYPE_EXTERNAL)
return EINA_FALSE;
external = (Edje_Part_Description_External *) pd;
EINA_LIST_FOREACH(external->external_params, l, p)
@ -3401,6 +3436,12 @@ edje_edit_state_external_param_int_get(Evas_Object *obj, const char *part, const
GET_PD_OR_RETURN(EINA_FALSE);
if (rp->part->type != EDJE_PART_TYPE_EXTERNAL)
{
if (val) *val = 0;
return EINA_FALSE;
}
external = (Edje_Part_Description_External *) pd;
EINA_LIST_FOREACH(external->external_params, l, p)
@ -3425,6 +3466,12 @@ edje_edit_state_external_param_bool_get(Evas_Object *obj, const char *part, cons
GET_PD_OR_RETURN(EINA_FALSE);
if (rp->part->type != EDJE_PART_TYPE_EXTERNAL)
{
if (val) *val = 0;
return EINA_FALSE;
}
external = (Edje_Part_Description_External *) pd;
EINA_LIST_FOREACH(external->external_params, l, p)
@ -3449,6 +3496,12 @@ edje_edit_state_external_param_double_get(Evas_Object *obj, const char *part, co
GET_PD_OR_RETURN(EINA_FALSE);
if (rp->part->type != EDJE_PART_TYPE_EXTERNAL)
{
if (val) *val = 0;
return EINA_FALSE;
}
external = (Edje_Part_Description_External *) pd;
EINA_LIST_FOREACH(external->external_params, l, p)
@ -3473,6 +3526,12 @@ edje_edit_state_external_param_string_get(Evas_Object *obj, const char *part, co
GET_PD_OR_RETURN(EINA_FALSE);
if (rp->part->type != EDJE_PART_TYPE_EXTERNAL)
{
if (val) *val = NULL;
return EINA_FALSE;
}
external = (Edje_Part_Description_External *) pd;
EINA_LIST_FOREACH(external->external_params, l, p)
@ -3497,6 +3556,12 @@ edje_edit_state_external_param_choice_get(Evas_Object *obj, const char *part, co
GET_PD_OR_RETURN(EINA_FALSE);
if (rp->part->type != EDJE_PART_TYPE_EXTERNAL)
{
if (val) *val = NULL;
return EINA_FALSE;
}
external = (Edje_Part_Description_External *) pd;
EINA_LIST_FOREACH(external->external_params, l, p)
@ -3530,14 +3595,14 @@ edje_edit_state_external_param_set(Evas_Object *obj, const char *part, const cha
Eina_List *l;
Edje_Part_Description_External *external;
Edje_External_Param *p = NULL, old_p = { 0, 0, 0, 0, 0 };
Edje_Real_Part *rp;
int found = 0;
GET_PD_OR_RETURN(EINA_FALSE);
external = (Edje_Part_Description_External *) pd;
if (rp->part->type != EDJE_PART_TYPE_EXTERNAL)
return EINA_FALSE;
rp = _edje_real_part_get(ed, part);
external = (Edje_Part_Description_External *) pd;
va_start(ap, type);
@ -3664,6 +3729,10 @@ edje_edit_state_text_get(Evas_Object *obj, const char *part, const char *state,
GET_PD_OR_RETURN(NULL);
if ((rp->part->type != EDJE_PART_TYPE_TEXT) &&
(rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
return NULL;
txt = (Edje_Part_Description_Text *) pd;
//printf("GET TEXT of state: %s\n", state);
@ -3684,6 +3753,10 @@ edje_edit_state_text_set(Evas_Object *obj, const char *part, const char *state,
if (!text) return;
if ((rp->part->type != EDJE_PART_TYPE_TEXT) &&
(rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
return;
txt = (Edje_Part_Description_Text *) pd;
_edje_if_string_free(ed, txt->text.text);
@ -3699,6 +3772,10 @@ edje_edit_state_text_size_get(Evas_Object *obj, const char *part, const char *st
GET_PD_OR_RETURN(-1);
if ((rp->part->type != EDJE_PART_TYPE_TEXT) &&
(rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
return -1;
txt = (Edje_Part_Description_Text *) pd;
//printf("GET TEXT_SIZE of state: %s [%d]\n", state, pd->text.size);
return txt->text.size;
@ -3715,6 +3792,10 @@ edje_edit_state_text_size_set(Evas_Object *obj, const char *part, const char *st
if (size < 0) return;
if ((rp->part->type != EDJE_PART_TYPE_TEXT) &&
(rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
return;
txt = (Edje_Part_Description_Text *) pd;
txt->text.size = size;
@ -3730,6 +3811,10 @@ edje_edit_state_text_size_set(Evas_Object *obj, const char *part, const char *st
\
GET_PD_OR_RETURN(0); \
\
if ((rp->part->type != EDJE_PART_TYPE_TEXT) && \
(rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) \
return 0; \
\
txt = (Edje_Part_Description_Text *) pd; \
return TO_DOUBLE(txt->text.Value); \
} \
@ -3740,6 +3825,10 @@ edje_edit_state_text_size_set(Evas_Object *obj, const char *part, const char *st
\
GET_PD_OR_RETURN(); \
\
if ((rp->part->type != EDJE_PART_TYPE_TEXT) && \
(rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) \
return; \
\
txt = (Edje_Part_Description_Text *) pd; \
txt->text.Value = FROM_DOUBLE(v); \
edje_object_calc_force(obj); \
@ -3756,6 +3845,10 @@ FUNC_TEXT_DOUBLE(elipsis, elipsis);
Edje_Part_Description_Text *txt; \
\
GET_PD_OR_RETURN(EINA_FALSE); \
\
if ((rp->part->type != EDJE_PART_TYPE_TEXT) && \
(rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) \
return EINA_FALSE; \
\
txt = (Edje_Part_Description_Text *) pd; \
return txt->text.fit_##Value; \
@ -3766,6 +3859,10 @@ FUNC_TEXT_DOUBLE(elipsis, elipsis);
Edje_Part_Description_Text *txt; \
\
GET_PD_OR_RETURN(); \
\
if ((rp->part->type != EDJE_PART_TYPE_TEXT) && \
(rp->part->type != EDJE_PART_TYPE_TEXTBLOCK)) \
return; \
\
txt = (Edje_Part_Description_Text *) pd; \
txt->text.fit_##Value = fit ? 1 : 0; \
@ -3909,7 +4006,10 @@ edje_edit_state_font_get(Evas_Object *obj, const char *part, const char *state,
GET_PD_OR_RETURN(NULL);
//printf("GET FONT of state: %s [%s]\n", state, pd->text.font);
if ((rp->part->type != EDJE_PART_TYPE_TEXT) &&
(rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
return NULL;
txt = (Edje_Part_Description_Text*) pd;
if (!txt->text.font) return NULL;
@ -3923,7 +4023,10 @@ edje_edit_state_font_set(Evas_Object *obj, const char *part, const char *state,
GET_PD_OR_RETURN();
//printf("SET FONT of state: %s [%s]\n", state, font);
if ((rp->part->type != EDJE_PART_TYPE_TEXT) &&
(rp->part->type != EDJE_PART_TYPE_TEXTBLOCK))
return;
txt = (Edje_Part_Description_Text*) pd;
_edje_if_string_free(ed, txt->text.font);
@ -4221,6 +4324,9 @@ edje_edit_state_image_get(Evas_Object *obj, const char *part, const char *state,
GET_PD_OR_RETURN(NULL);
if (rp->part->type != EDJE_PART_TYPE_IMAGE)
return NULL;
img = (Edje_Part_Description_Image *) pd;
image = (char *)_edje_image_name_find(obj, img->image.id);
@ -4240,6 +4346,9 @@ edje_edit_state_image_set(Evas_Object *obj, const char *part, const char *state,
if (!image) return;
if (rp->part->type != EDJE_PART_TYPE_IMAGE)
return;
id = _edje_image_id_find(obj, image);
//printf("SET IMAGE for %s [%s]\n", state, image);
@ -4260,7 +4369,8 @@ edje_edit_state_tweens_list_get(Evas_Object *obj, const char *part, const char *
GET_PD_OR_RETURN(NULL);
//printf("GET TWEEN LIST for %s\n", state);
if (rp->part->type != EDJE_PART_TYPE_IMAGE)
return NULL;
img = (Edje_Part_Description_Image *) pd;
@ -4284,6 +4394,9 @@ edje_edit_state_tween_add(Evas_Object *obj, const char *part, const char *state,
GET_PD_OR_RETURN(EINA_FALSE);
if (rp->part->type != EDJE_PART_TYPE_IMAGE)
return EINA_FALSE;
id = _edje_image_id_find(obj, tween);
if (id < EINA_FALSE) return 0;
@ -4318,6 +4431,9 @@ edje_edit_state_tween_del(Evas_Object *obj, const char *part, const char *state,
GET_PD_OR_RETURN(EINA_FALSE);
if (rp->part->type != EDJE_PART_TYPE_IMAGE)
return EINA_FALSE;
img = (Edje_Part_Description_Image *) pd;
if (!img->image.tweens_count) return EINA_FALSE;
@ -4347,6 +4463,15 @@ edje_edit_state_image_border_get(Evas_Object *obj, const char *part, const char
GET_PD_OR_RETURN();
if (rp->part->type != EDJE_PART_TYPE_IMAGE)
{
if (l) *l = 0;
if (r) *r = 0;
if (t) *t = 0;
if (b) *b = 0;
return;
}
img = (Edje_Part_Description_Image *) pd;
//printf("GET IMAGE_BORDER of state '%s'\n", state);
@ -4364,6 +4489,9 @@ edje_edit_state_image_border_set(Evas_Object *obj, const char *part, const char
GET_PD_OR_RETURN();
if (rp->part->type != EDJE_PART_TYPE_IMAGE)
return;
img = (Edje_Part_Description_Image *) pd;
//printf("SET IMAGE_BORDER of state '%s'\n", state);
@ -4383,6 +4511,9 @@ edje_edit_state_image_border_fill_get(Evas_Object *obj, const char *part, const
GET_PD_OR_RETURN(0);
if (rp->part->type != EDJE_PART_TYPE_IMAGE)
return 0;
img = (Edje_Part_Description_Image *) pd;
if (img->image.border.no_fill == 0) return 1;
@ -4398,6 +4529,9 @@ edje_edit_state_image_border_fill_set(Evas_Object *obj, const char *part, const
GET_PD_OR_RETURN();
if (rp->part->type != EDJE_PART_TYPE_IMAGE)
return;
img = (Edje_Part_Description_Image *) pd;
if (fill == 0) img->image.border.no_fill = 1;
@ -5408,14 +5542,10 @@ static Eina_Bool
_edje_generate_source_of_state(Evas_Object *obj, const char *part, const char *state, double value, Eina_Strbuf *buf)
{
Eina_List *l, *ll;
Edje_Real_Part *rp;
Eina_Bool ret = EINA_TRUE;
GET_PD_OR_RETURN(EINA_FALSE);
rp = _edje_real_part_get(ed, part);
if (!rp) return EINA_FALSE;
BUF_APPENDF(I4"description { state: \"%s\" %g;\n", pd->state.name, pd->state.value);
//TODO Support inherit