2.0 alpha
[apps/core/preloaded/calendar.git] / src / view-main-day.c
1 /*
2   *
3   *  Copyright 2012  Samsung Electronics Co., Ltd
4   *
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
8   *
9   *       http://www.tizenopensource.org/license
10   *
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.
16   */
17
18
19 #include "view.h"
20 #include "detail.h"
21
22 #define CAL_HEIGHT_OF_EXPAND_IMG 50
23 typedef struct {
24         const char *name;
25         struct appdata *ad;
26         Evas_Object *parent;
27         Evas_Object *ly; // self
28
29         Evas_Object *time_block; // layout
30
31         Evas_Object *genlist;
32         Eina_Bool is_expanded;
33         Eina_List *event_list;
34         Evas_Object *expand;
35
36         Eina_List *task_list;
37 } cal_view_main_day_data;
38
39 static const char *_name = "main/day";
40
41 static char* __cal_day_get_genlist_item_label(void *data, Evas_Object *obj, const char *part);
42 static void __cal_day_expand_content_mouse_clicked(void *data, Evas_Object *eo, const char *e, const char *s);
43 void cal_day_update_expand(Evas_Object *ly, int x);
44
45 static Elm_Genlist_Item_Class itc = {
46         .item_style = "dialogue/1text",
47         .func.text_get = __cal_day_get_genlist_item_label,
48 };
49
50 static void __cal_day_delete_layout(void *data, Evas *e, Evas_Object *obj, void *ei)
51 {
52         CAL_FN_START;
53
54         CAL_ASSERT(data);
55
56         cal_view_main_day_data *p = data;
57
58         CALENDAR_SVC_FREE_CS_LIST(&p->event_list);
59         CALENDAR_SVC_FREE_CS_LIST(&p->task_list);
60
61         if (p->expand) {
62                 evas_object_clip_unset(p->expand);
63                 edje_object_signal_callback_del(CAL_UTIL_GET_EDJ_DATA(p->expand), "*", "edj", __cal_day_expand_content_mouse_clicked);
64                 evas_object_del(p->expand);
65         }
66
67         free(p);
68 }
69
70 static char* __cal_day_get_genlist_item_label(void *data, Evas_Object *obj, const char *part)
71 {
72         c_retv_if(!data, NULL);
73
74         cal_struct *cs = data;
75         const char *str;
76
77         if (!CAL_STRCMP(part, "elm.text")) {
78                 str = CALENDAR_SVC_STRUCT_GET_STR(cs, CAL_VALUE_TXT_SUMMARY);
79                 if (str)
80                         return strdup(str);
81
82                 return strdup(C_("IDS_CLD_BODY_NO_TITLE"));
83         }
84
85         return NULL;
86 }
87
88 static void __cal_day_genlist_item_select_callback(void *data, Evas_Object *obj, void *ei)
89 {
90         c_ret_if(!data);
91
92         cal_struct *cs = data;
93
94         Elm_Object_Item *it = elm_genlist_selected_item_get(obj);
95         if (it)
96                 elm_genlist_item_selected_set(it, EINA_FALSE);
97
98         cal_view_main_day_data *p = CAL_UTIL_GET_PRIV_DATA(obj);
99         c_ret_if(!p);
100
101         cal_main_set_cs(p->ad, cs);
102
103         cals_calendar_store_type cs_type =  CALENDAR_SVC_STRUCT_GET_INT(cs, CAL_VALUE_INT_TYPE);
104
105         if (CALS_CALENDAR_TYPE_TODO == cs_type) {
106                 cal_detail_create_view_todo(p->ad, p->parent);
107         } else {
108                 cal_detail_create_view(p->ad, p->parent);
109         }
110 }
111
112 static void __cal_day_get_events(cal_view_main_day_data *p)
113 {
114         struct tm tm_start = p->ad->base_tm;
115         tm_start.tm_hour = 0;
116         tm_start.tm_min = 0;
117         tm_start.tm_sec = 0;
118
119         struct tm tm_end = tm_start;
120         tm_end.tm_hour = 23;
121         tm_end.tm_min = 59;
122         tm_end.tm_sec = 59;
123
124         p->event_list = CALENDAR_SVC_GET_ALLDAY_EVENT_LIST(&tm_start, &tm_end);
125 }
126
127 static void __cal_day_get_tasks(cal_view_main_day_data *p)
128 {
129         c_ret_if(!p);
130
131         struct tm tm_start = p->ad->base_tm;
132         tm_start.tm_hour = 0;
133         tm_start.tm_min = 0;
134         tm_start.tm_sec = 0;
135
136         struct tm tm_end = tm_start;
137         tm_end.tm_hour = 23;
138         tm_end.tm_min = 59;
139         tm_end.tm_sec = 59;
140
141         p->task_list= CALENDAR_SVC_GET_TASK_LIST(&tm_start, &tm_end, CALS_TODO_PRIORITY_NONE, CALS_TODO_STATUS_NONE, CALS_TODO_LIST_ORDER_END_DATE);
142 }
143
144 void cal_day_update_genlist(Evas_Object *ly)
145 {
146         CAL_FN_START;
147
148         c_ret_if(!ly);
149
150         cal_view_main_day_data *p = CAL_UTIL_GET_PRIV_DATA (ly);
151         c_ret_if(!p);
152         c_ret_if(!p->genlist);
153
154         Eina_List *l;
155
156         elm_genlist_clear(p->genlist);
157         CALENDAR_SVC_FREE_CS_LIST(&p->event_list);
158         CALENDAR_SVC_FREE_CS_LIST(&p->task_list);
159
160         __cal_day_get_events(p);
161
162         cal_struct *cs = NULL;
163         if (p->event_list) {
164                 EINA_LIST_FOREACH(p->event_list, l, cs) {
165                         if (cs )
166                                 elm_genlist_item_append(p->genlist, &itc, cs, NULL,
167                                                         ELM_GENLIST_ITEM_NONE, __cal_day_genlist_item_select_callback, cs);
168                 }
169         }
170
171         __cal_day_get_tasks(p);
172
173         if (p->task_list) {
174                 EINA_LIST_FOREACH(p->task_list, l, cs) {
175                         if (cs )
176                                 elm_genlist_item_append(p->genlist, &itc, cs, NULL,
177                                                         ELM_GENLIST_ITEM_NONE, __cal_day_genlist_item_select_callback, cs);
178                 }
179         }
180
181         if (elm_genlist_items_count(p->genlist) == 0) {
182                 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(p->expand), "hide,expand");
183                 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(p->ly), "go,line0");
184         } else {
185                 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(p->expand), "show,unexpanded");
186                 if (!p->ad->is_landscape_mode) {
187                         cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(p->ly), "go,line1");
188                 } else {
189                         cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(p->ly), "go,ls_line1");
190                 }
191
192                 cal_day_update_expand(ly, 0);
193         }
194         p->is_expanded = EINA_FALSE;
195 }
196
197 int cal_day_get_all_events_count(Evas_Object *ly)
198 {
199         c_retvm_if(!ly, 0, "ly is null");
200
201         cal_view_main_day_data *p = evas_object_data_get(ly, "priv");
202         c_retvm_if(!p, 0, "p is null");
203
204         return elm_genlist_items_count(p->genlist);
205 }
206
207 void cal_day_update_expand(Evas_Object *ly, int x)
208 {
209         c_retm_if(!ly, "ly is null");
210
211         cal_view_main_day_data *p = evas_object_data_get(ly, "priv");
212         c_retm_if(!p, "p is null");
213
214         Evas_Coord_Rectangle r;
215         cal_util_get_geometry(&r, p->genlist);
216
217         evas_object_move(p->expand, x, r.y+r.h);
218         evas_object_resize(p->expand, r.w, CAL_HEIGHT_OF_EXPAND_IMG);
219         evas_object_raise(p->expand);
220 }
221
222 static void __cal_day_expand_content_mouse_clicked(void *data, Evas_Object *eo, const char *e, const char *s)
223 {
224         c_retm_if(!data || !e, "input param is null");
225
226         if (0 != strcmp(e, "all_day"))
227                 return;
228
229         cal_view_main_day_data *p = (cal_view_main_day_data *)data;
230
231         if (p->is_expanded) {
232                 if (!p->ad->is_landscape_mode) {
233                         cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(p->ly), "go,line1");
234                 } else {
235                         cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(p->ly), "go,ls_line1");
236                 }
237
238                 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(p->expand), "show,unexpanded");
239                 p->is_expanded = EINA_FALSE;
240         } else {
241                 if (!p->ad->is_landscape_mode) {
242                         cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(p->ly), "go,line3");
243                 } else {
244                         cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(p->ly), "go,ls_line3");
245                 }
246
247                 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(p->expand), "show,expanded");
248                 p->is_expanded = EINA_TRUE;
249         }
250
251 }
252
253 Evas_Object* cal_day_create_view(struct appdata *ad, Evas_Object *main)
254 {
255         CAL_FN_START;
256
257         cal_view_main_day_data *p;
258         Evas_Object *ly;
259         Evas_Object *genlist;
260         Evas_Object *time_block;
261
262         CAL_ASSERT(ad);
263
264         CAL_CALLOC(p, 1, cal_view_main_day_data);
265
266         p->name = _name;
267         p->ad = ad;
268         p->parent = main;
269
270         p->ly = ly = cal_util_add_layout(ad->nv, p->name);
271         if (NULL == ly) {
272                 free(p);
273                 p =NULL;
274                 return NULL;
275         }
276
277         evas_object_data_set(ly, "priv", p);
278
279         genlist = elm_genlist_add(ly);
280         CAL_ASSERT(genlist);
281
282         p->genlist = genlist;
283         elm_object_part_content_set(ly, "list/sw", genlist);
284         evas_object_data_set(genlist, "priv", p);
285
286         if (ad->is_landscape_mode)
287                 cal_util_emit_signal(CAL_UTIL_GET_EDJ_DATA(p->ly), "go,ls_line1");
288
289         time_block = cal_day_create_time_block(&ad->base_tm, ad, ly);
290         CAL_ASSERT (time_block);
291
292         p->time_block = time_block;
293         elm_object_part_content_set(ly, "cont/sw", time_block);
294
295         Evas_Object *scroller = evas_object_data_get(p->time_block, "scroller");
296         c_retvm_if(!scroller, NULL, "scroller is null");
297
298         p->expand= cal_util_add_layout(scroller, "main/day/expand");
299         c_retvm_if(!p->expand, NULL, "p->expand is null");
300
301         evas_object_clip_set(p->expand, (Evas_Object*)edje_object_part_object_get(CAL_UTIL_GET_EDJ_DATA(p->time_block), "clip"));
302         edje_object_signal_callback_add(CAL_UTIL_GET_EDJ_DATA(p->expand), "*", "edj", __cal_day_expand_content_mouse_clicked, p);
303
304         evas_object_event_callback_add(ly, EVAS_CALLBACK_DEL, __cal_day_delete_layout, p);
305
306         return ly;
307 }
308
309 void cal_day_update_view(Evas_Object *ly)
310 {
311         CAL_FN_START;
312
313         cal_view_main_day_data *p;
314
315         CAL_ASSERT(ly);
316
317         p = CAL_UTIL_GET_PRIV_DATA(ly);
318         if (!p || CAL_STRCMP(p->name, _name)) {
319                 ERR("Invalid object");
320                 return;
321         }
322
323         cal_day_update_genlist(ly);
324         cal_day_time_update_time_block(p->time_block, &p->ad->base_tm);
325
326         if (p->expand) {
327                 cal_day_update_expand(ly, 0);
328         }
329 }