[MediaContent] Fix description of Delete method (#866)
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI.Xaml / src / public / XamlBinding / Setter.cs
1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Reflection;
5 using System.Runtime.CompilerServices;
6 using System.Xml;
7 using Tizen.NUI.XamlBinding.Internals;
8 using Tizen.NUI.Xaml;
9
10 namespace Tizen.NUI.XamlBinding
11 {
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
17     {
18         readonly ConditionalWeakTable<BindableObject, object> _originalValues = new ConditionalWeakTable<BindableObject, object>();
19
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; }
23
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; }
27
28         object IValueProvider.ProvideValue(IServiceProvider serviceProvider)
29         {
30             if (Property == null)
31             {
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);
35             }
36             var valueconverter = serviceProvider.GetService(typeof(IValueConverterProvider)) as IValueConverterProvider;
37
38             Func<MemberInfo> minforetriever =
39                 () =>
40                 (MemberInfo)Property.DeclaringType.GetRuntimeProperty(Property.PropertyName) ?? (MemberInfo)Property.DeclaringType.GetRuntimeMethod("Get" + Property.PropertyName, new[] { typeof(BindableObject) });
41
42             object value = valueconverter.Convert(Value, Property.ReturnType, minforetriever, serviceProvider);
43             Value = value;
44             return this;
45         }
46
47         internal void Apply(BindableObject target, bool fromStyle = false)
48         {
49             if (target == null)
50                 throw new ArgumentNullException("target");
51             if (Property == null)
52                 return;
53
54             object originalValue = target.GetValue(Property);
55             if (!Equals(originalValue, Property.DefaultValue))
56             {
57                 _originalValues.Remove(target);
58                 _originalValues.Add(target, originalValue);
59             }
60
61             var dynamicResource = Value as DynamicResource;
62             var binding = Value as BindingBase;
63             if (binding != null)
64                 target.SetBinding(Property, binding.Clone(), fromStyle);
65             else if (dynamicResource != null)
66                 target.SetDynamicResource(Property, dynamicResource.Key, fromStyle);
67             else
68             {
69                 if (Value is IList<VisualStateGroup> visualStateGroupCollection)
70                     target.SetValue(Property, visualStateGroupCollection.Clone(), fromStyle);
71                 else
72                     target.SetValue(Property, Value, fromStyle);
73             }
74         }
75
76         internal void UnApply(BindableObject target, bool fromStyle = false)
77         {
78             if (target == null)
79                 throw new ArgumentNullException(nameof(target));
80             if (Property == null)
81                 return;
82
83             object actual = target.GetValue(Property);
84             if (!Equals(actual, Value) && !(Value is Tizen.NUI.XamlBinding.Binding) && !(Value is DynamicResource))
85             {
86                 //Do not reset default value if the value has been changed
87                 _originalValues.Remove(target);
88                 return;
89             }
90
91             object defaultValue;
92             if (_originalValues.TryGetValue(target, out defaultValue))
93             {
94                 //reset default value, unapply bindings and dynamicResource
95                 target.SetValue(Property, defaultValue, fromStyle);
96                 _originalValues.Remove(target);
97             }
98             else
99                 target.ClearValue(Property);
100         }
101     }
102 }