1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3 * License, v. 2.0. If a copy of the MPL was not distributed with this
4 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
6 #ifndef mozilla_a11y_XULTreeAccessible_h__
7 #define mozilla_a11y_XULTreeAccessible_h__
9 #include "nsITreeView.h"
10 #include "XULListboxAccessible.h"
11 #include "mozilla/dom/XULTreeElement.h"
13 class nsTreeBodyFrame
;
19 class XULTreeGridCellAccessible
;
20 class XULTreeItemAccessibleBase
;
23 * A class the represents the XUL Tree widget.
25 const uint32_t kMaxTreeColumns
= 100;
26 const uint32_t kDefaultTreeCacheLength
= 128;
29 * LocalAccessible class for XUL tree element.
32 class XULTreeAccessible
: public AccessibleWrap
{
34 XULTreeAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
,
35 nsTreeBodyFrame
* aTreeframe
);
37 // nsISupports and cycle collection
38 NS_DECL_ISUPPORTS_INHERITED
39 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(XULTreeAccessible
, LocalAccessible
)
42 virtual void Shutdown() override
;
43 virtual void Value(nsString
& aValue
) const override
;
44 virtual a11y::role
NativeRole() const override
;
45 virtual uint64_t NativeState() const override
;
46 virtual LocalAccessible
* LocalChildAtPoint(
47 int32_t aX
, int32_t aY
, EWhichChildAtPoint aWhichChild
) override
;
49 virtual LocalAccessible
* LocalChildAt(uint32_t aIndex
) const override
;
50 virtual uint32_t ChildCount() const override
;
51 virtual Relation
RelationByType(RelationType aType
) const override
;
54 virtual void SelectedItems(nsTArray
<Accessible
*>* aItems
) override
;
55 virtual uint32_t SelectedItemCount() override
;
56 virtual Accessible
* GetSelectedItem(uint32_t aIndex
) override
;
57 virtual bool IsItemSelected(uint32_t aIndex
) override
;
58 virtual bool AddItemToSelection(uint32_t aIndex
) override
;
59 virtual bool RemoveItemFromSelection(uint32_t aIndex
) override
;
60 virtual bool SelectAll() override
;
61 virtual bool UnselectAll() override
;
64 virtual bool IsWidget() const override
;
65 virtual bool IsActiveWidget() const override
;
66 virtual bool AreItemsOperable() const override
;
67 virtual LocalAccessible
* CurrentItem() const override
;
68 virtual void SetCurrentItem(const LocalAccessible
* aItem
) override
;
70 virtual LocalAccessible
* ContainerWidget() const override
;
75 * Return tree item accessible at the givem row. If accessible doesn't exist
76 * in the cache then create and cache it.
78 * @param aRow [in] the given row index
80 XULTreeItemAccessibleBase
* GetTreeItemAccessible(int32_t aRow
) const;
83 * Invalidates the number of cached treeitem accessibles.
85 * @param aRow [in] row index the invalidation starts from
86 * @param aCount [in] the number of treeitem accessibles to invalidate,
87 * the number sign specifies whether rows have been
88 * inserted (plus) or removed (minus)
90 void InvalidateCache(int32_t aRow
, int32_t aCount
);
93 * Fires name change events for invalidated area of tree.
95 * @param aStartRow [in] row index invalidation starts from
96 * @param aEndRow [in] row index invalidation ends, -1 means last row index
97 * @param aStartCol [in] column index invalidation starts from
98 * @param aEndCol [in] column index invalidation ends, -1 mens last column
101 void TreeViewInvalidated(int32_t aStartRow
, int32_t aEndRow
,
102 int32_t aStartCol
, int32_t aEndCol
);
105 * Invalidates children created for previous tree view.
107 void TreeViewChanged(nsITreeView
* aView
);
110 virtual ~XULTreeAccessible();
113 * Creates tree item accessible for the given row index.
115 virtual already_AddRefed
<XULTreeItemAccessibleBase
> CreateTreeItemAccessible(
118 RefPtr
<dom::XULTreeElement
> mTree
;
119 nsITreeView
* mTreeView
;
120 mutable nsRefPtrHashtable
<nsPtrHashKey
<const void>, XULTreeItemAccessibleBase
>
125 * Base class for tree item accessibles.
128 class XULTreeItemAccessibleBase
: public AccessibleWrap
{
130 XULTreeItemAccessibleBase(nsIContent
* aContent
, DocAccessible
* aDoc
,
131 LocalAccessible
* aParent
,
132 dom::XULTreeElement
* aTree
, nsITreeView
* aTreeView
,
135 // nsISupports and cycle collection
136 NS_DECL_ISUPPORTS_INHERITED
137 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(XULTreeItemAccessibleBase
,
141 virtual void Shutdown() override
;
142 virtual nsRect
BoundsInAppUnits() const override
;
143 MOZ_CAN_RUN_SCRIPT_BOUNDARY
144 virtual nsIntRect
BoundsInCSSPixels() const override
;
145 virtual GroupPos
GroupPosition() override
;
146 virtual uint64_t NativeState() const override
;
147 virtual uint64_t NativeInteractiveState() const override
;
148 virtual int32_t IndexInParent() const override
;
149 virtual Relation
RelationByType(RelationType aType
) const override
;
150 virtual Accessible
* FocusedChild() override
;
151 virtual void SetSelected(bool aSelect
) override
;
152 virtual void TakeFocus() const override
;
155 virtual uint8_t ActionCount() const override
;
156 virtual bool HasPrimaryAction() const override
;
157 virtual void ActionNameAt(uint8_t aIndex
, nsAString
& aName
) override
;
158 virtual bool DoAction(uint8_t aIndex
) const override
;
161 virtual LocalAccessible
* ContainerWidget() const override
;
164 * Return row index associated with the accessible.
166 int32_t GetRowIndex() const { return mRow
; }
169 * Return cell accessible for the given column. If XUL tree accessible is not
170 * accessible table then return null.
172 virtual XULTreeGridCellAccessible
* GetCellAccessible(
173 nsTreeColumn
* aColumn
) const {
178 * Proccess row invalidation. Used to fires name change events.
180 virtual void RowInvalidated(int32_t aStartColIdx
, int32_t aEndColIdx
) = 0;
183 virtual ~XULTreeItemAccessibleBase();
185 enum { eAction_Click
= 0, eAction_Expand
= 1 };
189 virtual void DispatchClickEvent(nsIContent
* aContent
,
190 uint32_t aActionIndex
) const override
;
191 virtual LocalAccessible
* GetSiblingAtOffset(
192 int32_t aOffset
, nsresult
* aError
= nullptr) const override
;
194 // XULTreeItemAccessibleBase
197 * Return true if the tree item accessible is expandable (contains subrows).
199 bool IsExpandable() const;
202 * Return name for cell at the given column.
204 void GetCellName(nsTreeColumn
* aColumn
, nsAString
& aName
) const;
206 RefPtr
<dom::XULTreeElement
> mTree
;
207 nsITreeView
* mTreeView
;
212 * LocalAccessible class for items for XUL tree.
214 class XULTreeItemAccessible
: public XULTreeItemAccessibleBase
{
216 XULTreeItemAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
,
217 LocalAccessible
* aParent
, dom::XULTreeElement
* aTree
,
218 nsITreeView
* aTreeView
, int32_t aRow
);
220 // nsISupports and cycle collection
221 NS_DECL_ISUPPORTS_INHERITED
222 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(XULTreeItemAccessible
,
223 XULTreeItemAccessibleBase
)
226 virtual void Shutdown() override
;
227 virtual ENameValueFlag
Name(nsString
& aName
) const override
;
228 virtual a11y::role
NativeRole() const override
;
230 // XULTreeItemAccessibleBase
231 virtual void RowInvalidated(int32_t aStartColIdx
,
232 int32_t aEndColIdx
) override
;
235 virtual ~XULTreeItemAccessible();
237 // XULTreeItemAccessible
238 RefPtr
<nsTreeColumn
> mColumn
;
239 nsString mCachedName
;
243 * LocalAccessible class for columns element of XUL tree.
245 class XULTreeColumAccessible
: public XULColumAccessible
{
247 XULTreeColumAccessible(nsIContent
* aContent
, DocAccessible
* aDoc
);
251 virtual LocalAccessible
* GetSiblingAtOffset(
252 int32_t aOffset
, nsresult
* aError
= nullptr) const override
;
255 ////////////////////////////////////////////////////////////////////////////////
256 // LocalAccessible downcasting method
258 inline XULTreeAccessible
* LocalAccessible::AsXULTree() {
259 return IsXULTree() ? static_cast<XULTreeAccessible
*>(this) : nullptr;
263 } // namespace mozilla