michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #include "AccCollector.h" michael@0: michael@0: #include "Accessible.h" michael@0: michael@0: using namespace mozilla::a11y; michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: // nsAccCollector michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: michael@0: AccCollector:: michael@0: AccCollector(Accessible* aRoot, filters::FilterFuncPtr aFilterFunc) : michael@0: mFilterFunc(aFilterFunc), mRoot(aRoot), mRootChildIdx(0) michael@0: { michael@0: } michael@0: michael@0: AccCollector::~AccCollector() michael@0: { michael@0: } michael@0: michael@0: uint32_t michael@0: AccCollector::Count() michael@0: { michael@0: EnsureNGetIndex(nullptr); michael@0: return mObjects.Length(); michael@0: } michael@0: michael@0: Accessible* michael@0: AccCollector::GetAccessibleAt(uint32_t aIndex) michael@0: { michael@0: Accessible* accessible = mObjects.SafeElementAt(aIndex, nullptr); michael@0: if (accessible) michael@0: return accessible; michael@0: michael@0: return EnsureNGetObject(aIndex); michael@0: } michael@0: michael@0: int32_t michael@0: AccCollector::GetIndexAt(Accessible* aAccessible) michael@0: { michael@0: int32_t index = mObjects.IndexOf(aAccessible); michael@0: if (index != -1) michael@0: return index; michael@0: michael@0: return EnsureNGetIndex(aAccessible); michael@0: } michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: // nsAccCollector protected michael@0: michael@0: Accessible* michael@0: AccCollector::EnsureNGetObject(uint32_t aIndex) michael@0: { michael@0: uint32_t childCount = mRoot->ChildCount(); michael@0: while (mRootChildIdx < childCount) { michael@0: Accessible* child = mRoot->GetChildAt(mRootChildIdx++); michael@0: if (!(mFilterFunc(child) & filters::eMatch)) michael@0: continue; michael@0: michael@0: AppendObject(child); michael@0: if (mObjects.Length() - 1 == aIndex) michael@0: return mObjects[aIndex]; michael@0: } michael@0: michael@0: return nullptr; michael@0: } michael@0: michael@0: int32_t michael@0: AccCollector::EnsureNGetIndex(Accessible* aAccessible) michael@0: { michael@0: uint32_t childCount = mRoot->ChildCount(); michael@0: while (mRootChildIdx < childCount) { michael@0: Accessible* child = mRoot->GetChildAt(mRootChildIdx++); michael@0: if (!(mFilterFunc(child) & filters::eMatch)) michael@0: continue; michael@0: michael@0: AppendObject(child); michael@0: if (child == aAccessible) michael@0: return mObjects.Length() - 1; michael@0: } michael@0: michael@0: return -1; michael@0: } michael@0: michael@0: void michael@0: AccCollector::AppendObject(Accessible* aAccessible) michael@0: { michael@0: mObjects.AppendElement(aAccessible); michael@0: } michael@0: michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: // EmbeddedObjCollector michael@0: //////////////////////////////////////////////////////////////////////////////// michael@0: michael@0: int32_t michael@0: EmbeddedObjCollector::GetIndexAt(Accessible* aAccessible) michael@0: { michael@0: if (aAccessible->mParent != mRoot) michael@0: return -1; michael@0: michael@0: if (aAccessible->mIndexOfEmbeddedChild != -1) michael@0: return aAccessible->mIndexOfEmbeddedChild; michael@0: michael@0: return mFilterFunc(aAccessible) & filters::eMatch ? michael@0: EnsureNGetIndex(aAccessible) : -1; michael@0: } michael@0: michael@0: void michael@0: EmbeddedObjCollector::AppendObject(Accessible* aAccessible) michael@0: { michael@0: aAccessible->mIndexOfEmbeddedChild = mObjects.Length(); michael@0: mObjects.AppendElement(aAccessible); michael@0: }