2005-10-10 09:33:13 -07:00
|
|
|
/*
|
|
|
|
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
|
|
|
|
*/
|
2006-02-13 16:40:57 -08:00
|
|
|
/* e_fileman.c
|
|
|
|
* ===========
|
|
|
|
*
|
|
|
|
* fileman is the FILE MANager for e.
|
|
|
|
* its composed of several entities:
|
|
|
|
* (check each .c for more reference)
|
|
|
|
*
|
|
|
|
* +-------------+-+
|
|
|
|
* | x x x x |s|
|
|
|
|
* | | |
|
|
|
|
* | x x x x | |
|
|
|
|
* | o| |
|
|
|
|
* | x x x x | |
|
|
|
|
* +-------------+-+
|
|
|
|
* l-s-----------i-i
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* graphically:
|
|
|
|
* o = icon_canvas
|
|
|
|
* x = icon
|
|
|
|
* s = scrollframe
|
|
|
|
*
|
|
|
|
* internally:
|
|
|
|
* a fileman has a fileman_smart.
|
|
|
|
*
|
|
|
|
* fileman_smart
|
|
|
|
* =============
|
|
|
|
* has a list of fileman_icon of that directory (files).
|
|
|
|
* is created above an icon_canvas
|
|
|
|
* has a list of fileman_file of that directory?
|
|
|
|
* has a list of icons
|
|
|
|
*
|
|
|
|
* fileman_icon
|
|
|
|
* ============
|
|
|
|
* a fileman_icon has a fileman_file associated to it.
|
|
|
|
*
|
|
|
|
* fileman_file
|
|
|
|
* ============
|
|
|
|
* a fileman_file has a fileman_mime_entry
|
|
|
|
*
|
|
|
|
* fileman_mime
|
|
|
|
* ============
|
|
|
|
* a fileman_mime_entry has a list of fileman_mime_actions
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
2005-10-09 17:55:07 -07:00
|
|
|
#include "e.h"
|
|
|
|
|
|
|
|
/****
|
|
|
|
* TODO:
|
2005-10-20 06:08:51 -07:00
|
|
|
* - reset scrollbar positions on dir changes
|
2005-10-09 17:55:07 -07:00
|
|
|
* - dont allow for menus on ".."
|
|
|
|
* - xdnd
|
|
|
|
* - proper mime system
|
|
|
|
* - create x, y, w, h in canvas struct and make them auto update
|
|
|
|
****/
|
|
|
|
|
2005-10-20 06:08:51 -07:00
|
|
|
#ifdef EFM_DEBUG
|
|
|
|
# define D(x) do {printf(__FILE__ ":%d: ", __LINE__); printf x; fflush(stdout);} while (0)
|
|
|
|
#else
|
|
|
|
# define D(x) ((void) 0)
|
|
|
|
#endif
|
|
|
|
|
|
|
|
static void _e_fileman_resize_cb(E_Win *win);
|
|
|
|
static void _e_fileman_delete_cb(E_Win *win);
|
2005-10-25 17:19:52 -07:00
|
|
|
static void _e_fileman_selector_cb(Evas_Object *object, char *file, void *data);
|
2005-10-10 09:33:13 -07:00
|
|
|
static void _e_fileman_free(E_Fileman *fileman);
|
2005-10-30 01:40:37 -07:00
|
|
|
static void _e_fileman_scroll_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y);
|
|
|
|
static void _e_fileman_scroll_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y);
|
|
|
|
static void _e_fileman_scroll_max_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y);
|
|
|
|
static void _e_fileman_scroll_child_size_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y);
|
2005-11-04 17:01:26 -08:00
|
|
|
static int _e_fileman_reconfigure_cb(void *data, int type, void *event);
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI E_Fileman *
|
2005-10-10 09:33:13 -07:00
|
|
|
e_fileman_new(E_Container *con)
|
2005-11-08 18:00:33 -08:00
|
|
|
{
|
|
|
|
char dir[PATH_MAX];
|
|
|
|
|
|
|
|
if (!getcwd(dir, sizeof(dir)))
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
return e_fileman_new_to_dir(con, dir);
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI E_Fileman *
|
2005-11-08 18:00:33 -08:00
|
|
|
e_fileman_new_to_dir(E_Container *con, char *path)
|
2005-10-09 17:55:07 -07:00
|
|
|
{
|
|
|
|
E_Fileman *fileman;
|
2005-10-10 09:33:13 -07:00
|
|
|
E_Manager *man;
|
|
|
|
char dir[PATH_MAX];
|
2005-10-20 06:08:51 -07:00
|
|
|
|
2005-10-09 17:55:07 -07:00
|
|
|
if (!con)
|
2005-10-10 09:33:13 -07:00
|
|
|
{
|
|
|
|
man = e_manager_current_get();
|
|
|
|
if (!man) return NULL;
|
|
|
|
con = e_container_current_get(man);
|
|
|
|
if (!con) con = e_container_number_get(man, 0);
|
|
|
|
if (!con) return NULL;
|
|
|
|
}
|
2005-11-08 18:00:33 -08:00
|
|
|
|
|
|
|
snprintf(dir, PATH_MAX, "%s", path);
|
|
|
|
|
|
|
|
if(!ecore_file_is_dir(dir))
|
|
|
|
if (!getcwd(dir, sizeof(dir)))
|
|
|
|
return NULL;
|
2005-10-10 09:33:13 -07:00
|
|
|
|
|
|
|
fileman = E_OBJECT_ALLOC(E_Fileman, E_FILEMAN_TYPE, _e_fileman_free);
|
2005-10-09 17:55:07 -07:00
|
|
|
if (!fileman) return NULL;
|
|
|
|
|
|
|
|
fileman->con = con;
|
2005-10-10 09:33:13 -07:00
|
|
|
e_object_ref(E_OBJECT(fileman->con));
|
|
|
|
fileman->win = e_win_new(con);
|
|
|
|
|
2005-10-09 17:55:07 -07:00
|
|
|
if (!fileman->win)
|
2005-10-10 09:33:13 -07:00
|
|
|
{
|
|
|
|
free(fileman);
|
|
|
|
return NULL;
|
|
|
|
}
|
2005-10-09 17:55:07 -07:00
|
|
|
|
|
|
|
fileman->xpos = 0;
|
2005-10-10 09:33:13 -07:00
|
|
|
fileman->ypos = 0;
|
|
|
|
|
2005-10-20 06:08:51 -07:00
|
|
|
e_win_delete_callback_set(fileman->win, _e_fileman_delete_cb);
|
2005-10-09 17:55:07 -07:00
|
|
|
fileman->win->data = fileman;
|
2005-10-10 09:33:13 -07:00
|
|
|
|
2005-10-09 17:55:07 -07:00
|
|
|
fileman->evas = e_win_evas_get(fileman->win);
|
2005-10-10 09:33:13 -07:00
|
|
|
|
2005-10-09 17:55:07 -07:00
|
|
|
e_win_name_class_set(fileman->win, "Efm ", "_fileman");
|
2005-10-10 09:33:13 -07:00
|
|
|
e_win_title_set(fileman->win, dir);
|
|
|
|
|
2005-10-19 05:17:42 -07:00
|
|
|
evas_event_freeze(fileman->evas);
|
2005-11-08 18:00:33 -08:00
|
|
|
fileman->smart = e_fm_add(fileman->evas);
|
2005-10-10 09:33:13 -07:00
|
|
|
e_fm_e_win_set(fileman->smart, fileman->win);
|
2005-10-20 06:08:51 -07:00
|
|
|
|
2005-10-30 01:40:37 -07:00
|
|
|
fileman->main = e_scrollframe_add(fileman->evas);
|
|
|
|
e_scrollframe_custom_theme_set(fileman->main, "base/themes/fileman",
|
|
|
|
"fileman/main");
|
|
|
|
e_scrollframe_extern_pan_set(fileman->main, fileman->smart,
|
|
|
|
_e_fileman_scroll_set,
|
|
|
|
_e_fileman_scroll_get,
|
|
|
|
_e_fileman_scroll_max_get,
|
|
|
|
_e_fileman_scroll_child_size_get);
|
|
|
|
|
|
|
|
e_win_resize_callback_set(fileman->win, _e_fileman_resize_cb);
|
2005-11-06 06:40:58 -08:00
|
|
|
e_win_resize(fileman->win, 570, 355);
|
2005-10-20 06:08:51 -07:00
|
|
|
|
2005-11-22 01:27:25 -08:00
|
|
|
e_fm_dir_set(fileman->smart, dir);
|
|
|
|
|
2005-10-30 01:40:37 -07:00
|
|
|
ecore_x_dnd_aware_set(fileman->win->evas_win, 1);
|
2005-10-22 10:02:37 -07:00
|
|
|
|
2005-10-19 05:17:42 -07:00
|
|
|
evas_event_thaw(fileman->evas);
|
|
|
|
|
2005-11-05 03:13:13 -08:00
|
|
|
evas_object_focus_set(fileman->main, 0);
|
2005-11-05 03:33:00 -08:00
|
|
|
evas_object_focus_set(fileman->smart, 1);
|
2005-11-05 03:13:13 -08:00
|
|
|
evas_object_propagate_events_set(fileman->smart, 0);
|
|
|
|
|
2005-11-04 17:01:26 -08:00
|
|
|
fileman->event_handlers = evas_list_append(fileman->event_handlers,
|
|
|
|
ecore_event_handler_add(E_EVENT_FM_RECONFIGURE,
|
|
|
|
_e_fileman_reconfigure_cb,
|
|
|
|
fileman));
|
|
|
|
|
|
|
|
|
2005-10-20 06:08:51 -07:00
|
|
|
D(("e_fileman_new: ok\n"));
|
|
|
|
|
2005-10-10 09:33:13 -07:00
|
|
|
return fileman;
|
|
|
|
}
|
|
|
|
|
2005-10-30 01:40:37 -07:00
|
|
|
|
|
|
|
static void
|
|
|
|
_e_fileman_scroll_set(Evas_Object *obj, Evas_Coord x, Evas_Coord y)
|
|
|
|
{
|
|
|
|
e_fm_scroll_set(obj, x, y);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_fileman_scroll_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y)
|
|
|
|
{
|
|
|
|
e_fm_scroll_get(obj, x, y);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_fileman_scroll_max_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y)
|
|
|
|
{
|
|
|
|
e_fm_scroll_max_get(obj, x, y);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_fileman_scroll_child_size_get(Evas_Object *obj, Evas_Coord *x, Evas_Coord *y)
|
|
|
|
{
|
|
|
|
e_fm_geometry_virtual_get(obj, x, y);
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-10-25 17:19:52 -07:00
|
|
|
e_fileman_selector_enable(E_Fileman *fileman, void (*func)(E_Fileman *fileman, char *file, void *data), void *data)
|
|
|
|
{
|
|
|
|
fileman->selector.func = func;
|
|
|
|
fileman->selector.data = data;
|
2005-12-05 14:20:34 -08:00
|
|
|
e_fm_selector_enable(fileman->smart, _e_fileman_selector_cb, NULL, fileman);
|
2005-10-25 17:19:52 -07:00
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-10-10 09:33:13 -07:00
|
|
|
e_fileman_show(E_Fileman *fileman)
|
|
|
|
{
|
|
|
|
if (!fileman) return;
|
2005-10-20 06:08:51 -07:00
|
|
|
|
|
|
|
D(("e_fileman_show: (%p)\n", fileman));
|
2005-10-10 09:33:13 -07:00
|
|
|
e_win_show(fileman->win);
|
|
|
|
evas_object_show(fileman->main);
|
|
|
|
}
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI void
|
2005-10-10 09:33:13 -07:00
|
|
|
e_fileman_hide(E_Fileman *fileman)
|
|
|
|
{
|
|
|
|
if (!fileman) return;
|
|
|
|
|
2005-10-20 06:08:51 -07:00
|
|
|
D(("e_fileman_hide: (%p)\n", fileman));
|
2005-10-10 09:33:13 -07:00
|
|
|
e_win_hide(fileman->win);
|
|
|
|
evas_object_hide(fileman->main);
|
2005-10-09 17:55:07 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_fileman_free(E_Fileman *fileman)
|
2005-10-10 09:33:13 -07:00
|
|
|
{
|
2005-10-20 06:08:51 -07:00
|
|
|
D(("e_fileman_free: (%p)\n", fileman));
|
2005-10-21 19:07:39 -07:00
|
|
|
while (fileman->event_handlers)
|
|
|
|
{
|
|
|
|
ecore_event_handler_del(fileman->event_handlers->data);
|
|
|
|
fileman->event_handlers = evas_list_remove_list(fileman->event_handlers, fileman->event_handlers);
|
|
|
|
}
|
2005-10-30 01:40:37 -07:00
|
|
|
|
2005-10-09 17:55:07 -07:00
|
|
|
evas_object_del(fileman->smart);
|
2005-10-10 09:33:13 -07:00
|
|
|
evas_object_del(fileman->main);
|
|
|
|
e_object_del(E_OBJECT(fileman->win));
|
2005-10-23 04:25:35 -07:00
|
|
|
free(fileman);
|
2005-10-09 17:55:07 -07:00
|
|
|
}
|
2005-10-14 04:55:49 -07:00
|
|
|
|
2005-10-10 09:33:13 -07:00
|
|
|
static void
|
2005-10-20 06:08:51 -07:00
|
|
|
_e_fileman_resize_cb(E_Win *win)
|
2005-10-10 09:33:13 -07:00
|
|
|
{
|
|
|
|
E_Fileman *fileman;
|
2005-11-04 13:05:57 -08:00
|
|
|
|
2005-10-10 09:33:13 -07:00
|
|
|
fileman = win->data;
|
|
|
|
evas_object_resize(fileman->main, win->w, win->h);
|
|
|
|
}
|
2005-10-09 17:55:07 -07:00
|
|
|
|
2005-10-10 09:33:13 -07:00
|
|
|
static void
|
2005-10-20 06:08:51 -07:00
|
|
|
_e_fileman_delete_cb(E_Win *win)
|
2005-10-09 17:55:07 -07:00
|
|
|
{
|
2005-10-10 09:33:13 -07:00
|
|
|
E_Fileman *fileman;
|
|
|
|
|
|
|
|
fileman = win->data;
|
2005-10-21 05:24:57 -07:00
|
|
|
D(("e_fileman_delete_cb: (%p)\n", fileman));
|
2005-10-10 09:33:13 -07:00
|
|
|
e_object_del(E_OBJECT(fileman));
|
2005-10-09 17:55:07 -07:00
|
|
|
}
|
2005-10-10 09:33:13 -07:00
|
|
|
|
2005-10-25 17:19:52 -07:00
|
|
|
static void
|
|
|
|
_e_fileman_selector_cb(Evas_Object *object, char *file, void *data)
|
|
|
|
{
|
|
|
|
E_Fileman *fileman;
|
|
|
|
|
|
|
|
fileman = data;
|
|
|
|
fileman->selector.func(fileman, file, fileman->selector.data);
|
|
|
|
//e_object_del(E_OBJECT(fileman));
|
|
|
|
}
|
2005-11-04 17:01:26 -08:00
|
|
|
|
|
|
|
static int
|
2005-11-05 04:42:59 -08:00
|
|
|
_e_fileman_reconfigure_cb(void *data, int type, void *event)
|
2005-11-04 17:01:26 -08:00
|
|
|
{
|
|
|
|
E_Event_Fm_Reconfigure *ev;
|
|
|
|
E_Fileman *fileman;
|
|
|
|
|
|
|
|
fileman = data;
|
|
|
|
ev = event;
|
|
|
|
|
|
|
|
e_scrollframe_child_region_show(fileman->main, ev->x, ev->y, ev->w, ev->h);
|
2005-11-05 04:42:59 -08:00
|
|
|
return 1;
|
2005-11-04 17:01:26 -08:00
|
|
|
}
|