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.
22 #include "smartsearch.h"
23 #include "ps_searcher.h"
24 #include "ps_app_interface.h"
26 static char *__search_get_phone_category_name(int type)
34 case SEARCH_TYPE_PHONE_CONTACTS:
36 name = dgettext("sys_string", "IDS_COM_BODY_CONTACTS");
39 case SEARCH_TYPE_PHONE_MSG:
41 name = dgettext("sys_string", "IDS_COM_BODY_MESSAGES");
44 case SEARCH_TYPE_PHONE_EMAIL:
46 name = dgettext("sys_string", "IDS_COM_BODY_EMAIL");
49 case SEARCH_TYPE_PHONE_IMAGES:
51 name = dgettext("sys_string", "IDS_COM_BODY_IMAGES");
54 case SEARCH_TYPE_PHONE_MUSIC:
56 name = dgettext("sys_string", "IDS_COM_BODY_MUSIC");
59 case SEARCH_TYPE_PHONE_VIDEO:
61 name = dgettext("sys_string", "IDS_COM_BODY_VIDEOS");
64 case SEARCH_TYPE_PHONE_CALENDAR:
66 name = dgettext("sys_string", "IDS_COM_BODY_CALENDAR");
69 case SEARCH_TYPE_PHONE_MEMO:
71 name = dgettext("sys_string", "IDS_COM_BODY_MEMO");
74 case SEARCH_TYPE_PHONE_MENU:
76 name = dgettext("sys_string", "IDS_COM_BODY_APPLICATIONS");
85 static Eina_Bool __search_gl_state_get(void *data, Evas_Object * obj,
91 static char *__search_gl_label_get(void *data, Evas_Object * obj,
99 struct search_item_sel *sel_mem_info = (struct search_item_sel *)data;
101 if (!SEARCH_STRCMP(part, "elm.text") || !SEARCH_STRCMP(part, "elm.text.1")) {
102 buf = g_strdup(sel_mem_info->main_buf);
103 } else if (!SEARCH_STRCMP(part, "elm.text.sub") || !SEARCH_STRCMP(part, "elm.text.2")) {
104 buf = g_strdup(sel_mem_info->sub_buf);
112 static char *__search_gl_label_get_title(void *data, Evas_Object * obj,
117 char* category_name = NULL;
119 struct search_item_sel *sel_mem = (struct search_item_sel *)data;
121 category_name = __search_get_phone_category_name(sel_mem->type);
124 return strdup(category_name);
129 static char *__search_gl_label_get_more(void *data, Evas_Object * obj,
132 return strdup(gettext("IDS_SSEARCH_BODY_MORE_RESULTS"));
135 static void __search_gl_del(void *data, Evas_Object * obj)
139 struct search_item_sel *sel_mem_info = (struct search_item_sel *)data;
141 SEARCH_FREE(sel_mem_info);
146 void search_gl_phone_result_sel(void *data, Evas_Object * obj, void *event_info)
150 struct appdata *ad = (struct appdata *)data;
151 struct search_item_sel *cur_category_mem;
152 Elm_Object_Item *it = (Elm_Object_Item *) event_info;
156 (struct search_item_sel *)elm_object_item_data_get(it);
157 if (cur_category_mem == NULL) {
161 switch (cur_category_mem->type) {
163 case SEARCH_TYPE_PHONE_CONTACTS:
164 search_launch_contact_view(ad, cur_category_mem);
167 case SEARCH_TYPE_PHONE_MSG:
168 search_launch_msg_view(ad, cur_category_mem);
171 case SEARCH_TYPE_PHONE_EMAIL:
172 search_launch_email_view(ad, cur_category_mem);
175 case SEARCH_TYPE_PHONE_IMAGES:
176 search_launch_image_view(ad, cur_category_mem);
179 case SEARCH_TYPE_PHONE_VIDEO:
180 search_launch_video_view(ad, cur_category_mem);
183 case SEARCH_TYPE_PHONE_MUSIC:
184 search_launch_music_view(ad, cur_category_mem);
187 case SEARCH_TYPE_PHONE_CALENDAR:
188 search_launch_calendar_view(ad, cur_category_mem);
191 case SEARCH_TYPE_PHONE_MEMO:
192 search_launch_memo_view(ad, cur_category_mem);
195 case SEARCH_TYPE_PHONE_MENU:
196 search_launch_menu_view(ad, cur_category_mem);
203 elm_genlist_item_selected_set(it, EINA_FALSE);
208 void search_result_gl_init(void *data)
212 struct appdata *ad = (struct appdata *)data;
213 Evas_Object *genlist;
216 if (ad->itc_pslist_1line == NULL) {
217 ad->itc_pslist_1line = elm_genlist_item_class_new();
218 ad->itc_pslist_1line->item_style = "1text.2";
219 ad->itc_pslist_1line->func.text_get = __search_gl_label_get;
220 ad->itc_pslist_1line->func.content_get = NULL;
221 ad->itc_pslist_1line->func.state_get = __search_gl_state_get;
222 ad->itc_pslist_1line->func.del = __search_gl_del;
226 if (ad->itc_pslist_2line == NULL) {
227 ad->itc_pslist_2line = elm_genlist_item_class_new();
228 ad->itc_pslist_2line->item_style = "2text.8";
229 ad->itc_pslist_2line->func.text_get = __search_gl_label_get;
230 ad->itc_pslist_2line->func.content_get = NULL;
231 ad->itc_pslist_2line->func.state_get = __search_gl_state_get;
232 ad->itc_pslist_2line->func.del = __search_gl_del;
235 if (ad->itc_grouptitle == NULL) {
236 ad->itc_grouptitle = elm_genlist_item_class_new();
237 ad->itc_grouptitle->item_style = "grouptitle";
238 ad->itc_grouptitle->func.text_get = __search_gl_label_get_title;
239 ad->itc_grouptitle->func.state_get = __search_gl_state_get;
240 ad->itc_grouptitle->func.del = __search_gl_del;
243 if (ad->itc_listmore == NULL) {
244 ad->itc_listmore = elm_genlist_item_class_new();
245 ad->itc_listmore->item_style = "1text.2";
246 ad->itc_listmore->func.text_get = __search_gl_label_get_more;
247 ad->itc_listmore->func.state_get = __search_gl_state_get;
248 ad->itc_listmore->func.del = __search_gl_del;
251 ad->search_gl = NULL;
253 genlist = elm_genlist_add(ad->navi_bar);
255 // To use multiline textblock/entry/editfield in genlist, set height_for_width mode
256 // then the item's height is calculated while the item's width fits to genlist width.
257 elm_genlist_mode_set(genlist, ELM_LIST_COMPRESS);
258 elm_genlist_tree_effect_enabled_set(genlist, EINA_TRUE);
260 ad->search_gl = genlist;
262 evas_object_size_hint_weight_set(genlist, EVAS_HINT_EXPAND,
264 evas_object_size_hint_align_set(genlist, EVAS_HINT_FILL,
269 void search_result_gl_deinit(void *data)
273 struct appdata *ad = (struct appdata *)data;
275 if (ad->itc_pslist_1line != NULL)
276 elm_genlist_item_class_free(ad->itc_pslist_1line);
278 if (ad->itc_pslist_2line != NULL)
279 elm_genlist_item_class_free(ad->itc_pslist_2line);
281 if (ad->itc_grouptitle != NULL)
282 elm_genlist_item_class_free(ad->itc_grouptitle);
284 if (ad->itc_listmore != NULL)
285 elm_genlist_item_class_free(ad->itc_listmore);
290 static int __search_gl_set_phone_search_result(int type, int offset, char *keyword,
301 int sel_cnt = SEARCH_CATEGORY_LIST_MORE_CNT + 1;
304 struct appdata *ad = (struct appdata *)data;
307 ad->cate_info[type].offset = offset;
310 ad->cate_info[type].next_point = 0;
315 case SEARCH_TYPE_PHONE_CONTACTS:
318 search_sql_contact_search_result_by_api(type,
325 case SEARCH_TYPE_PHONE_MSG:
327 if (ad->msg_handle != NULL) {
329 search_sql_msg_search_result_by_api(type,
337 case SEARCH_TYPE_PHONE_EMAIL:
340 search_sql_email_search_result_by_api(type,
346 case SEARCH_TYPE_PHONE_IMAGES:
348 if (ad->media_handle != NULL ) {
350 search_sql_image_search_result_by_api(type,
357 case SEARCH_TYPE_PHONE_MUSIC:
359 if (ad->media_handle != NULL ) {
361 search_sql_music_search_result_by_api(type,
368 case SEARCH_TYPE_PHONE_VIDEO:
370 if (ad->media_handle != NULL ) {
372 search_sql_video_search_result_by_api(type,
380 case SEARCH_TYPE_PHONE_CALENDAR:
383 search_sql_calendar_search_result_by_api(type,
390 case SEARCH_TYPE_PHONE_MEMO:
393 search_sql_memo_search_result_by_api(type,
400 case SEARCH_TYPE_PHONE_MENU:
403 search_sql_menu_search_result_by_api(type,
417 void search_gl_result_more_item_append_cb(void *data, Evas_Object * obj,
422 struct appdata *ad = (struct appdata *)data;
423 Elm_Object_Item *it = (Elm_Object_Item *) event_info;
427 struct search_item_sel *sel_mem =
428 (search_item_sel *) elm_object_item_data_get(it);
429 struct search_item_sel *sel_mem_info = NULL;
430 struct search_item_sel *sel_mem_more = NULL;
432 char* escape_added_keyword = NULL;
433 SEARCH_MALLOC(escape_added_keyword, strlen(ad->search_word)*2+5, char);
434 memset(escape_added_keyword, 0x0, strlen(ad->search_word)*2+5);
437 int type = sel_mem->type;
438 int offset = ad->cate_info[type].next_point;
440 search_sql_make_keyword_bind_value(ad->search_word, escape_added_keyword, SEARCH_SQL_BIND_TYPE_DUPLEX);
442 elm_object_item_del(it);
444 __search_gl_set_phone_search_result(type, offset, escape_added_keyword, ad);
449 static int __search_set_phone_result_list(struct appdata *ad, bool is_input_keyword, const char* search_keyword)
453 int i = 0, is_search_result = 0, ret = 0;
455 if (is_input_keyword == false) {
456 return SEARCH_RET_SEARCH_NONE;
461 while (i < PHONE_CATEGORY_LIST_CNT) {
462 ret = __search_gl_set_phone_search_result(i,
464 (char*)search_keyword,
466 if (ret == SEARCH_RET_SEARCH_SUCCESS) {
467 is_search_result = 1;
473 if(is_search_result == 0) {
474 return SEARCH_RET_SEARCH_NONE;
476 return SEARCH_RET_SEARCH_SUCCESS;
481 Eina_Bool search_set_result_list(void *data)
485 struct appdata *ad = (struct appdata *)data;
488 bool is_input_keyword = false;
489 char* escape_added_keyword = NULL;
491 int search_ret = SEARCH_RET_SEARCH_NONE;
493 SEARCH_ASSERT_IF(!ad);
495 text = elm_entry_markup_to_utf8(elm_object_text_get(ad->search_entry));
497 SEARCH_FREE(ad->not_markup_search_word);
498 SEARCH_FREE(ad->search_word);
500 if((text) && (strlen(text) > 0)) {
501 ad->not_markup_search_word = strdup(elm_object_text_get(ad->search_entry));
502 ad->search_word = text;
504 SEARCH_MALLOC(escape_added_keyword, strlen(ad->search_word)*2+5, char);
505 memset(escape_added_keyword, 0x0, strlen(ad->search_word)*2+5);
507 bind_type = SEARCH_SQL_BIND_TYPE_DUPLEX;
509 search_sql_make_keyword_bind_value(ad->search_word, escape_added_keyword, bind_type);
510 is_input_keyword = true;
512 elm_genlist_clear(ad->search_gl);
514 search_ret = __search_set_phone_result_list(ad, is_input_keyword, ad->search_word);
517 if(search_ret == SEARCH_RET_SEARCH_SUCCESS) {
518 search_layout_set_search_list(ad);
520 search_layout_set_search_no_result(ad);
523 SEARCH_FREE(escape_added_keyword);
530 void search_layout_set_search_list(void* data)
534 struct appdata *ad = (struct appdata *)data;
536 if (elm_object_part_content_get(ad->sb_layout,"list_noresult")) {
537 elm_object_part_content_unset(ad->sb_layout,"list_noresult");
538 evas_object_hide(ad->noresult_view);
540 elm_object_part_content_set(ad->sb_layout, "list", ad->search_gl);
541 evas_object_show(ad->search_gl);
544 elm_genlist_item_show(elm_genlist_first_item_get(ad->search_gl), ELM_GENLIST_ITEM_SCROLLTO_TOP);
550 void search_layout_set_search_no_result(void* data)
554 struct appdata *ad = (struct appdata *)data;
556 if (elm_object_part_content_get(ad->sb_layout,"list")) {
557 elm_object_part_content_unset(ad->sb_layout, "list");
558 evas_object_hide(ad->search_gl);
560 elm_object_part_content_set(ad->sb_layout,"list_noresult", ad->noresult_view);
561 evas_object_show(ad->noresult_view);
569 int search_layout_get_content_list_set_status(void* data)
573 struct appdata *ad = (struct appdata *)data;
576 if (elm_object_part_content_get(ad->sb_layout,"list")) {
577 ret = SEARCH_RET_SUCCESS;
579 ret = SEARCH_RET_FAIL;