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 && pCore->IsActivated(), 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);
210 const_cast<_AccessibilityElementImpl&>(element).GetCore().Activate(false);
217 _AccessibilityContainerImpl::RemoveAllElement(void)
219 SysTryReturn(NID_UI, ControlCoreExists(__coreHandle), E_SYSTEM, E_SYSTEM,"[E_SYSTEM] A core of control is invalid.");
220 result r = E_SUCCESS;//__pCore->RemoveAllElement();
223 int count = __elementList.GetCount();
224 AccessibilityElement* pElement = null;
225 for (int i = 0; i < count; i++)
227 if (__elementList.GetAt(i, pElement) == E_SUCCESS)
229 _AccessibilityElementImpl* pImpl = _AccessibilityElementImpl::GetInstance(*pElement);
230 pImpl->GetCore().Activate(false);
235 __elementList.RemoveAll();
241 _AccessibilityContainerImpl::GetCurrentGrammar(void) const
243 SysTryReturn(NID_UI, ControlCoreExists(__coreHandle), L"", E_SYSTEM,"[E_SYSTEM] A core of control is invalid.");
244 return __pCore->GetCurrentGrammar();
247 AccessibilityScreenReaderStatus
248 _AccessibilityContainerImpl::GetStatus(void) const
250 SysTryReturn(NID_UI, ControlCoreExists(__coreHandle), ACCESSIBILITY_SCREEN_READER_STATUS__NONE, E_SYSTEM,"[E_SYSTEM] A core of control is invalid.");
251 return __pCore->GetStatus();
255 _AccessibilityContainerImpl::ReadingAll(void)
257 SysTryReturn(NID_UI, ControlCoreExists(__coreHandle), , E_SYSTEM,"[E_SYSTEM] A core of control is invalid.");
258 return __pCore->ReadingAll();
261 _AccessibilityContainerImpl*
262 _AccessibilityContainerImpl::GetInstance(AccessibilityContainer& container)
264 return static_cast<_AccessibilityContainerImpl*> (container.__pAccessibilityContainerImpl);
267 const _AccessibilityContainerImpl*
268 _AccessibilityContainerImpl::GetInstance(const AccessibilityContainer& container)
270 return static_cast<_AccessibilityContainerImpl*> (container.__pAccessibilityContainerImpl);
274 _AccessibilityContainerImpl::OnAccessibilityFocusMovedNext(const _AccessibilityContainer& control, const _AccessibilityElement& element)
279 _AccessibilityContainerImpl::OnAccessibilityFocusMovedPrevious(const _AccessibilityContainer& control, const _AccessibilityElement& element)
284 _AccessibilityContainerImpl::OnAccessibilityReadedElement(const _AccessibilityContainer& control, const _AccessibilityElement& element)
286 int count = __listenerList.GetCount();
289 IAccessibilityListener* pListener = null;
290 for (int i = 0 ; i < count ; i++)
292 if(__listenerList.GetAt(i, pListener) == E_SUCCESS)
294 AccessibilityElement* pElement = GetChildElement(element.GetName());
295 if (pElement != null)
297 pListener->OnAccessibilityScreenReaderStatusChanged(GetOwner().GetPublic(),*pElement, ACCESSIBILITY_SCREEN_READER_STATUS_READY);
305 _AccessibilityContainerImpl::OnAccessibilityReadingElement(const _AccessibilityContainer& control, const _AccessibilityElement& element)
307 int count = __listenerList.GetCount();
310 IAccessibilityListener* pListener = null;
311 for (int i = 0 ; i < count ; i++)
313 if(__listenerList.GetAt(i, pListener) == E_SUCCESS)
315 AccessibilityElement* pElement = GetChildElement(element.GetName());
316 if (pElement != null)
318 pListener->OnAccessibilityScreenReaderStatusChanged(GetOwner().GetPublic(),*pElement, ACCESSIBILITY_SCREEN_READER_STATUS_PLAYING);
327 _AccessibilityContainerImpl::OnAccessibilityFocusIn(const _AccessibilityContainer& control, const _AccessibilityElement& element)
329 int count = __listenerList.GetCount();
332 IAccessibilityListener* pListener = null;
333 for (int i = 0 ; i < count ; i++)
335 if(__listenerList.GetAt(i, pListener) == E_SUCCESS)
337 AccessibilityElement* pElement = GetChildElement(element.GetName());
338 if (pElement != null)
340 pListener->OnAccessibilityFocusIn(GetOwner().GetPublic(),*pElement);
348 _AccessibilityContainerImpl::OnAccessibilityFocusOut(const _AccessibilityContainer& control, const _AccessibilityElement& element)
350 int count = __listenerList.GetCount();
353 IAccessibilityListener* pListener = null;
354 for (int i = 0 ; i < count ; i++)
356 if(__listenerList.GetAt(i, pListener) == E_SUCCESS)
358 AccessibilityElement* pElement = GetChildElement(element.GetName());
359 if (pElement != null)
361 pListener->OnAccessibilityFocusOut(GetOwner().GetPublic(),*pElement);
369 _AccessibilityContainerImpl::OnAccessibilityActionPerformed(const _AccessibilityContainer& control, const _AccessibilityElement& element)
371 int count = __listenerList.GetCount();
374 IAccessibilityListener* pListener = null;
375 for (int i = 0 ; i < count ; i++)
377 if(__listenerList.GetAt(i, pListener) == E_SUCCESS)
379 AccessibilityElement* pElement = GetChildElement(element.GetName());
380 if (pElement != null)
382 pListener->OnAccessibilityActionPerformed(GetOwner().GetPublic(),*pElement);
390 _AccessibilityContainerImpl::OnAccessibilityValueIncreased(const _AccessibilityContainer& control, const _AccessibilityElement& element)
395 _AccessibilityContainerImpl::OnAccessibilityValueDecreased(const _AccessibilityContainer& control, const _AccessibilityElement& element)
400 _AccessibilityContainerImpl::ControlCoreExists(_ControlHandle handle) const
402 _Control* p_Control = null;
403 _ControlManager* pManager = _ControlManager::GetInstance();
404 SysTryReturn(NID_UI, !(handle.IsNull()), false, E_SYSTEM, "[E_SYSTEM] System Error.");
405 SysTryReturn(NID_UI, pManager, false, E_SYSTEM, "[E_SYSTEM] System Error.");
407 p_Control = pManager->GetObject(handle);
409 p_Control && p_Control->GetHandle() == __pControlImpl->GetCore().GetHandle(), false, E_SYSTEM,
410 "[E_SYSTEM] System Error.");
412 SetLastResult(E_SUCCESS);
417 _AccessibilityContainerImpl::MoveElement(const _AccessibilityElementImpl* pPreviousElement, const _AccessibilityElementImpl& element)
419 _AccessibilityElement* pPreviousCore = null;
420 if (pPreviousElement != null)
422 pPreviousCore = &const_cast<_AccessibilityElement&>(pPreviousElement->GetCore());
424 return __pCore->MoveElement(pPreviousCore, element.GetCore());
428 _AccessibilityContainerImpl::AddSystemElement(const AccessibilityElement& element)