2 * Copyright(c) 2021 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 System.Runtime.InteropServices;
22 namespace Tizen.NUI.BaseComponents
25 /// View is the base class for all views.
27 /// <since_tizen> 3 </since_tizen>
28 public partial class View
30 private EventHandler offWindowEventHandler;
31 private OffWindowEventCallbackType offWindowEventCallback;
32 private EventHandlerWithReturnType<object, WheelEventArgs, bool> interceptWheelHandler;
33 private WheelEventCallbackType interceptWheelCallback;
34 private EventHandlerWithReturnType<object, WheelEventArgs, bool> wheelEventHandler;
35 private WheelEventCallbackType wheelEventCallback;
36 private EventHandlerWithReturnType<object, KeyEventArgs, bool> keyEventHandler;
37 private KeyCallbackType keyCallback;
38 private EventHandlerWithReturnType<object, TouchEventArgs, bool> interceptTouchDataEventHandler;
39 private TouchDataCallbackType interceptTouchDataCallback;
40 private EventHandlerWithReturnType<object, TouchEventArgs, bool> touchDataEventHandler;
41 private TouchDataCallbackType touchDataCallback;
42 private EventHandlerWithReturnType<object, HoverEventArgs, bool> hoverEventHandler;
43 private HoverEventCallbackType hoverEventCallback;
44 private EventHandler<VisibilityChangedEventArgs> visibilityChangedEventHandler;
45 private VisibilityChangedEventCallbackType visibilityChangedEventCallback;
46 private EventHandler keyInputFocusGainedEventHandler;
48 private KeyInputFocusGainedCallbackType keyInputFocusGainedCallback;
49 private EventHandler keyInputFocusLostEventHandler;
51 private KeyInputFocusLostCallbackType keyInputFocusLostCallback;
52 private EventHandler onRelayoutEventHandler;
53 private OnRelayoutEventCallbackType onRelayoutEventCallback;
54 private EventHandler onWindowEventHandler;
55 private OnWindowEventCallbackType onWindowEventCallback;
56 private EventHandler<LayoutDirectionChangedEventArgs> layoutDirectionChangedEventHandler;
57 private LayoutDirectionChangedEventCallbackType layoutDirectionChangedEventCallback;
58 // Resource Ready Signal
59 private EventHandler resourcesLoadedEventHandler;
60 private ResourcesLoadedCallbackType resourcesLoadedCallback;
61 private EventHandler<BackgroundResourceLoadedEventArgs> backgroundResourceLoadedEventHandler;
62 private _backgroundResourceLoadedCallbackType backgroundResourceLoadedCallback;
63 private TouchDataCallbackType hitTestResultDataCallback;
65 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
66 private delegate void OffWindowEventCallbackType(IntPtr control);
67 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
68 private delegate bool WheelEventCallbackType(IntPtr view, IntPtr wheelEvent);
69 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
70 private delegate bool KeyCallbackType(IntPtr control, IntPtr keyEvent);
71 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
72 private delegate bool TouchDataCallbackType(IntPtr view, IntPtr touchData);
73 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
74 private delegate bool HoverEventCallbackType(IntPtr view, IntPtr hoverEvent);
75 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
76 private delegate void VisibilityChangedEventCallbackType(IntPtr data, bool visibility, VisibilityChangeType type);
77 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
78 private delegate void ResourcesLoadedCallbackType(IntPtr control);
79 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
80 private delegate void _backgroundResourceLoadedCallbackType(IntPtr view);
82 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
83 private delegate void KeyInputFocusGainedCallbackType(IntPtr control);
84 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
85 private delegate void KeyInputFocusLostCallbackType(IntPtr control);
87 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
88 private delegate void OnRelayoutEventCallbackType(IntPtr control);
89 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
90 private delegate void OnWindowEventCallbackType(IntPtr control);
91 [UnmanagedFunctionPointer(CallingConvention.Cdecl)]
92 private delegate void LayoutDirectionChangedEventCallbackType(IntPtr data, ViewLayoutDirectionType type);
94 // List of dispatch Event
95 private PanGestureDetector panGestureDetector = null;
96 private LongPressGestureDetector longGestureDetector = null;
97 private PinchGestureDetector pinchGestureDetector = null;
98 private TapGestureDetector tapGestureDetector = null;
99 private RotationGestureDetector rotationGestureDetector = null;
100 private int configGestureCount = 0;
101 private bool dispatchTouchEvents = true;
102 private bool dispatchParentTouchEvents = true;
103 private bool dispatchHoverEvents = true;
104 private bool dispatchParentHoverEvents = true;
105 private bool dispatchGestureEvents = true;
106 private bool dispatchParentGestureEvents = true;
107 private bool dispatchTouchMotion = true;
108 private bool dispatchHoverMotion = true;
112 /// Event when a child is removed.
114 /// <since_tizen> 5 </since_tizen>
115 public new event EventHandler<ChildRemovedEventArgs> ChildRemoved;
117 /// Event when a child is added.
119 /// <since_tizen> 5 </since_tizen>
120 public new event EventHandler<ChildAddedEventArgs> ChildAdded;
123 /// An event for the KeyInputFocusGained signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
124 /// The KeyInputFocusGained signal is emitted when the control gets the key input focus.<br />
126 /// <since_tizen> 3 </since_tizen>
127 public event EventHandler FocusGained
131 if (keyInputFocusGainedEventHandler == null)
133 keyInputFocusGainedCallback = OnKeyInputFocusGained;
134 Interop.ViewSignal.KeyInputFocusGainedConnect(SwigCPtr, keyInputFocusGainedCallback.ToHandleRef(this));
135 NDalicPINVOKE.ThrowExceptionIfExists();
137 keyInputFocusGainedEventHandler += value;
142 keyInputFocusGainedEventHandler -= value;
143 if (keyInputFocusGainedEventHandler == null && keyInputFocusGainedCallback != null)
145 Interop.ViewSignal.KeyInputFocusGainedDisconnect(SwigCPtr, keyInputFocusGainedCallback.ToHandleRef(this));
146 NDalicPINVOKE.ThrowExceptionIfExists();
147 keyInputFocusGainedCallback = null;
153 /// An event for the KeyInputFocusLost signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
154 /// The KeyInputFocusLost signal is emitted when the control loses the key input focus.<br />
156 /// <since_tizen> 3 </since_tizen>
157 public event EventHandler FocusLost
161 if (keyInputFocusLostEventHandler == null)
163 keyInputFocusLostCallback = OnKeyInputFocusLost;
164 Interop.ViewSignal.KeyInputFocusLostConnect(SwigCPtr, keyInputFocusLostCallback.ToHandleRef(this));
165 NDalicPINVOKE.ThrowExceptionIfExists();
167 keyInputFocusLostEventHandler += value;
172 keyInputFocusLostEventHandler -= value;
173 if (keyInputFocusLostEventHandler == null && keyInputFocusLostCallback != null)
175 Interop.ViewSignal.KeyInputFocusLostDisconnect(SwigCPtr, keyInputFocusLostCallback.ToHandleRef(this));
176 NDalicPINVOKE.ThrowExceptionIfExists();
177 keyInputFocusLostCallback = null;
183 /// An event for the KeyPressed signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
184 /// The KeyPressed signal is emitted when the key event is received.<br />
186 /// <since_tizen> 3 </since_tizen>
187 public event EventHandlerWithReturnType<object, KeyEventArgs, bool> KeyEvent
191 if (keyEventHandler == null)
193 keyCallback = OnKeyEvent;
194 Interop.ViewSignal.KeyEventConnect(SwigCPtr, keyCallback.ToHandleRef(this));
195 NDalicPINVOKE.ThrowExceptionIfExists();
197 keyEventHandler += value;
202 keyEventHandler -= value;
203 if (keyEventHandler == null && keyCallback != null)
205 Interop.ViewSignal.KeyEventDisconnect(SwigCPtr, keyCallback.ToHandleRef(this));
206 NDalicPINVOKE.ThrowExceptionIfExists();
213 /// An event for the OnRelayout signal which can be used to subscribe or unsubscribe the event handler.<br />
214 /// The OnRelayout signal is emitted after the size has been set on the view during relayout.<br />
216 /// <since_tizen> 3 </since_tizen>
217 public event EventHandler Relayout
221 if (onRelayoutEventHandler == null)
223 onRelayoutEventCallback = OnRelayout;
224 Interop.ActorSignal.OnRelayoutConnect(SwigCPtr, onRelayoutEventCallback.ToHandleRef(this));
225 NDalicPINVOKE.ThrowExceptionIfExists();
227 onRelayoutEventHandler += value;
232 onRelayoutEventHandler -= value;
233 if (onRelayoutEventHandler == null && onRelayoutEventCallback != null)
235 Interop.ActorSignal.OnRelayoutDisconnect(SwigCPtr, onRelayoutEventCallback.ToHandleRef(this));
236 NDalicPINVOKE.ThrowExceptionIfExists();
237 onRelayoutEventCallback = null;
243 /// An event for the touched signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
244 /// The touched signal is emitted when the touch input is received.<br />
245 /// This can receive touch events before child. <br />
246 /// If it returns false, the child can receive the touch event. If it returns true, the touch event is intercepted. So child cannot receive touch event.<br />
248 [EditorBrowsable(EditorBrowsableState.Never)]
249 public event EventHandlerWithReturnType<object, TouchEventArgs, bool> InterceptTouchEvent
253 if (interceptTouchDataEventHandler == null)
255 interceptTouchDataCallback = OnInterceptTouch;
256 Interop.ActorSignal.InterceptTouchConnect(SwigCPtr, interceptTouchDataCallback.ToHandleRef(this));
257 NDalicPINVOKE.ThrowExceptionIfExists();
259 interceptTouchDataEventHandler += value;
264 interceptTouchDataEventHandler -= value;
265 if (interceptTouchDataEventHandler == null && interceptTouchDataCallback != null)
267 Interop.ActorSignal.InterceptTouchDisconnect(SwigCPtr, interceptTouchDataCallback.ToHandleRef(this));
268 NDalicPINVOKE.ThrowExceptionIfExists();
269 interceptTouchDataCallback = null;
275 /// If child view doesn't want the parent's view to intercept the touch, you can set it to true.
277 /// parent.Add(child);
278 /// parent.InterceptTouchEvent += OnInterceptTouchEvent;
279 /// View view = child.GetParent() as View;
280 /// view.DisallowInterceptTouchEvent = true;
281 /// This prevents the parent from intercepting touch.
283 [EditorBrowsable(EditorBrowsableState.Never)]
284 public bool DisallowInterceptTouchEvent { get; set; }
288 /// An event for the touched signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
289 /// The touched signal is emitted when the touch input is received.<br />
291 /// <since_tizen> 3 </since_tizen>
292 public event EventHandlerWithReturnType<object, TouchEventArgs, bool> TouchEvent
296 if (touchDataEventHandler == null)
298 touchDataCallback = OnTouch;
299 Interop.ActorSignal.TouchConnect(SwigCPtr, touchDataCallback.ToHandleRef(this));
300 NDalicPINVOKE.ThrowExceptionIfExists();
302 touchDataEventHandler += value;
307 touchDataEventHandler -= value;
308 if (touchDataEventHandler == null && touchDataCallback != null)
310 Interop.ActorSignal.TouchDisconnect(SwigCPtr, touchDataCallback.ToHandleRef(this));
311 NDalicPINVOKE.ThrowExceptionIfExists();
312 touchDataCallback = null;
318 /// An event for the hovered signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
319 /// The hovered signal is emitted when the hover input is received.<br />
321 /// <since_tizen> 3 </since_tizen>
322 public event EventHandlerWithReturnType<object, HoverEventArgs, bool> HoverEvent
326 if (hoverEventHandler == null)
328 hoverEventCallback = OnHoverEvent;
329 Interop.ActorSignal.HoveredConnect(SwigCPtr, hoverEventCallback.ToHandleRef(this));
330 NDalicPINVOKE.ThrowExceptionIfExists();
332 hoverEventHandler += value;
337 hoverEventHandler -= value;
338 if (hoverEventHandler == null && hoverEventCallback != null)
340 Interop.ActorSignal.HoveredDisconnect(SwigCPtr, hoverEventCallback.ToHandleRef(this));
341 NDalicPINVOKE.ThrowExceptionIfExists();
342 hoverEventCallback = null;
348 /// An event for the wheel which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
349 /// The wheel event is emitted when the wheel input is received.<br />
350 /// This can receive wheel events before child. <br />
351 /// If it returns false, the child can receive the wheel event. If it returns true, the wheel event is intercepted. So child cannot receive wheel event.<br />
353 [EditorBrowsable(EditorBrowsableState.Never)]
354 public event EventHandlerWithReturnType<object, WheelEventArgs, bool> InterceptWheelEvent
358 if (interceptWheelHandler == null)
360 interceptWheelCallback = OnInterceptWheel;
361 Interop.ActorSignal.InterceptWheelConnect(SwigCPtr, interceptWheelCallback.ToHandleRef(this));
362 NDalicPINVOKE.ThrowExceptionIfExists();
364 interceptWheelHandler += value;
369 interceptWheelHandler -= value;
370 if (interceptWheelHandler == null && interceptWheelCallback != null)
372 Interop.ActorSignal.InterceptWheelDisconnect(SwigCPtr, interceptWheelCallback.ToHandleRef(this));
373 NDalicPINVOKE.ThrowExceptionIfExists();
374 interceptWheelCallback = null;
380 /// If child view doesn't want the parent's view to intercept the wheel event, you can set it to true.
382 /// parent.Add(child);
383 /// parent.InterceptWheelEvent += OnInterceptWheelEvent;
384 /// View view = child.GetParent() as View;
385 /// view.DisallowInterceptWheelEvent = true;
386 /// This prevents the parent from intercepting wheel event.
388 [EditorBrowsable(EditorBrowsableState.Never)]
389 public bool DisallowInterceptWheelEvent { get; set; }
392 /// An event for the WheelMoved signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
393 /// The WheelMoved signal is emitted when the wheel event is received.<br />
395 /// <since_tizen> 3 </since_tizen>
396 public event EventHandlerWithReturnType<object, WheelEventArgs, bool> WheelEvent
400 if (wheelEventHandler == null)
402 wheelEventCallback = OnWheelEvent;
403 Interop.ActorSignal.WheelEventConnect(SwigCPtr, wheelEventCallback.ToHandleRef(this));
404 NDalicPINVOKE.ThrowExceptionIfExists();
406 wheelEventHandler += value;
411 wheelEventHandler -= value;
412 if (wheelEventHandler == null && wheelEventCallback != null)
414 Interop.ActorSignal.WheelEventDisconnect(SwigCPtr, wheelEventCallback.ToHandleRef(this));
415 NDalicPINVOKE.ThrowExceptionIfExists();
416 wheelEventCallback = null;
422 /// An event for the OnWindow signal which can be used to subscribe or unsubscribe the event handler.<br />
423 /// The OnWindow signal is emitted after the view has been connected to the window.<br />
425 /// <since_tizen> 3 </since_tizen>
426 public event EventHandler AddedToWindow
430 if (onWindowEventHandler == null)
432 onWindowEventCallback = OnWindow;
433 Interop.ActorSignal.OnSceneConnect(SwigCPtr, onWindowEventCallback.ToHandleRef(this));
434 NDalicPINVOKE.ThrowExceptionIfExists();
436 onWindowEventHandler += value;
441 onWindowEventHandler -= value;
442 if (onWindowEventHandler == null && onWindowEventCallback != null)
444 Interop.ActorSignal.OnSceneDisconnect(SwigCPtr, onWindowEventCallback.ToHandleRef(this));
445 NDalicPINVOKE.ThrowExceptionIfExists();
446 onWindowEventCallback = null;
452 /// An event for the OffWindow signal, which can be used to subscribe or unsubscribe the event handler.<br />
453 /// OffWindow signal is emitted after the view has been disconnected from the window.<br />
455 /// <since_tizen> 3 </since_tizen>
456 public event EventHandler RemovedFromWindow
460 if (offWindowEventHandler == null)
462 offWindowEventCallback = OffWindow;
463 Interop.ActorSignal.OffSceneConnect(SwigCPtr, offWindowEventCallback.ToHandleRef(this));
464 NDalicPINVOKE.ThrowExceptionIfExists();
466 offWindowEventHandler += value;
471 offWindowEventHandler -= value;
472 if (offWindowEventHandler == null && offWindowEventCallback != null)
474 Interop.ActorSignal.OffSceneDisconnect(SwigCPtr, offWindowEventCallback.ToHandleRef(this));
475 NDalicPINVOKE.ThrowExceptionIfExists();
476 offWindowEventCallback = null;
481 /// An event for visibility change which can be used to subscribe or unsubscribe the event handler.<br />
482 /// This event is sent when the visibility of this or a parent view is changed.<br />
486 /// When VisibilityChangedEventArgs.Type is SELF, VisibilityChangedEventArgs.Visibility is true means this View's Visibility property is true.
487 /// When VisibilityChangedEventArgs.Type is PARENT, VisibilityChangedEventArgs.Visibility is true means a parent's Visibility property has changed to true.
490 /// This event is NOT sent if the view becomes transparent (or the reverse), it's ONLY linked with View.Show() and View.Hide().
491 /// For reference, a view is only shown if the view and its parents (up to the root view) are also visible, they are not transparent, and the view has a non-zero size.
492 /// So if its parent is not visible, the view is not shown even though VisibilityChangedEventArgs.Type is SELF and VisibilityChangedEventArgs.Visibility is true.
495 /// <since_tizen> 3 </since_tizen>
496 public event EventHandler<VisibilityChangedEventArgs> VisibilityChanged
500 if (visibilityChangedEventHandler == null)
502 visibilityChangedEventCallback = OnVisibilityChanged;
503 Interop.ActorSignal.VisibilityChangedConnect(SwigCPtr, visibilityChangedEventCallback.ToHandleRef(this));
504 NDalicPINVOKE.ThrowExceptionIfExists();
506 visibilityChangedEventHandler += value;
511 visibilityChangedEventHandler -= value;
512 if (visibilityChangedEventHandler == null && visibilityChangedEventCallback != null)
514 Interop.ActorSignal.VisibilityChangedDisconnect(SwigCPtr, visibilityChangedEventCallback.ToHandleRef(this));
515 NDalicPINVOKE.ThrowExceptionIfExists();
516 visibilityChangedEventCallback = null;
522 /// Event for layout direction change which can be used to subscribe/unsubscribe the event handler.<br />
523 /// This signal is emitted when the layout direction property of this or a parent view is changed.<br />
525 /// <since_tizen> 4 </since_tizen>
526 public event EventHandler<LayoutDirectionChangedEventArgs> LayoutDirectionChanged
530 if (layoutDirectionChangedEventHandler == null)
532 layoutDirectionChangedEventCallback = OnLayoutDirectionChanged;
533 Interop.ActorSignal.LayoutDirectionChangedConnect(SwigCPtr, layoutDirectionChangedEventCallback.ToHandleRef(this));
534 NDalicPINVOKE.ThrowExceptionIfExists();
537 layoutDirectionChangedEventHandler += value;
542 layoutDirectionChangedEventHandler -= value;
544 if (layoutDirectionChangedEventHandler == null && layoutDirectionChangedEventCallback != null)
546 Interop.ActorSignal.LayoutDirectionChangedDisconnect(SwigCPtr, layoutDirectionChangedEventCallback.ToHandleRef(this));
547 NDalicPINVOKE.ThrowExceptionIfExists();
548 layoutDirectionChangedEventCallback = null;
554 /// An event for the ResourcesLoadedSignal signal which can be used to subscribe or unsubscribe the event handler provided by the user.<br />
555 /// This signal is emitted after all resources required by a view are loaded and ready.<br />
557 /// <since_tizen> 3 </since_tizen>
558 public event EventHandler ResourcesLoaded
562 if (resourcesLoadedEventHandler == null)
564 resourcesLoadedCallback = OnResourcesLoaded;
565 Interop.ViewSignal.ResourceReadyConnect(SwigCPtr, resourcesLoadedCallback.ToHandleRef(this));
566 NDalicPINVOKE.ThrowExceptionIfExists();
568 resourcesLoadedEventHandler += value;
573 resourcesLoadedEventHandler -= value;
574 if (resourcesLoadedEventHandler == null && resourcesLoadedCallback != null)
576 Interop.ViewSignal.ResourceReadyDisconnect(SwigCPtr, resourcesLoadedCallback.ToHandleRef(this));
577 NDalicPINVOKE.ThrowExceptionIfExists();
578 resourcesLoadedCallback = null;
583 private EventHandler _backKeyPressed;
586 /// An event for getting notice when physical back key is pressed.<br />
587 /// This event is emitted BackKey is up.<br />
589 [EditorBrowsable(EditorBrowsableState.Never)]
590 public event EventHandler BackKeyPressed
594 _backKeyPressed += value;
595 BackKeyManager.Instance.Subscriber.Add(this);
600 BackKeyManager.Instance.Subscriber.Remove(this);
601 _backKeyPressed -= value;
606 /// Function for emitting BackKeyPressed event outside of View instance
608 [EditorBrowsable(EditorBrowsableState.Never)]
609 internal void EmitBackKeyPressed()
611 _backKeyPressed.Invoke(this, null);
615 internal event EventHandler<BackgroundResourceLoadedEventArgs> BackgroundResourceLoaded
619 if (backgroundResourceLoadedEventHandler == null)
621 backgroundResourceLoadedCallback = OnBackgroundResourceLoaded;
622 Interop.ViewSignal.ResourceReadyConnect(SwigCPtr, backgroundResourceLoadedCallback.ToHandleRef(this));
623 NDalicPINVOKE.ThrowExceptionIfExists();
625 backgroundResourceLoadedEventHandler += value;
630 backgroundResourceLoadedEventHandler -= value;
631 if (backgroundResourceLoadedEventHandler == null && backgroundResourceLoadedCallback != null)
633 Interop.ViewSignal.ResourceReadyDisconnect(SwigCPtr, backgroundResourceLoadedCallback.ToHandleRef(this));
634 NDalicPINVOKE.ThrowExceptionIfExists();
635 backgroundResourceLoadedCallback = null;
640 private void OnColorChanged(float r, float g, float b, float a)
642 Color = new Color(r, g, b, a);
645 private void OnMinimumSizeChanged(int width, int height)
647 MinimumSize = new Size2D(width, height);
650 private void OnMaximumSizeChanged(int width, int height)
652 MaximumSize = new Size2D(width, height);
655 private void OnPosition2DChanged(int x, int y)
657 SetPosition((float)x, (float)y, 0);
660 private void OnPositionChanged(float x, float y, float z)
662 SetPosition(x, y, z);
665 private void OnSize2DChanged(int width, int height)
667 SetSize((float)width, (float)height, 0);
670 private void OnSizeChanged(float width, float height, float depth)
672 SetSize(width, height, depth);
675 private void OnParentOriginChanged(float x, float y, float z)
677 ParentOrigin = new Position(x, y, z);
680 private void OnPivotPointChanged(float x, float y, float z)
682 PivotPoint = new Position(x, y, z);
685 private void OnImageShadowChanged(ShadowBase instance)
687 ImageShadow = (ImageShadow)instance;
690 private void OnBoxShadowChanged(ShadowBase instance)
692 BoxShadow = (Shadow)instance;
695 private void OnBackgroundImageBorderChanged(int left, int right, int bottom, int top)
697 BackgroundImageBorder = new Rectangle(left, right, bottom, top);
700 private void OnKeyInputFocusGained(IntPtr view)
702 if (IsNativeHandleInvalid())
706 if (keyInputFocusGainedEventHandler != null)
708 using var process = global::System.Diagnostics.Process.GetCurrentProcess();
709 var processId = process.Id;
710 var thread = global::System.Threading.Thread.CurrentThread.ManagedThreadId;
711 var me = this.GetType().FullName;
713 throw new ObjectDisposedException(nameof(SwigCPtr), $"Error! NUI's native dali object is already disposed. " +
714 $"OR the native dali object handle of NUI becomes null! \n" +
715 $" process:{processId} thread:{thread}, isDisposed:{this.Disposed}, isDisposeQueued:{this.IsDisposeQueued}, me:{me}\n");
720 if (this.IsDisposeQueued)
722 using var process = global::System.Diagnostics.Process.GetCurrentProcess();
723 var processId = process.Id;
724 var thread = global::System.Threading.Thread.CurrentThread.ManagedThreadId;
725 var me = this.GetType().FullName;
727 //in this case, the View object is ready to be disposed waiting on DisposeQueue, so event callback should not be invoked!
728 Tizen.Log.Error("NUI", "in this case, the View object is ready to be disposed waiting on DisposeQueue, so event callback should not be invoked! just return here! \n" +
729 $"process:{processId} thread:{thread}, isDisposed:{this.Disposed}, isDisposeQueued:{this.IsDisposeQueued}, me:{me}\n");
735 keyInputFocusGainedEventHandler?.Invoke(this, null);
738 private void OnKeyInputFocusLost(IntPtr view)
740 if (IsNativeHandleInvalid())
744 if (keyInputFocusLostEventHandler != null)
746 using var process = global::System.Diagnostics.Process.GetCurrentProcess();
747 var processId = process.Id;
748 var thread = global::System.Threading.Thread.CurrentThread.ManagedThreadId;
749 var me = this.GetType().FullName;
751 throw new ObjectDisposedException(nameof(SwigCPtr), $"Error! NUI's native dali object is already disposed. " +
752 $"OR the native dali object handle of NUI becomes null! \n" +
753 $" process:{processId} thread:{thread}, isDisposed:{this.Disposed}, isDisposeQueued:{this.IsDisposeQueued}, me:{me}\n");
758 if (this.IsDisposeQueued)
760 using var process = global::System.Diagnostics.Process.GetCurrentProcess();
761 var processId = process.Id;
762 var thread = global::System.Threading.Thread.CurrentThread.ManagedThreadId;
763 var me = this.GetType().FullName;
765 //in this case, the View object is ready to be disposed waiting on DisposeQueue, so event callback should not be invoked!
766 Tizen.Log.Error("NUI", "in this case, the View object is ready to be disposed waiting on DisposeQueue, so event callback should not be invoked! just return here! \n" +
767 $"process:{processId} thread:{thread}, isDisposed:{this.Disposed}, isDisposeQueued:{this.IsDisposeQueued}, me:{me}\n");
773 keyInputFocusLostEventHandler?.Invoke(this, null);
776 private bool OnKeyEvent(IntPtr view, IntPtr keyEvent)
778 if (keyEvent == global::System.IntPtr.Zero)
780 NUILog.Error("keyEvent should not be null!");
784 KeyEventArgs e = new KeyEventArgs();
788 e.Key = Tizen.NUI.Key.GetKeyFromPtr(keyEvent);
790 if (keyEventHandler != null)
792 Delegate[] delegateList = keyEventHandler.GetInvocationList();
794 // Oring the result of each callback.
795 foreach (EventHandlerWithReturnType<object, KeyEventArgs, bool> del in delegateList)
797 result |= del(this, e);
804 // Callback for View OnRelayout signal
805 private void OnRelayout(IntPtr data)
807 if (onRelayoutEventHandler != null)
809 onRelayoutEventHandler(this, null);
813 // Callback for View HitTestResultSignal
814 private bool OnHitTestResult(IntPtr view, IntPtr touchData)
816 if (touchData == global::System.IntPtr.Zero)
818 NUILog.Error("touchData should not be null!");
822 TouchEventArgs e = new TouchEventArgs();
823 e.Touch = Tizen.NUI.Touch.GetTouchFromPtr(touchData);
824 return HitTest(e.Touch);
827 // Callback for View TouchSignal
828 private bool OnInterceptTouch(IntPtr view, IntPtr touchData)
830 if (touchData == global::System.IntPtr.Zero)
832 NUILog.Error("touchData should not be null!");
836 // DisallowInterceptTouchEvent prevents the parent from intercepting touch.
837 if (DisallowInterceptTouchEvent)
842 TouchEventArgs e = new TouchEventArgs();
843 e.Touch = Tizen.NUI.Touch.GetTouchFromPtr(touchData);
845 // If DispatchTouchMotion is false, Motion event is not dispatched.
846 if (DispatchTouchMotion == false && e.Touch.GetState(0) == PointStateType.Motion)
851 bool consumed = false;
853 if (interceptTouchDataEventHandler != null)
855 consumed = interceptTouchDataEventHandler(this, e);
861 // Callback for View TouchSignal
862 private bool OnTouch(IntPtr view, IntPtr touchData)
864 if (touchData == global::System.IntPtr.Zero)
866 NUILog.Error("touchData should not be null!");
870 if (DispatchTouchEvents == false)
872 NUILog.Debug("If DispatchTouchEvents is false, it can not dispatch.");
876 TouchEventArgs e = new TouchEventArgs();
877 e.Touch = Tizen.NUI.Touch.GetTouchFromPtr(touchData);
879 // If DispatchTouchMotion is false, Motion event is not dispatched.
880 if (DispatchTouchMotion == false && e.Touch.GetState(0) == PointStateType.Motion)
886 bool consumed = false;
888 if (touchDataEventHandler != null)
890 consumed = touchDataEventHandler(this, e);
893 if (enableControlState && !consumed)
895 consumed = HandleControlStateOnTouch(e.Touch);
898 if (DispatchParentTouchEvents == false)
900 NUILog.Debug("If DispatchParentTouchEvents is false, it can not dispatch to parent.");
907 // Callback for View Hover signal
908 private bool OnHoverEvent(IntPtr view, IntPtr hoverEvent)
910 if (hoverEvent == global::System.IntPtr.Zero)
912 NUILog.Error("hoverEvent should not be null!");
916 if (DispatchHoverEvents == false)
918 NUILog.Debug("If DispatchHoverEvents is false, it can not dispatch.");
922 HoverEventArgs e = new HoverEventArgs();
923 e.Hover = Tizen.NUI.Hover.GetHoverFromPtr(hoverEvent);
925 // If DispatchHoverMotion is false, Motion event is not dispatched.
926 if (DispatchHoverMotion == false && e.Hover.GetState(0) == PointStateType.Motion)
931 bool consumed = false;
933 if (hoverEventHandler != null)
935 consumed = hoverEventHandler(this, e);
938 if (DispatchParentHoverEvents == false && consumed == false)
940 NUILog.Debug("If DispatchParentHoverEvents is false, it can not dispatch to parent.");
947 // Callback for View InterceptWheel signal
948 private bool OnInterceptWheel(IntPtr view, IntPtr wheelEvent)
950 if (wheelEvent == global::System.IntPtr.Zero)
952 NUILog.Error("wheelEvent should not be null!");
956 // DisallowInterceptWheelEvent prevents the parent from intercepting wheel.
957 if (DisallowInterceptWheelEvent)
962 WheelEventArgs e = new WheelEventArgs();
964 e.Wheel = Tizen.NUI.Wheel.GetWheelFromPtr(wheelEvent);
966 bool consumed = false;
968 if (interceptWheelHandler != null)
970 consumed = interceptWheelHandler(this, e);
976 // Callback for View Wheel signal
977 private bool OnWheelEvent(IntPtr view, IntPtr wheelEvent)
979 if (wheelEvent == global::System.IntPtr.Zero)
981 NUILog.Error("wheelEvent should not be null!");
985 WheelEventArgs e = new WheelEventArgs();
987 e.Wheel = Tizen.NUI.Wheel.GetWheelFromPtr(wheelEvent);
989 if (wheelEventHandler != null)
991 return wheelEventHandler(this, e);
996 // Callback for View OnWindow signal
997 private void OnWindow(IntPtr data)
999 if (onWindowEventHandler != null)
1001 onWindowEventHandler(this, null);
1005 // Callback for View OffWindow signal
1006 private void OffWindow(IntPtr data)
1008 if (offWindowEventHandler != null)
1010 offWindowEventHandler(this, null);
1014 // Callback for View visibility change signal
1015 private void OnVisibilityChanged(IntPtr data, bool visibility, VisibilityChangeType type)
1017 VisibilityChangedEventArgs e = new VisibilityChangedEventArgs();
1018 if (data != IntPtr.Zero)
1020 e.View = Registry.GetManagedBaseHandleFromNativePtr(data) as View;
1022 e.Visibility = visibility;
1025 if (visibilityChangedEventHandler != null)
1027 visibilityChangedEventHandler(this, e);
1031 // Callback for View layout direction change signal
1032 private void OnLayoutDirectionChanged(IntPtr data, ViewLayoutDirectionType type)
1034 LayoutDirectionChangedEventArgs e = new LayoutDirectionChangedEventArgs();
1035 if (data != IntPtr.Zero)
1037 e.View = Registry.GetManagedBaseHandleFromNativePtr(data) as View;
1041 if (layoutDirectionChangedEventHandler != null)
1043 layoutDirectionChangedEventHandler(this, e);
1047 private void OnResourcesLoaded(IntPtr view)
1049 if(!CheckResourceReady())
1054 if (resourcesLoadedEventHandler != null)
1056 resourcesLoadedEventHandler(this, null);
1060 private void OnBackgroundResourceLoaded(IntPtr view)
1062 BackgroundResourceLoadedEventArgs e = new BackgroundResourceLoadedEventArgs();
1063 e.Status = (ResourceLoadingStatusType)Interop.View.GetVisualResourceStatus(this.SwigCPtr, Property.BACKGROUND);
1065 if (backgroundResourceLoadedEventHandler != null)
1067 backgroundResourceLoadedEventHandler(this, e);
1072 /// Event argument passed through the ChildAdded event.
1074 /// <since_tizen> 5 </since_tizen>
1075 public class ChildAddedEventArgs : EventArgs
1078 /// Added child view at moment.
1080 /// <since_tizen> 5 </since_tizen>
1081 public View Added { get; set; }
1085 /// Event argument passed through the ChildRemoved event.
1087 /// <since_tizen> 5 </since_tizen>
1088 public class ChildRemovedEventArgs : EventArgs
1091 /// Removed child view at moment.
1093 /// <since_tizen> 5 </since_tizen>
1094 public View Removed { get; set; }
1098 /// Event arguments that passed via the KeyEvent signal.
1100 /// <since_tizen> 3 </since_tizen>
1101 public class KeyEventArgs : EventArgs
1106 /// Key - is the key sent to the view.
1108 /// <since_tizen> 3 </since_tizen>
1123 /// Event arguments that passed via the touch signal.
1125 /// <since_tizen> 3 </since_tizen>
1126 public class TouchEventArgs : EventArgs
1128 private Touch _touch;
1131 /// Touch - contains the information of touch points.
1133 /// <since_tizen> 3 </since_tizen>
1148 /// Event arguments that passed via the hover signal.
1150 /// <since_tizen> 3 </since_tizen>
1151 public class HoverEventArgs : EventArgs
1153 private Hover _hover;
1156 /// Hover - contains touch points that represent the points that are currently being hovered or the points where a hover has stopped.
1158 /// <since_tizen> 3 </since_tizen>
1173 /// Event arguments that passed via the wheel signal.
1175 /// <since_tizen> 3 </since_tizen>
1176 public class WheelEventArgs : EventArgs
1178 private Wheel _wheel;
1181 /// WheelEvent - store a wheel rolling type: MOUSE_WHEEL or CUSTOM_WHEEL.
1183 /// <since_tizen> 3 </since_tizen>
1198 /// Event arguments of visibility changed.
1200 /// <since_tizen> 3 </since_tizen>
1201 public class VisibilityChangedEventArgs : EventArgs
1204 private bool _visibility;
1205 private VisibilityChangeType _type;
1208 /// The view, or child of view, whose visibility has changed.
1210 /// <since_tizen> 3 </since_tizen>
1224 /// Whether the view is now visible or not.
1226 /// <since_tizen> 3 </since_tizen>
1227 public bool Visibility
1235 _visibility = value;
1240 /// Whether the view's visible property has changed or a parent's.
1242 /// <since_tizen> 3 </since_tizen>
1243 public VisibilityChangeType Type
1257 /// Event arguments of layout direction changed.
1259 /// <since_tizen> 4 </since_tizen>
1260 public class LayoutDirectionChangedEventArgs : EventArgs
1263 private ViewLayoutDirectionType _type;
1266 /// The view, or child of view, whose layout direction has changed.
1268 /// <since_tizen> 4 </since_tizen>
1282 /// Whether the view's layout direction property has changed or a parent's.
1284 /// <since_tizen> 4 </since_tizen>
1285 public ViewLayoutDirectionType Type
1298 internal class BackgroundResourceLoadedEventArgs : EventArgs
1300 private ResourceLoadingStatusType status = ResourceLoadingStatusType.Invalid;
1301 public ResourceLoadingStatusType Status
1315 /// The class represents the information of the situation where the View's control state changes.
1317 [EditorBrowsable(EditorBrowsableState.Never)]
1318 public class ControlStateChangedEventArgs : EventArgs
1321 /// Create an instance with mandatory fields.
1323 /// <param name="previousState">The previous control state.</param>
1324 /// <param name="currentState">The current control state.</param>
1325 [EditorBrowsable(EditorBrowsableState.Never)]
1326 public ControlStateChangedEventArgs(ControlState previousState, ControlState currentState)
1328 PreviousState = previousState;
1329 CurrentState = currentState;
1333 /// The previous control state.
1335 [EditorBrowsable(EditorBrowsableState.Never)]
1336 public ControlState PreviousState { get; }
1339 /// The current control state.
1341 [EditorBrowsable(EditorBrowsableState.Never)]
1342 public ControlState CurrentState { get; }
1346 /// The expanded touch area.
1347 /// TouchArea can expand the view's touchable area.<br/>
1348 /// If you set the TouchAreaOffset on an view, when you touch the view, the touch area is used rather than the size of the view.<br/>
1351 /// This is based on the top left x, y coordinates.<br/>
1352 /// For example) <br/>
1354 /// view.Size = new Size(100, 100);
1355 /// view.TouchAreaOffset = new Offset(-10, 20, 30, -40); // left, right, bottom, top
1357 /// Then, touch area is 130x170.<br/>
1358 /// This is view.width + TouchAreaOffset.right - TouchAreaOffset.left and view.height + TouchAreaOffset.bottom - TouchAreaOffset.top <br/>
1359 /// +---------------------+ <br/>
1365 /// | +----+----+ | <br/>
1367 /// | -10| | 20 | <br/>
1368 /// |<---+ +----->| <br/>
1371 /// | +----+----+ | <br/>
1376 /// +---------------------+ <br/>
1378 [EditorBrowsable(EditorBrowsableState.Never)]
1379 public Offset TouchAreaOffset
1383 return (Offset)GetValue(TouchAreaOffsetProperty);
1387 SetValue(TouchAreaOffsetProperty, value);
1388 NotifyPropertyChanged();
1392 private Offset InternalTouchAreaOffset
1396 Interop.ActorInternal.GetTouchAreaOffset(SwigCPtr, out int left, out int right, out int bottom, out int top);
1397 if (NDalicPINVOKE.SWIGPendingException.Pending)
1398 throw NDalicPINVOKE.SWIGPendingException.Retrieve();
1399 return new Offset(left, right, bottom, top);
1403 Interop.ActorInternal.SetTouchAreaOffset(SwigCPtr, value.Left, value.Right, value.Bottom, value.Top);
1404 if (NDalicPINVOKE.SWIGPendingException.Pending)
1405 throw NDalicPINVOKE.SWIGPendingException.Retrieve();
1411 /// Gets or sets the status of whether the view should emit key event signals.
1412 /// If a View's DispatchKeyEvents is set to false, then itself and parents will not receive key event signals.
1414 [EditorBrowsable(EditorBrowsableState.Never)]
1415 public bool DispatchKeyEvents
1419 return (bool)GetValue(DispatchKeyEventsProperty);
1423 SetValue(DispatchKeyEventsProperty, value);
1424 NotifyPropertyChanged();
1429 /// Gets or sets the status of whether touch events can be dispatched.
1430 /// If a View's DispatchTouchEvents is set to false, then it's can not will receive touch and parents will not receive a touch event signal either.
1431 /// This works without adding a TouchEvent callback in the View.
1433 /// If the <see cref="Tizen.NUI.BaseComponents.View.Sensitive"/> is a property that determines whether or not to be hittable, then this property prevents the propagation of the hit touch event.
1436 [EditorBrowsable(EditorBrowsableState.Never)]
1437 public bool DispatchTouchEvents
1441 return dispatchTouchEvents;
1445 if (dispatchTouchEvents != value)
1447 dispatchTouchEvents = value;
1448 if (dispatchTouchEvents == false)
1450 TouchEvent += OnDispatchTouchEvent;
1454 TouchEvent -= OnDispatchTouchEvent;
1460 private bool OnDispatchTouchEvent(object source, View.TouchEventArgs e)
1466 /// Gets or sets the status of whether touch events can be dispatched to the parent.
1467 /// If a View's DispatchParentTouchEvents is set to false, then parents will not receive a touch event signal either.
1468 /// This works without adding a TouchEvent callback in the View.
1470 /// If the <see cref="Tizen.NUI.BaseComponents.View.Sensitive"/> is a property that determines whether or not to be hittable, then this property prevents the propagation of the hit touch event.
1473 [EditorBrowsable(EditorBrowsableState.Never)]
1474 public bool DispatchParentTouchEvents
1478 return dispatchParentTouchEvents;
1482 if (dispatchParentTouchEvents != value)
1484 dispatchParentTouchEvents = value;
1485 if (dispatchParentTouchEvents == false)
1487 TouchEvent += OnDispatchParentTouchEvent;
1491 TouchEvent -= OnDispatchParentTouchEvent;
1497 private bool OnDispatchParentTouchEvent(object source, View.TouchEventArgs e)
1503 /// Gets or sets the status of whether hover events can be dispatched.
1504 /// If a View's DispatchHoverEvents is set to false, then it's can not will receive hover event and parents will not receive a hover event signal either.
1505 /// This works without adding a HoverEvent callback in the View.
1507 /// If the <see cref="Tizen.NUI.BaseComponents.View.Sensitive"/> is a property that determines whether or not to be hittable, then this property prevents the propagation of the hit hover event.
1510 [EditorBrowsable(EditorBrowsableState.Never)]
1511 public bool DispatchHoverEvents
1515 return dispatchHoverEvents;
1519 if (dispatchHoverEvents != value)
1521 dispatchHoverEvents = value;
1522 if (dispatchHoverEvents == false)
1524 HoverEvent += OnDispatchHoverEvent;
1528 HoverEvent -= OnDispatchHoverEvent;
1534 private bool OnDispatchHoverEvent(object source, View.HoverEventArgs e)
1540 /// Gets or sets the status of whether hover events can be dispatched to the parent.
1541 /// If a View's DispatchParentHoverEvents is set to false, then parents will not receive a hover event signal either.
1542 /// This works without adding a HoverEvent callback in the View.
1544 /// If the <see cref="Tizen.NUI.BaseComponents.View.Sensitive"/> is a property that determines whether or not to be hittable, then this property prevents the propagation of the hit hover event.
1547 [EditorBrowsable(EditorBrowsableState.Never)]
1548 public bool DispatchParentHoverEvents
1552 return dispatchParentHoverEvents;
1556 if (dispatchParentHoverEvents != value)
1558 dispatchParentHoverEvents = value;
1559 if (dispatchParentHoverEvents == false)
1561 HoverEvent += OnDispatchParentHoverEvent;
1565 HoverEvent -= OnDispatchParentHoverEvent;
1571 private bool OnDispatchParentHoverEvent(object source, View.HoverEventArgs e)
1577 /// Gets or sets the status of whether the view should emit Gesture event signals.
1578 /// If a View's DispatchGestureEvents is set to false, then itself and parents will not receive all gesture event signals.
1579 /// The itself and parents does not receive tap, pinch, pan, rotation, or longpress gestures.
1581 [EditorBrowsable(EditorBrowsableState.Never)]
1582 public bool DispatchGestureEvents
1586 return dispatchGestureEvents;
1590 if (dispatchGestureEvents != value)
1592 dispatchGestureEvents = value;
1593 ConfigGestureDetector(dispatchGestureEvents);
1599 /// Gets or sets the status of whether the view should emit Gesture event signals.
1600 /// If a View's DispatchParentGestureEvents is set to false, then parents will not receive all gesture event signals.
1601 /// The parents does not receive tap, pinch, pan, rotation, or longpress gestures.
1603 [EditorBrowsable(EditorBrowsableState.Never)]
1604 public bool DispatchParentGestureEvents
1608 return dispatchParentGestureEvents;
1612 if (dispatchParentGestureEvents != value)
1614 dispatchParentGestureEvents = value;
1615 ConfigGestureDetector(dispatchParentGestureEvents);
1620 private void ConfigGestureDetector(bool dispatch)
1622 if (panGestureDetector == null) panGestureDetector = new PanGestureDetector();
1623 if (longGestureDetector == null) longGestureDetector = new LongPressGestureDetector();
1624 if (pinchGestureDetector == null) pinchGestureDetector = new PinchGestureDetector();
1625 if (tapGestureDetector == null) tapGestureDetector = new TapGestureDetector();
1626 if (rotationGestureDetector == null) rotationGestureDetector = new RotationGestureDetector();
1628 if (dispatch == true)
1630 configGestureCount = configGestureCount > 0 ? configGestureCount - 1 : 0;
1631 if (configGestureCount == 0)
1633 panGestureDetector.Detach(this);
1634 longGestureDetector.Detach(this);
1635 pinchGestureDetector.Detach(this);
1636 tapGestureDetector.Detach(this);
1637 rotationGestureDetector.Detach(this);
1639 panGestureDetector.Detected -= OnGestureDetected;
1640 longGestureDetector.Detected -= OnGestureDetected;
1641 pinchGestureDetector.Detected -= OnGestureDetected;
1642 tapGestureDetector.Detected -= OnGestureDetected;
1643 rotationGestureDetector.Detected -= OnGestureDetected;
1648 if (configGestureCount == 0)
1650 panGestureDetector.Attach(this);
1651 longGestureDetector.Attach(this);
1652 pinchGestureDetector.Attach(this);
1653 tapGestureDetector.Attach(this);
1654 rotationGestureDetector.Attach(this);
1656 panGestureDetector.Detected += OnGestureDetected;
1657 longGestureDetector.Detected += OnGestureDetected;
1658 pinchGestureDetector.Detected += OnGestureDetected;
1659 tapGestureDetector.Detected += OnGestureDetected;
1660 rotationGestureDetector.Detected += OnGestureDetected;
1662 configGestureCount++;
1666 private void OnGestureDetected(object source, EventArgs e)
1668 // Does notting. This is to consume the gesture.
1672 /// Gets or sets the status of whether motion event of Touch can be dispatched.
1673 /// If a View's DispatchTouchMotion is set to false, then it's can not will receive motion event of TouchEvent.
1675 [EditorBrowsable(EditorBrowsableState.Never)]
1676 public bool DispatchTouchMotion
1680 return dispatchTouchMotion;
1684 dispatchTouchMotion = value;
1689 /// Gets or sets the status of whether motion event of Hover can be dispatched.
1690 /// If a View's DispatchHoverMotion is set to false, then it's can not will receive motion event of HoverEvent.
1692 [EditorBrowsable(EditorBrowsableState.Never)]
1693 public bool DispatchHoverMotion
1697 return dispatchHoverMotion;
1701 dispatchHoverMotion = value;