2 using System.Reflection;
3 using Tizen.NUI.Binding;
5 namespace Tizen.NUI.Xaml
7 internal sealed class MarkupExtensionParser : MarkupExpressionParser, IExpressionParser<object>
9 IMarkupExtension markupExtension;
11 public object Parse(string match, ref string remaining, IServiceProvider serviceProvider)
13 var typeResolver = serviceProvider.GetService(typeof (IXamlTypeResolver)) as IXamlTypeResolver;
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();
24 if (typeResolver == null)
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))
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);
35 markupExtension = Activator.CreateInstance(type) as IMarkupExtension;
38 if (markupExtension == null)
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),
48 return markupExtension.ProvideValue(serviceProvider);
51 while ((piece = GetNextPiece(ref remaining, out next)) != null)
52 HandleProperty(piece, serviceProvider, ref remaining, next != '=');
54 return markupExtension.ProvideValue(serviceProvider);
57 protected override void SetPropertyValue(string prop, string strValue, object value, IServiceProvider serviceProvider)
63 var t = markupExtension.GetType();
64 prop = ApplyPropertiesVisitor.GetContentPropertyName(t.GetTypeInfo());
67 setter = t.GetRuntimeProperty(prop).SetMethod;
70 setter = markupExtension.GetType().GetRuntimeProperty(prop).SetMethod;
72 if (value == null && strValue != null)
74 value = strValue.ConvertTo(markupExtension.GetType().GetRuntimeProperty(prop).PropertyType,
75 (Func<TypeConverter>)null, serviceProvider);
78 setter.Invoke(markupExtension, new[] { value });