Fix TC-2372 Dialer crashes when BT phone is offline
[profile/ivi/lemolo.git] / utils / simple-popup.c
1 #ifdef HAVE_CONFIG_H
2 #include "config.h"
3 #endif
4 #include <Elementary.h>
5
6 #include "simple-popup.h"
7 #include "util.h"
8
9 typedef struct _Simple_Popup
10 {
11         Evas_Object *popup;
12         Evas_Object *box;
13         Evas_Object *message;
14         Evas_Object *entry;
15 } Simple_Popup;
16
17 static void _popup_close(void *data, Evas_Object *bt __UNUSED__,
18                                 void *event __UNUSED__)
19 {
20         Evas_Object *popup = data;
21         evas_object_del(popup);
22 }
23
24 void simple_popup_title_set(Evas_Object *p, const char *title)
25 {
26         if (title) {
27                 elm_object_part_text_set(p, "elm.text.title", title);
28                 elm_object_signal_emit(p, "show,title", "gui");
29         } else {
30                 elm_object_part_text_set(p, "elm.text.title", "");
31                 elm_object_signal_emit(p, "hide,title", "gui");
32         }
33 }
34
35 static void _simple_popup_message_del(void *data, Evas *e __UNUSED__,
36                                                 Evas_Object *en __UNUSED__,
37                                                 void *einfo __UNUSED__)
38 {
39         Simple_Popup *ctx = data;
40         ctx->message = NULL;
41 }
42
43 static void _simple_popup_entry_del(void *data, Evas *e __UNUSED__,
44                                         Evas_Object *en __UNUSED__,
45                                         void *einfo __UNUSED__)
46 {
47         Simple_Popup *ctx = data;
48         ctx->entry = NULL;
49 }
50
51 static void _simple_popup_reeval_content(Simple_Popup *ctx)
52 {
53         if ((!ctx->message) && (!ctx->entry)) {
54                 elm_object_part_content_unset(ctx->popup,
55                                                 "elm.swallow.content");
56                 elm_object_signal_emit(ctx->popup, "hide,content", "gui");
57                 evas_object_hide(ctx->box);
58                 return;
59         }
60
61         elm_box_unpack_all(ctx->box);
62         if (ctx->message) {
63                 elm_box_pack_end(ctx->box, ctx->message);
64                 evas_object_show(ctx->message);
65         }
66         if (ctx->entry) {
67                 elm_box_pack_end(ctx->box, ctx->entry);
68                 evas_object_show(ctx->entry);
69         }
70
71         elm_object_part_content_set(ctx->popup, "elm.swallow.content",
72                                         ctx->box);
73         elm_object_signal_emit(ctx->popup, "show,content", "gui");
74 }
75
76 void simple_popup_message_set(Evas_Object *p, const char *msg)
77 {
78         Simple_Popup *ctx = evas_object_data_get(p, "simple_popup");
79         Evas_Object *en;
80
81         EINA_SAFETY_ON_NULL_RETURN(ctx);
82
83         if (!msg) {
84                 if (ctx->message)
85                         evas_object_del(ctx->message);
86                 _simple_popup_reeval_content(ctx);
87                 return;
88         }
89
90         if (ctx->message)
91                 en = ctx->message;
92         else {
93                 en = ctx->message = elm_entry_add(p);
94                 elm_object_style_set(en, "dialer-popup");
95                 elm_entry_editable_set(en, EINA_FALSE);
96                 elm_entry_scrollable_set(en, EINA_TRUE);
97                 elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF,
98                                         ELM_SCROLLER_POLICY_AUTO);
99
100                 evas_object_event_callback_add(en, EVAS_CALLBACK_DEL,
101                                         _simple_popup_message_del,
102                                         ctx);
103                 evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND,
104                                                         EVAS_HINT_EXPAND);
105                 evas_object_size_hint_align_set(en, EVAS_HINT_FILL,
106                                                 EVAS_HINT_FILL);
107         }
108
109         elm_object_text_set(en, msg);
110         _simple_popup_reeval_content(ctx);
111 }
112
113 void simple_popup_entry_enable(Evas_Object *p)
114 {
115         Simple_Popup *ctx = evas_object_data_get(p, "simple_popup");
116         Evas_Object *en;
117
118         EINA_SAFETY_ON_NULL_RETURN(ctx);
119
120         if (ctx->entry)
121                 return;
122         en = ctx->entry = elm_entry_add(p);
123         elm_object_style_set(en, "dialer-popup-editable");
124         elm_entry_editable_set(en, EINA_TRUE);
125         elm_entry_scrollable_set(en, EINA_TRUE);
126         elm_scroller_policy_set(en, ELM_SCROLLER_POLICY_OFF,
127                                 ELM_SCROLLER_POLICY_AUTO);
128
129         evas_object_size_hint_weight_set(en, EVAS_HINT_EXPAND,
130                                                 EVAS_HINT_EXPAND);
131         evas_object_size_hint_align_set(en, EVAS_HINT_FILL,
132                                         EVAS_HINT_FILL);
133
134         evas_object_event_callback_add(en, EVAS_CALLBACK_DEL,
135                                         _simple_popup_entry_del,
136                                         ctx);
137         _simple_popup_reeval_content(ctx);
138 }
139
140 void simple_popup_entry_disable(Evas_Object *p)
141 {
142         Simple_Popup *ctx = evas_object_data_get(p, "simple_popup");
143         EINA_SAFETY_ON_NULL_RETURN(ctx);
144         if (!ctx->entry)
145                 return;
146         evas_object_del(ctx->entry);
147         _simple_popup_reeval_content(ctx);
148 }
149
150 const char *simple_popup_entry_get(const Evas_Object *p)
151 {
152         Simple_Popup *ctx = evas_object_data_get(p, "simple_popup");
153         EINA_SAFETY_ON_NULL_RETURN_VAL(ctx, NULL);
154         EINA_SAFETY_ON_NULL_RETURN_VAL(ctx->entry, NULL);
155         return elm_object_text_get(ctx->entry);
156 }
157
158 void simple_popup_button_dismiss_set(Evas_Object *p)
159 {
160         simple_popup_buttons_set(p,
161                                         "Dismiss",
162                                         "dialer",
163                                         _popup_close,
164                                         NULL, NULL, NULL,
165                                         p);
166 }
167
168 void simple_popup_buttons_set(Evas_Object *p,
169                                         const char *b1_label,
170                                         const char *b1_class,
171                                         Evas_Smart_Cb b1_cb,
172                                         const char *b2_label,
173                                         const char *b2_class,
174                                         Evas_Smart_Cb b2_cb,
175                                         const void *data)
176 {
177         Evas_Object *bt;
178         unsigned int count = 0;
179
180         if (b1_label) {
181                 bt = elm_button_add(p);
182                 elm_object_style_set(bt, b1_class ? b1_class : "dialer");
183                 elm_object_text_set(bt, b1_label);
184                 elm_object_part_content_set(p, "elm.swallow.button1", bt);
185                 evas_object_smart_callback_add(bt, "clicked", b1_cb, data);
186                 count++;
187         }
188
189         if (b2_label) {
190                 const char *part;
191                 bt = elm_button_add(p);
192                 elm_object_style_set(bt, b2_class ? b2_class : "dialer");
193                 elm_object_text_set(bt, b2_label);
194
195                 if (count == 1)
196                         part = "elm.swallow.button2";
197                 else
198                         part = "elm.swallow.button1";
199
200                 elm_object_part_content_set(p, part, bt);
201                 evas_object_smart_callback_add(bt, "clicked", b2_cb, data);
202                 count++;
203         }
204
205         if (count == 2)
206                 elm_object_signal_emit(p, "buttons,2", "gui");
207         else if (count == 1) {
208                 elm_object_signal_emit(p, "buttons,1", "gui");
209                 elm_object_part_content_set(p, "elm.swallow.button2", NULL);
210         } else {
211                 elm_object_signal_emit(p, "buttons,0", "gui");
212                 elm_object_part_content_set(p, "elm.swallow.button1", NULL);
213                 elm_object_part_content_set(p, "elm.swallow.button2", NULL);
214         }
215 }
216
217 static void _simple_popup_del(void *data, Evas *e __UNUSED__,
218                                         Evas_Object *o __UNUSED__,
219                                         void *event_info __UNUSED__)
220 {
221         Simple_Popup *ctx = data;
222         free(ctx);
223 }
224
225 Evas_Object *simple_popup_add(Evas_Object *win,
226                                 const char *title, const char *message)
227 {
228         Evas_Object *p = layout_add(win, "popup");
229         Simple_Popup *ctx;
230
231         EINA_SAFETY_ON_NULL_RETURN_VAL(p, NULL);
232
233         ctx = calloc(1, sizeof(Simple_Popup));
234         EINA_SAFETY_ON_NULL_GOTO(ctx, failed_calloc);
235
236         evas_object_data_set(p, "simple_popup", ctx);
237         ctx->popup = p;
238         evas_object_event_callback_add(p, EVAS_CALLBACK_DEL,
239                                         _simple_popup_del, ctx);
240
241         evas_object_size_hint_weight_set(p, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
242         elm_win_resize_object_add(win, p);
243
244         ctx->box = elm_box_add(p);
245
246         simple_popup_title_set(p, title);
247         simple_popup_message_set(p, message);
248         simple_popup_button_dismiss_set(p);
249
250         evas_object_show(p);
251
252         return p;
253
254 failed_calloc:
255         evas_object_del(p);
256         return NULL;
257 }