[NUI] Refactoring Theme and StyleManager (#1981)
authorJiyun Yang <ji.yang@samsung.com>
Mon, 7 Sep 2020 07:12:02 +0000 (16:12 +0900)
committerGitHub <noreply@github.com>
Mon, 7 Sep 2020 07:12:02 +0000 (16:12 +0900)
* Revert "[NUI] Revert patch about StyleManager (#1970)"

This reverts commit 8a611b32c8a98672740e013cbde4932139b649d0.

* [NUI] Fix bugs in #1910 (ThemeManager)

Signed-off-by: Jiyun Yang <ji.yang@samsung.com>
88 files changed:
src/Tizen.NUI.Components/Controls/Button.Internal.cs
src/Tizen.NUI.Components/Controls/Button.cs
src/Tizen.NUI.Components/Controls/Control.cs
src/Tizen.NUI.Components/Controls/DropDown.DropDownDataItem.cs
src/Tizen.NUI.Components/Controls/Extension/LottieButtonExtension.cs
src/Tizen.NUI.Components/Controls/Extension/LottieSwitchExtension.cs
src/Tizen.NUI.Components/Controls/ImageScrollBar.cs
src/Tizen.NUI.Components/Controls/Loading.cs
src/Tizen.NUI.Components/Controls/Popup.cs
src/Tizen.NUI.Components/Controls/Progress.cs
src/Tizen.NUI.Components/Controls/Scrollbar.cs
src/Tizen.NUI.Components/Controls/Slider.cs
src/Tizen.NUI.Components/Controls/Switch.cs
src/Tizen.NUI.Components/Controls/Tab.cs
src/Tizen.NUI.Components/Controls/Toast.cs
src/Tizen.NUI.Components/PreloadStyle/DefaultTheme.cs [deleted file]
src/Tizen.NUI.Components/PreloadStyle/OverlayAnimationButtonStyle.cs
src/Tizen.NUI.Components/PreloadStyle/WearableTheme.cs [deleted file]
src/Tizen.NUI.Components/Style/ButtonStyle.cs
src/Tizen.NUI.Components/Style/ControlStyle.cs
src/Tizen.NUI.Components/Style/DropDownStyle.cs
src/Tizen.NUI.Components/Style/LoadingStyle.cs
src/Tizen.NUI.Components/Style/PaginationStyle.cs
src/Tizen.NUI.Components/Style/PopupStyle.cs
src/Tizen.NUI.Components/Style/ProgressStyle.cs
src/Tizen.NUI.Components/Style/ScrollbarStyle.cs
src/Tizen.NUI.Components/Style/SliderStyle.cs
src/Tizen.NUI.Components/Style/SwitchStyle.cs
src/Tizen.NUI.Components/Style/TabStyle.cs
src/Tizen.NUI.Components/Style/Theme.cs [deleted file]
src/Tizen.NUI.Components/Style/ToastStyle.cs
src/Tizen.NUI.Components/Tizen.NUI.Components.csproj
src/Tizen.NUI.Components/Utils/StyleManager.cs
src/Tizen.NUI.Components/res/Theme/Tizen.NUI.Components_Tizen.NUI.Theme.Common.xaml [new file with mode: 0644]
src/Tizen.NUI.Components/res/Theme/Tizen.NUI.Components_Tizen.NUI.Theme.Wearable.xaml [new file with mode: 0644]
src/Tizen.NUI.Wearable/Tizen.NUI.Wearable.csproj
src/Tizen.NUI.Wearable/res/Theme/Tizen.NUI.Wearable_Tizen.NUI.Theme.Common.xaml [new file with mode: 0644]
src/Tizen.NUI.Wearable/res/Theme/Tizen.NUI.Wearable_Tizen.NUI.Theme.Wearable.xaml [new file with mode: 0644]
src/Tizen.NUI.Wearable/src/public/CircularProgress.cs
src/Tizen.NUI.Wearable/src/public/CircularScrollbar.cs
src/Tizen.NUI.Wearable/src/public/CircularSlider.cs
src/Tizen.NUI.Wearable/src/public/Popup.cs
src/Tizen.NUI.Wearable/src/public/WearableStyle/CircularPaginationStyle.cs
src/Tizen.NUI.Wearable/src/public/WearableStyle/CircularProgressStyle.cs
src/Tizen.NUI.Wearable/src/public/WearableStyle/CircularScrollbarStyle.cs
src/Tizen.NUI.Wearable/src/public/WearableStyle/CircularSliderStyle.cs
src/Tizen.NUI.Wearable/src/public/WearableStyle/PopupStyle.cs
src/Tizen.NUI/Tizen.NUI.csproj
src/Tizen.NUI/res/Theme/Tizen.NUI_Tizen.NUI.Theme.Common.xaml [new file with mode: 0644]
src/Tizen.NUI/res/Theme/Tizen.NUI_Tizen.NUI.Theme.Wearable.xaml [new file with mode: 0644]
src/Tizen.NUI/src/internal/Xaml/ApplyPropertiesVisitor.cs
src/Tizen.NUI/src/internal/Xaml/XamlLoader.cs
src/Tizen.NUI/src/internal/Xaml/XamlParser.cs
src/Tizen.NUI/src/internal/XamlBinding/ExtentsTypeConverter.cs
src/Tizen.NUI/src/public/BaseComponents/ImageView.cs
src/Tizen.NUI/src/public/BaseComponents/LottieAnimationView.cs
src/Tizen.NUI/src/public/BaseComponents/Style/ImageViewStyle.cs
src/Tizen.NUI/src/public/BaseComponents/Style/Selector.cs
src/Tizen.NUI/src/public/BaseComponents/Style/TextFieldStyle.cs
src/Tizen.NUI/src/public/BaseComponents/Style/TextLabelStyle.cs
src/Tizen.NUI/src/public/BaseComponents/Style/ViewStyle.cs
src/Tizen.NUI/src/public/BaseComponents/Style/ViewStyleBindableProperty.cs
src/Tizen.NUI/src/public/BaseComponents/TextField.cs
src/Tizen.NUI/src/public/BaseComponents/TextLabel.cs
src/Tizen.NUI/src/public/BaseComponents/View.cs
src/Tizen.NUI/src/public/BaseComponents/ViewBindableProperty.cs
src/Tizen.NUI/src/public/BaseComponents/ViewInternal.cs
src/Tizen.NUI/src/public/Color.cs
src/Tizen.NUI/src/public/Extents.cs
src/Tizen.NUI/src/public/Position.cs
src/Tizen.NUI/src/public/Position2D.cs
src/Tizen.NUI/src/public/Rectangle.cs
src/Tizen.NUI/src/public/Size.cs
src/Tizen.NUI/src/public/Size2D.cs
src/Tizen.NUI/src/public/StyleManager.cs
src/Tizen.NUI/src/public/Theme/Theme.cs [new file with mode: 0644]
src/Tizen.NUI/src/public/Theme/ThemeChangedEventArgs.cs [new file with mode: 0644]
src/Tizen.NUI/src/public/Theme/ThemeManager.cs [new file with mode: 0644]
src/Tizen.NUI/src/public/Vector2.cs
src/Tizen.NUI/src/public/Vector3.cs
src/Tizen.NUI/src/public/Vector4.cs
src/Tizen.NUI/src/public/ViewProperty/ImageShadow.cs
src/Tizen.NUI/src/public/ViewProperty/Shadow.cs
src/Tizen.NUI/src/public/ViewProperty/ShadowBase.cs
src/Tizen.NUI/src/public/ViewProperty/TextShadow.cs
src/Tizen.NUI/src/public/Xaml/MarkupExtensions/ApplicationResourcePathExtension.cs [new file with mode: 0644]
src/Tizen.NUI/src/public/Xaml/MarkupExtensions/NUIResourcePathExtension.cs [new file with mode: 0644]
src/Tizen.NUI/src/public/XamlBinding/BindableObject.cs

index 9ab7334..9e7a3bd 100755 (executable)
@@ -30,7 +30,16 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         protected virtual TextLabel CreateText()
         {
-            return new TextLabel();
+            return new TextLabel
+            {
+                PositionUsesPivotPoint = true,
+                ParentOrigin = NUI.ParentOrigin.Center,
+                PivotPoint = NUI.PivotPoint.Center,
+                WidthResizePolicy = ResizePolicyType.FillToParent,
+                HeightResizePolicy = ResizePolicyType.FillToParent,
+                HorizontalAlignment = HorizontalAlignment.Center,
+                VerticalAlignment = VerticalAlignment.Center
+            };
         }
 
         /// <summary>
@@ -40,7 +49,12 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         protected virtual ImageView CreateIcon()
         {
-            return new ImageView();
+            return new ImageView
+            {
+                PositionUsesPivotPoint = true,
+                ParentOrigin = NUI.ParentOrigin.Center,
+                PivotPoint = NUI.PivotPoint.Center
+            };
         }
 
         /// <summary>
@@ -50,7 +64,14 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         protected virtual ImageView CreateOverlayImage()
         {
-            return new ImageView();
+            return new ImageView
+            {
+                PositionUsesPivotPoint = true,
+                ParentOrigin = NUI.ParentOrigin.Center,
+                PivotPoint = NUI.PivotPoint.Center,
+                WidthResizePolicy = ResizePolicyType.FillToParent,
+                HeightResizePolicy = ResizePolicyType.FillToParent
+            };
         }
 
         /// <summary>
@@ -185,12 +206,12 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         protected virtual void MeasureText()
         {
-            if (Icon == null || TextLabel == null)
+            if (buttonIcon == null || buttonText == null)
             {
                 return;
             }
-            TextLabel.WidthResizePolicy = ResizePolicyType.Fixed;
-            TextLabel.HeightResizePolicy = ResizePolicyType.Fixed;
+            buttonText.WidthResizePolicy = ResizePolicyType.Fixed;
+            buttonText.HeightResizePolicy = ResizePolicyType.Fixed;
             int textPaddingStart = buttonStyle.TextPadding.Start;
             int textPaddingEnd = buttonStyle.TextPadding.End;
             int textPaddingTop = buttonStyle.TextPadding.Top;
@@ -203,13 +224,13 @@ namespace Tizen.NUI.Components
 
             if (IconRelativeOrientation == IconOrientation.Top || IconRelativeOrientation == IconOrientation.Bottom)
             {
-                TextLabel.SizeWidth = SizeWidth - textPaddingStart - textPaddingEnd;
-                TextLabel.SizeHeight = SizeHeight - textPaddingTop - textPaddingBottom - iconPaddingTop - iconPaddingBottom - Icon.SizeHeight;
+                buttonText.SizeWidth = SizeWidth - textPaddingStart - textPaddingEnd;
+                buttonText.SizeHeight = SizeHeight - textPaddingTop - textPaddingBottom - iconPaddingTop - iconPaddingBottom - buttonIcon.SizeHeight;
             }
             else
             {
-                TextLabel.SizeWidth = SizeWidth - textPaddingStart - textPaddingEnd - iconPaddingStart - iconPaddingEnd - Icon.SizeWidth;
-                TextLabel.SizeHeight = SizeHeight - textPaddingTop - textPaddingBottom;
+                buttonText.SizeWidth = SizeWidth - textPaddingStart - textPaddingEnd - iconPaddingStart - iconPaddingEnd - buttonIcon.SizeWidth;
+                buttonText.SizeHeight = SizeHeight - textPaddingTop - textPaddingBottom;
             }
         }
 
@@ -221,14 +242,11 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         protected virtual void LayoutChild()
         {
-            if (Icon == null || TextLabel == null)
+            if (buttonIcon == null || buttonText == null)
             {
                 return;
             }
 
-            var buttonIcon = Icon;
-            var buttonText = TextLabel;
-
             int textPaddingStart = buttonStyle.TextPadding.Start;
             int textPaddingEnd = buttonStyle.TextPadding.End;
             int textPaddingTop = buttonStyle.TextPadding.Top;
@@ -327,22 +345,6 @@ namespace Tizen.NUI.Components
         }
 
         /// <summary>
-        /// Theme change callback when theme is changed, this callback will be trigger.
-        /// </summary>
-        /// <param name="sender">The sender</param>
-        /// <param name="e">The event data</param>
-        [EditorBrowsable(EditorBrowsableState.Never)]
-        protected override void OnThemeChangedEvent(object sender, StyleManager.ThemeChangeEventArgs e)
-        {
-            ButtonStyle buttonStyle = StyleManager.Instance.GetViewStyle(StyleName) as ButtonStyle;
-            if (buttonStyle != null)
-            {
-                ApplyStyle(buttonStyle);
-                UpdateUIContent();
-            }
-        }
-
-        /// <summary>
         /// Dispose Button and all children on it.
         /// </summary>
         /// <param name="type">Dispose type.</param>
@@ -358,17 +360,17 @@ namespace Tizen.NUI.Components
             {
                 Extension?.OnDispose(this);
 
-                if (Icon != null)
+                if (buttonIcon != null)
                 {
-                    Utility.Dispose(Icon);
+                    Utility.Dispose(buttonIcon);
                 }
-                if (TextLabel != null)
+                if (buttonText != null)
                 {
-                    Utility.Dispose(TextLabel);
+                    Utility.Dispose(buttonText);
                 }
-                if (OverlayImage != null)
+                if (overlayImage != null)
                 {
-                    Utility.Dispose(OverlayImage);
+                    Utility.Dispose(overlayImage);
                 }
             }
 
index 115ef2d..e8f3bf7 100755 (executable)
@@ -64,18 +64,21 @@ namespace Tizen.NUI.Components
             var instance = (Button)bindable;
             if (newValue != null)
             {
-                if (instance.buttonStyle != null && (!instance.styleApplied || instance.buttonStyle.IsEnabled != (bool)newValue))
+                bool newEnabled = (bool)newValue;
+                if (instance.isEnabled != newEnabled)
                 {
-                    instance.buttonStyle.IsEnabled = (bool)newValue;
+                    instance.isEnabled = newEnabled;
+
+                    if (instance.buttonStyle != null)
+                    {
+                        instance.buttonStyle.IsEnabled = newEnabled;
+                    }
+
                     instance.UpdateState();
                 }
             }
         },
-        defaultValueCreator: (bindable) =>
-        {
-            var instance = (Button)bindable;
-            return instance.buttonStyle?.IsEnabled ?? true;
-        });
+        defaultValueCreator: (bindable) => ((Button)bindable).isEnabled);
         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
         [EditorBrowsable(EditorBrowsableState.Never)]
         public static readonly BindableProperty IsSelectedProperty = BindableProperty.Create(nameof(IsSelected), typeof(bool), typeof(Button), true, propertyChanged: (bindable, oldValue, newValue) =>
@@ -83,17 +86,27 @@ namespace Tizen.NUI.Components
             var instance = (Button)bindable;
             if (newValue != null)
             {
-                if (instance.buttonStyle != null && instance.IsSelectable && (!instance.styleApplied || instance.buttonStyle.IsSelected != (bool)newValue))
+                bool newSelected = (bool)newValue;
+                if (instance.isSelected != newSelected)
                 {
-                    instance.buttonStyle.IsSelected = (bool)newValue;
-                    instance.UpdateState();
+                    instance.isSelected = newSelected;
+
+                    if (instance.buttonStyle != null)
+                    {
+                        instance.buttonStyle.IsSelected = newSelected;
+                    }
+
+                    if (instance.isSelectable)
+                    {
+                        instance.UpdateState();
+                    }
                 }
             }
         },
         defaultValueCreator: (bindable) =>
         {
             var instance = (Button)bindable;
-            return instance.IsSelectable && (instance.buttonStyle.IsSelected ?? false);
+            return instance.isSelectable && instance.isSelected;
         });
         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
         [EditorBrowsable(EditorBrowsableState.Never)]
@@ -102,17 +115,22 @@ namespace Tizen.NUI.Components
             var instance = (Button)bindable;
             if (newValue != null)
             {
-                if (instance.buttonStyle != null && (!instance.styleApplied || instance.buttonStyle.IsSelectable != (bool)newValue))
+                bool newSelectable = (bool)newValue;
+                if (instance.isSelectable != newSelectable)
                 {
-                    instance.buttonStyle.IsSelectable = (bool)newValue;
+                    instance.isSelectable = newSelectable;
+
+                    if (instance.buttonStyle != null)
+                    {
+                        instance.buttonStyle.IsSelectable = newSelectable;
+                    }
+
+                    instance.UpdateState();
                 }
             }
         },
-        defaultValueCreator: (bindable) =>
-        {
-            var instance = (Button)bindable;
-            return instance.buttonStyle?.IsSelectable ?? false;
-        });
+        defaultValueCreator: (bindable) => ((Button)bindable).isSelectable);
+
         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
         [EditorBrowsable(EditorBrowsableState.Never)]
         public static readonly BindableProperty IconPaddingProperty = BindableProperty.Create(nameof(IconPadding), typeof(Extents), typeof(Button), null, propertyChanged: (bindable, oldValue, newValue) =>
@@ -146,6 +164,10 @@ namespace Tizen.NUI.Components
             return instance.buttonStyle?.TextPadding;
         });
 
+        private bool isSelected = false;
+        private bool isSelectable = false;
+        private bool isEnabled = true;
+
         static Button() { }
 
         /// <summary>
@@ -250,8 +272,11 @@ namespace Tizen.NUI.Components
                     {
                         buttonIcon = Extension.OnCreateIcon(this, buttonIcon);
                     }
-                    Add(buttonIcon);
-                    buttonIcon.Relayout += OnIconRelayout;
+                    if (null != buttonIcon)
+                    {
+                        Add(buttonIcon);
+                        buttonIcon.Relayout += OnIconRelayout;
+                    }
                 }
                 return buttonIcon;
             }
@@ -276,9 +301,10 @@ namespace Tizen.NUI.Components
                     {
                         overlayImage = Extension.OnCreateOverlayImage(this, overlayImage);
                     }
-                    overlayImage.WidthResizePolicy = ResizePolicyType.FillToParent;
-                    overlayImage.HeightResizePolicy = ResizePolicyType.FillToParent;
-                    Add(overlayImage);
+                    if (null != overlayImage)
+                    {
+                        Add(overlayImage);
+                    }
                 }
                 return overlayImage;
             }
@@ -303,9 +329,10 @@ namespace Tizen.NUI.Components
                     {
                         buttonText = Extension.OnCreateText(this, buttonText);
                     }
-                    buttonText.HorizontalAlignment = HorizontalAlignment.Center;
-                    buttonText.VerticalAlignment = VerticalAlignment.Center;
-                    Add(buttonText);
+                    if (null != buttonText)
+                    {
+                        Add(buttonText);
+                    }
                 }
                 return buttonText;
             }
@@ -783,47 +810,5 @@ namespace Tizen.NUI.Components
             [Obsolete("Deprecated in API8; Will be removed in API10")]
             public ControlStates CurrentState;
         }
-
-        /// <summary>
-        /// Get current text part to the attached ButtonExtension.
-        /// </summary>
-        /// <remarks>
-        /// It returns null if the passed extension is invalid.
-        /// </remarks>
-        /// <param name="extension">The extension instance that is currently attached to this Button.</param>
-        /// <return>The button's text part.</return>
-        [EditorBrowsable(EditorBrowsableState.Never)]
-        public TextLabel GetCurrentText(ButtonExtension extension)
-        {
-            return (extension == Extension) ? TextLabel : null;
-        }
-
-        /// <summary>
-        /// Get current icon part to the attached ButtonExtension.
-        /// </summary>
-        /// <remarks>
-        /// It returns null if the passed extension is invalid.
-        /// </remarks>
-        /// <param name="extension">The extension instance that is currently attached to this Button.</param>
-        /// <return>The button's icon part.</return>
-        [EditorBrowsable(EditorBrowsableState.Never)]
-        public ImageView GetCurrentIcon(ButtonExtension extension)
-        {
-            return (extension == Extension) ? Icon : null;
-        }
-
-        /// <summary>
-        /// Get current overlay image part to the attached ButtonExtension.
-        /// </summary>
-        /// <remarks>
-        /// It returns null if the passed extension is invalid.
-        /// </remarks>
-        /// <param name="extension">The extension instance that is currently attached to this Button.</param>
-        /// <return>The button's overlay image part.</return>
-        [EditorBrowsable(EditorBrowsableState.Never)]
-        public ImageView GetCurrentOverlayImage(ButtonExtension extension)
-        {
-            return (extension == Extension) ? OverlayImage : null;
-        }
     }
 }
index 54e9c93..1906135 100755 (executable)
@@ -40,6 +40,8 @@ namespace Tizen.NUI.Components
         public static readonly BindableProperty CommandParameterProperty = BindableProperty.Create("CommandParameter", typeof(object), typeof(Button), null,
             propertyChanged: (bindable, oldvalue, newvalue) => ((Button)bindable).CommandCanExecuteChanged(bindable, EventArgs.Empty));
 
+        private bool onThemeChangedEventOverrideChecker;
+
         /// <summary> Control style. </summary>
         /// <since_tizen> 6 </since_tizen>
         /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
@@ -62,18 +64,9 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         public Control() : base()
         {
-            var cur_type = this.GetType();
-            ViewStyle viewStyle = null;
-
-            do
-            {
-                if (cur_type.Equals(typeof(Tizen.NUI.Components.Control))) break;
-                viewStyle = StyleManager.Instance.GetComponentStyle(cur_type);
-                cur_type = cur_type.BaseType;
-            }
-            while (viewStyle == null);
+            ViewStyle viewStyle = ThemeManager.GetStyle(GetType());
 
-            if (viewStyle != null)
+            if (viewStyle != null && ViewStyle?.GetType() == viewStyle.GetType())
             {
                 ApplyStyle(viewStyle);
             }
@@ -110,6 +103,7 @@ namespace Tizen.NUI.Components
 
             ApplyStyle(viewStyle);
             this.StyleName = styleName;
+            ThemeChangeSensitive = true;
 
             Initialize();
         }
@@ -170,7 +164,6 @@ namespace Tizen.NUI.Components
 
             if (type == DisposeTypes.Explicit)
             {
-                StyleManager.Instance.ThemeChangedEvent -= OnThemeChangedEvent;
                 tapGestureDetector.Detected -= OnTapGestureDetected;
                 tapGestureDetector.Detach(this);
             }
@@ -252,13 +245,17 @@ namespace Tizen.NUI.Components
 
         /// <summary>
         /// Theme change callback when theme is changed, this callback will be trigger.
+        /// Note that it is deprecated API.Please use OnThemeChanged instead.
         /// </summary>
         /// <param name="sender">The sender</param>
         /// <param name="e">The event data</param>
         /// <since_tizen> 6 </since_tizen>
         /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
         [EditorBrowsable(EditorBrowsableState.Never)]
-        protected virtual void OnThemeChangedEvent(object sender, StyleManager.ThemeChangeEventArgs e) { }
+        protected virtual void OnThemeChangedEvent(object sender, StyleManager.ThemeChangeEventArgs e)
+        {
+            onThemeChangedEventOverrideChecker = false;
+        }
 
         /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
         [EditorBrowsable(EditorBrowsableState.Never)]
@@ -267,6 +264,32 @@ namespace Tizen.NUI.Components
             return new ControlStyle();
         }
 
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        protected override void OnThemeChanged(object sender, ThemeChangedEventArgs e)
+        {
+            // TODO Remove checker after update Tizen.FH.NUI.
+            onThemeChangedEventOverrideChecker = true;
+
+            OnThemeChangedEvent(sender, new StyleManager.ThemeChangeEventArgs { CurrentTheme = e.ThemeId });
+
+            if (onThemeChangedEventOverrideChecker) return;
+
+            // If the OnThemeChangedEvent is not implemented, ApplyStyle()
+            if (string.IsNullOrEmpty(StyleName))
+            {
+                base.OnThemeChanged(sender, e);
+                return;
+            }
+
+            ViewStyle newStyle = ThemeManager.GetStyle(StyleName);
+
+            if (newStyle != null)
+            {
+                ApplyStyle(newStyle);
+            }
+        }
+
         private void Initialize()
         {
             LeaveRequired = true;
@@ -277,8 +300,6 @@ namespace Tizen.NUI.Components
             tapGestureDetector.Detected += OnTapGestureDetected;
 
             EnableControlState = true;
-
-            StyleManager.Instance.ThemeChangedEvent += OnThemeChangedEvent;
         }
     }
 }
index 548a82f..d03c56d 100755 (executable)
@@ -24,7 +24,7 @@ namespace Tizen.NUI.Components
             [EditorBrowsable(EditorBrowsableState.Never)]
             public DropDownDataItem()
             {
-                itemDataStyle = (DropDownItemStyle)StyleManager.Instance.GetComponentStyle(this.GetType());
+                itemDataStyle = (DropDownItemStyle)ThemeManager.GetStyle(typeof(DropDownDataItem));
                 Initialize();
             }
 
index cdb194b..922e89a 100644 (file)
@@ -48,6 +48,10 @@ namespace Tizen.NUI.Components.Extension
         [EditorBrowsable(EditorBrowsableState.Never)]
         public override ImageView OnCreateIcon(Button button, ImageView icon)
         {
+            LottieView.PositionUsesPivotPoint = true;
+            LottieView.ParentOrigin = NUI.ParentOrigin.Center;
+            LottieView.PivotPoint = NUI.PivotPoint.Center;
+
             InitializeLottieView(button, LottieView);
 
             return LottieView;
index 246bde2..e623242 100644 (file)
@@ -47,6 +47,10 @@ namespace Tizen.NUI.Components.Extension
         [EditorBrowsable(EditorBrowsableState.Never)]
         public override ImageView OnCreateIcon(Button button, ImageView icon)
         {
+            LottieView.PositionUsesPivotPoint = true;
+            LottieView.ParentOrigin = NUI.ParentOrigin.Center;
+            LottieView.PivotPoint = NUI.PivotPoint.Center;
+
             LottieButtonExtension.InitializeLottieView(button, LottieView);
 
             return LottieView;
index 4cfe86f..8962036 100755 (executable)
@@ -497,22 +497,6 @@ namespace Tizen.NUI.Components
             return new ScrollBarStyle();
         }
 
-        /// <summary>
-        /// Theme change callback when theme is changed, this callback will be trigger.
-        /// </summary>
-        /// <param name="sender">The sender</param>
-        /// <param name="e">The event data</param>
-        [EditorBrowsable(EditorBrowsableState.Never)]
-        protected override void OnThemeChangedEvent(object sender, StyleManager.ThemeChangeEventArgs e)
-        {
-            ScrollBarStyle tempStyle = StyleManager.Instance.GetViewStyle(StyleName) as ScrollBarStyle;
-            if (tempStyle != null)
-            {
-                Style.CopyFrom(tempStyle);
-                UpdateValue();
-            }
-        }
-
         private void Initialize()
         {
             this.Focusable = false;
index 08da492..df0245e 100755 (executable)
@@ -75,7 +75,7 @@ namespace Tizen.NUI.Components
                 int frameRate = (int)newValue;
                 if (0 != frameRate) //It will crash if 0
                 {
-                    instance.loadingStyle.FrameRate.All = frameRate;
+                    instance.loadingStyle.FrameRate = frameRate;
                     instance.imageVisual.FrameDelay = 1000.0f / frameRate;
                 }
             }
index 9a44d4a..f0ffc67 100755 (executable)
@@ -357,7 +357,14 @@ namespace Tizen.NUI.Components
             {
                 if (null == titleText)
                 {
-                    titleText = new TextLabel();
+                    titleText = new TextLabel
+                    {
+                        PositionUsesPivotPoint = true,
+                        ParentOrigin = Tizen.NUI.ParentOrigin.TopLeft,
+                        PivotPoint = Tizen.NUI.PivotPoint.TopLeft,
+                        HorizontalAlignment = HorizontalAlignment.Begin,
+                        VerticalAlignment = VerticalAlignment.Bottom
+                    };
                     Add(titleText);
                 }
                 return titleText;
@@ -743,6 +750,12 @@ namespace Tizen.NUI.Components
             PopupStyle ppStyle = viewStyle as PopupStyle;
             if (null != ppStyle)
             {
+                if (ppStyle.Buttons != null)
+                {
+                    if (ppStyle.Buttons.PositionUsesPivotPoint == null) ppStyle.Buttons.PositionUsesPivotPoint = true;
+                    if (ppStyle.Buttons.ParentOrigin == null) ppStyle.Buttons.ParentOrigin = Tizen.NUI.ParentOrigin.BottomLeft;
+                    if (ppStyle.Buttons.PivotPoint == null) ppStyle.Buttons.PivotPoint = Tizen.NUI.PivotPoint.BottomLeft;
+                }
                 Title.ApplyStyle(ppStyle.Title);
                 Title.RaiseToTop();
             }
@@ -758,20 +771,12 @@ namespace Tizen.NUI.Components
             return new PopupStyle();
         }
 
-        /// <summary>
-        /// Theme change callback when theme is changed, this callback will be trigger.
-        /// </summary>
-        /// <param name="sender">The sender</param>
-        /// <param name="e">The event data</param>
+        /// <inheritdoc/>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        protected override void OnThemeChangedEvent(object sender, StyleManager.ThemeChangeEventArgs e)
+        protected override void OnUpdate()
         {
-            PopupStyle ppStyle = StyleManager.Instance.GetViewStyle(StyleName) as PopupStyle;
-            if (ppStyle != null)
-            {
-                ApplyStyle(ppStyle);
-                UpdateView();
-            }
+            base.OnUpdate();
+            UpdateView();
         }
 
         private void Initialize()
@@ -799,6 +804,7 @@ namespace Tizen.NUI.Components
 
         private void UpdateView()
         {
+            if (popupStyle == null) return;
             btGroup.UpdateButton(popupStyle.Buttons);
             UpdateContentView();
             UpdateTitle();
index 42f6ae0..5b18b4a 100755 (executable)
@@ -426,22 +426,6 @@ namespace Tizen.NUI.Components
         }
 
         /// <summary>
-        /// Theme change callback when theme is changed, this callback will be trigger.
-        /// </summary>
-        /// <param name="sender">The sender</param>
-        /// <param name="e">The event data</param>
-        [EditorBrowsable(EditorBrowsableState.Never)]
-        protected override void OnThemeChangedEvent(object sender, StyleManager.ThemeChangeEventArgs e)
-        {
-            ProgressStyle tempStyle = StyleManager.Instance.GetViewStyle(StyleName) as ProgressStyle;
-            if (null != tempStyle)
-            {
-                progressStyle.CopyFrom(tempStyle);
-                RelayoutRequest();
-            }
-        }
-
-        /// <summary>
         /// Change Image status. It can be override.
         /// </summary>
         /// <since_tizen> 6 </since_tizen>
index 6a01a63..6780799 100755 (executable)
@@ -122,7 +122,7 @@ namespace Tizen.NUI.Components
         /// <summary>
         /// Create an empty Scrollbar.
         /// </summary>
-        public Scrollbar() : base(new ScrollbarStyle())
+        public Scrollbar() : base(ThemeManager.GetStyle(typeof(Scrollbar)))
         {
         }
 
@@ -134,7 +134,7 @@ namespace Tizen.NUI.Components
         /// <param name="currentPosition">The current position of the viewport in scrollable content area. This is the viewport's top position if the scroller is vertical, otherwise, left.</param>
         /// <param name="isHorizontal">Whether the direction of scrolling is horizontal or not. It is vertical by default.</param>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        public Scrollbar(float contentLength, float viewportLength, float currentPosition, bool isHorizontal = false) : base(new ScrollbarStyle())
+        public Scrollbar(float contentLength, float viewportLength, float currentPosition, bool isHorizontal = false) : this()
         {
             Initialize(contentLength, viewportLength, currentPosition, isHorizontal);
         }
@@ -402,6 +402,25 @@ namespace Tizen.NUI.Components
 
         /// <inheritdoc/>
         [EditorBrowsable(EditorBrowsableState.Never)]
+        public override void ApplyStyle(ViewStyle viewStyle)
+        {
+            base.ApplyStyle(viewStyle);
+
+            if (viewStyle is ScrollbarStyle scrollbarStyle)
+            {
+                // Apply essential look.
+                if (scrollbarStyle.TrackThickness == null) scrollbarStyle.TrackThickness = 6.0f;
+                if (scrollbarStyle.ThumbThickness == null) scrollbarStyle.ThumbThickness = 6.0f;
+                if (scrollbarStyle.TrackColor == null) scrollbarStyle.TrackColor = new Color(1.0f, 1.0f, 1.0f, 0.15f);
+                if (scrollbarStyle.ThumbColor == null) scrollbarStyle.ThumbColor = new Color(0.6f, 0.6f, 0.6f, 1.0f);
+                if (scrollbarStyle.TrackPadding == null) scrollbarStyle.TrackPadding = 4;
+                if (scrollbarStyle.WidthResizePolicy == null) scrollbarStyle.WidthResizePolicy = ResizePolicyType.FillToParent;
+                if (scrollbarStyle.HeightResizePolicy == null) scrollbarStyle.HeightResizePolicy = ResizePolicyType.FillToParent;
+            }
+        }
+
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
         protected override ViewStyle CreateViewStyle()
         {
             return new ScrollbarStyle();
@@ -615,12 +634,12 @@ namespace Tizen.NUI.Components
 
             public override Size CalculateTrackSize(float thickness, Size containerSize, Extents trackPadding)
             {
-                return new Size(containerSize.Width - trackPadding.Start - trackPadding.End, thickness);
+                return new Size(containerSize.Width - trackPadding?.Start??0 - trackPadding?.End??0, thickness);
             }
 
             public override Vector2 CalculateTrackPosition(Extents trackPadding)
             {
-                return new Vector2(0, -trackPadding.Bottom);
+                return new Vector2(0, -trackPadding?.Bottom??0);
             }
 
             public override Size CalculateThumbSize(float thickness, Size trackSize)
@@ -630,21 +649,21 @@ namespace Tizen.NUI.Components
 
             public override Vector2 CalculateThumbPosition(Size trackSize, Size thumbSize, Extents trackPadding)
             {
-                float padding = ((trackSize.Height - thumbSize.Height) / 2.0f) + trackPadding.Bottom;
+                float padding = ((trackSize.Height - thumbSize.Height) / 2.0f) + trackPadding?.Bottom??0;
                 float pos = Math.Min(Math.Max(currentPosition, 0.0f), contentLength - visibleLength);
-                return new Vector2(trackPadding.Start + trackSize.Width * pos / contentLength, -padding);
+                return new Vector2(trackPadding?.Start??0 + trackSize.Width * pos / contentLength, -padding);
             }
 
             public override Vector2 CalculateThumbPaddingPosition(Size trackSize, Size thumbSize, Vector2 thumbCurrentPosition, Extents trackPadding)
             {
-                float padding = ((trackSize.Height - thumbSize.Height) / 2.0f) + trackPadding.Bottom;
+                float padding = ((trackSize.Height - thumbSize.Height) / 2.0f) + trackPadding?.Bottom??0;
                 return new Vector2(thumbCurrentPosition.X, -padding);
             }
 
             public override Vector2 CalculateThumbScrollPosition(Size trackSize, Vector2 thumbCurrentPosition, Extents trackPadding)
             {
                 float pos = Math.Min(Math.Max(currentPosition, 0.0f), contentLength - visibleLength);
-                return new Vector2(trackPadding.Start + trackSize.Width * pos / contentLength, thumbCurrentPosition.Y);
+                return new Vector2(trackPadding?.Start??0 + trackSize.Width * pos / contentLength, thumbCurrentPosition.Y);
             }
         }
 
@@ -666,12 +685,12 @@ namespace Tizen.NUI.Components
 
             public override Size CalculateTrackSize(float thickness, Size containerSize, Extents trackPadding)
             {
-                return new Size(thickness, containerSize.Height - trackPadding.Top - trackPadding.Bottom);
+                return new Size(thickness, containerSize.Height - trackPadding?.Top??0 - trackPadding?.Bottom??0);
             }
 
             public override Vector2 CalculateTrackPosition(Extents trackPadding)
             {
-                return new Vector2(-trackPadding.End, 0);
+                return new Vector2(-trackPadding?.End??0, 0);
             }
 
             public override Size CalculateThumbSize(float thickness, Size trackSize)
@@ -681,21 +700,21 @@ namespace Tizen.NUI.Components
 
             public override Vector2 CalculateThumbPosition(Size trackSize, Size thumbSize, Extents trackPadding)
             {
-                float padding = ((trackSize.Width - thumbSize.Width) / 2.0f) + trackPadding.End;
+                float padding = ((trackSize.Width - thumbSize.Width) / 2.0f) + trackPadding?.End??0;
                 float pos = Math.Min(Math.Max(currentPosition, 0.0f), contentLength - visibleLength);
-                return new Vector2(-padding, trackPadding.Top + trackSize.Height * pos / contentLength);
+                return new Vector2(-padding, trackPadding?.Top??0 + trackSize.Height * pos / contentLength);
             }
 
             public override Vector2 CalculateThumbPaddingPosition(Size trackSize, Size thumbSize, Vector2 thumbCurrentPosition, Extents trackPadding)
             {
-                float padding = ((trackSize.Width - thumbSize.Width) / 2.0f) + trackPadding.End;
+                float padding = ((trackSize.Width - thumbSize.Width) / 2.0f) + trackPadding?.End??0;
                 return new Vector2(-padding, thumbCurrentPosition.Y);
             }
 
             public override Vector2 CalculateThumbScrollPosition(Size trackSize, Vector2 thumbPosition, Extents trackPadding)
             {
                 float pos = Math.Min(Math.Max(currentPosition, 0.0f), contentLength - visibleLength);
-                return new Vector2(thumbPosition.X, trackPadding.Top + trackSize.Height * pos / contentLength);
+                return new Vector2(thumbPosition.X, trackPadding?.Top??0 + trackSize.Height * pos / contentLength);
             }
         }
 
index 66d7bc6..80c7278 100755 (executable)
@@ -904,22 +904,6 @@ namespace Tizen.NUI.Components
             UpdateValue();
         }
 
-        /// <summary>
-        /// Theme change callback when theme is changed, this callback will be trigger.
-        /// </summary>
-        /// <param name="sender">The sender</param>
-        /// <param name="e">The event data</param>
-        [EditorBrowsable(EditorBrowsableState.Never)]
-        protected override void OnThemeChangedEvent(object sender, StyleManager.ThemeChangeEventArgs e)
-        {
-            SliderStyle sliderStyle = StyleManager.Instance.GetViewStyle(StyleName) as SliderStyle;
-            if (sliderStyle != null)
-            {
-                ApplyStyle(sliderStyle);
-                RelayoutRequest();
-            }
-        }
-
         private void CalculateCurrentValueByGesture(float offset)
         {
             currentSlidedOffset += offset;
index 179c1eb..e0487ca 100755 (executable)
@@ -316,21 +316,6 @@ namespace Tizen.NUI.Components
             IsSelectable = true;
         }
 
-        /// <summary>
-        /// Theme change callback when theme is changed, this callback will be trigger.
-        /// </summary>
-        /// <param name="sender">The sender</param>
-        /// <param name="e">The event data</param>
-        [EditorBrowsable(EditorBrowsableState.Never)]
-        protected override void OnThemeChangedEvent(object sender, StyleManager.ThemeChangeEventArgs e)
-        {
-            SwitchStyle switchStyle = StyleManager.Instance.GetViewStyle(StyleName) as SwitchStyle;
-            if (null != switchStyle)
-            {
-                ApplyStyle(switchStyle);
-            }
-        }
-
         private void OnSelect()
         {
             ((SwitchExtension)Extension)?.OnSelectedChanged(this);
index b569788..df33271 100755 (executable)
@@ -498,21 +498,6 @@ namespace Tizen.NUI.Components
         }
 
         /// <summary>
-        /// Theme change callback when theme is changed, this callback will be trigger.
-        /// </summary>
-        /// <param name="sender">The sender</param>
-        /// <param name="e">The event data</param>
-        [EditorBrowsable(EditorBrowsableState.Never)]
-        protected override void OnThemeChangedEvent(object sender, StyleManager.ThemeChangeEventArgs e)
-        {
-            TabStyle tabStyle = StyleManager.Instance.GetViewStyle(StyleName) as TabStyle;
-            if (tabStyle != null)
-            {
-                ApplyStyle(tabStyle);
-            }
-        }
-
-        /// <summary>
         /// Layout child in Tab and it can be override by user.
         /// </summary>
         /// <since_tizen> 6 </since_tizen>
index c8cafad..99b16dd 100755 (executable)
@@ -326,7 +326,16 @@ namespace Tizen.NUI.Components
             {
                 if (null == textLabel)
                 {
-                    textLabel = new TextLabel();
+                    textLabel = new TextLabel()
+                    {
+                        PositionUsesPivotPoint = true,
+                        ParentOrigin = Tizen.NUI.ParentOrigin.Center,
+                        PivotPoint = Tizen.NUI.PivotPoint.Center,
+                        WidthResizePolicy = ResizePolicyType.UseNaturalSize,
+                        HeightResizePolicy = ResizePolicyType.UseNaturalSize,
+                        HorizontalAlignment = HorizontalAlignment.Center,
+                        VerticalAlignment = VerticalAlignment.Center,
+                    };
                     this.Add(textLabel);
                 }
                 textLabel.ApplyStyle(toastStyle.Text);
@@ -379,7 +388,16 @@ namespace Tizen.NUI.Components
         {
             if (null == textLabel)
             {
-                textLabel = new TextLabel();
+                textLabel = new TextLabel()
+                {
+                    PositionUsesPivotPoint = true,
+                    ParentOrigin = Tizen.NUI.ParentOrigin.Center,
+                    PivotPoint = Tizen.NUI.PivotPoint.Center,
+                    WidthResizePolicy = ResizePolicyType.UseNaturalSize,
+                    HeightResizePolicy = ResizePolicyType.UseNaturalSize,
+                    HorizontalAlignment = HorizontalAlignment.Center,
+                    VerticalAlignment = VerticalAlignment.Center,
+                };
                 this.Add(textLabel);
             }
 
diff --git a/src/Tizen.NUI.Components/PreloadStyle/DefaultTheme.cs b/src/Tizen.NUI.Components/PreloadStyle/DefaultTheme.cs
deleted file mode 100755 (executable)
index 8ebd6fb..0000000
+++ /dev/null
@@ -1,445 +0,0 @@
-/*
- * Copyright(c) 2020 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-using System.ComponentModel;
-using Tizen.NUI.BaseComponents;
-
-namespace Tizen.NUI.Components
-{
-    /// <summary>
-    /// Interface that includes styles for all components for a default theme
-    /// </summary>
-    [EditorBrowsable(EditorBrowsableState.Never)]
-    internal class DefaultTheme : Theme
-    {
-        internal static Theme Instance { get; } = new DefaultTheme();
-
-        protected DefaultTheme() : base()
-        {
-        }
-
-        protected override ButtonStyle GetButtonStyle()
-        {
-            return new ButtonStyle
-            {
-                Size = new Size(100, 45),
-                BackgroundColor = new Selector<Color>
-                {
-                    Normal = new Color(0.88f, 0.88f, 0.88f, 1),
-                    Pressed = new Color(0.77f, 0.77f, 0.77f, 1),
-                    Disabled = new Color(0.88f, 0.88f, 0.88f, 1)
-                },
-                Text = new TextLabelStyle
-                {
-                    PointSize = new Selector<float?> { All = StyleManager.PointSizeNormal },
-                    WidthResizePolicy = ResizePolicyType.FillToParent,
-                    HeightResizePolicy = ResizePolicyType.FillToParent,
-                    HorizontalAlignment = HorizontalAlignment.Center,
-                    VerticalAlignment = VerticalAlignment.Center,
-                    TextColor = new Selector<Color>
-                    {
-                        Normal = new Color(0.22f, 0.22f, 0.22f, 1),
-                        Pressed = new Color(0.11f, 0.11f, 0.11f, 1),
-                        Disabled = new Color(0.66f, 0.66f, 0.66f, 1)
-                    },
-                    Text = "Button",
-                }
-            };
-        }
-
-        protected override ButtonStyle GetCheckBoxStyle()
-        {
-            return new ButtonStyle
-            {
-                Size = new Size(30, 30),
-                Icon = new ImageViewStyle
-                {
-                    WidthResizePolicy = ResizePolicyType.DimensionDependency,
-                    HeightResizePolicy = ResizePolicyType.SizeRelativeToParent,
-                    SizeModeFactor = new Vector3(1, 1, 1),
-                    Opacity = new Selector<float?>
-                    {
-                        Normal = 1.0f,
-                        Selected = 1.0f,
-                        Disabled = 0.4f,
-                        DisabledSelected = 0.4f
-                    },
-                    BackgroundImage = new Selector<string>
-                    {
-                        Normal = StyleManager.GetFrameworkResourcePath("nui_component_default_checkbox_bg_n.png"),
-                        Pressed = StyleManager.GetFrameworkResourcePath("nui_component_default_checkbox_bg_p.png"),
-                        Selected = StyleManager.GetFrameworkResourcePath("nui_component_default_checkbox_bg_p.png"),
-                        Disabled = StyleManager.GetFrameworkResourcePath("nui_component_default_checkbox_bg_n.png"),
-                        DisabledSelected = StyleManager.GetFrameworkResourcePath("nui_component_default_checkbox_bg_p.png"),
-                    },
-                    ResourceUrl = new Selector<string>
-                    {
-                        Normal = "",
-                        Pressed = "",
-                        Selected = StyleManager.GetFrameworkResourcePath("nui_component_default_checkbox_s.png"),
-                        Disabled = "",
-                        DisabledSelected = StyleManager.GetFrameworkResourcePath("nui_component_default_checkbox_s.png"),
-                    }
-                },
-                Text = new TextLabelStyle
-                {
-                    PointSize = new Selector<float?> { All = StyleManager.PointSizeNormal },
-                    WidthResizePolicy = ResizePolicyType.FillToParent,
-                    HeightResizePolicy = ResizePolicyType.FillToParent,
-                    HorizontalAlignment = HorizontalAlignment.Center,
-                    VerticalAlignment = VerticalAlignment.Center,
-                    TextColor = new Selector<Color>
-                    {
-                        Normal = new Color(0.22f, 0.22f, 0.22f, 1),
-                        Pressed = new Color(0.11f, 0.11f, 0.11f, 1),
-                        Disabled = new Color(0.66f, 0.66f, 0.66f, 1)
-                    }
-                }
-            };
-        }
-
-        protected override DropDownStyle GetDropDownStyle()
-        {
-            return new DropDownStyle
-            {
-                Position = new Position(50, 50),
-                Button = new ButtonStyle
-                {
-                    ParentOrigin = ParentOrigin.TopLeft,
-                    PivotPoint = PivotPoint.TopLeft,
-                    BackgroundImage = new Selector<string>
-                    {
-                        Normal = StyleManager.GetFrameworkResourcePath("nui_component_default_checkbox_bg_n.png"),
-                        Pressed = StyleManager.GetFrameworkResourcePath("nui_component_default_checkbox_bg_p.png")
-                    },
-                    BackgroundImageBorder = (Rectangle)6,
-                    Text = new TextLabelStyle
-                    {
-                        Text = "Select an item",
-                        PointSize = StyleManager.PointSizeNormal,
-                        TextColor = Color.Black,
-                    },
-                    Icon = new ImageViewStyle
-                    {
-                        Size = new Size(28, 28),
-                        ResourceUrl = StyleManager.GetFrameworkResourcePath("nui_component_default_dropdown_button_icon.png"),
-                    },
-                    IconRelativeOrientation = Button.IconOrientation.Right,
-                    IconPadding = 6,
-                },
-                ListBackgroundImage = new ImageViewStyle
-                {
-                    ResourceUrl = StyleManager.GetFrameworkResourcePath("nui_component_default_dropdown_list_bg.png"),
-                    Border = (Rectangle)6,
-                    Size = new Size(280, 360),
-                },
-                SpaceBetweenButtonTextAndIcon = 10,
-                ListPadding = 5,
-            };
-        }
-
-        protected override DropDownItemStyle GetDropDownItemStyle()
-        {
-            return new DropDownItemStyle
-            {
-                Size = new Size(360, 50),
-                BackgroundColor = new Selector<Color>
-                {
-                    Pressed = new Color(0.05f, 0.63f, 0.9f, 1),
-                    Selected = new Color(0.8f, 0.8f, 0.8f, 1),
-                    Normal = new Color(1, 1, 1, 1),
-                },
-                Text = new TextLabelStyle
-                {
-                    PointSize = StyleManager.PointSizeNormal,
-                    Position = new Position(28, 0),
-                    Text = "List item",
-                },
-            };
-        }
-
-        protected override PopupStyle GetPopupStyle()
-        {
-            return new PopupStyle
-            {
-                Size = new Size(500, 280),
-                BackgroundColor = new Color(0.9f, 0.9f, 0.9f, 1),
-                ImageShadow = new ImageShadow
-                {
-                    Url = StyleManager.GetFrameworkResourcePath("nui_component_default_popup_shadow.png"),
-                    Border = new Rectangle(24, 24, 24, 24),
-                    Extents = new Vector2(48, 48),
-                },
-                Title = new TextLabelStyle
-                {
-                    PointSize = 16,
-                    TextColor = Color.Black,
-                    PositionUsesPivotPoint = true,
-                    ParentOrigin = Tizen.NUI.ParentOrigin.TopLeft,
-                    PivotPoint = Tizen.NUI.PivotPoint.TopLeft,
-                    HorizontalAlignment = HorizontalAlignment.Begin,
-                    VerticalAlignment = VerticalAlignment.Bottom,
-                    Padding = 20,
-                    Text = "Title",
-                },
-                Buttons = new ButtonStyle
-                {
-                    Size = new Size(0, 80),
-                    PositionUsesPivotPoint = true,
-                    ParentOrigin = Tizen.NUI.ParentOrigin.BottomLeft,
-                    PivotPoint = Tizen.NUI.PivotPoint.BottomLeft,
-                    BackgroundColor = new Selector<Color>
-                    {
-                        Normal = new Color(1, 1, 1, 1),
-                        Pressed = new Color(1, 1, 1, 0.5f),
-                    },
-                    Overlay = new ImageViewStyle
-                    {
-                        PositionUsesPivotPoint = true,
-                        ParentOrigin = Tizen.NUI.ParentOrigin.Center,
-                        PivotPoint = Tizen.NUI.PivotPoint.Center,
-                        WidthResizePolicy = ResizePolicyType.FillToParent,
-                        HeightResizePolicy = ResizePolicyType.FillToParent,
-                        BackgroundColor = new Selector<Color>
-                        {
-                            Normal = new Color(1.0f, 1.0f, 1.0f, 1.0f),
-                            Pressed = new Color(0.0f, 0.0f, 0.0f, 0.1f),
-                            Selected = new Color(1.0f, 1.0f, 1.0f, 1.0f),
-                        }
-                    },
-                    Text = new TextLabelStyle
-                    {
-                        PositionUsesPivotPoint = true,
-                        ParentOrigin = Tizen.NUI.ParentOrigin.Center,
-                        PivotPoint = Tizen.NUI.PivotPoint.Center,
-                        HorizontalAlignment = HorizontalAlignment.Center,
-                        VerticalAlignment = VerticalAlignment.Center,
-                        TextColor = new Color(0.05f, 0.63f, 0.9f, 1)
-                    },
-                },
-            };
-        }
-
-        protected override ProgressStyle GetProgressStyle()
-        {
-            return new ProgressStyle
-            {
-                Size = new Size(200, 5),
-                Track = new ImageViewStyle
-                {
-                    BackgroundColor = new Color(0, 0, 0, 0.1f),
-                },
-                Buffer = new ImageViewStyle
-                {
-                    BackgroundColor = new Color(0.05f, 0.63f, 0.9f, 0.3f)
-                },
-                Progress = new ImageViewStyle
-                {
-                    BackgroundColor = new Color(0.05f, 0.63f, 0.9f, 1)
-                },
-            };
-        }
-
-        protected override ButtonStyle GetRadioButtonStyle()
-        {
-            return new ButtonStyle
-            {
-                Size = new Size(30, 30),
-                Icon = new ImageViewStyle
-                {
-                    WidthResizePolicy = ResizePolicyType.DimensionDependency,
-                    HeightResizePolicy = ResizePolicyType.SizeRelativeToParent,
-                    SizeModeFactor = new Vector3(1, 1, 1),
-                    Opacity = new Selector<float?>
-                    {
-                        Normal = 1.0f,
-                        Selected = 1.0f,
-                        Disabled = 0.4f,
-                        DisabledSelected = 0.4f
-                    },
-                    BackgroundImage = new Selector<string>
-                    {
-                        Normal = StyleManager.GetFrameworkResourcePath("nui_component_default_radiobutton_n.png"),
-                        Pressed = StyleManager.GetFrameworkResourcePath("nui_component_default_radiobutton_p.png"),
-                        Selected = StyleManager.GetFrameworkResourcePath("nui_component_default_radiobutton_s.png"),
-                        Disabled = StyleManager.GetFrameworkResourcePath("nui_component_default_radiobutton_n.png"),
-                        DisabledSelected = StyleManager.GetFrameworkResourcePath("nui_component_default_radiobutton_s.png"),
-                    }
-                },
-                Text = new TextLabelStyle
-                {
-                    PointSize = new Selector<float?> { All = StyleManager.PointSizeNormal },
-                    WidthResizePolicy = ResizePolicyType.FillToParent,
-                    HeightResizePolicy = ResizePolicyType.FillToParent,
-                    HorizontalAlignment = HorizontalAlignment.Center,
-                    VerticalAlignment = VerticalAlignment.Center,
-                    TextColor = new Selector<Color>
-                    {
-                        Normal = new Color(0.22f, 0.22f, 0.22f, 1),
-                        Pressed = new Color(0.11f, 0.11f, 0.11f, 1),
-                        Disabled = new Color(0.66f, 0.66f, 0.66f, 1)
-                    }
-                }
-            };
-        }
-
-        protected override SliderStyle GetSliderStyle()
-        {
-            return new SliderStyle
-            {
-                Size = new Size(200, 50),
-                TrackThickness = 5,
-                Track = new ImageViewStyle
-                {
-                    BackgroundColor = new Color(0, 0, 0, 0.1f),
-                },
-
-                Progress = new ImageViewStyle
-                {
-                    BackgroundColor = new Color(0.05f, 0.63f, 0.9f, 1),
-                },
-
-                Thumb = new ImageViewStyle
-                {
-                    Size = new Size(50, 50),
-                    Color = new Color("0ea1e6"),
-                    ResourceUrl = StyleManager.GetFrameworkResourcePath("nui_component_default_slider_thumb_n.png"),
-                    BackgroundImage = new Selector<string>
-                    {
-                        Normal = "",
-                        Pressed = StyleManager.GetFrameworkResourcePath("nui_component_default_slider_thumb_bg_p.png"),
-                    }
-                },
-
-            };
-        }
-
-        protected override SwitchStyle GetSwitchStyle()
-        {
-            return new SwitchStyle
-            {
-                Size = new Size(96, 60),
-                Track = new ImageViewStyle
-                {
-                    Size = new Size(96, 60),
-                    WidthResizePolicy = ResizePolicyType.Fixed,
-                    HeightResizePolicy = ResizePolicyType.Fixed,
-                    ResourceUrl = new Selector<string>
-                    {
-                        Normal = StyleManager.GetFrameworkResourcePath("nui_component_default_switch_track_n.png"),
-                        Selected = StyleManager.GetFrameworkResourcePath("nui_component_default_switch_track_s.png"),
-                        Disabled = StyleManager.GetFrameworkResourcePath("nui_component_default_switch_track_d.png"),
-                        DisabledSelected = StyleManager.GetFrameworkResourcePath("nui_component_default_switch_track_ds.png"),
-                    },
-                    Border = new Rectangle(30, 30, 30, 30),
-                },
-                Thumb = new ImageViewStyle
-                {
-                    Size = new Size(60, 60),
-                    ResourceUrl = new Selector<string>
-                    {
-                        Normal = StyleManager.GetFrameworkResourcePath("nui_component_default_switch_thumb_n.png"),
-                        Selected = StyleManager.GetFrameworkResourcePath("nui_component_default_switch_thumb_n.png"),
-                        Disabled = StyleManager.GetFrameworkResourcePath("nui_component_default_switch_thumb_d.png"),
-                        DisabledSelected = StyleManager.GetFrameworkResourcePath("nui_component_default_switch_thumb_d.png"),
-                    },
-                },
-                Text = new TextLabelStyle
-                {
-                    PointSize = new Selector<float?> { All = StyleManager.PointSizeNormal },
-                    WidthResizePolicy = ResizePolicyType.FillToParent,
-                    HeightResizePolicy = ResizePolicyType.FillToParent,
-                    HorizontalAlignment = HorizontalAlignment.Center,
-                    VerticalAlignment = VerticalAlignment.Center,
-                    TextColor = new Selector<Color>
-                    {
-                        Normal = new Color(0.22f, 0.22f, 0.22f, 1),
-                        Pressed = new Color(0.11f, 0.11f, 0.11f, 1),
-                        Disabled = new Color(0.66f, 0.66f, 0.66f, 1)
-                    }
-                },
-            };
-        }
-
-        protected override TabStyle GetTabStyle()
-        {
-            return new TabStyle
-            {
-                BackgroundColor = Color.Yellow,
-                Size = new Size(480, 80),
-                UnderLine = new ViewStyle
-                {
-                    Size = new Size(0, 6),
-                    PositionUsesPivotPoint = true,
-                    ParentOrigin = Tizen.NUI.ParentOrigin.BottomLeft,
-                    PivotPoint = Tizen.NUI.PivotPoint.BottomLeft,
-                    BackgroundColor = new Color(0.05f, 0.63f, 0.9f, 1),
-                },
-                Text = new TextLabelStyle
-                {
-                    PointSize = StyleManager.PointSizeTitle,
-                    TextColor = new Selector<Color>
-                    {
-                        Normal = Color.Black,
-                        Selected = new Color(0.05f, 0.63f, 0.9f, 1),
-                    },
-                },
-            };
-        }
-
-        protected override ToastStyle GetToastStyle()
-        {
-            return new ToastStyle
-            {
-                WidthResizePolicy = ResizePolicyType.FitToChildren,
-                HeightResizePolicy = ResizePolicyType.FitToChildren,
-                BackgroundColor = new Color(0, 0, 0, 0.8f),
-                Text = new TextLabelStyle()
-                {
-                    PositionUsesPivotPoint = true,
-                    ParentOrigin = Tizen.NUI.ParentOrigin.Center,
-                    PivotPoint = Tizen.NUI.PivotPoint.Center,
-                    WidthResizePolicy = ResizePolicyType.UseNaturalSize,
-                    HeightResizePolicy = ResizePolicyType.UseNaturalSize,
-                    HorizontalAlignment = HorizontalAlignment.Center,
-                    VerticalAlignment = VerticalAlignment.Center,
-                    TextColor = Color.White,
-                    Padding = new Extents(12, 12, 8, 8),
-                }
-            };
-        }
-
-        protected override LoadingStyle GetLoadingStyle()
-        {
-            return new LoadingStyle
-            {
-                LoadingSize = new Size(100, 100)
-            };
-        }
-
-        protected override PaginationStyle GetPaginationStyle()
-        {
-            return new PaginationStyle
-            {
-                IndicatorImageUrl = new Selector<string>()
-                {
-                    Normal = StyleManager.GetFrameworkResourcePath("nui_component_default_pagination_normal_dot.png"),
-                    Selected = StyleManager.GetFrameworkResourcePath("nui_component_default_pagination_focus_dot.png"),
-                },
-            };
-        }
-    }
-}
index 9961a77..eb634dc 100644 (file)
@@ -109,7 +109,7 @@ namespace Tizen.NUI.Components
                 return;
             }
 
-            var overlayImage = button.GetCurrentOverlayImage(this);
+            var overlayImage = button.OverlayImage;
 
             if (overlayImage == null)
             {
diff --git a/src/Tizen.NUI.Components/PreloadStyle/WearableTheme.cs b/src/Tizen.NUI.Components/PreloadStyle/WearableTheme.cs
deleted file mode 100644 (file)
index 35ffe80..0000000
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright(c) 2020 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-using System.ComponentModel;
-using Tizen.NUI.BaseComponents;
-using Tizen.NUI.Components.Extension;
-
-namespace Tizen.NUI.Components
-{
-    /// <summary>
-    /// Interface that includes styles for all components for a wearable theme
-    /// </summary>
-    [EditorBrowsable(EditorBrowsableState.Never)]
-    internal class WearableTheme : DefaultTheme
-    {
-        internal static new Theme Instance { get; } = new WearableTheme();
-
-        private WearableTheme() : base()
-        {
-        }
-
-        protected override ButtonStyle GetButtonStyle()
-        {
-            return new ButtonStyle
-            {
-                Size = new Size(210, 72),
-                CornerRadius = 36,
-                BackgroundColor = new Selector<Color>
-                {
-                    Normal = new Color(0, 42f/255f, 77f/255f, 0.85f),
-                    Pressed = new Color(0, 70f/255f, 128f/255f, 0.85f),
-                    Disabled = new Color(61f/255f, 61f/255f, 61f/255f, 0.85f),
-                },
-                Text = new TextLabelStyle
-                {
-                    FontFamily = "SamsungOne 700",
-                    PixelSize = 28,
-                    TextColor = new Selector<Color>
-                    {
-                        Normal = new Color(56f/255f, 164f/255f, 252f/255f, 1),
-                        Pressed = new Color(56f/255f, 164f/255f, 252f/255f, 1),
-                        Disabled = new Color(1, 1, 1, 0.35f),
-                    },
-                    Padding = new Extents(20, 20, 0, 0),
-                    VerticalAlignment = VerticalAlignment.Center,
-                    HorizontalAlignment = HorizontalAlignment.Center,
-                },
-                Opacity = new Selector<float?>
-                {
-                    Other = 1.0f,
-                    Disabled = 0.3f,
-                }
-            };
-        }
-
-        protected override ButtonStyle GetCheckBoxStyle()
-        {
-            return new LottieButtonStyle
-            {
-                LottieUrl = StyleManager.GetFrameworkResourcePath("nui_wearable_checkbox_icon.json"),
-                PlayRange = new Selector<LottieFrameInfo>
-                {
-                    Selected = (0, 18),
-                    Normal = (19, 36)
-                },
-                Opacity = new Selector<float?>
-                {
-                    Other = 1.0f,
-                    Pressed = 0.6f,
-                    Disabled = 0.3f,
-                },
-            };
-        }
-
-        protected override ButtonStyle GetRadioButtonStyle()
-        {
-            return new LottieButtonStyle
-            {
-                LottieUrl = StyleManager.GetFrameworkResourcePath("nui_wearable_radiobutton_icon.json"),
-                PlayRange = new Selector<LottieFrameInfo>
-                {
-                    Selected = (0, 12),
-                    Normal = (13, 25)
-                },
-                Opacity = new Selector<float?>
-                {
-                    Other = 1.0f,
-                    Pressed = 0.6f,
-                    Disabled = 0.3f,
-                },
-            };
-        }
-
-        protected override SwitchStyle GetSwitchStyle()
-        {
-            return new LottieSwitchStyle
-            {
-                LottieUrl = StyleManager.GetFrameworkResourcePath("nui_wearable_switch_icon.json"),
-                PlayRange = new Selector<LottieFrameInfo>
-                {
-                    Selected = (0, 18),
-                    Normal = (19, 36)
-                },
-                Opacity = new Selector<float?>
-                {
-                    Other = 1.0f,
-                    Pressed = 0.6f,
-                    Disabled = 0.3f,
-                },
-            };
-        }
-
-        protected override LoadingStyle GetLoadingStyle()
-        {
-            return new LoadingStyle
-            {
-                LoadingSize = new Size(360, 360)
-            };
-        }
-
-        protected override PaginationStyle GetPaginationStyle()
-        {
-            return new PaginationStyle
-            {
-                IndicatorImageUrl = new Selector<string>()
-                {
-                    Normal = StyleManager.GetFrameworkResourcePath("nui_component_default_pagination_normal_dot.png"),
-                    Selected = StyleManager.GetFrameworkResourcePath("nui_component_default_pagination_focus_dot.png"),
-                },
-            };
-        }
-    }
-}
index 21fb114..a133400 100755 (executable)
@@ -79,9 +79,7 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         public static readonly BindableProperty IconPaddingProperty = BindableProperty.Create(nameof(IconPadding), typeof(Extents), typeof(ButtonStyle), null, propertyChanged: (bindable, oldValue, newValue) =>
         {
-            var buttonStyle = (ButtonStyle)bindable;
-            if (null == buttonStyle.iconPadding) buttonStyle.iconPadding = new Extents(buttonStyle.OnIconPaddingChanged, 0, 0, 0, 0);
-            buttonStyle.iconPadding.CopyFrom(null == newValue ? new Extents() : (Extents)newValue);
+            ((ButtonStyle)bindable).iconPadding = null == newValue ? null : new Extents((Extents)newValue);
         },
         defaultValueCreator: (bindable) =>
         {
@@ -92,9 +90,7 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         public static readonly BindableProperty TextPaddingProperty = BindableProperty.Create(nameof(TextPadding), typeof(Extents), typeof(ButtonStyle), null, propertyChanged: (bindable, oldValue, newValue) =>
         {
-            var buttonStyle = (ButtonStyle)bindable;
-            if (null == buttonStyle.textPadding) buttonStyle.textPadding = new Extents(buttonStyle.OnTextPaddingChanged, 0, 0, 0, 0);
-            buttonStyle.textPadding.CopyFrom(null == newValue ? new Extents() : (Extents)newValue);
+            ((ButtonStyle)bindable).textPadding = null == newValue ? null : new Extents((Extents)newValue);
         },
         defaultValueCreator: (bindable) =>
         {
@@ -105,7 +101,7 @@ namespace Tizen.NUI.Components
         private bool? isSelectable;
         private bool? isSelected;
         private bool? isEnabled;
-        private Button.IconOrientation? iconRelativeOrientation;
+        private Button.IconOrientation? iconRelativeOrientation = Button.IconOrientation.Left;
         private Extents iconPadding;
         private Extents textPadding;
 
@@ -117,7 +113,6 @@ namespace Tizen.NUI.Components
         /// <since_tizen> 8 </since_tizen>
         public ButtonStyle() : base()
         {
-            InitSubStyle();
         }
 
         /// <summary>
@@ -127,32 +122,25 @@ namespace Tizen.NUI.Components
         /// <since_tizen> 8 </since_tizen>
         public ButtonStyle(ButtonStyle style) : base(style)
         {
-            if(style == null)
-            {
-                return;
-            }
-
-            InitSubStyle();
-
-            this.CopyFrom(style);
         }
+
         /// <summary>
         /// Overlay image's Style.
         /// </summary>
         /// <since_tizen> 8 </since_tizen>
-        public ImageViewStyle Overlay { get; set; }
+        public ImageViewStyle Overlay { get; set; } = new ImageViewStyle();
 
         /// <summary>
         /// Text's Style.
         /// </summary>
         /// <since_tizen> 8 </since_tizen>
-        public TextLabelStyle Text { get; set; }
+        public TextLabelStyle Text { get; set; } = new TextLabelStyle();
 
         /// <summary>
         /// Icon's Style.
         /// </summary>
         /// <since_tizen> 8 </since_tizen>
-        public ImageViewStyle Icon { get; set; }
+        public ImageViewStyle Icon { get; set; } = new ImageViewStyle();
 
         /// <summary>
         /// Flag to decide Button can be selected or not.
@@ -200,11 +188,7 @@ namespace Tizen.NUI.Components
         /// <since_tizen> 8 </since_tizen>
         public Extents IconPadding
         {
-            get
-            {
-                Extents padding = (Extents)GetValue(IconPaddingProperty);
-                return (null != padding) ? padding : iconPadding = new Extents(OnIconPaddingChanged, 0, 0, 0, 0);
-            }
+            get => ((Extents)GetValue(IconPaddingProperty)) ?? (iconPadding = new Extents());
             set => SetValue(IconPaddingProperty, value);
         }
 
@@ -214,11 +198,7 @@ namespace Tizen.NUI.Components
         /// <since_tizen> 8 </since_tizen>
         public Extents TextPadding
         {
-            get
-            {
-                Extents padding = (Extents)GetValue(TextPaddingProperty);
-                return (null != padding) ? padding : textPadding = new Extents(OnTextPaddingChanged, 0, 0, 0, 0);
-            }
+            get  => ((Extents)GetValue(TextPaddingProperty)) ?? (textPadding = new Extents());
             set => SetValue(TextPaddingProperty, value);
         }
 
@@ -231,24 +211,11 @@ namespace Tizen.NUI.Components
         {
             base.CopyFrom(bindableObject);
 
-            ButtonStyle buttonStyle = bindableObject as ButtonStyle;
-
-            if (null != buttonStyle)
+            if (bindableObject is ButtonStyle buttonStyle)
             {
-                if (null != buttonStyle.Overlay)
-                {
-                    Overlay?.CopyFrom(buttonStyle.Overlay);
-                }
-
-                if (null != buttonStyle.Text)
-                {
-                    Text?.CopyFrom(buttonStyle.Text);
-                }
-
-                if (null != buttonStyle.Icon)
-                {
-                    Icon?.CopyFrom(buttonStyle.Icon);
-                }
+                Overlay.CopyFrom(buttonStyle.Overlay);
+                Text.CopyFrom(buttonStyle.Text);
+                Icon.CopyFrom(buttonStyle.Icon);
             }
         }
 
@@ -284,47 +251,5 @@ namespace Tizen.NUI.Components
 
             base.Dispose(type);
         }
-
-        private void InitSubStyle()
-        {
-            Overlay = new ImageViewStyle()
-            {
-                PositionUsesPivotPoint = true,
-                ParentOrigin = Tizen.NUI.ParentOrigin.Center,
-                PivotPoint = Tizen.NUI.PivotPoint.Center,
-                WidthResizePolicy = ResizePolicyType.FillToParent,
-                HeightResizePolicy = ResizePolicyType.FillToParent
-            };
-
-            Text = new TextLabelStyle()
-            {
-                PositionUsesPivotPoint = true,
-                ParentOrigin = Tizen.NUI.ParentOrigin.Center,
-                PivotPoint = Tizen.NUI.PivotPoint.Center,
-                WidthResizePolicy = ResizePolicyType.FillToParent,
-                HeightResizePolicy = ResizePolicyType.FillToParent,
-                HorizontalAlignment = HorizontalAlignment.Center,
-                VerticalAlignment = VerticalAlignment.Center
-            };
-
-            Icon = new ImageViewStyle()
-            {
-                PositionUsesPivotPoint = true,
-                ParentOrigin = Tizen.NUI.ParentOrigin.Center,
-                PivotPoint = Tizen.NUI.PivotPoint.Center,
-            };
-
-            IconRelativeOrientation = Button.IconOrientation.Left;
-        }
-
-        private void OnIconPaddingChanged(ushort start, ushort end, ushort top, ushort bottom)
-        {
-            IconPadding = new Extents(start, end, top, bottom);
-        }
-
-        private void OnTextPaddingChanged(ushort start, ushort end, ushort top, ushort bottom)
-        {
-            TextPadding = new Extents(start, end, top, bottom);
-        }
     }
 }
index 7674a4a..44cc34e 100755 (executable)
@@ -47,7 +47,6 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         public ControlStyle() : base()
         {
-            InitSubstyle();
         }
 
 
@@ -60,9 +59,6 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         public ControlStyle(ControlStyle style) : base(style)
         {
-            if(null == style) return;
-
-            this.CopyFrom(style);
         }
 
         /// <summary>
@@ -122,10 +118,6 @@ namespace Tizen.NUI.Components
             disposed = true;
         }
 
-        private void InitSubstyle()
-        {
-        }
-
         private void SubStyleCalledEvent(object sender, global::System.EventArgs e)
         {
             OnPropertyChanged();
index 19ac02b..92ffdff 100755 (executable)
@@ -57,9 +57,7 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         public static readonly BindableProperty ListMarginProperty = BindableProperty.Create(nameof(ListMargin), typeof(Extents), typeof(DropDownStyle), null, propertyChanged: (bindable, oldValue, newValue) =>
         {
-            var dropDownStyle = (DropDownStyle)bindable;
-            if (null == dropDownStyle.listMargin) dropDownStyle.listMargin = new Extents(dropDownStyle.OnListMarginChanged, 0, 0, 0, 0);
-            dropDownStyle.listMargin.CopyFrom(null == newValue ? new Extents() : (Extents)newValue);
+            ((DropDownStyle)bindable).listMargin = newValue == null ? null : new Extents((Extents)newValue);
         },
         defaultValueCreator: (bindable) =>
         {
@@ -82,12 +80,7 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         public static readonly BindableProperty ListPaddingProperty = BindableProperty.Create(nameof(ListPadding), typeof(Extents), typeof(DropDownStyle), null, propertyChanged: (bindable, oldValue, newValue) =>
         {
-            var dropDownStyle = (DropDownStyle)bindable;
-            if (null != newValue)
-            {
-                if (null == dropDownStyle.listPadding) dropDownStyle.listPadding = new Extents(dropDownStyle.OnListPaddingChanged, 0, 0, 0, 0);
-                dropDownStyle.listPadding.CopyFrom(null == newValue ? new Extents() : (Extents)newValue);
-            }
+            ((DropDownStyle)bindable).listPadding = newValue == null ? null : new Extents((Extents)newValue);
         },
         defaultValueCreator: (bindable) =>
         {
@@ -120,9 +113,6 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         public DropDownStyle(DropDownStyle style) : base(style)
         {
-            if(null == style) return;
-
-            this.CopyFrom(style);
         }
 
         /// <summary>
@@ -181,11 +171,7 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         public Extents ListMargin
         {
-            get
-            {
-                Extents tmp = (Extents)GetValue(ListMarginProperty);
-                return (null != tmp) ? tmp : listMargin = new Extents(OnListMarginChanged, 0, 0, 0, 0);
-            }
+            get => ((Extents)GetValue(ListMarginProperty)) ?? (listMargin = new Extents(0, 0, 0, 0));
             set => SetValue(ListMarginProperty, value);
         }
 
@@ -205,44 +191,23 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         public Extents ListPadding
         {
-            get
-            {
-                Extents tmp = (Extents)GetValue(ListPaddingProperty);
-                return (null != tmp) ? tmp : listPadding = new Extents(OnListPaddingChanged, 0, 0, 0, 0);
-            }
+            get => ((Extents)GetValue(ListPaddingProperty)) ?? (listPadding = new Extents(0, 0, 0, 0));
             set => SetValue(ListPaddingProperty, value);
         }
 
-        /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
+        /// <inheritdoc/>
         [EditorBrowsable(EditorBrowsableState.Never)]
         public override void CopyFrom(BindableObject bindableObject)
         {
             base.CopyFrom(bindableObject);
 
-            DropDownStyle dropDownStyle = bindableObject as DropDownStyle;
-
-            if (null != dropDownStyle)
+            if (bindableObject is DropDownStyle dropDownStyle)
             {
-                Button?.CopyFrom(dropDownStyle.Button);
-                HeaderText?.CopyFrom(dropDownStyle.HeaderText);
-                ListBackgroundImage?.CopyFrom(dropDownStyle.ListBackgroundImage);
-                SpaceBetweenButtonTextAndIcon = dropDownStyle.SpaceBetweenButtonTextAndIcon;
-                ListRelativeOrientation = dropDownStyle.ListRelativeOrientation;
-                ListMargin?.CopyFrom(dropDownStyle.ListMargin);
-                SelectedItemIndex = dropDownStyle.SelectedItemIndex;
-                ListPadding?.CopyFrom(dropDownStyle.ListPadding);
+                Button.CopyFrom(dropDownStyle.Button);
+                HeaderText.CopyFrom(dropDownStyle.HeaderText);
+                ListBackgroundImage.CopyFrom(dropDownStyle.ListBackgroundImage);
             }
         }
-
-        private void OnListMarginChanged(ushort start, ushort end, ushort top, ushort bottom)
-        {
-            ListMargin = new Extents(start, end, top, bottom);
-        }
-
-        private void OnListPaddingChanged(ushort start, ushort end, ushort top, ushort bottom)
-        {
-            ListPadding = new Extents(start, end, top, bottom);
-        }
     }
 
     /// <summary>
@@ -270,9 +235,6 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         public DropDownItemStyle(DropDownItemStyle style) : base(style)
         {
-            if(null == style) return;
-
-            this.CopyFrom(style);
         }
 
         /// <summary>
@@ -315,19 +277,17 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         public bool IsSelected { get; set; }
 
-        /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
+        /// <inheritdoc/>
         [EditorBrowsable(EditorBrowsableState.Never)]
         public override void CopyFrom(BindableObject bindableObject)
         {
             base.CopyFrom(bindableObject);
 
-            DropDownItemStyle dropDownItemStyle = bindableObject as DropDownItemStyle;
-
-            if (null != dropDownItemStyle)
+            if (bindableObject is DropDownItemStyle dropDownItemStyle)
             {
-                Text?.CopyFrom(dropDownItemStyle.Text);
-                Icon?.CopyFrom(dropDownItemStyle.Icon);
-                CheckImage?.CopyFrom(dropDownItemStyle.CheckImage);
+                Text.CopyFrom(dropDownItemStyle.Text);
+                Icon.CopyFrom(dropDownItemStyle.Icon);
+                CheckImage.CopyFrom(dropDownItemStyle.CheckImage);
                 CheckImageGapToBoundary = dropDownItemStyle.CheckImageGapToBoundary;
                 IsSelected = dropDownItemStyle.IsSelected;
             }
index 08f757c..e6ce60b 100755 (executable)
@@ -26,6 +26,43 @@ namespace Tizen.NUI.Components
     /// <since_tizen> 8 </since_tizen>
     public class LoadingStyle : ControlStyle
     {
+        /// <summary>The FrameRateSelector bindable property.</summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static readonly BindableProperty FrameRateSelectorProperty = BindableProperty.Create("FrameRateSelector", typeof(Selector<int?>), typeof(LoadingStyle), null, propertyChanged: (bindable, oldValue, newValue) =>
+        {
+            ((LoadingStyle)bindable).frameRate = ((Selector<int?>)newValue)?.Clone();
+        },
+        defaultValueCreator: (bindable) =>
+        {
+            return ((LoadingStyle)bindable).frameRate;
+        });
+
+        /// <summary>The LoadingSize bindable property.</summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static readonly BindableProperty LoadingSizeProperty = BindableProperty.Create(nameof(LoadingSize), typeof(Size), typeof(LoadingStyle), null, propertyChanged: (bindable, oldValue, newValue) =>
+        {
+            ((LoadingStyle)bindable).loadingSize = newValue == null ? null : new Size((Size)newValue);
+        },
+        defaultValueCreator: (bindable) =>
+        {
+            return ((LoadingStyle)bindable).loadingSize;
+        });
+
+        /// <summary>The Images bindable property.</summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static readonly BindableProperty ImagesProperty = BindableProperty.Create(nameof(Images), typeof(string[]), typeof(LoadingStyle), null, propertyChanged: (bindable, oldValue, newValue) =>
+        {
+            ((LoadingStyle)bindable).images = (string[])((string[])newValue)?.Clone();
+        },
+        defaultValueCreator: (bindable) =>
+        {
+            return ((LoadingStyle)bindable).images;
+        });
+
+        private Selector<int?> frameRate;
+        private Size loadingSize;
+        private string[] images;
+
         static LoadingStyle() { }
 
         /// <summary>
@@ -41,30 +78,37 @@ namespace Tizen.NUI.Components
         /// <since_tizen> 8 </since_tizen>
         public LoadingStyle(LoadingStyle style) : base(style)
         {
-            if(null == style)
-            {
-                return;
-            }
-            this.CopyFrom(style);
         }
 
         /// <summary>
         /// Gets or sets loading image resources.
         /// </summary>
         /// <since_tizen> 8 </since_tizen>
-        public string[] Images { get; set; }
+        public string[] Images
+        {
+            get => (string[])GetValue(ImagesProperty);
+            set => SetValue(ImagesProperty, value);
+        }
 
         /// <summary>
         /// Gets or sets loading image size.
         /// </summary>
         /// <since_tizen> 8 </since_tizen>
-        public Size LoadingSize { get; set; }
+        public Size LoadingSize
+        {
+            get => (Size)GetValue(LoadingSizeProperty);
+            set => SetValue(LoadingSizeProperty, value);
+        }
 
         /// <summary>
         /// Gets or sets loading frame per second.
         /// </summary>
         /// <since_tizen> 8 </since_tizen>
-        public Selector<int?> FrameRate { get; set; } = new Selector<int?>();
+        public Selector<int?> FrameRate
+        {
+            get => (Selector<int?>)GetValue(FrameRateSelectorProperty);
+            set => SetValue(FrameRateSelectorProperty, value);
+        }
 
         /// <summary>
         /// Style's clone function.
@@ -74,24 +118,6 @@ namespace Tizen.NUI.Components
         public override void CopyFrom(BindableObject bindableObject)
         {
             base.CopyFrom(bindableObject);
-
-            LoadingStyle loadingStyle = bindableObject as LoadingStyle;
-
-            if (null != loadingStyle)
-            {
-                if (null != loadingStyle.FrameRate)
-                {
-                    FrameRate?.Clone(loadingStyle.FrameRate);
-                }
-                if (null != loadingStyle.LoadingSize)
-                {
-                    LoadingSize = loadingStyle.LoadingSize;
-                }
-                if (null != loadingStyle.Images)
-                {
-                    Images = loadingStyle.Images;
-                }
-            }
         }
     }
 }
index e081291..403daab 100755 (executable)
@@ -26,6 +26,43 @@ namespace Tizen.NUI.Components
     /// <since_tizen> 8 </since_tizen>
     public class PaginationStyle : ControlStyle
     {
+        /// <summary>The IndicatorSize bindable property.</summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static readonly BindableProperty IndicatorSizeProperty = BindableProperty.Create(nameof(IndicatorSize), typeof(Size), typeof(PaginationStyle), null, propertyChanged: (bindable, oldValue, newValue) =>
+        {
+            ((PaginationStyle)bindable).indicatorSize = newValue == null ? null : new Size((Size)newValue);
+        },
+        defaultValueCreator: (bindable) =>
+        {
+            return ((PaginationStyle)bindable).indicatorSize;
+        });
+
+        /// <summary>The IndicatorImageUrlSelector bindable property.</summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static readonly BindableProperty IndicatorImageUrlSelectorProperty = BindableProperty.Create("IndicatorImageUrlSelector", typeof(Selector<string>), typeof(PaginationStyle), null, propertyChanged: (bindable, oldValue, newValue) =>
+        {
+            ((PaginationStyle)bindable).indicatorImageUrl = ((Selector<string>)newValue)?.Clone();
+        },
+        defaultValueCreator: (bindable) =>
+        {
+            return ((PaginationStyle)bindable).indicatorImageUrl;
+        });
+
+        /// <summary>The IndicatorSpacing bindable property.</summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static readonly BindableProperty IndicatorSpacingProperty = BindableProperty.Create(nameof(IndicatorSpacing), typeof(int?), typeof(PaginationStyle), null, propertyChanged: (bindable, oldValue, newValue) =>
+        {
+            ((PaginationStyle)bindable).indicatorSpacing = (int?)newValue;
+        },
+        defaultValueCreator: (bindable) =>
+        {
+            return ((PaginationStyle)bindable).indicatorSpacing;
+        });
+
+        private Size indicatorSize;
+        private Selector<string> indicatorImageUrl;
+        private int? indicatorSpacing;
+
         static PaginationStyle() { }
 
         /// <summary>
@@ -41,28 +78,37 @@ namespace Tizen.NUI.Components
         /// <since_tizen> 8 </since_tizen>
         public PaginationStyle(PaginationStyle style) : base(style)
         {
-            if (null == style) return;            
-
-            this.CopyFrom(style);
         }
 
         /// <summary>
         /// Gets or sets the size of the indicator.
         /// </summary>
         /// <since_tizen> 8 </since_tizen>
-        public Size IndicatorSize { get; set; }
+        public Size IndicatorSize
+        {
+            get => (Size)GetValue(IndicatorSizeProperty);
+            set => SetValue(IndicatorSizeProperty, value);
+        }
 
         /// <summary>
         /// Gets or sets the resource of indicator.
         /// </summary>
         /// <since_tizen> 8 </since_tizen>
-        public Selector<string> IndicatorImageUrl { get; set; } = new Selector<string>();
+        public Selector<string> IndicatorImageUrl
+        {
+            get => (Selector<string>)GetValue(IndicatorImageUrlSelectorProperty);
+            set => SetValue(IndicatorImageUrlSelectorProperty, value);
+        }
 
         /// <summary>
         /// Gets or sets the space of the indicator.
         /// </summary>
         /// <since_tizen> 8 </since_tizen>
-        public int IndicatorSpacing { get; set; }
+        public int IndicatorSpacing
+        {
+            get => ((int?)GetValue(IndicatorSpacingProperty)) ?? 0;
+            set => SetValue(IndicatorSpacingProperty, value);
+        }
 
         /// <summary>
         /// Retrieves a copy of PaginationStyle.
@@ -72,20 +118,6 @@ namespace Tizen.NUI.Components
         public override void CopyFrom(BindableObject bindableObject)
         {
             base.CopyFrom(bindableObject);
-
-            PaginationStyle paginationStyle = bindableObject as PaginationStyle;
-            if (null != paginationStyle)
-            {
-                if (null != paginationStyle.IndicatorSize)
-                {
-                    IndicatorSize = new Size(paginationStyle.IndicatorSize.Width, paginationStyle.IndicatorSize.Height);
-                }
-                if (null != paginationStyle.IndicatorImageUrl)
-                {
-                    IndicatorImageUrl?.Clone(paginationStyle.IndicatorImageUrl);
-                }
-                IndicatorSpacing = paginationStyle.IndicatorSpacing;
-            }
         }
     }
 }
index fe4f36a..acf3a0e 100755 (executable)
@@ -34,7 +34,6 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         public PopupStyle() : base()
         {
-            InitSubStyle();
         }
 
         /// <summary>
@@ -44,91 +43,31 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         public PopupStyle(PopupStyle style) : base(style)
         {
-            Title = new TextLabelStyle();
-            Buttons = new ButtonStyle();
-            this.CopyFrom(style);
         }
 
         /// <summary>
         /// Title Text's style.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        public TextLabelStyle Title { get; set; }
+        public TextLabelStyle Title { get; set; } = new TextLabelStyle();
 
         /// <summary>
         /// Popup button's style.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        public ButtonStyle Buttons { get; set; }
+        public ButtonStyle Buttons { get; set; } = new ButtonStyle();
 
-        /// <summary>
-        /// Style's clone function.
-        /// </summary>
-        /// <param name="bindableObject">The style that need to copy.</param>
+        /// <inheritdoc/>
         [EditorBrowsable(EditorBrowsableState.Never)]
         public override void CopyFrom(BindableObject bindableObject)
         {
             base.CopyFrom(bindableObject);
 
-            PopupStyle popupStyle = bindableObject as PopupStyle;
-            if (popupStyle != null)
+            if (bindableObject is PopupStyle popupStyle)
             {
-                if (popupStyle.Title != null)
-                {
-                    Title?.CopyFrom(popupStyle.Title);
-                }
-
-                if (popupStyle.Buttons != null)
-                {
-                    Buttons?.CopyFrom(popupStyle.Buttons);
-                }
+                Title.CopyFrom(popupStyle.Title);
+                Buttons.CopyFrom(popupStyle.Buttons);
             }
         }
-
-        private void InitSubStyle()
-        {
-            // TODO Apply proper shadow as a default for a Popup
-            BoxShadow = new Shadow()
-            {
-                BlurRadius = 5,
-                Offset = new Vector2(5, 5),
-            };
-
-            Title = new TextLabelStyle()
-            {
-                PositionUsesPivotPoint = true,
-                ParentOrigin = Tizen.NUI.ParentOrigin.TopLeft,
-                PivotPoint = Tizen.NUI.PivotPoint.TopLeft,
-                HorizontalAlignment = HorizontalAlignment.Begin,
-                VerticalAlignment = VerticalAlignment.Bottom
-            };
-
-            Buttons = new ButtonStyle()
-            {
-                Size = new Size(0, 0),
-                PositionUsesPivotPoint = true,
-                ParentOrigin = Tizen.NUI.ParentOrigin.BottomLeft,
-                PivotPoint = Tizen.NUI.PivotPoint.BottomLeft,
-                Overlay = new ImageViewStyle()
-                {
-                    PositionUsesPivotPoint = true,
-                    ParentOrigin = Tizen.NUI.ParentOrigin.Center,
-                    PivotPoint = Tizen.NUI.PivotPoint.Center,
-                    WidthResizePolicy = ResizePolicyType.FillToParent,
-                    HeightResizePolicy = ResizePolicyType.FillToParent
-                },
-
-                Text = new TextLabelStyle()
-                {
-                    PositionUsesPivotPoint = true,
-                    ParentOrigin = Tizen.NUI.ParentOrigin.Center,
-                    PivotPoint = Tizen.NUI.PivotPoint.Center,
-                    WidthResizePolicy = ResizePolicyType.FillToParent,
-                    HeightResizePolicy = ResizePolicyType.FillToParent,
-                    HorizontalAlignment = HorizontalAlignment.Center,
-                    VerticalAlignment = VerticalAlignment.Center
-                }
-            };
-        }
     }
 }
index 0731b7e..f2d6b3f 100755 (executable)
@@ -34,7 +34,6 @@ namespace Tizen.NUI.Components
         /// <since_tizen> 8 </since_tizen>
         public ProgressStyle() : base()
         {
-            InitSubStyle();
         }
 
         /// <summary>
@@ -44,30 +43,25 @@ namespace Tizen.NUI.Components
         /// <since_tizen> 8 </since_tizen>
         public ProgressStyle(ProgressStyle style) : base(style)
         {
-            if (null == style) return;
-
-            InitSubStyle();
-
-            this.CopyFrom(style);
         }
 
         /// <summary>
         /// Get or set track image.
         /// </summary>
         /// <since_tizen> 8 </since_tizen>
-        public ImageViewStyle Track { get; set; }
+        public ImageViewStyle Track { get; set; } = new ImageViewStyle();
 
         /// <summary>
         /// Get or set progress image.
         /// </summary>
         /// <since_tizen> 8 </since_tizen>
-        public ImageViewStyle Progress { get; set; }
+        public ImageViewStyle Progress { get; set; } = new ImageViewStyle();
 
         /// <summary>
         /// Get or set buffer image.
         /// </summary>
         /// <since_tizen> 8 </since_tizen>
-        public ImageViewStyle Buffer { get; set; }
+        public ImageViewStyle Buffer { get; set; } = new ImageViewStyle();
 
         /// <summary>
         /// Style's clone function.
@@ -78,55 +72,12 @@ namespace Tizen.NUI.Components
         {
             base.CopyFrom(bindableObject);
 
-            ProgressStyle progressStyle = bindableObject as ProgressStyle;
-
-            if (null != progressStyle)
+            if (bindableObject is ProgressStyle progressStyle)
             {
-                if (null != progressStyle.Track)
-                {
-                    Track?.CopyFrom(progressStyle.Track);
-                }
-
-                if (null != progressStyle.Progress)
-                {
-                    Progress?.CopyFrom(progressStyle.Progress);
-                }
-
-                if (null != progressStyle.Buffer)
-                {
-                    Buffer?.CopyFrom(progressStyle.Buffer);
-                }
+                Track.CopyFrom(progressStyle.Track);
+                Progress.CopyFrom(progressStyle.Progress);
+                Buffer.CopyFrom(progressStyle.Buffer);
             }
         }
-
-        private void InitSubStyle()
-        {
-            Track = new ImageViewStyle()
-            {
-                WidthResizePolicy = ResizePolicyType.FillToParent,
-                HeightResizePolicy = ResizePolicyType.FillToParent,
-                PositionUsesPivotPoint = true,
-                ParentOrigin = NUI.ParentOrigin.TopLeft,
-                PivotPoint = NUI.PivotPoint.TopLeft
-            };
-
-            Progress = new ImageViewStyle()
-            {
-                WidthResizePolicy = ResizePolicyType.FillToParent,
-                HeightResizePolicy = ResizePolicyType.FillToParent,
-                PositionUsesPivotPoint = true,
-                ParentOrigin = Tizen.NUI.ParentOrigin.TopLeft,
-                PivotPoint = Tizen.NUI.PivotPoint.TopLeft
-            };
-
-            Buffer = new ImageViewStyle()
-            {
-                WidthResizePolicy = ResizePolicyType.FillToParent,
-                HeightResizePolicy = ResizePolicyType.FillToParent,
-                PositionUsesPivotPoint = true,
-                ParentOrigin = Tizen.NUI.ParentOrigin.TopLeft,
-                PivotPoint = Tizen.NUI.PivotPoint.TopLeft
-            };
-        }
     }
 }
index 1aea6d3..0e04010 100644 (file)
@@ -54,7 +54,7 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         public static readonly BindableProperty TrackColorProperty = BindableProperty.Create(nameof(TrackColor), typeof(Color), typeof(ScrollbarStyle), null, propertyChanged: (bindable, oldValue, newValue) =>
         {
-            ((ScrollbarStyle)bindable).trackColor = (Color)newValue;
+            ((ScrollbarStyle)bindable).trackColor = new Color((Color)newValue);
         },
         defaultValueCreator: (bindable) =>
         {
@@ -65,7 +65,7 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         public static readonly BindableProperty ThumbColorProperty = BindableProperty.Create(nameof(ThumbColor), typeof(Color), typeof(ScrollbarStyle), null, propertyChanged: (bindable, oldValue, newValue) =>
         {
-            ((ScrollbarStyle)bindable).thumbColor = (Color)newValue;
+            ((ScrollbarStyle)bindable).thumbColor = new Color((Color)newValue);
         },
         defaultValueCreator: (bindable) =>
         {
@@ -76,7 +76,7 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         public static readonly BindableProperty TrackPaddingProperty = BindableProperty.Create(nameof(TrackPadding), typeof(Extents), typeof(ScrollbarStyle), null, propertyChanged: (bindable, oldValue, newValue) =>
         {
-            ((ScrollbarStyle)bindable).trackPadding = (Extents)newValue;
+            ((ScrollbarStyle)bindable).trackPadding = new Extents((Extents)newValue);
         },
         defaultValueCreator: (bindable) =>
         {
@@ -100,7 +100,6 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         public ScrollbarStyle() : base()
         {
-            Initialize();
         }
 
         /// <summary>
@@ -110,7 +109,6 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         public ScrollbarStyle(ScrollbarStyle style) : base(style)
         {
-            this.CopyFrom(style);
         }
 
         /// <summary>
@@ -176,39 +174,5 @@ namespace Tizen.NUI.Components
         }
 
         #endregion Properties
-
-
-        #region Methods
-
-        /// <inheritdoc/>
-        [EditorBrowsable(EditorBrowsableState.Never)]
-        public override void CopyFrom(BindableObject bindableObject)
-        {
-            base.CopyFrom(bindableObject);
-
-            var style = bindableObject as ScrollbarStyle;
-
-            if (null != style)
-            {
-                TrackThickness = style.TrackThickness;
-                ThumbThickness = style.ThumbThickness;
-                TrackColor = style.TrackColor;
-                ThumbColor = style.ThumbColor;
-                TrackPadding = style.TrackPadding;
-            }
-        }
-
-        private void Initialize()
-        {
-            TrackThickness = 6.0f;
-            ThumbThickness = 6.0f;
-            TrackColor = new Color(1.0f, 1.0f, 1.0f, 0.15f);
-            ThumbColor = new Color(0.6f, 0.6f, 0.6f, 1.0f);
-            TrackPadding = 4;
-            WidthResizePolicy = ResizePolicyType.FillToParent;
-            HeightResizePolicy = ResizePolicyType.FillToParent;
-        }
-
-        #endregion Methods
     }
 }
index d7c578f..c97f84a 100755 (executable)
@@ -76,12 +76,7 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         public static readonly BindableProperty TrackPaddingProperty = BindableProperty.Create(nameof(TrackPadding), typeof(Extents), typeof(SliderStyle), null, propertyChanged: (bindable, oldValue, newValue) =>
         {
-            var instance = (SliderStyle)bindable;
-            if (newValue != null)
-            {
-                if (null == instance.trackPadding) instance.trackPadding = new Extents(instance.OnTrackPaddingChanged, 0, 0, 0, 0);
-                instance.trackPadding.CopyFrom(null == newValue ? new Extents() : (Extents)newValue);
-            }
+            ((SliderStyle)bindable).trackPadding = newValue == null ? null : new Extents((Extents)newValue);
         },
         defaultValueCreator: (bindable) =>
         {
@@ -89,7 +84,7 @@ namespace Tizen.NUI.Components
             return instance.trackPadding;
         });
 
-        private IndicatorType? privateIndicatorType;
+        private IndicatorType? privateIndicatorType = Slider.IndicatorType.None;
         private uint? privateTrackThickness;
         private uint? privateSpaceBetweenTrackAndIndicator;
         private Extents trackPadding;
@@ -102,8 +97,6 @@ namespace Tizen.NUI.Components
         /// <since_tizen> 8 </since_tizen>
         public SliderStyle() : base()
         {
-            IndicatorType = Slider.IndicatorType.None;
-            InitSubStyle();
         }
 
         /// <summary>
@@ -113,59 +106,49 @@ namespace Tizen.NUI.Components
         /// <since_tizen> 8 </since_tizen>
         public SliderStyle(SliderStyle style) : base(style)
         {
-            if(style == null)
-            {
-                return;
-            }
-
-            InitSubStyle();
-
-            this.CopyFrom(style);
-
-            IndicatorType = style.IndicatorType;
         }
 
         /// <summary>
         /// Get or set background track.
         /// </summary>
         /// <since_tizen> 8 </since_tizen>
-        public ImageViewStyle Track { get; set; }
+        public ImageViewStyle Track { get; set; } = new ImageViewStyle();
 
         /// <summary>
         /// Get or set slided track.
         /// </summary>
         /// <since_tizen> 8 </since_tizen>
-        public ImageViewStyle Progress { get; set; }
+        public ImageViewStyle Progress { get; set; } = new ImageViewStyle();
 
         /// <summary>
         /// Get or set thumb.
         /// </summary>
         /// <since_tizen> 8 </since_tizen>
-        public ImageViewStyle Thumb { get; set; }
+        public ImageViewStyle Thumb { get; set; } = new ImageViewStyle();
 
         /// <summary>
         /// Get or set low indicator image.
         /// </summary>
         /// <since_tizen> 8 </since_tizen>
-        public ImageViewStyle LowIndicatorImage { get; set; }
+        public ImageViewStyle LowIndicatorImage { get; set; } = new ImageViewStyle();
 
         /// <summary>
         /// Get or set high indicator image.
         /// </summary>
         /// <since_tizen> 8 </since_tizen>
-        public ImageViewStyle HighIndicatorImage { get; set; }
+        public ImageViewStyle HighIndicatorImage { get; set; } = new ImageViewStyle();
 
         /// <summary>
         /// Get or set low indicator text.
         /// </summary>
         /// <since_tizen> 8 </since_tizen>
-        public TextLabelStyle LowIndicator { get; set; }
+        public TextLabelStyle LowIndicator { get; set; } = new TextLabelStyle();
 
         /// <summary>
         /// Get or set high indicator text.
         /// </summary>
         /// <since_tizen> 8 </since_tizen>
-        public TextLabelStyle HighIndicator { get; set; }
+        public TextLabelStyle HighIndicator { get; set; } = new TextLabelStyle();
 
         /// <summary>
         /// Get or set Indicator type
@@ -203,11 +186,7 @@ namespace Tizen.NUI.Components
         /// <since_tizen> 8 </since_tizen>
         public Extents TrackPadding
         {
-            get
-            {
-                Extents tmp = (Extents)GetValue(TrackPaddingProperty);
-                return (null != tmp) ? tmp : trackPadding = new Extents(OnTrackPaddingChanged, 0, 0, 0, 0);
-            }
+            get => ((Extents)GetValue(TrackPaddingProperty)) ?? (trackPadding = new Extents(0, 0, 0, 0));
             set => SetValue(TrackPaddingProperty, value);
         }
 
@@ -220,54 +199,15 @@ namespace Tizen.NUI.Components
         {
             base.CopyFrom(bindableObject);
 
-            SliderStyle sliderStyle = bindableObject as SliderStyle;
-
-            if (null != sliderStyle)
+            if (bindableObject is SliderStyle sliderStyle)
             {
-                if (sliderStyle.Track != null)
-                {
-                    Track?.CopyFrom(sliderStyle.Track);
-                }
-
-                if (sliderStyle.Progress != null)
-                {
-                    Progress?.CopyFrom(sliderStyle.Progress);
-                }
-
-                if (sliderStyle.Thumb != null)
-                {
-                    Thumb?.CopyFrom(sliderStyle.Thumb);
-                }
-
-                if (sliderStyle.LowIndicatorImage != null)
-                {
-                    LowIndicatorImage?.CopyFrom(sliderStyle.LowIndicatorImage);
-                }
-
-                if (sliderStyle.HighIndicatorImage != null)
-                {
-                    HighIndicatorImage?.CopyFrom(sliderStyle.HighIndicatorImage);
-                }
-
-                if (sliderStyle.LowIndicator != null)
-                {
-                    LowIndicator?.CopyFrom(sliderStyle.LowIndicator);
-                }
-
-                if (sliderStyle.HighIndicator != null)
-                {
-                    HighIndicator?.CopyFrom(sliderStyle.HighIndicator);
-                }
-
-                if (sliderStyle.TrackThickness != null)
-                {
-                    TrackThickness = sliderStyle.TrackThickness;
-                }
-
-                if (sliderStyle.TrackPadding != null)
-                {
-                    TrackPadding = sliderStyle.TrackPadding;
-                }
+                Track.CopyFrom(sliderStyle.Track);
+                Progress.CopyFrom(sliderStyle.Progress);
+                Thumb.CopyFrom(sliderStyle.Thumb);
+                LowIndicatorImage.CopyFrom(sliderStyle.LowIndicatorImage);
+                HighIndicatorImage.CopyFrom(sliderStyle.HighIndicatorImage);
+                LowIndicator.CopyFrom(sliderStyle.LowIndicator);
+                HighIndicator.CopyFrom(sliderStyle.HighIndicator);
             }
         }
 
@@ -290,21 +230,5 @@ namespace Tizen.NUI.Components
 
             base.Dispose(type);
         }
-
-        private void InitSubStyle()
-        {
-            Track = new ImageViewStyle();
-            Progress = new ImageViewStyle();
-            Thumb = new ImageViewStyle();
-            LowIndicatorImage = new ImageViewStyle();
-            HighIndicatorImage = new ImageViewStyle();
-            LowIndicator = new TextLabelStyle();
-            HighIndicator = new TextLabelStyle();
-        }
-
-        private void OnTrackPaddingChanged(ushort start, ushort end, ushort top, ushort bottom)
-        {
-            TrackPadding = new Extents(start, end, top, bottom);
-        }
     }
 }
index f3dc359..3039b99 100755 (executable)
@@ -35,7 +35,6 @@ namespace Tizen.NUI.Components
         /// <since_tizen> 8 </since_tizen>
         public SwitchStyle() : base()
         {
-            InitSubStyle();
         }
 
         /// <summary>
@@ -45,29 +44,19 @@ namespace Tizen.NUI.Components
         /// <since_tizen> 8 </since_tizen>
         public SwitchStyle(SwitchStyle style) : base(style)
         {
-            if(null == style)
-            {
-                return;
-            }
-
-            IsSelectable = true;
-            Track = new ImageViewStyle();
-            Thumb = new ImageViewStyle();
-
-            this.CopyFrom(style);
         }
 
         /// <summary>
         /// Thumb image's style.
         /// </summary>
         /// <since_tizen> 8 </since_tizen>
-        public ImageViewStyle Thumb { get; set; }
+        public ImageViewStyle Thumb { get; set; } = new ImageViewStyle();
 
         /// <summary>
         /// Track image's style.
         /// </summary>
         /// <since_tizen> 8 </since_tizen>
-        public ImageViewStyle Track { get; set; }
+        public ImageViewStyle Track { get; set; } = new ImageViewStyle();
 
         /// <summary>
         /// Style's clone function.
@@ -78,19 +67,10 @@ namespace Tizen.NUI.Components
         {
             base.CopyFrom(bindableObject);
 
-            SwitchStyle switchStyle = bindableObject as SwitchStyle;
-
-            if (null != switchStyle)
+            if (bindableObject is SwitchStyle switchStyle)
             {
-                if (null != switchStyle.Track)
-                {
-                    Track?.CopyFrom(switchStyle.Track);
-                }
-
-                if (null != switchStyle.Thumb)
-                {
-                    Thumb?.CopyFrom(switchStyle.Thumb);
-                }
+                Track.CopyFrom(switchStyle.Track);
+                Thumb.CopyFrom(switchStyle.Thumb);
             }
         }
 
@@ -100,27 +80,5 @@ namespace Tizen.NUI.Components
         {
             return new SlidingSwitchExtension();
         }
-
-        private void InitSubStyle()
-        {
-            IsSelectable = true;
-            Track = new ImageViewStyle()
-            {
-                PositionUsesPivotPoint = true,
-                ParentOrigin = Tizen.NUI.ParentOrigin.CenterLeft,
-                PivotPoint = Tizen.NUI.PivotPoint.CenterLeft,
-                WidthResizePolicy = ResizePolicyType.FillToParent,
-                HeightResizePolicy = ResizePolicyType.FillToParent
-            };
-
-            Thumb = new ImageViewStyle()
-            {
-                PositionUsesPivotPoint = true,
-                ParentOrigin = Tizen.NUI.ParentOrigin.CenterLeft,
-                PivotPoint = Tizen.NUI.PivotPoint.CenterLeft,
-                WidthResizePolicy = ResizePolicyType.Fixed,
-                HeightResizePolicy = ResizePolicyType.Fixed
-            };
-        }
     }
 }
index d07ce37..f3d2f10 100755 (executable)
@@ -37,9 +37,6 @@ namespace Tizen.NUI.Components
             ItemPadding = new Extents(0, 0, 0, 0);
             UseTextNaturalSize = false;
             ItemSpace = 0;
-
-            UnderLine = new ViewStyle();
-            Text = new TextLabelStyle();
         }
 
         /// <summary>
@@ -49,47 +46,19 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         public TabStyle(TabStyle style) : base(style)
         {
-            UnderLine = new ViewStyle();
-            Text = new TextLabelStyle();
-
-            if (null == style)
-            {
-                return;
-            }
-
-            if (style.UnderLine != null)
-            {
-                UnderLine?.CopyFrom(style.UnderLine);
-            }
-
-            if (style.Text != null)
-            {
-                Text?.CopyFrom(style.Text);
-            }
-
-            if (style.ItemPadding != null)
-            {
-                ItemPadding = new Extents(style.ItemPadding.Start, style.ItemPadding.End, style.ItemPadding.Top, style.ItemPadding.Bottom);
-            }
-            else
-            {
-                ItemPadding = new Extents(0, 0, 0, 0);
-            }
-            ItemSpace = style.ItemSpace;
-            UseTextNaturalSize = style.UseTextNaturalSize;
         }
 
         /// <summary>
         /// UnderLine's style.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        public ViewStyle UnderLine { get; set; }
+        public ViewStyle UnderLine { get; set; } = new ViewStyle();
 
         /// <summary>
         /// Text's style.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        public TextLabelStyle Text { get; set; }
+        public TextLabelStyle Text { get; set; } = new TextLabelStyle();
 
         /// <summary>
         /// Flag to decide if item is fill with item text's natural width.
@@ -109,35 +78,19 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         public Extents ItemPadding { get; set; }
 
-        /// <summary>
-        /// Style's clone function.
-        /// </summary>
-        /// <param name="bindableObject">The style that need to copy.</param>
+        /// <inheritdoc/>
         [EditorBrowsable(EditorBrowsableState.Never)]
         public override void CopyFrom(BindableObject bindableObject)
         {
             base.CopyFrom(bindableObject);
-            TabStyle tabStyle = bindableObject as TabStyle;
 
-            if (null != tabStyle)
+            if (bindableObject is TabStyle tabStyle)
             {
-                if (null != tabStyle.ItemPadding)
-                {
-                    ItemPadding?.CopyFrom(tabStyle.ItemPadding);
-                }
-
+                UnderLine.CopyFrom(tabStyle.UnderLine);
+                Text.CopyFrom(tabStyle.Text);
+                ItemPadding = tabStyle.ItemPadding == null ? null : new Extents(tabStyle.ItemPadding);
                 ItemSpace = tabStyle.ItemSpace;
                 UseTextNaturalSize = tabStyle.UseTextNaturalSize;
-
-                if (null != tabStyle.UnderLine)
-                {
-                    UnderLine?.CopyFrom(tabStyle.UnderLine);
-                }
-
-                if (null != tabStyle.Text)
-                {
-                    Text?.CopyFrom(tabStyle.Text);
-                }
             }
         }
     }
diff --git a/src/Tizen.NUI.Components/Style/Theme.cs b/src/Tizen.NUI.Components/Style/Theme.cs
deleted file mode 100755 (executable)
index 9e171cb..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- * Copyright(c) 2020 Samsung Electronics Co., Ltd.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- *
- */
-using System;
-using System.Collections.Generic;
-using System.ComponentModel;
-using Tizen.NUI.BaseComponents;
-
-namespace Tizen.NUI.Components
-{
-    /// <summary>
-    /// Interface that includes styles for all components for a theme
-    /// </summary>
-    [EditorBrowsable(EditorBrowsableState.Never)]
-    internal abstract class Theme
-    {
-        private Dictionary<Type, ComponentStyleGetter> styleMap;
-
-        protected Theme()
-        {
-            styleMap = new Dictionary<Type, ComponentStyleGetter>();
-            styleMap.Add(typeof(Button), GetButtonStyle);
-            styleMap.Add(typeof(CheckBox), GetCheckBoxStyle);
-            styleMap.Add(typeof(DropDown), GetDropDownStyle);
-            styleMap.Add(typeof(DropDown.DropDownDataItem), GetDropDownItemStyle);
-            styleMap.Add(typeof(Popup), GetPopupStyle);
-            styleMap.Add(typeof(Progress), GetProgressStyle);
-            styleMap.Add(typeof(RadioButton), GetRadioButtonStyle);
-            styleMap.Add(typeof(Slider), GetSliderStyle);
-            styleMap.Add(typeof(Switch), GetSwitchStyle);
-            styleMap.Add(typeof(Tab), GetTabStyle);
-            styleMap.Add(typeof(Toast), GetToastStyle);
-            styleMap.Add(typeof(Loading), GetLoadingStyle);
-            styleMap.Add(typeof(Pagination), GetPaginationStyle);
-        }
-
-        internal delegate ViewStyle ComponentStyleGetter();
-
-        internal ViewStyle GetComponentStyle(Type type)
-        {
-            return styleMap.ContainsKey(type) ? styleMap[type]() : null;
-        }
-
-        internal void OverwriteComponentStyle(Type type, ComponentStyleGetter styleGetter)
-        {
-            styleMap.Add(typeof(Toast), GetToastStyle);
-        }
-
-        protected abstract ButtonStyle GetButtonStyle();
-
-        protected abstract ButtonStyle GetCheckBoxStyle();
-
-        protected abstract DropDownStyle GetDropDownStyle();
-
-        protected abstract DropDownItemStyle GetDropDownItemStyle();
-
-        protected abstract PopupStyle GetPopupStyle();
-
-        protected abstract ProgressStyle GetProgressStyle();
-
-        protected abstract ButtonStyle GetRadioButtonStyle();
-
-        protected abstract SliderStyle GetSliderStyle();
-
-        protected abstract SwitchStyle GetSwitchStyle();
-
-        protected abstract TabStyle GetTabStyle();
-
-        protected abstract ToastStyle GetToastStyle();
-
-        protected abstract LoadingStyle GetLoadingStyle();
-
-        protected abstract PaginationStyle GetPaginationStyle();
-    }
-}
index 94ddbe3..18d798d 100755 (executable)
@@ -26,6 +26,19 @@ namespace Tizen.NUI.Components
     [EditorBrowsable(EditorBrowsableState.Never)]
     public class ToastStyle : ControlStyle
     {
+        /// <summary>The Duration bindable property.</summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static readonly BindableProperty DurationProperty = BindableProperty.Create(nameof(Duration), typeof(uint?), typeof(ToastStyle), null, propertyChanged: (bindable, oldValue, newValue) =>
+        {
+            ((ToastStyle)bindable).duration = (uint?)newValue;
+        },
+        defaultValueCreator: (bindable) =>
+        {
+            return ((ToastStyle)bindable).duration;
+        });
+
+        private uint? duration;
+
         static ToastStyle() { }
 
         /// <summary>
@@ -34,7 +47,6 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         public ToastStyle() : base()
         {
-            InitSubStyle();
         }
 
         /// <summary>
@@ -44,54 +56,34 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         public ToastStyle(ToastStyle style) : base(style)
         {
-            InitSubStyle();
-            this.CopyFrom(style);
         }
 
         /// <summary>
         /// Gets or sets toast show duration time.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        public uint? Duration { get; set; }
+        public uint? Duration
+        {
+            get => (uint?)GetValue(DurationProperty);
+            set => SetValue(DurationProperty, value);
+        }
 
         /// <summary>
         /// Text's Style.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        public TextLabelStyle Text { get; set; }
+        public TextLabelStyle Text { get; set; } = new TextLabelStyle();
 
-        /// <summary>
-        /// Style's clone function.
-        /// </summary>
-        /// <param name="bindableObject">The style that need to copy.</param>
+        /// <inheritdoc/>
         [EditorBrowsable(EditorBrowsableState.Never)]
         public override void CopyFrom(BindableObject bindableObject)
         {
             base.CopyFrom(bindableObject);
-            ToastStyle toastStyle = bindableObject as ToastStyle;
-            if (toastStyle != null)
-            {
-                if (null != toastStyle.Text)
-                {
-                    Text?.CopyFrom(toastStyle.Text);
-                }
-                Duration = toastStyle.Duration;
-            }
-        }
 
-        private void InitSubStyle()
-        {
-            Text = new TextLabelStyle()
+            if (bindableObject is ToastStyle toastStyle)
             {
-                PositionUsesPivotPoint = true,
-                ParentOrigin = Tizen.NUI.ParentOrigin.Center,
-                PivotPoint = Tizen.NUI.PivotPoint.Center,
-                WidthResizePolicy = ResizePolicyType.UseNaturalSize,
-                HeightResizePolicy = ResizePolicyType.UseNaturalSize,
-                HorizontalAlignment = HorizontalAlignment.Center,
-                VerticalAlignment = VerticalAlignment.Center,
-                TextColor = Tizen.NUI.Color.White,
-            };
+                Text.CopyFrom(toastStyle.Text);
+            }
         }
     }
 }
index 616af37..2d4e029 100755 (executable)
@@ -11,7 +11,7 @@
   </ItemGroup>
 
   <ItemGroup>
-    <None Update="res\*.png">
+    <None Update="res\**">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
   </ItemGroup>
index 388e765..5a6887d 100755 (executable)
@@ -27,53 +27,19 @@ namespace Tizen.NUI.Components
     [EditorBrowsable(EditorBrowsableState.Never)]
     public sealed class StyleManager
     {
-        internal const float PointSizeNormal = 12;
-        internal const float PointSizeTitle = 16;
-
-        private const string defaultThemeName = "DEFAULT"; //"default";
-        private const string wearableThemeName = "WEARABLE"; //"wearable";
-        
-        private string currentThemeName = defaultThemeName;
-        private Dictionary<string, Dictionary<string, StyleBase>> themeStyleSet = new Dictionary<string, Dictionary<string, StyleBase>>();
-        private Dictionary<string, StyleBase> defaultStyleSet = new Dictionary<string, StyleBase>();
-
-        /// <summary>
-        /// (Theme name, Theme instance)
-        /// </summary>
-        private Dictionary<string, Dictionary<Type, StyleBase>> componentStyleByTheme = new Dictionary<string, Dictionary<Type, StyleBase>>();
-        
-        /// <summary>
-        /// (Theme name, Theme instance)
-        /// </summary>
-        private Dictionary<string, Theme> themeMap = new Dictionary<string, Theme>();
-
-        private EventHandler<ThemeChangeEventArgs> themeChangeHandler;
-
-        private Theme currentTheme;
-
         /// <summary>
         /// StyleManager construct.
         /// </summary>
         private StyleManager()
         {
-            SetInitialThemeByDeviceProfile();
+            ThemeManager.ThemeChanged += OnThemeChanged;
         }
 
         /// <summary>
         /// An event for the theme changed signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        public event EventHandler<ThemeChangeEventArgs> ThemeChangedEvent
-        {
-            add
-            {
-                themeChangeHandler += value;
-            }
-            remove
-            {
-                themeChangeHandler -= value;
-            }
-        }
+        public event EventHandler<ThemeChangeEventArgs> ThemeChangedEvent;
 
         /// <summary>
         /// StyleManager static instance.
@@ -89,26 +55,38 @@ namespace Tizen.NUI.Components
         {
             get
             {
-                return currentThemeName;
+                return ThemeManager.CurrentTheme?.Id;
             }
-
             set
             {
-                if (value != null && currentThemeName != value)
-                {
-                    currentThemeName = value.ToUpperInvariant();
-                    themeChangeHandler?.Invoke(null, new ThemeChangeEventArgs { CurrentTheme = currentThemeName });
+                if (value == null) return;
+
+                var key = value.ToUpperInvariant();
 
-                    UpdateTheme();
+                if (key == Theme?.ToUpperInvariant()) return;
+
+                if (!ThemeMap.ContainsKey(key) || ThemeMap[key] == null)
+                {
+                    ThemeMap[key] = new Theme()
+                    {
+                        Id = value
+                    };
                 }
+
+                ThemeManager.CurrentTheme = ThemeMap[key];
             }
         }
 
         /// <summary>
+        /// (Theme name, Theme instance)
+        /// </summary>
+        private Dictionary<string, Theme> ThemeMap { get; } = new Dictionary<string, Theme> { ["DEFAULT"] = ThemeManager.DefaultTheme };
+
+        /// <summary>
         /// Register style in StyleManager.
         /// </summary>
         /// <param name="style">Style name.</param>
-        /// <param name="theme">Theme.</param>
+        /// <param name="theme">Theme id.</param>
         /// <param name="styleType">Style type.</param>
         /// <param name="bDefault">Flag to decide if it is default style.</param>
         [EditorBrowsable(EditorBrowsableState.Never)]
@@ -119,32 +97,30 @@ namespace Tizen.NUI.Components
                 throw new InvalidOperationException($"style can't be null");
             }
 
-            if (theme == null || bDefault == true)
+            if (Activator.CreateInstance(styleType) is StyleBase styleBase)
             {
-                if (defaultStyleSet.ContainsKey(style))
+                var key = "DEFAULT";
+
+                if (theme != null)
                 {
-                    throw new InvalidOperationException($"{style}] already be used");
+                    key = theme.ToUpperInvariant();
                 }
-                else
+
+                if (!ThemeMap.ContainsKey(key) || ThemeMap[key] == null)
                 {
-                    defaultStyleSet.Add(style, Activator.CreateInstance(styleType) as StyleBase);
+                    ThemeMap[key] = new Theme()
+                    {
+                        Id = theme ?? key
+                    };
                 }
-                return;
-            }
-
-            theme = theme.ToUpperInvariant();
 
-            if (themeStyleSet.ContainsKey(style) && themeStyleSet[style].ContainsKey(theme))
-            {
-                throw new InvalidOperationException($"{style}] already be used");
-            }
+                if (ThemeMap[key].HasStyle(style))
+                {
+                    throw new InvalidOperationException($"{style} already be used");
+                }
 
-            if (!themeStyleSet.ContainsKey(style))
-            {
-                themeStyleSet.Add(style, new Dictionary<string, StyleBase>());
+                ThemeMap[key][style] = styleBase.GetViewStyle();
             }
-
-            themeStyleSet[style].Add(theme, Activator.CreateInstance(styleType) as StyleBase);
         }
 
         /// <summary>
@@ -160,16 +136,7 @@ namespace Tizen.NUI.Components
                 return null;
             }
 
-            if (themeStyleSet.ContainsKey(style) && themeStyleSet[style].ContainsKey(Theme))
-            {
-                return (themeStyleSet[style][Theme])?.GetViewStyle();
-            }
-            else if (defaultStyleSet.ContainsKey(style))
-            {
-                return (defaultStyleSet[style])?.GetViewStyle();
-            }
-
-            return null;
+            return (ThemeManager.CurrentTheme?.GetStyle(style) ?? ThemeManager.DefaultTheme?.GetStyle(style))?.Clone();
         }
 
         /// <summary>
@@ -186,25 +153,15 @@ namespace Tizen.NUI.Components
                 throw new ArgumentException("The argument targetTheme must be specified");
             }
 
-            if (!themeMap.ContainsKey(targetTheme))
+            var key = targetTheme.ToUpperInvariant();
+
+            if (!ThemeMap.ContainsKey(key) || ThemeMap[key] == null)
             {
                 Tizen.Log.Error("NUI", "The theme name should be a known one.");
                 return;
             }
 
-            if (!componentStyleByTheme.ContainsKey(targetTheme))
-            {
-                componentStyleByTheme.Add(targetTheme, new Dictionary<Type, StyleBase>());
-            }
-
-            if (componentStyleByTheme[targetTheme].ContainsKey(component))
-            {
-                componentStyleByTheme[targetTheme][component] = Activator.CreateInstance(style) as StyleBase;
-            }
-            else
-            {
-                componentStyleByTheme[targetTheme].Add(component, Activator.CreateInstance(style) as StyleBase);
-            }
+            ThemeMap[key][component.Name] = (Activator.CreateInstance(style) as StyleBase).GetViewStyle();
         }
 
         /// <summary>
@@ -215,12 +172,12 @@ namespace Tizen.NUI.Components
         [EditorBrowsable(EditorBrowsableState.Never)]
         public ViewStyle GetComponentStyle(Type component)
         {
-            if (componentStyleByTheme.ContainsKey(currentThemeName) && componentStyleByTheme[currentThemeName].ContainsKey(component))
-            {
-                return componentStyleByTheme[currentThemeName][component].GetViewStyle();
-            }
+            return ThemeManager.GetStyle(component.Name);
+        }
 
-            return currentTheme.GetComponentStyle(component);
+        private void OnThemeChanged(object target, ThemeChangedEventArgs args)
+        {
+            ThemeChangedEvent?.Invoke(null, new ThemeChangeEventArgs { CurrentTheme = args.ThemeId });
         }
 
         /// <summary>
@@ -235,52 +192,5 @@ namespace Tizen.NUI.Components
             [EditorBrowsable(EditorBrowsableState.Never)]
             public string CurrentTheme;
         }
-
-        internal static string GetFrameworkResourcePath(string resourceFileName)
-        {
-            return "/usr/share/dotnet.tizen/framework/res/" + resourceFileName;
-        }
-
-        private void SetInitialThemeByDeviceProfile()
-        {
-            Theme wearableTheme = WearableTheme.Instance;
-            Theme defaultTheme = DefaultTheme.Instance;
-            themeMap.Add(wearableThemeName, wearableTheme);
-            themeMap.Add(defaultThemeName, defaultTheme);
-
-            currentThemeName = defaultThemeName;
-            currentTheme = defaultTheme;
-
-            string currentProfile;
-
-            try
-            {
-                System.Information.TryGetValue<string>("tizen.org/feature/profile", out currentProfile);
-                Tizen.Log.Info("NUI", "Profile for initial theme found : " + currentProfile);
-            }
-            catch
-            {
-                Tizen.Log.Error("NUI", "Unknown device profile\n");
-                return;
-            }
-
-            if (string.Equals(currentProfile, wearableThemeName))
-            {
-                currentThemeName = wearableThemeName;
-                currentTheme = wearableTheme;
-            }
-        }
-
-        private void UpdateTheme()
-        {
-            if (themeMap.ContainsKey(currentThemeName))
-            {
-                currentTheme = themeMap[currentThemeName];
-            }
-            else
-            {
-                currentTheme = DefaultTheme.Instance;
-            }
-        }
     }
 }
diff --git a/src/Tizen.NUI.Components/res/Theme/Tizen.NUI.Components_Tizen.NUI.Theme.Common.xaml b/src/Tizen.NUI.Components/res/Theme/Tizen.NUI.Components_Tizen.NUI.Theme.Common.xaml
new file mode 100644 (file)
index 0000000..1b7307a
--- /dev/null
@@ -0,0 +1,215 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<n:Theme
+  xmlns:n="clr-namespace:Tizen.NUI;assembly=Tizen.NUI"
+  xmlns:b="clr-namespace:Tizen.NUI.BaseComponents;assembly=Tizen.NUI"
+  xmlns:c="clr-namespace:Tizen.NUI.Components;assembly=Tizen.NUI.Components"
+  xmlns:nx="clr-namespace:Tizen.NUI.Xaml;assembly=Tizen.NUI"
+  xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+  Id="Tizen.NUI.Theme.Common" >
+
+  <!--Button-->
+  <c:ButtonStyle x:Key="Button" Size="100, 45">
+    <c:ButtonStyle.BackgroundColor>
+      <b:Selector x:TypeArguments="n:Color" Normal="0.88, 0.88, 0.88, 1" Pressed="0.77, 0.77, 0.77, 1" Disabled="0.88, 0.88, 0.88, 1"/>
+    </c:ButtonStyle.BackgroundColor>
+    <c:ButtonStyle.Text>  <!--Button Text-->
+      <b:TextLabelStyle PointSize="12" WidthResizePolicy="FillToParent" HeightResizePolicy="FillToParent" HorizontalAlignment="Center" VerticalAlignment="Center" Text="Button">
+        <b:TextLabelStyle.TextColor>
+          <b:Selector x:TypeArguments="n:Color" Normal="0.22, 0.22, 0.22, 1" Pressed="0.11, 0.11, 0.11, 1" Disabled="0.66, 0.66, 0.66, 1"/>
+        </b:TextLabelStyle.TextColor>
+      </b:TextLabelStyle>
+    </c:ButtonStyle.Text>
+  </c:ButtonStyle>
+
+  <!--CheckBox-->
+  <c:ButtonStyle x:Key="CheckBox" Size="30, 30">
+    <c:ButtonStyle.Icon> <!--CheckBox Icon-->
+      <b:ImageViewStyle WidthResizePolicy="DimensionDependency" HeightResizePolicy="SizeRelativeToParent">
+        <b:ImageViewStyle.Opacity>
+          <b:Selector x:TypeArguments="x:Single?" Normal="1.0" Selected="1.0" Disabled="0.4" DisabledSelected="0.4"/>
+        </b:ImageViewStyle.Opacity>
+        <b:ImageViewStyle.BackgroundImage>
+          <b:Selector x:TypeArguments="x:String" Pressed="{nx:NUIResourcePath nui_component_default_checkbox_bg_p.png}" Selected="{nx:NUIResourcePath nui_component_default_checkbox_bg_p.png}" Other="{nx:NUIResourcePath nui_component_default_checkbox_bg_n.png}"/>
+        </b:ImageViewStyle.BackgroundImage>
+        <b:ImageViewStyle.ResourceUrl>
+          <b:Selector x:TypeArguments="x:String" Selected="{nx:NUIResourcePath nui_component_default_checkbox_s.png}" Other=""/>
+        </b:ImageViewStyle.ResourceUrl>
+      </b:ImageViewStyle>
+    </c:ButtonStyle.Icon>
+    <c:ButtonStyle.Text>  <!--CheckBox Text-->
+      <b:TextLabelStyle PointSize="12" WidthResizePolicy="FillToParent" HeightResizePolicy="FillToParent" HorizontalAlignment="Center" VerticalAlignment="Center">
+        <b:TextLabelStyle.TextColor>
+          <b:Selector x:TypeArguments="n:Color" Normal="0.22, 0.22, 0.22, 1" Pressed="0.11, 0.11, 0.11, 1" Disabled="0.66, 0.66, 0.66, 1"/>
+        </b:TextLabelStyle.TextColor>
+      </b:TextLabelStyle>
+    </c:ButtonStyle.Text>
+  </c:ButtonStyle>
+
+  <!--DropDown-->
+  <c:DropDownStyle x:Key="DropDown" SpaceBetweenButtonTextAndIcon="10" ListPadding="5">
+    <c:DropDownStyle.Button> <!--DropDown Button-->
+      <c:ButtonStyle ParentOrigin="TopLeft" PivotPoint="TopLeft" BackgroundImageBorder="6, 6, 6, 6" IconRelativeOrientation="Right" IconPadding="6">
+        <c:ButtonStyle.BackgroundImage>
+          <b:Selector x:TypeArguments="x:String" Pressed="{nx:NUIResourcePath nui_component_default_checkbox_bg_p.png}" Other="{nx:NUIResourcePath nui_component_default_checkbox_bg_n.png}"/>
+        </c:ButtonStyle.BackgroundImage>
+        <c:ButtonStyle.Text>
+          <b:TextLabelStyle Text="Select an item" PointSize="12" TextColor="Black"/>
+        </c:ButtonStyle.Text>
+        <c:ButtonStyle.Icon>
+          <b:ImageViewStyle Size="28, 28" ResourceUrl="{nx:NUIResourcePath nui_component_default_dropdown_button_icon.png}"/>
+        </c:ButtonStyle.Icon>
+      </c:ButtonStyle>
+    </c:DropDownStyle.Button>
+    <c:DropDownStyle.ListBackgroundImage> <!--DropDown ListBackgroundImage-->
+      <b:ImageViewStyle ResourceUrl="{nx:NUIResourcePath nui_component_default_dropdown_list_bg.png}" Border="6, 6, 6, 6" Size="280, 360"/>
+    </c:DropDownStyle.ListBackgroundImage>
+  </c:DropDownStyle>
+
+  <!--DropDownDataItem-->
+  <c:DropDownItemStyle x:Key="DropDownDataItem" Size="360, 50">
+    <c:DropDownItemStyle.BackgroundColor>
+      <b:Selector x:TypeArguments="n:Color" Pressed="0.05, 0.63, 0.9, 1" Selected="0.8, 0.8, 0.8, 1" Normal="1, 1, 1, 1"/>
+    </c:DropDownItemStyle.BackgroundColor>
+    <c:DropDownItemStyle.Text>
+      <b:TextLabelStyle PointSize="12" Position="28, 0" Text="List item"/>
+    </c:DropDownItemStyle.Text>
+  </c:DropDownItemStyle>
+
+  <!--Popup-->
+  <c:PopupStyle x:Key="Popup" Size="500, 280" BackgroundColor="0.9, 0.9, 0.9, 1">
+    <c:PopupStyle.ImageShadow>
+      <n:ImageShadow Url="{nx:NUIResourcePath nui_component_default_popup_shadow.png}" Border="24, 24, 24, 24" Extents="48, 48"/>
+    </c:PopupStyle.ImageShadow>
+    <c:PopupStyle.Title>
+      <b:TextLabelStyle PointSize="16" TextColor="Black" PositionUsesPivotPoint="true" ParentOrigin="TopLeft" PivotPoint="TopLeft" HorizontalAlignment="Begin" VerticalAlignment="Bottom" Padding="20" Text="Title" />
+    </c:PopupStyle.Title>
+    <c:PopupStyle.Buttons>
+      <c:ButtonStyle Size="0, 80" PositionUsesPivotPoint="true" ParentOrigin="BottomLeft" PivotPoint="BottomLeft">
+        <c:ButtonStyle.BackgroundColor>
+          <b:Selector x:TypeArguments="n:Color" Normal="1, 1, 1, 1" Pressed="1, 1, 1, 0.5"/>
+        </c:ButtonStyle.BackgroundColor>
+        <c:ButtonStyle.Overlay>
+          <b:ImageViewStyle PositionUsesPivotPoint="true" ParentOrigin="Center" PivotPoint="Center" WidthResizePolicy="FillToParent" HeightResizePolicy="FillToParent">
+            <b:ImageViewStyle.BackgroundColor>
+              <b:Selector x:TypeArguments="n:Color" Normal="1, 1, 1, 1" Pressed="0, 0, 0, 0.1" Selected="1, 1, 1, 1"/>
+            </b:ImageViewStyle.BackgroundColor>
+          </b:ImageViewStyle>
+        </c:ButtonStyle.Overlay>
+        <c:ButtonStyle.Text>
+          <b:TextLabelStyle PositionUsesPivotPoint="true" ParentOrigin="Center" PivotPoint="Center" HorizontalAlignment="Center" VerticalAlignment="Center" TextColor="0.05, 0.63, 0.9, 1" />
+        </c:ButtonStyle.Text>
+      </c:ButtonStyle>
+    </c:PopupStyle.Buttons>
+  </c:PopupStyle>
+
+  <!--Progress-->
+  <c:ProgressStyle x:Key="Progress" Size="200, 5">
+    <c:ProgressStyle.Track>
+      <b:ImageViewStyle BackgroundColor="0, 0, 0, 0.1" />
+    </c:ProgressStyle.Track>
+    <c:ProgressStyle.Buffer>
+      <b:ImageViewStyle BackgroundColor="0.05, 0.63, 0.9, 0.3" />
+    </c:ProgressStyle.Buffer>
+    <c:ProgressStyle.Progress>
+      <b:ImageViewStyle BackgroundColor="0.05, 0.63, 0.9, 1" />
+    </c:ProgressStyle.Progress>
+  </c:ProgressStyle>
+
+  <!--RadioButton-->
+  <c:ButtonStyle x:Key="RadioButton" Size="30, 30">
+    <c:ButtonStyle.Icon>
+      <b:ImageViewStyle WidthResizePolicy="DimensionDependency" HeightResizePolicy="SizeRelativeToParent" SizeModeFactor="1, 1, 1">
+        <b:ImageViewStyle.Opacity>
+          <b:Selector x:TypeArguments="x:Single?" Normal="1" Selected="1" Disabled="0.4" DisabledSelected="0.4"/>
+        </b:ImageViewStyle.Opacity>
+        <b:ImageViewStyle.BackgroundImage>
+          <b:Selector x:TypeArguments="x:String" Pressed="{nx:NUIResourcePath nui_component_default_radiobutton_p.png}" Selected="{nx:NUIResourcePath nui_component_default_radiobutton_s.png}" Other="{nx:NUIResourcePath nui_component_default_radiobutton_n.png}" />
+        </b:ImageViewStyle.BackgroundImage>
+      </b:ImageViewStyle>
+    </c:ButtonStyle.Icon>
+    <c:ButtonStyle.Text>
+      <b:TextLabelStyle WidthResizePolicy="FillToParent" HeightResizePolicy="FillToParent" HorizontalAlignment="Center" VerticalAlignment="Center" PointSize="12">
+        <b:TextLabelStyle.TextColor>
+          <b:Selector x:TypeArguments="n:Color" Normal="0.22, 0.22, 0.22, 1" Pressed="0.11, 0.11, 0.11, 1" Disabled="0.66, 0.66, 0.66, 1" />
+        </b:TextLabelStyle.TextColor>
+      </b:TextLabelStyle>
+    </c:ButtonStyle.Text>
+  </c:ButtonStyle>
+
+  <!--Slider-->
+  <c:SliderStyle x:Key="Slider" Size="200, 50" TrackThickness="5">
+    <c:SliderStyle.Track>
+      <b:ImageViewStyle BackgroundColor="0, 0, 0, 0.1" />
+    </c:SliderStyle.Track>
+    <c:SliderStyle.Progress>
+      <b:ImageViewStyle BackgroundColor="0.5, 0.63, 0.9, 1" />
+    </c:SliderStyle.Progress>
+    <c:SliderStyle.Thumb>
+      <b:ImageViewStyle Size="50, 50" ResourceUrl="{nx:NUIResourcePath nui_component_default_slider_thumb_n.png}">
+        <b:ImageViewStyle.BackgroundImage>
+          <b:Selector x:TypeArguments="x:String" Normal="" Pressed="{nx:NUIResourcePath nui_component_default_slider_thumb_bg_p.png}" />
+        </b:ImageViewStyle.BackgroundImage>
+      </b:ImageViewStyle>
+    </c:SliderStyle.Thumb>
+  </c:SliderStyle>
+
+  <!--Switch-->
+  <c:SwitchStyle x:Key="Switch" Size="96, 60">
+    <c:Switch.Track>
+      <b:ImageViewStyle Size="96, 60" WidthResizePolicy="Fixed" HeightResizePolicy="Fixed" Border="30, 30, 30, 30">
+        <b:ImageViewStyle.ResourceUrl>
+          <b:Selector x:TypeArguments="x:String" Normal="{nx:NUIResourcePath nui_component_default_switch_track_n.png}" Selected="{nx:NUIResourcePath nui_component_default_switch_track_s.png}" Disabled="{nx:NUIResourcePath nui_component_default_switch_track_d.png}" DisabledSelected="{nx:NUIResourcePath nui_component_default_switch_track_ds.png}" />
+        </b:ImageViewStyle.ResourceUrl>
+      </b:ImageViewStyle>
+    </c:Switch.Track>
+    <c:Switch.Thumb>
+      <b:ImageViewStyle Size="60, 60">
+        <b:ImageViewStyle.ResourceUrl>
+          <b:Selector x:TypeArguments="x:String" Normal="{nx:NUIResourcePath nui_component_default_switch_thumb_n.png}" Disabled="{nx:NUIResourcePath nui_component_default_switch_thumb_d.png}" Selected="{nx:NUIResourcePath nui_component_default_switch_thumb_n.png}" />
+        </b:ImageViewStyle.ResourceUrl>
+      </b:ImageViewStyle>
+    </c:Switch.Thumb>
+    <c:Switch.Text>
+      <b:TextLabelStyle PointSize="12" WidthResizePolicy="FillToParent" HeightResizePolicy="FillToParent" HorizontalAlignment="Center" VerticalAlignment="Center">
+        <b:TextLabelStyle.TextColor>
+          <b:Selector x:TypeArguments="n:Color" Normal="0.22, 0.22, 0.22, 1" Pressed="0.11, 0.11, 0.11, 1" Disabled="0.66, 0.66, 0.66, 1" />
+        </b:TextLabelStyle.TextColor>
+      </b:TextLabelStyle>
+    </c:Switch.Text>
+  </c:SwitchStyle>
+
+  <!--Tab-->
+  <c:TabStyle x:Key="Tab" Size="480, 80" BackgroundColor="Yellow">
+    <c:TabStyle.UnderLine>
+      <b:ViewStyle Size="0, 6" PositionUsesPivotPoint="true" ParentOrigin="BottomLeft" PivotPoint="BottomLeft" BackgroundColor="0.05, 0.63, 0.9, 1.0" />
+    </c:TabStyle.UnderLine>
+    <c:TabStyle.Text>
+      <b:TextLabelStyle PointSize="16">
+        <b:TextLabelStyle.TextColor>
+          <b:Selector x:TypeArguments="n:Color" Normal="Black" Selected="0.05, 0.63, 0.9, 1" />
+        </b:TextLabelStyle.TextColor>
+      </b:TextLabelStyle>
+    </c:TabStyle.Text>
+  </c:TabStyle>
+
+  <!--Toast-->
+  <c:ToastStyle x:Key="Toast" WidthResizePolicy="FitToChildren" HeightResizePolicy="FitToChildren" BackgroundColor="0, 0, 0, 0.8">
+    <c:ToastStyle.Text>
+      <b:TextLabelStyle PositionUsesPivotPoint="true" ParentOrigin="Center" PivotPoint="Center" WidthResizePolicy="UseNaturalSize" HeightResizePolicy="UseNaturalSize" HorizontalAlignment="Center" VerticalAlignment="Center" TextColor="White" Padding="12, 12, 8, 8" />
+    </c:ToastStyle.Text>
+  </c:ToastStyle>
+
+  <!--Loading-->
+  <c:LoadingStyle x:Key="Loading" LoadingSize="100, 100" />
+  
+  <!--Pagination-->
+  <c:PaginationStyle x:Key="Pagination">
+    <c:PaginationStyle.IndicatorImageUrl>
+      <b:Selector x:TypeArguments="x:String" Normal="{nx:NUIResourcePath nui_component_default_pagination_normal_dot.png}" Selected="{nx:NUIResourcePath nui_component_default_pagination_focus_dot.png}" />
+    </c:PaginationStyle.IndicatorImageUrl>
+  </c:PaginationStyle>
+
+  <!--Scrollbar-->
+  <c:ScrollbarStyle x:Key="Scrollbar" TrackThickness="6" ThumbThickness="6" TrackColor="1, 1, 1, 0.15" ThumbColor="0.6, 0.6, 0.6, 1.0" TrackPadding="4" />
+
+</n:Theme>
\ No newline at end of file
diff --git a/src/Tizen.NUI.Components/res/Theme/Tizen.NUI.Components_Tizen.NUI.Theme.Wearable.xaml b/src/Tizen.NUI.Components/res/Theme/Tizen.NUI.Components_Tizen.NUI.Theme.Wearable.xaml
new file mode 100644 (file)
index 0000000..d8af9c6
--- /dev/null
@@ -0,0 +1,179 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<n:Theme
+  xmlns:n="clr-namespace:Tizen.NUI;assembly=Tizen.NUI"
+  xmlns:b="clr-namespace:Tizen.NUI.BaseComponents;assembly=Tizen.NUI"
+  xmlns:c="clr-namespace:Tizen.NUI.Components;assembly=Tizen.NUI.Components"
+  xmlns:nx="clr-namespace:Tizen.NUI.Xaml;assembly=Tizen.NUI"
+  xmlns:cx="clr-namespace:Tizen.NUI.Components.Extension;assembly=Tizen.NUI.Components"
+  xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+  Id="Tizen.NUI.Theme.Wearable" >
+
+  <!--Button-->
+  <c:ButtonStyle x:Key="Button" Size="210, 72" CornerRadius="36">
+    <c:ButtonStyle.BackgroundColor>
+      <b:Selector x:TypeArguments="n:Color" Normal="0, 0.1647, 0.3019, 0.85" Pressed="0, 0.2475, 0.5019, 0.85" Disabled="0.2392, 0.2392, 0.2392, 0.85"/>
+    </c:ButtonStyle.BackgroundColor>
+    <c:ButtonStyle.Opacity>
+      <b:Selector x:TypeArguments="x:Single?" Other="1.0" Disabled="0.3"/>
+    </c:ButtonStyle.Opacity>
+    <c:ButtonStyle.Text>  <!--Button Text-->
+      <b:TextLabelStyle FontFamily="SamsungOne 700" PixelSize="28" Padding="20, 20, 0, 0" HorizontalAlignment="Center" VerticalAlignment="Center">
+        <b:TextLabelStyle.TextColor>
+          <b:Selector x:TypeArguments="n:Color" Normal="0.2196, 0.6131, 0.9882, 1" Disabled="1, 1, 1, 0.35"/>
+        </b:TextLabelStyle.TextColor>
+      </b:TextLabelStyle>
+    </c:ButtonStyle.Text>
+  </c:ButtonStyle>
+
+  <!--CheckBox-->
+  <cx:LottieButtonStyle x:Key="CheckBox" LottieUrl="nx:NUIResourcePath nui_wearable_checkbox_icon.json">
+    <cx:LottieButtonStyle.PlayRange>
+      <b:Selector x:TypeArguments="b:LottieFrameInfo" Selected="19, 36" Normal="0, 18"/>
+    </cx:LottieButtonStyle.PlayRange>
+    <cx:LottieButtonStyle.Opacity>
+      <b:Selector x:TypeArguments="x:Single?" Other="1" Pressed="0.6" Disabled="0.3"/>
+    </cx:LottieButtonStyle.Opacity>
+  </cx:LottieButtonStyle>
+
+  <!--DropDown-->
+  <c:DropDownStyle x:Key="DropDown" SpaceBetweenButtonTextAndIcon="10" ListPadding="5">
+    <c:DropDownStyle.Button> <!--DropDown Button-->
+      <c:ButtonStyle ParentOrigin="TopLeft" PivotPoint="TopLeft" BackgroundImageBorder="6, 6, 6, 6" IconRelativeOrientation="Right" IconPadding="6">
+        <c:ButtonStyle.BackgroundImage>
+          <b:Selector x:TypeArguments="x:String" Pressed="{nx:NUIResourcePath nui_component_default_checkbox_bg_p.png}" Other="{nx:NUIResourcePath nui_component_default_checkbox_bg_n.png}"/>
+        </c:ButtonStyle.BackgroundImage>
+        <c:ButtonStyle.Text>
+          <b:TextLabelStyle Text="Select an item" PointSize="12" TextColor="Black"/>
+        </c:ButtonStyle.Text>
+        <c:ButtonStyle.Icon>
+          <b:ImageViewStyle Size="28, 28" ResourceUrl="{nx:NUIResourcePath nui_component_default_dropdown_button_icon.png}"/>
+        </c:ButtonStyle.Icon>
+      </c:ButtonStyle>
+    </c:DropDownStyle.Button>
+    <c:DropDownStyle.ListBackgroundImage> <!--DropDown ListBackgroundImage-->
+      <b:ImageViewStyle ResourceUrl="{nx:NUIResourcePath nui_component_default_dropdown_list_bg.png}" Border="6, 6, 6, 6" Size="280, 360"/>
+    </c:DropDownStyle.ListBackgroundImage>
+  </c:DropDownStyle>
+
+  <!--DropDownDataItem-->
+  <c:DropDownItemStyle x:Key="DropDownDataItem" Size="360, 50">
+    <c:DropDownItemStyle.BackgroundColor>
+      <b:Selector x:TypeArguments="n:Color" Pressed="0.05, 0.63, 0.9, 1" Selected="0.8, 0.8, 0.8, 1" Normal="1, 1, 1, 1"/>
+    </c:DropDownItemStyle.BackgroundColor>
+    <c:DropDownItemStyle.Text>
+      <b:TextLabelStyle PointSize="12" Position="28, 0" Text="List item"/>
+    </c:DropDownItemStyle.Text>
+  </c:DropDownItemStyle>
+
+  <!--Popup-->
+  <c:PopupStyle x:Key="Popup" Size="500, 280" BackgroundColor="0.9, 0.9, 0.9, 1">
+    <c:PopupStyle.ImageShadow>
+      <n:ImageShadow Url="{nx:NUIResourcePath nui_component_default_popup_shadow.png}" Border="24, 24, 24, 24" Extents="48, 48"/>
+    </c:PopupStyle.ImageShadow>
+    <c:PopupStyle.Title>
+      <b:TextLabelStyle PointSize="16" TextColor="Black" PositionUsesPivotPoint="true" ParentOrigin="TopLeft" PivotPoint="TopLeft" HorizontalAlignment="Begin" VerticalAlignment="Bottom" Padding="20" Text="Title" />
+    </c:PopupStyle.Title>
+    <c:PopupStyle.Buttons>
+      <c:ButtonStyle Size="0, 80" PositionUsesPivotPoint="true" ParentOrigin="BottomLeft" PivotPoint="BottomLeft">
+        <c:ButtonStyle.BackgroundColor>
+          <b:Selector x:TypeArguments="n:Color" Normal="1, 1, 1, 1" Pressed="1, 1, 1, 0.5"/>
+        </c:ButtonStyle.BackgroundColor>
+        <c:ButtonStyle.Overlay>
+          <b:ImageViewStyle PositionUsesPivotPoint="true" ParentOrigin="Center" PivotPoint="Center" WidthResizePolicy="FillToParent" HeightResizePolicy="FillToParent">
+            <b:ImageViewStyle.BackgroundColor>
+              <b:Selector x:TypeArguments="n:Color" Normal="1, 1, 1, 1" Pressed="0, 0, 0, 0.1" Selected="1, 1, 1, 1"/>
+            </b:ImageViewStyle.BackgroundColor>
+          </b:ImageViewStyle>
+        </c:ButtonStyle.Overlay>
+        <c:ButtonStyle.Text>
+          <b:TextLabelStyle PositionUsesPivotPoint="true" ParentOrigin="Center" PivotPoint="Center" HorizontalAlignment="Center" VerticalAlignment="Center" TextColor="0.05, 0.63, 0.9, 1" />
+        </c:ButtonStyle.Text>
+      </c:ButtonStyle>
+    </c:PopupStyle.Buttons>
+  </c:PopupStyle>
+
+  <!--Progress-->
+  <c:ProgressStyle x:Key="Progress" Size="200, 5">
+    <c:ProgressStyle.Track>
+      <b:ImageViewStyle BackgroundColor="0, 0, 0, 0.1" />
+    </c:ProgressStyle.Track>
+    <c:ProgressStyle.Buffer>
+      <b:ImageViewStyle BackgroundColor="0.05, 0.63, 0.9, 0.3" />
+    </c:ProgressStyle.Buffer>
+    <c:ProgressStyle.Progress>
+      <b:ImageViewStyle BackgroundColor="0.05, 0.63, 0.9, 1" />
+    </c:ProgressStyle.Progress>
+  </c:ProgressStyle>
+
+  <!--RadioButton-->
+  <cx:LottieButtonStyle x:Key="RadioButton" LottieUrl="nx:NUIResourcePath nui_wearable_radiobutton_icon.json">
+    <cx:LottieButtonStyle.PlayRange>
+      <b:Selector x:TypeArguments="b:LottieFrameInfo" Selected="0, 12" Normal="13, 25"/>
+    </cx:LottieButtonStyle.PlayRange>
+    <cx:LottieButtonStyle.Opacity>
+      <b:Selector x:TypeArguments="x:Single?" Other="1" Pressed="0.6" Disabled="0.3"/>
+    </cx:LottieButtonStyle.Opacity>
+  </cx:LottieButtonStyle>
+
+  <!--Slider-->
+  <c:SliderStyle x:Key="Slider" Size="200, 50" TrackThickness="5">
+    <c:SliderStyle.Track>
+      <b:ImageViewStyle BackgroundColor="0, 0, 0, 0.1" />
+    </c:SliderStyle.Track>
+    <c:SliderStyle.Progress>
+      <b:ImageViewStyle BackgroundColor="0.5, 0.63, 0.9, 1" />
+    </c:SliderStyle.Progress>
+    <c:SliderStyle.Thumb>
+      <b:ImageViewStyle Size="50, 50" ResourceUrl="{nx:NUIResourcePath nui_component_default_slider_thumb_n.png}">
+        <b:ImageViewStyle.BackgroundImage>
+          <b:Selector x:TypeArguments="x:String" Normal="" Pressed="{nx:NUIResourcePath nui_component_default_slider_thumb_bg_p.png}" />
+        </b:ImageViewStyle.BackgroundImage>
+      </b:ImageViewStyle>
+    </c:SliderStyle.Thumb>
+  </c:SliderStyle>
+
+  <!--Switch-->
+  <cx:LottieButtonStyle x:Key="Switch" LottieUrl="nx:NUIResourcePath nui_wearable_switch_icon.json">
+    <cx:LottieButtonStyle.PlayRange>
+      <b:Selector x:TypeArguments="b:LottieFrameInfo" Selected="0, 18" Normal="19, 36"/>
+    </cx:LottieButtonStyle.PlayRange>
+    <cx:LottieButtonStyle.Opacity>
+      <b:Selector x:TypeArguments="x:Single?" Other="1" Pressed="0.6" Disabled="0.3"/>
+    </cx:LottieButtonStyle.Opacity>
+  </cx:LottieButtonStyle>
+
+  <!--Tab-->
+  <c:TabStyle x:Key="Tab" Size="480, 80" BackgroundColor="Yellow">
+    <c:TabStyle.UnderLine>
+      <b:ViewStyle Size="0, 6" PositionUsesPivotPoint="true" ParentOrigin="BottomLeft" PivotPoint="BottomLeft" BackgroundColor="0.05, 0.63, 0.9, 1.0" />
+    </c:TabStyle.UnderLine>
+    <c:TabStyle.Text>
+      <b:TextLabelStyle PointSize="16">
+        <b:TextLabelStyle.TextColor>
+          <b:Selector x:TypeArguments="n:Color" Normal="Black" Selected="0.05, 0.63, 0.9, 1" />
+        </b:TextLabelStyle.TextColor>
+      </b:TextLabelStyle>
+    </c:TabStyle.Text>
+  </c:TabStyle>
+
+  <!--Toast-->
+  <c:ToastStyle x:Key="Toast" WidthResizePolicy="FitToChildren" HeightResizePolicy="FitToChildren" BackgroundColor="0, 0, 0, 0.8">
+    <c:ToastStyle.Text>
+      <b:TextLabelStyle PositionUsesPivotPoint="true" ParentOrigin="Center" PivotPoint="Center" WidthResizePolicy="UseNaturalSize" HeightResizePolicy="UseNaturalSize" HorizontalAlignment="Center" VerticalAlignment="Center" TextColor="White" Padding="12, 12, 8, 8" />
+    </c:ToastStyle.Text>
+  </c:ToastStyle>
+
+  <!--Loading-->
+  <c:LoadingStyle x:Key="Loading" LoadingSize="360, 360" />
+  
+  <!--Pagination-->
+  <c:PaginationStyle x:Key="Pagination">
+    <c:PaginationStyle.IndicatorImageUrl>
+      <b:Selector x:TypeArguments="x:String" Normal="{nx:NUIResourcePath nui_component_default_pagination_normal_dot.png}" Selected="{nx:NUIResourcePath nui_component_default_pagination_focus_dot.png}" />
+    </c:PaginationStyle.IndicatorImageUrl>
+  </c:PaginationStyle>
+
+  <!--Scrollbar-->
+  <c:ScrollbarStyle x:Key="Scrollbar" TrackThickness="6" ThumbThickness="6" TrackColor="1, 1, 1, 0.15" ThumbColor="0.6, 0.6, 0.6, 1.0" TrackPadding="4" />
+
+</n:Theme>
\ No newline at end of file
index 02efe79..c3ddd62 100755 (executable)
   </ItemGroup>
 
   <ItemGroup>
-    <None Update="res\*.json">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </None>
-    <None Update="res\*.png">
+    <None Update="res\**">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </None>
   </ItemGroup>
diff --git a/src/Tizen.NUI.Wearable/res/Theme/Tizen.NUI.Wearable_Tizen.NUI.Theme.Common.xaml b/src/Tizen.NUI.Wearable/res/Theme/Tizen.NUI.Wearable_Tizen.NUI.Theme.Common.xaml
new file mode 100644 (file)
index 0000000..0d2618b
--- /dev/null
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<n:Theme
+  xmlns:n="clr-namespace:Tizen.NUI;assembly=Tizen.NUI"
+  xmlns:b="clr-namespace:Tizen.NUI.BaseComponents;assembly=Tizen.NUI"
+  xmlns:c="clr-namespace:Tizen.NUI.Components;assembly=Tizen.NUI.Components"
+  xmlns:nx="clr-namespace:Tizen.NUI.Xaml;assembly=Tizen.NUI"
+  xmlns:w="clr-namespace:Tizen.NUI.Wearable;assembly=Tizen.NUI.Wearable"
+  xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+  Id="Tizen.NUI.Theme.Common" >
+    
+    <!--CircularPagination-->
+    <w:CircularPaginationStyle x:Key="CircularPagination" IndicatorSize="10, 10">
+      <w:CircularPaginationStyle.IndicatorImageURL>
+        <b:Selector x:TypeArguments="x:String" Normal="{nx:NUIResourcePath nui_component_default_pagination_normal_dot.png}" Selected="{nx:NUIResourcePath nui_component_default_pagination_focus_dot.png}" />
+      </w:CircularPaginationStyle.IndicatorImageURL>
+      <w:CircularPaginationStyle.CenterIndicatorImageURL>
+        <b:Selector x:TypeArguments="x:String" Normal="{nx:NUIResourcePath nui_wearable_circular_pagination_center_normal_dot.png}" Selected="{nx:NUIResourcePath nui_wearable_circular_pagination_center_focus_dot.png}" />
+      </w:CircularPaginationStyle.CenterIndicatorImageURL>
+    </w:CircularPaginationStyle>
+
+    <!--CircularProgress-->
+    <w:CircularProgressStyle x:Key="CircularProgress" Thickness="6" MaxValue="100" MinValue="0" CurrentValue="0" TrackColor="0, 0.16, 0.3, 1" ProgressColor="0, 0.55, 1, 1" />
+
+    <!--CircularScrollbar-->
+    <w:CircularScrollbarStyle x:Key="CircularScrollbar" Thickness="10" TrackSweepAngle="60" TrackColor="1, 1, 1, 0.15" ThumbColor="0.6, 0.6, 0.6, 1" />
+
+    <!--CircularSlider-->
+    <w:CircularSliderStyle x:Key="CircularSlider" Thickness="6" MaxValue="100" MinValue="0" CurrentValue="0" TrackColor="0, 0.16, 0.3, 1" ProgressColor="0, 0.55, 1, 1" ThumbSize="19, 19" ThumbColor="0, 0.55, 1, 1"/>
+
+</n:Theme>
\ No newline at end of file
diff --git a/src/Tizen.NUI.Wearable/res/Theme/Tizen.NUI.Wearable_Tizen.NUI.Theme.Wearable.xaml b/src/Tizen.NUI.Wearable/res/Theme/Tizen.NUI.Wearable_Tizen.NUI.Theme.Wearable.xaml
new file mode 100644 (file)
index 0000000..14788c3
--- /dev/null
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<n:Theme
+  xmlns:n="clr-namespace:Tizen.NUI;assembly=Tizen.NUI"
+  xmlns:b="clr-namespace:Tizen.NUI.BaseComponents;assembly=Tizen.NUI"
+  xmlns:c="clr-namespace:Tizen.NUI.Components;assembly=Tizen.NUI.Components"
+  xmlns:nx="clr-namespace:Tizen.NUI.Xaml;assembly=Tizen.NUI"
+  xmlns:w="clr-namespace:Tizen.NUI.Wearable;assembly=Tizen.NUI.Wearable"
+  xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
+  Id="Tizen.NUI.Theme.Wearable" >
+    
+    <!--CircularPagination-->
+    <w:CircularPaginationStyle x:Key="CircularPagination" IndicatorSize="10, 10">
+      <w:CircularPaginationStyle.IndicatorImageURL>
+        <b:Selector x:TypeArguments="x:String" Normal="{nx:NUIResourcePath nui_component_default_pagination_normal_dot.png}" Selected="{nx:NUIResourcePath nui_component_default_pagination_focus_dot.png}" />
+      </w:CircularPaginationStyle.IndicatorImageURL>
+      <w:CircularPaginationStyle.CenterIndicatorImageURL>
+        <b:Selector x:TypeArguments="x:String" Normal="{nx:NUIResourcePath nui_wearable_circular_pagination_center_normal_dot.png}" Selected="{nx:NUIResourcePath nui_wearable_circular_pagination_center_focus_dot.png}" />
+      </w:CircularPaginationStyle.CenterIndicatorImageURL>
+    </w:CircularPaginationStyle>
+
+    <!--CircularProgress-->
+    <w:CircularProgressStyle x:Key="CircularProgress" Thickness="6" MaxValue="100" MinValue="0" CurrentValue="0" TrackColor="0, 0.16, 0.3, 1" ProgressColor="0, 0.55, 1, 1" />
+
+    <!--CircularScrollbar-->
+    <w:CircularScrollbarStyle x:Key="CircularScrollbar" Thickness="10" TrackSweepAngle="60" TrackColor="1, 1, 1, 0.15" ThumbColor="0.6, 0.6, 0.6, 1" />
+
+    <!--CircularSlider-->
+    <w:CircularSliderStyle x:Key="CircularSlider" Thickness="6" MaxValue="100" MinValue="0" CurrentValue="0" TrackColor="0, 0.16, 0.3, 1" ProgressColor="0, 0.55, 1, 1" ThumbSize="19, 19" ThumbColor="0, 0.55, 1, 1"/>
+
+</n:Theme>
\ No newline at end of file
index 8402209..61873ae 100755 (executable)
@@ -166,7 +166,7 @@ namespace Tizen.NUI.Wearable
         /// User can set its size.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        public CircularProgress() : base(new CircularProgressStyle())
+        public CircularProgress() : base()
         {
             Initialize();
         }
index abb046f..c565e6c 100644 (file)
@@ -107,7 +107,7 @@ namespace Tizen.NUI.Wearable
         /// <summary>
         /// Create an empty CircularScrollbar.
         /// </summary>
-        public CircularScrollbar() : base(new CircularScrollbarStyle())
+        public CircularScrollbar() : base()
         {
         }
 
@@ -119,7 +119,7 @@ namespace Tizen.NUI.Wearable
         /// <param name="currentPosition">The current position of the viewport in scrollable content area. This is the viewport's top position if the scroller is vertical, otherwise, left.</param>
         /// <param name="isHorizontal">Whether the direction of scrolling is horizontal or not. It is vertical by default.</param>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        public CircularScrollbar(float contentLength, float viewportLength, float currentPosition, bool isHorizontal = false) : base(new CircularScrollbarStyle())
+        public CircularScrollbar(float contentLength, float viewportLength, float currentPosition, bool isHorizontal = false) : base(ThemeManager.GetStyle(typeof(CircularScrollbar)))
         {
             Initialize(contentLength, viewportLength, currentPosition, isHorizontal);
         }
@@ -381,6 +381,17 @@ namespace Tizen.NUI.Wearable
 
         /// <inheritdoc/>
         [EditorBrowsable(EditorBrowsableState.Never)]
+        public override void ApplyStyle(ViewStyle viewStyle)
+        {
+            if (viewStyle == null) return;
+            if (viewStyle.WidthResizePolicy == null) viewStyle.WidthResizePolicy = ResizePolicyType.FillToParent;
+            if (viewStyle.HeightResizePolicy == null) viewStyle.HeightResizePolicy = ResizePolicyType.FillToParent;
+
+            base.ApplyStyle(viewStyle);
+        }
+
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
         protected override ViewStyle CreateViewStyle()
         {
             return new CircularScrollbarStyle();
index 792ff52..5a1c7f1 100755 (executable)
@@ -218,7 +218,7 @@ namespace Tizen.NUI.Wearable
         /// The constructor of CircularSlider.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        public CircularSlider() : base(new CircularSliderStyle())
+        public CircularSlider() : base()
         {
             Initialize();
         }
index 48ee21c..6038bc2 100755 (executable)
@@ -38,7 +38,7 @@ namespace Tizen.NUI.Wearable
         /// Constructor
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        public Popup() : base()
+        public Popup() : base(ThemeManager.GetStyle("WearablePopup") as ControlStyle)
         {
             initialize();
         }
@@ -437,7 +437,7 @@ namespace Tizen.NUI.Wearable
 
         private void initialize()
         {
-            popupStyle = Style as PopupStyle;
+            popupStyle = ViewStyle as PopupStyle;
             if (popupStyle == null)
             {
                 throw new Exception("Popup style is null.");
index 5528c92..7a3d8a5 100755 (executable)
@@ -29,6 +29,43 @@ namespace Tizen.NUI.Wearable
     [EditorBrowsable(EditorBrowsableState.Never)]
     public class CircularPaginationStyle : ControlStyle
     {
+        /// <summary>The IndicatorSize bindable property.</summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static readonly BindableProperty IndicatorSizeProperty = BindableProperty.Create(nameof(IndicatorSize), typeof(Size), typeof(CircularPaginationStyle), null, propertyChanged: (bindable, oldValue, newValue) =>
+        {
+            ((CircularPaginationStyle)bindable).indicatorSize = newValue == null ? null : new Size((Size)newValue);
+        },
+        defaultValueCreator: (bindable) =>
+        {
+            return ((CircularPaginationStyle)bindable).indicatorSize;
+        });
+
+        /// <summary>The IndicatorImageUrlSelector bindable property.</summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static readonly BindableProperty IndicatorImageUrlSelectorProperty = BindableProperty.Create("IndicatorImageUrlSelector", typeof(Selector<string>), typeof(CircularPaginationStyle), null, propertyChanged: (bindable, oldValue, newValue) =>
+        {
+            ((CircularPaginationStyle)bindable).indicatorImageUrl = ((Selector<string>)newValue)?.Clone();
+        },
+        defaultValueCreator: (bindable) =>
+        {
+            return ((CircularPaginationStyle)bindable).indicatorImageUrl;
+        });
+
+        /// <summary>The CenterIndicatorImageUrlSelector bindable property.</summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static readonly BindableProperty CenterIndicatorImageUrlSelectorProperty = BindableProperty.Create("CenterIndicatorImageUrlSelector", typeof(Selector<string>), typeof(CircularPaginationStyle), null, propertyChanged: (bindable, oldValue, newValue) =>
+        {
+            ((CircularPaginationStyle)bindable).centerIndicatorImageUrl = ((Selector<string>)newValue)?.Clone();
+        },
+        defaultValueCreator: (bindable) =>
+        {
+            return ((CircularPaginationStyle)bindable).centerIndicatorImageUrl;
+        });
+
+        private Size indicatorSize;
+        private Selector<string> indicatorImageUrl;
+        private Selector<string> centerIndicatorImageUrl;
+
         static CircularPaginationStyle() { }
 
         /// <summary>
@@ -50,9 +87,6 @@ namespace Tizen.NUI.Wearable
         [EditorBrowsable(EditorBrowsableState.Never)]
         public CircularPaginationStyle(CircularPaginationStyle style) : base(style)
         {
-            if (null == style) return;
-
-            this.CopyFrom(style);
         }
 
         /// <summary>
@@ -61,7 +95,11 @@ namespace Tizen.NUI.Wearable
         /// <since_tizen> 8 </since_tizen>
         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
         [EditorBrowsable(EditorBrowsableState.Never)]
-        public Size IndicatorSize { get; set; }
+        public Size IndicatorSize
+        {
+            get => (Size)GetValue(IndicatorSizeProperty);
+            set => SetValue(IndicatorSizeProperty, value);
+        }
 
         /// <summary>
         /// Gets or sets the resource of indicator.
@@ -69,7 +107,11 @@ namespace Tizen.NUI.Wearable
         /// <since_tizen> 8 </since_tizen>
         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
         [EditorBrowsable(EditorBrowsableState.Never)]
-        public Selector<string> IndicatorImageURL { get; set; } = new Selector<string>();
+        public Selector<string> IndicatorImageURL
+        {
+            get => (Selector<string>)GetValue(IndicatorImageUrlSelectorProperty);
+            set => SetValue(IndicatorImageUrlSelectorProperty, value);
+        }
 
         /// <summary>
         /// Gets or sets the resource of the center indicator.
@@ -77,34 +119,10 @@ namespace Tizen.NUI.Wearable
         /// <since_tizen> 8 </since_tizen>
         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
         [EditorBrowsable(EditorBrowsableState.Never)]
-        public Selector<string> CenterIndicatorImageURL { get; set; } = new Selector<string>();
-
-        /// <summary>
-        /// Retrieves a copy of CircularPaginationStyle.
-        /// </summary>
-        /// <since_tizen> 8 </since_tizen>
-        /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
-        [EditorBrowsable(EditorBrowsableState.Never)]
-        public override void CopyFrom(BindableObject bindableObject)
+        public Selector<string> CenterIndicatorImageURL
         {
-            base.CopyFrom(bindableObject);
-
-            CircularPaginationStyle circularPaginationStyle = bindableObject as CircularPaginationStyle;
-            if (null != circularPaginationStyle)
-            {
-                if (null != circularPaginationStyle.IndicatorSize)
-                {
-                    IndicatorSize = new Size(circularPaginationStyle.IndicatorSize.Width, circularPaginationStyle.IndicatorSize.Height);
-                }
-                if (null != circularPaginationStyle.IndicatorImageURL)
-                {
-                    IndicatorImageURL?.Clone(circularPaginationStyle.IndicatorImageURL);
-                }
-                if (null != circularPaginationStyle.CenterIndicatorImageURL)
-                {
-                    CenterIndicatorImageURL?.Clone(circularPaginationStyle.CenterIndicatorImageURL);
-                }
-            }
+            get => (Selector<string>)GetValue(CenterIndicatorImageUrlSelectorProperty);
+            set => SetValue(CenterIndicatorImageUrlSelectorProperty, value);
         }
 
         private void Initialize()
@@ -112,13 +130,13 @@ namespace Tizen.NUI.Wearable
             IndicatorSize = new Size(10, 10);
             IndicatorImageURL = new Selector<string>()
             {
-                Normal = "/usr/share/dotnet.tizen/framework/res/" + "nui_component_default_pagination_normal_dot.png",
-                Selected = "/usr/share/dotnet.tizen/framework/res/" + "nui_component_default_pagination_focus_dot.png",
+                Normal = Tizen.NUI.StyleManager.FrameworkResourcePath + "nui_component_default_pagination_normal_dot.png",
+                Selected = Tizen.NUI.StyleManager.FrameworkResourcePath + "nui_component_default_pagination_focus_dot.png",
             };
             CenterIndicatorImageURL = new Selector<string>()
             {
-                Normal = "/usr/share/dotnet.tizen/framework/res/" + "nui_wearable_circular_pagination_center_normal_dot.png",
-                Selected = "/usr/share/dotnet.tizen/framework/res/" + "nui_wearable_circular_pagination_center_focus_dot.png",
+                Normal = Tizen.NUI.StyleManager.FrameworkResourcePath + "nui_wearable_circular_pagination_center_normal_dot.png",
+                Selected = Tizen.NUI.StyleManager.FrameworkResourcePath + "nui_wearable_circular_pagination_center_focus_dot.png",
             };
         }
     }
index d89c1d0..05aef8e 100755 (executable)
@@ -75,7 +75,7 @@ namespace Tizen.NUI.Wearable
         [EditorBrowsable(EditorBrowsableState.Never)]
         public static readonly BindableProperty TrackColorProperty = BindableProperty.Create(nameof(TrackColor), typeof(Color), typeof(CircularProgressStyle), null, propertyChanged: (bindable, oldValue, newValue) =>
         {
-            ((CircularProgressStyle)bindable).trackColor = (Color)newValue;
+            ((CircularProgressStyle)bindable).trackColor = newValue == null ? null : new Color((Color)newValue);
         },
         defaultValueCreator: (bindable) =>
         {
@@ -86,7 +86,7 @@ namespace Tizen.NUI.Wearable
         [EditorBrowsable(EditorBrowsableState.Never)]
         public static readonly BindableProperty ProgressColorProperty = BindableProperty.Create(nameof(ProgressColor), typeof(Color), typeof(CircularProgressStyle), null, propertyChanged: (bindable, oldValue, newValue) =>
         {
-            ((CircularProgressStyle)bindable).progressColor = (Color)newValue;
+            ((CircularProgressStyle)bindable).progressColor = newValue == null ? null : new Color((Color)newValue);
         },
         defaultValueCreator: (bindable) =>
         {
@@ -130,8 +130,6 @@ namespace Tizen.NUI.Wearable
         [EditorBrowsable(EditorBrowsableState.Never)]
         public CircularProgressStyle(CircularProgressStyle style) : base(style)
         {
-            if (null == style) return;
-            this.CopyFrom(style);
         }
 
         /// <summary>
@@ -247,29 +245,6 @@ namespace Tizen.NUI.Wearable
         }
 
         /// <summary>
-        /// Style's clone function.
-        /// </summary>
-        /// <param name="bindableObject">The style that need to copy.</param>
-        [EditorBrowsable(EditorBrowsableState.Never)]
-        public override void CopyFrom(BindableObject bindableObject)
-        {
-            base.CopyFrom(bindableObject);
-
-            CircularProgressStyle progressStyle = bindableObject as CircularProgressStyle;
-
-            if (null != progressStyle)
-            {
-                isEnabled = progressStyle.isEnabled;
-                thickness = progressStyle.Thickness;
-                maxValue = progressStyle.maxValue;
-                minValue = progressStyle.minValue;
-                currentValue = progressStyle.currentValue;
-                trackColor = progressStyle.trackColor;
-                progressColor = progressStyle.progressColor;
-            }
-        }
-
-        /// <summary>
         /// Dispose CircularProgressStyle and all children on it.
         /// </summary>
         /// <param name="type">Dispose type.</param>
index 218ff48..6c63231 100644 (file)
@@ -54,7 +54,7 @@ namespace Tizen.NUI.Wearable
         [EditorBrowsable(EditorBrowsableState.Never)]
         public static readonly BindableProperty TrackColorProperty = BindableProperty.Create(nameof(TrackColor), typeof(Color), typeof(CircularScrollbarStyle), null, propertyChanged: (bindable, oldValue, newValue) =>
         {
-            ((CircularScrollbarStyle)bindable).trackColor = (Color)newValue;
+            ((CircularScrollbarStyle)bindable).trackColor = newValue == null ? null : new Color((Color)newValue);
         },
         defaultValueCreator: (bindable) =>
         {
@@ -65,7 +65,7 @@ namespace Tizen.NUI.Wearable
         [EditorBrowsable(EditorBrowsableState.Never)]
         public static readonly BindableProperty ThumbColorProperty = BindableProperty.Create(nameof(ThumbColor), typeof(Color), typeof(CircularScrollbarStyle), null, propertyChanged: (bindable, oldValue, newValue) =>
         {
-            ((CircularScrollbarStyle)bindable).thumbColor = (Color)newValue;
+            ((CircularScrollbarStyle)bindable).thumbColor = newValue == null ? null : new Color((Color)newValue);
         },
         defaultValueCreator: (bindable) =>
         {
@@ -88,7 +88,6 @@ namespace Tizen.NUI.Wearable
         [EditorBrowsable(EditorBrowsableState.Never)]
         public CircularScrollbarStyle() : base()
         {
-            Initialize();
         }
 
         /// <summary>
@@ -98,7 +97,6 @@ namespace Tizen.NUI.Wearable
         [EditorBrowsable(EditorBrowsableState.Never)]
         public CircularScrollbarStyle(CircularScrollbarStyle style) : base(style)
         {
-            this.CopyFrom(style);
         }
 
         /// <summary>
@@ -158,37 +156,5 @@ namespace Tizen.NUI.Wearable
         }
 
         #endregion Properties
-
-
-        #region Methods
-
-        /// <inheritdoc/>
-        [EditorBrowsable(EditorBrowsableState.Never)]
-        public override void CopyFrom(BindableObject bindableObject)
-        {
-            base.CopyFrom(bindableObject);
-
-            var style = bindableObject as CircularScrollbarStyle;
-
-            if (null != style)
-            {
-                Thickness = style.Thickness;
-                TrackSweepAngle = style.TrackSweepAngle;
-                TrackColor = style.TrackColor;
-                ThumbColor = style.ThumbColor;
-            }
-        }
-
-        private void Initialize()
-        {
-            Thickness = 10.0f;
-            TrackSweepAngle = 60.0f;
-            TrackColor = new Color(1.0f, 1.0f, 1.0f, 0.15f);
-            ThumbColor = new Color(0.6f, 0.6f, 0.6f, 1.0f);
-            WidthResizePolicy = ResizePolicyType.FillToParent;
-            HeightResizePolicy = ResizePolicyType.FillToParent;
-        }
-
-        #endregion Methods
     }
 }
index cecf80b..eae2cc6 100755 (executable)
@@ -75,7 +75,7 @@ namespace Tizen.NUI.Wearable
         [EditorBrowsable(EditorBrowsableState.Never)]
         public static readonly BindableProperty TrackColorProperty = BindableProperty.Create(nameof(TrackColor), typeof(Color), typeof(CircularSliderStyle), null, propertyChanged: (bindable, oldValue, newValue) =>
         {
-            ((CircularSliderStyle)bindable).trackColor = (Color)newValue;
+            ((CircularSliderStyle)bindable).trackColor = newValue == null ? null : new Color((Color)newValue);
         },
         defaultValueCreator: (bindable) =>
         {
@@ -86,7 +86,7 @@ namespace Tizen.NUI.Wearable
         [EditorBrowsable(EditorBrowsableState.Never)]
         public static readonly BindableProperty ProgressColorProperty = BindableProperty.Create(nameof(ProgressColor), typeof(Color), typeof(CircularSliderStyle), null, propertyChanged: (bindable, oldValue, newValue) =>
         {
-            ((CircularSliderStyle)bindable).progressColor = (Color)newValue;
+            ((CircularSliderStyle)bindable).progressColor = newValue == null ? null : new Color((Color)newValue);
         },
         defaultValueCreator: (bindable) =>
         {
@@ -108,7 +108,7 @@ namespace Tizen.NUI.Wearable
         [EditorBrowsable(EditorBrowsableState.Never)]
         public static readonly BindableProperty ThumbColorProperty = BindableProperty.Create(nameof(ThumbColor), typeof(Color), typeof(CircularSliderStyle), null, propertyChanged: (bindable, oldValue, newValue) =>
         {
-            ((CircularSliderStyle)bindable).thumbColor = (Color)newValue;
+            ((CircularSliderStyle)bindable).thumbColor = newValue == null ? null : new Color((Color)newValue);
         },
         defaultValueCreator: (bindable) =>
         {
@@ -154,8 +154,6 @@ namespace Tizen.NUI.Wearable
         [EditorBrowsable(EditorBrowsableState.Never)]
         public CircularSliderStyle(CircularSliderStyle style) : base(style)
         {
-            if (null == style) return;
-            this.CopyFrom(style);
         }
 
         /// <summary>
@@ -302,31 +300,6 @@ namespace Tizen.NUI.Wearable
             }
         }
 
-        /// <summary>
-        /// Style's clone function.
-        /// </summary>
-        /// <param name="bindableObject">The style that need to copy.</param>
-        [EditorBrowsable(EditorBrowsableState.Never)]
-        public override void CopyFrom(BindableObject bindableObject)
-        {
-            base.CopyFrom(bindableObject);
-
-            CircularSliderStyle progressStyle = bindableObject as CircularSliderStyle;
-
-            if (null != progressStyle)
-            {
-                isEnabled = progressStyle.isEnabled;
-                thickness = progressStyle.Thickness;
-                maxValue = progressStyle.maxValue;
-                minValue = progressStyle.minValue;
-                currentValue = progressStyle.currentValue;
-                trackColor = progressStyle.trackColor;
-                progressColor = progressStyle.progressColor;
-                thumbSize = progressStyle.thumbSize;
-                thumbColor = progressStyle.thumbColor;
-            }
-        }
-
         private void Initialize()
         {
             isEnabled = true;
index 8f909af..90efa80 100755 (executable)
@@ -15,7 +15,6 @@
  *
  */
 using System.ComponentModel;
-using Tizen.NUI.BaseComponents;
 using Tizen.NUI.Binding;
 using Tizen.NUI.Components;
 
@@ -27,6 +26,19 @@ namespace Tizen.NUI.Wearable
     [EditorBrowsable(EditorBrowsableState.Never)]
     public class PopupStyle : ControlStyle
     {
+        /// <summary>Bindable property of WrapContent</summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static readonly BindableProperty WrapContentProperty = BindableProperty.Create(nameof(WrapContent), typeof(bool?), typeof(PopupStyle), null, propertyChanged: (bindable, oldValue, newValue) =>
+        {
+            ((PopupStyle)bindable).wrapContent = (bool?)newValue;
+        },
+        defaultValueCreator: (bindable) =>
+        {
+            return ((PopupStyle)bindable).wrapContent;
+        });
+
+        private bool? wrapContent;
+
         static PopupStyle() { }
 
         /// <summary>
@@ -44,12 +56,6 @@ namespace Tizen.NUI.Wearable
         [EditorBrowsable(EditorBrowsableState.Never)]
         public PopupStyle(PopupStyle style) : base(style)
         {
-            if (null == style)
-            {
-                return;
-            }
-            initSubStyle();
-            CopyFrom(style);
         }
 
         /// <summary>
@@ -58,26 +64,8 @@ namespace Tizen.NUI.Wearable
         [EditorBrowsable(EditorBrowsableState.Never)]
         public bool? WrapContent
         {
-            get;
-            set;
-        }
-
-        /// <summary>
-        /// Retrieves a copy of PopupStyle.
-        /// </summary>
-        [EditorBrowsable(EditorBrowsableState.Never)]
-        public override void CopyFrom(BindableObject bindableObject)
-        {
-            base.CopyFrom(bindableObject);
-
-            PopupStyle popupStyle = bindableObject as PopupStyle;
-            if (null != popupStyle)
-            {
-                if (null != popupStyle.WrapContent)
-                {
-                    WrapContent = popupStyle.WrapContent;
-                }
-            }
+            get => (bool?)GetValue(WrapContentProperty);
+            set => SetValue(WrapContentProperty, value);            
         }
 
         private void initSubStyle()
index c64bd04..d917aa6 100644 (file)
     </ItemGroup>
   </Target>
 
+  <ItemGroup>
+    <None Update="res\**">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
+  </ItemGroup>
+
 </Project>
\ No newline at end of file
diff --git a/src/Tizen.NUI/res/Theme/Tizen.NUI_Tizen.NUI.Theme.Common.xaml b/src/Tizen.NUI/res/Theme/Tizen.NUI_Tizen.NUI.Theme.Common.xaml
new file mode 100644 (file)
index 0000000..7a494cf
--- /dev/null
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<n:Theme xmlns:n="clr-namespace:Tizen.NUI;assembly=Tizen.NUI" Id="Tizen.NUI.Theme.Common" >
+</n:Theme>
\ No newline at end of file
diff --git a/src/Tizen.NUI/res/Theme/Tizen.NUI_Tizen.NUI.Theme.Wearable.xaml b/src/Tizen.NUI/res/Theme/Tizen.NUI_Tizen.NUI.Theme.Wearable.xaml
new file mode 100644 (file)
index 0000000..07bee24
--- /dev/null
@@ -0,0 +1,3 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<n:Theme xmlns:n="clr-namespace:Tizen.NUI;assembly=Tizen.NUI" Id="Tizen.NUI.Theme.Wearable" >
+</n:Theme>
\ No newline at end of file
index 5b43fd2..0594cd1 100755 (executable)
@@ -120,6 +120,17 @@ namespace Tizen.NUI.Xaml
                 //ResourceDictionary
                 if (xpe == null && TryAddToResourceDictionary(source as ResourceDictionary, value, xKey, node, out xpe))
                     return;
+                
+                // Dictionary with string key
+                if (xpe == null && xKey != null)
+                {
+                    var indexer = GetIndexer(source, typeof(string), value.GetType());
+                    if (indexer != null)
+                    {
+                        indexer.SetValue(source, value, new[] { xKey });
+                        return;
+                    }
+                }
 
                 // Collection element, implicit content, or implicit collection element.
                 if (xpe == null && typeof(IEnumerable).IsAssignableFrom(Context.Types[parentElement]) && Context.Types[parentElement].GetRuntimeMethods().Any(mi => mi.Name == "Add" && mi.GetParameters().Length == 1)) {
@@ -145,7 +156,7 @@ namespace Tizen.NUI.Xaml
 
                     SetPropertyValue(source, name, value, Context.RootElement, node, Context, node);
                     return;
-                }
+                }                
                 
                 xpe = xpe ?? new XamlParseException($"Can not set the content of {((IElementNode)parentNode).XmlType.Name} as it doesn't have a ContentPropertyAttribute", node);
                 if (Context.ExceptionHandler != null)
@@ -745,5 +756,7 @@ namespace Tizen.NUI.Xaml
             SetPropertyValue(source, new XmlName("", runTimeName.Name), value, Context.RootElement, node, Context, node);
             return true;
         }
+
+        private PropertyInfo GetIndexer(object source, Type keyType, Type valueType) => source.GetType().GetProperties().FirstOrDefault(p => p.Name == "Item" && p.PropertyType.IsAssignableFrom(valueType) && p.GetIndexParameters().Length != 0 && p.GetIndexParameters()[0].ParameterType == keyType);
     }
 }
index 99056ad..a9aec66 100755 (executable)
@@ -131,6 +131,14 @@ namespace Tizen.NUI.Xaml
             using (var textReader = new StringReader(xaml))
             using (var reader = XmlReader.Create(textReader))
             {
+                Load(view, reader);
+            }
+        }
+
+        public static void Load(object view, XmlReader reader)
+        {
+            if (reader != null)
+            {
                 while (reader.Read())
                 {
                     //Skip until element
@@ -170,6 +178,16 @@ namespace Tizen.NUI.Xaml
             using (var textreader = new StringReader(xaml))
             using (var reader = XmlReader.Create(textreader))
             {
+                inflatedView = Create(reader, doNotThrow);
+            }
+            return inflatedView;
+        }
+
+        public static object Create(XmlReader reader, bool doNotThrow = false)
+        {
+            object inflatedView = null;
+            if (reader != null)
+            {
                 while (reader.Read())
                 {
                     //Skip until element
index 183d61e..cc64340 100755 (executable)
@@ -407,7 +407,12 @@ namespace Tizen.NUI.Xaml
             }
 
             if (type == null)
-                exception = new XamlParseException($"Type {elementName} not found in xmlns {namespaceURI}", xmlInfo);
+            {
+                var message = $"Type {elementName} not found in xmlns {namespaceURI}\n";
+                message += "\n  - Make sure the all used assemblies (e.g. Tizen.NUI.Components) are included in the application project.";
+                message += "\n  - Make sure the type and namespace are correct.\n";
+                exception = new XamlParseException($"message", xmlInfo);
+            }
 
             return type;
         }
index 48195e6..2c465ec 100755 (executable)
@@ -21,6 +21,10 @@ namespace Tizen.NUI.Binding
                                        ushort.Parse(parts[2].Trim(), CultureInfo.InvariantCulture), 
                                        ushort.Parse(parts[3].Trim(), CultureInfo.InvariantCulture));
                 }
+                else if (parts.Length == 1)
+                {
+                    return new Extents(ushort.Parse(parts[0].Trim(), CultureInfo.InvariantCulture));
+                }
             }
 
             throw new InvalidOperationException($"Cannot convert \"{value}\" into {typeof(Extents)}");
index a4049b6..a024ccd 100644 (file)
@@ -164,7 +164,7 @@ namespace Tizen.NUI.BaseComponents
             var imageView = (ImageView)bindable;
             if(newValue != null)
             {
-                imageView._border = (Rectangle)newValue;
+                imageView._border = new Rectangle((Rectangle)newValue);
                 imageView.UpdateImage(NpatchImageVisualProperty.Border, new PropertyValue(imageView._border));
             }
         },
@@ -348,6 +348,8 @@ namespace Tizen.NUI.BaseComponents
 
         internal ImageView(global::System.IntPtr cPtr, bool cMemoryOwn, bool shown = true) : base(Interop.ImageView.ImageView_SWIGUpcast(cPtr), cMemoryOwn)
         {
+            ApplyStyle(ThemeManager.GetStyle(nameof(ImageView)));
+
             if (!shown)
             {
                 SetVisible(false);
index 7e9ebb3..82aabb3 100755 (executable)
@@ -835,7 +835,7 @@ namespace Tizen.NUI.BaseComponents
     /// A class containing frame informations for a LottieAnimationView.
     /// </summary>
     [EditorBrowsable(EditorBrowsableState.Never)]
-    public class LottieFrameInfo
+    public class LottieFrameInfo : ICloneable
     {
         /// <summary>
         /// Creates a new instance with a playing range.
@@ -874,6 +874,31 @@ namespace Tizen.NUI.BaseComponents
         }
 
         /// <summary>
+        /// Create a new instance from string.
+        /// Possible input : "0, 10", "10"
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static implicit operator LottieFrameInfo(string pair)
+        {
+            if (pair == null)
+            {
+                return null;
+            }
+
+            string[] parts = pair.Split(',');
+            if (parts.Length == 1)
+            {
+                return new LottieFrameInfo(Int32.Parse(parts[0].Trim()));
+            }
+            else if (parts.Length == 2)
+            {
+                return new LottieFrameInfo(Int32.Parse(parts[0].Trim()), Int32.Parse(parts[1].Trim()));
+            }
+
+            throw new InvalidCastException($"Can not convert string {pair} to LottieFrameInfo");
+        }
+
+        /// <summary>
         /// The start frame of the lottie animation.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
@@ -940,6 +965,10 @@ namespace Tizen.NUI.BaseComponents
             }
         }
 
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public object Clone() => new LottieFrameInfo(StartFrame, EndFrame);
+
         private bool BeReadyToShow(LottieAnimationView lottieView)
         {
             // Validate input lottieView
index d3f24ef..43c7d1e 100755 (executable)
@@ -126,7 +126,7 @@ namespace Tizen.NUI.BaseComponents
         /// Create an empty instance.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        public ImageViewStyle()
+        public ImageViewStyle() : base()
         {
         }
 
index ebf5b1f..2147223 100755 (executable)
@@ -24,13 +24,13 @@ namespace Tizen.NUI.BaseComponents
     /// <summary>
     /// Selector class, which is related by Control State, it is base class for other Selector.
     /// </summary>
+    /// <typeparam name="T">The property type of the selector. if it's reference type, it should be of type <see cref="ICloneable"/> that implement deep copy in <see cref="ICloneable.Clone"/>.</typeparam>
     /// <since_tizen> 6 </since_tizen>
     /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
     [EditorBrowsable(EditorBrowsableState.Never)]
     public class Selector<T> : StateValueCollection<T>
     {
-        private readonly bool cloneable = typeof(T).IsAssignableFrom(typeof(ICloneable));
-
+        private readonly bool isCloneable = typeof(ICloneable).IsAssignableFrom(typeof(T));
         /// <since_tizen> 6 </since_tizen>
         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
         public static implicit operator Selector<T>(T value)
@@ -48,7 +48,7 @@ namespace Tizen.NUI.BaseComponents
         [EditorBrowsable(EditorBrowsableState.Never)]
         public Selector(T value) : this()
         {
-            All = cloneable ? (T)((ICloneable)value)?.Clone() : value;
+            All = isCloneable ? (T)((ICloneable)value)?.Clone() : value;
         }
 
         /// Copy constructor
@@ -58,7 +58,6 @@ namespace Tizen.NUI.BaseComponents
             Clone(value);
         }
 
-
         /// <summary>
         /// All State.
         /// </summary>
@@ -238,7 +237,7 @@ namespace Tizen.NUI.BaseComponents
 
         /// <summary>
         /// Clone itself.
-        /// If type T implements ICloneable, it calls Clone() method to clone values, otherwise use operator=.
+        /// If type T implements ISelectorItem, it calls Clone() method to clone values, otherwise use operator=.
         /// </summary>
         /// <since_tizen> 6 </since_tizen>
         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
@@ -258,7 +257,7 @@ namespace Tizen.NUI.BaseComponents
         {
             Clear();
 
-            if (cloneable)
+            if (isCloneable)
             {
                 All = (T)((ICloneable)other.All)?.Clone();
                 foreach (var item in other.StateValueList)
index ea27493..d969960 100755 (executable)
@@ -530,7 +530,7 @@ namespace Tizen.NUI.BaseComponents
         /// Create an empty instance.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        public TextFieldStyle()
+        public TextFieldStyle() : base()
         {
         }
 
index ef3d298..b2bd019 100755 (executable)
@@ -323,7 +323,7 @@ namespace Tizen.NUI.BaseComponents
         /// Create an empty instance.
         /// </summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        public TextLabelStyle()
+        public TextLabelStyle() : base()
         {
         }
 
index 19e3113..a1c3f6e 100755 (executable)
@@ -74,6 +74,7 @@ namespace Tizen.NUI.BaseComponents
         private Extents margin;
         private float? weight;
         private bool? enableControlState;
+        private bool? themeChangeSensitive;
 
         private Selector<ImageShadow> imageShadow;
         private Selector<Shadow> boxShadow;
@@ -94,10 +95,7 @@ namespace Tizen.NUI.BaseComponents
         [EditorBrowsable(EditorBrowsableState.Never)]
         public ViewStyle(ViewStyle viewAttributes)
         {
-            if (null != viewAttributes)
-            {
-                this.CopyFrom(viewAttributes);
-            }
+            CopyFrom(viewAttributes);
         }
 
         /// <summary>
@@ -689,6 +687,27 @@ namespace Tizen.NUI.BaseComponents
         }
 
         /// <summary>
+        /// The ThemeChangeSensitive value of the View.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public bool? ThemeChangeSensitive
+        {
+            get => (bool?)GetValue(ThemeChangeSensitiveProperty);
+            set => SetValue(ThemeChangeSensitiveProperty, value);
+        }
+
+
+        /// <summary>
+        /// Allow null properties when merging it into other Theme.
+        /// If the value is true, the null properties reset target properties of the other ViewStyle with same key when merge.
+        /// It is used in <seealso cref="Theme.Merge(string)"/>, <seealso cref="Theme.Merge(Theme)"/>.
+        /// It is also used in <seealso cref="Theme.GetStyle(string)"/> when the Theme has a parent and needs to merge.
+        /// Please note that it is false by default.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public bool SolidNull { get; set; } = false;
+
+        /// <summary>
         /// Set style's bindable properties from the view.
         /// </summary>
         /// <param name="view">The view that includes property data.</param>
@@ -713,12 +732,9 @@ namespace Tizen.NUI.BaseComponents
             }
         }
 
-        internal ViewStyle CreateInstance()
-        {
-            return (ViewStyle)Activator.CreateInstance(GetType());
-        }
-
-        internal ViewStyle Clone()
+        /// <summary>Create a cloned ViewStyle.</summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public ViewStyle Clone()
         {
             var cloned = CreateInstance();
             cloned.CopyFrom(this);
@@ -726,6 +742,20 @@ namespace Tizen.NUI.BaseComponents
             return cloned;
         }
 
+        /// <summary>Create a cloned ViewStyle.</summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public void Merge(ViewStyle other)
+        {
+            AllowNullCopy = other?.SolidNull ?? false;
+            CopyFrom(other);
+            AllowNullCopy = false;
+        }
+
+        internal ViewStyle CreateInstance()
+        {
+            return (ViewStyle)Activator.CreateInstance(GetType());
+        }
+
         private void OnPaddingChanged(ushort start, ushort end, ushort top, ushort bottom)
         {
             Padding = new Extents(start, end, top, bottom);
index 5146ba9..861577c 100755 (executable)
@@ -326,6 +326,7 @@ namespace Tizen.NUI.BaseComponents
             {
                 if (viewStyle.size == null)
                 {
+                    if ((float)newValue == 0) return;
                     viewStyle.size = new Size();
                 }
                 viewStyle.size.Width = (float)newValue;
@@ -344,6 +345,7 @@ namespace Tizen.NUI.BaseComponents
             {
                 if (viewStyle.size == null)
                 {
+                    if ((float)newValue == 0) return;
                     viewStyle.size = new Size();
                 }
                 viewStyle.size.Height = (float)newValue;
@@ -359,6 +361,10 @@ namespace Tizen.NUI.BaseComponents
         {
             var viewStyle = (ViewStyle)bindable;
             viewStyle.position = (Position)newValue;
+            if (viewStyle.position != null && viewStyle.position.X == 0 && viewStyle.position.Y == 0)
+            {
+                viewStyle.position = null;
+            }
         },
         defaultValueCreator: (bindable) =>
         {
@@ -374,6 +380,7 @@ namespace Tizen.NUI.BaseComponents
             {
                 if (viewStyle.position == null)
                 {
+                    if ((float)newValue == 0) return;
                     viewStyle.position = new Position();
                 }
                 viewStyle.position.X = (float)newValue;
@@ -392,6 +399,7 @@ namespace Tizen.NUI.BaseComponents
             {
                 if (viewStyle.position == null)
                 {
+                    if ((float)newValue == 0) return;
                     viewStyle.position = new Position();
                 }
                 viewStyle.position.Y = (float)newValue;
@@ -410,6 +418,7 @@ namespace Tizen.NUI.BaseComponents
             {
                 if (viewStyle.position == null)
                 {
+                    if ((float)newValue == 0) return;
                     viewStyle.position = new Position();
                 }
                 viewStyle.position.Z = (float)newValue;
@@ -437,6 +446,7 @@ namespace Tizen.NUI.BaseComponents
         {
             var viewStyle = (ViewStyle)bindable;
             viewStyle.scale = (Vector3)newValue;
+            if (viewStyle.scale != null && viewStyle.scale.X == 1.0f && viewStyle.scale.Y == 1.0f && viewStyle.scale.Z == 1.0f) return;
         },
         defaultValueCreator: (bindable) =>
         {
@@ -452,6 +462,7 @@ namespace Tizen.NUI.BaseComponents
             {
                 if (viewStyle.scale == null)
                 {
+                    if ((float)newValue == 1.0f) return;
                     viewStyle.scale = new Vector3();
                 }
                 viewStyle.scale.X = (float)newValue;
@@ -470,6 +481,7 @@ namespace Tizen.NUI.BaseComponents
             {
                 if (viewStyle.scale == null)
                 {
+                    if ((float)newValue == 1.0f) return;
                     viewStyle.scale = new Vector3();
                 }
                 viewStyle.scale.Y = (float)newValue;
@@ -488,6 +500,7 @@ namespace Tizen.NUI.BaseComponents
             {
                 if (viewStyle.scale == null)
                 {
+                    if ((float)newValue == 1.0f) return;
                     viewStyle.scale = new Vector3();
                 }
                 viewStyle.scale.Z = (float)newValue;
@@ -708,6 +721,10 @@ namespace Tizen.NUI.BaseComponents
         {
             var viewStyle = (ViewStyle)bindable;
             viewStyle.size = (Size)newValue;
+            if (viewStyle.size != null && viewStyle.size.Width == 0 && viewStyle.size.Height == 0)
+            {
+                viewStyle.size = null;
+            }
         },
         defaultValueCreator: (bindable) =>
         {
@@ -816,7 +833,11 @@ namespace Tizen.NUI.BaseComponents
             var viewStyle = (ViewStyle)bindable;
 
             viewStyle.imageShadow = ((Selector<ImageShadow>)newValue)?.Clone();
-            viewStyle.boxShadow = null;
+
+            if (viewStyle.imageShadow != null)
+            {
+                viewStyle.boxShadow = null;
+            }
         },
         defaultValueCreator: (bindable) =>
         {
@@ -831,7 +852,11 @@ namespace Tizen.NUI.BaseComponents
             var viewStyle = (ViewStyle)bindable;
 
             viewStyle.boxShadow = ((Selector<Shadow>)newValue)?.Clone();
-            viewStyle.imageShadow = null;
+
+            if (viewStyle.boxShadow != null)
+            {
+                viewStyle.imageShadow = null;
+            }
         },
         defaultValueCreator: (bindable) =>
         {
@@ -863,5 +888,18 @@ namespace Tizen.NUI.BaseComponents
         {
             return ((ViewStyle)bindable).enableControlState;
         });
+
+        /// <summary>
+        /// EnableControlState property
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static readonly BindableProperty ThemeChangeSensitiveProperty = BindableProperty.Create("ThemeChangeSensitive", typeof(bool?), typeof(ViewStyle), null, propertyChanged: (bindable, oldValue, newValue) =>
+        {
+            ((ViewStyle)bindable).themeChangeSensitive = (bool?)newValue;
+        },
+        defaultValueCreator: (bindable) =>
+        {
+            return ((ViewStyle)bindable).themeChangeSensitive;
+        });
     }
 }
index 2eb09c6..7668cac 100755 (executable)
@@ -84,6 +84,8 @@ namespace Tizen.NUI.BaseComponents
 
         internal TextField(global::System.IntPtr cPtr, bool cMemoryOwn, bool shown = true) : base(Interop.TextField.TextField_SWIGUpcast(cPtr), cMemoryOwn)
         {
+            ApplyStyle(ThemeManager.GetStyle(nameof(TextField)));
+
             if (!shown)
             {
                 SetVisible(false);
index 207b539..84f19b8 100755 (executable)
@@ -165,6 +165,8 @@ namespace Tizen.NUI.BaseComponents
 
         internal TextLabel(global::System.IntPtr cPtr, bool cMemoryOwn, bool shown = true) : base(Interop.TextLabel.TextLabel_SWIGUpcast(cPtr), cMemoryOwn)
         {
+            ApplyStyle(ThemeManager.GetStyle(nameof(TextLabel)));
+
             if (!shown)
             {
                 SetVisible(false);
index 3384635..432312c 100755 (executable)
@@ -61,6 +61,7 @@ namespace Tizen.NUI.BaseComponents
         private string[] transitionNames;
         private bool controlStatePropagation = false;
         private ViewStyle viewStyle;
+        private bool themeChangeSensitive = false;
 
         internal Size2D sizeSetExplicitly = new Size2D(); // Store size set by API, will be used in place of NaturalSize if not set.
         internal BackgroundExtraData backgroundExtraData;
@@ -93,9 +94,8 @@ namespace Tizen.NUI.BaseComponents
 
         /// This will be public opened in next release of tizen after ACR done. Before ACR, it is used as HiddenAPI (InhouseAPI).
         [EditorBrowsable(EditorBrowsableState.Never)]
-        public View(ViewStyle viewStyle) : this(Interop.View.View_New(), true)
+        public View(ViewStyle viewStyle) : this(Interop.View.View_New(), true, viewStyle)
         {
-            ApplyStyle((viewStyle == null) ? GetViewStyle() : viewStyle.Clone());
         }
 
         /// <summary>
@@ -123,7 +123,7 @@ namespace Tizen.NUI.BaseComponents
 
         internal View(global::System.IntPtr cPtr, bool cMemoryOwn, ViewStyle viewStyle, bool shown = true) : this(cPtr, cMemoryOwn, shown)
         {
-            ApplyStyle((viewStyle == null) ? GetViewStyle() : viewStyle.Clone());
+            ApplyStyle((viewStyle == null) ? GetViewStyle() : viewStyle?.Clone());
         }
 
         internal View(global::System.IntPtr cPtr, bool cMemoryOwn, bool shown = true) : base(Interop.View.View_SWIGUpcast(cPtr), cMemoryOwn)
@@ -2325,6 +2325,17 @@ namespace Tizen.NUI.BaseComponents
         }
 
         /// <summary>
+        /// If the value is true, the View will change its style as the theme changes.
+        /// It is false by default, unless it is Control instance created with specified style name.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public bool ThemeChangeSensitive
+        {
+            get => (bool)GetValue(ThemeChangeSensitiveProperty);
+            set => SetValue(ThemeChangeSensitiveProperty, value);
+        }
+
+        /// <summary>
         /// Get Style, it is abstract function and must be override.
         /// </summary>
         /// <since_tizen> 6 </since_tizen>
@@ -2354,6 +2365,19 @@ namespace Tizen.NUI.BaseComponents
         {
         }
 
+        /// <summary>
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        protected virtual void OnThemeChanged(object sender, ThemeChangedEventArgs e)
+        {
+            ViewStyle newStyle = ThemeManager.GetStyle(GetType());
+
+            if (newStyle != null && viewStyle?.GetType() == newStyle.GetType())
+            {
+                ApplyStyle(newStyle);
+            }
+        }
+
         /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
         [EditorBrowsable(EditorBrowsableState.Never)]
         public virtual void ApplyStyle(ViewStyle viewStyle)
index c1fda12..be4bec9 100755 (executable)
@@ -1600,6 +1600,29 @@ namespace Tizen.NUI.BaseComponents
             return ((View)bindable).enableControlState;
         });
 
+        /// <summary>
+        /// ThemeChangeSensitive property
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static readonly BindableProperty ThemeChangeSensitiveProperty = BindableProperty.Create(nameof(ThemeChangeSensitive), typeof(bool), typeof(View), false, propertyChanged: (bindable, oldValue, newValue) =>
+        {
+            var view = (View)bindable;
+            view.themeChangeSensitive = (bool)newValue;
+
+            if (view.themeChangeSensitive)
+            {
+                ThemeManager.ThemeChanged += view.OnThemeChanged;
+            }
+            else
+            {
+                ThemeManager.ThemeChanged -= view.OnThemeChanged;
+            }
+        },
+        defaultValueCreator: (bindable) =>
+        {
+            return ((View)bindable).themeChangeSensitive;
+        });
+
         #region Selectors
         internal static readonly BindableProperty BackgroundImageSelectorProperty = BindableProperty.Create("BackgroundImageSelector", typeof(Selector<string>), typeof(View), null, propertyChanged: (bindable, oldValue, newValue) =>
         {
index 73a469d..7a72cb6 100755 (executable)
@@ -1071,6 +1071,10 @@ namespace Tizen.NUI.BaseComponents
                 //Release your own managed resources here.
                 //You should release all of your own disposable objects here.
                 selectorData?.Reset(this);
+                if (themeChangeSensitive)
+                {
+                    ThemeManager.ThemeChanged -= OnThemeChanged;
+                }
             }
 
             //Release your own unmanaged resources here.
index eb8eb62..3778d54 100755 (executable)
@@ -26,7 +26,7 @@ namespace Tizen.NUI
     /// The Color class.
     /// </summary>
     [Tizen.NUI.Binding.TypeConverter(typeof(ColorTypeConverter))]
-    public class Color : Disposable
+    public class Color : Disposable, ICloneable
     {
         /// <summary>
         /// Gets the black colored Color class.
@@ -418,6 +418,10 @@ namespace Tizen.NUI
             return ret;
         }
 
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public object Clone() => new Color(this);
+
         internal static global::System.Runtime.InteropServices.HandleRef getCPtr(Color obj)
         {
             return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
index 9ee8fd6..2652b30 100755 (executable)
@@ -14,6 +14,7 @@
 * limitations under the License.
 *
 */
+using System;
 using System.ComponentModel;
 using Tizen.NUI.Binding;
 
@@ -24,7 +25,7 @@ namespace Tizen.NUI
     /// </summary>
     /// <since_tizen> 4 </since_tizen>
     [Binding.TypeConverter(typeof(ExtentsTypeConverter))]
-    public class Extents : Disposable
+    public class Extents : Disposable, ICloneable
     {
 
 
@@ -227,6 +228,10 @@ namespace Tizen.NUI
             return ret;
         }
 
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public object Clone() => new Extents(this);
+
         internal static global::System.Runtime.InteropServices.HandleRef getCPtr(Extents obj)
         {
             return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
index bf22633..f0060d6 100755 (executable)
@@ -27,7 +27,7 @@ namespace Tizen.NUI
     /// </summary>
     /// <since_tizen> 3 </since_tizen>
     [Tizen.NUI.Binding.TypeConverter(typeof(PositionTypeConverter))]
-    public class Position : Disposable
+    public class Position : Disposable, ICloneable
     {
 
         /// <summary>
@@ -826,6 +826,10 @@ namespace Tizen.NUI
             return ret;
         }
 
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public object Clone() => new Position(X, Y, Z);
+
         internal static global::System.Runtime.InteropServices.HandleRef getCPtr(Position obj)
         {
             return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
index 48f2595..11204a8 100755 (executable)
@@ -26,7 +26,7 @@ namespace Tizen.NUI
     /// </summary>
     /// <since_tizen> 3 </since_tizen>
     [Tizen.NUI.Binding.TypeConverter(typeof(Position2DTypeConverter))]
-    public class Position2D : Disposable
+    public class Position2D : Disposable, ICloneable
     {
         private Position2DChangedCallback callback = null;
 
@@ -338,6 +338,10 @@ namespace Tizen.NUI
             return new Position2D((int)position.X, (int)position.Y);
         }
 
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public object Clone() => new Position2D(this);
+
         internal static Position2D GetPosition2DFromPtr(global::System.IntPtr cPtr)
         {
             Position2D ret = new Position2D(cPtr, false);
index 372f623..63241af 100755 (executable)
@@ -14,6 +14,7 @@
  * limitations under the License.
  *
  */
+using System;
 using System.ComponentModel;
 using Tizen.NUI.Binding;
 
@@ -24,7 +25,7 @@ namespace Tizen.NUI
     /// </summary>
     /// <since_tizen> 3 </since_tizen>
     [Binding.TypeConverter(typeof(RectangleTypeConverter))]
-    public class Rectangle : Disposable
+    public class Rectangle : Disposable, ICloneable
     {
         /// <summary>
         /// The constructor.
@@ -457,6 +458,10 @@ namespace Tizen.NUI
             return ret;
         }
 
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public object Clone() => new Rectangle(this);
+
         internal static global::System.Runtime.InteropServices.HandleRef getCPtr(Rectangle obj)
         {
             return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
index 16694f7..72a1014 100755 (executable)
@@ -26,7 +26,7 @@ namespace Tizen.NUI
     /// </summary>
     /// <since_tizen> 5 </since_tizen>
     [Tizen.NUI.Binding.TypeConverter(typeof(SizeTypeConverter))]
-    public class Size : Disposable
+    public class Size : Disposable, ICloneable
     {
 
         /// <summary>
@@ -305,6 +305,10 @@ namespace Tizen.NUI
             return ret;
         }
 
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public object Clone() => new Size(Width, Height, Depth);
+
         /// <summary>
         /// The type cast operator, Size to Vector3.
         /// </summary>
index 2026762..4da1854 100755 (executable)
@@ -14,9 +14,9 @@
  * limitations under the License.
  *
  */
+using System;
 using System.ComponentModel;
 using Tizen.NUI.Binding;
-using System.ComponentModel;
 
 namespace Tizen.NUI
 {
@@ -25,7 +25,7 @@ namespace Tizen.NUI
     /// </summary>
     /// <since_tizen> 3 </since_tizen>
     [Tizen.NUI.Binding.TypeConverter(typeof(Size2DTypeConverter))]
-    public class Size2D : Disposable
+    public class Size2D : Disposable, ICloneable
     {
 
         private Size2DChangedCallback callback = null;
@@ -297,6 +297,10 @@ namespace Tizen.NUI
             return ret;
         }
 
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public object Clone() => new Size2D(Width, Height);
+
         internal static global::System.Runtime.InteropServices.HandleRef getCPtr(Size2D obj)
         {
             return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
index 2484c1f..c045b27 100755 (executable)
@@ -37,6 +37,13 @@ namespace Tizen.NUI
         private StyleChangedCallbackDelegate _styleManagerStyleChangedCallbackDelegate;
 
         /// <summary>
+        /// Internal use only. Do not open this API.
+        /// This is to get TizenFX resource path. It needs to be fixed to use application framework API in the future.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public readonly static string FrameworkResourcePath = "/usr/share/dotnet.tizen/framework/res/";
+
+        /// <summary>
         /// Creates a StyleManager handle.<br />
         /// This can be initialized with StyleManager::Get().<br />
         /// </summary>
diff --git a/src/Tizen.NUI/src/public/Theme/Theme.cs b/src/Tizen.NUI/src/public/Theme/Theme.cs
new file mode 100644 (file)
index 0000000..1c40441
--- /dev/null
@@ -0,0 +1,229 @@
+/*
+ * Copyright(c) 2020 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.ComponentModel;
+using System.Xml;
+using Tizen.NUI.BaseComponents;
+using Tizen.NUI.Binding;
+using Tizen.NUI.Xaml;
+
+namespace Tizen.NUI
+{
+    /// <summary></summary>
+    [EditorBrowsable(EditorBrowsableState.Never)]
+    public class Theme : BindableObject
+    {
+        private readonly Dictionary<string, ViewStyle> map;
+        private string baseTheme;
+
+        /// <summary>Create an empty theme.</summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public Theme()
+        {
+            map = new Dictionary<string, ViewStyle>();
+        }
+
+        /// <summary>Create a new theme from the xaml file.</summary>
+        /// <param name="xamlFile">An absolute path to the xaml file.</param>
+        /// <exception cref="ArgumentNullException">Thrown when the given xamlFile is null or empty string.</exception>
+        /// <exception cref="global::System.IO.IOException">Thrown when there are file IO problems.</exception>
+        /// <exception cref="Exception">Thrown when the content of the xaml file is not valid xaml form.</exception>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public Theme(string xamlFile) : this()
+        {
+            if (string.IsNullOrEmpty(xamlFile))
+            {
+                throw new ArgumentNullException("The xaml file path cannot be null or empty string", nameof(xamlFile));
+            }
+
+            try
+            {
+                using(var reader = XmlReader.Create(xamlFile))
+                {
+                    XamlLoader.Load(this, reader);
+                }
+            }
+            catch (global::System.IO.IOException e)
+            {
+                Tizen.Log.Info("NUI", $"Could not load \"{xamlFile}\".\n");
+                throw e;
+            }
+            catch (Exception e)
+            {
+                Tizen.Log.Info("NUI", $"Could not parse \"{xamlFile}\".\n");
+                Tizen.Log.Info("NUI", "Make sure the all used assemblies (e.g. Tizen.NUI.Components) are included in the application project.\n");
+                Tizen.Log.Info("NUI", "Make sure the type and namespace are correct.\n");
+                throw e;
+            }
+        }
+
+        /// <summary></summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public string Id { get; set; }
+
+        /// <summary>
+        /// For XAML.
+        /// The bulit-in theme id that will be used as base of this.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public string BasedOn
+        {
+            get => baseTheme;
+            internal set
+            {
+                baseTheme = value;
+
+                if (string.IsNullOrEmpty(baseTheme)) return;
+
+                var baseThemeInstance = ThemeManager.GetBuiltinTheme(baseTheme);
+
+                if (baseThemeInstance != null)
+                {
+                    foreach (var item in baseThemeInstance)
+                    {
+                        var baseStyle = item.Value?.Clone();
+                        if (map.ContainsKey(item.Key))
+                        {
+                            baseStyle.Merge(map[item.Key]);
+                        }
+                        map[item.Key] = baseStyle;
+                    }
+                }
+            }
+        }
+
+        /// <summary>Gets the number of steyls contained in the theme.</summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public int Count => map.Count;
+
+        /// <summary>
+        /// Note that it is not a normal indexer.
+        /// Setter will merge the new value with existing item.
+        /// </summary>
+        public ViewStyle this[string styleName]
+        {
+            get => map[styleName];
+            set
+            {
+                if (map.TryGetValue(styleName, out ViewStyle style))
+                {
+                    style.Merge(value);
+                }
+                else
+                {
+                    map[styleName] = value;
+                }
+            }
+        }
+
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public IEnumerator<KeyValuePair<string, ViewStyle>> GetEnumerator() => map.GetEnumerator();
+
+        /// <summary>
+        /// Removes all styles in the theme.
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public void Clear() => map.Clear();
+
+        /// <summary>
+        /// Determines whether the theme contains the specified style name.
+        /// </summary>
+        /// <exception cref="ArgumentNullException">The given style name is null.</exception>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public bool HasStyle(string styleName) => map.ContainsKey(styleName);
+
+        /// <summary>
+        /// Removes the style with the specified style name.
+        /// </summary>
+        /// <exception cref="ArgumentNullException">The given style name is null.</exception>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public bool RemoveStyle(string styleName) => map.Remove(styleName);
+
+        /// <summary>
+        /// Gets a style of given style name.
+        /// </summary>
+        /// <param name="styleName">The string key to find a ViewStyle.</param>
+        /// <returns>Founded style instance.</returns>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public ViewStyle GetStyle(string styleName) => map.ContainsKey(styleName) ? map[styleName] : null;
+
+        /// <summary>
+        /// Adds the specified style name and value to the theme.
+        /// This replace existing value if the theme already has a style with given name.
+        /// </summary>
+        /// <param name="styleName">The style name to add.</param>
+        /// <param name="value">The style instance to add.</param>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public void AddStyle(string styleName, ViewStyle value) => map[styleName] = value;
+
+
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public object Clone()
+        {
+            var result = new Theme()
+            {
+                Id = this.Id,
+            };
+
+            foreach (var item in this)
+            {
+                result[item.Key] = item.Value?.Clone();
+            }
+            return result;
+        }
+
+        /// <summary>Merge other Theme into this.</summary>
+        /// <param name="xamlFile">An absolute path to the xaml file of the theme.</param>
+        /// <exception cref="ArgumentException">Thrown when the given xamlFile is null or empty string.</exception>
+        /// <exception cref="global::System.IO.IOException">Thrown when there are file IO problems.</exception>
+        /// <exception cref="XamlParseException">Thrown when the content of the xaml file is not valid xaml form.</exception>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public void Merge(string xamlFile)
+        {
+            Merge(new Theme(xamlFile));
+        }
+
+        /// <summary>Merge other Theme into this.</summary>
+        /// <param name="theme">The Theme.</param>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public void Merge(Theme theme)
+        {
+            if (theme == null)
+                throw new ArgumentNullException(nameof(theme));
+            
+            foreach (var item in theme)
+            {
+                if (item.Value == null)
+                {
+                    map[item.Key] = null;
+                }
+                else if (map.ContainsKey(item.Key) && !item.Value.SolidNull)
+                {
+                    map[item.Key].Merge(theme.GetStyle(item.Key));
+                }
+                else
+                {
+                    map[item.Key] = theme.GetStyle(item.Key).Clone();
+                }
+            }
+        }
+    }
+}
diff --git a/src/Tizen.NUI/src/public/Theme/ThemeChangedEventArgs.cs b/src/Tizen.NUI/src/public/Theme/ThemeChangedEventArgs.cs
new file mode 100644 (file)
index 0000000..5f1c00e
--- /dev/null
@@ -0,0 +1,40 @@
+/*
+ * Copyright(c) 2020 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+using System;
+using System.ComponentModel;
+
+namespace Tizen.NUI
+{
+    /// <summary>
+    /// </summary>
+    [EditorBrowsable(EditorBrowsableState.Never)]
+    public class ThemeChangedEventArgs : EventArgs
+    {
+        /// <summary>
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public ThemeChangedEventArgs(string themeId)
+        {
+            ThemeId = themeId;
+        }
+
+        /// <summary>
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public string ThemeId { get; }
+    }
+}
diff --git a/src/Tizen.NUI/src/public/Theme/ThemeManager.cs b/src/Tizen.NUI/src/public/Theme/ThemeManager.cs
new file mode 100644 (file)
index 0000000..3d30fa0
--- /dev/null
@@ -0,0 +1,269 @@
+/*
+ * Copyright(c) 2020 Samsung Electronics Co., Ltd.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+extern alias TizenSystemInformation;
+using TizenSystemInformation.Tizen.System;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel;
+using Tizen.NUI.Xaml;
+using Tizen.NUI.BaseComponents;
+
+namespace Tizen.NUI
+{
+    /// <summary></summary>
+    [EditorBrowsable(EditorBrowsableState.Never)]
+    public static class ThemeManager
+    {
+        private enum Profile
+        {
+            Common = 0,
+            Mobile = 1,
+            TV = 2,
+            Wearable = 3
+        }
+
+        private static readonly string[] nuiThemeProjects =
+        {
+            "Tizen.NUI",
+            "Tizen.NUI.Components",
+            "Tizen.NUI.Wearable"
+        };
+
+        /// <summary>
+        /// Table that indicates deefault theme id by device profile.
+        /// Note that, the fallback of null value is Common value.
+        /// </summary>
+        private static readonly string[] profileDefaultTheme =
+        {
+            /* Common   */ "Tizen.NUI.Theme.Common",
+            /* Mobile   */ "Tizen.NUI.Theme.Common",
+            /* TV       */ null,
+            /* Wearable */ "Tizen.NUI.Theme.Wearable",
+        };
+
+        private static Theme currentTheme;
+        private static List<Theme> builtinThemes; // First item is default theme of the current profile.
+        private static bool isLoadingDefault = false;
+        private static Profile? currentProfile;
+
+        /// <summary>
+        /// </summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static event EventHandler<ThemeChangedEventArgs> ThemeChanged;
+
+        internal static Theme CurrentTheme
+        {
+            get
+            {
+                if (currentTheme == null)
+                {
+                    currentTheme = DefaultTheme;
+                }
+                return currentTheme;
+            }
+            set
+            {
+                currentTheme = value;
+                NotifyThemeChanged();
+            }
+        }
+
+        internal static Theme DefaultTheme
+        {
+            get => BuiltinThemes?[0];
+        }
+
+        private static List<Theme> BuiltinThemes
+        {
+            get
+            {
+                if (builtinThemes == null && !isLoadingDefault)
+                {
+                    isLoadingDefault = true;
+
+                    // Set the default theme as first item.
+                    builtinThemes = new List<Theme>
+                    {
+                        LoadBuiltinTheme(profileDefaultTheme[(int)CurrentProfile])
+                    };
+
+                    isLoadingDefault = false;
+                }
+                return builtinThemes;
+            }
+        }
+
+        private static Profile CurrentProfile
+        {
+            get
+            {
+                if (currentProfile == null)
+                {
+                    currentProfile = Profile.Common;
+                    string profileString = "";
+
+                    try
+                    {
+                        Information.TryGetValue<string>("tizen.org/feature/profile", out profileString);
+                        Tizen.Log.Info("NUI", "Profile for initial theme found : " + profileString);
+                    }
+                    catch
+                    {
+                        Tizen.Log.Info("NUI", "Unknown device profile\n");
+                    }
+                    finally
+                    {
+                        if (string.Equals(profileString, "mobile"))
+                        {
+                            currentProfile = Profile.Mobile;
+                        }
+                        else if (string.Equals(profileString, "tv"))
+                        {
+                            currentProfile = Profile.TV;
+                        }
+                        else if (string.Equals(profileString, "wearable"))
+                        {
+                            currentProfile = Profile.Wearable;
+                        }
+                    }
+                }
+                return (Profile)currentProfile;
+            }
+        }
+
+        /// <summary>
+        /// Apply them to the NUI.
+        /// This changes look of the existing components with property <seealso cref="View.ThemeChangeSensitive"/> on.
+        /// This also affects all components created afterwards.
+        /// </summary>
+        /// <param name="theme">The theme instance to be applied.</param>
+        /// <exception cref="ArgumentNullException">The given theme is null.</exception>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static void ApplyTheme(Theme theme)
+        {
+            var newTheme = (Theme)theme?.Clone() ?? throw new ArgumentNullException($"Invalid theme.");
+
+            if (string.IsNullOrEmpty(newTheme.Id))
+            {
+                newTheme.Id = "NONAME";
+            }
+
+            CurrentTheme = newTheme;
+        }
+
+        /// <summary>
+        /// Load a style with style name in the current theme.
+        /// For components, the style name is a component name (e.g. Button) in normal case.
+        /// </summary>
+        /// <param name="styleName">The style name</param>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static ViewStyle GetStyle(string styleName)
+        {
+            if (styleName == null)
+            {
+                throw new ArgumentNullException(nameof(styleName));
+            }
+
+            return CurrentTheme?.GetStyle(styleName)?.Clone();
+        }
+
+        /// <summary>
+        /// Load a style for a View in the current theme.
+        /// </summary>
+        /// <param name="viewType">The type of View</param>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static ViewStyle GetStyle(Type viewType)
+        {
+            if (viewType == null)
+            {
+                throw new ArgumentNullException(nameof(viewType));
+            }
+
+            var currentType = viewType;
+            ViewStyle resultStyle = null;
+
+            do
+            {
+                if (currentType.Equals(typeof(Tizen.NUI.BaseComponents.View))) break;
+                resultStyle = GetStyle(currentType.Name)?.Clone();
+                currentType = currentType.BaseType;
+            }
+            while (resultStyle == null && currentType != null);
+
+            return resultStyle;
+        }
+
+        /// <summary>
+        /// Get a cloned built-in theme.
+        /// </summary>
+        /// <param name="themeId">The built-in theme id.</param>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public static Theme GetBuiltinTheme(string themeId)
+        {
+            Theme result = null;
+            int index = BuiltinThemes.FindIndex(x => string.IsNullOrEmpty(x?.Id) && x.Id.Equals(themeId, StringComparison.OrdinalIgnoreCase));
+            if (index > 0)
+            {
+                result = (Theme)BuiltinThemes[index];
+            }
+            else
+            {
+                var theme = LoadBuiltinTheme(themeId);
+                BuiltinThemes.Add(theme);
+                result = theme;
+            }
+            return (Theme)result?.Clone();
+        }
+
+        private static Theme LoadBuiltinTheme(string id)
+        {
+            var loaded = new Theme()
+            {
+                Id = id,
+            };
+
+            if (string.IsNullOrEmpty(id)) return loaded;
+
+            foreach (var project in nuiThemeProjects)
+            {
+                string path = StyleManager.FrameworkResourcePath + "/Theme/" + project + "_" + id + ".xaml";
+
+                try
+                {
+                    loaded.Merge(path);
+                    loaded.Id = id;
+                }
+                catch (XamlParseException)
+                {
+                    Tizen.Log.Error("NUI", $"Could not find \"{path}\".\n");
+                    Tizen.Log.Error("NUI", $"The assemblies used in the file may not be included in the project.\n");
+                }
+                catch (Exception)
+                {
+                    Tizen.Log.Error("NUI", $"Could not load \"{path}\"\n");
+                }
+            }
+
+            return loaded;
+        }
+
+        private static void NotifyThemeChanged()
+        {
+            ThemeChanged?.Invoke(null, new ThemeChangedEventArgs(CurrentTheme?.Id));
+        }
+    }
+}
index 00900b5..f25465a 100755 (executable)
@@ -14,6 +14,7 @@
  * limitations under the License.
  *
  */
+using System;
 using System.ComponentModel;
 using Tizen.NUI.Binding;
 
@@ -25,7 +26,7 @@ namespace Tizen.NUI
     /// </summary>
     /// <since_tizen> 3 </since_tizen>
     [Binding.TypeConverter(typeof(Vector2TypeConverter))]
-    public class Vector2 : Disposable
+    public class Vector2 : Disposable, ICloneable
     {
 
         /// <summary>
@@ -437,6 +438,10 @@ namespace Tizen.NUI
             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
         }
 
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public object Clone() => new Vector2(this);
+
         /// <summary>
         /// Clamps the vector between minimum and maximum vectors.
         /// </summary>
index bfe9afe..92f4817 100755 (executable)
@@ -14,6 +14,7 @@
  * limitations under the License.
  *
  */
+using System;
 using System.ComponentModel;
 using Tizen.NUI.Binding;
 
@@ -25,7 +26,7 @@ namespace Tizen.NUI
     /// </summary>
     /// <since_tizen> 3 </since_tizen>
     [Binding.TypeConverter(typeof(Vector3TypeConverter))]
-    public class Vector3 : Disposable
+    public class Vector3 : Disposable, ICloneable
     {
         /// <summary>
         /// The constructor.
@@ -594,6 +595,10 @@ namespace Tizen.NUI
             return ret;
         }
 
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public object Clone() => new Vector3(X, Y, Z);
+
         internal static global::System.Runtime.InteropServices.HandleRef getCPtr(Vector3 obj)
         {
             return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
index 803a9d9..bf060c1 100755 (executable)
@@ -14,6 +14,7 @@
  * limitations under the License.
  *
  */
+using System;
 using System.ComponentModel;
 using Tizen.NUI.Binding;
 
@@ -25,7 +26,7 @@ namespace Tizen.NUI
     /// </summary>
     /// <since_tizen> 3 </since_tizen>
     [Binding.TypeConverter(typeof(Vector4TypeConverter))]
-    public class Vector4 : Disposable
+    public class Vector4 : Disposable, ICloneable
     {
 
         /// <summary>
@@ -592,6 +593,10 @@ namespace Tizen.NUI
             if (NDalicPINVOKE.SWIGPendingException.Pending) throw NDalicPINVOKE.SWIGPendingException.Retrieve();
         }
 
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public object Clone() => new Vector4(X, Y, Z, W);
+
         internal static global::System.Runtime.InteropServices.HandleRef getCPtr(Vector4 obj)
         {
             return (obj == null) ? new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero) : obj.swigCPtr;
index 02b5bfe..891351b 100644 (file)
@@ -45,7 +45,7 @@ namespace Tizen.NUI
         public ImageShadow(string url, Rectangle border, Vector2 offset, Vector2 extents) : base(offset, extents)
         {
             Url = url;
-            Border = new Rectangle(border);
+            Border = border == null ? null : new Rectangle(border);
         }
 
         /// <summary>
index f66964a..680b010 100644 (file)
@@ -48,7 +48,7 @@ namespace Tizen.NUI
         public Shadow(float blurRadius, Vector2 offset, Color color, Vector2 extents) : base(offset, extents)
         {
             BlurRadius = blurRadius;
-            Color = new Color(color);
+            Color = color == null ? null : new Color(color);
         }
 
         /// <summary>
index 07d0c45..2806e60 100644 (file)
@@ -45,8 +45,8 @@ namespace Tizen.NUI
         [EditorBrowsable(EditorBrowsableState.Never)]
         protected ShadowBase(Vector2 offset, Vector2 extents)
         {
-            Offset = new Vector2(offset);
-            Extents = new Vector2(extents);
+            Offset = offset == null ? null : new Vector2(offset);
+            Extents = extents == null ? null : new Vector2(extents);
         }
 
         /// <summary></summary>
index 210ff98..af116f8 100755 (executable)
@@ -54,7 +54,7 @@ namespace Tizen.NUI
         [EditorBrowsable(EditorBrowsableState.Never)]
         public object Clone()
         {
-            return new TextShadow(Color, Offset, BlurRadius);
+            return new TextShadow((Color)Color?.Clone(), Offset, BlurRadius);
         }
 
         /// <summary>
diff --git a/src/Tizen.NUI/src/public/Xaml/MarkupExtensions/ApplicationResourcePathExtension.cs b/src/Tizen.NUI/src/public/Xaml/MarkupExtensions/ApplicationResourcePathExtension.cs
new file mode 100644 (file)
index 0000000..cb8345b
--- /dev/null
@@ -0,0 +1,34 @@
+using System;
+using System.ComponentModel;
+using Tizen.NUI.Binding;
+
+namespace Tizen.NUI.Xaml
+{
+    /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
+    [EditorBrowsable(EditorBrowsableState.Never)]
+    [ContentProperty(nameof(FilePath))]
+    [AcceptEmptyServiceProvider]
+    public class ApplicationResourcePathExtension : IMarkupExtension<string>
+    {
+        /// <summary></summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public ApplicationResourcePathExtension()
+        {
+        }
+
+        /// <summary></summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public string FilePath { get; set; }
+
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public string ProvideValue(IServiceProvider serviceProvider) => Tizen.Applications.Application.Current.DirectoryInfo.Resource + FilePath;
+
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        object IMarkupExtension.ProvideValue(IServiceProvider serviceProvider)
+        {
+            return (this as IMarkupExtension<string>).ProvideValue(serviceProvider);
+        }
+    }
+}
diff --git a/src/Tizen.NUI/src/public/Xaml/MarkupExtensions/NUIResourcePathExtension.cs b/src/Tizen.NUI/src/public/Xaml/MarkupExtensions/NUIResourcePathExtension.cs
new file mode 100644 (file)
index 0000000..08e622b
--- /dev/null
@@ -0,0 +1,34 @@
+using System;
+using System.ComponentModel;
+using Tizen.NUI.Binding;
+
+namespace Tizen.NUI.Xaml
+{
+    /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
+    [EditorBrowsable(EditorBrowsableState.Never)]
+    [ContentProperty(nameof(FilePath))]
+    [AcceptEmptyServiceProvider]
+    public class NUIResourcePathExtension : IMarkupExtension<string>
+    {
+        /// <summary></summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public NUIResourcePathExtension()
+        {
+        }
+
+        /// <summary></summary>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public string FilePath { get; set; }
+
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public string ProvideValue(IServiceProvider serviceProvider) => StyleManager.FrameworkResourcePath + FilePath;
+
+        /// <inheritdoc/>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        object IMarkupExtension.ProvideValue(IServiceProvider serviceProvider)
+        {
+            return (this as IMarkupExtension<string>).ProvideValue(serviceProvider);
+        }
+    }
+}
index ab8b317..919aa2a 100755 (executable)
@@ -50,35 +50,36 @@ namespace Tizen.NUI.Binding
         [EditorBrowsable(EditorBrowsableState.Never)]
         public event PropertyChangedEventHandler PropertyChanged;
 
-        /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
+        /// <summary>Whether to allow null value when <seealso cref="CopyFrom"/>.</summary>
         [EditorBrowsable(EditorBrowsableState.Never)]
-        public virtual void CopyFrom(BindableObject that)
+        protected static bool AllowNullCopy { get; set; } = false;
+
+        /// <summary>Copy properties of other ViewStyle to this.</summary>
+        /// <param name="other">The other BindableProperty merge to this.</param>
+        [EditorBrowsable(EditorBrowsableState.Never)]
+        public virtual void CopyFrom(BindableObject other)
         {
-            if (null != that)
-            {
-                Dictionary<string, BindableProperty> nameToBindableProperty1;
-                Type type1 = this.GetType();
-                BindableProperty.GetBindablePropertysOfType(type1, out nameToBindableProperty1);
+            if (null == other) return;
+
+            Type type1 = this.GetType();
+            BindableProperty.GetBindablePropertysOfType(type1, out var nameToBindableProperty1);
 
-                Dictionary<string, BindableProperty> nameToBindableProperty2;
-                Type type2 = that.GetType();
-                BindableProperty.GetBindablePropertysOfType(type2, out nameToBindableProperty2);
+            Type type2 = other.GetType();
+            BindableProperty.GetBindablePropertysOfType(type2, out var nameToBindableProperty2);
 
-                if (null != nameToBindableProperty1)
+            if (null != nameToBindableProperty1)
+            {
+                foreach (KeyValuePair<string, BindableProperty> keyValuePair in nameToBindableProperty1)
                 {
-                    foreach (KeyValuePair<string, BindableProperty> keyValuePair in nameToBindableProperty1)
+                    nameToBindableProperty2.TryGetValue(keyValuePair.Key, out var bindableProperty);
+
+                    if (null != bindableProperty)
                     {
-                        BindableProperty bindableProperty;
-                        nameToBindableProperty2.TryGetValue(keyValuePair.Key, out bindableProperty);
+                        object value = other.GetValue(bindableProperty);
 
-                        if (null != bindableProperty)
+                        if (AllowNullCopy || null != value)
                         {
-                            object value = that.GetValue(bindableProperty);
-
-                            if (null != value)
-                            {
-                                SetValue(keyValuePair.Value, value);
-                            }
+                            SetValue(keyValuePair.Value, value);
                         }
                     }
                 }