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.Collections.Generic;
19 using Tizen.NUI.BaseComponents;
20 using Tizen.NUI.Binding;
21 using System.ComponentModel;
23 namespace Tizen.NUI.Components
26 /// Popup is one kind of common component, it can be used as popup window.
27 /// User can handle Popup button count, head title and content area.
29 /// <since_tizen> 6 </since_tizen>
30 [Obsolete("Deprecated in API8; Will be removed in API10")]
31 public class Popup : Control
33 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
34 [EditorBrowsable(EditorBrowsableState.Never)]
35 public static readonly BindableProperty ButtonHeightProperty = BindableProperty.Create(nameof(ButtonHeight), typeof(int), typeof(Popup), default(int), propertyChanged: (bindable, oldValue, newValue) =>
37 var instance = (Popup)bindable;
38 if (newValue != null && instance?.popupStyle?.Buttons?.Size != null)
40 instance.popupStyle.Buttons.SizeHeight = (int)newValue;
41 instance.btGroup.Itemheight = (int)newValue;
42 instance.UpdateView();
45 defaultValueCreator: (bindable) =>
47 var instance = (Popup)bindable;
48 return (int)(instance.popupStyle?.Buttons?.Size?.Height ?? 0);
51 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
52 [EditorBrowsable(EditorBrowsableState.Never)]
53 public static readonly BindableProperty ButtonTextPointSizeProperty = BindableProperty.Create(nameof(ButtonTextPointSize), typeof(float), typeof(Popup), default(float), propertyChanged: (bindable, oldValue, newValue) =>
55 var instance = (Popup)bindable;
58 if (instance.popupStyle?.Buttons?.Text != null)
60 instance.popupStyle.Buttons.Text.PointSize = (float)newValue;
62 instance.btGroup.ItemPointSize = (float)newValue;
65 defaultValueCreator: (bindable) =>
67 var instance = (Popup)bindable;
68 return instance.popupStyle?.Buttons?.Text?.PointSize?.All ?? 0;
71 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
72 [EditorBrowsable(EditorBrowsableState.Never)]
73 public static readonly BindableProperty ButtonFontFamilyProperty = BindableProperty.Create(nameof(ButtonFontFamily), typeof(string), typeof(Popup), string.Empty, propertyChanged: (bindable, oldValue, newValue) =>
75 var instance = (Popup)bindable;
78 instance.popupStyle.Buttons.Text.FontFamily = (string)newValue;
79 instance.btGroup.ItemFontFamily = (string)newValue;
82 defaultValueCreator: (bindable) =>
84 var instance = (Popup)bindable;
85 return instance.popupStyle?.Buttons?.Text?.FontFamily.All;
88 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
89 [EditorBrowsable(EditorBrowsableState.Never)]
90 public static readonly BindableProperty ButtonTextColorProperty = BindableProperty.Create(nameof(ButtonTextColor), typeof(Color), typeof(Popup), Color.Transparent, propertyChanged: (bindable, oldValue, newValue) =>
92 var instance = (Popup)bindable;
95 if (instance.popupStyle?.Buttons?.Text != null)
97 instance.popupStyle.Buttons.Text.TextColor = (Color)newValue;
99 instance.btGroup.ItemTextColor = (Color)newValue;
102 defaultValueCreator: (bindable) =>
104 var instance = (Popup)bindable;
105 return instance.popupStyle?.Buttons?.Text?.TextColor?.All;
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 ButtonOverLayBackgroundColorSelectorProperty = BindableProperty.Create(nameof(ButtonOverLayBackgroundColorSelector), typeof(Selector<Color>), typeof(Popup), new Selector<Color>(), propertyChanged: (bindable, oldValue, newValue) =>
112 var instance = (Popup)bindable;
113 if (newValue != null)
115 instance.popupStyle.Buttons.Overlay.BackgroundColor = (Selector<Color>)newValue;
116 instance.btGroup.OverLayBackgroundColorSelector = (Selector<Color>)newValue;
119 defaultValueCreator: (bindable) =>
121 var instance = (Popup)bindable;
122 return instance.popupStyle?.Buttons?.Overlay?.BackgroundColor;
125 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
126 [EditorBrowsable(EditorBrowsableState.Never)]
127 public static readonly BindableProperty ButtonTextAlignmentProperty = BindableProperty.Create(nameof(ButtonTextAlignment), typeof(HorizontalAlignment), typeof(Popup), new HorizontalAlignment(), propertyChanged: (bindable, oldValue, newValue) =>
129 var instance = (Popup)bindable;
130 if (newValue != null)
132 instance.popupStyle.Buttons.Text.HorizontalAlignment = (HorizontalAlignment)newValue;
133 instance.btGroup.ItemTextAlignment = (HorizontalAlignment)newValue;
136 defaultValueCreator: (bindable) =>
138 var instance = (Popup)bindable;
139 return instance.popupStyle?.Buttons?.Text?.HorizontalAlignment ?? HorizontalAlignment.Center;
142 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
143 [EditorBrowsable(EditorBrowsableState.Never)]
144 public static readonly BindableProperty ButtonBackgroundProperty = BindableProperty.Create(nameof(ButtonBackground), typeof(string), typeof(Popup), string.Empty, propertyChanged: (bindable, oldValue, newValue) =>
146 var instance = (Popup)bindable;
147 if (newValue != null)
149 if (instance.popupStyle.Buttons.BackgroundImage == null)
151 instance.popupStyle.Buttons.BackgroundImage = new Selector<string>();
153 instance.popupStyle.Buttons.BackgroundColor = new Selector<Color>();
154 instance.popupStyle.Buttons.BackgroundImage = (string)newValue;
155 instance.btGroup.ItemBackgroundImageUrl = (string)newValue;
158 defaultValueCreator: (bindable) =>
160 var instance = (Popup)bindable;
161 return instance.popupStyle?.Buttons?.BackgroundImage?.All;
164 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
165 [EditorBrowsable(EditorBrowsableState.Never)]
166 public static readonly BindableProperty ButtonBackgroundBorderProperty = BindableProperty.Create(nameof(ButtonBackgroundBorder), typeof(Rectangle), typeof(Popup), new Rectangle(0, 0, 0, 0), propertyChanged: (bindable, oldValue, newValue) =>
168 var instance = (Popup)bindable;
169 if (newValue != null)
171 if (instance.popupStyle.Buttons.BackgroundImageBorder == null)
173 instance.popupStyle.Buttons.BackgroundImageBorder = new Selector<Rectangle>();
175 instance.popupStyle.Buttons.BackgroundImageBorder = (Rectangle)newValue;
176 instance.btGroup.ItemBackgroundBorder = (Rectangle)newValue;
179 defaultValueCreator: (bindable) =>
181 var instance = (Popup)bindable;
182 return instance.popupStyle?.Buttons?.BackgroundImageBorder?.All;
185 /// This will be public opened in tizen_6.0 after ACR done. Before ACR, need to be hidden as inhouse API.
186 [EditorBrowsable(EditorBrowsableState.Never)]
187 public static readonly BindableProperty ButtonImageShadowProperty = BindableProperty.Create(nameof(ButtonImageShadow), typeof(ImageShadow), typeof(Popup), null, propertyChanged: (bindable, oldValue, newValue) =>
189 var instance = (Popup)bindable;
190 ImageShadow shadow = (ImageShadow)newValue;
191 instance.btGroup.ItemImageShadow = new ImageShadow(shadow);
192 instance.popupStyle.Buttons.ImageShadow = new ImageShadow(shadow);
194 defaultValueCreator: (bindable) =>
196 var instance = (Popup)bindable;
197 return instance.popupStyle?.Buttons?.ImageShadow?.All;
201 private PopupStyle popupStyle => ViewStyle as PopupStyle;
202 private TextLabel titleText;
203 private ButtonGroup btGroup = null;
204 private Window window = null;
205 private Layer container = new Layer();
209 /// Creates a new instance of a Popup.
211 /// <since_tizen> 6 </since_tizen>
212 [Obsolete("Deprecated in API8; Will be removed in API10")]
213 public Popup() : base()
219 /// Creates a new instance of a Popup with style.
221 /// <param name="style">Create Popup by special style defined in UX.</param>
222 [EditorBrowsable(EditorBrowsableState.Never)]
223 public Popup(string style) : base(style)
229 /// Creates a new instance of a Popup with style.
231 /// <param name="popupStyle">Create Popup by style customized by user.</param>
232 [EditorBrowsable(EditorBrowsableState.Never)]
233 public Popup(PopupStyle popupStyle) : base(popupStyle)
238 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
239 [EditorBrowsable(EditorBrowsableState.Never)]
240 public virtual void Post(Window targetWindow)
242 if (targetWindow == null)
247 window = targetWindow;
248 window.AddLayer(container);
249 container.RaiseToTop();
253 /// Dismiss the dialog
255 [EditorBrowsable(EditorBrowsableState.Never)]
256 public virtual void Dismiss()
263 window.RemoveLayer(container);
267 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
268 [EditorBrowsable(EditorBrowsableState.Never)]
269 public void AddButton(string buttonText)
271 if (popupStyle.Buttons != null)
273 Button btn = new Button(popupStyle.Buttons);
274 btn.Text = buttonText;
275 btn.ClickEvent += ButtonClickEvent;
276 btGroup.AddItem(btn);
282 /// Add button by style's name.
284 [EditorBrowsable(EditorBrowsableState.Never)]
285 public void AddButton(string buttonText, string style)
287 AddButton(buttonText);
291 /// Add button by style.
293 [EditorBrowsable(EditorBrowsableState.Never)]
294 public void AddButton(string buttonText, ButtonStyle style)
296 if (popupStyle.Buttons != null && style != null)
298 popupStyle.Buttons.CopyFrom(style);
299 AddButton(buttonText);
303 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
304 [EditorBrowsable(EditorBrowsableState.Never)]
305 public Button GetButton(int index)
307 return btGroup.GetItem(index);
310 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
311 [EditorBrowsable(EditorBrowsableState.Never)]
312 public void RemoveButton(int index)
314 btGroup.RemoveItem(index);
317 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
318 [EditorBrowsable(EditorBrowsableState.Never)]
319 public void AddContentText(View childView)
321 if (null != ContentView)
323 ContentView.Add(childView);
329 /// An event for the button clicked signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
331 /// <since_tizen> 6 </since_tizen>
332 [Obsolete("Deprecated in API8; Will be removed in API10")]
333 public event EventHandler<ButtonClickEventArgs> PopupButtonClickEvent;
336 /// Get style of popup.
338 [EditorBrowsable(EditorBrowsableState.Never)]
339 public new PopupStyle Style
343 var result = new PopupStyle(popupStyle);
344 result.CopyPropertiesFromView(this);
345 result.Title.CopyPropertiesFromView(titleText);
353 [EditorBrowsable(EditorBrowsableState.Never)]
354 public TextLabel Title
358 if (null == titleText)
360 titleText = new TextLabel
362 PositionUsesPivotPoint = true,
363 ParentOrigin = Tizen.NUI.ParentOrigin.TopLeft,
364 PivotPoint = Tizen.NUI.PivotPoint.TopLeft,
365 HorizontalAlignment = HorizontalAlignment.Begin,
366 VerticalAlignment = VerticalAlignment.Bottom,
380 /// Title text string in Popup.
382 /// <since_tizen> 6 </since_tizen>
383 [Obsolete("Deprecated in API8; Will be removed in API10")]
384 public string TitleText
388 return popupStyle?.Title?.Text?.All;
394 if (popupStyle?.Title != null)
396 popupStyle.Title.Text = value;
403 /// Title text point size in Popup.
405 /// <since_tizen> 6 </since_tizen>
406 [Obsolete("Deprecated in API8; Will be removed in API10")]
407 public float TitlePointSize
411 return popupStyle?.Title?.PointSize?.All ?? 0;
415 if (popupStyle?.Title != null)
417 popupStyle.Title.PointSize = value;
423 /// Title text color in Popup.
425 /// <since_tizen> 6 </since_tizen>
426 [Obsolete("Deprecated in API8; Will be removed in API10")]
427 public Color TitleTextColor
431 return popupStyle?.Title?.TextColor?.All;
435 if (popupStyle?.Title != null)
437 popupStyle.Title.TextColor = value;
443 /// Title text horizontal alignment in Popup.
445 /// <since_tizen> 6 </since_tizen>
446 [Obsolete("Deprecated in API8; Will be removed in API10")]
447 public HorizontalAlignment TitleTextHorizontalAlignment
451 return popupStyle?.Title?.HorizontalAlignment ?? HorizontalAlignment.Center;
455 popupStyle.Title.HorizontalAlignment = value;
460 /// Title text's position in Popup.
462 /// <since_tizen> 6 </since_tizen>
463 [Obsolete("Deprecated in API8; Will be removed in API10")]
464 public Position TitleTextPosition
468 return popupStyle?.Title?.Position ?? new Position(0, 0, 0);
472 popupStyle.Title.Position = value;
477 /// Title text's height in Popup.
479 /// <since_tizen> 6 </since_tizen>
480 [Obsolete("Deprecated in API8; Will be removed in API10")]
481 public int TitleHeight
485 return (int)(popupStyle?.Title?.Size?.Height ?? 0);
489 if (popupStyle?.Title?.Size != null)
491 popupStyle.Title.SizeHeight = value;
497 /// Content view in Popup, only can be gotten.
499 /// <since_tizen> 6 </since_tizen>
500 [Obsolete("Deprecated in API8; Will be removed in API10")]
501 public View ContentView
508 /// Button count in Popup.
510 /// <since_tizen> 6 </since_tizen>
511 [Obsolete("Deprecated in API8; Will be removed in API10")]
512 public int ButtonCount
519 /// Button height in Popup.
521 /// <since_tizen> 6 </since_tizen>
522 [Obsolete("Deprecated in API8; Will be removed in API10")]
523 public int ButtonHeight
527 return (int)GetValue(ButtonHeightProperty);
531 SetValue(ButtonHeightProperty, value);
536 /// Button text point size in Popup.
538 /// <since_tizen> 6 </since_tizen>
539 [Obsolete("Deprecated in API8; Will be removed in API10")]
540 public float ButtonTextPointSize
544 return (float)GetValue(ButtonTextPointSizeProperty);
548 SetValue(ButtonTextPointSizeProperty, value);
553 /// Button text font family in Popup.
555 /// <since_tizen> 6 </since_tizen>
556 [Obsolete("Deprecated in API8; Will be removed in API10")]
557 public string ButtonFontFamily
561 return (string)GetValue(ButtonFontFamilyProperty);
565 SetValue(ButtonFontFamilyProperty, value);
570 /// Button text color in Popup.
572 /// <since_tizen> 6 </since_tizen>
573 [Obsolete("Deprecated in API8; Will be removed in API10")]
574 public Color ButtonTextColor
578 return (Color)GetValue(ButtonTextColorProperty);
582 SetValue(ButtonTextColorProperty, value);
587 /// Button overlay background color selector in Popup.
589 /// <since_tizen> 6 </since_tizen>
590 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
591 [EditorBrowsable(EditorBrowsableState.Never)]
592 public Selector<Color> ButtonOverLayBackgroundColorSelector
596 return (Selector<Color>)GetValue(ButtonOverLayBackgroundColorSelectorProperty);
600 SetValue(ButtonOverLayBackgroundColorSelectorProperty, value);
605 /// Button text horizontal alignment in Popup.
607 /// <since_tizen> 6 </since_tizen>
608 [Obsolete("Deprecated in API8; Will be removed in API10")]
609 public HorizontalAlignment ButtonTextAlignment
613 return (HorizontalAlignment)GetValue(ButtonTextAlignmentProperty);
617 SetValue(ButtonTextAlignmentProperty, value);
622 /// Button background image's resource url in Popup.
624 /// <since_tizen> 6 </since_tizen>
625 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
626 [EditorBrowsable(EditorBrowsableState.Never)]
627 public string ButtonBackground
631 return (string)GetValue(ButtonBackgroundProperty);
635 SetValue(ButtonBackgroundProperty, value);
640 /// Button background image's border in Popup.
642 /// <since_tizen> 6 </since_tizen>
643 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
644 [EditorBrowsable(EditorBrowsableState.Never)]
645 public Rectangle ButtonBackgroundBorder
650 return (Rectangle)GetValue(ButtonBackgroundBorderProperty);
654 SetValue(ButtonBackgroundBorderProperty, value);
659 /// Button's image shadow in Popup.
661 /// <since_tizen> 6 </since_tizen>
662 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
663 [EditorBrowsable(EditorBrowsableState.Never)]
664 public ImageShadow ButtonImageShadow
666 get => (ImageShadow)GetValue(ButtonImageShadowProperty);
667 set => SetValue(ButtonImageShadowProperty, value);
672 /// Set button text by index.
674 /// <param name="index">Button index.</param>
675 /// <param name="text">Button text string.</param>
676 /// <since_tizen> 6 </since_tizen>
677 [Obsolete("Deprecated in API8; Will be removed in API10")]
678 public void SetButtonText(int index, string text)
684 /// Dispose Popup and all children on it.
686 /// <param name="type">Dispose type.</param>
687 /// <since_tizen> 6 </since_tizen>
688 [Obsolete("Deprecated in API8; Will be removed in API10")]
689 protected override void Dispose(DisposeTypes type)
696 if (type == DisposeTypes.Explicit)
698 if (titleText != null)
704 if (ContentView != null)
707 ContentView.Dispose();
722 /// Focus gained callback.
724 /// <since_tizen> 6 </since_tizen>
725 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
726 [EditorBrowsable(EditorBrowsableState.Never)]
727 public override void OnFocusGained()
729 base.OnFocusGained();
733 /// Focus lost callback.
735 /// <since_tizen> 6 </since_tizen>
736 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
737 [EditorBrowsable(EditorBrowsableState.Never)]
738 public override void OnFocusLost()
744 /// Apply style to popup.
746 /// <param name="viewStyle">The style to apply.</param>
747 [EditorBrowsable(EditorBrowsableState.Never)]
748 public override void ApplyStyle(ViewStyle viewStyle)
750 base.ApplyStyle(viewStyle);
752 if (viewStyle is PopupStyle ppStyle)
754 if (ppStyle.Buttons == null)
756 ppStyle.Buttons = new ButtonStyle();
759 if (ppStyle.Buttons.PositionUsesPivotPoint == null) ppStyle.Buttons.PositionUsesPivotPoint = true;
760 if (ppStyle.Buttons.ParentOrigin == null) ppStyle.Buttons.ParentOrigin = Tizen.NUI.ParentOrigin.BottomLeft;
761 if (ppStyle.Buttons.PivotPoint == null) ppStyle.Buttons.PivotPoint = Tizen.NUI.PivotPoint.BottomLeft;
765 for (int i = 0; i < btGroup.Count; i++)
767 GetButton(i)?.ApplyStyle(ppStyle.Buttons);
771 Title.ApplyStyle(ppStyle.Title);
779 /// <returns>The default popup style.</returns>
780 [EditorBrowsable(EditorBrowsableState.Never)]
781 protected override ViewStyle CreateViewStyle()
783 return new PopupStyle();
787 [EditorBrowsable(EditorBrowsableState.Never)]
788 protected override void OnUpdate()
794 private void Initialize()
797 container.SetTouchConsumed(true);
798 container.SetHoverConsumed(true);
800 LeaveRequired = true;
801 PropertyChanged += PopupStylePropertyChanged;
804 ContentView = new View()
806 ParentOrigin = Tizen.NUI.ParentOrigin.TopLeft,
807 PivotPoint = Tizen.NUI.PivotPoint.TopLeft,
808 PositionUsesPivotPoint = true
811 ContentView.RaiseToTop();
814 btGroup = new ButtonGroup(this);
817 private void UpdateView()
819 if (popupStyle == null) return;
820 btGroup.UpdateButton(popupStyle.Buttons);
825 private void ButtonClickEvent(object sender, Button.ClickEventArgs e)
827 if (PopupButtonClickEvent != null && btGroup.Count > 0)
829 Button button = sender as Button;
830 for (int i = 0; i < btGroup.Count; i++)
832 if (button == GetButton(i))
834 ButtonClickEventArgs args = new ButtonClickEventArgs();
835 args.ButtonIndex = i;
836 PopupButtonClickEvent(this, args);
842 private void PopupStylePropertyChanged(object sender, PropertyChangedEventArgs e)
844 if (e.PropertyName.Equals("LayoutDirection"))
846 btGroup.UpdateButton(popupStyle.Buttons);
850 private void UpdateContentView()
856 string strText = Title.Text;
857 if (!string.IsNullOrEmpty(strText) && Title.Size != null)
859 titleH = (int)titleText.Size.Height;
862 if (!string.IsNullOrEmpty(strText) && Title.Position != null)
864 titleX = (int)Title.Position.X;
865 titleY = (int)Title.Position.Y;
868 if (btGroup.Count != 0 && popupStyle?.Buttons?.Size != null)
870 buttonH = (int)popupStyle.Buttons.Size.Height;
872 ContentView.Size = new Size(Size.Width - titleX * 2, Size.Height - titleY - titleH - buttonH);
873 ContentView.Position = new Position(titleX, titleY + titleH);
874 ContentView.RaiseToTop();
877 private void UpdateTitle()
879 if (titleText != null && string.IsNullOrEmpty(popupStyle.Title.Text.All) && popupStyle.Title.Size != null)
881 titleText.RaiseToTop();
885 /// ButtonClickEventArgs is a class to record button click event arguments which will sent to user.
887 /// <since_tizen> 6 </since_tizen>
888 [Obsolete("Deprecated in API8; Will be removed in API10")]
889 [global::System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1034:NestedTypesShouldNotBeVisible")]
890 public class ButtonClickEventArgs : EventArgs
892 /// <summary> Button index which is clicked in Popup </summary>
893 /// <since_tizen> 6 </since_tizen>
894 /// It will be removed in API10
895 [global::System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Design", "CA1051:Do not declare visible instance fields")]
896 [Obsolete("Deprecated in API8; Will be removed in API10")]
897 public int ButtonIndex;