2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Reflection;
6 using Tizen.NUI.Binding;
7 using Tizen.NUI.Binding.Internals;
9 namespace Tizen.NUI.Xaml
11 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
12 [EditorBrowsable(EditorBrowsableState.Never)]
13 public class XamlServiceProvider : IServiceProvider
15 readonly Dictionary<Type, object> services = new Dictionary<Type, object>();
17 internal XamlServiceProvider(INode node, HydrationContext context)
20 if (node != null && node.Parent != null && context.Values.TryGetValue(node.Parent, out targetObject))
21 IProvideValueTarget = new XamlValueTargetProvider(targetObject, node, context, null);
23 IRootObjectProvider = new XamlRootObjectProvider(context.RootElement);
26 IXamlTypeResolver = new XamlTypeResolver(node.NamespaceResolver, XamlParser.GetElementType,
27 context?.RootElement.GetType().GetTypeInfo().Assembly);
29 Add(typeof(IReferenceProvider), new ReferenceProvider(node));
32 var xmlLineInfo = node as IXmlLineInfo;
33 if (xmlLineInfo != null)
34 IXmlLineInfoProvider = new XmlLineInfoProvider(xmlLineInfo);
36 IValueConverterProvider = new ValueConverterProvider();
39 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
40 [EditorBrowsable(EditorBrowsableState.Never)]
41 public XamlServiceProvider()
43 IValueConverterProvider = new ValueConverterProvider();
46 internal IProvideValueTarget IProvideValueTarget
48 get { return (IProvideValueTarget)GetService(typeof (IProvideValueTarget)); }
49 set { services[typeof (IProvideValueTarget)] = value; }
52 internal IXamlTypeResolver IXamlTypeResolver
54 get { return (IXamlTypeResolver)GetService(typeof (IXamlTypeResolver)); }
55 set { services[typeof (IXamlTypeResolver)] = value; }
58 internal IRootObjectProvider IRootObjectProvider
60 get { return (IRootObjectProvider)GetService(typeof (IRootObjectProvider)); }
61 set { services[typeof (IRootObjectProvider)] = value; }
64 internal IXmlLineInfoProvider IXmlLineInfoProvider
66 get { return (IXmlLineInfoProvider)GetService(typeof (IXmlLineInfoProvider)); }
67 set { services[typeof (IXmlLineInfoProvider)] = value; }
70 internal INameScopeProvider INameScopeProvider
72 get { return (INameScopeProvider)GetService(typeof (INameScopeProvider)); }
73 set { services[typeof (INameScopeProvider)] = value; }
76 internal IValueConverterProvider IValueConverterProvider
78 get { return (IValueConverterProvider)GetService(typeof (IValueConverterProvider)); }
79 set { services[typeof (IValueConverterProvider)] = value; }
82 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
83 [EditorBrowsable(EditorBrowsableState.Never)]
84 public object GetService(Type serviceType)
87 return services.TryGetValue(serviceType, out service) ? service : null;
90 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
91 [EditorBrowsable(EditorBrowsableState.Never)]
92 public void Add(Type type, object service)
94 services.Add(type, service);
98 internal class XamlValueTargetProvider : IProvideParentValues, IProvideValueTarget
100 public XamlValueTargetProvider(object targetObject, INode node, HydrationContext context, object targetProperty)
104 TargetObject = targetObject;
105 TargetProperty = targetProperty;
110 HydrationContext Context { get; }
111 public object TargetObject { get; }
112 public object TargetProperty { get; internal set; } = null;
114 IEnumerable<object> IProvideParentValues.ParentObjects
118 if (Node == null || Context == null)
122 var context = Context;
123 while (n.Parent != null && context != null)
125 if (n.Parent is IElementNode)
127 if (context.Values.TryGetValue(n.Parent, out obj))
131 context = context.ParentContext;
141 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
142 [EditorBrowsable(EditorBrowsableState.Never)]
143 public class SimpleValueTargetProvider : IProvideParentValues, IProvideValueTarget, IReferenceProvider
145 readonly object[] objectAndParents;
146 readonly object targetProperty;
148 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
149 [EditorBrowsable(EditorBrowsableState.Never)]
150 [Obsolete("SimpleValueTargetProvider(object[] objectAndParents) is obsolete as of version 2.3.4. Please use SimpleValueTargetProvider(object[] objectAndParents, object targetProperty) instead.")]
151 public SimpleValueTargetProvider(object[] objectAndParents) : this (objectAndParents, null)
155 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
156 [EditorBrowsable(EditorBrowsableState.Never)]
157 public SimpleValueTargetProvider(object[] objectAndParents, object targetProperty)
159 if (objectAndParents == null)
160 throw new ArgumentNullException(nameof(objectAndParents));
161 if (objectAndParents.Length == 0)
162 throw new ArgumentException();
164 this.objectAndParents = objectAndParents;
165 this.targetProperty = targetProperty;
168 IEnumerable<object> IProvideParentValues.ParentObjects
171 object IProvideValueTarget.TargetObject
172 => objectAndParents[0];
174 object IProvideValueTarget.TargetProperty
177 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
178 [EditorBrowsable(EditorBrowsableState.Never)]
179 public object FindByName(string name)
181 for (var i = 0; i < objectAndParents.Length; i++) {
182 var bo = objectAndParents[i] as BindableObject;
183 if (bo == null) continue;
184 var ns = NameScope.GetNameScope(bo) as INameScope;
185 if (ns == null) continue;
186 var value = ns.FindByName(name);
194 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
195 [EditorBrowsable(EditorBrowsableState.Never)]
196 public class XamlTypeResolver : IXamlTypeResolver
198 readonly Assembly currentAssembly;
199 readonly GetTypeFromXmlName getTypeFromXmlName;
200 readonly IXmlNamespaceResolver namespaceResolver;
202 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
203 [EditorBrowsable(EditorBrowsableState.Never)]
204 public XamlTypeResolver(IXmlNamespaceResolver namespaceResolver, Assembly currentAssembly)
205 : this(namespaceResolver, XamlParser.GetElementType, currentAssembly)
209 internal XamlTypeResolver(IXmlNamespaceResolver namespaceResolver, GetTypeFromXmlName getTypeFromXmlName,
210 Assembly currentAssembly)
212 this.currentAssembly = currentAssembly;
213 if (namespaceResolver == null)
214 throw new ArgumentNullException();
215 if (getTypeFromXmlName == null)
216 throw new ArgumentNullException();
218 this.namespaceResolver = namespaceResolver;
219 this.getTypeFromXmlName = getTypeFromXmlName;
222 Type IXamlTypeResolver.Resolve(string qualifiedTypeName, IServiceProvider serviceProvider)
224 XamlParseException e;
225 var type = Resolve(qualifiedTypeName, serviceProvider, out e);
231 bool IXamlTypeResolver.TryResolve(string qualifiedTypeName, out Type type)
233 XamlParseException exception;
234 type = Resolve(qualifiedTypeName, null, out exception);
235 return exception == null;
238 Type Resolve(string qualifiedTypeName, IServiceProvider serviceProvider, out XamlParseException exception)
241 var split = qualifiedTypeName.Split(':');
242 if (split.Length > 2)
246 if (split.Length == 2)
257 IXmlLineInfo xmlLineInfo = null;
258 if (serviceProvider != null)
260 var lineInfoProvider = serviceProvider.GetService(typeof (IXmlLineInfoProvider)) as IXmlLineInfoProvider;
261 if (lineInfoProvider != null)
262 xmlLineInfo = lineInfoProvider.XmlLineInfo;
265 var namespaceuri = namespaceResolver.LookupNamespace(prefix);
266 if (namespaceuri == null)
268 exception = new XamlParseException(string.Format("No xmlns declaration for prefix \"{0}\"", prefix), xmlLineInfo);
272 return getTypeFromXmlName(new XmlType(namespaceuri, name, null), xmlLineInfo, currentAssembly, out exception);
275 internal delegate Type GetTypeFromXmlName(
276 XmlType xmlType, IXmlLineInfo xmlInfo, Assembly currentAssembly, out XamlParseException exception);
279 internal class XamlRootObjectProvider : IRootObjectProvider
281 public XamlRootObjectProvider(object rootObject)
283 RootObject = rootObject;
286 public object RootObject { get; }
289 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
290 [EditorBrowsable(EditorBrowsableState.Never)]
291 public class XmlLineInfoProvider : IXmlLineInfoProvider
293 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
294 [EditorBrowsable(EditorBrowsableState.Never)]
295 public XmlLineInfoProvider(IXmlLineInfo xmlLineInfo)
297 XmlLineInfo = xmlLineInfo;
300 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
301 [EditorBrowsable(EditorBrowsableState.Never)]
302 public IXmlLineInfo XmlLineInfo { get; }
305 class ReferenceProvider : IReferenceProvider
307 readonly INode _node;
308 internal ReferenceProvider(INode node)
311 public object FindByName(string name)
316 if ((value = (n as IElementNode)?.Namescope?.FindByName(name)) != null)
324 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
325 [EditorBrowsable(EditorBrowsableState.Never)]
327 public class NameScopeProvider : INameScopeProvider
329 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
330 [EditorBrowsable(EditorBrowsableState.Never)]
331 public INameScope NameScope { get; set; }
334 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
335 [EditorBrowsable(EditorBrowsableState.Never)]
336 public class XmlNamespaceResolver : IXmlNamespaceResolver
338 readonly Dictionary<string, string> namespaces = new Dictionary<string, string>();
340 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
341 [EditorBrowsable(EditorBrowsableState.Never)]
342 public IDictionary<string, string> GetNamespacesInScope(XmlNamespaceScope scope)
344 throw new NotImplementedException();
347 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
348 [EditorBrowsable(EditorBrowsableState.Never)]
349 public string LookupNamespace(string prefix)
352 if (namespaces.TryGetValue(prefix, out result))
357 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
358 [EditorBrowsable(EditorBrowsableState.Never)]
359 public string LookupPrefix(string namespaceName)
361 throw new NotImplementedException();
364 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
365 [EditorBrowsable(EditorBrowsableState.Never)]
366 public void Add(string prefix, string ns)
368 namespaces.Add(prefix, ns);