2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
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
9 // http://www.apache.org/licenses/LICENSE-2.0/
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.
18 #include <FBaseSysLog.h>
19 #include <FBaseString.h>
20 #include <FUiAccessibilityElement.h>
21 #include <FUiAccessibilityContainer.h>
22 #include <FUiIAccessibilityListener.h>
23 #include "FUi_ControlImpl.h"
24 #include "FUi_AccessibilityElement.h"
25 #include "FUi_AccessibilityElementImpl.h"
26 #include "FUi_AccessibilityContainer.h"
27 #include "FUi_AccessibilityContainerImpl.h"
29 using namespace Tizen::Base;
30 using namespace Tizen::Base::Collection;
31 using namespace Tizen::Graphics;
33 namespace Tizen { namespace Ui {
34 _AccessibilityContainerImpl::_AccessibilityContainerImpl(const _ControlImpl& controlImpl, const AccessibilityContainer& publicInstance, const _AccessibilityContainer& coreInstance)
35 : __pControlImpl(null)
39 __pControlImpl = &const_cast<_ControlImpl&>(controlImpl);
40 __pPublic = &const_cast<AccessibilityContainer&>(publicInstance);
41 __pCore = &const_cast<_AccessibilityContainer&>(coreInstance);
42 __coreHandle = controlImpl.GetCore().GetHandle();
44 AccessibilityContainer*
45 _AccessibilityContainerImpl::CreateAccessibilityContainerN(const _ControlImpl& controlImpl)
47 _ControlImpl* pControlImpl = const_cast <_ControlImpl*>(&controlImpl);
48 _AccessibilityContainer* pCore = pControlImpl->GetCore().GetAccessibilityContainer();
49 SysTryReturn(NID_UI, pCore, null, E_SYSTEM, "[E_SYSTEM] This instance has not constructed.");
51 AccessibilityContainer* pPublic = new (std::nothrow) AccessibilityContainer();
52 SysTryReturn(NID_UI, pPublic, null, E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed");
54 _AccessibilityContainerImpl* pImpl = new (std::nothrow) _AccessibilityContainerImpl(controlImpl, *pPublic, *pCore);
55 SysTryCatch(NID_UI, pImpl,,E_OUT_OF_MEMORY, "[E_OUT_OF_MEMORY] Memory allocation is failed");
56 pPublic->__pAccessibilityContainerImpl = pImpl;
63 _AccessibilityContainerImpl::~_AccessibilityContainerImpl(void)
65 AccessibilityElement* pElement = null;
66 int count = __elementList.GetCount();
68 for ( int i = 0 ; i < count ; i++)
70 r = __elementList.GetAt(i, pElement);
77 __elementList.RemoveAll();
80 __listenerList.RemoveAll();
83 _AccessibilityContainerImpl::GetOwner(void)
85 return *__pControlImpl;
88 AccessibilityContainer&
89 _AccessibilityContainerImpl::GetPublic(void)
95 _AccessibilityContainerImpl::GetChildElement(const String& name)
97 SysTryReturn(NID_UI, ControlCoreExists(__coreHandle), null, E_SYSTEM,"[E_SYSTEM] A core of control is invalid.");
98 _AccessibilityElementImpl* pNewElementImpl = null;
99 _AccessibilityElement* pElement = __pCore->GetChildElement(name);
100 SysTryReturn(NID_UI, pElement, null, E_SYSTEM,"[E_SYSTEM]");
101 if(pElement->GetUserData() == null)
103 pNewElementImpl = new (std::nothrow) _AccessibilityElementImpl(*pElement);
104 SysTryReturn(NID_UI, pNewElementImpl, null, E_OUT_OF_MEMORY,"[E_OUT_OF_MEMORY] Memory allocation is failed");
105 pElement->SetUserData(pNewElementImpl);
106 __elementList.Add(&(pNewElementImpl->GetPublic()));
107 return &(pNewElementImpl->GetPublic());
109 return &(static_cast<_AccessibilityElementImpl*>(pElement->GetUserData())->GetPublic());
113 _AccessibilityContainerImpl::AddAccessibilityListener(const IAccessibilityListener& listener)
115 SysTryReturn(NID_UI, ControlCoreExists(__coreHandle), E_SYSTEM, E_SYSTEM,"[E_SYSTEM] A core of control is invalid.");
116 result r = E_OBJ_ALREADY_EXIST;
117 __pCore->AddListener(*this);
119 IAccessibilityListener* pListener = &const_cast<IAccessibilityListener&>(listener);
120 SysTryReturn(NID_UI,pListener && __listenerList.IndexOf(pListener,index) != E_SUCCESS, E_OBJ_ALREADY_EXIST, E_OBJ_ALREADY_EXIST,"[E_OBJ_ALREADY_EXIST] The listener is already exist.");
121 r = __listenerList.Add(pListener);
122 SysTryReturn(NID_UI, r == E_SUCCESS, r, r,"[%s]",GetErrorMessage(r));
128 _AccessibilityContainerImpl::RemoveAccessibilityListener(const IAccessibilityListener& listener)
130 SysTryReturn(NID_UI, ControlCoreExists(__coreHandle), E_SYSTEM, E_SYSTEM,"[E_SYSTEM] A core of control is invalid.");
131 result r = E_OBJ_NOT_FOUND;
132 SysTryReturn(NID_UI, __listenerList.GetCount() > 0, E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND,"[E_OBJ_NOT_FOUND] the listener has been not added.");
135 IAccessibilityListener* pListener = &const_cast<IAccessibilityListener&>(listener);
136 SysTryReturn(NID_UI,pListener && __listenerList.IndexOf(pListener,index) == E_SUCCESS, E_OBJ_NOT_FOUND, E_OBJ_NOT_FOUND,"[E_OBJ_NOT_FOUND] the listener has been not added.");
137 r = __listenerList.Remove(pListener);
138 SysTryReturn(NID_UI, r == E_SUCCESS, r, r,"[%s]",GetErrorMessage(r));
140 if(__listenerList.GetCount() < 1)
142 __pCore->RemoveListener(*this);
148 _AccessibilityContainerImpl::AddElement(const _AccessibilityElementImpl& element)
150 SysTryReturn(NID_UI, ControlCoreExists(__coreHandle), E_SYSTEM, E_SYSTEM,"[E_SYSTEM] A core of control is invalid.");
151 __elementList.Add(&(const_cast<_AccessibilityElementImpl&>(element).GetPublic()));
152 return __pCore->AddElement(element.GetCore());
156 _AccessibilityContainerImpl::AddElements(const IList& elementList)
162 _AccessibilityContainerImpl::GetElementsN(void)
164 SysTryReturn(NID_UI, ControlCoreExists(__coreHandle), null, E_SYSTEM,"[E_SYSTEM] A core of control is invalid.");
165 LinkedList* _pList = new (std::nothrow) LinkedList;
166 SysTryReturn(NID_UI, _pList, null, E_OUT_OF_MEMORY,"[E_OUT_OF_MEMORY] Memory allocation is failed");
168 result r = E_SUCCESS;
169 _AccessibilityElement* pItem = null;
170 IListT<_AccessibilityElement*>* pList = __pCore->GetElementsN();
171 SysTryCatch(NID_UI, pList, , E_SYSTEM,"[E_SYSTEM]");
172 count = pList->GetCount();
173 SysTryCatch(NID_UI, count >= 1, , E_SYSTEM,"[E_SYSTEM]");
175 for (int i = 0;i < count; i++)
177 _AccessibilityElementImpl* pNewElementImpl = null;
178 r = pList->GetAt(i,pItem);
179 SysTryCatch(NID_UI, r == E_SUCCESS, , E_SYSTEM,"[E_SYSTEM]");
181 if(pItem->GetUserData() == null)
183 pNewElementImpl = new (std::nothrow) _AccessibilityElementImpl(*pItem);
184 SysTryCatch(NID_UI, pNewElementImpl, , E_OUT_OF_MEMORY,"[E_OUT_OF_MEMORY] Memory allocation is failed");
185 pItem->SetUserData(pNewElementImpl);
186 AddSystemElement(pNewElementImpl->GetPublic());
190 pNewElementImpl = static_cast<_AccessibilityElementImpl*>(pItem->GetUserData());
192 _pList->Add(pNewElementImpl->GetPublic());
203 _AccessibilityContainerImpl::RemoveElement(const _AccessibilityElementImpl& element)
205 SysTryReturn(NID_UI, ControlCoreExists(__coreHandle), E_SYSTEM, E_SYSTEM,"[E_SYSTEM] A core of control is invalid.");
206 AccessibilityElement* pElement = const_cast<AccessibilityElement*>(&(element.GetPublic()));
207 result r = __elementList.Remove(pElement);
208 const_cast<_AccessibilityElementImpl&>(element).GetCore().Activate(false);
214 _AccessibilityContainerImpl::RemoveAllElement(void)
216 SysTryReturn(NID_UI, ControlCoreExists(__coreHandle), E_SYSTEM, E_SYSTEM,"[E_SYSTEM] A core of control is invalid.");
217 result r = E_SUCCESS;//__pCore->RemoveAllElement();
220 int count = __elementList.GetCount();
221 AccessibilityElement* pElement = null;
222 for (int i = 0; i < count; i++)
224 if (__elementList.GetAt(i, pElement) == E_SUCCESS)
226 _AccessibilityElementImpl* pImpl = _AccessibilityElementImpl::GetInstance(*pElement);
227 pImpl->GetCore().Activate(false);
232 __elementList.RemoveAll();
236 LinkedListT<_AccessibilityElement*> list;
237 __pCore->GetElements(list);
238 int count = list.GetCount();
239 for (int i = 0; i < count; i++)
241 _AccessibilityElement* pElement = null;
242 if (list.GetAt(i, pElement) == E_SUCCESS)
244 pElement->Activate(false);
252 _AccessibilityContainerImpl::GetCurrentGrammar(void) const
254 SysTryReturn(NID_UI, ControlCoreExists(__coreHandle), L"", E_SYSTEM,"[E_SYSTEM] A core of control is invalid.");
255 return __pCore->GetCurrentGrammar();
258 AccessibilityScreenReaderStatus
259 _AccessibilityContainerImpl::GetStatus(void) const
261 SysTryReturn(NID_UI, ControlCoreExists(__coreHandle), ACCESSIBILITY_SCREEN_READER_STATUS__NONE, E_SYSTEM,"[E_SYSTEM] A core of control is invalid.");
262 return __pCore->GetStatus();
266 _AccessibilityContainerImpl::ReadingAll(void)
268 SysTryReturn(NID_UI, ControlCoreExists(__coreHandle), , E_SYSTEM,"[E_SYSTEM] A core of control is invalid.");
269 return __pCore->ReadingAll();
272 _AccessibilityContainerImpl*
273 _AccessibilityContainerImpl::GetInstance(AccessibilityContainer& container)
275 return static_cast<_AccessibilityContainerImpl*> (container.__pAccessibilityContainerImpl);
278 const _AccessibilityContainerImpl*
279 _AccessibilityContainerImpl::GetInstance(const AccessibilityContainer& container)
281 return static_cast<_AccessibilityContainerImpl*> (container.__pAccessibilityContainerImpl);
285 _AccessibilityContainerImpl::OnAccessibilityFocusMovedNext(const _AccessibilityContainer& control, const _AccessibilityElement& element)
290 _AccessibilityContainerImpl::OnAccessibilityFocusMovedPrevious(const _AccessibilityContainer& control, const _AccessibilityElement& element)
295 _AccessibilityContainerImpl::OnAccessibilityReadElement(const _AccessibilityContainer& control, const _AccessibilityElement& element)
297 int count = __listenerList.GetCount();
300 IAccessibilityListener* pListener = null;
301 for (int i = 0 ; i < count ; i++)
303 if(__listenerList.GetAt(i, pListener) == E_SUCCESS)
305 AccessibilityElement* pElement = GetChildElement(element.GetName());
306 if (pElement != null)
308 pListener->OnAccessibilityScreenReaderStatusChanged(GetOwner().GetPublic(),*pElement, ACCESSIBILITY_SCREEN_READER_STATUS_READY);
316 _AccessibilityContainerImpl::OnAccessibilityReadingElement(const _AccessibilityContainer& control, const _AccessibilityElement& element)
318 int count = __listenerList.GetCount();
321 IAccessibilityListener* pListener = null;
322 for (int i = 0 ; i < count ; i++)
324 if(__listenerList.GetAt(i, pListener) == E_SUCCESS)
326 AccessibilityElement* pElement = GetChildElement(element.GetName());
327 if (pElement != null)
329 pListener->OnAccessibilityScreenReaderStatusChanged(GetOwner().GetPublic(),*pElement, ACCESSIBILITY_SCREEN_READER_STATUS_PLAYING);
338 _AccessibilityContainerImpl::OnAccessibilityFocusIn(const _AccessibilityContainer& control, const _AccessibilityElement& element)
340 int count = __listenerList.GetCount();
343 IAccessibilityListener* pListener = null;
344 for (int i = 0 ; i < count ; i++)
346 if(__listenerList.GetAt(i, pListener) == E_SUCCESS)
348 AccessibilityElement* pElement = GetChildElement(element.GetName());
349 if (pElement != null)
351 pListener->OnAccessibilityFocusIn(GetOwner().GetPublic(),*pElement);
359 _AccessibilityContainerImpl::OnAccessibilityFocusOut(const _AccessibilityContainer& control, const _AccessibilityElement& element)
361 int count = __listenerList.GetCount();
364 IAccessibilityListener* pListener = null;
365 for (int i = 0 ; i < count ; i++)
367 if(__listenerList.GetAt(i, pListener) == E_SUCCESS)
369 AccessibilityElement* pElement = GetChildElement(element.GetName());
370 if (pElement != null)
372 pListener->OnAccessibilityFocusOut(GetOwner().GetPublic(),*pElement);
380 _AccessibilityContainerImpl::OnAccessibilityActionPerformed(const _AccessibilityContainer& control, const _AccessibilityElement& element)
382 int count = __listenerList.GetCount();
385 IAccessibilityListener* pListener = null;
386 for (int i = 0 ; i < count ; i++)
388 if(__listenerList.GetAt(i, pListener) == E_SUCCESS)
390 AccessibilityElement* pElement = GetChildElement(element.GetName());
391 if (pElement != null)
393 pListener->OnAccessibilityActionPerformed(GetOwner().GetPublic(),*pElement);
401 _AccessibilityContainerImpl::OnAccessibilityValueIncreased(const _AccessibilityContainer& control, const _AccessibilityElement& element)
406 _AccessibilityContainerImpl::OnAccessibilityValueDecreased(const _AccessibilityContainer& control, const _AccessibilityElement& element)
411 _AccessibilityContainerImpl::ControlCoreExists(_ControlHandle handle) const
413 _Control* p_Control = null;
414 _ControlManager* pManager = _ControlManager::GetInstance();
415 SysTryReturn(NID_UI, !(handle.IsNull()), false, E_SYSTEM, "[E_SYSTEM] System Error.");
416 SysTryReturn(NID_UI, pManager, false, E_SYSTEM, "[E_SYSTEM] System Error.");
418 p_Control = pManager->GetObject(handle);
420 p_Control && p_Control->GetHandle() == __pControlImpl->GetCore().GetHandle(), false, E_SYSTEM,
421 "[E_SYSTEM] System Error.");
423 SetLastResult(E_SUCCESS);
428 _AccessibilityContainerImpl::MoveElement(const _AccessibilityElementImpl* pPreviousElement, const _AccessibilityElementImpl& element)
430 _AccessibilityElement* pPreviousCore = null;
431 if (pPreviousElement != null)
433 pPreviousCore = &const_cast<_AccessibilityElement&>(pPreviousElement->GetCore());
435 return __pCore->MoveElement(pPreviousCore, element.GetCore());
439 _AccessibilityContainerImpl::AddSystemElement(const AccessibilityElement& element)