diff --git a/ILSpy/Analyzers/TreeNodes/AnalyzedModuleTreeNode.cs b/ILSpy/Analyzers/TreeNodes/AnalyzedModuleTreeNode.cs index 606b72f80..1c7c50175 100644 --- a/ILSpy/Analyzers/TreeNodes/AnalyzedModuleTreeNode.cs +++ b/ILSpy/Analyzers/TreeNodes/AnalyzedModuleTreeNode.cs @@ -33,7 +33,7 @@ namespace ICSharpCode.ILSpy.Analyzers.TreeNodes this.LazyLoading = true; } - public override object Icon => Images.Assembly; + public override object Icon => Images.GetIcon(Images.Assembly); public override object Text => analyzedModule.AssemblyName; diff --git a/ILSpy/Images/Images.cs b/ILSpy/Images/Images.cs index 2433c7d30..c919445ff 100644 --- a/ILSpy/Images/Images.cs +++ b/ILSpy/Images/Images.cs @@ -24,6 +24,7 @@ using System.Collections.Generic; using System.Windows.Controls; using System.Windows.Markup; using System.IO; +using System.Windows.Shapes; namespace ICSharpCode.ILSpy { @@ -35,7 +36,19 @@ namespace ICSharpCode.ILSpy image.Freeze(); return image; } - + + static object Load(string icon) + { + icon = "Images/" + icon; + if (icon.EndsWith(".png", StringComparison.OrdinalIgnoreCase)) + return LoadImage(null, icon); + Uri uri = GetUri(null, icon + ".xaml"); + if (ResourceExists(uri)) { + return LoadDrawingGroup(null, icon); + } + return LoadImage(null, icon + ".png"); + } + public static readonly BitmapImage Breakpoint = LoadBitmap("Breakpoint"); public static readonly BitmapImage CurrentLine = LoadBitmap("CurrentLine"); @@ -46,9 +59,9 @@ namespace ICSharpCode.ILSpy public static readonly BitmapImage Delete = LoadBitmap("Delete"); public static readonly BitmapImage Search = LoadBitmap("Search"); - public static readonly BitmapImage Assembly = LoadBitmap("Assembly"); - public static readonly BitmapImage AssemblyWarning = LoadBitmap("AssemblyWarning"); - public static readonly BitmapImage AssemblyLoading = LoadBitmap("FindAssembly"); + public static readonly object Assembly = Load("Assembly"); + public static readonly object AssemblyWarning = Load("AssemblyWarning"); + public static readonly object AssemblyLoading = Load("FindAssembly"); public static readonly BitmapImage Library = LoadBitmap("Library"); public static readonly BitmapImage Namespace = LoadBitmap("NameSpace"); @@ -69,7 +82,7 @@ namespace ICSharpCode.ILSpy public static readonly BitmapImage ResourceXsd = LoadBitmap("ResourceXsd"); public static readonly BitmapImage ResourceXslt = LoadBitmap("ResourceXslt"); - public static readonly BitmapImage Class = LoadBitmap("Class"); + public static readonly object Class = Load("Class"); public static readonly BitmapImage Struct = LoadBitmap("Struct"); public static readonly BitmapImage Interface = LoadBitmap("Interface"); public static readonly BitmapImage Delegate = LoadBitmap("Delegate"); @@ -97,11 +110,22 @@ namespace ICSharpCode.ILSpy private static readonly BitmapImage OverlayProtected = LoadBitmap("OverlayProtected"); private static readonly BitmapImage OverlayInternal = LoadBitmap("OverlayInternal"); private static readonly BitmapImage OverlayProtectedInternal = LoadBitmap("OverlayProtectedInternal"); - private static readonly BitmapImage OverlayPrivate = LoadBitmap("OverlayPrivate"); + private static readonly object OverlayPrivate = Load("OverlayPrivate"); private static readonly BitmapImage OverlayPrivateProtected = LoadBitmap("OverlayPrivateProtected"); private static readonly BitmapImage OverlayCompilerControlled = LoadBitmap("OverlayCompilerControlled"); - private static readonly BitmapImage OverlayStatic = LoadBitmap("OverlayStatic"); + private static readonly object OverlayStatic = Load("OverlayStatic"); + + public static object GetIcon(object imageOrVector) + { + if (imageOrVector is BitmapImage img) + return img; + return new Rectangle { + Width = 16, + Height = 16, + Fill = new DrawingBrush((DrawingGroup)imageOrVector) + }; + } public static object Load(object part, string icon) { @@ -127,10 +151,15 @@ namespace ICSharpCode.ILSpy return (Viewbox)Application.LoadComponent(GetUri(part, icon + ".xaml", absolute: false)); } + public static DrawingGroup LoadDrawingGroup(object part, string icon) + { + return (DrawingGroup)Application.LoadComponent(GetUri(part, icon + ".xaml", absolute: false)); + } + private static Uri GetUri(object part, string icon, bool absolute = true) { Uri uri; - var assembly = part.GetType().Assembly; + var assembly = part?.GetType().Assembly; string prefix; UriKind kind; if (absolute) { @@ -140,7 +169,7 @@ namespace ICSharpCode.ILSpy prefix = "/"; kind = UriKind.Relative; } - if (assembly == typeof(Images).Assembly) { + if (part == null || assembly == typeof(Images).Assembly) { uri = new Uri(prefix + icon, kind); } else { var name = assembly.GetName(); @@ -163,13 +192,13 @@ namespace ICSharpCode.ILSpy private static readonly TypeIconCache typeIconCache = new TypeIconCache(); private static readonly MemberIconCache memberIconCache = new MemberIconCache(); - public static ImageSource GetIcon(TypeIcon icon, AccessOverlayIcon overlay, bool isStatic = false) + public static object GetIcon(TypeIcon icon, AccessOverlayIcon overlay, bool isStatic = false) { lock (typeIconCache) return typeIconCache.GetIcon(icon, overlay, isStatic); } - public static ImageSource GetIcon(MemberIcon icon, AccessOverlayIcon overlay, bool isStatic) + public static object GetIcon(MemberIcon icon, AccessOverlayIcon overlay, bool isStatic) { lock (memberIconCache) return memberIconCache.GetIcon(icon, overlay, isStatic); @@ -189,9 +218,9 @@ namespace ICSharpCode.ILSpy PreloadPublicIconToCache(TypeIcon.StaticClass, Images.StaticClass); } - protected override ImageSource GetBaseImage(TypeIcon icon) + protected override object GetBaseImage(TypeIcon icon) { - ImageSource baseImage; + object baseImage; switch (icon) { case TypeIcon.Class: baseImage = Images.Class; @@ -238,9 +267,9 @@ namespace ICSharpCode.ILSpy PreloadPublicIconToCache(MemberIcon.Event, Images.Event); } - protected override ImageSource GetBaseImage(MemberIcon icon) + protected override object GetBaseImage(MemberIcon icon) { - ImageSource baseImage; + object baseImage; switch (icon) { case MemberIcon.Field: baseImage = Images.Field; @@ -291,39 +320,39 @@ namespace ICSharpCode.ILSpy private abstract class IconCache { - private readonly Dictionary, ImageSource> cache = new Dictionary, ImageSource>(); + private readonly Dictionary<(T, AccessOverlayIcon, bool), object> cache = new Dictionary<(T, AccessOverlayIcon, bool), object>(); - protected void PreloadPublicIconToCache(T icon, ImageSource image) + protected void PreloadPublicIconToCache(T icon, object image) { - var iconKey = new Tuple(icon, AccessOverlayIcon.Public, false); + var iconKey = (icon, AccessOverlayIcon.Public, false); cache.Add(iconKey, image); } - public ImageSource GetIcon(T icon, AccessOverlayIcon overlay, bool isStatic) + public object GetIcon(T icon, AccessOverlayIcon overlay, bool isStatic) { - var iconKey = new Tuple(icon, overlay, isStatic); + var iconKey = (icon, overlay, isStatic); if (cache.ContainsKey(iconKey)) { return cache[iconKey]; } else { - ImageSource result = BuildMemberIcon(icon, overlay, isStatic); + object result = BuildMemberIcon(icon, overlay, isStatic); cache.Add(iconKey, result); return result; } } - private ImageSource BuildMemberIcon(T icon, AccessOverlayIcon overlay, bool isStatic) + private object BuildMemberIcon(T icon, AccessOverlayIcon overlay, bool isStatic) { - ImageSource baseImage = GetBaseImage(icon); - ImageSource overlayImage = GetOverlayImage(overlay); + object baseImage = GetBaseImage(icon); + object overlayImage = GetOverlayImage(overlay); return CreateOverlayImage(baseImage, overlayImage, isStatic); } - protected abstract ImageSource GetBaseImage(T icon); + protected abstract object GetBaseImage(T icon); - private static ImageSource GetOverlayImage(AccessOverlayIcon overlay) + private static object GetOverlayImage(AccessOverlayIcon overlay) { - ImageSource overlayImage; + object overlayImage; switch (overlay) { case AccessOverlayIcon.Public: overlayImage = null; @@ -354,18 +383,27 @@ namespace ICSharpCode.ILSpy private static readonly Rect iconRect = new Rect(0, 0, 16, 16); - private static ImageSource CreateOverlayImage(ImageSource baseImage, ImageSource overlay, bool isStatic) + private static ImageSource CreateOverlayImage(object baseImage, object overlay, bool isStatic) { var group = new DrawingGroup(); - group.Children.Add(new ImageDrawing(baseImage, iconRect)); + if (baseImage is ImageSource img) + group.Children.Add(new ImageDrawing(img, iconRect)); + else + group.Children.Add((DrawingGroup)baseImage); if (overlay != null) { - group.Children.Add(new ImageDrawing(overlay, iconRect)); + if (overlay is ImageSource overlayImage) + group.Children.Add(new ImageDrawing(overlayImage, iconRect)); + else + group.Children.Add((DrawingGroup)overlay); } if (isStatic) { - group.Children.Add(new ImageDrawing(Images.OverlayStatic, iconRect)); + if (Images.OverlayStatic is ImageSource staticImg) + group.Children.Add(new ImageDrawing(staticImg, iconRect)); + else + group.Children.Add((DrawingGroup)Images.OverlayStatic); } var image = new DrawingImage(group); diff --git a/ILSpy/Search/AbstractSearchStrategy.cs b/ILSpy/Search/AbstractSearchStrategy.cs index 1a25f1698..1f0b13352 100644 --- a/ILSpy/Search/AbstractSearchStrategy.cs +++ b/ILSpy/Search/AbstractSearchStrategy.cs @@ -204,7 +204,7 @@ namespace ICSharpCode.ILSpy.Search } } - ImageSource GetIcon(IEntity member) + object GetIcon(IEntity member) { switch (member) { case ITypeDefinition t: diff --git a/ILSpy/Search/SearchPane.cs b/ILSpy/Search/SearchPane.cs index 5bb2b7c70..bb2250ef7 100644 --- a/ILSpy/Search/SearchPane.cs +++ b/ILSpy/Search/SearchPane.cs @@ -381,8 +381,8 @@ namespace ICSharpCode.ILSpy public string Location { get; set; } public string Name { get; set; } public object ToolTip { get; set; } - public ImageSource Image { get; set; } - public ImageSource LocationImage { get; set; } + public object Image { get; set; } + public object LocationImage { get; set; } public override string ToString() { diff --git a/ILSpy/TreeNodes/AssemblyReferenceTreeNode.cs b/ILSpy/TreeNodes/AssemblyReferenceTreeNode.cs index 8aa8f8c0d..2aee874dd 100644 --- a/ILSpy/TreeNodes/AssemblyReferenceTreeNode.cs +++ b/ILSpy/TreeNodes/AssemblyReferenceTreeNode.cs @@ -42,11 +42,9 @@ namespace ICSharpCode.ILSpy.TreeNodes public override object Text { get { return r.Name + ((System.Reflection.Metadata.EntityHandle)r.Handle).ToSuffixString(); } } - - public override object Icon { - get { return Images.Assembly; } - } - + + public override object Icon => Images.GetIcon(Images.Assembly); + public override bool ShowExpander { get { if (r.Name == "mscorlib") diff --git a/ILSpy/TreeNodes/AssemblyTreeNode.cs b/ILSpy/TreeNodes/AssemblyTreeNode.cs index 13e2c1df2..db88aba33 100644 --- a/ILSpy/TreeNodes/AssemblyTreeNode.cs +++ b/ILSpy/TreeNodes/AssemblyTreeNode.cs @@ -70,9 +70,9 @@ namespace ICSharpCode.ILSpy.TreeNodes public override object Icon { get { if (LoadedAssembly.IsLoaded) { - return LoadedAssembly.HasLoadError ? Images.AssemblyWarning : Images.Assembly; + return LoadedAssembly.HasLoadError ? Images.GetIcon(Images.AssemblyWarning) : Images.GetIcon(Images.Assembly); } else { - return Images.AssemblyLoading; + return Images.GetIcon(Images.AssemblyLoading); } } } diff --git a/ILSpy/TreeNodes/EventTreeNode.cs b/ILSpy/TreeNodes/EventTreeNode.cs index 1aadff896..c76c02526 100644 --- a/ILSpy/TreeNodes/EventTreeNode.cs +++ b/ILSpy/TreeNodes/EventTreeNode.cs @@ -52,7 +52,7 @@ namespace ICSharpCode.ILSpy.TreeNodes public override object Icon => GetIcon(EventDefinition); - public static ImageSource GetIcon(IEvent @event) + public static object GetIcon(IEvent @event) { return Images.GetIcon(MemberIcon.Event, MethodTreeNode.GetOverlayIcon(@event.Accessibility), @event.IsStatic); } diff --git a/ILSpy/TreeNodes/FieldTreeNode.cs b/ILSpy/TreeNodes/FieldTreeNode.cs index 5d4d2f7b0..6e7aab4b5 100644 --- a/ILSpy/TreeNodes/FieldTreeNode.cs +++ b/ILSpy/TreeNodes/FieldTreeNode.cs @@ -44,7 +44,7 @@ namespace ICSharpCode.ILSpy.TreeNodes public override object Icon => GetIcon(FieldDefinition); - public static ImageSource GetIcon(IField field) + public static object GetIcon(IField field) { if (field.DeclaringType.Kind == TypeKind.Enum && field.ReturnType.Kind == TypeKind.Enum) return Images.GetIcon(MemberIcon.EnumValue, MethodTreeNode.GetOverlayIcon(field.Accessibility), false); diff --git a/ILSpy/TreeNodes/MethodTreeNode.cs b/ILSpy/TreeNodes/MethodTreeNode.cs index 9e4d95e45..84b6f0018 100644 --- a/ILSpy/TreeNodes/MethodTreeNode.cs +++ b/ILSpy/TreeNodes/MethodTreeNode.cs @@ -45,7 +45,7 @@ namespace ICSharpCode.ILSpy.TreeNodes public override object Icon => GetIcon(MethodDefinition); - public static ImageSource GetIcon(IMethod method) + public static object GetIcon(IMethod method) { if (method.IsOperator) return Images.GetIcon(MemberIcon.Operator, GetOverlayIcon(method.Accessibility), false); diff --git a/ILSpy/TreeNodes/PropertyTreeNode.cs b/ILSpy/TreeNodes/PropertyTreeNode.cs index 14769ea66..0396a0ee9 100644 --- a/ILSpy/TreeNodes/PropertyTreeNode.cs +++ b/ILSpy/TreeNodes/PropertyTreeNode.cs @@ -58,7 +58,7 @@ namespace ICSharpCode.ILSpy.TreeNodes public override object Icon => GetIcon(PropertyDefinition); - public static ImageSource GetIcon(IProperty property) + public static object GetIcon(IProperty property) { return Images.GetIcon(property.IsIndexer ? MemberIcon.Indexer : MemberIcon.Property, MethodTreeNode.GetOverlayIcon(property.Accessibility), property.IsStatic); diff --git a/ILSpy/TreeNodes/TypeTreeNode.cs b/ILSpy/TreeNodes/TypeTreeNode.cs index 3ef91c411..8772874fe 100644 --- a/ILSpy/TreeNodes/TypeTreeNode.cs +++ b/ILSpy/TreeNodes/TypeTreeNode.cs @@ -110,7 +110,7 @@ namespace ICSharpCode.ILSpy.TreeNodes public override object Icon => GetIcon(TypeDefinition); - public static ImageSource GetIcon(ITypeDefinition type) + public static object GetIcon(ITypeDefinition type) { return Images.GetIcon(GetTypeIcon(type), GetOverlayIcon(type)); }