using WPFluent.Extensions;
using System.Collections.ObjectModel;
namespace WPFluent.Appearance;
///
/// Allows managing application dictionaries.
///
internal class ResourceDictionaryManager
{
public ResourceDictionaryManager(string searchNamespace) { SearchNamespace = searchNamespace; }
private Collection GetApplicationMergedDictionaries()
{ return UiApplication.Current.Resources.MergedDictionaries; }
///
/// Gets the if exists.
///
/// Any part of the resource name.
/// , if it doesn't exist.
public ResourceDictionary? GetDictionary(string resourceLookup)
{
Collection applicationDictionaries = GetApplicationMergedDictionaries();
if (applicationDictionaries.Count == 0)
{
return null;
}
foreach (ResourceDictionary t in applicationDictionaries)
{
string resourceDictionaryUri;
if (t?.Source != null)
{
resourceDictionaryUri = t.Source.ToString();
if (resourceDictionaryUri.Contains(SearchNamespace, StringComparison.OrdinalIgnoreCase) &&
resourceDictionaryUri.Contains(resourceLookup, StringComparison.OrdinalIgnoreCase))
{
return t;
}
}
foreach (ResourceDictionary? t1 in t!.MergedDictionaries)
{
if (t1?.Source == null)
{
continue;
}
resourceDictionaryUri = t1.Source.ToString();
if (!resourceDictionaryUri.Contains(SearchNamespace, StringComparison.OrdinalIgnoreCase) ||
!resourceDictionaryUri.Contains(resourceLookup, StringComparison.OrdinalIgnoreCase))
{
continue;
}
return t1;
}
}
return null;
}
///
/// Shows whether the application contains the .
///
/// Any part of the resource name.
/// if it doesn't exist.
public bool HasDictionary(string resourceLookup) { return GetDictionary(resourceLookup) != null; }
///
/// Shows whether the application contains the .
///
/// Any part of the resource name.
/// A valid for the replaced resource.
/// if the dictionary was updated. otherwise.
public bool UpdateDictionary(string resourceLookup, Uri? newResourceUri)
{
Collection applicationDictionaries = UiApplication
.Current
.Resources
.MergedDictionaries;
if (applicationDictionaries.Count == 0 || newResourceUri is null)
{
return false;
}
for (var i = 0; i < applicationDictionaries.Count; i++)
{
string sourceUri;
if (applicationDictionaries[i]?.Source != null)
{
sourceUri = applicationDictionaries[i].Source.ToString();
if (sourceUri.Contains(SearchNamespace, StringComparison.OrdinalIgnoreCase) &&
sourceUri.Contains(resourceLookup, StringComparison.OrdinalIgnoreCase))
{
applicationDictionaries[i] = new() { Source = newResourceUri };
return true;
}
}
for (var j = 0; j < applicationDictionaries[i].MergedDictionaries.Count; j++)
{
if (applicationDictionaries[i].MergedDictionaries[j]?.Source == null)
{
continue;
}
sourceUri = applicationDictionaries[i].MergedDictionaries[j].Source.ToString();
if (!sourceUri.Contains(SearchNamespace, StringComparison.OrdinalIgnoreCase) ||
!sourceUri.Contains(resourceLookup, StringComparison.OrdinalIgnoreCase))
{
continue;
}
applicationDictionaries[i].MergedDictionaries[j] = new() { Source = newResourceUri };
return true;
}
}
return false;
}
///
/// Gets the namespace, e.g. the library the resource is being searched for.
///
public string SearchNamespace { get; }
}