2 * Copyright 2012 Samsung Electronics Co., Ltd
4 * Licensed under the Flora License, Version 1.0 (the License);
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.tizenopensource.org/license
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an AS IS BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
23 #include "smartsearch.h"
24 #include "Elementary.h"
26 Eina_Bool __search_entry_timer_cb(void *data)
29 struct appdata *ad = (struct appdata *)data;
31 search_set_result_list(ad);
32 ad->search_timer = NULL;
35 return ECORE_CALLBACK_CANCEL;
38 void __search_searchbar_entry_changed_cb(void *data, Evas_Object * obj,
43 struct appdata *ad = (struct appdata *)data;
45 text = elm_entry_markup_to_utf8(elm_object_text_get(ad->search_entry));
47 SEARCH_DEBUG_LOG("text : %s", text);
49 if (elm_object_focus_get(ad->search_bar)) {
50 if (elm_entry_is_empty(ad->search_entry))
51 elm_object_signal_emit(ad->search_bar, "elm,state,eraser,hide", "elm");
53 elm_object_signal_emit(ad->search_bar, "elm,state,eraser,show", "elm");
55 if (elm_entry_is_empty(ad->search_entry))
56 elm_object_signal_emit(ad->search_bar, "elm,state,guidetext,show", "elm");
58 elm_object_signal_emit(ad->search_bar, "elm,state,guidetext,hide", "elm");
61 if ((text != NULL) && (strlen(text) > 0)
62 && (SEARCH_STRCMP(text, ad->search_word) == 0)) {
63 SEARCH_DEBUG_LOG("text is same as prev text");
65 /* Make timer for check user's input */
66 search_stop_search(ad);
68 ad->search_timer = ecore_timer_add(0.4, __search_entry_timer_cb, ad);
76 static void __search_searchbar_entry_focused_cb(void *data, Evas_Object *obj, void *event_info)
80 struct appdata *ad = (struct appdata *)data;
82 if (!elm_entry_is_empty(ad->search_entry))
83 elm_object_signal_emit(ad->search_bar, "elm,state,eraser,show", "elm");
85 elm_object_signal_emit(ad->search_bar, "elm,state,guidetext,hide", "elm");
86 elm_object_signal_emit(ad->search_bar, "cancel,in", "");
91 static void __search_searchbar_entry_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
95 struct appdata *ad = (struct appdata *)data;
97 if (elm_entry_is_empty(ad->search_entry))
98 elm_object_signal_emit(ad->search_bar, "elm,state,guidetext,show", "elm");
100 elm_object_signal_emit(ad->search_bar, "elm,state,eraser,hide", "elm");
105 static void __search_searchbar_bg_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
109 struct appdata *ad = (struct appdata *)data;
111 elm_object_focus_set(ad->search_entry, EINA_TRUE);
116 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.
120 struct appdata *ad = (struct appdata *)data;
122 elm_entry_entry_set(ad->search_entry, "");
127 static void __search_searchbar_key_down_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
131 struct appdata *ad = (struct appdata *)data;
132 Evas_Event_Key_Down *ev = (Evas_Event_Key_Down *) event_info;
134 if (SEARCH_STRCMP(ev->key, "Return") == 0) {
135 ecore_imf_context_input_panel_hide
136 ((Ecore_IMF_Context *)elm_entry_imf_context_get
143 static void __search_searchbar_cancel_clicked_cb(void *data, Evas_Object * obj,
148 struct appdata *ad = (struct appdata *)data;
152 elm_object_focus_set(ad->cate_btn, EINA_TRUE);
153 evas_object_hide(ad->search_cancel_btn);
154 elm_object_signal_emit(ad->search_bar, "cancel,out", "");
155 text = elm_entry_entry_get(ad->search_entry);
157 if (text != NULL && strlen(text) > 0)
158 elm_entry_entry_set(ad->search_entry, NULL);
160 search_set_result_list(ad);
167 static void __search_searchbar_gl_drag_scroll_start_cb(void *data, Evas_Object * obj, void *event_info)
171 struct appdata *ad = (struct appdata *)data;
173 Ecore_IMF_Context *imf_context = (Ecore_IMF_Context *)elm_entry_imf_context_get(ad->search_entry);
176 ecore_imf_context_input_panel_hide(imf_context);
184 __search_searchbar_state_event_cb(void *data, Ecore_IMF_Context *imf_context, int value)
188 struct appdata *ad = (struct appdata *)data;
192 case ECORE_IMF_INPUT_PANEL_STATE_SHOW:
193 evas_object_smart_callback_add(
196 __search_searchbar_gl_drag_scroll_start_cb,
199 case ECORE_IMF_INPUT_PANEL_STATE_HIDE:
200 /* ISE state has changed to ISE_STATE_HIDE status */
201 evas_object_smart_callback_del(
204 __search_searchbar_gl_drag_scroll_start_cb);
211 static void __search_searchbar_create(void *data)
215 struct appdata *ad = (struct appdata *)data;
219 if (ad->search_bar) {
220 elm_object_signal_callback_del(
224 __search_searchbar_bg_clicked_cb);
225 elm_object_signal_callback_del(
227 "elm,eraser,clicked",
229 __search_searchbar_eraser_clicked_cb);
231 evas_object_del(ad->search_bar);
232 ad->search_bar = NULL;
235 if (ad->search_entry) {
236 evas_object_smart_callback_del(
239 __search_searchbar_entry_changed_cb);
240 evas_object_smart_callback_del(
243 __search_searchbar_entry_changed_cb);
244 evas_object_smart_callback_del(
247 __search_searchbar_entry_focused_cb);
248 evas_object_smart_callback_del(
251 __search_searchbar_entry_unfocused_cb);
253 evas_object_del(ad->search_entry);
254 ad->search_entry = NULL;
257 if (ad->search_cancel_btn) {
258 evas_object_smart_callback_del(
259 ad->search_cancel_btn,
261 __search_searchbar_cancel_clicked_cb);
262 evas_object_del(ad->search_cancel_btn);
263 ad->search_cancel_btn = NULL;
266 ad->search_bar = elm_layout_add(ad->navi_bar);
267 elm_layout_theme_set(ad->search_bar , "layout", "searchbar", "cancel_button");
269 ad->search_cancel_btn = elm_button_add(ad->search_bar);
270 elm_object_part_content_set(ad->search_bar, "button_cancel", ad->search_cancel_btn);
271 elm_object_style_set(ad->search_cancel_btn, "searchbar/default");
272 elm_object_text_set(ad->search_cancel_btn, dgettext("sys_string", "IDS_COM_SK_CANCEL"));
274 ad->search_entry = elm_entry_add(ad->search_bar);
275 elm_entry_scrollable_set(ad->search_entry, EINA_TRUE);
276 elm_entry_single_line_set(ad->search_entry, EINA_TRUE);
277 elm_object_part_content_set(ad->search_bar, "elm.swallow.content", ad->search_entry);
278 elm_object_part_text_set(ad->search_bar, "elm.guidetext", dgettext("sys_string", "IDS_COM_BODY_SEARCH"));
279 elm_entry_cnp_mode_set(ad->search_entry, ELM_CNP_MODE_PLAINTEXT);
281 evas_object_size_hint_weight_set(ad->search_bar, EVAS_HINT_EXPAND, 0);
282 evas_object_size_hint_align_set(ad->search_bar, EVAS_HINT_FILL, 0.0);
284 elm_entry_input_panel_layout_set(ad->search_entry, ELM_INPUT_PANEL_LAYOUT_NORMAL);
285 Ecore_IMF_Context *imf_context = (Ecore_IMF_Context *)elm_entry_imf_context_get(ad->search_entry);
286 ecore_imf_context_input_panel_event_callback_add(imf_context,
287 ECORE_IMF_INPUT_PANEL_STATE_EVENT,
288 __search_searchbar_state_event_cb,
291 /* Set Searchbar Callback */
292 elm_object_signal_callback_add(
296 __search_searchbar_bg_clicked_cb,
298 elm_object_signal_callback_add(
300 "elm,eraser,clicked",
302 __search_searchbar_eraser_clicked_cb,
305 /* Set Search-Entry Callback */
306 evas_object_smart_callback_add(
309 __search_searchbar_entry_changed_cb,
311 evas_object_smart_callback_add(
314 __search_searchbar_entry_changed_cb,
317 evas_object_smart_callback_add(
320 __search_searchbar_entry_focused_cb,
322 evas_object_smart_callback_add(
325 __search_searchbar_entry_unfocused_cb,
327 evas_object_event_callback_add(
329 EVAS_CALLBACK_KEY_DOWN,
330 __search_searchbar_key_down_cb,
333 /* Set Searchbar Cancel Button Callback */
334 evas_object_smart_callback_add(
335 ad->search_cancel_btn,
337 __search_searchbar_cancel_clicked_cb,
340 evas_object_show(ad->search_bar);
345 static Evas_Object *__search_init_noresult_view(void *data)
349 struct appdata *ad = (struct appdata *)data;
352 noc = elm_layout_add(ad->navi_bar);
353 elm_layout_theme_set(noc, "layout", "nocontents", "search");
354 elm_object_part_text_set(noc, "elm.text", dgettext("sys_string", "IDS_COM_BODY_NO_SEARCH_RESULTS"));
355 elm_object_focus_allow_set(noc, EINA_TRUE);
362 Evas_Object *search_searchbar_category_icon_add(char* img, Evas_Object *parent)
366 char buf[MAX_LENGTH_PER_PATH] = { 0, };
367 Evas_Object* cate_icon = NULL;
370 cate_icon = elm_icon_add(parent);
372 snprintf(buf, sizeof(buf), SEARCH_ICON_PATH "%s", img);
374 SEARCH_DEBUG_LOG("buf : %s", buf);
376 elm_icon_file_set(cate_icon, buf, NULL);
378 evas_object_size_hint_aspect_set(cate_icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
379 elm_icon_resizable_set(cate_icon, EINA_FALSE, EINA_FALSE);
387 void search_searchbar_cb(void *data, Evas_Object * obj, void *event_info)
391 struct appdata *ad = (struct appdata *)data;
393 Evas_Object *cate_btn;
394 Evas_Object *cate_icon;
396 char *imgpath = NULL;
400 ad->sb_layout = elm_layout_add(ad->navi_bar);
401 elm_layout_file_set(ad->sb_layout,
403 "smartsearch/search_result");
405 category = SEARCH_CATE_PHONE;
407 imgpath = ad->category_info[ad->search_category].btn_icon_path;
408 cate_icon = search_searchbar_category_icon_add(imgpath, ad->sb_layout);
410 cate_btn = elm_button_add(ad->sb_layout);
411 elm_object_content_set(ad->cate_btn, cate_icon);
413 evas_object_show(cate_btn);
414 ad->cate_btn = cate_btn;
416 elm_object_part_content_set(ad->sb_layout, "searchbar_area_category", cate_btn);
418 /* set search bar area */
419 __search_searchbar_create(ad);
420 elm_object_part_content_set(ad->sb_layout, "searchbar_area_entry", ad->search_bar);
422 /* set search result area */
423 ad->noresult_view = __search_init_noresult_view(ad);
425 elm_object_part_content_set(ad->sb_layout,
429 evas_object_size_hint_weight_set(