hermet pushed a commit to branch master.

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

commit de8164bcb954e4e5ab30432f1243f1aa10ae7424
Author: ChunEon Park <her...@hermet.pe.kr>
Date:   Sun Mar 2 13:34:22 2014 +0900

    search - on implementing.
---
 data/themes/default/layout.edc |   8 +--
 src/bin/edc_editor.c           |  12 +---
 src/bin/main.c                 |   8 ++-
 src/bin/search.c               | 148 +++++++++++++++++++++++++++--------------
 src/include/edc_editor.h       |   1 -
 src/include/search.h           |   5 +-
 6 files changed, 115 insertions(+), 67 deletions(-)

diff --git a/data/themes/default/layout.edc b/data/themes/default/layout.edc
index 19f197d..a5969b1 100644
--- a/data/themes/default/layout.edc
+++ b/data/themes/default/layout.edc
@@ -13,7 +13,7 @@ group { name: "search";
       part { name: "base";
          type: SPACER;
          description { state: "default" 0.0;
-            min: 285 90;
+            min: 340 90;
          }
       }
       part { name: "left_top_padding";
@@ -45,7 +45,7 @@ group { name: "search";
             }
             color: 255 255 255 255;
             color3: 0 0 0 128;
-            min: 60 20;
+            min: 80 20;
             fixed: 1 1;
          }
       }
@@ -64,11 +64,11 @@ group { name: "search";
                font: FN;
                size: 11;
                align: 0 0;
-               text: "Replace:";
+               text: "Replace with:";
             }
             color: 255 255 255 255;
             color3: 0 0 0 128;
-            min: 60 20;
+            min: 80 20;
             fixed: 1 1;
          }
       }
diff --git a/src/bin/edc_editor.c b/src/bin/edc_editor.c
index 02be0d3..f3cb45d 100644
--- a/src/bin/edc_editor.c
+++ b/src/bin/edc_editor.c
@@ -713,6 +713,8 @@ edit_init(Evas_Object *parent)
 
    elm_object_part_content_set(layout, "elm.swallow.edit", en_edit);
 
+   search_entry_register(en_edit);
+
    ed->scroller = scroller;
    ed->en_line = en_line;
    ed->en_edit = en_edit;
@@ -862,13 +864,3 @@ edit_font_size_update(edit_data *ed, Eina_Bool msg)
    snprintf(buf, sizeof(buf), "Font Size: %1.1fx", config_font_size_get());
    stats_info_msg_update(buf);
 }
-
-void
-edit_search(edit_data *ed EINA_UNUSED, const char *word EINA_UNUSED)
-{
-//   Eina_Bool found;
-   search_open();
-//   sd  = search_word(sd, ed->en_edit, word, &found);
-//   printf("word(%s) found(%d)\n", word, found);
-//   fflush(stdout);
-}
diff --git a/src/bin/main.c b/src/bin/main.c
index 20df508..673d3b7 100644
--- a/src/bin/main.c
+++ b/src/bin/main.c
@@ -165,7 +165,7 @@ ctrl_func(app_data *ad, const char *key)
    //Find/Replace
    if (!strcmp(key, "f") || !strcmp(key, "F"))
      {
-        edit_search(ad->ed, "part");
+        search_open();
         return ECORE_CALLBACK_DONE;
      }
    //Template Code
@@ -245,6 +245,12 @@ main_key_down_cb(void *data, int type EINA_UNUSED, void 
*ev)
    //Main Menu
    if (!strcmp(event->key, "Escape"))
      {
+        if (search_is_opened())
+          {
+             search_close();
+             edit_focus_set(ad->ed);
+             return ECORE_CALLBACK_DONE;
+          }
         menu_toggle();
         if (menu_open_depth() == 0)
           edit_focus_set(ad->ed);
diff --git a/src/bin/search.c b/src/bin/search.c
index 9b9a596..000e02a 100644
--- a/src/bin/search.c
+++ b/src/bin/search.c
@@ -4,24 +4,31 @@
 typedef struct search_s
 {
    Evas_Object *win;
-   int order;
+   Evas_Object *en_find;
+   Evas_Object *en_replace;
+   Evas_Object *entry;
+   int pos;
+   Eina_Bool    need_iterate : 1;
 } search_data;
 
 static search_data *g_sd = NULL;
+static Evas_Object *g_entry = NULL;
 static Evas_Coord win_x = -1;
 static Evas_Coord win_y = -1;
-static Evas_Coord win_w = 285;
-static Evas_Coord win_h = 90;
+static Evas_Coord win_w = DEFAULT_SEARCH_WIN_W;
+static Evas_Coord win_h = DEFAULT_SEARCH_WIN_H;
 
 static void
-win_delete_request_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, 
void *event_info EINA_UNUSED)
+win_delete_request_cb(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
+                      void *event_info EINA_UNUSED)
 {
    //search_data *sd = data;
    search_close();
 }
 
 static void
-win_moved_cb(void *data EINA_UNUSED, Evas_Object *obj, void *event_info 
EINA_UNUSED)
+win_moved_cb(void *data EINA_UNUSED, Evas_Object *obj,
+             void *event_info EINA_UNUSED)
 {
    /* Move the window with the previous remembered position when the window is
       moved by window manager first time. */
@@ -29,6 +36,64 @@ win_moved_cb(void *data EINA_UNUSED, Evas_Object *obj, void 
*event_info EINA_UNU
    evas_object_smart_callback_del(obj, "moved", win_moved_cb);
 }
 
+static void
+find_word(Evas_Object *entry, const char *word, Eina_Bool *found)
+{
+   search_data *sd = g_sd;
+   char buf[256];
+
+   *found = EINA_FALSE;
+
+   const char *text = elm_entry_entry_get(entry);
+   const 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);
+         sd->need_iterate = EINA_FALSE;
+      }
+   else sd->pos++;
+
+   utf8 += sd->pos;
+
+   char *s = strstr(utf8, word);
+
+   //No found
+   if (!s)
+     {
+        //Need to iterate to find again?
+        if (sd->need_iterate)
+          {
+
+          }
+        //There are no searched words in the text
+        else
+          {
+             snprintf(buf, sizeof(buf), "No \"%s\" in the text", word);
+             stats_info_msg_update(buf);
+             return;
+          }
+     }
+
+   //Got you!
+   int len = strlen(word);
+   sd->pos += (s - utf8);
+   elm_entry_select_region_set(entry, sd->pos, sd->pos + len);
+   *found = EINA_TRUE;
+}
+
+static void
+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);
+}
+
 void
 search_open()
 {
@@ -39,10 +104,9 @@ search_open()
 
    //Win
    Evas_Object *win = elm_win_add(base_win_get(), "Enventor Search",
-                                  ELM_WIN_UTILITY);
+                                  ELM_WIN_DIALOG_BASIC);
    elm_win_focus_highlight_enabled_set(win, EINA_TRUE);
    elm_win_title_set(win, "Find/Replace");
-
    evas_object_resize(win, win_w, win_h);
    evas_object_smart_callback_add(win, "delete,request", win_delete_request_cb,
                                   sd);
@@ -69,6 +133,7 @@ search_open()
    evas_object_size_hint_weight_set(entry_find, EVAS_HINT_EXPAND, 0);
    evas_object_size_hint_align_set(entry_find, EVAS_HINT_FILL, 0);
    evas_object_show(entry_find);
+   elm_object_focus_set(entry_find, EINA_TRUE);
    elm_object_part_content_set(layout, "elm.swallow.find_entry", entry_find);
 
    //Entry (replace)
@@ -83,12 +148,14 @@ search_open()
    //Button (find)
    Evas_Object *btn_find = elm_button_add(layout);
    elm_object_text_set(btn_find, "Find");
+   evas_object_smart_callback_add(btn_find, "clicked", find_clicked_cb, sd);
    evas_object_show(btn_find);
    elm_object_part_content_set(layout, "elm.swallow.find", btn_find);
 
    //Button (find/replace)
    Evas_Object *btn_replace_find = elm_button_add(layout);
    elm_object_text_set(btn_replace_find, "Find/Replace");
+   elm_object_disabled_set(btn_replace_find, EINA_TRUE);
    evas_object_show(btn_replace_find);
    elm_object_part_content_set(layout, "elm.swallow.replace/find",
                                btn_replace_find);
@@ -96,13 +163,36 @@ search_open()
    //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_show(btn_replace);
    elm_object_part_content_set(layout, "elm.swallow.replace", btn_replace);
 
+   //Button (replace all)
+   Evas_Object *btn_replace_all = elm_button_add(layout);
+   elm_object_text_set(btn_replace_all, "Replace All");
+   elm_object_disabled_set(btn_replace_all, EINA_TRUE);
+   evas_object_show(btn_replace_all);
+   elm_object_part_content_set(layout, "elm.swallow.replace_all",
+                               btn_replace_all);
    sd->win = win;
+   sd->en_find = entry_find;
+   sd->en_replace = entry_replace;
+   sd->entry = g_entry;
+   sd->pos = -1;
+   sd->need_iterate = EINA_TRUE;
+}
 
+Eina_Bool
+search_is_opened()
+{
+   search_data *sd = g_sd;
+   return (sd ? EINA_TRUE : EINA_FALSE);
+}
 
-   sd->win = win;
+void
+search_entry_register(Evas_Object *entry)
+{
+   g_entry = entry;
 }
 
 void
@@ -117,45 +207,3 @@ search_close()
    free(sd);
    g_sd = NULL;
 }
-
-void
-search_word(Evas_Object *entry, const char *word, Eina_Bool *found)
-{
-   search_data *sd = g_sd;
-
-   *found = EINA_FALSE;
-
-   if (!word) return;
-
-   const char *text = elm_entry_entry_get(entry);
-   const char *utf8 = elm_entry_markup_to_utf8(text);
-
-   //There is no word in the text
-   char *s = strstr(utf8, word);
-   if (!s)
-     {
-        free(sd);
-        return;
-     }
-
-   int order = sd->order;
-
-   //No more next word found
-   if ((order > 0) && (strlen(s) <= 1)) return;
-
-   while (order > 0)
-     {
-        s++;
-        s = strstr(s, word);
-        if (!s) return;
-        order--;
-     }
-
-   //Got you!
-   int len = strlen(word);
-   elm_entry_select_region_set(entry, (s - utf8), (s - utf8) + len);
-   sd->order++;
-   *found = EINA_TRUE;
-
-   return;
-}
diff --git a/src/include/edc_editor.h b/src/include/edc_editor.h
index a1c98de..e6c028b 100644
--- a/src/include/edc_editor.h
+++ b/src/include/edc_editor.h
@@ -12,6 +12,5 @@ void edit_new(edit_data* ed);
 void edit_view_sync_cb_set(edit_data *ed, void (*cb)(void *data, 
Eina_Stringshare *part_name, Eina_Stringshare *group_name), void *data);
 void edit_view_sync(edit_data *ed);
 void edit_font_size_update(edit_data *ed, Eina_Bool msg);
-void edit_search(edit_data *ed, const char *word);
 void edit_template_insert(edit_data *ed);
 void edit_template_part_insert(edit_data *ed, Edje_Part_Type type);
diff --git a/src/include/search.h b/src/include/search.h
index 9713fbc..cb09eb7 100644
--- a/src/include/search.h
+++ b/src/include/search.h
@@ -1,3 +1,6 @@
-void search_word(Evas_Object *entry, const char *word, Eina_Bool *found);
+#define DEFAULT_SEARCH_WIN_W 340
+#define DEFAULT_SEARCH_WIN_H 90
 void search_open();
 void search_close();
+void search_entry_register(Evas_Object *entry);
+Eina_Bool search_is_opened();

-- 


Reply via email to