3 /* local subsystem functions */
4 static void _e_config_dialog_free(E_Config_Dialog *cfd);
5 static void _e_config_dialog_go(E_Config_Dialog *cfd, E_Config_Dialog_CFData_Type type);
6 static Eina_Bool _e_config_dialog_cb_auto_apply_timer(void *data);
7 static void _e_config_dialog_cb_dialog_del(void *obj);
8 static void _e_config_dialog_cb_ok(void *data, E_Dialog *dia);
9 static void _e_config_dialog_cb_apply(void *data, E_Dialog *dia);
10 static void _e_config_dialog_cb_advanced(void *data, void *data2);
11 static void _e_config_dialog_cb_basic(void *data, void *data2);
12 static int _e_config_dialog_check_changed(E_Config_Dialog *cfd, unsigned char def);
13 static void _e_config_dialog_cb_changed(void *data, Evas_Object *obj);
14 static void _e_config_dialog_cb_close(void *data, E_Dialog *dia);
16 /* local subsystem globals */
17 static Eina_List *_e_config_dialog_list = NULL;
19 /* externally accessible functions */
22 * Creates a new dialog
24 * @param con the container the dialog will be added too
25 * @param title to display for the dialog
26 * @param name the name used to register the window in e
27 * @param class the call used to register the window in e
28 * @param icon the path to the icon file
29 * @param icon_size is of the width and height of the icon
30 * @param view the callbacks used to create the dialog and save the settings
31 * @param data additional data to attach to the dialog, will be passed to the callbacks
32 * @return returns the created dialog. Null on failure
34 EAPI E_Config_Dialog *
35 e_config_dialog_new(E_Container *con, const char *title, const char *name, const char *class, const char *icon, int icon_size, E_Config_Dialog_View *view, void *data)
39 cfd = E_OBJECT_ALLOC(E_Config_Dialog, E_CONFIG_DIALOG_TYPE,
40 _e_config_dialog_free);
43 cfd->title = eina_stringshare_add(title);
44 cfd->name = eina_stringshare_add(name);
45 cfd->class = eina_stringshare_add(class);
48 cfd->icon = eina_stringshare_add(icon);
49 cfd->icon_size = icon_size;
52 cfd->hide_buttons = 1;
54 cfd->cfg_changed_auto = 1;
56 if (cfd->view->override_auto_apply)
58 /* Dialog Requested To Not Auto-Apply */
59 if ((cfd->view->basic.apply_cfdata) ||
60 (cfd->view->advanced.apply_cfdata))
61 cfd->hide_buttons = 0;
65 /* Ok To Override, Or Not Specified. Use Config Value */
66 if (e_config->cfgdlg_auto_apply)
67 cfd->hide_buttons = 1;
70 if ((cfd->view->basic.apply_cfdata) ||
71 (cfd->view->advanced.apply_cfdata))
72 cfd->hide_buttons = 0;
76 switch (e_config->cfgdlg_default_mode)
78 case E_CONFIG_DIALOG_CFDATA_TYPE_BASIC:
79 if (cfd->view->basic.create_widgets)
80 _e_config_dialog_go(cfd, E_CONFIG_DIALOG_CFDATA_TYPE_BASIC);
83 case E_CONFIG_DIALOG_CFDATA_TYPE_ADVANCED:
84 if (cfd->view->advanced.create_widgets)
85 _e_config_dialog_go(cfd, E_CONFIG_DIALOG_CFDATA_TYPE_ADVANCED);
86 else if (cfd->view->basic.create_widgets)
87 _e_config_dialog_go(cfd, E_CONFIG_DIALOG_CFDATA_TYPE_BASIC);
90 _e_config_dialog_list = eina_list_append(_e_config_dialog_list, cfd);
96 e_config_dialog_find(const char *name, const char *class)
101 EINA_LIST_FOREACH(_e_config_dialog_list, l, cfd)
103 if ((!e_util_strcmp(name, cfd->name)) &&
104 (!e_util_strcmp(class, cfd->class)))
108 z = e_util_zone_current_get(e_manager_current_get());
109 e_border_uniconify(cfd->dia->win->border);
110 e_win_raise(cfd->dia->win);
111 if (z->container == cfd->dia->win->border->zone->container)
112 e_border_desk_set(cfd->dia->win->border, e_desk_current_get(z));
115 if (!cfd->dia->win->border->sticky)
116 e_desk_show(cfd->dia->win->border->desk);
117 ecore_x_pointer_warp(cfd->dia->win->border->zone->container->win,
118 cfd->dia->win->border->zone->x + (cfd->dia->win->border->zone->w / 2),
119 cfd->dia->win->border->zone->y + (cfd->dia->win->border->zone->h / 2));
121 e_border_unshade(cfd->dia->win->border, E_DIRECTION_DOWN);
122 if ((e_config->focus_setting == E_FOCUS_NEW_DIALOG) ||
123 (e_config->focus_setting == E_FOCUS_NEW_WINDOW))
124 e_border_focus_set(cfd->dia->win->border, 1, 1);
131 EAPI E_Config_Dialog *
132 e_config_dialog_get(const char *name, const char *class)
135 E_Config_Dialog *cfd;
137 EINA_LIST_FOREACH(_e_config_dialog_list, l, cfd)
140 if ((!e_util_strcmp(name, cfd->name)) &&
141 (!e_util_strcmp(class, cfd->class)))
149 /* local subsystem functions */
151 _e_config_dialog_free(E_Config_Dialog *cfd)
153 _e_config_dialog_list = eina_list_remove(_e_config_dialog_list, cfd);
154 if (cfd->auto_apply_timer) _e_config_dialog_cb_auto_apply_timer(cfd);
155 if (cfd->title) eina_stringshare_del(cfd->title);
156 if (cfd->name) eina_stringshare_del(cfd->name);
157 if (cfd->class) eina_stringshare_del(cfd->class);
158 if (cfd->icon) eina_stringshare_del(cfd->icon);
161 cfd->view->free_cfdata(cfd, cfd->cfdata);
166 e_object_del_attach_func_set(E_OBJECT(cfd->dia), NULL);
167 e_object_del(E_OBJECT(cfd->dia));
175 _e_config_dialog_go(E_Config_Dialog *cfd, E_Config_Dialog_CFData_Type type)
179 Evas_Object *o, *ob, *sf;
180 Evas_Coord mw = 0, mh = 0;
185 /* FIXME: get name/class form new call and use here */
186 /* if (type == E_CONFIG_DIALOG_CFDATA_TYPE_BASIC)
187 * snprintf(buf, sizeof(buf), "%s...%s", cfd->class, "BASIC");
189 * snprintf(buf, sizeof(buf), "%s...%s", cfd->class, "ADVANCED"); */
190 snprintf(buf, sizeof(buf), "_config::%s", cfd->class);
192 if (!pdia) /* creating window for the first time */
194 if ((cfd->view->normal_win) || (e_config->cfgdlg_normal_wins))
195 cfd->dia = e_dialog_normal_win_new(cfd->con, cfd->name, buf);
197 cfd->dia = e_dialog_new(cfd->con, cfd->name, buf);
198 e_object_del_attach_func_set(E_OBJECT(cfd->dia),
199 _e_config_dialog_cb_dialog_del);
200 } /* window was created before - deleting content only */
201 else if (cfd->dia->content_object)
202 evas_object_del(cfd->dia->content_object);
204 cfd->view_type = type;
205 cfd->dia->data = cfd;
206 e_dialog_title_set(cfd->dia, cfd->title);
207 cfdata = cfd->cfdata;
208 if (!cfd->cfdata) cfd->cfdata = cfd->view->create_cfdata(cfd);
210 evas = e_win_evas_get(cfd->dia->win);
211 if (type == E_CONFIG_DIALOG_CFDATA_TYPE_BASIC)
213 if (cfd->view->advanced.create_widgets)
215 o = e_widget_list_add(evas, 0, 0);
216 ob = cfd->view->basic.create_widgets(cfd, evas, cfd->cfdata);
217 if (cfd->view->scroll)
219 e_widget_size_min_resize(ob);
220 sf = e_widget_scrollframe_simple_add(evas, ob);
221 e_widget_list_object_append(o, sf, 1, 1, 0.0);
224 e_widget_list_object_append(o, ob, 1, 1, 0.0);
225 ob = e_widget_button_add(evas,
226 _("Advanced"), "go-next",
227 _e_config_dialog_cb_advanced, cfd, NULL);
228 e_widget_list_object_append(o, ob, 0, 0, 1.0);
232 o = cfd->view->basic.create_widgets(cfd, evas, cfd->cfdata);
233 if (cfd->view->scroll)
235 e_widget_size_min_resize(o);
236 o = e_widget_scrollframe_simple_add(evas, o);
242 if (cfd->view->basic.create_widgets)
244 o = e_widget_list_add(evas, 0, 0);
245 ob = cfd->view->advanced.create_widgets(cfd, evas, cfd->cfdata);
246 if (cfd->view->scroll)
248 e_widget_size_min_resize(ob);
249 sf = e_widget_scrollframe_simple_add(evas, ob);
250 e_widget_list_object_append(o, sf, 1, 1, 0.0);
253 e_widget_list_object_append(o, ob, 1, 1, 0.0);
254 ob = e_widget_button_add(evas,
255 _("Basic"), "go-next",
256 _e_config_dialog_cb_basic, cfd, NULL);
257 e_widget_list_object_append(o, ob, 0, 0, 1.0);
261 o = cfd->view->advanced.create_widgets(cfd, evas, cfd->cfdata);
262 if (cfd->view->scroll)
264 e_widget_size_min_resize(o);
265 o = e_widget_scrollframe_simple_add(evas, o);
270 e_widget_size_min_get(o, &mw, &mh);
271 e_widget_on_change_hook_set(o, _e_config_dialog_cb_changed, cfd);
272 e_dialog_content_set(cfd->dia, o, mw, mh);
274 if (!pdia) /* dialog window was created in this function call - need to create buttons once */
276 if (!cfd->hide_buttons)
278 e_dialog_button_add(cfd->dia, _("OK"), NULL,
279 _e_config_dialog_cb_ok, cfd);
280 e_dialog_button_add(cfd->dia, _("Apply"), NULL,
281 _e_config_dialog_cb_apply, cfd);
282 if (!cfd->cfg_changed)
284 e_dialog_button_disable_num_set(cfd->dia, 0, 1);
285 e_dialog_button_disable_num_set(cfd->dia, 1, 1);
288 e_dialog_button_add(cfd->dia, _("Close"), NULL,
289 _e_config_dialog_cb_close, cfd);
292 if (cfdata && cfd->cfg_changed_auto)
296 changed = _e_config_dialog_check_changed(cfd, 0);
297 e_config_dialog_changed_set(cfd, changed);
300 e_dialog_show(cfd->dia);
301 if (cfd->icon) e_dialog_border_icon_set(cfd->dia, cfd->icon);
305 _e_config_dialog_cb_auto_apply_timer(void *data)
307 E_Config_Dialog *cfd;
311 if (cfd->auto_apply_timer) ecore_timer_del(cfd->auto_apply_timer);
312 cfd->auto_apply_timer = NULL;
314 if (cfd->view_type == E_CONFIG_DIALOG_CFDATA_TYPE_BASIC)
316 if (cfd->view->basic.apply_cfdata)
317 cfd->view->basic.apply_cfdata(cfd, cfd->cfdata);
321 if (cfd->view->advanced.apply_cfdata)
322 cfd->view->advanced.apply_cfdata(cfd, cfd->cfdata);
324 return ECORE_CALLBACK_CANCEL;
328 _e_config_dialog_cb_dialog_del(void *obj)
331 E_Config_Dialog *cfd;
335 if (cfd->auto_apply_timer) _e_config_dialog_cb_auto_apply_timer(cfd);
337 e_object_del(E_OBJECT(cfd));
341 _e_config_dialog_cb_ok(void *data __UNUSED__, E_Dialog *dia)
343 E_Config_Dialog *cfd;
347 if (cfd->view_type == E_CONFIG_DIALOG_CFDATA_TYPE_BASIC)
349 if (cfd->view->basic.apply_cfdata)
350 ok = cfd->view->basic.apply_cfdata(cfd, cfd->cfdata);
354 if (cfd->view->advanced.apply_cfdata)
355 ok = cfd->view->advanced.apply_cfdata(cfd, cfd->cfdata);
358 e_util_defer_object_del(E_OBJECT(cfd));
362 _e_config_dialog_cb_apply(void *data __UNUSED__, E_Dialog *dia)
364 E_Config_Dialog *cfd;
368 if (cfd->view_type == E_CONFIG_DIALOG_CFDATA_TYPE_BASIC)
370 if (cfd->view->basic.apply_cfdata)
371 ok = cfd->view->basic.apply_cfdata(cfd, cfd->cfdata);
375 if (cfd->view->advanced.apply_cfdata)
376 ok = cfd->view->advanced.apply_cfdata(cfd, cfd->cfdata);
378 if ((ok) && (!cfd->hide_buttons))
380 cfd->cfg_changed = 0;
381 e_dialog_button_disable_num_set(cfd->dia, 0, 1);
382 e_dialog_button_disable_num_set(cfd->dia, 1, 1);
387 _e_config_dialog_cb_advanced(void *data, void *data2 __UNUSED__)
389 E_Config_Dialog *cfd;
392 if (cfd->auto_apply_timer) _e_config_dialog_cb_auto_apply_timer(cfd);
393 _e_config_dialog_go(cfd, E_CONFIG_DIALOG_CFDATA_TYPE_ADVANCED);
397 _e_config_dialog_cb_basic(void *data, void *data2 __UNUSED__)
399 E_Config_Dialog *cfd;
402 if (cfd->auto_apply_timer) _e_config_dialog_cb_auto_apply_timer(cfd);
403 _e_config_dialog_go(cfd, E_CONFIG_DIALOG_CFDATA_TYPE_BASIC);
407 _e_config_dialog_changed(E_Config_Dialog *cfd)
409 if (!cfd->hide_buttons)
411 cfd->cfg_changed = 1;
412 e_dialog_button_disable_num_set(cfd->dia, 0, 0);
413 e_dialog_button_disable_num_set(cfd->dia, 1, 0);
417 if (cfd->auto_apply_timer) ecore_timer_del(cfd->auto_apply_timer);
418 cfd->auto_apply_timer = NULL;
419 cfd->auto_apply_timer =
420 ecore_timer_add(0.5, _e_config_dialog_cb_auto_apply_timer, cfd);
425 _e_config_dialog_unchanged(E_Config_Dialog *cfd)
427 if (!cfd->hide_buttons)
429 e_dialog_button_disable_num_set(cfd->dia, 0, 1);
430 e_dialog_button_disable_num_set(cfd->dia, 1, 1);
434 if (cfd->auto_apply_timer)
436 ecore_timer_del(cfd->auto_apply_timer);
437 cfd->auto_apply_timer = NULL;
443 _e_config_dialog_check_changed(E_Config_Dialog *cfd, unsigned char def)
447 if (cfd->view_type == E_CONFIG_DIALOG_CFDATA_TYPE_BASIC)
449 if (cfd->view->basic.check_changed)
450 changed = cfd->view->basic.check_changed(cfd, cfd->cfdata);
454 else if (cfd->view_type == E_CONFIG_DIALOG_CFDATA_TYPE_ADVANCED)
456 if (cfd->view->advanced.check_changed)
457 changed = cfd->view->advanced.check_changed(cfd, cfd->cfdata);
466 _e_config_dialog_cb_changed(void *data, Evas_Object *obj __UNUSED__)
468 E_Config_Dialog *cfd;
472 if (!cfd->cfg_changed_auto) return;
473 changed = _e_config_dialog_check_changed(cfd, 1);
475 e_config_dialog_changed_set(cfd, changed);
479 _e_config_dialog_cb_close(void *data __UNUSED__, E_Dialog *dia)
481 E_Config_Dialog *cfd;
485 if (cfd->auto_apply_timer) _e_config_dialog_cb_auto_apply_timer(cfd);
486 if (cfd->view->close_cfdata)
487 ok = cfd->view->close_cfdata(cfd, cfd->cfdata);
488 if (ok) e_util_defer_object_del(E_OBJECT(cfd));
492 e_config_dialog_changed_auto_set(E_Config_Dialog *cfd, unsigned char value)
495 cfd->cfg_changed_auto = !!value;
499 e_config_dialog_changed_set(E_Config_Dialog *cfd, unsigned char value)
502 cfd->cfg_changed = !!value;
503 if (cfd->cfg_changed)
504 _e_config_dialog_changed(cfd);
506 _e_config_dialog_unchanged(cfd);