modify license, permission and remove ^M char
[platform/framework/native/uifw.git] / src / ui / FUiTouch.cpp
1 //
2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
4 //
5 // Licensed under the Apache License, Version 2.0 (the License);
6 // you may not use this file except in compliance with the License.
7 // You may obtain a copy of the License at
8 //
9 //     http://www.apache.org/licenses/LICENSE-2.0/
10 //
11 // Unless required by applicable law or agreed to in writing, software
12 // distributed under the License is distributed on an ”AS IS” BASIS,
13 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 // See the License for the specific language governing permissions and
15 // limitations under the License.
16 //
17 /**
18  * @file                        FUiTouch.cpp
19  * @brief               This is the implementation file for Touch class
20  * @version             2.0
21  *
22  * This file contains the implementation of Touch class.
23  *
24  */
25
26 #include <FBaseResult.h>
27 #include <FBaseString.h>
28 #include <FUiControl.h>
29 #include <FUiTouch.h>
30 #include "FUi_CoordinateSystemUtils.h"
31 #include "FUi_TouchManager.h"
32 #include "FUi_ControlImpl.h"
33 #include "FUi_TouchEventArg.h"
34 #include "FUi_UiTouchEvent.h"
35
36 using namespace Tizen::Base;
37 using namespace Tizen::Base::Collection;
38 using namespace Tizen::Graphics;
39 using namespace Tizen::Ui;
40
41 namespace {
42
43 IList*
44 GetMultiFingerInfoListN(const Control* pControl)
45 {
46         _TouchManager* pTouchManager = _TouchManager::GetInstance();
47         SysTryReturn(NID_UI, pTouchManager, null, E_SYSTEM, "[E_SYSTEM] System error occurred.");
48
49         Point controlPos(0, 0);
50         if (pControl != null)
51         {
52                 const _ControlImpl* pImpl =  _ControlImpl::GetInstance(*pControl);
53                 if (pImpl != null)
54                 {
55                         controlPos.x = pImpl->GetAbsoluteBounds().x;
56                         controlPos.y = pImpl->GetAbsoluteBounds().y;
57                 }
58         }
59
60         LinkedList* pReturnList = new (std::nothrow) LinkedList;
61         SysTryReturn(NID_UI, pReturnList != null, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
62
63         Tizen::Base::Collection::IListT<_FingerInfo*>* pFingerInfoList = pTouchManager->GetMultiFingerInfoListN();
64         SysTryCatch(NID_UI, pFingerInfoList, , E_SYSTEM, "[E_SYSTEM] System error occurred.");
65
66         for (int i = 0; i < pFingerInfoList->GetCount(); i++)
67         {
68                 _FingerInfo* pFingerInfo = null;
69                 pFingerInfoList->GetAt(i, pFingerInfo);
70
71                 if (pFingerInfo == null)
72                 {
73                         continue;
74                 }
75
76                 TouchInfo* pTouchInfo = new (std::nothrow) TouchInfo;
77                 SysTryCatch(NID_UI, pTouchInfo, , E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation failed.");
78
79                 if (pFingerInfo->GetStatus() == _TOUCH_PRESSED ||pFingerInfo->GetStatus() == _TOUCH_MOVED )
80                 {
81                         pTouchInfo->id = pFingerInfo->GetPointId();
82                         pTouchInfo->position.x = pFingerInfo->GetScreenPoint().x - controlPos.x;
83                         pTouchInfo->position.y = pFingerInfo->GetScreenPoint().y - controlPos.y;
84                         pTouchInfo->status = TOUCH_PRESSED;
85
86                         pReturnList->Add(*pTouchInfo);
87                 }
88         }
89
90         delete pFingerInfoList;
91         pFingerInfoList = null;
92
93         return pReturnList;
94
95 CATCH:
96         if (pReturnList)
97         {
98                 pReturnList->RemoveAll(true);
99                 delete pReturnList;
100                 pReturnList = null;
101         }
102
103         if (pFingerInfoList)
104         {
105                 delete pFingerInfoList;
106                 pFingerInfoList = null;
107         }
108
109         return null;
110 }
111 }
112
113 namespace Tizen { namespace Ui
114 {
115
116 Touch::Touch(void)
117 {
118 }
119
120 Touch::~Touch(void)
121 {
122 }
123
124 Point
125 Touch::GetPosition(void) const
126 {
127         Point errorPoint(-1, -1);
128
129         _TouchManager* pTouchManager = _TouchManager::GetInstance();
130         SysTryReturn(NID_UI, pTouchManager, errorPoint, E_SYSTEM, "[E_SYSTEM] System error occurred.");
131
132         return _CoordinateSystemUtils::ConvertToInteger(pTouchManager->GetScreenPoint(pTouchManager->GetCurrentPointId()));
133 }
134
135 Point
136 Touch::GetPosition(unsigned long id) const
137 {
138         Point errorPoint(-1, -1);
139
140         _TouchManager* pTouchManager = _TouchManager::GetInstance();
141         SysTryReturn(NID_UI, pTouchManager, errorPoint, E_SYSTEM, "[E_SYSTEM] System error occurred.");
142
143         return _CoordinateSystemUtils::ConvertToInteger(pTouchManager->GetScreenPoint(id));
144 }
145
146 Point
147 Touch::GetPosition(const Control& control) const
148 {
149         Point errorPoint(-1, -1);
150
151         _TouchManager* pTouchManager = _TouchManager::GetInstance();
152         SysTryReturn(NID_UI, pTouchManager, errorPoint, E_SYSTEM, "[E_SYSTEM] System error occurred.");
153
154         const _ControlImpl* pControlImpl = _ControlImpl::GetInstance(control);
155         if (!pControlImpl)
156         {
157                 return errorPoint;
158         }
159
160         Point controlPos(pControlImpl->GetAbsoluteBounds().x, pControlImpl->GetAbsoluteBounds().y);
161         Point point(pTouchManager->GetScreenPoint(pTouchManager->GetCurrentPointId()).x, pTouchManager->GetScreenPoint(pTouchManager->GetCurrentPointId()).y);
162
163         point.x -= controlPos.x;
164         point.y -= controlPos.y;
165
166         return point;
167 }
168
169 Point
170 Touch::GetPosition(const Control& control, unsigned long id) const
171 {
172         Point errorPoint(-1, -1);
173
174         _TouchManager* pTouchManager = _TouchManager::GetInstance();
175         SysTryReturn(NID_UI, pTouchManager, errorPoint, E_SYSTEM, "[E_SYSTEM] System error occurred.");
176
177         const _ControlImpl* pControlImpl = _ControlImpl::GetInstance(control);
178         if (!pControlImpl)
179         {
180                 return errorPoint;
181         }
182
183         Point controlPos(pControlImpl->GetAbsoluteBounds().x, pControlImpl->GetAbsoluteBounds().y);
184         Point point(pTouchManager->GetScreenPoint(id).x, pTouchManager->GetScreenPoint(id).y);
185
186         point.x -= controlPos.x;
187         point.y -= controlPos.y;
188
189         return point;
190 }
191
192 result
193 Touch::SetMultipointEnabled(const Control& control, bool enable)
194 {
195         _ControlImpl* pControlImpl = const_cast<_ControlImpl*>(_ControlImpl::GetInstance(control));
196         SysTryReturnResult(NID_UI, pControlImpl, E_SYSTEM, "[E_SYSTEM] System error occurred.");
197
198         pControlImpl->SetMultiTouchEnabled(enable);
199
200         return E_SUCCESS;
201 }
202
203
204 bool
205 Touch::IsMultipointEnabled(const Control& control) const
206 {
207         const _ControlImpl* pControlImpl = _ControlImpl::GetInstance(control);
208         SysTryReturn(NID_UI, pControlImpl, false, E_SYSTEM, "[E_SYSTEM] System error occurred.");
209
210         return pControlImpl->IsMultiTouchEnabled();
211 }
212
213
214 TouchStatus
215 Touch::GetTouchStatus(unsigned long id) const
216 {
217         _TouchManager* pTouchManager = _TouchManager::GetInstance();
218         SysTryReturn(NID_UI, pTouchManager, TOUCH_PRESSED, E_SYSTEM, "[E_SYSTEM] System error occurred.");
219
220         return pTouchManager->GetTouchStatus(id);
221 }
222
223 IList*
224 Touch::GetTouchInfoListN(void) const
225 {
226         return GetMultiFingerInfoListN(null);
227 }
228
229 IList*
230 Touch::GetTouchInfoListN(const Control& control) const
231 {
232         return GetMultiFingerInfoListN(&control);
233 }
234
235 int
236 Touch::GetPointCount(void) const
237 {
238         _TouchManager* pTouchManager = _TouchManager::GetInstance();
239         SysTryReturn(NID_UI, pTouchManager, 0, E_SYSTEM, "[E_SYSTEM] System error occurred.");
240
241         return pTouchManager->GetPointCount();
242 }
243
244 unsigned long
245 Touch::GetPointId(int index) const
246 {
247         _TouchManager* pTouchManager = _TouchManager::GetInstance();
248         SysTryReturn(NID_UI, pTouchManager, 0, E_SYSTEM, "[E_SYSTEM] System error occurred.");
249
250         return pTouchManager->GetPointId(index);
251 }
252
253 } } // Tizen::Ui