[NUI] Introduce CornerRadiusPolicy to View
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / public / BaseComponents / Style / ViewStyle.cs
1 /*
2  * Copyright(c) 2020 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;
18 using System.Collections.Generic;
19 using System.ComponentModel;
20 using Tizen.NUI.Binding;
21
22 namespace Tizen.NUI.BaseComponents
23 {
24     /// <summary>
25     /// The base class for Children attributes in Components.
26     /// </summary>
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 partial class ViewStyle : BindableObject
30     {
31         private string styleName;
32         private View.States? state;
33         private View.States? subState;
34         private float? flex;
35         private int? alignSelf;
36         private Vector4 flexMargin;
37         private Vector2 cellIndex;
38         private float? rowSpan;
39         private float? columnSpan;
40         private HorizontalAlignmentType? cellHorizontalAlignment;
41         private VerticalAlignmentType? cellVerticalAlignment;
42         private View leftFocusableView;
43         private View rightFocusableView;
44         private View upFocusableView;
45         private View downFocusableView;
46         private bool? focusable;
47         private bool? positionUsesPivotPoint;
48         private int? siblingOrder;
49         private Position parentOrigin;
50         private Position pivotPoint;
51         private Position position;
52         private Rotation orientation;
53         private Vector3 scale;
54         private string name;
55         private bool? sensitive;
56         private bool? leaveRequired;
57         private bool? inheritOrientation;
58         private bool? inheritScale;
59         private DrawModeType? drawMode;
60         private Vector3 sizeModeFactor;
61         private ResizePolicyType? widthResizePolicy;
62         private ResizePolicyType? heightResizePolicy;
63         private SizeScalePolicyType? sizeScalePolicy;
64         private bool? widthForHeight;
65         private bool? heightForWidth;
66         private Extents padding;
67         private Size2D minimumSize;
68         private Size2D maximumSize;
69         private bool? inheritPosition;
70         private ClippingModeType? clippingMode;
71         private Size size;
72         private bool? inheritLayoutDirection;
73         private ViewLayoutDirectionType? layoutDirection;
74         private Extents margin;
75         private float? weight;
76         private bool? enableControlState;
77         private bool? themeChangeSensitive;
78
79         private Selector<ImageShadow> imageShadow;
80         private Selector<Shadow> boxShadow;
81         private Selector<string> backgroundImageSelector;
82         private Selector<float?> cornerRadius;
83         private Selector<float?> opacitySelector;
84         private Selector<Color> backgroundColorSelector;
85         private Selector<Rectangle> backgroundImageBorderSelector;
86         private Selector<Color> colorSelector;
87         private VisualTransformPolicyType? cornerRadiusPolicy;
88
89         static ViewStyle() { }
90
91         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
92         [EditorBrowsable(EditorBrowsableState.Never)]
93         public ViewStyle() { }
94
95         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
96         [EditorBrowsable(EditorBrowsableState.Never)]
97         public ViewStyle(ViewStyle viewAttributes)
98         {
99             CopyFrom(viewAttributes);
100         }
101
102         /// <summary>
103         /// Create an instance and set properties from the given view.
104         /// </summary>
105         /// <param name="view">The View that includes property data.</param>
106         [EditorBrowsable(EditorBrowsableState.Never)]
107         public ViewStyle(View view)
108         {
109             CopyPropertiesFromView(view);
110         }
111
112         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
113         [EditorBrowsable(EditorBrowsableState.Never)]
114         public string StyleName
115         {
116             get => (string)GetValue(StyleNameProperty);
117             set => SetValue(StyleNameProperty, value);
118         }
119
120         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
121         [EditorBrowsable(EditorBrowsableState.Never)]
122         public Selector<string> BackgroundImage
123         {
124             get
125             {
126                 Selector<string> image = (Selector<string>)GetValue(BackgroundImageSelectorProperty);
127                 return (null != image) ? image : backgroundImageSelector = new Selector<string>();
128             }
129             set => SetValue(BackgroundImageSelectorProperty, value);
130         }
131
132         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
133         [EditorBrowsable(EditorBrowsableState.Never)]
134         public View.States? State
135         {
136             get => (View.States?)GetValue(StateProperty);
137             set => SetValue(StateProperty, value);
138         }
139
140         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
141         [EditorBrowsable(EditorBrowsableState.Never)]
142         public View.States? SubState
143         {
144             get => (View.States?)GetValue(SubStateProperty);
145             set => SetValue(SubStateProperty, value);
146         }
147
148         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
149         [EditorBrowsable(EditorBrowsableState.Never)]
150         public float? Flex
151         {
152             get => (float?)GetValue(FlexProperty);
153             set => SetValue(FlexProperty, value);
154         }
155
156         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
157         [EditorBrowsable(EditorBrowsableState.Never)]
158         public int? AlignSelf
159         {
160             get => (int?)GetValue(AlignSelfProperty);
161             set => SetValue(AlignSelfProperty, value);
162         }
163
164         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
165         [EditorBrowsable(EditorBrowsableState.Never)]
166         public Vector4 FlexMargin
167         {
168             get => (Vector4)GetValue(FlexMarginProperty);
169             set => SetValue(FlexMarginProperty, value);
170         }
171
172         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
173         [EditorBrowsable(EditorBrowsableState.Never)]
174         public Vector2 CellIndex
175         {
176             get => (Vector2)GetValue(CellIndexProperty);
177             set => SetValue(CellIndexProperty, value);
178         }
179
180         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
181         [EditorBrowsable(EditorBrowsableState.Never)]
182         public float? RowSpan
183         {
184             get => (float?)GetValue(RowSpanProperty);
185             set => SetValue(RowSpanProperty, value);
186         }
187
188         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
189         [EditorBrowsable(EditorBrowsableState.Never)]
190         public float? ColumnSpan
191         {
192             get => (float?)GetValue(ColumnSpanProperty);
193             set => SetValue(ColumnSpanProperty, value);
194         }
195
196         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
197         [EditorBrowsable(EditorBrowsableState.Never)]
198         public HorizontalAlignmentType? CellHorizontalAlignment
199         {
200             get => (HorizontalAlignmentType?)GetValue(CellHorizontalAlignmentProperty);
201             set => SetValue(CellHorizontalAlignmentProperty, value);
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 VerticalAlignmentType? CellVerticalAlignment
207         {
208             get => (VerticalAlignmentType?)GetValue(CellVerticalAlignmentProperty);
209             set => SetValue(CellVerticalAlignmentProperty, value);
210         }
211
212         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
213         [EditorBrowsable(EditorBrowsableState.Never)]
214         public View LeftFocusableView
215         {
216             get => (View)GetValue(LeftFocusableViewProperty);
217             set => SetValue(LeftFocusableViewProperty, value);
218         }
219
220         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
221         [EditorBrowsable(EditorBrowsableState.Never)]
222         public View RightFocusableView
223         {
224             get => (View)GetValue(RightFocusableViewProperty);
225             set => SetValue(RightFocusableViewProperty, value);
226         }
227
228         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
229         [EditorBrowsable(EditorBrowsableState.Never)]
230         public View UpFocusableView
231         {
232             get => (View)GetValue(UpFocusableViewProperty);
233             set => SetValue(UpFocusableViewProperty, value);
234         }
235
236         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
237         [EditorBrowsable(EditorBrowsableState.Never)]
238         public View DownFocusableView
239         {
240             get => (View)GetValue(DownFocusableViewProperty);
241             set => SetValue(DownFocusableViewProperty, value);
242         }
243
244         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
245         [EditorBrowsable(EditorBrowsableState.Never)]
246         public bool? Focusable
247         {
248             get => (bool?)GetValue(FocusableProperty);
249             set => SetValue(FocusableProperty, value);
250         }
251
252         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
253         [EditorBrowsable(EditorBrowsableState.Never)]
254         public Size2D Size2D
255         {
256             get => (Size2D)GetValue(Size2DProperty);
257             set => SetValue(Size2DProperty, value);
258         }
259
260         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
261         [EditorBrowsable(EditorBrowsableState.Never)]
262         public Selector<float?> Opacity
263         {
264             get
265             {
266                 Selector<float?> opacity = (Selector<float?>)GetValue(OpacitySelectorProperty);
267                 return (null != opacity) ? opacity : opacitySelector = new Selector<float?>();
268             }
269             set => SetValue(OpacitySelectorProperty, value);
270         }
271
272         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
273         [EditorBrowsable(EditorBrowsableState.Never)]
274         public Position2D Position2D
275         {
276             get => (Position2D)GetValue(Position2DProperty);
277             set => SetValue(Position2DProperty, value);
278         }
279
280         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
281         [EditorBrowsable(EditorBrowsableState.Never)]
282         public bool? PositionUsesPivotPoint
283         {
284             get => (bool?)GetValue(PositionUsesPivotPointProperty);
285             set => SetValue(PositionUsesPivotPointProperty, value);
286         }
287
288         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
289         [EditorBrowsable(EditorBrowsableState.Never)]
290         public int? SiblingOrder
291         {
292             get => (int?)GetValue(SiblingOrderProperty);
293             set => SetValue(SiblingOrderProperty, value);
294         }
295
296         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
297         [EditorBrowsable(EditorBrowsableState.Never)]
298         public Position ParentOrigin
299         {
300             get => (Position)GetValue(ParentOriginProperty);
301             set => SetValue(ParentOriginProperty, value);
302         }
303
304         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
305         [EditorBrowsable(EditorBrowsableState.Never)]
306         public Position PivotPoint
307         {
308             get => (Position)GetValue(PivotPointProperty);
309             set => SetValue(PivotPointProperty, value);
310         }
311
312         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
313         [EditorBrowsable(EditorBrowsableState.Never)]
314         public float? SizeWidth
315         {
316             get => (float?)GetValue(SizeWidthProperty);
317             set => SetValue(SizeWidthProperty, value);
318         }
319
320         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
321         [EditorBrowsable(EditorBrowsableState.Never)]
322         public float? SizeHeight
323         {
324             get => (float?)GetValue(SizeHeightProperty);
325             set => SetValue(SizeHeightProperty, value);
326         }
327
328         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
329         [EditorBrowsable(EditorBrowsableState.Never)]
330         public Position Position
331         {
332             get => (Position)GetValue(PositionProperty);
333             set => SetValue(PositionProperty, value);
334         }
335
336         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
337         [EditorBrowsable(EditorBrowsableState.Never)]
338         public float? PositionX
339         {
340             get => (float?)GetValue(PositionXProperty);
341             set => SetValue(PositionXProperty, value);
342         }
343
344         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
345         [EditorBrowsable(EditorBrowsableState.Never)]
346         public float? PositionY
347         {
348             get => (float?)GetValue(PositionYProperty);
349             set => SetValue(PositionYProperty, value);
350         }
351
352         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
353         [EditorBrowsable(EditorBrowsableState.Never)]
354         public float? PositionZ
355         {
356             get => (float?)GetValue(PositionZProperty);
357             set => SetValue(PositionZProperty, value);
358         }
359
360         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
361         [EditorBrowsable(EditorBrowsableState.Never)]
362         public Rotation Orientation
363         {
364             get => (Rotation)GetValue(OrientationProperty);
365             set => SetValue(OrientationProperty, value);
366         }
367
368         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
369         [EditorBrowsable(EditorBrowsableState.Never)]
370         public Vector3 Scale
371         {
372             get => (Vector3)GetValue(ScaleProperty);
373             set => SetValue(ScaleProperty, value);
374         }
375
376         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
377         [EditorBrowsable(EditorBrowsableState.Never)]
378         public float? ScaleX
379         {
380             get => (float?)GetValue(ScaleXProperty);
381             set => SetValue(ScaleXProperty, value);
382         }
383
384         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
385         [EditorBrowsable(EditorBrowsableState.Never)]
386         public float? ScaleY
387         {
388             get => (float?)GetValue(ScaleYProperty);
389             set => SetValue(ScaleYProperty, value);
390         }
391
392         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
393         [EditorBrowsable(EditorBrowsableState.Never)]
394         public float? ScaleZ
395         {
396             get => (float?)GetValue(ScaleZProperty);
397             set => SetValue(ScaleZProperty, value);
398         }
399
400         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
401         [EditorBrowsable(EditorBrowsableState.Never)]
402         public string Name
403         {
404             get => (string)GetValue(NameProperty);
405             set => SetValue(NameProperty, value);
406         }
407
408         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
409         [EditorBrowsable(EditorBrowsableState.Never)]
410         public bool? Sensitive
411         {
412             get => (bool?)GetValue(SensitiveProperty);
413             set => SetValue(SensitiveProperty, value);
414         }
415
416         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
417         [EditorBrowsable(EditorBrowsableState.Never)]
418         public bool? LeaveRequired
419         {
420             get => (bool?)GetValue(LeaveRequiredProperty);
421             set => SetValue(LeaveRequiredProperty, value);
422         }
423
424         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
425         [EditorBrowsable(EditorBrowsableState.Never)]
426         public bool? InheritOrientation
427         {
428             get => (bool?)GetValue(InheritOrientationProperty);
429             set => SetValue(InheritOrientationProperty, value);
430         }
431
432         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
433         [EditorBrowsable(EditorBrowsableState.Never)]
434         public bool? InheritScale
435         {
436             get => (bool?)GetValue(InheritScaleProperty);
437             set => SetValue(InheritScaleProperty, value);
438         }
439
440         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
441         [EditorBrowsable(EditorBrowsableState.Never)]
442         public DrawModeType? DrawMode
443         {
444             get => (DrawModeType?)GetValue(DrawModeProperty);
445             set => SetValue(DrawModeProperty, value);
446         }
447
448         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
449         [EditorBrowsable(EditorBrowsableState.Never)]
450         public Vector3 SizeModeFactor
451         {
452             get => (Vector3)GetValue(SizeModeFactorProperty);
453             set => SetValue(SizeModeFactorProperty, value);
454         }
455
456         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
457         [EditorBrowsable(EditorBrowsableState.Never)]
458         public ResizePolicyType? WidthResizePolicy
459         {
460             get => (ResizePolicyType?)GetValue(WidthResizePolicyProperty);
461             set => SetValue(WidthResizePolicyProperty, value);
462         }
463
464         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
465         [EditorBrowsable(EditorBrowsableState.Never)]
466         public ResizePolicyType? HeightResizePolicy
467         {
468             get => (ResizePolicyType?)GetValue(HeightResizePolicyProperty);
469             set => SetValue(HeightResizePolicyProperty, value);
470         }
471
472         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
473         [EditorBrowsable(EditorBrowsableState.Never)]
474         public SizeScalePolicyType? SizeScalePolicy
475         {
476             get => (SizeScalePolicyType?)GetValue(SizeScalePolicyProperty);
477             set => SetValue(SizeScalePolicyProperty, value);
478         }
479
480         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
481         [EditorBrowsable(EditorBrowsableState.Never)]
482         public bool? WidthForHeight
483         {
484             get => (bool?)GetValue(WidthForHeightProperty);
485             set => SetValue(WidthForHeightProperty, value);
486         }
487
488         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
489         [EditorBrowsable(EditorBrowsableState.Never)]
490         public bool? HeightForWidth
491         {
492             get => (bool?)GetValue(HeightForWidthProperty);
493             set => SetValue(HeightForWidthProperty, value);
494         }
495
496         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
497         [EditorBrowsable(EditorBrowsableState.Never)]
498         public Extents Padding
499         {
500             get
501             {
502                 Extents tmp = (Extents)GetValue(PaddingProperty);
503                 return (null != tmp) ? tmp : padding = new Extents(OnPaddingChanged, 0, 0, 0, 0);
504             }
505             set => SetValue(PaddingProperty, value);
506         }
507
508         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
509         [EditorBrowsable(EditorBrowsableState.Never)]
510         public Size2D MinimumSize
511         {
512             get => (Size2D)GetValue(MinimumSizeProperty);
513             set => SetValue(MinimumSizeProperty, value);
514         }
515
516         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
517         [EditorBrowsable(EditorBrowsableState.Never)]
518         public Size2D MaximumSize
519         {
520             get => (Size2D)GetValue(MaximumSizeProperty);
521             set => SetValue(MaximumSizeProperty, value);
522         }
523
524         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
525         [EditorBrowsable(EditorBrowsableState.Never)]
526         public bool? InheritPosition
527         {
528             get => (bool?)GetValue(InheritPositionProperty);
529             set => SetValue(InheritPositionProperty, value);
530         }
531
532         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
533         [EditorBrowsable(EditorBrowsableState.Never)]
534         public ClippingModeType? ClippingMode
535         {
536             get => (ClippingModeType?)GetValue(ClippingModeProperty);
537             set => SetValue(ClippingModeProperty, value);
538         }
539
540         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
541         [EditorBrowsable(EditorBrowsableState.Never)]
542         public Size Size
543         {
544             get
545             {
546                 Size tmp = (Size)GetValue(SizeProperty);
547                 return (null != tmp) ? tmp : size = new Size((float? width, float? height, float? depth) =>
548                     {
549                         float targetWidth = 0;
550                         float targetHeight = 0;
551                         float targetDepth = 0;
552
553                         if (size != null)
554                         {
555                             targetWidth = size.Width;
556                             targetHeight = size.Height;
557                             targetDepth = size.Depth;
558                         }
559                         if (width != null) { targetWidth = (float)width; }
560                         if (height != null) { targetHeight = (float)height; }
561                         if (depth != null) { targetDepth = (float)depth; }
562
563                         Size = new Size(targetWidth, targetHeight, targetDepth);
564                     }, 0, 0, 0);
565             }
566             set => SetValue(SizeProperty, value);
567         }
568
569         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
570         [EditorBrowsable(EditorBrowsableState.Never)]
571         public bool? InheritLayoutDirection
572         {
573             get => (bool?)GetValue(InheritLayoutDirectionProperty);
574             set => SetValue(InheritLayoutDirectionProperty, value);
575         }
576
577         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
578         [EditorBrowsable(EditorBrowsableState.Never)]
579         public ViewLayoutDirectionType? LayoutDirection
580         {
581             get => (ViewLayoutDirectionType?)GetValue(LayoutDirectionProperty);
582             set => SetValue(LayoutDirectionProperty, value);
583         }
584
585         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
586         [EditorBrowsable(EditorBrowsableState.Never)]
587         public Extents Margin
588         {
589             get
590             {
591                 Extents tmp = (Extents)GetValue(MarginProperty);
592                 return (null != tmp) ? tmp : margin = new Extents(OnMarginChanged, 0, 0, 0, 0);
593             }
594             set => SetValue(MarginProperty, value);
595         }
596
597         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
598         [EditorBrowsable(EditorBrowsableState.Never)]
599         public float? Weight
600         {
601             get => (float?)GetValue(WeightProperty);
602             set => SetValue(WeightProperty, value);
603         }
604
605         /// <summary> View BackgroundColor </summary>
606         /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
607         [EditorBrowsable(EditorBrowsableState.Never)]
608         public Selector<Color> BackgroundColor
609         {
610             get
611             {
612                 Selector<Color> color = (Selector<Color>)GetValue(BackgroundColorSelectorProperty);
613                 return (null != color) ? color : backgroundColorSelector = new Selector<Color>();
614             }
615             set => SetValue(BackgroundColorSelectorProperty, value);
616         }
617
618         /// <summary>
619         /// Color
620         /// </summary>
621         [EditorBrowsable(EditorBrowsableState.Never)]
622         public Selector<Color> Color
623         {
624             get
625             {
626                 Selector<Color> color = (Selector<Color>)GetValue(ColorSelectorProperty);
627                 return (null != color) ? color : colorSelector = new Selector<Color>();
628             }
629             set => SetValue(ColorSelectorProperty, value);
630         }
631
632         /// <summary>View BackgroundBorder</summary>
633         /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
634         [EditorBrowsable(EditorBrowsableState.Never)]
635         public Selector<Rectangle> BackgroundImageBorder
636         {
637             get
638             {
639                 Selector<Rectangle> border = (Selector<Rectangle>)GetValue(BackgroundImageBorderSelectorProperty);
640                 return (null != border) ? border : backgroundImageBorderSelector = new Selector<Rectangle>();
641             }
642             set => SetValue(BackgroundImageBorderSelectorProperty, value);
643         }
644
645         /// <summary>
646         /// Describes a shadow as an image for a View.
647         /// It is null by default.
648         /// </summary>
649         /// <remarks>
650         /// If BoxShadow is not null, the ImageShadow value will be ignored.
651         /// </remarks>
652         [EditorBrowsable(EditorBrowsableState.Never)]
653         public Selector<ImageShadow> ImageShadow
654         {
655             get => (Selector<ImageShadow>)GetValue(ImageShadowSelectorProperty);
656             set => SetValue(ImageShadowSelectorProperty, value);
657         }
658
659         /// <summary>
660         /// Describes a box shaped shadow drawing for a View.
661         /// It is null by default.
662         /// </summary>
663         [EditorBrowsable(EditorBrowsableState.Never)]
664         public Selector<Shadow> BoxShadow
665         {
666             get => (Selector<Shadow>)GetValue(BoxShadowSelectorProperty);
667             set => SetValue(BoxShadowSelectorProperty, value);
668         }
669
670         /// <summary>
671         /// The radius for the rounded corners of the View
672         /// </summary>
673         [EditorBrowsable(EditorBrowsableState.Never)]
674         public Selector<float?> CornerRadius
675         {
676             get => (Selector<float?>)GetValue(CornerRadiusProperty);
677             set => SetValue(CornerRadiusProperty, value);
678         }
679
680         /// <summary>
681         /// Whether the CornerRadius property value is relative (percentage [0.0f to 1.0f] of the view size) or absolute (in world units).
682         /// It is absolute by default.
683         /// When the policy is relative, the corner radius is relative to the smaller of the view's width and height.
684         /// </summary>
685         [EditorBrowsable(EditorBrowsableState.Never)]
686         public VisualTransformPolicyType? CornerRadiusPolicy
687         {
688             get => (VisualTransformPolicyType?)GetValue(CornerRadiusPolicyProperty);
689             set => SetValue(CornerRadiusPolicyProperty, value);
690         }
691
692         /// <summary>
693         /// The EnableControlState value of the View.
694         /// </summary>
695         [EditorBrowsable(EditorBrowsableState.Never)]
696         public bool? EnableControlState
697         {
698             get => (bool?)GetValue(EnableControlStateProperty);
699             set => SetValue(EnableControlStateProperty, value);
700         }
701
702         /// <summary>
703         /// The ThemeChangeSensitive value of the View.
704         /// </summary>
705         [EditorBrowsable(EditorBrowsableState.Never)]
706         public bool? ThemeChangeSensitive
707         {
708             get => (bool?)GetValue(ThemeChangeSensitiveProperty);
709             set => SetValue(ThemeChangeSensitiveProperty, value);
710         }
711
712
713         /// <summary>
714         /// Allow null properties when merging it into other Theme.
715         /// If the value is true, the null properties reset target properties of the other ViewStyle with same key when merge.
716         /// It is used in <seealso cref="Theme.Merge(string)"/>, <seealso cref="Theme.Merge(Theme)"/>.
717         /// It is also used in <seealso cref="Theme.GetStyle(string)"/> when the Theme has a parent and needs to merge.
718         /// Please note that it is false by default.
719         /// </summary>
720         [EditorBrowsable(EditorBrowsableState.Never)]
721         public bool SolidNull { get; set; } = false;
722
723         /// <summary>
724         /// Set style's bindable properties from the view.
725         /// </summary>
726         /// <param name="view">The view that includes property data.</param>
727         [EditorBrowsable(EditorBrowsableState.Never)]
728         public virtual void CopyPropertiesFromView(View view)
729         {
730             if (view == null) return;
731
732             BindableProperty.GetBindablePropertysOfType(GetType(), out var styleProperties);
733             BindableProperty.GetBindablePropertysOfType(view.GetType(), out var viewProperties);
734
735
736             if (styleProperties == null || viewProperties == null) return;
737
738             foreach (var stylePropertyItem in styleProperties)
739             {
740                 viewProperties.TryGetValue(stylePropertyItem.Key, out var viewProperty);
741
742                 if (viewProperty == null) continue;
743
744                 SetValue(stylePropertyItem.Value, view.GetValue(viewProperty));
745             }
746         }
747
748         /// <summary>Create a cloned ViewStyle.</summary>
749         [EditorBrowsable(EditorBrowsableState.Never)]
750         public ViewStyle Clone()
751         {
752             var cloned = CreateInstance();
753             cloned.CopyFrom(this);
754
755             return cloned;
756         }
757
758         /// <summary>Create a cloned ViewStyle.</summary>
759         [EditorBrowsable(EditorBrowsableState.Never)]
760         public void Merge(ViewStyle other)
761         {
762             AllowNullCopy = other?.SolidNull ?? false;
763             CopyFrom(other);
764             AllowNullCopy = false;
765         }
766
767         internal ViewStyle CreateInstance()
768         {
769             return (ViewStyle)Activator.CreateInstance(GetType());
770         }
771
772         private void OnPaddingChanged(ushort start, ushort end, ushort top, ushort bottom)
773         {
774             Padding = new Extents(start, end, top, bottom);
775         }
776
777         private void OnMarginChanged(ushort start, ushort end, ushort top, ushort bottom)
778         {
779             Margin = new Extents(start, end, top, bottom);
780         }
781     }
782 }