diff --git a/ILSpy/TreeNodes/ResourceNodes/CursorResourceEntryNode.cs b/ILSpy/TreeNodes/ResourceNodes/CursorResourceEntryNode.cs new file mode 100644 index 000000000..3a5b41b75 --- /dev/null +++ b/ILSpy/TreeNodes/ResourceNodes/CursorResourceEntryNode.cs @@ -0,0 +1,95 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.ComponentModel.Composition; +using System.IO; +using System.Windows.Controls; +using System.Windows.Media.Imaging; +using ICSharpCode.ILSpy.TextView; +using Mono.Cecil; + +namespace ICSharpCode.ILSpy.TreeNodes +{ + [Export(typeof(IResourceNodeFactory))] + sealed class CursorResourceNodeFactory : IResourceNodeFactory + { + static readonly string[] imageFileExtensions = { ".cur" }; + + public ILSpyTreeNode CreateNode(Mono.Cecil.Resource resource) + { + EmbeddedResource er = resource as EmbeddedResource; + if (er != null) { + return CreateNode(er.Name, er.GetResourceStream()); + } + return null; + } + + public ILSpyTreeNode CreateNode(string key, Stream data) + { + foreach (string fileExt in imageFileExtensions) { + if (key.EndsWith(fileExt, StringComparison.OrdinalIgnoreCase)) + return new CursorResourceEntryNode(key, data); + } + return null; + } + } + + sealed class CursorResourceEntryNode : ResourceEntryNode + { + public CursorResourceEntryNode(string key, Stream data) + : base(key, data) + { + } + + public override object Icon + { + get { return Images.ResourceImage; } + } + + internal override bool View(DecompilerTextView textView) + { + try { + AvalonEditTextOutput output = new AvalonEditTextOutput(); + Data.Position = 0; + BitmapImage image = new BitmapImage(); + + //HACK: windows imaging does not understand that .cur files have the same layout as .ico + // so load to data, and modify the ResourceType in the header to make look like an icon... + byte[] curData = ((MemoryStream)Data).ToArray(); + curData[2] = 1; + using (Stream stream = new MemoryStream(curData)) { + image.BeginInit(); + image.StreamSource = stream; + image.EndInit(); + } + + output.AddUIElement(() => new Image { Source = image }); + output.WriteLine(); + output.AddButton(Images.Save, "Save", delegate { + Save(null); + }); + textView.ShowNode(output, this, null); + return true; + } + catch (Exception) { + return false; + } + } + } +} diff --git a/ILSpy/TreeNodes/ResourceNodes/ImageResourceEntryNode.cs b/ILSpy/TreeNodes/ResourceNodes/ImageResourceEntryNode.cs new file mode 100644 index 000000000..b333378ab --- /dev/null +++ b/ILSpy/TreeNodes/ResourceNodes/ImageResourceEntryNode.cs @@ -0,0 +1,87 @@ +// Copyright (c) 2011 AlphaSierraPapa for the SharpDevelop Team +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of this +// software and associated documentation files (the "Software"), to deal in the Software +// without restriction, including without limitation the rights to use, copy, modify, merge, +// publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons +// to whom the Software is furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all copies or +// substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR +// PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE +// FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +// DEALINGS IN THE SOFTWARE. + +using System; +using System.ComponentModel.Composition; +using System.IO; +using System.Windows.Controls; +using System.Windows.Media.Imaging; +using ICSharpCode.ILSpy.TextView; +using Mono.Cecil; + +namespace ICSharpCode.ILSpy.TreeNodes +{ + [Export(typeof(IResourceNodeFactory))] + sealed class ImageResourceNodeFactory : IResourceNodeFactory + { + static readonly string[] imageFileExtensions = { ".png", ".gif", ".bmp", ".jpg", ".ico" }; + + public ILSpyTreeNode CreateNode(Mono.Cecil.Resource resource) + { + EmbeddedResource er = resource as EmbeddedResource; + if (er != null) { + return CreateNode(er.Name, er.GetResourceStream()); + } + return null; + } + + public ILSpyTreeNode CreateNode(string key, Stream data) + { + foreach (string fileExt in imageFileExtensions) { + if (key.EndsWith(fileExt, StringComparison.OrdinalIgnoreCase)) + return new ImageResourceEntryNode(key, data); + } + return null; + } + } + + sealed class ImageResourceEntryNode : ResourceEntryNode + { + public ImageResourceEntryNode(string key, Stream data) + : base(key, data) + { + } + + public override object Icon + { + get { return Images.ResourceImage; } + } + + internal override bool View(DecompilerTextView textView) + { + try { + AvalonEditTextOutput output = new AvalonEditTextOutput(); + Data.Position = 0; + BitmapImage image = new BitmapImage(); + image.BeginInit(); + image.StreamSource = Data; + image.EndInit(); + output.AddUIElement(() => new Image { Source = image }); + output.WriteLine(); + output.AddButton(Images.Save, "Save", delegate { + Save(null); + }); + textView.ShowNode(output, this, null); + return true; + } + catch (Exception) { + return false; + } + } + } +} diff --git a/ILSpy/TreeNodes/ResourceNodes/ResourceEntryNode.cs b/ILSpy/TreeNodes/ResourceNodes/ResourceEntryNode.cs index e4b165680..7a077da2d 100644 --- a/ILSpy/TreeNodes/ResourceNodes/ResourceEntryNode.cs +++ b/ILSpy/TreeNodes/ResourceNodes/ResourceEntryNode.cs @@ -91,61 +91,4 @@ namespace ICSharpCode.ILSpy.TreeNodes return true; } } - - [Export(typeof(IResourceNodeFactory))] - sealed class ImageResourceNodeFactory : IResourceNodeFactory - { - static readonly string[] imageFileExtensions = { ".png", ".gif", ".bmp", ".jpg", ".ico" }; - - public ILSpyTreeNode CreateNode(Mono.Cecil.Resource resource) - { - EmbeddedResource er = resource as EmbeddedResource; - if (er != null) { - return CreateNode(er.Name, er.GetResourceStream()); - } - return null; - } - - public ILSpyTreeNode CreateNode(string key, Stream data) - { - foreach (string fileExt in imageFileExtensions) { - if (key.EndsWith(fileExt, StringComparison.OrdinalIgnoreCase)) - return new ImageResourceEntryNode(key, data); - } - return null; - } - } - - sealed class ImageResourceEntryNode : ResourceEntryNode - { - public ImageResourceEntryNode(string key, Stream data) - : base(key, data) - { - } - - public override object Icon - { - get { return Images.ResourceImage; } - } - - internal override bool View(DecompilerTextView textView) - { - try { - AvalonEditTextOutput output = new AvalonEditTextOutput(); - Data.Position = 0; - BitmapImage image = new BitmapImage(); - image.BeginInit(); - image.StreamSource = Data; - image.EndInit(); - output.AddUIElement(() => new Image { Source = image }); - output.WriteLine(); - output.AddButton(Images.Save, "Save", delegate { Save(null); }); - textView.ShowNode(output, this, null); - return true; - } - catch (Exception) { - return false; - } - } - } -} +} \ No newline at end of file