++ multi file editing feature implementation.

This commit is contained in:
Hermet Park 2016-07-01 23:59:17 +09:00
parent 731d0bed5b
commit e93ab43319
11 changed files with 157 additions and 91 deletions

View File

@ -73,19 +73,51 @@ gl_clicked_double_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
return;
}
// Open a double clicked edc file.
/* Open a double clicked edc file. */
//skip non edc file.
if (!eina_str_has_extension(file->path, "edc")) return;
int selected_file_len = strlen(file->path);
//Let's check if the file is already opened or not.
Enventor_Item *eit;
const char *it_file_path;
//Case 1. main file.
//FIXME: Probably file browser item may have boolean info for a collection
//data. and just check it is enough.
eit = enventor_object_main_item_get(base_enventor_get());
if (!eit)
{
EINA_LOG_ERR("No main item??");
return;
}
it_file_path = enventor_item_file_get(eit);
if (!it_file_path)
{
EINA_LOG_ERR("No main item file path??");
return;
}
//Ok, This selected file is already openend, let's activate the item.
if (strlen(file->name) == strlen(it_file_path) &&
!strcmp(file->name, it_file_path))
{
facade_it_select(eit);
return;
}
//Case 2. sub files.
Eina_List *sub_items =
(Eina_List *)enventor_object_sub_items_get(base_enventor_get());
Eina_List *l;
Enventor_Item *eit;
EINA_LIST_FOREACH(sub_items, l, eit)
{
const char *it_file_path = enventor_item_file_get(eit);
if (!it_file_path) continue;
//Let's check if the file is already opened.
if (selected_file_len != strlen(it_file_path)) continue;
//Ok, This selected file is already openend, let's activate the item.

View File

@ -26,7 +26,7 @@ void facade_it_select(Enventor_Item *it)
Enventor_Item *facade_sub_file_add(const char *path)
{
Enventor_Item *it = enventor_object_sub_file_add(base_enventor_get(), path);
Enventor_Item *it = enventor_object_sub_item_add(base_enventor_get(), path);
EINA_SAFETY_ON_NULL_RETURN_VAL(it, NULL);
file_tab_it_add(it);
@ -39,7 +39,7 @@ Enventor_Item *facade_sub_file_add(const char *path)
Enventor_Item *facade_main_file_set(const char *path)
{
Enventor_Item *it = enventor_object_main_file_set(base_enventor_get(), path);
Enventor_Item *it = enventor_object_main_item_set(base_enventor_get(), path);
EINA_SAFETY_ON_NULL_RETURN_VAL(it, NULL);
file_tab_clear();

View File

@ -230,7 +230,7 @@ Eina_Bool
goto_close(void)
{
goto_data *gd = g_gd;
EINA_SAFETY_ON_NULL_RETURN_VAL(gd, EINA_FALSE);
if (!gd) return EINA_FALSE;
//Save last state
evas_object_geometry_get(gd->win, NULL, NULL, &win_w, &win_h);

View File

@ -455,7 +455,7 @@ Eina_Bool
search_close(void)
{
search_data *sd = g_sd;
EINA_SAFETY_ON_NULL_RETURN_VAL(sd, EINA_FALSE);
if (!sd) return EINA_FALSE;
Enventor_Object *enventor = base_enventor_get();

View File

@ -265,7 +265,6 @@ Eina_Bool
setting_is_opened(void)
{
setting_data *sd = g_sd;
EINA_SAFETY_ON_NULL_RETURN_VAL(sd, EINA_FALSE);
if (!sd) return EINA_FALSE;
return EINA_TRUE;
}

View File

@ -3,8 +3,9 @@ typedef struct _Enventor_Item_Data Enventor_Item;
EAPI Evas_Object *enventor_object_add(Evas_Object *parent);
//FIXME: Should be eofied.
EAPI Enventor_Item *enventor_object_main_file_set(Evas_Object *obj, const char *file);
EAPI Enventor_Item *enventor_object_sub_file_add(Evas_Object *obj, const char *file);
EAPI Enventor_Item *enventor_object_main_item_set(Evas_Object *obj, const char *file);
EAPI Enventor_Item *enventor_object_sub_item_add(Evas_Object *obj, const char *file);
EAPI Enventor_Item *enventor_object_main_item_get(const Evas_Object *obj);
EAPI const Eina_List *enventor_object_sub_items_get(const Evas_Object *obj);
EAPI Evas_Object *enventor_item_editor_get(const Enventor_Item *it);
EAPI const char *enventor_item_file_get(const Enventor_Item *it);

View File

@ -62,6 +62,7 @@ struct editor_s
Eina_Bool ctrl_pressed : 1;
Eina_Bool on_select_recover : 1;
Eina_Bool on_save : 1;
Eina_Bool main : 1;
};
/*****************************************************************************/
@ -755,8 +756,9 @@ edit_cursor_double_clicked_cb(void *data, Evas_Object *obj,
}
static void
cur_name_get_cb(void *data, Eina_Stringshare *state_name, double state_value,
Eina_Stringshare *part_name, Eina_Stringshare *group_name)
cur_context_name_get_cb(void *data, Eina_Stringshare *state_name,
double state_value, Eina_Stringshare *part_name,
Eina_Stringshare *group_name)
{
edit_data *ed = data;
@ -1257,7 +1259,8 @@ edit_syntax_color_partial_apply(edit_data *ed, double interval)
void
edit_view_sync(edit_data *ed)
{
parser_cur_state_get(ed->pd, ed->en_edit, cur_name_get_cb, ed);
parser_cur_context_get(ed->pd, ed->en_edit, cur_context_name_get_cb, ed,
ed->main);
}
void
@ -1333,7 +1336,7 @@ edit_cur_indent_depth_get(edit_data *ed)
}
edit_data *
edit_init(Enventor_Object *enventor)
edit_init(Enventor_Object *enventor, Eina_Bool main)
{
edit_data *ed = calloc(1, sizeof(edit_data));
if (!ed)
@ -1509,13 +1512,13 @@ edit_cur_paragh_get(edit_data *ed)
Eina_Stringshare *
edit_cur_prog_name_get(edit_data *ed)
{
return parser_cur_name_fast_get(ed->en_edit, "program");
return parser_cur_context_fast_get(ed->en_edit, "program");
}
Eina_Stringshare *
edit_cur_part_name_get(edit_data *ed)
{
return parser_cur_name_fast_get(ed->en_edit, "part");
return parser_cur_context_fast_get(ed->en_edit, "part");
}
int

View File

@ -31,7 +31,7 @@ typedef struct parser_attr_s
attr_value value;
} parser_attr;
typedef struct cur_name_thread_data_s
typedef struct cur_context_thread_data_s
{
Ecore_Thread *thread;
char *utf8;
@ -44,7 +44,8 @@ typedef struct cur_name_thread_data_s
Eina_Stringshare *part_name, Eina_Stringshare *group_name);
void *cb_data;
parser_data *pd;
} cur_name_td;
Eina_Bool collections: 1; //It contains collections?
} cur_context_td;
typedef struct type_init_thread_data_s
{
@ -69,7 +70,7 @@ typedef struct bracket_thread_data_s
struct parser_s
{
Eina_Inarray *attrs;
cur_name_td *cntd;
cur_context_td *cntd;
type_init_td *titd;
bracket_td *btd;
Eina_List *macro_list;
@ -300,15 +301,20 @@ macro_list_free(Eina_List *macro_list)
}
static void
cur_state_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED)
cur_context_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED)
{
#define PART_SYNTAX_CNT 14
const char *GROUP = "group";
const int GROUP_LEN = 5;
const char *PARTS = "parts";
const int PARTS_LEN = 5;
const char *PART[PART_SYNTAX_CNT] = { "part", "image", "textblock",
"swallow", "rect", "group", "spacer", "proxy", "text", "gradient",
"box", "table", "external", "vector" };
const int PART_LEN[PART_SYNTAX_CNT] =
{ 4, 5, 9, 6, 4, 5, 6, 5, 4, 8, 3, 5, 8, 6};
const char *DESC[2] = { "desc", "description" };
const int DESC_LEN[2] = { 4, 11 };
const char *STATE = "state";
@ -316,14 +322,14 @@ cur_state_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED)
const int DEF_STATE_LEN = 7;
cur_name_td *td = data;
cur_context_td *td = data;
char *utf8 = td->utf8;
int cur_pos = td->cur_pos;
char *p = utf8;
char *end = utf8 + cur_pos;
int i;
Eina_Bool inside_parts = EINA_FALSE;
Eina_Bool collections = td->collections;
int bracket = 0;
const char *group_name = NULL;
@ -392,17 +398,29 @@ cur_state_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED)
bracket--;
p++;
if (bracket == 1) group_name = NULL;
else if (bracket == 2 && inside_parts == EINA_TRUE) inside_parts = EINA_FALSE;
else if (bracket == 3) part_name = NULL;
else if (bracket == 4) desc_name = NULL;
if (collections)
{
if (bracket == 1) group_name = NULL;
else if (bracket == 2 && inside_parts == EINA_TRUE)
inside_parts = EINA_FALSE;
else if (bracket == 3) part_name = NULL;
else if (bracket == 4) desc_name = NULL;
}
else
{
if (bracket == 0) group_name = NULL;
else if (bracket == 1 && inside_parts == EINA_TRUE)
inside_parts = EINA_FALSE;
else if (bracket == 2) part_name = NULL;
else if (bracket == 3) desc_name = NULL;
}
continue;
}
//check block "Parts" in
if (bracket == 2)
if ((collections && (bracket == 2)) ||
(!collections && (bracket == 1)))
{
if (!strncmp(p, PARTS, strlen(PARTS)))
if (!strncmp(p, PARTS, PARTS_LEN))
{
inside_parts = EINA_TRUE;
p = strstr(p, "{");
@ -411,16 +429,14 @@ cur_state_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED)
}
}
//Check Part in
if (bracket == 3 && inside_parts == EINA_TRUE)
if ((collections && (bracket == 3)) ||
(!collections && (bracket == 2)))
{
int part_idx = -1;
int part_len;
//part ? image ? swallow ? text ? rect ?
for (i = 0; i < PART_SYNTAX_CNT; i++)
{
part_len = strlen(PART[i]);
if (!strncmp(p, PART[i], part_len))
if (!strncmp(p, PART[i], PART_LEN[i]))
{
part_idx = i;
break;
@ -430,7 +446,7 @@ cur_state_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED)
//we got a part!
if (part_idx != -1)
{
p += part_len;
p += PART_LEN[part_idx];
char *name_begin = strstr(p, QUOT_UTF8);
if (!name_begin) goto end;
name_begin += QUOT_UTF8_LEN;
@ -445,7 +461,8 @@ cur_state_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED)
}
}
//Check Description in
if (bracket == 4)
if ((collections && (bracket == 4)) ||
(!collections && (bracket == 3)))
{
//description? or desc?
int desc_idx = -1;
@ -455,25 +472,37 @@ cur_state_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED)
//we got a description!
if (desc_idx != -1)
{
desc_name = DEF_STATE_NAME; /* By default state will be */
desc_name_len = DEF_STATE_LEN; /* recognized as "default" 0.0*/
/* By default state will be */
desc_name = DEF_STATE_NAME;
/* recognized as "default" 0.0*/
desc_name_len = DEF_STATE_LEN;
value_convert = 0;
p += DESC_LEN[desc_idx]; /* skip keyword */
/* skip keyword */
p += DESC_LEN[desc_idx];
p = strstr(p, "{");
if (!p) goto end;
char *end_brace = strstr(p, "}"); /*Limit size of text for processing*/
/*Limit size of text for processing*/
char *end_brace = strstr(p, "}");
if (!end_brace)
goto end;
/* proccessing for "description" keyword with "state" attribute */
/* proccessing for "description" keyword with "state"
attribute */
if (desc_idx == 1)
{
char *state = strstr(p, STATE);
if (!state || state > end_brace) /* if name of state didn't find, */
continue; /* description will recognized as default 0.0*/
/* if name of state didn't find, */
if (!state || state > end_brace)
{
/* description will recognized as default 0.0*/
continue;
}
else
p += 5; /*5 is strlen("state");*/
{
/*5 is strlen("state");*/
p += 5;
}
}
char *name_begin = strstr(p, QUOT_UTF8);
@ -482,15 +511,16 @@ cur_state_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED)
char *end_range = strstr(p, ";");
if (!end_range) goto end;
if ((name_begin > end_brace) || /* if string placed outside desc block*/
(name_begin > end_range) ||
/* if string placed outside desc block*/
if ((name_begin > end_brace) || (name_begin > end_range) ||
(end_range > end_brace))
continue;
continue;
/* Exception cases like: desc {image.normal: "img";} */
int alpha_present = 0;
char *string_itr;
for (string_itr = name_begin; (string_itr > p) && (!alpha_present); string_itr--)
for (string_itr = name_begin;
(string_itr > p) && (!alpha_present); string_itr--)
alpha_present = isalpha((int)*string_itr);
if (alpha_present && desc_idx == 0)
@ -529,11 +559,12 @@ cur_state_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED)
}
}
//Check Group in. Probably inside of collections or the most outside.
if (bracket < 2)
if ((collections && (bracket == 1)) ||
(!collections && (bracket == 0)))
{
if (!strncmp(p, GROUP, strlen(GROUP)))
if (!strncmp(p, GROUP, GROUP_LEN))
{
p += strlen(GROUP);
p += GROUP_LEN;
char *name_end = strstr(p, SEMICOL_UTF8);
if (!name_end) goto end;
@ -568,7 +599,6 @@ cur_state_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED)
}
p++;
}
if (part_name)
part_name = eina_stringshare_add_length(part_name, part_name_len);
if (desc_name)
@ -598,9 +628,9 @@ end:
}
static void
cur_name_thread_end(void *data, Ecore_Thread *thread EINA_UNUSED)
cur_context_thread_end(void *data, Ecore_Thread *thread EINA_UNUSED)
{
cur_name_td *td = data;
cur_context_td *td = data;
td->cb(td->cb_data, td->state_name, td->state_value, td->part_name, td->group_name);
td->pd->cntd = NULL;
eina_stringshare_del(td->state_name);
@ -610,9 +640,9 @@ cur_name_thread_end(void *data, Ecore_Thread *thread EINA_UNUSED)
}
static void
cur_name_thread_cancel(void *data, Ecore_Thread *thread EINA_UNUSED)
cur_context_thread_cancel(void *data, Ecore_Thread *thread EINA_UNUSED)
{
cur_name_td *td = data;
cur_context_td *td = data;
if (td->pd) td->pd->cntd = NULL;
eina_stringshare_del(td->state_name);
eina_stringshare_del(td->part_name);
@ -1290,7 +1320,7 @@ group_beginning_pos_get(const char* source, const char *group_name)
name += quot_len;
pos = strstr(name, quot);
if (!pos) return NULL;
if (!strncmp(name, group_name, strlen(group_name)))
if (!strncmp(name, group_name, 5))
return pos;
pos = strstr(++pos, GROUP_SYNTAX_NAME);
}
@ -1720,7 +1750,7 @@ parser_paragh_name_get(parser_data *pd EINA_UNUSED, Evas_Object *entry)
}
Eina_Stringshare*
parser_cur_name_fast_get(Evas_Object *entry, const char *scope)
parser_cur_context_fast_get(Evas_Object *entry, const char *scope)
{
const char *quot = QUOT_UTF8;
const int quot_len = QUOT_UTF8_LEN;
@ -1794,11 +1824,12 @@ end:
return name;
}
void
parser_cur_state_get(parser_data *pd, Evas_Object *entry,
void (*cb)(void *data, Eina_Stringshare *state_name, double state_value,
Eina_Stringshare *part_name, Eina_Stringshare *group_name), void *data)
parser_cur_context_get(parser_data *pd, Evas_Object *entry,
void (*cb)(void *data, Eina_Stringshare *state_name,
double state_value, Eina_Stringshare *part_name,
Eina_Stringshare *group_name), void *data,
Eina_Bool collections)
{
if (pd->cntd) ecore_thread_cancel(pd->cntd->thread);
@ -1808,7 +1839,7 @@ parser_cur_state_get(parser_data *pd, Evas_Object *entry,
char *utf8 = elm_entry_markup_to_utf8(text);
if (!utf8) return;
cur_name_td *td = calloc(1, sizeof(cur_name_td));
cur_context_td *td = calloc(1, sizeof(cur_context_td));
if (!td)
{
free(utf8);
@ -1822,10 +1853,11 @@ parser_cur_state_get(parser_data *pd, Evas_Object *entry,
td->cur_pos = elm_entry_cursor_pos_get(entry);
td->cb = cb;
td->cb_data = data;
td->collections = collections;
td->thread = ecore_thread_run(cur_state_thread_blocking,
cur_name_thread_end,
cur_name_thread_cancel,
td->thread = ecore_thread_run(cur_context_thread_blocking,
cur_context_thread_end,
cur_context_thread_cancel,
td);
}

View File

@ -705,7 +705,6 @@ view_part_highlight_set(view_data *vd, const char *part_name)
if (vd->idler) vd->part_name = eina_stringshare_add(part_name);
return;
}
if (!part_name)
{
if (vd->part_highlight)

View File

@ -106,8 +106,8 @@ Eina_Bool color_ready(color_data *cd);
parser_data *parser_init(void);
void parser_term(parser_data *pd);
Eina_Stringshare *parser_first_group_name_get(parser_data *pd, Evas_Object *entry);
void parser_cur_state_get(parser_data *pd, Evas_Object *entry, void (*cb)(void *data, Eina_Stringshare *state_name, double state_value, Eina_Stringshare *part_name, Eina_Stringshare *group_name), void *data);
Eina_Stringshare *parser_cur_name_fast_get(Evas_Object *entry, const char *scope);
void parser_cur_context_get(parser_data *pd, Evas_Object *entry, void (*cb)(void *data, Eina_Stringshare *state_name, double state_value, Eina_Stringshare *part_name, Eina_Stringshare *group_name), void *data, Eina_Bool collections);
Eina_Stringshare *parser_cur_context_fast_get(Evas_Object *entry, const char *scope);
Eina_Bool parser_type_name_compare(parser_data *pd, const char *str);
attr_value *parser_attribute_get(parser_data *pd, const char *text, const char *cur, const char *selected);
void parser_attribute_value_set(attr_value *attr, char *cur);
@ -236,7 +236,7 @@ void ctxpopup_img_preview_reload(Evas_Object *ctxpopup, const char *imgpath);
void edit_font_update(edit_data *ed);
Eina_Bool edit_key_down_event_dispatch(edit_data *ed, const char *key);
Eina_Bool edit_key_up_event_dispatch(edit_data *ed, const char *key);
edit_data *edit_init(Enventor_Object *enventor);
edit_data *edit_init(Enventor_Object *enventor, Eina_Bool main);
void edit_term(edit_data *ed);
Evas_Object *edit_obj_get(edit_data *ed);
Eina_Bool edit_changed_get(edit_data *ed);

View File

@ -123,6 +123,7 @@ edit_view_sync_cb(void *data, Eina_Stringshare *state_name, double state_value,
edj_mgr_all_views_reload();
//Switch group!
if (pd->group_name != group_name)
{
view_data *vd = edj_mgr_view_get(group_name);
@ -132,6 +133,8 @@ edit_view_sync_cb(void *data, Eina_Stringshare *state_name, double state_value,
vd = edj_mgr_view_new(group_name);
if (!vd) return;
}
view_dummy_set(vd, pd->dummy_parts);
view_outline_set(vd, pd->outline);
eina_stringshare_del(pd->group_name);
pd->group_name = eina_stringshare_add(group_name);
evas_object_smart_callback_call(pd->obj, SIG_CURSOR_GROUP_CHANGED,
@ -260,7 +263,7 @@ EOLIAN static void
_enventor_object_efl_canvas_group_group_del(Evas_Object *obj EINA_UNUSED, Enventor_Object_Data *pd)
{
eina_stringshare_del(pd->font_name);
eina_stringshare_del(pd->font_style);
eina_stringshare_del(pd->font_style);
eina_stringshare_del(pd->group_name);
autocomp_term();
ecore_event_handler_del(pd->key_down_handler);
@ -413,7 +416,7 @@ _enventor_object_linenumber_set(Eo *obj EINA_UNUSED, Enventor_Object_Data *pd,
if (pd->linenumber == linenumber) return;
//Main Item
edit_linenumber_set(pd->main_it.ed, linenumber);
edit_linenumber_set(pd->focused_it->ed, linenumber);
pd->linenumber = linenumber;
}
@ -950,7 +953,7 @@ enventor_object_add(Enventor_Object *parent)
}
EAPI Enventor_Item *
enventor_object_sub_file_add(Enventor_Object *obj, const char *file)
enventor_object_sub_item_add(Enventor_Object *obj, const char *file)
{
Enventor_Object_Data *pd = eo_data_scope_get(obj, ENVENTOR_OBJECT_CLASS);
@ -970,24 +973,17 @@ enventor_object_sub_file_add(Enventor_Object *obj, const char *file)
pd->sub_its = eina_list_append(pd->sub_its, it);
it->enventor = obj;
it->ed = edit_init(obj);
it->ed = edit_init(obj, EINA_FALSE);
autocomp_target_set(it->ed);
edit_load(it->ed, file);
edit_changed_set(it->ed, EINA_FALSE);
//Update Editor State
if (pd->linenumber != DEFAULT_LINENUMBER)
edit_linenumber_set(it->ed, pd->linenumber);
if (pd->font_scale != DEFAULT_FONT_SCALE)
edit_font_scale_set(it->ed, pd->font_scale);
if (pd->disabled) edit_disabled_set(it->ed, EINA_TRUE);
return it;
}
EAPI Enventor_Item *
enventor_object_main_file_set(Enventor_Object *obj, const char *file)
enventor_object_main_item_set(Enventor_Object *obj, const char *file)
{
Enventor_Object_Data *pd = eo_data_scope_get(obj, ENVENTOR_OBJECT_CLASS);
@ -997,21 +993,20 @@ enventor_object_main_file_set(Enventor_Object *obj, const char *file)
_enventor_main_item_free(pd);
pd->main_it.enventor = obj;
pd->main_it.ed = edit_init(obj);
pd->main_it.ed = edit_init(obj, EINA_TRUE);
edit_view_sync_cb_set(pd->main_it.ed, edit_view_sync_cb, pd);
pd->focused_it = &pd->main_it;
Eina_Bool ret = efl_file_set(obj, file, NULL);
if (!ret) return NULL;
//Update Editor State
if (pd->linenumber != DEFAULT_LINENUMBER)
edit_linenumber_set(pd->main_it.ed, pd->linenumber);
if (pd->font_scale != DEFAULT_FONT_SCALE)
edit_font_scale_set(pd->main_it.ed, pd->font_scale);
if (pd->disabled)
edit_disabled_set(pd->main_it.ed, EINA_TRUE);
return &pd->main_it;
}
EAPI Enventor_Item *
enventor_object_main_item_get(const Enventor_Object *obj)
{
Enventor_Object_Data *pd = eo_data_scope_get(obj, ENVENTOR_OBJECT_CLASS);
return &pd->main_it;
}
@ -1044,6 +1039,11 @@ enventor_item_focus_set(Enventor_Item *it)
pd->focused_it = it;
//Update Editor State
edit_linenumber_set(it->ed, pd->linenumber);
edit_font_scale_set(it->ed, pd->font_scale);
edit_disabled_set(it->ed, pd->disabled);
return EINA_TRUE;
}