update for beta release
[framework/uifw/e17.git] / src / bin / e_toolbar.c
1 #include "e.h"
2
3 /* local function protos */
4 static void _e_toolbar_free(E_Toolbar *tbar);
5 static void _e_toolbar_cb_mouse_down(void *data, Evas *evas, Evas_Object *obj, void *event_info);
6 static void _e_toolbar_menu_cb_post(void *data, E_Menu *mn);
7 static void _e_toolbar_menu_cb_pre(void *data, E_Menu *mn);
8 static void _e_toolbar_menu_append(E_Toolbar *tbar, E_Menu *mn);
9 static void _e_toolbar_menu_cb_edit(void *data, E_Menu *mn, E_Menu_Item *mi);
10 static void _e_toolbar_menu_cb_config(void *data, E_Menu *mn, E_Menu_Item *mi);
11 static void _e_toolbar_menu_cb_contents(void *data, E_Menu *mn, E_Menu_Item *mi);
12 static void _e_toolbar_gadcon_size_request(void *data, E_Gadcon *gc, Evas_Coord w, Evas_Coord h);
13 static const char *_e_toolbar_orient_string_get(E_Toolbar *tbar);
14 static void _e_toolbar_fm2_changed(void *data, Evas_Object *obj, void *event_info);
15 static void _e_toolbar_fm2_dir_changed(void *data, Evas_Object *obj, void *event_info);
16 static void _e_toolbar_fm2_dir_deleted(void *data, Evas_Object *obj, void *event_info);
17 static void _e_toolbar_fm2_files_deleted(void *data, Evas_Object *obj, void *event_info);
18 static void _e_toolbar_fm2_selected(void *data, Evas_Object *obj, void *event_info);
19 static void _e_toolbar_fm2_selection_changed(void *data, Evas_Object *obj, void *event_info);
20 static void _e_toolbar_menu_items_append(void *data, E_Gadcon_Client *gcc, E_Menu *mn);
21
22 /* local vars */
23 static Eina_List *toolbars = NULL;
24
25 EINTERN int
26 e_toolbar_init(void) 
27 {
28    return 1;
29 }
30
31 EINTERN int
32 e_toolbar_shutdown(void) 
33 {
34    while (toolbars) 
35      {
36         E_Toolbar *tbar;
37
38         tbar = eina_list_data_get(toolbars);
39         e_object_del(E_OBJECT(tbar));
40      }
41    return 1;
42 }
43
44 EAPI E_Toolbar *
45 e_toolbar_new(Evas *evas, const char *name, E_Win *fwin, Evas_Object *fm2) 
46 {
47    E_Toolbar *tbar = NULL;
48
49    if (!name) return NULL;
50    if ((!fwin) || (!fm2)) return NULL;
51
52    tbar = E_OBJECT_ALLOC(E_Toolbar, E_TOOLBAR_TYPE, _e_toolbar_free);
53    if (!tbar) return NULL;
54    tbar->id = 1;
55 //   tbar->id = eina_list_count(toolbars) + 1;
56    tbar->x = tbar->y = 0;
57    tbar->h = 32;
58    tbar->w = fwin->w;
59    tbar->evas = evas;
60    tbar->name = eina_stringshare_add(name);
61    tbar->fwin = fwin;
62    tbar->fm2 = fm2;
63
64    evas_object_smart_callback_add(tbar->fm2, "changed", 
65                                   _e_toolbar_fm2_changed, tbar);
66    evas_object_smart_callback_add(tbar->fm2, "dir_changed", 
67                                   _e_toolbar_fm2_dir_changed, tbar);
68    evas_object_smart_callback_add(tbar->fm2, "dir_deleted", 
69                                   _e_toolbar_fm2_dir_deleted, tbar);
70    evas_object_smart_callback_add(tbar->fm2, "files_deleted", 
71                                   _e_toolbar_fm2_files_deleted, tbar);
72    evas_object_smart_callback_add(tbar->fm2, "selected", 
73                                   _e_toolbar_fm2_selected, tbar);
74    evas_object_smart_callback_add(tbar->fm2, "selection_change", 
75                                   _e_toolbar_fm2_selection_changed, tbar);
76
77    tbar->o_event = evas_object_rectangle_add(evas);
78    evas_object_color_set(tbar->o_event, 0, 0, 0, 0);
79    evas_object_resize(tbar->o_event, tbar->w, tbar->h);
80    evas_object_event_callback_add(tbar->o_event, EVAS_CALLBACK_MOUSE_DOWN, 
81                                   _e_toolbar_cb_mouse_down, tbar);
82    evas_object_layer_set(tbar->o_event, 0);
83    evas_object_show(tbar->o_event);
84
85    tbar->o_base = edje_object_add(evas);
86    evas_object_resize(tbar->o_base, tbar->w, tbar->h);
87    e_theme_edje_object_set(tbar->o_base, "base/theme/fileman/toolbar", 
88                            "e/fileman/toolbar/default/base");
89
90    e_toolbar_move_resize(tbar, tbar->x, tbar->y, tbar->w, tbar->h);
91
92    tbar->gadcon = e_gadcon_swallowed_new(tbar->name, tbar->id, tbar->o_base, 
93                                          "e.swallow.content");
94    e_gadcon_size_request_callback_set(tbar->gadcon, 
95                                       _e_toolbar_gadcon_size_request, tbar);
96    /* FIXME: We want to implement "styles" here ? */
97
98    e_toolbar_orient(tbar, E_GADCON_ORIENT_TOP);
99
100    e_gadcon_toolbar_set(tbar->gadcon, tbar);
101    e_gadcon_util_menu_attach_func_set(tbar->gadcon, 
102                                       _e_toolbar_menu_items_append, tbar);
103    e_gadcon_populate(tbar->gadcon);
104
105    toolbars = eina_list_append(toolbars, tbar);
106    return tbar;
107 }
108
109 EAPI void 
110 e_toolbar_fwin_set(E_Toolbar *tbar, E_Win *fwin) 
111 {
112    E_OBJECT_CHECK(tbar);
113    E_OBJECT_TYPE_CHECK(tbar, E_TOOLBAR_TYPE);
114    tbar->fwin = fwin;
115 }
116
117 EAPI E_Win *
118 e_toolbar_fwin_get(E_Toolbar *tbar) 
119 {
120    E_OBJECT_CHECK_RETURN(tbar, NULL);
121    E_OBJECT_TYPE_CHECK_RETURN(tbar, E_TOOLBAR_TYPE, NULL);
122    return tbar->fwin;
123 }
124
125 EAPI void 
126 e_toolbar_fm2_set(E_Toolbar *tbar, Evas_Object *fm2) 
127 {
128    E_OBJECT_CHECK(tbar);
129    E_OBJECT_TYPE_CHECK(tbar, E_TOOLBAR_TYPE);
130    tbar->fm2 = fm2;
131 }
132
133 EAPI Evas_Object *
134 e_toolbar_fm2_get(E_Toolbar *tbar) 
135 {
136    E_OBJECT_CHECK_RETURN(tbar, NULL);
137    E_OBJECT_TYPE_CHECK_RETURN(tbar, E_TOOLBAR_TYPE, NULL);
138    return tbar->fm2;
139 }
140
141 EAPI void 
142 e_toolbar_show(E_Toolbar *tbar) 
143 {
144    E_OBJECT_CHECK(tbar);
145    E_OBJECT_TYPE_CHECK(tbar, E_TOOLBAR_TYPE);
146    evas_object_show(tbar->o_event);
147    evas_object_show(tbar->o_base);
148 }
149
150 EAPI void 
151 e_toolbar_hide(E_Toolbar *tbar) 
152 {
153    E_OBJECT_CHECK(tbar);
154    E_OBJECT_TYPE_CHECK(tbar, E_TOOLBAR_TYPE);
155    evas_object_hide(tbar->o_event);
156    evas_object_hide(tbar->o_base);
157 }
158
159 EAPI void 
160 e_toolbar_move(E_Toolbar *tbar, int x, int y) 
161 {
162    E_OBJECT_CHECK(tbar);
163    E_OBJECT_TYPE_CHECK(tbar, E_TOOLBAR_TYPE);
164    tbar->x = x;
165    tbar->y = y;
166    evas_object_move(tbar->o_event, tbar->x, tbar->y);
167    evas_object_move(tbar->o_base, tbar->x, tbar->y);
168 }
169
170 EAPI void 
171 e_toolbar_resize(E_Toolbar *tbar, int w, int h) 
172 {
173    E_OBJECT_CHECK(tbar);
174    E_OBJECT_TYPE_CHECK(tbar, E_TOOLBAR_TYPE);
175    tbar->w = w;
176    tbar->h = h;
177    if (tbar->gadcon)
178      e_gadcon_swallowed_min_size_set(tbar->gadcon, w, h);
179    evas_object_resize(tbar->o_event, tbar->w, tbar->h);
180    evas_object_resize(tbar->o_base, tbar->w, tbar->h);
181 }
182
183 EAPI void 
184 e_toolbar_move_resize(E_Toolbar *tbar, int x, int y, int w, int h) 
185 {
186    E_OBJECT_CHECK(tbar);
187    E_OBJECT_TYPE_CHECK(tbar, E_TOOLBAR_TYPE);
188    tbar->x = x;
189    tbar->y = y;
190    tbar->w = w;
191    tbar->h = h;
192    if (tbar->gadcon)
193      e_gadcon_swallowed_min_size_set(tbar->gadcon, w, h);
194    evas_object_move(tbar->o_event, x, y);
195    evas_object_move(tbar->o_base, x, y);
196    evas_object_resize(tbar->o_event, w, h);
197    evas_object_resize(tbar->o_base, w, h);
198 }
199
200 EAPI void 
201 e_toolbar_orient(E_Toolbar *tbar, E_Gadcon_Orient orient) 
202 {
203    char buf[4096];
204
205    E_OBJECT_CHECK(tbar);
206    E_OBJECT_TYPE_CHECK(tbar, E_TOOLBAR_TYPE);
207    e_gadcon_orient(tbar->gadcon, orient);
208    snprintf(buf, sizeof(buf), "e,state,orientation,%s", 
209             _e_toolbar_orient_string_get(tbar));
210    edje_object_signal_emit(tbar->o_base, buf, "e");
211    edje_object_message_signal_process(tbar->o_base);
212 }
213
214 EAPI void 
215 e_toolbar_position_calc(E_Toolbar *tbar) 
216 {
217    E_Gadcon_Orient orient = E_GADCON_ORIENT_TOP;
218
219    E_OBJECT_CHECK(tbar);
220    E_OBJECT_TYPE_CHECK(tbar, E_TOOLBAR_TYPE);
221    if (!tbar->fwin) return;
222    orient = tbar->gadcon->orient;
223    switch (orient) 
224      {
225       case E_GADCON_ORIENT_HORIZ:
226       case E_GADCON_ORIENT_TOP:
227         tbar->x = 0;
228         tbar->y = 0;
229         tbar->h = 32;
230         tbar->w = tbar->fwin->w;
231         break;
232       case E_GADCON_ORIENT_BOTTOM:
233         tbar->x = 0;
234         tbar->h = 32;
235         tbar->w = tbar->fwin->w;
236         tbar->y = (tbar->fwin->h - tbar->h);
237         break;
238       case E_GADCON_ORIENT_VERT:
239       case E_GADCON_ORIENT_LEFT:
240         tbar->x = 0;
241         tbar->w = 32;
242         tbar->h = tbar->fwin->h;
243         tbar->y = 0;
244         break;
245       case E_GADCON_ORIENT_RIGHT:
246         tbar->y = 0;
247         tbar->w = 32;
248         tbar->x = (tbar->fwin->w - tbar->w);
249         tbar->h = tbar->fwin->h;
250         break;
251       default:
252         break;
253      }
254    e_toolbar_move_resize(tbar, tbar->x, tbar->y, tbar->w, tbar->h);
255 }
256
257 EAPI void 
258 e_toolbar_populate(E_Toolbar *tbar) 
259 {
260    E_OBJECT_CHECK(tbar);
261    E_OBJECT_TYPE_CHECK(tbar, E_TOOLBAR_TYPE);
262    e_gadcon_populate(tbar->gadcon);
263 }
264
265 /* local functions */
266 static void 
267 _e_toolbar_free(E_Toolbar *tbar) 
268 {
269    toolbars = eina_list_remove(toolbars, tbar);
270
271    if (tbar->menu) 
272      {
273         e_menu_post_deactivate_callback_set(tbar->menu, NULL, NULL);
274         e_object_del(E_OBJECT(tbar->menu));
275         tbar->menu = NULL;
276      }
277    if (tbar->cfg_dlg) e_object_del(E_OBJECT(tbar->cfg_dlg));
278    e_object_del(E_OBJECT(tbar->gadcon));
279    if (tbar->name) eina_stringshare_del(tbar->name);
280    evas_object_del(tbar->o_event);
281    evas_object_del(tbar->o_base);
282    E_FREE(tbar);
283 }
284
285 static void 
286 _e_toolbar_cb_mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) 
287 {
288    Evas_Event_Mouse_Down *ev;
289    E_Toolbar *tbar;
290    E_Menu *mn;
291    E_Zone *zone;
292    int x, y;
293
294    ev = event_info;
295    tbar = data;
296    if (ev->button != 3) return;
297    mn = e_menu_new();
298    e_menu_post_deactivate_callback_set(mn, _e_toolbar_menu_cb_post, tbar);
299    tbar->menu = mn;
300    _e_toolbar_menu_append(tbar, mn);
301    zone = e_util_zone_current_get(e_manager_current_get());
302    ecore_x_pointer_xy_get(zone->container->win, &x, &y);
303    e_menu_activate_mouse(mn, zone, x, y, 1, 1, 
304                          E_MENU_POP_DIRECTION_DOWN, ev->timestamp);
305 }
306
307 static void 
308 _e_toolbar_menu_cb_post(void *data, E_Menu *mn __UNUSED__) 
309 {
310    E_Toolbar *tbar;
311
312    tbar = data;
313    if (!tbar->menu) return;
314    e_object_del(E_OBJECT(tbar->menu));
315    tbar->menu = NULL;
316 }
317
318 static void 
319 _e_toolbar_menu_cb_pre(void *data, E_Menu *mn) 
320 {
321    E_Toolbar *tbar;
322    E_Menu_Item *mi;
323
324    tbar = data;
325    e_menu_pre_activate_callback_set(mn, NULL, NULL);
326
327    mi = e_menu_item_new(mn);
328    if (tbar->gadcon->editing)
329      e_menu_item_label_set(mi, _("Stop Moving/Resizing Items"));
330    else
331      e_menu_item_label_set(mi, _("Begin Moving/Resizing Items"));
332    e_util_menu_item_theme_icon_set(mi, "transform-scale");
333    e_menu_item_callback_set(mi, _e_toolbar_menu_cb_edit, tbar);
334
335    mi = e_menu_item_new(mn);
336    e_menu_item_separator_set(mi, 1);
337
338    mi = e_menu_item_new(mn);
339    e_menu_item_label_set(mi, _("Toolbar Settings"));
340    e_util_menu_item_theme_icon_set(mi, "configure");
341    e_menu_item_callback_set(mi, _e_toolbar_menu_cb_config, tbar);
342
343    mi = e_menu_item_new(mn);
344    e_menu_item_label_set(mi, _("Set Toolbar Contents"));
345    e_util_menu_item_theme_icon_set(mi, "preferences-toolbar");
346    e_menu_item_callback_set(mi, _e_toolbar_menu_cb_contents, tbar);
347 }
348
349 static void 
350 _e_toolbar_menu_items_append(void *data, E_Gadcon_Client *gcc __UNUSED__, E_Menu *mn) 
351 {
352    E_Toolbar *tbar;
353    
354    tbar = data;
355    _e_toolbar_menu_append(tbar, mn);
356 }
357
358 static void 
359 _e_toolbar_menu_append(E_Toolbar *tbar, E_Menu *mn) 
360 {
361    E_Menu_Item *mi;
362    E_Menu *subm;
363
364    subm = e_menu_new();
365    mi = e_menu_item_new(mn);
366    e_menu_item_label_set(mi, tbar->name);
367    e_util_menu_item_theme_icon_set(mi, "preferences-toolbar");
368    e_menu_pre_activate_callback_set(subm, _e_toolbar_menu_cb_pre, tbar);
369    e_menu_item_submenu_set(mi, subm);
370 }
371
372 static void 
373 _e_toolbar_menu_cb_edit(void *data, E_Menu *mn __UNUSED__, E_Menu_Item *mi __UNUSED__) 
374 {
375    E_Toolbar *tbar;
376
377    tbar = data;
378    if (tbar->gadcon->editing) 
379      e_gadcon_edit_end(tbar->gadcon);
380    else 
381      e_gadcon_edit_begin(tbar->gadcon);
382 }
383
384 static void 
385 _e_toolbar_menu_cb_config(void *data, E_Menu *mn __UNUSED__, E_Menu_Item *mi __UNUSED__) 
386 {
387    E_Toolbar *tbar;
388
389    tbar = data;
390    if (!tbar->cfg_dlg) e_int_toolbar_config(tbar);
391 }
392
393 static void 
394 _e_toolbar_menu_cb_contents(void *data, E_Menu *mn __UNUSED__, E_Menu_Item *mi __UNUSED__) 
395 {
396    E_Toolbar *tbar;
397
398    tbar = data;
399    if (!tbar->gadcon->config_dialog) e_int_gadcon_config_toolbar(tbar->gadcon);
400 }
401
402 static void 
403 _e_toolbar_gadcon_size_request(void *data, E_Gadcon *gc, Evas_Coord w, Evas_Coord h) 
404 {
405    E_Toolbar *tbar;
406    Evas_Coord nx, ny, nw, nh, ww, hh;
407
408    tbar = data;
409    nx = tbar->x;
410    ny = tbar->y;
411    nw = tbar->w;
412    nh = tbar->h;
413    ww = hh = 0;
414    evas_object_geometry_get(gc->o_container, NULL, NULL, &ww, &hh);
415    switch (gc->orient) 
416      {
417       case E_GADCON_ORIENT_TOP:
418       case E_GADCON_ORIENT_BOTTOM:
419         w = ww;
420         h = 32;
421         break;
422       case E_GADCON_ORIENT_LEFT:
423       case E_GADCON_ORIENT_RIGHT:
424         w = 32;
425         h = hh;
426         break;
427       default:
428         break;
429      }
430    e_gadcon_swallowed_min_size_set(gc, w, h);
431    edje_object_size_min_calc(tbar->o_base, &nw, &nh);
432    switch (gc->orient) 
433      {
434       case E_GADCON_ORIENT_TOP:
435         nx = ny = 0;
436         nw = tbar->w;
437         nh = tbar->h;
438         if (nw > tbar->fwin->w) nw = tbar->fwin->w;
439         if (nh > tbar->fwin->h) nh = 32;
440         break;
441       case E_GADCON_ORIENT_BOTTOM:
442         nx = 0;
443         nw = tbar->w;
444         nh = tbar->h;
445         if (nw > tbar->fwin->w) nw = tbar->fwin->w;
446         if (nh > tbar->fwin->h) nh = 32;
447         ny = (tbar->fwin->h - nh);
448         break;
449       case E_GADCON_ORIENT_LEFT:
450         nx = ny = 0;
451         nw = tbar->w;
452         nh = tbar->h;
453         if (nh > tbar->fwin->h) nh = tbar->fwin->h;
454         if (nw > tbar->fwin->w) nw = 32;
455         break;
456       case E_GADCON_ORIENT_RIGHT:
457         ny = 0;
458         nh = tbar->h;
459         nw = tbar->w;
460         if (nw > tbar->fwin->w) nw = 32;
461         if (nh > tbar->fwin->h) nh = tbar->fwin->h;
462         nx = (tbar->fwin->w - tbar->w);
463         break;
464       default:
465         break;
466      }
467    e_toolbar_move_resize(tbar, nx, ny, nw, nh);
468 }
469
470 static const char *
471 _e_toolbar_orient_string_get(E_Toolbar *tbar) 
472 {
473    const char *sig = "";
474
475    switch (tbar->gadcon->orient)
476      {
477       case E_GADCON_ORIENT_HORIZ:
478         sig = "horizontal";
479         break;
480       case E_GADCON_ORIENT_VERT:
481         sig = "vertical";
482         break;
483       case E_GADCON_ORIENT_LEFT:
484         sig = "left";
485         break;
486       case E_GADCON_ORIENT_RIGHT:
487         sig = "right";
488         break;
489       case E_GADCON_ORIENT_TOP:
490         sig = "top";
491         break;
492       case E_GADCON_ORIENT_BOTTOM:
493         sig = "bottom";
494         break;
495       default:
496         break;
497      }
498    return sig;
499 }
500
501 static void 
502 _e_toolbar_fm2_changed(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) 
503 {
504    E_Toolbar *tbar;
505    Eina_List *l = NULL;
506    E_Gadcon_Client *gcc = NULL;
507
508    tbar = data;
509    if (!tbar) return;
510    EINA_LIST_FOREACH(tbar->gadcon->clients, l, gcc)
511      {
512         if (!gcc) continue;
513         evas_object_smart_callback_call(gcc->o_base, "changed", tbar);
514      }
515 }
516
517 static void 
518 _e_toolbar_fm2_dir_changed(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) 
519 {
520    E_Toolbar *tbar;
521    Eina_List *l = NULL;
522    E_Gadcon_Client *gcc = NULL;
523
524    tbar = data;
525    if (!tbar) return;
526    EINA_LIST_FOREACH(tbar->gadcon->clients, l, gcc)
527      {
528         if (!gcc) continue;
529         evas_object_smart_callback_call(gcc->o_base, "dir_changed", tbar);
530      }
531 }
532
533 static void 
534 _e_toolbar_fm2_dir_deleted(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) 
535 {
536    E_Toolbar *tbar;
537    Eina_List *l = NULL;
538    E_Gadcon_Client *gcc = NULL;
539
540    tbar = data;
541    if (!tbar) return;
542    EINA_LIST_FOREACH(tbar->gadcon->clients, l, gcc)
543      {
544         if (!gcc) continue;
545         evas_object_smart_callback_call(gcc->o_base, "dir_deleted", tbar);
546      }
547 }
548
549 static void 
550 _e_toolbar_fm2_files_deleted(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) 
551 {
552    E_Toolbar *tbar;
553    Eina_List *l = NULL;
554    E_Gadcon_Client *gcc = NULL;
555
556    tbar = data;
557    if (!tbar) return;
558    EINA_LIST_FOREACH(tbar->gadcon->clients, l, gcc)
559      {
560         if (!gcc) continue;
561         evas_object_smart_callback_call(gcc->o_base, "files_deleted", tbar);
562      }
563 }
564
565 static void 
566 _e_toolbar_fm2_selected(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) 
567 {
568    E_Toolbar *tbar;
569    Eina_List *l = NULL;
570    E_Gadcon_Client *gcc = NULL;
571
572    tbar = data;
573    if (!tbar) return;
574    EINA_LIST_FOREACH(tbar->gadcon->clients, l, gcc)
575      {
576         if (!gcc) continue;
577         evas_object_smart_callback_call(gcc->o_base, "selected", tbar);
578      }
579 }
580
581 static void 
582 _e_toolbar_fm2_selection_changed(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) 
583 {
584    E_Toolbar *tbar;
585    Eina_List *l = NULL;
586    E_Gadcon_Client *gcc = NULL;
587
588    tbar = data;
589    if (!tbar) return;
590    EINA_LIST_FOREACH(tbar->gadcon->clients, l, gcc)
591      {
592         if (!gcc) continue;
593         evas_object_smart_callback_call(gcc->o_base, "selection_changed", tbar);
594      }
595 }