fix N_SE-8504. change popup's parent window
[apps/core/preloaded/message-app.git] / thread / src / msg-ui-thread-callback.c
1 /*
2  * Copyright 2012  Samsung Electronics Co., Ltd
3  *
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
7  *
8  *    http://www.tizenopensource.org/license
9  *
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.
15  */
16
17
18 #include "msg-ui-thread-main.h"
19
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);
27
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);
35
36
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)
38 {
39         MSG_UI_ENTER();
40
41         int i = 0;
42         if (!user_param || !pMsgIdList)
43                 return;
44
45         PMSG_THREAD_DATA pData = user_param;
46         PMSG_THREAD_LIST_DATA pListData = NULL;
47
48         if (msg_ui_thread_get_app_state(pData) == MSG_UI_STATE_DESTROY)
49                 return;
50
51         MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "type is %d", type);
52
53         for (i = 0; i < MSG_THREAD_LIST_MAX_COUNT; i++) {
54                 if (pData->list_data[i] != NULL)
55                         pListData = pData->list_data[i];
56                 else
57                         break;
58
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);
62                         else
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.");
68                                 return;
69                         }
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]);
76                                 }
77                         }
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;
83
84                                 err = msg_get_message(pData->msgHandle, pMsgIdList->msgIdList[i], msgInfo, sendOpt);
85
86                                 if (err != MSG_SUCCESS) {
87                                         msg_release_struct(&msgInfo);
88                                         msg_release_struct(&sendOpt);
89                                         return;
90                                 }
91
92                                 msg_folder_id_t folder_id = 0;
93                                 msg_get_int_value(msgInfo, MSG_MESSAGE_FOLDER_ID_INT, (int *)&folder_id);
94
95                                 if (folder_id != MSG_SPAMBOX_ID) {
96                                         if (pListData->app_data_type == THREAD_LIST_APP_DATA_THREAD) {
97                                                 int thread_id = 0;
98                                                 msg_get_int_value(msgInfo, MSG_MESSAGE_THREAD_ID_INT, &thread_id);
99                                                 msg_ui_thread_list_item_update(pListData, thread_id);
100                                         } else {
101                                                 int msg_id = 0;
102                                                 msg_get_int_value(msgInfo, MSG_MESSAGE_ID_INT, &msg_id);
103                                                 msg_ui_thread_list_msg_item_update(pListData, msg_id);
104                                         }
105                                 }
106
107                                 msg_release_struct(&msgInfo);
108                                 msg_release_struct(&sendOpt);
109                         }
110                 }
111         }
112
113         MSG_UI_LEAVE();
114 }
115
116 static void __msg_ui_thread_insert_and_select_gen_item(PMSG_THREAD_LIST_DATA pListData)
117 {
118         MSG_UI_ENTER();
119
120         int sel_thread_id = 0, sel_msg_id = 0;
121
122         if (pListData->sel_gen_item) {
123                 sel_thread_id = pListData->sel_thread_id;
124                 sel_msg_id = pListData->sel_msg_id;
125         }
126
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);
130         } else {
131                 msg_ui_thread_list_load(pListData, FALSE);
132                 msg_ui_thread_select_item_by_thread_id(pListData, sel_thread_id);
133         }
134         MSG_UI_LEAVE();
135 }
136
137  void msg_ui_thread_ctlbar_del_cb(void *data, Evas_Object *obj, void *event_info)
138 {
139         D_ENTER;
140         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
141
142         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
143          MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, pListData->del_thread);
144
145         if (pListData->popup) {
146                 evas_object_del(pListData->popup);
147                 pListData->popup = NULL;
148         }
149
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);
152 }
153
154 static void __msg_ui_thread_del_thread_feedback_fn(void *data, Ecore_Thread *thread, void *msg_data)
155 {
156         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !thread || !data || !msg_data);
157
158         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
159         char buf[DEF_BUF_LEN_S] = {0,};
160         int *ret = msg_data;
161
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);
167                 }
168         } else {
169
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"));
174                 return;
175         }
176
177         if (pListData->del_index + 1 == pListData->check_cnt) {
178                 msg_ui_thread_show_deleted_info(pListData);
179                 __msg_ui_thread_del_finish(pListData);
180         } else {
181                 pListData->del_index++;
182         }
183
184         if (ret)
185                 free(ret);
186 }
187
188 static void __msg_ui_thread_del_thread_fn(void *data, Ecore_Thread *thread)
189 {
190         D_ENTER;
191
192         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data);
193
194         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
195         Eina_List *list;
196
197         void* item_data = NULL;
198
199         EINA_LIST_FOREACH(pListData->chk_list, list, item_data) {
200                 int *ret = calloc(1, sizeof(int));
201
202                 if (item_data) {
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);
206                         } else {
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);
209                         }
210                         ecore_thread_feedback(thread, (void *)ret);
211
212                         if (*ret != MSG_SUCCESS)
213                                 return;
214                 } else {
215                         *ret = MSG_ERR_NULL_POINTER;
216                         ecore_thread_feedback(thread, (void *)ret);
217                         return;
218                 }
219         }
220 }
221
222 static void __msg_ui_thread_del_finish(PMSG_THREAD_LIST_DATA pListData)
223 {
224         if (pListData->popup) {
225                 evas_object_del(pListData->popup);
226                 pListData->popup = NULL;
227         }
228
229         pListData->del_thread = NULL;
230
231         msg_ui_thread_show_normal_mode(pListData);
232
233         if (pListData->list_type == THREAD_NORMAL_LIST_TYPE)
234                 msg_ui_thread_list_load(pListData, FALSE);
235         else
236                 msg_ui_thread_msg_list_load(pListData, pListData->list_type);
237 }
238
239 void msg_ui_thread_ctlbar_checkbox_cb(void *data, Evas_Object *obj, void *event_info)
240 {
241         MSG_UI_ENTER();
242         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
243
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};
247
248         pListData->view_mode = THREAD_EDIT_VIEW;
249         pListData->check_cnt = 0;
250         pListData->del_index = 0;
251
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;
256         }
257
258         it_sweep = (Elm_Object_Item *)elm_genlist_decorated_item_get(pListData->genlist);
259
260         if (it_sweep) {
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);
264         }
265
266         elm_genlist_decorate_mode_set(pListData->genlist, EINA_TRUE);
267         elm_genlist_select_mode_set(pListData->genlist, ELM_OBJECT_SELECT_MODE_ALWAYS);
268
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"));
271         else
272                 snprintf(buf, sizeof(buf), "%s",  dgettext("sys_string", "IDS_COM_SK_DELETE"));
273
274         elm_object_item_text_set(pListData->nf_it, buf);
275
276         msg_ui_thread_set_navi_controlbar_item(pListData);
277         __msg_ui_thread_add_navi_select_all_ly(pListData);
278
279         MSG_UI_LEAVE();
280 }
281
282 static void __msg_ui_thread_add_navi_select_all_ly(PMSG_THREAD_LIST_DATA pListData)
283 {
284         PMSG_THREAD_DATA pData = msg_ui_thread_get_data();
285
286         if (!pListData) {
287                 MSG_UI_DEBUG(MSG_UI_LEVEL_ASSERT,"[ASSERT] pListData is NULL");
288                 return;
289         }
290
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);
297
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);
303
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"));
306         }
307
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);
312 }
313
314 static void __msg_ui_thread_sel_all_ly_mouse_down_cb(void *data, Evas *evas, Evas_Object *obj, void *event_info)
315 {
316         MSG_UI_ENTER();
317
318         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
319
320         pListData->sel_all_checked = !pListData->sel_all_checked;
321         elm_check_state_pointer_set(pListData->sel_all_box, &pListData->sel_all_checked);
322
323         msg_ui_thread_sel_all_clicked_cb(pListData, NULL, NULL);
324
325         MSG_UI_LEAVE();
326 }
327
328 void msg_ui_thread_ctlbar_spam_setting_cb(void *data, Evas_Object *obj, void *event_info)
329 {
330         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
331         Elm_Object_Item* it_sweep = NULL;
332
333         it_sweep = (Elm_Object_Item *)elm_genlist_decorated_item_get(pListData->genlist);
334         if (it_sweep) {
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);
337         }
338
339         msg_ui_thread_launch_spam_setting(pListData);
340 }
341
342
343 void msg_ui_thread_ctlbar_compose_cb(void *data, Evas_Object *obj, void *event_info)
344 {
345         MSG_UI_ENTER();
346         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
347
348         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
349         Elm_Object_Item* it_sweep = NULL;
350         service_h svc_handle = NULL;
351
352         if (service_create(&svc_handle) < 0 || svc_handle == NULL) {
353                 D_EMSG("service_create() is failed !!");
354                 return;
355         }
356
357         it_sweep = (Elm_Object_Item *)elm_genlist_decorated_item_get(pListData->genlist);
358         if (it_sweep) {
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);
361         }
362
363         if (msg_ui_load_composer_ug(svc_handle) == MSG_UI_RET_ERR)
364                 D_MSG("Failed to load composer ug");
365
366         service_destroy(svc_handle);
367
368         MSG_UI_LEAVE();
369 }
370
371 void msg_ui_thread_ctlbar_message_box_cb(void *data, Evas_Object *obj, void *event_info)
372 {
373         MSG_UI_ENTER();
374         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
375
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;
379
380         if (pListData->popup) {
381                 evas_object_del(pListData->popup);
382                 pListData->popup = NULL;
383         }
384
385         it_sweep = (Elm_Object_Item *)elm_genlist_decorated_item_get(pListData->genlist);
386         if (it_sweep) {
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);
389         }
390
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);
395
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);
399
400         // move ctx popup
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);
405
406         pListData->popup = ctx_popup;
407
408         MSG_UI_LEAVE();
409 }
410
411 static void __msg_ui_thread_ctxpopup_dismissed_cb(void *data, Evas_Object *obj, void *event_info)
412 {
413         MSG_UI_ENTER();
414         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
415
416         if (pListData->popup) {
417                 evas_object_del(pListData->popup);
418                 pListData->popup = NULL;
419         }
420
421         MSG_UI_LEAVE();
422 }
423
424 static void __msg_ui_thread_ctxpopup_clicked_cb(void *data, Evas_Object *obj, void *event_info)
425 {
426         MSG_UI_ENTER();
427
428         ThreadMsgListType list_type = THREAD_NORMAL_LIST_TYPE;
429         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
430
431         const char *label = elm_object_item_text_get((Elm_Object_Item *)event_info);
432
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;
439         } else {
440                 MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "[ERROR] invalid list type");
441                 return;
442         }
443
444         if (pListData->popup) {
445                 evas_object_del(pListData->popup);
446                 pListData->popup = NULL;
447         }
448
449         msg_ui_thread_load_message_box(list_type);
450         MSG_UI_LEAVE();
451 }
452
453 void msg_ui_thread_ctlbar_cancel_cb(void *data, Evas_Object *obj, void *event_info)
454 {
455         MSG_UI_ENTER();
456         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj);
457
458         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
459         PMSG_THREAD_DATA pData = msg_ui_thread_get_data();
460
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);
464                 else
465                         msg_ui_thread_list_load(pListData, FALSE);
466                 pData->isIncomingMsg = false;
467         }
468
469         msg_ui_thread_show_normal_mode(pListData);
470         MSG_UI_LEAVE();
471 }
472
473 void msg_ui_thread_sel_all_clicked_cb(void *data, Evas_Object *obj, void *event_info)
474 {
475         MSG_UI_ENTER();
476
477         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
478         Elm_Object_Item *it;
479
480         void* item_data = NULL;
481
482         if (pListData->sel_all_checked) {
483                 pListData->check_cnt = pListData->item_cnt;
484         } else {
485                 pListData->check_cnt = 0;
486                 pListData->chk_list = eina_list_free(pListData->chk_list);
487         }
488
489         it = elm_genlist_first_item_get(pListData->genlist);
490
491         while (it) {
492                 if (elm_genlist_item_parent_get(it) == NULL) {
493                         it = elm_genlist_item_next_get(it);
494                         continue;
495                 }
496
497                 item_data = elm_object_item_data_get(it);
498                 if (item_data) {
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;
502                         } else {
503                                 PMSG_APP_THREAD_MSG_DATA_S data = (PMSG_APP_THREAD_MSG_DATA_S)item_data;
504                                 data->is_check = pListData->sel_all_checked;
505                         }
506                 }
507
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);
510
511                 it = elm_genlist_item_next_get(it);
512         }
513
514         elm_genlist_realized_items_update(pListData->genlist);
515         msg_ui_thread_show_select_info(pListData);
516
517         MSG_UI_LEAVE();
518 }
519
520 void msg_ui_thread_list_checked_cb(void *data, Evas_Object *obj, void *event_info)
521 {
522         MSG_UI_ENTER();
523
524         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
525         void* item_data = NULL;
526         Eina_Bool is_check = EINA_FALSE;
527
528         item_data = evas_object_data_get(obj, "item_data");
529
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;
533         } else {
534                 PMSG_APP_THREAD_MSG_DATA_S data = (PMSG_APP_THREAD_MSG_DATA_S)item_data;
535                 is_check = data->is_check;
536         }
537
538         if (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);
542         } else {
543                 pListData->check_cnt--;
544                 pListData->chk_list = eina_list_remove(pListData->chk_list, item_data);
545         }
546
547         if (pListData->item_cnt == pListData->check_cnt)
548                 elm_check_state_set(pListData->sel_all_box, EINA_TRUE);
549         else
550                 elm_check_state_set(pListData->sel_all_box, EINA_FALSE);
551
552         msg_ui_thread_show_select_info(pListData);
553         MSG_UI_LEAVE();
554 }
555
556 void msg_ui_thread_back_btn_clicked_cb(void *data, Evas_Object *obj, void *event_info)
557 {
558         MSG_UI_ENTER();
559
560         if (!data)
561                 return;
562
563         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
564         PMSG_THREAD_DATA pData = msg_ui_thread_get_data();
565
566         if (pListData->list_type == THREAD_NORMAL_LIST_TYPE) {
567                 elm_win_lower(pData->win_main);
568         } else {
569                 PMSG_THREAD_LIST_DATA pPrevList = msg_ui_thread_get_prev_list(pListData);
570
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);
575         }
576
577         MSG_UI_LEAVE();
578 }
579
580 void msg_ui_thread_searchbar_entry_focus_cb(void *data, Evas_Object *obj, void *event_info)
581 {
582         D_ENTER;
583
584         MSG_UI_RETM_IF(MSG_UI_LEVEL_ASSERT, !data, "[ASSERT] data is NULL");
585
586         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
587         Elm_Object_Item* it_sweep = NULL;
588
589         pListData->search_mode = THREAD_SEARCH_ON;
590         elm_genlist_mode_set(pListData->genlist, ELM_LIST_COMPRESS);
591
592         it_sweep = (Elm_Object_Item *)elm_genlist_decorated_item_get(pListData->genlist);
593         if (it_sweep) {
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);
596         }
597
598         if (!elm_entry_is_empty(obj))
599                 elm_object_signal_emit(pListData->searchbar, "elm,state,eraser,show", "elm");
600
601         elm_object_signal_emit(pListData->searchbar, "elm,state,guidetext,hide", "elm");
602         elm_object_signal_emit(pListData->searchbar, "cancel,in", "");
603
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);
606         D_LEAVE;
607 }
608
609 void msg_ui_thread_searchbar_entry_unfocus_cb(void *data, Evas_Object *obj, void *event_info)
610 {
611         D_ENTER;
612
613         evas_object_smart_callback_del(obj, "changed", msg_ui_thread_searchbar_entry_change_cb);
614
615         if (!data)
616                 return;
617
618         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
619
620         elm_object_signal_emit(pListData->searchbar, "cancel,out", "");
621         elm_object_signal_emit(pListData->searchbar, "elm,state,eraser,hide", "elm");
622
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);
627         }
628         D_LEAVE;
629 }
630
631 void msg_ui_thread_searchbar_entry_change_cb(void *data, Evas_Object *obj, void *event_info)
632 {
633         D_ENTER;
634
635         if (!data)
636                 return;
637
638         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
639
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;
644         }
645
646         pListData->search_timer = ecore_timer_add(0.2, __msg_ui_thread_searchbar_entry_timer_cb, pListData);
647
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");
651                 else
652                         elm_object_signal_emit(pListData->searchbar, "elm,state,eraser,show", "elm");
653         }
654
655         D_LEAVE;
656 }
657
658 static Eina_Bool __msg_ui_thread_searchbar_entry_timer_cb(void *data)
659 {
660         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
661
662         msg_ui_thread_search_msg_list_load(pListData);
663         pListData->search_timer = NULL;
664
665         return ECORE_CALLBACK_CANCEL;
666 }
667
668 void msg_ui_thread_searchbar_cancel_click_cb(void *data, Evas_Object *obj, void *event_info)
669 {
670         D_ENTER;
671
672         if (!data)
673                 return;
674
675         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
676         Evas_Object *entry = NULL;
677
678         pListData->search_mode = THREAD_SEARCH_OFF;
679         elm_genlist_mode_set(pListData->genlist, ELM_LIST_SCROLL);
680
681         if (pListData->search_timer) {
682                 ecore_timer_del(pListData->search_timer);
683                 pListData->search_timer = NULL;
684         }
685
686         entry = elm_object_part_content_get(pListData->searchbar, "elm.swallow.content");
687         elm_object_text_set(entry, "");
688
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", "");
692
693         if (pListData->list_type== THREAD_NORMAL_LIST_TYPE)
694                 msg_ui_thread_list_load(pListData, FALSE);
695         else
696                 msg_ui_thread_msg_list_load(pListData, pListData->list_type);
697
698         D_LEAVE;
699 }
700
701 void msg_ui_thread_searchbar_eraser_clicked_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
702 {
703         D_ENTER;
704
705         if (!data)
706                 return;
707
708         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
709         Evas_Object *entry = NULL;
710
711         if (pListData->search_timer) {
712                 ecore_timer_del(pListData->search_timer);
713                 pListData->search_timer = NULL;
714         }
715
716         entry = elm_object_part_content_get(pListData->searchbar, "elm.swallow.content");
717         elm_object_text_set(entry, "");
718
719         elm_object_signal_emit(pListData->searchbar, "elm,state,eraser,hide", "elm");
720
721         D_LEAVE;
722 }
723
724 void msg_ui_thread_sweep_btn_cb(void *data, Evas_Object *obj, void *event_info)
725 {
726         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !obj || !data);
727
728         PMSG_THREAD_LIST_DATA pListData = data;
729         char address[DEF_THREAD_ADDR_LEN+1] = {0,};
730         Elm_Object_Item *it = NULL;
731
732         const char *label = elm_object_text_get(obj);
733
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"));
736                 return;
737         } else {
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");
740
741                 msg_struct_list_s addrList;
742
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);
745
746                 if (addrList.nCount == 1) {
747                         char strNumber[DEF_THREAD_ADDR_LEN + 1] = {0,};
748
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);
751
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);
756
757                 } else if (addrList.nCount > 1) {
758                         __msg_ui_thread_addr_select_popup(pListData, label, sel_peer_item->thread_id);
759                 }
760
761                 msg_release_list_struct(&addrList);
762         }
763
764         it = (Elm_Object_Item *)elm_genlist_decorated_item_get(pListData->genlist);
765
766         if (it) {
767                 elm_genlist_item_decorate_mode_set(it, "slide", EINA_FALSE);
768                 elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_DEFAULT);
769         }
770 }
771
772 static void __msg_ui_thread_addr_select_popup(PMSG_THREAD_LIST_DATA pListData, const char *title, int thread_id)
773 {
774         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !pListData || !title);
775
776         PMSG_THREAD_DATA pData = msg_ui_thread_get_data();
777         Evas_Object *popup = NULL;
778         Evas_Object *genlist = NULL;
779         int i = 0;
780         msg_struct_list_s addrList;
781
782         memset(&addrList, 0x00, sizeof(msg_struct_list_s));
783         msg_get_address_list(pData->msgHandle, thread_id, &addrList);
784
785         /** create popup */
786         popup = elm_popup_add(pData->win_main);
787         if (!popup) {
788                 D_EMSG("elm_popup_add returns NULL");
789                 msg_release_list_struct(&addrList);
790                 return;
791         }
792
793         elm_object_style_set(popup, "menustyle");
794
795         /** create menu genlist */
796         genlist = elm_genlist_add(popup);
797         if (!genlist) {
798                 D_EMSG("elm_genlist_add failed");
799                 msg_release_list_struct(&addrList);
800                 return;
801         }
802
803         evas_object_data_set(genlist, "title", title);
804         memset(&pData->itc_popup, 0x00, sizeof(Elm_Genlist_Item_Class));
805
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;
811
812         /** append addresses to genlist */
813         for (i=0; i<addrList.nCount; i++) {
814                 int contact_id = 0;
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);
818
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);
822
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);
826
827                 elm_genlist_item_append(genlist, &pData->itc_popup, addrInfo, NULL, ELM_GENLIST_ITEM_NONE, __msg_ui_thread_popup_gl_sel, pListData);
828         }
829
830         msg_release_list_struct(&addrList);
831
832         elm_object_part_text_set(popup, "title,text", dgettext(MESSAGE_PKGNAME, "IDS_MSG_HEADER_SELECT_RECIPIENT"));
833         elm_object_content_set(popup, genlist);
834
835         /** close button */
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);
839
840         elm_object_part_content_set(popup, "button1", btn1);
841         evas_object_show(genlist);
842         evas_object_show(popup);
843
844         pListData->popup = popup;
845 }
846
847 static char *__msg_ui_thread_popup_gl_text_get(void *data, Evas_Object *obj, const char *part)
848 {
849         D_ENTER;
850         msg_struct_t addr_info = (msg_struct_t)data;
851         MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, !data, NULL);
852
853         char strNumber[DEF_THREAD_ADDR_LEN + 1] = {0,};
854         char strName[DEF_THREAD_NAME_LEN + 1] = {0,};
855         int contact_id = 0;
856
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);
860
861         if (contact_id > 0 && strlen(strName) > 0) {
862                 return strdup(strName);
863         } else {
864                 if (strlen(strNumber) > 0)
865                         return strdup(strNumber);
866                 else
867                         return strdup(dgettext("sys_string","IDS_COM_BODY_UNKNOWN"));
868         }
869 }
870
871 static void __msg_ui_thread_popup_gl_del(void *data, Evas_Object *obj)
872 {
873         msg_struct_t del_data = (msg_struct_t)data;
874
875         if (del_data) {
876                 msg_release_struct(&del_data);
877                 del_data = NULL;
878         }
879 }
880
881 static void __msg_ui_thread_close_clicked_cb(void *data, Evas_Object *obj, void *event_info)
882 {
883         D_ENTER;
884         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data);
885
886         PMSG_THREAD_DATA pData = msg_ui_thread_get_data();
887         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
888
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));
893         }
894 }
895
896 void __msg_ui_thread_popup_gl_sel(void *data, Evas_Object *obj, void *event_info)
897 {
898         D_ENTER;
899         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !data || !obj || !event_info);
900
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,};
906
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));
911         }
912
913         char *title = (char *)evas_object_data_get(obj, "title");
914         if (!title) {
915                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "[ERROR] title is NULL");
916                 return;
917         }
918
919         msg_get_str_value(addr_info, MSG_ADDRESS_INFO_ADDRESS_VALUE_STR, strNumber, DEF_THREAD_ADDR_LEN);
920
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);
925         else
926                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "[ERROR] invalid title");
927 }
928
929 void msg_ui_thread_timezone_change_cb(void *data)
930 {
931         D_ENTER;
932
933         PMSG_THREAD_DATA pData = (PMSG_THREAD_DATA)data;
934         PMSG_THREAD_LIST_DATA pListData = NULL;
935
936         char *timezone_id = NULL;
937         UChar utimezone_id[DEF_BUF_LEN] = {0,};
938         UErrorCode status = U_ZERO_ERROR;
939         int i = 0;
940
941         timezone_id = vconf_get_str(VCONFKEY_SETAPPL_TIMEZONE_ID);
942
943         if (!timezone_id)
944                 return;
945
946         u_uastrcpy(utimezone_id, timezone_id);
947
948         ucal_setDefaultTimeZone(utimezone_id, &status);
949
950         if (U_FAILURE(status))
951                 return;
952
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);
958
959
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);
964                 }
965         }
966
967         D_LEAVE;
968 }
969
970 void msg_ui_thread_gl_mode_right(void *data, Evas_Object *obj, void *event_info)
971 {
972         MSG_UI_ENTER();
973
974         MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, !data || !event_info);
975
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);
978
979         Elm_Object_Item *it = (Elm_Object_Item *)elm_genlist_decorated_item_get(obj);
980         if (it)
981                 elm_genlist_item_select_mode_set(it, ELM_OBJECT_SELECT_MODE_DEFAULT);
982
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);
986         }
987
988         MSG_UI_LEAVE();
989 }
990
991 void msg_ui_thread_gl_mode_left(void *data, Evas_Object *obj, void *event_info)
992 {
993         MSG_UI_ENTER();
994
995         MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, !data || !event_info);
996
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);
999
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);
1003         }
1004
1005         MSG_UI_LEAVE();
1006 }
1007