[NUI] Adjust directory (#903)
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / public / Xaml / MarkupExtensions / StyleSheetExtension.cs
1 using System;
2 using System.Xml;
3 using Tizen.NUI.StyleSheets;
4 using System.Reflection;
5 using System.IO;
6 using Tizen.NUI.Binding;
7 using System.ComponentModel;
8
9 namespace Tizen.NUI.Xaml
10 {
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     [ContentProperty(nameof(Style))]
14     [ProvideCompiled("Tizen.NUI.Core.XamlC.StyleSheetProvider")]
15     public sealed class StyleSheetExtension : IValueProvider
16     {
17         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
18         [EditorBrowsable(EditorBrowsableState.Never)]
19         public string Style { get; set; }
20
21         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
22         [EditorBrowsable(EditorBrowsableState.Never)]
23         public Uri Source { get; set; }
24
25         object IValueProvider.ProvideValue(IServiceProvider serviceProvider)
26         {
27             IXmlLineInfo lineInfo;
28
29             if (!string.IsNullOrEmpty(Style) && Source != null) {
30                 lineInfo = (serviceProvider.GetService(typeof(IXmlLineInfoProvider)) as IXmlLineInfoProvider)?.XmlLineInfo;
31                 throw new XamlParseException($"StyleSheet can not have both a Source and a content", lineInfo);
32             }
33
34             if (Source != null) {
35                 lineInfo = (serviceProvider.GetService(typeof(IXmlLineInfoProvider)) as IXmlLineInfoProvider)?.XmlLineInfo;
36                 if (Source.IsAbsoluteUri)
37                     throw new XamlParseException($"Source only accepts Relative URIs", lineInfo);
38
39                 var rootObjectType = (serviceProvider.GetService(typeof(IRootObjectProvider)) as IRootObjectProvider)?.RootObject.GetType();
40                 if (rootObjectType == null)
41                     return null;
42                 var rootTargetPath = XamlResourceIdAttribute.GetPathForType(rootObjectType);
43                 var resourcePath = ResourceDictionary.RDSourceTypeConverter.GetResourcePath(Source, rootTargetPath);
44                 var resString = DependencyService.Get<IResourcesLoader>()?.GetResource(resourcePath, rootObjectType.GetTypeInfo().Assembly, lineInfo);
45                 return StyleSheet.FromString(resString);
46             }
47
48             if (!string.IsNullOrEmpty(Style)) {
49                 using (var reader = new StringReader(Style))
50                     return StyleSheet.FromReader(reader);
51             }
52
53             lineInfo = (serviceProvider.GetService(typeof(IXmlLineInfoProvider)) as IXmlLineInfoProvider)?.XmlLineInfo;
54             throw new XamlParseException($"StyleSheet require either a Source or a content", lineInfo);
55         }
56     }
57 }