2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Reflection;
6 using Tizen.NUI.XamlBinding;
7 using Tizen.NUI.XamlBinding.Internals;
9 namespace Tizen.NUI.Xaml
12 /// The class to provide xaml service.
14 /// <since_tizen> 6 </since_tizen>
15 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
16 [EditorBrowsable(EditorBrowsableState.Never)]
17 public class XamlServiceProvider : IServiceProvider
19 readonly Dictionary<Type, object> services = new Dictionary<Type, object>();
21 internal XamlServiceProvider(INode node, HydrationContext context)
24 if (node != null && node.Parent != null && context.Values.TryGetValue(node.Parent, out targetObject))
25 IProvideValueTarget = new XamlValueTargetProvider(targetObject, node, context, null);
27 IRootObjectProvider = new XamlRootObjectProvider(context.RootElement);
30 IXamlTypeResolver = new XamlTypeResolver(node.NamespaceResolver, XamlParser.GetElementType,
31 context?.RootElement.GetType().GetTypeInfo().Assembly);
34 while (enode != null && !(enode is IElementNode))
37 INameScopeProvider = new NameScopeProvider { NameScope = (enode as IElementNode).Namescope };
40 var xmlLineInfo = node as IXmlLineInfo;
41 if (xmlLineInfo != null)
42 IXmlLineInfoProvider = new XmlLineInfoProvider(xmlLineInfo);
44 IValueConverterProvider = new ValueConverterProvider();
48 /// Create a new XamlServiceProvider.
50 /// <since_tizen> 6 </since_tizen>
51 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
52 [EditorBrowsable(EditorBrowsableState.Never)]
53 public XamlServiceProvider()
55 IValueConverterProvider = new ValueConverterProvider();
58 internal IProvideValueTarget IProvideValueTarget
60 get { return (IProvideValueTarget)GetService(typeof (IProvideValueTarget)); }
61 set { services[typeof (IProvideValueTarget)] = value; }
64 internal IXamlTypeResolver IXamlTypeResolver
66 get { return (IXamlTypeResolver)GetService(typeof (IXamlTypeResolver)); }
67 set { services[typeof (IXamlTypeResolver)] = value; }
70 internal IRootObjectProvider IRootObjectProvider
72 get { return (IRootObjectProvider)GetService(typeof (IRootObjectProvider)); }
73 set { services[typeof (IRootObjectProvider)] = value; }
76 internal IXmlLineInfoProvider IXmlLineInfoProvider
78 get { return (IXmlLineInfoProvider)GetService(typeof (IXmlLineInfoProvider)); }
79 set { services[typeof (IXmlLineInfoProvider)] = value; }
82 internal INameScopeProvider INameScopeProvider
84 get { return (INameScopeProvider)GetService(typeof (INameScopeProvider)); }
85 set { services[typeof (INameScopeProvider)] = value; }
88 internal IValueConverterProvider IValueConverterProvider
90 get { return (IValueConverterProvider)GetService(typeof (IValueConverterProvider)); }
91 set { services[typeof (IValueConverterProvider)] = value; }
97 /// <since_tizen> 6 </since_tizen>
98 [EditorBrowsable(EditorBrowsableState.Never)]
99 public object GetService(Type serviceType)
102 return services.TryGetValue(serviceType, out service) ? service : null;
108 /// <since_tizen> 6 </since_tizen>
109 [EditorBrowsable(EditorBrowsableState.Never)]
110 public void Add(Type type, object service)
112 services.Add(type, service);
116 internal class XamlValueTargetProvider : IProvideParentValues, IProvideValueTarget
118 public XamlValueTargetProvider(object targetObject, INode node, HydrationContext context, object targetProperty)
122 TargetObject = targetObject;
123 TargetProperty = targetProperty;
128 HydrationContext Context { get; }
129 public object TargetObject { get; }
130 public object TargetProperty { get; internal set; } = null;
132 IEnumerable<object> IProvideParentValues.ParentObjects
136 if (Node == null || Context == null)
140 var context = Context;
141 while (n.Parent != null && context != null)
143 if (n.Parent is IElementNode)
145 if (context.Values.TryGetValue(n.Parent, out obj))
149 context = context.ParentContext;
160 /// The class to provide simple value target.
162 /// <since_tizen> 6 </since_tizen>
163 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
164 [EditorBrowsable(EditorBrowsableState.Never)]
165 public class SimpleValueTargetProvider : IProvideParentValues, IProvideValueTarget, IReferenceProvider
167 readonly object[] objectAndParents;
168 readonly object targetProperty;
171 /// Create a new SimpleValueTargetProvider.
173 /// <since_tizen> 6 </since_tizen>
174 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
175 [EditorBrowsable(EditorBrowsableState.Never)]
176 [Obsolete("SimpleValueTargetProvider(object[] objectAndParents) is obsolete as of version 2.3.4. Please use SimpleValueTargetProvider(object[] objectAndParents, object targetProperty) instead.")]
177 public SimpleValueTargetProvider(object[] objectAndParents) : this (objectAndParents, null)
182 /// Create a new SimpleValueTargetProvider.
184 /// <since_tizen> 6 </since_tizen>
185 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
186 [EditorBrowsable(EditorBrowsableState.Never)]
187 public SimpleValueTargetProvider(object[] objectAndParents, object targetProperty)
189 if (objectAndParents == null)
190 throw new ArgumentNullException(nameof(objectAndParents));
191 if (objectAndParents.Length == 0)
192 throw new ArgumentException();
194 this.objectAndParents = objectAndParents;
195 this.targetProperty = targetProperty;
198 IEnumerable<object> IProvideParentValues.ParentObjects
200 get { return objectAndParents; }
203 object IProvideValueTarget.TargetObject
205 get { return objectAndParents[0]; }
208 object IProvideValueTarget.TargetProperty
210 get { return targetProperty; }
214 /// Find target by name.
216 /// <since_tizen> 6 </since_tizen>
217 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
218 [EditorBrowsable(EditorBrowsableState.Never)]
219 public object FindByName(string name)
221 for (var i = 0; i < objectAndParents.Length; i++)
223 var bo = objectAndParents[i] as BindableObject;
224 if (bo == null) continue;
225 var ns = NameScope.GetNameScope(bo) as INameScope;
226 if (ns == null) continue;
227 var value = ns.FindByName(name);
236 /// The class to resolve xaml type.
238 /// <since_tizen> 6 </since_tizen>
239 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
240 [EditorBrowsable(EditorBrowsableState.Never)]
241 public class XamlTypeResolver : IXamlTypeResolver
243 readonly Assembly currentAssembly;
244 readonly GetTypeFromXmlName getTypeFromXmlName;
245 readonly IXmlNamespaceResolver namespaceResolver;
248 /// Create a new XamlTypeResolver.
250 /// <since_tizen> 6 </since_tizen>
251 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
252 [EditorBrowsable(EditorBrowsableState.Never)]
253 public XamlTypeResolver(IXmlNamespaceResolver namespaceResolver, Assembly currentAssembly)
254 : this(namespaceResolver, XamlParser.GetElementType, currentAssembly)
258 internal XamlTypeResolver(IXmlNamespaceResolver namespaceResolver, GetTypeFromXmlName getTypeFromXmlName,
259 Assembly currentAssembly)
261 this.currentAssembly = currentAssembly;
262 if (namespaceResolver == null)
263 throw new ArgumentNullException();
264 if (getTypeFromXmlName == null)
265 throw new ArgumentNullException();
267 this.namespaceResolver = namespaceResolver;
268 this.getTypeFromXmlName = getTypeFromXmlName;
271 Type IXamlTypeResolver.Resolve(string qualifiedTypeName, IServiceProvider serviceProvider)
273 XamlParseException e;
274 var type = Resolve(qualifiedTypeName, serviceProvider, out e);
280 bool IXamlTypeResolver.TryResolve(string qualifiedTypeName, out Type type)
282 XamlParseException exception;
283 type = Resolve(qualifiedTypeName, null, out exception);
284 return exception == null;
287 Type Resolve(string qualifiedTypeName, IServiceProvider serviceProvider, out XamlParseException exception)
290 var split = qualifiedTypeName.Split(':');
291 if (split.Length > 2)
295 if (split.Length == 2)
306 IXmlLineInfo xmlLineInfo = null;
307 if (serviceProvider != null)
309 var lineInfoProvider = serviceProvider.GetService(typeof (IXmlLineInfoProvider)) as IXmlLineInfoProvider;
310 if (lineInfoProvider != null)
311 xmlLineInfo = lineInfoProvider.XmlLineInfo;
314 var namespaceuri = namespaceResolver.LookupNamespace(prefix);
315 if (namespaceuri == null)
317 exception = new XamlParseException(string.Format("No xmlns declaration for prefix \"{0}\"", prefix), xmlLineInfo);
321 return getTypeFromXmlName(new XmlType(namespaceuri, name, null), xmlLineInfo, currentAssembly, out exception);
324 internal delegate Type GetTypeFromXmlName(
325 XmlType xmlType, IXmlLineInfo xmlInfo, Assembly currentAssembly, out XamlParseException exception);
329 /// The class to provide xaml root object.
331 /// <since_tizen> 6 </since_tizen>
332 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
333 [EditorBrowsable(EditorBrowsableState.Never)]
334 public class XamlRootObjectProvider : IRootObjectProvider
337 /// Create a new XamlRootObjectProvider.
339 /// <since_tizen> 6 </since_tizen>
340 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
341 [EditorBrowsable(EditorBrowsableState.Never)]
342 public XamlRootObjectProvider(object rootObject)
344 RootObject = rootObject;
348 /// Attribute RootObject.
350 /// <since_tizen> 6 </since_tizen>
351 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
352 [EditorBrowsable(EditorBrowsableState.Never)]
353 public object RootObject { get; }
357 /// The class to provide xaml line info.
359 /// <since_tizen> 6 </since_tizen>
360 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
361 [EditorBrowsable(EditorBrowsableState.Never)]
362 public class XmlLineInfoProvider : IXmlLineInfoProvider
365 /// Create a new XmlLineInfoProvider.
367 /// <since_tizen> 6 </since_tizen>
368 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
369 [EditorBrowsable(EditorBrowsableState.Never)]
370 public XmlLineInfoProvider(IXmlLineInfo xmlLineInfo)
372 XmlLineInfo = xmlLineInfo;
376 /// Attribute XmlLineInfo.
378 /// <since_tizen> 6 </since_tizen>
379 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
380 [EditorBrowsable(EditorBrowsableState.Never)]
381 public IXmlLineInfo XmlLineInfo { get; }
385 /// The class to provide name scope.
387 /// <since_tizen> 6 </since_tizen>
388 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
389 [EditorBrowsable(EditorBrowsableState.Never)]
390 public class NameScopeProvider : INameScopeProvider
393 /// Attribute NameScope.
395 /// <since_tizen> 6 </since_tizen>
396 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
397 [EditorBrowsable(EditorBrowsableState.Never)]
398 public INameScope NameScope { get; set; }
402 /// The class to resolve xml namespace.
404 /// <since_tizen> 6 </since_tizen>
405 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
406 [EditorBrowsable(EditorBrowsableState.Never)]
407 public class XmlNamespaceResolver : IXmlNamespaceResolver
409 readonly Dictionary<string, string> namespaces = new Dictionary<string, string>();
414 /// <since_tizen> 6 </since_tizen>
415 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
416 [EditorBrowsable(EditorBrowsableState.Never)]
417 public IDictionary<string, string> GetNamespacesInScope(XmlNamespaceScope scope)
419 throw new NotImplementedException();
423 /// Look up name space.
425 /// <since_tizen> 6 </since_tizen>
426 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
427 [EditorBrowsable(EditorBrowsableState.Never)]
428 public string LookupNamespace(string prefix)
431 if (namespaces.TryGetValue(prefix, out result))
439 /// <since_tizen> 6 </since_tizen>
440 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
441 [EditorBrowsable(EditorBrowsableState.Never)]
442 public string LookupPrefix(string namespaceName)
444 throw new NotImplementedException();
448 /// Add prefix and ns.
450 /// <since_tizen> 6 </since_tizen>
451 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
452 [EditorBrowsable(EditorBrowsableState.Never)]
453 public void Add(string prefix, string ns)
455 namespaces.Add(prefix, ns);