update for beta release
[framework/uifw/e17.git] / src / bin / e_widget_fsel.c
1 #include "e.h"
2
3 typedef struct _E_Widget_Data E_Widget_Data;
4 struct _E_Widget_Data
5 {
6    Evas_Object *obj;
7    Evas_Object *o_table;
8    Evas_Object *o_table2;
9    Evas_Object *o_preview_table;
10    Evas_Object *o_preview_preview_table;
11    Evas_Object *o_preview_frame;
12    Evas_Object *o_preview_scroll;
13    Evas_Object *o_preview_extra;
14    Evas_Object *o_preview_extra_entry;
15    Evas_Object *o_preview_size;
16    Evas_Object *o_preview_size_entry;
17    Evas_Object *o_preview_owner;
18    Evas_Object *o_preview_owner_entry;
19    Evas_Object *o_preview_perms;
20    Evas_Object *o_preview_perms_entry;
21    Evas_Object *o_preview_time;
22    Evas_Object *o_preview_time_entry;
23    Evas_Object *o_preview_preview;
24    Evas_Object *o_up_button;
25    Evas_Object *o_favorites_frame;
26    Evas_Object *o_favorites_fm;
27    Evas_Object *o_favorites_add;
28    Evas_Object *o_files_frame;
29    Evas_Object *o_files_fm;
30    Evas_Object *o_entry;
31    Evas_Coord   preview_w, preview_h;
32    char *entry_text;
33    char *preview_extra_text;
34    char *preview_size_text;
35    char *preview_owner_text;
36    char *preview_perms_text;
37    char *preview_time_text;
38    char *path;
39    void (*sel_func) (void *data, Evas_Object *obj);
40    void *sel_data;
41    void (*chg_func) (void *data, Evas_Object *obj);
42    void *chg_data;
43    int preview;
44 };
45
46 static void _e_wid_fsel_preview_update(void *data, Evas_Object *obj, void *event_info);
47 static void _e_wid_fsel_preview_file(E_Widget_Data *wd);
48 static char *_e_wid_file_size_get(off_t st_size);
49 static char *_e_wid_file_user_get(uid_t st_uid);
50 static char *_e_wid_file_perms_get(mode_t st_mode, uid_t st_uid, gid_t gid);
51 static char *_e_wid_file_time_get(time_t st_modtime);
52 static void _e_wid_del_hook(Evas_Object *obj);
53
54 /* local subsystem functions */
55 static void
56 _e_wid_fsel_button_up(void *data1, void *data2 __UNUSED__)
57 {
58    E_Widget_Data *wd;
59    
60    wd = data1;
61    if (wd->o_files_fm)
62      e_fm2_parent_go(wd->o_files_fm);
63    if (wd->o_files_frame)
64      e_widget_scrollframe_child_pos_set(wd->o_files_frame, 0, 0);
65 //   e_widget_entry_text_set(wd->o_entry, 
66 //                         e_fm2_real_path_get(wd->o_files_fm));
67 }
68
69 static void
70 _e_wid_fsel_favorites_add(void *data1, void *data2 __UNUSED__)
71 {
72    E_Widget_Data *wd;
73    const char *current_path, *fn;
74    char buf[PATH_MAX], *fname;
75    struct stat st;
76    FILE *f;
77    size_t len;
78    int ret = 0;
79
80    wd = data1;
81    current_path = e_fm2_real_path_get(wd->o_files_fm);
82    if (!ecore_file_is_dir(current_path)) return;
83
84    len = e_user_dir_snprintf(buf, sizeof(buf), "fileman/favorites/%s",
85                              ecore_file_file_get(current_path));
86    if (len >= sizeof(buf)) return;
87    if (stat(buf, &st) < 0) 
88      ret = symlink(current_path, buf);
89    else
90      {
91         int i = 1, maxlen;
92
93         buf[len] = '-';
94         len++;
95         if (len == sizeof(buf)) return;
96         maxlen = sizeof(buf) - len;
97         do
98           {
99              if (snprintf(buf + len, maxlen, "%d", i) >= maxlen)
100                return;
101              i++;
102           }
103         while (stat(buf, &st) == 0);
104         ret = symlink(current_path, buf);
105      }
106    fn = ecore_file_file_get(buf);
107    len = strlen(fn) + 1;
108    fname = alloca(len);
109    memcpy(fname, fn, len);
110    e_user_dir_concat_static(buf, "fileman/favorites/.order");
111    if (ecore_file_exists(buf))
112      {
113         f = fopen(buf, "a");
114         if (f)
115           {
116              fprintf(f, "%s\n", fname);
117              fclose(f);
118           }
119      }
120    e_fm2_refresh(wd->o_favorites_fm);
121 }
122
123 static void
124 _e_wid_fsel_favorites_files_changed(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
125 {
126    E_Widget_Data *wd;
127    Eina_List *icons, *l;
128    E_Fm2_Icon_Info *ici;
129    const char *rp;
130    char *p1, *p2;
131    
132    wd = data;
133    if (!wd->o_favorites_fm) return;
134    if (!wd->o_files_fm) return;
135    icons = e_fm2_all_list_get(wd->o_favorites_fm);
136    if (!icons) return;
137    rp = e_fm2_real_path_get(wd->o_files_fm);
138    p1 = ecore_file_realpath(rp);
139    if (!p1) goto done;
140    EINA_LIST_FOREACH(icons, l, ici)
141      {
142         if (ici->link)
143           {
144              p2 = ecore_file_realpath(ici->link);
145              if (p2)
146                {
147                   if (!strcmp(p1, p2))
148                     {
149                        e_fm2_select_set(wd->o_favorites_fm, ici->file, 1);
150                        E_FREE(p2);
151                        goto done;
152                     }
153                   E_FREE(p2);
154                }
155           }
156      }
157    done:
158 //   e_widget_entry_text_set(wd->o_entry, rp);
159    E_FREE(p1);
160    eina_list_free(icons);
161 }
162
163 static void
164 _e_wid_fsel_favorites_selected(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
165 {
166    E_Widget_Data *wd;
167    Eina_List *selected;
168    E_Fm2_Icon_Info *ici;
169    
170    wd = data;
171    if (!wd->o_favorites_fm) return;
172    if (!wd->o_files_frame) return;
173    selected = e_fm2_selected_list_get(wd->o_favorites_fm);
174    if (!selected) return;
175    ici = eina_list_data_get(selected);
176    if ((ici->link) && (ici->mount))
177      e_fm2_path_set(wd->o_files_fm, ici->link, "/");
178    else if (ici->real_link)
179      e_fm2_path_set(wd->o_files_fm, NULL, ici->real_link);
180    eina_list_free(selected);
181    e_widget_scrollframe_child_pos_set(wd->o_files_frame, 0, 0);
182 //   e_widget_entry_text_set(wd->o_entry, 
183 //                         e_fm2_real_path_get(wd->o_files_fm));
184 }
185
186 static void
187 _e_wid_fsel_files_changed(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
188 {
189    E_Widget_Data *wd;
190
191    wd = data;
192    if (!wd->o_files_fm) return;
193    if (!e_fm2_has_parent_get(wd->o_files_fm))
194      {
195         if (wd->o_up_button)
196           e_widget_disabled_set(wd->o_up_button, 1);
197      }
198    else
199      {
200         if (wd->o_up_button)
201           e_widget_disabled_set(wd->o_up_button, 0);
202      }
203    if (wd->o_files_frame)
204      e_widget_scrollframe_child_pos_set(wd->o_files_frame, 0, 0);
205 //   if ((wd->path) && (stat(wd->path, &st) == 0))
206 //     e_widget_entry_text_set(wd->o_entry, ecore_file_file_get(wd->path));
207    E_FREE(wd->path);
208    if (wd->chg_func) wd->chg_func(wd->chg_data, wd->obj);
209 }
210
211 static void
212 _e_wid_fsel_files_selection_change(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
213 {
214    E_Widget_Data *wd;
215    Eina_List *selected;
216    E_Fm2_Icon_Info *ici;
217    const char *rp;
218    char buf[PATH_MAX];
219    struct stat st;
220    
221    wd = data;
222    if (!wd->o_files_fm) return;
223    selected = e_fm2_selected_list_get(wd->o_files_fm);
224    if (!selected) return;
225    ici = eina_list_data_get(selected);
226    E_FREE(wd->path);
227    rp = e_fm2_real_path_get(wd->o_files_fm);
228    if (!strcmp(rp, "/"))
229      {
230         snprintf(buf, sizeof(buf), "/%s", ici->file);
231      }
232    else
233      {
234         snprintf(buf, sizeof(buf), "%s/%s",
235                  rp, ici->file);
236      }
237    wd->path = strdup(buf);
238    if (stat(wd->path, &st) == 0)
239      {
240         if (wd->preview) _e_wid_fsel_preview_file(wd);
241         if (!S_ISDIR(st.st_mode))
242           e_widget_entry_text_set(wd->o_entry, ici->file);
243 //      else
244 //        e_widget_entry_text_set(wd->o_entry, wd->path);
245      }
246    eina_list_free(selected);
247    if (wd->chg_func) wd->chg_func(wd->chg_data, wd->obj);
248 }
249
250 static void
251 _e_wid_fsel_files_selected(void *data, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
252 {
253    E_Widget_Data *wd;
254    
255    wd = data;
256    if (wd->path)
257      {
258         if (wd->sel_func) wd->sel_func(wd->sel_data, wd->obj);
259      }
260 }
261
262 /* externally accessible functions */
263 EAPI Evas_Object *
264 e_widget_fsel_add(Evas *evas, const char *dev, const char *path, char *selected, char *filter __UNUSED__, 
265                   void (*sel_func) (void *data, Evas_Object *obj), void *sel_data,
266                   void (*chg_func) (void *data, Evas_Object *obj), void *chg_data,
267                   int preview)
268 {
269    Evas_Object *obj, *o;
270    E_Widget_Data *wd;
271    Evas_Coord mw = 0, mh = 0;
272    E_Fm2_Config fmc;
273    
274    obj = e_widget_add(evas);
275    
276    e_widget_del_hook_set(obj, _e_wid_del_hook);
277    wd = calloc(1, sizeof(E_Widget_Data));
278    e_widget_data_set(obj, wd);
279
280    wd->obj = obj;
281    wd->sel_func = sel_func;
282    wd->sel_data = sel_data;
283    wd->chg_func = chg_func;
284    wd->chg_data = chg_data;
285    wd->preview = preview;
286    
287    o = e_widget_table_add(evas, 0);
288    wd->o_table = o;
289    e_widget_sub_object_add(obj, o);
290    e_widget_resize_object_set(obj, o);
291    
292    o = e_widget_table_add(evas, 0);
293    wd->o_table2 = o;
294    e_widget_sub_object_add(obj, o);
295    
296    o = e_widget_button_add(evas, _("Add to Favorites"), "bookmark-new",
297                            _e_wid_fsel_favorites_add, wd, NULL);
298    wd->o_favorites_add = o;
299    e_widget_sub_object_add(obj, o);
300    e_widget_table_object_append(wd->o_table2, o, 0, 0, 1, 1, 0, 0, 0, 0);
301    
302    o = e_widget_button_add(evas, _("Go up a Directory"), "go-up",
303                            _e_wid_fsel_button_up, wd, NULL);
304    wd->o_up_button = o;
305    e_widget_sub_object_add(obj, o);
306    e_widget_table_object_append(wd->o_table2, o, 1, 0, 1, 1, 0, 0, 1, 0);
307
308    if (preview)
309      {
310         o = e_widget_frametable_add(evas, _("Preview"), 0);
311         wd->o_preview_frame = o;
312         e_widget_sub_object_add(obj, o);
313
314         o = e_widget_table_add(evas, 0);
315         wd->o_preview_preview_table = o;
316         e_widget_sub_object_add(obj, o);
317
318         o = e_widget_table_add(evas, 0);
319         wd->o_preview_table = o;
320         e_widget_sub_object_add(obj, o);
321
322         o = e_widget_preview_add(evas, 128, 128);
323         wd->o_preview_preview = o;
324         e_widget_sub_object_add(obj, o);
325         evas_object_smart_callback_add(o, "preview_update",
326                                        _e_wid_fsel_preview_update, wd);
327         e_widget_table_object_append(wd->o_preview_preview_table,
328                                      wd->o_preview_preview,
329                                      0, 0, 1, 1, 0, 0, 1, 1);
330         
331         o = e_widget_label_add(evas, _("Resolution:"));
332         wd->o_preview_extra = o;
333         e_widget_sub_object_add(obj, o);
334         e_widget_table_object_append(wd->o_preview_table,
335                                      wd->o_preview_extra,
336                                      0, 0, 1, 1, 1, 1, 1, 1);
337
338         o = e_widget_entry_add(evas, &(wd->preview_extra_text), NULL, NULL, NULL);
339         e_widget_entry_readonly_set(o, 1);
340         wd->o_preview_extra_entry = o;
341         e_widget_sub_object_add(obj, o);
342         e_widget_size_min_set(o, 100, -1);
343         e_widget_table_object_append(wd->o_preview_table,
344                                      wd->o_preview_extra_entry,
345                                      1, 0, 1, 1, 1, 1, 1, 1);
346
347         o = e_widget_label_add(evas, _("Size:"));
348         wd->o_preview_size = o;
349         e_widget_sub_object_add(obj, o);
350         e_widget_table_object_append(wd->o_preview_table,
351                                      wd->o_preview_size,
352                                      0, 1, 1, 1, 1, 1, 1, 1);
353
354         o = e_widget_entry_add(evas, &(wd->preview_size_text), NULL, NULL, NULL);
355         e_widget_entry_readonly_set(o, 1);
356         wd->o_preview_size_entry = o;
357         e_widget_sub_object_add(obj, o);
358         e_widget_size_min_set(o, 100, -1);
359         e_widget_table_object_append(wd->o_preview_table,
360                                      wd->o_preview_size_entry,
361                                      1, 1, 1, 1, 1, 1, 1, 1);
362
363         o = e_widget_label_add(evas, _("Owner:"));
364         wd->o_preview_owner = o;
365         e_widget_sub_object_add(obj, o);
366         e_widget_table_object_append(wd->o_preview_table,
367                                      wd->o_preview_owner,
368                                      0, 2, 1, 1, 1, 1, 1, 1);
369
370         o = e_widget_entry_add(evas, &(wd->preview_owner_text), NULL, NULL, NULL);
371         e_widget_entry_readonly_set(o, 1);
372         wd->o_preview_owner_entry = o;
373         e_widget_sub_object_add(obj, o);
374         e_widget_size_min_set(o, 100, -1);
375         e_widget_table_object_append(wd->o_preview_table,
376                                      wd->o_preview_owner_entry, 
377                                      1, 2, 1, 1, 1, 1, 1, 1);
378
379         o = e_widget_label_add(evas, _("Permissions:"));
380         wd->o_preview_perms = o;
381         e_widget_sub_object_add(obj, o);
382         e_widget_table_object_append(wd->o_preview_table,
383                                      wd->o_preview_perms,
384                                      0, 3, 1, 1, 1, 1, 1, 1);
385         
386         o = e_widget_entry_add(evas, &(wd->preview_perms_text), NULL, NULL, NULL);
387         e_widget_entry_readonly_set(o, 1);
388         wd->o_preview_perms_entry = o;
389         e_widget_sub_object_add(obj, o);
390         e_widget_size_min_set(o, 100, -1);
391         e_widget_table_object_append(wd->o_preview_table,
392                                      wd->o_preview_perms_entry,
393                                      1, 3, 1, 1, 1, 1, 1, 1);
394
395         o = e_widget_label_add(evas, _("Modified:"));
396         wd->o_preview_time = o;
397         e_widget_sub_object_add(obj, o);
398         e_widget_table_object_append(wd->o_preview_table,
399                                      wd->o_preview_time,
400                                      0, 4, 1, 1, 1, 1, 1, 1);
401
402         o = e_widget_entry_add(evas, &(wd->preview_time_text), NULL, NULL, NULL);
403         e_widget_entry_readonly_set(o, 1);
404         wd->o_preview_time_entry = o;
405         e_widget_sub_object_add(obj, o); 
406         e_widget_size_min_set(o, 100, -1);
407         e_widget_table_object_append(wd->o_preview_table,
408                                      wd->o_preview_time_entry,
409                                      1, 4, 1, 1, 1, 1, 1, 1);
410      }
411
412    o = e_fm2_add(evas);
413    wd->o_favorites_fm = o;
414    e_widget_sub_object_add(obj, o);
415    memset(&fmc, 0, sizeof(E_Fm2_Config));
416    fmc.view.mode = E_FM2_VIEW_MODE_LIST;
417    fmc.view.open_dirs_in_place = 1;
418    fmc.view.selector = 1;
419    fmc.view.single_click = 1;
420    fmc.view.no_subdir_jump = 1;
421    fmc.view.no_subdir_drop = 1;
422    fmc.view.link_drop = 1;
423    fmc.icon.list.w = 24;
424    fmc.icon.list.h = 24;
425    fmc.icon.fixed.w = 1;
426    fmc.icon.fixed.h = 1;
427    fmc.icon.extension.show = 0;
428    fmc.icon.key_hint = NULL;
429    fmc.list.sort.no_case = 1;
430    fmc.list.sort.dirs.first = 0;
431    fmc.list.sort.dirs.last = 0;
432    fmc.selection.single = 1;
433    fmc.selection.windows_modifiers = 0;
434    e_fm2_config_set(o, &fmc);
435    evas_object_smart_callback_add(o, "changed", 
436                                   _e_wid_fsel_favorites_files_changed, wd);
437    evas_object_smart_callback_add(o, "selected", 
438                                   _e_wid_fsel_favorites_selected, wd);
439    e_fm2_path_set(o, "favorites", "/");
440    
441    o = e_widget_scrollframe_pan_add(evas, wd->o_favorites_fm,
442                                     e_fm2_pan_set, 
443                                     e_fm2_pan_get,
444                                     e_fm2_pan_max_get, 
445                                     e_fm2_pan_child_size_get);
446    evas_object_propagate_events_set(wd->o_favorites_fm, 0);
447    e_widget_scrollframe_focus_object_set(o, wd->o_favorites_fm);
448    
449    wd->o_favorites_frame = o;
450    e_widget_sub_object_add(obj, o);
451    e_widget_size_min_set(o, 128, 128);
452    e_widget_table_object_append(wd->o_table2, o, 0, 1, 1, 1, 1, 1, 0, 1);
453
454    o = e_fm2_add(evas);
455    wd->o_files_fm = o;
456    e_widget_sub_object_add(obj, o);
457    memset(&fmc, 0, sizeof(E_Fm2_Config));
458    fmc.view.mode = E_FM2_VIEW_MODE_LIST;
459    fmc.view.open_dirs_in_place = 1;
460    fmc.view.selector = 1;
461    fmc.view.single_click = 0;
462    fmc.view.no_subdir_jump = 0;
463    fmc.icon.list.w = 24;
464    fmc.icon.list.h = 24;
465    fmc.icon.fixed.w = 1;
466    fmc.icon.fixed.h = 1;
467    fmc.icon.extension.show = 1;
468    fmc.icon.key_hint = NULL;
469    fmc.list.sort.no_case = 1;
470    fmc.list.sort.dirs.first = 1;
471    fmc.list.sort.dirs.last = 0;
472    fmc.selection.single = 1;
473    fmc.selection.windows_modifiers = 0;
474    e_fm2_config_set(o, &fmc);
475    evas_object_smart_callback_add(o, "dir_changed", 
476                                   _e_wid_fsel_files_changed, wd);
477    evas_object_smart_callback_add(o, "selection_change", 
478                                   _e_wid_fsel_files_selection_change, wd);
479    evas_object_smart_callback_add(o, "selected", 
480                                   _e_wid_fsel_files_selected, wd);
481    e_fm2_path_set(o, dev, path);
482    
483    o = e_widget_scrollframe_pan_add(evas, wd->o_files_fm,
484                                     e_fm2_pan_set,
485                                     e_fm2_pan_get,
486                                     e_fm2_pan_max_get,
487                                     e_fm2_pan_child_size_get);
488    evas_object_propagate_events_set(wd->o_files_fm, 0);
489    e_widget_scrollframe_focus_object_set(o, wd->o_files_fm);
490    
491    wd->o_files_frame = o;
492    e_widget_sub_object_add(obj, o);
493    e_widget_size_min_set(o, 128, 128);
494    e_widget_table_object_append(wd->o_table2, o, 1, 1, 1, 1, 1, 1, 1, 1);
495
496    o = e_widget_entry_add(evas, &(wd->entry_text), NULL, NULL, NULL);
497    wd->o_entry = o;
498    e_widget_sub_object_add(obj, o);
499    if (selected) e_widget_entry_text_set(o, selected);
500    
501    if (preview)
502      {
503         e_widget_frametable_object_append(wd->o_preview_frame, 
504                                           wd->o_preview_preview_table,
505                                           0, 0, 1, 1, 0, 0, 1, 1);
506         e_widget_frametable_object_append(wd->o_preview_frame, 
507                                           wd->o_preview_table,
508                                           0, 1, 1, 1, 0, 0, 0, 0);
509         e_widget_table_object_append(wd->o_table2, 
510                                      wd->o_preview_frame,
511                                      2, 1, 1, 1, 0, 1, 0, 1);
512      }
513    
514    e_widget_table_object_append(wd->o_table, wd->o_table2,
515                                 0, 0, 1, 1, 1, 1, 1, 1);
516    e_widget_table_object_append(wd->o_table, wd->o_entry,
517                                 0, 1, 1, 1, 1, 0, 1, 0);
518
519    e_widget_size_min_get(wd->o_table, &mw, &mh);
520    e_widget_size_min_set(obj, mw, mh);
521   
522    evas_object_show(wd->o_favorites_add); 
523    evas_object_show(wd->o_up_button);
524    evas_object_show(wd->o_favorites_frame);
525    evas_object_show(wd->o_favorites_fm);
526    evas_object_show(wd->o_files_frame);
527    evas_object_show(wd->o_files_fm);
528    evas_object_show(wd->o_entry);
529    if (preview)
530      {
531         evas_object_show(wd->o_preview_preview);
532         evas_object_show(wd->o_preview_preview_table);
533         evas_object_show(wd->o_preview_extra);
534         evas_object_show(wd->o_preview_extra_entry);
535         evas_object_show(wd->o_preview_size);
536         evas_object_show(wd->o_preview_size_entry);
537         evas_object_show(wd->o_preview_owner);
538         evas_object_show(wd->o_preview_owner_entry);
539         evas_object_show(wd->o_preview_perms);
540         evas_object_show(wd->o_preview_perms_entry);
541         evas_object_show(wd->o_preview_time);
542         evas_object_show(wd->o_preview_time_entry);
543         evas_object_show(wd->o_preview_table);
544         evas_object_show(wd->o_preview_frame);
545       }
546    evas_object_show(wd->o_table2);
547    evas_object_show(wd->o_table);
548    return obj;
549 }
550
551 EAPI void
552 e_widget_fsel_path_get(Evas_Object *obj, const char **dev, const char **path)
553 {
554    E_Widget_Data *wd;
555
556    if (!obj) return;
557    wd = e_widget_data_get(obj);
558    e_fm2_path_get(wd->o_files_fm, dev, path);
559 }
560
561 EAPI const char *
562 e_widget_fsel_selection_path_get(Evas_Object *obj)
563 {
564    E_Widget_Data *wd;
565    const char *s, *dir;
566    char buf[PATH_MAX];
567    
568    if (!obj) return NULL;
569    wd = e_widget_data_get(obj);
570    E_FREE(wd->path);
571    s = e_widget_entry_text_get(wd->o_entry);
572    dir = e_fm2_real_path_get(wd->o_files_fm);
573    if (s)
574      {
575         snprintf(buf, sizeof(buf), "%s/%s", dir, s);
576         wd->path = strdup(buf);
577      }
578    else
579      {
580         wd->path = strdup(dir);
581      }
582    return wd->path;
583 }
584
585 EAPI void
586 e_widget_fsel_window_object_set(Evas_Object *obj, E_Object *eobj)
587 {
588    E_Widget_Data *wd;
589
590    if (!obj) return;
591    wd = e_widget_data_get(obj);
592    e_fm2_window_object_set(wd->o_favorites_fm, eobj);
593    e_fm2_window_object_set(wd->o_files_fm, eobj);
594 }
595
596 static void
597 _e_wid_fsel_preview_update(void *data, Evas_Object *obj, void *event_info __UNUSED__)
598 {
599    E_Widget_Data *wd;
600    Evas_Object *o;
601    char buf[256];
602    int iw = 0, ih = 0;
603    
604    wd = data;
605    o = evas_object_image_add(evas_object_evas_get(obj));
606    evas_object_image_file_set(o, wd->path, NULL);
607    evas_object_image_size_get(o, &iw, &ih);
608    evas_object_del(o);
609    if ((iw > 0) && (ih > 0))
610      {
611         snprintf(buf, sizeof(buf), "%ix%i", iw, ih);
612         e_widget_entry_text_set(wd->o_preview_extra_entry, buf);
613      }
614    e_widget_table_object_repack(wd->o_preview_preview_table,
615                                 wd->o_preview_preview,
616                                 0, 0, 1, 1, 0, 0, 1, 1);
617 }
618
619 static void
620 _e_wid_fsel_preview_file(E_Widget_Data *wd)
621 {
622    char *size, *owner, *perms, *mtime;
623    struct stat st;
624  
625    if (stat(wd->path, &st) < 0) return;
626
627    size =  _e_wid_file_size_get(st.st_size);
628    owner = _e_wid_file_user_get(st.st_uid);
629    perms = _e_wid_file_perms_get(st.st_mode, st.st_uid, st.st_gid);
630    mtime = _e_wid_file_time_get(st.st_mtime); 
631
632    e_widget_preview_thumb_set(wd->o_preview_preview, wd->path,
633                               "e/desktop/background", 128, 128);
634    
635    e_widget_table_object_repack(wd->o_preview_preview_table,
636                                 wd->o_preview_preview,
637                                 0, 0, 1, 1, 0, 0, 1, 1);
638    
639    e_widget_entry_text_set(wd->o_preview_extra_entry, "");
640    e_widget_entry_text_set(wd->o_preview_size_entry, size);
641    e_widget_entry_text_set(wd->o_preview_owner_entry, owner);
642    e_widget_entry_text_set(wd->o_preview_perms_entry, perms);
643    e_widget_entry_text_set(wd->o_preview_time_entry, mtime);
644
645    free(size);
646    free(owner);
647    free(perms);
648    free(mtime);
649 }
650
651 static char *
652 _e_wid_file_size_get(off_t st_size)
653 {
654    return e_util_size_string_get(st_size);
655 }
656
657 static char * 
658 _e_wid_file_user_get(uid_t st_uid)
659 {
660    char name[4096];
661    struct passwd *pwd;
662
663    if (getuid() == st_uid) 
664       snprintf(name, sizeof(name), _("You"));
665    else
666      {
667        pwd = getpwuid(st_uid);
668        if (pwd) 
669           snprintf(name, sizeof(name), "%s", pwd->pw_name);
670        else 
671           snprintf(name, sizeof(name), "%-8d", (int)st_uid);
672      }
673    return strdup(name);
674 }
675
676 static char *
677 _e_wid_file_perms_get(mode_t st_mode, uid_t st_uid, gid_t st_gid)
678 {
679    char perms[256];
680    int acc = 0;
681    int owner = 0;
682    int group = 0;
683    int user_read = 0;
684    int user_write = 0;
685    int group_read = 0;
686    int group_write = 0;
687    int other_read = 0;
688    int other_write = 0;
689
690    if (getuid() == st_uid) 
691       owner = 1;
692    if (getgid() == st_gid) 
693       group = 1;   
694
695    if ((S_IRUSR & st_mode) == S_IRUSR) 
696      user_read = 1;
697    if ((S_IWUSR & st_mode) == S_IWUSR) 
698      user_write = 1;
699
700    if ((S_IRGRP & st_mode) == S_IRGRP) 
701      group_read = 1;
702    if ((S_IWGRP & st_mode) == S_IWGRP) 
703      group_write = 1;
704    
705    if ((S_IROTH & st_mode) == S_IROTH)
706      other_read = 1;
707    if ((S_IWOTH & st_mode) == S_IWOTH)
708      other_write = 1;
709
710    if (owner)
711      {
712         if ((!user_read) && (!user_write)) 
713           snprintf(perms, sizeof(perms), _("Protected"));
714         else if ((user_read) && (!user_write)) 
715           snprintf(perms, sizeof(perms), _("Read Only"));
716         else if ((user_read) && (user_write)) 
717           acc = 1;
718      }
719    else if (group)
720      {
721         if ((!group_read) && (!group_write)) 
722           snprintf(perms, sizeof(perms), _("Forbidden"));
723         else if ((group_read) && (!group_write)) 
724           snprintf(perms, sizeof(perms), _("Read Only"));
725         else if ((group_read) && (group_write)) 
726           acc = 1;
727      }
728    else
729      {
730         if ((!other_read) && (!other_write)) 
731           snprintf(perms, sizeof(perms), _("Forbidden"));
732         else if ((other_read) && (!other_write)) 
733           snprintf(perms, sizeof(perms), _("Read Only"));
734         else if ((other_read) && (other_write)) 
735           acc = 1;
736      }
737    if (!acc)
738      return strdup(perms);
739    else 
740      return strdup(_("Read-Write"));
741 }
742
743 static char * 
744 _e_wid_file_time_get(time_t st_modtime)
745 {
746    return e_util_file_time_get(st_modtime);
747 }
748
749 static void
750 _e_wid_del_hook(Evas_Object *obj)
751 {
752    E_Widget_Data *wd;
753    
754    wd = e_widget_data_get(obj);
755    E_FREE(wd->entry_text);
756    E_FREE(wd->preview_extra_text);
757    E_FREE(wd->preview_size_text);
758    E_FREE(wd->preview_owner_text);
759    E_FREE(wd->preview_perms_text);
760    E_FREE(wd->preview_time_text);
761    E_FREE(wd->path);
762
763    free(wd);
764 }