2 * Copyright(c) 2022 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.
19 using System.ComponentModel;
20 using Tizen.NUI.BaseComponents;
21 using Tizen.NUI.Binding;
26 /// This class creates a border UI.
28 [EditorBrowsable(EditorBrowsableState.Never)]
29 public class DefaultBorder : BindableObject, IDisposable, IBorderInterface
31 #region Constant Fields
32 private static readonly string ResourcePath = FrameworkInformation.ResourcePath;
33 private static readonly string MinimalizeIcon = ResourcePath + "minimalize.png";
34 private static readonly string MaximalizeIcon = ResourcePath + "maximalize.png";
35 private static readonly string CloseIcon = ResourcePath + "close.png";
36 private static readonly string LeftCornerIcon = ResourcePath + "leftCorner.png";
37 private static readonly string RightCornerIcon = ResourcePath + "rightCorner.png";
39 private static readonly string DarkMinimalizeIcon = ResourcePath + "dark_minimalize.png";
40 private static readonly string DarkPreviousIcon = ResourcePath + "dark_smallwindow.png";
41 private static readonly string DarkCloseIcon = ResourcePath + "dark_close.png";
42 private static readonly string DarkLeftCornerIcon = ResourcePath + "dark_leftCorner.png";
43 private static readonly string DarkRightCornerIcon = ResourcePath + "dark_rightCorner.png";
46 private const float DefaultHeight = 50;
47 private const uint DefaultLineThickness = 5;
48 private const uint DefaultTouchThickness = 0;
49 private static readonly Color DefaultBackgroundColor = new Color(1, 1, 1, 0.3f);
50 private static readonly Color DefaultClickedBackgroundColor = new Color(1, 1, 1, 0.4f);
51 private static readonly Size2D DefaultMinSize = new Size2D(100, 0);
52 #endregion //Constant Fields
56 private bool disposed = false;
57 private Color backgroundColor;
58 private View borderView;
60 private ImageView minimalizeIcon;
61 private ImageView maximalizeIcon;
62 private ImageView closeIcon;
63 private ImageView leftCornerIcon;
64 private ImageView rightCornerIcon;
66 private Window.BorderDirection direction = Window.BorderDirection.None;
67 private float preScale = 0;
69 private View windowView = null;
70 private bool isWinGestures = false;
72 private Timer overlayTimer;
74 private CurrentGesture currentGesture = CurrentGesture.None;
76 private uint borderLineThickness;
77 private Size2D minSize;
78 private Size2D maxSize;
79 private Window.BorderResizePolicyType resizePolicy;
84 private PanGestureDetector borderPanGestureDetector;
88 private enum CurrentGesture
99 [EditorBrowsable(EditorBrowsableState.Never)]
100 public static readonly BindableProperty BorderLineThicknessProperty = BindableProperty.Create(nameof(BorderLineThickness), typeof(uint), typeof(DefaultBorder), default(uint), propertyChanged: (bindable, oldValue, newValue) =>
102 var instance = (DefaultBorder)bindable;
103 if (newValue != null)
105 instance.borderLineThickness = (uint)newValue;
106 instance.UpdateProperty();
109 defaultValueCreator: (bindable) =>
111 var instance = (DefaultBorder)bindable;
112 return instance.borderLineThickness;
115 [EditorBrowsable(EditorBrowsableState.Never)]
116 public static readonly BindableProperty MinSizeProperty = BindableProperty.Create(nameof(MinSize), typeof(Size2D), typeof(DefaultBorder), default(Size2D), propertyChanged: (bindable, oldValue, newValue) =>
118 var instance = (DefaultBorder)bindable;
119 if (newValue != null)
121 instance.minSize = (Size2D)newValue;
122 instance.UpdateProperty();
125 defaultValueCreator: (bindable) =>
127 var instance = (DefaultBorder)bindable;
128 return instance.minSize;
131 [EditorBrowsable(EditorBrowsableState.Never)]
132 public static readonly BindableProperty MaxSizeProperty = BindableProperty.Create(nameof(MaxSize), typeof(Size2D), typeof(DefaultBorder), default(Size2D), propertyChanged: (bindable, oldValue, newValue) =>
134 var instance = (DefaultBorder)bindable;
135 if (newValue != null)
137 instance.maxSize = (Size2D)newValue;
138 instance.UpdateProperty();
141 defaultValueCreator: (bindable) =>
143 var instance = (DefaultBorder)bindable;
144 return instance.maxSize;
147 [EditorBrowsable(EditorBrowsableState.Never)]
148 public static readonly BindableProperty ResizePolicyProperty = BindableProperty.Create(nameof(ResizePolicy), typeof(Window.BorderResizePolicyType), typeof(DefaultBorder), default(Window.BorderResizePolicyType), propertyChanged: (bindable, oldValue, newValue) =>
150 var instance = (DefaultBorder)bindable;
151 if (newValue != null)
153 instance.resizePolicy = (Window.BorderResizePolicyType)newValue;
154 instance.UpdateProperty();
157 defaultValueCreator: (bindable) =>
159 var instance = (DefaultBorder)bindable;
160 return instance.resizePolicy;
165 /// The thickness of the border.
167 [EditorBrowsable(EditorBrowsableState.Never)]
168 public uint BorderLineThickness
172 return (uint)GetValue(BorderLineThicknessProperty);
176 SetValue(BorderLineThicknessProperty, value);
181 /// The thickness of the border's touch area.
183 [EditorBrowsable(EditorBrowsableState.Never)]
184 public uint TouchThickness {get; set;}
187 /// The height of the border.
188 /// This value is the initial value used when creating borders.
190 [EditorBrowsable(EditorBrowsableState.Never)]
191 public float BorderHeight {get; set;}
194 /// The minimum size by which the window will small.
196 [EditorBrowsable(EditorBrowsableState.Never)]
197 public Size2D MinSize
201 return (Size2D)GetValue(MinSizeProperty);
205 SetValue(MinSizeProperty, value);
210 /// The maximum size by which the window will big.
212 [EditorBrowsable(EditorBrowsableState.Never)]
213 public Size2D MaxSize
217 return (Size2D)GetValue(MaxSizeProperty);
221 SetValue(MaxSizeProperty, value);
226 /// The window with borders added.
228 [EditorBrowsable(EditorBrowsableState.Never)]
229 public Window BorderWindow {get; set;}
232 /// Whether overlay mode.
233 /// If overlay mode is true, the border area is hidden when the window is maximized.
234 /// And if you touched at screen, the border area is shown on the screen.
235 /// Default value is false;
237 [EditorBrowsable(EditorBrowsableState.Never)]
238 public bool OverlayMode {get; set;}
241 /// Set the window resizing policy.
242 /// Default value is BorderResizePolicyType.Free;
244 [EditorBrowsable(EditorBrowsableState.Never)]
245 public Window.BorderResizePolicyType ResizePolicy
249 return (Window.BorderResizePolicyType)GetValue(ResizePolicyProperty);
253 SetValue(ResizePolicyProperty, value);
258 /// Update properties
260 [EditorBrowsable(EditorBrowsableState.Never)]
261 public void UpdateProperty()
263 BorderWindow?.UpdateProperty();
267 /// Creates a default border
269 [EditorBrowsable(EditorBrowsableState.Never)]
270 public DefaultBorder() : base()
272 BorderLineThickness = DefaultLineThickness;
273 TouchThickness = DefaultTouchThickness;
274 BorderHeight = DefaultHeight;
275 MinSize = DefaultMinSize;
277 ResizePolicy = Window.BorderResizePolicyType.Free;
281 /// Create top border UI. User can override this method to draw top border UI.
283 /// <param name="topView">The top view on which the border.</param>
284 [EditorBrowsable(EditorBrowsableState.Never)]
285 public virtual bool CreateTopBorderView(View topView)
291 /// Create bottom border UI. User can override this method to draw bottom border UI.
293 /// <param name="bottomView">The bottom view on which the border.</param>
294 [EditorBrowsable(EditorBrowsableState.Never)]
295 public virtual bool CreateBottomBorderView(View bottomView)
297 if (bottomView == null)
301 bottomView.Layout = new RelativeLayout();
303 minimalizeIcon = new ImageView()
306 ResourceUrl = MinimalizeIcon,
307 AccessibilityHighlightable = true,
310 maximalizeIcon = new ImageView()
313 ResourceUrl = MaximalizeIcon,
314 AccessibilityHighlightable = true,
317 closeIcon = new ImageView()
320 ResourceUrl = CloseIcon,
321 AccessibilityHighlightable = true,
324 leftCornerIcon = new ImageView()
327 ResourceUrl = LeftCornerIcon,
328 AccessibilityHighlightable = true,
331 rightCornerIcon = new ImageView()
334 ResourceUrl = RightCornerIcon,
335 AccessibilityHighlightable = true,
338 RelativeLayout.SetRightTarget(minimalizeIcon, maximalizeIcon);
339 RelativeLayout.SetRightRelativeOffset(minimalizeIcon, 0.0f);
340 RelativeLayout.SetHorizontalAlignment(minimalizeIcon, RelativeLayout.Alignment.End);
341 RelativeLayout.SetRightTarget(maximalizeIcon, closeIcon);
342 RelativeLayout.SetRightRelativeOffset(maximalizeIcon, 0.0f);
343 RelativeLayout.SetHorizontalAlignment(maximalizeIcon, RelativeLayout.Alignment.End);
344 RelativeLayout.SetRightTarget(closeIcon, rightCornerIcon);
345 RelativeLayout.SetRightRelativeOffset(closeIcon, 0.0f);
346 RelativeLayout.SetHorizontalAlignment(closeIcon, RelativeLayout.Alignment.End);
347 RelativeLayout.SetRightRelativeOffset(rightCornerIcon, 1.0f);
348 RelativeLayout.SetHorizontalAlignment(rightCornerIcon, RelativeLayout.Alignment.End);
349 bottomView.Add(leftCornerIcon);
350 bottomView.Add(minimalizeIcon);
351 bottomView.Add(maximalizeIcon);
352 bottomView.Add(closeIcon);
353 bottomView.Add(rightCornerIcon);
356 minimalizeIcon.TouchEvent += OnMinimizeIconTouched;
357 maximalizeIcon.TouchEvent += OnMaximizeIconTouched;
358 closeIcon.TouchEvent += OnCloseIconTouched;
359 leftCornerIcon.TouchEvent += OnLeftBottomCornerIconTouched;
360 rightCornerIcon.TouchEvent += OnRightBottomCornerIconTouched;
362 minimalizeIcon.AccessibilityActivated += (s, e) =>
364 MinimizeBorderWindow();
366 maximalizeIcon.AccessibilityActivated += (s, e) =>
368 MaximizeBorderWindow();
370 closeIcon.AccessibilityActivated += (s, e) =>
375 minimalizeIcon.AccessibilityNameRequested += (s, e) =>
379 maximalizeIcon.AccessibilityNameRequested += (s, e) =>
383 closeIcon.AccessibilityNameRequested += (s, e) =>
387 leftCornerIcon.AccessibilityNameRequested += (s, e) =>
391 rightCornerIcon.AccessibilityNameRequested += (s, e) =>
396 minimalizeIcon.SetAccessibilityReadingInfoTypes(Tizen.NUI.BaseComponents.AccessibilityReadingInfoTypes.Name);
397 maximalizeIcon.SetAccessibilityReadingInfoTypes(Tizen.NUI.BaseComponents.AccessibilityReadingInfoTypes.Name);
398 closeIcon.SetAccessibilityReadingInfoTypes(Tizen.NUI.BaseComponents.AccessibilityReadingInfoTypes.Name);
399 leftCornerIcon.SetAccessibilityReadingInfoTypes(Tizen.NUI.BaseComponents.AccessibilityReadingInfoTypes.Name);
400 rightCornerIcon.SetAccessibilityReadingInfoTypes(Tizen.NUI.BaseComponents.AccessibilityReadingInfoTypes.Name);
407 /// Create border UI. User can override this method to draw border UI.
408 /// A top border and a bottom border are added to this view.
410 /// <param name="borderView">The root view on which the border.</param>
411 [EditorBrowsable(EditorBrowsableState.Never)]
412 public virtual void CreateBorderView(View borderView)
414 if (borderView == null)
419 if (string.IsNullOrEmpty(borderView.BackgroundImage))
421 borderView.BackgroundColor = DefaultBackgroundColor;
423 borderView.BorderlineColor = new Color(0.5f, 0.5f, 0.5f, 0.3f);
424 borderView.BorderlineWidth = 1.0f;
425 borderView.BorderlineOffset = -1f;
426 borderView.CornerRadius = new Vector4(0.03f, 0.03f, 0.03f, 0.03f);
427 borderView.CornerRadiusPolicy = VisualTransformPolicyType.Relative;
429 // Register touch event for effect when border is touched.
430 borderView.LeaveRequired = true;
431 borderView.TouchEvent += OnBorderViewTouched;
432 this.borderView = borderView;
435 private bool OnBorderViewTouched(object sender, View.TouchEventArgs e)
437 if (string.IsNullOrEmpty(borderView.BackgroundImage))
439 if (e.Touch.GetState(0) == PointStateType.Started)
441 backgroundColor = new Color(borderView.BackgroundColor);
442 borderView.BackgroundColor = DefaultClickedBackgroundColor;
444 else if (e.Touch.GetState(0) == PointStateType.Finished ||
445 e.Touch.GetState(0) == PointStateType.Leave ||
446 e.Touch.GetState(0) == PointStateType.Interrupted)
448 borderView.BackgroundColor = backgroundColor;
454 /// Determines the behavior of pinch gesture.
455 private void OnPinchGestureDetected(object source, PinchGestureDetector.DetectedEventArgs e)
461 if (e.PinchGesture.State == Gesture.StateType.Started)
463 preScale = e.PinchGesture.Scale;
465 else if (e.PinchGesture.State == Gesture.StateType.Finished || e.PinchGesture.State == Gesture.StateType.Cancelled)
467 if (preScale > e.PinchGesture.Scale)
469 if (BorderWindow.IsMaximized())
471 BorderWindow.Maximize(false);
475 BorderWindow.Minimize(true);
481 BorderWindow.Maximize(true);
486 /// Determines the behavior of borders.
487 private void OnPanGestureDetected(object source, PanGestureDetector.DetectedEventArgs e)
493 PanGesture panGesture = e.PanGesture;
495 if (panGesture.State == Gesture.StateType.Started && panGesture.Position != null)
497 direction = BorderWindow.GetDirection(panGesture.Position.X, panGesture.Position.Y);
499 if (direction == Window.BorderDirection.Move)
501 if (BorderWindow.IsMaximized() == true)
503 BorderWindow.Maximize(false);
508 BorderWindow.RequestMoveToServer();
511 else if (direction != Window.BorderDirection.None && ResizePolicy != Window.BorderResizePolicyType.Fixed)
514 BorderWindow.RequestResizeToServer((Window.ResizeDirection)direction);
517 else if (panGesture.State == Gesture.StateType.Finished || panGesture.State == Gesture.StateType.Cancelled)
519 direction = Window.BorderDirection.None;
524 /// This is an event callback when the left top corner icon is touched.
526 [EditorBrowsable(EditorBrowsableState.Never)]
527 public virtual bool OnLeftTopCornerIconTouched(object sender, View.TouchEventArgs e)
529 SetDispatchParentGestureEvents(sender as View, false);
530 if (e != null && e.Touch.GetState(0) == PointStateType.Down)
532 if (ResizePolicy != Window.BorderResizePolicyType.Fixed)
535 BorderWindow.RequestResizeToServer(Window.ResizeDirection.TopLeft);
542 ///This is an event callback when the right bottom corner icon is touched.
544 [EditorBrowsable(EditorBrowsableState.Never)]
545 public virtual bool OnRightTopCornerIconTouched(object sender, View.TouchEventArgs e)
547 SetDispatchParentGestureEvents(sender as View, false);
548 if (e != null && e.Touch.GetState(0) == PointStateType.Down)
550 if (ResizePolicy != Window.BorderResizePolicyType.Fixed)
553 BorderWindow.RequestResizeToServer(Window.ResizeDirection.TopRight);
561 /// This is an event callback when the left bottom corner icon is touched.
563 [EditorBrowsable(EditorBrowsableState.Never)]
564 public virtual bool OnLeftBottomCornerIconTouched(object sender, View.TouchEventArgs e)
566 SetDispatchParentGestureEvents(sender as View, false);
567 if (e != null && e.Touch.GetState(0) == PointStateType.Down)
569 if (ResizePolicy != Window.BorderResizePolicyType.Fixed)
572 BorderWindow.RequestResizeToServer(Window.ResizeDirection.BottomLeft);
579 ///This is an event callback when the right bottom corner icon is touched.
581 [EditorBrowsable(EditorBrowsableState.Never)]
582 public virtual bool OnRightBottomCornerIconTouched(object sender, View.TouchEventArgs e)
584 SetDispatchParentGestureEvents(sender as View, false);
585 if (e != null && e.Touch.GetState(0) == PointStateType.Down)
587 if (ResizePolicy != Window.BorderResizePolicyType.Fixed)
590 BorderWindow.RequestResizeToServer(Window.ResizeDirection.BottomRight);
598 /// Minimize border window.
600 [EditorBrowsable(EditorBrowsableState.Never)]
601 protected void MinimizeBorderWindow()
603 BorderWindow.Minimize(true);
608 /// This is an event callback when the minimize icon is touched.
610 [EditorBrowsable(EditorBrowsableState.Never)]
611 public virtual bool OnMinimizeIconTouched(object sender, View.TouchEventArgs e)
613 SetDispatchParentGestureEvents(sender as View, false);
614 if (e != null && e.Touch.GetState(0) == PointStateType.Up)
616 MinimizeBorderWindow();
622 /// Maximize border window.
624 [EditorBrowsable(EditorBrowsableState.Never)]
625 protected void MaximizeBorderWindow()
627 if (BorderWindow.IsMaximized())
629 BorderWindow.Maximize(false);
633 BorderWindow.Maximize(true);
638 /// This is an event callback when the maximum icon is touched.
640 [EditorBrowsable(EditorBrowsableState.Never)]
641 public virtual bool OnMaximizeIconTouched(object sender, View.TouchEventArgs e)
643 SetDispatchParentGestureEvents(sender as View, false);
644 if (e != null && e.Touch.GetState(0) == PointStateType.Up)
646 MaximizeBorderWindow();
652 /// Close border window.
654 [EditorBrowsable(EditorBrowsableState.Never)]
655 protected void CloseBorderWindow()
657 BorderWindow.BorderDestroy();
661 /// This is an event callback when the close icon is touched.
663 [EditorBrowsable(EditorBrowsableState.Never)]
664 public virtual bool OnCloseIconTouched(object sender, View.TouchEventArgs e)
666 SetDispatchParentGestureEvents(sender as View, false);
667 if (e != null && e.Touch.GetState(0) == PointStateType.Up)
674 private void SetDispatchParentGestureEvents(View view, bool dispatch)
678 // If this is set, my parents will not receive gesture events.
679 // This is to prevent the move action by PanGesture when the icon is touched.
680 view.DispatchParentGestureEvents = dispatch;
685 private void UpdateIcons()
687 if (BorderWindow != null && borderView != null)
689 if (BorderWindow.IsMaximized() == true)
691 if (maximalizeIcon != null)
693 maximalizeIcon.ResourceUrl = DarkPreviousIcon;
695 if (minimalizeIcon != null)
697 minimalizeIcon.ResourceUrl = DarkMinimalizeIcon;
699 if (closeIcon != null)
701 closeIcon.ResourceUrl = DarkCloseIcon;
703 if (leftCornerIcon != null)
705 leftCornerIcon.ResourceUrl = DarkLeftCornerIcon;
707 if (rightCornerIcon != null)
709 rightCornerIcon.ResourceUrl = DarkRightCornerIcon;
711 borderView.CornerRadius = new Vector4(0, 0, 0, 0);
712 borderView.CornerRadiusPolicy = VisualTransformPolicyType.Relative;
716 if (maximalizeIcon != null)
718 maximalizeIcon.ResourceUrl = MaximalizeIcon;
720 if (minimalizeIcon != null)
722 minimalizeIcon.ResourceUrl = MinimalizeIcon;
724 if (closeIcon != null)
726 closeIcon.ResourceUrl = CloseIcon;
728 if (leftCornerIcon != null)
730 leftCornerIcon.ResourceUrl = LeftCornerIcon;
732 if (rightCornerIcon != null)
734 rightCornerIcon.ResourceUrl = RightCornerIcon;
736 borderView.CornerRadius = new Vector4(0.03f, 0.03f, 0.03f, 0.03f);
737 borderView.CornerRadiusPolicy = VisualTransformPolicyType.Relative;
743 /// Called after the border UI is created.
745 /// <param name="borderView">The border view on which the border.</param>
746 [EditorBrowsable(EditorBrowsableState.Never)]
747 public virtual void OnCreated(View borderView)
749 if (borderView == null)
753 this.borderView = borderView;
755 BorderWindow.BackgroundColor = Color.Transparent;
757 // Register to resize and move through pan gestures.
758 borderPanGestureDetector = new PanGestureDetector();
759 borderPanGestureDetector.Attach(borderView);
760 borderPanGestureDetector.Detected += OnPanGestureDetected;
766 /// Called when requesting a resize
768 [EditorBrowsable(EditorBrowsableState.Never)]
769 public virtual void OnRequestResize() {}
772 /// Called when the window is resized.
774 /// <param name="width">The width of the resized window</param>
775 /// <param name="height">The height of the resized window</param>
776 [EditorBrowsable(EditorBrowsableState.Never)]
777 public virtual void OnResized(int width, int height)
779 if (overlayTimer != null)
782 overlayTimer.Dispose();
789 /// Called when requesting a move
791 [EditorBrowsable(EditorBrowsableState.Never)]
792 public virtual void OnRequestMove() {}
795 /// Called when the window is moved.
797 /// <param name="x">The x of the moved window</param>
798 /// <param name="y">The y of the moved window</param>
799 [EditorBrowsable(EditorBrowsableState.Never)]
800 public virtual void OnMoved(int x, int y) {}
803 /// Called when window has been moved the display server.
805 /// <param name="x">The x of the has been moved window</param>
806 /// <param name="y">The y of the has been moved window</param>
807 [EditorBrowsable(EditorBrowsableState.Never)]
808 public virtual void OnMoveCompleted(int x, int y) {}
811 /// Called when window has been resized the display server.
813 /// <param name="width">The width of the resized window</param>
814 /// <param name="height">The height of the resized window</param>
815 [EditorBrowsable(EditorBrowsableState.Never)]
816 public virtual void OnResizeCompleted(int width, int height) {}
819 /// Called when the window is maximized.
821 /// <param name="isMaximized">If window is maximized or unmaximized.</param>
822 [EditorBrowsable(EditorBrowsableState.Never)]
823 public virtual void OnMaximize(bool isMaximized)
825 Tizen.Log.Info("NUI", $"OnMaximize {isMaximized}\n");
826 if (BorderWindow.IsMaximized() == true)
828 BorderWindow.SetTransparency(false);
832 BorderWindow.SetTransparency(true);
838 /// Called when the window is minimized.
840 /// <param name="isMinimized">If window is mnimized or unminimized.</param>
841 [EditorBrowsable(EditorBrowsableState.Never)]
842 public virtual void OnMinimize(bool isMinimized)
848 /// Called when there is a change in overlay mode.
850 /// <param name="enabled">If true, borderView has entered overlayMode.</param>
851 [EditorBrowsable(EditorBrowsableState.Never)]
852 public virtual void OnOverlayMode(bool enabled)
854 if (borderView != null && OverlayMode == true)
856 Tizen.Log.Info("NUI", $"OnOverlayMode {enabled}\n");
859 backgroundColor = new Color(borderView.BackgroundColor);
860 if (string.IsNullOrEmpty(borderView.BackgroundImage))
862 borderView.BackgroundColor = Color.Transparent;
868 if (string.IsNullOrEmpty(borderView.BackgroundImage))
870 borderView.BackgroundColor = backgroundColor;
878 /// Show the border when OverlayMode is true and the window is now Maximize.
880 /// <param name="time">Time(ms) for borders to disappear again</param>
881 /// <returns>True if border became show, false otherwise</returns>
882 [EditorBrowsable(EditorBrowsableState.Never)]
883 public virtual bool OverlayBorderShow(uint time = 3000)
885 if (BorderWindow != null && BorderWindow.IsMaximized())
887 if (overlayTimer == null)
889 overlayTimer = new Timer(time);
890 overlayTimer.Tick += (s, e) =>
893 overlayTimer?.Stop();
894 overlayTimer?.Dispose();
898 overlayTimer.Start();
903 overlayTimer.Start();
911 /// Hide the border when OverlayMode is true and the window is now Maximize.
913 /// <returns>True if border became hide, false otherwise</returns>
914 [EditorBrowsable(EditorBrowsableState.Never)]
915 public virtual bool OverlayBorderHide()
917 if (BorderWindow != null && BorderWindow.IsMaximized())
920 overlayTimer?.Stop();
921 overlayTimer?.Dispose();
928 [EditorBrowsable(EditorBrowsableState.Never)]
929 public void Dispose()
932 global::System.GC.SuppressFinalize(this);
935 protected virtual void Dispose(bool disposing)
944 borderView?.Dispose();
945 windowView?.Dispose();
946 borderPanGestureDetector?.Dispose();
947 backgroundColor?.Dispose();
948 minimalizeIcon?.Dispose();
949 maximalizeIcon?.Dispose();
950 closeIcon?.Dispose();
951 leftCornerIcon?.Dispose();
952 rightCornerIcon?.Dispose();
954 overlayTimer?.Dispose();