The source code moved from the SPIN with license changed to Flora 1.1
[apps/native/home/homescreen-efl.git] / src / popup.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 "popup.h"
18
19 #include <stdbool.h>
20 #include <Elementary.h>
21
22 #include "homescreen-efl.h"
23 #include "util.h"
24 #include "livebox_all_pages.h"
25 #include "app_icon.h"
26
27 #define EDJE_LAYOUT_PATH "/usr/apps/com.samsung.home-lite/res/edje/popup.edj"
28 #define UNABLE_PART "unable_to_add_items"
29 #define UNABLE_POPUP_TITLE "<align=center>Unable to add</align>"
30 #define SORTED_POPUP "<align=center><font_size=24> Unable to rearrange icons <br> sorted by name (A-Z).</font> </align>"
31
32 #define POPUP_DATA_KEY "cb_data"
33
34 static struct
35 {
36         Evas_Object *opened_popup;
37 } s_info = {
38         .opened_popup = NULL
39 };
40
41 typedef struct _cb_data_t {
42         popup_confirm_cb cb_ok;
43         popup_cancel_cb cb_cancel;
44         void *data;
45 } cb_data_t;
46
47 /*==========================PRIVATE FUNCTIONS DEFINITIONS======================================*/
48 static void __popup_init_two_buttons(Evas_Object *popup, popup_confirm_cb confirm_cb,
49                                 popup_cancel_cb cancel_cb, popup_data_t *p_data, void *cb_data);
50 static void __popup_init_info(Evas_Object *popup, popup_data_t *p_data);
51 /*==========================POPUP CALLBACKS DEFINITIONS========================================*/
52 static void __popup_btn_ok_clicked_cb(void *data, Evas_Object *obj, void *ei);
53 static void __popup_btn_cancel_clicked_cb(void *data, Evas_Object *obj, void *ei);
54
55 /*==========================PUBLIC FUNCTIONS IMPLEMENTATION===================================*/
56 HAPI popup_data_t *popup_create_data(void)
57 {
58         popup_data_t *data = (popup_data_t *) calloc(1, sizeof(popup_data_t));
59         return data;
60 }
61
62 HAPI void popup_data_free(popup_data_t *p_data)
63 {
64         if (!p_data) {
65                 LOGE("[INVALID_PARAM]");
66                 return;
67         }
68
69         if (p_data->popup_title_text)
70                 free(p_data->popup_title_text);
71         if (p_data->popup_content_text)
72                 free(p_data->popup_content_text);
73         if (p_data->popup_confirm_text)
74                 free(p_data->popup_confirm_text);
75         if (p_data->popup_cancel_text)
76                 free(p_data->popup_cancel_text);
77
78         free(p_data);
79 }
80
81 HAPI void popup_show(popup_data_t *p_data, popup_confirm_cb confirm_cb, popup_cancel_cb cancel_cb,
82                                 void *cb_data)
83 {
84         Evas_Object *popup = NULL;
85
86         if (!p_data) {
87                 LOGE("[INVALID_DATA]");
88                 return;
89         }
90
91         popup = elm_popup_add(home_screen_get_win());
92         if (!popup) {
93                 LOGE("[FAILED][elm_popup_add]");
94                 evas_object_del(popup);
95                 popup_data_free(p_data);
96                 return;
97         }
98
99         elm_popup_orient_set(popup, p_data->orientation);
100
101         switch (p_data->type) {
102         case POPUP_TWO_BUTTONS:
103                 __popup_init_two_buttons(popup, confirm_cb, cancel_cb, p_data, cb_data);
104                 break;
105         case POPUP_INFO:
106                 __popup_init_info(popup, p_data);
107         }
108
109         s_info.opened_popup = popup;
110         evas_object_layer_set(popup, EVAS_LAYER_MAX);
111         evas_object_show(popup);
112 }
113
114 HAPI Eina_Bool popup_destroy(void)
115 {
116         if (s_info.opened_popup) {
117                 evas_object_del(s_info.opened_popup);
118                 s_info.opened_popup = NULL;
119                 return EINA_TRUE;
120         }
121
122         return EINA_FALSE;
123 }
124 /*==========================PRIVATE FUNCTIONS IMPLEMENTATION==================================*/
125 static void __popup_init_two_buttons(Evas_Object *popup, popup_confirm_cb confirm_cb,
126                                 popup_cancel_cb cancel_cb, popup_data_t *p_data, void *cb_data)
127 {
128         Evas_Object *btn_ok = NULL;
129         Evas_Object *btn_cancel = NULL;
130         cb_data_t *data = NULL;
131
132         if (!p_data) {
133                 LOGE("[INVALID_PARAM][p_data=NULL]");
134                 return;
135         }
136
137         if (!popup) {
138                 LOGE("[INVALID_PARAM]");
139                 popup_data_free(p_data);
140                 return;
141         }
142
143         data = (cb_data_t *) malloc(sizeof(cb_data_t));
144         if (!data) {
145                 LOGE("[FAILED][malloc]");
146                 popup_data_free(p_data);
147                 return;
148         }
149
150         btn_ok = elm_button_add(popup);
151         if (!btn_ok) {
152                 LOGE("[FAILED][elm_button_add]");
153                 evas_object_del(popup);
154                 popup_data_free(p_data);
155                 free(data);
156                 return;
157         }
158
159         btn_cancel = elm_button_add(popup);
160         if (!btn_cancel) {
161                 LOGE("[FAILED][elm_button_add]");
162                 evas_object_del(popup);
163                 popup_data_free(p_data);
164                 free(data);
165                 return;
166         }
167
168         /*setting popup properties.*/
169         elm_object_part_text_set(popup, "title,text", p_data->popup_title_text);
170         elm_object_part_text_set(popup, "default", p_data->popup_content_text);
171
172         elm_object_part_text_set(btn_ok, "default", p_data->popup_confirm_text);
173         elm_object_part_text_set(btn_cancel, "default", p_data->popup_cancel_text);
174
175         elm_object_part_content_set(popup, "button1", btn_cancel);
176         elm_object_part_content_set(popup, "button2", btn_ok);
177
178         data->cb_cancel = cancel_cb;
179         data->cb_ok = confirm_cb;
180         data->data = cb_data;
181
182         evas_object_smart_callback_add(btn_ok, "clicked", __popup_btn_ok_clicked_cb, data);
183         evas_object_smart_callback_add(btn_cancel, "clicked", __popup_btn_cancel_clicked_cb, data);
184
185         popup_data_free(p_data);
186 }
187
188 static void __popup_init_info(Evas_Object *popup, popup_data_t *p_data)
189 {
190         if (!p_data) {
191                 LOGE("[INVALID_PARAM][p_data=NULL]");
192                 return;
193         }
194
195         if (!popup) {
196                 LOGE("[INVALID_PARAM]");
197                 popup_data_free(p_data);
198                 return;
199         }
200
201         elm_object_style_set(popup, "toast");
202         elm_object_part_text_set(popup, "default", p_data->popup_content_text);
203         elm_popup_timeout_set(popup, p_data->visible_time);
204
205         popup_data_free(p_data);
206 }
207
208 /*==================================POPUP CALLBACKS IMPLEMENTATION============================*/
209 static void __popup_btn_ok_clicked_cb(void *data, Evas_Object *obj, void *ei)
210 {
211         LOGI("__popup_btn_ok_clicked_cb");
212         cb_data_t *cb_data = (cb_data_t *) data;
213
214         if (!cb_data) {
215                 LOGE("[INVALID_CB_DATA]");
216                 return;
217         }
218
219         if (cb_data->cb_ok) cb_data->cb_ok(cb_data->data);
220
221         popup_destroy();
222 }
223
224 static void __popup_btn_cancel_clicked_cb(void *data, Evas_Object *obj, void *ei)
225 {
226         LOGI("__popup_btn_cancel_clicked_cb");
227         cb_data_t *cb_data = (cb_data_t *) data;
228
229         if (!data) {
230                 LOGE("[INVALID_CB_DATA]");
231                 return;
232         }
233
234         if (cb_data->cb_cancel) cb_data->cb_cancel(cb_data->data);
235
236         popup_destroy();
237 }