test
[apps/core/preloaded/calendar.git] / viewer / viewer.c
index 9596427..3b26f58 100755 (executable)
   */
 
 
-
-
-
-
 #include <stdio.h>
 #include <appcore-efl.h>
 #include <aul.h>
 
 #define SERVICE_CALENDAR_VIEWER_CAL_ID_NAME "cal_id"
 #define SERVICE_CALENDAR_VIEWER_MIME_NAME AUL_K_MIME_CONTENT
+#define VCALENDAR_LABLE_STRING_LENGTH 128
 
 #if !defined(CV_PACKAGE)
 #  define CV_PACKAGE "calendar-viewer"
 #endif
 
+typedef struct {
+       struct appdata *ad;
+       unsigned int check_num;
+       Evas_Object *genlist;
+       Evas_Object *notify;
+       Evas_Object *notify_layout;
+       Elm_Object_Item *save_to_calendar;
+}cal_viewer_data;
+
+typedef struct {
+       cal_struct *cs;
+       Eina_Bool checked;
+}vcs_item_data;
+
+static char *__cal_viewer_get_vcs_genlist_item_label(void *data, Evas_Object *obj, const char *part);
+static Evas_Object* __cal_viewer_get_vcs_genlist_icon(void *item_data, Evas_Object *obj, const char *part);
+static void __cal_viewer_create_view(struct appdata *ad, Evas_Object *parent, GList *glist);
+static void __cal_viewer_show_small_info(cal_viewer_data *p, int count);
+
+static Elm_Genlist_Item_Class itc_3text_1icon_2 = {
+       .item_style = "3text.1icon.2",
+       .func.text_get = __cal_viewer_get_vcs_genlist_item_label,
+       .func.content_get = __cal_viewer_get_vcs_genlist_icon,
+       .func.del = NULL,
+       .decorate_all_item_style = "edit_default",
+};
+
+static char* __cal_viewer_vcs_get_time_str(cal_struct *cs)
+{
+       c_retvm_if(!cs, NULL, "cs is null");
+
+       char buf[512];
+       char stime[512];
+
+       struct tm tm;
+       const char* time = CAL_UTIL_TIME_FORMAT_1;
+
+       cal_util_convert_lli_to_tm(NULL, CALENDAR_SVC_STRUCT_GET_LLI(cs, CALS_VALUE_LLI_DTSTART_UTIME), &tm);
+
+       cal_util_get_time_text(stime, sizeof(stime), NULL, time, &tm);
+       snprintf(buf, sizeof(buf), "%s", stime);
+
+       return strdup(buf);
+}
+
+static char *__cal_viewer_get_vcs_genlist_item_label(void *data, Evas_Object *obj, const char *part)
+{
+       c_retvm_if(!data, NULL, "data is null");
+       c_retvm_if(!part, NULL, "part is null");
+
+       vcs_item_data *item_data = (vcs_item_data*)data;
+       c_retvm_if(!item_data->cs, NULL, "part is null");
+
+       const char *name = NULL;
+
+       if (!CAL_STRCMP(part,"elm.text.1")) {
+               name = CALENDAR_SVC_STRUCT_GET_STR(item_data->cs, CAL_VALUE_TXT_SUMMARY);
+               if (name)
+                       return strdup(name);
+
+               return strdup(C_("IDS_CLD_BODY_NO_TITLE"));
+       } else if (!CAL_STRCMP(part,"elm.text.2")) {
+               name = CALENDAR_SVC_STRUCT_GET_STR(item_data->cs, CAL_VALUE_TXT_LOCATION);
+               if (CAL_STRLEN(name))
+                       return strdup(name);
+
+               return strdup(C_("IDS_CLD_BODY_NO_LOCATION_SELECTED"));
+       } else if (!CAL_STRCMP(part, "elm.text.3")) {
+               char *name = __cal_viewer_vcs_get_time_str(item_data->cs);
+               return name;
+       }
+
+       return NULL;
+}
+
+static void __cal_viewer_show_small_info(cal_viewer_data *p, int count)
+{
+       c_retm_if(!p, "p is null");
+       c_ret_if(count < 0);
+
+       struct appdata *ad = p->ad;
+       c_retm_if(!ad, "ad is null");
+
+       Evas_Object *nv = ad->nv;
+       c_retm_if(!nv, "nv is null");
+
+       Evas_Object *notify = NULL;
+       Evas_Object *notify_layout = NULL;
+
+       char lable_str[VCALENDAR_LABLE_STRING_LENGTH] = { '\0'};
+
+       if (!p->notify) {
+               notify = elm_notify_add(nv);
+               c_retm_if(!notify, "notify is null");
+
+               elm_notify_orient_set(notify, ELM_NOTIFY_ORIENT_BOTTOM);
+               p->notify = notify;
+
+               notify_layout = elm_layout_add(notify);
+               if (!notify_layout) {
+                       evas_object_del(p->notify);
+                       p->notify = NULL;
+                       return;
+               }
+
+               p->notify_layout = notify_layout;
+               elm_layout_theme_set(notify_layout, "standard", "selectioninfo", "vertical/bottom_64");
+               elm_object_content_set(notify, notify_layout);
+       }
+       snprintf(lable_str, sizeof(lable_str), "%s (%d)", S_("IDS_COM_POP_SELECTED"), count);
+       edje_object_part_text_set(CAL_UTIL_GET_EDJ_DATA(p->notify_layout), "elm.text", lable_str);
+
+       if (0 < count)
+               evas_object_show(p->notify);
+       else
+               evas_object_hide(p->notify);
+
+}
+
+static void __cal_viewer_vcs_check_changed_callback(void *data, Evas_Object *obj, void *event_info)
+{
+       c_retm_if(!data, "data is null");
+
+       vcs_item_data *item_data= data;
+
+       Evas_Object *genlist = elm_object_parent_widget_get(obj);
+       c_retm_if(!genlist, "genlist is null");
+
+       cal_viewer_data *p = evas_object_data_get(genlist, "priv");
+       c_retm_if(!p, "p is null");
+
+       Eina_Bool checked = elm_check_state_get(obj);
+       if (checked) {
+               p->check_num++;
+               item_data->checked = EINA_TRUE;
+       } else {
+               p->check_num--;
+               item_data->checked = EINA_FALSE;
+       }
+
+       if (0 < p->check_num)
+               elm_object_item_disabled_set(p->save_to_calendar, EINA_FALSE);
+       else
+               elm_object_item_disabled_set(p->save_to_calendar, EINA_TRUE);
+
+       __cal_viewer_show_small_info(p, p->check_num);
+}
+
+static Evas_Object* __cal_viewer_get_vcs_genlist_icon(void *item_data, Evas_Object *obj, const char *part)
+{
+       c_retvm_if(!part, NULL, "part is null");
+       c_retvm_if(!obj, NULL, "obj is null");
+       c_retvm_if(!item_data, NULL, "data is null");
+
+       Evas_Object *icon = NULL;
+       vcs_item_data *item = item_data;
+       c_retvm_if(!item->cs, NULL, "item->cs is null");
+
+       if (!CAL_STRCMP(part, "elm.icon") ) {
+               icon = elm_check_add(obj);
+               c_retvm_if(!icon, NULL, "elm_check_add returned null");
+
+               elm_check_state_pointer_set(icon, &item->checked);
+               evas_object_smart_callback_add(icon, "changed", __cal_viewer_vcs_check_changed_callback, item);
+               evas_object_propagate_events_set(icon, EINA_FALSE);
+               return icon;
+       }
+
+       return NULL;
+}
+
 static bool viewer_create(void *data)
 {
        struct appdata *ad = data;
@@ -67,7 +235,7 @@ static bool viewer_create(void *data)
        elm_object_part_content_set(ad->base, "elm.swallow.content", ad->nv);
 
        /* init internationalization */
-       r = appcore_set_i18n(CALENDAR_PACKAGE, LOCALEDIR);
+       r = appcore_set_i18n(CALENDAR, LOCALEDIR);
        c_retvm_if(r, false, "appcore_set_i18n() Failed");
 
        cal_util_connect_pattern_generator();
@@ -158,8 +326,7 @@ static void viewer_service(service_h service, void *data)
                        struct stat st;
 
                        FILE * file = fopen(val_ical, "r");
-                       if(!file)
-                       {
+                       if(!file) {
                                free(raw_data);
                                ERR("Failed to open file!");
                                return;
@@ -171,14 +338,26 @@ static void viewer_service(service_h service, void *data)
                        CAL_ASSERT(raw_data);
                        memset(raw_data,0,(size+1));
 
-                       fread(raw_data, 1, size, file);
+                       r = fread(raw_data, 1, size, file);
+                       if (r < 0) {
+                               free(raw_data);
+                               ERR("Failed to read file!");
+                               return;
+                       }
 
                        fclose( file );
 
                        ad->is_aul = EINA_TRUE;
                        ad->request_view = CV_DETAIL;
 
-                       cal_viewer_create_view(ad, ad->nv, raw_data);
+                       GList *schedules = NULL;
+                       int r = CALENDAR_SVC_READ_SCHEDULES(raw_data, &schedules);
+                       if (r != CAL_SUCCESS || NULL == schedules) {
+                               ERR("CALENDAR_SVC_READ_SCHEDULES fail. : %d", r);
+                               return;
+                       }
+
+                       __cal_viewer_create_view(ad, ad->nv, schedules);
 
                        free(raw_data);
                        free(val_ical);
@@ -195,6 +374,129 @@ static void viewer_service(service_h service, void *data)
        return;
 }
 
+static void __cal_viewer_genlist_select_callback(void *data, Evas_Object *obj, void *event_info)
+{
+       c_retm_if(!data, "data is null");
+
+       vcs_item_data *item = data;
+       c_retm_if(!item->cs, "__cal_viewer_genlist_sel param error");
+
+       cal_viewer_data *p = evas_object_data_get(obj, "priv");
+       c_retm_if(!p || !p->ad, "p is null");
+
+       if (p->notify)
+               evas_object_hide(p->notify);
+
+       elm_genlist_item_selected_set((Elm_Object_Item *)event_info, EINA_FALSE);
+       cal_detail_create_viewer(p->ad, p->ad->nv, item->cs);
+}
+
+static void __cal_viewer_save_to_calendar_button_callback(void *data, Evas_Object *obj, void *ei)
+{
+       CAL_FN_START;
+
+       cal_viewer_data *p = data;
+       c_retm_if(!p, "p is null");
+
+       Elm_Object_Item *it = NULL;
+       Elm_Object_Item *temp = NULL;
+       vcs_item_data *item = NULL;
+       int r;
+       it = elm_genlist_first_item_get(p->genlist);
+       while (it) {
+               item = elm_object_item_data_get(it);
+               temp = elm_genlist_item_next_get(it);
+               if (NULL == item) {
+                       it = temp;
+                       continue;
+               }
+
+               if (item && item->cs && EINA_TRUE == item->checked) {
+                       r = CALENDAR_SVC_INSERT(item->cs);
+                       if (CAL_SUCCESS != r) {
+                               ERR("Calendar service delete failed: %d", r);
+                       }
+               }
+               it = temp;
+       }
+}
+
+static void __cal_viewer_back_button_callback(void *data, Evas_Object *obj, void *ei)
+{
+       CAL_FN_START;
+
+       cal_viewer_data *p = data;
+       c_retm_if(!p || !p->genlist,  "p is null");
+
+       elm_genlist_clear(p->genlist);
+       elm_exit();
+}
+
+static void __cal_viewer_create_view(struct appdata *ad, Evas_Object *parent, GList *glist)
+{
+       CAL_FN_START;
+
+       c_retm_if(!ad || !parent || !glist, "Input parameter is null");
+
+       cal_viewer_data *p = calloc(1, sizeof(cal_viewer_data));
+       c_retm_if(!p, "calloc is null");
+
+       p->ad = ad;
+
+       Evas_Object *genlist = elm_genlist_add(parent);
+       c_retm_if(!genlist, "genlist is null");
+
+       Evas_Object *back_button;
+       Elm_Object_Item* navi_item;
+       cal_struct *cs = NULL;
+       while (glist) {
+               cs = glist->data;
+               if (cs == NULL) {
+                       ERR("Not cal struct\n");
+                       break;
+               }
+               vcs_item_data *item_data = calloc(1, sizeof(vcs_item_data));
+               c_retm_if(!item_data, "calloc is null");
+
+               item_data->checked = EINA_FALSE;
+               item_data->cs = cs;
+               elm_genlist_item_append(genlist, &itc_3text_1icon_2, item_data, NULL, ELM_GENLIST_ITEM_NONE, __cal_viewer_genlist_select_callback, item_data);
+               glist = g_list_next(glist);
+       }
+       evas_object_data_set(genlist, "priv", p);
+       p->genlist = genlist;
+
+       //TODO: i18n
+       navi_item = elm_naviframe_item_push(ad->nv, _("VCS Viewer"), NULL, NULL, genlist, NULL);
+       if (!navi_item) {
+               ERR("elm_naviframe_item_push is failed");
+               evas_object_del(genlist);
+               return;
+       }
+
+       Evas_Object *controlbar = cal_util_add_controlbar(ad->nv);
+       if (!controlbar) {
+               ERR("cal_util_add_controlbar(ad->nv) is failed");
+               elm_naviframe_item_pop(ad->nv);
+               return;
+       }
+
+       p->save_to_calendar = elm_toolbar_item_append(controlbar, NULL, S_("IDS_COM_OPT_SAVE"), __cal_viewer_save_to_calendar_button_callback, p);
+       elm_object_item_disabled_set(p->save_to_calendar, EINA_TRUE);
+       elm_object_item_part_content_set(navi_item, "controlbar", controlbar);
+
+       back_button = elm_object_item_part_content_get(navi_item, "prev_btn");
+       if (!back_button) {
+               back_button = elm_button_add(ad->nv);
+               c_retm_if(!back_button, "elm_button_add is failed.");
+
+               elm_object_style_set(back_button, "naviframe/back_btn/default");
+               elm_object_item_part_content_set(navi_item, "prev_btn", back_button);
+       }
+       elm_object_style_set(back_button, "naviframe/back_btn/default");
+       evas_object_smart_callback_add(back_button, "clicked",  __cal_viewer_back_button_callback, p);
+}
+
 API int main(int argc, char *argv[])
 {
        struct appdata ad;