hermet pushed a commit to branch master. http://git.enlightenment.org/tools/enventor.git/commit/?id=e8ade4e64b154ed158b5f607807e06caca08a36d
commit e8ade4e64b154ed158b5f607807e06caca08a36d Author: taehyub <taehyub....@samsung.com> Date: Wed Feb 3 10:36:12 2016 +0900 fix the problem of selection cusor moving Summary: The selection cursor is moved at the frist When clicking and moving the bracket using the mouse. In entry_recover(), there is no selection cursor recover machanism. So I added the selection recover logic in the function. Now, it is fixed. @fix @T3099 Test Plan: 1. click the bracket 2. moving the cursor keeping the mouse clicking 3. see the fixed result Reviewers: Hermet, Jaehyun_Cho Differential Revision: https://phab.enlightenment.org/D3641 --- src/lib/edc_editor.c | 57 ++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 46 insertions(+), 11 deletions(-) diff --git a/src/lib/edc_editor.c b/src/lib/edc_editor.c index 5dbe16a..8522cf7 100644 --- a/src/lib/edc_editor.c +++ b/src/lib/edc_editor.c @@ -114,7 +114,7 @@ visible_text_region_get(edit_data *ed, int *from_line, int *to_line) } static void -entry_recover(edit_data *ed, int cursor_pos) +entry_recover(edit_data *ed, Edje_Object *en_edje, int cursor_pos, int sel_cur_begin, int sel_cur_end) { elm_entry_calc_force(ed->en_edit); @@ -123,14 +123,21 @@ entry_recover(edit_data *ed, int cursor_pos) elm_entry_cursor_pos_set(ed->en_edit, cursor_pos); //not on selection mode - if (ed->select_pos == -1) return; + if (ed->select_pos != -1) + { + //recover selection region + const char *selected = elm_entry_selection_get(ed->en_edit); + if (!selected) return; + ed->on_select_recover = EINA_TRUE; + elm_entry_select_region_set(ed->en_edit, ed->select_pos, cursor_pos); + ed->on_select_recover = EINA_FALSE; + } - //recover selection region - const char *selected = elm_entry_selection_get(ed->en_edit); - if (!selected) return; - ed->on_select_recover = EINA_TRUE; - elm_entry_select_region_set(ed->en_edit, ed->select_pos, cursor_pos); - ed->on_select_recover = EINA_FALSE; + //recover selection cursor + edje_object_part_text_cursor_pos_set(en_edje, "elm.text", + EDJE_CURSOR_SELECTION_BEGIN, sel_cur_begin); + edje_object_part_text_cursor_pos_set(en_edje, "elm.text", + EDJE_CURSOR_SELECTION_END, sel_cur_end); } static void @@ -144,7 +151,17 @@ edit_font_apply(edit_data *ed, const char *font_name, const char *font_style) elm_entry_calc_force(ed->en_line); int pos = elm_entry_cursor_pos_get(ed->en_edit); - entry_recover(ed, pos); + + Edje_Object *edje = elm_layout_edje_get(ed->en_edit); + if (elm_entry_scrollable_get(ed->en_edit)) + edje = edje_object_part_swallow_get(edje, "elm.swallow.content"); + + int sel_cur_begin = edje_object_part_text_cursor_pos_get + (edje, "elm.text", EDJE_CURSOR_SELECTION_BEGIN); + int sel_cur_end = edje_object_part_text_cursor_pos_get + (edje, "elm.text", EDJE_CURSOR_SELECTION_END); + + entry_recover(ed, edje, pos, sel_cur_begin, sel_cur_end); } static void @@ -207,6 +224,15 @@ syntax_color_apply(edit_data *ed, Eina_Bool partial) char *text = (char *) evas_object_textblock_text_markup_get(tb); int pos = elm_entry_cursor_pos_get(ed->en_edit); + Edje_Object *edje = elm_layout_edje_get(ed->en_edit); + if (elm_entry_scrollable_get(ed->en_edit)) + edje = edje_object_part_swallow_get(edje, "elm.swallow.content"); + + int sel_cur_begin = edje_object_part_text_cursor_pos_get + (edje, "elm.text", EDJE_CURSOR_SELECTION_BEGIN); + int sel_cur_end = edje_object_part_text_cursor_pos_get + (edje, "elm.text", EDJE_CURSOR_SELECTION_END); + int from_line = 1; int to_line = -1; if (partial) visible_text_region_get(ed, &from_line, &to_line); @@ -228,7 +254,7 @@ syntax_color_apply(edit_data *ed, Eina_Bool partial) evas_object_textblock_text_markup_set(tb, translated); error_highlight(ed, tb); bracket_highlight(ed, tb); - entry_recover(ed, pos); + entry_recover(ed, edje, pos, sel_cur_begin, sel_cur_end); } static Eina_Bool @@ -274,12 +300,21 @@ syntax_color_thread_end_cb(void *data, Ecore_Thread *thread EINA_UNUSED) int pos = elm_entry_cursor_pos_get(td->ed->en_edit); Evas_Object *tb = elm_entry_textblock_get(td->ed->en_edit); + Edje_Object *edje = elm_layout_edje_get(td->ed->en_edit); + if (elm_entry_scrollable_get(td->ed->en_edit)) + edje = edje_object_part_swallow_get(edje, "elm.swallow.content"); + + int sel_cur_begin = edje_object_part_text_cursor_pos_get + (edje, "elm.text", EDJE_CURSOR_SELECTION_BEGIN); + int sel_cur_end = edje_object_part_text_cursor_pos_get + (edje, "elm.text", EDJE_CURSOR_SELECTION_END); + /* I'm not sure this will be problem. But it can avoid entry_object_text_escaped_set() in Edje. Logically that's unnecessary in this case. */ evas_object_textblock_text_markup_set(tb, td->translated); error_highlight(td->ed, tb); - entry_recover(td->ed, pos); + entry_recover(td->ed, edje, pos, sel_cur_begin, sel_cur_end); td->ed->syntax_color_thread = NULL; free(td); --