Follow formatting NUI
[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             {
31                 lineInfo = (serviceProvider.GetService(typeof(IXmlLineInfoProvider)) as IXmlLineInfoProvider)?.XmlLineInfo;
32                 throw new XamlParseException($"StyleSheet can not have both a Source and a content", lineInfo);
33             }
34
35             if (Source != null)
36             {
37                 lineInfo = (serviceProvider.GetService(typeof(IXmlLineInfoProvider)) as IXmlLineInfoProvider)?.XmlLineInfo;
38                 if (Source.IsAbsoluteUri)
39                     throw new XamlParseException($"Source only accepts Relative URIs", lineInfo);
40
41                 var rootObjectType = (serviceProvider.GetService(typeof(IRootObjectProvider)) as IRootObjectProvider)?.RootObject.GetType();
42                 if (rootObjectType == null)
43                     return null;
44                 var rootTargetPath = XamlResourceIdAttribute.GetPathForType(rootObjectType);
45                 var resourcePath = ResourceDictionary.RDSourceTypeConverter.GetResourcePath(Source, rootTargetPath);
46                 var resString = DependencyService.Get<IResourcesLoader>()?.GetResource(resourcePath, rootObjectType.GetTypeInfo().Assembly, lineInfo);
47                 return StyleSheet.FromString(resString);
48             }
49
50             if (!string.IsNullOrEmpty(Style))
51             {
52                 using (var reader = new StringReader(Style))
53                     return StyleSheet.FromReader(reader);
54             }
55
56             lineInfo = (serviceProvider.GetService(typeof(IXmlLineInfoProvider)) as IXmlLineInfoProvider)?.XmlLineInfo;
57             throw new XamlParseException($"StyleSheet require either a Source or a content", lineInfo);
58         }
59     }
60 }