1.[E_BORDER] Change code to hide the client window in _e_border_cb_window_hide().
[platform/core/uifw/e17.git] / src / bin / e_widget_filepreview.c
1 #include "e.h"
2 #include "e_fm_device.h"
3 #include <sys/statvfs.h>
4
5 typedef struct _E_Widget_Data E_Widget_Data;
6 struct _E_Widget_Data
7 {
8    Evas_Object *obj;
9    Evas_Object *o_preview_list;
10    Evas_Object *o_preview_preview_table;
11    Evas_Object *o_preview_properties_table;
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_preview_scrollframe;
25    Evas_Coord   preview_w, preview_h;
26    int w, h;
27    char        *preview_extra_text;
28    char        *preview_size_text;
29    char        *preview_owner_text;
30    char        *preview_perms_text;
31    char        *preview_time_text;
32    const char        *path;
33    const char        *mime;
34    Eina_Bool mime_icon : 1;
35    Eina_Bool is_dir : 1;
36    Eina_Bool prev_is_fm : 1;
37 };
38
39 static void  _e_wid_fprev_preview_update(void *data, Evas_Object *obj, void *event_info);
40 static void  _e_wid_fprev_preview_file(E_Widget_Data *wd);
41 static char *_e_wid_file_size_get(off_t st_size);
42 static char *_e_wid_file_user_get(uid_t st_uid);
43 static char *_e_wid_file_perms_get(mode_t st_mode, uid_t st_uid, gid_t gid);
44 static char *_e_wid_file_time_get(time_t st_modtime);
45 static void _e_wid_fprev_img_update(E_Widget_Data *wd, const char *path, const char *key);
46 static void _e_wid_del_hook(Evas_Object *obj);
47 static void _e_wid_fprev_preview_reset(E_Widget_Data *wd);
48 static void _e_wid_fprev_preview_fm(E_Widget_Data *wd);
49
50 static void
51 _e_wid_fprev_preview_update(void *data, Evas_Object *obj, void *event_info __UNUSED__)
52 {
53    E_Widget_Data *wd;
54    Evas_Object *o;
55    char buf[256];
56    int iw = 0, ih = 0;
57
58    wd = data;
59    o = evas_object_image_add(evas_object_evas_get(obj));
60    evas_object_image_file_set(o, wd->path, NULL);
61    evas_object_image_size_get(o, &iw, &ih);
62    evas_object_del(o);
63    if ((iw > 0) && (ih > 0))
64      {
65         e_widget_label_text_set(wd->o_preview_extra, _("Resolution:"));
66         snprintf(buf, sizeof(buf), _("%i×%i"), iw, ih);
67         e_widget_entry_text_set(wd->o_preview_extra_entry, buf);
68      }
69    else if (wd->mime)
70      {
71         if (wd->mime_icon)
72           {
73              e_widget_label_text_set(wd->o_preview_extra, _("Mime-type:"));
74              e_widget_entry_text_set(wd->o_preview_extra_entry, wd->mime);
75           }
76         else
77           {
78              const char *mime;
79              Efreet_Desktop *ed = NULL;
80              unsigned int size;
81                   char group[1024];
82              Eina_Bool edj;
83              
84              wd->mime_icon = EINA_TRUE;
85              size = wd->w;
86              mime = e_util_mime_icon_get(wd->mime, size);
87              if (mime)
88                {
89                   edj = eina_str_has_extension(mime, "edj");
90                   if (edj)
91                     snprintf(group, sizeof(group), "e/icons/fileman/mime/%s", wd->mime);
92                   _e_wid_fprev_img_update(wd, mime, edj ? group : NULL);
93                   return;
94                }
95              if (eina_str_has_extension(wd->path, "desktop"))
96                {
97                   ed = efreet_desktop_new(wd->path);
98                   if (ed)
99                     mime = efreet_icon_path_find(e_config->icon_theme, ed->icon, size);
100                }
101              if (!mime)
102                mime = efreet_icon_path_find(e_config->icon_theme, "unknown", size);
103              if (!mime)
104                mime = efreet_icon_path_find(e_config->icon_theme, "text/plain", size);
105              _e_wid_fprev_img_update(wd, mime, NULL);
106              if (ed) efreet_desktop_free(ed);
107           }
108      }
109    e_widget_table_object_repack(wd->o_preview_preview_table,
110                                 wd->o_preview_preview,
111                                 0, 0, 1, 1, 0, 0, 1, 1);
112 }
113
114 static void
115 _e_wid_fprev_img_update(E_Widget_Data *wd, const char *path, const char *key)
116 {
117    if (!path) return;
118    if (wd->is_dir) return;
119    e_widget_preview_thumb_set(wd->o_preview_preview, path, key, wd->w, wd->h);
120 }
121
122 static void
123 _e_wid_fprev_clear_widgets(E_Widget_Data *wd)
124 {
125 #define CLRWID(xx) \
126    do { if (wd->xx) { evas_object_del(wd->xx); wd->xx = NULL; } } while (0)
127    
128    CLRWID(o_preview_preview_table);
129    CLRWID(o_preview_properties_table);
130    CLRWID(o_preview_scroll);
131    CLRWID(o_preview_extra);
132    CLRWID(o_preview_extra_entry);
133    CLRWID(o_preview_size);
134    CLRWID(o_preview_size_entry);
135    CLRWID(o_preview_owner);
136    CLRWID(o_preview_owner_entry);
137    CLRWID(o_preview_perms);
138    CLRWID(o_preview_perms_entry);
139    CLRWID(o_preview_time);
140    CLRWID(o_preview_time_entry);
141    CLRWID(o_preview_preview);
142    CLRWID(o_preview_scrollframe);
143 }
144
145 static void
146 _e_wid_fprev_preview_fs_widgets(E_Widget_Data *wd)
147 {
148    Evas *evas = evas_object_evas_get(wd->obj);
149    Evas_Object *o;
150    int mw, mh, y = 0;
151    
152    _e_wid_fprev_clear_widgets(wd);
153
154    o = e_widget_table_add(evas, 0);
155    e_widget_disabled_set(o, 1);
156    wd->o_preview_properties_table = o;
157
158 #define WIDROW(lab, labob, entob, entw) \
159    do { \
160       o = e_widget_label_add(evas, lab); \
161       e_widget_disabled_set(o, 1); \
162       wd->labob = o; \
163       e_widget_table_object_append(wd->o_preview_properties_table, \
164                                    wd->labob, \
165                                    0, y, 1, 1, 1, 1, 1, 1); \
166       o = e_widget_entry_add(evas, &(wd->preview_extra_text), NULL, NULL, NULL); \
167       e_widget_entry_readonly_set(o, 1); \
168       e_widget_disabled_set(o, 1); \
169       wd->entob = o; \
170       e_widget_size_min_set(o, entw, -1); \
171       e_widget_table_object_append(wd->o_preview_properties_table, \
172                                    wd->entob, \
173                                    1, y, 1, 1, 1, 1, 1, 1); \
174       y++; \
175    } while (0)
176    
177    WIDROW(_("Used:"), o_preview_extra, o_preview_extra_entry, 100);
178    WIDROW(_("Size:"), o_preview_size, o_preview_size_entry, 100);
179    WIDROW(_("Reserved:"), o_preview_owner, o_preview_owner_entry, 100);
180    WIDROW(_("Mount status:"), o_preview_perms, o_preview_perms_entry, 100);
181    WIDROW(_("Type:"), o_preview_time, o_preview_time_entry, 100);
182
183    e_widget_list_object_append(wd->o_preview_list,
184                                wd->o_preview_properties_table,
185                                1, 1, 0.5);
186    
187    e_widget_size_min_get(wd->o_preview_list, &mw, &mh);
188    e_widget_size_min_set(wd->obj, mw, mh);
189    evas_object_show(wd->o_preview_preview_table);
190    evas_object_show(wd->o_preview_extra);
191    evas_object_show(wd->o_preview_extra_entry);
192    evas_object_show(wd->o_preview_size);
193    evas_object_show(wd->o_preview_size_entry);
194    evas_object_show(wd->o_preview_owner);
195    evas_object_show(wd->o_preview_owner_entry);
196    evas_object_show(wd->o_preview_perms);
197    evas_object_show(wd->o_preview_perms_entry);
198    evas_object_show(wd->o_preview_time);
199    evas_object_show(wd->o_preview_time_entry);
200    evas_object_show(wd->o_preview_properties_table);
201 }
202
203 static void
204 _e_wid_fprev_preview_file_widgets(E_Widget_Data *wd)
205 {
206    Evas *evas = evas_object_evas_get(wd->obj);
207    Evas_Object *o;
208    int mw, mh, y = 0;
209    
210    _e_wid_fprev_clear_widgets(wd);
211
212    o = e_widget_table_add(evas, 0);
213    e_widget_disabled_set(o, 1);
214    wd->o_preview_preview_table = o;
215    e_widget_size_min_set(o, 32, 32);
216
217    e_widget_list_object_append(wd->o_preview_list,
218                                wd->o_preview_preview_table,
219                                0, 1, 0.5);
220
221    o = e_widget_table_add(evas, 0);
222    e_widget_disabled_set(o, 1);
223    wd->o_preview_properties_table = o;
224
225    WIDROW(_("Resolution:"), o_preview_extra, o_preview_extra_entry, 100);
226    WIDROW(_("Size:"), o_preview_size, o_preview_size_entry, 100);
227    WIDROW(_("Owner:"), o_preview_owner, o_preview_owner_entry, 100);
228    WIDROW(_("Permissions:"), o_preview_perms, o_preview_perms_entry, 100);
229    WIDROW(_("Modified:"), o_preview_time, o_preview_time_entry, 100);
230
231    e_widget_list_object_append(wd->o_preview_list,
232                                wd->o_preview_properties_table,
233                                1, 1, 0.5);
234
235    e_widget_size_min_get(wd->o_preview_list, &mw, &mh);
236    e_widget_size_min_set(wd->obj, mw, mh);
237    evas_object_show(wd->o_preview_preview_table);
238    evas_object_show(wd->o_preview_extra);
239    evas_object_show(wd->o_preview_extra_entry);
240    evas_object_show(wd->o_preview_size);
241    evas_object_show(wd->o_preview_size_entry);
242    evas_object_show(wd->o_preview_owner);
243    evas_object_show(wd->o_preview_owner_entry);
244    evas_object_show(wd->o_preview_perms);
245    evas_object_show(wd->o_preview_perms_entry);
246    evas_object_show(wd->o_preview_time);
247    evas_object_show(wd->o_preview_time_entry);
248    evas_object_show(wd->o_preview_properties_table);
249 }
250
251 static void
252 _e_wid_fprev_preview_file(E_Widget_Data *wd)
253 {
254    char *size, *owner, *perms, *mtime;
255    struct stat st;
256    int mw, mh;
257    Eina_Bool is_fs = EINA_FALSE;
258
259    if (stat(wd->path, &st) < 0) return;
260    // if its a desktop file treat is spcially
261    if (((wd->mime) &&(!strcasecmp(wd->mime, "application/x-desktop"))) ||
262        (eina_str_has_extension(wd->path, "desktop")))
263      {
264         Efreet_Desktop *desktop;
265         const char *type, *file;
266         
267         // load it and if its a specual removable or mount point
268         // desktop file for e, then we want to do something special
269         desktop = efreet_desktop_new(wd->path);
270         if ((desktop) && (desktop->url) &&
271             (desktop->type == EFREET_DESKTOP_TYPE_LINK) &&
272             (desktop->x) &&
273             ((type = eina_hash_find(desktop->x, "X-Enlightenment-Type"))) &&
274             ((!strcmp(type, "Mount")) || (!strcmp(type, "Removable"))))
275           {
276              // find the "mountpoint" or "link" - it's stringshared
277              if ((file = e_fm2_desktop_url_eval(desktop->url)))
278                {
279                   struct statvfs stfs;
280                   Eina_Bool ok = EINA_FALSE;
281                   
282                   memset(&stfs, 0, sizeof(stfs));
283                   if (statvfs(file, &stfs) == 0) ok = EINA_TRUE;
284                   else
285                     {
286                        E_Volume *v;
287                        
288                        v = e_fm2_device_volume_find(file);
289                        if (v)
290                          {
291                             if (statvfs(v->mount_point, &stfs) == 0)
292                               {
293                                  ok = EINA_TRUE;
294                                  eina_stringshare_del(file);
295                                  file = eina_stringshare_add(v->mount_point);
296                               }
297                          }
298                     }
299                   
300                   if (ok)
301                     {
302                        unsigned long fragsz;
303                        unsigned long long blknum, blkused, blkres;
304                        double mbsize, mbused, mbres;
305                        Eina_Bool rdonly = EINA_FALSE;
306                        char buf[PATH_MAX], mpoint[4096], fstype[4096];
307                        FILE *f;
308                        
309                        fragsz = stfs.f_frsize;
310                        blknum  = stfs.f_blocks;
311                        blkused = stfs.f_blocks - stfs.f_bfree;
312                        blkres = stfs.f_bfree - stfs.f_bavail;
313                        
314                        fstype[0] = 0;
315                        mpoint[0] = 0;
316                        f = fopen("/etc/mtab", "r");
317                        if (f)
318                          {
319                             while (fgets(buf, sizeof(buf), f))
320                               {
321                                  if (sscanf(buf, "%*s %4000s %4000s %*s",
322                                             mpoint, fstype) == 2)
323                                    {
324                                       if (!strcmp(mpoint, file)) break;
325                                    }
326                                  fstype[0] = 0;
327                                  mpoint[0] = 0;
328                               }
329                             fclose(f);
330                          }
331                        if (blknum > blkres)
332                          {
333                             is_fs = EINA_TRUE;
334                             
335                             mbres = ((double)blkres * (double)fragsz) / 
336                               (double)(1024*1024);
337                             mbsize = ((double)blknum * (double)fragsz) /
338                               (double)(1024*1024);
339                             mbused = (mbsize * (double)blkused) / 
340                               (double)blknum;
341 #ifdef ST_RDONLY                                 
342                             if (stfs.f_flag & ST_RDONLY) rdonly = EINA_TRUE;
343 #endif                                 
344                             _e_wid_fprev_preview_fs_widgets(wd);
345                             
346                             //-------------------
347                             if (mbused > 1024.0)
348                               snprintf(buf, sizeof(buf), "%1.2f Gb", mbused / 1024.0);
349                             else
350                               snprintf(buf, sizeof(buf), "%1.2f Mb", mbused);
351                             e_widget_entry_text_set(wd->o_preview_extra_entry, buf);
352                             //-------------------
353                             if (mbsize > 1024.0)
354                               snprintf(buf, sizeof(buf), "%1.2f Gb", mbsize / 1024.0);
355                             else
356                               snprintf(buf, sizeof(buf), "%1.2f Mb", mbsize);
357                             e_widget_entry_text_set(wd->o_preview_size_entry, buf);
358                             //-------------------
359                             if (mbres > 1024.0)
360                               snprintf(buf, sizeof(buf), "%1.2f Gb", mbres / 1024.0);
361                             else
362                               snprintf(buf, sizeof(buf), "%1.2f Mb", mbres);
363                             e_widget_entry_text_set(wd->o_preview_owner_entry, buf);
364                             //-------------------
365                             if (mpoint[0])
366                               {
367                                  if (rdonly) 
368                                    e_widget_entry_text_set(wd->o_preview_perms_entry, _("Read Only"));
369                                  else
370                                    e_widget_entry_text_set(wd->o_preview_perms_entry, _("Read / Write"));
371                               }
372                             else
373                               e_widget_entry_text_set(wd->o_preview_perms_entry, _("Unmounted"));
374                             //-------------------
375                             e_widget_entry_text_set(wd->o_preview_time_entry, fstype);
376                          }
377                     }
378                   if (!is_fs)
379                     {
380                        _e_wid_fprev_preview_fs_widgets(wd);
381                        e_widget_entry_text_set(wd->o_preview_extra_entry, _("Unknown"));
382                        e_widget_entry_text_set(wd->o_preview_size_entry, _("Unknown"));
383                        e_widget_entry_text_set(wd->o_preview_owner_entry, _("Unknown"));
384                        e_widget_entry_text_set(wd->o_preview_perms_entry, _("Unmounted"));
385                        e_widget_entry_text_set(wd->o_preview_time_entry, _("Unknown"));
386                        is_fs = EINA_TRUE;
387                     }
388                   eina_stringshare_del(file);
389                }
390           }
391         if (desktop) efreet_desktop_free(desktop);
392      }
393    if (is_fs) return;
394    _e_wid_fprev_preview_file_widgets(wd);
395    
396    wd->mime_icon = EINA_FALSE;
397    size = _e_wid_file_size_get(st.st_size);
398    owner = _e_wid_file_user_get(st.st_uid);
399    perms = _e_wid_file_perms_get(st.st_mode, st.st_uid, st.st_gid);
400    mtime = _e_wid_file_time_get(st.st_mtime);
401    wd->is_dir = S_ISDIR(st.st_mode);
402
403    _e_wid_fprev_preview_reset(wd);
404    _e_wid_fprev_preview_fm(wd);
405    _e_wid_fprev_img_update(wd, wd->path, NULL);
406
407    e_widget_size_min_get(wd->o_preview_list, &mw, &mh);
408    e_widget_size_min_set(wd->obj, mw, mh);
409    e_widget_entry_text_set(wd->o_preview_extra_entry, "");
410    e_widget_entry_text_set(wd->o_preview_size_entry, size);
411    e_widget_entry_text_set(wd->o_preview_owner_entry, owner);
412    e_widget_entry_text_set(wd->o_preview_perms_entry, perms);
413    e_widget_entry_text_set(wd->o_preview_time_entry, mtime);
414
415    free(size);
416    free(owner);
417    free(perms);
418    free(mtime);
419 }
420
421
422 static char *
423 _e_wid_file_size_get(off_t st_size)
424 {
425    return e_util_size_string_get(st_size);
426 }
427
428 static char *
429 _e_wid_file_user_get(uid_t st_uid)
430 {
431    char name[4096];
432    struct passwd *pwd;
433
434    if (getuid() == st_uid)
435      snprintf(name, sizeof(name), _("You"));
436    else
437      {
438         pwd = getpwuid(st_uid);
439         if (pwd)
440           snprintf(name, sizeof(name), "%s", pwd->pw_name);
441         else
442           snprintf(name, sizeof(name), "%-8d", (int)st_uid);
443      }
444    return strdup(name);
445 }
446
447 static char *
448 _e_wid_file_perms_get(mode_t st_mode, uid_t st_uid, gid_t st_gid)
449 {
450    char perms[256];
451    int acc = 0;
452    int owner = 0;
453    int group = 0;
454    int user_read = 0;
455    int user_write = 0;
456    int group_read = 0;
457    int group_write = 0;
458    int other_read = 0;
459    int other_write = 0;
460
461    if (getuid() == st_uid)
462      owner = 1;
463    if (getgid() == st_gid)
464      group = 1;
465
466    if ((S_IRUSR & st_mode) == S_IRUSR)
467      user_read = 1;
468    if ((S_IWUSR & st_mode) == S_IWUSR)
469      user_write = 1;
470
471    if ((S_IRGRP & st_mode) == S_IRGRP)
472      group_read = 1;
473    if ((S_IWGRP & st_mode) == S_IWGRP)
474      group_write = 1;
475
476    if ((S_IROTH & st_mode) == S_IROTH)
477      other_read = 1;
478    if ((S_IWOTH & st_mode) == S_IWOTH)
479      other_write = 1;
480
481    if (owner)
482      {
483         if ((!user_read) && (!user_write))
484           snprintf(perms, sizeof(perms), _("Protected"));
485         else if ((user_read) && (!user_write))
486           snprintf(perms, sizeof(perms), _("Read Only"));
487         else if ((user_read) && (user_write))
488           acc = 1;
489      }
490    else if (group)
491      {
492         if ((!group_read) && (!group_write))
493           snprintf(perms, sizeof(perms), _("Forbidden"));
494         else if ((group_read) && (!group_write))
495           snprintf(perms, sizeof(perms), _("Read Only"));
496         else if ((group_read) && (group_write))
497           acc = 1;
498      }
499    else
500      {
501         if ((!other_read) && (!other_write))
502           snprintf(perms, sizeof(perms), _("Forbidden"));
503         else if ((other_read) && (!other_write))
504           snprintf(perms, sizeof(perms), _("Read Only"));
505         else if ((other_read) && (other_write))
506           acc = 1;
507      }
508    if (!acc)
509      return strdup(perms);
510    else
511      return strdup(_("Read-Write"));
512 }
513
514 static char *
515 _e_wid_file_time_get(time_t st_modtime)
516 {
517    return e_util_file_time_get(st_modtime);
518 }
519
520 static void
521 _e_wid_del_hook(Evas_Object *obj)
522 {
523    E_Widget_Data *wd;
524
525    wd = e_widget_data_get(obj);
526    E_FREE(wd->preview_extra_text);
527    E_FREE(wd->preview_size_text);
528    E_FREE(wd->preview_owner_text);
529    E_FREE(wd->preview_perms_text);
530    E_FREE(wd->preview_time_text);
531    eina_stringshare_del(wd->path);
532    eina_stringshare_del(wd->mime);
533
534    free(wd);
535 }
536
537 static void
538 _e_wid_fprev_preview_reset(E_Widget_Data *wd)
539 {
540    Evas_Object *o;
541    if (wd->is_dir) return;
542    if (wd->o_preview_scrollframe && wd->prev_is_fm)
543      {
544         evas_object_del(wd->o_preview_scrollframe);
545         wd->o_preview_scrollframe = wd->o_preview_preview = NULL;
546      }
547    if (wd->o_preview_preview) return;
548    o = e_widget_preview_add(evas_object_evas_get(wd->obj), wd->w, wd->h);
549    wd->prev_is_fm = EINA_FALSE;
550    e_widget_disabled_set(o, 1);
551    wd->o_preview_preview = o;
552    evas_object_smart_callback_add(o, "preview_update",
553                                   _e_wid_fprev_preview_update, wd);
554    e_widget_table_object_append(wd->o_preview_preview_table,
555                                 wd->o_preview_preview,
556                                 0, 0, 1, 1, 0, 0, 1, 1);
557    e_widget_list_object_repack(wd->o_preview_list,
558                                wd->o_preview_preview_table,
559                                0, 1, 0.5);
560    e_widget_list_object_repack(wd->o_preview_list,
561                                wd->o_preview_properties_table,
562                                1, 1, 0.5);
563 }
564
565
566 static void
567 _e_wid_cb_selected(void *data, Evas_Object *obj, void *event __UNUSED__)
568 {
569    evas_object_smart_callback_call(data, "selected", obj);
570 }
571
572 static void
573 _e_wid_cb_selection_change(void *data, Evas_Object *obj, void *event __UNUSED__)
574 {
575    evas_object_smart_callback_call(data, "selection_change", obj);
576 }
577
578 static void
579 _e_wid_cb_dir_changed(void *data, Evas_Object *obj, void *event __UNUSED__)
580 {
581    evas_object_smart_callback_call(data, "dir_changed", obj);
582 }
583
584 static void
585 _e_wid_cb_changed(void *data, Evas_Object *obj, void *event __UNUSED__)
586 {
587    evas_object_smart_callback_call(data, "changed", obj);
588 }
589
590 static void
591 _e_wid_cb_file_deleted(void *data, Evas_Object *obj, void *event __UNUSED__)
592 {
593    evas_object_smart_callback_call(data, "files_deleted", obj);
594 }
595
596 static void
597 _e_wid_fprev_preview_fm(E_Widget_Data *wd)
598 {
599    E_Fm2_Config fmc;
600    Evas_Object *o;
601    int mw;
602
603    if (!wd->is_dir) return;
604    if (!wd->path) return;
605    if (wd->o_preview_preview && (!wd->prev_is_fm))
606      {
607         evas_object_del(wd->o_preview_preview);
608         wd->o_preview_preview = NULL;
609      }
610    if (!wd->o_preview_preview)
611      {
612         Evas *evas;
613
614         evas = evas_object_evas_get(wd->obj);
615         o = e_fm2_add(evas);
616         wd->o_preview_preview = o;
617         wd->prev_is_fm = EINA_TRUE;
618         memset(&fmc, 0, sizeof(E_Fm2_Config));
619         fmc.view.mode = E_FM2_VIEW_MODE_LIST;
620         fmc.view.open_dirs_in_place = 1;
621         fmc.view.selector = 1;
622         fmc.view.single_click = 0;
623         fmc.view.no_subdir_jump = 1;
624         fmc.view.no_subdir_drop = 1;
625         fmc.view.link_drop = 1;
626         fmc.icon.list.w = 24;
627         fmc.icon.list.h = 24;
628         fmc.icon.fixed.w = 1;
629         fmc.icon.fixed.h = 1;
630         fmc.list.sort.no_case = 1;
631         fmc.view.no_click_rename = 1;
632         fmc.selection.single = 1;
633         e_fm2_config_set(o, &fmc);
634         e_fm2_icon_menu_flags_set(o, E_FM2_MENU_NO_VIEW_MENU);
635         evas_object_smart_callback_add(o, "dir_changed",
636                                        _e_wid_cb_dir_changed, wd->obj);
637         evas_object_smart_callback_add(o, "selection_change",
638                                        _e_wid_cb_selection_change, wd->obj);
639         evas_object_smart_callback_add(o, "changed",
640                                        _e_wid_cb_changed, wd->obj);
641         evas_object_smart_callback_add(o, "files_deleted",
642                                        _e_wid_cb_file_deleted, wd->obj);
643         evas_object_smart_callback_add(o, "selected",
644                                        _e_wid_cb_selected, wd->obj);
645         o = e_widget_scrollframe_pan_add(evas, wd->o_preview_preview,
646                                          e_fm2_pan_set,
647                                          e_fm2_pan_get,
648                                          e_fm2_pan_max_get,
649                                          e_fm2_pan_child_size_get);
650         wd->o_preview_scrollframe = o;
651         e_widget_size_min_get(wd->o_preview_list, &mw, NULL);
652 //        e_widget_size_min_set(o, MAX(wd->w, mw), wd->h);
653         e_widget_size_min_set(o, 0, wd->h);
654         evas_object_propagate_events_set(wd->o_preview_preview, 0);
655         e_widget_scrollframe_focus_object_set(o, wd->o_preview_preview);
656         e_widget_table_object_append(wd->o_preview_preview_table,
657                                      o, 0, 0, 1, 1, 1, 1, 1, 1);
658         e_widget_list_object_repack(wd->o_preview_list,
659                                     wd->o_preview_preview_table,
660                                     1, 1, 0.5);
661         e_widget_list_object_repack(wd->o_preview_list,
662                                     wd->o_preview_properties_table,
663                                     1, 1, 0.5);
664      }
665    e_fm2_path_set(wd->o_preview_preview, "/", wd->path);
666 }
667
668 EAPI Evas_Object *
669 e_widget_filepreview_add(Evas *evas, int w, int h, int horiz)
670 {
671    Evas_Object *obj, *o;
672    int mw, mh;
673    E_Widget_Data *wd;
674
675    obj = e_widget_add(evas);
676
677    e_widget_del_hook_set(obj, _e_wid_del_hook);
678    wd = E_NEW(E_Widget_Data, 1);
679    e_widget_data_set(obj, wd);
680    wd->obj = obj;
681
682    wd->w = w, wd->h = h;
683
684    o = e_widget_list_add(evas, 0, horiz);
685    e_widget_disabled_set(o, 1);
686    wd->o_preview_list = o;
687    e_widget_resize_object_set(obj, o);
688    e_widget_sub_object_add(obj, o);
689
690    e_widget_size_min_get(wd->o_preview_list, &mw, &mh);
691    e_widget_size_min_set(obj, mw, mh);
692    evas_object_show(wd->o_preview_preview_table);
693    evas_object_show(wd->o_preview_extra);
694    evas_object_show(wd->o_preview_extra_entry);
695    evas_object_show(wd->o_preview_size);
696    evas_object_show(wd->o_preview_size_entry);
697    evas_object_show(wd->o_preview_owner);
698    evas_object_show(wd->o_preview_owner_entry);
699    evas_object_show(wd->o_preview_perms);
700    evas_object_show(wd->o_preview_perms_entry);
701    evas_object_show(wd->o_preview_time);
702    evas_object_show(wd->o_preview_time_entry);
703    evas_object_show(wd->o_preview_properties_table);
704    evas_object_show(wd->o_preview_list);
705    e_widget_disabled_set(obj, 1);
706    return obj;
707 }
708
709 EAPI void
710 e_widget_filepreview_path_set(Evas_Object *obj, const char *path, const char *mime)
711 {
712    E_Widget_Data *wd;
713
714    if (!obj) return;
715    wd = e_widget_data_get(obj);
716    if (!wd) return;
717    eina_stringshare_replace(&wd->path, path);
718    eina_stringshare_replace(&wd->mime, mime);
719    _e_wid_fprev_preview_file(wd);
720 }
721
722 EAPI void
723 e_widget_filepreview_filemode_force(Evas_Object *obj)
724 {
725    E_Widget_Data *wd;
726
727    if (!obj) return;
728    wd = e_widget_data_get(obj);
729    if (!wd) return;
730    _e_wid_fprev_preview_file_widgets(wd);
731 }