1 #include "e.h"
2
3 static void *_create_data(E_Config_Dialog *cfd);
4 static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
5 static Evas_Object *_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
6 static void _ilist_fill(E_Config_Dialog_Data *cfdata);
7 static void _ilist_empty(E_Config_Dialog_Data *cfdata);
8 static void _ilist_cb_selected(void *data);
9 static void _cb_add(void *data, void *data2);
10 static void _cb_delete(void *data, void *data2);
11 static void _cb_rename(void *data, void *data2);
12 static void _cb_dialog_yes(void *data);
13 static void _cb_dialog_destroy(void *data);
14 static void _cb_config(void *data, void *data2);
15 static void _cb_contents(void *data, void *data2);
16 static void _ilist_refresh(E_Shelf *es);
17 static void _new_shelf_cb_close(void *data);
18 static void _ilist_item_new(E_Config_Dialog_Data *cfdata, Eina_Bool append, E_Shelf *es);
19
20 struct _E_Config_Dialog_Data
21 {
22 Evas_Object *o_list;
23 Evas_Object *o_add;
24 Evas_Object *o_delete;
25 Evas_Object *o_rename;
26 Evas_Object *o_config;
27 Evas_Object *o_contents;
28
29 const char *cur_shelf;
30 Eina_List *handlers;
31 Eina_List *shelves;
32 E_Config_Dialog *cfd;
33 E_Entry_Dialog *dia_new_shelf;
34 char *new_shelf;
35 Eina_Bool header;
36 unsigned int num_shelves;
37 };
38
39 static E_Config_Dialog_Data *_cfdata;
40
41 E_Config_Dialog *
e_int_config_shelf(Evas_Object * parent EINA_UNUSED,const char * params EINA_UNUSED)42 e_int_config_shelf(Evas_Object *parent EINA_UNUSED, const char *params EINA_UNUSED)
43 {
44 E_Config_Dialog *cfd;
45 E_Config_Dialog_View *v;
46
47 if (e_config_dialog_find("E", "extensions/shelves")) return NULL;
48
49 v = E_NEW(E_Config_Dialog_View, 1);
50 if (!v) return NULL;
51 v->create_cfdata = _create_data;
52 v->free_cfdata = _free_data;
53 v->basic.create_widgets = _basic_create;
54
55 cfd = e_config_dialog_new(NULL, _("Shelf Settings"), "E",
56 "extensions/shelves",
57 "preferences-desktop-shelf", 0, v, NULL);
58 return cfd;
59 }
60
61 static Eina_Bool
_shelf_handler_rename_cb(E_Config_Dialog_Data * cfdata,int type EINA_UNUSED,E_Event_Shelf * ev)62 _shelf_handler_rename_cb(E_Config_Dialog_Data *cfdata, int type EINA_UNUSED, E_Event_Shelf *ev)
63 {
64 const Eina_List *l;
65 E_Ilist_Item *ili;
66
67 EINA_LIST_FOREACH(e_widget_ilist_items_get(cfdata->o_list), l, ili)
68 {
69 if (e_widget_ilist_item_data_get(ili) != ev->shelf) continue;
70 e_ilist_item_label_set(ili, ev->shelf->name);
71 break;
72 }
73 return ECORE_CALLBACK_RENEW;
74 }
75
76 static Eina_Bool
_shelf_handler_cb(E_Config_Dialog_Data * cfdata,int type EINA_UNUSED,E_Event_Shelf_Add * ev)77 _shelf_handler_cb(E_Config_Dialog_Data *cfdata, int type EINA_UNUSED, E_Event_Shelf_Add *ev)
78 {
79 E_Zone *zone;
80
81 zone = e_comp_object_util_zone_get(cfdata->cfd->dia->win);
82 if (!zone) return ECORE_CALLBACK_RENEW;
83 if (ev->shelf->zone == zone)
84 _ilist_item_new(cfdata, 1, ev->shelf);
85 return ECORE_CALLBACK_RENEW;
86 }
87
88 static void *
_create_data(E_Config_Dialog * cfd)89 _create_data(E_Config_Dialog *cfd)
90 {
91 E_Config_Dialog_Data *cfdata;
92
93 if (_cfdata) return NULL;
94 cfdata = E_NEW(E_Config_Dialog_Data, 1);
95 E_LIST_HANDLER_APPEND(cfdata->handlers, E_EVENT_SHELF_ADD, _shelf_handler_cb, cfdata);
96 E_LIST_HANDLER_APPEND(cfdata->handlers, E_EVENT_SHELF_RENAME, _shelf_handler_rename_cb, cfdata);
97 cfdata->cfd = cfd;
98 e_win_no_reopen_set(cfd->dia->win, 1);
99 _cfdata = cfdata;
100 return cfdata;
101 }
102
103 static void
_free_data(E_Config_Dialog * cfd EINA_UNUSED,E_Config_Dialog_Data * cfdata)104 _free_data(E_Config_Dialog *cfd EINA_UNUSED, E_Config_Dialog_Data *cfdata)
105 {
106 E_Shelf *es;
107 EINA_LIST_FREE(cfdata->shelves, es)
108 {
109 if (e_object_is_del(E_OBJECT(es))) continue;
110 e_object_del_func_set(E_OBJECT(es), NULL);
111 if (es->config_dialog) e_object_del_attach_func_set(E_OBJECT(es->config_dialog), NULL);
112 }
113 E_FREE_LIST(cfdata->handlers, ecore_event_handler_del);
114 E_FREE(cfdata);
115 _cfdata = NULL;
116 }
117
118 static Evas_Object *
_basic_create(E_Config_Dialog * cfd EINA_UNUSED,Evas * evas,E_Config_Dialog_Data * cfdata)119 _basic_create(E_Config_Dialog *cfd EINA_UNUSED, Evas *evas, E_Config_Dialog_Data *cfdata)
120 {
121 Evas_Object *ol, *ow, *ot, *of;
122 char buf[64];
123 E_Zone *zone;
124
125 e_dialog_resizable_set(cfd->dia, 1);
126
127 ol = e_widget_list_add(evas, 0, 0);
128 zone = e_zone_current_get();
129 snprintf(buf, sizeof(buf), _("Configured Shelves: Display %d"), zone->num);
130 of = e_widget_framelist_add(evas, buf, 0);
131 cfdata->o_list = e_widget_ilist_add(evas, 24, 24, &(cfdata->cur_shelf));
132 e_widget_size_min_set(cfdata->o_list, (140 * e_scale), (80 * e_scale));
133 e_widget_framelist_object_append(of, cfdata->o_list);
134 e_widget_list_object_append(ol, of, 1, 1, 0.5);
135
136 ot = e_widget_table_add(e_win_evas_win_get(evas), 0);
137 cfdata->o_add = ow = e_widget_button_add(evas, _("Add"), "list-add", _cb_add, cfdata, NULL);
138 e_widget_table_object_append(ot, ow, 0, 0, 1, 1, 1, 1, 0, 0);
139 cfdata->o_delete = e_widget_button_add(evas, _("Delete"), "list-remove",
140 _cb_delete, cfdata, NULL);
141 e_widget_table_object_append(ot, cfdata->o_delete, 1, 0, 1, 1, 1, 1, 0, 0);
142 cfdata->o_rename = e_widget_button_add(evas, _("Rename"), "edit-rename",
143 _cb_rename, cfdata, NULL);
144 e_widget_table_object_append(ot, cfdata->o_rename, 2, 0, 1, 1, 1, 1, 0, 0);
145 cfdata->o_contents = e_widget_button_add(evas, _("Contents"), "preferences-desktop-shelf",
146 _cb_contents, cfdata, NULL);
147 e_widget_table_object_align_append(ot, cfdata->o_contents,
148 3, 0, 1, 1, 0, 1, 1, 1, 1.0, 0.5);
149 cfdata->o_config = e_widget_button_add(evas, _("Settings"), "configure",
150 _cb_config, cfdata, NULL);
151 e_widget_table_object_align_append(ot, cfdata->o_config,
152 4, 0, 1, 1, 0, 1, 1, 1, 1.0, 0.5);
153 e_widget_list_object_append(ol, ot, 1, 0, 0.0);
154
155 _ilist_fill(cfdata);
156 e_widget_disabled_set(cfdata->o_add, 0);
157
158
159 return ol;
160 }
161
162 /* private functions */
163 static void
_ilist_refresh(E_Shelf * es EINA_UNUSED)164 _ilist_refresh(E_Shelf *es EINA_UNUSED)
165 {
166 if (!_cfdata) return;
167 _ilist_empty(_cfdata);
168 _ilist_fill(_cfdata);
169 }
170
171 static void
_widgets_disable(E_Config_Dialog_Data * cfdata,Eina_Bool disable,Eina_Bool list_too)172 _widgets_disable(E_Config_Dialog_Data *cfdata, Eina_Bool disable, Eina_Bool list_too)
173 {
174 e_widget_disabled_set(cfdata->o_add, disable);
175 if (disable || e_widget_ilist_selected_count_get(cfdata->o_list))
176 {
177 e_widget_disabled_set(cfdata->o_delete, disable);
178 e_widget_disabled_set(cfdata->o_config, disable);
179 e_widget_disabled_set(cfdata->o_contents, disable);
180 e_widget_disabled_set(cfdata->o_rename, disable);
181 }
182 if (list_too) e_widget_disabled_set(cfdata->o_list, disable);
183 }
184
185 static void
_ilist_item_new(E_Config_Dialog_Data * cfdata,Eina_Bool append,E_Shelf * es)186 _ilist_item_new(E_Config_Dialog_Data *cfdata, Eina_Bool append, E_Shelf *es)
187 {
188 char buf[256];
189 Evas_Object *ob;
190
191 if (es->name)
192 snprintf(buf, sizeof(buf), "%s", es->name);
193 else
194 snprintf(buf, sizeof(buf), _("Shelf %s"), e_shelf_orient_string_get(es));
195 e_object_del_func_set(E_OBJECT(es), (E_Object_Cleanup_Func)_ilist_refresh);
196
197 ob = e_icon_add(evas_object_evas_get(cfdata->o_list));
198 e_util_gadcon_orient_icon_set(es->cfg->orient, ob);
199 if (append)
200 e_widget_ilist_append(cfdata->o_list, ob, buf,
201 _ilist_cb_selected, es, buf);
202 else
203 e_widget_ilist_prepend(cfdata->o_list, ob, buf,
204 _ilist_cb_selected, es, buf);
205 cfdata->shelves = eina_list_append(cfdata->shelves, es);
206 }
207
208 static void
_ilist_empty(E_Config_Dialog_Data * cfdata)209 _ilist_empty(E_Config_Dialog_Data *cfdata)
210 {
211 Eina_List *l;
212 E_Shelf *es;
213 E_Desk *desk;
214 E_Zone *zone;
215
216 if ((!cfdata) || (!cfdata->cfd)) return;
217 zone = e_comp_object_util_zone_get(cfdata->cfd->dia->win);
218 if (!zone) return;
219 desk = e_desk_current_get(zone);
220 EINA_LIST_FOREACH(e_shelf_list(), l, es)
221 {
222 if (es->zone != zone) continue;
223 if (es->cfg->desk_show_mode)
224 {
225 Eina_List *ll;
226 E_Config_Shelf_Desk *sd;
227
228 EINA_LIST_FOREACH(es->cfg->desk_list, ll, sd)
229 {
230 if ((desk->x == sd->x) && (desk->y == sd->y))
231 {
232 e_object_del_func_set(E_OBJECT(es), NULL);
233 break;
234 }
235 }
236 }
237 else
238 {
239 e_object_del_func_set(E_OBJECT(es), NULL);
240 }
241 }
242 e_widget_ilist_clear(cfdata->o_list);
243 cfdata->shelves = eina_list_free(cfdata->shelves);
244 }
245
246 static void
_ilist_fill(E_Config_Dialog_Data * cfdata)247 _ilist_fill(E_Config_Dialog_Data *cfdata)
248 {
249 Evas *evas;
250 Eina_List *l;
251 E_Shelf *es;
252 E_Desk *desk;
253 E_Zone *zone;
254 int n = -1;
255
256 if (!cfdata) return;
257 if (!cfdata->o_list) return;
258
259 evas = evas_object_evas_get(cfdata->o_list);
260
261 if (e_widget_ilist_count(cfdata->o_list) > 0)
262 n = e_widget_ilist_selected_get(cfdata->o_list);
263
264 evas_event_freeze(evas);
265 edje_freeze();
266 e_widget_ilist_freeze(cfdata->o_list);
267 e_widget_ilist_clear(cfdata->o_list);
268 e_widget_ilist_go(cfdata->o_list);
269 zone = e_zone_current_get();
270 desk = e_desk_current_get(zone);
271
272 EINA_LIST_FOREACH(e_shelf_list(), l, es)
273 {
274 if (es->zone != zone) continue;
275 if (es->cfg->desk_show_mode)
276 {
277 Eina_List *ll;
278 E_Config_Shelf_Desk *sd;
279
280 EINA_LIST_FOREACH(es->cfg->desk_list, ll, sd)
281 {
282 if ((desk->x == sd->x) && (desk->y == sd->y))
283 {
284 if (!cfdata->header)
285 {
286 char buf[32];
287 cfdata->header = EINA_TRUE;
288 snprintf(buf, sizeof(buf), "Desk %d,%d", desk->x, desk->y);
289 e_widget_ilist_header_append(cfdata->o_list, NULL, buf);
290 }
291 _ilist_item_new(cfdata, EINA_TRUE, es);
292 break;
293 }
294 }
295 }
296 else
297 _ilist_item_new(cfdata, !cfdata->header, es);
298 }
299
300 e_widget_size_min_set(cfdata->o_list, 155, 250);
301 e_widget_ilist_go(cfdata->o_list);
302 e_widget_ilist_thaw(cfdata->o_list);
303 edje_thaw();
304 evas_event_thaw(evas);
305
306 if (n > -1)
307 {
308 _widgets_disable(cfdata, 0, EINA_TRUE);
309 e_widget_ilist_selected_set(cfdata->o_list, n);
310 }
311 else
312 {
313 _widgets_disable(cfdata, 1, EINA_FALSE);
314 e_widget_disabled_set(cfdata->o_list, 0);
315 e_widget_disabled_set(cfdata->o_add, 0);
316 }
317 }
318
319 static void
_ilist_cb_selected(void * data EINA_UNUSED)320 _ilist_cb_selected(void *data EINA_UNUSED)
321 {
322 if (!_cfdata) return;
323 _widgets_disable(_cfdata, 0, EINA_TRUE);
324 }
325
326 static void
_new_shelf_cb_close(void * data)327 _new_shelf_cb_close(void *data)
328 {
329 E_Config_Dialog_Data *cfdata;
330
331 cfdata = e_object_data_get(data);
332 cfdata->dia_new_shelf = NULL;
333 if (e_widget_ilist_selected_get(cfdata->o_list) >= 0)
334 _widgets_disable(cfdata, 0, EINA_TRUE);
335 else
336 {
337 e_widget_disabled_set(cfdata->o_list, 0);
338 e_widget_disabled_set(cfdata->o_add, 0);
339 }
340 }
341
342 static void
_cb_add(void * data,void * data2 EINA_UNUSED)343 _cb_add(void *data, void *data2 EINA_UNUSED)
344 {
345 E_Config_Dialog_Data *cfdata;
346 E_Zone *zone;
347
348 cfdata = data;
349 if (!cfdata) return;
350
351 zone = e_comp_object_util_zone_get(cfdata->cfd->dia->win);
352 cfdata->dia_new_shelf = e_shelf_new_dialog(zone);
353 e_object_data_set(E_OBJECT(cfdata->dia_new_shelf), cfdata);
354 e_object_del_attach_func_set(E_OBJECT(cfdata->dia_new_shelf), _new_shelf_cb_close);
355 _widgets_disable(cfdata, 1, EINA_TRUE);
356 cfdata->num_shelves = eina_list_count(e_config->shelves);
357 }
358
359 static void
_cb_rename(void * data,void * d EINA_UNUSED)360 _cb_rename(void *data, void *d EINA_UNUSED)
361 {
362 E_Config_Dialog_Data *cfdata = data;
363 E_Shelf *es;
364 es = e_widget_ilist_selected_data_get(cfdata->o_list);
365 e_shelf_rename_dialog(es);
366 }
367
368 static void
_cb_delete(void * data,void * data2 EINA_UNUSED)369 _cb_delete(void *data, void *data2 EINA_UNUSED)
370 {
371 char buf[1024];
372 E_Config_Dialog_Data *cfdata = data;
373 E_Shelf *es;
374
375 es = e_widget_ilist_selected_data_get(cfdata->o_list);
376 if (!es) return;
377
378 e_object_ref(E_OBJECT(es));
379
380 if (e_config->cnfmdlg_disabled)
381 {
382 if (e_object_is_del(E_OBJECT(es))) return;
383 e_shelf_unsave(es);
384 e_object_del(E_OBJECT(es));
385 e_config_save_queue();
386
387 e_object_unref(E_OBJECT(es));
388 _ilist_fill(cfdata);
389 return;
390 }
391 _widgets_disable(data, 1, EINA_TRUE);
392 snprintf(buf, sizeof(buf), _("Are you sure you want to delete \"%s\"?"),
393 cfdata->cur_shelf);
394
395 e_confirm_dialog_show(_("Confirm Shelf Deletion"),
396 "application-exit", buf, _("Delete"), _("Keep"),
397 _cb_dialog_yes, NULL, es, NULL, _cb_dialog_destroy, es);
398 }
399
400 static void
_cb_dialog_yes(void * data)401 _cb_dialog_yes(void *data)
402 {
403 E_Shelf *es;
404 E_Config_Dialog_Data *cfdata = _cfdata;
405
406 if (!_cfdata) return;
407 es = data;
408 if (e_object_is_del(E_OBJECT(es))) return;
409 e_shelf_unsave(es);
410 e_object_del(E_OBJECT(es));
411 e_object_unref(E_OBJECT(es));
412 e_config_save_queue();
413 _ilist_empty(cfdata);
414 _ilist_fill(cfdata);
415 }
416
417 static void
_cb_dialog_destroy(void * data)418 _cb_dialog_destroy(void *data)
419 {
420 E_Shelf *es;
421 E_Config_Dialog_Data *cfdata = _cfdata;
422
423 if (!_cfdata) return;
424 es = data;
425 if (e_object_is_del(E_OBJECT(es))) return;
426 e_object_unref(E_OBJECT(es));
427 _widgets_disable(cfdata, 0, EINA_TRUE);
428 }
429
430 static void
_cb_config_end(void * data EINA_UNUSED)431 _cb_config_end(void *data EINA_UNUSED)
432 {
433 if (!_cfdata) return;
434 e_widget_disabled_set(_cfdata->o_list, 0);
435 }
436
437 static void
_cb_config(void * data,void * data2 EINA_UNUSED)438 _cb_config(void *data, void *data2 EINA_UNUSED)
439 {
440 E_Config_Dialog_Data *cfdata;
441 E_Shelf *es;
442
443 if (!(cfdata = data)) return;
444 es = e_widget_ilist_selected_data_get(cfdata->o_list);
445 if (!es) return;
446 if (!es->config_dialog)
447 {
448 e_int_shelf_config(es);
449 e_object_del_attach_func_set(E_OBJECT(es->config_dialog), _cb_config_end);
450 }
451 }
452
453 static void
_cb_contents_end(void * data EINA_UNUSED)454 _cb_contents_end(void *data EINA_UNUSED)
455 {
456 if (!_cfdata) return;
457 e_widget_disabled_set(_cfdata->o_list, 0);
458 }
459
460 static void
_cb_contents(void * data,void * data2 EINA_UNUSED)461 _cb_contents(void *data, void *data2 EINA_UNUSED)
462 {
463 E_Config_Dialog_Data *cfdata;
464 E_Shelf *es;
465
466 if (!(cfdata = data)) return;
467 es = e_widget_ilist_selected_data_get(cfdata->o_list);
468 if (!es) return;
469 if (!es->gadcon->config_dialog)
470 {
471 e_int_gadcon_config_shelf(es->gadcon);
472 e_object_del_attach_func_set(E_OBJECT(es->gadcon->config_dialog), _cb_contents_end);
473 }
474 }
475
476