/* * Copyright 2012 Samsung Electronics Co., Ltd * * Licensed under the Flora License, Version 1.0 (the License); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.tizenopensource.org/license * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an AS IS BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include #include "smartsearch.h" #include "Elementary.h" Eina_Bool __search_entry_timer_cb(void *data) { SEARCH_FUNC_START; struct appdata *ad = (struct appdata *)data; search_set_result_list(ad); ad->search_timer = NULL; SEARCH_FUNC_END; return ECORE_CALLBACK_CANCEL; } void __search_searchbar_entry_changed_cb(void *data, Evas_Object * obj, void *event_info) { SEARCH_FUNC_START; struct appdata *ad = (struct appdata *)data; const char *text; text = elm_entry_markup_to_utf8(elm_object_text_get(ad->search_entry)); SEARCH_DEBUG_LOG("text : %s", text); if (elm_object_focus_get(ad->search_bar)) { if (elm_entry_is_empty(ad->search_entry)) elm_object_signal_emit(ad->search_bar, "elm,state,eraser,hide", "elm"); else elm_object_signal_emit(ad->search_bar, "elm,state,eraser,show", "elm"); } else { if (elm_entry_is_empty(ad->search_entry)) elm_object_signal_emit(ad->search_bar, "elm,state,guidetext,show", "elm"); else elm_object_signal_emit(ad->search_bar, "elm,state,guidetext,hide", "elm"); } if ((text != NULL) && (strlen(text) > 0) && (SEARCH_STRCMP(text, ad->search_word) == 0)) { SEARCH_DEBUG_LOG("text is same as prev text"); } else { /* Make timer for check user's input */ search_stop_search(ad); ad->search_timer = ecore_timer_add(0.4, __search_entry_timer_cb, ad); } SEARCH_FUNC_END; return; } static void __search_searchbar_entry_focused_cb(void *data, Evas_Object *obj, void *event_info) { SEARCH_FUNC_START; struct appdata *ad = (struct appdata *)data; if (!elm_entry_is_empty(ad->search_entry)) elm_object_signal_emit(ad->search_bar, "elm,state,eraser,show", "elm"); elm_object_signal_emit(ad->search_bar, "elm,state,guidetext,hide", "elm"); elm_object_signal_emit(ad->search_bar, "cancel,in", ""); SEARCH_FUNC_END; } static void __search_searchbar_entry_unfocused_cb(void *data, Evas_Object *obj, void *event_info) { SEARCH_FUNC_START; struct appdata *ad = (struct appdata *)data; if (elm_entry_is_empty(ad->search_entry)) elm_object_signal_emit(ad->search_bar, "elm,state,guidetext,show", "elm"); elm_object_signal_emit(ad->search_bar, "elm,state,eraser,hide", "elm"); SEARCH_FUNC_END; } static void __search_searchbar_bg_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source) { SEARCH_FUNC_START; struct appdata *ad = (struct appdata *)data; elm_object_focus_set(ad->search_entry, EINA_TRUE); SEARCH_FUNC_END; } static void __search_searchbar_eraser_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source) // When X marked button is clicked, empty entry's contents. { SEARCH_FUNC_START; struct appdata *ad = (struct appdata *)data; elm_entry_entry_set(ad->search_entry, ""); SEARCH_FUNC_END; } static void __search_searchbar_key_down_cb(void *data, Evas * e, Evas_Object * obj, void *event_info) { SEARCH_FUNC_START; struct appdata *ad = (struct appdata *)data; Evas_Event_Key_Down *ev = (Evas_Event_Key_Down *) event_info; if (SEARCH_STRCMP(ev->key, "Return") == 0) { ecore_imf_context_input_panel_hide ((Ecore_IMF_Context *)elm_entry_imf_context_get (ad->search_entry)); } SEARCH_FUNC_END; } static void __search_searchbar_cancel_clicked_cb(void *data, Evas_Object * obj, void *event_info) { SEARCH_FUNC_START; struct appdata *ad = (struct appdata *)data; const char* text; elm_object_focus_set(ad->cate_btn, EINA_TRUE); evas_object_hide(ad->search_cancel_btn); elm_object_signal_emit(ad->search_bar, "cancel,out", ""); text = elm_entry_entry_get(ad->search_entry); if (text != NULL && strlen(text) > 0) elm_entry_entry_set(ad->search_entry, NULL); search_set_result_list(ad); malloc_trim(0); SEARCH_FUNC_END; } static void __search_searchbar_gl_drag_scroll_start_cb(void *data, Evas_Object * obj, void *event_info) { SEARCH_FUNC_START; struct appdata *ad = (struct appdata *)data; Ecore_IMF_Context *imf_context = (Ecore_IMF_Context *)elm_entry_imf_context_get(ad->search_entry); if (imf_context) { ecore_imf_context_input_panel_hide(imf_context); } SEARCH_FUNC_END; } static void __search_searchbar_state_event_cb(void *data, Ecore_IMF_Context *imf_context, int value) { SEARCH_FUNC_START; struct appdata *ad = (struct appdata *)data; switch (value) { case ECORE_IMF_INPUT_PANEL_STATE_SHOW: evas_object_smart_callback_add( ad->search_gl, "scroll,drag,start", __search_searchbar_gl_drag_scroll_start_cb, data); break; case ECORE_IMF_INPUT_PANEL_STATE_HIDE: /* ISE state has changed to ISE_STATE_HIDE status */ evas_object_smart_callback_del( ad->search_gl, "scroll,drag,start", __search_searchbar_gl_drag_scroll_start_cb); break; } SEARCH_FUNC_END; } static Evas_Object* __search_searchbar_create(void *data) { SEARCH_FUNC_START; struct appdata *ad = (struct appdata *)data; int category = 0; Evas_Object *search_layout = NULL; Evas_Object *cate_btn; Evas_Object *cate_icon; char *imgpath = NULL; if (!ad) return NULL; if (ad->search_bar) { elm_object_signal_callback_del(ad->search_bar, "elm,bg,clicked", "elm", __search_searchbar_bg_clicked_cb); elm_object_signal_callback_del(ad->search_bar, "elm,eraser,clicked", "elm", __search_searchbar_eraser_clicked_cb); evas_object_del(ad->search_bar); ad->search_bar = NULL; } if (ad->search_entry) { evas_object_smart_callback_del(ad->search_entry, "changed", __search_searchbar_entry_changed_cb); evas_object_smart_callback_del(ad->search_entry, "preedit,changed", __search_searchbar_entry_changed_cb); evas_object_smart_callback_del(ad->search_entry, "focused", __search_searchbar_entry_focused_cb); evas_object_smart_callback_del(ad->search_entry, "unfocused", __search_searchbar_entry_unfocused_cb); evas_object_del(ad->search_entry); ad->search_entry = NULL; } if (ad->search_cancel_btn) { evas_object_smart_callback_del(ad->search_cancel_btn, "clicked", __search_searchbar_cancel_clicked_cb); evas_object_del(ad->search_cancel_btn); ad->search_cancel_btn = NULL; } search_layout = elm_layout_add(ad->sb_layout); elm_layout_file_set(search_layout, SEARCH_EDJ, "smartsearch/search_bar"); imgpath = ad->category_info[ad->search_category].btn_icon_path; cate_icon = search_searchbar_category_icon_add(imgpath, search_layout); cate_btn = elm_button_add(search_layout); elm_object_style_set(cate_btn, "icon"); elm_object_content_set(ad->cate_btn, cate_icon); evas_object_show(cate_btn); ad->cate_btn = cate_btn; elm_object_part_content_set(search_layout, "searchbar_area_category", cate_btn); ad->search_cancel_btn = elm_button_add(ad->search_bar); elm_object_part_content_set(ad->search_bar, "button_cancel", ad->search_cancel_btn); elm_object_style_set(ad->search_cancel_btn, "searchbar/default"); elm_object_text_set(ad->search_cancel_btn, dgettext("sys_string", "IDS_COM_SK_CANCEL")); ad->search_entry = elm_entry_add(ad->search_bar); elm_entry_scrollable_set(ad->search_entry, EINA_TRUE); elm_entry_single_line_set(ad->search_entry, EINA_TRUE); elm_object_part_content_set(ad->search_bar, "elm.swallow.content", ad->search_entry); elm_object_part_text_set(ad->search_bar, "elm.guidetext", dgettext("sys_string", "IDS_COM_BODY_SEARCH")); elm_entry_cnp_mode_set(ad->search_entry, ELM_CNP_MODE_PLAINTEXT); evas_object_size_hint_weight_set(ad->search_bar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); evas_object_size_hint_align_set(ad->search_bar, EVAS_HINT_FILL, EVAS_HINT_FILL); elm_entry_input_panel_layout_set(ad->search_entry, ELM_INPUT_PANEL_LAYOUT_NORMAL); Ecore_IMF_Context *imf_context = (Ecore_IMF_Context *)elm_entry_imf_context_get(ad->search_entry); ecore_imf_context_input_panel_event_callback_add(imf_context, ECORE_IMF_INPUT_PANEL_STATE_EVENT, __search_searchbar_state_event_cb, data); elm_object_part_content_set(search_layout, "searchbar_area_entry", ad->search_bar); /* Set Searchbar Callback */ elm_object_signal_callback_add(ad->search_bar, "elm,bg,clicked", "elm", __search_searchbar_bg_clicked_cb, ad); elm_object_signal_callback_add(ad->search_bar, "elm,eraser,clicked", "elm", __search_searchbar_eraser_clicked_cb, ad); /* Set Search-Entry Callback */ evas_object_smart_callback_add(ad->search_entry, "changed", __search_searchbar_entry_changed_cb, ad); evas_object_smart_callback_add(ad->search_entry, "preedit,changed", __search_searchbar_entry_changed_cb, ad); evas_object_smart_callback_add(ad->search_entry, "focused", __search_searchbar_entry_focused_cb, ad); evas_object_smart_callback_add(ad->search_entry, "unfocused", __search_searchbar_entry_unfocused_cb, ad); evas_object_event_callback_add(ad->search_entry, EVAS_CALLBACK_KEY_DOWN, __search_searchbar_key_down_cb, ad); /* Set Searchbar Cancel Button Callback */ evas_object_smart_callback_add(ad->search_cancel_btn, "clicked", __search_searchbar_cancel_clicked_cb, ad); evas_object_show(ad->search_bar); return search_layout; SEARCH_FUNC_END; } static Evas_Object *__search_init_noresult_view(void *data) { SEARCH_FUNC_START; struct appdata *ad = (struct appdata *)data; Evas_Object *noc; noc = elm_layout_add(ad->navi_bar); elm_layout_theme_set(noc, "layout", "nocontents", "search"); elm_object_part_text_set(noc, "elm.text", dgettext("sys_string", "IDS_COM_BODY_NO_SEARCH_RESULTS")); elm_object_focus_allow_set(noc, EINA_TRUE); SEARCH_FUNC_END; return noc; } Evas_Object *search_searchbar_category_icon_add(char* img, Evas_Object *parent) { SEARCH_FUNC_START; char buf[MAX_LENGTH_PER_PATH] = { 0, }; Evas_Object* cate_icon = NULL; if( img != NULL ) { cate_icon = elm_icon_add(parent); snprintf(buf, sizeof(buf), SEARCH_ICON_PATH "%s", img); SEARCH_DEBUG_LOG("buf : %s", buf); elm_icon_file_set(cate_icon, buf, NULL); evas_object_size_hint_aspect_set(cate_icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1); elm_icon_resizable_set(cate_icon, EINA_FALSE, EINA_FALSE); } SEARCH_FUNC_END; return cate_icon; } void search_searchbar_cb(void *data, Evas_Object * obj, void *event_info) { SEARCH_FUNC_START; struct appdata *ad = (struct appdata *)data; /* create layout */ ad->sb_layout = elm_layout_add(ad->navi_bar); elm_layout_theme_set(ad->sb_layout, "layout", "application", "searchbar_base"); elm_object_signal_emit(ad->sb_layout, "elm,state,show,searchbar", "elm"); /* set search bar area */ ad->search_layout = __search_searchbar_create(ad); elm_object_part_content_set(ad->sb_layout, "searchbar", ad->search_layout); /* set search result area */ ad->result_layout = elm_layout_add(ad->sb_layout); elm_layout_file_set(ad->result_layout, SEARCH_EDJ, "smartsearch/search_result"); /* set search result area */ ad->noresult_view = __search_init_noresult_view(ad); elm_object_part_content_set(ad->result_layout, "list_noresult", ad->noresult_view); elm_object_part_content_set(ad->sb_layout, "elm.swallow.content", ad->result_layout); evas_object_size_hint_weight_set( ad->sb_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND); SEARCH_FUNC_END; }