/*************************************************************************
 *
 *  File Name (AccessibleTable.idl)
 *
 *  IAccessible2 IDL Specification
 *
 *  Copyright (c) Linux Foundation 2007, 2009
 *  Copyright (c) IBM Corp. 2006
 *  Copyright (c) Sun Microsystems, Inc. 2000, 2006
 *
 *  This library is free software; you can redistribute it and/or
 *  modify it under the terms of the GNU Lesser General Public
 *  License version 2.1, as published by the Free Software Foundation; either
 *  version 2.1 of the License, or (at your option) any later version.
 *
 *  This library is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 *  Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; if not, write to the Free Software
 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
 *
 ************************************************************************/

import "objidl.idl";
import "oaidl.idl";
import "oleacc.idl";
import "Accessible2.idl";
import "IA2CommonTypes.idl";

/** @brief This interface gives access to a two-dimensional table. 
       
 Typically all accessible objects that represent cells or cell-clusters of a table 
  will be at the same time children of the table.  In this case IAccessible2::indexInParent
  will return the child index which then can be used when calling IAccessibleTable::rowIndex
  and IAccessibleTable::columnIndex.

 However, in some cases that kind of implementation will not be possible.  When
  the table cells are not direct children of a table, the object representing
  the cell can define a "table-cell-index" object attribute identifying the 0 
  based table cell index.  This object attribute is obtained by parsing the
  attribute string returned by IAccessible2::attributes.  The "table-cell-index"
  attribute can be used just like a child index of the typical case.  ATs should 
  first test for the presence of the "table-cell-index" attribute and if it is not
  present then IAccessible2::indexInParent can be used as in the typical case
  where cells are direct children of the table.
              
 The range of valid coordinates for this interface are implementation dependent.  
  However, that range includes at least the intervals from the from the first row 
  or column with the index 0 up to the last (but not including) used row or column 
  as returned by IAccessibleTable::nRows and IAccessibleTable::nColumns.

 Note that newer implementations are now using IAccessibleTable2 and IAccessibleTableCell
  rather than this interface.
*/
[object, uuid(35AD8070-C20C-4fb4-B094-F4F7275DD469)]
interface IAccessibleTable : IUnknown
{

  /** @brief Returns the accessible object at the specified row and column in 
    the table.  This object could be an IAccessible or an IAccessible2.
   @param [in] row
    The 0 based row index for which to retrieve the cell.
   @param [in] column
    The 0 based column index for which to retrieve the cell.
   @param [out] accessible
    If both row and column index are valid then the corresponding accessible 
    object is returned that represents the requested cell regardless of whether 
    the cell is currently visible (on the screen).
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed, [out] value is NULL 
  */
  [propget] HRESULT accessibleAt
    (
     [in] long row, 
     [in] long column,
     [out, retval] IUnknown **accessible 
    );

  /** @brief Returns the caption for the table.  The returned object could be 
    an IAccessible or an IAccessible2.
   @param [out] accessible
    If the table has a caption then a reference to it is returned, else a NULL 
    pointer is returned.
   @retval S_OK
   @retval S_FALSE if there is nothing to return, [out] value is NULL 
  */
  [propget] HRESULT caption
    (
     [out, retval] IUnknown **accessible 
    );
	  
  /** @brief Translates the given row and column indexes into the corresponding cell index.
   @param [in] rowIndex
    0 based row index for the cell.
   @param [in] columnIndex
    0 based column index for the cell.
   @param [out] cellIndex
    Returns the 0 based index of the cell at the specified row and column indexes.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed, [out] value is 0
   @note The returned value is not necessarily a child index of the immediate parent.
    In cases where the table cells are not direct children of the table the index 
    is actually the cell index, i.e. conceptually it's an index into a one dimensional
	array of cells laid out in row order.
  */
  [propget] HRESULT childIndex
	(
	 [in] long rowIndex,
	 [in] long columnIndex,
	 [out, retval] long *cellIndex
	);

  /** @brief Returns the description text of the specified column in the table.
   @param [in] column
    The 0 based index of the column for which to retrieve the description.
   @param [out] description
    Returns the description text of the specified column in the table if such a 
    description exists.  Otherwise a NULL pointer is returned.
   @retval S_OK
   @retval S_FALSE if there is nothing to return, [out] value is NULL 
   @retval E_INVALIDARG if bad [in] passed, [out] value is NULL
  */
  [propget] HRESULT columnDescription
    (
     [in] long column,
     [out, retval] BSTR *description
    );

  /** @brief Returns the number of columns occupied by the accessible object 
    at the specified row and column in the table.
        
   The result is greater than 1 if the specified cell spans multiple columns.
   @param [in] row
    0 based row index of the accessible for which to return the column extent.
   @param [in] column
    0 based column index of the accessible for which to return the column extent.
   @param [out] nColumnsSpanned
    Returns the 1 based column extent of the specified cell.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed, [out] value is 0
  */
  [propget] HRESULT columnExtentAt
    (
     [in] long row,
     [in] long column,
     [out, retval] long *nColumnsSpanned 
    );

  /** @brief Returns the column headers as an %IAccessibleTable object.
        
   Content and size of the returned table are implementation dependent.
   @param [out] accessibleTable
    The column header
   @param [out] startingRowIndex
    The 0 based row index where the header starts, usually 0.
   @retval S_OK
   @retval S_FALSE if there is no header, [out] values are NULL and 0 respectively 
  */
  [propget] HRESULT columnHeader
    (
     [out] IAccessibleTable **accessibleTable,
	 [out, retval] long *startingRowIndex
    );

  /** @brief Translates the given cell index into the corresponding column index.
   @param [in] cellIndex
    0 based index of the cell in the parent or closest ancestor table.  Typically this
	is the value returned from IAccessible2::indexInParent, but in the case where the 
	table cells are not direct children of the table this is the cell index specified 
	by the "table-cell-index" object attribute obtained from parsing the attributes 
	string returned by calling IAccessible2::attributes on the cell object.
   @param [out] columnIndex
    Returns the 0 based column index of the cell of the specified child or the index of 
    the first column if the child spans multiple columns.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed, [out] value is 0
  */
  [propget] HRESULT columnIndex
    (
	 [in] long cellIndex,
	 [out, retval] long *columnIndex
	);

  /** @brief Returns the total number of columns in table
   @param [out] columnCount
    Number of columns in table (including columns outside the current viewport)
   @retval S_OK
  */
  [propget] HRESULT nColumns
    (
     [out, retval] long *columnCount 
    );

  /** @brief Returns the total number of rows in table
   @param [out] rowCount
    Number of rows in table (including rows outside the current viewport)
   @retval S_OK
  */
  [propget] HRESULT nRows
    (
     [out, retval] long *rowCount 
    );

  /** @brief Returns the total number of selected cells
   @param [out] cellCount
    Number of cells currently selected
   @retval S_OK
  */
  [propget] HRESULT nSelectedChildren
    (
	 [out, retval] long *cellCount
	);

  /** @brief Returns the total number of selected columns
   @param [out] columnCount
    Number of columns currently selected
   @retval S_OK
  */
  [propget] HRESULT nSelectedColumns
    (
     [out, retval] long *columnCount 
    );

  /** @brief Returns the total number of selected rows
   @param [out] rowCount
    Number of rows currently selected
   @retval S_OK
  */
  [propget] HRESULT nSelectedRows
    (
     [out, retval] long *rowCount 
    );

  /** @brief Returns the description text of the specified row in the table.
   @param [in] row
    The 0 based index of the row for which to retrieve the description.
   @param [out] description
    Returns the description text of the specified row in the table if such a 
    description exists.  Otherwise a NULL pointer is returned.
   @retval S_OK
   @retval S_FALSE if there is nothing to return, [out] value is NULL 
   @retval E_INVALIDARG if bad [in] passed, [out] value is NULL
  */
  [propget] HRESULT rowDescription
    (
     [in] long row, 
     [out, retval] BSTR *description
    );

  /** @brief Returns the number of rows occupied by the accessible object 
    at the specified row and column in the table.
        
   The result is greater than 1 if the specified cell spans multiple rows.
   @param [in] row
    0 based row index of the accessible for which to return the row extent.
   @param [in] column
    0 based column index of the accessible for which to return the row extent.
   @param [out] nRowsSpanned
    Returns the row extent of the specified cell.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed, [out] value is 0
  */
  [propget] HRESULT rowExtentAt
    (
     [in] long row,
     [in] long column,
     [out, retval] long *nRowsSpanned
    );

  /** @brief Returns the row headers as an %IAccessibleTable object.
        
   Content and size of the returned table are implementation dependent.
   @param [out] accessibleTable
    The row header.
   @param [out] startingColumnIndex
    The 0 based column index where the header starts, usually 0.
   @retval S_OK
   @retval S_FALSE if there is no header, [out] values are NULL and 0 respectively 
  */
  [propget] HRESULT rowHeader
    (
     [out] IAccessibleTable **accessibleTable,
	 [out, retval] long *startingColumnIndex
    );

  /** @brief Translates the given cell index into a row index.
   @param [in] cellIndex
    0 based index of the cell in the parent or closest ancestor table.  Typically this 
	is the value returned from IAccessible2::indexInParent, but in the case where the 
	table cells are not direct children of the table this is the cell index specified 
	by the "table-cell-index" object attribute obtained from parsing the attributes 
	string returned by calling IAccessible2::attributes on the cell object.
   @param [out] rowIndex
    0 based row index
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed, [out] value is 0
  */
  [propget] HRESULT rowIndex
    (
	 [in] long cellIndex,
	 [out, retval] long *rowIndex 
	);

  /** @brief Returns a list of cell indexes currently selected (0 based).
   @param [in] maxChildren
    This parameter is ignored. Refer to @ref _arrayConsideration
	"Special Consideration when using Arrays" for more details.
   @param [out] children
    An array of cell indexes of selected cells (each index is 0 based), 
	allocated by the server. Free it with CoTaskMemFree.
   @param [out] nChildren
    The number of cell indexes returned; the size of the returned array.
   @retval S_OK
   @retval S_FALSE if there are none, [out] values are NULL and 0 respectively 
  */
  [propget] HRESULT selectedChildren
    (
     [in] long maxChildren,
     [out, size_is(,maxChildren), length_is(,*nChildren)] long **children,
     [out, retval] long *nChildren
    );

  /** @brief Returns a list of column indexes currently selected (0 based).
   @param [in] maxColumns
    This parameter is ignored. Refer to @ref _arrayConsideration 
	"Special Consideration when using Arrays" for more details.
   @param [out] columns
	An array of column indexes of selected columns (each index is 0 based), allocated
	by the server. Free it with CoTaskMemFree.
   @param [out] nColumns
    The number of column indexes returned; the size of the returned array.
   @retval S_OK
   @retval S_FALSE if there are none, [out] values are NULL and 0 respectively 
  */
  [propget] HRESULT selectedColumns
    (
     [in] long maxColumns,
     [out, size_is(,maxColumns), length_is(,*nColumns)] long **columns,
     [out, retval] long *nColumns
    );

  /** @brief Returns a list of row indexes currently selected (0 based).
   @param [in] maxRows
    This parameter is ignored. Refer to @ref _arrayConsideration
	"Special Consideration when using Arrays" for more details.
   @param [out] rows
    An array of row indexes of selected rows (each index is 0 based), allocated
	by the server. Free it with CoTaskMemFree.
   @param [out] nRows
    The number of row indexes returned; the size of the returned array.
   @retval S_OK
   @retval S_FALSE if there are none, [out] values are NULL and 0 respectively 
  */
  [propget] HRESULT selectedRows
    (
     [in] long maxRows, 
     [out, size_is(,maxRows), length_is(,*nRows)] long **rows, 
     [out, retval] long *nRows 
    );

  /** @brief Returns the summary description of the table.  The returned object could be 
    an IAccessible or an IAccessible2.
   @param [out] accessible
    Returns a reference to an implementation dependent accessible object 
    representing the table's summary or a NULL pointer if the table 
    does not support a summary.
   @retval S_OK
   @retval S_FALSE if there is nothing to return, [out] value is NULL 
  */
  [propget] HRESULT summary
    (
     [out, retval] IUnknown **accessible 
    );

  /** @brief Returns a boolean value indicating whether the specified column is 
    completely selected.
   @param [in] column
    0 based index of the column for which to determine whether it is selected.
   @param [out] isSelected
    Returns TRUE if the specified column is selected completely and FALSE otherwise.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed, [out] value is FALSE
  */
  [propget] HRESULT isColumnSelected
    (
     [in] long column,
     [out, retval] boolean *isSelected
    );

  /** @brief Returns a boolean value indicating whether the specified row is completely 
    selected.
   @param [in] row
    0 based index of the row for which to determine whether it is selected.
   @param [out] isSelected
    Returns TRUE if the specified row is selected completely and FALSE otherwise.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed, [out] value is FALSE
  */
  [propget] HRESULT isRowSelected
    (
     [in] long row,
     [out, retval] boolean *isSelected
    );

  /** @brief Returns a boolean value indicating whether the specified cell is selected.
   @param [in] row
    0 based index of the row for the cell to determine whether it is selected.
   @param [in] column
    0 based index of the column for the cell to determine whether it is selected.
   @param [out] isSelected
    Returns TRUE if the specified cell is selected and FALSE otherwise.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed, [out] value is FALSE
  */
  [propget] HRESULT isSelected
    (
     [in] long row,
     [in] long column,
     [out, retval] boolean *isSelected 
    );

  /** @brief Selects a row and unselects all previously selected rows.
   @param [in] row
    0 based index of the row to be selected.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
  */
  HRESULT selectRow
    (
     [in] long row 
    );

  /** @brief Selects a column and unselects all previously selected columns.
   @param [in] column
    0 based index of the column to be selected.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
  */
  HRESULT selectColumn
    (
     [in] long column
    );

  /** @brief Unselects one row, leaving other selected rows selected (if any).
   @param [in] row
    0 based index of the row to be unselected.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
  */
  HRESULT unselectRow
    (
     [in] long row
    );

  /** @brief Unselects one column, leaving other selected columns selected (if any).
   @param [in] column
    0 based index of the column to be unselected.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed
  */
  HRESULT unselectColumn
    (
     [in] long column
    );
  
  /** @brief Given a cell index, gets the row and column indexes and extents of a cell 
    and whether or not it is selected.

   This is a convenience function.  It is not mandatory to implement it.
   @param [in] index
    0 based index of this cell in the table.
   @param [out] row
    0 based row index.
   @param [out] column
    0 based column index.
   @param [out] rowExtents
    Number of cells spanned by this cell in this row.
   @param [out] columnExtents
    Number of cells spanned by this cell in this column.
   @param [out] isSelected
    Indicates if the specified cell is selected.
   @retval S_OK
   @retval E_INVALIDARG if bad [in] passed, [out] values are 0s and FALSE respectively
  */
  [propget] HRESULT rowColumnExtentsAtIndex
    (
	 [in] long index, 
	 [out] long *row,  
	 [out] long *column,
	 [out] long *rowExtents,
	 [out] long *columnExtents,
	 [out, retval] boolean *isSelected
	);

  /** @brief Returns the type and extents describing how a table changed.
  
   Provided for use by the IA2_EVENT_TABLE_MODEL_CHANGED event handler.

   This data is only guaranteed to be valid while the thread notifying the event 
   continues. Once the handler has returned, the validity of the data depends on 
   how the server manages the life cycle of its objects. Also, note that the server 
   may have different life cycle management strategies for controls depending on 
   whether or not a control manages its children. Lists, trees, and tables can have 
   a large number of children and thus it's possible that the child objects for those 
   controls would only be created as needed. Servers should document their life cycle 
   strategy as this will be of interest to assistive technology or script engines 
   accessing data out of process or from other threads. Servers only need to save the 
   most recent row and column values associated with the change and a scope of the 
   entire application is adequate.

   @param [out] modelChange
    A struct of (type(insert, delete, update), firstRow, lastRow, firstColumn, lastColumn).
   @retval S_OK
   @retval S_FALSE if there is nothing to return, [out] value is NULL 
  */
  [propget] HRESULT modelChange
    (
	 [out, retval] IA2TableModelChange *modelChange
    );

}
