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);
107 _AccessibilityContainer::GetOwner(void)
113 _AccessibilityContainer::GetOwner(void) const
119 _AccessibilityContainer::AddChildContainer(const _AccessibilityContainer& child)
121 if(child.GetParent() == this)
127 _AccessibilityContainer* _child = &const_cast<_AccessibilityContainer&>(child);
128 _child->SetParent(*this);
129 __childContainerList.Add(_child);
134 _AccessibilityContainer::RemoveChildContainer(const _AccessibilityContainer& child)
136 return __childContainerList.Remove(&const_cast<_AccessibilityContainer&>(child));
139 const LinkedListT<_AccessibilityContainer*>*
140 _AccessibilityContainer::GetChildContainerList(void) const
142 return &__childContainerList;
146 _AccessibilityContainer::AddElement(const _AccessibilityElement& element)
148 const_cast<_AccessibilityElement&>(element).SetParent(*this);
149 if(__elementList.Contains(&const_cast<_AccessibilityElement&>(element)))
153 return __elementList.Add(&const_cast<_AccessibilityElement&>(element));
157 _AccessibilityContainer::AddElements(const IListT<_AccessibilityElement*>& elementList)
159 _AccessibilityElement* pElement = null;
160 int count = elementList.GetCount();
161 for (int i = 0; i < count ; i++)
163 if(elementList.GetAt(i, pElement) == E_SUCCESS)
165 pElement->SetParent(*this);
168 return __elementList.AddItems(elementList);
172 _AccessibilityContainer::InsertElement(const _AccessibilityElement& element, int index)
174 const_cast<_AccessibilityElement&>(element).SetParent(*this);
175 return __elementList.InsertAt(&const_cast<_AccessibilityElement&>(element), index);
179 _AccessibilityContainer::RemoveElement(const _AccessibilityElement& element)
181 _AccessibilityElement* pElement = &const_cast<_AccessibilityElement&>(element);
182 result r = __elementList.Remove(pElement);
191 _AccessibilityContainer::RemoveAllElement()
193 result r = E_SUCCESS;
194 _AccessibilityElement* pElement = null;
195 int count = __elementList.GetCount();
196 for (int i = 0; i < count ;i++)
198 r = __elementList.GetAt(i, pElement);
205 __elementList.RemoveAll();
210 _AccessibilityContainer::SortElements(void)
212 _AccessibilityItemComparer<_AccessibilityElement*> comparer;
213 __elementList.Sort(comparer);
216 _AccessibilityElement*
217 _AccessibilityContainer::GetChildElement(int index) const
219 int count = __elementList.GetCount();
220 if (count == 0 ||index > count - 1)
224 _AccessibilityElement* pElement = null;
225 __elementList.GetAt(index, pElement);
226 if (pElement->IsActivated())
236 _AccessibilityElement*
237 _AccessibilityContainer::GetChildElement(const String& name) const
239 int count = __elementList.GetCount();
240 _AccessibilityElement* pElement = null;
241 result r = E_SUCCESS;
242 for (int i = count -1 ; i >= 0 ; i--)
244 r = __elementList.GetAt(i, pElement);
245 if (r == E_SUCCESS && pElement->GetName() == name)
247 if (pElement->IsActivated())
257 if (__childContainerList.GetCount() > 0)
259 IEnumeratorT<_AccessibilityContainer*>* pEnumerator = __childContainerList.GetEnumeratorN();
260 while (pEnumerator->MoveNext() == E_SUCCESS)
262 _AccessibilityContainer* pContainer = null;
263 pEnumerator->GetCurrent(pContainer);
264 _AccessibilityElement* pElement = pContainer->GetChildElement(name);
265 if (pElement != null)
267 if (pElement->IsActivated())
283 _AccessibilityContainer::GetElements(IListT<_AccessibilityElement*>& list) const
285 int count = __elementList.GetCount();
286 result r = E_SUCCESS;
287 _AccessibilityElement* pElement = null;
289 for (int i = 0; i < count; i++)
291 r = __elementList.GetAt(i, pElement);
292 SysTryReturn(NID_UI, r == E_SUCCESS, , E_SYSTEM, "[E_SYSTEM] System Error.");
293 SysTryReturn(NID_UI, pElement, , E_SYSTEM, "[E_SYSTEM] System Error.");
294 if(!list.Contains(pElement) && pElement->IsActivated())
302 IListT <_AccessibilityElement*>*
303 _AccessibilityContainer::GetElementsN(void) const
305 LinkedListT<_AccessibilityElement*>* pList = new (std::nothrow) LinkedListT<_AccessibilityElement*>;
310 _AccessibilityElement*
311 _AccessibilityContainer::Hit(const Point& point) const
318 _AccessibilityElement* pElement = null;
319 int count = __elementList.GetCount();
320 result r = E_SUCCESS;
322 for (int i = count -1 ; i >= 0 ; i--)
324 r = __elementList.GetAt(i, pElement);
325 SysTryReturn(NID_UI, r == E_SUCCESS, null, E_SYSTEM, "[E_SYSTEM] System Error.");
326 SysTryReturn(NID_UI, pElement, null, E_SYSTEM, "[E_SYSTEM] System Error.");
328 if (!(pElement->IsActivated()))
331 FloatRectangle rect = pElement->GetAbsoluteBounds();
333 if (rect.x < point.x && rect.y < point.y
334 && rect.x + rect.width > point.x
335 && rect.y + rect.height > point.y)
344 _AccessibilityContainer::MoveElement(const _AccessibilityElement* pPreviousElement, const _AccessibilityElement& element)
346 _AccessibilityElement* pElement = GetChildElement(element.GetName());
347 if (pElement == null)
349 return E_OBJ_NOT_FOUND;
352 if (pPreviousElement == null)
354 __elementList.Remove(pElement);
355 __elementList.InsertAt(pElement, 0);
359 _AccessibilityElement* _pPreviousElement = GetChildElement(pPreviousElement->GetName());
360 if (_pPreviousElement == null)
362 return E_OBJ_NOT_FOUND;
364 __elementList.Remove(pElement);
365 int indexOfPreviousItem = 0;
366 __elementList.IndexOf(_pPreviousElement, indexOfPreviousItem);
367 __elementList.InsertAt(pElement, indexOfPreviousItem+1);
373 _AccessibilityContainer::SetFocusHandler(_IAccessibilityFocusHandler* pHandler)
375 __pFocusHandler = pHandler;
378 _AccessibilityContainer::IsFocusManaged(void)
380 return (__pFocusHandler != null? true:false);
383 _AccessibilityContainer::MoveFocus(_AccessibilityFocusDirection direction)
389 return __pFocusHandler->OnMoveFocus(direction);
393 _AccessibilityContainer::MoveFocus(const Tizen::Graphics::Point& point)
397 return __pFocusHandler->OnMoveFocus(point);
401 _AccessibilityElement* pElement = Hit(point);
408 if (__elementList.IndexOf(pElement, index) != E_SUCCESS)
414 __currentElementIndex = index;
421 _AccessibilityContainer::ResetFocus(void)
423 __currentElementIndex = -1;
427 _AccessibilityContainer::SetPriority(int level)
433 _AccessibilityContainer::GetPriority(void)
439 _AccessibilityContainer::SetParent(const _AccessibilityContainer& parent)
441 if (__pParent == null)
443 __pParent = &const_cast<_AccessibilityContainer&>(parent);
452 _AccessibilityContainer*
453 _AccessibilityContainer::GetParent(void) const
459 _AccessibilityContainer::SetCurrentFocusedElement(_AccessibilityElement*pElement)
461 if (pElement == null)
463 __currentElementIndex = -1;
468 result r = __elementList.IndexOf(pElement, 0, index);
471 __currentElementIndex = index;
475 __currentElementIndex = -1;
478 _AccessibilityElement*
479 _AccessibilityContainer::GetCurrentFocusedElement(void) const
481 if (__currentElementIndex < 0)
486 _AccessibilityElement* pElement = null;
487 result r = E_SUCCESS;
488 r = __elementList.GetAt(__currentElementIndex,pElement);
500 _AccessibilityContainer::AddListener(const _IAccessibilityListener& listener)
502 __listenerList.Add(&const_cast<_IAccessibilityListener&>(listener));
505 Tizen::Base::Collection::IListT<_IAccessibilityListener*>*
506 _AccessibilityContainer::GetListenerListN(void) const
508 return __listenerList.GetItemsN(0,__listenerList.GetCount());
512 _AccessibilityContainer::RemoveListener(const _IAccessibilityListener& listener)
514 __listenerList.Remove(&const_cast<_IAccessibilityListener&>(listener));
517 _AccessibilityContainer::SetEnableState(bool enabledState)
519 __enableState = enabledState;
522 _AccessibilityContainer::GetEnableState(void)
524 return __enableState;
527 _AccessibilityContainer::Activate(bool enable)
531 _AccessibilityManager::GetInstance()->AddContainer(*this);
535 _AccessibilityManager::GetInstance()->RemoveContainer(*this);
537 __activated = enable;
541 _AccessibilityContainer::IsActivated(void) const
547 _AccessibilityContainer::GetAbsoluteBounds(void) const
549 return __pOwner->GetAbsoluteBoundsF();
553 _AccessibilityContainer::ReadingAll(void)
555 _AccessibilityElement* pElement = null;
556 int count = __elementList.GetCount();
557 result r = E_SUCCESS;
559 for (int i = count -1 ; i >= 0 ; i--)
561 r = __elementList.GetAt(i, pElement);
562 SysTryReturn(NID_UI, r == E_SUCCESS && pElement, , E_SYSTEM, "[E_SYSTEM] System Error.");
564 if (!(pElement->IsActivated()))
567 _AccessibilityManager::GetInstance()->ReadElement(*pElement);
572 _AccessibilityContainer::GetCurrentGrammar(void) const
578 AccessibilityScreenReaderStatus
579 _AccessibilityContainer::GetStatus(void) const
582 return ACCESSIBILITY_SCREEN_READER_STATUS_ERROR;
584 Tizen::Base::_HandleT <_AccessibilityContainer>
585 _AccessibilityContainer::GetHandle(void) const