Browse Source

Merge branch 'string_resources' of https://github.com/RKlier/ILSpy

pull/263/head
Daniel Grunwald 14 years ago
parent
commit
ac3456888d
  1. 6
      ILSpy.BamlDecompiler/BamlResourceNodeFactory.cs
  2. 26
      ILSpy/Controls/ResourceStringTable.xaml
  3. 51
      ILSpy/Controls/ResourceStringTable.xaml.cs
  4. 6
      ILSpy/ILSpy.csproj
  5. 15
      ILSpy/TreeNodes/ResourceNodes/CursorResourceEntryNode.cs
  6. 2
      ILSpy/TreeNodes/ResourceNodes/IResourceNodeFactory.cs
  7. 18
      ILSpy/TreeNodes/ResourceNodes/ImageResourceEntryNode.cs
  8. 4
      ILSpy/TreeNodes/ResourceNodes/ResourceEntryNode.cs
  9. 31
      ILSpy/TreeNodes/ResourceNodes/ResourcesFileTreeNode.cs
  10. 6
      ILSpy/TreeNodes/ResourceNodes/XamlResourceNode.cs
  11. 10
      ILSpy/TreeNodes/ResourceNodes/XmlResourceNode.cs

6
ILSpy.BamlDecompiler/BamlResourceNodeFactory.cs

@ -18,10 +18,10 @@ namespace ILSpy.BamlDecompiler @@ -18,10 +18,10 @@ namespace ILSpy.BamlDecompiler
return null;
}
public ILSpyTreeNode CreateNode(string key, Stream data)
public ILSpyTreeNode CreateNode(string key, object data)
{
if (key.EndsWith(".baml", StringComparison.OrdinalIgnoreCase))
return new BamlResourceEntryNode(key, data);
if (key.EndsWith(".baml", StringComparison.OrdinalIgnoreCase) && data is Stream)
return new BamlResourceEntryNode(key, (Stream)data);
else
return null;
}

26
ILSpy/Controls/ResourceStringTable.xaml

@ -0,0 +1,26 @@ @@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<UserControl
x:Class="ICSharpCode.ILSpy.Controls.ResourceStringTable" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<UserControl.CommandBindings>
<CommandBinding Command="ApplicationCommands.Copy"
Executed="ExecuteCopy"
CanExecute="CanExecuteCopy"/>
</UserControl.CommandBindings>
<ListView
Name="resourceListView"
SelectionMode="Extended">
<ListView.View>
<GridView
AllowsColumnReorder="False">
<GridView.Columns>
<GridViewColumn
Header="Resource id"
DisplayMemberBinding="{Binding Key}" />
<GridViewColumn
Header="Resource value"
DisplayMemberBinding="{Binding Value}" />
</GridView.Columns>
</GridView>
</ListView.View>
</ListView>
</UserControl>

51
ILSpy/Controls/ResourceStringTable.xaml.cs

@ -0,0 +1,51 @@ @@ -0,0 +1,51 @@
/*
* Created by SharpDevelop.
* User: Ronny Klier
* Date: 31.05.2011
* Time: 00:13
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
using System;
using System.Collections;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
namespace ICSharpCode.ILSpy.Controls
{
/// <summary>
/// Interaction logic for ResourceStringTable.xaml
/// </summary>
public partial class ResourceStringTable : UserControl
{
public ResourceStringTable(IEnumerable strings)
{
InitializeComponent();
// set size to fit decompiler window
// TODO: there should be a more transparent way to do this
MaxWidth = MainWindow.Instance.mainPane.ActualWidth-20;
MaxHeight = MainWindow.Instance.mainPane.ActualHeight-100;
resourceListView.ItemsSource = strings;
}
void ExecuteCopy(object sender, ExecutedRoutedEventArgs args)
{
StringBuilder sb = new StringBuilder();
foreach (var item in resourceListView.SelectedItems)
{
sb.AppendLine(item.ToString());
}
Clipboard.SetText(sb.ToString());
}
void CanExecuteCopy(object sender, CanExecuteRoutedEventArgs args)
{
args.CanExecute = true;
}
}
}

6
ILSpy/ILSpy.csproj

@ -69,6 +69,7 @@ @@ -69,6 +69,7 @@
<Reference Include="System.Data.DataSetExtensions">
<RequiredTargetFramework>3.5</RequiredTargetFramework>
</Reference>
<Reference Include="System.Drawing" />
<Reference Include="System.Xaml">
<RequiredTargetFramework>4.0</RequiredTargetFramework>
</Reference>
@ -136,6 +137,10 @@ @@ -136,6 +137,10 @@
<DependentUpon>OpenFromGacDialog.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="Controls\ResourceStringTable.xaml.cs">
<DependentUpon>ResourceStringTable.xaml</DependentUpon>
<SubType>Code</SubType>
</Compile>
<Compile Include="Options\DecompilerSettingsPanel.xaml.cs">
<DependentUpon>DecompilerSettingsPanel.xaml</DependentUpon>
<SubType>Code</SubType>
@ -251,6 +256,7 @@ @@ -251,6 +256,7 @@
<EmbeddedResource Include="TextView\ILAsm-Mode.xshd" />
</ItemGroup>
<ItemGroup>
<Page Include="Controls\ResourceStringTable.xaml" />
<Page Include="Controls\SearchBoxStyle.xaml">
<DependentUpon>SearchBox.cs</DependentUpon>
</Page>

15
ILSpy/TreeNodes/ResourceNodes/CursorResourceEntryNode.cs

@ -40,11 +40,13 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -40,11 +40,13 @@ namespace ICSharpCode.ILSpy.TreeNodes
return null;
}
public ILSpyTreeNode CreateNode(string key, Stream data)
public ILSpyTreeNode CreateNode(string key, object data)
{
if (!(data is Stream))
return null;
foreach (string fileExt in imageFileExtensions) {
if (key.EndsWith(fileExt, StringComparison.OrdinalIgnoreCase))
return new CursorResourceEntryNode(key, data);
return new CursorResourceEntryNode(key, (Stream)data);
}
return null;
}
@ -71,7 +73,14 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -71,7 +73,14 @@ namespace ICSharpCode.ILSpy.TreeNodes
//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();
MemoryStream s = Data as MemoryStream;
if (null == s)
{
// data was stored in another stream type (e.g. PinnedBufferedMemoryStream)
s = new MemoryStream();
Data.CopyTo(s);
}
byte[] curData = s.ToArray();
curData[2] = 1;
using (Stream stream = new MemoryStream(curData)) {
image.BeginInit();

2
ILSpy/TreeNodes/ResourceNodes/IResourceNodeFactory.cs

@ -28,6 +28,6 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -28,6 +28,6 @@ namespace ICSharpCode.ILSpy.TreeNodes
public interface IResourceNodeFactory
{
ILSpyTreeNode CreateNode(Resource resource);
ILSpyTreeNode CreateNode(string key, Stream data);
ILSpyTreeNode CreateNode(string key, object data);
}
}

18
ILSpy/TreeNodes/ResourceNodes/ImageResourceEntryNode.cs

@ -40,11 +40,25 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -40,11 +40,25 @@ namespace ICSharpCode.ILSpy.TreeNodes
return null;
}
public ILSpyTreeNode CreateNode(string key, Stream data)
public ILSpyTreeNode CreateNode(string key, object data)
{
if (data is System.Drawing.Icon)
{
MemoryStream s = new MemoryStream();
((System.Drawing.Icon)data).Save(s);
return new ImageResourceEntryNode(key, s);
}
else if (data is System.Drawing.Image)
{
MemoryStream s = new MemoryStream();
((System.Drawing.Image)data).Save(s, System.Drawing.Imaging.ImageFormat.Bmp);
return new ImageResourceEntryNode(key, s);
}
if (!(data is Stream))
return null;
foreach (string fileExt in imageFileExtensions) {
if (key.EndsWith(fileExt, StringComparison.OrdinalIgnoreCase))
return new ImageResourceEntryNode(key, data);
return new ImageResourceEntryNode(key, (Stream)data);
}
return null;
}

4
ILSpy/TreeNodes/ResourceNodes/ResourceEntryNode.cs

@ -62,7 +62,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -62,7 +62,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
this.data = data;
}
public static ILSpyTreeNode Create(string key, Stream data)
public static ILSpyTreeNode Create(string key, object data)
{
ILSpyTreeNode result = null;
foreach (var factory in App.CompositionContainer.GetExportedValues<IResourceNodeFactory>()) {
@ -70,7 +70,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -70,7 +70,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
if (result != null)
break;
}
return result ?? new ResourceEntryNode(key, data);
return result ?? new ResourceEntryNode(key, data as Stream);
}
public override void Decompile(Language language, ITextOutput output, DecompilationOptions options)

31
ILSpy/TreeNodes/ResourceNodes/ResourcesFileTreeNode.cs

@ -18,10 +18,15 @@ @@ -18,10 +18,15 @@
using System;
using System.Collections;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel.Composition;
using System.IO;
using System.Linq;
using System.Resources;
using ICSharpCode.Decompiler;
using ICSharpCode.ILSpy.Controls;
using Mono.Cecil;
namespace ICSharpCode.ILSpy.TreeNodes
@ -38,7 +43,7 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -38,7 +43,7 @@ namespace ICSharpCode.ILSpy.TreeNodes
return null;
}
public ILSpyTreeNode CreateNode(string key, Stream data)
public ILSpyTreeNode CreateNode(string key, object data)
{
return null;
}
@ -46,6 +51,8 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -46,6 +51,8 @@ namespace ICSharpCode.ILSpy.TreeNodes
sealed class ResourcesFileTreeNode : ResourceTreeNode
{
ICollection<KeyValuePair<string, string>> filteredEntries = new ObservableCollection<KeyValuePair<string, string>>();
public ResourcesFileTreeNode(EmbeddedResource er)
: base(er)
{
@ -71,12 +78,30 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -71,12 +78,30 @@ namespace ICSharpCode.ILSpy.TreeNodes
return;
}
foreach (DictionaryEntry entry in reader.Cast<DictionaryEntry>().OrderBy(e => e.Key.ToString())) {
if (entry.Value is Stream)
Children.Add(ResourceEntryNode.Create(entry.Key.ToString(), (Stream)entry.Value));
if (entry.Value is String)
filteredEntries.Add(new KeyValuePair<string, string>(entry.Key.ToString(), (string)entry.Value));
else if (entry.Value is byte[])
Children.Add(ResourceEntryNode.Create(entry.Key.ToString(), new MemoryStream((byte[])entry.Value)));
else
Children.Add(ResourceEntryNode.Create(entry.Key.ToString(), entry.Value));
}
}
}
public override void Decompile(Language language, ITextOutput output, DecompilationOptions options)
{
base.Decompile(language, output, options);
if (filteredEntries.Count == 0)
return;
ISmartTextOutput smartOutput = output as ISmartTextOutput;
if (null != smartOutput) {
smartOutput.AddUIElement(
delegate {
return new ResourceStringTable(filteredEntries);
}
);
}
output.WriteLine();
}
}
}

6
ILSpy/TreeNodes/ResourceNodes/XamlResourceNode.cs

@ -35,10 +35,10 @@ namespace ICSharpCode.ILSpy.Xaml @@ -35,10 +35,10 @@ namespace ICSharpCode.ILSpy.Xaml
return null;
}
public ILSpyTreeNode CreateNode(string key, Stream data)
public ILSpyTreeNode CreateNode(string key, object data)
{
if (key.EndsWith(".xaml", StringComparison.OrdinalIgnoreCase))
return new XamlResourceEntryNode(key, data);
if (key.EndsWith(".xaml", StringComparison.OrdinalIgnoreCase) && data is Stream)
return new XamlResourceEntryNode(key, (Stream)data);
else
return null;
}

10
ILSpy/TreeNodes/ResourceNodes/XmlResourceNode.cs

@ -41,12 +41,16 @@ namespace ICSharpCode.ILSpy.Xaml @@ -41,12 +41,16 @@ namespace ICSharpCode.ILSpy.Xaml
return null;
}
public ILSpyTreeNode CreateNode(string key, Stream data)
public ILSpyTreeNode CreateNode(string key, object data)
{
if (!(data is Stream))
return null;
foreach (string fileExt in xmlFileExtensions)
{
if (key.EndsWith(fileExt, StringComparison.OrdinalIgnoreCase))
return new XmlResourceEntryNode(key, data);
return null;
return new XmlResourceEntryNode(key, (Stream)data);
}
return null;
}
}

Loading…
Cancel
Save