[NUI] Change GetDefaultWindow() to static func (#900)
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / public / Xaml / MarkupExtensions / StaticExtension.cs
1 using System;
2 using System.ComponentModel;
3 using System.Linq;
4 using System.Reflection;
5 using System.Xml;
6 using Tizen.NUI.Binding;
7
8 namespace Tizen.NUI.Xaml
9 {
10     /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
11     [EditorBrowsable(EditorBrowsableState.Never)]
12     [ContentProperty(nameof(Member))]
13     [ProvideCompiled("Tizen.NUI.Xaml.Build.Tasks.StaticExtension")]
14     public class StaticExtension : IMarkupExtension
15     {
16         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
17         [EditorBrowsable(EditorBrowsableState.Never)]
18         public string Member { get; set; }
19
20         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
21         [EditorBrowsable(EditorBrowsableState.Never)]
22         public object ProvideValue(IServiceProvider serviceProvider)
23         {
24             IXmlLineInfoProvider lineInfoProvider;
25             IXmlLineInfo lineInfo;
26
27             if (serviceProvider == null)
28                 throw new ArgumentNullException(nameof(serviceProvider));
29             var typeResolver = serviceProvider.GetService(typeof (IXamlTypeResolver)) as IXamlTypeResolver;
30             if (typeResolver == null)
31                 throw new ArgumentException("No IXamlTypeResolver in IServiceProvider");
32
33             if (string.IsNullOrEmpty(Member) || !Member.Contains("."))
34             {
35                 lineInfoProvider = serviceProvider.GetService(typeof (IXmlLineInfoProvider)) as IXmlLineInfoProvider;
36                 lineInfo = (lineInfoProvider != null) ? lineInfoProvider.XmlLineInfo : new XmlLineInfo();
37                 throw new XamlParseException("Syntax for x:Static is [Member=][prefix:]typeName.staticMemberName", lineInfo);
38             }
39
40             var dotIdx = Member.LastIndexOf('.');
41             var typename = Member.Substring(0, dotIdx);
42             var membername = Member.Substring(dotIdx + 1);
43
44             var type = typeResolver.Resolve(typename, serviceProvider);
45
46             var pinfo = type.GetRuntimeProperties().FirstOrDefault(pi => pi.GetMethod != null && pi.Name == membername && pi.GetMethod.IsStatic);
47             if (pinfo != null)
48                 return pinfo.GetMethod?.Invoke(null, Array.Empty<object>());
49
50             var finfo = type.GetRuntimeFields().FirstOrDefault(fi => fi.Name == membername && fi.IsStatic);
51             if (finfo != null)
52                 return finfo.GetValue(null);
53
54             lineInfoProvider = serviceProvider.GetService(typeof (IXmlLineInfoProvider)) as IXmlLineInfoProvider;
55             lineInfo = (lineInfoProvider != null) ? lineInfoProvider.XmlLineInfo : new XmlLineInfo();
56             throw new XamlParseException($"No static member found for {Member}", lineInfo);
57         }
58     }
59 }