Version : 0813
[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 #include <time.h>
8
9 #include "log.h"
10 #include "conf.h"
11 #include "util.h"
12 #include "city.h"
13 #include "item.h"
14 #include "main_view.h"
15 #include "scroller.h"
16 #include "popup.h"
17 #include "map.h"
18
19 #define _EDJ(o) elm_layout_edje_get(o)
20
21 const char *const DATA_KEY_CITY = "city";
22 const char *const DATA_KEY_MAIN_VIEW_INFO = "mvi";
23
24 const char *const ITEM_EDJE = "item.edj";
25 const char *const BEST_TIME_EDJE = "best_time.edj";
26 const char *const ITEM2_EDJE = "item2.edj";
27 static int color_index[MAXIMUM_SELECTED_CITY] = { 0, 0, 0, 0, 0 };
28
29 void item_reset_color_index(void)
30 {
31         register int i = 0;
32         for (; i < MAXIMUM_SELECTED_CITY; i++) {
33                 if (EINA_FALSE == remove_city_from_map(i))
34                         _E("cannot remove the city");
35
36                 color_index[i] = 0;
37         }
38 }
39
40 static double _get_local_timezone(void)
41 {
42         struct tm *local_time = NULL;
43         double timezone = 0.0f;
44         time_t t;
45
46         time(&t);
47
48         local_time = localtime(&t);
49         retv_if(!local_time, 0.0f);
50
51         timezone = (double) (local_time->tm_gmtoff / 3600l);
52 _D("HELLO, gmtoff:%d", local_time->tm_gmtoff / 3600l);
53
54         return timezone;
55 }
56
57 void _text_set_here_time(Evas_Object *item, const char *part)
58 {
59         char *timezone_str = NULL;
60         struct tm *local_time = NULL;
61
62         int ret = SYSTEM_SETTINGS_ERROR_NONE;
63         time_t t = 0;
64         char time_result[PATH_LEN] = {0, };
65
66         ret_if(!item);
67         ret_if(!part);
68
69         local_time = localtime(&t);
70         ret_if(!local_time);
71
72         ret = system_settings_get_value_string(SYSTEM_SETTINGS_KEY_LOCALE_TIMEZONE, &timezone_str);
73         if (ret != SYSTEM_SETTINGS_ERROR_NONE)
74                 _E("cannot get the timezone string");
75
76         /* Timezone
77            Asia/Seoul
78          */
79         if (local_time->tm_gmtoff >= 0l)
80                 snprintf(time_result, sizeof(time_result), "%s, +%ld", timezone_str, local_time->tm_gmtoff / 3600l);
81         else
82                 snprintf(time_result, sizeof(time_result), "%s, %ld", timezone_str, local_time->tm_gmtoff / 3600l);
83
84         free(timezone_str);
85
86         elm_object_part_text_set(item, part, timezone_str);
87 }
88
89 static void _item_typing_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
90 {
91         item_destroy_typing(obj);
92 }
93
94 static void _item_typing_down_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
95 {
96         _D("An item is down");
97 }
98
99 static void _item_typing_up_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
100 {
101         Evas_Object *item = obj;
102         Evas_Object *selecting_item = NULL;
103         main_view_s *main_view_info = data;
104         struct tm *local_time = NULL;
105         int city = 0;
106         int count = 0;
107         time_t t = 0;
108
109         ret_if(!item);
110         ret_if(!main_view_info);
111         ret_if(!main_view_info->city_list);
112
113         _D("An item is selected");
114
115         time(&t);
116         local_time = localtime(&t);
117
118         if (scroller_is_scrolling(main_view_info->searchlist))
119                 return;
120
121         count = scroller_count_item(main_view_info->city_list);
122         if (count + 1 > MAXIMUM_SELECTED_CITY) {
123                 Evas_Object *popup = NULL;
124                 _D("Cities selected are limited.");
125                 popup = popup_create_text(main_view_info->main_view, "Maximum number of cities reached");
126                 ret_if(!popup);
127                 return;
128         }
129
130         city = (int) evas_object_data_get(item, DATA_KEY_CITY);
131         selecting_item = item_create_selecting(main_view_info->city_list, city, local_time, main_view_info);
132         ret_if(!selecting_item);
133         scroller_append_item(main_view_info->city_list, selecting_item);
134         count++;
135
136         if (count > 1) {
137                 elm_object_signal_emit(main_view_info->main_view, "momentic,state,add_description,hide", "");
138                 elm_object_signal_emit(main_view_info->main_view, "momentic,state,next_btn,show", "");
139         } else {
140                 elm_object_signal_emit(main_view_info->main_view, "momentic,state,add_description,show", "");
141                 elm_object_signal_emit(main_view_info->main_view, "momentic,state,next_btn,hide", "");
142         }
143 }
144
145 Evas_Object *item_create_typing(Evas_Object *parent, int city, main_view_s *main_view_info)
146 {
147         Evas_Object *item = NULL;
148         city_s *city_info = NULL;
149
150         char *path = NULL;
151         char full_path[PATH_LEN] = {0, };
152         char city_str[PATH_LEN] = {0, };
153
154         retv_if(!parent, NULL);
155
156         path = app_get_resource_path();
157         retv_if(!path, NULL);
158
159         snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM_EDJE);
160         free(path);
161
162         item = elm_layout_add(parent);
163         retv_if(!item, NULL);
164
165         elm_layout_file_set(item, full_path, "item_typing");
166
167         evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
168         evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
169         evas_object_data_set(item, DATA_KEY_CITY, (void *) city);
170         evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_typing_del_cb, NULL);
171         elm_object_signal_callback_add(item, "down", "item", _item_typing_down_cb, NULL);
172         elm_object_signal_callback_add(item, "up", "item", _item_typing_up_cb, main_view_info);
173
174         evas_object_show(item);
175
176         if (city < 0) {
177                 elm_object_part_text_set(item, "city", "No results");
178                 elm_object_signal_emit(item, "disable", "item");
179                 return item;
180         }
181
182         city_info = city_get();
183         if (!city_info) {
184                 _E("Critical, no city information");
185                 evas_object_del(item);
186                 return NULL;
187         }
188
189         snprintf(city_str, sizeof(city_str), "%s, %s", city_info[city].name, city_info[city].nation);
190         elm_object_part_text_set(item, "city", city_str);
191
192         return item;
193 }
194
195 void item_destroy_typing(Evas_Object *item)
196 {
197         ret_if(!item);
198
199         evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_typing_del_cb);
200         elm_object_signal_callback_del(item, "down", "item", _item_typing_down_cb);
201         elm_object_signal_callback_del(item, "up", "item", _item_typing_up_cb);
202
203         evas_object_data_del(item, DATA_KEY_CITY);
204         evas_object_del(item);
205 }
206
207 static void _item_selecting_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
208 {
209         item_destroy_selecting(obj);
210 }
211
212 static void _delete_selecting_item_cb(void *data, Evas_Object *obj, void *event_info)
213 {
214         main_view_s *main_view_info = NULL;
215         Evas_Object *item = data;
216         int count = 0;
217
218         _D("clicked, delete the selected item");
219
220         ret_if(!item);
221
222         main_view_info = evas_object_data_get(item, DATA_KEY_MAIN_VIEW_INFO);
223         ret_if(!main_view_info);
224
225         item_destroy_selecting(item);
226
227         count = scroller_count_item(main_view_info->city_list);
228         if (count > 1) {
229                 elm_object_signal_emit(main_view_info->main_view, "momentic,state,add_description,hide", "");
230                 elm_object_signal_emit(main_view_info->main_view, "momentic,state,next_btn,show", "");
231         } else {
232                 elm_object_signal_emit(main_view_info->main_view, "momentic,state,add_description,show", "");
233                 elm_object_signal_emit(main_view_info->main_view, "momentic,state,next_btn,hide", "");
234         }
235 }
236
237 void _text_set_local_time(Evas_Object *item, const char *part, int city, struct tm *local_time)
238 {
239         city_s *city_info = NULL;
240         int hour = local_time->tm_hour;
241         int minute = local_time->tm_min;
242
243         char time_result[PATH_LEN] = {0, };
244
245         ret_if(!item);
246         ret_if(!part);
247
248         city_info = city_get();
249         ret_if(!city_info);
250
251         if (((double) ((int) city_info[city].timezone)) < city_info[city].timezone) {
252                 minute += 30;
253                 if (minute > 60) {
254                         hour++;
255                         minute -= 60;
256                 }
257         }
258
259         hour -= local_time->tm_gmtoff / 3600l;
260         hour += (int) city_info[city].timezone;
261         _D("HELLO : local_time:%d, diff:%d, timezone:%f, final_hour:%d", local_time->tm_hour, local_time->tm_gmtoff / 3600l, city_info[city].timezone, hour);
262         if (hour < 0)
263                 hour += 24;
264
265         hour %= 24;
266
267         snprintf(time_result, sizeof(time_result), "%2d:%02d", hour, minute);
268         elm_object_part_text_set(item, part, time_result);
269 }
270
271 Evas_Object *item_create_selecting(Evas_Object *parent, int city, struct tm *local_time, main_view_s *main_view_info)
272 {
273         Evas_Object *item = NULL;
274         Evas_Object *btn = NULL;
275         city_s *city_info = NULL;
276         selecting_info_s *selecting_info = NULL;
277
278         char *path = NULL;
279         char full_path[PATH_LEN] = {0, };
280         char city_str[PATH_LEN] = {0, };
281         char gmt_str[PATH_LEN] = {0, };
282         char color_str[16] = {0, };
283
284         retv_if(!parent, NULL);
285
286         city_info = city_get();
287         goto_if(!city_info, error);
288
289         int i = 0;
290         for (i = 0; i < MAXIMUM_SELECTED_CITY; i++) {
291                 if (color_index[i]) continue;
292
293                 _D("HELLO, i : %d, city : %d", i, city);
294                 if (EINA_FALSE == add_city_to_map(i, &city_info[city])) {
295                         _E("cannot add a city to the map");
296                         return NULL;
297                 }
298                 break;
299         }
300
301         path = app_get_resource_path();
302         retv_if(!path, NULL);
303
304         snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM2_EDJE);
305         free(path);
306
307         selecting_info = calloc(1, sizeof(selecting_info_s));
308         retv_if(!selecting_info, NULL);
309         selecting_info->city = city;
310         selecting_info->color = i;
311
312         item = elm_layout_add(parent);
313         retv_if(!item, NULL);
314
315         elm_layout_file_set(item, full_path, "item");
316
317         evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
318         evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
319         evas_object_data_set(item, DATA_KEY_MAIN_VIEW_INFO, main_view_info);
320         evas_object_data_set(item, DATA_KEY_SELECTING, selecting_info);
321         evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_selecting_del_cb, NULL);
322         evas_object_show(item);
323
324         btn = elm_button_add(item);
325         if (btn) {
326                 elm_object_style_set(btn, "transparent");
327                 elm_object_part_content_set(item, "delete_event", btn);
328                 evas_object_smart_callback_add(btn, "clicked", _delete_selecting_item_cb, item);
329                 evas_object_show(btn);
330         }
331
332         snprintf(city_str, sizeof(city_str), "%s, %s", city_info[city].name, city_info[city].nation);
333         elm_object_part_text_set(item, "city", city_str);
334
335         if (city_info[city].timezone > 0)
336                 snprintf(gmt_str, sizeof(gmt_str), "GMT +%.1f", city_info[city].timezone);
337         else 
338                 snprintf(gmt_str, sizeof(gmt_str), "GMT %.1f", city_info[city].timezone);
339
340         elm_object_part_text_set(item, "gmt", gmt_str);
341         _text_set_local_time(item, "time", city, local_time);
342
343         if (set_marker(item, i) == EINA_FALSE)
344                 _E("cannot set the marker");
345
346         color_index[i] = 1;
347
348         return item;
349
350 error:
351         if (item)
352                 evas_object_del(item);
353
354         if (selecting_info)
355                 free(selecting_info);
356
357         return NULL;
358 }
359
360 void item_destroy_selecting(Evas_Object *item)
361 {
362         selecting_info_s *selecting_info = NULL;
363
364         ret_if(!item);
365
366         evas_object_data_del(item, DATA_KEY_MAIN_VIEW_INFO);
367         selecting_info = evas_object_data_del(item, DATA_KEY_SELECTING);
368         if (selecting_info) {
369                 if (EINA_FALSE == remove_city_from_map(selecting_info->color))
370                         _E("cannot remove the city");
371
372                 color_index[selecting_info->color] = 0;
373                 free(selecting_info);
374         }
375
376         evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_selecting_del_cb);
377         evas_object_del(item);
378 }
379
380 static void _resize_graph_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
381 {
382         result_info_s *result_info = NULL;
383         int x, y, w, h;
384         int start_x = 0;
385
386         result_info = evas_object_data_get(obj, DATA_KEY_RESULT);
387         ret_if(!result_info);
388
389         edje_object_part_geometry_get(_EDJ(obj), "graph_base", &x, &y, &w, &h);
390
391         if (result_info->start > result_info->end) {
392                 evas_object_move(result_info->rect2, x, y);
393                 evas_object_resize(result_info->rect2, w / 10.0, h);
394                 evas_object_color_set(result_info->rect2, 0, 0, 0, 255);
395                 evas_object_show(result_info->rect2);
396         } else {
397                 evas_object_hide(result_info->rect2);
398         }
399
400         start_x = (result_info->start / 24.0f) * w + x;
401
402         evas_object_move(result_info->rect1, start_x, y);
403         evas_object_resize(result_info->rect1, x + w - start_x, h);
404         evas_object_color_set(result_info->rect1, 0, 0, 0, 255);
405         evas_object_show(result_info->rect1);
406 }
407
408 static void _item_group_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
409 {
410         item_destroy_group(obj);
411 }
412
413 static void _item_group_down_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
414 {
415         _D("An item is down");
416 }
417
418 static void _item_group_up_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
419 {
420         Evas_Object *item = obj;
421         Evas_Object *selecting_item = NULL;
422         main_view_s *main_view_info = data;
423         struct tm *local_time = NULL;
424         int city = 0;
425         int count = 0;
426         time_t t = 0;
427
428         ret_if(!item);
429         ret_if(!main_view_info);
430         ret_if(!main_view_info->city_list);
431
432         _D("An item is selected");
433
434         time(&t);
435         local_time = localtime(&t);
436
437         count = scroller_count_item(main_view_info->city_list);
438         if (count >= MAXIMUM_SELECTED_CITY) {
439                 Evas_Object *popup = NULL;
440                 _D("Cities selected are limited.");
441                 popup = popup_create_text(main_view_info->main_view, "Maximum number of cities reached");
442                 elm_object_part_content_set(main_view_info->main_view, "popup", popup);
443                 return;
444         }
445
446         city = (int) evas_object_data_get(item, DATA_KEY_CITY);
447         selecting_item = item_create_selecting(main_view_info->city_list, city, local_time, main_view_info);
448         ret_if(!selecting_item);
449
450         scroller_append_item(main_view_info->city_list, selecting_item);
451 }
452
453 Evas_Object *item_create_group(Evas_Object *parent, const char *title, main_view_s *main_view_info)
454 {
455         Evas_Object *item = NULL;
456
457         char *path = NULL;
458         char full_path[PATH_LEN] = {0, };
459
460         retv_if(!parent, NULL);
461
462         path = app_get_resource_path();
463         retv_if(!path, NULL);
464
465         snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM_EDJE);
466         free(path);
467
468         item = elm_layout_add(parent);
469         retv_if(!item, NULL);
470
471         elm_layout_file_set(item, full_path, "item_group");
472
473         evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
474         evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
475         evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_group_del_cb, NULL);
476         elm_object_signal_callback_add(item, "down", "item", _item_group_down_cb, NULL);
477         elm_object_signal_callback_add(item, "up", "item", _item_group_up_cb, main_view_info);
478
479         evas_object_show(item);
480
481         elm_object_part_text_set(item, "city", title);
482
483         return item;
484 }
485
486 void item_destroy_group(Evas_Object *item)
487 {
488         ret_if(!item);
489
490         evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_group_del_cb);
491         elm_object_signal_callback_del(item, "down", "item", _item_group_down_cb);
492         elm_object_signal_callback_del(item, "up", "item", _item_group_up_cb);
493
494         evas_object_del(item);
495 }
496
497 static void _item_padding_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
498 {
499         item_destroy_padding(obj);
500 }
501
502 Evas_Object *item_create_padding(Evas_Object *parent)
503 {
504         Evas_Object *item = NULL;
505         city_s *city_info = NULL;
506
507         char *path = NULL;
508         char full_path[PATH_LEN] = {0, };
509         char city_str[PATH_LEN] = {0, };
510
511         retv_if(!parent, NULL);
512
513         path = app_get_resource_path();
514         retv_if(!path, NULL);
515
516         snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ITEM_EDJE);
517         free(path);
518
519         item = elm_layout_add(parent);
520         retv_if(!item, NULL);
521
522         elm_layout_file_set(item, full_path, "item_padding");
523
524         evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
525         evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
526         evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_padding_del_cb, NULL);
527
528         evas_object_show(item);
529
530         return item;
531 }
532
533 void item_destroy_padding(Evas_Object *item)
534 {
535         ret_if(!item);
536         evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_padding_del_cb);
537         evas_object_del(item);
538 }
539
540 static void _item_best_time_del_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
541 {
542         item_destroy_best_time(obj);
543 }
544
545 Evas_Object *item_create_best_time(Evas_Object *parent)
546 {
547         Evas_Object *item = NULL;
548         city_s *city_info = NULL;
549
550         char *path = NULL;
551         char full_path[PATH_LEN] = {0, };
552         char city_str[PATH_LEN] = {0, };
553
554         retv_if(!parent, NULL);
555
556         path = app_get_resource_path();
557         retv_if(!path, NULL);
558
559         snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, BEST_TIME_EDJE);
560         free(path);
561
562         item = elm_layout_add(parent);
563         retv_if(!item, NULL);
564
565         elm_layout_file_set(item, full_path, "best_time");
566
567         evas_object_size_hint_weight_set(item, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
568         evas_object_size_hint_align_set(item, EVAS_HINT_FILL, EVAS_HINT_FILL);
569         evas_object_event_callback_add(item, EVAS_CALLBACK_DEL, _item_best_time_del_cb, NULL);
570
571         elm_object_part_text_set(item, "city", "Best time");
572
573         evas_object_show(item);
574
575         return item;
576 }
577
578 void item_destroy_best_time(Evas_Object *item)
579 {
580         ret_if(!item);
581         evas_object_event_callback_del(item, EVAS_CALLBACK_DEL, _item_best_time_del_cb);
582         evas_object_del(item);
583 }
584