a3ba1dc9030b8bb9073ae83ec0f4587bdf194b83
[apps/core/preloaded/email.git] / composer / src / email-composer-predictive-search.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 <string.h>
18 #include "email-composer.h"
19 #include "email-composer-util.h"
20 #include "email-composer-predictive-search.h"
21 #include "email-composer-recipient.h"
22
23 static void _composer_ps_list_sel(void *data, Evas_Object *obj, void *event_info);
24 static Eina_Bool _composer_ps_start(void *data);
25 static Eina_Bool _composer_ps_set_list(COMPOSER_RECIPIENT_TYPE_E type);
26 static void _composer_ps_show_recp_field(EmailComposerUGD *ugd, COMPOSER_RECIPIENT_TYPE_E type);
27 static void _composer_ps_hide_recp_field(EmailComposerUGD *ugd, COMPOSER_RECIPIENT_TYPE_E type);
28
29 EmailComposerUGD *g_ugd;
30
31 void composer_ps_request_search(EmailComposerUGD *ugd)
32 {
33         debug_log("");
34
35         Eina_List *predict_list = NULL;
36
37         g_ugd = ugd;
38
39         predict_list = composer_ps_search_contact(ugd, ugd->ps_keyword);
40
41         if (!predict_list) {
42                 Evas_Object *mbe = NULL;
43
44                 if (ugd->selected_entry == ugd->to_mbe_entry) {
45                         mbe = ugd->to_mbe;
46                         _composer_ps_show_recp_field(ugd, COMPOSER_RECIPIENT_TYPE_TO);
47                 } else if (ugd->selected_entry == ugd->cc_mbe_entry) {
48                         mbe = ugd->cc_mbe;
49                         _composer_ps_show_recp_field(ugd, COMPOSER_RECIPIENT_TYPE_CC);
50                 } else if (ugd->selected_entry == ugd->bcc_mbe_entry) {
51                         mbe = ugd->bcc_mbe;
52                         _composer_ps_show_recp_field(ugd, COMPOSER_RECIPIENT_TYPE_BCC);
53                 }
54
55                 _composer_ps_delete_list(ugd);
56
57                 edje_object_signal_emit(_EDJ(ugd->c_layout), "back_content", "*");
58
59                 elm_object_scroll_hold_pop(ugd->main_scroller);
60
61                 ugd->ps_on = false;
62         } else {
63
64                 /* Create Predictive search field */
65                 _composer_recipient_create_ps_field(ugd->c_layout, ugd);
66
67                 if (ugd->selected_entry == ugd->to_mbe_entry) {
68                         _composer_ps_hide_recp_field(ugd, COMPOSER_RECIPIENT_TYPE_TO);
69                         _composer_ps_set_list(COMPOSER_RECIPIENT_TYPE_TO);
70                 } else if (ugd->selected_entry == ugd->cc_mbe_entry) {
71                         _composer_ps_hide_recp_field(ugd, COMPOSER_RECIPIENT_TYPE_CC);
72                         _composer_ps_set_list(COMPOSER_RECIPIENT_TYPE_CC);
73                 } else if (ugd->selected_entry == ugd->bcc_mbe_entry) {
74                         _composer_ps_hide_recp_field(ugd, COMPOSER_RECIPIENT_TYPE_BCC);
75                         _composer_ps_set_list(COMPOSER_RECIPIENT_TYPE_BCC);
76                 }
77
78                 elm_object_scroll_hold_push(ugd->main_scroller);
79
80                 edje_object_signal_emit(_EDJ(ugd->c_layout), "go_content", "*");
81
82                 if (ugd->contacts_list_info) {
83                         composer_ps_delete_contacts_list(ugd->contacts_list_info);
84                         ugd->contacts_list_info = eina_list_free(ugd->contacts_list_info);
85                 }
86
87                 ugd->contacts_list_info = predict_list;
88
89                 _composer_ps_create_sublist(ugd);
90
91                 ugd->ps_on = true;
92         }
93 }
94
95 static Eina_Bool _composer_ps_set_list(COMPOSER_RECIPIENT_TYPE_E type)
96 {
97         debug_log("");
98
99         if (type == COMPOSER_RECIPIENT_TYPE_TO) {
100                 elm_object_part_content_set(g_ugd->c_layout, "to_ps", g_ugd->ps_list);
101                 edje_object_signal_emit(_EDJ(g_ugd->c_layout), "show_to_ps", "*");
102         } else if (type == COMPOSER_RECIPIENT_TYPE_CC) {
103                 elm_object_part_content_set(g_ugd->c_layout, "cc_ps", g_ugd->ps_list);
104                 edje_object_signal_emit(_EDJ(g_ugd->c_layout), "show_cc_ps", "*");
105         } else if (type == COMPOSER_RECIPIENT_TYPE_BCC) {
106                 elm_object_part_content_set(g_ugd->c_layout, "bcc_ps", g_ugd->ps_list);
107                 edje_object_signal_emit(_EDJ(g_ugd->c_layout), "show_bcc_ps", "*");
108         }
109
110         return EINA_FALSE;
111 }
112
113 Evas_Object *_composer_recipient_create_ps_field(Evas_Object *parent, EmailComposerUGD *ugd)
114 {
115         debug_log("");
116
117         if (ugd->ps_list) {
118                 evas_object_del(ugd->ps_list);
119                 ugd->ps_list = NULL;
120         }
121
122         Evas_Object *list;
123
124         list = elm_genlist_add(parent);
125         elm_object_theme_set(list, ugd->th);
126         evas_object_size_hint_align_set(list, EVAS_HINT_FILL, 0.0);
127         elm_genlist_homogeneous_set(list, EINA_TRUE);
128         elm_object_focus_allow_set(list, EINA_FALSE);
129
130         ugd->ps_itc_2.item_style = "email.2text.1icon"; /*"email/predictive/2text.8";*/
131         ugd->ps_itc_2.func.text_get = composer_ps_text_get;
132         ugd->ps_itc_2.func.content_get = composer_ps_icon_get;
133         ugd->ps_itc_2.func.state_get = NULL;
134         ugd->ps_itc_2.func.del = NULL;
135
136         ugd->ps_itc_1.item_style = "email.1text.1icon"; /*"email/predictive/1text.2";*/
137         ugd->ps_itc_1.func.text_get = composer_ps_text_get;
138         ugd->ps_itc_1.func.content_get = composer_ps_icon_get;
139         ugd->ps_itc_1.func.state_get = NULL;
140         ugd->ps_itc_1.func.del = NULL;
141
142         ugd->ps_list = list;
143
144         return list;
145 }
146
147 static Eina_Bool _composer_ps_start(void *data)
148 {
149         debug_log("");
150
151         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
152
153         if (ugd->ps_timer) {
154                 ecore_timer_del(ugd->ps_timer);
155                 ugd->ps_timer = NULL;
156         }
157
158         if (ugd->selected_entry == ugd->cc_mbe_entry) {
159                 ugd->b_cc_ps_open = true;
160         } else if (ugd->selected_entry == ugd->bcc_mbe_entry) {
161                 ugd->b_bcc_ps_open = true;
162         }
163
164         _composer_ps_delete_list(ugd);
165
166         /* Disable for fix ps problem */
167         composer_ps_request_search(ugd);
168
169         return EINA_FALSE;
170 }
171
172 void _composer_ps_stop(EmailComposerUGD *ugd)
173 {
174         debug_log("Begin");
175
176         _composer_ps_del_timer(ugd);
177
178         Evas_Object *mbe = NULL;
179
180         if (ugd->selected_entry == ugd->to_mbe_entry) {
181                 mbe = ugd->to_mbe;
182                 edje_object_signal_emit(_EDJ(ugd->c_layout), "hide_to_ps", "*");
183
184                 if (ugd->cc_added) {
185                         evas_object_show(ugd->cc_ly);
186                         elm_object_part_content_set(ugd->c_layout, "cc_field", ugd->cc_ly);
187                         edje_object_signal_emit(_EDJ(ugd->c_layout), "show.cc", "*");
188                 }
189
190                 if (ugd->bcc_added) {
191                         evas_object_show(ugd->bcc_ly);
192                         elm_object_part_content_set(ugd->c_layout, "bcc_field", ugd->bcc_ly);
193                         edje_object_signal_emit(_EDJ(ugd->c_layout), "show.bcc", "*");
194                 }
195         } else if (ugd->selected_entry == ugd->cc_mbe_entry) {
196                 mbe = ugd->cc_mbe;
197                 edje_object_signal_emit(_EDJ(ugd->c_layout), "hide_cc_ps", "*");
198
199                 if (ugd->to_ly) {
200                         evas_object_show(ugd->to_ly);
201                         elm_object_part_content_set(ugd->c_layout, "to_field", ugd->to_ly);
202                         edje_object_signal_emit(_EDJ(ugd->c_layout), "show.to", "*");
203                 }
204
205                 if (ugd->bcc_added) {
206                         evas_object_show(ugd->bcc_ly);
207                         elm_object_part_content_set(ugd->c_layout, "bcc_field", ugd->bcc_ly);
208                         edje_object_signal_emit(_EDJ(ugd->c_layout), "show.bcc", "*");
209                 }
210         } else if (ugd->selected_entry == ugd->bcc_mbe_entry) {
211                 mbe = ugd->bcc_mbe;
212                 edje_object_signal_emit(_EDJ(ugd->c_layout), "hide_bcc_ps", "*");
213
214                 if (ugd->to_ly) {
215                         evas_object_show(ugd->to_ly);
216                         elm_object_part_content_set(ugd->c_layout, "to_field", ugd->to_ly);
217                         edje_object_signal_emit(_EDJ(ugd->c_layout), "show.to", "*");
218                 }
219
220                 if (ugd->cc_added) {
221                         evas_object_show(ugd->cc_ly);
222                         elm_object_part_content_set(ugd->c_layout, "cc_field", ugd->cc_ly);
223                         edje_object_signal_emit(_EDJ(ugd->c_layout), "show.cc", "*");
224                 }
225         }
226
227         _composer_ps_delete_list(ugd);
228
229         edje_object_signal_emit(_EDJ(ugd->c_layout), "back_content", "*");
230
231         debug_log("End");
232 }
233
234 void _composer_ps_del_timer(EmailComposerUGD *ugd)
235 {
236         debug_log("");
237
238         if (ugd->ps_timer) {
239                 ecore_timer_del(ugd->ps_timer);
240                 ugd->ps_timer = NULL;
241         }
242 }
243
244 void _composer_ps_add_timer(EmailComposerUGD *ugd)
245 {
246         debug_log("");
247
248         _composer_ps_del_timer(ugd);
249
250         ugd->ps_timer = ecore_timer_add(0.1, _composer_ps_start, ugd);
251 }
252
253 void _composer_ps_del_scroll_timer(EmailComposerUGD *ugd)
254 {
255         debug_log("");
256
257         if (ugd->sc_timer) {
258                 ecore_timer_del(ugd->sc_timer);
259                 ugd->sc_timer = NULL;
260         }
261 }
262
263 Eina_Bool _composer_ps_scroll_pop(void *data)
264 {
265         debug_log("");
266
267         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
268
269         _composer_ps_del_scroll_timer(ugd);
270
271         elm_object_scroll_hold_pop(ugd->main_scroller);
272
273         return EINA_FALSE;
274 }
275
276 Eina_List *composer_ps_search_contact(EmailComposerUGD *ugd, const char *search_word)
277 {
278         debug_log("");
279
280         int ct_ret = CONTACTS_ERROR_NONE;
281         EMAIL_CONTACT_LIST_INFO_S *contacts_list_item = NULL;
282         Eina_List *contacts_list = NULL;
283         contacts_list_h list = NULL;
284
285         ct_ret = email_get_contacts_list(CONTACTS_MATCH_CONTAINS, &list, search_word);
286         debug_log("email_get_contacts_record: list : %d", list);
287
288         if (!list) {
289                 debug_log("list is NULL");
290                 contacts_list_destroy(list, true);
291                 return contacts_list;
292         }
293
294         contacts_list_item = (EMAIL_CONTACT_LIST_INFO_S *)calloc(1, sizeof(EMAIL_CONTACT_LIST_INFO_S));
295
296         if (contacts_list_item == NULL){
297                 debug_log("contacts_list_item is NULL");
298                 return contacts_list;
299         }
300
301         ct_ret = email_get_contacts_list_info(list, contacts_list_item);
302         debug_log("email_get_contacts_list_info: contacts_list_item : %d", contacts_list_item);
303
304         if (g_strcmp0(contacts_list_item->display_name, "\n") && contacts_list_item->email_address &&
305                 (strcasestr(contacts_list_item->display_name, search_word) || strcasestr(contacts_list_item->email_address, search_word))) {
306                 contacts_list_item->ugd = ugd;
307                 contacts_list = eina_list_append(contacts_list, contacts_list_item);
308         } else {
309                 if (contacts_list_item) {
310                         Eina_List *free_contacts_list = NULL;   /* to use existing composer_ps_delete_contacts_list API, a temp list is used */
311                         free_contacts_list = eina_list_append(free_contacts_list, contacts_list_item);
312                         composer_ps_delete_contacts_list(free_contacts_list);
313                         eina_list_free(free_contacts_list);
314                 }
315         }
316         contacts_list_destroy(list, true);
317
318         return contacts_list;
319 }
320
321 char *composer_ps_text_get(void *data, Evas_Object *obj, const char *part)
322 {
323         EMAIL_CONTACT_LIST_INFO_S *contacts_list_item = (EMAIL_CONTACT_LIST_INFO_S *) data;
324         EmailComposerUGD *ugd = contacts_list_item->ugd;
325
326         char *return_value = NULL;
327         char *output = NULL;
328
329         if (g_strcmp0(part, "elm.text") == 0) {
330                 _composer_change_text_to_textblock(contacts_list_item->email_address, &output, ugd->ps_keyword, COMPOSER_TEXT_PREFIX, COMPOSER_TEXT_POSTFIX);
331                 if (output) {
332                         return_value = g_strdup(output);
333                         free(output);
334                 } else
335                         return_value = g_strdup(contacts_list_item->email_address);
336         } else if (g_strcmp0(part, "elm.text.1") == 0) {
337                 _composer_change_text_to_textblock(contacts_list_item->display_name, &output, ugd->ps_keyword, COMPOSER_TEXT_PREFIX, COMPOSER_TEXT_POSTFIX);
338                 if (output) {
339                         return_value = g_strdup(output);
340                         free(output);
341                 } else
342                         return_value = g_strdup(contacts_list_item->display_name);
343         } else if (g_strcmp0(part, "elm.text.2") == 0) {
344                 _composer_change_text_to_textblock(contacts_list_item->email_address, &output, ugd->ps_keyword, COMPOSER_TEXT_PREFIX, COMPOSER_TEXT_POSTFIX);
345                 if (output) {
346                         return_value = g_strdup(output);
347                         free(output);
348                 } else
349                         return_value = g_strdup(contacts_list_item->email_address);
350         }
351
352         return return_value;
353 }
354
355 Evas_Object *composer_ps_icon_get(void *data, Evas_Object *obj, const char *part)
356 {
357         debug_log("");
358
359         EMAIL_CONTACT_LIST_INFO_S *contacts_list_item = (EMAIL_CONTACT_LIST_INFO_S *) data;
360
361         Evas_Object *ic = elm_icon_add(obj);
362
363         if (!strncmp(part, "elm.icon", 8)) {
364                 if (contacts_list_item->image_path) {
365                         debug_log("contacts_list_item->image_path : %s", contacts_list_item->image_path);
366                         elm_icon_file_set(ic, contacts_list_item->image_path, NULL);
367                 } else {
368                         char buf[MAX_PATH_LEN] = { 0, };
369                         snprintf(buf, sizeof(buf), "%s/00_list_photo_default.png", COMPOSER_ICON_DIR);
370                         debug_log("buf : %s", buf);
371                         elm_icon_file_set(ic, buf, NULL);
372                 }
373
374                 evas_object_size_hint_aspect_set(ic, EVAS_ASPECT_CONTROL_VERTICAL, 1, 1);
375                 elm_icon_resizable_set(ic, 1, 1);
376                 evas_object_image_smooth_scale_set(ic, 1);
377                 evas_object_show(ic);
378
379                 return ic;
380         }
381
382         return NULL;
383 }
384
385 void composer_ps_delete_contacts_list(Eina_List *predict_list)
386 {
387         debug_log("Begin");
388
389         Eina_List *lt = NULL;
390         Eina_List *l = predict_list;
391
392         EMAIL_CONTACT_LIST_INFO_S *contacts_list_item = NULL;
393         EINA_LIST_FOREACH(l, lt, contacts_list_item) {
394                 if (contacts_list_item) {
395                         contacts_list_item->ugd = NULL;
396                         g_free(contacts_list_item->display);
397                         contacts_list_item->display = NULL;
398                         g_free(contacts_list_item->email_address);
399                         contacts_list_item->email_address = NULL;
400                         g_free(contacts_list_item->image_path);
401                         contacts_list_item->image_path = NULL;
402                 }
403         }
404         debug_log("End");
405 }
406
407 void _composer_ps_create_sublist(void *data)
408 {
409         debug_log("");
410
411         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
412
413         Eina_List *lt = NULL;
414         Eina_List *l = NULL;
415
416         if (ugd == NULL)
417                 return;
418
419         if (!ugd->ps_list || !ugd->contacts_list_info) {
420                 debug_log("ps_list is %p, contacts_list_info is %p", ugd->ps_list, ugd->contacts_list_info);
421                 return;
422         }
423
424         EMAIL_CONTACT_LIST_INFO_S *contacts_list_item = NULL;
425
426         elm_genlist_clear(ugd->ps_list);
427
428         contacts_list_item = eina_list_data_get(ugd->contacts_list_info);
429         l = ugd->contacts_list_info;
430         EINA_LIST_FOREACH(l, lt, contacts_list_item) {
431                 if (g_strcmp0(contacts_list_item->display_name, "\n") && strlen(contacts_list_item->display_name)) {
432                         elm_genlist_item_append(ugd->ps_list, &ugd->ps_itc_2, contacts_list_item, NULL, ELM_GENLIST_ITEM_NONE, _composer_ps_list_sel, ugd);
433                 } else {
434                         elm_genlist_item_append(ugd->ps_list, &ugd->ps_itc_1, contacts_list_item, NULL, ELM_GENLIST_ITEM_NONE, _composer_ps_list_sel, ugd);
435                 }
436         }
437
438 }
439
440 static void _composer_ps_list_sel(void *data, Evas_Object *obj, void *event_info)
441 {
442         debug_log("");
443
444         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
445
446         Elm_Object_Item *item = NULL;
447
448         EmailRecpInfo *ri = NULL;
449         EMAIL_CONTACT_LIST_INFO_S *contacts_list_item = NULL;
450         int free_ri = 0;
451
452         item = (Elm_Object_Item *) event_info;
453
454         if (!item) {
455                 debug_log("Item is NULL or Item is not Message item");
456                 return;
457         }
458
459         Evas_Object *mbe = NULL;
460
461         if (ugd->selected_entry == ugd->to_mbe_entry)
462                 mbe = ugd->to_mbe;
463         else if (ugd->selected_entry == ugd->cc_mbe_entry)
464                 mbe = ugd->cc_mbe;
465         else if (ugd->selected_entry == ugd->bcc_mbe_entry)
466                 mbe = ugd->bcc_mbe;
467
468         elm_genlist_item_selected_set(item, EINA_FALSE);
469
470         contacts_list_item = (EMAIL_CONTACT_LIST_INFO_S *) elm_object_item_data_get(item);
471
472         ri = (EmailRecpInfo *) calloc(1, sizeof(EmailRecpInfo));
473
474         if (ri != NULL) {
475                 ri->selected_email_idx = 0;
476
477                 if (contacts_list_item->email_address)
478                         snprintf(ri->email_list[0].email_addr, MAX_RECIPIENT_ADDRESS_LEN, "%s", contacts_list_item->email_address);
479
480                 if (g_strcmp0(contacts_list_item->display_name, "\n") && strlen(contacts_list_item->display_name))
481                         ri->display_name = g_strdup(contacts_list_item->display_name);
482                 else
483                         ri->display_name = NULL;
484
485                 ri->email_cnt = 1;
486                 ri->is_contact_info = true;
487                 ri->is_always_bcc = false;
488                 ri->is_from_addr = false;
489
490                 if (!_composer_is_valid_email(ri->email_list[0].email_addr)) {
491                         if (ugd->composer_noti) {
492                                 evas_object_del(ugd->composer_noti);
493                                 ugd->composer_noti = NULL;
494                         }
495                         ugd->composer_noti = _composer_create_noti(ugd, false, dgettext("sys_string", "IDS_COM_POP_WARNING"),
496                                 _("IDS_EMAIL_POP_INVALID_EMAIL_ADDRESS"), 0, NULL, NULL, 1.5, _composer_noti_response_cb);
497
498                         elm_entry_entry_set(ugd->to_mbe_entry, "");
499                         free_ri = 1;
500                         goto FINISH_OFF;
501                 }
502
503                 char msg[MAX_STR_LEN] = { 0, };
504                 snprintf(msg, sizeof(msg), _("IDS_EMAIL_POP_MAXIMUM_NUMBER_OF_RECIPIENTS_HPD_REACHED"), MAX_RECIPIENT_COUNT);
505
506                 if (ugd->selected_entry == ugd->to_mbe_entry) {
507                         if (_composer_check_recipient_is_duplicated(ugd, ugd->to_mbe, ri)) {
508                                 ugd->is_recipient_duplicated = TRUE;
509                                 if (ugd->composer_noti) {
510                                         evas_object_del(ugd->composer_noti);
511                                         ugd->composer_noti = NULL;
512                                 }
513                                 ugd->composer_noti = _composer_create_noti(ugd, false, dgettext("sys_string", "IDS_COM_POP_WARNING"),
514                                         dgettext("sys_string", "IDS_COM_POP_ALREDY_EXISTS"), 0, NULL, NULL, 1.5, _composer_noti_response_cb);
515
516                                 if (_composer_check_popup_exist(ugd))
517                                         elm_object_focus_set(mbe, EINA_FALSE);
518
519                                 elm_entry_entry_set(ugd->to_mbe_entry, "");
520                                 free_ri = 1;
521                                 goto FINISH_OFF;
522                         } else if (ugd->to_recipients_cnt >= MAX_RECIPIENT_COUNT) {
523                                 if (ugd->composer_noti) {
524                                         evas_object_del(ugd->composer_noti);
525                                         ugd->composer_noti = NULL;
526                                 }
527                                 ugd->composer_noti = _composer_create_noti(ugd, false, dgettext("sys_string", "IDS_COM_POP_WARNING"), msg,
528                                         0, NULL, NULL, 1.0, _composer_noti_response_cb);
529
530                                 if (_composer_check_popup_exist(ugd))
531                                         elm_object_focus_set(mbe, EINA_FALSE);
532
533                                 elm_entry_entry_set(ugd->to_mbe_entry, "");
534                                 free_ri = 1;
535                                 goto FINISH_OFF;
536                         }
537
538                         if (g_strcmp0(contacts_list_item->display_name, "\n") && strlen(contacts_list_item->display_name))
539                                 elm_multibuttonentry_item_append(ugd->to_mbe, contacts_list_item->display_name, NULL, ri);
540                         else
541                                 elm_multibuttonentry_item_append(ugd->to_mbe, contacts_list_item->email_address, NULL, ri);
542                         elm_entry_entry_set(ugd->to_mbe_entry, "");
543                 } else if (ugd->selected_entry == ugd->cc_mbe_entry) {
544                         if (_composer_check_recipient_is_duplicated(ugd, ugd->cc_mbe, ri)) {
545                                 ugd->is_recipient_duplicated = TRUE;
546                                 if (ugd->composer_noti) {
547                                         evas_object_del(ugd->composer_noti);
548                                         ugd->composer_noti = NULL;
549                                 }
550                                 ugd->composer_noti = _composer_create_noti(ugd, false, dgettext("sys_string", "IDS_COM_POP_WARNING"),
551                                         dgettext("sys_string", "IDS_COM_POP_ALREDY_EXISTS"), 0, NULL, NULL, 1.5, _composer_noti_response_cb);
552
553                                 if (_composer_check_popup_exist(ugd))
554                                         elm_object_focus_set(mbe, EINA_FALSE);
555
556                                 elm_entry_entry_set(ugd->cc_mbe_entry, "");
557                                 free_ri = 1;
558                                 goto FINISH_OFF;
559                         } else if (ugd->cc_recipients_cnt >= MAX_RECIPIENT_COUNT) {
560                                 if (ugd->composer_noti) {
561                                         evas_object_del(ugd->composer_noti);
562                                         ugd->composer_noti = NULL;
563                                 }
564                                 ugd->composer_noti = _composer_create_noti(ugd, false, dgettext("sys_string", "IDS_COM_POP_WARNING"), msg,
565                                         0, NULL, NULL, 1.0, _composer_noti_response_cb);
566
567                                 if (_composer_check_popup_exist(ugd))
568                                         elm_object_focus_set(mbe, EINA_FALSE);
569
570                                 elm_entry_entry_set(ugd->to_mbe_entry, "");
571                                 free_ri = 1;
572                                 goto FINISH_OFF;
573                         }
574
575                         if (g_strcmp0(contacts_list_item->display_name, "\n") && strlen(contacts_list_item->display_name))
576                                 elm_multibuttonentry_item_append(ugd->cc_mbe, contacts_list_item->display_name, NULL, ri);
577                         else
578                                 elm_multibuttonentry_item_append(ugd->cc_mbe, contacts_list_item->email_address, NULL, ri);
579                         elm_entry_entry_set(ugd->cc_mbe_entry, "");
580                 } else if (ugd->selected_entry == ugd->bcc_mbe_entry) {
581                         if (_composer_check_recipient_is_duplicated(ugd, ugd->bcc_mbe, ri)) {
582                                 ugd->is_recipient_duplicated = TRUE;
583                                 if (ugd->composer_noti) {
584                                         evas_object_del(ugd->composer_noti);
585                                         ugd->composer_noti = NULL;
586                                 }
587                                 ugd->composer_noti = _composer_create_noti(ugd, false, dgettext("sys_string", "IDS_COM_POP_WARNING"),
588                                         dgettext("sys_string", "IDS_COM_POP_ALREDY_EXISTS"), 0, NULL, NULL, 1.5, _composer_noti_response_cb);
589
590                                 if (_composer_check_popup_exist(ugd))
591                                         elm_object_focus_set(mbe, EINA_FALSE);
592
593                                 elm_entry_entry_set(ugd->bcc_mbe_entry, "");
594                                 free_ri = 1;
595                                 goto FINISH_OFF;
596                         } else if (ugd->bcc_recipients_cnt >= MAX_RECIPIENT_COUNT) {
597                                 if (ugd->composer_noti) {
598                                         evas_object_del(ugd->composer_noti);
599                                         ugd->composer_noti = NULL;
600                                 }
601                                 ugd->composer_noti = _composer_create_noti(ugd, false, dgettext("sys_string", "IDS_COM_POP_WARNING"), msg,
602                                         0, NULL, NULL, 1.0, _composer_noti_response_cb);
603
604                                 if (_composer_check_popup_exist(ugd))
605                                         elm_object_focus_set(mbe, EINA_FALSE);
606
607                                 elm_entry_entry_set(ugd->to_mbe_entry, "");
608                                 free_ri = 1;
609                                 goto FINISH_OFF;
610                         }
611
612                         if (g_strcmp0(contacts_list_item->display_name, "\n") && strlen(contacts_list_item->display_name))
613                                 elm_multibuttonentry_item_append(ugd->bcc_mbe, contacts_list_item->display_name, NULL, ri);
614                         else
615                                 elm_multibuttonentry_item_append(ugd->bcc_mbe, contacts_list_item->email_address, NULL, ri);
616                         elm_entry_entry_set(ugd->bcc_mbe_entry, "");
617                 } else {
618                         free_ri = 1;
619                         goto FINISH_OFF;
620                 }
621
622         } else
623                 goto FINISH_OFF;
624
625  FINISH_OFF:
626
627         if (ugd->ps_list) {
628                 _composer_ps_stop(ugd);
629                 ugd->sc_timer = ecore_timer_add(0.5, _composer_ps_scroll_pop, ugd);
630         }
631
632         if (ri && free_ri) {
633                 if (ri->display_name)
634                         free(ri->display_name);
635                 free(ri);
636         }
637 }
638
639 void _composer_ps_delete_list(void *data)
640 {
641         debug_log("");
642
643         EmailComposerUGD *ugd = (EmailComposerUGD *)data;
644
645         if (ugd->ps_list) {
646                 elm_genlist_clear(ugd->ps_list);
647
648                 if (ugd->contacts_list_info) {
649                         composer_ps_delete_contacts_list(ugd->contacts_list_info);
650                         ugd->contacts_list_info = eina_list_free(ugd->contacts_list_info);
651                 }
652         }
653
654         elm_object_scroll_hold_pop(ugd->main_scroller);
655 }
656
657 static void _composer_ps_show_recp_field(EmailComposerUGD *ugd, COMPOSER_RECIPIENT_TYPE_E type)
658 {
659         debug_log("");
660
661         if (type == COMPOSER_RECIPIENT_TYPE_TO) {
662                 edje_object_signal_emit(_EDJ(ugd->c_layout), "hide_to_ps", "*");
663
664                 if (ugd->from_ly) {
665                         evas_object_show(ugd->from_ly);
666                         elm_object_part_content_set(ugd->c_layout, "from_field", ugd->from_ly);
667                         edje_object_signal_emit(_EDJ(ugd->c_layout), "show.from", "from");
668                 }
669
670                 if (ugd->cc_added) {
671                         evas_object_show(ugd->cc_ly);
672                         elm_object_part_content_set(ugd->c_layout, "cc_field", ugd->cc_ly);
673                         edje_object_signal_emit(_EDJ(ugd->c_layout), "show.cc", "*");
674                 }
675
676                 if (ugd->bcc_added) {
677                         evas_object_show(ugd->bcc_ly);
678                         elm_object_part_content_set(ugd->c_layout, "bcc_field", ugd->bcc_ly);
679                         edje_object_signal_emit(_EDJ(ugd->c_layout), "show.bcc", "*");
680                 }
681         } else if (type == COMPOSER_RECIPIENT_TYPE_CC) {
682                 edje_object_signal_emit(_EDJ(ugd->c_layout), "hide_cc_ps", "*");
683
684                 if (ugd->from_ly) {
685                         evas_object_show(ugd->from_ly);
686                         elm_object_part_content_set(ugd->c_layout, "from_field", ugd->from_ly);
687                         edje_object_signal_emit(_EDJ(ugd->c_layout), "show.from", "from");
688                 }
689
690                 if (ugd->to_ly) {
691                         evas_object_show(ugd->to_ly);
692                         elm_object_part_content_set(ugd->c_layout, "to_field", ugd->to_ly);
693                         edje_object_signal_emit(_EDJ(ugd->c_layout), "show.to", "*");
694                 }
695
696                 if (ugd->bcc_added) {
697                         evas_object_show(ugd->bcc_ly);
698                         elm_object_part_content_set(ugd->c_layout, "bcc_field", ugd->bcc_ly);
699                         edje_object_signal_emit(_EDJ(ugd->c_layout), "show.bcc", "*");
700                 }
701         } else if (type == COMPOSER_RECIPIENT_TYPE_BCC) {
702                 edje_object_signal_emit(_EDJ(ugd->c_layout), "hide_bcc_ps", "*");
703
704                 if (ugd->from_ly) {
705                         evas_object_show(ugd->from_ly);
706                         elm_object_part_content_set(ugd->c_layout, "from_field", ugd->from_ly);
707                         edje_object_signal_emit(_EDJ(ugd->c_layout), "show.from", "from");
708                 }
709
710                 if (ugd->to_ly) {
711                         evas_object_show(ugd->to_ly);
712                         elm_object_part_content_set(ugd->c_layout, "to_field", ugd->to_ly);
713                         edje_object_signal_emit(_EDJ(ugd->c_layout), "show.to", "*");
714                 }
715
716                 if (ugd->cc_added) {
717                         evas_object_show(ugd->cc_ly);
718                         elm_object_part_content_set(ugd->c_layout, "cc_field", ugd->cc_ly);
719                         edje_object_signal_emit(_EDJ(ugd->c_layout), "show.cc", "*");
720                 }
721         }
722 }
723
724 static void _composer_ps_hide_recp_field(EmailComposerUGD *ugd, COMPOSER_RECIPIENT_TYPE_E type)
725 {
726         debug_log("");
727
728         if (type == COMPOSER_RECIPIENT_TYPE_TO) {
729                 if (ugd->from_ly) {
730                         evas_object_hide(ugd->from_ly);
731                         elm_object_part_content_unset(ugd->c_layout, "from_field");
732                         edje_object_signal_emit(_EDJ(ugd->c_layout), "hide.from", "from");
733                 }
734
735                 if (ugd->cc_added) {
736                         evas_object_hide(ugd->cc_ly);
737                         elm_object_part_content_unset(ugd->c_layout, "cc_field");
738                         edje_object_signal_emit(_EDJ(ugd->c_layout), "hide.cc", "*");
739                 }
740
741                 if (ugd->bcc_added) {
742                         evas_object_hide(ugd->bcc_ly);
743                         elm_object_part_content_unset(ugd->c_layout, "bcc_field");
744                         edje_object_signal_emit(_EDJ(ugd->c_layout), "hide.bcc", "*");
745                 }
746         } else if (type == COMPOSER_RECIPIENT_TYPE_CC) {
747                 if (ugd->from_ly) {
748                         evas_object_hide(ugd->from_ly);
749                         elm_object_part_content_unset(ugd->c_layout, "from_field");
750                         edje_object_signal_emit(_EDJ(ugd->c_layout), "hide.from", "from");
751                 }
752
753                 if (ugd->to_ly) {
754                         evas_object_hide(ugd->to_ly);
755                         elm_object_part_content_unset(ugd->c_layout, "to_field");
756                         edje_object_signal_emit(_EDJ(ugd->c_layout), "hide.to", "*");
757                 }
758
759                 if (ugd->bcc_added) {
760                         evas_object_hide(ugd->bcc_ly);
761                         elm_object_part_content_unset(ugd->c_layout, "bcc_field");
762                         edje_object_signal_emit(_EDJ(ugd->c_layout), "hide.bcc", "*");
763                 }
764         } else if (type == COMPOSER_RECIPIENT_TYPE_BCC) {
765                 if (ugd->from_ly) {
766                         evas_object_hide(ugd->from_ly);
767                         elm_object_part_content_unset(ugd->c_layout, "from_field");
768                         edje_object_signal_emit(_EDJ(ugd->c_layout), "hide.from", "from");
769                 }
770
771                 if (ugd->to_ly) {
772                         evas_object_hide(ugd->to_ly);
773                         elm_object_part_content_unset(ugd->c_layout, "to_field");
774                         edje_object_signal_emit(_EDJ(ugd->c_layout), "hide.to", "*");
775                 }
776
777                 if (ugd->cc_added) {
778                         evas_object_hide(ugd->cc_ly);
779                         elm_object_part_content_unset(ugd->c_layout, "cc_field");
780                         edje_object_signal_emit(_EDJ(ugd->c_layout), "hide.cc", "*");
781                 }
782         }
783 }