2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Reflection;
5 using System.Runtime.CompilerServices;
7 using Tizen.NUI.XamlBinding.Internals;
10 namespace Tizen.NUI.XamlBinding
12 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
13 [EditorBrowsable(EditorBrowsableState.Never)]
14 [ContentProperty("Value")]
15 [ProvideCompiled("Tizen.NUI.XamlC.SetterValueProvider")]
16 public sealed class Setter : IValueProvider
18 readonly ConditionalWeakTable<BindableObject, object> _originalValues = new ConditionalWeakTable<BindableObject, object>();
20 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
21 [EditorBrowsable(EditorBrowsableState.Never)]
22 public BindableProperty Property { get; set; }
24 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
25 [EditorBrowsable(EditorBrowsableState.Never)]
26 public object Value { get; set; }
28 object IValueProvider.ProvideValue(IServiceProvider serviceProvider)
32 var lineInfoProvider = serviceProvider.GetService(typeof(IXmlLineInfoProvider)) as IXmlLineInfoProvider;
33 IXmlLineInfo lineInfo = lineInfoProvider != null ? lineInfoProvider.XmlLineInfo : new XmlLineInfo();
34 throw new XamlParseException("Property not set", lineInfo);
36 var valueconverter = serviceProvider.GetService(typeof(IValueConverterProvider)) as IValueConverterProvider;
38 Func<MemberInfo> minforetriever =
40 (MemberInfo)Property.DeclaringType.GetRuntimeProperty(Property.PropertyName) ?? (MemberInfo)Property.DeclaringType.GetRuntimeMethod("Get" + Property.PropertyName, new[] { typeof(BindableObject) });
42 object value = valueconverter.Convert(Value, Property.ReturnType, minforetriever, serviceProvider);
47 internal void Apply(BindableObject target, bool fromStyle = false)
50 throw new ArgumentNullException("target");
54 object originalValue = target.GetValue(Property);
55 if (!Equals(originalValue, Property.DefaultValue))
57 _originalValues.Remove(target);
58 _originalValues.Add(target, originalValue);
61 var dynamicResource = Value as DynamicResource;
62 var binding = Value as BindingBase;
64 target.SetBinding(Property, binding.Clone(), fromStyle);
65 else if (dynamicResource != null)
66 target.SetDynamicResource(Property, dynamicResource.Key, fromStyle);
69 if (Value is IList<VisualStateGroup> visualStateGroupCollection)
70 target.SetValue(Property, visualStateGroupCollection.Clone(), fromStyle);
72 target.SetValue(Property, Value, fromStyle);
76 internal void UnApply(BindableObject target, bool fromStyle = false)
79 throw new ArgumentNullException(nameof(target));
83 object actual = target.GetValue(Property);
84 if (!Equals(actual, Value) && !(Value is Tizen.NUI.XamlBinding.Binding) && !(Value is DynamicResource))
86 //Do not reset default value if the value has been changed
87 _originalValues.Remove(target);
92 if (_originalValues.TryGetValue(target, out defaultValue))
94 //reset default value, unapply bindings and dynamicResource
95 target.SetValue(Property, defaultValue, fromStyle);
96 _originalValues.Remove(target);
99 target.ClearValue(Property);