13a700b0aSSteve Yin /**************************************************************
23a700b0aSSteve Yin *
33a700b0aSSteve Yin * Licensed to the Apache Software Foundation (ASF) under one
43a700b0aSSteve Yin * or more contributor license agreements. See the NOTICE file
53a700b0aSSteve Yin * distributed with this work for additional information
63a700b0aSSteve Yin * regarding copyright ownership. The ASF licenses this file
73a700b0aSSteve Yin * to you under the Apache License, Version 2.0 (the
83a700b0aSSteve Yin * "License"); you may not use this file except in compliance
93a700b0aSSteve Yin * with the License. You may obtain a copy of the License at
103a700b0aSSteve Yin *
113a700b0aSSteve Yin * http://www.apache.org/licenses/LICENSE-2.0
123a700b0aSSteve Yin *
133a700b0aSSteve Yin * Unless required by applicable law or agreed to in writing,
143a700b0aSSteve Yin * software distributed under the License is distributed on an
153a700b0aSSteve Yin * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
163a700b0aSSteve Yin * KIND, either express or implied. See the License for the
173a700b0aSSteve Yin * specific language governing permissions and limitations
183a700b0aSSteve Yin * under the License.
193a700b0aSSteve Yin *
203a700b0aSSteve Yin *************************************************************/
215fdc4257SSteve Yin
225fdc4257SSteve Yin /**
235fdc4257SSteve Yin * AccTable.cpp : Implementation of CAccTable.
245fdc4257SSteve Yin */
255fdc4257SSteve Yin #include "stdafx.h"
265fdc4257SSteve Yin #include "UAccCOM2.h"
275fdc4257SSteve Yin #include "AccTable.h"
285fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessible.hpp>
295fdc4257SSteve Yin #include "MAccessible.h"
305fdc4257SSteve Yin
31*b0a7a3cfSSteve Yin #include "act.hxx"
323a700b0aSSteve Yin
335fdc4257SSteve Yin #ifndef _COM_SUN_STAR_ACCESSIBILITY_XACCESSIBLETABLEEXTENT_HPP_
345fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleTableSelection.hpp>
355fdc4257SSteve Yin #endif
365fdc4257SSteve Yin
375fdc4257SSteve Yin using namespace com::sun::star::accessibility;
385fdc4257SSteve Yin using namespace com::sun::star::uno;
395fdc4257SSteve Yin /**
405fdc4257SSteve Yin * Gets accessible table cell.
415fdc4257SSteve Yin *
425fdc4257SSteve Yin * @param row the row of the specified cell.
435fdc4257SSteve Yin * @param column the column of the specified cell.
445fdc4257SSteve Yin * @param accessible the accessible object of the cell.
455fdc4257SSteve Yin */
465fdc4257SSteve Yin
get_accessibleAt(long row,long column,IUnknown ** accessible)475fdc4257SSteve Yin STDMETHODIMP CAccTable::get_accessibleAt(long row, long column, IUnknown * * accessible)
485fdc4257SSteve Yin {
495fdc4257SSteve Yin
505fdc4257SSteve Yin CHECK_ENABLE_INF
515fdc4257SSteve Yin
525fdc4257SSteve Yin ENTER_PROTECTED_BLOCK
535fdc4257SSteve Yin
545fdc4257SSteve Yin // #CHECK#
555fdc4257SSteve Yin if(accessible == NULL)
565fdc4257SSteve Yin return E_INVALIDARG;
575fdc4257SSteve Yin // #CHECK XInterface#
585fdc4257SSteve Yin if(!pRXTable.is())
595fdc4257SSteve Yin return E_FAIL;
605fdc4257SSteve Yin
615fdc4257SSteve Yin Reference<XAccessible> pRAcc = GetXInterface()->getAccessibleCellAt(row,column);
625fdc4257SSteve Yin
635fdc4257SSteve Yin if(!pRAcc.is())
645fdc4257SSteve Yin {
655fdc4257SSteve Yin *accessible = NULL;
665fdc4257SSteve Yin return E_FAIL;
675fdc4257SSteve Yin }
685fdc4257SSteve Yin
695fdc4257SSteve Yin IAccessible* pRet = NULL;
705fdc4257SSteve Yin
715fdc4257SSteve Yin BOOL isTRUE = CMAccessible::get_IAccessibleFromXAccessible((long)pRAcc.get(),&pRet);
725fdc4257SSteve Yin if(isTRUE)
735fdc4257SSteve Yin {
745fdc4257SSteve Yin *accessible = (IAccessible2 *)pRet;
755fdc4257SSteve Yin pRet->AddRef();
765fdc4257SSteve Yin return S_OK;
775fdc4257SSteve Yin }
785fdc4257SSteve Yin else if(pRAcc.is())
795fdc4257SSteve Yin {
805fdc4257SSteve Yin Reference<XAccessible> pxTable(GetXInterface(),UNO_QUERY);
815fdc4257SSteve Yin
825fdc4257SSteve Yin CMAccessible::g_pAgent->InsertAccObj(pRAcc.get(),pxTable.get());
835fdc4257SSteve Yin isTRUE = CMAccessible::get_IAccessibleFromXAccessible((long)pRAcc.get(),&pRet);
845fdc4257SSteve Yin
855fdc4257SSteve Yin if(isTRUE)
865fdc4257SSteve Yin {
875fdc4257SSteve Yin *accessible = (IAccessible2 *)pRet;
885fdc4257SSteve Yin pRet->AddRef();
895fdc4257SSteve Yin return S_OK;
905fdc4257SSteve Yin }
915fdc4257SSteve Yin }
925fdc4257SSteve Yin return E_FAIL;
935fdc4257SSteve Yin
945fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK
955fdc4257SSteve Yin }
965fdc4257SSteve Yin
975fdc4257SSteve Yin /**
985fdc4257SSteve Yin * Gets accessible table caption.
995fdc4257SSteve Yin *
1005fdc4257SSteve Yin * @param accessible the accessible object of table cpation.
1015fdc4257SSteve Yin */
get_caption(IUnknown **)1025fdc4257SSteve Yin STDMETHODIMP CAccTable::get_caption(IUnknown * *)
1035fdc4257SSteve Yin {
1045fdc4257SSteve Yin
1055fdc4257SSteve Yin
1065fdc4257SSteve Yin ENTER_PROTECTED_BLOCK
1075fdc4257SSteve Yin
1085fdc4257SSteve Yin return E_NOTIMPL;
1095fdc4257SSteve Yin
1105fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK
1115fdc4257SSteve Yin }
1125fdc4257SSteve Yin
1135fdc4257SSteve Yin /**
1145fdc4257SSteve Yin * Gets accessible column description (as string).
1155fdc4257SSteve Yin *
1165fdc4257SSteve Yin * @param column the column index.
1175fdc4257SSteve Yin * @param description the description of the specified column.
1185fdc4257SSteve Yin */
get_columnDescription(long column,BSTR * description)1195fdc4257SSteve Yin STDMETHODIMP CAccTable::get_columnDescription(long column, BSTR * description)
1205fdc4257SSteve Yin {
1215fdc4257SSteve Yin
1225fdc4257SSteve Yin CHECK_ENABLE_INF
1235fdc4257SSteve Yin
1245fdc4257SSteve Yin ENTER_PROTECTED_BLOCK
1255fdc4257SSteve Yin
1265fdc4257SSteve Yin // #CHECK#
1275fdc4257SSteve Yin if(description == NULL)
1285fdc4257SSteve Yin return E_INVALIDARG;
1295fdc4257SSteve Yin
1305fdc4257SSteve Yin // #CHECK XInterface#
1315fdc4257SSteve Yin if(!pRXTable.is())
1325fdc4257SSteve Yin return E_FAIL;
1335fdc4257SSteve Yin
1345fdc4257SSteve Yin const ::rtl::OUString& ouStr = GetXInterface()->getAccessibleColumnDescription(column);
1355fdc4257SSteve Yin // #CHECK#
1365fdc4257SSteve Yin
1375fdc4257SSteve Yin SAFE_SYSFREESTRING(*description);//??
1385fdc4257SSteve Yin *description = SysAllocString((OLECHAR*)ouStr.getStr());
1395fdc4257SSteve Yin if(description==NULL)
1405fdc4257SSteve Yin return E_FAIL;
1415fdc4257SSteve Yin return S_OK;
1425fdc4257SSteve Yin
1435fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK
1445fdc4257SSteve Yin }
1455fdc4257SSteve Yin
1465fdc4257SSteve Yin /**
1475fdc4257SSteve Yin * Gets number of columns spanned by table cell.
1485fdc4257SSteve Yin *
1495fdc4257SSteve Yin * @param row the row of the specified cell.
1505fdc4257SSteve Yin * @param column the column of the specified cell.
1515fdc4257SSteve Yin * @param spanColumns the column span of the specified cell.
1525fdc4257SSteve Yin */
get_columnExtentAt(long row,long column,long * nColumnsSpanned)1535fdc4257SSteve Yin STDMETHODIMP CAccTable::get_columnExtentAt(long row, long column, long * nColumnsSpanned)
1545fdc4257SSteve Yin {
1555fdc4257SSteve Yin
1565fdc4257SSteve Yin CHECK_ENABLE_INF
1575fdc4257SSteve Yin
1585fdc4257SSteve Yin ENTER_PROTECTED_BLOCK
1595fdc4257SSteve Yin
1605fdc4257SSteve Yin XAccessibleTable *pXAccTable = GetXInterface();
1615fdc4257SSteve Yin
1625fdc4257SSteve Yin // Check pointer.
1635fdc4257SSteve Yin if(nColumnsSpanned == NULL)
1645fdc4257SSteve Yin return E_INVALIDARG;
1655fdc4257SSteve Yin
1665fdc4257SSteve Yin // Get Extent.
1675fdc4257SSteve Yin if(pXAccTable)
1685fdc4257SSteve Yin {
1695fdc4257SSteve Yin long lExt = pXAccTable->getAccessibleColumnExtentAt(row,column);
1705fdc4257SSteve Yin
1715fdc4257SSteve Yin // Fill Extent struct.
1725fdc4257SSteve Yin *nColumnsSpanned = lExt;
1735fdc4257SSteve Yin return S_OK;
1745fdc4257SSteve Yin }
1755fdc4257SSteve Yin
1765fdc4257SSteve Yin return E_FAIL;
1775fdc4257SSteve Yin
1785fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK
1795fdc4257SSteve Yin }
1805fdc4257SSteve Yin
1815fdc4257SSteve Yin /**
1825fdc4257SSteve Yin * Gets accessible column header.
1835fdc4257SSteve Yin *
1845fdc4257SSteve Yin * @param column the column index.
1855fdc4257SSteve Yin * @param accessible the accessible object of the specified column.
1865fdc4257SSteve Yin */
get_columnHeader(IAccessibleTable __RPC_FAR * __RPC_FAR * accessibleTable,long * startingRowIndex)1875fdc4257SSteve Yin STDMETHODIMP CAccTable::get_columnHeader(IAccessibleTable __RPC_FAR *__RPC_FAR *accessibleTable, long *startingRowIndex)
1885fdc4257SSteve Yin {
1895fdc4257SSteve Yin
1905fdc4257SSteve Yin CHECK_ENABLE_INF
1915fdc4257SSteve Yin
1925fdc4257SSteve Yin ENTER_PROTECTED_BLOCK
1935fdc4257SSteve Yin
1945fdc4257SSteve Yin // #CHECK#
1955fdc4257SSteve Yin if(accessibleTable == NULL || startingRowIndex == NULL)
1965fdc4257SSteve Yin return E_INVALIDARG;
1975fdc4257SSteve Yin
1985fdc4257SSteve Yin // #CHECK XInterface#
1995fdc4257SSteve Yin if(!pRXTable.is())
2005fdc4257SSteve Yin return E_FAIL;
2015fdc4257SSteve Yin
2025fdc4257SSteve Yin Reference<XAccessibleTable> pRColumnHeaderTable = GetXInterface()->getAccessibleColumnHeaders();
2035fdc4257SSteve Yin if(!pRColumnHeaderTable.is())
2045fdc4257SSteve Yin {
2055fdc4257SSteve Yin *accessibleTable = NULL;
2065fdc4257SSteve Yin return E_FAIL;
2075fdc4257SSteve Yin }
2085fdc4257SSteve Yin
2095fdc4257SSteve Yin Reference<XAccessible> pRXColumnHeader(pRColumnHeaderTable,UNO_QUERY);
2105fdc4257SSteve Yin
2115fdc4257SSteve Yin if(!pRXColumnHeader.is())
2125fdc4257SSteve Yin {
2135fdc4257SSteve Yin *accessibleTable = NULL;
2145fdc4257SSteve Yin return E_FAIL;
2155fdc4257SSteve Yin }
2165fdc4257SSteve Yin *startingRowIndex = 0 ;
2175fdc4257SSteve Yin
2185fdc4257SSteve Yin IAccessible* m_pIMacc = NULL;
219*b0a7a3cfSSteve Yin ActivateActContext();
2203a700b0aSSteve Yin HRESULT hr = CoCreateInstance( CLSID_MAccessible, NULL, CLSCTX_ALL ,
2215fdc4257SSteve Yin IID_IMAccessible,
2225fdc4257SSteve Yin (void **)&m_pIMacc
2235fdc4257SSteve Yin );
224*b0a7a3cfSSteve Yin DeactivateActContext();
2255fdc4257SSteve Yin ((CMAccessible*)m_pIMacc)->SetXAccessible((long)pRXColumnHeader.get());
2265fdc4257SSteve Yin m_pIMacc->QueryInterface(IID_IAccessibleTable,(void **)accessibleTable);
2275fdc4257SSteve Yin if( SUCCEEDED(hr) )
2285fdc4257SSteve Yin {
2295fdc4257SSteve Yin return S_OK;
2305fdc4257SSteve Yin }
2315fdc4257SSteve Yin
2325fdc4257SSteve Yin return E_FAIL;
2335fdc4257SSteve Yin
2345fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK
2355fdc4257SSteve Yin }
2365fdc4257SSteve Yin
2375fdc4257SSteve Yin /**
2385fdc4257SSteve Yin * Gets total number of columns in table.
2395fdc4257SSteve Yin *
2405fdc4257SSteve Yin * @param columnCount the number of columns in table.
2415fdc4257SSteve Yin */
get_nColumns(long * columnCount)2425fdc4257SSteve Yin STDMETHODIMP CAccTable::get_nColumns(long * columnCount)
2435fdc4257SSteve Yin {
2445fdc4257SSteve Yin
2455fdc4257SSteve Yin CHECK_ENABLE_INF
2465fdc4257SSteve Yin
2475fdc4257SSteve Yin ENTER_PROTECTED_BLOCK
2485fdc4257SSteve Yin
2495fdc4257SSteve Yin // #CHECK#
2505fdc4257SSteve Yin if(columnCount == NULL)
2515fdc4257SSteve Yin return E_INVALIDARG;
2525fdc4257SSteve Yin
2535fdc4257SSteve Yin // #CHECK XInterface#
2545fdc4257SSteve Yin if(!pRXTable.is())
2555fdc4257SSteve Yin return E_FAIL;
2565fdc4257SSteve Yin
2575fdc4257SSteve Yin *columnCount = GetXInterface()->getAccessibleColumnCount();
2585fdc4257SSteve Yin return S_OK;
2595fdc4257SSteve Yin
2605fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK
2615fdc4257SSteve Yin }
2625fdc4257SSteve Yin
2635fdc4257SSteve Yin /**
2645fdc4257SSteve Yin * Gets total number of rows in table.
2655fdc4257SSteve Yin *
2665fdc4257SSteve Yin * @param rowCount the number of rows in table.
2675fdc4257SSteve Yin */
get_nRows(long * rowCount)2685fdc4257SSteve Yin STDMETHODIMP CAccTable::get_nRows(long * rowCount)
2695fdc4257SSteve Yin {
2705fdc4257SSteve Yin
2715fdc4257SSteve Yin CHECK_ENABLE_INF
2725fdc4257SSteve Yin
2735fdc4257SSteve Yin ENTER_PROTECTED_BLOCK
2745fdc4257SSteve Yin
2755fdc4257SSteve Yin // #CHECK#
2765fdc4257SSteve Yin if(rowCount == NULL)
2775fdc4257SSteve Yin return E_INVALIDARG;
2785fdc4257SSteve Yin
2795fdc4257SSteve Yin // #CHECK XInterface#
2805fdc4257SSteve Yin if(!pRXTable.is())
2815fdc4257SSteve Yin return E_FAIL;
2825fdc4257SSteve Yin
2835fdc4257SSteve Yin *rowCount = GetXInterface()->getAccessibleRowCount();
2845fdc4257SSteve Yin return S_OK;
2855fdc4257SSteve Yin
2865fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK
2875fdc4257SSteve Yin }
2885fdc4257SSteve Yin
2895fdc4257SSteve Yin /**
2905fdc4257SSteve Yin * Gets total number of selected columns.
2915fdc4257SSteve Yin *
2925fdc4257SSteve Yin * @param columnCount the number of selected columns.
2935fdc4257SSteve Yin */
get_nSelectedColumns(long * columnCount)2945fdc4257SSteve Yin STDMETHODIMP CAccTable::get_nSelectedColumns(long * columnCount)
2955fdc4257SSteve Yin {
2965fdc4257SSteve Yin
2975fdc4257SSteve Yin CHECK_ENABLE_INF
2985fdc4257SSteve Yin
2995fdc4257SSteve Yin ENTER_PROTECTED_BLOCK
3005fdc4257SSteve Yin
3015fdc4257SSteve Yin // #CHECK#
3025fdc4257SSteve Yin if(columnCount == NULL)
3035fdc4257SSteve Yin return E_INVALIDARG;
3045fdc4257SSteve Yin
3055fdc4257SSteve Yin // #CHECK XInterface#
3065fdc4257SSteve Yin if(!pRXTable.is())
3075fdc4257SSteve Yin return E_FAIL;
3085fdc4257SSteve Yin
3095fdc4257SSteve Yin Sequence<long> pSelected = GetXInterface()->getSelectedAccessibleColumns();
3105fdc4257SSteve Yin *columnCount = pSelected.getLength();
3115fdc4257SSteve Yin return S_OK;
3125fdc4257SSteve Yin
3135fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK
3145fdc4257SSteve Yin }
3155fdc4257SSteve Yin
3165fdc4257SSteve Yin /**
3175fdc4257SSteve Yin * Gets total number of selected rows.
3185fdc4257SSteve Yin *
3195fdc4257SSteve Yin * @param rowCount the number of selected rows.
3205fdc4257SSteve Yin */
get_nSelectedRows(long * rowCount)3215fdc4257SSteve Yin STDMETHODIMP CAccTable::get_nSelectedRows(long * rowCount)
3225fdc4257SSteve Yin {
3235fdc4257SSteve Yin
3245fdc4257SSteve Yin CHECK_ENABLE_INF
3255fdc4257SSteve Yin
3265fdc4257SSteve Yin ENTER_PROTECTED_BLOCK
3275fdc4257SSteve Yin
3285fdc4257SSteve Yin // #CHECK#
3295fdc4257SSteve Yin if(rowCount == NULL)
3305fdc4257SSteve Yin return E_INVALIDARG;
3315fdc4257SSteve Yin
3325fdc4257SSteve Yin // #CHECK XInterface#
3335fdc4257SSteve Yin if(!pRXTable.is())
3345fdc4257SSteve Yin return E_FAIL;
3355fdc4257SSteve Yin
3365fdc4257SSteve Yin Sequence<long> pSelected = GetXInterface()->getSelectedAccessibleRows();
3375fdc4257SSteve Yin *rowCount = pSelected.getLength();
3385fdc4257SSteve Yin return S_OK;
3395fdc4257SSteve Yin
3405fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK
3415fdc4257SSteve Yin }
3425fdc4257SSteve Yin
3435fdc4257SSteve Yin /**
3445fdc4257SSteve Yin * Gets accessible row description (as string).
3455fdc4257SSteve Yin *
3465fdc4257SSteve Yin * @param row the row index.
3475fdc4257SSteve Yin * @param description the description of the specified row.
3485fdc4257SSteve Yin */
get_rowDescription(long row,BSTR * description)3495fdc4257SSteve Yin STDMETHODIMP CAccTable::get_rowDescription(long row, BSTR * description)
3505fdc4257SSteve Yin {
3515fdc4257SSteve Yin
3525fdc4257SSteve Yin CHECK_ENABLE_INF
3535fdc4257SSteve Yin
3545fdc4257SSteve Yin ENTER_PROTECTED_BLOCK
3555fdc4257SSteve Yin
3565fdc4257SSteve Yin // #CHECK#
3575fdc4257SSteve Yin if(description == NULL)
3585fdc4257SSteve Yin return E_INVALIDARG;
3595fdc4257SSteve Yin
3605fdc4257SSteve Yin // #CHECK XInterface#
3615fdc4257SSteve Yin if(!pRXTable.is())
3625fdc4257SSteve Yin return E_FAIL;
3635fdc4257SSteve Yin
3645fdc4257SSteve Yin const ::rtl::OUString& ouStr = GetXInterface()->getAccessibleRowDescription(row);
3655fdc4257SSteve Yin // #CHECK#
3665fdc4257SSteve Yin
3675fdc4257SSteve Yin SAFE_SYSFREESTRING(*description);
3685fdc4257SSteve Yin *description = SysAllocString((OLECHAR*)ouStr.getStr());
3695fdc4257SSteve Yin if(description==NULL)
3705fdc4257SSteve Yin return E_FAIL;
3715fdc4257SSteve Yin
3725fdc4257SSteve Yin return S_OK;
3735fdc4257SSteve Yin
3745fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK
3755fdc4257SSteve Yin }
3765fdc4257SSteve Yin
3775fdc4257SSteve Yin /**
3785fdc4257SSteve Yin * Gets number of rows spanned by a table cell.
3795fdc4257SSteve Yin *
3805fdc4257SSteve Yin * @param row the row of the specified cell.
3815fdc4257SSteve Yin * @param column the column of the specified cell.
3825fdc4257SSteve Yin * @param spanRows the row span of the specified cell.
3835fdc4257SSteve Yin */
get_rowExtentAt(long row,long column,long * nRowsSpanned)3845fdc4257SSteve Yin STDMETHODIMP CAccTable::get_rowExtentAt(long row, long column, long * nRowsSpanned)
3855fdc4257SSteve Yin {
3865fdc4257SSteve Yin
3875fdc4257SSteve Yin CHECK_ENABLE_INF
3885fdc4257SSteve Yin
3895fdc4257SSteve Yin ENTER_PROTECTED_BLOCK
3905fdc4257SSteve Yin
3915fdc4257SSteve Yin XAccessibleTable *pXAccTable = GetXInterface();
3925fdc4257SSteve Yin
3935fdc4257SSteve Yin // Check pointer.
3945fdc4257SSteve Yin if(nRowsSpanned == NULL)
3955fdc4257SSteve Yin return E_INVALIDARG;
3965fdc4257SSteve Yin
3975fdc4257SSteve Yin // Get Extent.
3985fdc4257SSteve Yin if(pXAccTable)
3995fdc4257SSteve Yin {
4005fdc4257SSteve Yin long lExt = GetXInterface()->getAccessibleRowExtentAt(row,column);
4015fdc4257SSteve Yin
4025fdc4257SSteve Yin // Fill Extent struct.
4035fdc4257SSteve Yin *nRowsSpanned= lExt;
4045fdc4257SSteve Yin
4055fdc4257SSteve Yin return S_OK;
4065fdc4257SSteve Yin }
4075fdc4257SSteve Yin
4085fdc4257SSteve Yin return E_FAIL;
4095fdc4257SSteve Yin
4105fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK
4115fdc4257SSteve Yin }
4125fdc4257SSteve Yin
4135fdc4257SSteve Yin /**
4145fdc4257SSteve Yin * Gets accessible row header.
4155fdc4257SSteve Yin *
4165fdc4257SSteve Yin * @param row the row index.
4175fdc4257SSteve Yin * @param accessible the accessible object of the row header.
4185fdc4257SSteve Yin */
get_rowHeader(IAccessibleTable __RPC_FAR * __RPC_FAR * accessibleTable,long * startingColumnIndex)4195fdc4257SSteve Yin STDMETHODIMP CAccTable::get_rowHeader(IAccessibleTable __RPC_FAR *__RPC_FAR *accessibleTable, long *startingColumnIndex)
4205fdc4257SSteve Yin {
4215fdc4257SSteve Yin
4225fdc4257SSteve Yin CHECK_ENABLE_INF
4235fdc4257SSteve Yin
4245fdc4257SSteve Yin ENTER_PROTECTED_BLOCK
4255fdc4257SSteve Yin
4265fdc4257SSteve Yin // #CHECK#
4275fdc4257SSteve Yin if(accessibleTable == NULL || startingColumnIndex == NULL)
4285fdc4257SSteve Yin return E_INVALIDARG;
4295fdc4257SSteve Yin
4305fdc4257SSteve Yin // #CHECK XInterface#
4315fdc4257SSteve Yin if(!pRXTable.is())
4325fdc4257SSteve Yin return E_FAIL;
4335fdc4257SSteve Yin
4345fdc4257SSteve Yin Reference<XAccessibleTable> pRRowHeaderTable = GetXInterface()->getAccessibleRowHeaders();
4355fdc4257SSteve Yin if(!pRRowHeaderTable.is())
4365fdc4257SSteve Yin {
4375fdc4257SSteve Yin *accessibleTable = NULL;
4385fdc4257SSteve Yin return E_FAIL;
4395fdc4257SSteve Yin }
4405fdc4257SSteve Yin
4415fdc4257SSteve Yin Reference<XAccessible> pRXRowHeader(pRRowHeaderTable,UNO_QUERY);
4425fdc4257SSteve Yin
4435fdc4257SSteve Yin if(!pRXRowHeader.is())
4445fdc4257SSteve Yin {
4455fdc4257SSteve Yin *accessibleTable = NULL;
4465fdc4257SSteve Yin return E_FAIL;
4475fdc4257SSteve Yin }
4485fdc4257SSteve Yin *startingColumnIndex = 0 ;
4495fdc4257SSteve Yin
4505fdc4257SSteve Yin IAccessible* m_pIMacc = NULL;
451*b0a7a3cfSSteve Yin ActivateActContext();
4523a700b0aSSteve Yin HRESULT hr = CoCreateInstance( CLSID_MAccessible, NULL, CLSCTX_ALL ,
4535fdc4257SSteve Yin IID_IMAccessible,
4545fdc4257SSteve Yin (void **)&m_pIMacc
4555fdc4257SSteve Yin );
456*b0a7a3cfSSteve Yin DeactivateActContext();
4575fdc4257SSteve Yin ((CMAccessible*)m_pIMacc)->SetXAccessible((long)pRXRowHeader.get());
4585fdc4257SSteve Yin m_pIMacc->QueryInterface(IID_IAccessibleTable,(void **)accessibleTable);
4595fdc4257SSteve Yin if( SUCCEEDED(hr) )
4605fdc4257SSteve Yin {
4615fdc4257SSteve Yin return S_OK;
4625fdc4257SSteve Yin }
4635fdc4257SSteve Yin
4645fdc4257SSteve Yin return E_FAIL;
4655fdc4257SSteve Yin
4665fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK
4675fdc4257SSteve Yin }
4685fdc4257SSteve Yin
4695fdc4257SSteve Yin /**
4705fdc4257SSteve Yin * Gets list of row indexes currently selected (0-based).
4715fdc4257SSteve Yin *
4725fdc4257SSteve Yin * @param maxRows the max number of the rows.
4735fdc4257SSteve Yin * @param accessible the accessible object array of the selected rows.
4745fdc4257SSteve Yin * @param nRows the actual size of the accessible object array.
4755fdc4257SSteve Yin */
get_selectedRows(long,long ** rows,long * nRows)4765fdc4257SSteve Yin STDMETHODIMP CAccTable::get_selectedRows(long, long ** rows, long * nRows)
4775fdc4257SSteve Yin {
4785fdc4257SSteve Yin
4795fdc4257SSteve Yin CHECK_ENABLE_INF
4805fdc4257SSteve Yin
4815fdc4257SSteve Yin ENTER_PROTECTED_BLOCK
4825fdc4257SSteve Yin
4835fdc4257SSteve Yin // #CHECK#
4845fdc4257SSteve Yin if(rows == NULL || nRows == NULL)
4855fdc4257SSteve Yin return E_INVALIDARG;
4865fdc4257SSteve Yin
4875fdc4257SSteve Yin // #CHECK XInterface#
4885fdc4257SSteve Yin if(!pRXTable.is())
4895fdc4257SSteve Yin return E_FAIL;
4905fdc4257SSteve Yin
4915fdc4257SSteve Yin Sequence<long> pSelected = GetXInterface()->getSelectedAccessibleRows();
4925fdc4257SSteve Yin long count = pSelected.getLength() ;
4935fdc4257SSteve Yin *nRows = count;
4945fdc4257SSteve Yin
4955fdc4257SSteve Yin *rows = reinterpret_cast<long*>(CoTaskMemAlloc((count) * sizeof(long)));
4965fdc4257SSteve Yin // #CHECK Memory Allocation#
4975fdc4257SSteve Yin if(*rows == NULL)
4985fdc4257SSteve Yin {
4995fdc4257SSteve Yin return E_FAIL;
5005fdc4257SSteve Yin }
5015fdc4257SSteve Yin for(int i=0; i<count; i++)
5025fdc4257SSteve Yin (*rows)[i] = pSelected[i];
5035fdc4257SSteve Yin
5045fdc4257SSteve Yin return S_OK;
5055fdc4257SSteve Yin
5065fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK
5075fdc4257SSteve Yin }
5085fdc4257SSteve Yin
5095fdc4257SSteve Yin /**
5105fdc4257SSteve Yin * Gets list of column indexes currently selected (0-based).
5115fdc4257SSteve Yin *
5125fdc4257SSteve Yin * @param maxColumns the max number of the columns.
5135fdc4257SSteve Yin * @param accessible the accessible object array of the selected columns.
5145fdc4257SSteve Yin * @param numColumns the actual size of accessible object array.
5155fdc4257SSteve Yin */
get_selectedColumns(long,long ** columns,long * numColumns)5165fdc4257SSteve Yin STDMETHODIMP CAccTable::get_selectedColumns(long, long ** columns, long * numColumns)
5175fdc4257SSteve Yin {
5185fdc4257SSteve Yin
5195fdc4257SSteve Yin CHECK_ENABLE_INF
5205fdc4257SSteve Yin
5215fdc4257SSteve Yin ENTER_PROTECTED_BLOCK
5225fdc4257SSteve Yin
5235fdc4257SSteve Yin // #CHECK#
5245fdc4257SSteve Yin if(columns == NULL || numColumns == NULL)
5255fdc4257SSteve Yin return E_INVALIDARG;
5265fdc4257SSteve Yin
5275fdc4257SSteve Yin // #CHECK XInterface#
5285fdc4257SSteve Yin if(!pRXTable.is())
5295fdc4257SSteve Yin return E_FAIL;
5305fdc4257SSteve Yin
5315fdc4257SSteve Yin Sequence<long> pSelected = GetXInterface()->getSelectedAccessibleColumns();
5325fdc4257SSteve Yin long count = pSelected.getLength() ;
5335fdc4257SSteve Yin *numColumns = count;
5345fdc4257SSteve Yin
5355fdc4257SSteve Yin *columns = reinterpret_cast<long*>(CoTaskMemAlloc((count) * sizeof(long)));
5365fdc4257SSteve Yin // #CHECK Memory Allocation#
5375fdc4257SSteve Yin if(*columns == NULL)
5385fdc4257SSteve Yin {
5395fdc4257SSteve Yin return E_FAIL;
5405fdc4257SSteve Yin }
5415fdc4257SSteve Yin for(int i=0; i<count; i++)
5425fdc4257SSteve Yin (*columns)[i] = pSelected[i];
5435fdc4257SSteve Yin
5445fdc4257SSteve Yin return S_OK;
5455fdc4257SSteve Yin
5465fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK
5475fdc4257SSteve Yin }
5485fdc4257SSteve Yin
5495fdc4257SSteve Yin /**
5505fdc4257SSteve Yin * Gets accessible table summary.
5515fdc4257SSteve Yin *
5525fdc4257SSteve Yin * @param accessible the accessible object of the summary.
5535fdc4257SSteve Yin */
get_summary(IUnknown ** accessible)5545fdc4257SSteve Yin STDMETHODIMP CAccTable::get_summary(IUnknown * * accessible)
5555fdc4257SSteve Yin {
5565fdc4257SSteve Yin
5575fdc4257SSteve Yin CHECK_ENABLE_INF
5585fdc4257SSteve Yin
5595fdc4257SSteve Yin ENTER_PROTECTED_BLOCK
5605fdc4257SSteve Yin
5615fdc4257SSteve Yin // #CHECK#
5625fdc4257SSteve Yin if(accessible == NULL)
5635fdc4257SSteve Yin return E_INVALIDARG;
5645fdc4257SSteve Yin
5655fdc4257SSteve Yin // #CHECK XInterface#
5665fdc4257SSteve Yin if(!pRXTable.is())
5675fdc4257SSteve Yin {
5685fdc4257SSteve Yin return E_FAIL;
5695fdc4257SSteve Yin }
5705fdc4257SSteve Yin Reference<XAccessible> pRAcc = GetXInterface()->getAccessibleSummary();
5715fdc4257SSteve Yin
5725fdc4257SSteve Yin IAccessible* pRet = NULL;
5735fdc4257SSteve Yin BOOL isTRUE = CMAccessible::get_IAccessibleFromXAccessible((long)pRAcc.get(),&pRet);
5745fdc4257SSteve Yin
5755fdc4257SSteve Yin if(pRet)
5765fdc4257SSteve Yin {
5775fdc4257SSteve Yin *accessible = (IAccessible2 *)pRet;
5785fdc4257SSteve Yin pRet->AddRef();
5795fdc4257SSteve Yin return S_OK;
5805fdc4257SSteve Yin }
5815fdc4257SSteve Yin
5825fdc4257SSteve Yin return E_FAIL;
5835fdc4257SSteve Yin
5845fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK
5855fdc4257SSteve Yin }
5865fdc4257SSteve Yin
5875fdc4257SSteve Yin /**
5885fdc4257SSteve Yin * Determines if table column is selected.
5895fdc4257SSteve Yin *
5905fdc4257SSteve Yin * @param column the column index.
5915fdc4257SSteve Yin * @param isSelected the result.
5925fdc4257SSteve Yin */
get_isColumnSelected(long column,unsigned char * isSelected)5935fdc4257SSteve Yin STDMETHODIMP CAccTable::get_isColumnSelected(long column, unsigned char * isSelected)
5945fdc4257SSteve Yin {
5955fdc4257SSteve Yin
5965fdc4257SSteve Yin CHECK_ENABLE_INF
5975fdc4257SSteve Yin
5985fdc4257SSteve Yin ENTER_PROTECTED_BLOCK
5995fdc4257SSteve Yin
6005fdc4257SSteve Yin // #CHECK#
6015fdc4257SSteve Yin if(isSelected == NULL)
6025fdc4257SSteve Yin return E_INVALIDARG;
6035fdc4257SSteve Yin
6045fdc4257SSteve Yin // #CHECK XInterface#
6055fdc4257SSteve Yin if(!pRXTable.is())
6065fdc4257SSteve Yin return E_FAIL;
6075fdc4257SSteve Yin
6085fdc4257SSteve Yin *isSelected = GetXInterface()->isAccessibleColumnSelected(column);
6095fdc4257SSteve Yin return S_OK;
6105fdc4257SSteve Yin
6115fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK
6125fdc4257SSteve Yin }
6135fdc4257SSteve Yin
6145fdc4257SSteve Yin /**
6155fdc4257SSteve Yin * Determines if table row is selected.
6165fdc4257SSteve Yin *
6175fdc4257SSteve Yin * @param row the row index.
6185fdc4257SSteve Yin * @param isSelected the result.
6195fdc4257SSteve Yin */
get_isRowSelected(long row,unsigned char * isSelected)6205fdc4257SSteve Yin STDMETHODIMP CAccTable::get_isRowSelected(long row, unsigned char * isSelected)
6215fdc4257SSteve Yin {
6225fdc4257SSteve Yin
6235fdc4257SSteve Yin CHECK_ENABLE_INF
6245fdc4257SSteve Yin
6255fdc4257SSteve Yin ENTER_PROTECTED_BLOCK
6265fdc4257SSteve Yin
6275fdc4257SSteve Yin // #CHECK#
6285fdc4257SSteve Yin if(isSelected == NULL)
6295fdc4257SSteve Yin return E_INVALIDARG;
6305fdc4257SSteve Yin
6315fdc4257SSteve Yin // #CHECK XInterface#
6325fdc4257SSteve Yin if(!pRXTable.is())
6335fdc4257SSteve Yin {
6345fdc4257SSteve Yin return E_FAIL;
6355fdc4257SSteve Yin }
6365fdc4257SSteve Yin *isSelected = GetXInterface()->isAccessibleRowSelected(row);
6375fdc4257SSteve Yin return S_OK;
6385fdc4257SSteve Yin
6395fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK
6405fdc4257SSteve Yin }
6415fdc4257SSteve Yin
6425fdc4257SSteve Yin /**
6435fdc4257SSteve Yin * Determines if table cell is selected.
6445fdc4257SSteve Yin *
6455fdc4257SSteve Yin * @param row the row index.
6465fdc4257SSteve Yin * @param column the column index.
6475fdc4257SSteve Yin * @param isSelected the result.
6485fdc4257SSteve Yin */
get_isSelected(long row,long column,unsigned char * isSelected)6495fdc4257SSteve Yin STDMETHODIMP CAccTable::get_isSelected(long row, long column, unsigned char * isSelected)
6505fdc4257SSteve Yin {
6515fdc4257SSteve Yin
6525fdc4257SSteve Yin CHECK_ENABLE_INF
6535fdc4257SSteve Yin
6545fdc4257SSteve Yin ENTER_PROTECTED_BLOCK
6555fdc4257SSteve Yin
6565fdc4257SSteve Yin // #CHECK#
6575fdc4257SSteve Yin if(isSelected == NULL)
6585fdc4257SSteve Yin return E_INVALIDARG;
6595fdc4257SSteve Yin
6605fdc4257SSteve Yin // #CHECK XInterface#
6615fdc4257SSteve Yin if(!pRXTable.is())
6625fdc4257SSteve Yin return E_FAIL;
6635fdc4257SSteve Yin
6645fdc4257SSteve Yin *isSelected = GetXInterface()->isAccessibleSelected(row,column);
6655fdc4257SSteve Yin return S_OK;
6665fdc4257SSteve Yin
6675fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK
6685fdc4257SSteve Yin }
6695fdc4257SSteve Yin
6705fdc4257SSteve Yin /**
6715fdc4257SSteve Yin * Selects a row and unselect all previously selected rows.
6725fdc4257SSteve Yin *
6735fdc4257SSteve Yin * @param row the row index.
6745fdc4257SSteve Yin * @param success the result.
6755fdc4257SSteve Yin */
selectRow(long row)6765fdc4257SSteve Yin STDMETHODIMP CAccTable::selectRow(long row)
6775fdc4257SSteve Yin {
6785fdc4257SSteve Yin
6795fdc4257SSteve Yin CHECK_ENABLE_INF
6805fdc4257SSteve Yin
6815fdc4257SSteve Yin ENTER_PROTECTED_BLOCK
6825fdc4257SSteve Yin
6835fdc4257SSteve Yin // Check XAccessibleTable reference.
6845fdc4257SSteve Yin if(!pRXTable.is())
6855fdc4257SSteve Yin return E_FAIL;
6865fdc4257SSteve Yin
6875fdc4257SSteve Yin Reference<XAccessibleTableSelection> pRTableExtent(pRXTable, UNO_QUERY);
6885fdc4257SSteve Yin if(pRTableExtent.is())
6895fdc4257SSteve Yin {
6905fdc4257SSteve Yin pRTableExtent.get()->selectRow(row);
6915fdc4257SSteve Yin return S_OK;
6925fdc4257SSteve Yin }
6935fdc4257SSteve Yin else
6945fdc4257SSteve Yin {
6955fdc4257SSteve Yin // Get XAccessibleSelection.
6965fdc4257SSteve Yin Reference<XAccessibleSelection> pRSelection(GetXInterface(), UNO_QUERY);
6975fdc4257SSteve Yin if(!pRSelection.is())
6985fdc4257SSteve Yin return E_FAIL;
6995fdc4257SSteve Yin
7005fdc4257SSteve Yin // Select row.
7015fdc4257SSteve Yin long lCol, lColumnCount, lChildIndex;
7025fdc4257SSteve Yin lColumnCount = GetXInterface()->getAccessibleColumnCount();
7035fdc4257SSteve Yin for(lCol = 0; lCol < lColumnCount; lCol ++)
7045fdc4257SSteve Yin {
7055fdc4257SSteve Yin lChildIndex = GetXInterface()->getAccessibleIndex(row, lCol);
7065fdc4257SSteve Yin pRSelection.get()->selectAccessibleChild(lChildIndex);
7075fdc4257SSteve Yin }
7085fdc4257SSteve Yin
7095fdc4257SSteve Yin return S_OK;
7105fdc4257SSteve Yin }
7115fdc4257SSteve Yin return S_OK;
7125fdc4257SSteve Yin
7135fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK
7145fdc4257SSteve Yin }
7155fdc4257SSteve Yin
7165fdc4257SSteve Yin /**
7175fdc4257SSteve Yin * Selects a column and unselect all previously selected columns.
7185fdc4257SSteve Yin *
7195fdc4257SSteve Yin * @param column the column index.
7205fdc4257SSteve Yin * @param success the result.
7215fdc4257SSteve Yin */
selectColumn(long column)7225fdc4257SSteve Yin STDMETHODIMP CAccTable::selectColumn(long column)
7235fdc4257SSteve Yin {
7245fdc4257SSteve Yin
7255fdc4257SSteve Yin CHECK_ENABLE_INF
7265fdc4257SSteve Yin
7275fdc4257SSteve Yin ENTER_PROTECTED_BLOCK
7285fdc4257SSteve Yin
7295fdc4257SSteve Yin // Check XAccessibleTable reference.
7305fdc4257SSteve Yin if(!pRXTable.is())
7315fdc4257SSteve Yin return E_FAIL;
7325fdc4257SSteve Yin
7335fdc4257SSteve Yin Reference<XAccessibleTableSelection> pRTableExtent(GetXInterface(), UNO_QUERY);
7345fdc4257SSteve Yin if(pRTableExtent.is())
7355fdc4257SSteve Yin {
7365fdc4257SSteve Yin pRTableExtent.get()->selectColumn(column);
7375fdc4257SSteve Yin return S_OK;
7385fdc4257SSteve Yin }
7395fdc4257SSteve Yin else
7405fdc4257SSteve Yin {
7415fdc4257SSteve Yin // Get XAccessibleSelection.
7425fdc4257SSteve Yin Reference<XAccessibleSelection> pRSelection(pRXTable, UNO_QUERY);
7435fdc4257SSteve Yin if(!pRSelection.is())
7445fdc4257SSteve Yin return E_FAIL;
7455fdc4257SSteve Yin
7465fdc4257SSteve Yin // Select column.
7475fdc4257SSteve Yin long lRow, lRowCount, lChildIndex;
7485fdc4257SSteve Yin lRowCount = GetXInterface()->getAccessibleRowCount();
7495fdc4257SSteve Yin for(lRow = 0; lRow < lRowCount; lRow ++)
7505fdc4257SSteve Yin {
7515fdc4257SSteve Yin lChildIndex = GetXInterface()->getAccessibleIndex(lRow, column);
7525fdc4257SSteve Yin pRSelection.get()->selectAccessibleChild(lChildIndex);
7535fdc4257SSteve Yin }
7545fdc4257SSteve Yin
7555fdc4257SSteve Yin return S_OK;
7565fdc4257SSteve Yin }
7575fdc4257SSteve Yin return S_OK;
7585fdc4257SSteve Yin // End of added.
7595fdc4257SSteve Yin
7605fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK
7615fdc4257SSteve Yin }
7625fdc4257SSteve Yin
7635fdc4257SSteve Yin /**
7645fdc4257SSteve Yin * Unselects one row, leaving other selected rows selected (if any).
7655fdc4257SSteve Yin *
7665fdc4257SSteve Yin * @param row the row index.
7675fdc4257SSteve Yin * @param success the result.
7685fdc4257SSteve Yin */
unselectRow(long row)7695fdc4257SSteve Yin STDMETHODIMP CAccTable::unselectRow(long row)
7705fdc4257SSteve Yin {
7715fdc4257SSteve Yin
7725fdc4257SSteve Yin CHECK_ENABLE_INF
7735fdc4257SSteve Yin
7745fdc4257SSteve Yin ENTER_PROTECTED_BLOCK
7755fdc4257SSteve Yin
7765fdc4257SSteve Yin // Check XAccessibleTable reference.
7775fdc4257SSteve Yin if(!pRXTable.is())
7785fdc4257SSteve Yin return E_FAIL;
7795fdc4257SSteve Yin
7805fdc4257SSteve Yin Reference<XAccessibleTableSelection> pRTableExtent(GetXInterface(), UNO_QUERY);
7815fdc4257SSteve Yin if(pRTableExtent.is())
7825fdc4257SSteve Yin {
7835fdc4257SSteve Yin if(pRTableExtent.get()->unselectRow(row))
7845fdc4257SSteve Yin return S_OK;
7855fdc4257SSteve Yin else
7865fdc4257SSteve Yin return E_FAIL;
7875fdc4257SSteve Yin }
7885fdc4257SSteve Yin else
7895fdc4257SSteve Yin {
7905fdc4257SSteve Yin // Get XAccessibleSelection.
7915fdc4257SSteve Yin Reference<XAccessibleSelection> pRSelection(pRXTable, UNO_QUERY);
7925fdc4257SSteve Yin if(!pRSelection.is())
7935fdc4257SSteve Yin return E_FAIL;
7945fdc4257SSteve Yin
7955fdc4257SSteve Yin // Select column.
7965fdc4257SSteve Yin long lColumn, lColumnCount, lChildIndex;
7975fdc4257SSteve Yin lColumnCount = GetXInterface()->getAccessibleColumnCount();
7985fdc4257SSteve Yin for(lColumn = 0; lColumn < lColumnCount; lColumn ++)
7995fdc4257SSteve Yin {
8005fdc4257SSteve Yin lChildIndex = GetXInterface()->getAccessibleIndex(row,lColumn);
8015fdc4257SSteve Yin pRSelection.get()->deselectAccessibleChild(lChildIndex);
8025fdc4257SSteve Yin }
8035fdc4257SSteve Yin
8045fdc4257SSteve Yin return S_OK;
8055fdc4257SSteve Yin }
8065fdc4257SSteve Yin return S_OK;
8075fdc4257SSteve Yin // End of added.
8085fdc4257SSteve Yin
8095fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK
8105fdc4257SSteve Yin }
8115fdc4257SSteve Yin
8125fdc4257SSteve Yin /**
8135fdc4257SSteve Yin * Unselects one column, leaving other selected columns selected (if any).
8145fdc4257SSteve Yin *
8155fdc4257SSteve Yin * @param column the column index.
8165fdc4257SSteve Yin * @param success the result.
8175fdc4257SSteve Yin */
unselectColumn(long column)8185fdc4257SSteve Yin STDMETHODIMP CAccTable::unselectColumn(long column)
8195fdc4257SSteve Yin {
8205fdc4257SSteve Yin
8215fdc4257SSteve Yin CHECK_ENABLE_INF
8225fdc4257SSteve Yin
8235fdc4257SSteve Yin ENTER_PROTECTED_BLOCK
8245fdc4257SSteve Yin
8255fdc4257SSteve Yin // Check XAccessibleTable reference.
8265fdc4257SSteve Yin if(!pRXTable.is())
8275fdc4257SSteve Yin return E_FAIL;
8285fdc4257SSteve Yin
8295fdc4257SSteve Yin Reference<XAccessibleTableSelection> pRTableExtent(GetXInterface(), UNO_QUERY);
8305fdc4257SSteve Yin if(pRTableExtent.is())
8315fdc4257SSteve Yin {
8325fdc4257SSteve Yin if(pRTableExtent.get()->unselectColumn(column))
8335fdc4257SSteve Yin return S_OK;
8345fdc4257SSteve Yin else
8355fdc4257SSteve Yin return E_FAIL;
8365fdc4257SSteve Yin }
8375fdc4257SSteve Yin else
8385fdc4257SSteve Yin {
8395fdc4257SSteve Yin // Get XAccessibleSelection.
8405fdc4257SSteve Yin Reference<XAccessibleSelection> pRSelection(pRXTable, UNO_QUERY);
8415fdc4257SSteve Yin if(!pRSelection.is())
8425fdc4257SSteve Yin return E_FAIL;
8435fdc4257SSteve Yin
8445fdc4257SSteve Yin // Unselect columns.
8455fdc4257SSteve Yin long lRow, lRowCount, lChildIndex;
8465fdc4257SSteve Yin lRowCount = GetXInterface()->getAccessibleRowCount();
8475fdc4257SSteve Yin
8485fdc4257SSteve Yin for(lRow = 0; lRow < lRowCount; lRow ++)
8495fdc4257SSteve Yin {
8505fdc4257SSteve Yin lChildIndex = GetXInterface()->getAccessibleIndex(lRow, column);
8515fdc4257SSteve Yin pRSelection.get()->deselectAccessibleChild(lChildIndex);
8525fdc4257SSteve Yin }
8535fdc4257SSteve Yin return S_OK;
8545fdc4257SSteve Yin }
8555fdc4257SSteve Yin
8565fdc4257SSteve Yin return S_OK;
8575fdc4257SSteve Yin
8585fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK
8595fdc4257SSteve Yin }
8605fdc4257SSteve Yin
8615fdc4257SSteve Yin /**
8625fdc4257SSteve Yin * Overide of IUNOXWrapper.
8635fdc4257SSteve Yin *
8645fdc4257SSteve Yin * @param pXInterface the pointer of UNO interface.
8655fdc4257SSteve Yin */
put_XInterface(long pXInterface)8665fdc4257SSteve Yin STDMETHODIMP CAccTable::put_XInterface(long pXInterface)
8675fdc4257SSteve Yin {
8685fdc4257SSteve Yin
8695fdc4257SSteve Yin CHECK_ENABLE_INF
8705fdc4257SSteve Yin
8715fdc4257SSteve Yin ENTER_PROTECTED_BLOCK
8725fdc4257SSteve Yin
8735fdc4257SSteve Yin CUNOXWrapper::put_XInterface(pXInterface);
8745fdc4257SSteve Yin //special query.
8755fdc4257SSteve Yin if(pUNOInterface == NULL)
8765fdc4257SSteve Yin return E_INVALIDARG;
8775fdc4257SSteve Yin
8785fdc4257SSteve Yin Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext();
8795fdc4257SSteve Yin if( !pRContext.is() )
8805fdc4257SSteve Yin return E_FAIL;
8815fdc4257SSteve Yin
8825fdc4257SSteve Yin Reference<XAccessibleTable> pRXI(pRContext,UNO_QUERY);
8835fdc4257SSteve Yin if( !pRXI.is() )
8845fdc4257SSteve Yin pRXTable = NULL;
8855fdc4257SSteve Yin else
8865fdc4257SSteve Yin pRXTable = pRXI.get();
8875fdc4257SSteve Yin return S_OK;
8885fdc4257SSteve Yin
8895fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK
8905fdc4257SSteve Yin }
8915fdc4257SSteve Yin
8925fdc4257SSteve Yin /**
8935fdc4257SSteve Yin * Gets columnIndex of childIndex.
8945fdc4257SSteve Yin *
8955fdc4257SSteve Yin * @param childIndex childIndex
8965fdc4257SSteve Yin */
get_columnIndex(long childIndex,long * columnIndex)8975fdc4257SSteve Yin STDMETHODIMP CAccTable::get_columnIndex(long childIndex, long * columnIndex)
8985fdc4257SSteve Yin {
8995fdc4257SSteve Yin
9005fdc4257SSteve Yin CHECK_ENABLE_INF
9015fdc4257SSteve Yin
9025fdc4257SSteve Yin ENTER_PROTECTED_BLOCK
9035fdc4257SSteve Yin
9045fdc4257SSteve Yin // #CHECK#
9055fdc4257SSteve Yin if(columnIndex == NULL)
9065fdc4257SSteve Yin return E_INVALIDARG;
9075fdc4257SSteve Yin
9085fdc4257SSteve Yin // #CHECK XInterface#
9095fdc4257SSteve Yin if(!pRXTable.is())
9105fdc4257SSteve Yin return E_FAIL;
9115fdc4257SSteve Yin
9125fdc4257SSteve Yin *columnIndex = GetXInterface()->getAccessibleColumn(childIndex);
9135fdc4257SSteve Yin return S_OK;
9145fdc4257SSteve Yin
9155fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK
9165fdc4257SSteve Yin }
9175fdc4257SSteve Yin /**
9185fdc4257SSteve Yin * Gets rowIndex of childIndex.
9195fdc4257SSteve Yin *
9205fdc4257SSteve Yin * @param childIndex childIndex
9215fdc4257SSteve Yin */
get_rowIndex(long childIndex,long * rowIndex)9225fdc4257SSteve Yin STDMETHODIMP CAccTable::get_rowIndex(long childIndex, long * rowIndex)
9235fdc4257SSteve Yin {
9245fdc4257SSteve Yin
9255fdc4257SSteve Yin CHECK_ENABLE_INF
9265fdc4257SSteve Yin
9275fdc4257SSteve Yin ENTER_PROTECTED_BLOCK
9285fdc4257SSteve Yin
9295fdc4257SSteve Yin // #CHECK#
9305fdc4257SSteve Yin if(rowIndex == NULL)
9315fdc4257SSteve Yin return E_INVALIDARG;
9325fdc4257SSteve Yin
9335fdc4257SSteve Yin // #CHECK XInterface#
9345fdc4257SSteve Yin if(!pRXTable.is())
9355fdc4257SSteve Yin return E_FAIL;
9365fdc4257SSteve Yin
9375fdc4257SSteve Yin *rowIndex = GetXInterface()->getAccessibleRow(childIndex);
9385fdc4257SSteve Yin return S_OK;
9395fdc4257SSteve Yin
9405fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK
9415fdc4257SSteve Yin }
9425fdc4257SSteve Yin /**
9435fdc4257SSteve Yin * Gets childIndex of childIndex.
9445fdc4257SSteve Yin *
9455fdc4257SSteve Yin * @param childIndex childIndex
9465fdc4257SSteve Yin */
get_childIndex(long RowIndex,long columnIndex,long * childIndex)9475fdc4257SSteve Yin STDMETHODIMP CAccTable::get_childIndex(long RowIndex , long columnIndex, long * childIndex )
9485fdc4257SSteve Yin {
9495fdc4257SSteve Yin
9505fdc4257SSteve Yin CHECK_ENABLE_INF
9515fdc4257SSteve Yin
9525fdc4257SSteve Yin ENTER_PROTECTED_BLOCK
9535fdc4257SSteve Yin
9545fdc4257SSteve Yin // #CHECK#
9555fdc4257SSteve Yin if(childIndex == NULL)
9565fdc4257SSteve Yin return E_INVALIDARG;
9575fdc4257SSteve Yin
9585fdc4257SSteve Yin // #CHECK XInterface#
9595fdc4257SSteve Yin if(!pRXTable.is())
9605fdc4257SSteve Yin return E_FAIL;
9615fdc4257SSteve Yin
9625fdc4257SSteve Yin *childIndex = GetXInterface()->getAccessibleIndex(RowIndex, columnIndex);
9635fdc4257SSteve Yin return S_OK;
9645fdc4257SSteve Yin
9655fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK
9665fdc4257SSteve Yin }
9675fdc4257SSteve Yin
get_rowColumnExtentsAtIndex(long,long *,long *,long *,long *,boolean *)9685fdc4257SSteve Yin STDMETHODIMP CAccTable::get_rowColumnExtentsAtIndex(long,
9695fdc4257SSteve Yin long *,
9705fdc4257SSteve Yin long *,
9715fdc4257SSteve Yin long *,
9725fdc4257SSteve Yin long *,
9735fdc4257SSteve Yin boolean *)
9745fdc4257SSteve Yin {
9755fdc4257SSteve Yin
9765fdc4257SSteve Yin CHECK_ENABLE_INF
9775fdc4257SSteve Yin
9785fdc4257SSteve Yin ENTER_PROTECTED_BLOCK
9795fdc4257SSteve Yin
9805fdc4257SSteve Yin return E_NOTIMPL;
9815fdc4257SSteve Yin
9825fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK
9835fdc4257SSteve Yin }
9845fdc4257SSteve Yin
get_modelChange(IA2TableModelChange *)9855fdc4257SSteve Yin STDMETHODIMP CAccTable::get_modelChange(IA2TableModelChange *)
9865fdc4257SSteve Yin {
9875fdc4257SSteve Yin
9885fdc4257SSteve Yin return E_NOTIMPL;
9895fdc4257SSteve Yin }
9905fdc4257SSteve Yin
9915fdc4257SSteve Yin // @brief Returns the total number of selected children
9925fdc4257SSteve Yin // @param [out] childCount
9935fdc4257SSteve Yin // Number of children currently selected
get_nSelectedChildren(long * childCount)9945fdc4257SSteve Yin STDMETHODIMP CAccTable::get_nSelectedChildren(long *childCount)
9955fdc4257SSteve Yin {
9965fdc4257SSteve Yin
9975fdc4257SSteve Yin CHECK_ENABLE_INF
9985fdc4257SSteve Yin
9995fdc4257SSteve Yin ENTER_PROTECTED_BLOCK
10005fdc4257SSteve Yin
10015fdc4257SSteve Yin // #CHECK#
10025fdc4257SSteve Yin if(childCount == NULL)
10035fdc4257SSteve Yin return E_INVALIDARG;
10045fdc4257SSteve Yin
10055fdc4257SSteve Yin // #CHECK XInterface#
10065fdc4257SSteve Yin if(!pRXTable.is())
10075fdc4257SSteve Yin return E_FAIL;
10085fdc4257SSteve Yin
10095fdc4257SSteve Yin Reference<XAccessibleSelection> pRSelection(GetXInterface(), UNO_QUERY);
10105fdc4257SSteve Yin if(!pRSelection.is())
10115fdc4257SSteve Yin return E_FAIL;
10125fdc4257SSteve Yin
10135fdc4257SSteve Yin *childCount = pRSelection->getSelectedAccessibleChildCount();
10145fdc4257SSteve Yin return S_OK;
10155fdc4257SSteve Yin
10165fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK
10175fdc4257SSteve Yin }
10185fdc4257SSteve Yin
10195fdc4257SSteve Yin // @brief Returns a list of child indexes currently selected (0-based).
10205fdc4257SSteve Yin // @param [in] maxChildren
10215fdc4257SSteve Yin // Max children requested (possibly from IAccessibleTable::nSelectedChildren)
10225fdc4257SSteve Yin // @param [out] children
10235fdc4257SSteve Yin // array of indexes of selected children (each index is 0-based)
10245fdc4257SSteve Yin // @param [out] nChildren
10255fdc4257SSteve Yin // Length of array (not more than maxChildren)
get_selectedChildren(long,long ** children,long * nChildren)10265fdc4257SSteve Yin STDMETHODIMP CAccTable::get_selectedChildren(long, long **children, long *nChildren)
10275fdc4257SSteve Yin {
10285fdc4257SSteve Yin
10295fdc4257SSteve Yin CHECK_ENABLE_INF
10305fdc4257SSteve Yin
10315fdc4257SSteve Yin ENTER_PROTECTED_BLOCK
10325fdc4257SSteve Yin
10335fdc4257SSteve Yin // #CHECK#
10345fdc4257SSteve Yin if(children == NULL || nChildren == NULL)
10355fdc4257SSteve Yin return E_INVALIDARG;
10365fdc4257SSteve Yin
10375fdc4257SSteve Yin // #CHECK XInterface#
10385fdc4257SSteve Yin if(!pRXTable.is())
10395fdc4257SSteve Yin return E_FAIL;
10405fdc4257SSteve Yin
10415fdc4257SSteve Yin Reference<XAccessibleSelection> pRSelection(GetXInterface(), UNO_QUERY);
10425fdc4257SSteve Yin if(!pRSelection.is())
10435fdc4257SSteve Yin return E_FAIL;
10445fdc4257SSteve Yin
10455fdc4257SSteve Yin long childCount = pRSelection->getSelectedAccessibleChildCount() ;
10465fdc4257SSteve Yin
10475fdc4257SSteve Yin *nChildren = childCount;
10485fdc4257SSteve Yin
10495fdc4257SSteve Yin *children = reinterpret_cast<long*>(CoTaskMemAlloc((childCount) * sizeof(long)));
10505fdc4257SSteve Yin
10515fdc4257SSteve Yin for( long i = 0; i< childCount; i++)
10525fdc4257SSteve Yin {
10535fdc4257SSteve Yin Reference<XAccessible> pRAcc = pRSelection->getSelectedAccessibleChild(i);
10545fdc4257SSteve Yin if(pRAcc.is())
10555fdc4257SSteve Yin {
10565fdc4257SSteve Yin Reference<XAccessibleContext> pRContext(pRAcc, UNO_QUERY);
10575fdc4257SSteve Yin if( !pRContext.is() )
10585fdc4257SSteve Yin return E_FAIL;
10595fdc4257SSteve Yin
10605fdc4257SSteve Yin long childIndex = pRContext->getAccessibleIndexInParent();
10615fdc4257SSteve Yin (*children)[i] = childIndex;
10625fdc4257SSteve Yin }
10635fdc4257SSteve Yin }
10645fdc4257SSteve Yin
10655fdc4257SSteve Yin return S_OK;
10665fdc4257SSteve Yin
10675fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK
10685fdc4257SSteve Yin
10695fdc4257SSteve Yin }
1070