Tizen 2.1 release
[platform/core/uifw/e17.git] / src / modules / wizard / e_wizard.c
1 #include "e.h"
2 #include "e_mod_main.h"
3
4 static void     _e_wizard_next_eval(void);
5 static E_Popup *_e_wizard_main_new(E_Zone *zone);
6 static E_Popup *_e_wizard_extra_new(E_Zone *zone);
7 static void     _e_wizard_cb_key_down(void *data, Evas *e, Evas_Object *obj, void *event);
8 static void     _e_wizard_cb_next(void *data, Evas_Object *obj, const char *emission, const char *source);
9
10 static E_Popup *pop = NULL;
11 static Eina_List *pops = NULL;
12 static Evas_Object *o_bg = NULL;
13 static Evas_Object *o_content = NULL;
14 static Eina_List *pages = NULL;
15 static E_Wizard_Page *curpage = NULL;
16 static int next_ok = 1;
17 static int next_can = 0;
18 static int next_prev = 0;
19
20 EAPI int
21 e_wizard_init(void)
22 {
23    E_Manager *man;
24    Eina_List *l;
25
26    EINA_LIST_FOREACH(e_manager_list(), l, man)
27      {
28         E_Container *con;
29         Eina_List *l2;
30
31         EINA_LIST_FOREACH(man->containers, l2, con)
32           {
33              Eina_List *l3;
34              E_Zone *zone;
35
36              EINA_LIST_FOREACH(con->zones, l3, zone)
37                {
38                   if (!pop)
39                     pop = _e_wizard_main_new(zone);
40                   else
41                     pops = eina_list_append(pops, _e_wizard_extra_new(zone));
42                }
43           }
44      }
45    return 1;
46 }
47
48 EAPI int
49 e_wizard_shutdown(void)
50 {
51    E_Wizard_Page *pg;
52    E_Object *eo;
53
54    if (pop)
55      {
56         e_object_del(E_OBJECT(pop));
57         pop = NULL;
58      }
59
60    EINA_LIST_FREE(pops, eo)
61      e_object_del(eo);
62    EINA_LIST_FREE(pages, pg)
63      e_wizard_page_del(pg);
64    return 1;
65 }
66
67 EAPI void
68 e_wizard_go(void)
69 {
70    if (!curpage)
71      {
72         if (pages)
73           {
74              curpage = pages->data;
75              if (pages->next) next_can = 1;
76           }
77      }
78    if (curpage)
79      {
80         if ((!curpage->data) && (curpage->init)) curpage->init(curpage);
81         _e_wizard_next_eval();
82         if ((curpage->show) && (!curpage->show(curpage)))
83           {
84              e_wizard_next();
85           }
86      }
87 }
88
89 EAPI void
90 e_wizard_apply(void)
91 {
92    Eina_List *l;
93
94    for (l = pages; l; l = l->next)
95      {
96         E_Wizard_Page *pg;
97
98         pg = l->data;
99         if (pg->apply) pg->apply(pg);
100      }
101 }
102
103 EAPI void
104 e_wizard_next(void)
105 {
106    E_Wizard_Page *page;
107    Eina_List *l;
108
109    EINA_LIST_FOREACH(pages, l, page)
110      {
111         if (page == curpage)
112           {
113              if (eina_list_next(l))
114                {
115                   if (curpage)
116                     {
117                        if (curpage->hide)
118                          curpage->hide(curpage);
119                     }
120                   curpage = eina_list_data_get(eina_list_next(l));
121                   if (!curpage->data)
122                     {
123                        if (curpage->init)
124                          curpage->init(curpage);
125                     }
126                   next_can = 1;
127                   _e_wizard_next_eval();
128                   if ((curpage->show) && (curpage->show(curpage)))
129                     {
130                        break;
131                     }
132                }
133              else
134                {
135                   /* FINISH */
136                   e_wizard_apply();
137                   e_wizard_shutdown();
138                   return;
139                }
140           }
141      }
142 }
143
144 EAPI void
145 e_wizard_page_show(Evas_Object *obj)
146 {
147    if (o_content) evas_object_del(o_content);
148    o_content = obj;
149    if (obj)
150      {
151         Evas_Coord minw, minh;
152
153         e_widget_size_min_get(obj, &minw, &minh);
154         edje_extern_object_min_size_set(obj, minw, minh);
155         edje_object_part_swallow(o_bg, "e.swallow.content", obj);
156         evas_object_show(obj);
157         e_widget_focus_set(obj, 1);
158         edje_object_signal_emit(o_bg, "e,action,page,new", "e");
159      }
160 }
161
162 EAPI E_Wizard_Page *
163 e_wizard_page_add(void *handle,
164                   int (*init_cb)(E_Wizard_Page *pg),
165                   int (*shutdown_cb)(E_Wizard_Page *pg),
166                   int (*show_cb)(E_Wizard_Page *pg),
167                   int (*hide_cb)(E_Wizard_Page *pg),
168                   int (*apply_cb)(E_Wizard_Page *pg)
169                   )
170 {
171    E_Wizard_Page *pg;
172
173    pg = E_NEW(E_Wizard_Page, 1);
174    if (!pg) return NULL;
175
176    pg->handle = handle;
177    pg->evas = pop->evas;
178
179    pg->init = init_cb;
180    pg->shutdown = shutdown_cb;
181    pg->show = show_cb;
182    pg->hide = hide_cb;
183    pg->apply = apply_cb;
184
185    pages = eina_list_append(pages, pg);
186
187    return pg;
188 }
189
190 EAPI void
191 e_wizard_page_del(E_Wizard_Page *pg)
192 {
193 // rare thing.. if we do e_wizard_next() from a page and we end up finishing
194 // ther page seq.. we cant REALLY dlclose... not a problem as wizard runs
195 // once only then e restarts itself with final wizard page
196 //   if (pg->handle) dlclose(pg->handle);
197    pages = eina_list_remove(pages, pg);
198    free(pg);
199 }
200
201 EAPI void
202 e_wizard_button_next_enable_set(int enable)
203 {
204    next_ok = enable;
205    _e_wizard_next_eval();
206 }
207
208 EAPI void
209 e_wizard_title_set(const char *title)
210 {
211    edje_object_part_text_set(o_bg, "e.text.title", title);
212 }
213
214 EAPI void
215 e_wizard_labels_update(void)
216 {
217    edje_object_part_text_set(o_bg, "e.text.label", _("Next"));
218 }
219
220 EAPI const char *
221 e_wizard_dir_get(void)
222 {
223    return e_module_dir_get(wiz_module);
224 }
225
226 static void
227 _e_wizard_next_eval(void)
228 {
229    int ok;
230
231    ok = next_can;
232    if (!next_ok) ok = 0;
233    if (next_prev != ok)
234      {
235         if (ok) edje_object_signal_emit(o_bg, "e,state,next,enable", "e");
236         else edje_object_signal_emit(o_bg, "e,state,next,disable", "e");
237         next_prev = ok;
238      }
239 }
240
241 static E_Popup *
242 _e_wizard_main_new(E_Zone *zone)
243 {
244    E_Popup *popup;
245    Evas_Object *o;
246    Evas_Modifier_Mask mask;
247    Eina_Bool kg;
248
249    popup = e_popup_new(zone, 0, 0, zone->w, zone->h);
250    e_popup_layer_set(popup, 350);
251    o = edje_object_add(popup->evas);
252
253    e_theme_edje_object_set(o, "base/theme/wizard", "e/wizard/main");
254    evas_object_move(o, 0, 0);
255    evas_object_resize(o, zone->w, zone->h);
256    evas_object_show(o);
257    edje_object_signal_callback_add(o, "e,action,next", "",
258                                    _e_wizard_cb_next, popup);
259    o_bg = o;
260
261    o = evas_object_rectangle_add(popup->evas);
262    mask = 0;
263    kg = evas_object_key_grab(o, "Tab", mask, ~mask, 0);
264    if (!kg)
265      fprintf(stderr, "ERROR: unable to redirect \"Tab\" key events to object %p.\n", o);
266    mask = evas_key_modifier_mask_get(popup->evas, "Shift");
267    kg = evas_object_key_grab(o, "Tab", mask, ~mask, 0);
268    if (!kg)
269      fprintf(stderr, "ERROR: unable to redirect \"Tab\" key events to object %p.\n", o);
270    mask = 0;
271    kg = evas_object_key_grab(o, "Return", mask, ~mask, 0);
272    if (!kg)
273      fprintf(stderr, "ERROR: unable to redirect \"Return\" key events to object %p.\n", o);
274    mask = 0;
275    kg = evas_object_key_grab(o, "KP_Enter", mask, ~mask, 0);
276    if (!kg)
277      fprintf(stderr, "ERROR: unable to redirect \"KP_Enter\" key events to object %p.\n", o);
278    evas_object_event_callback_add(o, EVAS_CALLBACK_KEY_DOWN,
279                                   _e_wizard_cb_key_down, popup);
280
281    /* set up next/prev buttons */
282    edje_object_part_text_set(o_bg, "e.text.title", _("Welcome to Enlightenment"));
283    edje_object_signal_emit(o_bg, "e,state,next,disable", "e");
284    e_wizard_labels_update();
285
286    e_popup_edje_bg_object_set(popup, o_bg);
287    e_popup_show(popup);
288    if (!e_grabinput_get(ecore_evas_software_x11_window_get(popup->ecore_evas),
289                         1, ecore_evas_software_x11_window_get(popup->ecore_evas)))
290      {
291         e_object_del(E_OBJECT(popup));
292         popup = NULL;
293      }
294    return popup;
295 }
296
297 static E_Popup *
298 _e_wizard_extra_new(E_Zone *zone)
299 {
300    E_Popup *popup;
301    Evas_Object *o;
302
303    popup = e_popup_new(zone, 0, 0, zone->w, zone->h);
304    e_popup_layer_set(popup, 350);
305    o = edje_object_add(popup->evas);
306    e_theme_edje_object_set(o, "base/theme/wizard", "e/wizard/extra");
307    evas_object_move(o, 0, 0);
308    evas_object_resize(o, zone->w, zone->h);
309    evas_object_show(o);
310    e_popup_edje_bg_object_set(popup, o);
311    e_popup_show(popup);
312    return popup;
313 }
314
315 static void
316 _e_wizard_cb_key_down(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event)
317 {
318    Evas_Event_Key_Down *ev;
319
320    ev = event;
321    if (!o_content) return;
322    if (!strcmp(ev->keyname, "Tab"))
323      {
324         if (evas_key_modifier_is_set(ev->modifiers, "Shift"))
325           e_widget_focus_jump(o_content, 0);
326         else
327           e_widget_focus_jump(o_content, 1);
328      }
329    else if (((!strcmp(ev->keyname, "Return")) ||
330              (!strcmp(ev->keyname, "KP_Enter")) ||
331              (!strcmp(ev->keyname, "space"))))
332      {
333         Evas_Object *o;
334
335         o = e_widget_focused_object_get(o_content);
336         if (o) e_widget_activate(o);
337      }
338 }
339
340 static void
341 _e_wizard_cb_next(void *data __UNUSED__, Evas_Object *obj __UNUSED__, const char *emission __UNUSED__, const char *source __UNUSED__)
342 {
343    e_wizard_next();
344 }
345