Tizen 2.1 base
[apps/core/preloaded/calendar.git] / common / gi-timepicker.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://floralicense.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 "gi-timepicker.h"
20 #include "cld.h"
21
22 typedef struct
23 {
24         const char* title;
25         struct tm* value;
26         Eina_Bool allday;
27         Time_Changed_Callback time_changed_callback;
28         void* data;
29         Evas_Object *datetime;
30 } __cal_genlist_item_timepicker_info;
31
32 static void __cal_genlist_item_timepicker_time_changed_callback(void *data, Evas_Object* obj, void *ei)
33 {
34         CAL_FN_START;
35
36         c_retm_if(data == NULL, "data is null");
37         c_retm_if(obj == NULL, "datetime is null");
38
39         __cal_genlist_item_timepicker_info* info = (__cal_genlist_item_timepicker_info*)data;
40
41         struct tm value;
42         time_t t = time(NULL);
43         localtime_r(&t, &value); // to fill hidden field
44
45         elm_datetime_value_get(obj, &value);
46
47         *info->value = value;
48
49         if (info->time_changed_callback != NULL)
50                 info->time_changed_callback(info->data, &value);
51 }
52
53 static Evas_Object *__cal_genlist_item_timepicker_get_icon(void* data, Evas_Object* obj, const char* part)
54 {
55         CAL_FN_START;
56
57         c_retvm_if(data == NULL, NULL, "data is null");
58
59         if (!CAL_STRCMP(part, "elm.icon")) {
60
61                 __cal_genlist_item_timepicker_info* info = (__cal_genlist_item_timepicker_info*)data;
62
63                 Evas_Object* icon_obj = cal_util_add_datetime(obj, info->title, info->value);
64                 c_retvm_if(!icon_obj, NULL, "icon_obj is null");
65
66                 Evas_Object* dt = elm_object_part_content_get(icon_obj, "elm.icon");
67                 if (!dt) {
68                         ERR("dt is null");
69                         evas_object_del(icon_obj);
70                         return NULL;
71                 }
72
73                 info->datetime = dt;
74
75                 if (is_hour24)
76                         elm_datetime_format_set(dt, "%b %d , %Y %H : %M");
77                 else
78                         elm_datetime_format_set(dt, "%b %d , %Y %I : %M %p");
79
80                 if (!info->allday)
81                 {
82                         elm_datetime_field_visible_set(dt, ELM_DATETIME_HOUR, EINA_TRUE);
83                         elm_datetime_field_visible_set(dt, ELM_DATETIME_MINUTE, EINA_TRUE);
84                         if (is_hour24)
85                                 elm_datetime_field_visible_set(dt, ELM_DATETIME_AMPM, EINA_FALSE);
86                         else
87                                 elm_datetime_field_visible_set(dt, ELM_DATETIME_AMPM, EINA_TRUE);
88                 }
89                 else
90                 {
91                         elm_datetime_field_visible_set(dt, ELM_DATETIME_HOUR, EINA_FALSE);
92                         elm_datetime_field_visible_set(dt, ELM_DATETIME_MINUTE, EINA_FALSE);
93                         elm_datetime_field_visible_set(dt, ELM_DATETIME_AMPM, EINA_FALSE);
94                 }
95
96                 evas_object_smart_callback_add(dt, "changed",
97                                 __cal_genlist_item_timepicker_time_changed_callback, info);
98
99                 return icon_obj;
100         }
101
102         return NULL;
103 }
104
105 static void __cal_genlist_item_timepicker_delete(void *data, Evas_Object *obj)
106 {
107         CAL_FN_START;
108
109         __cal_genlist_item_timepicker_info* info = (__cal_genlist_item_timepicker_info*)data;
110         free(info);
111 }
112
113 static void __cal_add_genlist_item_timepicker_select_callback(void* data, Evas_Object *obj, void *event_info)
114 {
115         CAL_FN_START;
116
117         c_retm_if(obj == NULL, "obj is null");
118
119         Elm_Object_Item* item = elm_genlist_selected_item_get(obj);
120         c_retm_if(item == NULL, "elm_genlist_selected_item_get() returned null");
121
122         __cal_genlist_item_timepicker_info* info = (__cal_genlist_item_timepicker_info*)data;
123         c_retm_if(info == NULL, "info is null");
124
125         elm_object_focus_set(info->datetime, EINA_TRUE);
126
127         elm_genlist_item_selected_set(item, EINA_FALSE);
128 }
129
130 Elm_Object_Item* cal_genlist_item_timepicker_add(Evas_Object *genlist,
131                 const char* title, struct tm* value, Eina_Bool allday,
132                 Time_Changed_Callback time_changed_callback, void* data)
133 {
134         CAL_FN_START;
135
136         c_retvm_if(genlist == NULL, NULL, "genlist is null");
137         c_retvm_if(time == NULL, NULL, "time is null");
138
139         static Elm_Genlist_Item_Class* itc = NULL;
140         if (itc == NULL) {
141                 itc = malloc(sizeof(Elm_Genlist_Item_Class));
142                 itc->item_style = "dialogue/1icon";
143                 itc->func.text_get = NULL;
144                 itc->func.del = __cal_genlist_item_timepicker_delete;
145                 itc->func.content_get = __cal_genlist_item_timepicker_get_icon;
146         }
147
148         __cal_genlist_item_timepicker_info* info =
149                         (__cal_genlist_item_timepicker_info*)calloc(1, sizeof(__cal_genlist_item_timepicker_info));
150
151         info->title = title;
152         info->value = value;
153         info->allday = allday;
154         info->time_changed_callback = time_changed_callback;
155         info->data = data;
156
157         Elm_Object_Item* item =
158                         elm_genlist_item_append(genlist, itc, info, NULL, ELM_GENLIST_ITEM_NONE,
159                                         __cal_add_genlist_item_timepicker_select_callback, info);
160
161         elm_genlist_item_select_mode_set(item, ELM_OBJECT_SELECT_MODE_NONE);
162
163         return item;
164 }
165
166 void cal_genlist_item_timepicker_update_value(Elm_Object_Item* item)
167 {
168         CAL_FN_START;
169
170         c_retm_if(item == NULL, "item is null");
171
172         __cal_genlist_item_timepicker_info* info =
173                         (__cal_genlist_item_timepicker_info*)elm_object_item_data_get(item);
174
175         elm_datetime_value_set(info->datetime, info->value);
176
177         CAL_FN_END;
178 }
179
180 void cal_genlist_item_timepicker_update_mode(
181                 Elm_Object_Item* item, Eina_Bool allday)
182 {
183         CAL_FN_START;
184
185         c_retm_if(item == NULL, "item is null");
186         __cal_genlist_item_timepicker_info* info =
187                         (__cal_genlist_item_timepicker_info*)elm_object_item_data_get(item);
188
189         info->allday = allday;
190
191         if (!allday) {
192                 elm_datetime_field_visible_set(info->datetime, ELM_DATETIME_HOUR, EINA_TRUE);
193                 elm_datetime_field_visible_set(info->datetime, ELM_DATETIME_MINUTE, EINA_TRUE);
194                 if (!is_hour24)
195                         elm_datetime_field_visible_set(info->datetime, ELM_DATETIME_AMPM, EINA_TRUE);
196         } else {
197                 elm_datetime_field_visible_set(info->datetime, ELM_DATETIME_HOUR, EINA_FALSE);
198                 elm_datetime_field_visible_set(info->datetime, ELM_DATETIME_MINUTE, EINA_FALSE);
199                 elm_datetime_field_visible_set(info->datetime, ELM_DATETIME_AMPM, EINA_FALSE);
200         }
201 }
202
203 void cal_genlist_item_timepicker_disabled_set(Elm_Object_Item* item, Eina_Bool disabled)
204 {
205         c_ret_if(item == NULL);
206         __cal_genlist_item_timepicker_info* info =
207                         (__cal_genlist_item_timepicker_info*)elm_object_item_data_get(item);
208
209         elm_object_disabled_set(info->datetime, disabled);
210 }
211
212 void cal_genlist_item_radio_timepicker_get_value(Elm_Object_Item* timepicker, struct tm* datetime)
213 {
214         c_retm_if(timepicker == NULL, "timepicker is null");
215
216         __cal_genlist_item_timepicker_info* info =
217                         (__cal_genlist_item_timepicker_info*)elm_object_item_data_get(timepicker);
218
219         elm_datetime_value_get(info->datetime, datetime);
220 }
221
222 void cal_genlist_item_radio_timepicker_set_value(Elm_Object_Item* timepicker, const struct tm* datetime)
223 {
224         c_retm_if(timepicker == NULL, "timepicker is null");
225
226         __cal_genlist_item_timepicker_info* info =
227                         (__cal_genlist_item_timepicker_info*)elm_object_item_data_get(timepicker);
228
229         elm_datetime_value_set(info->datetime, datetime);
230 }