2 * Copyright(c) 2019 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;
21 namespace Tizen.NUI.Components
24 /// Button is one kind of common component, a button clearly describes what action will occur when the user selects it.
25 /// Button may contain text or an icon.
27 /// <since_tizen> 6 </since_tizen>
28 public class Button : Control
30 private ImageView backgroundImage;
31 private ImageView shadowImage;
32 private ImageView overlayImage;
34 private TextLabel buttonText;
35 private ImageView buttonIcon;
37 private ButtonAttributes buttonAttributes;
38 private EventHandler<StateChangedEventArgs> stateChangeHander;
40 private bool isSelected = false;
41 private bool isEnabled = true;
42 private bool isPressed = false;
44 private Extents iconPadding = null;
45 private Extents textPadding = null;
48 /// Creates a new instance of a Button.
50 /// <since_tizen> 6 </since_tizen>
51 public Button() : base()
56 /// Creates a new instance of a Button with style.
58 /// <param name="style">Create Button by special style defined in UX.</param>
59 /// <since_tizen> 6 </since_tizen>
60 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
61 [EditorBrowsable(EditorBrowsableState.Never)]
62 public Button(string style) : base(style)
67 /// Creates a new instance of a Button with attributes.
69 /// <param name="attributes">Create Button by attributes customized by user.</param>
70 /// <since_tizen> 6 </since_tizen>
71 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
72 [EditorBrowsable(EditorBrowsableState.Never)]
73 public Button(ButtonAttributes attributes) : base(attributes)
78 /// An event for the button clicked signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
80 /// <since_tizen> 6 </since_tizen>
81 public event EventHandler<ClickEventArgs> ClickEvent;
83 /// An event for the button state changed signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
85 /// <since_tizen> 6 </since_tizen>
86 public event EventHandler<StateChangedEventArgs> StateChangedEvent
90 stateChangeHander += value;
94 stateChangeHander -= value;
100 /// <since_tizen> 6 </since_tizen>
101 public enum IconOrientation
106 /// <since_tizen> 6 </since_tizen>
111 /// <since_tizen> 6 </since_tizen>
116 /// <since_tizen> 6 </since_tizen>
121 /// <since_tizen> 6 </since_tizen>
125 /// Flag to decide Button can be selected or not.
127 /// <since_tizen> 6 </since_tizen>
128 public bool IsSelectable
132 return buttonAttributes?.IsSelectable ?? false;
136 buttonAttributes.IsSelectable = value;
140 /// Background image's resource url in Button.
142 /// <since_tizen> 6 </since_tizen>
143 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
144 [EditorBrowsable(EditorBrowsableState.Never)]
145 public string BackgroundImageURL
149 return buttonAttributes?.BackgroundImageAttributes?.ResourceURL?.All;
155 CreateBackgroundAttributes();
156 if (buttonAttributes.BackgroundImageAttributes.ResourceURL == null)
158 buttonAttributes.BackgroundImageAttributes.ResourceURL = new StringSelector();
160 buttonAttributes.BackgroundImageAttributes.ResourceURL.All = value;
166 /// Background image's border in Button.
168 /// <since_tizen> 6 </since_tizen>
169 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
170 [EditorBrowsable(EditorBrowsableState.Never)]
171 public Rectangle BackgroundImageBorder
175 return buttonAttributes?.BackgroundImageAttributes?.Border?.All;
181 CreateBackgroundAttributes();
182 if (buttonAttributes.BackgroundImageAttributes.Border == null)
184 buttonAttributes.BackgroundImageAttributes.Border = new RectangleSelector();
186 buttonAttributes.BackgroundImageAttributes.Border.All = value;
192 /// Shadow image's resource url in Button.
194 /// <since_tizen> 6 </since_tizen>
195 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
196 [EditorBrowsable(EditorBrowsableState.Never)]
197 public string ShadowImageURL
201 return buttonAttributes?.ShadowImageAttributes?.ResourceURL?.All;
207 CreateShadowAttributes();
208 if (buttonAttributes.ShadowImageAttributes.ResourceURL == null)
210 buttonAttributes.ShadowImageAttributes.ResourceURL = new StringSelector();
212 buttonAttributes.ShadowImageAttributes.ResourceURL.All = value;
218 /// Shadow image's border in Button.
220 /// <since_tizen> 6 </since_tizen>
221 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
222 [EditorBrowsable(EditorBrowsableState.Never)]
223 public Rectangle ShadowImageBorder
227 return buttonAttributes?.ShadowImageAttributes?.Border?.All;
233 CreateShadowAttributes();
234 if (buttonAttributes.ShadowImageAttributes.Border == null)
236 buttonAttributes.ShadowImageAttributes.Border = new RectangleSelector();
238 buttonAttributes.ShadowImageAttributes.Border.All = value;
244 /// Overlay image's resource url in Button.
246 /// <since_tizen> 6 </since_tizen>
247 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
248 [EditorBrowsable(EditorBrowsableState.Never)]
249 public string OverlayImageURL
253 return buttonAttributes?.OverlayImageAttributes?.ResourceURL?.All;
259 CreateOverlayAttributes();
260 if (buttonAttributes.OverlayImageAttributes.ResourceURL == null)
262 buttonAttributes.OverlayImageAttributes.ResourceURL = new StringSelector();
264 buttonAttributes.OverlayImageAttributes.ResourceURL.All = value;
270 /// Overlay image's border in Button.
272 /// <since_tizen> 6 </since_tizen>
273 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
274 [EditorBrowsable(EditorBrowsableState.Never)]
275 public Rectangle OverlayImageBorder
279 return buttonAttributes?.OverlayImageAttributes?.Border?.All;
285 CreateOverlayAttributes();
286 if (buttonAttributes.OverlayImageAttributes.Border == null)
288 buttonAttributes.OverlayImageAttributes.Border = new RectangleSelector();
290 buttonAttributes.OverlayImageAttributes.Border.All = value;
296 /// Text string in Button.
298 /// <since_tizen> 6 </since_tizen>
303 return buttonAttributes?.TextAttributes?.Text?.All;
309 CreateTextAttributes();
310 if(buttonAttributes.TextAttributes.Text == null)
312 buttonAttributes.TextAttributes.Text = new StringSelector();
314 buttonAttributes.TextAttributes.Text.All = value;
321 /// Translate text string in Button.
323 /// <since_tizen> 6 </since_tizen>
324 public string TranslatableText
328 return buttonAttributes?.TextAttributes?.TranslatableText?.All;
334 CreateTextAttributes();
335 if (buttonAttributes.TextAttributes.TranslatableText == null)
337 buttonAttributes.TextAttributes.TranslatableText = new StringSelector();
339 buttonAttributes.TextAttributes.TranslatableText.All = value;
346 /// Text point size in Button.
348 /// <since_tizen> 6 </since_tizen>
349 public float PointSize
353 return buttonAttributes?.TextAttributes?.PointSize?.All ?? 0;
357 CreateTextAttributes();
358 if (buttonAttributes.TextAttributes.PointSize == null)
360 buttonAttributes.TextAttributes.PointSize = new FloatSelector();
362 buttonAttributes.TextAttributes.PointSize.All = value;
367 /// Text font family in Button.
369 /// <since_tizen> 6 </since_tizen>
370 public string FontFamily
374 return buttonAttributes?.TextAttributes?.FontFamily;
378 CreateTextAttributes();
379 buttonAttributes.TextAttributes.FontFamily = value;
384 /// Text color in Button.
386 /// <since_tizen> 6 </since_tizen>
387 public Color TextColor
391 return buttonAttributes?.TextAttributes?.TextColor?.All;
395 CreateTextAttributes();
396 if (buttonAttributes.TextAttributes.TextColor == null)
398 buttonAttributes.TextAttributes.TextColor = new ColorSelector();
400 buttonAttributes.TextAttributes.TextColor.All = value;
405 /// Text horizontal alignment in Button.
407 /// <since_tizen> 6 </since_tizen>
408 public HorizontalAlignment TextAlignment
412 return buttonAttributes?.TextAttributes?.HorizontalAlignment ?? HorizontalAlignment.Center;
416 CreateTextAttributes();
417 buttonAttributes.TextAttributes.HorizontalAlignment = value;
422 /// Icon image's resource url in Button.
424 /// <since_tizen> 6 </since_tizen>
425 public string IconURL
429 return buttonAttributes?.IconAttributes?.ResourceURL?.All;
435 CreateIconAttributes();
436 if (buttonAttributes.IconAttributes.ResourceURL == null)
438 buttonAttributes.IconAttributes.ResourceURL = new StringSelector();
440 buttonAttributes.IconAttributes.ResourceURL.All = value;
446 /// Text string selector in Button.
448 /// <since_tizen> 6 </since_tizen>
449 public StringSelector TextSelector
453 return buttonAttributes?.TextAttributes?.Text;
459 CreateTextAttributes();
460 buttonAttributes.TextAttributes.Text = value.Clone() as StringSelector;
466 /// Translateable text string selector in Button.
468 /// <since_tizen> 6 </since_tizen>
469 public StringSelector TranslatableTextSelector
473 return buttonAttributes?.TextAttributes?.TranslatableText;
479 CreateTextAttributes();
480 buttonAttributes.TextAttributes.TranslatableText = value.Clone() as StringSelector;
486 /// Text color selector in Button.
488 /// <since_tizen> 6 </since_tizen>
489 public ColorSelector TextColorSelector
493 return buttonAttributes?.TextAttributes?.TextColor;
499 CreateTextAttributes();
500 buttonAttributes.TextAttributes.TextColor = value.Clone() as ColorSelector;
506 /// Text font size selector in Button.
508 /// <since_tizen> 6 </since_tizen>
509 public FloatSelector PointSizeSelector
513 return buttonAttributes?.TextAttributes?.PointSize;
519 CreateTextAttributes();
520 buttonAttributes.TextAttributes.PointSize = value.Clone() as FloatSelector;
526 /// Icon image's resource url selector in Button.
528 /// <since_tizen> 6 </since_tizen>
529 public StringSelector IconURLSelector
533 return buttonAttributes?.IconAttributes?.ResourceURL;
539 CreateIconAttributes();
540 buttonAttributes.IconAttributes.ResourceURL = value.Clone() as StringSelector;
546 /// Background image's resource url selector in Button.
548 /// <since_tizen> 6 </since_tizen>
549 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
550 [EditorBrowsable(EditorBrowsableState.Never)]
551 public StringSelector BackgroundImageURLSelector
555 return buttonAttributes?.BackgroundImageAttributes?.ResourceURL;
561 CreateBackgroundAttributes();
562 buttonAttributes.BackgroundImageAttributes.ResourceURL = value.Clone() as StringSelector;
568 /// Background image's border selector in Button.
570 /// <since_tizen> 6 </since_tizen>
571 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
572 [EditorBrowsable(EditorBrowsableState.Never)]
573 public RectangleSelector BackgroundImageBorderSelector
577 return buttonAttributes?.BackgroundImageAttributes?.Border;
583 CreateBackgroundAttributes();
584 buttonAttributes.BackgroundImageAttributes.Border = value.Clone() as RectangleSelector;
590 /// Shadow image's resource url selector in Button.
592 /// <since_tizen> 6 </since_tizen>
593 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
594 [EditorBrowsable(EditorBrowsableState.Never)]
595 public StringSelector ShadowImageURLSelector
599 return buttonAttributes?.ShadowImageAttributes?.ResourceURL;
605 CreateShadowAttributes();
606 buttonAttributes.ShadowImageAttributes.ResourceURL = value.Clone() as StringSelector;
612 /// Shadow image's border selector in Button.
614 /// <since_tizen> 6 </since_tizen>
615 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
616 [EditorBrowsable(EditorBrowsableState.Never)]
617 public RectangleSelector ShadowImageBorderSelector
621 return buttonAttributes?.ShadowImageAttributes?.Border;
627 CreateShadowAttributes();
628 buttonAttributes.ShadowImageAttributes.Border = value.Clone() as RectangleSelector;
634 /// Overlay image's resource url selector in Button.
636 /// <since_tizen> 6 </since_tizen>
637 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
638 [EditorBrowsable(EditorBrowsableState.Never)]
639 public StringSelector OverlayImageURLSelector
643 return buttonAttributes?.OverlayImageAttributes?.ResourceURL;
649 CreateOverlayAttributes();
650 buttonAttributes.OverlayImageAttributes.ResourceURL = value.Clone() as StringSelector;
656 /// Overlay image's border selector in Button.
658 /// <since_tizen> 6 </since_tizen>
659 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
660 [EditorBrowsable(EditorBrowsableState.Never)]
661 public RectangleSelector OverlayImageBorderSelector
665 return buttonAttributes?.OverlayImageAttributes?.Border;
671 CreateOverlayAttributes();
672 buttonAttributes.OverlayImageAttributes.Border = value.Clone() as RectangleSelector;
678 /// Flag to decide selected state in Button.
680 /// <since_tizen> 6 </since_tizen>
681 public bool IsSelected
694 /// Flag to decide enable or disable in Button.
696 /// <since_tizen> 6 </since_tizen>
697 public bool IsEnabled
711 /// Icon relative orientation in Button, work only when show icon and text.
713 /// <since_tizen> 6 </since_tizen>
714 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
715 [EditorBrowsable(EditorBrowsableState.Never)]
716 public IconOrientation? IconRelativeOrientation
720 return buttonAttributes?.IconRelativeOrientation;
724 if(buttonAttributes != null && buttonAttributes.IconRelativeOrientation != value)
726 buttonAttributes.IconRelativeOrientation = value;
733 /// Icon padding in Button, work only when show icon and text.
735 /// <since_tizen> 6 </since_tizen>
736 public Extents IconPadding
746 CreateIconAttributes();
747 buttonAttributes.IconAttributes.Padding.CopyFrom(value);
749 if (null == iconPadding)
751 iconPadding = new Extents((ushort start, ushort end, ushort top, ushort bottom) =>
753 buttonAttributes.IconAttributes.Padding.Start = start;
754 buttonAttributes.IconAttributes.Padding.End = end;
755 buttonAttributes.IconAttributes.Padding.Top = top;
756 buttonAttributes.IconAttributes.Padding.Bottom = bottom;
758 }, value.Start, value.End, value.Top, value.Bottom);
762 iconPadding.CopyFrom(value);
771 /// Text padding in Button, work only when show icon and text.
773 /// <since_tizen> 6 </since_tizen>
774 public Extents TextPadding
784 CreateTextAttributes();
786 buttonAttributes.TextAttributes.Padding.CopyFrom(value);
788 if (null == textPadding)
790 textPadding = new Extents((ushort start, ushort end, ushort top, ushort bottom) =>
792 buttonAttributes.TextAttributes.Padding.Start = start;
793 buttonAttributes.TextAttributes.Padding.End = end;
794 buttonAttributes.TextAttributes.Padding.Top = top;
795 buttonAttributes.TextAttributes.Padding.Bottom = bottom;
797 }, value.Start, value.End, value.Top, value.Bottom);
801 textPadding.CopyFrom(value);
810 /// Dispose Button and all children on it.
812 /// <param name="type">Dispose type.</param>
813 /// <since_tizen> 6 </since_tizen>
814 protected override void Dispose(DisposeTypes type)
821 if (type == DisposeTypes.Explicit)
823 if (buttonIcon != null)
825 buttonIcon.Relayout -= OnIconRelayout;
826 Utility.Dispose(buttonIcon);
828 if (buttonText != null)
830 Utility.Dispose(buttonText);
832 if (overlayImage != null)
834 Utility.Dispose(overlayImage);
836 if (backgroundImage != null)
838 Utility.Dispose(backgroundImage);
840 if (shadowImage != null)
842 Utility.Dispose(shadowImage);
849 /// Called after a key event is received by the view that has had its focus set.
851 /// <param name="key">The key event.</param>
852 /// <returns>True if the key event should be consumed.</returns>
853 /// <since_tizen> 6 </since_tizen>
854 public override bool OnKey(Key key)
856 if (key.State == Key.StateType.Down)
858 if (key.KeyPressedName == "Return")
864 ClickEventArgs eventArgs = new ClickEventArgs();
869 else if (key.State == Key.StateType.Up)
871 if (key.KeyPressedName == "Return")
874 if (buttonAttributes.IsSelectable != null && buttonAttributes.IsSelectable == true)
876 isSelected = !isSelected;
881 return base.OnKey(key);
885 /// 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.
887 /// <since_tizen> 6 </since_tizen>
888 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
889 [EditorBrowsable(EditorBrowsableState.Never)]
890 public override void OnFocusGained()
892 base.OnFocusGained();
896 /// 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.
898 /// <since_tizen> 6 </since_tizen>
899 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
900 [EditorBrowsable(EditorBrowsableState.Never)]
901 public override void OnFocusLost()
908 /// Tap gesture event callback.
910 /// <param name="source">Source which recieved touch event.</param>
911 /// <param name="e">Tap gesture event argument.</param>
912 /// <since_tizen> 6 </since_tizen>
913 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
914 [EditorBrowsable(EditorBrowsableState.Never)]
915 protected override void OnTapGestureDetected(object source, TapGestureDetector.DetectedEventArgs e)
919 ClickEventArgs eventArgs = new ClickEventArgs();
921 base.OnTapGestureDetected(source, e);
925 /// Called after a touch event is received by the owning view.<br />
926 /// CustomViewBehaviour.REQUIRES_TOUCH_EVENTS must be enabled during construction. See CustomView(ViewWrapperImpl.CustomViewBehaviour behaviour).<br />
928 /// <param name="touch">The touch event.</param>
929 /// <returns>True if the event should be consumed.</returns>
930 /// <since_tizen> 6 </since_tizen>
931 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
932 [EditorBrowsable(EditorBrowsableState.Never)]
933 public override bool OnTouch(Touch touch)
935 PointStateType state = touch.GetState(0);
939 case PointStateType.Down:
943 case PointStateType.Interrupted:
947 case PointStateType.Up:
949 if (buttonAttributes.IsSelectable != null && buttonAttributes.IsSelectable == true)
951 isSelected = !isSelected;
958 return base.OnTouch(touch);
961 /// Get Button attribues.
963 /// <since_tizen> 6 </since_tizen>
964 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
965 [EditorBrowsable(EditorBrowsableState.Never)]
966 protected override Attributes GetAttributes()
968 return new ButtonAttributes();
971 /// Update Button by attributes.
973 /// <since_tizen> 6 </since_tizen>
974 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
975 [EditorBrowsable(EditorBrowsableState.Never)]
976 protected override void OnUpdate()
978 if (buttonAttributes.ShadowImageAttributes != null)
980 if(shadowImage == null)
982 shadowImage = new ImageView()
984 WidthResizePolicy = ResizePolicyType.FillToParent,
985 HeightResizePolicy = ResizePolicyType.FillToParent
987 this.Add(shadowImage);
989 ApplyAttributes(shadowImage, buttonAttributes.ShadowImageAttributes);
992 if (buttonAttributes.BackgroundImageAttributes != null)
994 if(backgroundImage == null)
996 backgroundImage = new ImageView()
998 WidthResizePolicy = ResizePolicyType.FillToParent,
999 HeightResizePolicy = ResizePolicyType.FillToParent
1001 this.Add(backgroundImage);
1003 ApplyAttributes(backgroundImage, buttonAttributes.BackgroundImageAttributes);
1006 if (buttonAttributes.OverlayImageAttributes != null)
1008 if(overlayImage == null)
1010 overlayImage = new ImageView()
1012 WidthResizePolicy = ResizePolicyType.FillToParent,
1013 HeightResizePolicy = ResizePolicyType.FillToParent
1015 this.Add(overlayImage);
1017 ApplyAttributes(overlayImage, buttonAttributes.OverlayImageAttributes);
1020 if (buttonAttributes.TextAttributes != null)
1022 if(buttonText == null)
1024 buttonText = new TextLabel();
1025 this.Add(buttonText);
1027 ApplyAttributes(buttonText, buttonAttributes.TextAttributes);
1030 if (buttonAttributes.IconAttributes != null)
1032 if(buttonIcon == null)
1034 buttonIcon = new ImageView();
1035 buttonIcon.Relayout += OnIconRelayout;
1036 this.Add(buttonIcon);
1038 ApplyAttributes(buttonIcon, buttonAttributes.IconAttributes);
1044 Sensitive = isEnabled ? true : false;
1048 /// Update Button State.
1050 /// <since_tizen> 6 </since_tizen>
1051 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
1052 [EditorBrowsable(EditorBrowsableState.Never)]
1053 protected void UpdateState()
1055 ControlStates sourceState = State;
1056 ControlStates targetState;
1060 targetState = isPressed ? ControlStates.Pressed : (IsFocused ? (IsSelected ? ControlStates.SelectedFocused : ControlStates.Focused) : (IsSelected ? ControlStates.Selected : ControlStates.Normal));
1064 targetState = IsSelected ? ControlStates.DisabledSelected : (IsFocused ? ControlStates.DisabledFocused : ControlStates.Disabled);
1066 if(sourceState != targetState)
1068 State = targetState;
1072 StateChangedEventArgs e = new StateChangedEventArgs
1074 PreviousState = sourceState,
1075 CurrentState = targetState
1077 stateChangeHander?.Invoke(this, e);
1081 /// It is hijack by using protected, attributes copy problem when class inherited from Button.
1083 /// <since_tizen> 6 </since_tizen>
1084 private void Initialize()
1086 buttonAttributes = attributes as ButtonAttributes;
1087 if (buttonAttributes == null)
1089 throw new Exception("Button attribute parse error.");
1092 ApplyAttributes(this, buttonAttributes);
1093 LayoutDirectionChanged += OnLayoutDirectionChanged;
1097 /// Measure text, it can be override.
1099 /// <since_tizen> 6 </since_tizen>
1100 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
1101 [EditorBrowsable(EditorBrowsableState.Never)]
1102 protected virtual void MeasureText()
1104 if (buttonAttributes.IconRelativeOrientation == null || buttonIcon == null || buttonText == null)
1108 buttonText.WidthResizePolicy = ResizePolicyType.Fixed;
1109 buttonText.HeightResizePolicy = ResizePolicyType.Fixed;
1110 int textPaddingStart = buttonAttributes.TextAttributes.Padding.Start;
1111 int textPaddingEnd = buttonAttributes.TextAttributes.Padding.End;
1112 int textPaddingTop = buttonAttributes.TextAttributes.Padding.Top;
1113 int textPaddingBottom = buttonAttributes.TextAttributes.Padding.Bottom;
1115 int iconPaddingStart = buttonAttributes.IconAttributes.Padding.Start;
1116 int iconPaddingEnd = buttonAttributes.IconAttributes.Padding.End;
1117 int iconPaddingTop = buttonAttributes.IconAttributes.Padding.Top;
1118 int iconPaddingBottom = buttonAttributes.IconAttributes.Padding.Bottom;
1120 if (IconRelativeOrientation == IconOrientation.Top || IconRelativeOrientation == IconOrientation.Bottom)
1122 buttonText.SizeWidth = SizeWidth - textPaddingStart - textPaddingEnd;
1123 buttonText.SizeHeight = SizeHeight - textPaddingTop - textPaddingBottom - iconPaddingTop - iconPaddingBottom - buttonIcon.SizeHeight;
1127 buttonText.SizeWidth = SizeWidth - textPaddingStart - textPaddingEnd - iconPaddingStart - iconPaddingEnd - buttonIcon.SizeWidth;
1128 buttonText.SizeHeight = SizeHeight - textPaddingTop - textPaddingBottom;
1132 /// Layout child, it can be override.
1134 /// <since_tizen> 6 </since_tizen>
1135 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
1136 [EditorBrowsable(EditorBrowsableState.Never)]
1137 protected virtual void LayoutChild()
1139 if (buttonAttributes.IconRelativeOrientation == null || buttonIcon == null || buttonText == null)
1144 int textPaddingStart = buttonAttributes.TextAttributes.Padding.Start;
1145 int textPaddingEnd = buttonAttributes.TextAttributes.Padding.End;
1146 int textPaddingTop = buttonAttributes.TextAttributes.Padding.Top;
1147 int textPaddingBottom = buttonAttributes.TextAttributes.Padding.Bottom;
1149 int iconPaddingStart = buttonAttributes.IconAttributes.Padding.Start;
1150 int iconPaddingEnd = buttonAttributes.IconAttributes.Padding.End;
1151 int iconPaddingTop = buttonAttributes.IconAttributes.Padding.Top;
1152 int iconPaddingBottom = buttonAttributes.IconAttributes.Padding.Bottom;
1154 switch (IconRelativeOrientation)
1156 case IconOrientation.Top:
1157 buttonIcon.PositionUsesPivotPoint = true;
1158 buttonIcon.ParentOrigin = NUI.ParentOrigin.TopCenter;
1159 buttonIcon.PivotPoint = NUI.PivotPoint.TopCenter;
1160 buttonIcon.Position2D = new Position2D(0, iconPaddingTop);
1162 buttonText.PositionUsesPivotPoint = true;
1163 buttonText.ParentOrigin = NUI.ParentOrigin.BottomCenter;
1164 buttonText.PivotPoint = NUI.PivotPoint.BottomCenter;
1165 buttonText.Position2D = new Position2D(0, -textPaddingBottom);
1167 case IconOrientation.Bottom:
1168 buttonIcon.PositionUsesPivotPoint = true;
1169 buttonIcon.ParentOrigin = NUI.ParentOrigin.BottomCenter;
1170 buttonIcon.PivotPoint = NUI.PivotPoint.BottomCenter;
1171 buttonIcon.Position2D = new Position2D(0, -iconPaddingBottom);
1173 buttonText.PositionUsesPivotPoint = true;
1174 buttonText.ParentOrigin = NUI.ParentOrigin.TopCenter;
1175 buttonText.PivotPoint = NUI.PivotPoint.TopCenter;
1176 buttonText.Position2D = new Position2D(0, textPaddingTop);
1178 case IconOrientation.Left:
1179 if (LayoutDirection == ViewLayoutDirectionType.LTR)
1181 buttonIcon.PositionUsesPivotPoint = true;
1182 buttonIcon.ParentOrigin = NUI.ParentOrigin.CenterLeft;
1183 buttonIcon.PivotPoint = NUI.PivotPoint.CenterLeft;
1184 buttonIcon.Position2D = new Position2D(iconPaddingStart, 0);
1186 buttonText.PositionUsesPivotPoint = true;
1187 buttonText.ParentOrigin = NUI.ParentOrigin.CenterRight;
1188 buttonText.PivotPoint = NUI.PivotPoint.CenterRight;
1189 buttonText.Position2D = new Position2D(-textPaddingEnd, 0);
1193 buttonIcon.PositionUsesPivotPoint = true;
1194 buttonIcon.ParentOrigin = NUI.ParentOrigin.CenterRight;
1195 buttonIcon.PivotPoint = NUI.PivotPoint.CenterRight;
1196 buttonIcon.Position2D = new Position2D(-iconPaddingStart, 0);
1198 buttonText.PositionUsesPivotPoint = true;
1199 buttonText.ParentOrigin = NUI.ParentOrigin.CenterLeft;
1200 buttonText.PivotPoint = NUI.PivotPoint.CenterLeft;
1201 buttonText.Position2D = new Position2D(textPaddingEnd, 0);
1205 case IconOrientation.Right:
1206 if (LayoutDirection == ViewLayoutDirectionType.RTL)
1208 buttonIcon.PositionUsesPivotPoint = true;
1209 buttonIcon.ParentOrigin = NUI.ParentOrigin.CenterLeft;
1210 buttonIcon.PivotPoint = NUI.PivotPoint.CenterLeft;
1211 buttonIcon.Position2D = new Position2D(iconPaddingEnd, 0);
1213 buttonText.PositionUsesPivotPoint = true;
1214 buttonText.ParentOrigin = NUI.ParentOrigin.CenterRight;
1215 buttonText.PivotPoint = NUI.PivotPoint.CenterRight;
1216 buttonText.Position2D = new Position2D(-textPaddingStart, 0);
1220 buttonIcon.PositionUsesPivotPoint = true;
1221 buttonIcon.ParentOrigin = NUI.ParentOrigin.CenterRight;
1222 buttonIcon.PivotPoint = NUI.PivotPoint.CenterRight;
1223 buttonIcon.Position2D = new Position2D(-iconPaddingEnd, 0);
1225 buttonText.PositionUsesPivotPoint = true;
1226 buttonText.ParentOrigin = NUI.ParentOrigin.CenterLeft;
1227 buttonText.PivotPoint = NUI.PivotPoint.CenterLeft;
1228 buttonText.Position2D = new Position2D(textPaddingStart, 0);
1236 /// Theme change callback when theme is changed, this callback will be trigger.
1238 /// <since_tizen> 6 </since_tizen>
1239 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
1240 [EditorBrowsable(EditorBrowsableState.Never)]
1241 protected override void OnThemeChangedEvent(object sender, StyleManager.ThemeChangeEventArgs e)
1243 ButtonAttributes tempAttributes = StyleManager.Instance.GetAttributes(style) as ButtonAttributes;
1244 if(tempAttributes != null)
1246 attributes = buttonAttributes = tempAttributes;
1251 private void OnLayoutDirectionChanged(object sender, LayoutDirectionChangedEventArgs e)
1257 private void OnClick(ClickEventArgs eventArgs)
1259 ClickEvent?.Invoke(this, eventArgs);
1262 private void OnIconRelayout(object sender, EventArgs e)
1268 private void CreateBackgroundAttributes()
1270 if (buttonAttributes.BackgroundImageAttributes == null)
1272 buttonAttributes.BackgroundImageAttributes = new ImageAttributes()
1274 PositionUsesPivotPoint = true,
1275 ParentOrigin = Tizen.NUI.ParentOrigin.Center,
1276 PivotPoint = Tizen.NUI.PivotPoint.Center,
1277 WidthResizePolicy = ResizePolicyType.FillToParent,
1278 HeightResizePolicy = ResizePolicyType.FillToParent
1283 private void CreateShadowAttributes()
1285 if (buttonAttributes.ShadowImageAttributes == null)
1287 buttonAttributes.ShadowImageAttributes = new ImageAttributes()
1289 PositionUsesPivotPoint = true,
1290 ParentOrigin = Tizen.NUI.ParentOrigin.Center,
1291 PivotPoint = Tizen.NUI.PivotPoint.Center,
1292 WidthResizePolicy = ResizePolicyType.FillToParent,
1293 HeightResizePolicy = ResizePolicyType.FillToParent
1298 private void CreateOverlayAttributes()
1300 if (buttonAttributes.OverlayImageAttributes == null)
1302 buttonAttributes.OverlayImageAttributes = new ImageAttributes()
1304 PositionUsesPivotPoint = true,
1305 ParentOrigin = Tizen.NUI.ParentOrigin.Center,
1306 PivotPoint = Tizen.NUI.PivotPoint.Center,
1307 WidthResizePolicy = ResizePolicyType.FillToParent,
1308 HeightResizePolicy = ResizePolicyType.FillToParent
1313 private void CreateTextAttributes()
1315 if (buttonAttributes.TextAttributes == null)
1317 buttonAttributes.TextAttributes = new TextAttributes()
1319 PositionUsesPivotPoint = true,
1320 ParentOrigin = Tizen.NUI.ParentOrigin.Center,
1321 PivotPoint = Tizen.NUI.PivotPoint.Center,
1322 WidthResizePolicy = ResizePolicyType.FillToParent,
1323 HeightResizePolicy = ResizePolicyType.FillToParent,
1324 HorizontalAlignment = HorizontalAlignment.Center,
1325 VerticalAlignment = VerticalAlignment.Center
1330 private void CreateIconAttributes()
1332 if (buttonAttributes.IconAttributes == null)
1334 buttonAttributes.IconAttributes = new ImageAttributes()
1336 PositionUsesPivotPoint = true,
1337 ParentOrigin = Tizen.NUI.ParentOrigin.Center,
1338 PivotPoint = Tizen.NUI.PivotPoint.Center,
1339 WidthResizePolicy = ResizePolicyType.UseNaturalSize,
1340 HeightResizePolicy = ResizePolicyType.UseNaturalSize,
1345 /// ClickEventArgs is a class to record button click event arguments which will sent to user.
1347 /// <since_tizen> 6 </since_tizen>
1348 public class ClickEventArgs : EventArgs
1352 /// StateChangeEventArgs is a class to record button state change event arguments which will sent to user.
1354 /// <since_tizen> 6 </since_tizen>
1355 public class StateChangedEventArgs : EventArgs
1357 /// <summary> previous state of Button </summary>
1358 /// <since_tizen> 6 </since_tizen>
1359 public ControlStates PreviousState;
1360 /// <summary> current state of Button </summary>
1361 /// <since_tizen> 6 </since_tizen>
1362 public ControlStates CurrentState;