Tizen 2.1 release
[platform/core/uifw/e17.git] / src / bin / e_int_gadcon_config.c
1 #include "e.h"
2
3 typedef struct _CFGadget CFGadget;
4 struct _CFGadget
5 {
6    const char *name, *id;
7 };
8
9 struct _E_Config_Dialog_Data
10 {
11    E_Gadcon *gc;
12    E_Gadcon_Site site;
13
14    const char *sel;
15
16    struct
17    {
18       Evas_Object *o_list;
19    } basic, advanced;
20    Evas_Object *class_list;
21    Evas_Object *o_add, *o_del;
22    Ecore_Event_Handler *gcc_add;
23    Ecore_Event_Handler *gcc_del;
24    Ecore_Event_Handler *cc_del;
25    Ecore_Event_Handler *cc_add;
26    Ecore_Timer *load_timer;
27    Eina_Hash *gadget_hash;
28 };
29
30 /* local function prototypes */
31 static void *_create_data(E_Config_Dialog *cfd);
32 static void _fill_data(E_Config_Dialog_Data *cfdata);
33 static void _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
34 static Eina_Bool _free_gadgets(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__);
35 static Evas_Object *_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
36 static Evas_Object *_advanced_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
37 static Eina_Bool _cb_load_timer(void *data);
38 static void _fill_list(E_Config_Dialog_Data *cfdata);
39 static void _fill_list_advanced(E_Config_Dialog_Data *cfdata, Eina_Bool, Eina_Bool);
40 static void _cb_list_selected(void *data);
41 static void _cb_add(void *data, void *data2 __UNUSED__);
42 static void _cb_del(void *data, void *data2 __UNUSED__);
43 static CFGadget *_search_hash(E_Config_Dialog_Data *cfdata, const char *name);
44 static Eina_Bool _cb_cc_add(E_Config_Dialog_Data *cfdata, int type, E_Event_Gadcon_Client_Class_Add *ev);
45 static Eina_Bool _cb_cc_del(E_Config_Dialog_Data *cfdata, int type, E_Event_Gadcon_Client_Class_Add *ev);
46 static Eina_Bool _cb_gcc_add(E_Config_Dialog_Data *cfdata, int type, E_Event_Gadcon_Client_Add *ev);
47 static Eina_Bool _cb_gcc_del(E_Config_Dialog_Data *cfdata, int type, E_Event_Gadcon_Client_Add *ev);
48
49 /* local function prototypes */
50 static void
51 _create_dialog(E_Gadcon *gc, const char *title, E_Gadcon_Site site)
52 {
53    E_Config_Dialog_View *v;
54    E_Container *con;
55
56    if (gc->config_dialog)
57      {
58         e_win_raise(gc->config_dialog->dia->win);
59         e_border_focus_set(gc->config_dialog->dia->win->border, 1, 1);
60         return;
61      }
62    if (!(v = E_NEW(E_Config_Dialog_View, 1))) return;
63
64    v->create_cfdata = _create_data;
65    v->free_cfdata = _free_data;
66    v->basic.create_widgets = _basic_create;
67    v->advanced.create_widgets = _advanced_create;
68
69    con = e_container_current_get(e_manager_current_get());
70    gc->config_dialog =
71      e_config_dialog_new(con, title, "E", "_gadcon_config_dialog",
72                          "preferences-desktop-shelf", 0, v, gc);
73    if (site) gc->config_dialog->cfdata->site = site;
74    e_dialog_resizable_set(gc->config_dialog->dia, EINA_TRUE);
75    e_win_centered_set(gc->config_dialog->dia->win, EINA_TRUE);
76 }
77
78 static void *
79 _create_data(E_Config_Dialog *cfd)
80 {
81    E_Config_Dialog_Data *cfdata;
82
83    cfdata = E_NEW(E_Config_Dialog_Data, 1);
84    cfdata->gadget_hash = eina_hash_string_superfast_new(NULL);
85    cfdata->gc = cfd->data;
86    if (cfdata->gc->shelf)
87      cfdata->site = E_GADCON_SITE_SHELF;
88    else if (cfdata->gc->toolbar)
89      cfdata->site = E_GADCON_SITE_EFM_TOOLBAR;
90    else
91      cfdata->site = E_GADCON_SITE_UNKNOWN;
92    _fill_data(cfdata);
93
94    cfdata->gcc_add = ecore_event_handler_add(E_EVENT_GADCON_CLIENT_ADD,
95                                          (Ecore_Event_Handler_Cb)_cb_gcc_add, cfdata);
96    cfdata->gcc_del = ecore_event_handler_add(E_EVENT_GADCON_CLIENT_DEL,
97                                          (Ecore_Event_Handler_Cb)_cb_gcc_del, cfdata);
98
99    cfdata->cc_add = ecore_event_handler_add(E_EVENT_GADCON_CLIENT_CLASS_ADD,
100                                          (Ecore_Event_Handler_Cb)_cb_cc_add, cfdata);
101    cfdata->cc_del = ecore_event_handler_add(E_EVENT_GADCON_CLIENT_CLASS_DEL,
102                                          (Ecore_Event_Handler_Cb)_cb_cc_del, cfdata);
103    return cfdata;
104 }
105
106 static void
107 _fill_data(E_Config_Dialog_Data *cfdata)
108 {
109    Eina_List *l;
110    E_Config_Gadcon_Client *cf_gcc;
111
112    EINA_LIST_FOREACH(cfdata->gc->cf->clients, l, cf_gcc)
113      {
114         CFGadget *gad;
115
116         if (!cf_gcc->id) continue;
117         gad = E_NEW(CFGadget, 1);
118         gad->name = eina_stringshare_add(cf_gcc->name);
119         gad->id = eina_stringshare_add(cf_gcc->id);
120         eina_hash_direct_add(cfdata->gadget_hash, gad->id, gad);
121      }
122 }
123
124 static void
125 _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
126 {
127    if (cfdata->gcc_add) ecore_event_handler_del(cfdata->gcc_add);
128    if (cfdata->gcc_del) ecore_event_handler_del(cfdata->gcc_del);
129    if (cfdata->cc_add) ecore_event_handler_del(cfdata->cc_add);
130    if (cfdata->cc_del) ecore_event_handler_del(cfdata->cc_del);
131
132    if (cfdata->load_timer) ecore_timer_del(cfdata->load_timer);
133
134    if (cfdata->gadget_hash)
135      {
136         eina_hash_foreach(cfdata->gadget_hash, _free_gadgets, NULL);
137         eina_hash_free(cfdata->gadget_hash);
138      }
139
140    cfdata->gc->config_dialog = NULL;
141    free(cfdata);
142 }
143
144 static Eina_Bool
145 _free_gadgets(const Eina_Hash *hash __UNUSED__, const void *key __UNUSED__, void *data, void *fdata __UNUSED__)
146 {
147    CFGadget *gadget;
148
149    if (!(gadget = data)) return EINA_FALSE;
150    if (gadget->name) eina_stringshare_del(gadget->name);
151    if (gadget->id) eina_stringshare_del(gadget->id);
152    E_FREE(gadget);
153
154    return EINA_TRUE;
155 }
156
157 static void
158 _cb_list_selected(void *data)
159 {
160    E_Config_Dialog_Data *cfdata;
161    const E_Ilist_Item *it;
162    const Eina_List *l;
163    unsigned int loaded = 0;
164
165    if (!(cfdata = data)) return;
166    EINA_LIST_FOREACH(e_widget_ilist_items_get(cfdata->basic.o_list), l, it)
167      {
168         const char *name;
169
170         if ((!it->selected) || (it->header)) continue;
171         if (!(name = e_widget_ilist_item_value_get(it))) continue;
172         if (_search_hash(cfdata, name)) loaded++;
173      }
174    e_widget_disabled_set(cfdata->o_add, EINA_FALSE);
175    e_widget_disabled_set(cfdata->o_del, !loaded);
176 }
177
178 static void
179 _list_item_del_advanced(E_Config_Dialog_Data *cfdata, E_Gadcon_Client *gcc)
180 {
181    E_Ilist_Item *ili;
182    const Eina_List *l;
183    int x = 0;
184
185    if (!gcc->cf)
186      {
187         eina_hash_foreach(cfdata->gadget_hash, _free_gadgets, NULL);
188         eina_hash_free(cfdata->gadget_hash);
189         cfdata->gadget_hash = eina_hash_string_superfast_new(NULL);
190         _fill_data(cfdata);
191         _fill_list_advanced(cfdata, EINA_TRUE, EINA_FALSE);
192         return;
193      }
194    EINA_LIST_FOREACH(e_widget_ilist_items_get(cfdata->advanced.o_list), l, ili)
195      {
196         if (e_widget_ilist_item_value_get(ili) == gcc->cf->id)
197           {
198              e_widget_ilist_remove_num(cfdata->advanced.o_list, x);
199              break;
200           }
201         x++;
202      }
203 }
204
205 static void
206 _list_item_del(E_Config_Dialog_Data *cfdata __UNUSED__, Evas_Object *list, const E_Gadcon_Client_Class *cc)
207 {
208    E_Ilist_Item *ili;
209    const Eina_List *l;
210    int x = 0;
211
212    EINA_LIST_FOREACH(e_widget_ilist_items_get(list), l, ili)
213      {
214         const char *name;
215
216         name = e_widget_ilist_item_value_get(ili);
217         if (!strcmp(name, cc->name))
218           {
219              e_widget_ilist_remove_num(list, x);
220              break;
221           }
222         x++;
223      }
224 }
225
226 static void
227 _list_item_add_advanced(E_Config_Dialog_Data *cfdata, E_Gadcon_Client *gcc, E_Config_Gadcon_Client *cf_gcc)
228 {
229    Evas_Object *icon = NULL, *end;
230    Evas *evas;
231
232    if (gcc && (gcc->gadcon != cfdata->gc)) return;
233    if (!gcc)
234      {
235         Eina_List *l;
236         EINA_LIST_FOREACH(cfdata->gc->clients, l, gcc)
237           if (gcc->cf == cf_gcc) break;
238         if (gcc && (gcc->cf != cf_gcc)) gcc = NULL;
239      }
240    else
241      {
242         const Eina_List *l;
243         E_Ilist_Item *ili;
244
245         EINA_LIST_FOREACH(e_widget_ilist_items_get(cfdata->advanced.o_list), l, ili)
246           {
247              if (e_widget_ilist_item_label_get(ili) == cf_gcc->id)
248                {
249                   end = e_widget_ilist_item_end_get(ili);
250                   edje_object_signal_emit(end, "e,state,checked", "e");
251                   return;
252                }
253           }
254      }
255    evas = evas_object_evas_get(cfdata->advanced.o_list);
256    if (gcc && gcc->client_class->func.icon) icon = gcc->client_class->func.icon(gcc->client_class, evas);
257
258    end = edje_object_add(evas);
259    if (!e_theme_edje_object_set(end, "base/theme/widgets",
260                                 "e/widgets/ilist/toggle_end"))
261      {
262         evas_object_del(end);
263         end = NULL;
264      }
265
266    if (gcc)
267      edje_object_signal_emit(end, "e,state,checked", "e");
268    else
269      edje_object_signal_emit(end, "e,state,unchecked", "e");
270
271    e_widget_ilist_append_full(cfdata->advanced.o_list, icon, end, cf_gcc->id,
272                               NULL, cfdata, cf_gcc->id);
273    if (!e_widget_ilist_count(cfdata->advanced.o_list)) return;
274    e_widget_disabled_set(cfdata->o_del, 0);
275    e_widget_ilist_selected_set(cfdata->advanced.o_list, 0);
276 }
277
278 static void
279 _list_item_class_add(E_Config_Dialog_Data *cfdata, const E_Gadcon_Client_Class *cc)
280 {
281    Evas_Object *icon = NULL;
282    const char *lbl = NULL;
283    Evas *evas;
284
285    evas = evas_object_evas_get(cfdata->class_list);
286    if ((cc->func.is_site) && (!cc->func.is_site(cfdata->site)))
287      return;
288    if (cc->func.label) lbl = cc->func.label(cc);
289    if (!lbl) lbl = cc->name;
290    if (cc->func.icon) icon = cc->func.icon(cc, evas);
291
292    e_widget_ilist_append_full(cfdata->class_list, icon, NULL, lbl,
293                               NULL, cfdata, cc->name);
294 }
295
296 static void
297 _list_item_add(E_Config_Dialog_Data *cfdata, const E_Gadcon_Client_Class *cc)
298 {
299    Evas_Object *icon = NULL, *end;
300    const char *lbl = NULL;
301    Evas *evas;
302
303    evas = evas_object_evas_get(cfdata->basic.o_list);
304    if ((cc->func.is_site) && (!cc->func.is_site(cfdata->site)))
305      return;
306    if (cc->func.label) lbl = cc->func.label(cc);
307    if (!lbl) lbl = cc->name;
308    if (cc->func.icon) icon = cc->func.icon(cc, evas);
309
310    end = edje_object_add(evas);
311    if (!e_theme_edje_object_set(end, "base/theme/widgets",
312                                 "e/widgets/ilist/toggle_end"))
313      {
314         evas_object_del(end);
315         end = NULL;
316      }
317
318    if (_search_hash(cfdata, cc->name))
319      {
320         if (end) edje_object_signal_emit(end, "e,state,checked", "e");
321      }
322    else
323      {
324         if (end) edje_object_signal_emit(end, "e,state,unchecked", "e");
325      }
326
327    e_widget_ilist_append_full(cfdata->basic.o_list, icon, end, lbl,
328                               _cb_list_selected, cfdata, cc->name);
329 }
330
331 static void
332 _fill_list_advanced(E_Config_Dialog_Data *cfdata, Eina_Bool clients, Eina_Bool classes)
333 {
334    Eina_List *l;
335    E_Config_Gadcon_Client *cf_gcc;
336    const E_Gadcon_Client_Class *cc;
337    Evas *evas;
338    int mw;
339
340    while (clients)
341      {
342         evas = evas_object_evas_get(cfdata->advanced.o_list);
343         evas_event_freeze(evas);
344         edje_freeze();
345         e_widget_ilist_freeze(cfdata->advanced.o_list);
346         e_widget_ilist_clear(cfdata->advanced.o_list);
347
348         EINA_LIST_FOREACH(cfdata->gc->cf->clients, l, cf_gcc)
349           _list_item_add_advanced(cfdata, NULL, cf_gcc);
350
351         e_widget_ilist_go(cfdata->advanced.o_list);
352         e_widget_size_min_get(cfdata->advanced.o_list, &mw, NULL);
353         if (mw < (200 * e_scale)) mw = (200 * e_scale);
354         e_widget_size_min_set(cfdata->advanced.o_list, mw, (160 * e_scale));
355         e_widget_ilist_thaw(cfdata->advanced.o_list);
356         edje_thaw();
357         evas_event_thaw(evas);
358         if (e_widget_ilist_count(cfdata->advanced.o_list))
359           e_widget_ilist_selected_set(cfdata->advanced.o_list, 0);
360         else
361           e_widget_disabled_set(cfdata->o_del, 1);
362         break;
363      }
364 ///////////////
365    while (classes)
366      {
367         evas = evas_object_evas_get(cfdata->class_list);
368         evas_event_freeze(evas);
369         edje_freeze();
370         e_widget_ilist_freeze(cfdata->class_list);
371         e_widget_ilist_clear(cfdata->class_list);
372
373         EINA_LIST_FOREACH(e_gadcon_provider_list(), l, cc)
374           _list_item_class_add(cfdata, cc);
375
376         e_widget_ilist_go(cfdata->class_list);
377         e_widget_size_min_get(cfdata->class_list, &mw, NULL);
378         if (mw < (200 * e_scale)) mw = (200 * e_scale);
379         e_widget_size_min_set(cfdata->class_list, mw, (160 * e_scale));
380         e_widget_ilist_thaw(cfdata->class_list);
381         edje_thaw();
382         evas_event_thaw(evas);
383         e_widget_ilist_selected_set(cfdata->class_list, 0);
384         e_widget_disabled_set(cfdata->o_add, 0);
385         break;
386      }
387 }
388
389 static void
390 _fill_list(E_Config_Dialog_Data *cfdata)
391 {
392    Eina_List *l;
393    E_Gadcon_Client_Class *cc;
394    Evas *evas;
395    int mw;
396
397    evas = evas_object_evas_get(cfdata->basic.o_list);
398    evas_event_freeze(evas);
399    edje_freeze();
400    e_widget_ilist_freeze(cfdata->basic.o_list);
401    e_widget_ilist_clear(cfdata->basic.o_list);
402
403    EINA_LIST_FOREACH(e_gadcon_provider_list(), l, cc)
404      _list_item_add(cfdata, cc);
405
406    e_widget_ilist_go(cfdata->basic.o_list);
407    e_widget_size_min_get(cfdata->basic.o_list, &mw, NULL);
408    if (mw < (200 * e_scale)) mw = (200 * e_scale);
409    e_widget_size_min_set(cfdata->basic.o_list, mw, (160 * e_scale));
410    e_widget_ilist_thaw(cfdata->basic.o_list);
411    edje_thaw();
412    evas_event_thaw(evas);
413 }
414
415 static void
416 _cb_add_advanced(void *data, void *data2 __UNUSED__)
417 {
418    E_Config_Dialog_Data *cfdata;
419    E_Config_Gadcon_Client *cf_gcc;
420    CFGadget *gad;
421
422    if (!(cfdata = data)) return;
423    cf_gcc = e_gadcon_client_config_new(cfdata->gc, e_widget_ilist_selected_value_get(cfdata->class_list));
424
425    gad = E_NEW(CFGadget, 1);
426    gad->name = eina_stringshare_add(cf_gcc->name);
427    gad->id = eina_stringshare_add(cf_gcc->id);
428    eina_hash_direct_add(cfdata->gadget_hash, gad->id, gad);
429
430    e_gadcon_unpopulate(cfdata->gc);
431    if (cfdata->gc->custom)
432      e_gadcon_custom_populate_request(cfdata->gc);
433    else
434      e_gadcon_populate(cfdata->gc);
435    e_config_save_queue();
436    e_widget_ilist_selected_set(cfdata->class_list, 0);
437 }
438
439 static void
440 _cb_add(void *data, void *data2 __UNUSED__)
441 {
442    E_Config_Dialog_Data *cfdata;
443    const E_Ilist_Item *it;
444    const Eina_List *l;
445    int update = 0;
446
447    if (!(cfdata = data)) return;
448    EINA_LIST_FOREACH(e_widget_ilist_items_get(cfdata->basic.o_list), l, it)
449      {
450         E_Config_Gadcon_Client *cf_gcc;
451         CFGadget *gad;
452         Evas_Object *end;
453         const char *name;
454
455         if ((!it->selected) || (it->header)) continue;
456         if (!(name = e_widget_ilist_item_value_get(it))) continue;
457         if (!(cf_gcc = e_gadcon_client_config_new(cfdata->gc, name))) continue;
458         if ((end = e_widget_ilist_item_end_get(it)))
459           edje_object_signal_emit(end, "e,state,checked", "e");
460
461         gad = E_NEW(CFGadget, 1);
462         gad->name = eina_stringshare_add(cf_gcc->name);
463         gad->id = eina_stringshare_add(cf_gcc->id);
464         eina_hash_direct_add(cfdata->gadget_hash, gad->id, gad);
465
466         update = 1;
467      }
468    if (update)
469      {
470         if (cfdata->gc->custom)
471           e_gadcon_custom_populate_request(cfdata->gc);
472         else
473           {
474              e_gadcon_unpopulate(cfdata->gc);
475              e_gadcon_populate(cfdata->gc);
476           }
477         e_config_save_queue();
478      }
479    e_widget_ilist_unselect(cfdata->basic.o_list);
480    e_widget_disabled_set(cfdata->o_add, EINA_TRUE);
481    e_widget_disabled_set(cfdata->o_del, EINA_TRUE);
482 }
483
484 static void
485 _cb_del_advanced(void *data, void *data2 __UNUSED__)
486 {
487    E_Config_Dialog_Data *cfdata = data;
488    E_Config_Gadcon_Client *cf_gcc;
489    const Eina_List *l, *sel, *ll, *lll, *llll;
490    E_Ilist_Item *ili;
491    int x = 0, refresh = 0;;
492
493    sel = e_widget_ilist_items_get(cfdata->advanced.o_list);
494    EINA_LIST_FOREACH_SAFE(sel, ll, lll, ili)
495      {
496         if (!ili) continue;
497         if (!ili->selected) continue;
498         x = 0;
499         EINA_LIST_FOREACH_SAFE(cfdata->gc->cf->clients, l, llll, cf_gcc)
500           {
501              if (cf_gcc->id == e_widget_ilist_item_value_get(ili))
502                {
503                   CFGadget *gad;
504                   E_Gadcon_Client *gcc;
505
506                   if ((gad = eina_hash_find(cfdata->gadget_hash, cf_gcc->id)))
507                     {
508                        eina_hash_del(cfdata->gadget_hash, gad->id, gad);
509                        if (gad->name) eina_stringshare_del(gad->name);
510                        if (gad->id) eina_stringshare_del(gad->id);
511                        E_FREE(gad);
512                     }
513                   EINA_LIST_FOREACH(cfdata->gc->clients, l, gcc)
514                     {
515                        if (gcc->cf != cf_gcc) continue;
516                        gcc->cf = NULL;
517                        e_object_del(E_OBJECT(gcc));
518                        break;
519                     }
520                   refresh = 1;
521                   e_gadcon_client_config_del(cfdata->gc->cf, cf_gcc);
522                   e_config_save_queue();
523                   e_widget_ilist_remove_num(cfdata->advanced.o_list, x);
524                   x++;
525                   break;
526                }
527           }
528      }
529    if (refresh && (!cfdata->gc->custom))
530      {
531         e_gadcon_unpopulate(cfdata->gc);
532         e_gadcon_populate(cfdata->gc);
533      }
534    e_widget_ilist_selected_set(cfdata->advanced.o_list, 0);
535 }
536
537 static void
538 _cb_del(void *data, void *data2 __UNUSED__)
539 {
540    E_Config_Dialog_Data *cfdata;
541    const E_Ilist_Item *it;
542    const Eina_List *l;
543    int update = 0;
544
545    if (!(cfdata = data)) return;
546    EINA_LIST_FOREACH(e_widget_ilist_items_get(cfdata->basic.o_list), l, it)
547      {
548         E_Config_Gadcon_Client *cf_gcc;
549         E_Gadcon_Client *gcc;
550         Eina_List *cl;
551         Evas_Object *end;
552         const char *name;
553
554         if ((!it->selected) || (it->header)) continue;
555         name = e_widget_ilist_item_value_get(it);
556
557         /* remove from actual gadget container */
558         EINA_LIST_FOREACH(cfdata->gc->cf->clients, cl, cf_gcc)
559           {
560              CFGadget *gad;
561
562              if (name != cf_gcc->name) continue;
563
564              /* remove from gadget hash if exists */
565              if ((gad = eina_hash_find(cfdata->gadget_hash, cf_gcc->id)))
566                {
567                   eina_hash_del(cfdata->gadget_hash, gad->id, gad);
568                   if (gad->name) eina_stringshare_del(gad->name);
569                   if (gad->id) eina_stringshare_del(gad->id);
570                   E_FREE(gad);
571                }
572
573              /* set ilist end toggle if we don't have any more in the hash */
574              if (!_search_hash(cfdata, name))
575                {
576                   if ((end = e_widget_ilist_item_end_get(it)))
577                     edje_object_signal_emit(end, "e,state,unchecked", "e");
578                }
579              EINA_LIST_FOREACH(cfdata->gc->clients, cl, gcc)
580                {
581                   if (gcc->cf != cf_gcc) continue;
582                   gcc->cf = NULL;
583                   e_object_del(E_OBJECT(gcc));
584                   break;
585                }
586
587              /* remove from gadget container */
588              e_gadcon_client_config_del(cfdata->gc->cf, cf_gcc);
589
590              update = 1;
591              break;
592           }
593      }
594    if (update)
595      {
596         if (!cfdata->gc->custom)
597           {
598              e_gadcon_unpopulate(cfdata->gc);
599              e_gadcon_populate(cfdata->gc);
600           }
601         e_config_save_queue();
602      }
603    e_widget_ilist_unselect(cfdata->basic.o_list);
604    e_widget_disabled_set(cfdata->o_add, EINA_TRUE);
605    e_widget_disabled_set(cfdata->o_del, EINA_TRUE);
606 }
607
608 static CFGadget *
609 _search_hash(E_Config_Dialog_Data *cfdata, const char *name)
610 {
611    Eina_Iterator *it;
612    CFGadget *gad, *ret = NULL;
613
614    if (!name) return NULL;
615    if (!(it = eina_hash_iterator_data_new(cfdata->gadget_hash)))
616      return NULL;
617    EINA_ITERATOR_FOREACH(it, gad)
618      {
619         if ((gad->name) && (!strcmp(gad->name, name)))
620           {
621              ret = gad;
622              break;
623           }
624      }
625    eina_iterator_free(it);
626    return ret;
627 }
628
629 static Eina_Bool
630 _cb_gcc_del(E_Config_Dialog_Data *cfdata, int type __UNUSED__, E_Event_Gadcon_Client_Add *ev)
631 {
632    if (cfdata->advanced.o_list)
633      _list_item_del_advanced(cfdata, ev->gcc);
634    else
635      {
636         eina_hash_foreach(cfdata->gadget_hash, _free_gadgets, NULL);
637         eina_hash_free(cfdata->gadget_hash);
638         cfdata->gadget_hash = eina_hash_string_superfast_new(NULL);
639         _fill_data(cfdata);
640         _fill_list(cfdata);
641      }
642    return ECORE_CALLBACK_PASS_ON;
643 }
644
645 static Eina_Bool
646 _cb_gcc_add(E_Config_Dialog_Data *cfdata, int type __UNUSED__, E_Event_Gadcon_Client_Add *ev)
647 {
648    if (cfdata->advanced.o_list)
649      _list_item_add_advanced(cfdata, ev->gcc, ev->gcc->cf);
650    return ECORE_CALLBACK_PASS_ON;
651 }
652
653 static Eina_Bool
654 _cb_cc_del(E_Config_Dialog_Data *cfdata, int type __UNUSED__, E_Event_Gadcon_Client_Class_Add *ev)
655 {
656    if (cfdata->basic.o_list)
657      _list_item_del(cfdata, cfdata->basic.o_list, ev->cc);
658    else
659      _list_item_del(cfdata, cfdata->class_list, ev->cc);
660    return ECORE_CALLBACK_PASS_ON;
661 }
662
663 static Eina_Bool
664 _cb_cc_add(E_Config_Dialog_Data *cfdata, int type __UNUSED__, E_Event_Gadcon_Client_Class_Add *ev)
665 {
666    if (cfdata->basic.o_list)
667      _list_item_add(cfdata, ev->cc);
668    else
669      _list_item_class_add(cfdata, ev->cc);
670    return ECORE_CALLBACK_PASS_ON;
671 }
672
673 static Evas_Object *
674 _advanced_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
675 {
676    Evas_Object *ot, *otb;
677    int mw;
678
679    cfdata->basic.o_list = NULL;
680    otb = e_widget_toolbook_add(evas, 48 * e_scale, 48 * e_scale);
681    ////////////////////////////////////////////////////////////
682    ot = e_widget_table_add(evas, EINA_FALSE);
683
684    cfdata->advanced.o_list = 
685      e_widget_ilist_add(evas, (24 * e_scale), (24 * e_scale), &cfdata->sel);
686    e_widget_ilist_multi_select_set(cfdata->advanced.o_list, EINA_TRUE);
687    e_widget_size_min_get(cfdata->advanced.o_list, &mw, NULL);
688    if (mw < (200 * e_scale)) mw = (200 * e_scale);
689    e_widget_size_min_set(cfdata->advanced.o_list, mw, (160 * e_scale));
690    e_widget_table_object_append(ot, cfdata->advanced.o_list, 
691                                 0, 0, 1, 1, 1, 1, 1, 1);
692
693    cfdata->o_del =
694      e_widget_button_add(evas, _("Remove Gadget"), NULL, _cb_del_advanced, cfdata, NULL);
695    e_widget_disabled_set(cfdata->o_del, EINA_TRUE);
696    e_widget_table_object_append(ot, cfdata->o_del, 0, 1, 1, 1, 1, 1, 1, 0);
697    /* e_widget_list_object_append(ot, cfdata->o_del, 1, 0, 0.5); */
698
699    e_widget_toolbook_page_append(otb, NULL, _("Loaded Gadgets"), ot, 1, 1, 1, 1, 0.5, 0.0);
700    ////////////////////////////////////////////////////////////
701 //   ot = e_widget_list_add(evas, 0, 0);
702    ot = e_widget_table_add(evas, EINA_FALSE);
703
704    cfdata->class_list = 
705      e_widget_ilist_add(evas, (24 * e_scale), (24 * e_scale), NULL);
706    e_widget_size_min_get(cfdata->class_list, &mw, NULL);
707    if (mw < (200 * e_scale)) mw = (200 * e_scale);
708    e_widget_size_min_set(cfdata->class_list, mw, (160 * e_scale));
709    e_widget_table_object_append(ot, cfdata->class_list, 
710                                 0, 0, 1, 1, 1, 1, 1, 1);
711 //   e_widget_list_object_append(ot, cfdata->class_list, 1, 1, 0.5);
712
713    cfdata->o_add =
714      e_widget_button_add(evas, _("Add Gadget"), NULL, _cb_add_advanced, cfdata, NULL);
715    e_widget_disabled_set(cfdata->o_add, EINA_TRUE);
716    e_widget_table_object_append(ot, cfdata->o_add, 0, 1, 1, 1, 1, 1, 1, 0);
717 //   e_widget_list_object_append(ot, cfdata->o_add, 1, 0, 0.5);
718
719    e_widget_toolbook_page_append(otb, NULL, _("Available Gadgets"), ot, 1, 1, 1, 1, 0.5, 0.0);
720    ////////////////////////////////////////////////////////////
721    e_widget_toolbook_page_show(otb, 0);
722    if (cfdata->load_timer) ecore_timer_del(cfdata->load_timer);
723    cfdata->load_timer = ecore_timer_add(0.01, _cb_load_timer, cfdata);
724
725    e_dialog_resizable_set(cfd->dia, EINA_TRUE);
726    e_win_centered_set(cfd->dia->win, EINA_TRUE);
727
728    return otb;
729 }
730
731 static Evas_Object *
732 _basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
733 {
734    Evas_Object *ot;
735    int mw;
736
737    cfdata->advanced.o_list = cfdata->class_list = NULL;
738    ot = e_widget_table_add(evas, 0);
739
740    cfdata->basic.o_list = e_widget_ilist_add(evas, 24, 24, NULL);
741    e_widget_ilist_multi_select_set(cfdata->basic.o_list, EINA_TRUE);
742    e_widget_size_min_get(cfdata->basic.o_list, &mw, NULL);
743    if (mw < (200 * e_scale)) mw = (200 * e_scale);
744    e_widget_size_min_set(cfdata->basic.o_list, mw, (160 * e_scale));
745    e_widget_table_object_append(ot, cfdata->basic.o_list, 0, 0, 2, 1, 1, 1, 1, 1);
746
747    cfdata->o_add =
748      e_widget_button_add(evas, _("Add Gadget"), NULL, _cb_add, cfdata, NULL);
749    e_widget_disabled_set(cfdata->o_add, EINA_TRUE);
750    e_widget_table_object_append(ot, cfdata->o_add, 0, 1, 1, 1, 1, 1, 1, 0);
751
752    cfdata->o_del =
753      e_widget_button_add(evas, _("Remove Gadget"), NULL, _cb_del, cfdata, NULL);
754    e_widget_disabled_set(cfdata->o_del, EINA_TRUE);
755    e_widget_table_object_append(ot, cfdata->o_del, 1, 1, 1, 1, 1, 1, 1, 0);
756
757    if (cfdata->load_timer) ecore_timer_del(cfdata->load_timer);
758    cfdata->load_timer = ecore_timer_add(0.01, _cb_load_timer, cfdata);
759
760    e_dialog_resizable_set(cfd->dia, EINA_TRUE);
761    e_win_centered_set(cfd->dia->win, EINA_TRUE);
762
763    return ot;
764 }
765
766 static Eina_Bool
767 _cb_load_timer(void *data)
768 {
769    E_Config_Dialog_Data *cfdata;
770
771    if (!(cfdata = data)) return ECORE_CALLBACK_RENEW;
772    if (cfdata->basic.o_list)
773      _fill_list(cfdata);
774    else
775      _fill_list_advanced(cfdata, EINA_TRUE, EINA_TRUE);
776    cfdata->load_timer = NULL;
777    return ECORE_CALLBACK_CANCEL;
778 }
779
780 EAPI void
781 e_int_gadcon_config_shelf(E_Gadcon *gc)
782 {
783    _create_dialog(gc, _("Shelf Contents"), 0);
784 }
785
786 EAPI void
787 e_int_gadcon_config_toolbar(E_Gadcon *gc)
788 {
789    _create_dialog(gc, _("Toolbar Contents"), 0);
790 }
791
792 EAPI void
793 e_int_gadcon_config_hook(E_Gadcon *gc, const char *name, E_Gadcon_Site site)
794 {
795    _create_dialog(gc, name, site);
796 }