tizen 2.4 release
[framework/uifw/elementary.git] / src / bin / test_task_switcher.c
1 #ifdef HAVE_CONFIG_H
2 # include "elementary_config.h"
3 #endif
4 #include <Elementary.h>
5 #include <Eina.h>
6
7 #define APPS_COL 0
8 #define VIEWS_COL 1
9 #define PROPS_VIEW_COL 2
10
11 static Evas_Object *table = NULL;
12 static Elm_App_Client *app_selected = NULL;
13 static Eina_List *apps_list = NULL;
14
15 static void _app_view_clicked(void *data, Evas_Object *obj, void *event_info);
16 static void _apps_list_update(void);
17
18 static void _btn_close_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
19 {
20    Elm_App_Client_View *view = data;
21    eo_do(view, elm_app_client_view_close(NULL, NULL));
22 }
23
24 static void _btn_pause_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
25 {
26    Elm_App_Client_View *view = data;
27    eo_do(view, elm_app_client_view_pause(NULL, NULL));
28 }
29
30 static void _btn_resume_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
31 {
32    Elm_App_Client_View *view = data;
33    eo_do(view, elm_app_client_view_resume(NULL, NULL));
34 }
35
36 static Eina_Bool
37 _app_view_prop_changed_cb(void *data EINA_UNUSED, Eo *obj, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
38 {
39    Elm_App_View_State state = ELM_APP_VIEW_STATE_UNKNOWN;
40
41    eo_do(obj, state = elm_app_client_view_state_get());
42
43    if (state == ELM_APP_VIEW_STATE_CLOSED)
44      {
45         Evas_Object *props = elm_table_child_get(table, PROPS_VIEW_COL, 0);
46         elm_table_unpack(table, props);
47         evas_object_del(props);
48      }
49    else
50      _app_view_clicked(obj, NULL, NULL);
51
52    return EINA_TRUE;
53 }
54
55 static void
56 _app_view_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
57 {
58    Elm_App_Client_View *view = data;
59    Evas_Object *view_props, *close_btn, *resume_btn, *pause_btn;
60    const char *title = NULL, *icon = NULL;
61    int new_events = 0, window = 0;
62    unsigned short progress = 0;
63    Elm_App_View_State state = ELM_APP_VIEW_STATE_UNKNOWN;
64    char buffer[1024];
65
66    view_props = elm_table_child_get(table, PROPS_VIEW_COL, 0);
67    if (view_props)
68      {
69         Elm_App_Client_View *old_view;
70
71         old_view = evas_object_data_del(view_props, "view");
72         eo_do(old_view,
73               eo_event_callback_del(ELM_APP_CLIENT_VIEW_EVENT_PROPERTY_CHANGED,
74                                     _app_view_prop_changed_cb, table));
75         elm_list_clear(view_props);
76      }
77    else
78      {
79         view_props = elm_list_add(table);
80         evas_object_size_hint_align_set(view_props, EVAS_HINT_FILL,
81                                         EVAS_HINT_FILL);
82         evas_object_show(view_props);
83         elm_table_pack(table, view_props, PROPS_VIEW_COL, 0, 1, 1);
84      }
85
86    evas_object_data_set(view_props, "view", view);
87
88    eo_do(view, title = elm_app_client_view_title_get(),
89          icon = elm_app_client_view_icon_get(),
90          progress = elm_app_client_view_progress_get(),
91          new_events = elm_app_client_view_new_events_get(),
92          window = elm_app_client_view_window_get(),
93          eo_event_callback_add(ELM_APP_CLIENT_VIEW_EVENT_PROPERTY_CHANGED,
94                                _app_view_prop_changed_cb, table));
95
96    snprintf(buffer, sizeof(buffer), "Title=%s", title);
97    elm_list_item_append(view_props, buffer, NULL, NULL, NULL, NULL);
98
99    snprintf(buffer, sizeof(buffer), "Icon=%s", icon);
100    elm_list_item_append(view_props, buffer, NULL, NULL, NULL, NULL);
101
102    snprintf(buffer, sizeof(buffer), "Progress=%d", progress);
103    elm_list_item_append(view_props, buffer, NULL, NULL, NULL, NULL);
104
105    snprintf(buffer, sizeof(buffer), "New events=%d", new_events);
106    elm_list_item_append(view_props, buffer, NULL, NULL, NULL, NULL);
107
108    snprintf(buffer, sizeof(buffer), "WindowID=%d", window);
109    elm_list_item_append(view_props, buffer, NULL, NULL, NULL, NULL);
110
111    eo_do(view, state = elm_app_client_view_state_get());
112    if (state == ELM_APP_VIEW_STATE_LIVE)
113      snprintf(buffer, sizeof(buffer), "State=alive");
114    else if (state == ELM_APP_VIEW_STATE_PAUSED)
115      snprintf(buffer, sizeof(buffer), "State=paused");
116    else if (state == ELM_APP_VIEW_STATE_CLOSED)
117      snprintf(buffer, sizeof(buffer), "State=closed");
118    else if (state == ELM_APP_VIEW_STATE_SHALLOW)
119      snprintf(buffer, sizeof(buffer), "State=shallow");
120    else
121      snprintf(buffer, sizeof(buffer), "State=unknown");
122    elm_list_item_append(view_props, buffer, NULL, NULL, NULL, NULL);
123
124    close_btn = elm_button_add(view_props);
125    elm_object_text_set(close_btn, "Close view");
126    evas_object_smart_callback_add(close_btn, "clicked", _btn_close_cb, view);
127    elm_list_item_append(view_props, NULL, close_btn, NULL, NULL, NULL);
128
129    pause_btn = elm_button_add(view_props);
130    elm_object_text_set(pause_btn, "Pause view");
131    evas_object_smart_callback_add(pause_btn, "clicked", _btn_pause_cb, view);
132    elm_list_item_append(view_props, NULL, pause_btn, NULL, NULL, NULL );
133
134    resume_btn = elm_button_add(view_props);
135    elm_object_text_set(resume_btn, "Resume view");
136    evas_object_smart_callback_add(resume_btn, "clicked", _btn_resume_cb, view);
137    elm_list_item_append(view_props, NULL, resume_btn, NULL, NULL, NULL );
138
139    elm_list_go(view_props);
140 }
141
142 static void
143 _popup_close_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
144 {
145    evas_object_del(data);
146 }
147
148 static void app_client_view_open_cb(void *data EINA_UNUSED, Elm_App_Client_View *view, const char *error, const char *error_message)
149 {
150    Evas_Object *popup, *btn_ok;
151    char buf[1024];
152
153    popup = elm_popup_add(table);
154
155    if (view)
156      {
157         _app_view_clicked(view, NULL, NULL);
158         return;
159      }
160
161    snprintf(buf, sizeof(buf), "Some error happen opening view: %s %s", error, error_message);
162    elm_object_part_text_set(popup, "default", buf);
163
164    btn_ok = elm_button_add(popup);
165    elm_object_text_set(btn_ok, "Ok");
166    elm_object_part_content_set(popup, "button1", btn_ok);
167    evas_object_smart_callback_add(btn_ok, "clicked", _popup_close_cb, popup);
168
169    elm_popup_orient_set(popup, ELM_POPUP_ORIENT_TOP);
170    evas_object_show(popup);
171 }
172
173 static void _popup_btn_open_view_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
174 {
175    Evas_Object *popup = data;
176    Eina_Value *args = NULL;//TODO fill with args of popup
177    Elm_App_Client *app = evas_object_data_get(popup, "app");
178
179    eo_do(app, elm_app_client_view_open(args, app_client_view_open_cb, NULL));
180
181    evas_object_del(popup);
182 }
183
184 static void
185 _app_view_open(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
186 {
187    Elm_App_Client *app = data;
188    Evas_Object *popup, *btn_open, *btn_cancel, *args_box;
189
190    popup = elm_popup_add(table);
191    elm_object_part_text_set(popup, "title,text", "Open a view");
192
193    btn_open = elm_button_add(popup);
194    elm_object_text_set(btn_open, "Open");
195    elm_object_part_content_set(popup, "button1", btn_open);
196    evas_object_smart_callback_add(btn_open, "clicked", _popup_btn_open_view_cb, popup);
197    evas_object_show(btn_open);
198
199    btn_cancel = elm_button_add(popup);
200    elm_object_text_set(btn_cancel, "Cancel");
201    elm_object_part_content_set(popup, "button2", btn_cancel);
202    evas_object_smart_callback_add(btn_cancel, "clicked", _popup_close_cb, popup);
203    evas_object_show(btn_cancel);
204
205    args_box = elm_box_add(popup);
206    elm_object_part_content_set(popup, "default", args_box);
207    elm_object_part_text_set(popup, "default", "TODO: add some entrys to add some parameters to view.");
208
209    evas_object_data_set(popup, "app", app);
210    elm_popup_orient_set(popup, ELM_POPUP_ORIENT_TOP);
211    evas_object_show(popup);
212 }
213
214 static void _app_close_all_views_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
215 {
216    Elm_App_Client *app = data;
217    eo_do(app, elm_app_client_view_all_close());
218 }
219
220 static void
221 _app_terminate_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
222 {
223    Elm_App_Client *app = data;
224    eo_do(app, elm_app_client_terminate());
225 }
226
227 static void
228 _app_clicked(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
229 {
230    Evas_Object *views, *btn_close_all, *btn_terminate, *btn_open_view;
231    Eina_Iterator *views_iter = NULL;
232    Elm_App_Client_View *client_view;
233    Elm_App_Client *app = data;
234
235    app_selected = app;
236
237    views = elm_table_child_get(table, VIEWS_COL, 0);
238    if (!views)
239      {
240         views = elm_list_add(table);
241         evas_object_size_hint_align_set(views, EVAS_HINT_FILL, EVAS_HINT_FILL);
242         evas_object_show(views);
243         elm_table_pack(table, views, VIEWS_COL, 0, 1, 1);
244      }
245    else
246      elm_list_clear(views);
247
248    btn_open_view = elm_button_add(views);
249    elm_object_text_set(btn_open_view, "Open a view");
250    evas_object_smart_callback_add(btn_open_view, "clicked", _app_view_open, app);
251    elm_list_item_append(views, NULL, btn_open_view, NULL, NULL, NULL);
252
253    eo_do(app, views_iter = elm_app_client_views_get());
254    EINA_ITERATOR_FOREACH(views_iter, client_view)
255      {
256         const char *path = NULL;
257
258         eo_do(client_view, path = elm_app_client_view_path_get());
259         elm_list_item_append(views, path, NULL, NULL, _app_view_clicked, client_view);
260      }
261    eina_iterator_free(views_iter);
262
263    btn_close_all = elm_button_add(views);
264    elm_object_text_set(btn_close_all, "Close all views");
265    evas_object_smart_callback_add(btn_close_all, "clicked", _app_close_all_views_cb, app);
266    elm_list_item_append(views, NULL, btn_close_all, NULL, NULL, NULL);
267
268    btn_terminate = elm_button_add(views);
269    elm_object_text_set(btn_terminate, "Terminate application");
270    evas_object_smart_callback_add(btn_terminate, "clicked", _app_terminate_cb, app);
271    elm_list_item_append(views, NULL, btn_terminate, NULL, NULL, NULL);
272
273    elm_list_go(views);
274 }
275
276 static Eina_Bool
277 _view_list_update_cb(void *data EINA_UNUSED, Eo *obj, const Eo_Event_Description *desc EINA_UNUSED, void *event_info EINA_UNUSED)
278 {
279    if (app_selected == obj)
280      _app_clicked(obj, NULL, NULL);
281    return EINA_TRUE;
282 }
283
284 static void
285 _win_del(void *data EINA_UNUSED, Evas_Object *obj EINA_UNUSED, void *event EINA_UNUSED)
286 {
287    Elm_App_Client *app;
288    EINA_LIST_FREE(apps_list, app)
289      eo_del(app);
290 }
291
292 static void
293 _app_open(const char *package)
294 {
295    Elm_App_Client *app;
296    Eina_List *l;
297
298    EINA_LIST_FOREACH(apps_list, l, app)
299      {
300         const char *app_package = NULL;
301
302         eo_do(app, app_package = elm_app_client_package_get());
303         if (!strcmp(package, app_package))
304           return;
305      }
306
307    app = eo_add(ELM_APP_CLIENT_CLASS, NULL,
308                        elm_app_client_constructor(package));
309    eo_do(app,
310          eo_event_callback_add(ELM_APP_CLIENT_EVENT_VIEW_LIST_LOADED,
311                                _view_list_update_cb, table),
312          eo_event_callback_add(ELM_APP_CLIENT_EVENT_VIEW_CREATED,
313                                _view_list_update_cb, table),
314          eo_event_callback_add(ELM_APP_CLIENT_EVENT_VIEW_DELETED,
315                                _view_list_update_cb, table));
316    apps_list = eina_list_append(apps_list, app);
317 }
318
319 static void
320 _btn_app_open_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info EINA_UNUSED)
321 {
322    Evas_Object *entry = data;
323    const char *pkg = elm_object_text_get(entry);
324
325    if (!pkg || !pkg[0])
326      return;
327
328    _app_open(pkg);
329    _apps_list_update();
330 }
331
332 static void
333 _open_custom_app_cb(void *data, Evas_Object *obj EINA_UNUSED, void *event_info)
334 {
335    elm_list_item_selected_set(event_info, EINA_FALSE);
336    elm_object_focus_set(data, EINA_TRUE);
337 }
338
339 static void
340 _apps_list_update(void)
341 {
342    Evas_Object *entry, *btn_open, *apps;
343    Elm_App_Client *app;
344    Eina_List *l;
345
346    apps = elm_table_child_get(table, APPS_COL, 0);
347    elm_list_clear(apps);
348
349    EINA_LIST_FOREACH(apps_list, l, app)
350      {
351         const char *app_package = NULL;
352         eo_do(app, app_package = elm_app_client_package_get());
353         elm_list_item_append(apps, app_package, NULL, NULL, _app_clicked, app);
354      }
355
356    entry = elm_entry_add(apps);
357    elm_entry_single_line_set(entry, EINA_TRUE);
358    evas_object_size_hint_weight_set(entry, EVAS_HINT_EXPAND, 0.0);
359    evas_object_size_hint_align_set(entry, EVAS_HINT_FILL, 0.5);
360
361    btn_open = elm_button_add(apps);
362    elm_object_text_set(btn_open, "Open");
363    evas_object_smart_callback_add(btn_open, "clicked", _btn_app_open_cb, entry);
364    elm_list_item_append(apps, NULL, entry, btn_open, _open_custom_app_cb, entry);
365
366    elm_list_go(apps);
367 }
368
369 void
370 test_task_switcher(void *data EINA_UNUSED,
371              Evas_Object *obj EINA_UNUSED,
372              void *event_info EINA_UNUSED)
373 {
374    Evas_Object *win, *apps;
375
376    if (apps_list)
377      {
378         printf("Task switcher already open.\n");
379         return;
380      }
381
382    win = elm_win_util_standard_add("task switcher", "Task switcher");
383    elm_win_autodel_set(win, EINA_TRUE);
384
385    evas_object_smart_callback_add(win, "delete,request", _win_del, NULL);
386
387    table = elm_table_add(win);
388    elm_win_resize_object_add(win, table);
389    elm_table_padding_set(table, 0, 0);
390    elm_table_homogeneous_set(table, EINA_TRUE);
391    evas_object_size_hint_weight_set(table, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
392    evas_object_size_hint_align_set(table, EVAS_HINT_FILL, EVAS_HINT_FILL);
393
394    _app_open("org.enlightenment.message");
395    _app_open("org.enlightenment.phone");
396
397    apps = elm_list_add(table);
398    evas_object_size_hint_align_set(apps, EVAS_HINT_FILL, EVAS_HINT_FILL);
399    evas_object_show(apps);
400    elm_table_pack(table, apps, APPS_COL, 0, 1, 1);
401    _apps_list_update();
402
403    evas_object_show(table);
404    evas_object_resize(win, 1024, 768);
405    evas_object_show(win);
406 }