fix N_SE-8504. change popup's parent window
[apps/core/preloaded/message-app.git] / thread / src / msg-ui-thread-util.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 #include "msg-ui-thread-main.h"
18 #include "appsvc.h"
19 #include <status.h>
20
21 static void __msg_ui_thread_ug_layout_cb(ui_gadget_h ug, enum ug_mode mode, void *priv);
22 static void __msg_ui_thread_ug_destroy_cb(ui_gadget_h ug, void *priv);
23 static Evas_Object *__msg_ui_thread_create_msg_detail_layout(Evas_Object* parent);
24 static Evas_Object* __msg_ui_thread_create_msg_detail_content(Evas_Object *parent, void *data, int msg_id);
25 static void __msg_ui_thread_popup_response_cb(void *data, Evas_Object *obj, void *event_info);
26 static void __msg_ui_thread_del_popup_ok_clicked_cb(void *data, Evas_Object *obj, void *event_info);
27 static void __msg_ui_thread_del_popup_cancel_clicked_cb(void *data, Evas_Object *obj, void *event_info);
28
29
30 int msg_ui_thread_launch_voice_call(const char *call_num)
31 {
32         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
33
34         int ret = -1; /* negative values are error value */
35         service_h svc_handle;
36
37         if (service_create(&svc_handle) < 0 || svc_handle == NULL) {
38                 D_EMSG("service_create() is failed !!");
39         } else {
40                 char telnum[255] = {0,};
41                 service_set_operation(svc_handle, APPSVC_OPERATION_CALL);
42                 snprintf(telnum, sizeof(telnum), "tel:%s", call_num);    /* Number to make a call */
43                 service_set_uri(svc_handle, telnum);
44                 ret = service_send_launch_request(svc_handle, NULL, NULL);
45
46                 service_destroy(svc_handle);
47         }
48
49         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
50
51         return ret;
52 }
53
54 int msg_ui_thread_launch_video_call(const char *call_num)
55 {
56         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
57
58         int ret = AUL_R_OK;
59
60         bundle *b = bundle_create();
61
62         if (b) {
63                 bundle_add(b, MSG_BUNDLE_KEY_VCALL_TYPE, MSG_BUNDLE_VALUE_VCALL_MO);
64                 bundle_add(b, MSG_BUNDLE_KEY_VCALL_HANDLE, MSG_BUNDLE_VALUE_VCALL_HANDLE);
65                 bundle_add(b, MSG_BUNDLE_KEY_VCALL_PARTY_NUM, call_num);
66                 bundle_add(b, MSG_BUNDLE_KEY_VCALL_CLI_CAUSE, MSG_BUNDLE_VALUE_VCALL_FALSE);
67                 bundle_add(b, MSG_BUNDLE_KEY_VCALL_FORWARDED, MSG_BUNDLE_VALUE_VCALL_FALSE);
68
69                 ret = aul_launch_app(VIDEO_CALL_PKG_NAME, b);
70
71                 bundle_free(b);
72         }
73
74         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
75
76         return ret;
77 }
78
79 void msg_ui_thread_launch_spam_setting(PMSG_THREAD_LIST_DATA pListData)
80 {
81         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
82         MSG_UI_RET_IF(MSG_UI_LEVEL_ASSERT, pListData == NULL);
83
84         pListData->cbs.layout_cb = __msg_ui_thread_ug_layout_cb;
85         pListData->cbs.result_cb = NULL;
86         pListData->cbs.destroy_cb = __msg_ui_thread_ug_destroy_cb;
87         pListData->cbs.priv = (void *)pListData;
88
89         service_h svc_handle = NULL;
90         if (service_create(&svc_handle) < 0 || svc_handle == NULL) {
91                 D_EMSG("service_create() is failed !!");
92         } else {
93                 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_TYPE, MSG_BUNDLE_VALUE_SPAM_SETTING);
94                 pListData->loaded_ug = ug_create(NULL, MSG_SETTING_UG_NAME, UG_MODE_FULLVIEW, svc_handle, &pListData->cbs);
95                 service_destroy(svc_handle);
96         }
97 }
98
99 void msg_ui_thread_launch_viewer_ug(PMSG_THREAD_LIST_DATA pListData, int nMsgId)
100 {
101         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
102         MSG_UI_RET_IF(MSG_UI_LEVEL_ASSERT, pListData == NULL);
103
104         pListData->cbs.layout_cb = __msg_ui_thread_ug_layout_cb;
105         pListData->cbs.result_cb = NULL;
106         pListData->cbs.destroy_cb = __msg_ui_thread_ug_destroy_cb;
107         pListData->cbs.priv = (void *)pListData;
108
109         service_h svc_handle = NULL;
110         char msgid[10] = {0,};
111         if (service_create(&svc_handle) < 0 || svc_handle == NULL) {
112                 D_EMSG("service_create() is failed !!");
113         } else {
114                 snprintf(msgid, sizeof(msgid), "%d", nMsgId);
115                 service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_MSG_ID, msgid);
116                 pListData->loaded_ug = ug_create(NULL, MSG_VIEWER_UG_NAME, UG_MODE_FULLVIEW, svc_handle, &pListData->cbs);
117                 service_destroy(svc_handle);
118         }
119
120         if (pListData->loaded_ug) {
121                 msg_ui_thread_show_notify(pListData, "Unable to open message");
122                 return;
123         }
124
125         D_LEAVE;
126 }
127
128 static void __msg_ui_thread_ug_layout_cb(ui_gadget_h ug, enum ug_mode mode, void *priv)
129 {
130         D_ENTER;
131
132         if (!ug || !priv)
133                 return;
134
135         Evas_Object *base, *win;
136
137         base = ug_get_layout(ug);
138         if (!base){
139                 ug_destroy(ug);
140                 return;
141         }
142
143         win = ug_get_window();
144
145         switch (mode) {
146             case UG_MODE_FULLVIEW:
147                         evas_object_size_hint_weight_set(base, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
148                         elm_win_resize_object_add(win, base);
149                         evas_object_show(base);
150                         break;
151                 case UG_MODE_FRAMEVIEW:
152             default:
153                         break;
154         }
155 }
156
157 static void __msg_ui_thread_ug_destroy_cb(ui_gadget_h ug, void *priv)
158 {
159         D_ENTER;
160         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !ug || !priv);
161
162         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)priv;
163
164         if (ug == pListData->loaded_ug) {
165                 ug_destroy(ug);
166                 pListData->loaded_ug = NULL;
167         }
168
169         if (pListData->search_mode == THREAD_SEARCH_ON)
170                 elm_object_focus_set(pListData->searchbar, EINA_TRUE);
171
172         if (pListData->sel_msg_id) {
173                 msg_ui_thread_list_msg_item_update(pListData, pListData->sel_msg_id);
174
175                 pListData->sel_gen_item = NULL;
176                 pListData->sel_msg_id = 0;
177         }
178 }
179
180 void msg_ui_thread_launch_msg_detail_view(PMSG_THREAD_LIST_DATA pListData, PMSG_APP_THREAD_MSG_DATA_S item_data)
181 {
182         D_ENTER;
183
184         if (!pListData) {
185                 D_EMSG("[ERROR] pListData is NULL");
186                 return;
187         }
188
189         PMSG_THREAD_DATA pData = msg_ui_thread_get_data();
190         Evas_Object *detail_layout = NULL;
191         Evas_Object *content = NULL;
192
193         // create layout
194         detail_layout = __msg_ui_thread_create_msg_detail_layout(pData->navi_frame);
195
196         // create content layout
197         content = __msg_ui_thread_create_msg_detail_content(detail_layout, pData, item_data->msg_id);
198         elm_object_part_content_set(detail_layout, "elm.swallow.content", content);
199
200         //push navi item
201         char title[DEF_BUF_LEN] = {0, };
202
203         if (item_data->contact_id > 0 && item_data->display_name[0] != '\0') {
204                 strncpy(title, item_data->display_name, sizeof(title)-1);
205         } else {
206                 if (item_data->address[0] != '\0')
207                         strncpy(title, item_data->address, sizeof(title)-1);
208                 else
209                         strncpy(title, dgettext("sys_string", "IDS_COM_BODY_UNKNOWN"), sizeof(title)-1);
210         }
211
212         elm_naviframe_item_push(pData->navi_frame, title, NULL, NULL, detail_layout, NULL);
213
214         if (pListData->sel_msg_id) {
215                 msg_ui_thread_list_msg_item_update(pListData, pListData->sel_msg_id);
216
217                 pListData->sel_gen_item = NULL;
218                 pListData->sel_msg_id = 0;
219         }
220
221         D_LEAVE;
222 }
223
224 static Evas_Object *__msg_ui_thread_create_msg_detail_layout(Evas_Object* parent)
225 {
226         D_ENTER;
227
228         Evas_Object *layout = NULL;
229
230         layout = elm_layout_add(parent);
231
232         elm_layout_theme_set(layout, "layout", "application", "noindicator");
233         evas_object_size_hint_weight_set(layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
234
235         return layout;
236 }
237
238 static Evas_Object* __msg_ui_thread_create_msg_detail_content(Evas_Object *parent, void *data, int msg_id)
239 {
240         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
241         MSG_UI_RETV_IF(MSG_UI_LEVEL_ERR, !data, NULL);
242
243         PMSG_THREAD_DATA pData = (PMSG_THREAD_DATA)data;
244
245         Evas_Object *scroller;
246         Evas_Object *entry;
247
248         char buf[MAX_MSG_TEXT_LEN+1] = {0, };
249         char *str = NULL;
250         msg_error_t err =  MSG_SUCCESS;
251
252         int msgSize = 0;
253         /** create scroller */
254         scroller = elm_scroller_add(parent);
255
256         elm_scroller_bounce_set(scroller, EINA_FALSE, EINA_TRUE);
257         elm_scroller_policy_set(scroller, ELM_SCROLLER_POLICY_OFF, ELM_SCROLLER_POLICY_AUTO);
258         evas_object_show(scroller);
259
260         /** create entry */
261         entry = elm_entry_add(scroller);
262         evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, 0.0);
263         evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, 0.0);
264         elm_entry_editable_set(entry, EINA_FALSE);
265         elm_object_content_set(scroller, entry);
266         evas_object_show(entry);
267
268         msg_struct_t msgInfo = msg_create_struct(MSG_STRUCT_MESSAGE_INFO);
269         if (msgInfo == NULL) {
270                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_create_struct(MSG_STRUCT_MESSAGE_INFO) is failed!");
271                 return NULL;
272         }
273
274         msg_struct_t sendOpt = msg_create_struct(MSG_STRUCT_SENDOPT);
275         if (sendOpt == NULL) {
276                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_create_struct(MSG_STRUCT_SENDOPT) is failed!");
277                 msg_release_struct(&msgInfo);
278                 return NULL;
279         }
280
281         err = msg_get_message(pData->msgHandle, (msg_message_id_t)msg_id, msgInfo, sendOpt);
282         if (err != MSG_SUCCESS) {
283                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_get_message() is failed : err = %d", err);
284                 msg_release_struct(&msgInfo);
285                 msg_release_struct(&sendOpt);
286                 return NULL;
287         }
288
289         msg_get_int_value(msgInfo, MSG_MESSAGE_DATA_SIZE_INT, &msgSize);
290         if (msgSize > 0) {
291                 int msgType = 0;
292                 msg_get_int_value(msgInfo, MSG_MESSAGE_TYPE_INT, &msgType);
293
294                 if (msgType == MSG_TYPE_MMS_NOTI) {
295                         char subject[DEF_BUF_LEN_S+1] = {0,};
296
297                         msg_get_str_value(msgInfo, MSG_MESSAGE_SUBJECT_STR, subject, DEF_BUF_LEN_S);
298                         if (strlen(subject) > 0) {
299                                 snprintf(buf, sizeof(buf), "%s", subject);
300                         } else {
301                                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_get_str_value(MSG_MESSAGE_SUBJECT_STR) is failed !!");
302                                 snprintf(buf, sizeof(buf), "Message subject is empty !!");
303                         }
304                 } else {
305                         char msgText[msgSize + 1];
306                         memset(msgText, 0, msgSize + 1);
307
308                         msg_get_str_value(msgInfo, MSG_MESSAGE_SMS_DATA_STR, msgText, msgSize);
309                         if (strlen(msgText) > 0) {
310                                 snprintf(buf, sizeof(buf), "%s", msgText);
311                         } else {
312                                 MSG_UI_DEBUG(MSG_UI_LEVEL_ERR, "msg_get_str_value(MSG_MESSAGE_SMS_DATA_STR) is failed !!");
313                                 snprintf(buf, sizeof(buf), "Message is empty !!");
314                         }
315                 }
316         } else
317                 snprintf(buf, sizeof(buf), "Message is empty !!");
318
319         buf[MAX_MSG_TEXT_LEN] = '\n';
320         str = elm_entry_utf8_to_markup(buf);
321         elm_object_text_set(entry, str);
322
323         if (str != NULL) {
324                 free(str);
325                 str = NULL;
326         }
327
328         msg_release_struct(&msgInfo);
329         msg_release_struct(&sendOpt);
330
331         return scroller;
332 }
333
334 void msg_ui_thread_get_time_format(PMSG_THREAD_DATA pData)
335 {
336         int timeformat = msg_common_get_timeformat();
337
338         if (timeformat == MSG_TIME_FORMAT_UNKNOWN)
339                 pData->time_fmt = MSG_TIME_FORMAT_12H;
340         else
341                 pData->time_fmt = timeformat;
342
343         D_MSG("%s", pData->time_fmt == MSG_TIME_FORMAT_24H ? "TIME FORMAT = 24h" : "TIME FORMAT = 12h");
344 }
345
346 void msg_ui_thread_get_locale(PMSG_THREAD_DATA pData)
347 {
348         const char *locale;
349
350         locale = msg_common_get_default_locale();
351
352         if (locale) {
353                 strncpy(pData->locale, locale, sizeof(pData->locale)-1);
354         }
355
356         D_MSG("Locale = %s", pData->locale);
357 }
358
359 void msg_ui_thread_get_bubble_data(PMSG_APP_THREAD_DATA_S item_data, service_h svc_handle)
360 {
361         MSG_UI_ENTER();
362         MSG_UI_RET_IF(MSG_UI_LEVEL_ERR, !item_data || !svc_handle);
363
364         char buf[DEF_BUF_LEN_S] = {'0',};
365         char buf_contact[DEF_BUF_LEN_S] = {'0',};
366
367         snprintf(buf, DEF_BUF_LEN_S, "%d", item_data->thread_id);
368         service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_THREAD_ID, buf);
369         service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_THREAD_NAME, item_data->thread_name);
370         service_add_extra_data(svc_handle, MSG_BUNDLE_KEY_CONTACT_ID, buf_contact);
371
372         MSG_UI_LEAVE();
373 }
374
375 void msg_ui_thread_cancel_edit_mode(PMSG_THREAD_LIST_DATA pListData)
376 {
377         D_ENTER;
378         Elm_Object_Item *it;
379
380         elm_check_state_set(pListData->sel_all_box, EINA_FALSE);
381
382         it = elm_genlist_first_item_get(pListData->genlist);
383         while (it) {
384                 if (elm_genlist_item_parent_get(it) == NULL) {
385                         it = elm_genlist_item_next_get(it);
386                         continue;
387                 }
388
389                 if (pListData->app_data_type == THREAD_LIST_APP_DATA_THREAD) {
390                         PMSG_APP_THREAD_DATA_S item_data = NULL;
391
392                         item_data = (PMSG_APP_THREAD_DATA_S)elm_object_item_data_get(it);
393                         if (item_data)
394                                 item_data->is_check = EINA_FALSE;
395                 } else {
396                         PMSG_APP_THREAD_MSG_DATA_S item_data = NULL;
397
398                         item_data = (PMSG_APP_THREAD_MSG_DATA_S)elm_object_item_data_get(it);
399                         if (item_data)
400                                 item_data->is_check = EINA_FALSE;
401                 }
402
403                 it = elm_genlist_item_next_get(it);
404         }
405
406         pListData->chk_list = eina_list_free(pListData->chk_list);
407
408         elm_object_part_content_unset(pListData->content_ly, "sel_all");
409         evas_object_hide(pListData->sel_all_ly);
410         elm_object_part_content_set(pListData->content_ly, "sel_all", pListData->searchbar);
411
412         elm_genlist_decorate_mode_set(pListData->genlist, EINA_FALSE);
413         elm_genlist_select_mode_set(pListData->genlist, ELM_OBJECT_SELECT_MODE_DEFAULT);
414
415         pListData->view_mode = THREAD_NORMAL_VIEW;
416 }
417
418 void msg_ui_thread_show_normal_mode(PMSG_THREAD_LIST_DATA pListData)
419 {
420         D_ENTER;
421
422         if (pListData->view_mode == THREAD_EDIT_VIEW)
423                 msg_ui_thread_cancel_edit_mode(pListData);
424
425         if (pListData->select_info) {
426                 evas_object_del(pListData->select_info);
427                 pListData->select_info = NULL;
428         }
429
430         if (!pListData->back_btn) {
431                 PMSG_THREAD_DATA pData = msg_ui_thread_get_data();
432
433                 pListData->back_btn = elm_button_add(pData->navi_frame);
434                 evas_object_smart_callback_add(pListData->back_btn, "clicked", msg_ui_thread_back_btn_clicked_cb, (void *)pListData);
435                 elm_object_style_set(pListData->back_btn, "naviframe/back_btn/default");
436         }
437
438         msg_ui_thread_set_navi_controlbar_item(pListData);
439
440         if (pListData->list_type == THREAD_NORMAL_LIST_TYPE)
441                 elm_object_item_text_set(pListData->nf_it, dgettext("sys_string", "IDS_COM_BODY_MESSAGES"));
442         else if (pListData->list_type == THREAD_SPAM_LIST_TYPE)
443                 elm_object_item_text_set(pListData->nf_it, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_BODY_SPAM_MESSAGES"));
444         else if (pListData->list_type == THREAD_SIM_LIST_TYPE)
445                 elm_object_item_text_set(pListData->nf_it, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_BODY_SIM_CARD_MESSAGES"));
446         else if (pListData->list_type == THREAD_CBMSG_LIST_TYPE)
447                 elm_object_item_text_set(pListData->nf_it, dgettext(MESSAGE_PKGNAME, "IDS_MSGF_BODY_CB_MESSAGES"));
448
449         elm_object_item_part_content_set(pListData->nf_it, "prev_btn", pListData->back_btn);
450         elm_naviframe_item_title_visible_set(pListData->nf_it, EINA_TRUE);
451
452         D_LEAVE;
453 }
454
455 void msg_ui_thread_select_item_by_thread_id(PMSG_THREAD_LIST_DATA pListData, int thread_id)
456 {
457         if (thread_id <= 0)
458                 return;
459
460         Elm_Object_Item *gen_item = NULL;
461
462         gen_item = elm_genlist_first_item_get(pListData->genlist);
463
464         while (gen_item) {
465                 if (elm_genlist_item_parent_get(gen_item) == NULL) {
466                         gen_item = elm_genlist_item_next_get(gen_item);
467                         continue;
468                 }
469
470                 PMSG_APP_THREAD_DATA_S item_data = (PMSG_APP_THREAD_DATA_S)elm_object_item_data_get(gen_item);
471                 if (thread_id == item_data->thread_id) {
472                         pListData->sel_gen_item = gen_item;
473                         break;
474                 }
475
476                 gen_item = elm_genlist_item_next_get(gen_item);
477         }
478
479         elm_genlist_item_show(gen_item, ELM_GENLIST_ITEM_SCROLLTO_TOP);
480 }
481
482 void msg_ui_thread_select_item_by_msg_id(PMSG_THREAD_LIST_DATA pListData, int msg_id)
483 {
484         if (msg_id <= 0)
485                 return;
486
487         Elm_Object_Item *gen_item = NULL;
488         gen_item = elm_genlist_first_item_get(pListData->genlist);
489
490         while (gen_item) {
491                 if (elm_genlist_item_parent_get(gen_item) == NULL) {
492                         gen_item = elm_genlist_item_next_get(gen_item);
493                         continue;
494                 }
495
496                 PMSG_APP_THREAD_MSG_DATA_S item_data = (PMSG_APP_THREAD_MSG_DATA_S)elm_object_item_data_get(gen_item);
497                 if (msg_id == item_data->msg_id) {
498                         pListData->sel_gen_item = gen_item;
499                         break;
500                 }
501
502                 gen_item = elm_genlist_item_next_get(gen_item);
503         }
504
505         elm_genlist_item_show(gen_item, ELM_GENLIST_ITEM_SCROLLTO_TOP);
506 }
507
508 void msg_ui_thread_show_notify(PMSG_THREAD_LIST_DATA pListData, const char *msg)
509 {
510         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
511         MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, !pListData);
512
513         Evas_Object *popup;
514         PMSG_THREAD_DATA pData = msg_ui_thread_get_data();
515
516         popup = elm_popup_add(pData->navi_frame);
517
518         evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
519         elm_object_text_set(popup, msg);
520
521         evas_object_smart_callback_add(popup, "timeout", __msg_ui_thread_popup_response_cb, pListData);
522         elm_popup_timeout_set(popup, 0.8);
523         evas_object_show(popup);
524
525         pListData->popup = popup;
526 }
527
528 static void __msg_ui_thread_popup_response_cb(void *data, Evas_Object *obj, void *event_info)
529 {
530         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
531         MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, !data);
532
533         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
534
535         if ((int)event_info != 5 && obj) {
536                 evas_object_del(obj);
537                 pListData->popup = NULL;
538         }
539
540         MSG_UI_LEAVE(MSG_UI_LEVEL_DEBUG);
541 }
542
543 void msg_ui_thread_show_del_popup(PMSG_THREAD_LIST_DATA pListData, const char *msg)
544 {
545         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
546
547         MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, !pListData);
548
549         Evas_Object *popup;
550         Evas_Object *btn_ok;
551         Evas_Object *btn_cancel;
552         PMSG_THREAD_DATA pData = msg_ui_thread_get_data();
553
554         popup = elm_popup_add(pData->navi_frame);
555
556         evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
557         elm_object_text_set(popup, msg);
558
559         btn_ok = elm_button_add(popup);
560         elm_object_text_set(btn_ok, dgettext("sys_string", "IDS_COM_SK_OK"));
561         elm_object_part_content_set(popup, "button1", btn_ok);
562         evas_object_smart_callback_add(btn_ok, "clicked", __msg_ui_thread_del_popup_ok_clicked_cb, pListData);
563
564         btn_cancel = elm_button_add(popup);
565         elm_object_text_set(btn_cancel, dgettext("sys_string", "IDS_COM_SK_CANCEL"));
566         elm_object_part_content_set(popup, "button2", btn_cancel);
567         evas_object_smart_callback_add(btn_cancel, "clicked", __msg_ui_thread_del_popup_cancel_clicked_cb, pListData);
568
569         evas_object_data_set(popup, MSG_THREAD_POPUP_DATA, MSG_THREAD_DEL_CONFIRM);
570         evas_object_show(popup);
571
572         pListData->popup = popup;
573
574 }
575
576 static void __msg_ui_thread_del_popup_ok_clicked_cb(void *data, Evas_Object *obj, void *event_info)
577 {
578         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
579
580         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
581         Elm_Object_Item *it_dateline = NULL;
582         PMSG_APP_THREAD_DATELINE_DATA_S dateline_data = NULL;
583
584         int err;
585         const Elm_Object_Item *it = NULL;
586
587         if (pListData->popup) {
588                 evas_object_del(pListData->popup);
589                 pListData->popup = NULL;
590         }
591
592         it = (Elm_Object_Item *)elm_genlist_decorated_item_get(pListData->genlist);
593
594         if (!it)
595                 goto __UNABLE_TO_DELETE;
596
597         if (pListData->app_data_type == THREAD_LIST_APP_DATA_THREAD) {
598                 PMSG_APP_THREAD_DATA_S item_data = elm_object_item_data_get(it);
599                 if (!item_data)
600                         goto __UNABLE_TO_DELETE;
601
602                 err = msg_delete_thread_message_list(msg_ui_thread_get_data_handle(), item_data->thread_id);
603                 if (err != MSG_SUCCESS)
604                         goto __UNABLE_TO_DELETE;
605         } else {
606                 PMSG_APP_THREAD_MSG_DATA_S item_data = elm_object_item_data_get(it);
607                 if (!item_data)
608                         goto __UNABLE_TO_DELETE;
609
610                 err = msg_delete_message(msg_ui_thread_get_data_handle(), item_data->msg_id);
611                 if (err != MSG_SUCCESS)
612                         goto __UNABLE_TO_DELETE;
613         }
614
615         it_dateline = elm_genlist_item_parent_get((Elm_Object_Item *)it);
616         if (it_dateline) {
617                 dateline_data = elm_object_item_data_get(it_dateline);
618
619                 if (dateline_data) {
620                         MSG_UI_DEBUG(MSG_UI_LEVEL_DEBUG, "subitem_cnt : %d", dateline_data->subitem_cnt);
621                         dateline_data->subitem_cnt--;
622                         if (dateline_data->subitem_cnt == 0)
623                                 elm_object_item_del((Elm_Object_Item *)it_dateline);
624                 }
625         }
626         elm_object_item_del((Elm_Object_Item *)it);
627
628         msg_ui_thread_show_deleted_info(pListData);
629         pListData->item_cnt--;
630
631         if (pListData->item_cnt == 0) {
632                 if (pListData->list_type == THREAD_NORMAL_LIST_TYPE)
633                         msg_ui_thread_list_load(pListData, FALSE);
634                 else
635                         msg_ui_thread_msg_list_load(pListData, pListData->list_type);
636         }
637
638         return;
639
640 __UNABLE_TO_DELETE:
641         msg_ui_thread_show_notify(pListData, dgettext("sys_string", "IDS_COM_POP_UNABLE_TO_DELETE"));
642
643         return;
644 }
645
646 static void __msg_ui_thread_del_popup_cancel_clicked_cb(void *data, Evas_Object *obj, void *event_info)
647 {
648         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
649         PMSG_THREAD_LIST_DATA pListData = (PMSG_THREAD_LIST_DATA)data;
650
651         if (pListData->popup) {
652                 evas_object_del(pListData->popup);
653                 pListData->popup = NULL;
654         }
655 }
656
657 Evas_Object* msg_ui_thread_show_notify_with_progressbar(PMSG_THREAD_LIST_DATA pListData, int count)
658 {
659         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
660
661         MSG_UI_RETV_IF(MSG_UI_LEVEL_DEBUG, !pListData, NULL);
662
663         Evas_Object *popup, *progressbar, *box, *label;
664         char buf[DEF_BUF_LEN_S] = {0,};
665         PMSG_THREAD_DATA pData = msg_ui_thread_get_data();
666
667         popup = elm_popup_add(pData->navi_frame);
668
669         label = elm_label_add(popup);
670         snprintf(buf, sizeof(buf), "0/%d %s", count, dgettext("sys_string", "IDS_COM_POP_DELETED"));
671         elm_object_text_set(label, buf);
672 // ToDo: Check More
673 //      elm_label_text_align_set(label, "center");
674         evas_object_show(label);
675
676         progressbar = elm_progressbar_add(popup);
677         elm_object_style_set(progressbar, "list_progress");
678         evas_object_size_hint_align_set(progressbar, EVAS_HINT_FILL, 0.5);
679         evas_object_size_hint_weight_set(progressbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
680         elm_progressbar_value_set(progressbar, 0.0);
681         evas_object_show(progressbar);
682
683         box = elm_box_add(popup);
684         elm_box_pack_end(box, label);
685         elm_box_pack_end(box, progressbar);
686         evas_object_show(box);
687
688         elm_object_content_set(popup, box);
689
690         evas_object_show(popup);
691
692         pListData->progressbar = progressbar;
693         pListData->progresslabel = label;
694
695         return popup;
696 }
697
698 void msg_ui_thread_show_select_info(PMSG_THREAD_LIST_DATA pListData)
699 {
700         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
701         MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, !pListData);
702
703         PMSG_THREAD_DATA pData = msg_ui_thread_get_data();
704
705         if (!pListData->select_info) {
706                 pListData->select_info = elm_notify_add(pData->navi_frame);
707                 elm_notify_orient_set(pListData->select_info, ELM_NOTIFY_ORIENT_BOTTOM);
708
709                 pListData->selectioninfo_layout = elm_layout_add(pData->navi_frame);
710                 elm_object_content_set(pListData->select_info, pListData->selectioninfo_layout);
711         }
712
713         if (pData->isRotate)
714                 elm_layout_theme_set(pListData->selectioninfo_layout, "standard", "selectioninfo", "horizontal/bottom_64");
715         else
716                 elm_layout_theme_set(pListData->selectioninfo_layout, "standard", "selectioninfo", "vertical/bottom_64");
717
718         if (pListData->check_cnt == 0) {
719                 evas_object_hide(pListData->select_info);
720                 elm_object_item_disabled_set(pListData->toolbar_item[CONTROLBAR_ITEM_1], EINA_TRUE);
721         } else {
722                 char text[DEF_BUF_LEN_S] =  {'0',};
723
724                 snprintf(text, sizeof(text), "%s (%d)", dgettext(MESSAGE_PKGNAME, "IDS_MSGC_POP_SPACE_SELECTED"), pListData->check_cnt);
725                 edje_object_part_text_set(_EDJ(pListData->selectioninfo_layout), "elm.text", text);
726                 evas_object_show(pListData->select_info);
727
728                 elm_object_item_disabled_set(pListData->toolbar_item[CONTROLBAR_ITEM_1], EINA_FALSE);
729         }
730 }
731
732 void msg_ui_thread_show_deleted_info(PMSG_THREAD_LIST_DATA pListData)
733 {
734         MSG_UI_ENTER(MSG_UI_LEVEL_DEBUG);
735         MSG_UI_RET_IF(MSG_UI_LEVEL_DEBUG, !pListData);
736
737         status_message_post(dgettext("sys_string", "IDS_COM_POP_DELETED"));
738 }
739
740 void msg_ui_thread_set_app_state(int app_state)
741 {
742         if (app_state <= MSG_UI_STATE_NONE || app_state >= MSG_UI_STATE_MAX)
743                 return;
744
745         PMSG_THREAD_DATA pData = msg_ui_thread_get_data();
746
747         if (!pData)
748                 return;
749
750         if (app_state == MSG_UI_STATE_PAUSE) {
751                 Elm_Object_Item* it_sweep = NULL;
752                 PMSG_THREAD_LIST_DATA pListData = msg_ui_thread_get_current_list();
753
754                 it_sweep = (Elm_Object_Item *)elm_genlist_decorated_item_get(pListData->genlist);
755                 if (it_sweep) {
756                         elm_genlist_item_decorate_mode_set(it_sweep, "slide", EINA_FALSE);
757                         elm_genlist_item_select_mode_set(it_sweep, ELM_OBJECT_SELECT_MODE_DEFAULT);
758                 }
759         }
760
761         pData->app_state = app_state;
762 }
763
764 int msg_ui_thread_get_app_state(PMSG_THREAD_DATA pData)
765 {
766         if (!pData)
767                 return MSG_UI_STATE_NONE;
768
769         return pData->app_state;
770 }
771
772 const char *msg_ui_thread_make_search_result_string(const char *string, char *searchword, bool *result)
773 {
774         char pstr[DEF_BUF_LEN + 1] = {0,};
775         static char return_string[DEF_BUF_LEN + 1] = { 0, };
776         int word_len = 0;
777         int search_len = 0;
778         int i = 0;
779         bool found = false;
780         gchar* markup_text_start;
781         gchar* markup_text_end;
782         gchar* markup_text;
783
784         if (!searchword) return string;
785
786         if (g_utf8_validate(string,-1,NULL)) {
787
788                 strncpy(pstr, string, DEF_BUF_LEN);
789
790                 word_len = strlen(pstr);
791                 search_len = strlen(searchword);
792
793                 for (i = 0; i < word_len; i++) {
794                         if (!strncasecmp(searchword, &pstr[i], search_len)) {
795                                 found = true;
796                                 break;
797                         }
798                 }
799
800                 *result = found;
801                 memset(return_string, 0x00, DEF_BUF_LEN);
802
803                 if (found) {
804                         if (i == 0) {
805                                 markup_text =  g_markup_escape_text(&pstr[i], search_len);
806                                 markup_text_end = g_markup_escape_text(&pstr[search_len], word_len-search_len);
807                                 snprintf(return_string,
808                                                         DEF_BUF_LEN,
809                                                         "<match>%s</match>%s",
810                                                         (char*)markup_text,
811                                                         (char*)markup_text_end);
812                                 g_free(markup_text);
813                                 g_free(markup_text_end);
814                         } else {
815                                 markup_text_start = g_markup_escape_text(&pstr[0], i);
816                                 markup_text =  g_markup_escape_text(&pstr[i], search_len);
817                                 markup_text_end =  g_markup_escape_text(&pstr[i+search_len], word_len-(i+search_len));
818                                 snprintf(return_string,
819                                                         DEF_BUF_LEN,
820                                                         "%s<match>%s</match>%s",
821                                                         (char*)markup_text_start,
822                                                         (char*)markup_text,
823                                                         (char*)markup_text_end);
824                                 g_free(markup_text_start);
825                                 g_free(markup_text);
826                                 g_free(markup_text_end);
827                         }
828                 } else {
829                         snprintf(return_string, DEF_BUF_LEN, "%s", pstr);
830                 }
831         }
832
833         return return_string;
834 }
835
836
837 void msg_ui_thread_make_time_string(time_t *msg_t, char *buf, int buf_len)
838 {
839         PMSG_THREAD_DATA pData = msg_ui_thread_get_data();
840
841         time_t cur_t;
842         unsigned long int msg_day, cur_day;
843         int diffday;
844         struct tm msg_time;
845         struct tm cur_time;
846
847         char *date_str = NULL;
848         cur_t = time(NULL);
849
850         localtime_r(msg_t, &msg_time);
851         localtime_r(&cur_t, &cur_time);
852
853         msg_day = (msg_time.tm_year - 1900) * 365 + msg_time.tm_yday + (msg_time.tm_year - 1900 - 1) / 4;
854         cur_day = (cur_time.tm_year - 1900) * 365 + cur_time.tm_yday + (cur_time.tm_year - 1900 - 1) / 4;
855
856         diffday = cur_day - msg_day;
857
858         if (diffday == 1)
859                 snprintf(buf, buf_len, dgettext("sys_string", "IDS_COM_BODY_YESTERDAY"));
860         else if (diffday > 1) {
861                 date_str = msg_common_get_formatted_date(pData->locale, pData->date_ptn, msg_t);
862                 snprintf(buf, buf_len, " %s ", date_str);
863         } else {
864                 if (pData->time_fmt == MSG_TIME_FORMAT_24H) {
865                         date_str = msg_common_get_formatted_date(pData->locale, pData->time_24h_ptn, msg_t);
866                         snprintf(buf, buf_len, " %s ", date_str);
867                 } else { /* MSG_TIME_FORMAT_12H */
868                         date_str = msg_common_get_formatted_date(pData->locale, pData->time_12h_ptn, msg_t);
869                         snprintf(buf, buf_len, " %s ", date_str);
870                 }
871         }
872
873         if (date_str)
874                 free(date_str);
875 }
876