Add ScriptUI to support XAML file (#320)
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / internal / XamlBinding / ResourcesExtensions.cs
1 using System;
2 using System.Collections.Generic;
3
4 namespace Tizen.NUI.Binding
5 {
6     internal static class ResourcesExtensions
7     {
8         public static IEnumerable<KeyValuePair<string, object>> GetMergedResources(this IElement element)
9         {
10             Dictionary<string, object> resources = null;
11             while (element != null)
12             {
13                 var ve = element as IResourcesProvider;
14                 if (ve != null && ve.IsResourcesCreated)
15                 {
16                     resources = resources ?? new Dictionary<string, object>();
17                     foreach (KeyValuePair<string, object> res in ve.Resources.MergedResources)
18                         if (!resources.ContainsKey(res.Key))
19                             resources.Add(res.Key, res.Value);
20                         else if (res.Key.StartsWith(Style.StyleClassPrefix, StringComparison.Ordinal))
21                         {
22                             var mergedClassStyles = new List<Style>(resources[res.Key] as List<Style>);
23                             mergedClassStyles.AddRange(res.Value as List<Style>);
24                             resources[res.Key] = mergedClassStyles;
25                         }
26                 }
27                 var app = element as Application;
28                 if (app != null && app.SystemResources != null)
29                 {
30                     resources = resources ?? new Dictionary<string, object>(8);
31                     foreach (KeyValuePair<string, object> res in app.SystemResources)
32                         if (!resources.ContainsKey(res.Key))
33                             resources.Add(res.Key, res.Value);
34                         else if (res.Key.StartsWith(Style.StyleClassPrefix, StringComparison.Ordinal))
35                         {
36                             var mergedClassStyles = new List<Style>(resources[res.Key] as List<Style>);
37                             mergedClassStyles.AddRange(res.Value as List<Style>);
38                             resources[res.Key] = mergedClassStyles;
39                         }
40                 }
41                 element = element.Parent;
42             }
43             return resources;
44         }
45
46         public static bool TryGetResource(this IElement element, string key, out object value)
47         {
48             while (element != null)
49             {
50                 var ve = element as IResourcesProvider;
51                 if (ve != null && ve.IsResourcesCreated && ve.Resources.TryGetValue(key, out value))
52                     return true;
53                 var app = element as Application;
54                 if (app != null && app.SystemResources != null && app.SystemResources.TryGetValue(key, out value))
55                     return true;
56                 element = element.Parent;
57             }
58
59             //Fallback for the XF previewer
60             if (Application.Current != null && ((IResourcesProvider)Application.Current).IsResourcesCreated && Application.Current.Resources.TryGetValue(key, out value))
61                 return true;
62
63             value = null;
64             return false;
65         }
66     }
67 }