Turkey version : resolve some bugs(search without checking cases, remove unnecessary...
[apps/native/sample/adventure.git] / src / main_view.c
index b8cca81..d4153e0 100644 (file)
@@ -1,6 +1,7 @@
 #include <Elementary.h>
 #include <time.h>
 #include <app_control.h>
+#include <notification.h>
 
 #include "main.h"
 #include "main_view.h"
@@ -64,6 +65,29 @@ static void _clean_searchlist(Evas_Object *searchlist)
        }
 }
 
+static char *_strcasestr(char *str1, char *str2)
+{
+        int len1 = 0, len2 = 0;
+
+        retv_if(!str1, NULL);
+        retv_if(!str2, NULL);
+
+        len1 = strlen(str1);
+        retv_if(!len1, NULL);
+
+        len2 = strlen(str2);
+        retv_if(!len2, NULL);
+
+        while (*str1) {
+                if (!strncasecmp(str1, str2, len2))
+                        return str1;
+                str1++;
+        }
+
+        return NULL;
+}
+
+
 static void _update_searchlist(Evas_Object *searchlist, const char *str, main_view_s *main_view_info)
 {
        Evas_Object *predict_item = NULL;
@@ -86,9 +110,9 @@ static void _update_searchlist(Evas_Object *searchlist, const char *str, main_vi
 
        for (; i < CITY_SYDNEY; i++) {
                int matched = 0;
-               if (city_info[i].name && str && strstr(city_info[i].name, str))
+               if (city_info[i].name && str && _strcasestr(city_info[i].name, str))
                        matched = 1;
-               else if (city_info[i].nation && str && strstr(city_info[i].nation, str))
+               else if (city_info[i].nation && str && _strcasestr(city_info[i].nation, str))
                        matched = 1;
 
                if (matched) {
@@ -226,8 +250,8 @@ static Evas_Object *_create_searchbar(Evas_Object *parent, main_view_s *main_vie
        elm_entry_single_line_set(entry_obj, EINA_TRUE);
        /* This makes the text upper */
        elm_entry_scrollable_set(entry_obj, EINA_FALSE);
-       //elm_entry_cnp_mode_set(entry_obj, ELM_CNP_MODE_PLAINTEXT);
        elm_entry_text_style_user_push(entry_obj, "DEFAULT='font_size=20'");
+       elm_entry_context_menu_disabled_set(entry_obj, EINA_TRUE);
        elm_object_part_text_set(entry_obj, "elm.guide", "<font_size=20>Search</font_size>");
 
        evas_object_size_hint_weight_set(entry_obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
@@ -256,7 +280,7 @@ static void _destroy_searchbar(Evas_Object *searchbar)
        evas_object_del(searchbar);
 }
 
-static void _set_time_range(Evas_Object *item, int i, int base_city, int cur_city)
+static void _set_time_range(Evas_Object *item, int i, int base_city, int cur_city, double *matched_start, double *matched_end)
 {
        double start1 = 0.0f;
        double end1 = 0.0f;
@@ -265,18 +289,37 @@ static void _set_time_range(Evas_Object *item, int i, int base_city, int cur_cit
 
        city_s *city_info = NULL;
 
-       int start = 0;
-       int end = 0;
+       double start = 0;
+       double end = 0;
+       double half = 0.0f;
+
+       int tmp = 0;
 
        city_info = city_get();
        ret_if(!city_info);
 
-       start = (int) city_info[cur_city].timezone - city_info[base_city].timezone + (double) BEST_START_TIME;
+       start = city_info[cur_city].timezone - city_info[base_city].timezone + (double) BEST_START_TIME;
 
-       if (start < 0)
-               start += 24;
+       if (start < 0.0f)
+               start += 24.0f;
 
-       start %= 24;
+       if (matched_start && matched_end) {
+               /* This end is only for the matched end */
+               end = start + BEST_DURING_TIME;
+               if (*matched_start < (double) start)
+                       *matched_start = (double) start;
+
+               if (*matched_end > (double) end)
+                       *matched_end = end;
+       }
+
+       tmp = start;
+       if (tmp != start) half = 0.5f;
+       else half = 0.0f;
+
+       tmp %= 24;
+
+       start = ((double) tmp) + half;
        end = start + BEST_DURING_TIME;
 
        if (end > 24.0f) {
@@ -284,13 +327,18 @@ static void _set_time_range(Evas_Object *item, int i, int base_city, int cur_cit
                end1 = 24.0f;
 
                start2 = 0.0f;
-               end2 = (double) (end % 24);
+
+               tmp = end;
+               if (tmp != end) half = 0.5f;
+               else half = 0.0f;
+
+               end2 = (double) (tmp % 24) + half;
        } else {
                start1 = (double) start;
                end1 = (double) end;
        }
 
-       _D("O, %s %f:%f:%f:%f", city_info[cur_city].name, start1, end1, start2, end2);
+       _D("HELLO, %s %f:%f:%f:%f", city_info[cur_city].name, start1, end1, start2, end2);
 
        if (set_time_range(item, i, start1, end1, start2, end2) == EINA_FALSE)
                _E("cannot set time range");
@@ -303,7 +351,7 @@ typedef struct part_info
 } part_info_s;
 
 
-static void _click_next_btn_cb(void *data, Evas_Object *obj, void *event_info)
+void main_view_click_next_btn_cb(void *data, Evas_Object *obj, void *event_info)
 {
        main_view_s *main_view_info = data;
        Evas_Object *box = NULL;
@@ -316,6 +364,9 @@ static void _click_next_btn_cb(void *data, Evas_Object *obj, void *event_info)
        int cur_timezone = 0;
        int base_city = 0;
 
+       double matched_start = 0.0f;
+       double matched_end = 100.0f; /* We have to initialize this variable as 100.0f */
+
        ret_if(!main_view_info);
        ret_if(!main_view_info->city_list);
 
@@ -341,75 +392,86 @@ static void _click_next_btn_cb(void *data, Evas_Object *obj, void *event_info)
                continue_if(!selecting_info);
 
                elm_object_signal_emit(item, "momentic,item,state,result", "");
-               elm_object_part_content_set(item, "time", "");
+               elm_object_part_text_set(item, "time", "");
 
                if (!base_city) {
                        base_city = selecting_info->city;
-                       _set_time_range(item, selecting_info->color, base_city, base_city);
+                       _set_time_range(item, selecting_info->color, base_city, base_city, &matched_start, &matched_end);
                        continue;
                } else
-                       _set_time_range(item, selecting_info->color, base_city, selecting_info->city);
+                       _set_time_range(item, selecting_info->color, base_city, selecting_info->city, &matched_start, &matched_end);
+       }
 
-#if 0
-               selecting_info_s *selecting_info = NULL;
-               int start = 0, end = 0;
-               int tmp_timezone = 0;
+       _D("HELLO, match!! %f, %f", matched_start, matched_end);
+       item = item_create_best_time(main_view_info->city_list, matched_start, matched_end);
+       if (item) {
+               elm_object_signal_emit(item, "momentic,item,state,show", "");
+               scroller_append_item(main_view_info->city_list, item);
+       } else
+               _E("cannot append an item");
 
-               selecting_info = evas_object_data_get(item, DATA_KEY_SELECTING);
+       elm_object_signal_emit(main_view_info->main_view, "momentic,state,page2", "");
+       cur_page = 2;
+}
+
+void main_view_go_result(void *data)
+{
+       main_view_s *main_view_info = data;
+       Evas_Object *box = NULL;
+       Evas_Object *item = NULL;
+       Eina_List *list = NULL;
+       struct tm *global_time = NULL;
+       struct tm *local_time = NULL;
+       time_t t;
+       city_s *city_info = NULL;
+       int cur_timezone = 0;
+       int base_city = 0;
+
+       double matched_start = 0.0f;
+       double matched_end = 100.0f; /* We have to initialize this variable as 100.0f */
+
+       ret_if(!main_view_info);
+       ret_if(!main_view_info->city_list);
+
+       city_info = city_get();
+       ret_if(!city_info);
+
+       time(&t);
+       global_time = gmtime(&t);
+       local_time = localtime(&t);
+
+       cur_timezone = (int) local_time->tm_gmtoff / 3600l;
+
+       box = elm_object_content_get(main_view_info->city_list);
+       ret_if(!box);
+
+       list = elm_box_children_get(box);
+       ret_if(!list);
+
+       EINA_LIST_FREE(list, item) {
+               selecting_info_s *selecting_info = evas_object_data_get(item, DATA_KEY_SELECTING);
                continue_if(!selecting_info);
 
-               tmp_timezone = city_info[selecting_info->city].timezone;
-               if (tmp_timezone < cur_timezone)
-                       tmp_timezone += 24;
+               elm_object_signal_emit(item, "momentic,item,state,result", "");
+               elm_object_part_text_set(item, "time", "");
 
-               start = tmp_timezone - cur_timezone + BEST_START_TIME;
-               end = (start + (BEST_END_TIME - BEST_START_TIME)) % 24;
-#endif
+               if (!base_city) {
+                       base_city = selecting_info->city;
+                       _set_time_range(item, selecting_info->color, base_city, base_city, &matched_start, &matched_end);
+                       continue;
+               } else
+                       _set_time_range(item, selecting_info->color, base_city, selecting_info->city, &matched_start, &matched_end);
        }
 
-       item = item_create_best_time(main_view_info->city_list);
+       _D("HELLO, match!! %f, %f", matched_start, matched_end);
+       item = item_create_best_time(main_view_info->city_list, matched_start, matched_end);
        if (item) {
                elm_object_signal_emit(item, "momentic,item,state,show", "");
                scroller_append_item(main_view_info->city_list, item);
-#if 0
-        //decide best time range
-               list = elm_box_children_get(box);
-               double r1 = 0, r2 = 24, r3 = 0, r4 = 24;
-               Eina_Bool best_time = EINA_TRUE;
-           Evas_Object *it;    
-               EINA_LIST_FREE(list, it) {
-                 Evas_Object *rect1 = evas_object_data_get(it, "part1");
-                 Evas_Object *rect2 = evas_object_data_get(it, "part2");
-
-                 if (rect1)
-                 {
-                         part_info_s *pi = evas_object_data_get(rect1, "part_info");
-                         if ((pi->p1 * 24) > r1) r1 = pi->p1 * 24;
-                         else best_time = EINA_FALSE;
-                         if ((pi->p2 * 24) < r2) r2 = pi->p2 * 24;
-                         else best_time = EINA_FALSE;
-                 }
-
-                 if (rect2)
-                 {
-                         part_info_s *pi = evas_object_data_get(rect2, "part_info");
-                         if ((pi->p1 *24) > r1) r1 = pi->p1 * 24;
-                         else best_time = EINA_FALSE;
-                         if ((pi->p2 *24) < r2) r2 = pi->p2 * 24;
-                         else best_time = EINA_FALSE;
-                 }
-               }
-
-               if (best_time){
-_D("AQAAA %f %f %f %f", r1, r2, r3, r4);
-          set_time_range(item, 5, r1, r2, r3, r4);
-               }
-#endif
        } else
                _E("cannot append an item");
 
-       elm_object_signal_emit(main_view_info->main_view, "momentic,state,page2", "");
-       cur_page = 2;
+       cur_page = 4;
 }
 
 static Evas_Object *_create_next_btn(Evas_Object *parent, main_view_s *main_view_info)
@@ -430,7 +492,7 @@ static Evas_Object *_create_next_btn(Evas_Object *parent, main_view_s *main_view
        next_btn = elm_button_add(parent);
        retv_if(!next_btn, NULL);
        elm_object_style_set(next_btn, "transparent");
-       evas_object_smart_callback_add(next_btn, "clicked", _click_next_btn_cb, main_view_info);
+       evas_object_smart_callback_add(next_btn, "clicked", main_view_click_next_btn_cb, main_view_info);
 
        icon = elm_image_add(next_btn);
        if (icon) {
@@ -449,7 +511,40 @@ static void _destroy_next_btn(Evas_Object *next_btn)
        evas_object_del(next_btn);
 }
 
-static Evas_Object *_create_city_list(Evas_Object *parent)
+static void _append_here_to_city_list(Evas_Object *city_list, main_view_s *main_view_info)
+{
+       Evas_Object *item = NULL;
+       struct tm *local_time = NULL;
+       city_s *city_info = NULL;
+       time_t t;
+       int i = 0;
+
+       city_info = city_get();
+       ret_if(!city_info);
+
+       time(&t);
+       local_time = localtime(&t);
+
+       for (i = 0; i < CITY_SYDNEY; i++) {
+               if (city_info[i].timezone == ((double) (local_time->tm_gmtoff / 3600l)))
+                       break;
+       }
+
+       item = item_create_selecting(city_list, i, local_time, main_view_info);
+       if (item)
+               scroller_append_item(city_list, item);
+}
+
+static Eina_Bool
+_append_here_city_anim_cb(void *data)
+{
+       main_view_s *main_view_info = data;
+
+       _append_here_to_city_list(main_view_info->city_list, main_view_info);
+       return ECORE_CALLBACK_CANCEL;
+}
+
+static Evas_Object *_create_city_list(Evas_Object *parent, main_view_s *main_view_info)
 {
        Evas_Object *city_list = NULL;
 
@@ -458,6 +553,8 @@ static Evas_Object *_create_city_list(Evas_Object *parent)
        city_list = scroller_create(parent);
        retv_if(!city_list, NULL);
 
+       ecore_timer_add(1, _append_here_city_anim_cb, main_view_info);
+
        return city_list;
 }
 
@@ -483,7 +580,7 @@ static void _destroy_city_list(Evas_Object *city_list)
        evas_object_del(city_list);
 }
 
-static void _click_add_btn_cb(void *data, Evas_Object *obj, void *event_info)
+void main_view_click_add_btn_cb(void *data, Evas_Object *obj, void *event_info)
 {
        main_view_s *main_view_info = data;
 
@@ -493,7 +590,6 @@ static void _click_add_btn_cb(void *data, Evas_Object *obj, void *event_info)
        ret_if(!main_view_info->main_view);
 
        elm_object_signal_emit(main_view_info->main_view, "momentic,state,page1", "");
-       cur_page = 1;
 }
 
 static void _page1_done_cb(void *data, Evas_Object *obj, const char *signal, const char *source)
@@ -519,7 +615,7 @@ static Evas_Object *_create_add_btn(Evas_Object *parent, main_view_s *main_view_
        add_btn = elm_button_add(parent);
        retv_if(!add_btn, NULL);
        elm_object_style_set(add_btn, "transparent");
-       evas_object_smart_callback_add(add_btn, "clicked", _click_add_btn_cb, main_view_info);
+       evas_object_smart_callback_add(add_btn, "clicked", main_view_click_add_btn_cb, main_view_info);
 
        icon = elm_image_add(add_btn);
        if (icon) {
@@ -546,63 +642,132 @@ static void _click_save_button_cb(void *data, Evas_Object *obj, void *event_info
        Evas_Object *item = NULL;
        Eina_List *list = NULL;
        group_info_s *group_info = NULL;
-       int city[MAXIMUM_SELECTED_CITY] = {0, };
+       //int city[MAXIMUM_SELECTED_CITY] = {0, };
+       int city[5] = {0, }; /* FIXME : for compatibility */
        int i = 0;
-       long time = 0l;
+       char group_title[PATH_LEN] = {0, };
+       city_s *city_info = NULL;
+       char message[PATH_LEN] = {0, };
+
+       city_info = city_get();
+       ret_if(!city_info);
 
        _D("Save button is clicked");
 
        ret_if(!main_view_info);
-       ret_if(!main_view_info->result_list);
 
-       box = elm_object_content_get(main_view_info->result_list);
+       box = elm_object_content_get(main_view_info->city_list);
        ret_if(!box);
 
        list = elm_box_children_get(box);
        ret_if(!list);
 
        EINA_LIST_FREE(list, item) {
-               result_info_s *result_info = NULL;
+               selecting_info_s *selecting_info = NULL;
 
-               result_info = evas_object_data_get(item, DATA_KEY_RESULT);
-               continue_if(!result_info);
+               selecting_info = evas_object_data_get(item, DATA_KEY_SELECTING);
+               break_if(!selecting_info);
+
+               if (i != 0) 
+                       strcat(group_title, ", ");
 
-               city[i] = result_info->city;
+               city[i] = selecting_info->city;
+       _D("HELLO, city[%d] - %d", i, selecting_info->city);
+               strcat(group_title, city_info[city[i]].name);
                i++;
        }
 
-       time = db_insert_group(moment_info->db
-                       , "Momentic time"
+       int id = db_insert_group(moment_info->db
+                       , group_title 
                        , city[0] 
                        , city[1]
                        , city[2]
                        , city[3]
                        , city[4]);
-       group_info = group_info_create(time
-                       , "Momentic time"
+       group_info = group_info_create(id
+                       , group_title 
                        , city[0] 
                        , city[1]
                        , city[2]
                        , city[3]
                        , city[4]);
        moment_info->group_list = eina_list_append(moment_info->group_list, group_info);
+
+       Evas_Object *item_group = item_create_group(main_view_info->group_scroller
+                               , group_info
+                               , main_view_info);
+       scroller_append_item(main_view_info->group_scroller, item_group);
+       elm_object_signal_emit(main_view_info->main_view, "momentic,state,drawer,noresult,hide", "");
+
+       snprintf(message, sizeof(message), "Create a group named <br>'%s'", group_title);
+       notification_status_message_post(message);
 }
 
-static Evas_Object *_create_save_button(Evas_Object *parent, moment_info_s *moment_info)
+#if 0
+static void _click_save_button_cb(void *data, Evas_Object *obj, void *event_info)
 {
+       main_view_s *main_view_info = data;
+       elm_object_signal_emit(main_view_info->save_button, "momentic,state,activate", "");
+       elm_object_signal_emit(main_view_info->main_view, "momentic,state,save_group,activate", "");
+}
+
+static void _click_cancel_button_cb(void *data, Evas_Object *obj, void *event_info)
+{
+       main_view_s *main_view_info = data;
+       elm_object_signal_emit(main_view_info->save_button, "momentic,state,deactivate", "");
+       elm_object_signal_emit(main_view_info->main_view, "momentic,state,save_group,deactivate", "");
+}
+#endif
+
+
+static Evas_Object *_create_save_button(Evas_Object *parent, main_view_s *main_view_info)
+{
+       Evas_Object *popup_button = NULL;
        Evas_Object *save_button = NULL;
 
+       char *path = NULL;
+       char full_path[PATH_LEN] = {0, };
+
        retv_if(!parent, NULL);
 
+       path = app_get_resource_path();
+       retv_if(!path, NULL);
+
+       snprintf(full_path, sizeof(full_path), "%s/edje/popup.edj", path);
+       free(path);
+
+       popup_button = elm_layout_add(parent);
+       retv_if(!popup_button, NULL);
+
+       elm_layout_file_set(popup_button, full_path, "save_as_group");
+       evas_object_size_hint_weight_set(popup_button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+       evas_object_size_hint_align_set(popup_button, EVAS_HINT_FILL, EVAS_HINT_FILL);
+       evas_object_show(popup_button);
+
        save_button = elm_button_add(parent);
        retv_if(!save_button, NULL);
+       elm_object_style_set(save_button, "transparent");
+       elm_object_part_content_set(popup_button, "button", save_button);
+       evas_object_smart_callback_add(save_button, "clicked", _click_save_button_cb, main_view_info);
 
-       elm_object_text_set(save_button, "Save");
-       evas_object_size_hint_weight_set(save_button, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
-       evas_object_size_hint_align_set(save_button, EVAS_HINT_FILL, EVAS_HINT_FILL);
-       evas_object_smart_callback_add(save_button, "clicked", _click_save_button_cb, moment_info);
+#if 0
+       Evas_Object *create_button = NULL;
+       Evas_Object *cancel_button = NULL;
+
+       create_button = elm_button_add(parent);
+       retv_if(!create_button, NULL);
+       //elm_object_style_set(create_button, "transparent");
+       elm_object_part_content_set(popup_button, "create_btn", create_button);
+       //evas_object_smart_callback_add(create_button, "clicked", _click_create_button_cb, main_view_info);
+
+       cancel_button = elm_button_add(parent);
+       retv_if(!cancel_button, NULL);
+       //elm_object_style_set(cancel_button, "transparent");
+       elm_object_part_content_set(popup_button, "cancel_btn", cancel_button);
+       evas_object_smart_callback_add(cancel_button, "clicked", _click_cancel_button_cb, main_view_info);
+#endif
 
-       return save_button;
+       return popup_button;
 }
 
 static void _destroy_save_button(Evas_Object *save_button)
@@ -692,11 +857,17 @@ static Evas_Object *_create_group_scroller(Evas_Object *parent, Eina_List *list,
 
        EINA_LIST_FOREACH(list, l, group_info) {
                Evas_Object *item_group = item_create_group(group_scroller
-                               , group_info->title
+                               , group_info
                                , main_view_info);
                scroller_append_item(group_scroller, item_group);
        }
 
+       int count = scroller_count_item(group_scroller);
+       if (count)
+               elm_object_signal_emit(main_view_info->main_view, "momentic,state,drawer,noresult,hide", "");
+       else
+               elm_object_signal_emit(main_view_info->main_view, "momentic,state,drawer,noresult,show", "");
+
        return group_scroller;
 }
 
@@ -730,7 +901,7 @@ static void _main_view_back_cb(void *data, Evas_Object *obj, void *event_info)
 
        time(&cur_t);
 
-       if (prev_t + 1 > cur_t) {
+       if (prev_t + 2 > cur_t) {
                _D("wait a sec to process the back key event");
                return;
        }
@@ -738,18 +909,30 @@ static void _main_view_back_cb(void *data, Evas_Object *obj, void *event_info)
        prev_t = cur_t;
        elm_object_signal_emit(obj, "momentic,state,page,back", "");
        
-       if (1 == cur_page) {
+       switch (cur_page) {
+       Eina_List *list = NULL;
+       Evas_Object *item = NULL;
+       Evas_Object *tmp = NULL;
+       Evas_Object *box = NULL;
+
+       case 0:
+               _D("Page 0 [Initial page] -> Out : elm_win_lower()");
+
+               elm_win_lower(main_view_info->moment_info->win);
+               break;
+       case 1:
+               _D("Page 1 [Entry page] -> Page 0 [Initial page] : Initial city list");
+
                item_reset_color_index();
                scroller_clear_item(main_view_info->city_list);
-
+               _append_here_to_city_list(main_view_info->city_list, main_view_info);
                elm_object_focus_set(main_view_info->searchbar, EINA_FALSE);
                cur_page = 0;
-       } else if (2 == cur_page) {
-               Eina_List *list = NULL;
-               Evas_Object *item = NULL;
-               Evas_Object *tmp = NULL;
-               Evas_Object *box = elm_object_content_get(main_view_info->city_list);
+               break;
+       case 2:
+               _D("Page 2 [Best time page] -> Page 1 [Entry page] : Remove the best item");
 
+               box = elm_object_content_get(main_view_info->city_list);
                ret_if(!box);
 
                list = elm_box_children_get(box);
@@ -757,13 +940,26 @@ static void _main_view_back_cb(void *data, Evas_Object *obj, void *event_info)
 
                EINA_LIST_FREE(list, item) {
                        elm_object_signal_emit(item, "momentic,item,state,default", "");
+                       unset_time_range(item);
                        tmp = item;
                }
+
                scroller_remove_item(main_view_info->city_list, tmp);
                item_destroy_best_time(tmp);
                cur_page = 1;
-       } else if (0 == cur_page) {
-               elm_win_lower(main_view_info->moment_info->win);
+               break;
+       case 4:
+               _D("Page 3 [Best time page] -> Page 0[Initial page]");
+
+               scroller_clear_item(main_view_info->city_list);
+               _append_here_to_city_list(main_view_info->city_list, main_view_info);
+               elm_object_signal_emit(main_view_info->main_view, "load", "");
+               elm_object_signal_emit(main_view_info->main_view, "momentic,state,add_description,show", "");
+               cur_page = 0;
+               break;
+       default:
+               _E("cannot reach here");
+               break;
        }
 }
 
@@ -813,7 +1009,7 @@ Evas_Object *main_view_create(Evas_Object *parent, moment_info_s *moment_info)
        if (main_view_info->next_btn)
                elm_object_part_content_set(main_view_info->main_view, "next_btn", main_view_info->next_btn);
 
-       main_view_info->city_list = _create_city_list(main_view_info->main_view);
+       main_view_info->city_list = _create_city_list(main_view_info->main_view, main_view_info);
        if (main_view_info->city_list)
                elm_object_part_content_set(main_view_info->main_view, "city_list", main_view_info->city_list);
 
@@ -825,10 +1021,15 @@ Evas_Object *main_view_create(Evas_Object *parent, moment_info_s *moment_info)
        if (main_view_info->searchlist)
                elm_object_part_content_set(main_view_info->main_view, "searchlist", main_view_info->searchlist);
 
+       db_list_group(moment_info->db, &moment_info->group_list);
+
        main_view_info->group_scroller = _create_group_scroller(main_view_info->main_view, moment_info->group_list, main_view_info);
        if (main_view_info->group_scroller)
-               evas_object_hide(main_view_info->group_scroller);
-               //elm_object_part_content_set(main_view_info->main_view, "group_scroller", main_view_info->group_scroller);
+               elm_object_part_content_set(main_view_info->main_view, "drawer_content", main_view_info->group_scroller);
+
+       main_view_info->save_button = _create_save_button(main_view_info->main_view, main_view_info);
+       if (main_view_info->save_button)
+               elm_object_part_content_set(main_view_info->main_view, "save_group_btn", main_view_info->save_button);
 
        elm_object_signal_callback_add(main_view_info->main_view, "momentic,page1,done", "", _page1_done_cb, main_view_info->searchbar);
 
@@ -845,6 +1046,9 @@ void main_view_destroy(Evas_Object *main_view)
        main_view_info = evas_object_data_del(main_view_info->main_view, DATA_KEY_INFO);
        ret_if(!main_view_info);
 
+       if (main_view_info->save_button)
+               _destroy_save_button(main_view_info->save_button);
+
        if (main_view_info->group_scroller)
                _destroy_group_scroller(main_view_info->group_scroller);
 
@@ -923,6 +1127,7 @@ static void _launch_calendar_edit(int start, int end)
        ret = app_control_create(&app_control);
        ret_if(APP_CONTROL_ERROR_NONE != ret);
 
+       time(&t);
        local_time = localtime(&t);
 
        snprintf(start_str, sizeof(start_str), "%4d-%2d-%2d %2d:%2d:%2d"