3 * Copyright 2012 Samsung Electronics Co., Ltd
5 * Licensed under the Flora License, Version 1.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
9 * http://floralicense.org/license/
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
22 #include <ui-gadget.h>
25 #include "detail-view.h"
27 #define SERVICE_CALENDAR_VIEWER_CAL_ID_NAME "cal_id"
28 #define SERVICE_CALENDAR_VIEWER_MIME_NAME AUL_K_MIME_CONTENT
29 #define VCALENDAR_LABLE_STRING_LENGTH 128
31 #if !defined(CV_PACKAGE)
32 # define CV_PACKAGE "calendar-viewer"
39 Evas_Object *save_to_calendar;
40 int selected_item_count;
44 calendar_record_h record;
48 static char *__cal_viewer_get_vcs_genlist_item_label(void *data, Evas_Object *obj, const char *part);
49 static Evas_Object* __cal_viewer_get_vcs_genlist_icon(void *item_data, Evas_Object *obj, const char *part);
50 static void __cal_viewer_create_view(struct appdata *ad, Evas_Object *parent, calendar_list_h list);
51 static void __cal_viewer_update_small_info(cal_viewer_data *p, int count);
53 static Elm_Genlist_Item_Class itc_3text_1icon_2 = {
54 .item_style = "3text.1icon.2",
55 .func.text_get = __cal_viewer_get_vcs_genlist_item_label,
56 .func.content_get = __cal_viewer_get_vcs_genlist_icon,
58 .decorate_all_item_style = "edit_default",
61 static char* __cal_viewer_vcs_get_time_str(calendar_record_h record)
63 c_retv_if(!record, NULL);
65 char stime[512] = {0};
68 const char* time = CAL_UTIL_TIME_FORMAT_1;
70 calendar_time_s start_time = {0};
72 _calendar_get_start_time(record, &start_time);
74 cal_util_convert_lli_to_tm(NULL, start_time.time.utime, &tm);
76 cal_util_get_time_text(stime, sizeof(stime), NULL, time, &tm);
78 return g_strdup_printf("%s", stime);
81 static char *__cal_viewer_get_vcs_genlist_item_label(void *data, Evas_Object *obj, const char *part)
83 c_retvm_if(!data, NULL, "data is null");
84 c_retvm_if(!part, NULL, "part is null");
86 vcs_item_data *item_data = (vcs_item_data*)data;
87 c_retv_if(!item_data->record, NULL);
89 if (!CAL_STRCMP(part,"elm.text.1")) {
90 return _calendar_get_summary(item_data->record);
92 } else if (!CAL_STRCMP(part,"elm.text.2")) {
93 return _calendar_get_location(item_data->record);
95 } else if (!CAL_STRCMP(part, "elm.text.3")) {
97 return __cal_viewer_vcs_get_time_str(item_data->record);
103 static void __cal_viewer_update_small_info(cal_viewer_data *p, int count)
105 c_retm_if(!p, "p is null");
108 cal_util_hide_small_information(p->layout);
112 struct appdata *ad = p->ad;
113 c_retm_if(!ad, "ad is null");
115 Evas_Object *nv = ad->naviframe;
116 c_retm_if(!nv, "nv is null");
118 char lable_str[VCALENDAR_LABLE_STRING_LENGTH] = { '\0'};
120 snprintf(lable_str, sizeof(lable_str), "%s (%d)", S_("IDS_COM_POP_SELECTED"), count);
122 cal_util_show_small_information(p->layout, lable_str, 0.0);
125 static void __cal_viewer_vcs_check_changed_callback(void *data, Evas_Object *obj, void *event_info)
127 c_retm_if(!data, "data is null");
129 vcs_item_data *item_data= data;
131 Evas_Object *genlist = elm_object_parent_widget_get(obj);
132 c_retm_if(!genlist, "genlist is null");
134 cal_viewer_data *p = evas_object_data_get(genlist, "priv");
135 c_retm_if(!p, "p is null");
137 Eina_Bool checked = elm_check_state_get(obj);
139 p->selected_item_count++;
140 item_data->checked = EINA_TRUE;
142 p->selected_item_count--;
143 item_data->checked = EINA_FALSE;
146 if (0 < p->selected_item_count)
147 elm_object_disabled_set(p->save_to_calendar, EINA_FALSE);
149 elm_object_disabled_set(p->save_to_calendar, EINA_TRUE);
151 __cal_viewer_update_small_info(p, p->selected_item_count);
154 static Evas_Object* __cal_viewer_get_vcs_genlist_icon(void *item_data, Evas_Object *obj, const char *part)
156 c_retvm_if(!part, NULL, "part is null");
157 c_retvm_if(!obj, NULL, "obj is null");
158 c_retvm_if(!item_data, NULL, "data is null");
160 Evas_Object *icon = NULL;
161 vcs_item_data *item = item_data;
162 c_retvm_if(!item->record, NULL, "item->record is null");
164 if (!CAL_STRCMP(part, "elm.icon") ) {
165 icon = elm_check_add(obj);
166 c_retvm_if(!icon, NULL, "elm_check_add returned null");
168 elm_check_state_pointer_set(icon, &item->checked);
169 evas_object_smart_callback_add(icon, "changed", __cal_viewer_vcs_check_changed_callback, item);
170 evas_object_propagate_events_set(icon, EINA_FALSE);
177 static bool viewer_create(void *data)
179 struct appdata *ad = data;
184 calendar_error_e error = CALENDAR_ERROR_NONE;
186 error = calendar_connect();
187 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_connect() is failed(%x)", error);
189 _calendar_init_hash();
191 elm_theme_extension_add(NULL, "/usr/apps/"CALENDAR_PACKAGE"/res/edje/theme.edj");
194 win = cal_util_add_window(CV_PACKAGE, NULL, NULL);
195 c_retvm_if(!win, false, "cal_util_add_window() Failed");
198 bg = cal_util_add_bg(win, EINA_TRUE);
199 c_retvm_if(NULL == bg, false, "cal_util_add_bg() Failed");
201 Evas_Object *conformant = elm_conformant_add(win);
202 c_retv_if(!conformant, false);
204 evas_object_size_hint_weight_set(conformant, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
205 elm_win_resize_object_add(win, conformant);
206 evas_object_show(conformant);
208 Evas_Object *base_layout = elm_layout_add(conformant);
209 c_retv_if(!base_layout, false);
211 Eina_Bool r = elm_layout_theme_set(base_layout, "layout", "application", "default");
212 c_warn_if(!r, "elm_layout_theme_set is failed");
214 evas_object_size_hint_weight_set(base_layout, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
216 elm_object_content_set(conformant, base_layout);
218 ad->base = base_layout;
220 nv = elm_naviframe_add(ad->base);
221 c_retvm_if(NULL == win, false, "elm_naviframe_add() Failed");
223 elm_object_part_content_set(ad->base, "elm.swallow.content", ad->naviframe);
225 const char *path = bindtextdomain(CALENDAR, LOCALEDIR);
226 c_warn_if(!path, "bindtextdomain(%s, %s) is failed.", CALENDAR, LOCALEDIR);
228 cal_util_connect_pattern_generator();
230 evas_object_show(win);
232 UG_INIT_EFL(ad->win, UG_OPT_INDICATOR_PORTRAIT_ONLY);
237 static void viewer_terminate(void *data)
239 struct appdata *ad = data;
241 cal_util_disconnect_pattern_generator();
246 evas_object_del(ad->win);
248 calendar_error_e error = CALENDAR_ERROR_NONE;
250 error = calendar_disconnect();
251 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_disconnect() is failed(%x)", error);
256 static void viewer_pause(void *data)
263 static void viewer_resume(void *data)
270 static void viewer_service(service_h service, void *data)
272 c_retm_if(!service, "service is null.");
273 c_retm_if(!data, "data is null.");
277 char *operation = NULL;
278 char *val_cal_id = NULL;
279 char *val_ical = NULL;
280 struct appdata *ad = data;
282 if (NULL == ad->win) {
288 r = service_get_extra_data(service, SERVICE_CALENDAR_VIEWER_CAL_ID_NAME, &val_cal_id);
289 c_warn_if(SERVICE_ERROR_NONE != r, "service_get_extra_data is failed(%d).", r);
291 if (val_cal_id && *val_cal_id) {
292 cal_id = atoi(val_cal_id);
294 ERR("bundle value(cal_id) is wrong(%d)", cal_id);
299 calendar_record_h record = _calendar_get_record_with_index(cal_id);
301 cal_detail_create_view(ad, record, NULL, NULL);
307 r = service_get_operation(service, &operation);
308 c_retm_if(SERVICE_ERROR_NONE != r, "service_get_operation is failed.");
310 r = service_get_uri(service, &val_ical);
311 c_retm_if(SERVICE_ERROR_NONE != r, "service_get_uri is failed.");
313 /*MIME CONTENT FOR VCS*/
315 char *raw_data = NULL;
319 FILE * file = fopen(val_ical, "r");
322 ERR("Failed to open file!");
326 if(stat(val_ical, &st) != 0) {
328 ERR("stat() is failed!");
334 CAL_CALLOC(raw_data, (size+1), char);
335 CAL_ASSERT(raw_data);
336 memset(raw_data,0,(size+1));
338 r = fread(raw_data, 1, size, file);
341 ERR("Failed to read file!");
347 ad->is_aul = EINA_TRUE;
348 ad->request_view = CV_DETAIL;
350 calendar_error_e error = CALENDAR_ERROR_NONE;
352 calendar_list_h list = NULL;
354 error = calendar_vcalendar_parse_to_calendar(raw_data, &list);
355 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_vcalendar_parse_to_calendar() is failed(%x)", error);
357 __cal_viewer_create_view(ad, ad->naviframe, list);
364 ERR("bundle value is NULL");
370 elm_win_activate(ad->win);
374 static void __cal_viewer_genlist_select_callback(void *data, Evas_Object *obj, void *event_info)
376 c_retm_if(!data, "data is null");
378 vcs_item_data *item = data;
379 c_retm_if(!item->record, "__cal_viewer_genlist_sel param error");
381 cal_viewer_data *p = evas_object_data_get(obj, "priv");
382 c_retm_if(!p || !p->ad, "p is null");
384 elm_genlist_item_selected_set((Elm_Object_Item *)event_info, EINA_FALSE);
386 cal_detail_create_view(p->ad, item->record, NULL, NULL);
389 static void __cal_viewer_save_to_calendar_button_callback(void *data, Evas_Object *obj, void *ei)
393 cal_viewer_data *p = data;
394 c_retm_if(!p, "p is null");
396 Elm_Object_Item *it = NULL;
397 Elm_Object_Item *temp = NULL;
398 vcs_item_data *item = NULL;
399 it = elm_genlist_first_item_get(p->genlist);
401 int saved_item_count = 0;
404 item = elm_object_item_data_get(it);
405 temp = elm_genlist_item_next_get(it);
411 if (item && item->record && EINA_TRUE == item->checked) {
412 calendar_error_e error = CALENDAR_ERROR_NONE;
414 error = calendar_db_insert_record(item->record, NULL);
415 if (error == CALENDAR_ERROR_NONE)
418 ERR("calendar_db_insert_record() is failed(%x)", error);
423 if (saved_item_count) {
425 int r = notification_status_message_post(S_("IDS_COM_POP_SAVED"));
426 c_warn_if(r != NOTIFICATION_ERROR_NONE, "notification_status_message_post() is failed(%d)", r);
430 static void __cal_viewer_back_button_callback(void *data, Evas_Object *obj, void *ei)
434 cal_viewer_data *p = data;
435 c_retm_if(!p || !p->genlist, "p is null");
437 elm_genlist_clear(p->genlist);
441 static void __cal_viewer_create_view(struct appdata *ad, Evas_Object *parent, calendar_list_h list)
445 c_retm_if(!ad || !parent || !list, "Input parameter is null");
447 cal_viewer_data *p = calloc(1, sizeof(cal_viewer_data));
448 c_retm_if(!p, "calloc is null");
452 Evas_Object *layout = cal_util_add_layout(parent, "selectioninfo");
454 ERR("layout is NULL!");
461 Evas_Object *genlist = elm_genlist_add(layout);
463 ERR("genlist is NULL!");
464 evas_object_del(p->layout);
469 elm_object_part_content_set(layout, "gen.swallow.contents", genlist);
471 Evas_Object *back_button;
472 Elm_Object_Item* navi_item;
477 calendar_error_e error = CALENDAR_ERROR_NONE;
479 error = calendar_list_get_count(list, &count);
480 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_list_get_count() is failed(%x)", error);
482 error = calendar_list_first(list);
483 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_list_first() is failed(%x)", error);
485 calendar_record_h record = NULL;
487 error = calendar_list_get_current_record_p(list, &record);
488 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_list_get_current_record_p() is failed(%x)", error);
492 if (!_calendar_is_event_or_task(record)) {
494 calendar_list_next(list);
498 error = calendar_list_get_current_record_p(list, &record);
499 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_list_get_current_record_p() is failed(%x)", error);
504 vcs_item_data *item_data = calloc(1, sizeof(vcs_item_data));
507 ERR("calloc is null!");
512 item_data->checked = EINA_FALSE;
514 error = calendar_record_clone(record, &item_data->record);
515 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_record_clone() is failed(%x)", error);
517 elm_genlist_item_append(genlist, &itc_3text_1icon_2, item_data, NULL, ELM_GENLIST_ITEM_NONE, __cal_viewer_genlist_select_callback, item_data);
519 calendar_list_next(list);
523 error = calendar_list_get_current_record_p(list, &record);
524 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_list_get_current_record_p() is failed(%x)", error);
527 error = calendar_list_destroy(list, true);
528 c_warn_if(error != CALENDAR_ERROR_NONE, "calendar_list_destroy() is failed(%x)", error);
530 evas_object_data_set(genlist, "priv", p);
531 p->genlist = genlist;
534 navi_item = elm_naviframe_item_push(ad->naviframe, _("VCS Viewer"), NULL, NULL, layout, NULL);
536 ERR("elm_naviframe_item_push is failed");
537 evas_object_del(genlist);
541 p->save_to_calendar = cal_util_add_toolbar_button(ad->naviframe, "toolbar_button1", S_("IDS_COM_OPT_SAVE"), __cal_viewer_save_to_calendar_button_callback, p);
542 elm_object_disabled_set(p->save_to_calendar, EINA_TRUE);
544 back_button = elm_object_item_part_content_get(navi_item, "prev_btn");
546 back_button = elm_button_add(ad->naviframe);
547 c_retm_if(!back_button, "elm_button_add is failed.");
549 elm_object_style_set(back_button, "naviframe/back_btn/default");
550 elm_object_item_part_content_set(navi_item, "prev_btn", back_button);
552 elm_object_style_set(back_button, "naviframe/back_btn/default");
553 evas_object_smart_callback_add(back_button, "clicked", __cal_viewer_back_button_callback, p);
556 API int main(int argc, char *argv[])
560 app_event_callback_s event_callback;
562 event_callback.create = viewer_create;
563 event_callback.terminate = viewer_terminate;
564 event_callback.pause = viewer_pause;
565 event_callback.resume = viewer_resume;
566 event_callback.service = viewer_service;
567 event_callback.low_memory = NULL;
568 event_callback.low_battery = NULL;
569 event_callback.device_orientation = NULL;
570 event_callback.language_changed = NULL;
571 event_callback.region_format_changed = NULL;
573 memset(&ad, 0x0, sizeof(struct appdata));
575 return app_efl_main(&argc, &argv, &event_callback, &ad);