edje: add group inheritance.

Patch by Jaehwan Kim <jae.hwan.kim@samsung.com>


SVN revision: 63648
This commit is contained in:
Cedric BAIL 2011-09-29 01:29:21 +00:00
parent 3adea31a4a
commit db4c82bc46
6 changed files with 1193 additions and 1150 deletions

View File

@ -16,3 +16,4 @@ Tom Hacohen <tom@stosb.com>
Aharon Hillel <a.hillel@partner.samsung.com>
Shilpa Singh <shilpa.singh@samsung.com> <shilpasingh.o@gmail.com>
Mike Blumenkrantz <mike@zentific.com
Jaehwan Kim <jae.hwan.kim@samsung.com>

View File

@ -158,3 +158,7 @@
* Add entry input panel layout setting api's
2011-08-29 Jaehwan Kim
* Add group's inheritance.
* Add insert_before, insert_after to can change the part's order.

View File

@ -221,6 +221,7 @@ main(int argc, char **argv)
data_setup();
compile();
reorder_parts();
data_process_scripts();
data_process_lookups();
data_process_script_lookups();

View File

@ -43,6 +43,10 @@ typedef struct _Code_Program Code_Program;
typedef struct _SrcFile SrcFile;
typedef struct _SrcFile_List SrcFile_List;
typedef struct _Edje_Program_Parser Edje_Program_Parser;
typedef struct _Edje_Pack_Element_Parser Edje_Pack_Element_Parser;
typedef struct _Edje_Part_Parser Edje_Part_Parser;
struct _New_Object_Handler
{
const char *type;
@ -104,13 +108,44 @@ struct _SrcFile_List
Eina_List *list;
};
struct _Edje_Program_Parser
{
Edje_Program common;
Eina_Bool can_override;
};
struct _Edje_Pack_Element_Parser
{
Edje_Pack_Element common;
Eina_Bool can_override;
};
struct _Edje_Part_Parser
{
Edje_Part common;
struct {
Eina_Bool done;
const char *insert_before; /* the part name for insertion in front of */
const char *insert_after; /* the part name for insertion behind of */
Edje_Part_Parser *before;
Edje_Part_Parser *after;
int linked_prev; /* the number linked previous part for reorder */
int linked_next; /* the number linked next part for reorder */
} reorder;
Eina_Bool can_override;
};
/* global fn calls */
void data_setup(void);
void data_write(void);
void data_queue_part_lookup(Edje_Part_Collection *pc, const char *name, int *dest);
void data_queue_copied_part_lookup(Edje_Part_Collection *pc, int *src, int *dest);
void data_queue_program_lookup(Edje_Part_Collection *pc, const char *name, int *dest);
void data_queue_copied_program_lookup(Edje_Part_Collection *pc, int *src, int *dest);
void data_queue_anonymous_lookup(Edje_Part_Collection *pc, Edje_Program *ep, int *dest);
void data_queue_copied_anonymous_lookup(Edje_Part_Collection *pc, int *src, int *dest);
void data_queue_image_lookup(char *name, int *dest, Eina_Bool *set);
void data_queue_copied_image_lookup(int *src, int *dest, Eina_Bool *set);
void data_queue_part_slave_lookup(int *master, int *slave);
void data_queue_image_slave_lookup(int *master, int *slave);
void data_queue_spectrum_lookup(char *name, int *dest);
@ -144,6 +179,7 @@ void check_min_arg_count(int n);
int object_handler_num(void);
int statement_handler_num(void);
void reorder_parts(void);
void source_edd(void);
void source_fetch(void);
int source_append(Eet_File *ef);

File diff suppressed because it is too large Load Diff

View File

@ -1132,6 +1132,126 @@ data_write(void)
}
}
void
reorder_parts(void)
{
Edje_Part_Collection *pc;
Edje_Part **parts;
Edje_Part_Parser *ep, *ep2;
Eina_List *l;
/* sanity checks for parts and programs */
EINA_LIST_FOREACH(edje_collections, l, pc)
{
unsigned int i, j, k;
Eina_Bool found = EINA_FALSE;
for (i = 0; i < pc->parts_count; i++)
{
ep = (Edje_Part_Parser *)pc->parts[i];
if (ep->reorder.insert_before && ep->reorder.insert_after)
ERR("%s: Error. Unable to use together insert_before and insert_after in part \"%s\".", progname, pc->parts[i]->name);
if (ep->reorder.done)
{
continue;
}
if (ep->reorder.insert_before || ep->reorder.insert_after)
{
found = EINA_FALSE;
for (j = 0; j < pc->parts_count; j++)
{
if (ep->reorder.insert_before &&
!strcmp(ep->reorder.insert_before, pc->parts[j]->name))
{
ep2 = (Edje_Part_Parser *)pc->parts[j];
if (ep2->reorder.after)
ERR("%s: Error. The part \"%s\" is ambiguous ordered part.", progname, pc->parts[i]->name);
if (ep2->reorder.linked_prev)
ERR("%s: Error. Unable to insert two or more parts in same part \"%s\".", progname, pc->parts[j]->name);
k = j - 1;
found = EINA_TRUE;
ep2->reorder.linked_prev += ep->reorder.linked_prev + 1;
ep->reorder.before = (Edje_Part_Parser *)pc->parts[j];
while (ep2->reorder.before)
{
ep2->reorder.before->reorder.linked_prev = ep2->reorder.linked_prev + 1;
ep2 = ep2->reorder.before;
}
break;
}
else if (ep->reorder.insert_after &&
!strcmp(ep->reorder.insert_after, pc->parts[j]->name))
{
ep2 = (Edje_Part_Parser *)pc->parts[j];
if (ep2->reorder.before)
ERR("%s: Error. The part \"%s\" is ambiguous ordered part.", progname, pc->parts[i]->name);
if (ep2->reorder.linked_next)
ERR("%s: Error. Unable to insert two or more parts in same part \"%s\".", progname, pc->parts[j]->name);
k = j;
found = EINA_TRUE;
ep2->reorder.linked_next += ep->reorder.linked_next + 1;
ep->reorder.after = (Edje_Part_Parser *)pc->parts[j];
while (ep2->reorder.after)
{
ep2->reorder.after->reorder.linked_next = ep2->reorder.linked_next + 1;
ep2 = ep2->reorder.after;
}
break;
}
}
if (found)
{
unsigned int amount, linked;
if (((i > k) && ((i - ep->reorder.linked_prev) <= k))
|| ((i < k) && ((i + ep->reorder.linked_next) >= k)))
ERR("%s: Error. The part order is wrong. It has circular dependency.",
progname);
amount = ep->reorder.linked_prev + ep->reorder.linked_next + 1;
linked = i - ep->reorder.linked_prev;
parts = malloc(amount * sizeof(Edje_Part));
for (j = 0 ; j < amount ; j++)
{
parts[j] = pc->parts[linked];
linked++;
}
if (i > k)
{
for (j = i - ep->reorder.linked_prev - 1 ; j >= k ; j--)
{
pc->parts[j + amount] = pc->parts[j];
pc->parts[j + amount]->id = j + amount;
}
for (j = 0 ; j < amount ; j++)
{
pc->parts[j + k] = parts[j];
pc->parts[j + k]->id = j + k;
}
}
else if (i < k)
{
for (j = i + ep->reorder.linked_next + 1 ; j <= k ; j++)
{
pc->parts[j - amount] = pc->parts[j];
pc->parts[j - amount]->id = j - amount;
}
for (j = 0 ; j < amount ; j++)
{
pc->parts[j + k - amount + 1] = parts[j];
pc->parts[j + k - amount + 1]->id = j + k - amount + 1;
}
i -= amount;
}
ep->reorder.done = EINA_TRUE;
free(parts);
}
}
}
}
}
void
data_queue_group_lookup(char *name)
{
@ -1145,8 +1265,19 @@ data_queue_group_lookup(char *name)
void
data_queue_part_lookup(Edje_Part_Collection *pc, const char *name, int *dest)
{
Eina_List *l;
Part_Lookup *pl;
EINA_LIST_FOREACH(part_lookups, l, pl)
{
if ((pl->pc == pc) && (pl->dest == dest))
{
free(pl->name);
pl->name = mem_strdup(name);
return;
}
}
pl = mem_alloc(SZ(Part_Lookup));
part_lookups = eina_list_append(part_lookups, pl);
pl->pc = pc;
@ -1154,19 +1285,99 @@ data_queue_part_lookup(Edje_Part_Collection *pc, const char *name, int *dest)
pl->dest = dest;
}
void
data_queue_copied_part_lookup(Edje_Part_Collection *pc, int *src, int *dest)
{
Eina_List *l;
Part_Lookup *pl;
EINA_LIST_FOREACH(part_lookups, l, pl)
{
if (pl->dest == src)
data_queue_part_lookup(pc, pl->name, dest);
}
}
void
data_queue_anonymous_lookup(Edje_Part_Collection *pc, Edje_Program *ep, int *dest)
{
Eina_List *l, *l2;
Program_Lookup *pl;
if (!ep) return ; /* FIXME: should we stop compiling ? */
pl = mem_alloc(SZ(Program_Lookup));
program_lookups = eina_list_append(program_lookups, pl);
pl->pc = pc;
pl->u.ep = ep;
pl->dest = dest;
pl->anonymous = EINA_TRUE;
EINA_LIST_FOREACH(program_lookups, l, pl)
{
if (pl->u.ep == ep)
{
Code *cd;
Code_Program *cp;
cd = eina_list_data_get(eina_list_last(codes));
EINA_LIST_FOREACH(cd->programs, l2, cp)
{
if (&(cp->id) == pl->dest)
{
cd->programs = eina_list_remove(cd->programs, cp);
free(cp);
cp = NULL;
}
}
program_lookups = eina_list_remove(program_lookups, pl);
free(pl);
}
}
if (dest)
{
pl = mem_alloc(SZ(Program_Lookup));
program_lookups = eina_list_append(program_lookups, pl);
pl->pc = pc;
pl->u.ep = ep;
pl->dest = dest;
pl->anonymous = EINA_TRUE;
}
}
void
data_queue_copied_anonymous_lookup(Edje_Part_Collection *pc, int *src, int *dest)
{
Eina_List *l;
Program_Lookup *pl;
unsigned int i;
EINA_LIST_FOREACH(program_lookups, l, pl)
{
if (pl->dest == src)
{
for (i = 0 ; i < pc->programs.fnmatch_count ; i++)
{
if (!strcmp(pl->u.ep->name, pc->programs.fnmatch[i]->name))
data_queue_anonymous_lookup(pc, pc->programs.fnmatch[i], dest);
}
for (i = 0 ; i < pc->programs.strcmp_count ; i++)
{
if (!strcmp(pl->u.ep->name, pc->programs.strcmp[i]->name))
data_queue_anonymous_lookup(pc, pc->programs.strcmp[i], dest);
}
for (i = 0 ; i < pc->programs.strncmp_count ; i++)
{
if (!strcmp(pl->u.ep->name, pc->programs.strncmp[i]->name))
data_queue_anonymous_lookup(pc, pc->programs.strncmp[i], dest);
}
for (i = 0 ; i < pc->programs.strrncmp_count ; i++)
{
if (!strcmp(pl->u.ep->name, pc->programs.strrncmp[i]->name))
data_queue_anonymous_lookup(pc, pc->programs.strrncmp[i], dest);
}
for (i = 0 ; i < pc->programs.nocmp_count ; i++)
{
if (!strcmp(pl->u.ep->name, pc->programs.nocmp[i]->name))
data_queue_anonymous_lookup(pc, pc->programs.nocmp[i], dest);
}
}
}
}
void
@ -1184,6 +1395,19 @@ data_queue_program_lookup(Edje_Part_Collection *pc, const char *name, int *dest)
pl->anonymous = EINA_FALSE;
}
void
data_queue_copied_program_lookup(Edje_Part_Collection *pc, int *src, int *dest)
{
Eina_List *l;
Program_Lookup *pl;
EINA_LIST_FOREACH(program_lookups, l, pl)
{
if (pl->dest == src)
data_queue_program_lookup(pc, pl->u.name, dest);
}
}
void
data_queue_image_lookup(char *name, int *dest, Eina_Bool *set)
{
@ -1196,6 +1420,18 @@ data_queue_image_lookup(char *name, int *dest, Eina_Bool *set)
il->set = set;
}
void
data_queue_copied_image_lookup(int *src, int *dest, Eina_Bool *set)
{
Eina_List *l;
Image_Lookup *il;
EINA_LIST_FOREACH(image_lookups, l, il)
{
if (il->dest == src)
data_queue_image_lookup(il->name, dest, set);
}
}
void
data_queue_part_slave_lookup(int *master, int *slave)
{