d4153e03b5fbbc4fa4039e8c27b6172ba50b952e
[apps/native/sample/adventure.git] / src / main_view.c
1 #include <Elementary.h>
2 #include <time.h>
3 #include <app_control.h>
4 #include <notification.h>
5
6 #include "main.h"
7 #include "main_view.h"
8 #include "log.h"
9 #include "scroller.h"
10 #include "city.h"
11 #include "util.h"
12 #include "item.h"
13 #include "conf.h"
14 #include "group_info.h"
15 #include "db.h"
16 #include "map.h"
17
18 const char *const MAIN_VIEW_EDJE = "momentic.edj";
19 const char *const ENTRY_EDJE = "entry.edj";
20 const char *const PREDICT_ITEM_EDJE = "predict_item.edj";
21 static int cur_page = 0;
22
23 static void _append_item_to_searchlist(Evas_Object *searchlist, Evas_Object *item)
24 {
25         Evas_Object *box = NULL;
26
27         ret_if(!searchlist);
28         ret_if(!item);
29
30         box = elm_object_content_get(searchlist);
31         ret_if(!box);
32
33         elm_box_pack_end(box, item);
34 }
35
36 static void _remove_item_in_searchlist(Evas_Object *searchlist, Evas_Object *item)
37 {
38         Evas_Object *box = NULL;
39
40         ret_if(!searchlist);
41         ret_if(!item);
42
43         box = elm_object_content_get(searchlist);
44         ret_if(!box);
45
46         elm_box_unpack(box, item);
47 }
48
49 static void _clean_searchlist(Evas_Object *searchlist)
50 {
51         Evas_Object *box = NULL;
52         Evas_Object *predict_item = NULL;
53         Eina_List *list = NULL;
54
55         ret_if(!searchlist);
56
57         box = elm_object_content_get(searchlist);
58         ret_if(!box);
59
60         list = elm_box_children_get(box);
61         ret_if(!list);
62
63         EINA_LIST_FREE(list, predict_item) {
64                 item_destroy_typing(predict_item);
65         }
66 }
67
68 static char *_strcasestr(char *str1, char *str2)
69 {
70         int len1 = 0, len2 = 0;
71
72         retv_if(!str1, NULL);
73         retv_if(!str2, NULL);
74
75         len1 = strlen(str1);
76         retv_if(!len1, NULL);
77
78         len2 = strlen(str2);
79         retv_if(!len2, NULL);
80
81         while (*str1) {
82                 if (!strncasecmp(str1, str2, len2))
83                         return str1;
84                 str1++;
85         }
86
87         return NULL;
88 }
89
90
91 static void _update_searchlist(Evas_Object *searchlist, const char *str, main_view_s *main_view_info)
92 {
93         Evas_Object *predict_item = NULL;
94         city_s *city_info = NULL;
95         register int i = 0;
96         int count = 0;
97
98         ret_if(!searchlist);
99
100         _clean_searchlist(searchlist);
101
102         city_info = city_get();
103         ret_if(!city_info);
104
105         /* This is the padding before the search list */
106         predict_item = item_create_padding(searchlist);
107         if (predict_item) {
108                 _append_item_to_searchlist(searchlist, predict_item);
109         }
110
111         for (; i < CITY_SYDNEY; i++) {
112                 int matched = 0;
113                 if (city_info[i].name && str && _strcasestr(city_info[i].name, str))
114                         matched = 1;
115                 else if (city_info[i].nation && str && _strcasestr(city_info[i].nation, str))
116                         matched = 1;
117
118                 if (matched) {
119                         predict_item = item_create_typing(searchlist, i, main_view_info);
120                         if (predict_item)
121                                 _append_item_to_searchlist(searchlist, predict_item);
122                 }
123         }
124
125         elm_object_signal_emit(main_view_info->main_view, "show", "entry_result");
126
127         count = scroller_count_item(searchlist);
128         if (count > 1)
129                 return;
130
131         predict_item = item_create_typing(searchlist, -1, main_view_info); 
132         if (predict_item) {
133                 _append_item_to_searchlist(searchlist, predict_item);
134         }
135 }
136
137 static void _change_entry_cb(void *data, Evas_Object *obj, void *event_info)
138 {
139         main_view_s *main_view_info = data;
140         Evas_Object *entry = obj;
141         const char *str = NULL;
142
143         ret_if(!main_view_info);
144
145         _D("Entry is changed");
146
147         str = elm_entry_entry_get(entry);
148         if (!str
149                 || (str && !strlen(str))) {
150                 _clean_searchlist(main_view_info->searchlist);
151                 elm_object_signal_emit(main_view_info->main_view, "momentic,state,searchlist,hide", "");
152                 return;
153         }
154
155         _update_searchlist(main_view_info->searchlist, str, main_view_info);
156         elm_object_signal_emit(main_view_info->main_view, "momentic,state,searchlist,show", "");
157 }
158
159 static void _focus_entry_cb(void *data, Evas_Object *obj, void *event_info)
160 {
161         main_view_s *main_view_info = data;
162         Evas_Object *entry = obj;
163         const char *str = NULL;
164
165         ret_if(!main_view_info);
166
167         _D("Entry is focused");
168
169         str = elm_entry_entry_get(entry);
170         if (!str)
171                 return;
172
173         _update_searchlist(main_view_info->searchlist, str, main_view_info);
174 }
175
176 static void _unfocus_entry_cb(void *data, Evas_Object *obj, void *event_info)
177 {
178         main_view_s *main_view_info = data;
179
180         ret_if(!main_view_info);
181         ret_if(!main_view_info->searchlist);
182
183         _D("Entry is unfocused");
184
185         elm_object_signal_emit(main_view_info->main_view, "hide", "entry_result");
186         //_clean_searchlist(main_view_info->searchlist);
187 }
188
189 static void _resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
190 {
191         int x, y, w, h;
192         evas_object_geometry_get(obj, &x, &y, &w, &h);
193         _D("%s (%d:%d:%d:%d)", data, x, y, w, h);
194 }
195
196 static void _delete_down_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
197 {
198         _D("Delete button is down");
199 }
200
201 static void _delete_up_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
202 {
203         Evas_Object *searchbar = obj;
204         Evas_Object *entry_obj = NULL;
205         main_view_s *main_view_info = data;
206
207         ret_if(!searchbar);
208         ret_if(!main_view_info);
209         ret_if(!main_view_info->searchlist);
210
211         _D("Delete button is up");
212
213         entry_obj = elm_object_part_content_get(searchbar, "entry");
214         if (entry_obj)
215                 elm_entry_entry_set(entry_obj, "");
216
217         _clean_searchlist(main_view_info->searchlist);
218 }
219
220 static Evas_Object *_create_searchbar(Evas_Object *parent, main_view_s *main_view_info)
221 {
222         Evas_Object *searchbar = NULL;
223         Evas_Object *entry_obj = NULL;
224
225         char *path = NULL;
226         char full_path[PATH_LEN] = {0, };
227
228         retv_if(!parent, NULL);
229
230         path = app_get_resource_path();
231         retv_if(!path, NULL);
232
233         snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ENTRY_EDJE);
234         free(path);
235
236         searchbar = elm_layout_add(parent);
237         retv_if(!searchbar, NULL);
238
239         elm_layout_file_set(searchbar, full_path, "main");
240         elm_object_signal_callback_add(searchbar, "delete,down", "entry", _delete_down_cb, main_view_info);
241         elm_object_signal_callback_add(searchbar, "delete,up", "entry", _delete_up_cb, main_view_info);
242
243         evas_object_size_hint_weight_set(searchbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
244         evas_object_size_hint_align_set(searchbar, EVAS_HINT_FILL, EVAS_HINT_FILL);
245         evas_object_show(searchbar);
246
247         entry_obj = elm_entry_add(parent);
248         retv_if(!entry_obj, NULL);
249
250         elm_entry_single_line_set(entry_obj, EINA_TRUE);
251         /* This makes the text upper */
252         elm_entry_scrollable_set(entry_obj, EINA_FALSE);
253         elm_entry_text_style_user_push(entry_obj, "DEFAULT='font_size=20'");
254         elm_entry_context_menu_disabled_set(entry_obj, EINA_TRUE);
255         elm_object_part_text_set(entry_obj, "elm.guide", "<font_size=20>Search</font_size>");
256
257         evas_object_size_hint_weight_set(entry_obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
258         evas_object_size_hint_align_set(entry_obj, 0.0, 0.5);
259
260         evas_object_smart_callback_add(entry_obj, "changed", _change_entry_cb, main_view_info);
261         evas_object_smart_callback_add(entry_obj, "focused", _focus_entry_cb, main_view_info);
262         evas_object_smart_callback_add(entry_obj, "unfocused", _unfocus_entry_cb, main_view_info);
263
264         evas_object_show(entry_obj);
265         elm_object_part_content_set(searchbar, "entry", entry_obj);
266
267         return searchbar;
268 }
269
270 static void _destroy_searchbar(Evas_Object *searchbar)
271 {
272         Evas_Object *entry_obj = NULL;
273
274         ret_if(!searchbar);
275
276         entry_obj = elm_object_part_content_unset(searchbar, "entry");
277         if (entry_obj)
278                 evas_object_del(entry_obj);
279
280         evas_object_del(searchbar);
281 }
282
283 static void _set_time_range(Evas_Object *item, int i, int base_city, int cur_city, double *matched_start, double *matched_end)
284 {
285         double start1 = 0.0f;
286         double end1 = 0.0f;
287         double start2 = 0.0f;
288         double end2 = 0.0f;
289
290         city_s *city_info = NULL;
291
292         double start = 0;
293         double end = 0;
294         double half = 0.0f;
295
296         int tmp = 0;
297
298         city_info = city_get();
299         ret_if(!city_info);
300
301         start = city_info[cur_city].timezone - city_info[base_city].timezone + (double) BEST_START_TIME;
302
303         if (start < 0.0f)
304                 start += 24.0f;
305
306         if (matched_start && matched_end) {
307                 /* This end is only for the matched end */
308                 end = start + BEST_DURING_TIME;
309                 if (*matched_start < (double) start)
310                         *matched_start = (double) start;
311
312                 if (*matched_end > (double) end)
313                         *matched_end = end;
314         }
315
316         tmp = start;
317         if (tmp != start) half = 0.5f;
318         else half = 0.0f;
319
320         tmp %= 24;
321
322         start = ((double) tmp) + half;
323         end = start + BEST_DURING_TIME;
324
325         if (end > 24.0f) {
326                 start1 = (double) start;
327                 end1 = 24.0f;
328
329                 start2 = 0.0f;
330
331                 tmp = end;
332                 if (tmp != end) half = 0.5f;
333                 else half = 0.0f;
334
335                 end2 = (double) (tmp % 24) + half;
336         } else {
337                 start1 = (double) start;
338                 end1 = (double) end;
339         }
340
341         _D("HELLO, %s %f:%f:%f:%f", city_info[cur_city].name, start1, end1, start2, end2);
342
343         if (set_time_range(item, i, start1, end1, start2, end2) == EINA_FALSE)
344                 _E("cannot set time range");
345 }
346
347 typedef struct part_info
348 {
349         double p1, p2;
350
351 } part_info_s;
352
353
354 void main_view_click_next_btn_cb(void *data, Evas_Object *obj, void *event_info)
355 {
356         main_view_s *main_view_info = data;
357         Evas_Object *box = NULL;
358         Evas_Object *item = NULL;
359         Eina_List *list = NULL;
360         struct tm *global_time = NULL;
361         struct tm *local_time = NULL;
362         time_t t;
363         city_s *city_info = NULL;
364         int cur_timezone = 0;
365         int base_city = 0;
366
367         double matched_start = 0.0f;
368         double matched_end = 100.0f; /* We have to initialize this variable as 100.0f */
369
370         ret_if(!main_view_info);
371         ret_if(!main_view_info->city_list);
372
373         _D("result button is clicked");
374
375         city_info = city_get();
376         ret_if(!city_info);
377
378         time(&t);
379         global_time = gmtime(&t);
380         local_time = localtime(&t);
381
382         cur_timezone = (int) local_time->tm_gmtoff / 3600l;
383
384         box = elm_object_content_get(main_view_info->city_list);
385         ret_if(!box);
386
387         list = elm_box_children_get(box);
388         ret_if(!list);
389
390         EINA_LIST_FREE(list, item) {
391                 selecting_info_s *selecting_info = evas_object_data_get(item, DATA_KEY_SELECTING);
392                 continue_if(!selecting_info);
393
394                 elm_object_signal_emit(item, "momentic,item,state,result", "");
395                 elm_object_part_text_set(item, "time", "");
396
397                 if (!base_city) {
398                         base_city = selecting_info->city;
399                         _set_time_range(item, selecting_info->color, base_city, base_city, &matched_start, &matched_end);
400                         continue;
401                 } else
402                         _set_time_range(item, selecting_info->color, base_city, selecting_info->city, &matched_start, &matched_end);
403         }
404
405         _D("HELLO, match!! %f, %f", matched_start, matched_end);
406         item = item_create_best_time(main_view_info->city_list, matched_start, matched_end);
407         if (item) {
408                 elm_object_signal_emit(item, "momentic,item,state,show", "");
409                 scroller_append_item(main_view_info->city_list, item);
410         } else
411                 _E("cannot append an item");
412
413         elm_object_signal_emit(main_view_info->main_view, "momentic,state,page2", "");
414         cur_page = 2;
415 }
416
417 void main_view_go_result(void *data)
418 {
419         main_view_s *main_view_info = data;
420         Evas_Object *box = NULL;
421         Evas_Object *item = NULL;
422         Eina_List *list = NULL;
423         struct tm *global_time = NULL;
424         struct tm *local_time = NULL;
425         time_t t;
426         city_s *city_info = NULL;
427         int cur_timezone = 0;
428         int base_city = 0;
429
430         double matched_start = 0.0f;
431         double matched_end = 100.0f; /* We have to initialize this variable as 100.0f */
432
433         ret_if(!main_view_info);
434         ret_if(!main_view_info->city_list);
435
436         city_info = city_get();
437         ret_if(!city_info);
438
439         time(&t);
440         global_time = gmtime(&t);
441         local_time = localtime(&t);
442
443         cur_timezone = (int) local_time->tm_gmtoff / 3600l;
444
445         box = elm_object_content_get(main_view_info->city_list);
446         ret_if(!box);
447
448         list = elm_box_children_get(box);
449         ret_if(!list);
450
451         EINA_LIST_FREE(list, item) {
452                 selecting_info_s *selecting_info = evas_object_data_get(item, DATA_KEY_SELECTING);
453                 continue_if(!selecting_info);
454
455                 elm_object_signal_emit(item, "momentic,item,state,result", "");
456                 elm_object_part_text_set(item, "time", "");
457
458                 if (!base_city) {
459                         base_city = selecting_info->city;
460                         _set_time_range(item, selecting_info->color, base_city, base_city, &matched_start, &matched_end);
461                         continue;
462                 } else
463                         _set_time_range(item, selecting_info->color, base_city, selecting_info->city, &matched_start, &matched_end);
464         }
465
466         _D("HELLO, match!! %f, %f", matched_start, matched_end);
467         item = item_create_best_time(main_view_info->city_list, matched_start, matched_end);
468         if (item) {
469                 elm_object_signal_emit(item, "momentic,item,state,show", "");
470                 scroller_append_item(main_view_info->city_list, item);
471         } else
472                 _E("cannot append an item");
473
474         cur_page = 4;
475 }
476
477 static Evas_Object *_create_next_btn(Evas_Object *parent, main_view_s *main_view_info)
478 {
479         Evas_Object *next_btn = NULL;
480         Evas_Object *icon = NULL;
481         char *path = NULL;
482         char full_path[PATH_LEN] = {0, };
483
484         retv_if(!parent, NULL);
485
486         path = app_get_resource_path();
487         retv_if(!path, NULL);
488
489         snprintf(full_path, sizeof(full_path), "%s/images/next_btn.png", path);
490         free(path);
491
492         next_btn = elm_button_add(parent);
493         retv_if(!next_btn, NULL);
494         elm_object_style_set(next_btn, "transparent");
495         evas_object_smart_callback_add(next_btn, "clicked", main_view_click_next_btn_cb, main_view_info);
496
497         icon = elm_image_add(next_btn);
498         if (icon) {
499                 elm_image_file_set(icon, full_path, NULL);
500                 elm_object_content_set(next_btn, icon);
501         }
502
503         button_effect(next_btn);
504
505         return next_btn;
506 }
507
508 static void _destroy_next_btn(Evas_Object *next_btn)
509 {
510         ret_if(!next_btn);
511         evas_object_del(next_btn);
512 }
513
514 static void _append_here_to_city_list(Evas_Object *city_list, main_view_s *main_view_info)
515 {
516         Evas_Object *item = NULL;
517         struct tm *local_time = NULL;
518         city_s *city_info = NULL;
519         time_t t;
520         int i = 0;
521
522         city_info = city_get();
523         ret_if(!city_info);
524
525         time(&t);
526         local_time = localtime(&t);
527
528         for (i = 0; i < CITY_SYDNEY; i++) {
529                 if (city_info[i].timezone == ((double) (local_time->tm_gmtoff / 3600l)))
530                         break;
531         }
532
533         item = item_create_selecting(city_list, i, local_time, main_view_info);
534         if (item)
535                 scroller_append_item(city_list, item);
536 }
537
538 static Eina_Bool
539 _append_here_city_anim_cb(void *data)
540 {
541         main_view_s *main_view_info = data;
542
543         _append_here_to_city_list(main_view_info->city_list, main_view_info);
544         return ECORE_CALLBACK_CANCEL;
545 }
546
547 static Evas_Object *_create_city_list(Evas_Object *parent, main_view_s *main_view_info)
548 {
549         Evas_Object *city_list = NULL;
550
551         retv_if(!parent, NULL);
552
553         city_list = scroller_create(parent);
554         retv_if(!city_list, NULL);
555
556         ecore_timer_add(1, _append_here_city_anim_cb, main_view_info);
557
558         return city_list;
559 }
560
561 static void _destroy_city_list(Evas_Object *city_list)
562 {
563         Evas_Object *box = NULL;
564         Evas_Object *item = NULL;
565         Eina_List *list = NULL;
566
567         ret_if(!city_list);
568
569         box = elm_object_content_get(city_list);
570         ret_if(!box);
571
572         list = elm_box_children_get(box);
573         ret_if(!list);
574
575         EINA_LIST_FREE(list, item) {
576                 evas_object_del(item);
577         }
578
579         evas_object_del(box);
580         evas_object_del(city_list);
581 }
582
583 void main_view_click_add_btn_cb(void *data, Evas_Object *obj, void *event_info)
584 {
585         main_view_s *main_view_info = data;
586
587         _D("Add button is clicked");
588
589         ret_if(!main_view_info);
590         ret_if(!main_view_info->main_view);
591
592         elm_object_signal_emit(main_view_info->main_view, "momentic,state,page1", "");
593 }
594
595 static void _page1_done_cb(void *data, Evas_Object *obj, const char *signal, const char *source)
596 {
597         elm_object_focus_set(data, EINA_TRUE);
598 }
599
600 static Evas_Object *_create_add_btn(Evas_Object *parent, main_view_s *main_view_info)
601 {
602         Evas_Object *add_btn = NULL;
603         Evas_Object *icon = NULL;
604         char *path = NULL;
605         char full_path[PATH_LEN] = {0, };
606
607         retv_if(!parent, NULL);
608
609         path = app_get_resource_path();
610         retv_if(!path, NULL);
611
612         snprintf(full_path, sizeof(full_path), "%s/images/add_btn.png", path);
613         free(path);
614
615         add_btn = elm_button_add(parent);
616         retv_if(!add_btn, NULL);
617         elm_object_style_set(add_btn, "transparent");
618         evas_object_smart_callback_add(add_btn, "clicked", main_view_click_add_btn_cb, main_view_info);
619
620         icon = elm_image_add(add_btn);
621         if (icon) {
622                 elm_image_file_set(icon, full_path, NULL);
623                 elm_object_content_set(add_btn, icon);
624         }
625
626         button_effect(add_btn);
627
628         return add_btn;
629 }
630
631 static void _destroy_add_btn(Evas_Object *add_btn)
632 {
633         ret_if(!add_btn);
634         evas_object_del(add_btn);
635 }
636
637 static void _click_save_button_cb(void *data, Evas_Object *obj, void *event_info)
638 {
639         main_view_s *main_view_info = data;
640         moment_info_s *moment_info = main_view_info->moment_info;
641         Evas_Object *box = NULL;
642         Evas_Object *item = NULL;
643         Eina_List *list = NULL;
644         group_info_s *group_info = NULL;
645         //int city[MAXIMUM_SELECTED_CITY] = {0, };
646         int city[5] = {0, }; /* FIXME : for compatibility */
647         int i = 0;
648         char group_title[PATH_LEN] = {0, };
649         city_s *city_info = NULL;
650         char message[PATH_LEN] = {0, };
651
652         city_info = city_get();
653         ret_if(!city_info);
654
655         _D("Save button is clicked");
656
657         ret_if(!main_view_info);
658
659         box = elm_object_content_get(main_view_info->city_list);
660         ret_if(!box);
661
662         list = elm_box_children_get(box);
663         ret_if(!list);
664
665         EINA_LIST_FREE(list, item) {
666                 selecting_info_s *selecting_info = NULL;
667
668                 selecting_info = evas_object_data_get(item, DATA_KEY_SELECTING);
669                 break_if(!selecting_info);
670
671                 if (i != 0) 
672                         strcat(group_title, ", ");
673
674                 city[i] = selecting_info->city;
675         _D("HELLO, city[%d] - %d", i, selecting_info->city);
676                 strcat(group_title, city_info[city[i]].name);
677                 i++;
678         }
679
680         int id = db_insert_group(moment_info->db
681                         , group_title 
682                         , city[0] 
683                         , city[1]
684                         , city[2]
685                         , city[3]
686                         , city[4]);
687         group_info = group_info_create(id
688                         , group_title 
689                         , city[0] 
690                         , city[1]
691                         , city[2]
692                         , city[3]
693                         , city[4]);
694         moment_info->group_list = eina_list_append(moment_info->group_list, group_info);
695
696         Evas_Object *item_group = item_create_group(main_view_info->group_scroller
697                                 , group_info
698                                 , main_view_info);
699         scroller_append_item(main_view_info->group_scroller, item_group);
700         elm_object_signal_emit(main_view_info->main_view, "momentic,state,drawer,noresult,hide", "");
701
702         snprintf(message, sizeof(message), "Create a group named <br>'%s'", group_title);
703         notification_status_message_post(message);
704 }
705
706 #if 0
707 static void _click_save_button_cb(void *data, Evas_Object *obj, void *event_info)
708 {
709         main_view_s *main_view_info = data;
710         elm_object_signal_emit(main_view_info->save_button, "momentic,state,activate", "");
711         elm_object_signal_emit(main_view_info->main_view, "momentic,state,save_group,activate", "");
712 }
713
714 static void _click_cancel_button_cb(void *data, Evas_Object *obj, void *event_info)
715 {
716         main_view_s *main_view_info = data;
717         elm_object_signal_emit(main_view_info->save_button, "momentic,state,deactivate", "");
718         elm_object_signal_emit(main_view_info->main_view, "momentic,state,save_group,deactivate", "");
719 }
720 #endif
721
722
723 static Evas_Object *_create_save_button(Evas_Object *parent, main_view_s *main_view_info)
724 {
725         Evas_Object *popup_button = NULL;
726         Evas_Object *save_button = NULL;
727
728         char *path = NULL;
729         char full_path[PATH_LEN] = {0, };
730
731         retv_if(!parent, NULL);
732
733         path = app_get_resource_path();
734         retv_if(!path, NULL);
735
736         snprintf(full_path, sizeof(full_path), "%s/edje/popup.edj", path);
737         free(path);
738
739         popup_button = elm_layout_add(parent);
740         retv_if(!popup_button, NULL);
741
742         elm_layout_file_set(popup_button, full_path, "save_as_group");
743         evas_object_size_hint_weight_set(popup_button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
744         evas_object_size_hint_align_set(popup_button, EVAS_HINT_FILL, EVAS_HINT_FILL);
745         evas_object_show(popup_button);
746
747         save_button = elm_button_add(parent);
748         retv_if(!save_button, NULL);
749         elm_object_style_set(save_button, "transparent");
750         elm_object_part_content_set(popup_button, "button", save_button);
751         evas_object_smart_callback_add(save_button, "clicked", _click_save_button_cb, main_view_info);
752
753 #if 0
754         Evas_Object *create_button = NULL;
755         Evas_Object *cancel_button = NULL;
756
757         create_button = elm_button_add(parent);
758         retv_if(!create_button, NULL);
759         //elm_object_style_set(create_button, "transparent");
760         elm_object_part_content_set(popup_button, "create_btn", create_button);
761         //evas_object_smart_callback_add(create_button, "clicked", _click_create_button_cb, main_view_info);
762
763         cancel_button = elm_button_add(parent);
764         retv_if(!cancel_button, NULL);
765         //elm_object_style_set(cancel_button, "transparent");
766         elm_object_part_content_set(popup_button, "cancel_btn", cancel_button);
767         evas_object_smart_callback_add(cancel_button, "clicked", _click_cancel_button_cb, main_view_info);
768 #endif
769
770         return popup_button;
771 }
772
773 static void _destroy_save_button(Evas_Object *save_button)
774 {
775         ret_if(!save_button);
776         evas_object_del(save_button);
777 }
778
779 static Evas_Object *_create_searchlist(Evas_Object *parent)
780 {
781         Evas_Object *searchlist = NULL;
782
783         retv_if(!parent, NULL);
784
785         searchlist = scroller_create(parent);
786         retv_if(!searchlist, NULL);
787
788         return searchlist;
789 }
790
791 static void _destroy_searchlist(Evas_Object *searchlist)
792 {
793         Evas_Object *box = NULL;
794         Evas_Object *item = NULL;
795         Eina_List *list = NULL;
796
797         ret_if(!searchlist);
798
799         box = elm_object_content_get(searchlist);
800         ret_if(!box);
801
802         list = elm_box_children_get(box);
803         ret_if(!list);
804
805         EINA_LIST_FREE(list, item) {
806                 evas_object_del(item);
807         }
808
809         evas_object_del(box);
810         evas_object_del(searchlist);
811 }
812
813 static Evas_Object *_create_result_list(Evas_Object *parent)
814 {
815         Evas_Object *result_list = NULL;
816
817         retv_if(!parent, NULL);
818
819         result_list = scroller_create(parent);
820         retv_if(!result_list, NULL);
821
822         return result_list;
823 }
824
825 static void _destroy_result_list(Evas_Object *result_list)
826 {
827         Evas_Object *box = NULL;
828         Evas_Object *item = NULL;
829         Eina_List *list = NULL;
830
831         ret_if(!result_list);
832
833         box = elm_object_content_get(result_list);
834         ret_if(!box);
835
836         list = elm_box_children_get(box);
837         ret_if(!list);
838
839         EINA_LIST_FREE(list, item) {
840                 evas_object_del(item);
841         }
842
843         evas_object_del(box);
844         evas_object_del(result_list);
845 }
846
847 static Evas_Object *_create_group_scroller(Evas_Object *parent, Eina_List *list, main_view_s *main_view_info)
848 {
849         Evas_Object *group_scroller = NULL;
850         group_info_s *group_info = NULL;
851         const Eina_List *l = NULL;
852
853         retv_if(!parent, NULL);
854
855         group_scroller = scroller_create(parent);
856         retv_if(!group_scroller, NULL);
857
858         EINA_LIST_FOREACH(list, l, group_info) {
859                 Evas_Object *item_group = item_create_group(group_scroller
860                                 , group_info
861                                 , main_view_info);
862                 scroller_append_item(group_scroller, item_group);
863         }
864
865         int count = scroller_count_item(group_scroller);
866         if (count)
867                 elm_object_signal_emit(main_view_info->main_view, "momentic,state,drawer,noresult,hide", "");
868         else
869                 elm_object_signal_emit(main_view_info->main_view, "momentic,state,drawer,noresult,show", "");
870
871         return group_scroller;
872 }
873
874 static void _destroy_group_scroller(Evas_Object *group_scroller)
875 {
876         Evas_Object *box = NULL;
877         Evas_Object *item = NULL;
878         Eina_List *list = NULL;
879
880         ret_if(!group_scroller);
881
882         box = elm_object_content_get(group_scroller);
883         ret_if(!box);
884
885         list = elm_box_children_get(box);
886         ret_if(!list);
887
888         EINA_LIST_FREE(list, item) {
889                 evas_object_del(item);
890         }
891
892         evas_object_del(box);
893         evas_object_del(group_scroller);
894 }
895
896 static void _main_view_back_cb(void *data, Evas_Object *obj, void *event_info)
897 {
898         main_view_s *main_view_info = data;
899         static time_t prev_t;
900         time_t cur_t;
901
902         time(&cur_t);
903
904         if (prev_t + 2 > cur_t) {
905                 _D("wait a sec to process the back key event");
906                 return;
907         }
908
909         prev_t = cur_t;
910         elm_object_signal_emit(obj, "momentic,state,page,back", "");
911         
912         switch (cur_page) {
913         Eina_List *list = NULL;
914         Evas_Object *item = NULL;
915         Evas_Object *tmp = NULL;
916         Evas_Object *box = NULL;
917
918         case 0:
919                 _D("Page 0 [Initial page] -> Out : elm_win_lower()");
920
921                 elm_win_lower(main_view_info->moment_info->win);
922                 break;
923         case 1:
924                 _D("Page 1 [Entry page] -> Page 0 [Initial page] : Initial city list");
925
926                 item_reset_color_index();
927                 scroller_clear_item(main_view_info->city_list);
928                 _append_here_to_city_list(main_view_info->city_list, main_view_info);
929                 elm_object_focus_set(main_view_info->searchbar, EINA_FALSE);
930                 cur_page = 0;
931                 break;
932         case 2:
933                 _D("Page 2 [Best time page] -> Page 1 [Entry page] : Remove the best item");
934
935                 box = elm_object_content_get(main_view_info->city_list);
936                 ret_if(!box);
937
938                 list = elm_box_children_get(box);
939                 ret_if(!list);
940
941                 EINA_LIST_FREE(list, item) {
942                         elm_object_signal_emit(item, "momentic,item,state,default", "");
943                         unset_time_range(item);
944                         tmp = item;
945                 }
946
947                 scroller_remove_item(main_view_info->city_list, tmp);
948                 item_destroy_best_time(tmp);
949                 cur_page = 1;
950                 break;
951         case 4:
952                 _D("Page 3 [Best time page] -> Page 0[Initial page]");
953
954                 scroller_clear_item(main_view_info->city_list);
955                 _append_here_to_city_list(main_view_info->city_list, main_view_info);
956                 elm_object_signal_emit(main_view_info->main_view, "load", "");
957                 elm_object_signal_emit(main_view_info->main_view, "momentic,state,add_description,show", "");
958                 cur_page = 0;
959                 break;
960         default:
961                 _E("cannot reach here");
962                 break;
963         }
964 }
965
966 Evas_Object *main_view_create(Evas_Object *parent, moment_info_s *moment_info)
967 {
968         main_view_s *main_view_info = NULL;
969         char *path = NULL;
970         char full_path[PATH_LEN] = {0, };
971
972         retv_if(!parent, NULL);
973
974         path = app_get_resource_path();
975         retv_if(!path, NULL);
976
977         snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, MAIN_VIEW_EDJE);
978         free(path);
979
980         _D("main_view is created with %s", full_path);
981
982         main_view_info = calloc(1, sizeof(main_view_s));
983         retv_if(!main_view_info, NULL);
984         main_view_info->moment_info = moment_info;
985
986         main_view_info->main_view = create_momentic_layout(parent, full_path);
987         if (!main_view_info->main_view) {
988                 free(main_view_info);
989                 return NULL;
990         }
991
992         eext_object_event_callback_add(main_view_info->main_view, EEXT_CALLBACK_BACK, _main_view_back_cb, main_view_info);
993
994         elm_layout_file_set(main_view_info->main_view, full_path, "main");
995         evas_object_size_hint_weight_set(main_view_info->main_view, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
996         evas_object_size_hint_align_set(main_view_info->main_view, EVAS_HINT_FILL, EVAS_HINT_FILL);
997         evas_object_show(main_view_info->main_view);
998         evas_object_data_set(main_view_info->main_view, DATA_KEY_INFO, main_view_info);
999         evas_object_event_callback_add(main_view_info->main_view, EVAS_CALLBACK_RESIZE, _resize_cb, "main_view");
1000
1001         elm_object_part_text_set(main_view_info->main_view, "title", "No cities");
1002         elm_object_part_text_set(main_view_info->main_view, "description", "After you add cities, they will be shown here.");
1003
1004         main_view_info->searchbar = _create_searchbar(main_view_info->main_view, main_view_info);
1005         if (main_view_info->searchbar)
1006                 elm_object_part_content_set(main_view_info->main_view, "searchbar", main_view_info->searchbar);
1007
1008         main_view_info->next_btn = _create_next_btn(main_view_info->main_view, main_view_info);
1009         if (main_view_info->next_btn)
1010                 elm_object_part_content_set(main_view_info->main_view, "next_btn", main_view_info->next_btn);
1011
1012         main_view_info->city_list = _create_city_list(main_view_info->main_view, main_view_info);
1013         if (main_view_info->city_list)
1014                 elm_object_part_content_set(main_view_info->main_view, "city_list", main_view_info->city_list);
1015
1016         main_view_info->add_btn = _create_add_btn(main_view_info->main_view, main_view_info);
1017         if (main_view_info->add_btn)
1018                 elm_object_part_content_set(main_view_info->main_view, "add_btn", main_view_info->add_btn);
1019
1020         main_view_info->searchlist = _create_searchlist(main_view_info->main_view);
1021         if (main_view_info->searchlist)
1022                 elm_object_part_content_set(main_view_info->main_view, "searchlist", main_view_info->searchlist);
1023
1024         db_list_group(moment_info->db, &moment_info->group_list);
1025
1026         main_view_info->group_scroller = _create_group_scroller(main_view_info->main_view, moment_info->group_list, main_view_info);
1027         if (main_view_info->group_scroller)
1028                 elm_object_part_content_set(main_view_info->main_view, "drawer_content", main_view_info->group_scroller);
1029
1030         main_view_info->save_button = _create_save_button(main_view_info->main_view, main_view_info);
1031         if (main_view_info->save_button)
1032                 elm_object_part_content_set(main_view_info->main_view, "save_group_btn", main_view_info->save_button);
1033
1034         elm_object_signal_callback_add(main_view_info->main_view, "momentic,page1,done", "", _page1_done_cb, main_view_info->searchbar);
1035
1036         return main_view_info->main_view;
1037 }
1038
1039 void main_view_destroy(Evas_Object *main_view)
1040 {
1041         Evas_Object *button = NULL;
1042         main_view_s *main_view_info = NULL;
1043
1044         ret_if(!main_view);
1045
1046         main_view_info = evas_object_data_del(main_view_info->main_view, DATA_KEY_INFO);
1047         ret_if(!main_view_info);
1048
1049         if (main_view_info->save_button)
1050                 _destroy_save_button(main_view_info->save_button);
1051
1052         if (main_view_info->group_scroller)
1053                 _destroy_group_scroller(main_view_info->group_scroller);
1054
1055         if (main_view_info->searchlist)
1056                 _destroy_searchlist(main_view_info->searchlist);
1057
1058         if (main_view_info->add_btn)
1059                 _destroy_add_btn(main_view_info->add_btn);
1060
1061         if (main_view_info->city_list)
1062                 _destroy_city_list(main_view_info->city_list);
1063
1064         if (main_view_info->next_btn)
1065                 _destroy_next_btn(button);
1066
1067         if (main_view_info->searchbar)
1068                 _destroy_searchbar(main_view_info->searchbar);
1069
1070         free(main_view_info);
1071
1072         evas_object_del(main_view);
1073 }
1074
1075 static void _get_best_time(double *timezone, int size, double *start, double *end)
1076 {
1077         register int i = 1;
1078
1079         ret_if(!timezone);
1080         ret_if(!start);
1081         ret_if(!end);
1082
1083         *start = timezone[0];
1084         *end = timezone[0] + BEST_DURING_TIME;
1085
1086         for (; i < size; i++) {
1087                 double tmp = timezone[i];
1088
1089                 if (tmp < *start) {
1090                         if (tmp + BEST_DURING_TIME <= *start) {
1091                                 _D("No matched time");
1092                                 *start = 0;
1093                                 *end = 0;
1094                                 return;
1095                         } else {
1096                                 *end = tmp + BEST_DURING_TIME;
1097                         }
1098                 } else if (tmp > *start) {
1099                         if (tmp >= *end) {
1100                                 _D("No matched time");
1101                                 *start = 0;
1102                                 *end = 0;
1103                                 return;
1104                         } else {
1105                                 *start = tmp;
1106                         }
1107                 } else
1108                         continue;
1109         }
1110 }
1111
1112 static void _reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
1113 {
1114         _D("Result callback is called");
1115 }
1116
1117 static void _launch_calendar_edit(int start, int end)
1118 {
1119         app_control_h app_control = NULL;
1120         time_t t;
1121         struct tm *local_time = NULL;
1122         int ret;
1123
1124         char start_str[PATH_LEN] = {0, };
1125         char end_str[PATH_LEN] = {0, };
1126
1127         ret = app_control_create(&app_control);
1128         ret_if(APP_CONTROL_ERROR_NONE != ret);
1129
1130         time(&t);
1131         local_time = localtime(&t);
1132
1133         snprintf(start_str, sizeof(start_str), "%4d-%2d-%2d %2d:%2d:%2d"
1134                         , local_time->tm_year + 1900
1135                         , local_time->tm_mon + 1
1136                         , local_time->tm_mday
1137                         , start
1138                         , 0
1139                         , 0);
1140
1141         snprintf(start_str, sizeof(start_str), "%4d-%2d-%2d %2d:%2d:%2d"
1142                         , local_time->tm_year + 1900
1143                         , local_time->tm_mon + 1
1144                         , local_time->tm_mday
1145                         , end
1146                         , 0
1147                         , 0);
1148
1149         app_control_set_app_id(app_control, "com.samsung.calendar-lite-edit");
1150         app_control_set_operation(app_control, "http://tizen.org/appcontrol/operation/edit");
1151         app_control_add_extra_data(app_control, "start_time", start_str);
1152         app_control_add_extra_data(app_control, "end_time", end_str);
1153
1154         app_control_send_launch_request(app_control, _reply_cb, NULL);
1155         app_control_destroy(app_control);
1156 }
1157
1158
1159