aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Storage/Helpers
diff options
context:
space:
mode:
authorRoy Ben-Shabat <Roy@Twine-s.com>2018-11-28 20:16:11 +0200
committerRoy Ben-Shabat <Roy@Twine-s.com>2018-11-28 20:16:11 +0200
commitac3c227bb5d12339fee6fb4c243f3a5f67217915 (patch)
treebbafb0da5b25aeedda13b2ab89c4fbc36da45608 /Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Storage/Helpers
parentc86a3bd32bf6d561fecf662b53b49749d2989b88 (diff)
downloadTango-ac3c227bb5d12339fee6fb4c243f3a5f67217915.tar.gz
Tango-ac3c227bb5d12339fee6fb4c243f3a5f67217915.zip
Working on machine studio storage !
Diffstat (limited to 'Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Storage/Helpers')
-rw-r--r--Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Storage/Helpers/FileIconHelper.cs146
1 files changed, 146 insertions, 0 deletions
diff --git a/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Storage/Helpers/FileIconHelper.cs b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Storage/Helpers/FileIconHelper.cs
new file mode 100644
index 000000000..47dab8e5e
--- /dev/null
+++ b/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Storage/Helpers/FileIconHelper.cs
@@ -0,0 +1,146 @@
+using System;
+using System.Collections.Generic;
+using System.Drawing;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Windows;
+using System.Windows.Interop;
+using System.Windows.Media;
+using System.Windows.Media.Imaging;
+
+namespace Tango.MachineStudio.Storage.Helpers
+{
+ public static class FileIconHelper
+ {
+ private static readonly Dictionary<string, ImageSource> _smallIconCache = new Dictionary<string, ImageSource>();
+ private static readonly Dictionary<string, ImageSource> _largeIconCache = new Dictionary<string, ImageSource>();
+ /// <summary>
+ /// Get an icon for a given filename
+ /// </summary>
+ /// <param name="fileName">any filename</param>
+ /// <param name="large">16x16 or 32x32 icon</param>
+ /// <returns>null if path is null, otherwise - an icon</returns>
+ public static ImageSource FindIconForFilename(string fileName, bool large)
+ {
+ var extension = Path.GetExtension(fileName);
+ if (extension == null)
+ return null;
+ var cache = large ? _largeIconCache : _smallIconCache;
+ ImageSource icon;
+ if (cache.TryGetValue(extension, out icon))
+ return icon;
+ icon = IconReader.GetFileIcon(fileName, large ? IconReader.IconSize.Large : IconReader.IconSize.Small, false).ToImageSource();
+ cache.Add(extension, icon);
+ return icon;
+ }
+ /// <summary>
+ /// http://stackoverflow.com/a/6580799/1943849
+ /// </summary>
+ static ImageSource ToImageSource(this Icon icon)
+ {
+ var imageSource = Imaging.CreateBitmapSourceFromHIcon(
+ icon.Handle,
+ Int32Rect.Empty,
+ BitmapSizeOptions.FromEmptyOptions());
+ return imageSource;
+ }
+ /// <summary>
+ /// Provides static methods to read system icons for both folders and files.
+ /// </summary>
+ /// <example>
+ /// <code>IconReader.GetFileIcon("c:\\general.xls");</code>
+ /// </example>
+ static class IconReader
+ {
+ /// <summary>
+ /// Options to specify the size of icons to return.
+ /// </summary>
+ public enum IconSize
+ {
+ /// <summary>
+ /// Specify large icon - 32 pixels by 32 pixels.
+ /// </summary>
+ Large = 0,
+ /// <summary>
+ /// Specify small icon - 16 pixels by 16 pixels.
+ /// </summary>
+ Small = 1
+ }
+ /// <summary>
+ /// Returns an icon for a given file - indicated by the name parameter.
+ /// </summary>
+ /// <param name="name">Pathname for file.</param>
+ /// <param name="size">Large or small</param>
+ /// <param name="linkOverlay">Whether to include the link icon</param>
+ /// <returns>System.Drawing.Icon</returns>
+ public static Icon GetFileIcon(string name, IconSize size, bool linkOverlay)
+ {
+ var shfi = new Shell32.Shfileinfo();
+ var flags = Shell32.ShgfiIcon | Shell32.ShgfiUsefileattributes;
+ if (linkOverlay) flags += Shell32.ShgfiLinkoverlay;
+ /* Check the size specified for return. */
+ if (IconSize.Small == size)
+ flags += Shell32.ShgfiSmallicon;
+ else
+ flags += Shell32.ShgfiLargeicon;
+ Shell32.SHGetFileInfo(name,
+ Shell32.FileAttributeNormal,
+ ref shfi,
+ (uint)Marshal.SizeOf(shfi),
+ flags);
+ // Copy (clone) the returned icon to a new object, thus allowing us to clean-up properly
+ var icon = (Icon)Icon.FromHandle(shfi.hIcon).Clone();
+ User32.DestroyIcon(shfi.hIcon); // Cleanup
+ return icon;
+ }
+ }
+ /// <summary>
+ /// Wraps necessary Shell32.dll structures and functions required to retrieve Icon Handles using SHGetFileInfo. Code
+ /// courtesy of MSDN Cold Rooster Consulting case study.
+ /// </summary>
+ static class Shell32
+ {
+ private const int MaxPath = 256;
+ [StructLayout(LayoutKind.Sequential)]
+ public struct Shfileinfo
+ {
+ private const int Namesize = 80;
+ public readonly IntPtr hIcon;
+ private readonly int iIcon;
+ private readonly uint dwAttributes;
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MaxPath)]
+ private readonly string szDisplayName;
+ [MarshalAs(UnmanagedType.ByValTStr, SizeConst = Namesize)]
+ private readonly string szTypeName;
+ };
+ public const uint ShgfiIcon = 0x000000100; // get icon
+ public const uint ShgfiLinkoverlay = 0x000008000; // put a link overlay on icon
+ public const uint ShgfiLargeicon = 0x000000000; // get large icon
+ public const uint ShgfiSmallicon = 0x000000001; // get small icon
+ public const uint ShgfiUsefileattributes = 0x000000010; // use passed dwFileAttribute
+ public const uint FileAttributeNormal = 0x00000080;
+ [DllImport("Shell32.dll")]
+ public static extern IntPtr SHGetFileInfo(
+ string pszPath,
+ uint dwFileAttributes,
+ ref Shfileinfo psfi,
+ uint cbFileInfo,
+ uint uFlags
+ );
+ }
+ /// <summary>
+ /// Wraps necessary functions imported from User32.dll. Code courtesy of MSDN Cold Rooster Consulting example.
+ /// </summary>
+ static class User32
+ {
+ /// <summary>
+ /// Provides access to function required to delete handle. This method is used internally
+ /// and is not required to be called separately.
+ /// </summary>
+ /// <param name="hIcon">Pointer to icon handle.</param>
+ /// <returns>N/A</returns>
+ [DllImport("User32.dll")]
+ public static extern int DestroyIcon(IntPtr hIcon);
+ }
+ }
+}