XULTreeAccessible.h (8568B)
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 class XULTreeItemAccessibleBase; 21 22 /* 23 * A class the represents the XUL Tree widget. 24 */ 25 const uint32_t kMaxTreeColumns = 100; 26 const uint32_t kDefaultTreeCacheLength = 128; 27 28 /** 29 * LocalAccessible class for XUL tree element. 30 */ 31 32 class XULTreeAccessible : public AccessibleWrap { 33 public: 34 XULTreeAccessible(nsIContent* aContent, DocAccessible* aDoc, 35 nsTreeBodyFrame* aTreeframe); 36 37 // nsISupports and cycle collection 38 NS_DECL_ISUPPORTS_INHERITED 39 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(XULTreeAccessible, LocalAccessible) 40 41 // 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; 48 49 virtual LocalAccessible* LocalChildAt(uint32_t aIndex) const override; 50 virtual uint32_t ChildCount() const override; 51 virtual Relation RelationByType(RelationType aType) const override; 52 53 // SelectAccessible 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; 62 63 // Widgets 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; 69 70 virtual LocalAccessible* ContainerWidget() const override; 71 72 // XULTreeAccessible 73 74 /** 75 * Return tree item accessible at the givem row. If accessible doesn't exist 76 * in the cache then create and cache it. 77 * 78 * @param aRow [in] the given row index 79 */ 80 XULTreeItemAccessibleBase* GetTreeItemAccessible(int32_t aRow) const; 81 82 /** 83 * Invalidates the number of cached treeitem accessibles. 84 * 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) 89 */ 90 void InvalidateCache(int32_t aRow, int32_t aCount); 91 92 /** 93 * Fires name change events for invalidated area of tree. 94 * 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 99 * index 100 */ 101 void TreeViewInvalidated(int32_t aStartRow, int32_t aEndRow, 102 int32_t aStartCol, int32_t aEndCol); 103 104 /** 105 * Invalidates children created for previous tree view. 106 */ 107 void TreeViewChanged(nsITreeView* aView); 108 109 protected: 110 virtual ~XULTreeAccessible(); 111 112 /** 113 * Creates tree item accessible for the given row index. 114 */ 115 virtual already_AddRefed<XULTreeItemAccessibleBase> CreateTreeItemAccessible( 116 int32_t aRow) const; 117 118 RefPtr<dom::XULTreeElement> mTree; 119 nsITreeView* mTreeView; 120 mutable nsRefPtrHashtable<nsPtrHashKey<const void>, XULTreeItemAccessibleBase> 121 mAccessibleCache; 122 }; 123 124 /** 125 * Base class for tree item accessibles. 126 */ 127 128 class XULTreeItemAccessibleBase : public AccessibleWrap { 129 public: 130 XULTreeItemAccessibleBase(nsIContent* aContent, DocAccessible* aDoc, 131 LocalAccessible* aParent, 132 dom::XULTreeElement* aTree, nsITreeView* aTreeView, 133 int32_t aRow); 134 135 // nsISupports and cycle collection 136 NS_DECL_ISUPPORTS_INHERITED 137 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(XULTreeItemAccessibleBase, 138 AccessibleWrap) 139 140 // LocalAccessible 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; 153 154 // ActionAccessible 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; 159 160 // Widgets 161 virtual LocalAccessible* ContainerWidget() const override; 162 163 /** 164 * Return row index associated with the accessible. 165 */ 166 int32_t GetRowIndex() const { return mRow; } 167 168 /** 169 * Return cell accessible for the given column. If XUL tree accessible is not 170 * accessible table then return null. 171 */ 172 virtual XULTreeGridCellAccessible* GetCellAccessible( 173 nsTreeColumn* aColumn) const { 174 return nullptr; 175 } 176 177 /** 178 * Proccess row invalidation. Used to fires name change events. 179 */ 180 virtual void RowInvalidated(int32_t aStartColIdx, int32_t aEndColIdx) = 0; 181 182 protected: 183 virtual ~XULTreeItemAccessibleBase(); 184 185 enum { eAction_Click = 0, eAction_Expand = 1 }; 186 187 // LocalAccessible 188 MOZ_CAN_RUN_SCRIPT 189 virtual void DispatchClickEvent(uint32_t aActionIndex) const override; 190 virtual LocalAccessible* GetSiblingAtOffset( 191 int32_t aOffset, nsresult* aError = nullptr) const override; 192 193 // XULTreeItemAccessibleBase 194 195 /** 196 * Return true if the tree item accessible is expandable (contains subrows). 197 */ 198 bool IsExpandable() const; 199 200 /** 201 * Return name for cell at the given column. 202 */ 203 void GetCellName(nsTreeColumn* aColumn, nsAString& aName) const; 204 205 RefPtr<dom::XULTreeElement> mTree; 206 nsITreeView* mTreeView; 207 int32_t mRow; 208 }; 209 210 /** 211 * LocalAccessible class for items for XUL tree. 212 */ 213 class XULTreeItemAccessible : public XULTreeItemAccessibleBase { 214 public: 215 XULTreeItemAccessible(nsIContent* aContent, DocAccessible* aDoc, 216 LocalAccessible* aParent, dom::XULTreeElement* aTree, 217 nsITreeView* aTreeView, int32_t aRow); 218 219 // nsISupports and cycle collection 220 NS_DECL_ISUPPORTS_INHERITED 221 NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(XULTreeItemAccessible, 222 XULTreeItemAccessibleBase) 223 224 // LocalAccessible 225 virtual void Shutdown() override; 226 virtual ENameValueFlag DirectName(nsString& aName) const override; 227 virtual a11y::role NativeRole() const override; 228 229 // XULTreeItemAccessibleBase 230 virtual void RowInvalidated(int32_t aStartColIdx, 231 int32_t aEndColIdx) override; 232 233 protected: 234 virtual ~XULTreeItemAccessible(); 235 236 // XULTreeItemAccessible 237 RefPtr<nsTreeColumn> mColumn; 238 nsString mCachedName; 239 }; 240 241 /** 242 * LocalAccessible class for columns element of XUL tree. 243 */ 244 class XULTreeColumAccessible : public XULColumAccessible { 245 public: 246 XULTreeColumAccessible(nsIContent* aContent, DocAccessible* aDoc); 247 248 protected: 249 // LocalAccessible 250 virtual LocalAccessible* GetSiblingAtOffset( 251 int32_t aOffset, nsresult* aError = nullptr) const override; 252 }; 253 254 //////////////////////////////////////////////////////////////////////////////// 255 // LocalAccessible downcasting method 256 257 inline XULTreeAccessible* LocalAccessible::AsXULTree() { 258 return IsXULTree() ? static_cast<XULTreeAccessible*>(this) : nullptr; 259 } 260 261 } // namespace a11y 262 } // namespace mozilla 263 264 #endif