Tizen 2.1 release
[platform/core/uifw/e17.git] / src / modules / ibar / e_mod_config.c
1 #include "e.h"
2 #include "e_mod_main.h"
3
4 struct _E_Config_Dialog_Data
5 {
6    const char       *dir;
7    int               show_label, eap_label;
8    int               lock_move;
9    int               track_launch;
10
11    Evas_Object      *tlist;
12    Evas_Object      *radio_name;
13    Evas_Object      *radio_comment;
14    Evas_Object      *radio_generic;
15    E_Confirm_Dialog *dialog_delete;
16 };
17
18 /* Protos */
19 static void        *_create_data(E_Config_Dialog *cfd);
20 static void         _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
21 static Evas_Object *_basic_create_widgets(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
22 static int          _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
23 static void         _cb_add(void *data, void *data2);
24 static void         _cb_del(void *data, void *data2);
25 static void         _cb_config(void *data, void *data2);
26 static void         _cb_entry_ok(void *data, char *text);
27 static void         _cb_confirm_dialog_yes(void *data);
28 static void         _cb_confirm_dialog_destroy(void *data);
29 static void         _load_tlist(E_Config_Dialog_Data *cfdata);
30 static void         _show_label_cb_change(void *data, Evas_Object *obj);
31
32 void
33 _config_ibar_module(Config_Item *ci)
34 {
35    E_Config_Dialog *cfd;
36    E_Config_Dialog_View *v;
37    char buf[4096];
38
39    v = E_NEW(E_Config_Dialog_View, 1);
40
41    /* Dialog Methods */
42    v->create_cfdata = _create_data;
43    v->free_cfdata = _free_data;
44    v->basic.apply_cfdata = _basic_apply_data;
45    v->basic.create_widgets = _basic_create_widgets;
46    v->advanced.apply_cfdata = NULL;
47    v->advanced.create_widgets = NULL;
48
49    snprintf(buf, sizeof(buf), "%s/e-module-ibar.edj",
50             e_module_dir_get(ibar_config->module));
51
52    /* Create The Dialog */
53    cfd = e_config_dialog_new(e_container_current_get(e_manager_current_get()),
54                              _("IBar Settings"),
55                              "E", "_e_mod_ibar_config_dialog",
56                              buf, 0, v, ci);
57    ibar_config->config_dialog = cfd;
58 }
59
60 static void
61 _fill_data(Config_Item *ci, E_Config_Dialog_Data *cfdata)
62 {
63    if (ci->dir)
64      cfdata->dir = eina_stringshare_ref(ci->dir);
65    else
66      cfdata->dir = eina_stringshare_add("");
67    cfdata->show_label = ci->show_label;
68    cfdata->eap_label = ci->eap_label;
69    cfdata->lock_move = ci->lock_move;
70    cfdata->track_launch = !ci->dont_track_launch;
71 }
72
73 static void *
74 _create_data(E_Config_Dialog *cfd)
75 {
76    E_Config_Dialog_Data *cfdata;
77    Config_Item *ci;
78
79    ci = cfd->data;
80    cfdata = E_NEW(E_Config_Dialog_Data, 1);
81    _fill_data(ci, cfdata);
82    return cfdata;
83 }
84
85 static void
86 _free_data(E_Config_Dialog *cfd __UNUSED__, E_Config_Dialog_Data *cfdata)
87 {
88    if (cfdata->dir) eina_stringshare_del(cfdata->dir);
89    if (cfdata->dialog_delete) e_object_del(E_OBJECT(cfdata->dialog_delete));
90    ibar_config->config_dialog = NULL;
91    E_FREE(cfdata);
92 }
93
94 static Evas_Object *
95 _basic_create_widgets(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata)
96 {
97    Evas_Object *o, *of, *ol, *ob, *ot;
98    E_Radio_Group *rg;
99
100    o = e_widget_list_add(evas, 0, 0);
101
102    of = e_widget_frametable_add(evas, _("Selected source"), 0);
103    ol = e_widget_ilist_add(evas, 32, 32, &(cfdata->dir));
104    cfdata->tlist = ol;
105    _load_tlist(cfdata);
106    e_widget_size_min_set(ol, 140, 140);
107    e_widget_frametable_object_append(of, ol, 0, 0, 1, 2, 1, 1, 1, 0);
108
109    ot = e_widget_table_add(evas, 0);
110    ob = e_widget_button_add(evas, _("Add"), "list-add", _cb_add, cfdata, NULL);
111    e_widget_table_object_append(ot, ob, 0, 0, 1, 1, 1, 1, 1, 0);
112    ob = e_widget_button_add(evas, _("Delete"), "list-remove", _cb_del, cfdata, NULL);
113    e_widget_table_object_append(ot, ob, 0, 1, 1, 1, 1, 1, 1, 0);
114    ob = e_widget_button_add(evas, _("Setup"), "configure", _cb_config, cfdata, NULL);
115    e_widget_table_object_append(ot, ob, 0, 2, 1, 1, 1, 1, 1, 0);
116
117    if (!e_configure_registry_exists("applications/ibar_applications"))
118      e_widget_disabled_set(ob, 1);
119
120    e_widget_frametable_object_append(of, ot, 1, 0, 1, 1, 1, 1, 1, 0);
121    e_widget_list_object_append(o, of, 1, 1, 0.5);
122
123    of = e_widget_framelist_add(evas, _("Icon Labels"), 0);
124    ob = e_widget_check_add(evas, _("Show icon label"), &(cfdata->show_label));
125    e_widget_on_change_hook_set(ob, _show_label_cb_change, cfdata);
126    e_widget_framelist_object_append(of, ob);
127
128    rg = e_widget_radio_group_new(&(cfdata->eap_label));
129
130    cfdata->radio_name = e_widget_radio_add(evas, _("Name"), 0, rg);
131    e_widget_framelist_object_append(of, cfdata->radio_name);
132    if (!cfdata->show_label) e_widget_disabled_set(cfdata->radio_name, 1);
133
134    cfdata->radio_comment = e_widget_radio_add(evas, _("Comment"), 1, rg);
135    e_widget_framelist_object_append(of, cfdata->radio_comment);
136    if (!cfdata->show_label) e_widget_disabled_set(cfdata->radio_comment, 1);
137
138    cfdata->radio_generic = e_widget_radio_add(evas, _("Generic"), 2, rg);
139    e_widget_framelist_object_append(of, cfdata->radio_generic);
140    if (!cfdata->show_label) e_widget_disabled_set(cfdata->radio_generic, 1);
141
142    e_widget_list_object_append(o, of, 1, 1, 0.5);
143
144    of = e_widget_framelist_add(evas, _("Misc"), 0);
145    ob = e_widget_check_add(evas, _("Lock icon move"), &(cfdata->lock_move));
146    e_widget_framelist_object_append(of, ob);
147    ob = e_widget_check_add(evas, _("Track launch"), &(cfdata->track_launch));
148    e_widget_framelist_object_append(of, ob);
149
150    e_widget_list_object_append(o, of, 1, 1, 0.5);
151
152    return o;
153 }
154
155 static int
156 _basic_apply_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
157 {
158    Config_Item *ci;
159
160    ci = cfd->data;
161    if (ci->dir) eina_stringshare_del(ci->dir);
162    ci->dir = NULL;
163    if (cfdata->dir) ci->dir = eina_stringshare_ref(cfdata->dir);
164    ci->show_label = cfdata->show_label;
165    ci->eap_label = cfdata->eap_label;
166    ci->lock_move = cfdata->lock_move;
167    ci->dont_track_launch = !cfdata->track_launch;
168    _ibar_config_update(ci);
169    e_config_save_queue();
170    return 1;
171 }
172
173 static void
174 _cb_add(void *data, void *data2 __UNUSED__)
175 {
176    E_Config_Dialog_Data *cfdata;
177
178    cfdata = data;
179    e_entry_dialog_show(_("Create new IBar source"), "enlightenment",
180                        _("Enter a name for this new source:"), "", NULL, NULL,
181                        _cb_entry_ok, NULL, cfdata);
182 }
183
184 static void
185 _cb_del(void *data, void *data2 __UNUSED__)
186 {
187    char buf[4096];
188    E_Config_Dialog_Data *cfdata;
189    E_Confirm_Dialog *dialog;
190
191    cfdata = data;
192    if (cfdata->dialog_delete) return;
193
194    snprintf(buf, sizeof(buf), _("You requested to delete \"%s\".<br><br>"
195                                 "Are you sure you want to delete this bar source?"),
196             cfdata->dir);
197
198    dialog = e_confirm_dialog_show(_("Are you sure you want to delete this bar source?"),
199                                   "application-exit", buf, _("Delete"), _("Keep"),
200                                   _cb_confirm_dialog_yes, NULL, cfdata, NULL,
201                                   _cb_confirm_dialog_destroy, cfdata);
202    cfdata->dialog_delete = dialog;
203 }
204
205 static void
206 _cb_config(void *data, void *data2 __UNUSED__)
207 {
208    char path[PATH_MAX];
209    E_Config_Dialog_Data *cfdata;
210
211    cfdata = data;
212    e_user_dir_snprintf(path, sizeof(path), "applications/bar/%s/.order",
213                        cfdata->dir);
214    e_configure_registry_call("internal/ibar_other",
215                              e_container_current_get(e_manager_current_get()),
216                              path);
217 }
218
219 static void
220 _cb_entry_ok(void *data, char *text)
221 {
222    char buf[4096];
223    char tmp[4096];
224    FILE *f;
225    size_t len;
226
227    len = e_user_dir_snprintf(buf, sizeof(buf), "applications/bar/%s", text);
228    if (len + sizeof("/.order") >= sizeof(buf)) return;
229    if (!ecore_file_exists(buf))
230      {
231         ecore_file_mkdir(buf);
232         memcpy(buf + len, "/.order", sizeof("/.order"));
233         f = fopen(buf, "w");
234         if (f)
235           {
236              int ret = 0;
237
238              /* Populate this .order file with some defaults */
239              snprintf(tmp, sizeof(tmp), 
240                       "terminology.desktop\n"
241                       "sylpheed.desktop\n"
242                       "firefox.desktop\n"
243                       "openoffice.desktop\n" 
244                       "xchat.desktop\n"
245                       "gimp.desktop\n");
246              ret = fwrite(tmp, sizeof(char), strlen(tmp), f);
247              fclose(f);
248           }
249      }
250
251    _load_tlist(data);
252 }
253
254 static void
255 _cb_confirm_dialog_yes(void *data)
256 {
257    E_Config_Dialog_Data *cfdata;
258    char buf[4096];
259
260    cfdata = data;
261    if (e_user_dir_snprintf(buf, sizeof(buf), "applications/bar/%s", cfdata->dir) >= sizeof(buf))
262      return;
263    if (ecore_file_is_dir(buf))
264      ecore_file_recursive_rm(buf);
265
266    _load_tlist(cfdata);
267 }
268
269 static void
270 _cb_confirm_dialog_destroy(void *data)
271 {
272    E_Config_Dialog_Data *cfdata;
273
274    cfdata = data;
275    cfdata->dialog_delete = NULL;
276 }
277
278 static void
279 _load_tlist(E_Config_Dialog_Data *cfdata)
280 {
281    Eina_List *dirs;
282    char buf[4096], *file;
283    int selnum = -1;
284    int i = 0;
285    size_t len;
286
287    e_widget_ilist_clear(cfdata->tlist);
288
289    len = e_user_dir_concat_static(buf, "applications/bar");
290    if (len + 2 >= sizeof(buf)) return;
291    dirs = ecore_file_ls(buf);
292
293    buf[len] = '/';
294    len++;
295
296    EINA_LIST_FREE(dirs, file)
297      {
298         if (file[0] == '.') continue;
299         if (eina_strlcpy(buf + len, file, sizeof(buf) - len) >= sizeof(buf) - len)
300           continue;
301         if (ecore_file_is_dir(buf))
302           {
303              e_widget_ilist_append(cfdata->tlist, NULL, file, NULL, NULL, file);
304              if ((cfdata->dir) && (!strcmp(cfdata->dir, file)))
305                selnum = i;
306              i++;
307           }
308
309         free(file);
310      }
311
312    e_widget_ilist_go(cfdata->tlist);
313    if (selnum >= 0) e_widget_ilist_selected_set(cfdata->tlist, selnum);
314 }
315
316 static void
317 _show_label_cb_change(void *data, Evas_Object *obj __UNUSED__)
318 {
319    E_Config_Dialog_Data *cfdata;
320
321    cfdata = data;
322    if (!cfdata) return;
323    e_widget_disabled_set(cfdata->radio_name, !cfdata->show_label);
324    e_widget_disabled_set(cfdata->radio_comment, !cfdata->show_label);
325    e_widget_disabled_set(cfdata->radio_generic, !cfdata->show_label);
326 }
327