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 <FGrpFloatRectangle.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"
26 #include "FUi_IAccessibilityFocusHandler.h"
28 using namespace Tizen::Base;
29 using namespace Tizen::Base::Collection;
30 using namespace Tizen::Graphics;
32 namespace Tizen { namespace Ui
36 class _AccessibilityItemComparer
37 : public Tizen::Base::Collection::IComparerT <T>
40 _AccessibilityItemComparer(void)
43 virtual ~_AccessibilityItemComparer(void)
46 virtual result Compare(const T& obj1, const T& obj2, int& cmp) const
48 Tizen::Graphics::FloatRectangle rect1= obj1->GetAbsoluteBounds();
49 Tizen::Graphics::FloatRectangle rect2= obj2->GetAbsoluteBounds();
56 else if(rect1.y < rect2.y)
68 else if(rect1.x < rect2.x)
80 }; //class _AccessibilityComparer
82 _AccessibilityContainer::_AccessibilityContainer(const _Control& owner)
85 , __currentElementIndex(-1)
86 , __level(ACCESSIBILITY_PRIORITY_NORMAL)
90 , __pFocusHandler(null)
92 __pOwner = &(const_cast<_Control&>(owner));
93 __handle = _AccessibilityManager::GetInstance()->Register(this);
96 _AccessibilityContainer::~_AccessibilityContainer(void)
99 _AccessibilityManager::GetInstance()->RemoveContainer(*this);
100 if(__handle.IsValid())
102 _AccessibilityManager::GetInstance()->Unregister(__handle);
104 int count = __childContainerList.GetCount();
105 _AccessibilityContainer* pContainer = null;
106 for (int i = 0; i< count;i++)
108 if(__childContainerList.GetAt(i, pContainer) == E_SUCCESS)
110 pContainer->SetParent(null);
115 __pParent->RemoveChildContainer(*this);
120 _AccessibilityContainer::GetOwner(void)
126 _AccessibilityContainer::GetOwner(void) const
132 _AccessibilityContainer::AddChildContainer(const _AccessibilityContainer& child)
134 if(child.GetParent() == this)
140 _AccessibilityContainer* _child = &const_cast<_AccessibilityContainer&>(child);
141 _child->SetParent(this);
142 __childContainerList.Add(_child);
147 _AccessibilityContainer::RemoveChildContainer(const _AccessibilityContainer& child)
149 return __childContainerList.Remove(&const_cast<_AccessibilityContainer&>(child));
152 const LinkedListT<_AccessibilityContainer*>*
153 _AccessibilityContainer::GetChildContainerList(void) const
155 return &__childContainerList;
159 _AccessibilityContainer::AddElement(const _AccessibilityElement& element)
161 const_cast<_AccessibilityElement&>(element).SetParent(*this);
162 if(__elementList.Contains(&const_cast<_AccessibilityElement&>(element)))
166 _AccessibilityManager::GetInstance()->NeedRefreshItem();
167 return __elementList.Add(&const_cast<_AccessibilityElement&>(element));
171 _AccessibilityContainer::AddElements(const IListT<_AccessibilityElement*>& elementList)
173 _AccessibilityElement* pElement = null;
174 int count = elementList.GetCount();
175 for (int i = 0; i < count ; i++)
177 if(elementList.GetAt(i, pElement) == E_SUCCESS)
179 pElement->SetParent(*this);
182 _AccessibilityManager::GetInstance()->NeedRefreshItem();
183 return __elementList.AddItems(elementList);
187 _AccessibilityContainer::InsertElement(const _AccessibilityElement& element, int index)
189 const_cast<_AccessibilityElement&>(element).SetParent(*this);
190 _AccessibilityManager::GetInstance()->NeedRefreshItem();
191 return __elementList.InsertAt(&const_cast<_AccessibilityElement&>(element), index);
195 _AccessibilityContainer::RemoveElement(const _AccessibilityElement& element)
197 _AccessibilityElement* pElement = &const_cast<_AccessibilityElement&>(element);
198 result r = __elementList.Remove(pElement);
203 _AccessibilityManager::GetInstance()->NeedRefreshItem();
208 _AccessibilityContainer::RemoveAllElement()
210 result r = E_SUCCESS;
211 _AccessibilityElement* pElement = null;
212 int count = __elementList.GetCount();
213 for (int i = 0; i < count ;i++)
215 r = __elementList.GetAt(i, pElement);
222 __elementList.RemoveAll();
223 _AccessibilityManager::GetInstance()->NeedRefreshItem();
228 _AccessibilityContainer::SortElements(void)
230 _AccessibilityItemComparer<_AccessibilityElement*> comparer;
231 __elementList.Sort(comparer);
234 _AccessibilityElement*
235 _AccessibilityContainer::GetChildElement(int index) const
237 int count = __elementList.GetCount();
238 if (count == 0 ||index > count - 1)
242 _AccessibilityElement* pElement = null;
243 __elementList.GetAt(index, pElement);
244 if (pElement->IsActivated())
254 _AccessibilityContainer::IsContains(const _AccessibilityElement& element)
256 result r = E_SUCCESS;
257 _AccessibilityElement* pElement = null;
258 int count = __elementList.GetCount();
259 for (int i = 0; i < count ;i++)
261 r = __elementList.GetAt(i, pElement);
262 if (pElement == &element)
269 _AccessibilityElement*
270 _AccessibilityContainer::GetChildElement(const String& name) const
272 int count = __elementList.GetCount();
273 _AccessibilityElement* pElement = null;
274 result r = E_SUCCESS;
275 for (int i = count -1 ; i >= 0 ; i--)
277 r = __elementList.GetAt(i, pElement);
278 if (r == E_SUCCESS && pElement->GetName() == name)
280 if (pElement->IsActivated())
290 if (__childContainerList.GetCount() > 0)
292 IEnumeratorT<_AccessibilityContainer*>* pEnumerator = __childContainerList.GetEnumeratorN();
293 while (pEnumerator->MoveNext() == E_SUCCESS)
295 _AccessibilityContainer* pContainer = null;
296 pEnumerator->GetCurrent(pContainer);
297 _AccessibilityElement* pElement = pContainer->GetChildElement(name);
298 if (pElement != null)
300 if (pElement->IsActivated())
316 _AccessibilityContainer::GetElements(IListT<_AccessibilityElement*>& list) const
318 int count = __elementList.GetCount();
319 result r = E_SUCCESS;
320 _AccessibilityElement* pElement = null;
322 for (int i = 0; i < count; i++)
324 r = __elementList.GetAt(i, pElement);
325 SysTryReturn(NID_UI, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] System Error.");
326 SysTryReturn(NID_UI, pElement, , E_SYSTEM, "[E_SYSTEM] System Error.");
327 if(!list.Contains(pElement) && pElement->IsActivated())
333 count = __childContainerList.GetCount();
334 _AccessibilityContainer* pContainer = null;
335 for (int i = 0; i < count; i++)
337 r = __childContainerList.GetAt(i, pContainer);
338 SysTryReturn(NID_UI, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] System Error.");
339 SysTryReturn(NID_UI, pContainer, , E_SYSTEM, "[E_SYSTEM] System Error.");
340 if(pContainer->IsActivated())
342 pContainer->GetElements(list);
347 IListT <_AccessibilityElement*>*
348 _AccessibilityContainer::GetElementsN(void) const
350 LinkedListT<_AccessibilityElement*>* pList = new (std::nothrow) LinkedListT<_AccessibilityElement*>;
355 _AccessibilityElement*
356 _AccessibilityContainer::Hit(const Point& point) const
363 _AccessibilityElement* pElement = null;
364 int count = __elementList.GetCount();
365 result r = E_SUCCESS;
367 for (int i = count -1 ; i >= 0 ; i--)
369 r = __elementList.GetAt(i, pElement);
370 SysTryReturn(NID_UI, r == E_SUCCESS, null, E_SYSTEM, "[E_SYSTEM] System Error.");
371 SysTryReturn(NID_UI, pElement, null, E_SYSTEM, "[E_SYSTEM] System Error.");
373 if (!(pElement->IsActivated()))
376 FloatRectangle rect = pElement->GetAbsoluteBounds();
378 if (rect.x < point.x && rect.y < point.y
379 && rect.x + rect.width > point.x
380 && rect.y + rect.height > point.y)
389 _AccessibilityContainer::MoveElement(const _AccessibilityElement* pPreviousElement, const _AccessibilityElement& element)
391 _AccessibilityElement* pElement = GetChildElement(element.GetName());
392 if (pElement == null)
394 return E_OBJ_NOT_FOUND;
397 if (pPreviousElement == null)
399 __elementList.Remove(pElement);
400 __elementList.InsertAt(pElement, 0);
404 _AccessibilityElement* _pPreviousElement = GetChildElement(pPreviousElement->GetName());
405 if (_pPreviousElement == null)
407 return E_OBJ_NOT_FOUND;
409 __elementList.Remove(pElement);
410 int indexOfPreviousItem = 0;
411 __elementList.IndexOf(_pPreviousElement, indexOfPreviousItem);
412 __elementList.InsertAt(pElement, indexOfPreviousItem+1);
418 _AccessibilityContainer::SetFocusHandler(_IAccessibilityFocusHandler* pHandler)
420 __pFocusHandler = pHandler;
423 _AccessibilityContainer::IsFocusManaged(void)
425 return (__pFocusHandler != null? true:false);
428 _AccessibilityContainer::MoveFocus(_AccessibilityFocusDirection direction)
434 return __pFocusHandler->OnMoveFocus(direction);
438 _AccessibilityContainer::MoveFocus(const Tizen::Graphics::Point& point)
442 return __pFocusHandler->OnMoveFocus(point);
446 _AccessibilityElement* pElement = Hit(point);
453 if (__elementList.IndexOf(pElement, index) != E_SUCCESS)
459 __currentElementIndex = index;
466 _AccessibilityContainer::ResetFocus(void)
468 __currentElementIndex = -1;
472 _AccessibilityContainer::SetPriority(int level)
478 _AccessibilityContainer::GetPriority(void)
484 _AccessibilityContainer::SetParent(const _AccessibilityContainer* pParent)
486 __pParent = const_cast<_AccessibilityContainer*>(pParent);
490 _AccessibilityContainer*
491 _AccessibilityContainer::GetParent(void) const
495 _AccessibilityContainer*
496 _AccessibilityContainer::GetRootParent(void) const
498 _AccessibilityContainer* pParent = __pParent;
499 while(pParent != null && pParent->GetParent() != null)
501 pParent = pParent->GetParent();
506 _AccessibilityContainer::SetCurrentFocusedElement(_AccessibilityElement*pElement)
508 if (pElement == null)
510 __currentElementIndex = -1;
515 result r = __elementList.IndexOf(pElement, 0, index);
518 __currentElementIndex = index;
522 __currentElementIndex = -1;
525 _AccessibilityElement*
526 _AccessibilityContainer::GetCurrentFocusedElement(void) const
528 if (__currentElementIndex < 0)
533 _AccessibilityElement* pElement = null;
534 result r = E_SUCCESS;
535 r = __elementList.GetAt(__currentElementIndex,pElement);
547 _AccessibilityContainer::AddListener(const _IAccessibilityListener& listener)
549 __listenerList.Add(&const_cast<_IAccessibilityListener&>(listener));
552 Tizen::Base::Collection::IListT<_IAccessibilityListener*>*
553 _AccessibilityContainer::GetListenerListN(void) const
555 return __listenerList.GetItemsN(0,__listenerList.GetCount());
559 _AccessibilityContainer::RemoveListener(const _IAccessibilityListener& listener)
561 __listenerList.Remove(&const_cast<_IAccessibilityListener&>(listener));
564 _AccessibilityContainer::SetEnableState(bool enabledState)
566 __enableState = enabledState;
569 _AccessibilityContainer::GetEnableState(void)
571 return __enableState;
574 _AccessibilityContainer::Activate(bool enable)
578 _AccessibilityManager::GetInstance()->AddContainer(*this);
582 _AccessibilityManager::GetInstance()->RemoveContainer(*this);
584 __activated = enable;
588 _AccessibilityContainer::IsActivated(void) const
594 _AccessibilityContainer::GetAbsoluteBounds(void) const
596 return __pOwner->GetAbsoluteBoundsF();
600 _AccessibilityContainer::ReadingAll(void)
602 _AccessibilityElement* pElement = null;
603 int count = __elementList.GetCount();
604 result r = E_SUCCESS;
606 for (int i = count -1 ; i >= 0 ; i--)
608 r = __elementList.GetAt(i, pElement);
609 SysTryReturn(NID_UI, r == E_SUCCESS && pElement, , E_SYSTEM, "[E_SYSTEM] System Error.");
611 if (!(pElement->IsActivated()))
614 _AccessibilityManager::GetInstance()->ReadElement(*pElement);
619 _AccessibilityContainer::GetCurrentGrammar(void) const
625 AccessibilityScreenReaderStatus
626 _AccessibilityContainer::GetStatus(void) const
629 return ACCESSIBILITY_SCREEN_READER_STATUS_ERROR;
631 Tizen::Base::_HandleT <_AccessibilityContainer>
632 _AccessibilityContainer::GetHandle(void) const