Add a task to copy configuration files to user's HOME dir from data dir for multi...
[platform/core/uifw/e17.git] / src / modules / conf_display / e_int_config_desklock_fsel.c
1 #include "e.h"
2 #include "e_mod_main.h"
3
4 struct _E_Config_Dialog_Data
5 {
6    Evas_Object *o_list, *o_up;
7    int          fmdir;
8    char        *bg;
9 };
10
11 /* local function prototypes */
12 static void        *_create_data(E_Config_Dialog *cfd);
13 static void         _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata);
14 static Evas_Object *_basic_create(E_Config_Dialog *cfd, Evas *evas, E_Config_Dialog_Data *cfdata);
15 static void         _cb_dir_changed(void *data, Evas_Object *obj, void *event);
16 static void         _cb_sel_changed(void *data, Evas_Object *obj, void *event);
17 static void         _cb_files_changed(void *data, Evas_Object *obj, void *event);
18 static void         _cb_files_deleted(void *data, Evas_Object *obj, void *event);
19 static void         _cb_radio_changed(void *data, Evas_Object *obj, void *event);
20 static void         _cb_dir_up(void *data1, void *data2);
21
22 E_Config_Dialog *
23 e_int_config_desklock_fsel(E_Config_Dialog *parent, Evas_Object *bg)
24 {
25    E_Container *con;
26    E_Config_Dialog *cfd;
27    E_Config_Dialog_View *v;
28
29    if (parent)
30      con = parent->con;
31    else
32      con = e_container_current_get(e_manager_current_get());
33
34    v = E_NEW(E_Config_Dialog_View, 1);
35    v->create_cfdata = _create_data;
36    v->free_cfdata = _free_data;
37    v->basic.create_widgets = _basic_create;
38    v->basic_only = 1;
39    v->normal_win = 1;
40
41    cfd = e_config_dialog_new(con, _("Select a Background..."),
42                              "E", "_desklock_fsel_dialog",
43                              "enlightenment/background", 0, v, parent);
44    e_object_data_set(E_OBJECT(cfd), bg);
45    return cfd;
46 }
47
48 /* local functions */
49 static void *
50 _create_data(E_Config_Dialog *cfd __UNUSED__)
51 {
52    E_Config_Dialog_Data *cfdata;
53
54    cfdata = E_NEW(E_Config_Dialog_Data, 1);
55    cfdata->fmdir = 0;
56    return cfdata;
57 }
58
59 static void
60 _free_data(E_Config_Dialog *cfd, E_Config_Dialog_Data *cfdata)
61 {
62    const char *bg_file = NULL;
63
64    if (cfdata->bg) bg_file = strdup(cfdata->bg);
65    E_FREE(cfdata->bg);
66    E_FREE(cfdata);
67    e_int_config_desklock_fsel_done(cfd->data, e_object_data_get(E_OBJECT(cfd)), bg_file);
68 }
69
70 static Evas_Object *
71 _basic_create(E_Config_Dialog *cfd __UNUSED__, Evas *evas, E_Config_Dialog_Data *cfdata)
72 {
73    Evas_Object *o, *ow, *ot, *rt;
74    E_Radio_Group *rg;
75    char path[PATH_MAX];
76
77    /* Content */
78    o = e_widget_list_add(evas, 0, 0);
79
80    rg = e_widget_radio_group_new(&(cfdata->fmdir));
81    ot = e_widget_table_add(evas, 0);
82    rt = e_widget_table_add(evas, 1);
83
84    ow = e_widget_radio_add(evas, _("Personal"), 0, rg);
85    evas_object_smart_callback_add(ow, "changed", _cb_radio_changed, cfdata);
86    e_widget_table_object_append(rt, ow, 0, 0, 1, 1, 1, 1, 0, 0);
87    ow = e_widget_radio_add(evas, _("System"), 1, rg);
88    evas_object_smart_callback_add(ow, "changed", _cb_radio_changed, cfdata);
89    e_widget_table_object_append(rt, ow, 1, 0, 1, 1, 1, 1, 0, 0);
90    e_widget_table_object_append(ot, rt, 0, 0, 1, 1, 0, 0, 0, 0);
91    ow = e_widget_button_add(evas, _("Go up a Directory"), "go-up",
92                             _cb_dir_up, cfdata, NULL);
93    cfdata->o_up = ow;
94    e_widget_table_object_append(ot, ow, 0, 1, 1, 1, 0, 0, 0, 0);
95
96    if (cfdata->fmdir == 1)
97      e_prefix_data_concat_static(path, "data/backgrounds");
98    else
99      e_user_dir_concat_static(path, "backgrounds");
100
101    cfdata->o_list = e_widget_flist_add(evas);
102    {
103       E_Fm2_Config *cfg;
104       cfg = e_widget_flist_config_get(cfdata->o_list);
105       cfg->view.no_click_rename = 1;
106    }
107    evas_object_smart_callback_add(cfdata->o_list, "dir_changed",
108                                   _cb_dir_changed, cfdata);
109    evas_object_smart_callback_add(cfdata->o_list, "selection_change",
110                                   _cb_sel_changed, cfdata);
111    evas_object_smart_callback_add(cfdata->o_list, "changed",
112                                   _cb_files_changed, cfdata);
113    evas_object_smart_callback_add(cfdata->o_list, "files_deleted",
114                                   _cb_files_deleted, cfdata);
115    e_widget_flist_path_set(cfdata->o_list, path, "/");
116    e_widget_size_min_set(cfdata->o_list, 200, 160);
117    e_widget_table_object_append(ot, cfdata->o_list, 0, 2, 1, 1, 1, 1, 1, 1);
118    e_widget_list_object_append(o, ot, 1, 1, 0.5);
119
120    return o;
121 }
122
123 static void
124 _cb_dir_changed(void *data, Evas_Object *obj __UNUSED__, void *event __UNUSED__)
125 {
126    E_Config_Dialog_Data *cfdata;
127
128    if (!(cfdata = data)) return;
129    e_widget_disabled_set(cfdata->o_up,
130                          !e_widget_flist_has_parent_get(cfdata->o_list));
131 }
132
133 static void
134 _cb_sel_changed(void *data, Evas_Object *obj __UNUSED__, void *event __UNUSED__)
135 {
136    E_Config_Dialog_Data *cfdata;
137    Eina_List *sel;
138    E_Fm2_Icon_Info *ici;
139    const char *real_path;
140    char buff[PATH_MAX];
141
142    if (!(cfdata = data)) return;
143    if (!(sel = e_widget_flist_selected_list_get(cfdata->o_list))) return;
144    ici = sel->data;
145    real_path = e_widget_flist_real_path_get(cfdata->o_list);
146    if (!strcmp(real_path, "/"))
147      snprintf(buff, sizeof(buff), "/%s", ici->file);
148    else
149      snprintf(buff, sizeof(buff), "%s/%s", real_path, ici->file);
150    eina_list_free(sel);
151    if (ecore_file_is_dir(buff)) return;
152    E_FREE(cfdata->bg);
153    cfdata->bg = strdup(buff);
154 }
155
156 static void
157 _cb_files_changed(void *data, Evas_Object *obj __UNUSED__, void *event __UNUSED__)
158 {
159    E_Config_Dialog_Data *cfdata;
160    const char *p = NULL;
161    char buff[PATH_MAX];
162    size_t len;
163
164    if (!(cfdata = data)) return;
165    if (!cfdata->bg) return;
166    p = e_widget_flist_real_path_get(cfdata->o_list);
167    if (p)
168      {
169         if (strncmp(p, cfdata->bg, strlen(p))) return;
170      }
171    else return;
172
173    len = e_user_dir_concat_static(buff, "backgrounds");
174    if (!strncmp(cfdata->bg, buff, len))
175      p = cfdata->bg + len + 1;
176    else
177      {
178         len = e_prefix_data_concat_static(buff, "data/backgrounds");
179         if (!strncmp(cfdata->bg, buff, len))
180           p = cfdata->bg + len + 1;
181         else
182           p = cfdata->bg;
183      }
184    e_widget_flist_select_set(cfdata->o_list, p, 1);
185    e_widget_flist_file_show(cfdata->o_list, p);
186 }
187
188 static void
189 _cb_files_deleted(void *data, Evas_Object *obj __UNUSED__, void *event __UNUSED__)
190 {
191    E_Config_Dialog_Data *cfdata;
192    Eina_List *sel, *all, *n;
193    E_Fm2_Icon_Info *ici, *ic;
194
195    if (!(cfdata = data)) return;
196    if (!cfdata->bg) return;
197    if (!(all = e_widget_flist_all_list_get(cfdata->o_list))) return;
198    if (!(sel = e_widget_flist_selected_list_get(cfdata->o_list))) return;
199    if (!(ici = sel->data)) return;
200    all = eina_list_data_find_list(all, ici);
201    n = eina_list_next(all);
202    if (!n)
203      {
204         if (!(n = eina_list_prev(all))) return;
205      }
206    if (!(ic = n->data)) return;
207    e_widget_flist_select_set(cfdata->o_list, ic->file, 1);
208    e_widget_flist_file_show(cfdata->o_list, ic->file);
209    eina_list_free(n);
210    evas_object_smart_callback_call(cfdata->o_list, "selection_change", cfdata);
211 }
212
213 static void
214 _cb_radio_changed(void *data, Evas_Object *obj __UNUSED__, void *event __UNUSED__)
215 {
216    E_Config_Dialog_Data *cfdata;
217    char path[PATH_MAX];
218
219    if (!(cfdata = data)) return;
220    if (cfdata->fmdir == 1)
221      e_prefix_data_concat_static(path, "data/backgrounds");
222    else
223      e_user_dir_concat_static(path, "backgrounds");
224    e_widget_flist_path_set(cfdata->o_list, path, "/");
225 }
226
227 static void
228 _cb_dir_up(void *data1, void *data2 __UNUSED__)
229 {
230    E_Config_Dialog_Data *cfdata;
231
232    if (!(cfdata = data1)) return;
233    e_widget_flist_parent_go(cfdata->o_list);
234 }
235