+ /// <summary>
+ /// A class that helps binding a non-selector property in View to selector property in ViewStyle.
+ /// </summary>
+ internal class ViewSelector<T> where T : class, Tizen.NUI.Internal.ICloneable
+ {
+ private Selector<T> selector;
+ private View view;
+ private View.ControlStateChangesDelegate controlStateChanged;
+
+ internal ViewSelector(View view, View.ControlStateChangesDelegate controlStateChanged)
+ {
+ if (view == null || controlStateChanged == null)
+ {
+ throw new global::System.ArgumentNullException();
+ }
+ this.view = view;
+ this.controlStateChanged = controlStateChanged;
+ this.selector = null;
+ }
+
+ internal T GetValue()
+ {
+ return selector == null ? null : selector.GetValue(view.ControlState);
+ }
+
+ internal void Clone(object value)
+ {
+ bool hadMultiValue = HasMultiValue();
+ var type = value?.GetType();
+
+ if (type == typeof(T))
+ {
+ selector = new Selector<T>();
+ selector.All = (T)((T)value).Clone();
+ }
+ else if (type == typeof(Selector<T>))
+ {
+ selector = new Selector<T>();
+ selector.Clone<T>((Selector<T>)value);
+ }
+ else
+ {
+ selector = null;
+ }
+
+ if (hadMultiValue != HasMultiValue())
+ {
+ if (hadMultiValue) view.ControlStateChangeEvent -= controlStateChanged;
+ else view.ControlStateChangeEvent += controlStateChanged;
+ }
+ }
+
+ internal void Clear()
+ {
+ if (HasMultiValue())
+ {
+ view.ControlStateChangeEvent -= controlStateChanged;
+ }
+ selector = null;
+ }
+
+ internal bool IsEmpty()
+ {
+ return selector == null;
+ }
+
+ private bool HasMultiValue()
+ {
+ return (selector != null && selector.All == null);
+ }
+ }
+
+ internal static class SelectorHelper<T> where T : class, Tizen.NUI.Internal.ICloneable