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/. */
5 
6 #ifndef mozilla_a11y_XULTreeAccessible_h__
7 #define mozilla_a11y_XULTreeAccessible_h__
8 
9 #include "nsITreeView.h"
10 #include "XULListboxAccessible.h"
11 #include "mozilla/dom/XULTreeElement.h"
12 
13 class nsTreeBodyFrame;
14 class nsTreeColumn;
15 
16 namespace mozilla {
17 namespace a11y {
18 
19 class XULTreeGridCellAccessible;
20 
21 /*
22  * A class the represents the XUL Tree widget.
23  */
24 const uint32_t kMaxTreeColumns = 100;
25 const uint32_t kDefaultTreeCacheLength = 128;
26 
27 /**
28  * LocalAccessible class for XUL tree element.
29  */
30 
31 class XULTreeAccessible : public AccessibleWrap {
32  public:
33   XULTreeAccessible(nsIContent* aContent, DocAccessible* aDoc,
34                     nsTreeBodyFrame* aTreeframe);
35 
36   // nsISupports and cycle collection
37   NS_DECL_ISUPPORTS_INHERITED
38   NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(XULTreeAccessible, LocalAccessible)
39 
40   // LocalAccessible
41   virtual void Shutdown() override;
42   virtual void Value(nsString& aValue) const override;
43   virtual a11y::role NativeRole() const override;
44   virtual uint64_t NativeState() const override;
45   virtual LocalAccessible* LocalChildAtPoint(
46       int32_t aX, int32_t aY, EWhichChildAtPoint aWhichChild) override;
47 
48   virtual LocalAccessible* LocalChildAt(uint32_t aIndex) const override;
49   virtual uint32_t ChildCount() const override;
50   virtual Relation RelationByType(RelationType aType) const override;
51 
52   // SelectAccessible
53   virtual void SelectedItems(nsTArray<Accessible*>* aItems) override;
54   virtual uint32_t SelectedItemCount() override;
55   virtual Accessible* GetSelectedItem(uint32_t aIndex) override;
56   virtual bool IsItemSelected(uint32_t aIndex) override;
57   virtual bool AddItemToSelection(uint32_t aIndex) override;
58   virtual bool RemoveItemFromSelection(uint32_t aIndex) override;
59   virtual bool SelectAll() override;
60   virtual bool UnselectAll() override;
61 
62   // Widgets
63   virtual bool IsWidget() const override;
64   virtual bool IsActiveWidget() const override;
65   virtual bool AreItemsOperable() const override;
66   virtual LocalAccessible* CurrentItem() const override;
67   virtual void SetCurrentItem(const LocalAccessible* aItem) override;
68 
69   virtual LocalAccessible* ContainerWidget() const override;
70 
71   // XULTreeAccessible
72 
73   /**
74    * Return tree item accessible at the givem row. If accessible doesn't exist
75    * in the cache then create and cache it.
76    *
77    * @param aRow         [in] the given row index
78    */
79   LocalAccessible* GetTreeItemAccessible(int32_t aRow) const;
80 
81   /**
82    * Invalidates the number of cached treeitem accessibles.
83    *
84    * @param aRow    [in] row index the invalidation starts from
85    * @param aCount  [in] the number of treeitem accessibles to invalidate,
86    *                 the number sign specifies whether rows have been
87    *                 inserted (plus) or removed (minus)
88    */
89   void InvalidateCache(int32_t aRow, int32_t aCount);
90 
91   /**
92    * Fires name change events for invalidated area of tree.
93    *
94    * @param aStartRow  [in] row index invalidation starts from
95    * @param aEndRow    [in] row index invalidation ends, -1 means last row index
96    * @param aStartCol  [in] column index invalidation starts from
97    * @param aEndCol    [in] column index invalidation ends, -1 mens last column
98    *                    index
99    */
100   void TreeViewInvalidated(int32_t aStartRow, int32_t aEndRow,
101                            int32_t aStartCol, int32_t aEndCol);
102 
103   /**
104    * Invalidates children created for previous tree view.
105    */
106   void TreeViewChanged(nsITreeView* aView);
107 
108  protected:
109   virtual ~XULTreeAccessible();
110 
111   /**
112    * Creates tree item accessible for the given row index.
113    */
114   virtual already_AddRefed<LocalAccessible> CreateTreeItemAccessible(
115       int32_t aRow) const;
116 
117   RefPtr<dom::XULTreeElement> mTree;
118   nsITreeView* mTreeView;
119   mutable AccessibleHashtable mAccessibleCache;
120 };
121 
122 /**
123  * Base class for tree item accessibles.
124  */
125 
126 #define XULTREEITEMBASEACCESSIBLE_IMPL_CID           \
127   { /* 1ab79ae7-766a-443c-940b-b1e6b0831dfc */       \
128     0x1ab79ae7, 0x766a, 0x443c, {                    \
129       0x94, 0x0b, 0xb1, 0xe6, 0xb0, 0x83, 0x1d, 0xfc \
130     }                                                \
131   }
132 
133 class XULTreeItemAccessibleBase : public AccessibleWrap {
134  public:
135   XULTreeItemAccessibleBase(nsIContent* aContent, DocAccessible* aDoc,
136                             LocalAccessible* aParent,
137                             dom::XULTreeElement* aTree, nsITreeView* aTreeView,
138                             int32_t aRow);
139 
140   // nsISupports and cycle collection
141   NS_DECL_ISUPPORTS_INHERITED
142   NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(XULTreeItemAccessibleBase,
143                                            AccessibleWrap)
144 
145   // LocalAccessible
146   virtual void Shutdown() override;
147   virtual nsRect BoundsInAppUnits() const override;
148   MOZ_CAN_RUN_SCRIPT_BOUNDARY
149   virtual nsIntRect BoundsInCSSPixels() const override;
150   virtual GroupPos GroupPosition() override;
151   virtual uint64_t NativeState() const override;
152   virtual uint64_t NativeInteractiveState() const override;
153   virtual int32_t IndexInParent() const override;
154   virtual Relation RelationByType(RelationType aType) const override;
155   virtual LocalAccessible* FocusedChild() override;
156   virtual void SetSelected(bool aSelect) override;
157   virtual void TakeFocus() const override;
158 
159   // ActionAccessible
160   virtual uint8_t ActionCount() const override;
161   virtual bool HasPrimaryAction() const override;
162   virtual void ActionNameAt(uint8_t aIndex, nsAString& aName) override;
163   virtual bool DoAction(uint8_t aIndex) const override;
164 
165   // Widgets
166   virtual LocalAccessible* ContainerWidget() const override;
167 
168   // XULTreeItemAccessibleBase
NS_DECLARE_STATIC_IID_ACCESSOR(XULTREEITEMBASEACCESSIBLE_IMPL_CID)169   NS_DECLARE_STATIC_IID_ACCESSOR(XULTREEITEMBASEACCESSIBLE_IMPL_CID)
170 
171   /**
172    * Return row index associated with the accessible.
173    */
174   int32_t GetRowIndex() const { return mRow; }
175 
176   /**
177    * Return cell accessible for the given column. If XUL tree accessible is not
178    * accessible table then return null.
179    */
GetCellAccessible(nsTreeColumn * aColumn)180   virtual XULTreeGridCellAccessible* GetCellAccessible(
181       nsTreeColumn* aColumn) const {
182     return nullptr;
183   }
184 
185   /**
186    * Proccess row invalidation. Used to fires name change events.
187    */
188   virtual void RowInvalidated(int32_t aStartColIdx, int32_t aEndColIdx) = 0;
189 
190  protected:
191   virtual ~XULTreeItemAccessibleBase();
192 
193   enum { eAction_Click = 0, eAction_Expand = 1 };
194 
195   // LocalAccessible
196   MOZ_CAN_RUN_SCRIPT
197   virtual void DispatchClickEvent(nsIContent* aContent,
198                                   uint32_t aActionIndex) const override;
199   virtual LocalAccessible* GetSiblingAtOffset(
200       int32_t aOffset, nsresult* aError = nullptr) const override;
201 
202   // XULTreeItemAccessibleBase
203 
204   /**
205    * Return true if the tree item accessible is expandable (contains subrows).
206    */
207   bool IsExpandable() const;
208 
209   /**
210    * Return name for cell at the given column.
211    */
212   void GetCellName(nsTreeColumn* aColumn, nsAString& aName) const;
213 
214   RefPtr<dom::XULTreeElement> mTree;
215   nsITreeView* mTreeView;
216   int32_t mRow;
217 };
218 
NS_DEFINE_STATIC_IID_ACCESSOR(XULTreeItemAccessibleBase,XULTREEITEMBASEACCESSIBLE_IMPL_CID)219 NS_DEFINE_STATIC_IID_ACCESSOR(XULTreeItemAccessibleBase,
220                               XULTREEITEMBASEACCESSIBLE_IMPL_CID)
221 
222 /**
223  * LocalAccessible class for items for XUL tree.
224  */
225 class XULTreeItemAccessible : public XULTreeItemAccessibleBase {
226  public:
227   XULTreeItemAccessible(nsIContent* aContent, DocAccessible* aDoc,
228                         LocalAccessible* aParent, dom::XULTreeElement* aTree,
229                         nsITreeView* aTreeView, int32_t aRow);
230 
231   // nsISupports and cycle collection
232   NS_DECL_ISUPPORTS_INHERITED
233   NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(XULTreeItemAccessible,
234                                            XULTreeItemAccessibleBase)
235 
236   // LocalAccessible
237   virtual void Shutdown() override;
238   virtual ENameValueFlag Name(nsString& aName) const override;
239   virtual a11y::role NativeRole() const override;
240 
241   // XULTreeItemAccessibleBase
242   virtual void RowInvalidated(int32_t aStartColIdx,
243                               int32_t aEndColIdx) override;
244 
245  protected:
246   virtual ~XULTreeItemAccessible();
247 
248   // XULTreeItemAccessible
249   RefPtr<nsTreeColumn> mColumn;
250   nsString mCachedName;
251 };
252 
253 /**
254  * LocalAccessible class for columns element of XUL tree.
255  */
256 class XULTreeColumAccessible : public XULColumAccessible {
257  public:
258   XULTreeColumAccessible(nsIContent* aContent, DocAccessible* aDoc);
259 
260  protected:
261   // LocalAccessible
262   virtual LocalAccessible* GetSiblingAtOffset(
263       int32_t aOffset, nsresult* aError = nullptr) const override;
264 };
265 
266 ////////////////////////////////////////////////////////////////////////////////
267 // LocalAccessible downcasting method
268 
AsXULTree()269 inline XULTreeAccessible* LocalAccessible::AsXULTree() {
270   return IsXULTree() ? static_cast<XULTreeAccessible*>(this) : nullptr;
271 }
272 
273 }  // namespace a11y
274 }  // namespace mozilla
275 
276 #endif
277