Follow formatting NUI
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / internal / Xaml / MarkupExtensionParser.cs
1 using System;
2 using System.Reflection;
3 using Tizen.NUI.Binding;
4
5 namespace Tizen.NUI.Xaml
6 {
7     internal sealed class MarkupExtensionParser : MarkupExpressionParser, IExpressionParser<object>
8     {
9         IMarkupExtension markupExtension;
10
11         public object Parse(string match, ref string remaining, IServiceProvider serviceProvider)
12         {
13             var typeResolver = serviceProvider.GetService(typeof(IXamlTypeResolver)) as IXamlTypeResolver;
14
15             //shortcut for Binding and StaticResource, to avoid too many reflection calls.
16             if (match == "Binding")
17                 markupExtension = new BindingExtension();
18             else if (match == "TemplateBinding")
19                 markupExtension = new TemplateBindingExtension();
20             else if (match == "StaticResource")
21                 markupExtension = new StaticResourceExtension();
22             else
23             {
24                 if (typeResolver == null)
25                     return null;
26                 Type type;
27
28                 //The order of lookup is to look for the Extension-suffixed class name first and then look for the class name without the Extension suffix.
29                 if (!typeResolver.TryResolve(match + "Extension", out type) && !typeResolver.TryResolve(match, out type))
30                 {
31                     var lineInfoProvider = serviceProvider.GetService(typeof(IXmlLineInfoProvider)) as IXmlLineInfoProvider;
32                     var lineInfo = (lineInfoProvider != null) ? lineInfoProvider.XmlLineInfo : new XmlLineInfo();
33                     throw new XamlParseException(String.Format("MarkupExtension not found for {0}", match), lineInfo);
34                 }
35                 markupExtension = Activator.CreateInstance(type) as IMarkupExtension;
36             }
37
38             if (markupExtension == null)
39             {
40                 var lineInfoProvider = serviceProvider.GetService(typeof(IXmlLineInfoProvider)) as IXmlLineInfoProvider;
41                 var lineInfo = (lineInfoProvider != null) ? lineInfoProvider.XmlLineInfo : new XmlLineInfo();
42                 throw new XamlParseException(String.Format("Missing public default constructor for MarkupExtension {0}", match),
43                     lineInfo);
44             }
45
46             char next;
47             if (remaining == "}")
48                 return markupExtension.ProvideValue(serviceProvider);
49
50             string piece;
51             while ((piece = GetNextPiece(ref remaining, out next)) != null)
52                 HandleProperty(piece, serviceProvider, ref remaining, next != '=');
53
54             return markupExtension.ProvideValue(serviceProvider);
55         }
56
57         protected override void SetPropertyValue(string prop, string strValue, object value, IServiceProvider serviceProvider)
58         {
59             MethodInfo setter;
60             if (prop == null)
61             {
62                 //implicit property
63                 var t = markupExtension.GetType();
64                 prop = ApplyPropertiesVisitor.GetContentPropertyName(t.GetTypeInfo());
65                 if (prop == null)
66                     return;
67                 setter = t.GetRuntimeProperty(prop)?.SetMethod;
68             }
69             else
70                 setter = markupExtension.GetType().GetRuntimeProperty(prop)?.SetMethod;
71
72             if (value == null && strValue != null)
73             {
74                 value = strValue.ConvertTo(markupExtension.GetType().GetRuntimeProperty(prop)?.PropertyType,
75                     (Func<TypeConverter>)null, serviceProvider);
76             }
77
78             setter?.Invoke(markupExtension, new[] { value });
79         }
80     }
81 }