2 using System.Collections.Generic;
3 using System.Reflection;
5 using Tizen.NUI.Binding.Internals;
7 namespace Tizen.NUI.Xaml
9 internal class XamlServiceProvider : IServiceProvider
11 readonly Dictionary<Type, object> services = new Dictionary<Type, object>();
13 internal XamlServiceProvider(INode node, HydrationContext context)
16 if (node != null && node.Parent != null && context.Values.TryGetValue(node.Parent, out targetObject))
17 IProvideValueTarget = new XamlValueTargetProvider(targetObject, node, context, null);
19 IRootObjectProvider = new XamlRootObjectProvider(context.RootElement);
22 IXamlTypeResolver = new XamlTypeResolver(node.NamespaceResolver, XamlParser.GetElementType,
23 context?.RootElement.GetType().GetTypeInfo().Assembly);
26 while (enode != null && !(enode is IElementNode))
29 INameScopeProvider = new NameScopeProvider { NameScope = (enode as IElementNode).Namescope };
32 var xmlLineInfo = node as IXmlLineInfo;
33 if (xmlLineInfo != null)
34 IXmlLineInfoProvider = new XmlLineInfoProvider(xmlLineInfo);
36 IValueConverterProvider = new ValueConverterProvider();
39 public XamlServiceProvider()
41 IValueConverterProvider = new ValueConverterProvider();
44 internal IProvideValueTarget IProvideValueTarget
46 get { return (IProvideValueTarget)GetService(typeof (IProvideValueTarget)); }
47 set { services[typeof (IProvideValueTarget)] = value; }
50 internal IXamlTypeResolver IXamlTypeResolver
52 get { return (IXamlTypeResolver)GetService(typeof (IXamlTypeResolver)); }
53 set { services[typeof (IXamlTypeResolver)] = value; }
56 internal IRootObjectProvider IRootObjectProvider
58 get { return (IRootObjectProvider)GetService(typeof (IRootObjectProvider)); }
59 set { services[typeof (IRootObjectProvider)] = value; }
62 internal IXmlLineInfoProvider IXmlLineInfoProvider
64 get { return (IXmlLineInfoProvider)GetService(typeof (IXmlLineInfoProvider)); }
65 set { services[typeof (IXmlLineInfoProvider)] = value; }
68 internal INameScopeProvider INameScopeProvider
70 get { return (INameScopeProvider)GetService(typeof (INameScopeProvider)); }
71 set { services[typeof (INameScopeProvider)] = value; }
74 internal IValueConverterProvider IValueConverterProvider
76 get { return (IValueConverterProvider)GetService(typeof (IValueConverterProvider)); }
77 set { services[typeof (IValueConverterProvider)] = value; }
80 public object GetService(Type serviceType)
83 return services.TryGetValue(serviceType, out service) ? service : null;
86 public void Add(Type type, object service)
88 services.Add(type, service);
92 internal class XamlValueTargetProvider : IProvideParentValues, IProvideValueTarget
94 public XamlValueTargetProvider(object targetObject, INode node, HydrationContext context, object targetProperty)
98 TargetObject = targetObject;
99 TargetProperty = targetProperty;
104 HydrationContext Context { get; }
105 public object TargetObject { get; }
106 public object TargetProperty { get; internal set; } = null;
108 IEnumerable<object> IProvideParentValues.ParentObjects
112 if (Node == null || Context == null)
116 var context = Context;
117 while (n.Parent != null && context != null)
119 if (n.Parent is IElementNode)
121 if (context.Values.TryGetValue(n.Parent, out obj))
125 context = context.ParentContext;
135 internal class SimpleValueTargetProvider : IProvideParentValues, IProvideValueTarget
137 readonly object[] objectAndParents;
138 readonly object targetProperty;
140 [Obsolete("SimpleValueTargetProvider(object[] objectAndParents) is obsolete as of version 2.3.4. Please use SimpleValueTargetProvider(object[] objectAndParents, object targetProperty) instead.")]
141 public SimpleValueTargetProvider(object[] objectAndParents) : this (objectAndParents, null)
145 public SimpleValueTargetProvider(object[] objectAndParents, object targetProperty)
147 if (objectAndParents == null)
148 throw new ArgumentNullException(nameof(objectAndParents));
149 if (objectAndParents.Length == 0)
150 throw new ArgumentException();
152 this.objectAndParents = objectAndParents;
153 this.targetProperty = targetProperty;
156 IEnumerable<object> IProvideParentValues.ParentObjects
158 get { return objectAndParents; }
161 object IProvideValueTarget.TargetObject
163 get { return objectAndParents[0]; }
166 object IProvideValueTarget.TargetProperty
168 get { return targetProperty; }
172 internal class XamlTypeResolver : IXamlTypeResolver
174 readonly Assembly currentAssembly;
175 readonly GetTypeFromXmlName getTypeFromXmlName;
176 readonly IXmlNamespaceResolver namespaceResolver;
178 public XamlTypeResolver(IXmlNamespaceResolver namespaceResolver, Assembly currentAssembly)
179 : this(namespaceResolver, XamlParser.GetElementType, currentAssembly)
183 internal XamlTypeResolver(IXmlNamespaceResolver namespaceResolver, GetTypeFromXmlName getTypeFromXmlName,
184 Assembly currentAssembly)
186 this.currentAssembly = currentAssembly;
187 if (namespaceResolver == null)
188 throw new ArgumentNullException();
189 if (getTypeFromXmlName == null)
190 throw new ArgumentNullException();
192 this.namespaceResolver = namespaceResolver;
193 this.getTypeFromXmlName = getTypeFromXmlName;
196 Type IXamlTypeResolver.Resolve(string qualifiedTypeName, IServiceProvider serviceProvider)
198 XamlParseException e;
199 var type = Resolve(qualifiedTypeName, serviceProvider, out e);
205 bool IXamlTypeResolver.TryResolve(string qualifiedTypeName, out Type type)
207 XamlParseException exception;
208 type = Resolve(qualifiedTypeName, null, out exception);
209 return exception == null;
212 Type Resolve(string qualifiedTypeName, IServiceProvider serviceProvider, out XamlParseException exception)
215 var split = qualifiedTypeName.Split(':');
216 if (split.Length > 2)
220 if (split.Length == 2)
231 IXmlLineInfo xmlLineInfo = null;
232 if (serviceProvider != null)
234 var lineInfoProvider = serviceProvider.GetService(typeof (IXmlLineInfoProvider)) as IXmlLineInfoProvider;
235 if (lineInfoProvider != null)
236 xmlLineInfo = lineInfoProvider.XmlLineInfo;
239 var namespaceuri = namespaceResolver.LookupNamespace(prefix);
240 if (namespaceuri == null)
242 exception = new XamlParseException(string.Format("No xmlns declaration for prefix \"{0}\"", prefix), xmlLineInfo);
246 return getTypeFromXmlName(new XmlType(namespaceuri, name, null), xmlLineInfo, currentAssembly, out exception);
249 internal delegate Type GetTypeFromXmlName(
250 XmlType xmlType, IXmlLineInfo xmlInfo, Assembly currentAssembly, out XamlParseException exception);
253 internal class XamlRootObjectProvider : IRootObjectProvider
255 public XamlRootObjectProvider(object rootObject)
257 RootObject = rootObject;
260 public object RootObject { get; }
263 internal class XmlLineInfoProvider : IXmlLineInfoProvider
265 public XmlLineInfoProvider(IXmlLineInfo xmlLineInfo)
267 XmlLineInfo = xmlLineInfo;
270 public IXmlLineInfo XmlLineInfo { get; }
273 internal class NameScopeProvider : INameScopeProvider
275 public INameScope NameScope { get; set; }
278 internal class XmlNamespaceResolver : IXmlNamespaceResolver
280 readonly Dictionary<string, string> namespaces = new Dictionary<string, string>();
282 public IDictionary<string, string> GetNamespacesInScope(XmlNamespaceScope scope)
284 throw new NotImplementedException();
287 public string LookupNamespace(string prefix)
290 if (namespaces.TryGetValue(prefix, out result))
295 public string LookupPrefix(string namespaceName)
297 throw new NotImplementedException();
300 public void Add(string prefix, string ns)
302 namespaces.Add(prefix, ns);