JD2022-TU1/main/tools/framework/JD.TeaBoxAddinSystem/Addins/Description/ModuleResources.cs

246 lines
7.1 KiB
C#

using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Globalization;
using System.IO;
using System.Resources;
using JD.TeaBoxAddinSystem.Addins.Description.FileReferences;
using JD.WinFormExtensions;
namespace JD.TeaBoxAddinSystem.Addins.Description
{
/// <summary>
/// Module resources.
/// </summary>
internal class ModuleResources : IResources
{
#region Variables
private readonly Module m_owner;
#endregion
#region Constructor
/// <summary>
/// Constructor.
/// </summary>
/// <param name="owner"></param>
internal ModuleResources(Module owner)
{
System.Diagnostics.Debug.Assert(owner != null);
m_owner = owner;
}
#endregion
#region Properties
/// <summary>
/// All Resources.
/// </summary>
public IEnumerable<KeyValuePair<string, object>> AllResources
{
get
{
foreach (AssemblyFileReference assembly in m_owner.Assemblies)
{
foreach (ResourceFileReference resource in assembly.ResourceFiles)
{
ResourceManager resourceManager = resource.Resources;
if (resourceManager != null)
{
ResourceSet resourceSet = resourceManager.GetResourceSet(CultureInfo.InvariantCulture, true, false);
if (resourceSet != null)
{
foreach (DictionaryEntry de in resourceSet)
{
yield return new KeyValuePair<string, object>(de.Key.ToString(), de.Value);
}
}
}
}
}
foreach (ResourceFileReference resource in m_owner.ResourceFiles)
{
ResourceManager resourceManager = resource.Resources;
if (resourceManager != null)
{
ResourceSet resourceSet = resourceManager.GetResourceSet(CultureInfo.InvariantCulture, true, false);
if (resourceSet != null)
{
foreach (DictionaryEntry de in resourceSet)
{
yield return new KeyValuePair<string, object>(de.Key.ToString(), de.Value);
}
}
}
}
}
}
#endregion
#region Methods
public object GetObject(string name)
{
if (string.IsNullOrEmpty(name))
{
return null;
}
object o;
foreach (AssemblyFileReference assembly in m_owner.Assemblies)
{
foreach (ResourceFileReference resource in assembly.ResourceFiles)
{
ResourceManager resourceManager = resource.Resources;
o = resourceManager != null ? resourceManager.GetObject(name) : null;
if (o != null)
{
return o;
}
}
}
foreach (ResourceFileReference resource in m_owner.ResourceFiles)
{
ResourceManager resourceManager = resource.Resources;
o = resourceManager != null ? resourceManager.GetObject(name) : null;
if (o != null)
{
return o;
}
}
// Not found, look in main module
if (m_owner.Addin != null && !m_owner.IsMainModule)
{
o = m_owner.Addin.MainModule.InternalResources.GetObject(name);
if (o != null)
{
return o;
}
}
// Not found, look in dependent addins
foreach (Module dependencyModule in AddinManager.SessionService.GetLoadedDependencies(m_owner))
{
o = dependencyModule.InternalResources.GetObject(name);
if (o != null)
{
return o;
}
}
return null;
}
public ImageOrIcon GetImageOrIcon(string name)
{
if (string.IsNullOrEmpty(name))
return null;
ImageOrIcon image = GDIObjectManager.Instance.GetImageOrIcon(name);
if (image != null)
return image;
object o = GetObject(name);
if (o is Bitmap)
{
GDIObjectManager.Instance.Register(name, (Bitmap)o);
return GetImageOrIcon(name);
}
else if (o is Icon)
{
GDIObjectManager.Instance.Register(name, (Icon)o);
return GetImageOrIcon(name);
}
else
{
return null;
}
}
public Bitmap GetImage(string name)
{
if (string.IsNullOrEmpty(name))
return null;
Bitmap image = GDIObjectManager.Instance.GetBitmap(name);
if (image != null)
return image;
object o = GetObject(name);
if (o is Bitmap)
{
GDIObjectManager.Instance.Register(name, (Bitmap)o);
return GetImage(name);
}
else if (o is Icon)
{
GDIObjectManager.Instance.Register(name, (Icon)o);
return GetImage(name);
}
else
{
return null;
}
}
public Icon GetIcon(string name)
{
if (string.IsNullOrEmpty(name))
return null;
Icon icon = GDIObjectManager.Instance.GetIcon(name);
if (icon != null)
return icon;
object o = GetObject(name);
if (o is Bitmap)
{
GDIObjectManager.Instance.Register(name, (Bitmap)o);
return GetIcon(name);
}
else if (o is Icon)
{
GDIObjectManager.Instance.Register(name, (Icon)o);
return GetIcon(name);
}
else
{
return null;
}
}
public string GetString(string name)
{
object o = GetObject(name);
return o == null ? null : o.ToString();
}
public Stream Open(string name)
{
object o = GetObject(name);
Stream stream = o as Stream;
if (stream == null && o is byte[])
{
byte[] array = (byte[])o;
stream = new MemoryStream(array);
}
return stream;
}
#endregion
}
}