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 /// Creates a new instance of a Button.
46 /// <since_tizen> 6 </since_tizen>
47 public Button() : base()
52 /// Creates a new instance of a Button with style.
54 /// <param name="style">Create Button by special style defined in UX.</param>
55 /// <since_tizen> 6 </since_tizen>
56 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
57 [EditorBrowsable(EditorBrowsableState.Never)]
58 public Button(string style) : base(style)
63 /// Creates a new instance of a Button with attributes.
65 /// <param name="attributes">Create Button by attributes customized by user.</param>
66 /// <since_tizen> 6 </since_tizen>
67 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
68 [EditorBrowsable(EditorBrowsableState.Never)]
69 public Button(ButtonAttributes attributes) : base(attributes)
74 /// An event for the button clicked signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
76 /// <since_tizen> 6 </since_tizen>
77 public event EventHandler<ClickEventArgs> ClickEvent;
79 /// An event for the button state changed signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
81 /// <since_tizen> 6 </since_tizen>
82 public event EventHandler<StateChangedEventArgs> StateChangedEvent
86 stateChangeHander += value;
90 stateChangeHander -= value;
96 /// <since_tizen> 6 </since_tizen>
97 public enum IconOrientation
102 /// <since_tizen> 6 </since_tizen>
107 /// <since_tizen> 6 </since_tizen>
112 /// <since_tizen> 6 </since_tizen>
117 /// <since_tizen> 6 </since_tizen>
121 /// Flag to decide Button can be selected or not.
123 /// <since_tizen> 6 </since_tizen>
124 public bool IsSelectable
128 return buttonAttributes?.IsSelectable ?? false;
132 buttonAttributes.IsSelectable = value;
136 /// Background image's resource url in Button.
138 /// <since_tizen> 6 </since_tizen>
139 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
140 [EditorBrowsable(EditorBrowsableState.Never)]
141 public string BackgroundImageURL
145 return buttonAttributes?.BackgroundImageAttributes?.ResourceURL?.All;
151 CreateBackgroundAttributes();
152 if (buttonAttributes.BackgroundImageAttributes.ResourceURL == null)
154 buttonAttributes.BackgroundImageAttributes.ResourceURL = new StringSelector();
156 buttonAttributes.BackgroundImageAttributes.ResourceURL.All = value;
162 /// Background image's border in Button.
164 /// <since_tizen> 6 </since_tizen>
165 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
166 [EditorBrowsable(EditorBrowsableState.Never)]
167 public Rectangle BackgroundImageBorder
171 return buttonAttributes?.BackgroundImageAttributes?.Border?.All;
177 CreateBackgroundAttributes();
178 if (buttonAttributes.BackgroundImageAttributes.Border == null)
180 buttonAttributes.BackgroundImageAttributes.Border = new RectangleSelector();
182 buttonAttributes.BackgroundImageAttributes.Border.All = value;
188 /// Shadow image's resource url in Button.
190 /// <since_tizen> 6 </since_tizen>
191 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
192 [EditorBrowsable(EditorBrowsableState.Never)]
193 public string ShadowImageURL
197 return buttonAttributes?.ShadowImageAttributes?.ResourceURL?.All;
203 CreateShadowAttributes();
204 if (buttonAttributes.ShadowImageAttributes.ResourceURL == null)
206 buttonAttributes.ShadowImageAttributes.ResourceURL = new StringSelector();
208 buttonAttributes.ShadowImageAttributes.ResourceURL.All = value;
214 /// Shadow image's border in Button.
216 /// <since_tizen> 6 </since_tizen>
217 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
218 [EditorBrowsable(EditorBrowsableState.Never)]
219 public Rectangle ShadowImageBorder
223 return buttonAttributes?.ShadowImageAttributes?.Border?.All;
229 CreateShadowAttributes();
230 if (buttonAttributes.ShadowImageAttributes.Border == null)
232 buttonAttributes.ShadowImageAttributes.Border = new RectangleSelector();
234 buttonAttributes.ShadowImageAttributes.Border.All = value;
240 /// Overlay image's resource url in Button.
242 /// <since_tizen> 6 </since_tizen>
243 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
244 [EditorBrowsable(EditorBrowsableState.Never)]
245 public string OverlayImageURL
249 return buttonAttributes?.OverlayImageAttributes?.ResourceURL?.All;
255 CreateOverlayAttributes();
256 if (buttonAttributes.OverlayImageAttributes.ResourceURL == null)
258 buttonAttributes.OverlayImageAttributes.ResourceURL = new StringSelector();
260 buttonAttributes.OverlayImageAttributes.ResourceURL.All = value;
266 /// Overlay image's border in Button.
268 /// <since_tizen> 6 </since_tizen>
269 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
270 [EditorBrowsable(EditorBrowsableState.Never)]
271 public Rectangle OverlayImageBorder
275 return buttonAttributes?.OverlayImageAttributes?.Border?.All;
281 CreateOverlayAttributes();
282 if (buttonAttributes.OverlayImageAttributes.Border == null)
284 buttonAttributes.OverlayImageAttributes.Border = new RectangleSelector();
286 buttonAttributes.OverlayImageAttributes.Border.All = value;
292 /// Text string in Button.
294 /// <since_tizen> 6 </since_tizen>
299 return buttonAttributes?.TextAttributes?.Text?.All;
305 CreateTextAttributes();
306 if(buttonAttributes.TextAttributes.Text == null)
308 buttonAttributes.TextAttributes.Text = new StringSelector();
310 buttonAttributes.TextAttributes.Text.All = value;
317 /// Translate text string in Button.
319 /// <since_tizen> 6 </since_tizen>
320 public string TranslatableText
324 return buttonAttributes?.TextAttributes?.TranslatableText?.All;
330 CreateTextAttributes();
331 if (buttonAttributes.TextAttributes.TranslatableText == null)
333 buttonAttributes.TextAttributes.TranslatableText = new StringSelector();
335 buttonAttributes.TextAttributes.TranslatableText.All = value;
342 /// Text point size in Button.
344 /// <since_tizen> 6 </since_tizen>
345 public float PointSize
349 return buttonAttributes?.TextAttributes?.PointSize?.All ?? 0;
353 CreateTextAttributes();
354 if (buttonAttributes.TextAttributes.PointSize == null)
356 buttonAttributes.TextAttributes.PointSize = new FloatSelector();
358 buttonAttributes.TextAttributes.PointSize.All = value;
363 /// Text font family in Button.
365 /// <since_tizen> 6 </since_tizen>
366 public string FontFamily
370 return buttonAttributes?.TextAttributes?.FontFamily;
374 CreateTextAttributes();
375 buttonAttributes.TextAttributes.FontFamily = value;
380 /// Text color in Button.
382 /// <since_tizen> 6 </since_tizen>
383 public Color TextColor
387 return buttonAttributes?.TextAttributes?.TextColor?.All;
391 CreateTextAttributes();
392 if (buttonAttributes.TextAttributes.TextColor == null)
394 buttonAttributes.TextAttributes.TextColor = new ColorSelector();
396 buttonAttributes.TextAttributes.TextColor.All = value;
401 /// Text horizontal alignment in Button.
403 /// <since_tizen> 6 </since_tizen>
404 public HorizontalAlignment TextAlignment
408 return buttonAttributes?.TextAttributes?.HorizontalAlignment ?? HorizontalAlignment.Center;
412 CreateTextAttributes();
413 buttonAttributes.TextAttributes.HorizontalAlignment = value;
418 /// Icon image's resource url in Button.
420 /// <since_tizen> 6 </since_tizen>
421 public string IconURL
425 return buttonAttributes?.IconAttributes?.ResourceURL?.All;
431 CreateIconAttributes();
432 if (buttonAttributes.IconAttributes.ResourceURL == null)
434 buttonAttributes.IconAttributes.ResourceURL = new StringSelector();
436 buttonAttributes.IconAttributes.ResourceURL.All = value;
442 /// Text string selector in Button.
444 /// <since_tizen> 6 </since_tizen>
445 public StringSelector TextSelector
449 return buttonAttributes?.TextAttributes?.Text;
455 CreateTextAttributes();
456 buttonAttributes.TextAttributes.Text = value.Clone() as StringSelector;
462 /// Translateable text string selector in Button.
464 /// <since_tizen> 6 </since_tizen>
465 public StringSelector TranslatableTextSelector
469 return buttonAttributes?.TextAttributes?.TranslatableText;
475 CreateTextAttributes();
476 buttonAttributes.TextAttributes.TranslatableText = value.Clone() as StringSelector;
482 /// Text color selector in Button.
484 /// <since_tizen> 6 </since_tizen>
485 public ColorSelector TextColorSelector
489 return buttonAttributes?.TextAttributes?.TextColor;
495 CreateTextAttributes();
496 buttonAttributes.TextAttributes.TextColor = value.Clone() as ColorSelector;
502 /// Text font size selector in Button.
504 /// <since_tizen> 6 </since_tizen>
505 public FloatSelector PointSizeSelector
509 return buttonAttributes?.TextAttributes?.PointSize;
515 CreateTextAttributes();
516 buttonAttributes.TextAttributes.PointSize = value.Clone() as FloatSelector;
522 /// Icon image's resource url selector in Button.
524 /// <since_tizen> 6 </since_tizen>
525 public StringSelector IconURLSelector
529 return buttonAttributes?.IconAttributes?.ResourceURL;
535 CreateIconAttributes();
536 buttonAttributes.IconAttributes.ResourceURL = value.Clone() as StringSelector;
542 /// Background image's resource url selector in Button.
544 /// <since_tizen> 6 </since_tizen>
545 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
546 [EditorBrowsable(EditorBrowsableState.Never)]
547 public StringSelector BackgroundImageURLSelector
551 return buttonAttributes?.BackgroundImageAttributes?.ResourceURL;
557 CreateBackgroundAttributes();
558 buttonAttributes.BackgroundImageAttributes.ResourceURL = value.Clone() as StringSelector;
564 /// Background image's border selector in Button.
566 /// <since_tizen> 6 </since_tizen>
567 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
568 [EditorBrowsable(EditorBrowsableState.Never)]
569 public RectangleSelector BackgroundImageBorderSelector
573 return buttonAttributes?.BackgroundImageAttributes?.Border;
579 CreateBackgroundAttributes();
580 buttonAttributes.BackgroundImageAttributes.Border = value.Clone() as RectangleSelector;
586 /// Shadow image's resource url selector in Button.
588 /// <since_tizen> 6 </since_tizen>
589 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
590 [EditorBrowsable(EditorBrowsableState.Never)]
591 public StringSelector ShadowImageURLSelector
595 return buttonAttributes?.ShadowImageAttributes?.ResourceURL;
601 CreateShadowAttributes();
602 buttonAttributes.ShadowImageAttributes.ResourceURL = value.Clone() as StringSelector;
608 /// Shadow image's border selector in Button.
610 /// <since_tizen> 6 </since_tizen>
611 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
612 [EditorBrowsable(EditorBrowsableState.Never)]
613 public RectangleSelector ShadowImageBorderSelector
617 return buttonAttributes?.ShadowImageAttributes?.Border;
623 CreateShadowAttributes();
624 buttonAttributes.ShadowImageAttributes.Border = value.Clone() as RectangleSelector;
630 /// Overlay image's resource url selector in Button.
632 /// <since_tizen> 6 </since_tizen>
633 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
634 [EditorBrowsable(EditorBrowsableState.Never)]
635 public StringSelector OverlayImageURLSelector
639 return buttonAttributes?.OverlayImageAttributes?.ResourceURL;
645 CreateOverlayAttributes();
646 buttonAttributes.OverlayImageAttributes.ResourceURL = value.Clone() as StringSelector;
652 /// Overlay image's border selector in Button.
654 /// <since_tizen> 6 </since_tizen>
655 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
656 [EditorBrowsable(EditorBrowsableState.Never)]
657 public RectangleSelector OverlayImageBorderSelector
661 return buttonAttributes?.OverlayImageAttributes?.Border;
667 CreateOverlayAttributes();
668 buttonAttributes.OverlayImageAttributes.Border = value.Clone() as RectangleSelector;
674 /// Flag to decide selected state in Button.
676 /// <since_tizen> 6 </since_tizen>
677 public bool IsSelected
690 /// Flag to decide enable or disable in Button.
692 /// <since_tizen> 6 </since_tizen>
693 public bool IsEnabled
707 /// Icon relative orientation in Button, work only when show icon and text.
709 /// <since_tizen> 6 </since_tizen>
710 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
711 [EditorBrowsable(EditorBrowsableState.Never)]
712 public IconOrientation? IconRelativeOrientation
716 return buttonAttributes?.IconRelativeOrientation;
720 if(buttonAttributes != null && buttonAttributes.IconRelativeOrientation != value)
722 buttonAttributes.IconRelativeOrientation = value;
729 /// Icon padding in Button, work only when show icon and text.
731 /// <since_tizen> 6 </since_tizen>
732 public Extents IconPadding
736 if (null == buttonAttributes || null == buttonAttributes.IconAttributes)
742 return new Extents((ushort)buttonAttributes.IconAttributes.PaddingLeft, (ushort)buttonAttributes.IconAttributes.PaddingRight, (ushort)buttonAttributes.IconAttributes.PaddingTop, (ushort)buttonAttributes.IconAttributes.PaddingBottom);
749 CreateIconAttributes();
750 buttonAttributes.IconAttributes.PaddingLeft = value.Start;
751 buttonAttributes.IconAttributes.PaddingRight = value.End;
752 buttonAttributes.IconAttributes.PaddingTop = value.Top;
753 buttonAttributes.IconAttributes.PaddingBottom = value.Bottom;
760 /// Text padding in Button, work only when show icon and text.
762 /// <since_tizen> 6 </since_tizen>
763 public Extents TextPadding
767 if (null == buttonAttributes || null == buttonAttributes.TextAttributes)
773 return new Extents((ushort)buttonAttributes.TextAttributes.PaddingLeft, (ushort)buttonAttributes.TextAttributes.PaddingRight, (ushort)buttonAttributes.TextAttributes.PaddingTop, (ushort)buttonAttributes.TextAttributes.PaddingBottom);
780 CreateTextAttributes();
781 buttonAttributes.TextAttributes.PaddingLeft = value.Start;
782 buttonAttributes.TextAttributes.PaddingRight = value.End;
783 buttonAttributes.TextAttributes.PaddingTop = value.Top;
784 buttonAttributes.TextAttributes.PaddingBottom = value.Bottom;
791 /// Dispose Button and all children on it.
793 /// <param name="type">Dispose type.</param>
794 /// <since_tizen> 6 </since_tizen>
795 protected override void Dispose(DisposeTypes type)
802 if (type == DisposeTypes.Explicit)
804 if (buttonIcon != null)
806 buttonIcon.Relayout -= OnIconRelayout;
807 Utility.Dispose(buttonIcon);
809 if (buttonText != null)
811 Utility.Dispose(buttonText);
813 if (overlayImage != null)
815 Utility.Dispose(overlayImage);
817 if (backgroundImage != null)
819 Utility.Dispose(backgroundImage);
821 if (shadowImage != null)
823 Utility.Dispose(shadowImage);
830 /// Called after a key event is received by the view that has had its focus set.
832 /// <param name="key">The key event.</param>
833 /// <returns>True if the key event should be consumed.</returns>
834 /// <since_tizen> 6 </since_tizen>
835 public override bool OnKey(Key key)
837 if (key.State == Key.StateType.Down)
839 if (key.KeyPressedName == "Return")
845 ClickEventArgs eventArgs = new ClickEventArgs();
850 else if (key.State == Key.StateType.Up)
852 if (key.KeyPressedName == "Return")
855 if (buttonAttributes.IsSelectable != null && buttonAttributes.IsSelectable == true)
857 isSelected = !isSelected;
862 return base.OnKey(key);
866 /// 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.
868 /// <since_tizen> 6 </since_tizen>
869 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
870 [EditorBrowsable(EditorBrowsableState.Never)]
871 public override void OnFocusGained()
873 base.OnFocusGained();
877 /// 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.
879 /// <since_tizen> 6 </since_tizen>
880 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
881 [EditorBrowsable(EditorBrowsableState.Never)]
882 public override void OnFocusLost()
889 /// Tap gesture event callback.
891 /// <param name="source">Source which recieved touch event.</param>
892 /// <param name="e">Tap gesture event argument.</param>
893 /// <since_tizen> 6 </since_tizen>
894 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
895 [EditorBrowsable(EditorBrowsableState.Never)]
896 protected override void OnTapGestureDetected(object source, TapGestureDetector.DetectedEventArgs e)
900 ClickEventArgs eventArgs = new ClickEventArgs();
902 base.OnTapGestureDetected(source, e);
906 /// Called after a touch event is received by the owning view.<br />
907 /// CustomViewBehaviour.REQUIRES_TOUCH_EVENTS must be enabled during construction. See CustomView(ViewWrapperImpl.CustomViewBehaviour behaviour).<br />
909 /// <param name="touch">The touch event.</param>
910 /// <returns>True if the event should be consumed.</returns>
911 /// <since_tizen> 6 </since_tizen>
912 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
913 [EditorBrowsable(EditorBrowsableState.Never)]
914 public override bool OnTouch(Touch touch)
916 PointStateType state = touch.GetState(0);
920 case PointStateType.Down:
924 case PointStateType.Interrupted:
928 case PointStateType.Up:
930 if (buttonAttributes.IsSelectable != null && buttonAttributes.IsSelectable == true)
932 isSelected = !isSelected;
939 return base.OnTouch(touch);
942 /// Get Button attribues.
944 /// <since_tizen> 6 </since_tizen>
945 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
946 [EditorBrowsable(EditorBrowsableState.Never)]
947 protected override Attributes GetAttributes()
949 return new ButtonAttributes();
952 /// Update Button by attributes.
954 /// <since_tizen> 6 </since_tizen>
955 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
956 [EditorBrowsable(EditorBrowsableState.Never)]
957 protected override void OnUpdate()
959 if (buttonAttributes.ShadowImageAttributes != null)
961 if(shadowImage == null)
963 shadowImage = new ImageView()
965 WidthResizePolicy = ResizePolicyType.FillToParent,
966 HeightResizePolicy = ResizePolicyType.FillToParent
968 this.Add(shadowImage);
970 ApplyAttributes(shadowImage, buttonAttributes.ShadowImageAttributes);
973 if (buttonAttributes.BackgroundImageAttributes != null)
975 if(backgroundImage == null)
977 backgroundImage = new ImageView()
979 WidthResizePolicy = ResizePolicyType.FillToParent,
980 HeightResizePolicy = ResizePolicyType.FillToParent
982 this.Add(backgroundImage);
984 ApplyAttributes(backgroundImage, buttonAttributes.BackgroundImageAttributes);
987 if (buttonAttributes.OverlayImageAttributes != null)
989 if(overlayImage == null)
991 overlayImage = new ImageView()
993 WidthResizePolicy = ResizePolicyType.FillToParent,
994 HeightResizePolicy = ResizePolicyType.FillToParent
996 this.Add(overlayImage);
998 ApplyAttributes(overlayImage, buttonAttributes.OverlayImageAttributes);
1001 if (buttonAttributes.TextAttributes != null)
1003 if(buttonText == null)
1005 buttonText = new TextLabel();
1006 this.Add(buttonText);
1008 ApplyAttributes(buttonText, buttonAttributes.TextAttributes);
1011 if (buttonAttributes.IconAttributes != null)
1013 if(buttonIcon == null)
1015 buttonIcon = new ImageView();
1016 buttonIcon.Relayout += OnIconRelayout;
1017 this.Add(buttonIcon);
1019 ApplyAttributes(buttonIcon, buttonAttributes.IconAttributes);
1025 Sensitive = isEnabled ? true : false;
1029 /// Update Button State.
1031 /// <since_tizen> 6 </since_tizen>
1032 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
1033 [EditorBrowsable(EditorBrowsableState.Never)]
1034 protected void UpdateState()
1036 ControlStates sourceState = State;
1037 ControlStates targetState;
1041 targetState = isPressed ? ControlStates.Pressed : (IsFocused ? (IsSelected ? ControlStates.SelectedFocused : ControlStates.Focused) : (IsSelected ? ControlStates.Selected : ControlStates.Normal));
1045 targetState = IsSelected ? ControlStates.DisabledSelected : (IsFocused ? ControlStates.DisabledFocused : ControlStates.Disabled);
1047 if(sourceState != targetState)
1049 State = targetState;
1053 StateChangedEventArgs e = new StateChangedEventArgs
1055 PreviousState = sourceState,
1056 CurrentState = targetState
1058 stateChangeHander?.Invoke(this, e);
1062 /// It is hijack by using protected, attributes copy problem when class inherited from Button.
1064 /// <since_tizen> 6 </since_tizen>
1065 private void Initialize()
1067 buttonAttributes = attributes as ButtonAttributes;
1068 if (buttonAttributes == null)
1070 throw new Exception("Button attribute parse error.");
1073 ApplyAttributes(this, buttonAttributes);
1074 LayoutDirectionChanged += OnLayoutDirectionChanged;
1078 /// Measure text, it can be override.
1080 /// <since_tizen> 6 </since_tizen>
1081 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
1082 [EditorBrowsable(EditorBrowsableState.Never)]
1083 protected virtual void MeasureText()
1085 if (buttonAttributes.IconRelativeOrientation == null || buttonIcon == null || buttonText == null)
1089 buttonText.WidthResizePolicy = ResizePolicyType.Fixed;
1090 buttonText.HeightResizePolicy = ResizePolicyType.Fixed;
1091 int textPaddingLeft = buttonAttributes.TextAttributes.PaddingLeft;
1092 int textPaddingRight = buttonAttributes.TextAttributes.PaddingRight;
1093 int textPaddingTop = buttonAttributes.TextAttributes.PaddingTop;
1094 int textPaddingBottom = buttonAttributes.TextAttributes.PaddingBottom;
1096 int iconPaddingLeft = buttonAttributes.IconAttributes.PaddingLeft;
1097 int iconPaddingRight = buttonAttributes.IconAttributes.PaddingRight;
1098 int iconPaddingTop = buttonAttributes.IconAttributes.PaddingTop;
1099 int iconPaddingBottom = buttonAttributes.IconAttributes.PaddingBottom;
1101 if (IconRelativeOrientation == IconOrientation.Top || IconRelativeOrientation == IconOrientation.Bottom)
1103 buttonText.SizeWidth = SizeWidth - textPaddingLeft - textPaddingRight;
1104 buttonText.SizeHeight = SizeHeight - textPaddingTop - textPaddingBottom - iconPaddingTop - iconPaddingBottom - buttonIcon.SizeHeight;
1108 buttonText.SizeWidth = SizeWidth - textPaddingLeft - textPaddingRight - iconPaddingLeft - iconPaddingRight - buttonIcon.SizeWidth;
1109 buttonText.SizeHeight = SizeHeight - textPaddingTop - textPaddingBottom;
1113 /// Layout child, it can be override.
1115 /// <since_tizen> 6 </since_tizen>
1116 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
1117 [EditorBrowsable(EditorBrowsableState.Never)]
1118 protected virtual void LayoutChild()
1120 if (buttonAttributes.IconRelativeOrientation == null || buttonIcon == null || buttonText == null)
1125 int textPaddingLeft = buttonAttributes.TextAttributes.PaddingLeft;
1126 int textPaddingRight = buttonAttributes.TextAttributes.PaddingRight;
1127 int textPaddingTop = buttonAttributes.TextAttributes.PaddingTop;
1128 int textPaddingBottom = buttonAttributes.TextAttributes.PaddingBottom;
1130 int iconPaddingLeft = buttonAttributes.IconAttributes.PaddingLeft;
1131 int iconPaddingRight = buttonAttributes.IconAttributes.PaddingRight;
1132 int iconPaddingTop = buttonAttributes.IconAttributes.PaddingTop;
1133 int iconPaddingBottom = buttonAttributes.IconAttributes.PaddingBottom;
1135 switch (IconRelativeOrientation)
1137 case IconOrientation.Top:
1138 buttonIcon.PositionUsesPivotPoint = true;
1139 buttonIcon.ParentOrigin = NUI.ParentOrigin.TopCenter;
1140 buttonIcon.PivotPoint = NUI.PivotPoint.TopCenter;
1141 buttonIcon.Position2D = new Position2D(0, iconPaddingTop);
1143 buttonText.PositionUsesPivotPoint = true;
1144 buttonText.ParentOrigin = NUI.ParentOrigin.BottomCenter;
1145 buttonText.PivotPoint = NUI.PivotPoint.BottomCenter;
1146 buttonText.Position2D = new Position2D(0, -textPaddingBottom);
1148 case IconOrientation.Bottom:
1149 buttonIcon.PositionUsesPivotPoint = true;
1150 buttonIcon.ParentOrigin = NUI.ParentOrigin.BottomCenter;
1151 buttonIcon.PivotPoint = NUI.PivotPoint.BottomCenter;
1152 buttonIcon.Position2D = new Position2D(0, -iconPaddingBottom);
1154 buttonText.PositionUsesPivotPoint = true;
1155 buttonText.ParentOrigin = NUI.ParentOrigin.TopCenter;
1156 buttonText.PivotPoint = NUI.PivotPoint.TopCenter;
1157 buttonText.Position2D = new Position2D(0, textPaddingTop);
1159 case IconOrientation.Left:
1160 if (LayoutDirection == ViewLayoutDirectionType.LTR)
1162 buttonIcon.PositionUsesPivotPoint = true;
1163 buttonIcon.ParentOrigin = NUI.ParentOrigin.CenterLeft;
1164 buttonIcon.PivotPoint = NUI.PivotPoint.CenterLeft;
1165 buttonIcon.Position2D = new Position2D(iconPaddingLeft, 0);
1167 buttonText.PositionUsesPivotPoint = true;
1168 buttonText.ParentOrigin = NUI.ParentOrigin.CenterRight;
1169 buttonText.PivotPoint = NUI.PivotPoint.CenterRight;
1170 buttonText.Position2D = new Position2D(-textPaddingRight, 0);
1174 buttonIcon.PositionUsesPivotPoint = true;
1175 buttonIcon.ParentOrigin = NUI.ParentOrigin.CenterRight;
1176 buttonIcon.PivotPoint = NUI.PivotPoint.CenterRight;
1177 buttonIcon.Position2D = new Position2D(-iconPaddingLeft, 0);
1179 buttonText.PositionUsesPivotPoint = true;
1180 buttonText.ParentOrigin = NUI.ParentOrigin.CenterLeft;
1181 buttonText.PivotPoint = NUI.PivotPoint.CenterLeft;
1182 buttonText.Position2D = new Position2D(textPaddingRight, 0);
1186 case IconOrientation.Right:
1187 if (LayoutDirection == ViewLayoutDirectionType.RTL)
1189 buttonIcon.PositionUsesPivotPoint = true;
1190 buttonIcon.ParentOrigin = NUI.ParentOrigin.CenterLeft;
1191 buttonIcon.PivotPoint = NUI.PivotPoint.CenterLeft;
1192 buttonIcon.Position2D = new Position2D(iconPaddingRight, 0);
1194 buttonText.PositionUsesPivotPoint = true;
1195 buttonText.ParentOrigin = NUI.ParentOrigin.CenterRight;
1196 buttonText.PivotPoint = NUI.PivotPoint.CenterRight;
1197 buttonText.Position2D = new Position2D(-textPaddingLeft, 0);
1201 buttonIcon.PositionUsesPivotPoint = true;
1202 buttonIcon.ParentOrigin = NUI.ParentOrigin.CenterRight;
1203 buttonIcon.PivotPoint = NUI.PivotPoint.CenterRight;
1204 buttonIcon.Position2D = new Position2D(-iconPaddingRight, 0);
1206 buttonText.PositionUsesPivotPoint = true;
1207 buttonText.ParentOrigin = NUI.ParentOrigin.CenterLeft;
1208 buttonText.PivotPoint = NUI.PivotPoint.CenterLeft;
1209 buttonText.Position2D = new Position2D(textPaddingLeft, 0);
1217 /// Theme change callback when theme is changed, this callback will be trigger.
1219 /// <since_tizen> 6 </since_tizen>
1220 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
1221 [EditorBrowsable(EditorBrowsableState.Never)]
1222 protected override void OnThemeChangedEvent(object sender, StyleManager.ThemeChangeEventArgs e)
1224 ButtonAttributes tempAttributes = StyleManager.Instance.GetAttributes(style) as ButtonAttributes;
1225 if(tempAttributes != null)
1227 attributes = buttonAttributes = tempAttributes;
1232 private void OnLayoutDirectionChanged(object sender, LayoutDirectionChangedEventArgs e)
1238 private void OnClick(ClickEventArgs eventArgs)
1240 ClickEvent?.Invoke(this, eventArgs);
1243 private void OnIconRelayout(object sender, EventArgs e)
1249 private void CreateBackgroundAttributes()
1251 if (buttonAttributes.BackgroundImageAttributes == null)
1253 buttonAttributes.BackgroundImageAttributes = new ImageAttributes()
1255 PositionUsesPivotPoint = true,
1256 ParentOrigin = Tizen.NUI.ParentOrigin.Center,
1257 PivotPoint = Tizen.NUI.PivotPoint.Center,
1258 WidthResizePolicy = ResizePolicyType.FillToParent,
1259 HeightResizePolicy = ResizePolicyType.FillToParent
1264 private void CreateShadowAttributes()
1266 if (buttonAttributes.ShadowImageAttributes == null)
1268 buttonAttributes.ShadowImageAttributes = new ImageAttributes()
1270 PositionUsesPivotPoint = true,
1271 ParentOrigin = Tizen.NUI.ParentOrigin.Center,
1272 PivotPoint = Tizen.NUI.PivotPoint.Center,
1273 WidthResizePolicy = ResizePolicyType.FillToParent,
1274 HeightResizePolicy = ResizePolicyType.FillToParent
1279 private void CreateOverlayAttributes()
1281 if (buttonAttributes.OverlayImageAttributes == null)
1283 buttonAttributes.OverlayImageAttributes = new ImageAttributes()
1285 PositionUsesPivotPoint = true,
1286 ParentOrigin = Tizen.NUI.ParentOrigin.Center,
1287 PivotPoint = Tizen.NUI.PivotPoint.Center,
1288 WidthResizePolicy = ResizePolicyType.FillToParent,
1289 HeightResizePolicy = ResizePolicyType.FillToParent
1294 private void CreateTextAttributes()
1296 if (buttonAttributes.TextAttributes == null)
1298 buttonAttributes.TextAttributes = new TextAttributes()
1300 PositionUsesPivotPoint = true,
1301 ParentOrigin = Tizen.NUI.ParentOrigin.Center,
1302 PivotPoint = Tizen.NUI.PivotPoint.Center,
1303 WidthResizePolicy = ResizePolicyType.FillToParent,
1304 HeightResizePolicy = ResizePolicyType.FillToParent,
1305 HorizontalAlignment = HorizontalAlignment.Center,
1306 VerticalAlignment = VerticalAlignment.Center
1311 private void CreateIconAttributes()
1313 if (buttonAttributes.IconAttributes == null)
1315 buttonAttributes.IconAttributes = new ImageAttributes()
1317 PositionUsesPivotPoint = true,
1318 ParentOrigin = Tizen.NUI.ParentOrigin.Center,
1319 PivotPoint = Tizen.NUI.PivotPoint.Center,
1320 WidthResizePolicy = ResizePolicyType.UseNaturalSize,
1321 HeightResizePolicy = ResizePolicyType.UseNaturalSize,
1326 /// ClickEventArgs is a class to record button click event arguments which will sent to user.
1328 /// <since_tizen> 6 </since_tizen>
1329 public class ClickEventArgs : EventArgs
1333 /// StateChangeEventArgs is a class to record button state change event arguments which will sent to user.
1335 /// <since_tizen> 6 </since_tizen>
1336 public class StateChangedEventArgs : EventArgs
1338 /// <summary> previous state of Button </summary>
1339 /// <since_tizen> 6 </since_tizen>
1340 public ControlStates PreviousState;
1341 /// <summary> current state of Button </summary>
1342 /// <since_tizen> 6 </since_tizen>
1343 public ControlStates CurrentState;