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_predict_scroller(Evas_Object *predict_scroller, Evas_Object *item)
23 Evas_Object *box = NULL;
25 ret_if(!predict_scroller);
28 box = elm_object_content_get(predict_scroller);
31 elm_box_pack_end(box, item);
34 static void _remove_item_in_predict_scroller(Evas_Object *predict_scroller, Evas_Object *item)
36 Evas_Object *box = NULL;
38 ret_if(!predict_scroller);
41 box = elm_object_content_get(predict_scroller);
44 elm_box_unpack(box, item);
47 static void _clean_predict_scroller(Evas_Object *predict_scroller)
49 Evas_Object *box = NULL;
50 Evas_Object *predict_item = NULL;
51 Eina_List *list = NULL;
53 ret_if(!predict_scroller);
55 box = elm_object_content_get(predict_scroller);
58 list = elm_box_children_get(box);
61 EINA_LIST_FREE(list, predict_item) {
62 item_destroy_typing(predict_item);
66 static void _update_predict_scroller(Evas_Object *predict_scroller, const char *str, main_view_s *main_view_info)
68 city_s *city_info = NULL;
71 ret_if(!predict_scroller);
73 _clean_predict_scroller(predict_scroller);
75 city_info = city_get();
78 for (; i < CITY_MAX; i++) {
80 if (city_info[i].name && strstr(city_info[i].name, str))
82 else if (city_info[i].nation && strstr(city_info[i].nation, str))
86 Evas_Object *predict_item = NULL;
87 predict_item = item_create_typing(predict_scroller, i, main_view_info);
89 _append_item_to_predict_scroller(predict_scroller, predict_item);
92 elm_object_signal_emit(main_view_info->main_view, "show", "entry_result");
95 static void _change_entry_cb(void *data, Evas_Object *obj, void *event_info)
97 main_view_s *main_view_info = data;
98 Evas_Object *entry = obj;
99 const char *str = NULL;
101 ret_if(!main_view_info);
103 _D("Entry is changed");
105 str = elm_entry_entry_get(entry);
107 || (str && !strlen(str))) {
108 _clean_predict_scroller(main_view_info->predict_scroller);
109 elm_object_signal_emit(main_view_info->main_view, "momentic,state,searchlist,hide", "");
113 _update_predict_scroller(main_view_info->predict_scroller, str, main_view_info);
114 elm_object_signal_emit(main_view_info->main_view, "momentic,state,searchlist,show", "");
117 static void _focus_entry_cb(void *data, Evas_Object *obj, void *event_info)
119 main_view_s *main_view_info = data;
120 Evas_Object *entry = obj;
121 const char *str = NULL;
123 ret_if(!main_view_info);
125 _D("Entry is focused");
127 str = elm_entry_entry_get(entry);
131 _update_predict_scroller(main_view_info->predict_scroller, str, main_view_info);
134 static void _unfocus_entry_cb(void *data, Evas_Object *obj, void *event_info)
136 main_view_s *main_view_info = data;
138 ret_if(!main_view_info);
139 ret_if(!main_view_info->predict_scroller);
141 _D("Entry is unfocused");
143 elm_object_signal_emit(main_view_info->main_view, "hide", "entry_result");
144 //_clean_predict_scroller(main_view_info->predict_scroller);
147 static void _resize_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
150 evas_object_geometry_get(obj, &x, &y, &w, &h);
151 _D("%s (%d:%d:%d:%d)", data, x, y, w, h);
154 static void _delete_down_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
156 _D("Delete button is down");
159 static void _delete_up_cb(void *data, Evas_Object *obj, const char *emission, const char *source)
161 Evas_Object *entry = obj;
162 Evas_Object *entry_obj = NULL;
163 main_view_s *main_view_info = data;
166 ret_if(!main_view_info);
167 ret_if(!main_view_info->predict_scroller);
169 _D("Delete button is up");
171 entry_obj = elm_object_part_content_get(entry, "entry");
173 elm_entry_entry_set(entry_obj, "");
175 _clean_predict_scroller(main_view_info->predict_scroller);
178 static Evas_Object *_create_search_entry(Evas_Object *parent, main_view_s *main_view_info)
180 Evas_Object *entry = NULL;
181 Evas_Object *entry_obj = NULL;
184 char full_path[PATH_LEN] = {0, };
186 retv_if(!parent, NULL);
188 path = app_get_resource_path();
189 retv_if(!path, NULL);
191 snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, ENTRY_EDJE);
194 entry = elm_layout_add(parent);
195 retv_if(!entry, NULL);
197 elm_layout_file_set(entry, full_path, "main");
198 elm_object_signal_callback_add(entry, "delete,down", "entry", _delete_down_cb, main_view_info);
199 elm_object_signal_callback_add(entry, "delete,up", "entry", _delete_up_cb, main_view_info);
201 evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
202 evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, EVAS_HINT_FILL);
203 evas_object_show(entry);
205 entry_obj = elm_entry_add(parent);
206 retv_if(!entry_obj, NULL);
208 elm_entry_single_line_set(entry_obj, EINA_TRUE);
209 elm_entry_scrollable_set(entry_obj, EINA_TRUE);
210 elm_entry_cnp_mode_set(entry_obj, ELM_CNP_MODE_PLAINTEXT);
211 elm_entry_text_style_user_push(entry_obj, "DEFAULT='font_size=20'");
212 elm_object_part_text_set(entry_obj, "elm.guide", "<font_size=20>Search</font_size>");
214 evas_object_size_hint_weight_set(entry_obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
215 evas_object_size_hint_align_set(entry_obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
217 evas_object_smart_callback_add(entry_obj, "changed", _change_entry_cb, main_view_info);
218 evas_object_smart_callback_add(entry_obj, "focused", _focus_entry_cb, main_view_info);
219 evas_object_smart_callback_add(entry_obj, "unfocused", _unfocus_entry_cb, main_view_info);
221 evas_object_show(entry_obj);
222 elm_object_part_content_set(entry, "entry", entry_obj);
227 static void _destroy_search_entry(Evas_Object *entry)
229 Evas_Object *entry_obj = NULL;
233 entry_obj = elm_object_part_content_unset(entry, "entry");
235 evas_object_del(entry_obj);
237 evas_object_del(entry);
240 static void _click_result_button_cb(void *data, Evas_Object *obj, void *event_info)
242 main_view_s *main_view_info = data;
243 Evas_Object *box = NULL;
244 Evas_Object *item = NULL;
245 Eina_List *list = NULL;
246 struct tm *global_time = NULL;
247 struct tm *local_time = NULL;
249 city_s *city_info = NULL;
250 int cur_timezone = 0;
252 ret_if(!main_view_info);
253 ret_if(!main_view_info->selected_scroller);
254 ret_if(!main_view_info->result_scroller);
256 _D("result button is clicked");
258 scroller_clear_item(main_view_info->result_scroller);
260 city_info = city_get();
264 global_time = gmtime(&t);
265 local_time = localtime(&t);
267 cur_timezone = (int) local_time->tm_gmtoff / 3600;
269 box = elm_object_content_get(main_view_info->selected_scroller);
272 list = elm_box_children_get(box);
275 EINA_LIST_FREE(list, item) {
276 selecting_info_s *selecting_info = NULL;
277 Evas_Object *item_result = NULL;
278 int start = 0, end = 0;
279 int tmp_timezone = 0;
281 selecting_info = evas_object_data_get(item, DATA_KEY_SELECTING);
282 continue_if(!selecting_info);
284 tmp_timezone = city_info[selecting_info->city].timezone;
285 if (tmp_timezone < cur_timezone)
288 start = tmp_timezone - cur_timezone + BEST_START_TIME;
289 end = (start + (BEST_END_TIME - BEST_START_TIME)) % 24;
291 item_result = item_create_result(main_view_info->result_scroller
292 , selecting_info->city
293 , selecting_info->color
298 scroller_append_item(main_view_info->result_scroller, item_result);
301 elm_object_signal_emit(main_view_info->main_view, "momentic,state,page2", "");
304 static Evas_Object *_create_result_button(Evas_Object *parent, main_view_s *main_view_info)
306 Evas_Object *result_button = NULL;
307 Evas_Object *icon = NULL;
309 char full_path[PATH_LEN] = {0, };
311 retv_if(!parent, NULL);
313 path = app_get_resource_path();
314 retv_if(!path, NULL);
316 snprintf(full_path, sizeof(full_path), "%s/images/next_btn.png", path);
319 result_button = elm_button_add(parent);
320 retv_if(!result_button, NULL);
321 evas_object_smart_callback_add(result_button, "clicked", _click_result_button_cb, main_view_info);
323 icon = elm_image_add(result_button);
325 elm_image_file_set(icon, full_path, NULL);
326 elm_object_content_set(result_button, icon);
329 return result_button;
332 static void _destroy_result_button(Evas_Object *result_button)
334 ret_if(!result_button);
335 evas_object_del(result_button);
338 static Evas_Object *_create_selected_scroller(Evas_Object *parent)
340 Evas_Object *selected_scroller = NULL;
342 retv_if(!parent, NULL);
344 selected_scroller = scroller_create(parent);
345 retv_if(!selected_scroller, NULL);
347 return selected_scroller;
350 static void _destroy_selected_scroller(Evas_Object *selected_scroller)
352 Evas_Object *box = NULL;
353 Evas_Object *item = NULL;
354 Eina_List *list = NULL;
356 ret_if(!selected_scroller);
358 box = elm_object_content_get(selected_scroller);
361 list = elm_box_children_get(box);
364 EINA_LIST_FREE(list, item) {
365 evas_object_del(item);
368 evas_object_del(box);
369 evas_object_del(selected_scroller);
372 static void _click_plus_button_cb(void *data, Evas_Object *obj, void *event_info)
374 main_view_s *main_view_info = data;
376 _D("Add button is clicked");
378 ret_if(!main_view_info);
379 ret_if(!main_view_info->main_view);
381 elm_object_signal_emit(main_view_info->main_view, "momentic,state,page1", "");
385 static Evas_Object *_create_plus_button(Evas_Object *parent, main_view_s *main_view_info)
387 Evas_Object *plus_button = NULL;
388 Evas_Object *icon = NULL;
390 char full_path[PATH_LEN] = {0, };
392 retv_if(!parent, NULL);
394 path = app_get_resource_path();
395 retv_if(!path, NULL);
397 snprintf(full_path, sizeof(full_path), "%s/images/add_btn.png", path);
400 plus_button = elm_button_add(parent);
401 retv_if(!plus_button, NULL);
402 elm_object_style_set(plus_button, "transparent");
403 evas_object_smart_callback_add(plus_button, "clicked", _click_plus_button_cb, main_view_info);
405 icon = elm_image_add(plus_button);
407 elm_image_file_set(icon, full_path, NULL);
408 elm_object_content_set(plus_button, icon);
414 static void _destroy_plus_button(Evas_Object *plus_button)
416 ret_if(!plus_button);
417 evas_object_del(plus_button);
420 static void _click_save_button_cb(void *data, Evas_Object *obj, void *event_info)
422 main_view_s *main_view_info = data;
423 moment_info_s *moment_info = main_view_info->moment_info;
424 Evas_Object *box = NULL;
425 Evas_Object *item = NULL;
426 Eina_List *list = NULL;
427 group_info_s *group_info = NULL;
428 int city[MAXIMUM_SELECTED_CITY] = {0, };
432 _D("Save button is clicked");
434 ret_if(!main_view_info);
435 ret_if(!main_view_info->result_scroller);
437 box = elm_object_content_get(main_view_info->result_scroller);
440 list = elm_box_children_get(box);
443 EINA_LIST_FREE(list, item) {
444 result_info_s *result_info = NULL;
446 result_info = evas_object_data_get(item, DATA_KEY_RESULT);
447 continue_if(!result_info);
449 city[i] = result_info->city;
453 time = db_insert_group(moment_info->db
460 group_info = group_info_create(time
467 moment_info->group_list = eina_list_append(moment_info->group_list, group_info);
470 static Evas_Object *_create_save_button(Evas_Object *parent, moment_info_s *moment_info)
472 Evas_Object *save_button = NULL;
474 retv_if(!parent, NULL);
476 save_button = elm_button_add(parent);
477 retv_if(!save_button, NULL);
479 elm_object_text_set(save_button, "Save");
480 evas_object_size_hint_weight_set(save_button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
481 evas_object_size_hint_align_set(save_button, EVAS_HINT_FILL, EVAS_HINT_FILL);
482 evas_object_smart_callback_add(save_button, "clicked", _click_save_button_cb, moment_info);
487 static void _destroy_save_button(Evas_Object *save_button)
489 ret_if(!save_button);
490 evas_object_del(save_button);
493 static Evas_Object *_create_predict_scroller(Evas_Object *parent)
495 Evas_Object *predict_scroller = NULL;
497 retv_if(!parent, NULL);
499 predict_scroller = scroller_create(parent);
500 retv_if(!predict_scroller, NULL);
502 return predict_scroller;
505 static void _destroy_predict_scroller(Evas_Object *predict_scroller)
507 Evas_Object *box = NULL;
508 Evas_Object *item = NULL;
509 Eina_List *list = NULL;
511 ret_if(!predict_scroller);
513 box = elm_object_content_get(predict_scroller);
516 list = elm_box_children_get(box);
519 EINA_LIST_FREE(list, item) {
520 evas_object_del(item);
523 evas_object_del(box);
524 evas_object_del(predict_scroller);
527 static Evas_Object *_create_result_scroller(Evas_Object *parent)
529 Evas_Object *result_scroller = NULL;
531 retv_if(!parent, NULL);
533 result_scroller = scroller_create(parent);
534 retv_if(!result_scroller, NULL);
536 return result_scroller;
539 static void _destroy_result_scroller(Evas_Object *result_scroller)
541 Evas_Object *box = NULL;
542 Evas_Object *item = NULL;
543 Eina_List *list = NULL;
545 ret_if(!result_scroller);
547 box = elm_object_content_get(result_scroller);
550 list = elm_box_children_get(box);
553 EINA_LIST_FREE(list, item) {
554 evas_object_del(item);
557 evas_object_del(box);
558 evas_object_del(result_scroller);
561 static Evas_Object *_create_group_scroller(Evas_Object *parent, Eina_List *list, main_view_s *main_view_info)
563 Evas_Object *group_scroller = NULL;
564 group_info_s *group_info = NULL;
565 const Eina_List *l = NULL;
567 retv_if(!parent, NULL);
569 group_scroller = scroller_create(parent);
570 retv_if(!group_scroller, NULL);
572 EINA_LIST_FOREACH(list, l, group_info) {
573 Evas_Object *item_group = item_create_group(group_scroller
576 scroller_append_item(group_scroller, item_group);
579 return group_scroller;
582 static void _destroy_group_scroller(Evas_Object *group_scroller)
584 Evas_Object *box = NULL;
585 Evas_Object *item = NULL;
586 Eina_List *list = NULL;
588 ret_if(!group_scroller);
590 box = elm_object_content_get(group_scroller);
593 list = elm_box_children_get(box);
596 EINA_LIST_FREE(list, item) {
597 evas_object_del(item);
600 evas_object_del(box);
601 evas_object_del(group_scroller);
604 Evas_Object *main_view_create(Evas_Object *parent, moment_info_s *moment_info)
606 main_view_s *main_view_info = NULL;
608 char full_path[PATH_LEN] = {0, };
610 retv_if(!parent, NULL);
612 path = app_get_resource_path();
613 retv_if(!path, NULL);
615 snprintf(full_path, sizeof(full_path), "%s/edje/%s", path, MAIN_VIEW_EDJE);
618 _D("main_view is created with %s", full_path);
620 main_view_info = calloc(1, sizeof(main_view_s));
621 retv_if(!main_view_info, NULL);
622 main_view_info->moment_info = moment_info;
624 main_view_info->main_view = create_momentic_layout(parent, full_path);
625 if (!main_view_info->main_view) {
626 free(main_view_info);
630 elm_layout_file_set(main_view_info->main_view, full_path, "main");
631 evas_object_size_hint_weight_set(main_view_info->main_view, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
632 evas_object_size_hint_align_set(main_view_info->main_view, EVAS_HINT_FILL, EVAS_HINT_FILL);
633 evas_object_show(main_view_info->main_view);
634 evas_object_data_set(main_view_info->main_view, DATA_KEY_INFO, main_view_info);
635 evas_object_event_callback_add(main_view_info->main_view, EVAS_CALLBACK_RESIZE, _resize_cb, "main_view");
637 elm_object_part_text_set(main_view_info->main_view, "title", "No cities");
638 elm_object_part_text_set(main_view_info->main_view, "description", "After you add cities, they will be shown here.");
640 main_view_info->entry = _create_search_entry(main_view_info->main_view, main_view_info);
641 if (main_view_info->entry)
642 elm_object_part_content_set(main_view_info->main_view, "searchbar", main_view_info->entry);
644 main_view_info->result_button = _create_result_button(main_view_info->main_view, main_view_info);
645 if (main_view_info->result_button)
646 elm_object_part_content_set(main_view_info->main_view, "next_btn", main_view_info->result_button);
648 main_view_info->selected_scroller = _create_selected_scroller(main_view_info->main_view);
649 if (main_view_info->selected_scroller)
650 elm_object_part_content_set(main_view_info->main_view, "city_list", main_view_info->selected_scroller);
652 main_view_info->plus_button = _create_plus_button(main_view_info->main_view, main_view_info);
653 if (main_view_info->plus_button)
654 elm_object_part_content_set(main_view_info->main_view, "add_btn", main_view_info->plus_button);
656 main_view_info->predict_scroller = _create_predict_scroller(main_view_info->main_view);
657 if (main_view_info->predict_scroller)
658 elm_object_part_content_set(main_view_info->main_view, "searchlist", main_view_info->predict_scroller);
660 main_view_info->result_scroller = _create_result_scroller(main_view_info->main_view);
661 if (main_view_info->result_scroller)
662 elm_object_part_content_set(main_view_info->main_view, "result_list", main_view_info->result_scroller);
664 main_view_info->group_scroller = _create_group_scroller(main_view_info->main_view, moment_info->group_list, main_view_info);
665 if (main_view_info->group_scroller)
666 evas_object_hide(main_view_info->group_scroller);
667 //elm_object_part_content_set(main_view_info->main_view, "group_scroller", main_view_info->group_scroller);
669 return main_view_info->main_view;
672 void main_view_destroy(Evas_Object *main_view)
674 Evas_Object *button = NULL;
675 main_view_s *main_view_info = NULL;
679 main_view_info = evas_object_data_del(main_view_info->main_view, DATA_KEY_INFO);
680 ret_if(!main_view_info);
682 if (main_view_info->group_scroller)
683 _destroy_group_scroller(main_view_info->group_scroller);
685 if (main_view_info->result_scroller)
686 _destroy_result_scroller(main_view_info->result_scroller);
688 if (main_view_info->predict_scroller)
689 _destroy_predict_scroller(main_view_info->predict_scroller);
691 if (main_view_info->plus_button)
692 _destroy_plus_button(main_view_info->plus_button);
694 if (main_view_info->selected_scroller)
695 _destroy_selected_scroller(main_view_info->selected_scroller);
697 if (main_view_info->result_button)
698 _destroy_result_button(button);
700 if (main_view_info->entry)
701 _destroy_search_entry(main_view_info->entry);
703 free(main_view_info);
705 evas_object_del(main_view);
708 static void _get_best_time(double *timezone, int size, double *start, double *end)
716 *start = timezone[0];
717 *end = timezone[0] + BEST_DURING_TIME;
719 for (; i < size; i++) {
720 double tmp = timezone[i];
723 if (tmp + BEST_DURING_TIME <= *start) {
724 _D("No matched time");
729 *end = tmp + BEST_DURING_TIME;
731 } else if (tmp > *start) {
733 _D("No matched time");
745 static void _reply_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *user_data)
747 _D("Result callback is called");
750 static void _launch_calendar_edit(int start, int end)
752 app_control_h app_control = NULL;
754 struct tm *local_time = NULL;
757 char start_str[PATH_LEN] = {0, };
758 char end_str[PATH_LEN] = {0, };
760 ret = app_control_create(&app_control);
761 ret_if(APP_CONTROL_ERROR_NONE != ret);
763 local_time = localtime(&t);
765 snprintf(start_str, sizeof(start_str), "%4d-%2d-%2d %2d:%2d:%2d"
766 , local_time->tm_year + 1900
767 , local_time->tm_mon + 1
768 , local_time->tm_mday
773 snprintf(start_str, sizeof(start_str), "%4d-%2d-%2d %2d:%2d:%2d"
774 , local_time->tm_year + 1900
775 , local_time->tm_mon + 1
776 , local_time->tm_mday
781 app_control_set_app_id(app_control, "com.samsung.calendar-lite-edit");
782 app_control_set_operation(app_control, "http://tizen.org/appcontrol/operation/edit");
783 app_control_add_extra_data(app_control, "start_time", start_str);
784 app_control_add_extra_data(app_control, "end_time", end_str);
786 app_control_send_launch_request(app_control, _reply_cb, NULL);
787 app_control_destroy(app_control);