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, "");
124 Ecore_IMF_Context *imf_context = (Ecore_IMF_Context *)elm_entry_imf_context_get(ad->search_entry);
127 ecore_imf_context_input_panel_show(imf_context);
133 static void __search_searchbar_key_down_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
137 struct appdata *ad = (struct appdata *)data;
138 Evas_Event_Key_Down *ev = (Evas_Event_Key_Down *) event_info;
140 if (SEARCH_STRCMP(ev->key, "Return") == 0) {
141 ecore_imf_context_input_panel_hide
142 ((Ecore_IMF_Context *)elm_entry_imf_context_get
149 static void __search_searchbar_cancel_clicked_cb(void *data, Evas_Object * obj,
154 struct appdata *ad = (struct appdata *)data;
158 elm_object_focus_set(ad->cate_btn, EINA_TRUE);
159 evas_object_hide(ad->search_cancel_btn);
160 elm_object_signal_emit(ad->search_bar, "cancel,out", "");
161 text = elm_entry_entry_get(ad->search_entry);
163 if (text != NULL && strlen(text) > 0)
164 elm_entry_entry_set(ad->search_entry, NULL);
166 search_set_result_list(ad);
173 static void __search_searchbar_gl_drag_scroll_start_cb(void *data, Evas_Object * obj, void *event_info)
177 struct appdata *ad = (struct appdata *)data;
179 Ecore_IMF_Context *imf_context = (Ecore_IMF_Context *)elm_entry_imf_context_get(ad->search_entry);
182 ecore_imf_context_input_panel_hide(imf_context);
190 __search_searchbar_state_event_cb(void *data, Ecore_IMF_Context *imf_context, int value)
194 struct appdata *ad = (struct appdata *)data;
198 case ECORE_IMF_INPUT_PANEL_STATE_SHOW:
199 evas_object_smart_callback_add(
202 __search_searchbar_gl_drag_scroll_start_cb,
205 case ECORE_IMF_INPUT_PANEL_STATE_HIDE:
206 /* ISE state has changed to ISE_STATE_HIDE status */
207 evas_object_smart_callback_del(
210 __search_searchbar_gl_drag_scroll_start_cb);
217 static void __search_searchbar_create(void *data)
221 struct appdata *ad = (struct appdata *)data;
225 if (ad->search_bar) {
226 elm_object_signal_callback_del(
230 __search_searchbar_bg_clicked_cb);
231 elm_object_signal_callback_del(
233 "elm,eraser,clicked",
235 __search_searchbar_eraser_clicked_cb);
237 evas_object_del(ad->search_bar);
238 ad->search_bar = NULL;
241 if (ad->search_entry) {
242 evas_object_smart_callback_del(
245 __search_searchbar_entry_changed_cb);
246 evas_object_smart_callback_del(
249 __search_searchbar_entry_changed_cb);
250 evas_object_smart_callback_del(
253 __search_searchbar_entry_focused_cb);
254 evas_object_smart_callback_del(
257 __search_searchbar_entry_unfocused_cb);
259 evas_object_del(ad->search_entry);
260 ad->search_entry = NULL;
263 if (ad->search_cancel_btn) {
264 evas_object_smart_callback_del(
265 ad->search_cancel_btn,
267 __search_searchbar_cancel_clicked_cb);
268 evas_object_del(ad->search_cancel_btn);
269 ad->search_cancel_btn = NULL;
272 ad->search_bar = elm_layout_add(ad->navi_bar);
273 elm_layout_theme_set(ad->search_bar , "layout", "searchbar", "cancel_button");
275 ad->search_cancel_btn = elm_button_add(ad->search_bar);
276 elm_object_part_content_set(ad->search_bar, "button_cancel", ad->search_cancel_btn);
277 elm_object_style_set(ad->search_cancel_btn, "searchbar/default");
278 elm_object_text_set(ad->search_cancel_btn, dgettext("sys_string", "IDS_COM_SK_CANCEL"));
280 ad->search_entry = elm_entry_add(ad->search_bar);
281 elm_entry_scrollable_set(ad->search_entry, EINA_TRUE);
282 elm_entry_single_line_set(ad->search_entry, EINA_TRUE);
283 elm_object_part_content_set(ad->search_bar, "elm.swallow.content", ad->search_entry);
284 elm_object_part_text_set(ad->search_bar, "elm.guidetext", dgettext("sys_string", "IDS_COM_BODY_SEARCH"));
285 elm_entry_cnp_mode_set(ad->search_entry, ELM_CNP_MODE_PLAINTEXT);
287 evas_object_size_hint_weight_set(ad->search_bar, EVAS_HINT_EXPAND, 0);
288 evas_object_size_hint_align_set(ad->search_bar, EVAS_HINT_FILL, 0.0);
290 elm_entry_input_panel_layout_set(ad->search_entry, ELM_INPUT_PANEL_LAYOUT_NORMAL);
291 Ecore_IMF_Context *imf_context = (Ecore_IMF_Context *)elm_entry_imf_context_get(ad->search_entry);
292 ecore_imf_context_input_panel_event_callback_add(imf_context,
293 ECORE_IMF_INPUT_PANEL_STATE_EVENT,
294 __search_searchbar_state_event_cb,
297 /* Set Searchbar Callback */
298 elm_object_signal_callback_add(
302 __search_searchbar_bg_clicked_cb,
304 elm_object_signal_callback_add(
306 "elm,eraser,clicked",
308 __search_searchbar_eraser_clicked_cb,
311 /* Set Search-Entry Callback */
312 evas_object_smart_callback_add(
315 __search_searchbar_entry_changed_cb,
317 evas_object_smart_callback_add(
320 __search_searchbar_entry_changed_cb,
323 evas_object_smart_callback_add(
326 __search_searchbar_entry_focused_cb,
328 evas_object_smart_callback_add(
331 __search_searchbar_entry_unfocused_cb,
333 evas_object_event_callback_add(
335 EVAS_CALLBACK_KEY_DOWN,
336 __search_searchbar_key_down_cb,
339 /* Set Searchbar Cancel Button Callback */
340 evas_object_smart_callback_add(
341 ad->search_cancel_btn,
343 __search_searchbar_cancel_clicked_cb,
346 evas_object_show(ad->search_bar);
351 static Evas_Object *__search_init_noresult_view(void *data)
355 struct appdata *ad = (struct appdata *)data;
358 noc = elm_layout_add(ad->navi_bar);
359 elm_layout_theme_set(noc, "layout", "nocontents", "search");
360 elm_object_part_text_set(noc, "elm.text", dgettext("sys_string", "IDS_COM_BODY_NO_SEARCH_RESULTS"));
361 elm_object_focus_allow_set(noc, EINA_TRUE);
368 Evas_Object *search_searchbar_category_icon_add(char* img, Evas_Object *parent)
372 char buf[MAX_LENGTH_PER_PATH] = { 0, };
373 Evas_Object* cate_icon = NULL;
376 cate_icon = elm_icon_add(parent);
378 snprintf(buf, sizeof(buf), SEARCH_ICON_PATH "%s", img);
380 SEARCH_DEBUG_LOG("buf : %s", buf);
382 elm_icon_file_set(cate_icon, buf, NULL);
384 evas_object_size_hint_aspect_set(cate_icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
385 elm_icon_resizable_set(cate_icon, EINA_FALSE, EINA_FALSE);
393 void search_searchbar_cb(void *data, Evas_Object * obj, void *event_info)
397 struct appdata *ad = (struct appdata *)data;
399 Evas_Object *cate_btn;
400 Evas_Object *cate_icon;
402 char *imgpath = NULL;
405 ad->sb_layout = elm_layout_add(ad->navi_bar);
406 elm_layout_file_set(ad->sb_layout,
408 "smartsearch/search_result");
410 category = SEARCH_CATE_PHONE;
412 imgpath = ad->category_info[ad->search_category].btn_icon_path;
413 cate_icon = search_searchbar_category_icon_add(imgpath, ad->sb_layout);
414 cate_btn = elm_button_add(ad->sb_layout);
415 elm_object_content_set(ad->cate_btn, cate_icon);
417 evas_object_show(cate_btn);
418 ad->cate_btn = cate_btn;
420 elm_object_part_content_set(ad->sb_layout, "searchbar_area_category", cate_btn);
422 /* set search bar area */
424 __search_searchbar_create(ad);
426 elm_object_part_content_set(ad->sb_layout, "searchbar_area_entry", ad->search_bar);
428 /* set search result area */
430 ad->noresult_view = __search_init_noresult_view(ad);
432 elm_object_part_content_set(ad->sb_layout,
436 evas_object_size_hint_weight_set(