editor - fix the group switching bug.

previuosly the group switching would be done only when part highlight is enabled.

now, it tries group switching regardless of the part highlight
This commit is contained in:
ChunEon Park 2014-03-15 16:23:18 +09:00
parent 1ff1659cca
commit 7919f98111
3 changed files with 114 additions and 9 deletions

View File

@ -599,9 +599,10 @@ cur_name_get_cb(void *data, Eina_Stringshare *part_name,
void
edit_view_sync(edit_data *ed)
{
if (!config_part_highlight_get()) return;
parser_cur_name_get(ed->pd, ed->en_edit, cur_name_get_cb, ed);
if (!config_part_highlight_get())
parser_cur_group_name_get(ed->pd, ed->en_edit, cur_name_get_cb, ed);
else
parser_cur_name_get(ed->pd, ed->en_edit, cur_name_get_cb, ed);
}
static void

View File

@ -283,7 +283,82 @@ parser_markup_escape(parser_data *pd EINA_UNUSED, const char *str)
}
static void
part_name_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED)
group_name_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED)
{
const char *quot = QUOT;
const char *group = "group";
const int quot_len = QUOT_LEN;
const int group_len = 5; //strlen("group");
cur_name_td *td = data;
char *utf8 = td->utf8;
int cur_pos = td->cur_pos;
char *p = utf8;
char *end = utf8 + cur_pos;
int bracket = 0;
const char *group_name = NULL;
int group_name_len = 0;
while (p <= end)
{
//Skip "" range
if (*p == *quot)
{
p += quot_len;
p = strstr(p, quot);
if (!p) goto end;
p += quot_len;
}
if (*p == '{')
{
bracket++;
p++;
continue;
}
//Check whether outside of part or group
if ((*p == '}') && (p < end))
{
bracket--;
p++;
if (bracket == 1) group_name = NULL;
continue;
}
//Check Group in
if (!strncmp(p, group, group_len))
{
p += group_len;
char *name_begin = strstr(p, quot);
if (!name_begin) goto end;
name_begin += quot_len;
p = name_begin;
char *name_end = strstr(p, quot);
if (!name_end) goto end;
group_name = name_begin;
group_name_len = name_end - name_begin;
p = name_end + quot_len;
bracket++;
continue;
}
p++;
}
if (group_name)
group_name = eina_stringshare_add_length(group_name, group_name_len);
end:
if (utf8)
{
free(utf8);
td->utf8 = NULL;
}
td->group_name = group_name;
}
static void
cur_name_thread_blocking(void *data, Ecore_Thread *thread EINA_UNUSED)
{
const char *quot = QUOT;
const char *part = "part";
@ -388,7 +463,7 @@ end:
}
static void
part_name_thread_end(void *data, Ecore_Thread *thread EINA_UNUSED)
cur_name_thread_end(void *data, Ecore_Thread *thread EINA_UNUSED)
{
cur_name_td *td = data;
td->cb(td->cb_data, td->part_name, td->group_name);
@ -397,7 +472,7 @@ part_name_thread_end(void *data, Ecore_Thread *thread EINA_UNUSED)
}
static void
part_name_thread_cancel(void *data, Ecore_Thread *thread EINA_UNUSED)
cur_name_thread_cancel(void *data, Ecore_Thread *thread EINA_UNUSED)
{
cur_name_td *td = data;
td->pd->thread = NULL;
@ -492,6 +567,34 @@ parser_paragh_name_get(parser_data *pd EINA_UNUSED, Evas_Object *entry)
return NULL;
}
void
parser_cur_group_name_get(parser_data *pd, Evas_Object *entry,
void (*cb)(void *data, Eina_Stringshare *part_name,
Eina_Stringshare *group_name), void *data)
{
if (pd->thread) ecore_thread_cancel(pd->thread);
cur_name_td *td = calloc(1, sizeof(cur_name_td));
if (!td) return;
const char *text = elm_entry_entry_get(entry);
if (!text) return;
char *utf8 = elm_entry_markup_to_utf8(text);
if (!utf8) return;
td->pd = pd;
td->utf8 = utf8;
td->cur_pos = elm_entry_cursor_pos_get(entry);
td->cb = cb;
td->cb_data = data;
pd->thread = ecore_thread_run(group_name_thread_blocking,
cur_name_thread_end,
cur_name_thread_cancel,
td);
}
void
parser_cur_name_get(parser_data *pd, Evas_Object *entry, void (*cb)(void *data,
Eina_Stringshare *part_name, Eina_Stringshare *group_name),
@ -514,9 +617,9 @@ parser_cur_name_get(parser_data *pd, Evas_Object *entry, void (*cb)(void *data,
td->cb = cb;
td->cb_data = data;
pd->thread = ecore_thread_run(part_name_thread_blocking,
part_name_thread_end,
part_name_thread_cancel,
pd->thread = ecore_thread_run(cur_name_thread_blocking,
cur_name_thread_end,
cur_name_thread_cancel,
td);
}

View File

@ -8,6 +8,7 @@ parser_data *parser_init();
void parser_term(parser_data *pd);
Eina_Stringshare *parser_first_group_name_get(parser_data *pd, Evas_Object *entry);
void parser_cur_name_get(parser_data *pd, Evas_Object *entry, void (*cb)(void *data, Eina_Stringshare *part_name, Eina_Stringshare *group_name), void *data);
void parser_cur_group_name_get(parser_data *pd, Evas_Object *entry, void (*cb)(void *data, Eina_Stringshare *part_name, Eina_Stringshare *group_name), void *data);
Eina_Bool parser_type_name_compare(parser_data *pd, const char *str);
const char *parser_markup_escape(parser_data *pd EINA_UNUSED, const char *str);
attr_value *parser_attribute_get(parser_data *pd, const char *text, const char *cur);