Today version : 0812
[apps/native/sample/adventure.git] / src / main_view.c
1 #include <Elementary.h>
2 #include <time.h>
3 #include <app_control.h>
4
5 #include "main.h"
6 #include "main_view.h"
7 #include "log.h"
8 #include "scroller.h"
9 #include "city.h"
10 #include "util.h"
11 #include "item.h"
12 #include "conf.h"
13 #include "group_info.h"
14 #include "db.h"
15 #include "map.h"
16
17 const char *const MAIN_VIEW_EDJE = "momentic.edj";
18 const char *const ENTRY_EDJE = "entry.edj";
19 const char *const PREDICT_ITEM_EDJE = "predict_item.edj";
20
21 static void _append_item_to_searchlist(Evas_Object *searchlist, Evas_Object *item)
22 {
23         Evas_Object *box = NULL;
24
25         ret_if(!searchlist);
26         ret_if(!item);
27
28         box = elm_object_content_get(searchlist);
29         ret_if(!box);
30
31         elm_box_pack_end(box, item);
32 }
33
34 static void _remove_item_in_searchlist(Evas_Object *searchlist, Evas_Object *item)
35 {
36         Evas_Object *box = NULL;
37
38         ret_if(!searchlist);
39         ret_if(!item);
40
41         box = elm_object_content_get(searchlist);
42         ret_if(!box);
43
44         elm_box_unpack(box, item);
45 }
46
47 static void _clean_searchlist(Evas_Object *searchlist)
48 {
49         Evas_Object *box = NULL;
50         Evas_Object *predict_item = NULL;
51         Eina_List *list = NULL;
52
53         ret_if(!searchlist);
54
55         box = elm_object_content_get(searchlist);
56         ret_if(!box);
57
58         list = elm_box_children_get(box);
59         ret_if(!list);
60
61         EINA_LIST_FREE(list, predict_item) {
62                 item_destroy_typing(predict_item);
63         }
64 }
65
66 static void _update_searchlist(Evas_Object *searchlist, const char *str, main_view_s *main_view_info)
67 {
68         Evas_Object *predict_item = NULL;
69         city_s *city_info = NULL;
70         register int i = 0;
71         int count = 0;
72
73         ret_if(!searchlist);
74
75         _clean_searchlist(searchlist);
76
77         city_info = city_get();
78         ret_if(!city_info);
79
80         /* This is the padding before the search list */
81         predict_item = item_create_padding(searchlist);
82         if (predict_item) {
83                 _append_item_to_searchlist(searchlist, predict_item);
84         }
85
86         for (; i < CITY_MAX; i++) {
87                 int matched = 0;
88                 if (city_info[i].name && strstr(city_info[i].name, str))
89                         matched = 1;
90                 else if (city_info[i].nation && strstr(city_info[i].nation, str))
91                         matched = 1;
92
93                 if (matched) {
94                         predict_item = item_create_typing(searchlist, i, main_view_info);
95                         if (predict_item)
96                                 _append_item_to_searchlist(searchlist, predict_item);
97                 }
98         }
99
100         elm_object_signal_emit(main_view_info->main_view, "show", "entry_result");
101
102         count = scroller_count_item(searchlist);
103         if (count > 1)
104                 return;
105
106         predict_item = item_create_typing(searchlist, -1, main_view_info); 
107         if (predict_item) {
108                 _append_item_to_searchlist(searchlist, predict_item);
109         }
110 }
111
112 static void _change_entry_cb(void *data, Evas_Object *obj, void *event_info)
113 {
114         main_view_s *main_view_info = data;
115         Evas_Object *entry = obj;
116         const char *str = NULL;
117
118         ret_if(!main_view_info);
119
120         _D("Entry is changed");
121
122         str = elm_entry_entry_get(entry);
123         if (!str
124                 || (str && !strlen(str))) {
125                 _clean_searchlist(main_view_info->searchlist);
126                 elm_object_signal_emit(main_view_info->main_view, "momentic,state,searchlist,hide", "");
127                 return;
128         }
129
130         _update_searchlist(main_view_info->searchlist, str, main_view_info);
131         elm_object_signal_emit(main_view_info->main_view, "momentic,state,searchlist,show", "");
132 }
133
134 static void _focus_entry_cb(void *data, Evas_Object *obj, void *event_info)
135 {
136         main_view_s *main_view_info = data;
137         Evas_Object *entry = obj;
138         const char *str = NULL;
139
140         ret_if(!main_view_info);
141
142         _D("Entry is focused");
143
144         str = elm_entry_entry_get(entry);
145         if (!str)
146                 return;
147
148         _update_searchlist(main_view_info->searchlist, str, main_view_info);
149 }
150
151 static void _unfocus_entry_cb(void *data, Evas_Object *obj, void *event_info)
152 {
153         main_view_s *main_view_info = data;
154
155         ret_if(!main_view_info);
156         ret_if(!main_view_info->searchlist);
157
158         _D("Entry is unfocused");
159
160         elm_object_signal_emit(main_view_info->main_view, "hide", "entry_result");
161         //_clean_searchlist(main_view_info->searchlist);
162 }
163
164 static void _resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
165 {
166         int x, y, w, h;
167         evas_object_geometry_get(obj, &x, &y, &w, &h);
168         _D("%s (%d:%d:%d:%d)", data, x, y, w, h);
169 }
170
171 static void _delete_down_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
172 {
173         _D("Delete button is down");
174 }
175
176 static void _delete_up_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
177 {
178         Evas_Object *searchbar = obj;
179         Evas_Object *entry_obj = NULL;
180         main_view_s *main_view_info = data;
181
182         ret_if(!searchbar);
183         ret_if(!main_view_info);
184         ret_if(!main_view_info->searchlist);
185
186         _D("Delete button is up");
187
188         entry_obj = elm_object_part_content_get(searchbar, "entry");
189         if (entry_obj)
190                 elm_entry_entry_set(entry_obj, "");
191
192         _clean_searchlist(main_view_info->searchlist);
193 }
194
195 static Evas_Object *_create_searchbar(Evas_Object *parent, main_view_s *main_view_info)
196 {
197         Evas_Object *searchbar = NULL;
198         Evas_Object *entry_obj = NULL;
199
200         char *path = NULL;
201         char full_path[PATH_LEN] = {0, };
202
203         retv_if(!parent, NULL);
204
205         path = app_get_resource_path();
206         retv_if(!path, NULL);
207
208         snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ENTRY_EDJE);
209         free(path);
210
211         searchbar = elm_layout_add(parent);
212         retv_if(!searchbar, NULL);
213
214         elm_layout_file_set(searchbar, full_path, "main");
215         elm_object_signal_callback_add(searchbar, "delete,down", "entry", _delete_down_cb, main_view_info);
216         elm_object_signal_callback_add(searchbar, "delete,up", "entry", _delete_up_cb, main_view_info);
217
218         evas_object_size_hint_weight_set(searchbar, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
219         evas_object_size_hint_align_set(searchbar, EVAS_HINT_FILL, EVAS_HINT_FILL);
220         evas_object_show(searchbar);
221
222         entry_obj = elm_entry_add(parent);
223         retv_if(!entry_obj, NULL);
224
225         elm_entry_single_line_set(entry_obj, EINA_TRUE);
226         /* This makes the text upper */
227         elm_entry_scrollable_set(entry_obj, EINA_FALSE);
228         elm_entry_cnp_mode_set(entry_obj, ELM_CNP_MODE_PLAINTEXT);
229         elm_entry_text_style_user_push(entry_obj, "DEFAULT='font_size=20'");
230         elm_object_part_text_set(entry_obj, "elm.guide", "<font_size=20>Search</font_size>");
231
232         evas_object_size_hint_weight_set(entry_obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
233         evas_object_size_hint_align_set(entry_obj, 0.0, 0.5);
234
235         evas_object_smart_callback_add(entry_obj, "changed", _change_entry_cb, main_view_info);
236         evas_object_smart_callback_add(entry_obj, "focused", _focus_entry_cb, main_view_info);
237         evas_object_smart_callback_add(entry_obj, "unfocused", _unfocus_entry_cb, main_view_info);
238
239         evas_object_show(entry_obj);
240         elm_object_part_content_set(searchbar, "entry", entry_obj);
241
242         return searchbar;
243 }
244
245 static void _destroy_searchbar(Evas_Object *searchbar)
246 {
247         Evas_Object *entry_obj = NULL;
248
249         ret_if(!searchbar);
250
251         entry_obj = elm_object_part_content_unset(searchbar, "entry");
252         if (entry_obj)
253                 evas_object_del(entry_obj);
254
255         evas_object_del(searchbar);
256 }
257
258 static void _click_next_btn_cb(void *data, Evas_Object *obj, void *event_info)
259 {
260         main_view_s *main_view_info = data;
261         Evas_Object *box = NULL;
262         Evas_Object *item = NULL;
263         Eina_List *list = NULL;
264         struct tm *global_time = NULL;
265         struct tm *local_time = NULL;
266         time_t t;
267         city_s *city_info = NULL;
268         int cur_timezone = 0;
269
270         ret_if(!main_view_info);
271         ret_if(!main_view_info->city_list);
272         ret_if(!main_view_info->result_list);
273
274         _D("result button is clicked");
275
276         scroller_clear_item(main_view_info->result_list);
277
278         city_info = city_get();
279         ret_if(!city_info);
280
281         time(&t);
282         global_time = gmtime(&t);
283         local_time = localtime(&t);
284
285         cur_timezone = (int) local_time->tm_gmtoff / 3600;
286
287         box = elm_object_content_get(main_view_info->city_list);
288         ret_if(!box);
289
290         list = elm_box_children_get(box);
291         ret_if(!list);
292
293         EINA_LIST_FREE(list, item) {
294                 selecting_info_s *selecting_info = NULL;
295                 Evas_Object *item_result = NULL;
296                 int start = 0, end = 0;
297                 int tmp_timezone = 0;
298
299                 selecting_info = evas_object_data_get(item, DATA_KEY_SELECTING);
300                 continue_if(!selecting_info);
301
302                 tmp_timezone = city_info[selecting_info->city].timezone;
303                 if (tmp_timezone < cur_timezone)
304                         tmp_timezone += 24;
305
306                 start = tmp_timezone - cur_timezone + BEST_START_TIME;
307                 end = (start + (BEST_END_TIME - BEST_START_TIME)) % 24;
308
309                 item_result = item_create_result(main_view_info->result_list
310                                 , selecting_info->city
311                                 , selecting_info->color
312                                 , start
313                                 , end
314                                 , global_time);
315
316                 scroller_append_item(main_view_info->result_list, item_result);
317         }
318
319         elm_object_signal_emit(main_view_info->main_view, "momentic,state,page2", "");
320 }
321
322 static Evas_Object *_create_next_btn(Evas_Object *parent, main_view_s *main_view_info)
323 {
324         Evas_Object *next_btn = NULL;
325         Evas_Object *icon = NULL;
326         char *path = NULL;
327         char full_path[PATH_LEN] = {0, };
328
329         retv_if(!parent, NULL);
330
331         path = app_get_resource_path();
332         retv_if(!path, NULL);
333
334         snprintf(full_path, sizeof(full_path), "%s/images/next_btn.png", path);
335         free(path);
336
337         next_btn = elm_button_add(parent);
338         retv_if(!next_btn, NULL);
339         elm_object_style_set(next_btn, "transparent");
340         evas_object_smart_callback_add(next_btn, "clicked", _click_next_btn_cb, main_view_info);
341
342         icon = elm_image_add(next_btn);
343         if (icon) {
344                 elm_image_file_set(icon, full_path, NULL);
345                 elm_object_content_set(next_btn, icon);
346         }
347
348         button_effect(next_btn);
349
350         return next_btn;
351 }
352
353 static void _destroy_next_btn(Evas_Object *next_btn)
354 {
355         ret_if(!next_btn);
356         evas_object_del(next_btn);
357 }
358
359 static Evas_Object *_create_city_list(Evas_Object *parent)
360 {
361         Evas_Object *city_list = NULL;
362
363         retv_if(!parent, NULL);
364
365         city_list = scroller_create(parent);
366         retv_if(!city_list, NULL);
367
368         return city_list;
369 }
370
371 static void _destroy_city_list(Evas_Object *city_list)
372 {
373         Evas_Object *box = NULL;
374         Evas_Object *item = NULL;
375         Eina_List *list = NULL;
376
377         ret_if(!city_list);
378
379         box = elm_object_content_get(city_list);
380         ret_if(!box);
381
382         list = elm_box_children_get(box);
383         ret_if(!list);
384
385         EINA_LIST_FREE(list, item) {
386                 evas_object_del(item);
387         }
388
389         evas_object_del(box);
390         evas_object_del(city_list);
391 }
392
393 static void _click_add_btn_cb(void *data, Evas_Object *obj, void *event_info)
394 {
395         main_view_s *main_view_info = data;
396
397         _D("Add button is clicked");
398
399         ret_if(!main_view_info);
400         ret_if(!main_view_info->main_view);
401
402         elm_object_signal_emit(main_view_info->main_view, "momentic,state,page1", "");
403 }
404
405 static void _page1_done_cb(void *data, Evas_Object *obj, const char *signal, const char *source)
406 {
407         elm_object_focus_set(data, EINA_TRUE);
408 }
409
410 static Evas_Object *_create_add_btn(Evas_Object *parent, main_view_s *main_view_info)
411 {
412         Evas_Object *add_btn = NULL;
413         Evas_Object *icon = NULL;
414         char *path = NULL;
415         char full_path[PATH_LEN] = {0, };
416
417         retv_if(!parent, NULL);
418
419         path = app_get_resource_path();
420         retv_if(!path, NULL);
421
422         snprintf(full_path, sizeof(full_path), "%s/images/add_btn.png", path);
423         free(path);
424
425         add_btn = elm_button_add(parent);
426         retv_if(!add_btn, NULL);
427         elm_object_style_set(add_btn, "transparent");
428         evas_object_smart_callback_add(add_btn, "clicked", _click_add_btn_cb, main_view_info);
429
430         icon = elm_image_add(add_btn);
431         if (icon) {
432                 elm_image_file_set(icon, full_path, NULL);
433                 elm_object_content_set(add_btn, icon);
434         }
435
436         button_effect(add_btn);
437
438         return add_btn;
439 }
440
441 static void _destroy_add_btn(Evas_Object *add_btn)
442 {
443         ret_if(!add_btn);
444         evas_object_del(add_btn);
445 }
446
447 static void _click_save_button_cb(void *data, Evas_Object *obj, void *event_info)
448 {
449         main_view_s *main_view_info = data;
450         moment_info_s *moment_info = main_view_info->moment_info;
451         Evas_Object *box = NULL;
452         Evas_Object *item = NULL;
453         Eina_List *list = NULL;
454         group_info_s *group_info = NULL;
455         int city[MAXIMUM_SELECTED_CITY] = {0, };
456         int i = 0;
457         long time = 0l;
458
459         _D("Save button is clicked");
460
461         ret_if(!main_view_info);
462         ret_if(!main_view_info->result_list);
463
464         box = elm_object_content_get(main_view_info->result_list);
465         ret_if(!box);
466
467         list = elm_box_children_get(box);
468         ret_if(!list);
469
470         EINA_LIST_FREE(list, item) {
471                 result_info_s *result_info = NULL;
472
473                 result_info = evas_object_data_get(item, DATA_KEY_RESULT);
474                 continue_if(!result_info);
475
476                 city[i] = result_info->city;
477                 i++;
478         }
479
480         time = db_insert_group(moment_info->db
481                         , "Momentic time"
482                         , city[0] 
483                         , city[1]
484                         , city[2]
485                         , city[3]
486                         , city[4]);
487         group_info = group_info_create(time
488                         , "Momentic time"
489                         , city[0] 
490                         , city[1]
491                         , city[2]
492                         , city[3]
493                         , city[4]);
494         moment_info->group_list = eina_list_append(moment_info->group_list, group_info);
495 }
496
497 static Evas_Object *_create_save_button(Evas_Object *parent, moment_info_s *moment_info)
498 {
499         Evas_Object *save_button = NULL;
500
501         retv_if(!parent, NULL);
502
503         save_button = elm_button_add(parent);
504         retv_if(!save_button, NULL);
505
506         elm_object_text_set(save_button, "Save");
507         evas_object_size_hint_weight_set(save_button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
508         evas_object_size_hint_align_set(save_button, EVAS_HINT_FILL, EVAS_HINT_FILL);
509         evas_object_smart_callback_add(save_button, "clicked", _click_save_button_cb, moment_info);
510
511         return save_button;
512 }
513
514 static void _destroy_save_button(Evas_Object *save_button)
515 {
516         ret_if(!save_button);
517         evas_object_del(save_button);
518 }
519
520 static Evas_Object *_create_searchlist(Evas_Object *parent)
521 {
522         Evas_Object *searchlist = NULL;
523
524         retv_if(!parent, NULL);
525
526         searchlist = scroller_create(parent);
527         retv_if(!searchlist, NULL);
528
529         return searchlist;
530 }
531
532 static void _destroy_searchlist(Evas_Object *searchlist)
533 {
534         Evas_Object *box = NULL;
535         Evas_Object *item = NULL;
536         Eina_List *list = NULL;
537
538         ret_if(!searchlist);
539
540         box = elm_object_content_get(searchlist);
541         ret_if(!box);
542
543         list = elm_box_children_get(box);
544         ret_if(!list);
545
546         EINA_LIST_FREE(list, item) {
547                 evas_object_del(item);
548         }
549
550         evas_object_del(box);
551         evas_object_del(searchlist);
552 }
553
554 static Evas_Object *_create_result_list(Evas_Object *parent)
555 {
556         Evas_Object *result_list = NULL;
557
558         retv_if(!parent, NULL);
559
560         result_list = scroller_create(parent);
561         retv_if(!result_list, NULL);
562
563         return result_list;
564 }
565
566 static void _destroy_result_list(Evas_Object *result_list)
567 {
568         Evas_Object *box = NULL;
569         Evas_Object *item = NULL;
570         Eina_List *list = NULL;
571
572         ret_if(!result_list);
573
574         box = elm_object_content_get(result_list);
575         ret_if(!box);
576
577         list = elm_box_children_get(box);
578         ret_if(!list);
579
580         EINA_LIST_FREE(list, item) {
581                 evas_object_del(item);
582         }
583
584         evas_object_del(box);
585         evas_object_del(result_list);
586 }
587
588 static Evas_Object *_create_group_scroller(Evas_Object *parent, Eina_List *list, main_view_s *main_view_info)
589 {
590         Evas_Object *group_scroller = NULL;
591         group_info_s *group_info = NULL;
592         const Eina_List *l = NULL;
593
594         retv_if(!parent, NULL);
595
596         group_scroller = scroller_create(parent);
597         retv_if(!group_scroller, NULL);
598
599         EINA_LIST_FOREACH(list, l, group_info) {
600                 Evas_Object *item_group = item_create_group(group_scroller
601                                 , group_info->title
602                                 , main_view_info);
603                 scroller_append_item(group_scroller, item_group);
604         }
605
606         return group_scroller;
607 }
608
609 static void _destroy_group_scroller(Evas_Object *group_scroller)
610 {
611         Evas_Object *box = NULL;
612         Evas_Object *item = NULL;
613         Eina_List *list = NULL;
614
615         ret_if(!group_scroller);
616
617         box = elm_object_content_get(group_scroller);
618         ret_if(!box);
619
620         list = elm_box_children_get(box);
621         ret_if(!list);
622
623         EINA_LIST_FREE(list, item) {
624                 evas_object_del(item);
625         }
626
627         evas_object_del(box);
628         evas_object_del(group_scroller);
629 }
630
631 static void _main_view_back_cb(void *data, Evas_Object *obj, void *event_info)
632 {
633         static time_t prev_t;
634         time_t cur_t;
635
636         time(&cur_t);
637
638         if (prev_t + 1 > cur_t) {
639                 _D("wait a sec to process the back key event");
640                 return;
641         }
642
643         prev_t = cur_t;
644         elm_object_signal_emit(obj, "momentic,state,page,back", "");
645 }
646
647 Evas_Object *main_view_create(Evas_Object *parent, moment_info_s *moment_info)
648 {
649         main_view_s *main_view_info = NULL;
650         char *path = NULL;
651         char full_path[PATH_LEN] = {0, };
652
653         retv_if(!parent, NULL);
654
655         path = app_get_resource_path();
656         retv_if(!path, NULL);
657
658         snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, MAIN_VIEW_EDJE);
659         free(path);
660
661         _D("main_view is created with %s", full_path);
662
663         main_view_info = calloc(1, sizeof(main_view_s));
664         retv_if(!main_view_info, NULL);
665         main_view_info->moment_info = moment_info;
666
667         main_view_info->main_view = create_momentic_layout(parent, full_path);
668         if (!main_view_info->main_view) {
669                 free(main_view_info);
670                 return NULL;
671         }
672
673         eext_object_event_callback_add(main_view_info->main_view, EEXT_CALLBACK_BACK, _main_view_back_cb, main_view_info);
674
675         elm_layout_file_set(main_view_info->main_view, full_path, "main");
676         evas_object_size_hint_weight_set(main_view_info->main_view, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
677         evas_object_size_hint_align_set(main_view_info->main_view, EVAS_HINT_FILL, EVAS_HINT_FILL);
678         evas_object_show(main_view_info->main_view);
679         evas_object_data_set(main_view_info->main_view, DATA_KEY_INFO, main_view_info);
680         evas_object_event_callback_add(main_view_info->main_view, EVAS_CALLBACK_RESIZE, _resize_cb, "main_view");
681
682         elm_object_part_text_set(main_view_info->main_view, "title", "No cities");
683         elm_object_part_text_set(main_view_info->main_view, "description", "After you add cities, they will be shown here.");
684
685         main_view_info->searchbar = _create_searchbar(main_view_info->main_view, main_view_info);
686         if (main_view_info->searchbar)
687                 elm_object_part_content_set(main_view_info->main_view, "searchbar", main_view_info->searchbar);
688
689         main_view_info->next_btn = _create_next_btn(main_view_info->main_view, main_view_info);
690         if (main_view_info->next_btn)
691                 elm_object_part_content_set(main_view_info->main_view, "next_btn", main_view_info->next_btn);
692
693         main_view_info->city_list = _create_city_list(main_view_info->main_view);
694         if (main_view_info->city_list)
695                 elm_object_part_content_set(main_view_info->main_view, "city_list", main_view_info->city_list);
696
697         main_view_info->add_btn = _create_add_btn(main_view_info->main_view, main_view_info);
698         if (main_view_info->add_btn)
699                 elm_object_part_content_set(main_view_info->main_view, "add_btn", main_view_info->add_btn);
700
701         main_view_info->searchlist = _create_searchlist(main_view_info->main_view);
702         if (main_view_info->searchlist)
703                 elm_object_part_content_set(main_view_info->main_view, "searchlist", main_view_info->searchlist);
704
705         main_view_info->result_list = _create_result_list(main_view_info->main_view);
706         if (main_view_info->result_list)
707                 elm_object_part_content_set(main_view_info->main_view, "result_list", main_view_info->result_list);
708
709         main_view_info->group_scroller = _create_group_scroller(main_view_info->main_view, moment_info->group_list, main_view_info);
710         if (main_view_info->group_scroller)
711                 evas_object_hide(main_view_info->group_scroller);
712                 //elm_object_part_content_set(main_view_info->main_view, "group_scroller", main_view_info->group_scroller);
713
714         elm_object_signal_callback_add(main_view_info->main_view, "momentic,page1,done", "", _page1_done_cb, main_view_info->searchbar);
715
716         return main_view_info->main_view;
717 }
718
719 void main_view_destroy(Evas_Object *main_view)
720 {
721         Evas_Object *button = NULL;
722         main_view_s *main_view_info = NULL;
723
724         ret_if(!main_view);
725
726         main_view_info = evas_object_data_del(main_view_info->main_view, DATA_KEY_INFO);
727         ret_if(!main_view_info);
728
729         if (main_view_info->group_scroller)
730                 _destroy_group_scroller(main_view_info->group_scroller);
731
732         if (main_view_info->result_list)
733                 _destroy_result_list(main_view_info->result_list);
734
735         if (main_view_info->searchlist)
736                 _destroy_searchlist(main_view_info->searchlist);
737
738         if (main_view_info->add_btn)
739                 _destroy_add_btn(main_view_info->add_btn);
740
741         if (main_view_info->city_list)
742                 _destroy_city_list(main_view_info->city_list);
743
744         if (main_view_info->next_btn)
745                 _destroy_next_btn(button);
746
747         if (main_view_info->searchbar)
748                 _destroy_searchbar(main_view_info->searchbar);
749
750         free(main_view_info);
751
752         evas_object_del(main_view);
753 }
754
755 static void _get_best_time(double *timezone, int size, double *start, double *end)
756 {
757         register int i = 1;
758
759         ret_if(!timezone);
760         ret_if(!start);
761         ret_if(!end);
762
763         *start = timezone[0];
764         *end = timezone[0] + BEST_DURING_TIME;
765
766         for (; i < size; i++) {
767                 double tmp = timezone[i];
768
769                 if (tmp < *start) {
770                         if (tmp + BEST_DURING_TIME <= *start) {
771                                 _D("No matched time");
772                                 *start = 0;
773                                 *end = 0;
774                                 return;
775                         } else {
776                                 *end = tmp + BEST_DURING_TIME;
777                         }
778                 } else if (tmp > *start) {
779                         if (tmp >= *end) {
780                                 _D("No matched time");
781                                 *start = 0;
782                                 *end = 0;
783                                 return;
784                         } else {
785                                 *start = tmp;
786                         }
787                 } else
788                         continue;
789         }
790 }
791
792 static void _reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
793 {
794         _D("Result callback is called");
795 }
796
797 static void _launch_calendar_edit(int start, int end)
798 {
799         app_control_h app_control = NULL;
800         time_t t;
801         struct tm *local_time = NULL;
802         int ret;
803
804         char start_str[PATH_LEN] = {0, };
805         char end_str[PATH_LEN] = {0, };
806
807         ret = app_control_create(&app_control);
808         ret_if(APP_CONTROL_ERROR_NONE != ret);
809
810         local_time = localtime(&t);
811
812         snprintf(start_str, sizeof(start_str), "%4d-%2d-%2d %2d:%2d:%2d"
813                         , local_time->tm_year + 1900
814                         , local_time->tm_mon + 1
815                         , local_time->tm_mday
816                         , start
817                         , 0
818                         , 0);
819
820         snprintf(start_str, sizeof(start_str), "%4d-%2d-%2d %2d:%2d:%2d"
821                         , local_time->tm_year + 1900
822                         , local_time->tm_mon + 1
823                         , local_time->tm_mday
824                         , end
825                         , 0
826                         , 0);
827
828         app_control_set_app_id(app_control, "com.samsung.calendar-lite-edit");
829         app_control_set_operation(app_control, "http://tizen.org/appcontrol/operation/edit");
830         app_control_add_extra_data(app_control, "start_time", start_str);
831         app_control_add_extra_data(app_control, "end_time", end_str);
832
833         app_control_send_launch_request(app_control, _reply_cb, NULL);
834         app_control_destroy(app_control);
835 }
836
837
838