2 * Copyright(c) 2020 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 using System.ComponentModel;
19 using Tizen.NUI.BaseComponents;
20 using Tizen.NUI.Binding;
21 using Tizen.NUI.Components.Extension;
23 namespace Tizen.NUI.Components
26 /// Button is one kind of common component, a button clearly describes what action will occur when the user selects it.
27 /// Button may contain text or an icon.
29 /// <since_tizen> 6 </since_tizen>
30 public class Button : Control
32 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
33 [EditorBrowsable(EditorBrowsableState.Never)]
34 public static readonly BindableProperty IconRelativeOrientationProperty = BindableProperty.Create(nameof(IconRelativeOrientation), typeof(IconOrientation?), typeof(Button), null, propertyChanged: (bindable, oldValue, newValue) =>
36 var instance = (Button)bindable;
39 instance.privateIconRelativeOrientation = (IconOrientation?)newValue;
42 defaultValueCreator: (bindable) =>
44 var instance = (Button)bindable;
45 return instance.privateIconRelativeOrientation;
47 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
48 [EditorBrowsable(EditorBrowsableState.Never)]
49 public static readonly BindableProperty IsEnabledProperty = BindableProperty.Create(nameof(IsEnabled), typeof(bool), typeof(Button), true, propertyChanged: (bindable, oldValue, newValue) =>
51 var instance = (Button)bindable;
54 instance.privateIsEnabled = (bool)newValue;
57 defaultValueCreator: (bindable) =>
59 var instance = (Button)bindable;
60 return instance.privateIsEnabled;
62 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
63 [EditorBrowsable(EditorBrowsableState.Never)]
64 public static readonly BindableProperty IsSelectedProperty = BindableProperty.Create(nameof(IsSelected), typeof(bool), typeof(Button), true, propertyChanged: (bindable, oldValue, newValue) =>
66 var instance = (Button)bindable;
69 instance.privateIsSelected = (bool)newValue;
72 defaultValueCreator: (bindable) =>
74 var instance = (Button)bindable;
75 return instance.privateIsSelected;
77 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
78 [EditorBrowsable(EditorBrowsableState.Never)]
79 public static readonly BindableProperty IsSelectableProperty = BindableProperty.Create(nameof(IsSelectable), typeof(bool), typeof(Button), true, propertyChanged: (bindable, oldValue, newValue) =>
81 var instance = (Button)bindable;
84 instance.privateIsSelectable = (bool)newValue;
87 defaultValueCreator: (bindable) =>
89 var instance = (Button)bindable;
90 return instance.privateIsSelectable;
92 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
93 [EditorBrowsable(EditorBrowsableState.Never)]
94 public static readonly BindableProperty IconPaddingProperty = BindableProperty.Create(nameof(IconPadding), typeof(Extents), typeof(Button), null, propertyChanged: (bindable, oldValue, newValue) =>
96 var instance = (Button)bindable;
97 if (null != newValue && null != instance.Style?.IconPadding)
99 instance.Style.IconPadding.CopyFrom((Extents)newValue);
100 instance.UpdateUIContent();
103 defaultValueCreator: (bindable) =>
105 var instance = (Button)bindable;
106 return instance.Style?.IconPadding;
108 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
109 [EditorBrowsable(EditorBrowsableState.Never)]
110 public static readonly BindableProperty TextPaddingProperty = BindableProperty.Create(nameof(TextPadding), typeof(Extents), typeof(Button), null, propertyChanged: (bindable, oldValue, newValue) =>
112 var instance = (Button)bindable;
113 if (null != newValue && null != instance.Style?.TextPadding)
115 instance.Style.TextPadding.CopyFrom((Extents)newValue);
116 instance.UpdateUIContent();
119 defaultValueCreator: (bindable) =>
121 var instance = (Button)bindable;
122 return instance.Style?.TextPadding;
125 private EventHandler<StateChangedEventArgs> stateChangeHander;
127 private bool isSelected = false;
128 private bool isEnabled = true;
129 private bool isPressed = false;
132 /// Button's overlay image part.
134 [EditorBrowsable(EditorBrowsableState.Never)]
135 protected ImageView ButtonOverlayImage { get; set; }
138 /// Button's text part.
140 [EditorBrowsable(EditorBrowsableState.Never)]
141 protected TextLabel ButtonText { get; set; }
144 /// Button's icon part.
146 [EditorBrowsable(EditorBrowsableState.Never)]
147 protected ImageView ButtonIcon { get; set; }
150 /// The last touch information triggering selected state change.
152 [EditorBrowsable(EditorBrowsableState.Never)]
153 protected Touch SelectionChangedByTouch { get; set; }
156 /// The ButtonExtension instance that is injected by ButtonStyle.
158 [EditorBrowsable(EditorBrowsableState.Never)]
159 protected ButtonExtension Extension { get; set; }
162 /// Creates Button's text part.
164 /// <return>The created Button's text part.</return>
165 [EditorBrowsable(EditorBrowsableState.Never)]
166 protected virtual TextLabel CreateText()
168 return new TextLabel();
172 /// Creates Button's icon part.
174 /// <return>The created Button's icon part.</return>
175 [EditorBrowsable(EditorBrowsableState.Never)]
176 protected virtual ImageView CreateIcon()
178 return new ImageView();
182 /// Creates Button's overlay image part.
184 /// <return>The created Button's overlay image part.</return>
185 [EditorBrowsable(EditorBrowsableState.Never)]
186 protected virtual ImageView CreateOverlayImage()
188 return new ImageView();
192 /// Called when the Button is Clicked by a user
194 /// <param name="eventArgs">The click information.</param>
195 [EditorBrowsable(EditorBrowsableState.Never)]
196 protected virtual void OnClick(ClickEventArgs eventArgs)
203 /// Creates a new instance of a Button.
205 /// <since_tizen> 6 </since_tizen>
206 public Button() : base()
212 /// Creates a new instance of a Button with style.
214 /// <param name="style">Create Button by special style defined in UX.</param>
215 /// <since_tizen> 8 </since_tizen>
216 public Button(string style) : base(style)
222 /// Creates a new instance of a Button with style.
224 /// <param name="buttonStyle">Create Button by style customized by user.</param>
225 /// <since_tizen> 8 </since_tizen>
226 public Button(ButtonStyle buttonStyle) : base(buttonStyle)
232 /// An event for the button clicked signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
234 /// <since_tizen> 6 </since_tizen>
235 public event EventHandler<ClickEventArgs> ClickEvent;
237 /// An event for the button state changed signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
239 /// <since_tizen> 6 </since_tizen>
240 public event EventHandler<StateChangedEventArgs> StateChangedEvent
244 stateChangeHander += value;
248 stateChangeHander -= value;
252 /// Icon orientation.
254 /// <since_tizen> 6 </since_tizen>
255 public enum IconOrientation
260 /// <since_tizen> 6 </since_tizen>
265 /// <since_tizen> 6 </since_tizen>
270 /// <since_tizen> 6 </since_tizen>
275 /// <since_tizen> 6 </since_tizen>
280 /// Style of the button.
282 /// <since_tizen> 8 </since_tizen>
283 public new ButtonStyle Style => ViewStyle as ButtonStyle;
286 /// The text of Button.
288 /// <since_tizen> 6 </since_tizen>
293 return Style?.Text?.Text?.GetValue(ControlState);
297 if (null != Style?.Text)
299 Style.Text.Text = value;
305 /// Flag to decide Button can be selected or not.
307 /// <since_tizen> 6 </since_tizen>
308 public bool IsSelectable
312 return (bool)GetValue(IsSelectableProperty);
316 SetValue(IsSelectableProperty, value);
320 private bool privateIsSelectable
324 return Style?.IsSelectable ?? false;
328 Style.IsSelectable = value;
333 /// Translate text string in Button.
335 /// <since_tizen> 6 </since_tizen>
336 public string TranslatableText
340 return Style?.Text?.TranslatableText?.All;
344 if (null != Style?.Text)
346 Style.Text.TranslatableText = value;
352 /// Text point size in Button.
354 /// <since_tizen> 6 </since_tizen>
355 public float PointSize
359 return Style?.Text?.PointSize?.All ?? 0;
363 if (null != Style?.Text)
365 Style.Text.PointSize = value;
371 /// Text font family in Button.
373 /// <since_tizen> 6 </since_tizen>
374 public string FontFamily
378 return Style?.Text?.FontFamily.All;
382 if (null != Style?.Text)
384 Style.Text.FontFamily = value;
389 /// Text color in Button.
391 /// <since_tizen> 6 </since_tizen>
392 public Color TextColor
396 return Style?.Text?.TextColor?.All;
400 if (null != Style?.Text)
402 Style.Text.TextColor = value;
407 /// Text horizontal alignment in Button.
409 /// <since_tizen> 6 </since_tizen>
410 public HorizontalAlignment TextAlignment
414 return Style?.Text?.HorizontalAlignment ?? HorizontalAlignment.Center;
418 if (null != Style?.Text)
420 Style.Text.HorizontalAlignment = value;
425 /// Icon image's resource url in Button.
427 /// <since_tizen> 6 </since_tizen>
428 public string IconURL
432 return Style?.Icon?.ResourceUrl?.All;
436 if (null != Style?.Icon)
438 Style.Icon.ResourceUrl = value;
443 private StringSelector textSelector = new StringSelector();
445 /// Text string selector in Button.
447 /// <since_tizen> 6 </since_tizen>
448 public StringSelector TextSelector
456 if (value == null || textSelector == null)
458 Tizen.Log.Fatal("NUI", "[Exception] Button.TextSelector is null");
459 throw new NullReferenceException("Button.TextSelector is null");
463 textSelector.Clone(value);
468 private StringSelector translatableTextSelector = new StringSelector();
470 /// Translateable text string selector in Button.
472 /// <since_tizen> 6 </since_tizen>
473 public StringSelector TranslatableTextSelector
477 return translatableTextSelector;
481 if (value == null || translatableTextSelector == null)
483 Tizen.Log.Fatal("NUI", "[Exception] Button.TranslatableTextSelector is null");
484 throw new NullReferenceException("Button.TranslatableTextSelector is null");
488 translatableTextSelector.Clone(value);
493 private ColorSelector textColorSelector = new ColorSelector();
495 /// Text color selector in Button.
497 /// <since_tizen> 6 </since_tizen>
498 public ColorSelector TextColorSelector
502 return textColorSelector;
506 if (value == null || textColorSelector == null)
508 Tizen.Log.Fatal("NUI", "[Exception] Button.textColorSelector is null");
509 throw new NullReferenceException("Button.textColorSelector is null");
513 textColorSelector.Clone(value);
518 private FloatSelector pointSizeSelector = new FloatSelector();
520 /// Text font size selector in Button.
522 /// <since_tizen> 6 </since_tizen>
523 public FloatSelector PointSizeSelector
527 return pointSizeSelector;
531 if (value == null || pointSizeSelector == null)
533 Tizen.Log.Fatal("NUI", "[Exception] Button.pointSizeSelector is null");
534 throw new NullReferenceException("Button.pointSizeSelector is null");
538 pointSizeSelector.Clone(value);
543 private StringSelector iconURLSelector = new StringSelector();
545 /// Icon image's resource url selector in Button.
547 /// <since_tizen> 6 </since_tizen>
548 public StringSelector IconURLSelector
552 return iconURLSelector;
556 if (value == null || iconURLSelector == null)
558 Tizen.Log.Fatal("NUI", "[Exception] Button.iconURLSelector is null");
559 throw new NullReferenceException("Button.iconURLSelector is null");
563 iconURLSelector.Clone(value);
569 /// Flag to decide selected state in Button.
571 /// <since_tizen> 6 </since_tizen>
572 public bool IsSelected
576 return (bool)GetValue(IsSelectedProperty);
580 SetValue(IsSelectedProperty, value);
583 private bool privateIsSelected
598 /// Flag to decide enable or disable in Button.
600 /// <since_tizen> 6 </since_tizen>
601 public bool IsEnabled
605 return (bool)GetValue(IsEnabledProperty);
609 SetValue(IsEnabledProperty, value);
612 private bool privateIsEnabled
626 /// Icon relative orientation in Button, work only when show icon and text.
628 /// <since_tizen> 6 </since_tizen>
629 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
630 [EditorBrowsable(EditorBrowsableState.Never)]
631 public IconOrientation? IconRelativeOrientation
635 return (IconOrientation?)GetValue(IconRelativeOrientationProperty);
639 SetValue(IconRelativeOrientationProperty, value);
642 private IconOrientation? privateIconRelativeOrientation
646 return Style?.IconRelativeOrientation;
650 if (Style != null && Style.IconRelativeOrientation != value)
652 Style.IconRelativeOrientation = value;
659 /// Icon padding in Button, work only when show icon and text.
661 /// <since_tizen> 6 </since_tizen>
662 public Extents IconPadding
664 get => (Extents)GetValue(IconPaddingProperty);
665 set => SetValue(IconPaddingProperty, value);
669 /// Text padding in Button, work only when show icon and text.
671 /// <since_tizen> 6 </since_tizen>
672 public Extents TextPadding
674 get => (Extents)GetValue(TextPaddingProperty);
675 set => SetValue(TextPaddingProperty, value);
679 /// Dispose Button and all children on it.
681 /// <param name="type">Dispose type.</param>
682 /// <since_tizen> 6 </since_tizen>
683 protected override void Dispose(DisposeTypes type)
690 if (type == DisposeTypes.Explicit)
692 Extension?.OnDispose(this);
694 if (ButtonIcon != null)
696 Utility.Dispose(ButtonIcon);
698 if (ButtonText != null)
700 Utility.Dispose(ButtonText);
702 if (ButtonOverlayImage != null)
704 Utility.Dispose(ButtonOverlayImage);
711 /// Called after a key event is received by the view that has had its focus set.
713 /// <param name="key">The key event.</param>
714 /// <returns>True if the key event should be consumed.</returns>
715 /// <since_tizen> 6 </since_tizen>
716 public override bool OnKey(Key key)
718 if (null == key) return false;
719 if (key.State == Key.StateType.Down)
721 if (key.KeyPressedName == "Return")
727 else if (key.State == Key.StateType.Up)
729 if (key.KeyPressedName == "Return")
731 bool clicked = isPressed && isEnabled;
735 if (Style.IsSelectable != null && Style.IsSelectable == true)
737 IsSelected = !IsSelected;
746 ClickEventArgs eventArgs = new ClickEventArgs();
747 OnClickInternal(eventArgs);
751 return base.OnKey(key);
755 /// Called when the control gain key input focus. Should be overridden by derived classes if they need to customize what happens when the focus is gained.
757 /// <since_tizen> 6 </since_tizen>
758 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
759 [EditorBrowsable(EditorBrowsableState.Never)]
760 public override void OnFocusGained()
762 base.OnFocusGained();
767 /// Called when the control loses key input focus. Should be overridden by derived classes if they need to customize what happens when the focus is lost.
769 /// <since_tizen> 6 </since_tizen>
770 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
771 [EditorBrowsable(EditorBrowsableState.Never)]
772 public override void OnFocusLost()
779 /// Called after a touch event is received by the owning view.<br />
780 /// CustomViewBehaviour.REQUIRES_TOUCH_EVENTS must be enabled during construction. See CustomView(ViewWrapperImpl.CustomViewBehaviour behaviour).<br />
782 /// <param name="touch">The touch event.</param>
783 /// <returns>True if the event should be consumed.</returns>
784 /// <since_tizen> 6 </since_tizen>
785 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
786 [EditorBrowsable(EditorBrowsableState.Never)]
787 public override bool OnTouch(Touch touch)
789 if (null == touch) return false;
790 PointStateType state = touch.GetState(0);
794 case PointStateType.Down:
796 Extension?.SetTouchInfo(touch);
799 case PointStateType.Interrupted:
803 case PointStateType.Up:
805 bool clicked = isPressed && isEnabled;
809 if (Style.IsSelectable != null && Style.IsSelectable == true)
811 Extension?.SetTouchInfo(touch);
812 IsSelected = !IsSelected;
816 Extension?.SetTouchInfo(touch);
822 ClickEventArgs eventArgs = new ClickEventArgs();
823 OnClickInternal(eventArgs);
831 return base.OnTouch(touch);
835 /// Apply style to button.
837 /// <param name="viewStyle">The style to apply.</param>
838 /// <since_tizen> 8 </since_tizen>
839 public override void ApplyStyle(ViewStyle viewStyle)
841 base.ApplyStyle(viewStyle);
843 ButtonStyle buttonStyle = viewStyle as ButtonStyle;
845 if (null != buttonStyle)
847 ButtonOverlayImage?.ApplyStyle(buttonStyle.Overlay);
848 ButtonText?.ApplyStyle(buttonStyle.Text);
849 ButtonIcon?.ApplyStyle(buttonStyle.Icon);
854 /// Get Button style.
856 /// <returns>The default button style.</returns>
857 /// <since_tizen> 8 </since_tizen>
858 protected override ViewStyle GetViewStyle()
860 return new ButtonStyle();
863 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
864 [EditorBrowsable(EditorBrowsableState.Never)]
865 protected override void OnUpdate()
870 Extension?.OnRelayout(this);
874 /// Update Button State.
876 /// <param name="touchInfo">The touch information in case the state has changed by touching.</param>
877 /// <since_tizen> 6 </since_tizen>
878 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
879 [EditorBrowsable(EditorBrowsableState.Never)]
880 protected void UpdateState()
882 ControlStates sourceState = ControlState;
883 ControlStates targetState;
890 targetState = ControlStates.Pressed;
895 targetState = ControlStates.Normal;
898 targetState |= (IsSelected ? ControlStates.Selected : 0);
900 // Focused, SelectedFocused
901 targetState |= (IsFocused ? ControlStates.Focused : 0);
907 targetState = ControlStates.Disabled;
909 // DisabledSelected, DisabledFocused
910 targetState |= (IsSelected ? ControlStates.Selected : (IsFocused ? ControlStates.Focused : 0));
913 if (sourceState != targetState)
915 ControlState = targetState;
919 StateChangedEventArgs e = new StateChangedEventArgs
921 PreviousState = sourceState,
922 CurrentState = targetState
924 stateChangeHander?.Invoke(this, e);
926 Extension?.OnControlStateChanged(this, new ControlStateChangedEventArgs(sourceState, targetState));
931 /// It is hijack by using protected, style copy problem when class inherited from Button.
933 /// <since_tizen> 6 </since_tizen>
934 private void Initialize()
936 var style = (ButtonStyle)Style;
938 Extension = style.CreateExtension();
942 EnableControlStatePropagation = true;
944 if (ButtonOverlayImage != null)
946 Add(ButtonOverlayImage);
947 ButtonOverlayImage.ApplyStyle(style.Overlay);
950 if (ButtonIcon != null)
953 ButtonIcon.ApplyStyle(style.Icon);
954 ButtonIcon.Relayout += OnIconRelayout;
957 if (null != ButtonText)
960 ButtonText.ApplyStyle(style.Text);
965 LayoutDirectionChanged += OnLayoutDirectionChanged;
968 private void CreateComponents()
970 ButtonOverlayImage = CreateOverlayImage();
971 ButtonIcon = CreateIcon();
972 ButtonText = CreateText();
974 if (Extension == null)
979 // Update component with extension
980 ButtonOverlayImage = Extension.OnCreateOverlayImage(this, ButtonOverlayImage);
981 ButtonIcon = Extension.OnCreateIcon(this, ButtonIcon);
982 ButtonText = Extension.OnCreateText(this, ButtonText);
986 /// Measure text, it can be override.
988 /// <since_tizen> 6 </since_tizen>
989 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
990 [EditorBrowsable(EditorBrowsableState.Never)]
991 protected virtual void MeasureText()
993 if (Style.IconRelativeOrientation == null || ButtonIcon == null || ButtonText == null)
997 ButtonText.WidthResizePolicy = ResizePolicyType.Fixed;
998 ButtonText.HeightResizePolicy = ResizePolicyType.Fixed;
999 int textPaddingStart = Style.TextPadding.Start;
1000 int textPaddingEnd = Style.TextPadding.End;
1001 int textPaddingTop = Style.TextPadding.Top;
1002 int textPaddingBottom = Style.TextPadding.Bottom;
1004 int iconPaddingStart = Style.IconPadding.Start;
1005 int iconPaddingEnd = Style.IconPadding.End;
1006 int iconPaddingTop = Style.IconPadding.Top;
1007 int iconPaddingBottom = Style.IconPadding.Bottom;
1009 if (IconRelativeOrientation == IconOrientation.Top || IconRelativeOrientation == IconOrientation.Bottom)
1011 ButtonText.SizeWidth = SizeWidth - textPaddingStart - textPaddingEnd;
1012 ButtonText.SizeHeight = SizeHeight - textPaddingTop - textPaddingBottom - iconPaddingTop - iconPaddingBottom - ButtonIcon.SizeHeight;
1016 ButtonText.SizeWidth = SizeWidth - textPaddingStart - textPaddingEnd - iconPaddingStart - iconPaddingEnd - ButtonIcon.SizeWidth;
1017 ButtonText.SizeHeight = SizeHeight - textPaddingTop - textPaddingBottom;
1021 /// Layout child, it can be override.
1023 /// <since_tizen> 6 </since_tizen>
1024 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
1025 [EditorBrowsable(EditorBrowsableState.Never)]
1026 protected virtual void LayoutChild()
1028 if (Style.IconRelativeOrientation == null || ButtonIcon == null || ButtonText == null)
1033 var buttonIcon = ButtonIcon;
1034 var buttonText = ButtonText;
1036 int textPaddingStart = Style.TextPadding.Start;
1037 int textPaddingEnd = Style.TextPadding.End;
1038 int textPaddingTop = Style.TextPadding.Top;
1039 int textPaddingBottom = Style.TextPadding.Bottom;
1041 int iconPaddingStart = Style.IconPadding.Start;
1042 int iconPaddingEnd = Style.IconPadding.End;
1043 int iconPaddingTop = Style.IconPadding.Top;
1044 int iconPaddingBottom = Style.IconPadding.Bottom;
1046 switch (IconRelativeOrientation)
1048 case IconOrientation.Top:
1049 buttonIcon.PositionUsesPivotPoint = true;
1050 buttonIcon.ParentOrigin = NUI.ParentOrigin.TopCenter;
1051 buttonIcon.PivotPoint = NUI.PivotPoint.TopCenter;
1052 buttonIcon.Position2D = new Position2D(0, iconPaddingTop);
1054 buttonText.PositionUsesPivotPoint = true;
1055 buttonText.ParentOrigin = NUI.ParentOrigin.BottomCenter;
1056 buttonText.PivotPoint = NUI.PivotPoint.BottomCenter;
1057 buttonText.Position2D = new Position2D(0, -textPaddingBottom);
1059 case IconOrientation.Bottom:
1060 buttonIcon.PositionUsesPivotPoint = true;
1061 buttonIcon.ParentOrigin = NUI.ParentOrigin.BottomCenter;
1062 buttonIcon.PivotPoint = NUI.PivotPoint.BottomCenter;
1063 buttonIcon.Position2D = new Position2D(0, -iconPaddingBottom);
1065 buttonText.PositionUsesPivotPoint = true;
1066 buttonText.ParentOrigin = NUI.ParentOrigin.TopCenter;
1067 buttonText.PivotPoint = NUI.PivotPoint.TopCenter;
1068 buttonText.Position2D = new Position2D(0, textPaddingTop);
1070 case IconOrientation.Left:
1071 if (LayoutDirection == ViewLayoutDirectionType.LTR)
1073 buttonIcon.PositionUsesPivotPoint = true;
1074 buttonIcon.ParentOrigin = NUI.ParentOrigin.CenterLeft;
1075 buttonIcon.PivotPoint = NUI.PivotPoint.CenterLeft;
1076 buttonIcon.Position2D = new Position2D(iconPaddingStart, 0);
1078 buttonText.PositionUsesPivotPoint = true;
1079 buttonText.ParentOrigin = NUI.ParentOrigin.CenterRight;
1080 buttonText.PivotPoint = NUI.PivotPoint.CenterRight;
1081 buttonText.Position2D = new Position2D(-textPaddingEnd, 0);
1085 buttonIcon.PositionUsesPivotPoint = true;
1086 buttonIcon.ParentOrigin = NUI.ParentOrigin.CenterRight;
1087 buttonIcon.PivotPoint = NUI.PivotPoint.CenterRight;
1088 buttonIcon.Position2D = new Position2D(-iconPaddingStart, 0);
1090 buttonText.PositionUsesPivotPoint = true;
1091 buttonText.ParentOrigin = NUI.ParentOrigin.CenterLeft;
1092 buttonText.PivotPoint = NUI.PivotPoint.CenterLeft;
1093 buttonText.Position2D = new Position2D(textPaddingEnd, 0);
1097 case IconOrientation.Right:
1098 if (LayoutDirection == ViewLayoutDirectionType.RTL)
1100 buttonIcon.PositionUsesPivotPoint = true;
1101 buttonIcon.ParentOrigin = NUI.ParentOrigin.CenterLeft;
1102 buttonIcon.PivotPoint = NUI.PivotPoint.CenterLeft;
1103 buttonIcon.Position2D = new Position2D(iconPaddingEnd, 0);
1105 buttonText.PositionUsesPivotPoint = true;
1106 buttonText.ParentOrigin = NUI.ParentOrigin.CenterRight;
1107 buttonText.PivotPoint = NUI.PivotPoint.CenterRight;
1108 buttonText.Position2D = new Position2D(-textPaddingStart, 0);
1112 buttonIcon.PositionUsesPivotPoint = true;
1113 buttonIcon.ParentOrigin = NUI.ParentOrigin.CenterRight;
1114 buttonIcon.PivotPoint = NUI.PivotPoint.CenterRight;
1115 buttonIcon.Position2D = new Position2D(-iconPaddingEnd, 0);
1117 buttonText.PositionUsesPivotPoint = true;
1118 buttonText.ParentOrigin = NUI.ParentOrigin.CenterLeft;
1119 buttonText.PivotPoint = NUI.PivotPoint.CenterLeft;
1120 buttonText.Position2D = new Position2D(textPaddingStart, 0);
1126 if (string.IsNullOrEmpty(buttonText.Text))
1128 buttonIcon.ParentOrigin = NUI.ParentOrigin.Center;
1129 buttonIcon.PivotPoint = NUI.PivotPoint.Center;
1133 /// Theme change callback when theme is changed, this callback will be trigger.
1135 /// <param name="sender">The sender</param>
1136 /// <param name="e">The event data</param>
1137 /// <since_tizen> 8 </since_tizen>
1138 protected override void OnThemeChangedEvent(object sender, StyleManager.ThemeChangeEventArgs e)
1140 ButtonStyle buttonStyle = StyleManager.Instance.GetViewStyle(style) as ButtonStyle;
1141 if (buttonStyle != null)
1143 Style.CopyFrom(buttonStyle);
1148 private void UpdateUIContent()
1153 Sensitive = isEnabled;
1156 private void OnLayoutDirectionChanged(object sender, LayoutDirectionChangedEventArgs e)
1162 private void OnClickInternal(ClickEventArgs eventArgs)
1165 Extension?.OnClick(this, eventArgs);
1166 ClickEvent?.Invoke(this, eventArgs);
1169 private void OnIconRelayout(object sender, EventArgs e)
1176 /// ClickEventArgs is a class to record button click event arguments which will sent to user.
1178 /// <since_tizen> 6 </since_tizen>
1179 public class ClickEventArgs : EventArgs
1183 /// StateChangeEventArgs is a class to record button state change event arguments which will sent to user.
1185 /// <since_tizen> 6 </since_tizen>
1186 public class StateChangedEventArgs : EventArgs
1188 /// <summary> previous state of Button </summary>
1189 /// <since_tizen> 6 </since_tizen>
1190 public ControlStates PreviousState;
1191 /// <summary> current state of Button </summary>
1192 /// <since_tizen> 6 </since_tizen>
1193 public ControlStates CurrentState;
1197 /// Get current text part to the attached ButtonExtension.
1200 /// It returns null if the passed extension is invaild.
1202 /// <param name="extension">The extension instance that is currently attached to this Button.</param>
1203 /// <return>The button's text part.</return>
1204 [EditorBrowsable(EditorBrowsableState.Never)]
1205 public TextLabel GetCurrentText(ButtonExtension extension)
1207 return (extension == Extension) ? ButtonText : null;
1211 /// Get current icon part to the attached ButtonExtension.
1214 /// It returns null if the passed extension is invaild.
1216 /// <param name="extension">The extension instance that is currently attached to this Button.</param>
1217 /// <return>The button's icon part.</return>
1218 [EditorBrowsable(EditorBrowsableState.Never)]
1219 public ImageView GetCurrentIcon(ButtonExtension extension)
1221 return (extension == Extension) ? ButtonIcon : null;
1225 /// Get current overlay image part to the attached ButtonExtension.
1228 /// It returns null if the passed extension is invaild.
1230 /// <param name="extension">The extension instance that is currently attached to this Button.</param>
1231 /// <return>The button's overlay image part.</return>
1232 [EditorBrowsable(EditorBrowsableState.Never)]
1233 public ImageView GetCurrentOverlayImage(ButtonExtension extension)
1235 return (extension == Extension) ? ButtonOverlayImage : null;