3 using Tizen.NUI.StyleSheets;
4 using System.Reflection;
6 using Tizen.NUI.Binding;
7 using System.ComponentModel;
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 [ContentProperty(nameof(Style))]
14 [ProvideCompiled("Tizen.NUI.Core.XamlC.StyleSheetProvider")]
15 public sealed class StyleSheetExtension : IValueProvider
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; }
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; }
25 object IValueProvider.ProvideValue(IServiceProvider serviceProvider)
27 IXmlLineInfo lineInfo;
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);
35 lineInfo = (serviceProvider.GetService(typeof(IXmlLineInfoProvider)) as IXmlLineInfoProvider)?.XmlLineInfo;
36 if (Source.IsAbsoluteUri)
37 throw new XamlParseException($"Source only accepts Relative URIs", lineInfo);
39 var rootObjectType = (serviceProvider.GetService(typeof(IRootObjectProvider)) as IRootObjectProvider)?.RootObject.GetType();
40 if (rootObjectType == 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);
48 if (!string.IsNullOrEmpty(Style)) {
49 using (var reader = new StringReader(Style))
50 return StyleSheet.FromReader(reader);
53 lineInfo = (serviceProvider.GetService(typeof(IXmlLineInfoProvider)) as IXmlLineInfoProvider)?.XmlLineInfo;
54 throw new XamlParseException($"StyleSheet require either a Source or a content", lineInfo);