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_XULTreeGridAccessible_h__
7 #define mozilla_a11y_XULTreeGridAccessible_h__
8 
9 #include "XULTreeAccessible.h"
10 #include "TableAccessible.h"
11 #include "TableCellAccessible.h"
12 
13 namespace mozilla {
14 namespace a11y {
15 
16 class XULTreeGridCellAccessible;
17 
18 /**
19  * Represents accessible for XUL tree in the case when it has multiple columns.
20  */
21 class XULTreeGridAccessible : public XULTreeAccessible, public TableAccessible {
22  public:
XULTreeGridAccessible(nsIContent * aContent,DocAccessible * aDoc,nsTreeBodyFrame * aTreeFrame)23   XULTreeGridAccessible(nsIContent* aContent, DocAccessible* aDoc,
24                         nsTreeBodyFrame* aTreeFrame)
25       : XULTreeAccessible(aContent, aDoc, aTreeFrame) {
26     mGenericTypes |= eTable;
27   }
28 
29   // TableAccessible
30   virtual uint32_t ColCount() const override;
31   virtual uint32_t RowCount() override;
32   virtual LocalAccessible* CellAt(uint32_t aRowIndex,
33                                   uint32_t aColumnIndex) override;
34   virtual void ColDescription(uint32_t aColIdx,
35                               nsString& aDescription) override;
36   virtual bool IsColSelected(uint32_t aColIdx) override;
37   virtual bool IsRowSelected(uint32_t aRowIdx) override;
38   virtual bool IsCellSelected(uint32_t aRowIdx, uint32_t aColIdx) override;
39   virtual uint32_t SelectedCellCount() override;
40   virtual uint32_t SelectedColCount() override;
41   virtual uint32_t SelectedRowCount() override;
42   virtual void SelectedCells(nsTArray<LocalAccessible*>* aCells) override;
43   virtual void SelectedCellIndices(nsTArray<uint32_t>* aCells) override;
44   virtual void SelectedColIndices(nsTArray<uint32_t>* aCols) override;
45   virtual void SelectedRowIndices(nsTArray<uint32_t>* aRows) override;
46   virtual void SelectRow(uint32_t aRowIdx) override;
47   virtual void UnselectRow(uint32_t aRowIdx) override;
AsAccessible()48   virtual LocalAccessible* AsAccessible() override { return this; }
49 
50   // LocalAccessible
AsTable()51   virtual TableAccessible* AsTable() override { return this; }
52   virtual a11y::role NativeRole() const override;
53 
54  protected:
55   virtual ~XULTreeGridAccessible();
56 
57   // XULTreeAccessible
58   virtual already_AddRefed<LocalAccessible> CreateTreeItemAccessible(
59       int32_t aRow) const override;
60 };
61 
62 /**
63  * Represents accessible for XUL tree item in the case when XUL tree has
64  * multiple columns.
65  */
66 class XULTreeGridRowAccessible final : public XULTreeItemAccessibleBase {
67  public:
68   using LocalAccessible::LocalChildAt;
69 
70   XULTreeGridRowAccessible(nsIContent* aContent, DocAccessible* aDoc,
71                            LocalAccessible* aParent, dom::XULTreeElement* aTree,
72                            nsITreeView* aTreeView, int32_t aRow);
73 
74   // nsISupports and cycle collection
75   NS_DECL_ISUPPORTS_INHERITED
76   NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(XULTreeGridRowAccessible,
77                                            XULTreeItemAccessibleBase)
78 
79   // LocalAccessible
80   virtual void Shutdown() override;
81   virtual a11y::role NativeRole() const override;
82   virtual ENameValueFlag Name(nsString& aName) const override;
83   virtual LocalAccessible* LocalChildAtPoint(
84       int32_t aX, int32_t aY, EWhichChildAtPoint aWhichChild) override;
85 
86   virtual LocalAccessible* LocalChildAt(uint32_t aIndex) const override;
87   virtual uint32_t ChildCount() const override;
88 
89   // XULTreeItemAccessibleBase
90   XULTreeGridCellAccessible* GetCellAccessible(
91       nsTreeColumn* aColumn) const final;
92   virtual void RowInvalidated(int32_t aStartColIdx,
93                               int32_t aEndColIdx) override;
94 
95  protected:
96   virtual ~XULTreeGridRowAccessible();
97 
98   // XULTreeItemAccessibleBase
99   mutable nsRefPtrHashtable<nsPtrHashKey<const void>, XULTreeGridCellAccessible>
100       mAccessibleCache;
101 };
102 
103 /**
104  * Represents an accessible for XUL tree cell in the case when XUL tree has
105  * multiple columns.
106  */
107 
108 class XULTreeGridCellAccessible : public LeafAccessible,
109                                   public TableCellAccessible {
110  public:
111   XULTreeGridCellAccessible(nsIContent* aContent, DocAccessible* aDoc,
112                             XULTreeGridRowAccessible* aRowAcc,
113                             dom::XULTreeElement* aTree, nsITreeView* aTreeView,
114                             int32_t aRow, nsTreeColumn* aColumn);
115 
116   // nsISupports
117   NS_DECL_ISUPPORTS_INHERITED
118   NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(XULTreeGridCellAccessible,
119                                            LeafAccessible)
120 
121   // LocalAccessible
122   virtual void Shutdown() override;
AsTableCell()123   virtual TableCellAccessible* AsTableCell() override { return this; }
124   virtual nsRect BoundsInAppUnits() const override;
125   virtual nsIntRect BoundsInCSSPixels() const override;
126   virtual ENameValueFlag Name(nsString& aName) const override;
127   virtual LocalAccessible* FocusedChild() override;
128   virtual already_AddRefed<AccAttributes> NativeAttributes() override;
129   virtual int32_t IndexInParent() const override;
130   virtual Relation RelationByType(RelationType aType) const override;
131   virtual a11y::role NativeRole() const override;
132   virtual uint64_t NativeState() const override;
133   virtual uint64_t NativeInteractiveState() const override;
134 
135   // ActionAccessible
136   virtual uint8_t ActionCount() const override;
137   virtual void ActionNameAt(uint8_t aIndex, nsAString& aName) override;
138   virtual bool DoAction(uint8_t aIndex) const override;
139 
140   // TableCellAccessible
141   virtual TableAccessible* Table() const override;
142   virtual uint32_t ColIdx() const override;
143   virtual uint32_t RowIdx() const override;
144   virtual void ColHeaderCells(
145       nsTArray<LocalAccessible*>* aHeaderCells) override;
RowHeaderCells(nsTArray<LocalAccessible * > * aCells)146   virtual void RowHeaderCells(nsTArray<LocalAccessible*>* aCells) override {}
147   virtual bool Selected() override;
148 
149   /**
150    * Fire name or state change event if the accessible text or value has been
151    * changed.
152    * @return true if name has changed
153    */
154   bool CellInvalidated();
155 
156  protected:
157   virtual ~XULTreeGridCellAccessible();
158 
159   // LocalAccessible
160   virtual LocalAccessible* GetSiblingAtOffset(
161       int32_t aOffset, nsresult* aError = nullptr) const override;
162   MOZ_CAN_RUN_SCRIPT
163   virtual void DispatchClickEvent(nsIContent* aContent,
164                                   uint32_t aActionIndex) const override;
165 
166   // XULTreeGridCellAccessible
167 
168   /**
169    * Return true if value of cell can be modified.
170    */
171   bool IsEditable() const;
172 
173   enum { eAction_Click = 0 };
174 
175   RefPtr<dom::XULTreeElement> mTree;
176   nsITreeView* mTreeView;
177 
178   int32_t mRow;
179   RefPtr<nsTreeColumn> mColumn;
180 
181   nsString mCachedTextEquiv;
182 };
183 
184 }  // namespace a11y
185 }  // namespace mozilla
186 
187 #endif
188