[NUI] Add Shadow properties to ViewStyle (#1276)
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / public / BaseComponents / Style / Selector.cs
1 /*
2  * Copyright(c) 2019 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17 using System.ComponentModel;
18 using Tizen.NUI.Binding;
19 using Tizen.NUI.Components;
20
21 namespace Tizen.NUI.BaseComponents
22 {
23     /// <summary>
24     /// Selector class, which is related by Control State, it is base class for other Selector.
25     /// </summary>
26     /// <since_tizen> 6 </since_tizen>
27     /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
28     [EditorBrowsable(EditorBrowsableState.Never)]
29     public class Selector<T> : BindableObject
30     {
31         /// <since_tizen> 6 </since_tizen>
32         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
33         public static implicit operator Selector<T>(T value)
34         {
35             Selector<T> selector = new Selector<T>();
36             selector.All = value;
37             return selector;
38         }
39
40         /// <summary>
41         /// All State.
42         /// </summary>
43         /// <since_tizen> 6 </since_tizen>
44         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
45         [EditorBrowsable(EditorBrowsableState.Never)]
46         public T All
47         {
48             get;
49             set;
50         }
51         /// <summary>
52         /// Normal State.
53         /// </summary>
54         /// <since_tizen> 6 </since_tizen>
55         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
56         [EditorBrowsable(EditorBrowsableState.Never)]
57         public T Normal
58         {
59             get;
60             set;
61         }
62         /// <summary>
63         /// Pressed State.
64         /// </summary>
65         /// <since_tizen> 6 </since_tizen>
66         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
67         [EditorBrowsable(EditorBrowsableState.Never)]
68         public T Pressed
69         {
70             get;
71             set;
72         }
73         /// <summary>
74         /// Focused State.
75         /// </summary>
76         /// <since_tizen> 6 </since_tizen>
77         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
78         [EditorBrowsable(EditorBrowsableState.Never)]
79         public T Focused
80         {
81             get;
82             set;
83         }
84         /// <summary>
85         /// Selected State.
86         /// </summary>
87         /// <since_tizen> 6 </since_tizen>
88         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
89         [EditorBrowsable(EditorBrowsableState.Never)]
90         public T Selected
91         {
92             get;
93             set;
94         }
95         /// <summary>
96         /// Disabled State.
97         /// </summary>
98         /// <since_tizen> 6 </since_tizen>
99         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
100         [EditorBrowsable(EditorBrowsableState.Never)]
101         public T Disabled
102         {
103             get;
104             set;
105         }
106         /// <summary>
107         /// DisabledFocused State.
108         /// </summary>
109         /// <since_tizen> 6 </since_tizen>
110         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
111         [EditorBrowsable(EditorBrowsableState.Never)]
112         public T DisabledFocused
113         {
114             get;
115             set;
116         }
117         /// <summary>
118         /// SelectedFocused State.
119         /// </summary>
120         /// <since_tizen> 6 </since_tizen>
121         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
122         public T SelectedFocused
123         {
124             get;
125             set;
126         }
127         /// <summary>
128         /// DisabledSelected State.
129         /// </summary>
130         /// <since_tizen> 6 </since_tizen>
131         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
132         [EditorBrowsable(EditorBrowsableState.Never)]
133         public T DisabledSelected
134         {
135             get;
136             set;
137         }
138         /// <summary>
139         /// Other State.
140         /// </summary>
141         /// <since_tizen> 6 </since_tizen>
142         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
143         [EditorBrowsable(EditorBrowsableState.Never)]
144         public T Other
145         {
146             get;
147             set;
148         }
149         /// <summary>
150         /// Get value by State.
151         /// </summary>
152         /// <since_tizen> 6 </since_tizen>
153         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
154         [EditorBrowsable(EditorBrowsableState.Never)]
155         public T GetValue(ControlStates state)
156         {
157             if(All != null)
158             {
159                 return All;
160             }
161             switch(state)
162             {
163                 case ControlStates.Normal:
164                     return Normal != null? Normal : Other;
165                 case ControlStates.Focused:
166                     return Focused != null? Focused : Other;
167                 case ControlStates.Pressed:
168                     return Pressed != null? Pressed : Other;
169                 case ControlStates.Disabled:
170                     return Disabled != null? Disabled : Other;
171                 case ControlStates.Selected:
172                     return Selected != null? Selected : Other;
173                 case ControlStates.DisabledFocused:
174                     return DisabledFocused != null? DisabledFocused : Other;
175                 case ControlStates.DisabledSelected:
176                     return DisabledSelected != null? DisabledSelected : Other;
177                 case ControlStates.SelectedFocused:
178                     return SelectedFocused != null ? SelectedFocused : Other;
179                 default:
180                     return Other;
181             }
182         }
183         /// <summary>
184         /// Clone function.
185         /// </summary>
186         /// <since_tizen> 6 </since_tizen>
187         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
188         [EditorBrowsable(EditorBrowsableState.Never)]
189         public void Clone(Selector<T> selector)
190         {
191             All = selector.All;
192             Normal = selector.Normal;
193             Focused = selector.Focused;
194             Pressed = selector.Pressed;
195             Disabled = selector.Disabled;
196             Selected = selector.Selected;
197             DisabledSelected = selector.DisabledSelected;
198             DisabledFocused = selector.DisabledFocused;
199             SelectedFocused = selector.SelectedFocused;
200             Other = selector.Other;
201         }
202     }
203
204     /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
205     [EditorBrowsable(EditorBrowsableState.Never)]
206     public class TriggerableSelector<T> : Selector<T>
207     {
208         public TriggerableSelector(View view, BindableProperty bindableProperty)
209         {
210             targetView = view;
211             targetBindableProperty = bindableProperty;
212             view.ControlStateChangeEvent += OnViewControlState;
213         }
214
215         /// <summary>
216         /// Clone function.
217         /// </summary>
218         /// <since_tizen> 6 </since_tizen>
219         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
220         [EditorBrowsable(EditorBrowsableState.Never)]
221         public new void Clone(Selector<T> selector)
222         {
223             base.Clone(selector);
224
225             if (null != targetView && null != GetValue(targetView.ControlState))
226             {
227                 targetView.SetValue(targetBindableProperty, GetValue(targetView.ControlState));
228             }
229         }
230
231         private void OnViewControlState(View obj, ControlStates state)
232         {
233             if (null != obj && null != GetValue(state))
234             {
235                 obj.SetValue(targetBindableProperty, GetValue(state));
236             }
237         }
238
239         private View targetView;
240         private BindableProperty targetBindableProperty;
241     }
242
243     internal static class SelectorHelper<T> where T : class, Tizen.NUI.ICloneable
244     {
245         /// <summary>
246         /// For the object type of T or Selector T, convert it to Selector T and return the cloned one.
247         /// Otherwise, return null. <br/>
248         /// </summary>
249         static internal Selector<T> Clone(object value)
250         {
251             var type = value?.GetType();
252
253             if (type == typeof(Selector<T>))
254             {
255                 var result = new Selector<T>();
256                 result.Clone((Selector<T>)value);
257                 return result;
258             }
259
260             if (type == typeof(T))
261             {
262                 var result = new Selector<T>();
263                 result.Clone((T)value);
264                 return result;
265             }
266
267             return null;
268         }
269
270         /// <summary>
271         /// For the object type of T or Selector T, convert it to T and return the cloned one.
272         /// Otherwise, return null. <br/>
273         /// </summary>
274         static internal T Clone(object value, View view)
275         {
276             var type = value?.GetType();
277
278             if (type == typeof(T))
279             {
280                 return (T)((T)value).Clone();
281             }
282
283             if (type == typeof(Selector<T>) && view != null)
284             {
285                 Selector<T> selector = (Selector<T>)value;
286                 T valueInState = selector.GetValue(view.ControlState);
287
288                 return (T)valueInState?.Clone();
289             }
290
291             return null;
292         }
293     }
294 }