update for beta release
[framework/uifw/e17.git] / src / modules / conf_applications / e_int_config_delapps.c
1 #include "e.h"
2
3 struct _E_Config_Dialog_Data
4 {
5    Eina_List *desks;
6    Ecore_Event_Handler *desk_change_handler;
7    
8    struct {
9       Evas_Object *list, *del;
10    } obj;
11 };
12
13 /* local function prototypes */
14 static void *_create_data(E_Config_Dialog *cfd);
15 static void _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata);
16 static Evas_Object *_basic_create(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata);
17 static Eina_Bool _desks_update(void *data, int ev_type __UNUSED__, void *ev __UNUSED__);
18 static int _cb_desks_sort(const void *data1, const void *data2);
19 static void _fill_apps_list(E_Config_Dialog_Data *cfdata, Evas_Object *il);
20 static void _btn_cb_del(void *data, void *data2);
21 static void _widget_list_selection_changed(void *data, Evas_Object *obj __UNUSED__);
22
23 E_Config_Dialog *
24 e_int_config_delapps(E_Container *con, const char *params __UNUSED__)
25 {
26    E_Config_Dialog *cfd;
27    E_Config_Dialog_View *v;
28    
29    if (e_config_dialog_find("E", "applications/del_applications"))
30       return NULL;
31    
32    v = E_NEW(E_Config_Dialog_View, 1);
33    v->create_cfdata = _create_data;
34    v->free_cfdata = _free_data;
35    v->basic.create_widgets = _basic_create;
36
37    cfd = e_config_dialog_new(con, _("Delete Launchers"),
38                              "E", "applications/del_applications",
39                              "preferences-applications-del", 0, v, NULL);
40    return cfd;
41 }
42
43 /* local function prototypes */
44 static void *
45 _create_data(E_Config_Dialog *cfd __UNUSED__)
46 {
47    E_Config_Dialog_Data *cfdata;
48
49    cfdata = E_NEW(E_Config_Dialog_Data, 1);
50    cfdata->desk_change_handler = ecore_event_handler_add
51       (EFREET_EVENT_DESKTOP_CACHE_UPDATE, _desks_update, cfdata);
52    
53    return cfdata;
54 }
55
56 static void
57 _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
58 {
59    Efreet_Desktop *desk;
60    
61    EINA_LIST_FREE(cfdata->desks, desk) efreet_desktop_free(desk);
62    if (cfdata->desk_change_handler)
63       ecore_event_handler_del(cfdata->desk_change_handler);
64    E_FREE(cfdata);
65 }
66
67 static Evas_Object *
68 _basic_create(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata)
69 {
70    Evas_Object *of, *li, *ob;
71    Evas_Coord mw, mh;
72    
73    of = e_widget_table_add(evas, 0);
74    
75    li = e_widget_ilist_add(evas, 24, 24, NULL);
76    cfdata->obj.list = li;
77    e_widget_ilist_multi_select_set(li, EINA_TRUE);
78    e_widget_size_min_get(li, &mw, &mh);
79    if (mw < (200 * e_scale)) mw = 200 * e_scale;
80    if (mh < (160 * e_scale)) mh = 160 * e_scale;
81    e_widget_size_min_set(li, mw, mh);
82    e_widget_on_change_hook_set(li, _widget_list_selection_changed, cfdata);
83    e_widget_table_object_append(of, li, 0, 1, 1, 1, 1, 1, 1, 1);
84    
85    _fill_apps_list(cfdata, cfdata->obj.list);
86    e_widget_ilist_go(li);
87    
88    ob = e_widget_button_add(evas, _("Delete"), NULL, _btn_cb_del, cfdata, NULL);
89    cfdata->obj.del = ob;
90    e_widget_disabled_set(ob, 1);
91    e_widget_table_object_append(of, ob, 0, 2, 1, 1, 1, 1, 1, 0);
92    
93    e_dialog_resizable_set(cfd->dia, 1);
94    e_win_centered_set(cfd->dia->win, 1);
95    return of;
96 }
97
98 static Eina_Bool
99 _desks_update(void *data, int ev_type __UNUSED__, void *ev __UNUSED__)
100 {
101    E_Config_Dialog_Data *cfdata = data;
102    Efreet_Desktop *desk;
103    
104    EINA_LIST_FREE(cfdata->desks, desk) efreet_desktop_free(desk);
105    _fill_apps_list(cfdata, cfdata->obj.list);
106    return ECORE_CALLBACK_PASS_ON;
107 }         
108
109 static int
110 _cb_desks_sort(const void *data1, const void *data2)
111 {
112    const Efreet_Desktop *d1, *d2;
113    
114    if (!(d1 = data1)) return 1;
115    if (!d1->name) return 1;
116    if (!(d2 = data2)) return -1;
117    if (!d2->name) return -1;
118    return strcmp(d1->name, d2->name);
119 }
120
121 static void
122 _fill_apps_list(E_Config_Dialog_Data *cfdata, Evas_Object *il)
123 {
124    Eina_List *desks = NULL, *l;
125    Efreet_Desktop *desk = NULL;
126    Evas *evas;
127    const char *desktop_dir = e_user_desktop_dir_get();
128    int n = 0;
129    
130    if (!desktop_dir) return;
131    
132    n = strlen(desktop_dir);
133    
134    if (!cfdata->desks)
135      {
136         desks = efreet_util_desktop_name_glob_list("*");
137         EINA_LIST_FREE(desks, desk)
138           {
139              if (desk->no_display)
140                {
141                   efreet_desktop_free(desk);
142                   continue;
143                }
144              if (!strncmp(desk->orig_path, desktop_dir, n))
145                 cfdata->desks = eina_list_append(cfdata->desks, desk);
146              else
147                 efreet_desktop_free(desk);
148           }
149         cfdata->desks = eina_list_sort(cfdata->desks, -1, _cb_desks_sort);
150      }
151
152    evas = evas_object_evas_get(il);
153    evas_event_freeze(evas);
154    edje_freeze();
155    e_widget_ilist_freeze(il);
156    e_widget_ilist_clear(il);
157    
158    EINA_LIST_FOREACH(cfdata->desks, l, desk)
159      {
160         Evas_Object *icon = e_util_desktop_icon_add(desk, 24, evas);
161         
162         e_widget_ilist_append(il, icon, desk->name,
163                               NULL, desk->orig_path,
164                               desk->orig_path);
165      }
166    
167    e_widget_ilist_go(il);
168    e_widget_ilist_thaw(il);
169    edje_thaw();
170    evas_event_thaw(evas);
171 }
172
173 static void
174 _btn_cb_del(void *data, void *data2 __UNUSED__)
175 {
176    E_Config_Dialog_Data *cfdata = data;
177    const Eina_List *l;
178    const E_Ilist_Item *it;
179    
180    EINA_LIST_FOREACH(e_widget_ilist_items_get(cfdata->obj.list), l, it)
181      {
182         const char *file;
183         
184         if (!it->selected) continue;
185         file = e_widget_ilist_item_data_get(it);
186         if (file) ecore_file_unlink(file);
187      }
188 }
189
190 static void
191 _widget_list_selection_changed(void *data, Evas_Object *obj __UNUSED__)
192 {
193    E_Config_Dialog_Data *cfdata = data;
194    const Eina_List *l;
195    const E_Ilist_Item *it;
196    int selnum = 0;
197    
198    EINA_LIST_FOREACH(e_widget_ilist_items_get(cfdata->obj.list), l, it)
199      {
200         if (!it->selected) continue;
201         selnum++;
202      }
203    if (selnum == 0) e_widget_disabled_set(cfdata->obj.del, 1);
204    else e_widget_disabled_set(cfdata->obj.del, 0);
205 }