a8889974d92eca9a6f6576e4ae37688828b89e42
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / internal / Xaml / MarkupExtensions / ReferenceExtension.cs
1 using System;
2 using Tizen.NUI.Internals;
3 using Tizen.NUI.Xaml.Internals;
4 using Tizen.NUI.Binding;
5
6 namespace Tizen.NUI.Xaml
7 {
8         [ContentProperty("Name")]
9         internal class ReferenceExtension : IMarkupExtension
10         {
11                 public string Name { get; set; }
12
13                 public object ProvideValue(IServiceProvider serviceProvider)
14                 {
15                         if (serviceProvider == null)
16                                 throw new ArgumentNullException(nameof(serviceProvider));
17                         var valueProvider = serviceProvider.GetService(typeof (IProvideValueTarget)) as IProvideParentValues;
18                         if (valueProvider == null)
19                                 throw new ArgumentException("serviceProvider does not provide an IProvideValueTarget");
20                         var namescopeprovider = serviceProvider.GetService(typeof (INameScopeProvider)) as INameScopeProvider;
21                         if (namescopeprovider != null && namescopeprovider.NameScope != null)
22                         {
23                                 var value = namescopeprovider.NameScope.FindByName(Name);
24                                 if (value != null)
25                                         return value;
26                         }
27
28                         foreach (var target in valueProvider.ParentObjects)
29                         {
30                                 var ns = target as INameScope;
31                                 if (ns == null)
32                                         continue;
33                                 var value = ns.FindByName(Name);
34                                 if (value != null)
35                                         return value;
36                         }
37
38                         var lineInfo = (serviceProvider?.GetService(typeof(IXmlLineInfoProvider)) as IXmlLineInfoProvider)?.XmlLineInfo ?? new XmlLineInfo();
39                         throw new XamlParseException($"Can not find the object referenced by `{Name}`", lineInfo);
40                 }
41         }
42 }