[NUI]Add xaml support for nui and nui xaml test sample (#230)
[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 }