[misc] Sycn with master branch.
[apps/core/preloaded/calendar.git] / ug / detail / detail-attendee.c
1 /*\r
2   *\r
3   *  Copyright 2012  Samsung Electronics Co., Ltd\r
4   *\r
5   *  Licensed under the Flora License, Version 1.1 (the "License");\r
6   *  you may not use this file except in compliance with the License.\r
7   *  You may obtain a copy of the License at\r
8   *\r
9   *       http://floralicense.org/license/\r
10   *\r
11   *  Unless required by applicable law or agreed to in writing, software\r
12   *  distributed under the License is distributed on an "AS IS" BASIS,\r
13   *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
14   *  See the License for the specific language governing permissions and\r
15   *  limitations under the License.\r
16   */\r
17 \r
18 #include "cld.h"\r
19 #include "external-ug.h"\r
20 #include "detail-common.h"\r
21 \r
22 typedef struct {\r
23         const char *organizer_email;\r
24 \r
25         calendar_record_h record;\r
26 \r
27         Evas_Object *parent;\r
28         Evas_Object *genlist;\r
29         Evas_Object *ctx_popup;\r
30         Evas_Object *bg;\r
31 \r
32         Eina_List *attendee_list;\r
33         Eina_List *required_plist;\r
34         Eina_List *non_required_plist;\r
35 \r
36         Ecore_Event_Handler *event_handler;\r
37 \r
38         cal_participant *host;\r
39 \r
40         Evas_Coord x;\r
41         Evas_Coord y;\r
42 }cal_detail_attendee_data;\r
43 \r
44 static char* __cal_detail_attendee_get_genlist_req_header_item_label(void *data, Evas_Object *obj, const char *part);\r
45 static char* __cal_detail_attendee_get_genlist_non_req_header_item_label(void *data, Evas_Object *obj, const char *part);\r
46 \r
47 Elm_Genlist_Item_Class itc_2text = {0};\r
48 \r
49 static Elm_Genlist_Item_Class itc_req_h = {\r
50         .item_style = "grouptitle",\r
51         .func.text_get = __cal_detail_attendee_get_genlist_req_header_item_label,\r
52         .func.del = NULL,\r
53 };\r
54 \r
55 static Elm_Genlist_Item_Class itc_non_req_h = {\r
56         .item_style = "grouptitle",\r
57         .func.text_get = __cal_detail_attendee_get_genlist_non_req_header_item_label,\r
58         .func.del = NULL,\r
59 };\r
60 \r
61 static char *__cal_detail_attendee_get_genlist_item_label(void *data, Evas_Object *obj, const char *part)\r
62 {\r
63         c_retvm_if(!data, NULL, "data is null");\r
64         c_retvm_if(!obj, NULL, "obj is null");\r
65 \r
66         cal_participant *participant = data;\r
67 \r
68         if (!CAL_STRCMP(part, "elm.text.1"))\r
69                 return CAL_STRDUP(participant->name);\r
70 \r
71         if (!CAL_STRCMP(part, "elm.text.2")) {\r
72 \r
73                 if (participant->role == CALENDAR_ATTENDEE_ROLE_CHAIR)\r
74                         return strdup(C_("IDS_CLD_BODY_HOST_M_PERSON"));\r
75 \r
76                 // TODO: i18n\r
77                 switch (participant->status) {\r
78 \r
79                 case CALENDAR_ATTENDEE_STATUS_ACCEPTED:\r
80                         return strdup("Attend");\r
81                         break;\r
82 \r
83                 case CALENDAR_ATTENDEE_STATUS_DECLINED:\r
84                         return strdup(C_("IDS_CLD_BODY_DECLINED"));\r
85                         break;\r
86 \r
87                 case CALENDAR_ATTENDEE_STATUS_TENTATIVE:\r
88                         return strdup(C_("IDS_CLD_BODY_TENTATIVE"));\r
89                         break;\r
90                 default:\r
91                         return strdup("Not responded");\r
92                         break;\r
93                 }\r
94         }\r
95 \r
96         return NULL;\r
97 }\r
98 \r
99 static void __cal_detail_attendee_popup_hide_callback(void *data, Evas_Object *obj, void *ei)\r
100 {\r
101         c_retm_if(!data, "data is null");\r
102         c_retm_if(!obj, "obj is null");\r
103 \r
104         cal_detail_attendee_data* p = data;\r
105 \r
106         p->ctx_popup = NULL;\r
107 \r
108         evas_object_del(obj);\r
109 }\r
110 \r
111 static void __cal_detail_parcitipants_genlist_item_select_callback(void *data, Evas_Object *obj, void *event_info)\r
112 {\r
113         c_retm_if(!data, "data is null");\r
114         c_retm_if(!obj, "obj is null");\r
115 \r
116         cal_participant *part = data;\r
117         cal_detail_attendee_data *p = CAL_UTIL_GET_PRIV_DATA(obj);\r
118         c_retm_if(!p, "p is null");\r
119 \r
120         if (p->ctx_popup)\r
121                 evas_object_del(p->ctx_popup);\r
122 \r
123         Evas_Object *ctx_popup = p->ctx_popup = elm_ctxpopup_add(obj);\r
124         c_retm_if(!ctx_popup, "ctx_popup is null");\r
125 \r
126         evas_object_smart_callback_add(ctx_popup, "dismissed", __cal_detail_attendee_popup_hide_callback, p);\r
127 \r
128         char *email = part->email;\r
129 \r
130         if (0 < part->person_id) {\r
131                 cal_detail_common_get_person_default_number(part->person_id, &part->number);\r
132 \r
133                 char *number = part->number;\r
134 \r
135                 if (CAL_STRLEN(number)) {\r
136                         elm_ctxpopup_item_append(ctx_popup, S_("IDS_COM_BODY_VOICE_CALL"), NULL, cal_detail_common_ctx_callback_for_voice_call, number);\r
137 \r
138                         elm_ctxpopup_item_append(ctx_popup, S_("IDS_COM_BODY_MESSAGE"), NULL, cal_detail_common_ctx_callback_for_message, number);\r
139                 }\r
140 \r
141                 elm_ctxpopup_item_append(ctx_popup, S_("IDS_COM_BODY_EMAIL"), NULL, cal_detail_common_ctx_callback_for_email, email);\r
142 \r
143         } else {\r
144 \r
145                 elm_ctxpopup_item_append(ctx_popup, S_("IDS_COM_BODY_EMAIL"), NULL, cal_detail_common_ctx_callback_for_email, email);\r
146                 elm_ctxpopup_item_append(ctx_popup, S_("IDS_COM_OPT_ADD_TO_CONTACTS"), NULL, cal_detail_common_ctx_callback_for_contact, email);\r
147         }\r
148 \r
149         c_retm_if(!p->genlist, "p->genilst is null");\r
150         elm_genlist_item_selected_set(elm_genlist_selected_item_get(p->genlist), EINA_FALSE);\r
151 \r
152         evas_object_data_set(ctx_popup, "record", p->record);\r
153         evas_object_move(ctx_popup, p->x, p->y);\r
154         evas_object_show(ctx_popup);\r
155 }\r
156 \r
157 static void __cal_detail_attendee_append_genlist_item(cal_detail_attendee_data *p)\r
158 {\r
159         c_retm_if(!p, "p is null");\r
160 \r
161         c_retm_if(!p->genlist, "p->genlist is null");\r
162         c_retm_if(!p->attendee_list, "p->attendee_list is null");\r
163 \r
164         Eina_List *l = NULL;\r
165         cal_participant *part = NULL;\r
166         Evas_Object *genlist = p->genlist;\r
167 \r
168         Elm_Object_Item *item = NULL;\r
169 \r
170         itc_2text.item_style = "dialogue/2text.5";\r
171         itc_2text.func.text_get = __cal_detail_attendee_get_genlist_item_label;\r
172 \r
173         if (p->host)\r
174                 elm_genlist_item_append(genlist, &itc_2text, (void*)p->host, NULL, ELM_GENLIST_ITEM_NONE, __cal_detail_parcitipants_genlist_item_select_callback, part);\r
175 \r
176         if (eina_list_count(p->required_plist)) {\r
177                 item = elm_genlist_item_append(genlist, &itc_req_h, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);\r
178                 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);\r
179                 EINA_LIST_FOREACH(p->required_plist, l, part) {\r
180                         elm_genlist_item_append(genlist, &itc_2text, (void*)part, NULL, ELM_GENLIST_ITEM_NONE, __cal_detail_parcitipants_genlist_item_select_callback, part);\r
181                 }\r
182         }\r
183 \r
184         if (eina_list_count(p->non_required_plist)) {\r
185                 item = elm_genlist_item_append(genlist, &itc_non_req_h, NULL, NULL, ELM_GENLIST_ITEM_NONE, NULL, NULL);\r
186                 elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY);\r
187                 EINA_LIST_FOREACH(p->non_required_plist, l, part) {\r
188                         elm_genlist_item_append(genlist, &itc_2text, (void*)part, NULL, ELM_GENLIST_ITEM_NONE, __cal_detail_parcitipants_genlist_item_select_callback, part);\r
189                 }\r
190         }\r
191 \r
192 \r
193 }\r
194 \r
195 static Eina_Bool __cal_detail_attendee_mouse_down_callback(void *data, int type, void *event)\r
196 {\r
197         c_retvm_if(!event, EINA_FALSE, "event is null");\r
198         c_retvm_if(!data, EINA_FALSE, "data is null");\r
199 \r
200         Ecore_Event_Mouse_Button *ev = event;\r
201         cal_detail_attendee_data *p = data;\r
202 \r
203         p->x = ev->x;\r
204         p->y = ev->y;\r
205 \r
206         return ECORE_CALLBACK_RENEW;\r
207 }\r
208 \r
209 static void __cal_detail_attendee_delete_callback(void *data, Evas *e, Evas_Object *obj, void *ei)\r
210 {\r
211         CAL_FN_START;\r
212 \r
213         c_retm_if(!data, "data is null");\r
214 \r
215         cal_detail_attendee_data *p = data;\r
216 \r
217         if (p->ctx_popup)\r
218                 evas_object_del(p->ctx_popup);\r
219 \r
220         if (p->event_handler)\r
221                 ecore_event_handler_del(p->event_handler);\r
222 \r
223         if (p->attendee_list)\r
224                 eina_list_free(p->attendee_list);\r
225 \r
226         free(p);\r
227 }\r
228 \r
229 static void __cal_detail_attendee_ordering_genlist_item(void *data)\r
230 {\r
231         c_retm_if(!data, "data is null");\r
232 \r
233         cal_participant *part = NULL;\r
234         cal_detail_attendee_data *p = data;\r
235         Eina_List *l = NULL;\r
236 \r
237         EINA_LIST_FOREACH(p->attendee_list, l, part) {\r
238                 if (part) {\r
239 \r
240                         if (p->organizer_email && !strcmp(p->organizer_email, part->email)) {\r
241                                 part->role = CALENDAR_ATTENDEE_ROLE_CHAIR;\r
242                                 p->host = part;\r
243                         }\r
244 \r
245                         else if (part->role == CALENDAR_ATTENDEE_ROLE_REQ_PARTICIPANT)\r
246                                 p->required_plist = eina_list_append(p->required_plist, part);\r
247                         else\r
248                                 p->non_required_plist = eina_list_append(p->non_required_plist, part);\r
249                 }\r
250         }\r
251 }\r
252 \r
253 static const char * __cal_detail_attendee_get_organizer_email(calendar_record_h record)\r
254 {\r
255         c_retv_if(!record, NULL);\r
256 \r
257         char *organizer_email = NULL;\r
258 \r
259         calendar_error_e error = CALENDAR_ERROR_NONE;\r
260 \r
261         error = calendar_record_get_str_p(record, _calendar_event.organizer_email, &organizer_email);\r
262         c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_record_get_str() is failed(%x)", error);\r
263 \r
264         return organizer_email;\r
265 }\r
266 \r
267 static cal_participant * __cal_detail_attendee_append_list(calendar_record_h calendar_attendee)\r
268 {\r
269         cal_participant *part = calloc(1, sizeof(cal_participant));\r
270         c_retv_if(!part, NULL);\r
271
272         char *name = NULL;
273
274         calendar_error_e error = CALENDAR_ERROR_NONE;
275 \r
276         error = calendar_record_get_str(calendar_attendee, _calendar_attendee.name, &name);\r
277         c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_record_get_str() is failed(%x)", error);
278 \r
279         if (!CAL_STRLEN(name)) {\r
280                 ERR("Attendee name is NULL!!");
281                 name = S_("IDS_COM_BODY_UNKNOWN");
282         }
283
284         part->name = name;\r
285
286         char *email = NULL;
287 \r
288         error = calendar_record_get_str(calendar_attendee, _calendar_attendee.email, &email);\r
289         c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_record_get_str() is failed(%x)", error);
290
291         if (CAL_STRLEN(email))
292                 part->email = email;\r
293         else
294                 ERR("Attendee email is mandatory data!! There is no email for %s.", part->name);
295
296         error = calendar_record_get_int(calendar_attendee, _calendar_attendee.person_id, &part->person_id);\r
297         c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_record_get_int() is failed(%x)", error);
298
299         error = calendar_record_get_int(calendar_attendee, _calendar_attendee.status, &part->status);\r
300         c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_record_get_int() is failed(%x)", error);
301
302         error = calendar_record_get_int(calendar_attendee, _calendar_attendee.role, &part->role);\r
303         c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_record_get_int() is failed(%x)", error);
304
305         error = calendar_record_get_int(calendar_attendee, _calendar_attendee.rsvp, &part->response);\r
306         c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_record_get_int() is failed(%x)", error);\r
307 \r
308         return part;\r
309 }\r
310 \r
311 static Eina_List * __cal_detail_attendee_get_attendee_list(calendar_record_h record)\r
312 {\r
313         c_retv_if(!record, NULL);\r
314 \r
315         Eina_List *attendee_list = NULL;\r
316 \r
317         int attendee_count = 0;\r
318 \r
319         calendar_error_e error = CALENDAR_ERROR_NONE;\r
320 \r
321         error = calendar_record_get_child_record_count(record, _calendar_event.calendar_attendee, (unsigned int *)&attendee_count);\r
322         c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_record_get_child_record_count() is failed(%x)", error);\r
323 \r
324         int i = 0;\r
325 \r
326         for (i = 0; i < attendee_count; i++) {\r
327                 calendar_record_h calendar_attendee = NULL;\r
328 \r
329                 error = calendar_record_get_child_record_at_p(record, _calendar_event.calendar_attendee, i, &calendar_attendee);\r
330                 if (error != CALENDAR_ERROR_NONE) {\r
331                         ERR("calendar_record_get_child_record_at_p() is failed(%x)", error);\r
332                         continue;\r
333                 }\r
334 \r
335                 cal_participant *part = __cal_detail_attendee_append_list(calendar_attendee);\r
336 \r
337                 if (part)\r
338                         attendee_list = eina_list_append(attendee_list, part);\r
339         }\r
340 \r
341         return attendee_list;\r
342 }\r
343 \r
344 static void inline __cal_detail_attendee_clone_record(const calendar_record_h source_record, calendar_record_h *target_record)\r
345 {\r
346         CAL_FN_START;\r
347 \r
348         c_ret_if(!source_record);\r
349         c_ret_if(!target_record);\r
350 \r
351         calendar_error_e error = CALENDAR_ERROR_NONE;\r
352 \r
353         error = calendar_record_clone(source_record, target_record);\r
354         c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_record_clone() is failed(%x)", error);\r
355 }\r
356 \r
357 void cal_detail_attendee_create_view(Evas_Object *naviframe, calendar_record_h record)\r
358 {\r
359         c_retm_if(!naviframe, "naviframe is null.");\r
360         c_retm_if(!record, "participants_list is null.");\r
361 \r
362         cal_detail_attendee_data *p = calloc(1, sizeof(cal_detail_attendee_data));\r
363         c_retm_if(!p, "p is null");\r
364 \r
365         __cal_detail_attendee_clone_record(record, &p->record);\r
366 \r
367         p->attendee_list = __cal_detail_attendee_get_attendee_list(p->record);\r
368         p->organizer_email = __cal_detail_attendee_get_organizer_email(p->record);\r
369         __cal_detail_attendee_ordering_genlist_item(p);\r
370 \r
371         Evas_Object *ly = cal_util_add_layout(naviframe, "list/base");\r
372         if(!ly)\r
373         {\r
374                 ERR("ly is null");\r
375                 free(p);\r
376                 return;\r
377         }\r
378 \r
379         evas_object_data_set(ly, "priv", p);\r
380         edje_object_signal_emit(CAL_UTIL_GET_EDJ_DATA(ly), "searchbar,hide", "prog");\r
381 \r
382         p->bg = cal_util_add_bg(ly,EINA_FALSE);\r
383         if (!p->bg) {\r
384                 ERR("cal_util_add_bg returned null");\r
385                 evas_object_del(ly);\r
386                 free(p);\r
387                 return;\r
388         }\r
389         elm_object_part_content_set(ly, "base", p->bg);\r
390 \r
391         p->genlist = elm_genlist_add(naviframe);\r
392         c_retm_if(!p->genlist, "p->genlist is null");\r
393         evas_object_show(p->genlist);\r
394 \r
395         evas_object_event_callback_add(p->genlist, EVAS_CALLBACK_DEL, __cal_detail_attendee_delete_callback, p);\r
396 \r
397         evas_object_data_set(p->genlist, "priv", p);\r
398 \r
399         __cal_detail_attendee_append_genlist_item(p);\r
400 \r
401         elm_object_part_content_set(ly, "sw", p->genlist);\r
402 \r
403         p->event_handler = ecore_event_handler_add(ECORE_EVENT_MOUSE_BUTTON_DOWN, __cal_detail_attendee_mouse_down_callback, p);\r
404         c_warn_if(!p->event_handler, "p->event_handler is null");\r
405 \r
406         ///TODO: i18n\r
407         Elm_Object_Item *navi_item = elm_naviframe_item_push(naviframe, C_("IDS_CLD_BODY_ATTENDANCE_STATUS"), NULL, NULL, ly, NULL);\r
408         c_retm_if(!navi_item, "navi_item is null");\r
409 \r
410         Evas_Object *back_button = elm_object_item_part_content_get(navi_item, "prev_btn");\r
411         if (!back_button)\r
412         {\r
413                 ERR("elm_object_item_part_content_get returned null");\r
414                 elm_naviframe_item_pop(naviframe);\r
415                 evas_object_del(p->genlist);\r
416                 return;\r
417         }\r
418 \r
419         elm_object_style_set(back_button, "naviframe/back_btn/default");\r
420 \r
421 }\r
422 \r
423 static char* __cal_detail_attendee_get_genlist_req_header_item_label(void *data, Evas_Object *obj, const char *part)\r
424 {\r
425         if (!CAL_STRCMP(part, "elm.text")) {\r
426 \r
427                 const char* text = "Required participant";\r
428                 return strdup(text);\r
429         }\r
430 \r
431         return NULL;\r
432 }\r
433 \r
434 static char* __cal_detail_attendee_get_genlist_non_req_header_item_label(void *data, Evas_Object *obj, const char *part)\r
435 {\r
436         if (!CAL_STRCMP(part, "elm.text")) {\r
437 \r
438                 const char* text = "Non-required participant";\r
439                 return strdup(text);\r
440         }\r
441 \r
442         return NULL;\r
443 }\r