[NUI] Remove duplicate getCPtr from BaseHandle subclasses (#3545)
[platform/core/csapi/tizenfx.git] / src / Tizen.NUI / src / public / Events / GestureDetectorManager.cs
1 /*
2  * Copyright (c) 2020 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17 using System.ComponentModel;
18 using Tizen.NUI;
19 using Tizen.NUI.BaseComponents;
20
21 namespace Tizen.NUI.Events
22 {
23     /// <summary>
24     /// This is a class for detects various gestures.
25     /// </summary>
26     [EditorBrowsable(EditorBrowsableState.Never)]
27     public class GestureDetectorManager : Disposable
28     {
29         /// <summary>
30         ///  This class is used to create a subset of the gestures you only want.
31         ///  You can inherit this class and implement the callback for gestures what you want to use.
32         /// </summary>
33         [EditorBrowsable(EditorBrowsableState.Never)]
34         public class GestureListener
35         {
36             /// <summary>
37             ///  TapGestureDetector event callback.
38             /// </summary>
39             [EditorBrowsable(EditorBrowsableState.Never)]
40             public virtual void OnTap(object sender, TapGestureDetector.DetectedEventArgs e, object userData)
41             {
42             }
43
44             /// <summary>
45             ///  LongPressGestureDetector event callback.
46             /// </summary>
47             [EditorBrowsable(EditorBrowsableState.Never)]
48             public virtual void OnLongPress(object sender, LongPressGestureDetector.DetectedEventArgs e, object userData)
49             {
50             }
51
52             /// <summary>
53             ///  PanGestureDetector event callback.
54             /// </summary>
55             [EditorBrowsable(EditorBrowsableState.Never)]
56             public virtual void OnPan(object sender, PanGestureDetector.DetectedEventArgs e, object userData)
57             {
58             }
59
60             /// <summary>
61             ///  PinchGestureDetector event callback.
62             /// </summary>
63             [EditorBrowsable(EditorBrowsableState.Never)]
64             public virtual void OnPinch(object sender, PinchGestureDetector.DetectedEventArgs e, object userData)
65             {
66             }
67         }
68
69         private GestureListener mListener;
70         private TapGestureDetector mTapGestureDetector;
71         private LongPressGestureDetector mLongGestureDetector;
72         private PinchGestureDetector mPinchGestureDetector;
73         private PanGestureDetector mPanGestureDetector;
74         private object mUserData;
75
76         /// <summary>
77         ///  Creates a GestureDetectorManager with the user listener.
78         /// </summary>
79         [EditorBrowsable(EditorBrowsableState.Never)]
80         public GestureDetectorManager(View view, GestureListener listener)
81         {
82             if (view == null)
83             {
84                 throw new global::System.ArgumentNullException(nameof(view));
85             }
86             if (listener == null)
87             {
88                 throw new global::System.ArgumentNullException(nameof(listener));
89             }
90
91             mListener = listener;
92             view.GrabTouchAfterLeave = true;
93             init(view);
94         }
95
96         private void init(View view)
97         {
98             mTapGestureDetector = new TapGestureDetector();
99             mLongGestureDetector = new LongPressGestureDetector();
100             mPanGestureDetector = new PanGestureDetector();
101             mPinchGestureDetector = new PinchGestureDetector();
102
103             mTapGestureDetector.Attach(view);
104             mLongGestureDetector.Attach(view);
105             mPanGestureDetector.Attach(view);
106             mPinchGestureDetector.Attach(view);
107         }
108
109         private void InternalOnTap(object sender, TapGestureDetector.DetectedEventArgs e)
110         {
111             mListener.OnTap(sender, e, mUserData);
112             mTapGestureDetector.Detected -= InternalOnTap;
113         }
114
115         private void InternalOnLongPress(object sender, LongPressGestureDetector.DetectedEventArgs e)
116         {
117             mListener.OnLongPress(sender, e, mUserData);
118             mLongGestureDetector.Detected -= InternalOnLongPress;
119         }
120
121         private void InternalOnPan(object sender, PanGestureDetector.DetectedEventArgs e)
122         {
123             mListener.OnPan(sender, e, mUserData);
124             mPanGestureDetector.Detected -= InternalOnPan;
125         }
126
127         private void InternalOnPinch(object sender, PinchGestureDetector.DetectedEventArgs e)
128         {
129             mListener.OnPinch(sender, e, mUserData);
130             mPinchGestureDetector.Detected -= InternalOnPinch;
131         }
132
133         /// <summary>
134         /// Gestures also work only when there is a touch event.
135         /// </summary>
136         /// <param name="sender">The actor who delivered the touch event.</param>
137         /// <param name="e">The TouchEventArgs</param>
138         [EditorBrowsable(EditorBrowsableState.Never)]
139         public void FeedTouchEvent(object sender, View.TouchEventArgs e)
140         {
141             FeedTouchEvent(sender, e, null);
142         }
143
144         /// <summary>
145         /// Gestures also work only when there is a touch event.
146         /// </summary>
147         /// <param name="sender">The actor who delivered the touch event.</param>
148         /// <param name="e">The TouchEventArgs</param>
149         /// <param name="userData">The user data object</param>
150         [EditorBrowsable(EditorBrowsableState.Never)]
151         public void FeedTouchEvent(object sender, View.TouchEventArgs e, object userData)
152         {
153             // Unused parameter
154             _ = sender;
155
156             mUserData = userData;
157             mTapGestureDetector.Detected -= InternalOnTap;
158             mLongGestureDetector.Detected -= InternalOnLongPress;
159             mPanGestureDetector.Detected -= InternalOnPan;
160             mPinchGestureDetector.Detected -= InternalOnPinch;
161
162             if (e != null &&
163                 (e.Touch.GetState(0) != PointStateType.Finished ||
164                  e.Touch.GetState(0) != PointStateType.Up ||
165                  e.Touch.GetState(0) != PointStateType.Interrupted))
166             {
167                 mTapGestureDetector.Detected += InternalOnTap;
168                 mLongGestureDetector.Detected += InternalOnLongPress;
169                 mPanGestureDetector.Detected += InternalOnPan;
170                 mPinchGestureDetector.Detected += InternalOnPinch;
171             }
172         }
173     }
174 }