1 #include <Elementary.h>
3 #include <app_control.h>
13 #include "group_info.h"
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";
21 static void _append_item_to_searchlist(Evas_Object *searchlist, Evas_Object *item)
23 Evas_Object *box = NULL;
28 box = elm_object_content_get(searchlist);
31 elm_box_pack_end(box, item);
34 static void _remove_item_in_searchlist(Evas_Object *searchlist, Evas_Object *item)
36 Evas_Object *box = NULL;
41 box = elm_object_content_get(searchlist);
44 elm_box_unpack(box, item);
47 static void _clean_searchlist(Evas_Object *searchlist)
49 Evas_Object *box = NULL;
50 Evas_Object *predict_item = NULL;
51 Eina_List *list = NULL;
55 box = elm_object_content_get(searchlist);
58 list = elm_box_children_get(box);
61 EINA_LIST_FREE(list, predict_item) {
62 item_destroy_typing(predict_item);
66 static void _update_searchlist(Evas_Object *searchlist, const char *str, main_view_s *main_view_info)
68 Evas_Object *predict_item = NULL;
69 city_s *city_info = NULL;
75 _clean_searchlist(searchlist);
77 city_info = city_get();
80 /* This is the padding before the search list */
81 predict_item = item_create_padding(searchlist);
83 _append_item_to_searchlist(searchlist, predict_item);
86 for (; i < CITY_MAX; i++) {
88 if (city_info[i].name && strstr(city_info[i].name, str))
90 else if (city_info[i].nation && strstr(city_info[i].nation, str))
94 predict_item = item_create_typing(searchlist, i, main_view_info);
96 _append_item_to_searchlist(searchlist, predict_item);
100 elm_object_signal_emit(main_view_info->main_view, "show", "entry_result");
102 count = scroller_count_item(searchlist);
106 predict_item = item_create_typing(searchlist, -1, main_view_info);
108 _append_item_to_searchlist(searchlist, predict_item);
112 static void _change_entry_cb(void *data, Evas_Object *obj, void *event_info)
114 main_view_s *main_view_info = data;
115 Evas_Object *entry = obj;
116 const char *str = NULL;
118 ret_if(!main_view_info);
120 _D("Entry is changed");
122 str = elm_entry_entry_get(entry);
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", "");
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", "");
134 static void _focus_entry_cb(void *data, Evas_Object *obj, void *event_info)
136 main_view_s *main_view_info = data;
137 Evas_Object *entry = obj;
138 const char *str = NULL;
140 ret_if(!main_view_info);
142 _D("Entry is focused");
144 str = elm_entry_entry_get(entry);
148 _update_searchlist(main_view_info->searchlist, str, main_view_info);
151 static void _unfocus_entry_cb(void *data, Evas_Object *obj, void *event_info)
153 main_view_s *main_view_info = data;
155 ret_if(!main_view_info);
156 ret_if(!main_view_info->searchlist);
158 _D("Entry is unfocused");
160 elm_object_signal_emit(main_view_info->main_view, "hide", "entry_result");
161 //_clean_searchlist(main_view_info->searchlist);
164 static void _resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
167 evas_object_geometry_get(obj, &x, &y, &w, &h);
168 _D("%s (%d:%d:%d:%d)", data, x, y, w, h);
171 static void _delete_down_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
173 _D("Delete button is down");
176 static void _delete_up_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
178 Evas_Object *searchbar = obj;
179 Evas_Object *entry_obj = NULL;
180 main_view_s *main_view_info = data;
183 ret_if(!main_view_info);
184 ret_if(!main_view_info->searchlist);
186 _D("Delete button is up");
188 entry_obj = elm_object_part_content_get(searchbar, "entry");
190 elm_entry_entry_set(entry_obj, "");
192 _clean_searchlist(main_view_info->searchlist);
195 static Evas_Object *_create_searchbar(Evas_Object *parent, main_view_s *main_view_info)
197 Evas_Object *searchbar = NULL;
198 Evas_Object *entry_obj = NULL;
201 char full_path[PATH_LEN] = {0, };
203 retv_if(!parent, NULL);
205 path = app_get_resource_path();
206 retv_if(!path, NULL);
208 snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ENTRY_EDJE);
211 searchbar = elm_layout_add(parent);
212 retv_if(!searchbar, NULL);
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);
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);
222 entry_obj = elm_entry_add(parent);
223 retv_if(!entry_obj, NULL);
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>");
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);
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);
239 evas_object_show(entry_obj);
240 elm_object_part_content_set(searchbar, "entry", entry_obj);
245 static void _destroy_searchbar(Evas_Object *searchbar)
247 Evas_Object *entry_obj = NULL;
251 entry_obj = elm_object_part_content_unset(searchbar, "entry");
253 evas_object_del(entry_obj);
255 evas_object_del(searchbar);
258 static void _click_next_btn_cb(void *data, Evas_Object *obj, void *event_info)
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;
267 city_s *city_info = NULL;
268 int cur_timezone = 0;
270 ret_if(!main_view_info);
271 ret_if(!main_view_info->city_list);
272 ret_if(!main_view_info->result_list);
274 _D("result button is clicked");
276 scroller_clear_item(main_view_info->result_list);
278 city_info = city_get();
282 global_time = gmtime(&t);
283 local_time = localtime(&t);
285 cur_timezone = (int) local_time->tm_gmtoff / 3600;
287 box = elm_object_content_get(main_view_info->city_list);
290 list = elm_box_children_get(box);
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;
299 selecting_info = evas_object_data_get(item, DATA_KEY_SELECTING);
300 continue_if(!selecting_info);
302 tmp_timezone = city_info[selecting_info->city].timezone;
303 if (tmp_timezone < cur_timezone)
306 start = tmp_timezone - cur_timezone + BEST_START_TIME;
307 end = (start + (BEST_END_TIME - BEST_START_TIME)) % 24;
309 item_result = item_create_result(main_view_info->result_list
310 , selecting_info->city
311 , selecting_info->color
316 scroller_append_item(main_view_info->result_list, item_result);
319 elm_object_signal_emit(main_view_info->main_view, "momentic,state,page2", "");
322 static Evas_Object *_create_next_btn(Evas_Object *parent, main_view_s *main_view_info)
324 Evas_Object *next_btn = NULL;
325 Evas_Object *icon = NULL;
327 char full_path[PATH_LEN] = {0, };
329 retv_if(!parent, NULL);
331 path = app_get_resource_path();
332 retv_if(!path, NULL);
334 snprintf(full_path, sizeof(full_path), "%s/images/next_btn.png", path);
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);
342 icon = elm_image_add(next_btn);
344 elm_image_file_set(icon, full_path, NULL);
345 elm_object_content_set(next_btn, icon);
348 button_effect(next_btn);
353 static void _destroy_next_btn(Evas_Object *next_btn)
356 evas_object_del(next_btn);
359 static Evas_Object *_create_city_list(Evas_Object *parent)
361 Evas_Object *city_list = NULL;
363 retv_if(!parent, NULL);
365 city_list = scroller_create(parent);
366 retv_if(!city_list, NULL);
371 static void _destroy_city_list(Evas_Object *city_list)
373 Evas_Object *box = NULL;
374 Evas_Object *item = NULL;
375 Eina_List *list = NULL;
379 box = elm_object_content_get(city_list);
382 list = elm_box_children_get(box);
385 EINA_LIST_FREE(list, item) {
386 evas_object_del(item);
389 evas_object_del(box);
390 evas_object_del(city_list);
393 static void _click_add_btn_cb(void *data, Evas_Object *obj, void *event_info)
395 main_view_s *main_view_info = data;
397 _D("Add button is clicked");
399 ret_if(!main_view_info);
400 ret_if(!main_view_info->main_view);
402 elm_object_signal_emit(main_view_info->main_view, "momentic,state,page1", "");
405 static void _page1_done_cb(void *data, Evas_Object *obj, const char *signal, const char *source)
407 elm_object_focus_set(data, EINA_TRUE);
410 static Evas_Object *_create_add_btn(Evas_Object *parent, main_view_s *main_view_info)
412 Evas_Object *add_btn = NULL;
413 Evas_Object *icon = NULL;
415 char full_path[PATH_LEN] = {0, };
417 retv_if(!parent, NULL);
419 path = app_get_resource_path();
420 retv_if(!path, NULL);
422 snprintf(full_path, sizeof(full_path), "%s/images/add_btn.png", path);
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);
430 icon = elm_image_add(add_btn);
432 elm_image_file_set(icon, full_path, NULL);
433 elm_object_content_set(add_btn, icon);
436 button_effect(add_btn);
441 static void _destroy_add_btn(Evas_Object *add_btn)
444 evas_object_del(add_btn);
447 static void _click_save_button_cb(void *data, Evas_Object *obj, void *event_info)
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, };
459 _D("Save button is clicked");
461 ret_if(!main_view_info);
462 ret_if(!main_view_info->result_list);
464 box = elm_object_content_get(main_view_info->result_list);
467 list = elm_box_children_get(box);
470 EINA_LIST_FREE(list, item) {
471 result_info_s *result_info = NULL;
473 result_info = evas_object_data_get(item, DATA_KEY_RESULT);
474 continue_if(!result_info);
476 city[i] = result_info->city;
480 time = db_insert_group(moment_info->db
487 group_info = group_info_create(time
494 moment_info->group_list = eina_list_append(moment_info->group_list, group_info);
497 static Evas_Object *_create_save_button(Evas_Object *parent, moment_info_s *moment_info)
499 Evas_Object *save_button = NULL;
501 retv_if(!parent, NULL);
503 save_button = elm_button_add(parent);
504 retv_if(!save_button, NULL);
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);
514 static void _destroy_save_button(Evas_Object *save_button)
516 ret_if(!save_button);
517 evas_object_del(save_button);
520 static Evas_Object *_create_searchlist(Evas_Object *parent)
522 Evas_Object *searchlist = NULL;
524 retv_if(!parent, NULL);
526 searchlist = scroller_create(parent);
527 retv_if(!searchlist, NULL);
532 static void _destroy_searchlist(Evas_Object *searchlist)
534 Evas_Object *box = NULL;
535 Evas_Object *item = NULL;
536 Eina_List *list = NULL;
540 box = elm_object_content_get(searchlist);
543 list = elm_box_children_get(box);
546 EINA_LIST_FREE(list, item) {
547 evas_object_del(item);
550 evas_object_del(box);
551 evas_object_del(searchlist);
554 static Evas_Object *_create_result_list(Evas_Object *parent)
556 Evas_Object *result_list = NULL;
558 retv_if(!parent, NULL);
560 result_list = scroller_create(parent);
561 retv_if(!result_list, NULL);
566 static void _destroy_result_list(Evas_Object *result_list)
568 Evas_Object *box = NULL;
569 Evas_Object *item = NULL;
570 Eina_List *list = NULL;
572 ret_if(!result_list);
574 box = elm_object_content_get(result_list);
577 list = elm_box_children_get(box);
580 EINA_LIST_FREE(list, item) {
581 evas_object_del(item);
584 evas_object_del(box);
585 evas_object_del(result_list);
588 static Evas_Object *_create_group_scroller(Evas_Object *parent, Eina_List *list, main_view_s *main_view_info)
590 Evas_Object *group_scroller = NULL;
591 group_info_s *group_info = NULL;
592 const Eina_List *l = NULL;
594 retv_if(!parent, NULL);
596 group_scroller = scroller_create(parent);
597 retv_if(!group_scroller, NULL);
599 EINA_LIST_FOREACH(list, l, group_info) {
600 Evas_Object *item_group = item_create_group(group_scroller
603 scroller_append_item(group_scroller, item_group);
606 return group_scroller;
609 static void _destroy_group_scroller(Evas_Object *group_scroller)
611 Evas_Object *box = NULL;
612 Evas_Object *item = NULL;
613 Eina_List *list = NULL;
615 ret_if(!group_scroller);
617 box = elm_object_content_get(group_scroller);
620 list = elm_box_children_get(box);
623 EINA_LIST_FREE(list, item) {
624 evas_object_del(item);
627 evas_object_del(box);
628 evas_object_del(group_scroller);
631 static void _main_view_back_cb(void *data, Evas_Object *obj, void *event_info)
633 elm_object_signal_emit(obj, "momentic,state,page,back", "");
636 Evas_Object *main_view_create(Evas_Object *parent, moment_info_s *moment_info)
638 main_view_s *main_view_info = NULL;
640 char full_path[PATH_LEN] = {0, };
642 retv_if(!parent, NULL);
644 path = app_get_resource_path();
645 retv_if(!path, NULL);
647 snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, MAIN_VIEW_EDJE);
650 _D("main_view is created with %s", full_path);
652 main_view_info = calloc(1, sizeof(main_view_s));
653 retv_if(!main_view_info, NULL);
654 main_view_info->moment_info = moment_info;
656 main_view_info->main_view = create_momentic_layout(parent, full_path);
657 if (!main_view_info->main_view) {
658 free(main_view_info);
662 eext_object_event_callback_add(main_view_info->main_view, EEXT_CALLBACK_BACK, _main_view_back_cb, main_view_info);
664 elm_layout_file_set(main_view_info->main_view, full_path, "main");
665 evas_object_size_hint_weight_set(main_view_info->main_view, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
666 evas_object_size_hint_align_set(main_view_info->main_view, EVAS_HINT_FILL, EVAS_HINT_FILL);
667 evas_object_show(main_view_info->main_view);
668 evas_object_data_set(main_view_info->main_view, DATA_KEY_INFO, main_view_info);
669 evas_object_event_callback_add(main_view_info->main_view, EVAS_CALLBACK_RESIZE, _resize_cb, "main_view");
671 elm_object_part_text_set(main_view_info->main_view, "title", "No cities");
672 elm_object_part_text_set(main_view_info->main_view, "description", "After you add cities, they will be shown here.");
674 main_view_info->searchbar = _create_searchbar(main_view_info->main_view, main_view_info);
675 if (main_view_info->searchbar)
676 elm_object_part_content_set(main_view_info->main_view, "searchbar", main_view_info->searchbar);
678 main_view_info->next_btn = _create_next_btn(main_view_info->main_view, main_view_info);
679 if (main_view_info->next_btn)
680 elm_object_part_content_set(main_view_info->main_view, "next_btn", main_view_info->next_btn);
682 main_view_info->city_list = _create_city_list(main_view_info->main_view);
683 if (main_view_info->city_list)
684 elm_object_part_content_set(main_view_info->main_view, "city_list", main_view_info->city_list);
686 main_view_info->add_btn = _create_add_btn(main_view_info->main_view, main_view_info);
687 if (main_view_info->add_btn)
688 elm_object_part_content_set(main_view_info->main_view, "add_btn", main_view_info->add_btn);
690 main_view_info->searchlist = _create_searchlist(main_view_info->main_view);
691 if (main_view_info->searchlist)
692 elm_object_part_content_set(main_view_info->main_view, "searchlist", main_view_info->searchlist);
694 main_view_info->result_list = _create_result_list(main_view_info->main_view);
695 if (main_view_info->result_list)
696 elm_object_part_content_set(main_view_info->main_view, "result_list", main_view_info->result_list);
698 main_view_info->group_scroller = _create_group_scroller(main_view_info->main_view, moment_info->group_list, main_view_info);
699 if (main_view_info->group_scroller)
700 evas_object_hide(main_view_info->group_scroller);
701 //elm_object_part_content_set(main_view_info->main_view, "group_scroller", main_view_info->group_scroller);
703 elm_object_signal_callback_add(main_view_info->main_view, "momentic,page1,done", "", _page1_done_cb, main_view_info->searchbar);
705 return main_view_info->main_view;
708 void main_view_destroy(Evas_Object *main_view)
710 Evas_Object *button = NULL;
711 main_view_s *main_view_info = NULL;
715 main_view_info = evas_object_data_del(main_view_info->main_view, DATA_KEY_INFO);
716 ret_if(!main_view_info);
718 if (main_view_info->group_scroller)
719 _destroy_group_scroller(main_view_info->group_scroller);
721 if (main_view_info->result_list)
722 _destroy_result_list(main_view_info->result_list);
724 if (main_view_info->searchlist)
725 _destroy_searchlist(main_view_info->searchlist);
727 if (main_view_info->add_btn)
728 _destroy_add_btn(main_view_info->add_btn);
730 if (main_view_info->city_list)
731 _destroy_city_list(main_view_info->city_list);
733 if (main_view_info->next_btn)
734 _destroy_next_btn(button);
736 if (main_view_info->searchbar)
737 _destroy_searchbar(main_view_info->searchbar);
739 free(main_view_info);
741 evas_object_del(main_view);
744 static void _get_best_time(double *timezone, int size, double *start, double *end)
752 *start = timezone[0];
753 *end = timezone[0] + BEST_DURING_TIME;
755 for (; i < size; i++) {
756 double tmp = timezone[i];
759 if (tmp + BEST_DURING_TIME <= *start) {
760 _D("No matched time");
765 *end = tmp + BEST_DURING_TIME;
767 } else if (tmp > *start) {
769 _D("No matched time");
781 static void _reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
783 _D("Result callback is called");
786 static void _launch_calendar_edit(int start, int end)
788 app_control_h app_control = NULL;
790 struct tm *local_time = NULL;
793 char start_str[PATH_LEN] = {0, };
794 char end_str[PATH_LEN] = {0, };
796 ret = app_control_create(&app_control);
797 ret_if(APP_CONTROL_ERROR_NONE != ret);
799 local_time = localtime(&t);
801 snprintf(start_str, sizeof(start_str), "%4d-%2d-%2d %2d:%2d:%2d"
802 , local_time->tm_year + 1900
803 , local_time->tm_mon + 1
804 , local_time->tm_mday
809 snprintf(start_str, sizeof(start_str), "%4d-%2d-%2d %2d:%2d:%2d"
810 , local_time->tm_year + 1900
811 , local_time->tm_mon + 1
812 , local_time->tm_mday
817 app_control_set_app_id(app_control, "com.samsung.calendar-lite-edit");
818 app_control_set_operation(app_control, "http://tizen.org/appcontrol/operation/edit");
819 app_control_add_extra_data(app_control, "start_time", start_str);
820 app_control_add_extra_data(app_control, "end_time", end_str);
822 app_control_send_launch_request(app_control, _reply_cb, NULL);
823 app_control_destroy(app_control);