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