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(); --