b825389b707a31c964b34117ca0c1683b33efa2a
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / internal / Xaml / MarkupExtensions / ReferenceExtension.cs
1 using System;
2 using Tizen.NUI.Binding.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 }