Index: filetree.css
===================================================================
--- filetree.css	(revision 333)
+++ filetree.css	(working copy)
@@ -122,3 +122,14 @@
 .filetree li.zip {
   background-image: url(images/zip.png);
 }
+
+#filetree-thumb {
+	width: 110px;
+	height: 105px;
+	border-style: solid;
+	border-width: 1px;
+	border-color: #a0a0a0;
+	background-color: #FFFFC0;
+	text-align: center;
+	padding-top: 5px;
+}
Index: filetree.info
===================================================================
--- filetree.info	(revision 333)
+++ filetree.info	(working copy)
@@ -2,7 +2,7 @@
 description = Renders an interactive list from a folder of files.
 package = Input filters
 core = 7.x
-configure = admin/config/content/formats
+configure = admin/config/media/filetree
 scripts[] = filetree.js
 stylesheets[all][] = filetree.css
 ; Information added by drupal.org packaging script on 2011-07-20
Index: filetree.js
===================================================================
--- filetree.js	(revision 333)
+++ filetree.js	(working copy)
@@ -44,4 +44,40 @@
 
 };
 
-})(jQuery);
\ No newline at end of file
+})(jQuery);
+
+function thumb_show(url,elem) {
+  // First create the div
+  var thumb = document.createElement('div');
+  thumb.style.position = 'absolute';
+  thumb.style.display='block';
+  thumb.id = 'filetree-thumb';
+  
+  // Set it's position
+  var pos = thumb_pos(elem);
+  thumb.style.left = (pos[0] + elem.offsetWidth + 5) + 'px';
+  thumb.style.top = (pos[1] + 3) +'px';
+  
+  thumb.innerHTML = "<img src=\"?q="+url+"\" />";
+  
+  document.body.appendChild(thumb);
+}
+
+function thumb_hide() {
+  var thumb = document.getElementById("filetree-thumb");
+  thumb.parentNode.removeChild(thumb);
+}
+
+function thumb_pos(elem) {
+  var pos = new Array();
+  if(elem == null || elem.tagName == "HTML") {
+    pos[0] = 0;
+    pos[1] = 0;
+    return pos;
+  } else {
+    var P = thumb_pos(elem.offsetParent);
+    pos[0] = elem.offsetLeft + P[0];
+    pos[1] = elem.offsetTop + P[1];
+    return pos;
+  }
+}
\ No newline at end of file
Index: filetree.module
===================================================================
--- filetree.module	(revision 333)
+++ filetree.module	(working copy)
@@ -1,6 +1,51 @@
 <?php
 
 /**
+ * Implements of hook_menu().
+ */
+function filetree_menu() {
+  $items = array();
+
+  $items['admin/config/media/filetree'] = array(
+    'title' => 'File tree',
+    'description' => 'Configure the filetree module.',
+//    'access callback' => 'user_access',
+    'access arguments' => array('administer site configuration'),
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('filetree_admin_settings'),
+    'type' => MENU_NORMAL_ITEM,
+  );
+
+  // Callback function for Thumbnail support
+  $items['filetree/thumb'] = array(
+    'title' => 'thumbnail',
+    'page callback' => 'filetree_get_thumb',
+    'access arguments' => array('access content'),
+    'type' => MENU_CALLBACK
+  );
+
+  return $items;
+}
+
+/**
+ * Implements hook_help().
+ */
+function filetree_help($path, $arg) {
+  switch ($path) {
+    case 'admin/config/media/filetree':
+      $help = t("The filetree filter can be turned on for one or more Text formats on the ") . l(t("Text formats settings page"), "admin/config/content/formats") . ".";
+      return $help;
+  }
+}
+
+function filetree_admin_settings($form, &$form_state) {
+
+  // Form elements here...
+
+  return system_settings_form($form);
+}
+
+/**
  * Implements hook_theme().
  */
 function filetree_theme() {
@@ -109,6 +154,7 @@
     'dirtitle' => '%filename',
     'filename' => '%filename',
     'filetitle' => '%filename',
+    'thumbs' => FALSE,
   );
 
   // The token might be present multiple times; loop through each instance.
@@ -196,8 +242,14 @@
         else {
           $name = isset($descriptions[$file]) ? $descriptions[$file] : token_replace($params['filename'], array('file' => $file));
           $url = $params['absolute'] ? file_create_url($filename) : substr(file_create_url($filename), strlen($GLOBALS['base_url'] . '/'));
+          if($params['thumbs'] && _filetree_image(pathinfo($file, PATHINFO_EXTENSION))) {
+            $data = '<a href="'.url(urldecode($url)).'" onmouseover="javascript:thumb_show(\'filetree/thumb/'.substr(file_create_url($filename), strlen($GLOBALS['base_url'] . '/?q=system/files')).'\',this)" onmouseout="javascript:thumb_hide()">'.$name.'</a>';
+          } else {
+            $data = l($name,urldecode($url));
+          }
           $files[$file] = array(
-            'data' => l($name, urldecode($url)),
+//            'data' => l($name, urldecode($url)),
+            'data' => $data,
             'title' => token_replace($params['filetitle'], array('file' => $file)),
             'class' => array(_filetree_icon(pathinfo($file, PATHINFO_EXTENSION))),
           );
@@ -284,6 +336,31 @@
   return $icon;
 }
 
+function _filetree_image($extension) {
+  $extension = strtolower($extension);
+  if(!extension_loaded('gd')) {
+    return false;
+  }
+
+  switch($extension) {
+  case 'jpg':
+  case 'jpeg':
+    return imagetypes() & IMG_JPG;
+    break;
+  case 'png':
+    return imagetypes() & IMG_PNG;
+    break;
+  case 'bmp':
+    return imagetypes() & IMG_WBMP;
+    break;
+  case 'gif':
+    return imagetypes() & IMG_GIF;
+    break;
+  }
+
+  return false;
+}
+
 /**
  * Renders filetree.
  */
@@ -333,3 +410,123 @@
 
   return '<div id="' . $id . '" class="' . implode(' ', $classes) . '">' . $output . '</div>';
 }
+
+/**
+ * Fetch the right thumbnail based on the path
+ */
+function filetree_get_thumb() {
+  module_invoke('admin_menu', 'suppress');
+  $file = pathinfo(substr($_REQUEST['q'],15,strlen($_REQUEST['q'])));
+  $file['dir_uri'] = file_build_uri($file['dirname']);
+  $file['file_uri'] = file_build_uri($file['dirname'].'/'.$file['basename']);
+
+  if(file_exists($file['dir_uri']) && file_prepare_directory($file['dir_uri'],0) && file_exists($file['file_uri']) && !file_prepare_directory($file['file_uri'],0)) {
+    // Create thumbnail directory if it doesn't already exist
+    $file['dir_uri'] .= '/.thumb';
+    $file['thumb_uri'] = file_build_uri($file['dirname'].'/.thumb/'.$file['basename']);
+    file_prepare_directory($file['dir_uri'],FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS);
+
+    /* Replace old thumbnail */
+    if(file_exists($file['thumb_uri']) && filemtime($file['file_uri']) > filemtime($file['thumb_uri'])) {
+      if(!unlink($file['thumb_uri'])) {
+//        goto error;
+//        error:
+        header("Content-type: image/png");
+        module_load_include('png','filetree','images/nothumb');
+        exit();
+      }
+    }
+
+    // Create the file if it doesn't exist yet
+    if(!file_exists($file['thumb_uri']))
+      _filetree_create_thumb($file['file_uri']);
+
+    // If the thumb exists, serve it
+    if(file_exists($file['thumb_uri']) && !file_prepare_directory($file['thumb_uri'],0)) {
+      $headers = array(
+        'Content-type' => file_get_mimetype($file['thumb_uri']),
+        'Content-Length' => filesize($file['thumb_uri'])
+      );
+      file_transfer($file['thumb_uri'],$headers);
+      exit();
+    }
+  }
+
+//  /* Error handling path */
+//  error:
+//  header("Content-type: image/png");
+//  module_load_include('png','filetree','images/nothumb');
+
+  exit();
+}
+
+function _filetree_create_thumb($url) {
+  // Get extension
+  $file = pathinfo($url);
+  $dest = $file['dirname'].'/.thumb/'.$file['basename'];
+  $image;
+
+  // Load original file
+  switch(strtolower($file['extension'])) {
+  case 'jpg':
+  case 'jpeg':
+    $image = imagecreatefromjpeg($url);
+    break;
+  case 'png':
+    $image = imagecreatefrompng($url);
+    break;
+  case 'bmp':
+    $image = imagecreatefromwbmp($url);
+    break;
+  case 'gif':
+    $image = imagecreatefromgif($url);
+    break;
+  default:
+    $image = false;
+  }
+
+  if(!$image) return false;
+
+  // Scale
+  $sx = imagesx($image);
+  $sy = imagesy($image);
+
+  if($sx > 100 || $sy > 100) {
+    if($sx > $sy) {
+      // Scale to x=100;
+      $newsx = 100;
+      $newsy = ($sy*100)/$sx;
+    } else {
+      $newsx = ($sx*100)/$sy;
+      $newsy = 100;
+    }
+    $thumb = imagecreatetruecolor($newsx,$newsy);
+
+    imagecopyresized($thumb,$image,0,0,0,0,$newsx,$newsy,$sx,$sy);
+    imagedestroy($image);
+  } else {
+    $thumb = $image;
+  }
+
+  // Store thumbnail
+  switch(strtolower($file['extension'])) {
+  case 'jpg':
+  case 'jpeg':
+    $ret = imagejpeg($thumb,drupal_realpath($dest));
+    break;
+  case 'png':
+    $ret = imagepng($thumb,$dest);
+    break;
+  case 'bmp':
+    $ret = image2wbmp($thumb,$dest);
+    break;
+  case 'gif':
+    $ret = imagegif($thumb,$dest);
+    break;
+  default:
+    $ret = false;
+  }
+
+  imagedestroy($thumb);
+  return $ret;
+}
\ No newline at end of file
