2005-10-13 08:15:27 -07:00
|
|
|
/*
|
|
|
|
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
|
|
|
|
*/
|
|
|
|
#include "e.h"
|
|
|
|
|
|
|
|
/* local subsystem functions */
|
|
|
|
static void _e_config_dialog_free(E_Config_Dialog *cfd);
|
|
|
|
static void _e_config_dialog_go(E_Config_Dialog *cfd, E_Config_Dialog_CFData_Type type);
|
|
|
|
static void _e_config_dialog_cb_dialog_del(void *obj);
|
|
|
|
static void _e_config_dialog_cb_ok(void *data, E_Dialog *dia);
|
|
|
|
static void _e_config_dialog_cb_apply(void *data, E_Dialog *dia);
|
|
|
|
static void _e_config_dialog_cb_advanced(void *data, void *data2);
|
|
|
|
static void _e_config_dialog_cb_basic(void *data, void *data2);
|
2005-10-16 00:32:12 -07:00
|
|
|
static void _e_config_dialog_cb_changed(void *data, Evas_Object *obj);
|
2006-01-21 04:44:48 -08:00
|
|
|
static void _e_config_dialog_cb_close(void *data, E_Dialog *dia);
|
2005-10-13 08:15:27 -07:00
|
|
|
|
|
|
|
/* local subsystem globals */
|
|
|
|
|
|
|
|
/* externally accessible functions */
|
|
|
|
|
2006-01-07 02:39:46 -08:00
|
|
|
EAPI E_Config_Dialog *
|
2006-03-02 04:03:48 -08:00
|
|
|
e_config_dialog_new(E_Container *con, const char *title, const char *icon, int icon_size, E_Config_Dialog_View *view, void *data)
|
2005-10-13 08:15:27 -07:00
|
|
|
{
|
|
|
|
E_Config_Dialog *cfd;
|
|
|
|
|
|
|
|
cfd = E_OBJECT_ALLOC(E_Config_Dialog, E_CONFIG_DIALOG_TYPE, _e_config_dialog_free);
|
2006-01-22 06:18:20 -08:00
|
|
|
cfd->view = view;
|
2005-10-13 08:15:27 -07:00
|
|
|
cfd->con = con;
|
2005-12-03 07:39:25 -08:00
|
|
|
cfd->title = evas_stringshare_add(title);
|
2005-10-14 20:09:46 -07:00
|
|
|
if (icon)
|
|
|
|
{
|
2005-12-03 07:39:25 -08:00
|
|
|
cfd->icon = evas_stringshare_add(icon);
|
2005-10-14 20:09:46 -07:00
|
|
|
cfd->icon_size = icon_size;
|
|
|
|
}
|
2005-10-14 01:34:12 -07:00
|
|
|
cfd->data = data;
|
2006-01-21 03:48:30 -08:00
|
|
|
cfd->hide_buttons = 1;
|
2006-02-13 07:36:56 -08:00
|
|
|
cfd->cfg_changed = 0;
|
2006-01-21 03:48:30 -08:00
|
|
|
|
2006-02-15 12:29:33 -08:00
|
|
|
if (cfd->view->override_auto_apply)
|
|
|
|
{
|
|
|
|
/* Dialog Requested To Not Auto-Apply */
|
|
|
|
if ((cfd->view->basic.apply_cfdata) || (cfd->view->advanced.apply_cfdata))
|
|
|
|
cfd->hide_buttons = 0;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
/* Ok To Override, Or Not Specified. Use Config Value */
|
|
|
|
if (e_config->cfgdlg_auto_apply)
|
|
|
|
cfd->hide_buttons = 1;
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if ((cfd->view->basic.apply_cfdata) || (cfd->view->advanced.apply_cfdata))
|
|
|
|
cfd->hide_buttons = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
switch (e_config->cfgdlg_default_mode)
|
|
|
|
{
|
|
|
|
case E_CONFIG_DIALOG_CFDATA_TYPE_BASIC:
|
|
|
|
if (cfd->view->basic.create_widgets)
|
|
|
|
_e_config_dialog_go(cfd, E_CONFIG_DIALOG_CFDATA_TYPE_BASIC);
|
|
|
|
break;
|
|
|
|
case E_CONFIG_DIALOG_CFDATA_TYPE_ADVANCED:
|
|
|
|
if (cfd->view->advanced.create_widgets)
|
|
|
|
_e_config_dialog_go(cfd, E_CONFIG_DIALOG_CFDATA_TYPE_ADVANCED);
|
|
|
|
else if (cfd->view->basic.create_widgets)
|
|
|
|
_e_config_dialog_go(cfd, E_CONFIG_DIALOG_CFDATA_TYPE_BASIC);
|
|
|
|
break;
|
|
|
|
}
|
2006-01-21 03:48:30 -08:00
|
|
|
|
2005-10-13 08:15:27 -07:00
|
|
|
return cfd;
|
|
|
|
}
|
|
|
|
|
|
|
|
/* local subsystem functions */
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_config_dialog_free(E_Config_Dialog *cfd)
|
|
|
|
{
|
2005-12-04 04:03:59 -08:00
|
|
|
if (cfd->title) evas_stringshare_del(cfd->title);
|
|
|
|
if (cfd->icon) evas_stringshare_del(cfd->icon);
|
2005-10-13 08:15:27 -07:00
|
|
|
if (cfd->cfdata)
|
|
|
|
{
|
2006-01-22 06:18:20 -08:00
|
|
|
cfd->view->free_cfdata(cfd, cfd->cfdata);
|
2005-10-13 08:15:27 -07:00
|
|
|
cfd->cfdata = NULL;
|
|
|
|
}
|
|
|
|
if (cfd->dia)
|
|
|
|
{
|
|
|
|
e_object_del_attach_func_set(E_OBJECT(cfd->dia), NULL);
|
|
|
|
e_object_del(E_OBJECT(cfd->dia));
|
|
|
|
cfd->dia = NULL;
|
|
|
|
}
|
2006-01-22 06:18:20 -08:00
|
|
|
E_FREE(cfd->view);
|
2005-10-13 08:15:27 -07:00
|
|
|
free(cfd);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_config_dialog_go(E_Config_Dialog *cfd, E_Config_Dialog_CFData_Type type)
|
|
|
|
{
|
|
|
|
E_Dialog *pdia;
|
|
|
|
Evas_Object *o, *ob;
|
|
|
|
Evas_Coord mw = 0, mh = 0;
|
|
|
|
|
|
|
|
pdia = cfd->dia;
|
|
|
|
cfd->dia = e_dialog_new(cfd->con);
|
|
|
|
cfd->dia->data = cfd;
|
|
|
|
e_object_del_attach_func_set(E_OBJECT(cfd->dia), _e_config_dialog_cb_dialog_del);
|
|
|
|
e_dialog_title_set(cfd->dia, cfd->title);
|
2005-10-14 20:09:46 -07:00
|
|
|
if (cfd->icon) e_dialog_icon_set(cfd->dia, cfd->icon, cfd->icon_size);
|
|
|
|
|
2006-01-22 06:18:20 -08:00
|
|
|
if (!cfd->cfdata) cfd->cfdata = cfd->view->create_cfdata(cfd);
|
2005-10-13 08:15:27 -07:00
|
|
|
|
|
|
|
if (type == E_CONFIG_DIALOG_CFDATA_TYPE_BASIC)
|
|
|
|
{
|
2006-01-22 06:18:20 -08:00
|
|
|
if (cfd->view->advanced.create_widgets)
|
2005-10-13 08:15:27 -07:00
|
|
|
{
|
|
|
|
o = e_widget_list_add(e_win_evas_get(cfd->dia->win), 0, 0);
|
2006-01-22 06:18:20 -08:00
|
|
|
ob = cfd->view->basic.create_widgets(cfd, e_win_evas_get(cfd->dia->win), cfd->cfdata);
|
2005-10-13 08:15:27 -07:00
|
|
|
e_widget_list_object_append(o, ob, 1, 1, 0.0);
|
|
|
|
ob = e_widget_button_add(e_win_evas_get(cfd->dia->win),
|
2006-01-21 03:48:30 -08:00
|
|
|
_("Advanced"), "widget/new_dialog",
|
2005-10-13 08:15:27 -07:00
|
|
|
_e_config_dialog_cb_advanced, cfd, NULL);
|
|
|
|
e_widget_list_object_append(o, ob, 0, 0, 1.0);
|
|
|
|
}
|
|
|
|
else
|
2006-01-22 06:18:20 -08:00
|
|
|
o = cfd->view->basic.create_widgets(cfd, e_win_evas_get(cfd->dia->win), cfd->cfdata);
|
2005-10-13 08:15:27 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2006-01-22 06:18:20 -08:00
|
|
|
if (cfd->view->basic.create_widgets)
|
2005-10-13 08:15:27 -07:00
|
|
|
{
|
|
|
|
o = e_widget_list_add(e_win_evas_get(cfd->dia->win), 0, 0);
|
2006-01-22 06:18:20 -08:00
|
|
|
ob = cfd->view->advanced.create_widgets(cfd, e_win_evas_get(cfd->dia->win), cfd->cfdata);
|
2005-10-13 08:15:27 -07:00
|
|
|
e_widget_list_object_append(o, ob, 1, 1, 0.0);
|
|
|
|
ob = e_widget_button_add(e_win_evas_get(cfd->dia->win),
|
2006-01-21 03:48:30 -08:00
|
|
|
_("Basic"), "widget/new_dialog",
|
2005-10-13 08:15:27 -07:00
|
|
|
_e_config_dialog_cb_basic, cfd, NULL);
|
|
|
|
e_widget_list_object_append(o, ob, 0, 0, 1.0);
|
|
|
|
}
|
|
|
|
else
|
2006-01-22 06:18:20 -08:00
|
|
|
o = cfd->view->advanced.create_widgets(cfd, e_win_evas_get(cfd->dia->win), cfd->cfdata);
|
2005-10-13 08:15:27 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
e_widget_min_size_get(o, &mw, &mh);
|
2005-10-16 00:32:12 -07:00
|
|
|
e_widget_on_change_hook_set(o, _e_config_dialog_cb_changed, cfd);
|
2005-10-13 08:15:27 -07:00
|
|
|
e_dialog_content_set(cfd->dia, o, mw, mh);
|
|
|
|
|
2005-12-20 18:45:24 -08:00
|
|
|
if (!cfd->hide_buttons)
|
2005-12-17 03:21:54 -08:00
|
|
|
{
|
2005-12-20 18:45:24 -08:00
|
|
|
e_dialog_button_add(cfd->dia, _("OK"), NULL, _e_config_dialog_cb_ok, cfd);
|
|
|
|
e_dialog_button_add(cfd->dia, _("Apply"), NULL, _e_config_dialog_cb_apply, cfd);
|
2006-02-13 07:36:56 -08:00
|
|
|
if (!cfd->cfg_changed)
|
|
|
|
{
|
|
|
|
e_dialog_button_disable_num_set(cfd->dia, 0, 1);
|
|
|
|
e_dialog_button_disable_num_set(cfd->dia, 1, 1);
|
|
|
|
}
|
2005-12-17 03:21:54 -08:00
|
|
|
}
|
2006-01-23 10:49:53 -08:00
|
|
|
/* FIXME: This wont catch the window border close button, but that is probably not cancelable. */
|
2006-01-21 04:44:48 -08:00
|
|
|
e_dialog_button_add(cfd->dia, _("Close"), NULL, _e_config_dialog_cb_close, cfd);
|
2005-12-27 09:16:58 -08:00
|
|
|
if (!pdia)
|
|
|
|
{
|
|
|
|
e_win_centered_set(cfd->dia->win, 1);
|
|
|
|
e_dialog_show(cfd->dia);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
int x, y;
|
|
|
|
|
|
|
|
e_dialog_show(cfd->dia);
|
|
|
|
x = pdia->win->border->x + ((pdia->win->w - cfd->dia->win->w) / 2);
|
|
|
|
y = pdia->win->border->y + ((pdia->win->h - cfd->dia->win->h) / 2);
|
|
|
|
if (x < 0) x = 0;
|
|
|
|
if (y < 0) y = 0;
|
|
|
|
if ((x + cfd->dia->win->w) > (pdia->win->container->w))
|
|
|
|
x = pdia->win->container->w - cfd->dia->win->w;
|
|
|
|
if ((y + cfd->dia->win->h) > (pdia->win->container->h))
|
|
|
|
x = pdia->win->container->h - cfd->dia->win->h;
|
|
|
|
e_win_move(cfd->dia->win, x, y);
|
|
|
|
e_win_placed_set(cfd->dia->win, 1);
|
|
|
|
}
|
2005-10-13 08:15:27 -07:00
|
|
|
cfd->view_type = type;
|
2005-12-27 09:16:58 -08:00
|
|
|
|
2005-10-13 08:15:27 -07:00
|
|
|
if (pdia)
|
|
|
|
{
|
|
|
|
e_object_del_attach_func_set(E_OBJECT(pdia), NULL);
|
|
|
|
e_object_del(E_OBJECT(pdia));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_config_dialog_cb_dialog_del(void *obj)
|
|
|
|
{
|
|
|
|
E_Dialog *dia;
|
|
|
|
E_Config_Dialog *cfd;
|
2006-01-22 06:18:20 -08:00
|
|
|
|
2005-10-13 08:15:27 -07:00
|
|
|
dia = obj;
|
|
|
|
cfd = dia->data;
|
|
|
|
cfd->dia = NULL;
|
|
|
|
e_object_del(E_OBJECT(cfd));
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_config_dialog_cb_ok(void *data, E_Dialog *dia)
|
|
|
|
{
|
|
|
|
E_Config_Dialog *cfd;
|
2005-10-14 02:48:13 -07:00
|
|
|
int ok = 0;
|
|
|
|
|
2005-10-13 08:15:27 -07:00
|
|
|
cfd = dia->data;
|
|
|
|
if (cfd->view_type == E_CONFIG_DIALOG_CFDATA_TYPE_BASIC)
|
2006-01-21 03:48:30 -08:00
|
|
|
{
|
2006-01-22 06:18:20 -08:00
|
|
|
if (cfd->view->basic.apply_cfdata)
|
|
|
|
ok = cfd->view->basic.apply_cfdata(cfd, cfd->cfdata);
|
2006-01-21 03:48:30 -08:00
|
|
|
}
|
2005-10-13 08:15:27 -07:00
|
|
|
else
|
2006-01-21 03:48:30 -08:00
|
|
|
{
|
2006-01-22 06:18:20 -08:00
|
|
|
if (cfd->view->advanced.apply_cfdata)
|
|
|
|
ok = cfd->view->advanced.apply_cfdata(cfd, cfd->cfdata);
|
2006-01-21 03:48:30 -08:00
|
|
|
}
|
2005-10-14 02:48:13 -07:00
|
|
|
if (ok) e_object_del(E_OBJECT(cfd));
|
2005-10-13 08:15:27 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_config_dialog_cb_apply(void *data, E_Dialog *dia)
|
|
|
|
{
|
|
|
|
E_Config_Dialog *cfd;
|
2005-10-20 05:49:47 -07:00
|
|
|
int ok = 0;
|
2005-10-13 08:15:27 -07:00
|
|
|
|
|
|
|
cfd = dia->data;
|
|
|
|
if (cfd->view_type == E_CONFIG_DIALOG_CFDATA_TYPE_BASIC)
|
2006-01-21 03:48:30 -08:00
|
|
|
{
|
2006-01-22 06:18:20 -08:00
|
|
|
if (cfd->view->basic.apply_cfdata)
|
|
|
|
ok = cfd->view->basic.apply_cfdata(cfd, cfd->cfdata);
|
2006-01-21 03:48:30 -08:00
|
|
|
}
|
2005-10-13 08:15:27 -07:00
|
|
|
else
|
2006-01-21 03:48:30 -08:00
|
|
|
{
|
2006-01-22 06:18:20 -08:00
|
|
|
if (cfd->view->advanced.apply_cfdata)
|
|
|
|
ok = cfd->view->advanced.apply_cfdata(cfd, cfd->cfdata);
|
2006-02-15 12:29:33 -08:00
|
|
|
}
|
2006-01-21 03:48:30 -08:00
|
|
|
if ((ok) && (!cfd->hide_buttons))
|
2005-10-20 05:49:47 -07:00
|
|
|
{
|
2006-02-13 07:36:56 -08:00
|
|
|
cfd->cfg_changed = 0;
|
2005-10-20 05:49:47 -07:00
|
|
|
e_dialog_button_disable_num_set(cfd->dia, 0, 1);
|
|
|
|
e_dialog_button_disable_num_set(cfd->dia, 1, 1);
|
|
|
|
}
|
2005-10-13 08:15:27 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_config_dialog_cb_advanced(void *data, void *data2)
|
|
|
|
{
|
|
|
|
E_Config_Dialog *cfd;
|
|
|
|
|
|
|
|
cfd = data;
|
|
|
|
_e_config_dialog_go(cfd, E_CONFIG_DIALOG_CFDATA_TYPE_ADVANCED);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_config_dialog_cb_basic(void *data, void *data2)
|
|
|
|
{
|
|
|
|
E_Config_Dialog *cfd;
|
|
|
|
|
|
|
|
cfd = data;
|
|
|
|
_e_config_dialog_go(cfd, E_CONFIG_DIALOG_CFDATA_TYPE_BASIC);
|
|
|
|
}
|
2005-10-16 00:32:12 -07:00
|
|
|
|
|
|
|
static void
|
|
|
|
_e_config_dialog_cb_changed(void *data, Evas_Object *obj)
|
|
|
|
{
|
|
|
|
E_Config_Dialog *cfd;
|
2006-02-15 12:29:33 -08:00
|
|
|
int ok = 0;
|
2005-10-16 00:32:12 -07:00
|
|
|
|
|
|
|
cfd = data;
|
2006-01-21 03:48:30 -08:00
|
|
|
if (!cfd->hide_buttons)
|
|
|
|
{
|
2006-02-13 07:36:56 -08:00
|
|
|
cfd->cfg_changed = 1;
|
2006-01-21 03:48:30 -08:00
|
|
|
e_dialog_button_disable_num_set(cfd->dia, 0, 0);
|
|
|
|
e_dialog_button_disable_num_set(cfd->dia, 1, 0);
|
|
|
|
}
|
2006-02-15 12:29:33 -08:00
|
|
|
else
|
|
|
|
{
|
|
|
|
if (cfd->view_type == E_CONFIG_DIALOG_CFDATA_TYPE_BASIC)
|
|
|
|
{
|
|
|
|
if (cfd->view->basic.apply_cfdata)
|
|
|
|
ok = cfd->view->basic.apply_cfdata(cfd, cfd->cfdata);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (cfd->view->advanced.apply_cfdata)
|
|
|
|
ok = cfd->view->advanced.apply_cfdata(cfd, cfd->cfdata);
|
|
|
|
}
|
|
|
|
}
|
2005-10-16 00:32:12 -07:00
|
|
|
}
|
2006-01-21 04:44:48 -08:00
|
|
|
|
|
|
|
static void
|
|
|
|
_e_config_dialog_cb_close(void *data, E_Dialog *dia)
|
|
|
|
{
|
|
|
|
E_Config_Dialog *cfd;
|
|
|
|
int ok = 1;
|
|
|
|
|
|
|
|
cfd = dia->data;
|
2006-01-22 06:18:20 -08:00
|
|
|
if (cfd->view->close_cfdata)
|
|
|
|
ok = cfd->view->close_cfdata(cfd, cfd->cfdata);
|
2006-01-21 04:44:48 -08:00
|
|
|
|
|
|
|
if (ok)
|
|
|
|
e_object_del(E_OBJECT(dia));
|
|
|
|
}
|