michael@0: /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: #ifndef mozilla_a11y_XULTreeGridAccessible_h__ michael@0: #define mozilla_a11y_XULTreeGridAccessible_h__ michael@0: michael@0: #include "XULTreeAccessible.h" michael@0: #include "TableAccessible.h" michael@0: #include "TableCellAccessible.h" michael@0: #include "xpcAccessibleTable.h" michael@0: #include "xpcAccessibleTableCell.h" michael@0: michael@0: namespace mozilla { michael@0: namespace a11y { michael@0: michael@0: /** michael@0: * Represents accessible for XUL tree in the case when it has multiple columns. michael@0: */ michael@0: class XULTreeGridAccessible : public XULTreeAccessible, michael@0: public xpcAccessibleTable, michael@0: public nsIAccessibleTable, michael@0: public TableAccessible michael@0: { michael@0: public: michael@0: XULTreeGridAccessible(nsIContent* aContent, DocAccessible* aDoc, michael@0: nsTreeBodyFrame* aTreeFrame) : michael@0: XULTreeAccessible(aContent, aDoc, aTreeFrame), xpcAccessibleTable(this) michael@0: { mGenericTypes |= eTable; } michael@0: michael@0: // nsISupports michael@0: NS_DECL_ISUPPORTS_INHERITED michael@0: michael@0: // nsIAccessibleTable michael@0: NS_FORWARD_NSIACCESSIBLETABLE(xpcAccessibleTable::) michael@0: michael@0: // TableAccessible michael@0: virtual uint32_t ColCount(); michael@0: virtual uint32_t RowCount(); michael@0: virtual Accessible* CellAt(uint32_t aRowIndex, uint32_t aColumnIndex); michael@0: virtual void ColDescription(uint32_t aColIdx, nsString& aDescription); michael@0: virtual bool IsColSelected(uint32_t aColIdx); michael@0: virtual bool IsRowSelected(uint32_t aRowIdx); michael@0: virtual bool IsCellSelected(uint32_t aRowIdx, uint32_t aColIdx); michael@0: virtual uint32_t SelectedCellCount(); michael@0: virtual uint32_t SelectedColCount(); michael@0: virtual uint32_t SelectedRowCount(); michael@0: virtual void SelectedCells(nsTArray* aCells); michael@0: virtual void SelectedCellIndices(nsTArray* aCells); michael@0: virtual void SelectedColIndices(nsTArray* aCols); michael@0: virtual void SelectedRowIndices(nsTArray* aRows); michael@0: virtual void SelectRow(uint32_t aRowIdx); michael@0: virtual void UnselectRow(uint32_t aRowIdx); michael@0: virtual Accessible* AsAccessible() { return this; } michael@0: michael@0: // Accessible michael@0: virtual void Shutdown(); michael@0: virtual TableAccessible* AsTable() { return this; } michael@0: virtual a11y::role NativeRole(); michael@0: michael@0: protected: michael@0: michael@0: // XULTreeAccessible michael@0: virtual already_AddRefed michael@0: CreateTreeItemAccessible(int32_t aRow) const MOZ_OVERRIDE; michael@0: }; michael@0: michael@0: michael@0: /** michael@0: * Represents accessible for XUL tree item in the case when XUL tree has michael@0: * multiple columns. michael@0: */ michael@0: class XULTreeGridRowAccessible : public XULTreeItemAccessibleBase michael@0: { michael@0: public: michael@0: using Accessible::GetChildAt; michael@0: michael@0: XULTreeGridRowAccessible(nsIContent* aContent, DocAccessible* aDoc, michael@0: Accessible* aParent, nsITreeBoxObject* aTree, michael@0: nsITreeView* aTreeView, int32_t aRow); michael@0: michael@0: // nsISupports and cycle collection michael@0: NS_DECL_ISUPPORTS_INHERITED michael@0: NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(XULTreeGridRowAccessible, michael@0: XULTreeItemAccessibleBase) michael@0: michael@0: // Accessible michael@0: virtual void Shutdown(); michael@0: virtual a11y::role NativeRole(); michael@0: virtual ENameValueFlag Name(nsString& aName); michael@0: virtual Accessible* ChildAtPoint(int32_t aX, int32_t aY, michael@0: EWhichChildAtPoint aWhichChild); michael@0: michael@0: virtual Accessible* GetChildAt(uint32_t aIndex) const MOZ_OVERRIDE; michael@0: virtual uint32_t ChildCount() const MOZ_OVERRIDE; michael@0: michael@0: // XULTreeItemAccessibleBase michael@0: virtual Accessible* GetCellAccessible(nsITreeColumn* aColumn) const MOZ_OVERRIDE; michael@0: virtual void RowInvalidated(int32_t aStartColIdx, int32_t aEndColIdx); michael@0: michael@0: protected: michael@0: michael@0: // Accessible michael@0: virtual void CacheChildren(); michael@0: michael@0: // XULTreeItemAccessibleBase michael@0: mutable AccessibleHashtable mAccessibleCache; michael@0: }; michael@0: michael@0: michael@0: /** michael@0: * Represents an accessible for XUL tree cell in the case when XUL tree has michael@0: * multiple columns. michael@0: */ michael@0: michael@0: #define XULTREEGRIDCELLACCESSIBLE_IMPL_CID \ michael@0: { /* 84588ad4-549c-4196-a932-4c5ca5de5dff */ \ michael@0: 0x84588ad4, \ michael@0: 0x549c, \ michael@0: 0x4196, \ michael@0: { 0xa9, 0x32, 0x4c, 0x5c, 0xa5, 0xde, 0x5d, 0xff } \ michael@0: } michael@0: michael@0: class XULTreeGridCellAccessible : public LeafAccessible, michael@0: public nsIAccessibleTableCell, michael@0: public TableCellAccessible, michael@0: public xpcAccessibleTableCell michael@0: { michael@0: public: michael@0: michael@0: XULTreeGridCellAccessible(nsIContent* aContent, DocAccessible* aDoc, michael@0: XULTreeGridRowAccessible* aRowAcc, michael@0: nsITreeBoxObject* aTree, nsITreeView* aTreeView, michael@0: int32_t aRow, nsITreeColumn* aColumn); michael@0: michael@0: // nsISupports michael@0: NS_DECL_ISUPPORTS_INHERITED michael@0: NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(XULTreeGridCellAccessible, michael@0: LeafAccessible) michael@0: michael@0: // nsIAccessible michael@0: michael@0: NS_IMETHOD GetBounds(int32_t* aX, int32_t* aY, michael@0: int32_t* aWidth, int32_t* aHeight); michael@0: michael@0: NS_IMETHOD GetActionName(uint8_t aIndex, nsAString& aName); michael@0: NS_IMETHOD DoAction(uint8_t aIndex); michael@0: michael@0: // nsIAccessibleTableCell michael@0: NS_FORWARD_NSIACCESSIBLETABLECELL(xpcAccessibleTableCell::) michael@0: michael@0: // Accessible michael@0: virtual TableCellAccessible* AsTableCell() { return this; } michael@0: virtual void Shutdown(); michael@0: virtual ENameValueFlag Name(nsString& aName); michael@0: virtual Accessible* FocusedChild(); michael@0: virtual already_AddRefed NativeAttributes() MOZ_OVERRIDE; michael@0: virtual int32_t IndexInParent() const; michael@0: virtual Relation RelationByType(RelationType aType) MOZ_OVERRIDE; michael@0: virtual a11y::role NativeRole(); michael@0: virtual uint64_t NativeState(); michael@0: virtual uint64_t NativeInteractiveState() const; michael@0: michael@0: // ActionAccessible michael@0: virtual uint8_t ActionCount(); michael@0: michael@0: // TableCellAccessible michael@0: virtual TableAccessible* Table() const MOZ_OVERRIDE; michael@0: virtual uint32_t ColIdx() const MOZ_OVERRIDE; michael@0: virtual uint32_t RowIdx() const MOZ_OVERRIDE; michael@0: virtual void ColHeaderCells(nsTArray* aHeaderCells) MOZ_OVERRIDE; michael@0: virtual void RowHeaderCells(nsTArray* aCells) MOZ_OVERRIDE { } michael@0: virtual bool Selected() MOZ_OVERRIDE; michael@0: michael@0: // XULTreeGridCellAccessible michael@0: NS_DECLARE_STATIC_IID_ACCESSOR(XULTREEGRIDCELLACCESSIBLE_IMPL_CID) michael@0: michael@0: /** michael@0: * Fire name or state change event if the accessible text or value has been michael@0: * changed. michael@0: * @return true if name has changed michael@0: */ michael@0: bool CellInvalidated(); michael@0: michael@0: protected: michael@0: // Accessible michael@0: virtual Accessible* GetSiblingAtOffset(int32_t aOffset, michael@0: nsresult* aError = nullptr) const; michael@0: virtual void DispatchClickEvent(nsIContent* aContent, uint32_t aActionIndex); michael@0: michael@0: // XULTreeGridCellAccessible michael@0: michael@0: /** michael@0: * Return true if value of cell can be modified. michael@0: */ michael@0: bool IsEditable() const; michael@0: michael@0: enum { eAction_Click = 0 }; michael@0: michael@0: nsCOMPtr mTree; michael@0: nsITreeView* mTreeView; michael@0: michael@0: int32_t mRow; michael@0: nsCOMPtr mColumn; michael@0: michael@0: nsString mCachedTextEquiv; michael@0: }; michael@0: michael@0: NS_DEFINE_STATIC_IID_ACCESSOR(XULTreeGridCellAccessible, michael@0: XULTREEGRIDCELLACCESSIBLE_IMPL_CID) michael@0: michael@0: } // namespace a11y michael@0: } // namespace mozilla michael@0: michael@0: #endif