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