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 Evas_Object* __search_searchbar_create(void *data)
215 struct appdata *ad = (struct appdata *)data;
217 Evas_Object *search_layout = NULL;
218 Evas_Object *cate_btn;
219 Evas_Object *cate_icon;
220 char *imgpath = NULL;
225 if (ad->search_bar) {
226 elm_object_signal_callback_del(ad->search_bar, "elm,bg,clicked", "elm",
227 __search_searchbar_bg_clicked_cb);
228 elm_object_signal_callback_del(ad->search_bar, "elm,eraser,clicked", "elm",
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(ad->search_entry, "changed",
237 __search_searchbar_entry_changed_cb);
238 evas_object_smart_callback_del(ad->search_entry, "preedit,changed",
239 __search_searchbar_entry_changed_cb);
240 evas_object_smart_callback_del(ad->search_entry, "focused",
241 __search_searchbar_entry_focused_cb);
242 evas_object_smart_callback_del(ad->search_entry, "unfocused",
243 __search_searchbar_entry_unfocused_cb);
245 evas_object_del(ad->search_entry);
246 ad->search_entry = NULL;
249 if (ad->search_cancel_btn) {
250 evas_object_smart_callback_del(ad->search_cancel_btn, "clicked",
251 __search_searchbar_cancel_clicked_cb);
252 evas_object_del(ad->search_cancel_btn);
253 ad->search_cancel_btn = NULL;
256 search_layout = elm_layout_add(ad->sb_layout);
257 elm_layout_file_set(search_layout,
259 "smartsearch/search_bar");
261 imgpath = ad->category_info[ad->search_category].btn_icon_path;
262 cate_icon = search_searchbar_category_icon_add(imgpath, search_layout);
263 cate_btn = elm_button_add(search_layout);
265 elm_object_style_set(cate_btn, "icon");
266 elm_object_content_set(ad->cate_btn, cate_icon);
268 evas_object_show(cate_btn);
269 ad->cate_btn = cate_btn;
271 elm_object_part_content_set(search_layout, "searchbar_area_category", cate_btn);
273 ad->search_cancel_btn = elm_button_add(ad->search_bar);
274 elm_object_part_content_set(ad->search_bar, "button_cancel", ad->search_cancel_btn);
275 elm_object_style_set(ad->search_cancel_btn, "searchbar/default");
276 elm_object_text_set(ad->search_cancel_btn, dgettext("sys_string", "IDS_COM_SK_CANCEL"));
278 ad->search_entry = elm_entry_add(ad->search_bar);
279 elm_entry_scrollable_set(ad->search_entry, EINA_TRUE);
280 elm_entry_single_line_set(ad->search_entry, EINA_TRUE);
281 elm_object_part_content_set(ad->search_bar, "elm.swallow.content", ad->search_entry);
282 elm_object_part_text_set(ad->search_bar, "elm.guidetext", dgettext("sys_string", "IDS_COM_BODY_SEARCH"));
283 elm_entry_cnp_mode_set(ad->search_entry, ELM_CNP_MODE_PLAINTEXT);
285 evas_object_size_hint_weight_set(ad->search_bar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
286 evas_object_size_hint_align_set(ad->search_bar, EVAS_HINT_FILL, EVAS_HINT_FILL);
288 elm_entry_input_panel_layout_set(ad->search_entry, ELM_INPUT_PANEL_LAYOUT_NORMAL);
289 Ecore_IMF_Context *imf_context = (Ecore_IMF_Context *)elm_entry_imf_context_get(ad->search_entry);
290 ecore_imf_context_input_panel_event_callback_add(imf_context,
291 ECORE_IMF_INPUT_PANEL_STATE_EVENT,
292 __search_searchbar_state_event_cb,
295 elm_object_part_content_set(search_layout, "searchbar_area_entry", ad->search_bar);
297 /* Set Searchbar Callback */
298 elm_object_signal_callback_add(ad->search_bar, "elm,bg,clicked", "elm",
299 __search_searchbar_bg_clicked_cb,
301 elm_object_signal_callback_add(ad->search_bar, "elm,eraser,clicked", "elm",
302 __search_searchbar_eraser_clicked_cb,
305 /* Set Search-Entry Callback */
306 evas_object_smart_callback_add(ad->search_entry, "changed",
307 __search_searchbar_entry_changed_cb,
309 evas_object_smart_callback_add(ad->search_entry, "preedit,changed",
310 __search_searchbar_entry_changed_cb,
313 evas_object_smart_callback_add(ad->search_entry, "focused",
314 __search_searchbar_entry_focused_cb,
316 evas_object_smart_callback_add(ad->search_entry, "unfocused",
317 __search_searchbar_entry_unfocused_cb,
319 evas_object_event_callback_add(ad->search_entry, EVAS_CALLBACK_KEY_DOWN,
320 __search_searchbar_key_down_cb,
323 /* Set Searchbar Cancel Button Callback */
324 evas_object_smart_callback_add(ad->search_cancel_btn, "clicked",
325 __search_searchbar_cancel_clicked_cb,
328 evas_object_show(ad->search_bar);
330 return search_layout;
335 static Evas_Object *__search_init_noresult_view(void *data)
339 struct appdata *ad = (struct appdata *)data;
342 noc = elm_layout_add(ad->navi_bar);
343 elm_layout_theme_set(noc, "layout", "nocontents", "search");
344 elm_object_part_text_set(noc, "elm.text", dgettext("sys_string", "IDS_COM_BODY_NO_SEARCH_RESULTS"));
345 elm_object_focus_allow_set(noc, EINA_TRUE);
352 Evas_Object *search_searchbar_category_icon_add(char* img, Evas_Object *parent)
356 char buf[MAX_LENGTH_PER_PATH] = { 0, };
357 Evas_Object* cate_icon = NULL;
360 cate_icon = elm_icon_add(parent);
362 snprintf(buf, sizeof(buf), SEARCH_ICON_PATH "%s", img);
364 SEARCH_DEBUG_LOG("buf : %s", buf);
366 elm_icon_file_set(cate_icon, buf, NULL);
368 evas_object_size_hint_aspect_set(cate_icon, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
369 elm_icon_resizable_set(cate_icon, EINA_FALSE, EINA_FALSE);
377 void search_searchbar_cb(void *data, Evas_Object * obj, void *event_info)
381 struct appdata *ad = (struct appdata *)data;
385 ad->sb_layout = elm_layout_add(ad->navi_bar);
386 elm_layout_theme_set(ad->sb_layout, "layout", "application", "searchbar_base");
387 elm_object_signal_emit(ad->sb_layout, "elm,state,show,searchbar", "elm");
389 /* set search bar area */
390 ad->search_layout = __search_searchbar_create(ad);
391 elm_object_part_content_set(ad->sb_layout, "searchbar", ad->search_layout);
393 /* set search result area */
394 ad->result_layout = elm_layout_add(ad->sb_layout);
395 elm_layout_file_set(ad->result_layout,
397 "smartsearch/search_result");
399 /* set search result area */
400 ad->noresult_view = __search_init_noresult_view(ad);
402 elm_object_part_content_set(ad->result_layout,
406 elm_object_part_content_set(ad->sb_layout, "elm.swallow.content", ad->result_layout);
407 evas_object_size_hint_weight_set(