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