*/
-
-
-
-
#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;
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();
struct stat st;
FILE * file = fopen(val_ical, "r");
- if(!file)
- {
+ if(!file) {
free(raw_data);
ERR("Failed to open file!");
return;
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);
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;