0810 version
[apps/native/sample/adventure.git] / src / item.c
1 #include <Elementary.h>
2 #include <system_settings.h>
3 #include <time.h>
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <app.h>
7
8 #include "log.h"
9 #include "conf.h"
10 #include "util.h"
11 #include "city.h"
12 #include "item.h"
13 #include "main_view.h"
14 #include "scroller.h"
15 #include "popup.h"
16
17 #define _EDJ(o) elm_layout_edje_get(o)
18 const char *const DATA_KEY_CITY = "city";
19
20 const char *const ITEM_EDJE = "item.edj";
21
22 void _text_set_here_time(Evas_Object *item, const char *part)
23 {
24         char *timezone_str = NULL;
25         struct tm *local_time = NULL;
26
27         int ret = SYSTEM_SETTINGS_ERROR_NONE;
28         time_t t = 0;
29         char time_result[PATH_LEN] = {0, };
30
31         ret_if(!item);
32         ret_if(!part);
33
34         local_time = localtime(&t);
35         ret_if(!local_time);
36
37         ret = system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_TIMEZONE, &timezone_str);
38         if (ret != SYSTEM_SETTINGS_ERROR_NONE)
39                 _E("cannot get the timezone string");
40
41         /* Timezone
42            Asia/Seoul
43         */
44         if (local_time->tm_gmtoff >= 0)
45                 snprintf(time_result, sizeof(time_result), "%s, +%ld", timezone_str, local_time->tm_gmtoff / 3600);
46         else
47                 snprintf(time_result, sizeof(time_result), "%s, %ld", timezone_str, local_time->tm_gmtoff / 3600);
48
49         free(timezone_str);
50
51         elm_object_part_text_set(item, part, timezone_str);
52 }
53
54 static void _item_typing_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
55 {
56         item_destroy_typing(obj);
57 }
58
59 static void _item_typing_down_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
60 {
61         _D("An item is down");
62 }
63
64 static void _item_typing_up_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
65 {
66         Evas_Object *item = obj;
67         Evas_Object *selecting_item = NULL;
68         main_view_s *main_view_info = data;
69         int city = 0;
70         int count = 0;
71
72         ret_if(!item);
73         ret_if(!main_view_info);
74         ret_if(!main_view_info->city_list);
75
76         _D("An item is selected");
77
78         if (scroller_is_scrolling(main_view_info->searchlist))
79                 return;
80
81         count = scroller_count_item(main_view_info->city_list);
82         if (count >= MAXIMUM_SELECTED_CITY) {
83                 Evas_Object *popup = NULL;
84                 _D("Cities selected are limited.");
85                 popup = popup_create_text(main_view_info->main_view, "Maximum number of cities reached");
86                 elm_object_part_content_set(main_view_info->main_view, "popup", popup);
87                 return;
88         } else if (count > 0) {
89                 elm_object_signal_emit(main_view_info->main_view, "momentic,state,add_description,hide", "");
90         } else {
91                 /* We need to move this to the item_selecting */
92                 elm_object_signal_emit(main_view_info->main_view, "momentic,state,add_description,show", "");
93         }
94
95         if (count > 1) {
96                 elm_object_signal_emit(main_view_info->main_view, "momentic,state,next_btn,show", "");
97         }
98
99         city = (int) evas_object_data_get(item, DATA_KEY_CITY);
100         selecting_item = item_create_selecting(main_view_info->city_list, city, 0);
101         ret_if(!selecting_item);
102
103         scroller_append_item(main_view_info->city_list, selecting_item);
104 }
105
106 Evas_Object *item_create_typing(Evas_Object *parent, int city, main_view_s *main_view_info)
107 {
108         Evas_Object *item = NULL;
109         city_s *city_info = NULL;
110
111         char *path = NULL;
112         char full_path[PATH_LEN] = {0, };
113         char city_str[PATH_LEN] = {0, };
114
115         retv_if(!parent, NULL);
116
117         path = app_get_resource_path();
118         retv_if(!path, NULL);
119
120         snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM_EDJE);
121         free(path);
122
123         item = elm_layout_add(parent);
124         retv_if(!item, NULL);
125
126         elm_layout_file_set(item, full_path, "item_typing");
127
128         evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
129         evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
130         evas_object_data_set(item, DATA_KEY_CITY, (void *) city);
131         evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_typing_del_cb, NULL);
132         elm_object_signal_callback_add(item, "down", "item", _item_typing_down_cb, NULL);
133         elm_object_signal_callback_add(item, "up", "item", _item_typing_up_cb, main_view_info);
134
135         evas_object_show(item);
136
137         city_info = city_get();
138         if (!city_info) {
139                 _E("Critical, no city information");
140                 evas_object_del(item);
141                 return NULL;
142         }
143         
144         snprintf(city_str, sizeof(city_str), "%s, %s", city_info[city].name, city_info[city].nation);
145         elm_object_part_text_set(item, "city", city_str);
146
147         return item;
148 }
149
150 void item_destroy_typing(Evas_Object *item)
151 {
152         ret_if(!item);
153
154         evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_typing_del_cb);
155         elm_object_signal_callback_del(item, "down", "item", _item_typing_down_cb);
156         elm_object_signal_callback_del(item, "up", "item", _item_typing_up_cb);
157
158         evas_object_data_del(item, DATA_KEY_CITY);
159         evas_object_del(item);
160 }
161
162 static void _item_selecting_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
163 {
164         item_destroy_selecting(obj);
165 }
166
167 static void _item_selecting_delete_down_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
168 {
169         _D("Delete button is down");
170 }
171
172 static void _item_selecting_delete_up_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
173 {
174         Evas_Object *item= obj;
175         ret_if(!item);
176
177         _D("Delete button is up");
178
179         item_destroy_selecting(item);
180 }
181
182 Evas_Object *item_create_selecting(Evas_Object *parent, int city, int color)
183 {
184         Evas_Object *item = NULL;
185         city_s *city_info = NULL;
186         selecting_info_s *selecting_info = NULL;
187
188         char *path = NULL;
189         char full_path[PATH_LEN] = {0, };
190         char city_str[PATH_LEN] = {0, };
191         char color_str[16] = {0, };
192
193         retv_if(!parent, NULL);
194
195         path = app_get_resource_path();
196         retv_if(!path, NULL);
197
198         snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM_EDJE);
199         free(path);
200
201         selecting_info = calloc(1, sizeof(selecting_info_s));
202         retv_if(!selecting_info, NULL);
203         selecting_info->city = city;
204         selecting_info->color = color;
205
206         item = elm_layout_add(parent);
207         retv_if(!item, NULL);
208
209         elm_layout_file_set(item, full_path, "item_selecting");
210
211         evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
212         evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
213         evas_object_data_set(item, DATA_KEY_SELECTING, selecting_info);
214         evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_selecting_del_cb, NULL);
215         elm_object_signal_callback_add(item, "delete,down", "item", _item_selecting_delete_down_cb, NULL);
216         elm_object_signal_callback_add(item, "delete,up", "item", _item_selecting_delete_up_cb, NULL);
217         evas_object_show(item);
218
219         city_info = city_get();
220         goto_if(!city_info, error);
221         
222         snprintf(city_str, sizeof(city_str), "%s, %s", city_info[city].name, city_info[city].nation);
223         elm_object_part_text_set(item, "city", city_str);
224
225         if (color) {
226                 snprintf(color_str, sizeof(color_str), "%d", color);
227                 elm_object_signal_emit(item, color_str, "mark");
228         }
229
230         return item;
231
232 error:
233         if (item)
234                 evas_object_del(item);
235
236         if (selecting_info)
237                 free(selecting_info);
238
239         return NULL;
240 }
241
242 void item_destroy_selecting(Evas_Object *item)
243 {
244         selecting_info_s *selecting_info = NULL;
245
246         ret_if(!item);
247
248         selecting_info = evas_object_data_del(item, DATA_KEY_SELECTING);
249         free(selecting_info);
250
251         evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_selecting_del_cb);
252         elm_object_signal_callback_del(item, "delete,down", "item", _item_selecting_delete_down_cb);
253         elm_object_signal_callback_del(item, "delete,up", "item", _item_selecting_delete_up_cb);
254
255         evas_object_del(item);
256 }
257
258 void _text_set_local_time(Evas_Object *item, const char *part, int city, struct tm *global_time)
259 {
260         city_s *city_info = NULL;
261         int hour = global_time->tm_hour;
262         int minute = global_time->tm_min;
263
264         char time_result[PATH_LEN] = {0, };
265
266         ret_if(!item);
267         ret_if(!part);
268
269         city_info = city_get();
270         ret_if(!city_info);
271
272         if (((double) ((int) city_info[city].timezone)) < city_info[city].timezone) {
273                 minute += 30;
274                 if (minute > 60) {
275                         hour++;
276                         minute -= 60;
277                 }
278         }
279
280         snprintf(time_result, sizeof(time_result), "%d:%d", hour, minute);
281         elm_object_part_text_set(item, part, time_result);
282 }
283
284 static void _resize_graph_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
285 {
286         result_info_s *result_info = NULL;
287         int x, y, w, h;
288         int start_x = 0;
289
290         result_info = evas_object_data_get(obj, DATA_KEY_RESULT);
291         ret_if(!result_info);
292
293         edje_object_part_geometry_get(_EDJ(obj), "graph_base", &x, &y, &w, &h);
294
295         if (result_info->start > result_info->end) {
296                 evas_object_move(result_info->rect2, x, y);
297                 evas_object_resize(result_info->rect2, w / 10.0, h);
298                 evas_object_color_set(result_info->rect2, 0, 0, 0, 255);
299                 evas_object_show(result_info->rect2);
300         } else {
301                 evas_object_hide(result_info->rect2);
302         }
303
304         start_x = (result_info->start / 24.0f) * w + x;
305
306         evas_object_move(result_info->rect1, start_x, y);
307         evas_object_resize(result_info->rect1, x + w - start_x, h);
308         evas_object_color_set(result_info->rect1, 0, 0, 0, 255);
309         evas_object_show(result_info->rect1);
310 }
311
312 static void _item_result_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
313 {
314         item_destroy_result(obj);
315 }
316
317 Evas_Object *item_create_result(Evas_Object *parent, int city, int color, int start, int end, struct tm *global_time)
318 {
319         Evas_Object *item = NULL;
320         city_s *city_info = NULL;
321         result_info_s *result_info = NULL;
322         Evas *e = NULL;
323
324         char *path = NULL;
325         char full_path[PATH_LEN] = {0, };
326         char city_str[PATH_LEN] = {0, };
327         char color_str[16] = {0, };
328
329         retv_if(!parent, NULL);
330
331         path = app_get_resource_path();
332         retv_if(!path, NULL);
333
334         snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM_EDJE);
335         free(path);
336
337         result_info = calloc(1, sizeof(result_info_s));
338         retv_if(!result_info, NULL);
339
340         item = elm_layout_add(parent);
341         goto_if(!item, error);
342
343         elm_layout_file_set(item, full_path, "item_result");
344
345         evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
346         evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
347         evas_object_data_set(item, DATA_KEY_RESULT, result_info);
348         evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_result_del_cb, NULL);
349         evas_object_event_callback_add(item, EVAS_CALLBACK_RESIZE, _resize_graph_cb, result_info);
350         evas_object_event_callback_add(item, EVAS_CALLBACK_MOVE, _resize_graph_cb, result_info); 
351         evas_object_show(item);
352
353         city_info = city_get();
354         goto_if(!city_info, error);
355         
356         snprintf(city_str, sizeof(city_str), "%s, %s", city_info[city].name, city_info[city].nation);
357         elm_object_part_text_set(item, "city", city_str);
358
359         snprintf(color_str, sizeof(color_str), "%d", color);
360         elm_object_signal_emit(item, color_str, "mark");
361
362         _text_set_local_time(item, "time", city, global_time);
363
364         e = evas_object_evas_get(item);
365         goto_if(!e, error);
366
367         result_info->rect1 = evas_object_rectangle_add(e);
368         goto_if(!result_info->rect1, error);
369         
370         result_info->rect2 = evas_object_rectangle_add(e);
371         goto_if(!result_info->rect2, error);
372
373         result_info->city = city;
374         result_info->start = start;
375         result_info->end = end;
376
377         return item;
378
379 error:
380         if (result_info) {
381                 if (result_info->rect1)
382                         evas_object_del(result_info->rect1);
383                 if (result_info->rect2)
384                         evas_object_del(result_info->rect2);
385                 free(result_info);
386         }
387
388         if (item)
389                 evas_object_del(item);
390
391         free(result_info);
392         return NULL;
393 }
394
395 void item_destroy_result(Evas_Object *item)
396 {
397         result_info_s *result_info = NULL;
398
399         ret_if(!item);
400
401         evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_result_del_cb);
402
403         result_info = evas_object_data_del(item, DATA_KEY_RESULT);
404         if (result_info) {
405                 if (result_info->rect1)
406                         evas_object_del(result_info->rect1);
407                 if (result_info->rect2)
408                         evas_object_del(result_info->rect2);
409                 free(result_info);
410         }
411
412         evas_object_del(item);
413 }
414
415 static void _item_group_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
416 {
417         item_destroy_group(obj);
418 }
419
420 static void _item_group_down_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
421 {
422         _D("An item is down");
423 }
424
425 static void _item_group_up_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
426 {
427         Evas_Object *item = obj;
428         Evas_Object *selecting_item = NULL;
429         main_view_s *main_view_info = data;
430         int city = 0;
431         int count = 0;
432
433         ret_if(!item);
434         ret_if(!main_view_info);
435         ret_if(!main_view_info->city_list);
436
437         _D("An item is selected");
438
439         count = scroller_count_item(main_view_info->city_list);
440         if (count >= MAXIMUM_SELECTED_CITY) {
441                 Evas_Object *popup = NULL;
442                 _D("Cities selected are limited.");
443                 popup = popup_create_text(main_view_info->main_view, "Maximum number of cities reached");
444                 elm_object_part_content_set(main_view_info->main_view, "popup", popup);
445                 return;
446         }
447
448         city = (int) evas_object_data_get(item, DATA_KEY_CITY);
449         selecting_item = item_create_selecting(main_view_info->city_list, city, 0);
450         ret_if(!selecting_item);
451
452         scroller_append_item(main_view_info->city_list, selecting_item);
453 }
454
455 Evas_Object *item_create_group(Evas_Object *parent, const char *title, main_view_s *main_view_info)
456 {
457         Evas_Object *item = NULL;
458
459         char *path = NULL;
460         char full_path[PATH_LEN] = {0, };
461
462         retv_if(!parent, NULL);
463
464         path = app_get_resource_path();
465         retv_if(!path, NULL);
466
467         snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM_EDJE);
468         free(path);
469
470         item = elm_layout_add(parent);
471         retv_if(!item, NULL);
472
473         elm_layout_file_set(item, full_path, "item_group");
474
475         evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
476         evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
477         evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_group_del_cb, NULL);
478         elm_object_signal_callback_add(item, "down", "item", _item_group_down_cb, NULL);
479         elm_object_signal_callback_add(item, "up", "item", _item_group_up_cb, main_view_info);
480
481         evas_object_show(item);
482
483         elm_object_part_text_set(item, "city", title);
484
485         return item;
486 }
487
488 void item_destroy_group(Evas_Object *item)
489 {
490         ret_if(!item);
491
492         evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_group_del_cb);
493         elm_object_signal_callback_del(item, "down", "item", _item_group_down_cb);
494         elm_object_signal_callback_del(item, "up", "item", _item_group_up_cb);
495
496         evas_object_del(item);
497 }