using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Interop;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using Tango.Core.IO;
namespace Tango.FileSystem
{
public class FileItem : FileSystemItem
{
private static Dictionary<String, BitmapSource> iconCache;
private static Dictionary<String, BitmapSource> smallIconCache;
private static Dictionary<String, String> typeDescriptionCache;
static FileItem()
{
iconCache = new Dictionary<string, BitmapSource>();
smallIconCache = new Dictionary<string, BitmapSource>();
typeDescriptionCache = new Dictionary<string, string>();
}
public FileItem()
{
Type = FileSystemItemType.File;
}
public String Extension
{
get { return System.IO.Path.GetExtension(Path); }
}
private BitmapSource _icon;
public BitmapSource Icon
{
get
{
if (_icon == null)
{
_icon = GetFileIcon();
}
return _icon;
}
}
private BitmapSource _smallIcon;
public BitmapSource SmallIcon
{
get
{
if (_smallIcon == null)
{
_smallIcon = GetSmallFileIcon();
}
return _smallIcon;
}
}
public override string Description
{
get
{
if (typeDescriptionCache.ContainsKey(Extension))
{
return typeDescriptionCache[Extension];
}
else
{
var tempFile = TemporaryManager.Default.CreateFile(Extension);
var shellFile = Microsoft.WindowsAPICodePack.Shell.ShellFile.FromFilePath(tempFile);
var text = shellFile.Properties.System.ItemTypeText.Value.ToStringSafe();
shellFile.Dispose();
tempFile.Delete();
typeDescriptionCache.Add(Extension, text);
return text;
}
}
}
protected BitmapSource GetFileIcon()
{
if (iconCache.ContainsKey(Extension))
{
return iconCache[Extension];
}
else
{
var tempFile = TemporaryManager.Default.CreateFile(Extension);
var shellFile = Microsoft.WindowsAPICodePack.Shell.ShellFile.FromFilePath(tempFile);
var source = shellFile.Thumbnail.MediumBitmapSource;
shellFile.Dispose();
tempFile.Delete();
iconCache.Add(Extension, source);
return source;
}
}
private BitmapSource GetSmallFileIcon()
{
if (smallIconCache.ContainsKey(Extension))
{
return smallIconCache[Extension];
}
else
{
var tempFile = TemporaryManager.Default.CreateFile(Extension);
var shellFile = Microsoft.WindowsAPICodePack.Shell.ShellFile.FromFilePath(tempFile);
var source = shellFile.Thumbnail.SmallBitmapSource;
shellFile.Dispose();
tempFile.Delete();
smallIconCache.Add(Extension, source);
return source;
}
}
private BitmapSource IconToBitmapSource(Icon icon)
{
var imageSource = Imaging.CreateBitmapSourceFromHIcon(
icon.Handle,
Int32Rect.Empty,
BitmapSizeOptions.FromEmptyOptions());
return imageSource;
}
}
}