font previews in efm - in thumbnails and in efm preview
authorCarsten Haitzler (Rasterman) <raster@rasterman.com>
Tue, 2 Jul 2013 05:01:49 +0000 (14:01 +0900)
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>
Tue, 2 Jul 2013 05:24:16 +0000 (14:24 +0900)
config/mobile/e.src
config/standard/e.src
src/bin/e_thumb_main.c
src/bin/e_widget_filepreview.c

index a5756ea..ff03024 100644 (file)
@@ -634,6 +634,58 @@ group "E_Config" struct {
             value "icon" string: "THUMB";
         }
         group "E_Config_Mime_Icon" struct {
+            value "mime" string: "application/x-font";
+            value "icon" string: "THUMB";
+        }
+        group "E_Config_Mime_Icon" struct {
+            value "mime" string: "application/x-font-ttf";
+            value "icon" string: "THUMB";
+        }
+        group "E_Config_Mime_Icon" struct {
+            value "mime" string: "application/x-font-type1";
+            value "icon" string: "THUMB";
+        }
+        group "E_Config_Mime_Icon" struct {
+            value "mime" string: "application/x-font-afm";
+            value "icon" string: "THUMB";
+        }
+        group "E_Config_Mime_Icon" struct {
+            value "mime" string: "application/x-font-snf";
+            value "icon" string: "THUMB";
+        }
+        group "E_Config_Mime_Icon" struct {
+            value "mime" string: "application/x-font-otf";
+            value "icon" string: "THUMB";
+        }
+        group "E_Config_Mime_Icon" struct {
+            value "mime" string: "application/vnd.font-fontforge-sfd";
+            value "icon" string: "THUMB";
+        }
+        group "E_Config_Mime_Icon" struct {
+            value "mime" string: "application/x-font-linux-psf";
+            value "icon" string: "THUMB";
+        }
+        group "E_Config_Mime_Icon" struct {
+            value "mime" string: "application/x-font-ttx";
+            value "icon" string: "THUMB";
+        }
+        group "E_Config_Mime_Icon" struct {
+            value "mime" string: "application/x-font-speedo";
+            value "icon" string: "THUMB";
+        }
+        group "E_Config_Mime_Icon" struct {
+            value "mime" string: "application/x-font-pcf";
+            value "icon" string: "THUMB";
+        }
+        group "E_Config_Mime_Icon" struct {
+            value "mime" string: "application/x-font-bdf";
+            value "icon" string: "THUMB";
+        }
+        group "E_Config_Mime_Icon" struct {
+            value "mime" string: "application/x-cisco-vpn-settings";
+            value "icon" string: "THUMB";
+        }
+        group "E_Config_Mime_Icon" struct {
             value "mime" string: "video/3gpp";
             value "icon" string: "THUMB";
         }
index 4cbb467..8f67373 100644 (file)
@@ -362,6 +362,58 @@ group "E_Config" struct {
             value "icon" string: "THUMB";
         }
         group "E_Config_Mime_Icon" struct {
+            value "mime" string: "application/x-font";
+            value "icon" string: "THUMB";
+        }
+        group "E_Config_Mime_Icon" struct {
+            value "mime" string: "application/x-font-ttf";
+            value "icon" string: "THUMB";
+        }
+        group "E_Config_Mime_Icon" struct {
+            value "mime" string: "application/x-font-type1";
+            value "icon" string: "THUMB";
+        }
+        group "E_Config_Mime_Icon" struct {
+            value "mime" string: "application/x-font-afm";
+            value "icon" string: "THUMB";
+        }
+        group "E_Config_Mime_Icon" struct {
+            value "mime" string: "application/x-font-snf";
+            value "icon" string: "THUMB";
+        }
+        group "E_Config_Mime_Icon" struct {
+            value "mime" string: "application/x-font-otf";
+            value "icon" string: "THUMB";
+        }
+        group "E_Config_Mime_Icon" struct {
+            value "mime" string: "application/vnd.font-fontforge-sfd";
+            value "icon" string: "THUMB";
+        }
+        group "E_Config_Mime_Icon" struct {
+            value "mime" string: "application/x-font-linux-psf";
+            value "icon" string: "THUMB";
+        }
+        group "E_Config_Mime_Icon" struct {
+            value "mime" string: "application/x-font-ttx";
+            value "icon" string: "THUMB";
+        }
+        group "E_Config_Mime_Icon" struct {
+            value "mime" string: "application/x-font-speedo";
+            value "icon" string: "THUMB";
+        }
+        group "E_Config_Mime_Icon" struct {
+            value "mime" string: "application/x-font-pcf";
+            value "icon" string: "THUMB";
+        }
+        group "E_Config_Mime_Icon" struct {
+            value "mime" string: "application/x-font-bdf";
+            value "icon" string: "THUMB";
+        }
+        group "E_Config_Mime_Icon" struct {
+            value "mime" string: "application/x-cisco-vpn-settings";
+            value "icon" string: "THUMB";
+        }
+        group "E_Config_Mime_Icon" struct {
             value "mime" string: "video/3gpp";
             value "icon" string: "THUMB";
         }
index 1851533..dd26056 100644 (file)
@@ -309,6 +309,12 @@ _e_thumb_generate(E_Thumb *eth)
    while (mtime_thumb <= mtime_orig)
      {
         unsigned int *data1;
+        Eina_Bool sortkey;
+        Evas_Object *im2, *bg;
+        
+        im = NULL;
+        im2 = NULL;
+        bg = NULL;
 
         ecore_file_mkdir(dbuf);
 
@@ -323,6 +329,8 @@ _e_thumb_generate(E_Thumb *eth)
         alpha = 1;
         ext = strrchr(eth->file, '.');
 
+        sortkey = EINA_FALSE;
+        
         if ((ext) && (eth->key) &&
             ((!strcasecmp(ext, ".edj")) ||
              (!strcasecmp(ext, ".eap"))))
@@ -347,6 +355,64 @@ _e_thumb_generate(E_Thumb *eth)
                   evas_object_resize(edje, ww * 4, hh * 4);
                   evas_object_show(edje);
                }
+             evas_object_move(im, 0, 0);
+             evas_object_resize(im, ww, hh);
+             sortkey = EINA_TRUE;
+          }
+        else if ((ext) &&
+                 ((!strcasecmp(ext, ".ttf")) ||
+                  (!strcasecmp(ext, ".pcf")) ||
+                  (!strcasecmp(ext, ".bdf")) ||
+                  (!strcasecmp(ext, ".ttx")) ||
+                  (!strcasecmp(ext, ".pfa")) ||
+                  (!strcasecmp(ext, ".pfb")) ||
+                  (!strcasecmp(ext, ".afm")) ||
+                  (!strcasecmp(ext, ".sfd")) ||
+                  (!strcasecmp(ext, ".snf")) ||
+                  (!strcasecmp(ext, ".otf")) ||
+                  (!strcasecmp(ext, ".psf")) ||
+                  (!strcasecmp(ext, ".ttc")) ||
+                  (!strcasecmp(ext, ".ttx")) ||
+                  (!strcasecmp(ext, ".gsf")) ||
+                  (!strcasecmp(ext, ".spd"))
+                 ))
+          {
+             Evas_Coord tx = 0, ty = 0, tw = 0, th = 0;
+             ww = eth->w;
+             hh = eth->h;
+             alpha = 0;
+
+             bg = evas_object_rectangle_add(evas);
+             evas_object_color_set(bg, 96, 96, 96, 255);
+             evas_object_move(bg, 0, 0);
+             evas_object_resize(bg, ww, hh);
+             evas_object_show(bg);
+             
+             im = evas_object_text_add(evas);
+             evas_object_text_font_set(im, eth->file, hh / 4);
+             evas_object_color_set(im, 192, 192, 192, 255);
+             evas_object_text_ellipsis_set(im, 0.0);
+             evas_object_text_text_set(im, "ABCabc");
+             evas_object_geometry_get(im, NULL, NULL, &tw, &th);
+             if (tw > ww) tw = ww;
+             tx = 0 + ((ww - tw) / 2);
+             ty = 0 + (((hh / 2) - th) / 2);
+             evas_object_move(im, tx, ty);
+             evas_object_resize(im, tw, th);
+             evas_object_show(im);
+             
+             im2 = evas_object_text_add(evas);
+             evas_object_text_font_set(im2, eth->file, hh / 4);
+             evas_object_color_set(im2, 255, 255, 255, 255);
+             evas_object_text_ellipsis_set(im2, 0.0);
+             evas_object_text_text_set(im2, "123!@?");
+             evas_object_geometry_get(im2, NULL, NULL, &tw, &th);
+             if (tw > ww) tw = ww;
+             tx = 0 + ((ww - tw) / 2);
+             ty = (hh / 2) + (((hh / 2) - th) / 2);
+             evas_object_move(im2, tx, ty);
+             evas_object_resize(im2, tw, th);
+             evas_object_show(im2);
           }
         else if (evas_object_image_extension_can_load_get(ext))
           {
@@ -367,12 +433,14 @@ _e_thumb_generate(E_Thumb *eth)
                     }
                   evas_object_image_fill_set(im, 0, 0, ww, hh);
                }
+             evas_object_move(im, 0, 0);
+             evas_object_resize(im, ww, hh);
+             sortkey = EINA_TRUE;
           }
         else
           goto end;
+        
         ecore_evas_alpha_set(ee, alpha);
-        evas_object_move(im, 0, 0);
-        evas_object_resize(im, ww, hh);
         ecore_evas_resize(ee, ww, hh);
         evas_object_show(im);
         if (ww <= 0) goto end;
@@ -388,55 +456,57 @@ _e_thumb_generate(E_Thumb *eth)
         eet_data_image_write(ef, "/thumbnail/data",
                              (void *)data, ww, hh, alpha,
                              0, 91, 1);
-        ww = 4; hh = 4;
-        evas_object_image_fill_set(im, 0, 0, ww, hh);
-        evas_object_resize(im, ww, hh);
-        ecore_evas_resize(ee, ww, hh);
-        data = ecore_evas_buffer_pixels_get(ee);
-        if (!data) goto end;
-
-        data1 = malloc(ww * hh * sizeof(unsigned int));
-        memcpy(data1, data, ww * hh * sizeof(unsigned int));
-        ww = 2; hh = 2;
-        evas_object_image_fill_set(im, 0, 0, ww, hh);
-        evas_object_resize(im, ww, hh);
-        ecore_evas_resize(ee, ww, hh);
-        data = ecore_evas_buffer_pixels_get(ee);
-        if (data)
+        if (sortkey)
           {
-             unsigned int *data2;
+             ww = 4; hh = 4;
+             evas_object_image_fill_set(im, 0, 0, ww, hh);
+             evas_object_resize(im, ww, hh);
+             ecore_evas_resize(ee, ww, hh);
+             data = ecore_evas_buffer_pixels_get(ee);
+             if (!data) goto end;
 
-             data2 = malloc(ww * hh * sizeof(unsigned int));
-             memcpy(data2, data, ww * hh * sizeof(unsigned int));
-             ww = 1; hh = 1;
+             data1 = malloc(ww * hh * sizeof(unsigned int));
+             memcpy(data1, data, ww * hh * sizeof(unsigned int));
+             ww = 2; hh = 2;
              evas_object_image_fill_set(im, 0, 0, ww, hh);
              evas_object_resize(im, ww, hh);
              ecore_evas_resize(ee, ww, hh);
              data = ecore_evas_buffer_pixels_get(ee);
              if (data)
                {
-                  unsigned int *data3;
-                  unsigned char id2[(21 * 4) + 1];
-                  int n, i;
-                  int hi, si, vi;
-                  float h, s, v;
-                  const int pat2[4] =
-                  {
-                     0, 3, 1, 2
-                  };
-                  const int pat1[16] =
-                  {
-                     5, 10, 6, 9,
-                     0, 15, 3, 12,
-                     1, 14, 7, 8,
-                     4, 11, 2, 13
-                  };
-
-                  /* ww = hh = 1 here */
-                  data3 = malloc(sizeof(unsigned int));
-                  memcpy(data3, data, sizeof(unsigned int));
-                  // sort_id
-                  n = 0;
+                  unsigned int *data2;
+                  
+                  data2 = malloc(ww * hh * sizeof(unsigned int));
+                  memcpy(data2, data, ww * hh * sizeof(unsigned int));
+                  ww = 1; hh = 1;
+                  evas_object_image_fill_set(im, 0, 0, ww, hh);
+                  evas_object_resize(im, ww, hh);
+                  ecore_evas_resize(ee, ww, hh);
+                  data = ecore_evas_buffer_pixels_get(ee);
+                  if (data)
+                    {
+                       unsigned int *data3;
+                       unsigned char id2[(21 * 4) + 1];
+                       int n, i;
+                       int hi, si, vi;
+                       float h, s, v;
+                       const int pat2[4] =
+                         {
+                            0, 3, 1, 2
+                         };
+                       const int pat1[16] =
+                         {
+                            5, 10, 6, 9,
+                            0, 15, 3, 12,
+                            1, 14, 7, 8,
+                            4, 11, 2, 13
+                         };
+                       
+                       /* ww = hh = 1 here */
+                       data3 = malloc(sizeof(unsigned int));
+                       memcpy(data3, data, sizeof(unsigned int));
+                       // sort_id
+                       n = 0;
 #define A(v) (((v) >> 24) & 0xff)
 #define R(v) (((v) >> 16) & 0xff)
 #define G(v) (((v) >> 8) & 0xff)
@@ -454,71 +524,73 @@ _e_thumb_generate(E_Thumb *eth)
 #define SAVEX(x) \
   id2[n++] = 'a' + x;
 #if 0
-                  HSV(data3[0]);
-                  SAVEHSV(hi, si, vi);
-                  for (i = 0; i < 4; i++)
-                    {
-                       HSV(data2[pat2[i]]);
+                       HSV(data3[0]);
                        SAVEHSV(hi, si, vi);
-                    }
-                  for (i = 0; i < 16; i++)
-                    {
-                       HSV(data1[pat1[i]]);
-                       SAVEHSV(hi, si, vi);
-                    }
+                       for (i = 0; i < 4; i++)
+                         {
+                            HSV(data2[pat2[i]]);
+                            SAVEHSV(hi, si, vi);
+                         }
+                       for (i = 0; i < 16; i++)
+                         {
+                            HSV(data1[pat1[i]]);
+                            SAVEHSV(hi, si, vi);
+                         }
 #else
-                  HSV(data3[0]);
-                  SAVEX(hi);
-                  for (i = 0; i < 4; i++)
-                    {
-                       HSV(data2[pat2[i]]);
-                       SAVEX(hi);
-                    }
-                  for (i = 0; i < 16; i++)
-                    {
-                       HSV(data1[pat1[i]]);
+                       HSV(data3[0]);
                        SAVEX(hi);
-                    }
-                  HSV(data3[0]);
-                  SAVEX(vi);
-                  for (i = 0; i < 4; i++)
-                    {
-                       HSV(data2[pat2[i]]);
+                       for (i = 0; i < 4; i++)
+                         {
+                            HSV(data2[pat2[i]]);
+                            SAVEX(hi);
+                         }
+                       for (i = 0; i < 16; i++)
+                         {
+                            HSV(data1[pat1[i]]);
+                            SAVEX(hi);
+                         }
+                       HSV(data3[0]);
                        SAVEX(vi);
-                    }
-                  for (i = 0; i < 16; i++)
-                    {
-                       HSV(data1[pat1[i]]);
-                       SAVEX(vi);
-                    }
-                  HSV(data3[0]);
-                  SAVEX(si);
-                  for (i = 0; i < 4; i++)
-                    {
-                       HSV(data2[pat2[i]]);
+                       for (i = 0; i < 4; i++)
+                         {
+                            HSV(data2[pat2[i]]);
+                            SAVEX(vi);
+                         }
+                       for (i = 0; i < 16; i++)
+                         {
+                            HSV(data1[pat1[i]]);
+                            SAVEX(vi);
+                         }
+                       HSV(data3[0]);
                        SAVEX(si);
-                    }
-                  for (i = 0; i < 16; i++)
-                    {
-                       HSV(data1[pat1[i]]);
-                       SAVEX(si);
-                    }
+                       for (i = 0; i < 4; i++)
+                         {
+                            HSV(data2[pat2[i]]);
+                            SAVEX(si);
+                         }
+                       for (i = 0; i < 16; i++)
+                         {
+                            HSV(data1[pat1[i]]);
+                            SAVEX(si);
+                         }
 #endif
-                  id2[n++] = 0;
-                  eet_write(ef, "/thumbnail/sort_id", id2, n, 1);
-                  free(data3);
+                       id2[n++] = 0;
+                       eet_write(ef, "/thumbnail/sort_id", id2, n, 1);
+                       free(data3);
+                    }
+                  free(data2);
                }
-             free(data2);
+             free(data1);
           }
-        free(data1);
 end:
         if (ef) eet_close(ef);
 
         /* will free all */
         if (edje) evas_object_del(edje);
         if (ee_im) ecore_evas_free(ee_im);
-        else if (im)
-          evas_object_del(im);
+        else if (im) evas_object_del(im);
+        if (im2) evas_object_del(im2);
+        if (bg) evas_object_del(bg);
         ecore_evas_free(ee);
         eet_clearcache();
         break;
index 76b8106..141259b 100644 (file)
@@ -43,8 +43,10 @@ struct _E_Widget_Data
    Eina_Bool     mime_icon : 1;
    Eina_Bool     is_dir : 1;
    Eina_Bool     is_txt : 1;
+   Eina_Bool     is_font : 1;
    Eina_Bool     prev_is_fm : 1;
    Eina_Bool     prev_is_txt : 1;
+   Eina_Bool     prev_is_font : 1;
    Eina_Bool     prev_is_video : 1;
 };
 
@@ -58,6 +60,7 @@ static void  _e_wid_fprev_img_update(E_Widget_Data *wd, const char *path, const
 static void  _e_wid_del_hook(Evas_Object *obj);
 static void  _e_wid_fprev_preview_reset(E_Widget_Data *wd);
 static void  _e_wid_fprev_preview_txt(E_Widget_Data *wd);
+static void  _e_wid_fprev_preview_font(E_Widget_Data *wd);
 static void  _e_wid_fprev_preview_fm(E_Widget_Data *wd);
 
 static void
@@ -131,7 +134,7 @@ static void
 _e_wid_fprev_img_update(E_Widget_Data *wd, const char *path, const char *key)
 {
    if (!path) return;
-   if (wd->is_dir || wd->is_txt) return;
+   if (wd->is_dir || wd->is_txt || wd->is_font) return;
    evas_object_smart_callback_del_full(wd->o_preview_preview, "preview_update", _e_wid_fprev_preview_update, wd);
    if (eina_str_has_extension(path, ".gif"))
      {
@@ -207,7 +210,7 @@ _e_wid_fprev_clear_widgets(E_Widget_Data *wd)
    CLRWID(o_preview_time_entry);
    CLRWID(o_preview_preview);
    CLRWID(o_preview_scrollframe);
-   wd->is_dir = wd->is_txt = wd->prev_is_fm = wd->prev_is_video = EINA_FALSE;
+   wd->is_dir = wd->is_txt = wd->is_font = wd->prev_is_fm = wd->prev_is_video = EINA_FALSE;
    wd->vid_pct = 0;
    if (wd->preview_text_file_thread) ecore_thread_cancel(wd->preview_text_file_thread);
    wd->preview_text_file_thread = NULL;
@@ -418,7 +421,7 @@ _e_wid_fprev_preview_fs_widgets(E_Widget_Data *wd, Eina_Bool mount_point)
 }
 
 static void
-_e_wid_fprev_preview_file_widgets(E_Widget_Data *wd, Eina_Bool dir, Eina_Bool txt)
+_e_wid_fprev_preview_file_widgets(E_Widget_Data *wd, Eina_Bool dir, Eina_Bool txt, Eina_Bool font)
 {
    Evas *evas = evas_object_evas_get(wd->obj);
    Evas_Object *o;
@@ -438,6 +441,7 @@ _e_wid_fprev_preview_file_widgets(E_Widget_Data *wd, Eina_Bool dir, Eina_Bool tx
    wd->o_preview_properties_table = o;
    wd->is_dir = dir;
    wd->is_txt = txt;
+   wd->is_font = font;
 
    if (!dir)
      {
@@ -659,12 +663,41 @@ _e_wid_fprev_preview_file(E_Widget_Data *wd)
         wd->is_txt = !strncmp(wd->mime, "text/", 5);
         if (!wd->is_txt)
           wd->is_txt = !strcmp(wd->mime, "application/x-shellscript");
+        if (!wd->is_txt)
+          {
+             wd->is_font = !strcmp(wd->mime, "application/x-font");
+             if (!wd->is_font)
+               wd->is_font = !strcmp(wd->mime, "application/x-font-ttf");
+             if (!wd->is_font)
+               wd->is_font = !strcmp(wd->mime, "application/x-font-type1");
+             if (!wd->is_font)
+               wd->is_font = !strcmp(wd->mime, "application/x-font-afm");
+             if (!wd->is_font)
+               wd->is_font = !strcmp(wd->mime, "application/x-font-snf");
+             if (!wd->is_font)
+               wd->is_font = !strcmp(wd->mime, "application/x-font-otf");
+             if (!wd->is_font)
+               wd->is_font = !strcmp(wd->mime, "application/vnd.font-fontforge-sfd");
+             if (!wd->is_font)
+               wd->is_font = !strcmp(wd->mime, "application/x-font-linux-psf");
+             if (!wd->is_font)
+               wd->is_font = !strcmp(wd->mime, "application/x-font-ttx");
+             if (!wd->is_font)
+               wd->is_font = !strcmp(wd->mime, "application/x-font-speedo");
+             if (!wd->is_font)
+               wd->is_font = !strcmp(wd->mime, "application/x-font-pcf");
+             if (!wd->is_font)
+               wd->is_font = !strcmp(wd->mime, "application/x-font-bdf");
+             if (!wd->is_font)
+               wd->is_font = !strcmp(wd->mime, "application/x-cisco-vpn-settings");
+          }
      }
-   _e_wid_fprev_preview_file_widgets(wd, wd->is_dir, wd->is_txt);
+   _e_wid_fprev_preview_file_widgets(wd, wd->is_dir, wd->is_txt, wd->is_font);
 
    _e_wid_fprev_preview_reset(wd);
    _e_wid_fprev_preview_fm(wd);
    _e_wid_fprev_preview_txt(wd);
+   _e_wid_fprev_preview_font(wd);
    _e_wid_fprev_img_update(wd, wd->path, NULL);
 
    e_widget_size_min_get(wd->o_preview_list, &mw, &mh);
@@ -812,9 +845,9 @@ _e_wid_fprev_preview_reset(E_Widget_Data *wd)
    wd->o_preview_scrollframe = wd->o_preview_preview = NULL;
    if (wd->preview_text_file_thread) ecore_thread_cancel(wd->preview_text_file_thread);
    wd->preview_text_file_thread = NULL;
-   if (wd->is_dir || wd->is_txt) return;
+   if (wd->is_dir || wd->is_txt || wd->is_font) return;
    o = e_widget_preview_add(evas_object_evas_get(wd->obj), wd->w, wd->h);
-   wd->prev_is_txt = wd->prev_is_fm = EINA_FALSE;
+   wd->prev_is_txt = wd->prev_is_fm = wd->prev_is_font = EINA_FALSE;
    wd->o_preview_preview = o;
    e_widget_table_object_append(wd->o_preview_preview_table,
                                 wd->o_preview_preview,
@@ -871,9 +904,13 @@ static void
 _e_wid_fprev_preview_txt_read_notify(void *data, Ecore_Thread *eth __UNUSED__, void *msg)
 {
    E_Widget_Data *wd = data;
+   char *buf;
 
    //INF("text='%s'", (char*)msg);
-   edje_object_part_text_set(wd->o_preview_preview, "e.textblock.message", msg);
+   buf = alloca(strlen(msg) + 4096);
+   strcpy(buf, "<align=left>");
+   strcat(buf, msg);
+   edje_object_part_text_set(wd->o_preview_preview, "e.textblock.message", buf);
    free(msg);
 }
 
@@ -920,7 +957,6 @@ _e_wid_fprev_preview_txt(E_Widget_Data *wd)
         e_theme_edje_object_set(o, "base/theme/dialog", "e/widgets/dialog/text");
         edje_object_signal_emit(o, "e,state,left", "e");
         edje_object_message_signal_process(o);
-        edje_object_part_text_set(wd->o_preview_preview, "e.textblock.message", "");
         wd->o_preview_preview = o;
         wd->prev_is_txt = EINA_TRUE;
         evas_object_resize(o, wd->w, wd->h);
@@ -946,6 +982,87 @@ _e_wid_fprev_preview_txt(E_Widget_Data *wd)
 }
 
 static void
+_e_wid_fprev_preview_font(E_Widget_Data *wd)
+{
+   Evas_Object *o;
+   int mw;
+
+   if (!wd->is_font) return;
+   if (!wd->path) return;
+   if (wd->o_preview_preview && (!wd->prev_is_font))
+     {
+        evas_object_del(wd->o_preview_preview);
+        wd->o_preview_preview = NULL;
+     }
+   if (!wd->o_preview_preview)
+     {
+        Evas *evas;
+        char *buf, *escaped;
+
+        evas = evas_object_evas_get(wd->obj);
+        o = edje_object_add(evas);
+        /* using dialog theme for now because it's simple, common, and doesn't require all
+         * themes to be updated
+         */
+        e_theme_edje_object_set(o, "base/theme/dialog", "e/widgets/dialog/text");
+        edje_object_signal_emit(o, "e,state,left", "e");
+        edje_object_message_signal_process(o);
+        escaped = eina_str_escape(wd->path);
+        if (escaped)
+          {
+             buf = alloca(strlen(escaped) + 4096);
+             snprintf(buf, strlen(wd->path) + 4096,
+                      "<font=%s>"
+                      
+                      "<font_size=28>"
+                      "28 - ABC abc 0123 @!?#$*{}<br>"
+                      "The quick brown fox jumps.<br>"
+
+                      "<font_size=20>"
+                      "20 - ABC abc 0123 @!?#$*{}<br>"
+                      "The quick brown fox jumps.<br>"
+                      
+                      "<font_size=16>"
+                      "16 - ABC abc 0123 @!?#$*{}<br>"
+                      "The quick brown fox jumps.<br>"
+                      
+                      "<font_size=12>"
+                      "12 - ABC abc 0123 @!?#$*{}<br>"
+                      "The quick brown fox jumps.<br>"
+                      
+                      "<font_size=10>"
+                      "10 - ABC abc 0123 @!?#$*{}<br>"
+                      "The quick brown fox jumps.<br>"
+                      
+                      "<font_size=8>"
+                      "8 - ABC abc 0123 @!?#$*{}<br>"
+                      "The quick brown fox jumps.<br>"
+                      , escaped
+                     );
+             edje_object_part_text_set(o, "e.textblock.message", buf);
+             free(escaped);
+          }
+        wd->o_preview_preview = o;
+        wd->prev_is_font = EINA_TRUE;
+        evas_object_resize(o, wd->w, wd->h);
+        o = e_widget_scrollframe_simple_add(evas, o);
+        wd->o_preview_scrollframe = o;
+        e_widget_size_min_get(wd->o_preview_list, &mw, NULL);
+        e_widget_size_min_set(o, wd->w, wd->h);
+        evas_object_propagate_events_set(wd->o_preview_preview, 0);
+        e_widget_table_object_append(wd->o_preview_preview_table,
+                                     o, 0, 0, 2, 1, 1, 1, 1, 1);
+        e_widget_list_object_repack(wd->o_preview_list,
+                                    wd->o_preview_preview_table,
+                                    1, 1, 0.5);
+        e_widget_list_object_repack(wd->o_preview_list,
+                                    wd->o_preview_properties_table,
+                                    1, 1, 0.5);
+        evas_object_show(o);
+     }
+}
+
+static void
 _e_wid_fprev_preview_fm(E_Widget_Data *wd)
 {
    E_Fm2_Config fmc;
@@ -1105,6 +1222,6 @@ e_widget_filepreview_filemode_force(Evas_Object *obj)
    if (!obj) return;
    wd = e_widget_data_get(obj);
    if (!wd) return;
-   _e_wid_fprev_preview_file_widgets(wd, 0, 0);
+   _e_wid_fprev_preview_file_widgets(wd, 0, 0, 0);
 }