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.Size.Height = (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
379 /// Title text string in Popup.
381 /// <since_tizen> 6 </since_tizen>
382 [Obsolete("Deprecated in API8; Will be removed in API10")]
383 public string TitleText
387 return popupStyle?.Title?.Text?.All;
393 if (popupStyle?.Title != null)
395 popupStyle.Title.Text = value;
402 /// Title text point size in Popup.
404 /// <since_tizen> 6 </since_tizen>
405 [Obsolete("Deprecated in API8; Will be removed in API10")]
406 public float TitlePointSize
410 return popupStyle?.Title?.PointSize?.All ?? 0;
414 if (popupStyle?.Title != null)
416 popupStyle.Title.PointSize = value;
422 /// Title text color in Popup.
424 /// <since_tizen> 6 </since_tizen>
425 [Obsolete("Deprecated in API8; Will be removed in API10")]
426 public Color TitleTextColor
430 return popupStyle?.Title?.TextColor?.All;
434 if (popupStyle?.Title != null)
436 popupStyle.Title.TextColor = value;
442 /// Title text horizontal alignment in Popup.
444 /// <since_tizen> 6 </since_tizen>
445 [Obsolete("Deprecated in API8; Will be removed in API10")]
446 public HorizontalAlignment TitleTextHorizontalAlignment
450 return popupStyle?.Title?.HorizontalAlignment ?? HorizontalAlignment.Center;
454 popupStyle.Title.HorizontalAlignment = value;
459 /// Title text's position in Popup.
461 /// <since_tizen> 6 </since_tizen>
462 [Obsolete("Deprecated in API8; Will be removed in API10")]
463 public Position TitleTextPosition
467 return popupStyle?.Title?.Position ?? new Position(0, 0, 0);
471 popupStyle.Title.Position = value;
476 /// Title text's height in Popup.
478 /// <since_tizen> 6 </since_tizen>
479 [Obsolete("Deprecated in API8; Will be removed in API10")]
480 public int TitleHeight
484 return (int)(popupStyle?.Title?.Size?.Height ?? 0);
488 if (popupStyle?.Title?.Size != null)
490 popupStyle.Title.Size.Height = value;
496 /// Content view in Popup, only can be gotten.
498 /// <since_tizen> 6 </since_tizen>
499 [Obsolete("Deprecated in API8; Will be removed in API10")]
500 public View ContentView
507 /// Button count in Popup.
509 /// <since_tizen> 6 </since_tizen>
510 [Obsolete("Deprecated in API8; Will be removed in API10")]
511 public int ButtonCount
518 /// Button height in Popup.
520 /// <since_tizen> 6 </since_tizen>
521 [Obsolete("Deprecated in API8; Will be removed in API10")]
522 public int ButtonHeight
526 return (int)GetValue(ButtonHeightProperty);
530 SetValue(ButtonHeightProperty, value);
535 /// Button text point size in Popup.
537 /// <since_tizen> 6 </since_tizen>
538 [Obsolete("Deprecated in API8; Will be removed in API10")]
539 public float ButtonTextPointSize
543 return (float)GetValue(ButtonTextPointSizeProperty);
547 SetValue(ButtonTextPointSizeProperty, value);
552 /// Button text font family in Popup.
554 /// <since_tizen> 6 </since_tizen>
555 [Obsolete("Deprecated in API8; Will be removed in API10")]
556 public string ButtonFontFamily
560 return (string)GetValue(ButtonFontFamilyProperty);
564 SetValue(ButtonFontFamilyProperty, value);
569 /// Button text color in Popup.
571 /// <since_tizen> 6 </since_tizen>
572 [Obsolete("Deprecated in API8; Will be removed in API10")]
573 public Color ButtonTextColor
577 return (Color)GetValue(ButtonTextColorProperty);
581 SetValue(ButtonTextColorProperty, value);
586 /// Button overlay background color selector in Popup.
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 Selector<Color> ButtonOverLayBackgroundColorSelector
595 return (Selector<Color>)GetValue(ButtonOverLayBackgroundColorSelectorProperty);
599 SetValue(ButtonOverLayBackgroundColorSelectorProperty, value);
604 /// Button text horizontal alignment in Popup.
606 /// <since_tizen> 6 </since_tizen>
607 [Obsolete("Deprecated in API8; Will be removed in API10")]
608 public HorizontalAlignment ButtonTextAlignment
612 return (HorizontalAlignment)GetValue(ButtonTextAlignmentProperty);
616 SetValue(ButtonTextAlignmentProperty, value);
621 /// Button background image's resource url in Popup.
623 /// <since_tizen> 6 </since_tizen>
624 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
625 [EditorBrowsable(EditorBrowsableState.Never)]
626 public string ButtonBackground
630 return (string)GetValue(ButtonBackgroundProperty);
634 SetValue(ButtonBackgroundProperty, value);
639 /// Button background image's border in Popup.
641 /// <since_tizen> 6 </since_tizen>
642 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
643 [EditorBrowsable(EditorBrowsableState.Never)]
644 public Rectangle ButtonBackgroundBorder
649 return (Rectangle)GetValue(ButtonBackgroundBorderProperty);
653 SetValue(ButtonBackgroundBorderProperty, value);
658 /// Button's image shadow in Popup.
660 /// <since_tizen> 6 </since_tizen>
661 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
662 [EditorBrowsable(EditorBrowsableState.Never)]
663 public ImageShadow ButtonImageShadow
665 get => (ImageShadow)GetValue(ButtonImageShadowProperty);
666 set => SetValue(ButtonImageShadowProperty, value);
671 /// Set button text by index.
673 /// <param name="index">Button index.</param>
674 /// <param name="text">Button text string.</param>
675 /// <since_tizen> 6 </since_tizen>
676 [Obsolete("Deprecated in API8; Will be removed in API10")]
677 public void SetButtonText(int index, string text)
683 /// Dispose Popup and all children on it.
685 /// <param name="type">Dispose type.</param>
686 /// <since_tizen> 6 </since_tizen>
687 [Obsolete("Deprecated in API8; Will be removed in API10")]
688 protected override void Dispose(DisposeTypes type)
695 if (type == DisposeTypes.Explicit)
697 if (titleText != null)
703 if (ContentView != null)
706 ContentView.Dispose();
721 /// Focus gained callback.
723 /// <since_tizen> 6 </since_tizen>
724 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
725 [EditorBrowsable(EditorBrowsableState.Never)]
726 public override void OnFocusGained()
728 base.OnFocusGained();
732 /// Focus lost callback.
734 /// <since_tizen> 6 </since_tizen>
735 /// This will be public opened in tizen_5.5 after ACR done. Before ACR, need to be hidden as inhouse API.
736 [EditorBrowsable(EditorBrowsableState.Never)]
737 public override void OnFocusLost()
743 /// Apply style to popup.
745 /// <param name="viewStyle">The style to apply.</param>
746 [EditorBrowsable(EditorBrowsableState.Never)]
747 public override void ApplyStyle(ViewStyle viewStyle)
749 base.ApplyStyle(viewStyle);
750 PopupStyle ppStyle = viewStyle as PopupStyle;
753 if (ppStyle.Buttons != null)
755 if (ppStyle.Buttons.PositionUsesPivotPoint == null) ppStyle.Buttons.PositionUsesPivotPoint = true;
756 if (ppStyle.Buttons.ParentOrigin == null) ppStyle.Buttons.ParentOrigin = Tizen.NUI.ParentOrigin.BottomLeft;
757 if (ppStyle.Buttons.PivotPoint == null) ppStyle.Buttons.PivotPoint = Tizen.NUI.PivotPoint.BottomLeft;
759 Title.ApplyStyle(ppStyle.Title);
767 /// <returns>The default popup style.</returns>
768 [EditorBrowsable(EditorBrowsableState.Never)]
769 protected override ViewStyle CreateViewStyle()
771 return new PopupStyle();
775 [EditorBrowsable(EditorBrowsableState.Never)]
776 protected override void OnUpdate()
782 private void Initialize()
785 container.SetTouchConsumed(true);
786 container.SetHoverConsumed(true);
788 LeaveRequired = true;
789 PropertyChanged += PopupStylePropertyChanged;
792 ContentView = new View()
794 ParentOrigin = Tizen.NUI.ParentOrigin.TopLeft,
795 PivotPoint = Tizen.NUI.PivotPoint.TopLeft,
796 PositionUsesPivotPoint = true
799 ContentView.RaiseToTop();
802 btGroup = new ButtonGroup(this);
805 private void UpdateView()
807 if (popupStyle == null) return;
808 btGroup.UpdateButton(popupStyle.Buttons);
813 private void ButtonClickEvent(object sender, Button.ClickEventArgs e)
815 if (PopupButtonClickEvent != null && btGroup.Count > 0)
817 Button button = sender as Button;
818 for (int i = 0; i < btGroup.Count; i++)
820 if (button == GetButton(i))
822 ButtonClickEventArgs args = new ButtonClickEventArgs();
823 args.ButtonIndex = i;
824 PopupButtonClickEvent(this, args);
830 private void PopupStylePropertyChanged(object sender, PropertyChangedEventArgs e)
832 if (e.PropertyName.Equals("LayoutDirection"))
834 btGroup.UpdateButton(popupStyle.Buttons);
838 private void UpdateContentView()
844 string strText = Title.Text;
845 if (!string.IsNullOrEmpty(strText) && Title.Size != null)
847 titleH = (int)titleText.Size.Height;
850 if (!string.IsNullOrEmpty(strText) && Title.Position != null)
852 titleX = (int)Title.Position.X;
853 titleY = (int)Title.Position.Y;
856 if (btGroup.Count != 0 && popupStyle?.Buttons?.Size != null )
858 buttonH = (int)popupStyle.Buttons.Size.Height;
860 ContentView.Size = new Size(Size.Width - titleX * 2, Size.Height - titleY - titleH - buttonH);
861 ContentView.Position = new Position(titleX, titleY + titleH);
862 ContentView.RaiseToTop();
865 private void UpdateTitle()
867 if (titleText != null && string.IsNullOrEmpty(popupStyle.Title.Text.All) && popupStyle.Title.Size != null)
869 titleText.RaiseToTop();
873 /// ButtonClickEventArgs is a class to record button click event arguments which will sent to user.
875 /// <since_tizen> 6 </since_tizen>
876 [Obsolete("Deprecated in API8; Will be removed in API10")]
877 public class ButtonClickEventArgs : EventArgs
879 /// <summary> Button index which is clicked in Popup </summary>
880 /// <since_tizen> 6 </since_tizen>
881 [Obsolete("Deprecated in API8; Will be removed in API10")]
882 public int ButtonIndex;