Tizen 2.1 release
[platform/core/uifw/e17.git] / src / modules / conf_paths / e_int_config_env.c
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 int _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
6 static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
7
8 struct _E_Config_Dialog_Data
9 {
10    E_Config_Dialog *cfd;
11
12    Eina_List *env_vars;
13    
14    char *var_str, *val_str;
15    int unset;
16    
17    struct {
18       Evas_Object *var_en, *val_en, *unset, *list;
19    } gui;
20 };
21
22 E_Config_Dialog *
23 e_int_config_env(E_Container *con, const char *params __UNUSED__)
24 {
25    E_Config_Dialog *cfd;
26    E_Config_Dialog_View *v;
27
28    if (e_config_dialog_find("E", "advanced/environment_variables")) return NULL;
29    v = E_NEW(E_Config_Dialog_View, 1);
30    
31    v->create_cfdata           = _create_data;
32    v->free_cfdata             = _free_data;
33    v->basic.create_widgets    = _basic_create_widgets;
34    v->basic.apply_cfdata      = _basic_apply_data;
35    
36    cfd = e_config_dialog_new(con, _("Environment Variables"),
37                              "E", "advanced/environment_variables",
38                              "preferences-system", 0, v, NULL);
39    return cfd;
40 }
41
42 static void
43 _fill_data(E_Config_Dialog_Data *cfdata)
44 {
45    Eina_List *l;
46    E_Config_Env_Var *evr, *evr2;
47    
48    EINA_LIST_FOREACH(e_config->env_vars, l, evr)
49      {
50         evr2 = E_NEW(E_Config_Env_Var, 1);
51         evr2->var = eina_stringshare_add(evr->var);
52         if (evr->val) evr2->val = eina_stringshare_add(evr->val);
53         evr2->unset = evr->unset;
54         cfdata->env_vars = eina_list_append(cfdata->env_vars, evr2);
55      }
56 }
57
58 static void *
59 _create_data(E_Config_Dialog *cfd)
60 {
61    E_Config_Dialog_Data *cfdata;
62
63    cfdata = E_NEW(E_Config_Dialog_Data, 1);
64    cfdata->cfd = cfd;
65    _fill_data(cfdata);
66    return cfdata;
67 }
68
69 static void
70 _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
71 {
72    E_Config_Env_Var *evr;
73    
74    EINA_LIST_FREE(cfdata->env_vars, evr)
75      {
76         eina_stringshare_del(evr->var);
77         if (evr->val) eina_stringshare_del(evr->val);
78         E_FREE(evr);
79      }
80    if (cfdata->var_str) free(cfdata->var_str);
81    if (cfdata->val_str) free(cfdata->val_str);
82    E_FREE(cfdata);
83 }
84
85 static int
86 _basic_apply_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
87 {
88    Eina_List *l, *l2;
89    E_Config_Env_Var *evr, *evr2;
90    int same;
91    
92    // old env vars removed from new set - unset
93    EINA_LIST_FOREACH(e_config->env_vars, l, evr)
94      {
95         same = 0;
96         EINA_LIST_FOREACH(cfdata->env_vars, l2, evr2)
97           {
98              if (!strcmp(evr->var, evr2->var))
99                {
100                   same = 1;
101                   break;
102                }
103           }
104         if (!same) e_env_unset(evr->var);
105      }
106    EINA_LIST_FREE(e_config->env_vars, evr)
107      {
108         eina_stringshare_del(evr->var);
109         if (evr->val) eina_stringshare_del(evr->val);
110         E_FREE(evr);
111      }
112    EINA_LIST_FOREACH(cfdata->env_vars, l, evr)
113      {
114         evr2 = E_NEW(E_Config_Env_Var, 1);
115         
116         evr2->var = eina_stringshare_add(evr->var);
117         if (evr->val) evr2->val = eina_stringshare_add(evr->val);
118         evr2->unset = evr->unset;
119         e_config->env_vars = eina_list_append(e_config->env_vars, evr2);
120      }
121    // set all env vars (or unset as needed)
122    EINA_LIST_FOREACH(e_config->env_vars, l, evr)
123      {
124         if (evr->unset)
125            e_env_unset(evr->var);
126         else
127            e_env_set(evr->var, evr->val);
128      }
129    efreet_lang_reset();
130    e_config_save_queue();
131    return 1;
132 }
133
134 static void
135 _sel_cb(void *data)
136 {
137    E_Config_Dialog_Data *cfdata = data;
138    int sel_n = e_widget_ilist_selected_get(cfdata->gui.list);
139    E_Config_Env_Var *evr = eina_list_nth(cfdata->env_vars, sel_n);
140    if (!evr) return;
141    e_widget_check_checked_set(cfdata->gui.unset, evr->unset);
142    e_widget_disabled_set(cfdata->gui.val_en, evr->unset);
143    e_widget_entry_text_set(cfdata->gui.var_en, evr->var);
144    if ((evr->val) && (!evr->unset))
145       e_widget_entry_text_set(cfdata->gui.val_en, evr->val);
146    else
147       e_widget_entry_text_set(cfdata->gui.val_en, "");
148 }
149
150 static void
151 _add_cb(void *data, void *data2 __UNUSED__)
152 {
153    E_Config_Dialog_Data *cfdata = data;
154    Eina_List *l;
155    E_Config_Env_Var *evr = NULL;
156    int i, sel = -1;
157    
158    if (!cfdata->var_str) return;
159    
160    i = 0;
161    EINA_LIST_FOREACH(cfdata->env_vars, l, evr)
162      {
163         if (!strcmp(cfdata->var_str, evr->var))
164           {
165              sel = i;
166              break;
167           }
168         evr = NULL;
169         i++;
170      }
171    if (!evr) // new
172      {
173         evr = E_NEW(E_Config_Env_Var, 1);
174         if (evr)
175           {
176              evr->var = eina_stringshare_add(cfdata->var_str);
177              if (cfdata->unset)
178                 cfdata->unset = 1;
179              else
180                {
181                   if (cfdata->val_str)
182                      evr->val = eina_stringshare_add(cfdata->val_str);
183                   cfdata->unset = 0;
184                }
185              cfdata->env_vars = eina_list_append(cfdata->env_vars, evr);
186              e_widget_ilist_append(cfdata->gui.list, NULL, 
187                                    evr->var, _sel_cb, cfdata, NULL);
188              e_widget_ilist_go(cfdata->gui.list);
189              sel = e_widget_ilist_count(cfdata->gui.list) - 1;
190              e_widget_ilist_selected_set(cfdata->gui.list, sel);
191              e_widget_ilist_nth_show(cfdata->gui.list, sel, 0);
192           }
193      }
194    else // modify
195      {
196         if (evr->val) eina_stringshare_del(evr->val);
197         evr->val = NULL;
198         if (cfdata->unset)
199            evr->unset = 1;
200         else
201           {
202              if (cfdata->val_str)
203                 evr->val = eina_stringshare_add(cfdata->val_str);
204              evr->unset = 0;
205           }
206         if (sel >= 0)
207           {
208              e_widget_ilist_selected_set(cfdata->gui.list, sel);
209              e_widget_ilist_nth_show(cfdata->gui.list, sel, 0);
210           }
211      }
212 }
213
214 static void
215 _del_cb(void *data, void *data2 __UNUSED__)
216 {
217    E_Config_Dialog_Data *cfdata = data;
218    Eina_List *l;
219    E_Config_Env_Var *evr = NULL;
220    int sel_n;
221 /*
222    int i, sel = -1;
223    
224    EINA_LIST_FOREACH(cfdata->env_vars, l, evr)
225      {
226         if (!strcmp(cfdata->var_str, evr->var))
227           {
228              sel = i;
229              break;
230           }
231         evr = NULL;
232         i++;
233      }
234 */
235    sel_n = e_widget_ilist_selected_get(cfdata->gui.list);
236    if (sel_n != -1)
237      evr = eina_list_nth(cfdata->env_vars, sel_n);
238
239    if (evr && strcmp(cfdata->var_str, evr->var)) evr = NULL;
240    if (evr)
241      {
242         cfdata->env_vars = eina_list_remove(cfdata->env_vars, evr);
243         e_env_unset(evr->var);
244         eina_stringshare_del(evr->var);
245         if (evr->val) eina_stringshare_del(evr->val);
246         E_FREE(evr);
247 //        cfdata->env_vars = eina_list_remove_list(cfdata->env_vars, l);
248         e_widget_ilist_clear(cfdata->gui.list);
249         e_widget_ilist_freeze(cfdata->gui.list);
250         EINA_LIST_FOREACH(cfdata->env_vars, l, evr)
251           {
252              e_widget_ilist_append(cfdata->gui.list, NULL, evr->var, 
253                                    _sel_cb, cfdata, NULL);
254           }
255         e_widget_ilist_go(cfdata->gui.list);
256         e_widget_ilist_thaw(cfdata->gui.list);
257      }
258 }
259
260 static void
261 _mod_cb(void *data, void *data2 __UNUSED__)
262 {
263    _add_cb(data, data2);
264 }
265
266 static void
267 _unset_cb(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
268 {
269    E_Config_Dialog_Data *cfdata = data;
270    if (cfdata->unset) e_widget_entry_text_set(cfdata->gui.val_en, "");
271    e_widget_disabled_set(cfdata->gui.val_en, cfdata->unset);
272 }
273
274
275 static Evas_Object *
276 _basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata)
277 {
278    Evas_Object *o, *ol, *oe, *ob, *oc;
279    Eina_List *l;
280    E_Config_Env_Var *evr;
281    
282    o = e_widget_table_add(evas, 0);
283    
284    ol = e_widget_ilist_add(evas, 0, 0, NULL);
285    cfdata->gui.list = ol;
286    e_widget_ilist_freeze(ol);
287    EINA_LIST_FOREACH(cfdata->env_vars, l, evr)
288      {
289         e_widget_ilist_append(ol, NULL, evr->var, _sel_cb, cfdata, NULL);
290      }
291    e_widget_ilist_go(ol);
292    e_widget_ilist_thaw(ol);
293    e_widget_size_min_set(ol, 200, 160);
294    e_widget_table_object_append(o, ol, 0, 0, 3, 1, 1, 1, 1, 1);
295    
296    oe = e_widget_entry_add(evas, &(cfdata->var_str), NULL, NULL, NULL);
297    cfdata->gui.var_en = oe;
298    e_widget_table_object_append(o, oe, 0, 1, 1, 1, 1, 1, 1, 0);
299    
300    oe = e_widget_entry_add(evas, &(cfdata->val_str), NULL, NULL, NULL);
301    cfdata->gui.val_en = oe;
302    e_widget_table_object_append(o, oe, 1, 1, 1, 1, 1, 1, 1, 0);
303    
304    oc = e_widget_check_add(evas, _("Unset"), &(cfdata->unset));
305    cfdata->gui.unset = oc;
306    e_widget_table_object_append(o, oc, 2, 1, 1, 1, 1, 1, 1, 0);
307    evas_object_smart_callback_add(oc, "changed", _unset_cb, cfdata);
308    
309    ob = e_widget_button_add(evas, _("Add"), "list-add", _add_cb, cfdata, NULL);
310    e_widget_table_object_append(o, ob, 0, 2, 1, 1, 1, 1, 0, 0);
311
312    ob = e_widget_button_add(evas, _("Modify"), NULL, _mod_cb, cfdata, NULL);
313    e_widget_table_object_append(o, ob, 1, 2, 1, 1, 1, 1, 0, 0);
314
315    ob = e_widget_button_add(evas, _("Delete"), "list-remove", _del_cb, cfdata, NULL);
316    e_widget_table_object_append(o, ob, 2, 2, 1, 1, 1, 1, 0, 0);
317    
318    e_dialog_resizable_set(cfd->dia, 1);
319    return o;
320 }