The source code moved from the SPIN with license changed to Flora 1.1
[apps/native/home/homescreen-efl.git] / src / option_menu.c
1 /*
2  * Copyright 2012  Samsung Electronics Co., Ltd
3  *
4  * Licensed under the Flora License, Version 1.1 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://floralicense.org/license/
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include <Elementary.h>
18
19 #include "option_menu.h"
20 #include "homescreen-efl.h"
21 #include "app_grid.h"
22 #include "all_apps.h"
23
24
25 #include "livebox/livebox_panel.h"
26 #include "util.h"
27 #include "app_icon.h"
28 #include "folder_panel.h"
29 #include "popup.h"
30 #include "data_model.h"
31 #include "layout.h"
32 #include "livebox_all_pages.h"
33
34 static struct {
35         Evas_Object *option_menu;
36         Evas_Object *option_menu_background;
37         bool is_visible;
38 } s_info;
39
40 /*Create the background with the clicked callback under the menu*/
41 static void __option_menu_create_background(void);
42 static void __option_menu_background_clicked_cb(void *data, Evas *e, Evas_Object *obj, void *event_info);
43 static void __option_menu_dismissed_cb(void *data, Evas_Object *obj, void *event_info);
44
45 /*All Apps callbacks*/
46 static void __option_menu_entry_all_apps_edit_apps_cb(void *data, Evas_Object *obj, void *event_info);
47 static void __option_menu_entry_all_apps_create_folder_cb(void *data, Evas_Object *obj, void *event_info);
48
49 /*Home callback*/
50 static void __option_menu_entry_all_apps_edit_home_cb(void *data, Evas_Object *obj, void *event_info);
51
52 /*Wallpapers callbacks*/
53 static void __option_menu_entry_all_apps_wallpaper_cb(void *data, Evas_Object *obj, void *event_info);
54
55 /*Add widget*/
56 static void __option_menu_entry_all_apps_add_widget_cb(void *data, Evas_Object *obj, void *event_info);
57
58 /*View all pages*/
59 static void __option_menu_entry_all_apps_view_all_pages_cb(void *data, Evas_Object *obj, void *event_info);
60
61 static void __option_menu_update_caption_menu_state_update(void);
62
63 HAPI bool option_menu_show(void)
64 {
65         Evas_Object *option_menu = NULL;
66         homescreen_view_t view = home_screen_get_view_type();
67
68         __option_menu_create_background();
69
70         option_menu = elm_ctxpopup_add(home_screen_get_win());
71         if (!option_menu) {
72                 LOGE("Could not create all apps option menu");
73                 evas_object_del(s_info.option_menu_background);
74                 return false;
75         }
76
77         elm_ctxpopup_horizontal_set(option_menu, EINA_FALSE);
78         elm_ctxpopup_direction_priority_set(option_menu, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_DOWN, ELM_CTXPOPUP_DIRECTION_DOWN);
79
80         evas_object_smart_callback_add(option_menu, "dismissed", __option_menu_dismissed_cb, NULL);
81
82         evas_object_layer_set(option_menu, EVAS_LAYER_MAX);
83         evas_object_move(option_menu, 0, home_screen_get_root_height()-(BUTTONS_AREA*home_screen_get_root_height()));
84         evas_object_size_hint_min_set(option_menu, home_screen_get_root_width(), -1);
85
86         if (view == HOMESCREEN_VIEW_HOME) {
87                 elm_ctxpopup_item_append(option_menu, _("IDS_HS_OPT_EDIT"), NULL, __option_menu_entry_all_apps_edit_home_cb, NULL);
88                 elm_ctxpopup_item_append(option_menu, _("IDS_HS_HEADER_ADD_WIDGET"), NULL, __option_menu_entry_all_apps_add_widget_cb, NULL);
89                 elm_ctxpopup_item_append(option_menu, _("IDS_HS_OPT_CHANGE_WALLPAPER_ABB"), NULL, __option_menu_entry_all_apps_wallpaper_cb, NULL);
90                 elm_ctxpopup_item_append(option_menu, _("IDS_HS_OPT_ALL_PAGES"), NULL, __option_menu_entry_all_apps_view_all_pages_cb, NULL);
91         } else if (view == HOMESCREEN_VIEW_HOME_ALL_PAGES) {
92                 LOGD("All pages view type");
93         } else if (view == HOMESCREEN_VIEW_ALL_APPS) {
94                 elm_ctxpopup_item_append(option_menu, _("IDS_HS_OPT_EDIT"), NULL, __option_menu_entry_all_apps_edit_apps_cb, NULL);
95                 elm_ctxpopup_item_append(option_menu, _("IDS_HS_OPT_CREATE_FOLDER_OPT_TTS"), NULL, __option_menu_entry_all_apps_create_folder_cb, NULL);
96
97         } else if (view == HOMESCREEN_VIEW_UNKNOWN) {
98                 LOGD("Unknown view type");
99         } else {
100                 LOGE("Failed to get view type");
101                 return false;
102         }
103
104         evas_object_show(option_menu);
105
106         s_info.is_visible = true;
107         s_info.option_menu = option_menu;
108
109         return true;
110 }
111
112 HAPI void option_menu_hide(void)
113 {
114         if (s_info.option_menu) {
115                 evas_object_hide(s_info.option_menu);
116                 evas_object_del(s_info.option_menu);
117                 s_info.option_menu = NULL;
118         }
119
120         if (s_info.option_menu_background) {
121                 evas_object_hide(s_info.option_menu_background);
122                 evas_object_del(s_info.option_menu_background);
123                 s_info.option_menu_background = NULL;
124         }
125         s_info.is_visible = false;
126 }
127
128 HAPI void option_menu_update_on_item_selected(void)
129 {
130         __option_menu_update_caption_menu_state_update();
131 }
132
133 HAPI void option_menu_change_state_on_hw_menu_key(void)
134 {
135         if (s_info.is_visible) {
136                 option_menu_hide();
137         } else {
138                 option_menu_show();
139         }
140 }
141
142 static void __option_menu_create_background(void)
143 {
144         Evas_Object *background = NULL;
145
146         if (s_info.option_menu_background) {
147                 evas_object_show(s_info.option_menu_background);
148
149                 return;
150         }
151
152         background = evas_object_rectangle_add(evas_object_evas_get(home_screen_get_win()));
153         evas_object_color_set(background, 255, 255, 255, 0);
154         evas_object_size_hint_min_set(background, INDEX_HEIGHT, home_screen_get_root_height());
155         evas_object_size_hint_max_set(background, INDEX_HEIGHT, home_screen_get_root_height());
156         evas_object_resize(background, INDEX_HEIGHT, home_screen_get_root_height());
157         evas_object_show(background);
158
159         evas_object_event_callback_add(background, EVAS_CALLBACK_MOUSE_UP, __option_menu_background_clicked_cb, NULL);
160
161         s_info.option_menu_background = background;
162 }
163
164 static void __option_menu_background_clicked_cb(void *data, Evas *e, Evas_Object *obj, void *event_info)
165 {
166         option_menu_hide();
167 }
168
169 static void __option_menu_dismissed_cb(void *data, Evas_Object *obj, void *event_info)
170 {
171         option_menu_hide();
172 }
173
174 static void __option_menu_entry_all_apps_edit_apps_cb(void *data, Evas_Object *obj, void *event_info)
175 {
176         option_menu_hide();
177         home_screen_set_view_type(HOMESCREEN_VIEW_ALL_APPS_EDIT);
178 }
179
180 static void __option_menu_entry_all_apps_edit_home_cb(void *data, Evas_Object *obj, void *event_info)
181 {
182         home_screen_set_view_type(HOMESCREEN_VIEW_HOME_EDIT);
183         livebox_panel_set_edit_mode_layout(true);
184         livebox_panel_change_edit_mode_state(false);
185         option_menu_hide();
186 }
187
188
189 static void __option_menu_entry_all_apps_create_folder_cb(void *data, Evas_Object *obj, void *event_info)
190 {
191         option_menu_hide();
192         home_screen_set_view_type(HOMESCREEN_VIEW_ALL_APPS_CHOOSE);
193         __option_menu_update_caption_menu_state_update();
194 }
195
196 static void _launch_request_cb(app_control_h request, app_control_h reply, app_control_result_e result, void *data)
197 {
198         switch (result) {
199         case APP_CONTROL_RESULT_CANCELED:
200                 LOGE("[APP_CONTROL_RESULT_CANCELED]");
201                 break;
202         case APP_CONTROL_RESULT_FAILED:
203                 LOGE("[APP_CONTROL_RESULT_FAILED]");
204                 break;
205         case APP_CONTROL_RESULT_SUCCEEDED:
206                 LOGD("[APP_CONTROL_RESULT_SUCCEEDED]");
207                 break;
208         default:
209                 LOGE("UNKNOWN ERROR");
210                 break;
211         }
212 }
213
214 static void __option_menu_entry_all_apps_add_widget_cb(void *data, Evas_Object *obj, void *event_info)
215 {
216         LOGD("__option_menu_entry_all_apps_add_widget_cb");
217
218         const char *appid = OPTION_MENU_ADD_VIEWER;
219         app_control_h app_control_handle = NULL;
220
221         if (app_control_create(&app_control_handle) != APP_CONTROL_ERROR_NONE) {
222                 LOGE("[FAILED][app_control_create]");
223                 return;
224         }
225
226         if (app_control_set_app_id(app_control_handle, appid) != APP_CONTROL_ERROR_NONE) {
227                 LOGE("[FAILED][app_control_set_app_id]");
228                 app_control_destroy(app_control_handle);
229                 return;
230         }
231
232         if (app_control_send_launch_request(app_control_handle, _launch_request_cb, NULL) != APP_CONTROL_ERROR_NONE) {
233                 LOGE("[FAILED][app_control_send_launch_request]");
234                 app_control_destroy(app_control_handle);
235                 return;
236         }
237
238         app_control_destroy(app_control_handle);
239         option_menu_hide();
240 }
241
242 static void __option_menu_entry_all_apps_wallpaper_cb(void *data, Evas_Object *obj, void *event_info)
243 {
244         LOGD("__option_menu_entry_all_apps_wallpaper_cb");
245
246         const char *appid = OPTION_MENU_SETTINGS;
247         app_control_h app_control_handle = NULL;
248
249         if (app_control_create(&app_control_handle) != APP_CONTROL_ERROR_NONE) {
250                 LOGE("[FAILED][app_control_create]");
251                 return;
252         }
253
254         app_control_add_extra_data(app_control_handle, "from", "Homescreen-efl");
255         app_control_add_extra_data(app_control_handle, "popup_type", "selection_popup");
256         app_control_add_extra_data(app_control_handle, "setas-type", "Homescreen");
257
258         if (app_control_set_app_id(app_control_handle, appid) != APP_CONTROL_ERROR_NONE) {
259                 LOGE("[FAILED][app_control_set_app_id]");
260                 app_control_destroy(app_control_handle);
261                 return;
262         }
263
264         if (app_control_send_launch_request(app_control_handle, _launch_request_cb, NULL) != APP_CONTROL_ERROR_NONE) {
265                 LOGE("[FAILED][app_control_send_launch_request]");
266                 app_control_destroy(app_control_handle);
267                 return;
268         }
269
270         app_control_destroy(app_control_handle);
271         option_menu_hide();
272 }
273
274 static void __option_menu_entry_all_apps_view_all_pages_cb(void *data, Evas_Object *obj, void *event_info)
275 {
276         home_screen_set_view_type(HOMESCREEN_VIEW_HOME_ALL_PAGES);
277         option_menu_hide();
278 }
279
280 static void __option_menu_update_caption_menu_state_update(void)
281 {
282         int selected_count = -1;
283         char trbuf[CAPTION_MENU_CENTER_LABEL_TEXT_LEN_MAX];
284         homescreen_view_t view = home_screen_get_view_type();
285
286         switch (view) {
287         case HOMESCREEN_VIEW_HOME:
288                 break;
289         case HOMESCREEN_VIEW_ALL_APPS:
290                 break;
291         case HOMESCREEN_VIEW_ALL_APPS_CHOOSE:
292                 selected_count = data_model_get_app_check_state();
293                 snprintf(trbuf, sizeof(trbuf), _("IDS_MEMO_HEADER_PD_SELECTED_ABB2"), selected_count);
294                 layout_main_caption_set_menu_texts(trbuf,
295                 _("IDS_TPLATFORM_ACBUTTON_CANCEL_ABB"),
296                 _("IDS_TPLATFORM_ACBUTTON_DONE_ABB"));
297                 break;
298         case HOMESCREEN_VIEW_ALL_APPS_EDIT:
299                 layout_main_caption_set_menu_texts(_("IDS_HS_HEADER_EDIT"), "", "");
300                 break;
301         default:
302                 break;
303         }
304 }
305