hermet pushed a commit to branch master.

http://git.enlightenment.org/tools/enventor.git/commit/?id=e1c194544ca20d22111fade93208d23d7e5a7a65

commit e1c194544ca20d22111fade93208d23d7e5a7a65
Author: ChunEon Park <[email protected]>
Date:   Sun Jun 8 13:17:06 2014 +0900

    editor - recover selection region next to the syntax color applying.
---
 src/bin/edc_editor.c | 74 +++++++++++++++++++++++++++++-----------------------
 1 file changed, 42 insertions(+), 32 deletions(-)

diff --git a/src/bin/edc_editor.c b/src/bin/edc_editor.c
index 6695a16..7084576 100644
--- a/src/bin/edc_editor.c
+++ b/src/bin/edc_editor.c
@@ -37,10 +37,12 @@ struct editor_s
    void (*view_sync_cb)(void *data, Eina_Stringshare *part_name,
                          Eina_Stringshare *group_name);
    void *view_sync_cb_data;
+   int select_pos;
 
    Eina_Bool edit_changed : 1;
    Eina_Bool linenumber : 1;
    Eina_Bool ctrl_pressed : 1;
+   Eina_Bool on_select_recover : 1;
 };
 
 static Eina_Bool
@@ -117,6 +119,29 @@ visible_text_region_get(edit_data *ed, int *from_line, int 
*to_line)
 }
 
 static void
+entry_recover(edit_data *ed, int cursor_pos)
+{
+   elm_entry_calc_force(ed->en_edit);
+
+   //recover cursor position??
+   elm_entry_cursor_pos_set(ed->en_edit, 0);
+   elm_entry_cursor_pos_set(ed->en_edit, cursor_pos);
+
+   //not on selection mode
+   if (ed->select_pos == -1) return;
+
+   //recover selection region
+   const char *select = elm_entry_selection_get(ed->en_edit);
+   if (!select) return;
+   char *utf8 = evas_textblock_text_markup_to_utf8(NULL, select);
+   ed->on_select_recover = EINA_TRUE;
+   elm_entry_select_none(ed->en_edit);
+   elm_entry_select_region_set(ed->en_edit, ed->select_pos, cursor_pos);
+   ed->on_select_recover = EINA_FALSE;
+   free(utf8);
+}
+
+static void
 syntax_color_apply(edit_data *ed, Eina_Bool partial)
 {
    Evas_Object *tb = elm_entry_textblock_get(ed->en_edit);
@@ -142,13 +167,8 @@ syntax_color_apply(edit_data *ed, Eina_Bool partial)
       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, translated);
-   elm_entry_calc_force(ed->en_edit);
 
-   //recorver cursor position??
-   elm_entry_cursor_pos_set(ed->en_edit, 0);
-   elm_entry_cursor_pos_set(ed->en_edit, pos);
-
-   //FIXME: Need to recover selection area.
+   entry_recover(ed, pos);
 }
 
 static Eina_Bool
@@ -199,13 +219,7 @@ syntax_color_thread_end_cb(void *data, Ecore_Thread 
*thread EINA_UNUSED)
       Logically that's unnecessary in this case. */
    evas_object_textblock_text_markup_set(tb, td->translated);
 
-   elm_entry_calc_force(td->ed->en_edit);
-
-   //recorver cursor position??
-   elm_entry_cursor_pos_set(td->ed->en_edit, 0);
-   elm_entry_cursor_pos_set(td->ed->en_edit, pos);
-
-   //FIXME: Need to recover selection area.
+   entry_recover(td->ed, pos);
 
    td->ed->syntax_color_thread = NULL;
    free(td);
@@ -292,10 +306,6 @@ edit_changed_cb(void *data, Evas_Object *obj EINA_UNUSED, 
void *event_info)
      }
 
    if (!syntax_color) return;
-   /* FIXME: after searching the text, it couldn't recover the selected text
-      right after applying syntax color. This workaround makes avoid to not
-      applying syntax color while entry has the selected text. */
-   if (elm_entry_selection_get(ed->en_edit)) return;
    syntax_color_partial_update(ed, SYNTAX_COLOR_DEFAULT_TIME);
 }
 
@@ -558,18 +568,6 @@ edit_template_part_insert(edit_data *ed, Edje_Part_Type 
type)
 }
 
 static void
-edit_mouse_down_cb(void *data EINA_UNUSED, Evas *e EINA_UNUSED,
-                   Evas_Object *obj, void *event_info EINA_UNUSED)
-{
-   Evas_Event_Mouse_Down *ev = event_info;
-   if (ev->button == 1)
-     {
-        elm_entry_select_none(obj);
-        return;
-     }
-}
-
-static void
 cur_line_pos_set(edit_data *ed, Eina_Bool force)
 {
    Evas_Coord y, h;
@@ -790,7 +788,18 @@ edit_selection_cleared_cb(void *data, Evas_Object *obj 
EINA_UNUSED,
                           void *event_info EINA_UNUSED)
 {
    edit_data *ed = data;
+   if (ed->on_select_recover) return;
    cur_line_pos_set(ed, EINA_TRUE);
+   ed->select_pos = -1;
+}
+
+static void
+edit_selection_start_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                        void *event_info EINA_UNUSED)
+{
+   edit_data *ed = data;
+   if (ed->select_pos != -1) return;
+   ed->select_pos = elm_entry_cursor_pos_get(ed->en_edit);
 }
 
 static void
@@ -996,11 +1005,11 @@ edit_init(Evas_Object *parent)
                                   edit_cursor_double_clicked_cb, ed);
    evas_object_smart_callback_add(en_edit, "selection,cleared",
                                   edit_selection_cleared_cb, ed);
+   evas_object_smart_callback_add(en_edit, "selection,start",
+                                  edit_selection_start_cb, ed);
    evas_object_size_hint_weight_set(en_edit, EVAS_HINT_EXPAND,
                                     EVAS_HINT_EXPAND);
    evas_object_size_hint_align_set(en_edit, EVAS_HINT_FILL, EVAS_HINT_FILL);
-   evas_object_event_callback_add(en_edit, EVAS_CALLBACK_MOUSE_DOWN,
-                                  edit_mouse_down_cb, ed);
    elm_object_focus_set(en_edit, EINA_TRUE);
    elm_object_part_content_set(layout, "elm.swallow.edit", en_edit);
 
@@ -1011,6 +1020,7 @@ edit_init(Evas_Object *parent)
    ed->parent = parent;
    ed->linenumber = EINA_TRUE;
    ed->cur_line = -1;
+   ed->select_pos = -1;
 
    edit_line_number_toggle(ed);
    edit_font_size_update(ed, EINA_FALSE, EINA_FALSE);
@@ -1145,7 +1155,7 @@ edit_changed_set(edit_data *ed, Eina_Bool changed)
 void
 edit_line_number_toggle(edit_data *ed)
 {
-   //FIXME: edit & config toogle should be handled in one place.
+   //FIXME: edit & config toggle should be handled in one place.
    Eina_Bool linenumber = config_linenumber_get();
    if (ed->linenumber == linenumber) return;
    ed->linenumber = linenumber;

-- 


Reply via email to