2 // Open Service Platform
3 // Copyright (c) 2012-2013 Samsung Electronics Co., Ltd.
5 // Licensed under the Flora License, Version 1.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://floralicense.org/license/
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 <FGrpRectangle.h>
20 #include "FUi_Control.h"
21 #include "FUi_AccessibilityElement.h"
22 #include "FUi_AccessibilityElementImpl.h"
23 #include "FUi_AccessibilityContainer.h"
24 #include "FUi_AccessibilityManager.h"
25 #include "FUi_IAccessibilityListener.h"
27 using namespace Tizen::Base;
28 using namespace Tizen::Base::Collection;
29 using namespace Tizen::Graphics;
31 namespace Tizen { namespace Ui
35 class _AccessibilityItemComparer
36 : public Tizen::Base::Collection::IComparerT <T>
39 _AccessibilityItemComparer(void)
42 virtual ~_AccessibilityItemComparer(void)
45 virtual result Compare(const T& obj1, const T& obj2, int& cmp) const
47 Tizen::Graphics::Rectangle rect1= obj1->GetAbsoluteBounds();
48 Tizen::Graphics::Rectangle rect2= obj2->GetAbsoluteBounds();
55 else if(rect1.y < rect2.y)
67 else if(rect1.x < rect2.x)
79 }; //class _AccessibilityComparer
81 _AccessibilityContainer::_AccessibilityContainer(const _Control& owner)
84 , __currentElementIndex(-1)
85 , __level(ACCESSIBILITY_PRIORTY_NORMAL)
89 , __focusManaged(false)
91 __pOwner = &(const_cast<_Control&>(owner));
92 __handle = _AccessibilityManager::GetInstance()->Register(this);
95 _AccessibilityContainer::~_AccessibilityContainer(void)
98 _AccessibilityManager::GetInstance()->RemoveContainer(*this);
99 if(__handle.IsValid())
101 _AccessibilityManager::GetInstance()->Unregister(__handle);
106 _AccessibilityContainer::GetOwner(void)
112 _AccessibilityContainer::GetOwner(void) const
118 _AccessibilityContainer::AddChildContainer(const _AccessibilityContainer& child)
120 if(child.GetParent() == this)
126 _AccessibilityContainer* _child = &const_cast<_AccessibilityContainer&>(child);
127 _child->SetParent(*this);
128 __childContainerList.Add(_child);
133 _AccessibilityContainer::RemoveChildContainer(const _AccessibilityContainer& child)
135 return __childContainerList.Remove(&const_cast<_AccessibilityContainer&>(child));
138 const LinkedListT<_AccessibilityContainer*>*
139 _AccessibilityContainer::GetChildContainerList(void) const
141 return &__childContainerList;
145 _AccessibilityContainer::AddElement(const _AccessibilityElement& element)
147 const_cast<_AccessibilityElement&>(element).SetParent(*this);
148 if(__elementList.Contains(&const_cast<_AccessibilityElement&>(element)))
152 return __elementList.Add(&const_cast<_AccessibilityElement&>(element));
156 _AccessibilityContainer::AddElements(const IListT<_AccessibilityElement*>& elementList)
158 _AccessibilityElement* pElement = null;
159 int count = elementList.GetCount();
160 for (int i = 0; i < count ; i++)
162 if(elementList.GetAt(i, pElement) == E_SUCCESS)
164 pElement->SetParent(*this);
167 return __elementList.AddItems(elementList);
171 _AccessibilityContainer::InsertElement(const _AccessibilityElement& element, int index)
173 const_cast<_AccessibilityElement&>(element).SetParent(*this);
174 return __elementList.InsertAt(&const_cast<_AccessibilityElement&>(element), index);
178 _AccessibilityContainer::RemoveElement(const _AccessibilityElement& element)
180 _AccessibilityElement* pElement = &const_cast<_AccessibilityElement&>(element);
181 result r = __elementList.Remove(pElement);
190 _AccessibilityContainer::RemoveAllElement()
192 result r = E_SUCCESS;
193 _AccessibilityElement* pElement = null;
194 int count = __elementList.GetCount();
195 for (int i = 0; i < count ;i++)
197 r = __elementList.GetAt(i, pElement);
204 __elementList.RemoveAll();
209 _AccessibilityContainer::SortElements(void)
211 _AccessibilityItemComparer<_AccessibilityElement*> comparer;
212 __elementList.Sort(comparer);
215 _AccessibilityElement*
216 _AccessibilityContainer::GetChildElement(const String& name) const
218 int count = __elementList.GetCount();
219 _AccessibilityElement* pElement = null;
220 result r = E_SUCCESS;
221 for (int i = count -1 ; i >= 0 ; i--)
223 r = __elementList.GetAt(i, pElement);
224 if (r == E_SUCCESS && pElement->GetName() == name)
229 if (__childContainerList.GetCount() > 0)
231 IEnumeratorT<_AccessibilityContainer*>* pEnumerator = __childContainerList.GetEnumeratorN();
232 while (pEnumerator->MoveNext() == E_SUCCESS)
234 _AccessibilityContainer* pContainer = null;
235 pEnumerator->GetCurrent(pContainer);
236 _AccessibilityElement* pElement = pContainer->GetChildElement(name);
237 if (pElement != null)
247 _AccessibilityContainer::GetElements(IListT<_AccessibilityElement*>& list) const
249 int count = __elementList.GetCount();
250 result r = E_SUCCESS;
251 _AccessibilityElement* pElement = null;
253 for (int i = 0; i < count; i++)
255 r = __elementList.GetAt(i, pElement);
256 SysTryReturn(NID_UI, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] System Error.");
257 SysTryReturn(NID_UI, pElement, , E_SYSTEM, "[E_SYSTEM] System Error.");
263 IListT <_AccessibilityElement*>*
264 _AccessibilityContainer::GetElementsN(void) const
266 if (__elementList.GetCount() > 0)
268 return __elementList.GetItemsN(0, __elementList.GetCount());
276 _AccessibilityElement*
277 _AccessibilityContainer::Hit(const Point& point) const
284 _AccessibilityElement* pElement = null;
285 int count = __elementList.GetCount();
286 result r = E_SUCCESS;
288 for (int i = count -1 ; i >= 0 ; i--)
290 r = __elementList.GetAt(i, pElement);
291 SysTryReturn(NID_UI, r == E_SUCCESS, null, E_SYSTEM, "[E_SYSTEM] System Error.");
292 SysTryReturn(NID_UI, pElement, null, E_SYSTEM, "[E_SYSTEM] System Error.");
294 if (!(pElement->IsActivated()))
297 Rectangle rect = pElement->GetAbsoluteBounds();
299 if (rect.x < point.x && rect.y < point.y
300 && rect.x + rect.width > point.x
301 && rect.y + rect.height > point.y)
310 _AccessibilityContainer::MoveElement(const _AccessibilityElement* pPreviousElement, const _AccessibilityElement& element)
312 _AccessibilityElement* pElement = GetChildElement(element.GetName());
313 if (pElement == null)
315 return E_OBJ_NOT_FOUND;
318 if (pPreviousElement == null)
320 __elementList.Remove(pElement);
321 __elementList.InsertAt(pElement, 0);
325 _AccessibilityElement* _pPreviousElement = GetChildElement(pPreviousElement->GetName());
326 if (_pPreviousElement == null)
328 return E_OBJ_NOT_FOUND;
330 __elementList.Remove(pElement);
331 int indexOfPreviousItem = 0;
332 __elementList.IndexOf(_pPreviousElement, indexOfPreviousItem);
333 __elementList.InsertAt(pElement, indexOfPreviousItem+1);
339 _AccessibilityContainer::ManageFocus(bool set)
341 __focusManaged = set;
344 _AccessibilityContainer::IsFocusManaged(void)
346 return __focusManaged;
349 _AccessibilityContainer::MoveFocus(_AccessibilityFocusDirection direction)
355 int count = __elementList.GetCount();
356 bool returnValue = false;
357 if (!__activated || count < 1)
362 if (__currentElementIndex >= 0)
364 if (__currentElementIndex + direction < count
365 && __currentElementIndex + direction >= 0)
367 _AccessibilityElement* pElement = null;
368 if (__listenerList.GetCount() > 0)
370 for (int i = 0;i<__listenerList.GetCount();i++)
372 _IAccessibilityListener* pListener = null;
373 if (__listenerList.GetAt(i,pListener) == E_SUCCESS)
375 _AccessibilityElement* pElement = null;
376 if (__elementList.GetAt(__currentElementIndex, pElement) == E_SUCCESS)
378 pListener->OnAccessibilityFocusOut(*this,*pElement);
383 __currentElementIndex += direction;
384 if (__elementList.GetAt(__currentElementIndex, pElement) == E_SUCCESS)
386 if (__listenerList.GetCount() > 0)
388 for (int i = 0;i<__listenerList.GetCount();i++)
390 _IAccessibilityListener* pListener = null;
391 if (__listenerList.GetAt(i,pListener) == E_SUCCESS)
393 if (__elementList.GetAt(__currentElementIndex, pElement) == E_SUCCESS)
395 pListener->OnAccessibilityFocusIn(*this,*pElement);
396 if (direction == _ACCESSIBILITY_FOCUS_DIRECTION_PREVIOUS)
398 pListener->OnAccessibilityFocusMovedPrevious(*this, *pElement);
400 else if (direction == _ACCESSIBILITY_FOCUS_DIRECTION_NEXT)
402 pListener->OnAccessibilityFocusMovedNext(*this, *pElement);
413 __currentElementIndex = -1;
419 if (direction == _ACCESSIBILITY_FOCUS_DIRECTION_PREVIOUS)
421 _AccessibilityElement* pElement = null;
422 __currentElementIndex = count - 1;
423 if (__elementList.GetAt(__currentElementIndex, pElement) == E_SUCCESS&& __listenerList.GetCount() > 0)
425 for (int i = 0;i<__listenerList.GetCount();i++)
427 _IAccessibilityListener* pListener = null;
428 if (__listenerList.GetAt(i,pListener) == E_SUCCESS)
430 if (__elementList.GetAt(__currentElementIndex, pElement) == E_SUCCESS)
432 pListener->OnAccessibilityFocusIn(*this,*pElement);
433 pListener->OnAccessibilityFocusMovedPrevious(*this, *pElement);
441 _AccessibilityElement* pElement = null;
442 __currentElementIndex = 0;
443 if (__elementList.GetAt(__currentElementIndex, pElement) == E_SUCCESS && __listenerList.GetCount() > 0)
445 for (int i = 0;i<__listenerList.GetCount();i++)
447 _IAccessibilityListener* pListener = null;
448 if (__listenerList.GetAt(i,pListener) == E_SUCCESS)
450 if (__elementList.GetAt(__currentElementIndex, pElement) == E_SUCCESS)
452 pListener->OnAccessibilityFocusIn(*this,*pElement);
453 pListener->OnAccessibilityFocusMovedNext(*this, *pElement);
465 _AccessibilityContainer::MoveFocus(const Tizen::Graphics::Point& point)
467 _AccessibilityElement* pElement = Hit(point);
474 if (__elementList.IndexOf(pElement, index) != E_SUCCESS)
480 __currentElementIndex = index;
486 _AccessibilityContainer::ResetFocus(void)
488 __currentElementIndex = -1;
492 _AccessibilityContainer::SetPriority(int level)
498 _AccessibilityContainer::GetPriority(void)
504 _AccessibilityContainer::SetParent(const _AccessibilityContainer& parent)
506 if (__pParent == null)
508 __pParent = &const_cast<_AccessibilityContainer&>(parent);
517 _AccessibilityContainer*
518 _AccessibilityContainer::GetParent(void) const
524 _AccessibilityContainer::SetCurrentFocusedElement(_AccessibilityElement*pElement)
526 if (pElement == null)
528 __currentElementIndex = -1;
533 result r = __elementList.IndexOf(pElement, 0, index);
536 __currentElementIndex = index;
540 __currentElementIndex = -1;
543 _AccessibilityElement*
544 _AccessibilityContainer::GetCurrentFocusedElement(void) const
546 if (__currentElementIndex < 0)
551 _AccessibilityElement* pElement = null;
552 result r = E_SUCCESS;
553 r = __elementList.GetAt(__currentElementIndex,pElement);
565 _AccessibilityContainer::AddListener(const _IAccessibilityListener& listener)
567 __listenerList.Add(&const_cast<_IAccessibilityListener&>(listener));
570 Tizen::Base::Collection::IListT<_IAccessibilityListener*>*
571 _AccessibilityContainer::GetListenerListN(void) const
573 return __listenerList.GetItemsN(0,__listenerList.GetCount());
577 _AccessibilityContainer::RemoveListener(const _IAccessibilityListener& listener)
579 __listenerList.Remove(&const_cast<_IAccessibilityListener&>(listener));
582 _AccessibilityContainer::SetEnableState(bool enabledState)
584 __enableState = enabledState;
587 _AccessibilityContainer::GetEnableState(void)
589 return __enableState;
592 _AccessibilityContainer::Activate(bool enable)
596 _AccessibilityManager::GetInstance()->AddContainer(*this);
600 _AccessibilityManager::GetInstance()->RemoveContainer(*this);
602 __activated = enable;
606 _AccessibilityContainer::IsActivated(void) const
612 _AccessibilityContainer::GetAbsoluteBounds(void) const
614 return __pOwner->GetAbsoluteBounds();
618 _AccessibilityContainer::ReadingAll(void)
620 _AccessibilityElement* pElement = null;
621 int count = __elementList.GetCount();
622 result r = E_SUCCESS;
624 for (int i = count -1 ; i >= 0 ; i--)
626 r = __elementList.GetAt(i, pElement);
627 SysTryReturn(NID_UI, r == E_SUCCESS && pElement, , E_SYSTEM, "[E_SYSTEM] System Error.");
629 if (!(pElement->IsActivated()))
632 _AccessibilityManager::GetInstance()->ReadElement(*pElement);
637 _AccessibilityContainer::GetCurrentGrammar(void) const
643 AccessibilityScreenReaderStatus
644 _AccessibilityContainer::GetStatus(void) const
647 return ACCESSIBILITY_SCREEN_READER_STATUS_ERROR;
649 Tizen::Base::_HandleT <_AccessibilityContainer>
650 _AccessibilityContainer::GetHandle(void) const