Bug 385573 - implement IAccessibleTable::getSelected* methods, r=evan.yan, aaronlev, sr=neil

This commit is contained in:
surkov.alexander%gmail.com 2007-07-11 16:08:34 +00:00
Родитель 7389c08ecb
Коммит 109ba89cbd
5 изменённых файлов: 324 добавлений и 20 удалений

Просмотреть файл

@ -43,7 +43,7 @@
interface nsIAccessible;
[scriptable, uuid(dc13d184-a6df-45a1-92f0-5476fdaebc5a)]
[scriptable, uuid(dcc1e5c3-966e-45b2-b30a-839d35432b24)]
interface nsIAccessibleTable : nsISupports
{
readonly attribute nsIAccessible caption;
@ -64,12 +64,32 @@ interface nsIAccessibleTable : nsISupports
*/
nsIAccessible cellRefAt(in long row, in long column);
/**
* get an index
*/
long getIndexAt (in long row, in long column);
long getColumnAtIndex (in long index);
long getRowAtIndex (in long index);
/**
* Translates the given row and column indices into the corresponding cell
* index.
*
* @param row - index of the row of the table for which to return the cell
* index.
* @param column - index of the column of the table for which to return
* the cell index.
*/
long getIndexAt(in long row, in long column);
/**
* Translates the given child index into the corresponding column index.
*
* @param index - index of the child of the table for which to return
* the column index.
*/
long getColumnAtIndex(in long index);
/**
* Translates the given child index into the corresponding row index.
*
* @param index - index of the child of the table for which to return
* the row index.
*/
long getRowAtIndex(in long index);
/**
* Returns the number of columns occupied by the accessible object
@ -136,6 +156,30 @@ interface nsIAccessibleTable : nsISupports
*/
boolean isCellSelected(in long row, in long column);
/**
* Returns the total number of selected cells.
*/
readonly attribute unsigned long selectedCellsCount;
/**
* Returns the total number of selected columns.
*/
readonly attribute unsigned long selectedColumnsCount;
/**
* Returns the total number of selected rows.
*/
readonly attribute unsigned long selectedRowsCount;
/**
* Returns a list of cells indexes currently selected.
*
* @param cellsSize - length of array
* @param cells - array of indexes of selected cells
*/
void getSelectedCells(out unsigned long cellsSize,
[retval, array, size_is(cellsSize)] out long cells);
/**
* Returns a list of column indexes currently selected.
*

Просмотреть файл

@ -129,6 +129,31 @@ NS_IMETHODIMP nsXULTreeAccessibleWrap::GetRowHeader(nsIAccessibleTable **aRowHea
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsXULTreeAccessibleWrap::GetSelectedCellsCount(PRUint32* aCount)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsXULTreeAccessibleWrap::GetSelectedColumnsCount(PRUint32* aCount)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsXULTreeAccessibleWrap::GetSelectedRowsCount(PRUint32* aCount)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsXULTreeAccessibleWrap::GetSelectedCells(PRUint32 *aNumCells,
PRInt32 **aCells)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP nsXULTreeAccessibleWrap::GetSelectedColumns(PRUint32 *aNumColumns, PRInt32 **aColumns)
{
// If all the row has been selected, then all the columns are selected.
@ -452,6 +477,31 @@ NS_IMETHODIMP nsXULTreeColumnsAccessibleWrap::GetRowHeader(nsIAccessibleTable *
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsXULTreeColumnsAccessibleWrap::GetSelectedCellsCount(PRUint32* aCount)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsXULTreeColumnsAccessibleWrap::GetSelectedColumnsCount(PRUint32* aCount)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsXULTreeColumnsAccessibleWrap::GetSelectedRowsCount(PRUint32* aCount)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsXULTreeColumnsAccessibleWrap::GetSelectedCells(PRUint32 *aNumCells,
PRInt32 **aCells)
{
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP nsXULTreeColumnsAccessibleWrap::GetSelectedColumns(PRUint32 *columnsSize, PRInt32 **columns)
{
// Header can not be selected.

Просмотреть файл

@ -306,6 +306,135 @@ nsHTMLTableAccessible::GetRowHeader(nsIAccessibleTable **aRowHeader)
return NS_ERROR_NOT_IMPLEMENTED;
}
NS_IMETHODIMP
nsHTMLTableAccessible::GetSelectedCellsCount(PRUint32* aCount)
{
NS_ENSURE_ARG_POINTER(aCount);
*aCount = 0;
PRInt32 rowsCount = 0;
nsresult rv = GetRows(&rowsCount);
NS_ENSURE_SUCCESS(rv, rv);
PRInt32 columnsCount = 0;
rv = GetColumns(&columnsCount);
NS_ENSURE_SUCCESS(rv, rv);
PRInt32 rowIndex;
for (rowIndex = 0; rowIndex < rowsCount; rowIndex++) {
PRInt32 columnIndex;
for (columnIndex = 0; columnIndex < columnsCount; columnIndex++) {
PRBool state = PR_FALSE;
rv = IsCellSelected(rowIndex, columnIndex, &state);
NS_ENSURE_SUCCESS(rv, rv);
if (state)
(*aCount)++;
}
}
return NS_OK;
}
NS_IMETHODIMP
nsHTMLTableAccessible::GetSelectedColumnsCount(PRUint32* aCount)
{
NS_ENSURE_ARG_POINTER(aCount);
*aCount = 0;
PRInt32 count = 0;
nsresult rv = GetColumns(&count);
NS_ENSURE_SUCCESS(rv, rv);
PRInt32 index;
for (index = 0; index < count; index++) {
PRBool state = PR_FALSE;
rv = IsColumnSelected(index, &state);
NS_ENSURE_SUCCESS(rv, rv);
if (state)
(*aCount)++;
}
return NS_OK;
}
NS_IMETHODIMP
nsHTMLTableAccessible::GetSelectedRowsCount(PRUint32* aCount)
{
NS_ENSURE_ARG_POINTER(aCount);
*aCount = 0;
PRInt32 count = 0;
nsresult rv = GetRows(&count);
NS_ENSURE_SUCCESS(rv, rv);
PRInt32 index;
for (index = 0; index < count; index++) {
PRBool state = PR_FALSE;
rv = IsRowSelected(index, &state);
NS_ENSURE_SUCCESS(rv, rv);
if (state)
(*aCount)++;
}
return NS_OK;
}
NS_IMETHODIMP
nsHTMLTableAccessible::GetSelectedCells(PRUint32 *aNumCells,
PRInt32 **aCells)
{
NS_ENSURE_ARG_POINTER(aNumCells);
*aNumCells = 0;
NS_ENSURE_ARG_POINTER(aCells);
*aCells = nsnull;
PRInt32 rowsCount = 0;
nsresult rv = GetRows(&rowsCount);
NS_ENSURE_SUCCESS(rv, rv);
PRInt32 columnsCount = 0;
rv = GetColumns(&columnsCount);
NS_ENSURE_SUCCESS(rv, rv);
PRInt32 cellsCount = columnsCount * rowsCount;
nsAutoArrayPtr<PRBool> states(new PRBool[cellsCount]);
NS_ENSURE_TRUE(states, NS_ERROR_OUT_OF_MEMORY);
PRInt32 rowIndex, index;
for (rowIndex = 0, index = 0; rowIndex < rowsCount; rowIndex++) {
PRInt32 columnIndex;
for (columnIndex = 0; columnIndex < columnsCount; columnIndex++, index++) {
rv = IsCellSelected(rowIndex, columnIndex, &states[index]);
NS_ENSURE_SUCCESS(rv, rv);
if (states[index])
(*aNumCells)++;
}
}
PRInt32 *cellsArray =
(PRInt32 *)nsMemory::Alloc((*aNumCells) * sizeof(PRInt32));
NS_ENSURE_TRUE(cellsArray, NS_ERROR_OUT_OF_MEMORY);
PRInt32 curr = 0;
for (rowIndex = 0, index = 0; rowIndex < rowsCount; rowIndex++) {
PRInt32 columnIndex;
for (columnIndex = 0; columnIndex < columnsCount; columnIndex++, index++) {
if (states[index]) {
PRInt32 cellIndex = -1;
GetIndexAt(rowIndex, columnIndex, &cellIndex);
cellsArray[curr++] = cellIndex;
}
}
}
*aCells = cellsArray;
return NS_OK;
}
NS_IMETHODIMP
nsHTMLTableAccessible::GetSelectedColumns(PRUint32 *aNumColumns,
PRInt32 **aColumns)

Просмотреть файл

@ -267,21 +267,51 @@ STDMETHODIMP
CAccessibleTable::get_nSelectedChildren(long *aChildCount)
{
*aChildCount = 0;
return E_NOTIMPL;
nsCOMPtr<nsIAccessibleTable> tableAcc(do_QueryInterface(this));
NS_ASSERTION(tableAcc, CANT_QUERY_ASSERTION_MSG);
if (!tableAcc)
return E_FAIL;
PRUint32 count = 0;
nsresult rv = tableAcc->GetSelectedCellsCount(&count);
*aChildCount = count;
return NS_FAILED(rv) ? E_FAIL : S_OK;
}
STDMETHODIMP
CAccessibleTable::get_nSelectedColumns(long *aColumnCount)
{
*aColumnCount = 0;
return E_NOTIMPL;
nsCOMPtr<nsIAccessibleTable> tableAcc(do_QueryInterface(this));
NS_ASSERTION(tableAcc, CANT_QUERY_ASSERTION_MSG);
if (!tableAcc)
return E_FAIL;
PRUint32 count = 0;
nsresult rv = tableAcc->GetSelectedColumnsCount(&count);
*aColumnCount = count;
return NS_FAILED(rv) ? E_FAIL : S_OK;
}
STDMETHODIMP
CAccessibleTable::get_nSelectedRows(long *aRowCount)
{
*aRowCount = 0;
return E_NOTIMPL;
nsCOMPtr<nsIAccessibleTable> tableAcc(do_QueryInterface(this));
NS_ASSERTION(tableAcc, CANT_QUERY_ASSERTION_MSG);
if (!tableAcc)
return E_FAIL;
PRUint32 count = 0;
nsresult rv = tableAcc->GetSelectedRowsCount(&count);
*aRowCount = count;
return NS_FAILED(rv) ? E_FAIL : S_OK;
}
STDMETHODIMP
@ -371,28 +401,22 @@ CAccessibleTable::get_rowIndex(long aChildIndex, long *aRowIndex)
STDMETHODIMP
CAccessibleTable::get_selectedChildren(long aMaxChildren, long **aChildren,
long *nChildren)
long *aNChildren)
{
*aChildren = NULL;
*nChildren = 0;
return E_NOTIMPL;
return GetSelectedItems(aMaxChildren, aChildren, aNChildren, ITEMSTYPE_CELLS);
}
STDMETHODIMP
CAccessibleTable::get_selectedColumns(long aMaxColumns, long **aColumns,
long *aNColumns)
{
*aColumns = NULL;
*aNColumns = 0;
return E_NOTIMPL;
return GetSelectedItems(aMaxColumns, aColumns, aNColumns, ITEMSTYPE_COLUMNS);
}
STDMETHODIMP
CAccessibleTable::get_selectedRows(long aMaxRows, long **aRows, long *aNRows)
{
*aRows = NULL;
*aNRows = 0;
return E_NOTIMPL;
return GetSelectedItems(aMaxRows, aRows, aNRows, ITEMSTYPE_ROWS);
}
STDMETHODIMP
@ -517,3 +541,50 @@ CAccessibleTable::get_modelChange(IA2TableModelChange *aModelChange)
return E_NOTIMPL;
}
// CAccessibleTable
HRESULT
CAccessibleTable::GetSelectedItems(long aMaxItems, long **aItems,
long *aItemsCount, eItemsType aType)
{
*aItemsCount = 0;
nsCOMPtr<nsIAccessibleTable> tableAcc(do_QueryInterface(this));
NS_ASSERTION(tableAcc, CANT_QUERY_ASSERTION_MSG);
if (!tableAcc)
return E_FAIL;
PRUint32 size = 0;
PRInt32 *items = NULL;
nsresult rv = NS_OK;
switch (aType) {
case ITEMSTYPE_CELLS:
rv = tableAcc->GetSelectedCells(&size, &items);
break;
case ITEMSTYPE_COLUMNS:
rv = tableAcc->GetSelectedColumns(&size, &items);
break;
case ITEMSTYPE_ROWS:
rv = tableAcc->GetSelectedRows(&size, &items);
break;
default:
return E_FAIL;
}
if (NS_FAILED(rv))
return E_FAIL;
if (size == 0 || !items)
return S_OK;
PRUint32 maxSize = size < (PRUint32)aMaxItems ? size : aMaxItems;
*aItemsCount = maxSize;
for (PRUint32 index = 0; index < maxSize; ++index)
(*aItems)[index] = items[index];
nsMemory::Free(items);
return S_OK;
}

Просмотреть файл

@ -169,6 +169,16 @@ public:
virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_modelChange(
/* [retval][out] */ IA2TableModelChange *modelChange);
private:
enum eItemsType {
ITEMSTYPE_CELLS,
ITEMSTYPE_COLUMNS,
ITEMSTYPE_ROWS
};
HRESULT GetSelectedItems(long aMaxItems, long **aItems, long *aItemsCount,
eItemsType aType);
};
#endif