hermet pushed a commit to branch master.

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

commit 8e8603b33fbfa93fb091871490b7d5da4ddcc331
Author: ChunEon Park <her...@hermet.pe.kr>
Date:   Sun Mar 2 20:38:27 2014 +0900

    search - on implementing.
    
    find and replace works pretty well.
    still "find/replace", "replace all" is not enough.
---
 src/bin/edc_editor.c |   1 +
 src/bin/search.c     | 103 ++++++++++++++++++++++++++++++++++-----------------
 2 files changed, 69 insertions(+), 35 deletions(-)

diff --git a/src/bin/edc_editor.c b/src/bin/edc_editor.c
index d61ee60..b983b39 100644
--- a/src/bin/edc_editor.c
+++ b/src/bin/edc_editor.c
@@ -82,6 +82,7 @@ syntax_color_apply(edit_data *ed)
    elm_entry_entry_set(ed->en_edit, NULL);
    elm_entry_entry_append(ed->en_edit, translated);
    elm_entry_cursor_pos_set(ed->en_edit, pos);
+   //FIXME: Need to recover selection area.
    free(utf8);
 }
 
diff --git a/src/bin/search.c b/src/bin/search.c
index 07f4c8c..2fc1981 100644
--- a/src/bin/search.c
+++ b/src/bin/search.c
@@ -8,6 +8,7 @@ typedef struct search_s
    Evas_Object *en_replace;
    Evas_Object *entry;
    int pos;
+   Eina_Bool found : 1;
 } search_data;
 
 static search_data *g_sd = NULL;
@@ -36,28 +37,23 @@ win_moved_cb(void *data EINA_UNUSED, Evas_Object *obj,
 }
 
 static void
-find_word(Evas_Object *entry, const char *word, Eina_Bool *found)
+find_proc(search_data *sd)
 {
-   search_data *sd = g_sd;
+   const char *find = elm_entry_entry_get(sd->en_find);
+   if (!find) return;
+
    char buf[256];
    Eina_Bool need_iterate = EINA_TRUE;
 
-   *found = EINA_FALSE;
-
-   const char *text = elm_entry_entry_get(entry);
-   const char *utf8 = elm_entry_markup_to_utf8(text);
+   const char *text = elm_entry_entry_get(sd->entry);
+   char *utf8 = elm_entry_markup_to_utf8(text);
 
    //get the character position begun with searching.
-   if (sd->pos == -1)
-      {
-         sd->pos = elm_entry_cursor_pos_get(entry);
-         need_iterate = EINA_FALSE;
-      }
+   if (sd->pos == -1) sd->pos = elm_entry_cursor_pos_get(sd->entry);
+   else if (sd->pos == 0) need_iterate = EINA_FALSE;
    else sd->pos++;
 
-   utf8 += sd->pos;
-
-   char *s = strstr(utf8, word);
+   char *s = strstr((utf8 + sd->pos), find);
 
    //No found
    if (!s)
@@ -66,25 +62,60 @@ find_word(Evas_Object *entry, const char *word, Eina_Bool 
*found)
         if (need_iterate)
           {
              sd->pos = 0;
-             find_word(entry, word, found);
+             find_proc(sd);
+             free(utf8);
              return;
           }
         //There are no searched words in the text
         else
           {
-             snprintf(buf, sizeof(buf), "No \"%s\" in the text", word);
+             snprintf(buf, sizeof(buf), "No \"%s\" in the text", find);
              stats_info_msg_update(buf);
              sd->pos = -1;
+             free(utf8);
              return;
           }
      }
 
    //Got you!
-   int len = strlen(word);
-   sd->pos += (s - utf8);
-   elm_entry_select_none(entry);
-   elm_entry_select_region_set(entry, sd->pos, sd->pos + len);
-   *found = EINA_TRUE;
+   int len = strlen(find);
+   sd->pos += (s - (utf8 + sd->pos));
+   elm_entry_select_none(sd->entry);
+   elm_entry_select_region_set(sd->entry, sd->pos, sd->pos + len);
+   sd->found = EINA_TRUE;
+   free(utf8);
+}
+
+static Eina_Bool
+replace_proc(search_data *sd)
+{
+   if (!sd->found) return EINA_FALSE;
+   const char *find = elm_entry_entry_get(sd->en_find);
+   const char *selection = elm_entry_selection_get(sd->entry);
+   if (!find || !selection) return EINA_FALSE;
+   char *utf8 = elm_entry_markup_to_utf8(selection);
+   if (strcmp(find, utf8)) return EINA_FALSE;
+   const char *replace = elm_entry_entry_get(sd->en_replace);
+   elm_entry_entry_insert(sd->entry, replace);
+   sd->found = EINA_FALSE;
+   free(utf8);
+   return EINA_TRUE;
+}
+
+static void
+replace_find_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                        void *event_info EINA_UNUSED)
+{
+   search_data *sd = data;
+   if (replace_proc(sd)) find_proc(sd);
+}
+
+static void
+replace_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
+                   void *event_info EINA_UNUSED)
+{
+   search_data *sd = data;
+   replace_proc(sd);
 }
 
 static void
@@ -92,10 +123,7 @@ find_clicked_cb(void *data, Evas_Object *obj EINA_UNUSED,
                 void *event_info EINA_UNUSED)
 {
    search_data *sd = data;
-   const char *find = elm_entry_entry_get(sd->en_find);
-   if (!find) return;
-   Eina_Bool found;
-   find_word(sd->entry, find, &found);
+   find_proc(sd);
 }
 
 static void
@@ -104,20 +132,22 @@ find_key_down_cb(void *data, Evas *e EINA_UNUSED, 
Evas_Object *obj EINA_UNUSED,
 {
    Evas_Event_Key_Down *ev = event_info;
    if (strcmp(ev->key, "Return")) return;
-
    search_data *sd = data;
-   const char *find = elm_entry_entry_get(sd->en_find);
-   if (!find) return;
-   Eina_Bool found;
-   find_word(sd->entry, find, &found);
+   find_proc(sd);
 }
 
 void
 search_open()
 {
-   if (g_sd) return;
+   search_data *sd = g_sd;
+
+   if (sd)
+   {
+      elm_win_activate(sd->win);
+      return;
+   }
 
-   search_data *sd = calloc(1, sizeof(search_data));
+   sd = calloc(1, sizeof(search_data));
    g_sd = sd;
 
    //Win
@@ -170,17 +200,20 @@ search_open()
    evas_object_smart_callback_add(btn_find, "clicked", find_clicked_cb, sd);
    elm_object_part_content_set(layout, "elm.swallow.find", btn_find);
 
-   //Button (find/replace)
+   //Button (replace/find)
    Evas_Object *btn_replace_find = elm_button_add(layout);
-   elm_object_text_set(btn_replace_find, "Find/Replace");
+   elm_object_text_set(btn_replace_find, "Replace/Find");
    elm_object_disabled_set(btn_replace_find, EINA_TRUE);
+   evas_object_smart_callback_add(btn_replace_find, "clicked",
+                                  replace_find_clicked_cb, sd);
    elm_object_part_content_set(layout, "elm.swallow.replace/find",
                                btn_replace_find);
 
    //Button (replace)
    Evas_Object *btn_replace = elm_button_add(layout);
    elm_object_text_set(btn_replace, "Replace");
-   elm_object_disabled_set(btn_replace, EINA_TRUE);
+   evas_object_smart_callback_add(btn_replace, "clicked",
+                                  replace_clicked_cb, sd);
    elm_object_part_content_set(layout, "elm.swallow.replace", btn_replace);
 
    //Button (replace all)

-- 


Reply via email to