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