09d585efed4d17e1d8fdd0f29157911dc0f113bc
[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    evas_object_resize(tbar->o_event, tbar->w, tbar->h);
178    evas_object_resize(tbar->o_base, tbar->w, tbar->h);
179 }
180
181 EAPI void 
182 e_toolbar_move_resize(E_Toolbar *tbar, int x, int y, int w, int h) 
183 {
184    E_OBJECT_CHECK(tbar);
185    E_OBJECT_TYPE_CHECK(tbar, E_TOOLBAR_TYPE);
186    tbar->x = x;
187    tbar->y = y;
188    tbar->w = w;
189    tbar->h = h;
190    evas_object_move(tbar->o_event, x, y);
191    evas_object_move(tbar->o_base, x, y);
192    evas_object_resize(tbar->o_event, w, h);
193    evas_object_resize(tbar->o_base, w, h);
194 }
195
196 EAPI void 
197 e_toolbar_orient(E_Toolbar *tbar, E_Gadcon_Orient orient) 
198 {
199    char buf[4096];
200
201    E_OBJECT_CHECK(tbar);
202    E_OBJECT_TYPE_CHECK(tbar, E_TOOLBAR_TYPE);
203    e_gadcon_orient(tbar->gadcon, orient);
204    snprintf(buf, sizeof(buf), "e,state,orientation,%s", 
205             _e_toolbar_orient_string_get(tbar));
206    edje_object_signal_emit(tbar->o_base, buf, "e");
207    edje_object_message_signal_process(tbar->o_base);
208 }
209
210 EAPI void 
211 e_toolbar_position_calc(E_Toolbar *tbar) 
212 {
213    E_Gadcon_Orient orient = E_GADCON_ORIENT_TOP;
214
215    E_OBJECT_CHECK(tbar);
216    E_OBJECT_TYPE_CHECK(tbar, E_TOOLBAR_TYPE);
217    if (!tbar->fwin) return;
218    orient = tbar->gadcon->orient;
219    switch (orient) 
220      {
221       case E_GADCON_ORIENT_HORIZ:
222       case E_GADCON_ORIENT_TOP:
223         tbar->x = 0;
224         tbar->y = 0;
225         tbar->h = 32;
226         tbar->w = tbar->fwin->w;
227         break;
228       case E_GADCON_ORIENT_BOTTOM:
229         tbar->x = 0;
230         tbar->h = 32;
231         tbar->w = tbar->fwin->w;
232         tbar->y = (tbar->fwin->h - tbar->h);
233         break;
234       case E_GADCON_ORIENT_VERT:
235       case E_GADCON_ORIENT_LEFT:
236         tbar->x = 0;
237         tbar->w = 32;
238         tbar->h = tbar->fwin->h;
239         tbar->y = 0;
240         break;
241       case E_GADCON_ORIENT_RIGHT:
242         tbar->y = 0;
243         tbar->w = 32;
244         tbar->x = (tbar->fwin->w - tbar->w);
245         tbar->h = tbar->fwin->h;
246         break;
247       default:
248         break;
249      }
250    e_toolbar_move_resize(tbar, tbar->x, tbar->y, tbar->w, tbar->h);
251 }
252
253 EAPI void 
254 e_toolbar_populate(E_Toolbar *tbar) 
255 {
256    E_OBJECT_CHECK(tbar);
257    E_OBJECT_TYPE_CHECK(tbar, E_TOOLBAR_TYPE);
258    e_gadcon_populate(tbar->gadcon);
259 }
260
261 /* local functions */
262 static void 
263 _e_toolbar_free(E_Toolbar *tbar) 
264 {
265    toolbars = eina_list_remove(toolbars, tbar);
266
267    if (tbar->menu) 
268      {
269         e_menu_post_deactivate_callback_set(tbar->menu, NULL, NULL);
270         e_object_del(E_OBJECT(tbar->menu));
271         tbar->menu = NULL;
272      }
273    if (tbar->cfg_dlg) e_object_del(E_OBJECT(tbar->cfg_dlg));
274    e_object_del(E_OBJECT(tbar->gadcon));
275    if (tbar->name) eina_stringshare_del(tbar->name);
276    evas_object_del(tbar->o_event);
277    evas_object_del(tbar->o_base);
278    E_FREE(tbar);
279 }
280
281 static void 
282 _e_toolbar_cb_mouse_down(void *data, Evas *evas __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info) 
283 {
284    Evas_Event_Mouse_Down *ev;
285    E_Toolbar *tbar;
286    E_Menu *mn;
287    E_Zone *zone;
288    int x, y;
289
290    ev = event_info;
291    tbar = data;
292    if (ev->button != 3) return;
293    mn = e_menu_new();
294    e_menu_post_deactivate_callback_set(mn, _e_toolbar_menu_cb_post, tbar);
295    tbar->menu = mn;
296    _e_toolbar_menu_append(tbar, mn);
297    zone = e_util_zone_current_get(e_manager_current_get());
298    ecore_x_pointer_xy_get(zone->container->win, &x, &y);
299    e_menu_activate_mouse(mn, zone, x, y, 1, 1, 
300                          E_MENU_POP_DIRECTION_DOWN, ev->timestamp);
301 }
302
303 static void 
304 _e_toolbar_menu_cb_post(void *data, E_Menu *mn __UNUSED__) 
305 {
306    E_Toolbar *tbar;
307
308    tbar = data;
309    if (!tbar->menu) return;
310    e_object_del(E_OBJECT(tbar->menu));
311    tbar->menu = NULL;
312 }
313
314 static void 
315 _e_toolbar_menu_cb_pre(void *data, E_Menu *mn) 
316 {
317    E_Toolbar *tbar;
318    E_Menu_Item *mi;
319
320    tbar = data;
321    e_menu_pre_activate_callback_set(mn, NULL, NULL);
322
323    mi = e_menu_item_new(mn);
324    if (tbar->gadcon->editing)
325      e_menu_item_label_set(mi, _("Stop Moving/Resizing Items"));
326    else
327      e_menu_item_label_set(mi, _("Begin Moving/Resizing Items"));
328    e_util_menu_item_theme_icon_set(mi, "transform-scale");
329    e_menu_item_callback_set(mi, _e_toolbar_menu_cb_edit, tbar);
330
331    mi = e_menu_item_new(mn);
332    e_menu_item_separator_set(mi, 1);
333
334    mi = e_menu_item_new(mn);
335    e_menu_item_label_set(mi, _("Toolbar Settings"));
336    e_util_menu_item_theme_icon_set(mi, "configure");
337    e_menu_item_callback_set(mi, _e_toolbar_menu_cb_config, tbar);
338
339    mi = e_menu_item_new(mn);
340    e_menu_item_label_set(mi, _("Set Toolbar Contents"));
341    e_util_menu_item_theme_icon_set(mi, "preferences-toolbar");
342    e_menu_item_callback_set(mi, _e_toolbar_menu_cb_contents, tbar);
343 }
344
345 static void 
346 _e_toolbar_menu_items_append(void *data, E_Gadcon_Client *gcc __UNUSED__, E_Menu *mn) 
347 {
348    E_Toolbar *tbar;
349    
350    tbar = data;
351    _e_toolbar_menu_append(tbar, mn);
352 }
353
354 static void 
355 _e_toolbar_menu_append(E_Toolbar *tbar, E_Menu *mn) 
356 {
357    E_Menu_Item *mi;
358    E_Menu *subm;
359
360    subm = e_menu_new();
361    mi = e_menu_item_new(mn);
362    e_menu_item_label_set(mi, tbar->name);
363    e_util_menu_item_theme_icon_set(mi, "preferences-toolbar");
364    e_menu_pre_activate_callback_set(subm, _e_toolbar_menu_cb_pre, tbar);
365    e_menu_item_submenu_set(mi, subm);
366 }
367
368 static void 
369 _e_toolbar_menu_cb_edit(void *data, E_Menu *mn __UNUSED__, E_Menu_Item *mi __UNUSED__) 
370 {
371    E_Toolbar *tbar;
372
373    tbar = data;
374    if (tbar->gadcon->editing) 
375      e_gadcon_edit_end(tbar->gadcon);
376    else 
377      e_gadcon_edit_begin(tbar->gadcon);
378 }
379
380 static void 
381 _e_toolbar_menu_cb_config(void *data, E_Menu *mn __UNUSED__, E_Menu_Item *mi __UNUSED__) 
382 {
383    E_Toolbar *tbar;
384
385    tbar = data;
386    if (!tbar->cfg_dlg) e_int_toolbar_config(tbar);
387 }
388
389 static void 
390 _e_toolbar_menu_cb_contents(void *data, E_Menu *mn __UNUSED__, E_Menu_Item *mi __UNUSED__) 
391 {
392    E_Toolbar *tbar;
393
394    tbar = data;
395    if (!tbar->gadcon->config_dialog) e_int_gadcon_config_toolbar(tbar->gadcon);
396 }
397
398 static void 
399 _e_toolbar_gadcon_size_request(void *data, E_Gadcon *gc, Evas_Coord w, Evas_Coord h) 
400 {
401    E_Toolbar *tbar;
402    Evas_Coord nx, ny, nw, nh, ww, hh;
403
404    tbar = data;
405    nx = tbar->x;
406    ny = tbar->y;
407    nw = tbar->w;
408    nh = tbar->h;
409    ww = hh = 0;
410    evas_object_geometry_get(gc->o_container, NULL, NULL, &ww, &hh);
411    switch (gc->orient) 
412      {
413       case E_GADCON_ORIENT_TOP:
414       case E_GADCON_ORIENT_BOTTOM:
415         w = ww;
416         h = 32;
417         break;
418       case E_GADCON_ORIENT_LEFT:
419       case E_GADCON_ORIENT_RIGHT:
420         w = 32;
421         h = hh;
422         break;
423       default:
424         break;
425      }
426    e_gadcon_swallowed_min_size_set(gc, w, h);
427    edje_object_size_min_calc(tbar->o_base, &nw, &nh);
428    switch (gc->orient) 
429      {
430       case E_GADCON_ORIENT_TOP:
431         nx = ny = 0;
432         nw = tbar->w;
433         nh = tbar->h;
434         if (nw > tbar->fwin->w) nw = tbar->fwin->w;
435         if (nh > tbar->fwin->h) nh = 32;
436         break;
437       case E_GADCON_ORIENT_BOTTOM:
438         nx = 0;
439         nw = tbar->w;
440         nh = tbar->h;
441         if (nw > tbar->fwin->w) nw = tbar->fwin->w;
442         if (nh > tbar->fwin->h) nh = 32;
443         ny = (tbar->fwin->h - nh);
444         break;
445       case E_GADCON_ORIENT_LEFT:
446         nx = ny = 0;
447         nw = tbar->w;
448         nh = tbar->h;
449         if (nh > tbar->fwin->h) nh = tbar->fwin->h;
450         if (nw > tbar->fwin->w) nw = 32;
451         break;
452       case E_GADCON_ORIENT_RIGHT:
453         ny = 0;
454         nh = tbar->h;
455         nw = tbar->w;
456         if (nw > tbar->fwin->w) nw = 32;
457         if (nh > tbar->fwin->h) nh = tbar->fwin->h;
458         nx = (tbar->fwin->w - tbar->w);
459         break;
460       default:
461         break;
462      }
463    e_toolbar_move_resize(tbar, nx, ny, nw, nh);
464 }
465
466 static const char *
467 _e_toolbar_orient_string_get(E_Toolbar *tbar) 
468 {
469    const char *sig = "";
470
471    switch (tbar->gadcon->orient)
472      {
473       case E_GADCON_ORIENT_HORIZ:
474         sig = "horizontal";
475         break;
476       case E_GADCON_ORIENT_VERT:
477         sig = "vertical";
478         break;
479       case E_GADCON_ORIENT_LEFT:
480         sig = "left";
481         break;
482       case E_GADCON_ORIENT_RIGHT:
483         sig = "right";
484         break;
485       case E_GADCON_ORIENT_TOP:
486         sig = "top";
487         break;
488       case E_GADCON_ORIENT_BOTTOM:
489         sig = "bottom";
490         break;
491       default:
492         break;
493      }
494    return sig;
495 }
496
497 static void 
498 _e_toolbar_fm2_changed(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) 
499 {
500    E_Toolbar *tbar;
501    Eina_List *l = NULL;
502    E_Gadcon_Client *gcc = NULL;
503
504    tbar = data;
505    if (!tbar) return;
506    EINA_LIST_FOREACH(tbar->gadcon->clients, l, gcc)
507      {
508         if (!gcc) continue;
509         evas_object_smart_callback_call(gcc->o_base, "changed", tbar);
510      }
511 }
512
513 static void 
514 _e_toolbar_fm2_dir_changed(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) 
515 {
516    E_Toolbar *tbar;
517    Eina_List *l = NULL;
518    E_Gadcon_Client *gcc = NULL;
519
520    tbar = data;
521    if (!tbar) return;
522    EINA_LIST_FOREACH(tbar->gadcon->clients, l, gcc)
523      {
524         if (!gcc) continue;
525         evas_object_smart_callback_call(gcc->o_base, "dir_changed", tbar);
526      }
527 }
528
529 static void 
530 _e_toolbar_fm2_dir_deleted(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) 
531 {
532    E_Toolbar *tbar;
533    Eina_List *l = NULL;
534    E_Gadcon_Client *gcc = NULL;
535
536    tbar = data;
537    if (!tbar) return;
538    EINA_LIST_FOREACH(tbar->gadcon->clients, l, gcc)
539      {
540         if (!gcc) continue;
541         evas_object_smart_callback_call(gcc->o_base, "dir_deleted", tbar);
542      }
543 }
544
545 static void 
546 _e_toolbar_fm2_files_deleted(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) 
547 {
548    E_Toolbar *tbar;
549    Eina_List *l = NULL;
550    E_Gadcon_Client *gcc = NULL;
551
552    tbar = data;
553    if (!tbar) return;
554    EINA_LIST_FOREACH(tbar->gadcon->clients, l, gcc)
555      {
556         if (!gcc) continue;
557         evas_object_smart_callback_call(gcc->o_base, "files_deleted", tbar);
558      }
559 }
560
561 static void 
562 _e_toolbar_fm2_selected(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) 
563 {
564    E_Toolbar *tbar;
565    Eina_List *l = NULL;
566    E_Gadcon_Client *gcc = NULL;
567
568    tbar = data;
569    if (!tbar) return;
570    EINA_LIST_FOREACH(tbar->gadcon->clients, l, gcc)
571      {
572         if (!gcc) continue;
573         evas_object_smart_callback_call(gcc->o_base, "selected", tbar);
574      }
575 }
576
577 static void 
578 _e_toolbar_fm2_selection_changed(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__) 
579 {
580    E_Toolbar *tbar;
581    Eina_List *l = NULL;
582    E_Gadcon_Client *gcc = NULL;
583
584    tbar = data;
585    if (!tbar) return;
586    EINA_LIST_FOREACH(tbar->gadcon->clients, l, gcc)
587      {
588         if (!gcc) continue;
589         evas_object_smart_callback_call(gcc->o_base, "selection_changed", tbar);
590      }
591 }