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 static const char* g_search_category_icon[SEARCH_CATE_BTN_IMG_TYPE_MAX] =
29 "B10_Phone_press.png",
32 void __search_searchbar_entry_changed_cb(void *data, Evas_Object * obj,
37 struct appdata *ad = (struct appdata *)data;
39 text = elm_entry_markup_to_utf8(elm_object_text_get(ad->search_entry));
41 SEARCH_DEBUG_LOG("text : %s", text);
43 if (elm_object_focus_get(ad->search_bar)) {
44 if (elm_entry_is_empty(ad->search_entry))
45 elm_object_signal_emit(ad->search_bar, "elm,state,eraser,hide", "elm");
47 elm_object_signal_emit(ad->search_bar, "elm,state,eraser,show", "elm");
49 if (elm_entry_is_empty(ad->search_entry))
50 elm_object_signal_emit(ad->search_bar, "elm,state,guidetext,show", "elm");
52 elm_object_signal_emit(ad->search_bar, "elm,state,guidetext,hide", "elm");
55 if ((text != NULL) && (strlen(text) > 0)
56 && (SEARCH_STRCMP(text, ad->search_word) == 0)) {
57 SEARCH_DEBUG_LOG("text is same as prev text");
60 ecore_idler_del(ad->idler_search);
62 ad->idler_search = ecore_idler_add(search_set_result_list, ad);
70 static void __search_searchbar_entry_focused_cb(void *data, Evas_Object *obj, void *event_info)
74 struct appdata *ad = (struct appdata *)data;
76 if (!elm_entry_is_empty(ad->search_entry))
77 elm_object_signal_emit(ad->search_bar, "elm,state,eraser,show", "elm");
79 elm_object_signal_emit(ad->search_bar, "elm,state,guidetext,hide", "elm");
80 elm_object_signal_emit(ad->search_bar, "cancel,in", "");
85 static void __search_searchbar_entry_unfocused_cb(void *data, Evas_Object *obj, void *event_info)
89 struct appdata *ad = (struct appdata *)data;
91 if (elm_entry_is_empty(ad->search_entry))
92 elm_object_signal_emit(ad->search_bar, "elm,state,guidetext,show", "elm");
94 elm_object_signal_emit(ad->search_bar, "elm,state,eraser,hide", "elm");
99 static void __search_searchbar_bg_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
103 struct appdata *ad = (struct appdata *)data;
105 elm_object_focus_set(ad->search_entry, EINA_TRUE);
110 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.
114 struct appdata *ad = (struct appdata *)data;
116 elm_entry_entry_set(ad->search_entry, "");
121 static void __search_searchbar_key_down_cb(void *data, Evas * e, Evas_Object * obj, void *event_info)
125 struct appdata *ad = (struct appdata *)data;
126 Evas_Event_Key_Down *ev = (Evas_Event_Key_Down *) event_info;
128 if (SEARCH_STRCMP(ev->key, "Return") == 0) {
129 ecore_imf_context_input_panel_hide
130 ((Ecore_IMF_Context *)elm_entry_imf_context_get
137 static void __search_searchbar_cancel_clicked_cb(void *data, Evas_Object * obj,
142 struct appdata *ad = (struct appdata *)data;
146 elm_object_focus_set(ad->cate_btn, EINA_TRUE);
147 evas_object_hide(ad->search_cancel_btn);
148 elm_object_signal_emit(ad->search_bar, "cancel,out", "");
149 text = elm_entry_entry_get(ad->search_entry);
151 if (text != NULL && strlen(text) > 0)
152 elm_entry_entry_set(ad->search_entry, NULL);
154 search_set_result_list(ad);
161 static void __search_searchbar_gl_drag_scroll_start_cb(void *data, Evas_Object * obj, void *event_info)
165 struct appdata *ad = (struct appdata *)data;
167 Ecore_IMF_Context *imf_context = (Ecore_IMF_Context *)elm_entry_imf_context_get(ad->search_entry);
170 ecore_imf_context_input_panel_hide(imf_context);
178 __search_searchbar_state_event_cb(void *data, Ecore_IMF_Context *imf_context, int value)
182 struct appdata *ad = (struct appdata *)data;
186 case ECORE_IMF_INPUT_PANEL_STATE_SHOW:
187 evas_object_smart_callback_add(
190 __search_searchbar_gl_drag_scroll_start_cb,
193 case ECORE_IMF_INPUT_PANEL_STATE_HIDE:
194 // ISE state has changed to ISE_STATE_HIDE status
195 evas_object_smart_callback_del(
198 __search_searchbar_gl_drag_scroll_start_cb);
205 static void __search_searchbar_create(void *data)
209 struct appdata *ad = (struct appdata *)data;
213 if (ad->search_bar) {
214 elm_object_signal_callback_del(
218 __search_searchbar_bg_clicked_cb);
219 elm_object_signal_callback_del(
221 "elm,eraser,clicked",
223 __search_searchbar_eraser_clicked_cb);
225 evas_object_del(ad->search_bar);
226 ad->search_bar = NULL;
229 if (ad->search_entry) {
230 evas_object_smart_callback_del(
233 __search_searchbar_entry_changed_cb);
234 evas_object_smart_callback_del(
237 __search_searchbar_entry_changed_cb);
238 evas_object_smart_callback_del(
241 __search_searchbar_entry_focused_cb);
242 evas_object_smart_callback_del(
245 __search_searchbar_entry_unfocused_cb);
247 evas_object_del(ad->search_entry);
248 ad->search_entry = NULL;
251 if (ad->search_cancel_btn) {
252 evas_object_smart_callback_del(
253 ad->search_cancel_btn,
255 __search_searchbar_cancel_clicked_cb);
256 evas_object_del(ad->search_cancel_btn);
257 ad->search_cancel_btn = NULL;
260 ad->search_bar = elm_layout_add(ad->navi_bar);
261 elm_layout_theme_set(ad->search_bar , "layout", "searchbar", "cancel_button");
263 ad->search_cancel_btn = elm_button_add(ad->search_bar);
264 elm_object_part_content_set(ad->search_bar, "button_cancel", ad->search_cancel_btn);
265 elm_object_style_set(ad->search_cancel_btn, "searchbar/default");
266 elm_object_text_set(ad->search_cancel_btn, dgettext("sys_string", "IDS_COM_SK_CANCEL"));
268 ad->search_entry = elm_entry_add(ad->search_bar);
269 elm_entry_scrollable_set(ad->search_entry, EINA_TRUE);
270 elm_entry_single_line_set(ad->search_entry, EINA_TRUE);
271 elm_object_part_content_set(ad->search_bar, "elm.swallow.content", ad->search_entry);
272 elm_object_part_text_set(ad->search_bar, "elm.guidetext", dgettext("sys_string", "IDS_COM_BODY_SEARCH"));
273 elm_entry_cnp_mode_set(ad->search_entry, ELM_CNP_MODE_PLAINTEXT);
275 evas_object_size_hint_weight_set(ad->search_bar, EVAS_HINT_EXPAND, 0);
276 evas_object_size_hint_align_set(ad->search_bar, EVAS_HINT_FILL, 0.0);
278 elm_entry_input_panel_layout_set(ad->search_entry, ELM_INPUT_PANEL_LAYOUT_NORMAL);
279 Ecore_IMF_Context *imf_context = (Ecore_IMF_Context *)elm_entry_imf_context_get(ad->search_entry);
280 ecore_imf_context_input_panel_event_callback_add(imf_context,
281 ECORE_IMF_INPUT_PANEL_STATE_EVENT,
282 __search_searchbar_state_event_cb,
285 /* Set Searchbar Callback */
286 elm_object_signal_callback_add(
290 __search_searchbar_bg_clicked_cb,
292 elm_object_signal_callback_add(
294 "elm,eraser,clicked",
296 __search_searchbar_eraser_clicked_cb,
299 /* Set Search-Entry Callback */
300 evas_object_smart_callback_add(
303 __search_searchbar_entry_changed_cb,
305 evas_object_smart_callback_add(
308 __search_searchbar_entry_changed_cb,
311 evas_object_smart_callback_add(
314 __search_searchbar_entry_focused_cb,
316 evas_object_smart_callback_add(
319 __search_searchbar_entry_unfocused_cb,
321 evas_object_event_callback_add(
323 EVAS_CALLBACK_KEY_DOWN,
324 __search_searchbar_key_down_cb,
327 /* Set Searchbar Cancel Button Callback */
328 evas_object_smart_callback_add(
329 ad->search_cancel_btn,
331 __search_searchbar_cancel_clicked_cb,
334 evas_object_show(ad->search_bar);
339 static Evas_Object *__search_init_noresult_view(void *data)
343 struct appdata *ad = (struct appdata *)data;
346 noc = elm_layout_add(ad->navi_bar);
347 elm_layout_theme_set(noc, "layout", "nocontents", "search");
348 elm_object_part_text_set(noc, "elm.text", dgettext("sys_string", "IDS_COM_BODY_NO_SEARCH_RESULTS"));
349 elm_object_focus_allow_set(noc, EINA_TRUE);
356 Evas_Object *search_searchbar_category_icon_add(int cate_type, int press_type, Evas_Object *parent)
360 Evas_Object* cate_icon;
361 char buf[128] = { 0, };
363 cate_icon = elm_icon_add(parent);
365 snprintf(buf, sizeof(buf), SEARCH_ICON_PATH "%s", g_search_category_icon[press_type]);
367 elm_icon_file_set(cate_icon, buf, NULL);
369 evas_object_size_hint_aspect_set(cate_icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
370 elm_icon_resizable_set(cate_icon, EINA_TRUE, EINA_TRUE);
377 void search_searchbar_cb(void *data, Evas_Object * obj, void *event_info)
381 struct appdata *ad = (struct appdata *)data;
383 Evas_Object *cate_btn;
384 Evas_Object *cate_icon;
390 ad->sb_layout = elm_layout_add(ad->navi_bar);
391 elm_layout_file_set(ad->sb_layout,
393 "smartsearch/search_result");
395 category = SEARCH_TYPE_PHONE;
397 cate_icon = search_searchbar_category_icon_add(category,
398 SEARCH_CATE_BTN_IMG_TYPE_UNPRESSED,
401 cate_btn = elm_button_add(ad->sb_layout);
402 elm_object_content_set(ad->cate_btn, cate_icon);
404 evas_object_show(cate_btn);
405 ad->cate_btn = cate_btn;
407 elm_object_part_content_set(ad->sb_layout, "searchbar_area_category", cate_btn);
409 /* set search bar area */
410 __search_searchbar_create(ad);
411 elm_object_part_content_set(ad->sb_layout, "searchbar_area_entry", ad->search_bar);
413 /* set search result area */
414 ad->noresult_view = __search_init_noresult_view(ad);
416 elm_object_part_content_set(ad->sb_layout,
420 evas_object_size_hint_weight_set(