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.
18 #include "msg-ui-thread-main.h"
20 static void __msg_ui_thread_insert_and_select_gen_item(PMSG_THREAD_LIST_DATA pListData);
21 static void __msg_ui_thread_add_navi_select_all_ly(PMSG_THREAD_LIST_DATA pListData);
22 static void __msg_ui_thread_sel_all_ly_mouse_down_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info);
23 static void __msg_ui_thread_del_finish(PMSG_THREAD_LIST_DATA pListData);
24 static void __msg_ui_thread_del_thread_fn(void *data, Ecore_Thread *thread);
25 static void __msg_ui_thread_del_thread_feedback_fn(void *data, Ecore_Thread *thread, void *msg_data);
26 static Eina_Bool __msg_ui_thread_searchbar_entry_timer_cb(void *data);
28 static void __msg_ui_thread_ctxpopup_clicked_cb(void *data, Evas_Object *obj, void *event_info);
29 static void __msg_ui_thread_ctxpopup_dismissed_cb(void *data, Evas_Object *obj, void *event_info);
30 static void __msg_ui_thread_addr_select_popup(PMSG_THREAD_LIST_DATA pListData, const char *title, int thread_id);
31 void __msg_ui_thread_popup_gl_sel(void *data, Evas_Object *obj, void *event_info);
32 static void __msg_ui_thread_close_clicked_cb(void *data, Evas_Object *obj, void *event_info);
33 static void __msg_ui_thread_popup_gl_del(void *data, Evas_Object *obj);
34 static char *__msg_ui_thread_popup_gl_text_get(void *data, Evas_Object *obj, const char *part);
37 void msg_ui_thread_storage_change_cb(msg_handle_t handle, msg_storage_change_type_t type, msg_id_list_s *pMsgIdList, void *user_param)
42 if (!user_param || !pMsgIdList)
45 PMSG_THREAD_DATA pData = user_param;
46 PMSG_THREAD_LIST_DATA pListData = NULL;
48 if (msg_ui_thread_get_app_state(pData) == MSG_UI_STATE_DESTROY)
51 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "type is %d", type);
53 for (i = 0; i < MSG_THREAD_LIST_MAX_COUNT; i++) {
54 if (pData->list_data[i] != NULL)
55 pListData = pData->list_data[i];
59 if (type == MSG_STORAGE_CHANGE_CONTACT) {
60 if (pListData->app_data_type == THREAD_LIST_APP_DATA_THREAD)
61 msg_ui_thread_list_update(pListData);
63 msg_ui_thread_list_msg_list_update(pListData);
64 } else if (type == MSG_STORAGE_CHANGE_INSERT) {
65 if (pListData->view_mode == THREAD_EDIT_VIEW) {
66 pData->isIncomingMsg = true;
67 D_MSG("Current mode is EDIT.");
70 __msg_ui_thread_insert_and_select_gen_item(pListData);
71 } else if (type == MSG_STORAGE_CHANGE_DELETE) {
72 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "delete count is %d", pMsgIdList->nCount);
73 if (pListData->app_data_type == THREAD_LIST_APP_DATA_MSG) {
74 for (i = 0; i < pMsgIdList->nCount; i++) {
75 msg_ui_thread_list_msg_item_delete(pListData, pMsgIdList->msgIdList[i]);
78 } else if (type == MSG_STORAGE_CHANGE_UPDATE) {
79 for (i = 0; i < pMsgIdList->nCount; i++) {
80 msg_struct_t msgInfo = msg_create_struct(MSG_STRUCT_MESSAGE_INFO);
81 msg_struct_t sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT);
82 msg_error_t err = MSG_SUCCESS;
84 err = msg_get_message(pData->msgHandle, pMsgIdList->msgIdList[i], msgInfo, sendOpt);
86 if (err != MSG_SUCCESS) {
87 msg_release_struct(&msgInfo);
88 msg_release_struct(&sendOpt);
92 msg_folder_id_t folder_id = 0;
93 msg_get_int_value(msgInfo, MSG_MESSAGE_FOLDER_ID_INT, (int *)&folder_id);
95 if (folder_id != MSG_SPAMBOX_ID) {
96 if (pListData->app_data_type == THREAD_LIST_APP_DATA_THREAD) {
98 msg_get_int_value(msgInfo, MSG_MESSAGE_THREAD_ID_INT, &thread_id);
99 msg_ui_thread_list_item_update(pListData, thread_id);
102 msg_get_int_value(msgInfo, MSG_MESSAGE_ID_INT, &msg_id);
103 msg_ui_thread_list_msg_item_update(pListData, msg_id);
107 msg_release_struct(&msgInfo);
108 msg_release_struct(&sendOpt);
116 static void __msg_ui_thread_insert_and_select_gen_item(PMSG_THREAD_LIST_DATA pListData)
120 int sel_thread_id = 0, sel_msg_id = 0;
122 if (pListData->sel_gen_item) {
123 sel_thread_id = pListData->sel_thread_id;
124 sel_msg_id = pListData->sel_msg_id;
127 if (pListData->app_data_type == THREAD_LIST_APP_DATA_MSG) {
128 msg_ui_thread_search_msg_list_load(pListData);
129 msg_ui_thread_select_item_by_msg_id(pListData, sel_msg_id);
131 msg_ui_thread_list_load(pListData, FALSE);
132 msg_ui_thread_select_item_by_thread_id(pListData, sel_thread_id);
137 void msg_ui_thread_ctlbar_del_cb(void *data, Evas_Object *obj, void *event_info)
140 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
142 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
143 MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, pListData->del_thread);
145 if (pListData->popup) {
146 evas_object_del(pListData->popup);
147 pListData->popup = NULL;
150 pListData->popup = msg_ui_thread_show_notify_with_progressbar(pListData, pListData->check_cnt);
151 pListData->del_thread = ecore_thread_feedback_run(__msg_ui_thread_del_thread_fn, __msg_ui_thread_del_thread_feedback_fn, NULL, NULL, (void *)pListData, EINA_TRUE);
154 static void __msg_ui_thread_del_thread_feedback_fn(void *data, Ecore_Thread *thread, void *msg_data)
156 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !thread || !data || !msg_data);
158 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
159 char buf[DEF_BUF_LEN_S] = {0,};
162 if (*ret == MSG_SUCCESS) {
163 if (pListData->progressbar) {
164 snprintf(buf, sizeof(buf), "%d/%d %s", pListData->del_index+1, pListData->check_cnt, dgettext("sys_string", "IDS_COM_POP_DELETED"));
165 elm_object_text_set(pListData->progresslabel, buf);
166 elm_progressbar_value_set(pListData->progressbar, (double)(pListData->del_index+1)/pListData->check_cnt);
170 /** __msg_ui_thread_del_finish function contains evas_object_del(thread_data->popup), */
171 /** so, call __msg_ui_thread_del_finish() first, after that make "unable to delete" popup */
172 __msg_ui_thread_del_finish(pListData);
173 msg_ui_thread_show_notify(pListData, dgettext("sys_string", "IDS_COM_POP_UNABLE_TO_DELETE"));
177 if (pListData->del_index + 1 == pListData->check_cnt) {
178 msg_ui_thread_show_deleted_info(pListData);
179 __msg_ui_thread_del_finish(pListData);
181 pListData->del_index++;
188 static void __msg_ui_thread_del_thread_fn(void *data, Ecore_Thread *thread)
192 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data);
194 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
197 void* item_data = NULL;
199 EINA_LIST_FOREACH(pListData->chk_list, list, item_data) {
200 int *ret = calloc(1, sizeof(int));
203 if (pListData->list_type == THREAD_NORMAL_LIST_TYPE) {
204 PMSG_APP_THREAD_DATA_S data = (PMSG_APP_THREAD_DATA_S)item_data;
205 *ret = msg_delete_thread_message_list(msg_ui_thread_get_data_handle(), data->thread_id);
207 PMSG_APP_THREAD_MSG_DATA_S data = (PMSG_APP_THREAD_MSG_DATA_S)item_data;
208 *ret = msg_delete_message(msg_ui_thread_get_data_handle(), data->msg_id);
210 ecore_thread_feedback(thread, (void *)ret);
212 if (*ret != MSG_SUCCESS)
215 *ret = MSG_ERR_NULL_POINTER;
216 ecore_thread_feedback(thread, (void *)ret);
222 static void __msg_ui_thread_del_finish(PMSG_THREAD_LIST_DATA pListData)
224 if (pListData->popup) {
225 evas_object_del(pListData->popup);
226 pListData->popup = NULL;
229 pListData->del_thread = NULL;
231 msg_ui_thread_show_normal_mode(pListData);
233 if (pListData->list_type == THREAD_NORMAL_LIST_TYPE)
234 msg_ui_thread_list_load(pListData, FALSE);
236 msg_ui_thread_msg_list_load(pListData, pListData->list_type);
239 void msg_ui_thread_ctlbar_checkbox_cb(void *data, Evas_Object *obj, void *event_info)
242 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
244 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
245 Elm_Object_Item* it_sweep = NULL;
246 char buf[DEF_BUF_LEN_S] = {0};
248 pListData->view_mode = THREAD_EDIT_VIEW;
249 pListData->check_cnt = 0;
250 pListData->del_index = 0;
252 elm_object_item_part_content_unset(pListData->nf_it, "prev_btn");
253 if (pListData->back_btn) {
254 evas_object_del(pListData->back_btn);
255 pListData->back_btn = NULL;
258 it_sweep = (Elm_Object_Item *)elm_genlist_decorated_item_get(pListData->genlist);
261 elm_genlist_item_decorate_mode_set(it_sweep, "slide", EINA_FALSE);
262 elm_genlist_item_select_mode_set(it_sweep, ELM_OBJECT_SELECT_MODE_DEFAULT);
263 elm_genlist_item_update(it_sweep);
266 elm_genlist_decorate_mode_set(pListData->genlist, EINA_TRUE);
267 elm_genlist_select_mode_set(pListData->genlist, ELM_OBJECT_SELECT_MODE_ALWAYS);
269 if (pListData->list_type == THREAD_LOCKED_LIST_TYPE || pListData->list_type == THREAD_SIM_LIST_TYPE || pListData->list_type == THREAD_SCHEDULED_LIST_TYPE)
270 snprintf(buf, sizeof(buf), "%s", dgettext("sys_string", "IDS_COM_SK_EDIT"));
272 snprintf(buf, sizeof(buf), "%s", dgettext("sys_string", "IDS_COM_SK_DELETE"));
274 elm_object_item_text_set(pListData->nf_it, buf);
276 msg_ui_thread_set_navi_controlbar_item(pListData);
277 __msg_ui_thread_add_navi_select_all_ly(pListData);
282 static void __msg_ui_thread_add_navi_select_all_ly(PMSG_THREAD_LIST_DATA pListData)
284 PMSG_THREAD_DATA pData = msg_ui_thread_get_data();
287 MSG_UI_DEBUG(MSG_UI_LEVEL_ASSERT,"[ASSERT] pListData is NULL");
291 if (!pListData->sel_all_ly) {
292 pListData->sel_all_ly = elm_layout_add(pData->navi_frame);
293 elm_layout_theme_set(pListData->sel_all_ly, "genlist", "item", "select_all/default");
294 evas_object_size_hint_weight_set(pListData->sel_all_ly, EVAS_HINT_EXPAND, EVAS_HINT_FILL);
295 evas_object_size_hint_align_set(pListData->sel_all_ly, EVAS_HINT_FILL, EVAS_HINT_FILL);
296 evas_object_event_callback_add(pListData->sel_all_ly, EVAS_CALLBACK_MOUSE_DOWN, __msg_ui_thread_sel_all_ly_mouse_down_cb, pListData);
298 pListData->sel_all_box = elm_check_add(pListData->sel_all_ly);
299 elm_check_state_pointer_set(pListData->sel_all_box, &pListData->sel_all_checked);
300 evas_object_propagate_events_set(pListData->sel_all_box, EINA_FALSE);
301 evas_object_smart_callback_add(pListData->sel_all_box, "changed", msg_ui_thread_sel_all_clicked_cb, pListData);
302 evas_object_show(pListData->sel_all_box);
304 elm_object_part_content_set(pListData->sel_all_ly, "elm.icon", pListData->sel_all_box);
305 elm_object_part_text_set(pListData->sel_all_ly, "elm.text", dgettext("sys_string", "IDS_COM_BODY_SELECT_ALL"));
308 evas_object_show(pListData->sel_all_ly);
309 elm_object_part_content_unset(pListData->content_ly, "sel_all");
310 evas_object_hide(pListData->searchbar);
311 elm_object_part_content_set(pListData->content_ly, "sel_all", pListData->sel_all_ly);
314 static void __msg_ui_thread_sel_all_ly_mouse_down_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info)
318 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
320 pListData->sel_all_checked = !pListData->sel_all_checked;
321 elm_check_state_pointer_set(pListData->sel_all_box, &pListData->sel_all_checked);
323 msg_ui_thread_sel_all_clicked_cb(pListData, NULL, NULL);
328 void msg_ui_thread_ctlbar_spam_setting_cb(void *data, Evas_Object *obj, void *event_info)
330 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
331 Elm_Object_Item* it_sweep = NULL;
333 it_sweep = (Elm_Object_Item *)elm_genlist_decorated_item_get(pListData->genlist);
335 elm_genlist_item_decorate_mode_set(it_sweep, "slide", EINA_FALSE);
336 elm_genlist_item_select_mode_set(it_sweep, ELM_OBJECT_SELECT_MODE_DEFAULT);
339 msg_ui_thread_launch_spam_setting(pListData);
343 void msg_ui_thread_ctlbar_compose_cb(void *data, Evas_Object *obj, void *event_info)
346 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
348 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
349 Elm_Object_Item* it_sweep = NULL;
350 service_h svc_handle = NULL;
352 if (service_create(&svc_handle) < 0 || svc_handle == NULL) {
353 D_EMSG("service_create() is failed !!");
357 it_sweep = (Elm_Object_Item *)elm_genlist_decorated_item_get(pListData->genlist);
359 elm_genlist_item_decorate_mode_set(it_sweep, "slide", EINA_FALSE);
360 elm_genlist_item_select_mode_set(it_sweep, ELM_OBJECT_SELECT_MODE_DEFAULT);
363 if (msg_ui_load_composer_ug(svc_handle) == MSG_UI_RET_ERR)
364 D_MSG("Failed to load composer ug");
366 service_destroy(svc_handle);
371 void msg_ui_thread_ctlbar_message_box_cb(void *data, Evas_Object *obj, void *event_info)
374 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
376 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
377 PMSG_THREAD_DATA pData = msg_ui_thread_get_data();
378 Elm_Object_Item* it_sweep = NULL;
380 if (pListData->popup) {
381 evas_object_del(pListData->popup);
382 pListData->popup = NULL;
385 it_sweep = (Elm_Object_Item *)elm_genlist_decorated_item_get(pListData->genlist);
387 elm_genlist_item_decorate_mode_set(it_sweep, "slide", EINA_FALSE);
388 elm_genlist_item_select_mode_set(it_sweep, ELM_OBJECT_SELECT_MODE_DEFAULT);
391 // Create pop-up ( Spam / SIM (it will be extended) )
392 Evas_Object *ctx_popup = NULL;
393 ctx_popup = elm_ctxpopup_add(pData->navi_frame);
394 evas_object_smart_callback_add(ctx_popup, "dismissed", __msg_ui_thread_ctxpopup_dismissed_cb, pListData);
396 elm_ctxpopup_item_append(ctx_popup, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_BODY_SPAM_MESSAGES"), NULL, __msg_ui_thread_ctxpopup_clicked_cb, pListData);
397 elm_ctxpopup_item_append(ctx_popup, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_BODY_SIM_CARD_MESSAGES"), NULL, __msg_ui_thread_ctxpopup_clicked_cb, pListData);
398 elm_ctxpopup_item_append(ctx_popup, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_BODY_CB_MESSAGES"), NULL, __msg_ui_thread_ctxpopup_clicked_cb, pListData);
401 Evas_Coord x, y, w, h;
402 evas_object_geometry_get(pListData->toolbar, &x, &y, &w, &h);
403 evas_object_move(ctx_popup, ((w-x)*5)/6 , y);
404 evas_object_show(ctx_popup);
406 pListData->popup = ctx_popup;
411 static void __msg_ui_thread_ctxpopup_dismissed_cb(void *data, Evas_Object *obj, void *event_info)
414 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
416 if (pListData->popup) {
417 evas_object_del(pListData->popup);
418 pListData->popup = NULL;
424 static void __msg_ui_thread_ctxpopup_clicked_cb(void *data, Evas_Object *obj, void *event_info)
428 ThreadMsgListType list_type = THREAD_NORMAL_LIST_TYPE;
429 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
431 const char *label = elm_object_item_text_get((Elm_Object_Item *)event_info);
433 if (strcmp(label, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_BODY_SPAM_MESSAGES")) == 0) {
434 list_type = THREAD_SPAM_LIST_TYPE;
435 } else if (strcmp(label, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_BODY_SIM_CARD_MESSAGES")) == 0) {
436 list_type = THREAD_SIM_LIST_TYPE;
437 } else if (strcmp(label, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_BODY_CB_MESSAGES")) == 0) {
438 list_type = THREAD_CBMSG_LIST_TYPE;
440 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "[ERROR] invalid list type");
444 if (pListData->popup) {
445 evas_object_del(pListData->popup);
446 pListData->popup = NULL;
449 msg_ui_thread_load_message_box(list_type);
453 void msg_ui_thread_ctlbar_cancel_cb(void *data, Evas_Object *obj, void *event_info)
456 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
458 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
459 PMSG_THREAD_DATA pData = msg_ui_thread_get_data();
461 if (pData->isIncomingMsg == true) {
462 if (pListData->app_data_type == THREAD_LIST_APP_DATA_MSG)
463 msg_ui_thread_msg_list_load(pListData, pListData->list_type);
465 msg_ui_thread_list_load(pListData, FALSE);
466 pData->isIncomingMsg = false;
469 msg_ui_thread_show_normal_mode(pListData);
473 void msg_ui_thread_sel_all_clicked_cb(void *data, Evas_Object *obj, void *event_info)
477 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
480 void* item_data = NULL;
482 if (pListData->sel_all_checked) {
483 pListData->check_cnt = pListData->item_cnt;
485 pListData->check_cnt = 0;
486 pListData->chk_list = eina_list_free(pListData->chk_list);
489 it = elm_genlist_first_item_get(pListData->genlist);
492 if (elm_genlist_item_parent_get(it) == NULL) {
493 it = elm_genlist_item_next_get(it);
497 item_data = elm_object_item_data_get(it);
499 if (pListData->app_data_type == THREAD_LIST_APP_DATA_THREAD) {
500 PMSG_APP_THREAD_DATA_S data = (PMSG_APP_THREAD_DATA_S)item_data;
501 data->is_check = pListData->sel_all_checked;
503 PMSG_APP_THREAD_MSG_DATA_S data = (PMSG_APP_THREAD_MSG_DATA_S)item_data;
504 data->is_check = pListData->sel_all_checked;
508 if (pListData->sel_all_checked && !eina_list_data_find(pListData->chk_list, item_data))
509 pListData->chk_list = eina_list_append(pListData->chk_list, item_data);
511 it = elm_genlist_item_next_get(it);
514 elm_genlist_realized_items_update(pListData->genlist);
515 msg_ui_thread_show_select_info(pListData);
520 void msg_ui_thread_list_checked_cb(void *data, Evas_Object *obj, void *event_info)
524 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
525 void* item_data = NULL;
526 Eina_Bool is_check = EINA_FALSE;
528 item_data = evas_object_data_get(obj, "item_data");
530 if (pListData->app_data_type == THREAD_LIST_APP_DATA_THREAD) {
531 PMSG_APP_THREAD_DATA_S data = (PMSG_APP_THREAD_DATA_S)item_data;
532 is_check = data->is_check;
534 PMSG_APP_THREAD_MSG_DATA_S data = (PMSG_APP_THREAD_MSG_DATA_S)item_data;
535 is_check = data->is_check;
539 pListData->check_cnt++;
540 if (!eina_list_data_find(pListData->chk_list, item_data))
541 pListData->chk_list = eina_list_append(pListData->chk_list, item_data);
543 pListData->check_cnt--;
544 pListData->chk_list = eina_list_remove(pListData->chk_list, item_data);
547 if (pListData->item_cnt == pListData->check_cnt)
548 elm_check_state_set(pListData->sel_all_box, EINA_TRUE);
550 elm_check_state_set(pListData->sel_all_box, EINA_FALSE);
552 msg_ui_thread_show_select_info(pListData);
556 void msg_ui_thread_back_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
563 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
564 PMSG_THREAD_DATA pData = msg_ui_thread_get_data();
566 if (pListData->list_type == THREAD_NORMAL_LIST_TYPE) {
567 elm_win_lower(pData->win_main);
569 PMSG_THREAD_LIST_DATA pPrevList = msg_ui_thread_get_prev_list(pListData);
571 msg_ui_thread_set_navi_controlbar_item(pPrevList);
572 elm_naviframe_item_pop(pData->navi_frame);
573 elm_genlist_clear(pListData->genlist);
574 msg_ui_thread_destroy_thread_list_data(pListData);
580 void msg_ui_thread_searchbar_entry_focus_cb(void *data, Evas_Object *obj, void *event_info)
584 MSG_UI_RETM_IF(MSG_UI_LEVEL_ASSERT, !data, "[ASSERT] data is NULL");
586 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
587 Elm_Object_Item* it_sweep = NULL;
589 pListData->search_mode = THREAD_SEARCH_ON;
590 elm_genlist_mode_set(pListData->genlist, ELM_LIST_COMPRESS);
592 it_sweep = (Elm_Object_Item *)elm_genlist_decorated_item_get(pListData->genlist);
594 elm_genlist_item_decorate_mode_set(it_sweep, "slide", EINA_FALSE);
595 elm_genlist_item_select_mode_set(it_sweep, ELM_OBJECT_SELECT_MODE_DEFAULT);
598 if (!elm_entry_is_empty(obj))
599 elm_object_signal_emit(pListData->searchbar, "elm,state,eraser,show", "elm");
601 elm_object_signal_emit(pListData->searchbar, "elm,state,guidetext,hide", "elm");
602 elm_object_signal_emit(pListData->searchbar, "cancel,in", "");
604 evas_object_smart_callback_add(obj, "changed", msg_ui_thread_searchbar_entry_change_cb, pListData);
605 evas_object_smart_callback_add(obj, "preedit,changed", msg_ui_thread_searchbar_entry_change_cb, pListData);
609 void msg_ui_thread_searchbar_entry_unfocus_cb(void *data, Evas_Object *obj, void *event_info)
613 evas_object_smart_callback_del(obj, "changed", msg_ui_thread_searchbar_entry_change_cb);
618 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
620 elm_object_signal_emit(pListData->searchbar, "cancel,out", "");
621 elm_object_signal_emit(pListData->searchbar, "elm,state,eraser,hide", "elm");
623 if (elm_entry_is_empty(obj)) {
624 elm_object_signal_emit(pListData->searchbar, "elm,state,guidetext,show", "elm");
625 pListData->search_mode = THREAD_SEARCH_OFF;
626 elm_genlist_mode_set(pListData->genlist, ELM_LIST_SCROLL);
631 void msg_ui_thread_searchbar_entry_change_cb(void *data, Evas_Object *obj, void *event_info)
638 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
640 /* Make timer for check user's input */
641 if (pListData->search_timer) {
642 ecore_timer_del(pListData->search_timer);
643 pListData->search_timer = NULL;
646 pListData->search_timer = ecore_timer_add(0.2, __msg_ui_thread_searchbar_entry_timer_cb, pListData);
648 if (elm_object_focus_get(obj)) {
649 if (elm_entry_is_empty(obj))
650 elm_object_signal_emit(pListData->searchbar, "elm,state,eraser,hide", "elm");
652 elm_object_signal_emit(pListData->searchbar, "elm,state,eraser,show", "elm");
658 static Eina_Bool __msg_ui_thread_searchbar_entry_timer_cb(void *data)
660 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
662 msg_ui_thread_search_msg_list_load(pListData);
663 pListData->search_timer = NULL;
665 return ECORE_CALLBACK_CANCEL;
668 void msg_ui_thread_searchbar_cancel_click_cb(void *data, Evas_Object *obj, void *event_info)
675 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
676 Evas_Object *entry = NULL;
678 pListData->search_mode = THREAD_SEARCH_OFF;
679 elm_genlist_mode_set(pListData->genlist, ELM_LIST_SCROLL);
681 if (pListData->search_timer) {
682 ecore_timer_del(pListData->search_timer);
683 pListData->search_timer = NULL;
686 entry = elm_object_part_content_get(pListData->searchbar, "elm.swallow.content");
687 elm_object_text_set(entry, "");
689 elm_object_focus_set(pListData->back_btn, EINA_TRUE);
690 evas_object_hide(obj);
691 elm_object_item_signal_emit(pListData->nf_it, "elm,state,controlbar,open", "");
693 if (pListData->list_type== THREAD_NORMAL_LIST_TYPE)
694 msg_ui_thread_list_load(pListData, FALSE);
696 msg_ui_thread_msg_list_load(pListData, pListData->list_type);
701 void msg_ui_thread_searchbar_eraser_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
708 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
709 Evas_Object *entry = NULL;
711 if (pListData->search_timer) {
712 ecore_timer_del(pListData->search_timer);
713 pListData->search_timer = NULL;
716 entry = elm_object_part_content_get(pListData->searchbar, "elm.swallow.content");
717 elm_object_text_set(entry, "");
719 elm_object_signal_emit(pListData->searchbar, "elm,state,eraser,hide", "elm");
724 void msg_ui_thread_sweep_btn_cb(void *data, Evas_Object *obj, void *event_info)
726 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !obj || !data);
728 PMSG_THREAD_LIST_DATA pListData = data;
729 char address[DEF_THREAD_ADDR_LEN+1] = {0,};
730 Elm_Object_Item *it = NULL;
732 const char *label = elm_object_text_get(obj);
734 if (g_strcmp0(label, dgettext("sys_string", "IDS_COM_SK_DELETE")) == 0) {
735 msg_ui_thread_show_del_popup(pListData, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_OPT_DELETE_Q"));
738 PMSG_APP_THREAD_DATA_S sel_peer_item = NULL;
739 sel_peer_item = (PMSG_APP_THREAD_DATA_S)evas_object_data_get(obj, "sel_peer_data");
741 msg_struct_list_s addrList;
743 memset(&addrList, 0x00, sizeof(msg_struct_list_s));
744 msg_get_address_list(msg_ui_thread_get_data_handle(), sel_peer_item->thread_id, &addrList);
746 if (addrList.nCount == 1) {
747 char strNumber[DEF_THREAD_ADDR_LEN + 1] = {0,};
749 msg_get_str_value(addrList.msg_struct_info[0], MSG_ADDRESS_INFO_ADDRESS_VALUE_STR, strNumber, DEF_THREAD_ADDR_LEN);
750 strncpy(address, strNumber, DEF_THREAD_ADDR_LEN);
752 if (g_strcmp0(label, dgettext("sys_string", "IDS_COM_BODY_CALL")) == 0)
753 msg_ui_thread_launch_voice_call(address);
754 else if (g_strcmp0(label, dgettext("sys_string", "IDS_COM_BODY_VIDEO_CALL")) == 0)
755 msg_ui_thread_launch_video_call(address);
757 } else if (addrList.nCount > 1) {
758 __msg_ui_thread_addr_select_popup(pListData, label, sel_peer_item->thread_id);
761 msg_release_list_struct(&addrList);
764 it = (Elm_Object_Item *)elm_genlist_decorated_item_get(pListData->genlist);
767 elm_genlist_item_decorate_mode_set(it, "slide", EINA_FALSE);
768 elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_DEFAULT);
772 static void __msg_ui_thread_addr_select_popup(PMSG_THREAD_LIST_DATA pListData, const char *title, int thread_id)
774 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !pListData || !title);
776 PMSG_THREAD_DATA pData = msg_ui_thread_get_data();
777 Evas_Object *popup = NULL;
778 Evas_Object *genlist = NULL;
780 msg_struct_list_s addrList;
782 memset(&addrList, 0x00, sizeof(msg_struct_list_s));
783 msg_get_address_list(pData->msgHandle, thread_id, &addrList);
786 popup = elm_popup_add(pData->win_main);
788 D_EMSG("elm_popup_add returns NULL");
789 msg_release_list_struct(&addrList);
793 elm_object_style_set(popup, "menustyle");
795 /** create menu genlist */
796 genlist = elm_genlist_add(popup);
798 D_EMSG("elm_genlist_add failed");
799 msg_release_list_struct(&addrList);
803 evas_object_data_set(genlist, "title", title);
804 memset(&pData->itc_popup, 0x00, sizeof(Elm_Genlist_Item_Class));
806 pData->itc_popup.item_style = "1text";
807 pData->itc_popup.func.text_get = __msg_ui_thread_popup_gl_text_get;
808 pData->itc_popup.func.content_get = NULL;
809 pData->itc_popup.func.state_get = NULL;
810 pData->itc_popup.func.del = __msg_ui_thread_popup_gl_del;
812 /** append addresses to genlist */
813 for (i=0; i<addrList.nCount; i++) {
815 char strNumber[MAX_ADDRESS_VAL_LEN + 1] = {0,};
816 char strName[MAX_DISPLAY_NAME_LEN + 1] = {0,};
817 msg_struct_t addrInfo = msg_create_struct(MSG_STRUCT_ADDRESS_INFO);
819 msg_get_str_value(addrList.msg_struct_info[i], MSG_ADDRESS_INFO_ADDRESS_VALUE_STR, strNumber, MAX_ADDRESS_VAL_LEN);
820 msg_get_str_value(addrList.msg_struct_info[i], MSG_ADDRESS_INFO_DISPLAYNAME_STR, strName, MAX_DISPLAY_NAME_LEN);
821 msg_get_int_value(addrList.msg_struct_info[i], MSG_ADDRESS_INFO_CONTACT_ID_INT, &contact_id);
823 msg_set_int_value(addrInfo, MSG_ADDRESS_INFO_CONTACT_ID_INT, contact_id);
824 msg_set_str_value(addrInfo, MSG_ADDRESS_INFO_ADDRESS_VALUE_STR, strNumber, MAX_ADDRESS_VAL_LEN);
825 msg_set_str_value(addrInfo, MSG_ADDRESS_INFO_DISPLAYNAME_STR, strName, MAX_DISPLAY_NAME_LEN);
827 elm_genlist_item_append(genlist, &pData->itc_popup, addrInfo, NULL, ELM_GENLIST_ITEM_NONE, __msg_ui_thread_popup_gl_sel, pListData);
830 msg_release_list_struct(&addrList);
832 elm_object_part_text_set(popup, "title,text", dgettext(MESSAGE_PKGNAME, "IDS_MSG_HEADER_SELECT_RECIPIENT"));
833 elm_object_content_set(popup, genlist);
836 Evas_Object * btn1 = elm_button_add(popup);
837 elm_object_text_set(btn1, dgettext("sys_string", "IDS_COM_BODY_CLOSE"));
838 evas_object_smart_callback_add(btn1, "clicked", __msg_ui_thread_close_clicked_cb, pListData);
840 elm_object_part_content_set(popup, "button1", btn1);
841 evas_object_show(genlist);
842 evas_object_show(popup);
844 pListData->popup = popup;
847 static char *__msg_ui_thread_popup_gl_text_get(void *data, Evas_Object *obj, const char *part)
850 msg_struct_t addr_info = (msg_struct_t)data;
851 MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, !data, NULL);
853 char strNumber[DEF_THREAD_ADDR_LEN + 1] = {0,};
854 char strName[DEF_THREAD_NAME_LEN + 1] = {0,};
857 msg_get_str_value(addr_info, MSG_ADDRESS_INFO_ADDRESS_VALUE_STR, strNumber, DEF_THREAD_ADDR_LEN);
858 msg_get_str_value(addr_info, MSG_ADDRESS_INFO_DISPLAYNAME_STR, strName, DEF_THREAD_NAME_LEN);
859 msg_get_int_value(addr_info, MSG_ADDRESS_INFO_CONTACT_ID_INT, &contact_id);
861 if (contact_id > 0 && strlen(strName) > 0) {
862 return strdup(strName);
864 if (strlen(strNumber) > 0)
865 return strdup(strNumber);
867 return strdup(dgettext("sys_string","IDS_COM_BODY_UNKNOWN"));
871 static void __msg_ui_thread_popup_gl_del(void *data, Evas_Object *obj)
873 msg_struct_t del_data = (msg_struct_t)data;
876 msg_release_struct(&del_data);
881 static void __msg_ui_thread_close_clicked_cb(void *data, Evas_Object *obj, void *event_info)
884 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data);
886 PMSG_THREAD_DATA pData = msg_ui_thread_get_data();
887 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
889 if (pListData->popup) {
890 evas_object_del(pListData->popup);
891 pListData->popup = NULL;
892 memset(&pData->itc_popup, 0x00, sizeof(Elm_Genlist_Item_Class));
896 void __msg_ui_thread_popup_gl_sel(void *data, Evas_Object *obj, void *event_info)
899 MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj || !event_info);
901 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
902 PMSG_THREAD_DATA pData = msg_ui_thread_get_data();
903 Elm_Object_Item *item = (Elm_Object_Item *)event_info;
904 msg_struct_t addr_info = (msg_struct_t)elm_object_item_data_get(item);
905 char strNumber[DEF_THREAD_ADDR_LEN + 1] = {0,};
907 if (pListData->popup) {
908 evas_object_del(pListData->popup);
909 pListData->popup = NULL;
910 memset(&pData->itc_popup, 0x00, sizeof(Elm_Genlist_Item_Class));
913 char *title = (char *)evas_object_data_get(obj, "title");
915 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "[ERROR] title is NULL");
919 msg_get_str_value(addr_info, MSG_ADDRESS_INFO_ADDRESS_VALUE_STR, strNumber, DEF_THREAD_ADDR_LEN);
921 if (strncmp(title, dgettext("sys_string", "IDS_COM_BODY_CALL"), strlen(title)) == 0)
922 msg_ui_thread_launch_voice_call(strNumber);
923 else if (strncmp(title, dgettext("sys_string", "IDS_COM_BODY_VIDEO_CALL"), strlen(title)) == 0)
924 msg_ui_thread_launch_video_call(strNumber);
926 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "[ERROR] invalid title");
929 void msg_ui_thread_timezone_change_cb(void *data)
933 PMSG_THREAD_DATA pData = (PMSG_THREAD_DATA)data;
934 PMSG_THREAD_LIST_DATA pListData = NULL;
936 char *timezone_id = NULL;
937 UChar utimezone_id[DEF_BUF_LEN] = {0,};
938 UErrorCode status = U_ZERO_ERROR;
941 timezone_id = vconf_get_str(VCONFKEY_SETAPPL_TIMEZONE_ID);
946 u_uastrcpy(utimezone_id, timezone_id);
948 ucal_setDefaultTimeZone(utimezone_id, &status);
950 if (U_FAILURE(status))
953 msg_ui_thread_get_locale(pData);
954 msg_ui_thread_get_time_format(pData);
955 pData->time_12h_ptn = msg_common_get_date_best_pattern(pData->locale, MSG_UI_TIME_PATTERN_12H);
956 pData->time_24h_ptn = msg_common_get_date_best_pattern(pData->locale, MSG_UI_TIME_PATTERN_24H);
957 pData->date_ptn = msg_common_get_date_best_pattern(pData->locale, UDAT_YEAR_NUM_MONTH_DAY);
960 for (i = 0; i < MSG_THREAD_LIST_MAX_COUNT; i++) {
961 if (pData->list_data[i] != NULL) {
962 pListData = pData->list_data[i];
963 elm_genlist_realized_items_update(pListData->genlist);
970 void msg_ui_thread_gl_mode_right(void *data, Evas_Object *obj, void *event_info)
974 MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, !data || !event_info);
976 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
977 MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, pListData->view_mode != THREAD_NORMAL_VIEW);
979 Elm_Object_Item *it = (Elm_Object_Item *)elm_genlist_decorated_item_get(obj);
981 elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_DEFAULT);
983 if (pListData->search_mode == THREAD_SEARCH_OFF) {
984 elm_genlist_item_decorate_mode_set(event_info, "slide", EINA_TRUE);
985 elm_genlist_item_select_mode_set(event_info, ELM_OBJECT_SELECT_MODE_NONE);
991 void msg_ui_thread_gl_mode_left(void *data, Evas_Object *obj, void *event_info)
995 MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, !data || !event_info);
997 PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
998 MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, pListData->view_mode != THREAD_NORMAL_VIEW);
1000 if (pListData->search_mode == THREAD_SEARCH_OFF) {
1001 elm_genlist_item_decorate_mode_set(event_info, "slide", EINA_FALSE);
1002 elm_genlist_item_select_mode_set(event_info, ELM_OBJECT_SELECT_MODE_DEFAULT);