1*5fdc4257SSteve Yin /************************************************************************* 2*5fdc4257SSteve Yin * 3*5fdc4257SSteve Yin * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4*5fdc4257SSteve Yin * 5*5fdc4257SSteve Yin * Copyright IBM Corporation 2010. 6*5fdc4257SSteve Yin * Copyright 2000, 2010 Oracle and/or its affiliates. 7*5fdc4257SSteve Yin * 8*5fdc4257SSteve Yin * OpenOffice.org - a multi-platform office productivity suite 9*5fdc4257SSteve Yin * 10*5fdc4257SSteve Yin * This file is part of OpenOffice.org. 11*5fdc4257SSteve Yin * 12*5fdc4257SSteve Yin * OpenOffice.org is free software: you can redistribute it and/or modify 13*5fdc4257SSteve Yin * it under the terms of the GNU Lesser General Public License version 3 14*5fdc4257SSteve Yin * only, as published by the Free Software Foundation. 15*5fdc4257SSteve Yin * 16*5fdc4257SSteve Yin * OpenOffice.org is distributed in the hope that it will be useful, 17*5fdc4257SSteve Yin * but WITHOUT ANY WARRANTY; without even the implied warranty of 18*5fdc4257SSteve Yin * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19*5fdc4257SSteve Yin * GNU Lesser General Public License version 3 for more details 20*5fdc4257SSteve Yin * (a copy is included in the LICENSE file that accompanied this code). 21*5fdc4257SSteve Yin * 22*5fdc4257SSteve Yin * You should have received a copy of the GNU Lesser General Public License 23*5fdc4257SSteve Yin * version 3 along with OpenOffice.org. If not, see 24*5fdc4257SSteve Yin * <http://www.openoffice.org/license.html> 25*5fdc4257SSteve Yin * for a copy of the LGPLv3 License. 26*5fdc4257SSteve Yin * 27*5fdc4257SSteve Yin ************************************************************************/ 28*5fdc4257SSteve Yin 29*5fdc4257SSteve Yin /** 30*5fdc4257SSteve Yin * AccTable.cpp : Implementation of CAccTable. 31*5fdc4257SSteve Yin */ 32*5fdc4257SSteve Yin #include "stdafx.h" 33*5fdc4257SSteve Yin #include "UAccCOM2.h" 34*5fdc4257SSteve Yin #include "AccTable.h" 35*5fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessible.hpp> 36*5fdc4257SSteve Yin #include "MAccessible.h" 37*5fdc4257SSteve Yin 38*5fdc4257SSteve Yin #ifndef _COM_SUN_STAR_ACCESSIBILITY_XACCESSIBLETABLEEXTENT_HPP_ 39*5fdc4257SSteve Yin #include <com/sun/star/accessibility/XAccessibleTableSelection.hpp> 40*5fdc4257SSteve Yin #endif 41*5fdc4257SSteve Yin 42*5fdc4257SSteve Yin using namespace com::sun::star::accessibility; 43*5fdc4257SSteve Yin using namespace com::sun::star::uno; 44*5fdc4257SSteve Yin /** 45*5fdc4257SSteve Yin * Gets accessible table cell. 46*5fdc4257SSteve Yin * 47*5fdc4257SSteve Yin * @param row the row of the specified cell. 48*5fdc4257SSteve Yin * @param column the column of the specified cell. 49*5fdc4257SSteve Yin * @param accessible the accessible object of the cell. 50*5fdc4257SSteve Yin */ 51*5fdc4257SSteve Yin 52*5fdc4257SSteve Yin STDMETHODIMP CAccTable::get_accessibleAt(long row, long column, IUnknown * * accessible) 53*5fdc4257SSteve Yin { 54*5fdc4257SSteve Yin 55*5fdc4257SSteve Yin CHECK_ENABLE_INF 56*5fdc4257SSteve Yin 57*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 58*5fdc4257SSteve Yin 59*5fdc4257SSteve Yin // #CHECK# 60*5fdc4257SSteve Yin if(accessible == NULL) 61*5fdc4257SSteve Yin return E_INVALIDARG; 62*5fdc4257SSteve Yin // #CHECK XInterface# 63*5fdc4257SSteve Yin if(!pRXTable.is()) 64*5fdc4257SSteve Yin return E_FAIL; 65*5fdc4257SSteve Yin 66*5fdc4257SSteve Yin Reference<XAccessible> pRAcc = GetXInterface()->getAccessibleCellAt(row,column); 67*5fdc4257SSteve Yin 68*5fdc4257SSteve Yin if(!pRAcc.is()) 69*5fdc4257SSteve Yin { 70*5fdc4257SSteve Yin *accessible = NULL; 71*5fdc4257SSteve Yin return E_FAIL; 72*5fdc4257SSteve Yin } 73*5fdc4257SSteve Yin 74*5fdc4257SSteve Yin IAccessible* pRet = NULL; 75*5fdc4257SSteve Yin 76*5fdc4257SSteve Yin BOOL isTRUE = CMAccessible::get_IAccessibleFromXAccessible((long)pRAcc.get(),&pRet); 77*5fdc4257SSteve Yin if(isTRUE) 78*5fdc4257SSteve Yin { 79*5fdc4257SSteve Yin *accessible = (IAccessible2 *)pRet; 80*5fdc4257SSteve Yin pRet->AddRef(); 81*5fdc4257SSteve Yin return S_OK; 82*5fdc4257SSteve Yin } 83*5fdc4257SSteve Yin else if(pRAcc.is()) 84*5fdc4257SSteve Yin { 85*5fdc4257SSteve Yin Reference<XAccessible> pxTable(GetXInterface(),UNO_QUERY); 86*5fdc4257SSteve Yin 87*5fdc4257SSteve Yin CMAccessible::g_pAgent->InsertAccObj(pRAcc.get(),pxTable.get()); 88*5fdc4257SSteve Yin isTRUE = CMAccessible::get_IAccessibleFromXAccessible((long)pRAcc.get(),&pRet); 89*5fdc4257SSteve Yin 90*5fdc4257SSteve Yin if(isTRUE) 91*5fdc4257SSteve Yin { 92*5fdc4257SSteve Yin *accessible = (IAccessible2 *)pRet; 93*5fdc4257SSteve Yin pRet->AddRef(); 94*5fdc4257SSteve Yin return S_OK; 95*5fdc4257SSteve Yin } 96*5fdc4257SSteve Yin } 97*5fdc4257SSteve Yin return E_FAIL; 98*5fdc4257SSteve Yin 99*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 100*5fdc4257SSteve Yin } 101*5fdc4257SSteve Yin 102*5fdc4257SSteve Yin /** 103*5fdc4257SSteve Yin * Gets accessible table caption. 104*5fdc4257SSteve Yin * 105*5fdc4257SSteve Yin * @param accessible the accessible object of table cpation. 106*5fdc4257SSteve Yin */ 107*5fdc4257SSteve Yin STDMETHODIMP CAccTable::get_caption(IUnknown * *) 108*5fdc4257SSteve Yin { 109*5fdc4257SSteve Yin 110*5fdc4257SSteve Yin 111*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 112*5fdc4257SSteve Yin 113*5fdc4257SSteve Yin return E_NOTIMPL; 114*5fdc4257SSteve Yin 115*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 116*5fdc4257SSteve Yin } 117*5fdc4257SSteve Yin 118*5fdc4257SSteve Yin /** 119*5fdc4257SSteve Yin * Gets accessible column description (as string). 120*5fdc4257SSteve Yin * 121*5fdc4257SSteve Yin * @param column the column index. 122*5fdc4257SSteve Yin * @param description the description of the specified column. 123*5fdc4257SSteve Yin */ 124*5fdc4257SSteve Yin STDMETHODIMP CAccTable::get_columnDescription(long column, BSTR * description) 125*5fdc4257SSteve Yin { 126*5fdc4257SSteve Yin 127*5fdc4257SSteve Yin CHECK_ENABLE_INF 128*5fdc4257SSteve Yin 129*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 130*5fdc4257SSteve Yin 131*5fdc4257SSteve Yin // #CHECK# 132*5fdc4257SSteve Yin if(description == NULL) 133*5fdc4257SSteve Yin return E_INVALIDARG; 134*5fdc4257SSteve Yin 135*5fdc4257SSteve Yin // #CHECK XInterface# 136*5fdc4257SSteve Yin if(!pRXTable.is()) 137*5fdc4257SSteve Yin return E_FAIL; 138*5fdc4257SSteve Yin 139*5fdc4257SSteve Yin const ::rtl::OUString& ouStr = GetXInterface()->getAccessibleColumnDescription(column); 140*5fdc4257SSteve Yin // #CHECK# 141*5fdc4257SSteve Yin 142*5fdc4257SSteve Yin SAFE_SYSFREESTRING(*description);//?? 143*5fdc4257SSteve Yin *description = SysAllocString((OLECHAR*)ouStr.getStr()); 144*5fdc4257SSteve Yin if(description==NULL) 145*5fdc4257SSteve Yin return E_FAIL; 146*5fdc4257SSteve Yin return S_OK; 147*5fdc4257SSteve Yin 148*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 149*5fdc4257SSteve Yin } 150*5fdc4257SSteve Yin 151*5fdc4257SSteve Yin /** 152*5fdc4257SSteve Yin * Gets number of columns spanned by table cell. 153*5fdc4257SSteve Yin * 154*5fdc4257SSteve Yin * @param row the row of the specified cell. 155*5fdc4257SSteve Yin * @param column the column of the specified cell. 156*5fdc4257SSteve Yin * @param spanColumns the column span of the specified cell. 157*5fdc4257SSteve Yin */ 158*5fdc4257SSteve Yin STDMETHODIMP CAccTable::get_columnExtentAt(long row, long column, long * nColumnsSpanned) 159*5fdc4257SSteve Yin { 160*5fdc4257SSteve Yin 161*5fdc4257SSteve Yin CHECK_ENABLE_INF 162*5fdc4257SSteve Yin 163*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 164*5fdc4257SSteve Yin 165*5fdc4257SSteve Yin XAccessibleTable *pXAccTable = GetXInterface(); 166*5fdc4257SSteve Yin 167*5fdc4257SSteve Yin // Check pointer. 168*5fdc4257SSteve Yin if(nColumnsSpanned == NULL) 169*5fdc4257SSteve Yin return E_INVALIDARG; 170*5fdc4257SSteve Yin 171*5fdc4257SSteve Yin // Get Extent. 172*5fdc4257SSteve Yin if(pXAccTable) 173*5fdc4257SSteve Yin { 174*5fdc4257SSteve Yin long lExt = pXAccTable->getAccessibleColumnExtentAt(row,column); 175*5fdc4257SSteve Yin 176*5fdc4257SSteve Yin // Fill Extent struct. 177*5fdc4257SSteve Yin *nColumnsSpanned = lExt; 178*5fdc4257SSteve Yin return S_OK; 179*5fdc4257SSteve Yin } 180*5fdc4257SSteve Yin 181*5fdc4257SSteve Yin return E_FAIL; 182*5fdc4257SSteve Yin 183*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 184*5fdc4257SSteve Yin } 185*5fdc4257SSteve Yin 186*5fdc4257SSteve Yin /** 187*5fdc4257SSteve Yin * Gets accessible column header. 188*5fdc4257SSteve Yin * 189*5fdc4257SSteve Yin * @param column the column index. 190*5fdc4257SSteve Yin * @param accessible the accessible object of the specified column. 191*5fdc4257SSteve Yin */ 192*5fdc4257SSteve Yin STDMETHODIMP CAccTable::get_columnHeader(IAccessibleTable __RPC_FAR *__RPC_FAR *accessibleTable, long *startingRowIndex) 193*5fdc4257SSteve Yin { 194*5fdc4257SSteve Yin 195*5fdc4257SSteve Yin CHECK_ENABLE_INF 196*5fdc4257SSteve Yin 197*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 198*5fdc4257SSteve Yin 199*5fdc4257SSteve Yin // #CHECK# 200*5fdc4257SSteve Yin if(accessibleTable == NULL || startingRowIndex == NULL) 201*5fdc4257SSteve Yin return E_INVALIDARG; 202*5fdc4257SSteve Yin 203*5fdc4257SSteve Yin // #CHECK XInterface# 204*5fdc4257SSteve Yin if(!pRXTable.is()) 205*5fdc4257SSteve Yin return E_FAIL; 206*5fdc4257SSteve Yin 207*5fdc4257SSteve Yin Reference<XAccessibleTable> pRColumnHeaderTable = GetXInterface()->getAccessibleColumnHeaders(); 208*5fdc4257SSteve Yin if(!pRColumnHeaderTable.is()) 209*5fdc4257SSteve Yin { 210*5fdc4257SSteve Yin *accessibleTable = NULL; 211*5fdc4257SSteve Yin return E_FAIL; 212*5fdc4257SSteve Yin } 213*5fdc4257SSteve Yin 214*5fdc4257SSteve Yin Reference<XAccessible> pRXColumnHeader(pRColumnHeaderTable,UNO_QUERY); 215*5fdc4257SSteve Yin 216*5fdc4257SSteve Yin if(!pRXColumnHeader.is()) 217*5fdc4257SSteve Yin { 218*5fdc4257SSteve Yin *accessibleTable = NULL; 219*5fdc4257SSteve Yin return E_FAIL; 220*5fdc4257SSteve Yin } 221*5fdc4257SSteve Yin *startingRowIndex = 0 ; 222*5fdc4257SSteve Yin 223*5fdc4257SSteve Yin IAccessible* m_pIMacc = NULL; 224*5fdc4257SSteve Yin HRESULT hr = CoCreateInstance( CLSID_MAccessible, NULL, CLSCTX_ALL , 225*5fdc4257SSteve Yin IID_IMAccessible, 226*5fdc4257SSteve Yin (void **)&m_pIMacc 227*5fdc4257SSteve Yin ); 228*5fdc4257SSteve Yin ((CMAccessible*)m_pIMacc)->SetXAccessible((long)pRXColumnHeader.get()); 229*5fdc4257SSteve Yin m_pIMacc->QueryInterface(IID_IAccessibleTable,(void **)accessibleTable); 230*5fdc4257SSteve Yin if( SUCCEEDED(hr) ) 231*5fdc4257SSteve Yin { 232*5fdc4257SSteve Yin return S_OK; 233*5fdc4257SSteve Yin } 234*5fdc4257SSteve Yin 235*5fdc4257SSteve Yin return E_FAIL; 236*5fdc4257SSteve Yin 237*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 238*5fdc4257SSteve Yin } 239*5fdc4257SSteve Yin 240*5fdc4257SSteve Yin /** 241*5fdc4257SSteve Yin * Gets total number of columns in table. 242*5fdc4257SSteve Yin * 243*5fdc4257SSteve Yin * @param columnCount the number of columns in table. 244*5fdc4257SSteve Yin */ 245*5fdc4257SSteve Yin STDMETHODIMP CAccTable::get_nColumns(long * columnCount) 246*5fdc4257SSteve Yin { 247*5fdc4257SSteve Yin 248*5fdc4257SSteve Yin CHECK_ENABLE_INF 249*5fdc4257SSteve Yin 250*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 251*5fdc4257SSteve Yin 252*5fdc4257SSteve Yin // #CHECK# 253*5fdc4257SSteve Yin if(columnCount == NULL) 254*5fdc4257SSteve Yin return E_INVALIDARG; 255*5fdc4257SSteve Yin 256*5fdc4257SSteve Yin // #CHECK XInterface# 257*5fdc4257SSteve Yin if(!pRXTable.is()) 258*5fdc4257SSteve Yin return E_FAIL; 259*5fdc4257SSteve Yin 260*5fdc4257SSteve Yin *columnCount = GetXInterface()->getAccessibleColumnCount(); 261*5fdc4257SSteve Yin return S_OK; 262*5fdc4257SSteve Yin 263*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 264*5fdc4257SSteve Yin } 265*5fdc4257SSteve Yin 266*5fdc4257SSteve Yin /** 267*5fdc4257SSteve Yin * Gets total number of rows in table. 268*5fdc4257SSteve Yin * 269*5fdc4257SSteve Yin * @param rowCount the number of rows in table. 270*5fdc4257SSteve Yin */ 271*5fdc4257SSteve Yin STDMETHODIMP CAccTable::get_nRows(long * rowCount) 272*5fdc4257SSteve Yin { 273*5fdc4257SSteve Yin 274*5fdc4257SSteve Yin CHECK_ENABLE_INF 275*5fdc4257SSteve Yin 276*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 277*5fdc4257SSteve Yin 278*5fdc4257SSteve Yin // #CHECK# 279*5fdc4257SSteve Yin if(rowCount == NULL) 280*5fdc4257SSteve Yin return E_INVALIDARG; 281*5fdc4257SSteve Yin 282*5fdc4257SSteve Yin // #CHECK XInterface# 283*5fdc4257SSteve Yin if(!pRXTable.is()) 284*5fdc4257SSteve Yin return E_FAIL; 285*5fdc4257SSteve Yin 286*5fdc4257SSteve Yin *rowCount = GetXInterface()->getAccessibleRowCount(); 287*5fdc4257SSteve Yin return S_OK; 288*5fdc4257SSteve Yin 289*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 290*5fdc4257SSteve Yin } 291*5fdc4257SSteve Yin 292*5fdc4257SSteve Yin /** 293*5fdc4257SSteve Yin * Gets total number of selected columns. 294*5fdc4257SSteve Yin * 295*5fdc4257SSteve Yin * @param columnCount the number of selected columns. 296*5fdc4257SSteve Yin */ 297*5fdc4257SSteve Yin STDMETHODIMP CAccTable::get_nSelectedColumns(long * columnCount) 298*5fdc4257SSteve Yin { 299*5fdc4257SSteve Yin 300*5fdc4257SSteve Yin CHECK_ENABLE_INF 301*5fdc4257SSteve Yin 302*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 303*5fdc4257SSteve Yin 304*5fdc4257SSteve Yin // #CHECK# 305*5fdc4257SSteve Yin if(columnCount == NULL) 306*5fdc4257SSteve Yin return E_INVALIDARG; 307*5fdc4257SSteve Yin 308*5fdc4257SSteve Yin // #CHECK XInterface# 309*5fdc4257SSteve Yin if(!pRXTable.is()) 310*5fdc4257SSteve Yin return E_FAIL; 311*5fdc4257SSteve Yin 312*5fdc4257SSteve Yin Sequence<long> pSelected = GetXInterface()->getSelectedAccessibleColumns(); 313*5fdc4257SSteve Yin *columnCount = pSelected.getLength(); 314*5fdc4257SSteve Yin return S_OK; 315*5fdc4257SSteve Yin 316*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 317*5fdc4257SSteve Yin } 318*5fdc4257SSteve Yin 319*5fdc4257SSteve Yin /** 320*5fdc4257SSteve Yin * Gets total number of selected rows. 321*5fdc4257SSteve Yin * 322*5fdc4257SSteve Yin * @param rowCount the number of selected rows. 323*5fdc4257SSteve Yin */ 324*5fdc4257SSteve Yin STDMETHODIMP CAccTable::get_nSelectedRows(long * rowCount) 325*5fdc4257SSteve Yin { 326*5fdc4257SSteve Yin 327*5fdc4257SSteve Yin CHECK_ENABLE_INF 328*5fdc4257SSteve Yin 329*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 330*5fdc4257SSteve Yin 331*5fdc4257SSteve Yin // #CHECK# 332*5fdc4257SSteve Yin if(rowCount == NULL) 333*5fdc4257SSteve Yin return E_INVALIDARG; 334*5fdc4257SSteve Yin 335*5fdc4257SSteve Yin // #CHECK XInterface# 336*5fdc4257SSteve Yin if(!pRXTable.is()) 337*5fdc4257SSteve Yin return E_FAIL; 338*5fdc4257SSteve Yin 339*5fdc4257SSteve Yin Sequence<long> pSelected = GetXInterface()->getSelectedAccessibleRows(); 340*5fdc4257SSteve Yin *rowCount = pSelected.getLength(); 341*5fdc4257SSteve Yin return S_OK; 342*5fdc4257SSteve Yin 343*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 344*5fdc4257SSteve Yin } 345*5fdc4257SSteve Yin 346*5fdc4257SSteve Yin /** 347*5fdc4257SSteve Yin * Gets accessible row description (as string). 348*5fdc4257SSteve Yin * 349*5fdc4257SSteve Yin * @param row the row index. 350*5fdc4257SSteve Yin * @param description the description of the specified row. 351*5fdc4257SSteve Yin */ 352*5fdc4257SSteve Yin STDMETHODIMP CAccTable::get_rowDescription(long row, BSTR * description) 353*5fdc4257SSteve Yin { 354*5fdc4257SSteve Yin 355*5fdc4257SSteve Yin CHECK_ENABLE_INF 356*5fdc4257SSteve Yin 357*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 358*5fdc4257SSteve Yin 359*5fdc4257SSteve Yin // #CHECK# 360*5fdc4257SSteve Yin if(description == NULL) 361*5fdc4257SSteve Yin return E_INVALIDARG; 362*5fdc4257SSteve Yin 363*5fdc4257SSteve Yin // #CHECK XInterface# 364*5fdc4257SSteve Yin if(!pRXTable.is()) 365*5fdc4257SSteve Yin return E_FAIL; 366*5fdc4257SSteve Yin 367*5fdc4257SSteve Yin const ::rtl::OUString& ouStr = GetXInterface()->getAccessibleRowDescription(row); 368*5fdc4257SSteve Yin // #CHECK# 369*5fdc4257SSteve Yin 370*5fdc4257SSteve Yin SAFE_SYSFREESTRING(*description); 371*5fdc4257SSteve Yin *description = SysAllocString((OLECHAR*)ouStr.getStr()); 372*5fdc4257SSteve Yin if(description==NULL) 373*5fdc4257SSteve Yin return E_FAIL; 374*5fdc4257SSteve Yin 375*5fdc4257SSteve Yin return S_OK; 376*5fdc4257SSteve Yin 377*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 378*5fdc4257SSteve Yin } 379*5fdc4257SSteve Yin 380*5fdc4257SSteve Yin /** 381*5fdc4257SSteve Yin * Gets number of rows spanned by a table cell. 382*5fdc4257SSteve Yin * 383*5fdc4257SSteve Yin * @param row the row of the specified cell. 384*5fdc4257SSteve Yin * @param column the column of the specified cell. 385*5fdc4257SSteve Yin * @param spanRows the row span of the specified cell. 386*5fdc4257SSteve Yin */ 387*5fdc4257SSteve Yin STDMETHODIMP CAccTable::get_rowExtentAt(long row, long column, long * nRowsSpanned) 388*5fdc4257SSteve Yin { 389*5fdc4257SSteve Yin 390*5fdc4257SSteve Yin CHECK_ENABLE_INF 391*5fdc4257SSteve Yin 392*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 393*5fdc4257SSteve Yin 394*5fdc4257SSteve Yin XAccessibleTable *pXAccTable = GetXInterface(); 395*5fdc4257SSteve Yin 396*5fdc4257SSteve Yin // Check pointer. 397*5fdc4257SSteve Yin if(nRowsSpanned == NULL) 398*5fdc4257SSteve Yin return E_INVALIDARG; 399*5fdc4257SSteve Yin 400*5fdc4257SSteve Yin // Get Extent. 401*5fdc4257SSteve Yin if(pXAccTable) 402*5fdc4257SSteve Yin { 403*5fdc4257SSteve Yin long lExt = GetXInterface()->getAccessibleRowExtentAt(row,column); 404*5fdc4257SSteve Yin 405*5fdc4257SSteve Yin // Fill Extent struct. 406*5fdc4257SSteve Yin *nRowsSpanned= lExt; 407*5fdc4257SSteve Yin 408*5fdc4257SSteve Yin return S_OK; 409*5fdc4257SSteve Yin } 410*5fdc4257SSteve Yin 411*5fdc4257SSteve Yin return E_FAIL; 412*5fdc4257SSteve Yin 413*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 414*5fdc4257SSteve Yin } 415*5fdc4257SSteve Yin 416*5fdc4257SSteve Yin /** 417*5fdc4257SSteve Yin * Gets accessible row header. 418*5fdc4257SSteve Yin * 419*5fdc4257SSteve Yin * @param row the row index. 420*5fdc4257SSteve Yin * @param accessible the accessible object of the row header. 421*5fdc4257SSteve Yin */ 422*5fdc4257SSteve Yin STDMETHODIMP CAccTable::get_rowHeader(IAccessibleTable __RPC_FAR *__RPC_FAR *accessibleTable, long *startingColumnIndex) 423*5fdc4257SSteve Yin { 424*5fdc4257SSteve Yin 425*5fdc4257SSteve Yin CHECK_ENABLE_INF 426*5fdc4257SSteve Yin 427*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 428*5fdc4257SSteve Yin 429*5fdc4257SSteve Yin // #CHECK# 430*5fdc4257SSteve Yin if(accessibleTable == NULL || startingColumnIndex == NULL) 431*5fdc4257SSteve Yin return E_INVALIDARG; 432*5fdc4257SSteve Yin 433*5fdc4257SSteve Yin // #CHECK XInterface# 434*5fdc4257SSteve Yin if(!pRXTable.is()) 435*5fdc4257SSteve Yin return E_FAIL; 436*5fdc4257SSteve Yin 437*5fdc4257SSteve Yin Reference<XAccessibleTable> pRRowHeaderTable = GetXInterface()->getAccessibleRowHeaders(); 438*5fdc4257SSteve Yin if(!pRRowHeaderTable.is()) 439*5fdc4257SSteve Yin { 440*5fdc4257SSteve Yin *accessibleTable = NULL; 441*5fdc4257SSteve Yin return E_FAIL; 442*5fdc4257SSteve Yin } 443*5fdc4257SSteve Yin 444*5fdc4257SSteve Yin Reference<XAccessible> pRXRowHeader(pRRowHeaderTable,UNO_QUERY); 445*5fdc4257SSteve Yin 446*5fdc4257SSteve Yin if(!pRXRowHeader.is()) 447*5fdc4257SSteve Yin { 448*5fdc4257SSteve Yin *accessibleTable = NULL; 449*5fdc4257SSteve Yin return E_FAIL; 450*5fdc4257SSteve Yin } 451*5fdc4257SSteve Yin *startingColumnIndex = 0 ; 452*5fdc4257SSteve Yin 453*5fdc4257SSteve Yin IAccessible* m_pIMacc = NULL; 454*5fdc4257SSteve Yin HRESULT hr = CoCreateInstance( CLSID_MAccessible, NULL, CLSCTX_ALL , 455*5fdc4257SSteve Yin IID_IMAccessible, 456*5fdc4257SSteve Yin (void **)&m_pIMacc 457*5fdc4257SSteve Yin ); 458*5fdc4257SSteve Yin ((CMAccessible*)m_pIMacc)->SetXAccessible((long)pRXRowHeader.get()); 459*5fdc4257SSteve Yin m_pIMacc->QueryInterface(IID_IAccessibleTable,(void **)accessibleTable); 460*5fdc4257SSteve Yin if( SUCCEEDED(hr) ) 461*5fdc4257SSteve Yin { 462*5fdc4257SSteve Yin return S_OK; 463*5fdc4257SSteve Yin } 464*5fdc4257SSteve Yin 465*5fdc4257SSteve Yin return E_FAIL; 466*5fdc4257SSteve Yin 467*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 468*5fdc4257SSteve Yin } 469*5fdc4257SSteve Yin 470*5fdc4257SSteve Yin /** 471*5fdc4257SSteve Yin * Gets list of row indexes currently selected (0-based). 472*5fdc4257SSteve Yin * 473*5fdc4257SSteve Yin * @param maxRows the max number of the rows. 474*5fdc4257SSteve Yin * @param accessible the accessible object array of the selected rows. 475*5fdc4257SSteve Yin * @param nRows the actual size of the accessible object array. 476*5fdc4257SSteve Yin */ 477*5fdc4257SSteve Yin STDMETHODIMP CAccTable::get_selectedRows(long, long ** rows, long * nRows) 478*5fdc4257SSteve Yin { 479*5fdc4257SSteve Yin 480*5fdc4257SSteve Yin CHECK_ENABLE_INF 481*5fdc4257SSteve Yin 482*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 483*5fdc4257SSteve Yin 484*5fdc4257SSteve Yin // #CHECK# 485*5fdc4257SSteve Yin if(rows == NULL || nRows == NULL) 486*5fdc4257SSteve Yin return E_INVALIDARG; 487*5fdc4257SSteve Yin 488*5fdc4257SSteve Yin // #CHECK XInterface# 489*5fdc4257SSteve Yin if(!pRXTable.is()) 490*5fdc4257SSteve Yin return E_FAIL; 491*5fdc4257SSteve Yin 492*5fdc4257SSteve Yin Sequence<long> pSelected = GetXInterface()->getSelectedAccessibleRows(); 493*5fdc4257SSteve Yin long count = pSelected.getLength() ; 494*5fdc4257SSteve Yin *nRows = count; 495*5fdc4257SSteve Yin 496*5fdc4257SSteve Yin *rows = reinterpret_cast<long*>(CoTaskMemAlloc((count) * sizeof(long))); 497*5fdc4257SSteve Yin // #CHECK Memory Allocation# 498*5fdc4257SSteve Yin if(*rows == NULL) 499*5fdc4257SSteve Yin { 500*5fdc4257SSteve Yin return E_FAIL; 501*5fdc4257SSteve Yin } 502*5fdc4257SSteve Yin for(int i=0; i<count; i++) 503*5fdc4257SSteve Yin (*rows)[i] = pSelected[i]; 504*5fdc4257SSteve Yin 505*5fdc4257SSteve Yin return S_OK; 506*5fdc4257SSteve Yin 507*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 508*5fdc4257SSteve Yin } 509*5fdc4257SSteve Yin 510*5fdc4257SSteve Yin /** 511*5fdc4257SSteve Yin * Gets list of column indexes currently selected (0-based). 512*5fdc4257SSteve Yin * 513*5fdc4257SSteve Yin * @param maxColumns the max number of the columns. 514*5fdc4257SSteve Yin * @param accessible the accessible object array of the selected columns. 515*5fdc4257SSteve Yin * @param numColumns the actual size of accessible object array. 516*5fdc4257SSteve Yin */ 517*5fdc4257SSteve Yin STDMETHODIMP CAccTable::get_selectedColumns(long, long ** columns, long * numColumns) 518*5fdc4257SSteve Yin { 519*5fdc4257SSteve Yin 520*5fdc4257SSteve Yin CHECK_ENABLE_INF 521*5fdc4257SSteve Yin 522*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 523*5fdc4257SSteve Yin 524*5fdc4257SSteve Yin // #CHECK# 525*5fdc4257SSteve Yin if(columns == NULL || numColumns == NULL) 526*5fdc4257SSteve Yin return E_INVALIDARG; 527*5fdc4257SSteve Yin 528*5fdc4257SSteve Yin // #CHECK XInterface# 529*5fdc4257SSteve Yin if(!pRXTable.is()) 530*5fdc4257SSteve Yin return E_FAIL; 531*5fdc4257SSteve Yin 532*5fdc4257SSteve Yin Sequence<long> pSelected = GetXInterface()->getSelectedAccessibleColumns(); 533*5fdc4257SSteve Yin long count = pSelected.getLength() ; 534*5fdc4257SSteve Yin *numColumns = count; 535*5fdc4257SSteve Yin 536*5fdc4257SSteve Yin *columns = reinterpret_cast<long*>(CoTaskMemAlloc((count) * sizeof(long))); 537*5fdc4257SSteve Yin // #CHECK Memory Allocation# 538*5fdc4257SSteve Yin if(*columns == NULL) 539*5fdc4257SSteve Yin { 540*5fdc4257SSteve Yin return E_FAIL; 541*5fdc4257SSteve Yin } 542*5fdc4257SSteve Yin for(int i=0; i<count; i++) 543*5fdc4257SSteve Yin (*columns)[i] = pSelected[i]; 544*5fdc4257SSteve Yin 545*5fdc4257SSteve Yin return S_OK; 546*5fdc4257SSteve Yin 547*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 548*5fdc4257SSteve Yin } 549*5fdc4257SSteve Yin 550*5fdc4257SSteve Yin /** 551*5fdc4257SSteve Yin * Gets accessible table summary. 552*5fdc4257SSteve Yin * 553*5fdc4257SSteve Yin * @param accessible the accessible object of the summary. 554*5fdc4257SSteve Yin */ 555*5fdc4257SSteve Yin STDMETHODIMP CAccTable::get_summary(IUnknown * * accessible) 556*5fdc4257SSteve Yin { 557*5fdc4257SSteve Yin 558*5fdc4257SSteve Yin CHECK_ENABLE_INF 559*5fdc4257SSteve Yin 560*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 561*5fdc4257SSteve Yin 562*5fdc4257SSteve Yin // #CHECK# 563*5fdc4257SSteve Yin if(accessible == NULL) 564*5fdc4257SSteve Yin return E_INVALIDARG; 565*5fdc4257SSteve Yin 566*5fdc4257SSteve Yin // #CHECK XInterface# 567*5fdc4257SSteve Yin if(!pRXTable.is()) 568*5fdc4257SSteve Yin { 569*5fdc4257SSteve Yin return E_FAIL; 570*5fdc4257SSteve Yin } 571*5fdc4257SSteve Yin Reference<XAccessible> pRAcc = GetXInterface()->getAccessibleSummary(); 572*5fdc4257SSteve Yin 573*5fdc4257SSteve Yin IAccessible* pRet = NULL; 574*5fdc4257SSteve Yin BOOL isTRUE = CMAccessible::get_IAccessibleFromXAccessible((long)pRAcc.get(),&pRet); 575*5fdc4257SSteve Yin 576*5fdc4257SSteve Yin if(pRet) 577*5fdc4257SSteve Yin { 578*5fdc4257SSteve Yin *accessible = (IAccessible2 *)pRet; 579*5fdc4257SSteve Yin pRet->AddRef(); 580*5fdc4257SSteve Yin return S_OK; 581*5fdc4257SSteve Yin } 582*5fdc4257SSteve Yin 583*5fdc4257SSteve Yin return E_FAIL; 584*5fdc4257SSteve Yin 585*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 586*5fdc4257SSteve Yin } 587*5fdc4257SSteve Yin 588*5fdc4257SSteve Yin /** 589*5fdc4257SSteve Yin * Determines if table column is selected. 590*5fdc4257SSteve Yin * 591*5fdc4257SSteve Yin * @param column the column index. 592*5fdc4257SSteve Yin * @param isSelected the result. 593*5fdc4257SSteve Yin */ 594*5fdc4257SSteve Yin STDMETHODIMP CAccTable::get_isColumnSelected(long column, unsigned char * isSelected) 595*5fdc4257SSteve Yin { 596*5fdc4257SSteve Yin 597*5fdc4257SSteve Yin CHECK_ENABLE_INF 598*5fdc4257SSteve Yin 599*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 600*5fdc4257SSteve Yin 601*5fdc4257SSteve Yin // #CHECK# 602*5fdc4257SSteve Yin if(isSelected == NULL) 603*5fdc4257SSteve Yin return E_INVALIDARG; 604*5fdc4257SSteve Yin 605*5fdc4257SSteve Yin // #CHECK XInterface# 606*5fdc4257SSteve Yin if(!pRXTable.is()) 607*5fdc4257SSteve Yin return E_FAIL; 608*5fdc4257SSteve Yin 609*5fdc4257SSteve Yin *isSelected = GetXInterface()->isAccessibleColumnSelected(column); 610*5fdc4257SSteve Yin return S_OK; 611*5fdc4257SSteve Yin 612*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 613*5fdc4257SSteve Yin } 614*5fdc4257SSteve Yin 615*5fdc4257SSteve Yin /** 616*5fdc4257SSteve Yin * Determines if table row is selected. 617*5fdc4257SSteve Yin * 618*5fdc4257SSteve Yin * @param row the row index. 619*5fdc4257SSteve Yin * @param isSelected the result. 620*5fdc4257SSteve Yin */ 621*5fdc4257SSteve Yin STDMETHODIMP CAccTable::get_isRowSelected(long row, unsigned char * isSelected) 622*5fdc4257SSteve Yin { 623*5fdc4257SSteve Yin 624*5fdc4257SSteve Yin CHECK_ENABLE_INF 625*5fdc4257SSteve Yin 626*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 627*5fdc4257SSteve Yin 628*5fdc4257SSteve Yin // #CHECK# 629*5fdc4257SSteve Yin if(isSelected == NULL) 630*5fdc4257SSteve Yin return E_INVALIDARG; 631*5fdc4257SSteve Yin 632*5fdc4257SSteve Yin // #CHECK XInterface# 633*5fdc4257SSteve Yin if(!pRXTable.is()) 634*5fdc4257SSteve Yin { 635*5fdc4257SSteve Yin return E_FAIL; 636*5fdc4257SSteve Yin } 637*5fdc4257SSteve Yin *isSelected = GetXInterface()->isAccessibleRowSelected(row); 638*5fdc4257SSteve Yin return S_OK; 639*5fdc4257SSteve Yin 640*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 641*5fdc4257SSteve Yin } 642*5fdc4257SSteve Yin 643*5fdc4257SSteve Yin /** 644*5fdc4257SSteve Yin * Determines if table cell is selected. 645*5fdc4257SSteve Yin * 646*5fdc4257SSteve Yin * @param row the row index. 647*5fdc4257SSteve Yin * @param column the column index. 648*5fdc4257SSteve Yin * @param isSelected the result. 649*5fdc4257SSteve Yin */ 650*5fdc4257SSteve Yin STDMETHODIMP CAccTable::get_isSelected(long row, long column, unsigned char * isSelected) 651*5fdc4257SSteve Yin { 652*5fdc4257SSteve Yin 653*5fdc4257SSteve Yin CHECK_ENABLE_INF 654*5fdc4257SSteve Yin 655*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 656*5fdc4257SSteve Yin 657*5fdc4257SSteve Yin // #CHECK# 658*5fdc4257SSteve Yin if(isSelected == NULL) 659*5fdc4257SSteve Yin return E_INVALIDARG; 660*5fdc4257SSteve Yin 661*5fdc4257SSteve Yin // #CHECK XInterface# 662*5fdc4257SSteve Yin if(!pRXTable.is()) 663*5fdc4257SSteve Yin return E_FAIL; 664*5fdc4257SSteve Yin 665*5fdc4257SSteve Yin *isSelected = GetXInterface()->isAccessibleSelected(row,column); 666*5fdc4257SSteve Yin return S_OK; 667*5fdc4257SSteve Yin 668*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 669*5fdc4257SSteve Yin } 670*5fdc4257SSteve Yin 671*5fdc4257SSteve Yin /** 672*5fdc4257SSteve Yin * Selects a row and unselect all previously selected rows. 673*5fdc4257SSteve Yin * 674*5fdc4257SSteve Yin * @param row the row index. 675*5fdc4257SSteve Yin * @param success the result. 676*5fdc4257SSteve Yin */ 677*5fdc4257SSteve Yin STDMETHODIMP CAccTable::selectRow(long row) 678*5fdc4257SSteve Yin { 679*5fdc4257SSteve Yin 680*5fdc4257SSteve Yin CHECK_ENABLE_INF 681*5fdc4257SSteve Yin 682*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 683*5fdc4257SSteve Yin 684*5fdc4257SSteve Yin // Check XAccessibleTable reference. 685*5fdc4257SSteve Yin if(!pRXTable.is()) 686*5fdc4257SSteve Yin return E_FAIL; 687*5fdc4257SSteve Yin 688*5fdc4257SSteve Yin Reference<XAccessibleTableSelection> pRTableExtent(pRXTable, UNO_QUERY); 689*5fdc4257SSteve Yin if(pRTableExtent.is()) 690*5fdc4257SSteve Yin { 691*5fdc4257SSteve Yin pRTableExtent.get()->selectRow(row); 692*5fdc4257SSteve Yin return S_OK; 693*5fdc4257SSteve Yin } 694*5fdc4257SSteve Yin else 695*5fdc4257SSteve Yin { 696*5fdc4257SSteve Yin // Get XAccessibleSelection. 697*5fdc4257SSteve Yin Reference<XAccessibleSelection> pRSelection(GetXInterface(), UNO_QUERY); 698*5fdc4257SSteve Yin if(!pRSelection.is()) 699*5fdc4257SSteve Yin return E_FAIL; 700*5fdc4257SSteve Yin 701*5fdc4257SSteve Yin // Select row. 702*5fdc4257SSteve Yin long lCol, lColumnCount, lChildIndex; 703*5fdc4257SSteve Yin lColumnCount = GetXInterface()->getAccessibleColumnCount(); 704*5fdc4257SSteve Yin for(lCol = 0; lCol < lColumnCount; lCol ++) 705*5fdc4257SSteve Yin { 706*5fdc4257SSteve Yin lChildIndex = GetXInterface()->getAccessibleIndex(row, lCol); 707*5fdc4257SSteve Yin pRSelection.get()->selectAccessibleChild(lChildIndex); 708*5fdc4257SSteve Yin } 709*5fdc4257SSteve Yin 710*5fdc4257SSteve Yin return S_OK; 711*5fdc4257SSteve Yin } 712*5fdc4257SSteve Yin return S_OK; 713*5fdc4257SSteve Yin 714*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 715*5fdc4257SSteve Yin } 716*5fdc4257SSteve Yin 717*5fdc4257SSteve Yin /** 718*5fdc4257SSteve Yin * Selects a column and unselect all previously selected columns. 719*5fdc4257SSteve Yin * 720*5fdc4257SSteve Yin * @param column the column index. 721*5fdc4257SSteve Yin * @param success the result. 722*5fdc4257SSteve Yin */ 723*5fdc4257SSteve Yin STDMETHODIMP CAccTable::selectColumn(long column) 724*5fdc4257SSteve Yin { 725*5fdc4257SSteve Yin 726*5fdc4257SSteve Yin CHECK_ENABLE_INF 727*5fdc4257SSteve Yin 728*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 729*5fdc4257SSteve Yin 730*5fdc4257SSteve Yin // Check XAccessibleTable reference. 731*5fdc4257SSteve Yin if(!pRXTable.is()) 732*5fdc4257SSteve Yin return E_FAIL; 733*5fdc4257SSteve Yin 734*5fdc4257SSteve Yin Reference<XAccessibleTableSelection> pRTableExtent(GetXInterface(), UNO_QUERY); 735*5fdc4257SSteve Yin if(pRTableExtent.is()) 736*5fdc4257SSteve Yin { 737*5fdc4257SSteve Yin pRTableExtent.get()->selectColumn(column); 738*5fdc4257SSteve Yin return S_OK; 739*5fdc4257SSteve Yin } 740*5fdc4257SSteve Yin else 741*5fdc4257SSteve Yin { 742*5fdc4257SSteve Yin // Get XAccessibleSelection. 743*5fdc4257SSteve Yin Reference<XAccessibleSelection> pRSelection(pRXTable, UNO_QUERY); 744*5fdc4257SSteve Yin if(!pRSelection.is()) 745*5fdc4257SSteve Yin return E_FAIL; 746*5fdc4257SSteve Yin 747*5fdc4257SSteve Yin // Select column. 748*5fdc4257SSteve Yin long lRow, lRowCount, lChildIndex; 749*5fdc4257SSteve Yin lRowCount = GetXInterface()->getAccessibleRowCount(); 750*5fdc4257SSteve Yin for(lRow = 0; lRow < lRowCount; lRow ++) 751*5fdc4257SSteve Yin { 752*5fdc4257SSteve Yin lChildIndex = GetXInterface()->getAccessibleIndex(lRow, column); 753*5fdc4257SSteve Yin pRSelection.get()->selectAccessibleChild(lChildIndex); 754*5fdc4257SSteve Yin } 755*5fdc4257SSteve Yin 756*5fdc4257SSteve Yin return S_OK; 757*5fdc4257SSteve Yin } 758*5fdc4257SSteve Yin return S_OK; 759*5fdc4257SSteve Yin // End of added. 760*5fdc4257SSteve Yin 761*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 762*5fdc4257SSteve Yin } 763*5fdc4257SSteve Yin 764*5fdc4257SSteve Yin /** 765*5fdc4257SSteve Yin * Unselects one row, leaving other selected rows selected (if any). 766*5fdc4257SSteve Yin * 767*5fdc4257SSteve Yin * @param row the row index. 768*5fdc4257SSteve Yin * @param success the result. 769*5fdc4257SSteve Yin */ 770*5fdc4257SSteve Yin STDMETHODIMP CAccTable::unselectRow(long row) 771*5fdc4257SSteve Yin { 772*5fdc4257SSteve Yin 773*5fdc4257SSteve Yin CHECK_ENABLE_INF 774*5fdc4257SSteve Yin 775*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 776*5fdc4257SSteve Yin 777*5fdc4257SSteve Yin // Check XAccessibleTable reference. 778*5fdc4257SSteve Yin if(!pRXTable.is()) 779*5fdc4257SSteve Yin return E_FAIL; 780*5fdc4257SSteve Yin 781*5fdc4257SSteve Yin Reference<XAccessibleTableSelection> pRTableExtent(GetXInterface(), UNO_QUERY); 782*5fdc4257SSteve Yin if(pRTableExtent.is()) 783*5fdc4257SSteve Yin { 784*5fdc4257SSteve Yin if(pRTableExtent.get()->unselectRow(row)) 785*5fdc4257SSteve Yin return S_OK; 786*5fdc4257SSteve Yin else 787*5fdc4257SSteve Yin return E_FAIL; 788*5fdc4257SSteve Yin } 789*5fdc4257SSteve Yin else 790*5fdc4257SSteve Yin { 791*5fdc4257SSteve Yin // Get XAccessibleSelection. 792*5fdc4257SSteve Yin Reference<XAccessibleSelection> pRSelection(pRXTable, UNO_QUERY); 793*5fdc4257SSteve Yin if(!pRSelection.is()) 794*5fdc4257SSteve Yin return E_FAIL; 795*5fdc4257SSteve Yin 796*5fdc4257SSteve Yin // Select column. 797*5fdc4257SSteve Yin long lColumn, lColumnCount, lChildIndex; 798*5fdc4257SSteve Yin lColumnCount = GetXInterface()->getAccessibleColumnCount(); 799*5fdc4257SSteve Yin for(lColumn = 0; lColumn < lColumnCount; lColumn ++) 800*5fdc4257SSteve Yin { 801*5fdc4257SSteve Yin lChildIndex = GetXInterface()->getAccessibleIndex(row,lColumn); 802*5fdc4257SSteve Yin pRSelection.get()->deselectAccessibleChild(lChildIndex); 803*5fdc4257SSteve Yin } 804*5fdc4257SSteve Yin 805*5fdc4257SSteve Yin return S_OK; 806*5fdc4257SSteve Yin } 807*5fdc4257SSteve Yin return S_OK; 808*5fdc4257SSteve Yin // End of added. 809*5fdc4257SSteve Yin 810*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 811*5fdc4257SSteve Yin } 812*5fdc4257SSteve Yin 813*5fdc4257SSteve Yin /** 814*5fdc4257SSteve Yin * Unselects one column, leaving other selected columns selected (if any). 815*5fdc4257SSteve Yin * 816*5fdc4257SSteve Yin * @param column the column index. 817*5fdc4257SSteve Yin * @param success the result. 818*5fdc4257SSteve Yin */ 819*5fdc4257SSteve Yin STDMETHODIMP CAccTable::unselectColumn(long column) 820*5fdc4257SSteve Yin { 821*5fdc4257SSteve Yin 822*5fdc4257SSteve Yin CHECK_ENABLE_INF 823*5fdc4257SSteve Yin 824*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 825*5fdc4257SSteve Yin 826*5fdc4257SSteve Yin // Check XAccessibleTable reference. 827*5fdc4257SSteve Yin if(!pRXTable.is()) 828*5fdc4257SSteve Yin return E_FAIL; 829*5fdc4257SSteve Yin 830*5fdc4257SSteve Yin Reference<XAccessibleTableSelection> pRTableExtent(GetXInterface(), UNO_QUERY); 831*5fdc4257SSteve Yin if(pRTableExtent.is()) 832*5fdc4257SSteve Yin { 833*5fdc4257SSteve Yin if(pRTableExtent.get()->unselectColumn(column)) 834*5fdc4257SSteve Yin return S_OK; 835*5fdc4257SSteve Yin else 836*5fdc4257SSteve Yin return E_FAIL; 837*5fdc4257SSteve Yin } 838*5fdc4257SSteve Yin else 839*5fdc4257SSteve Yin { 840*5fdc4257SSteve Yin // Get XAccessibleSelection. 841*5fdc4257SSteve Yin Reference<XAccessibleSelection> pRSelection(pRXTable, UNO_QUERY); 842*5fdc4257SSteve Yin if(!pRSelection.is()) 843*5fdc4257SSteve Yin return E_FAIL; 844*5fdc4257SSteve Yin 845*5fdc4257SSteve Yin // Unselect columns. 846*5fdc4257SSteve Yin long lRow, lRowCount, lChildIndex; 847*5fdc4257SSteve Yin lRowCount = GetXInterface()->getAccessibleRowCount(); 848*5fdc4257SSteve Yin 849*5fdc4257SSteve Yin for(lRow = 0; lRow < lRowCount; lRow ++) 850*5fdc4257SSteve Yin { 851*5fdc4257SSteve Yin lChildIndex = GetXInterface()->getAccessibleIndex(lRow, column); 852*5fdc4257SSteve Yin pRSelection.get()->deselectAccessibleChild(lChildIndex); 853*5fdc4257SSteve Yin } 854*5fdc4257SSteve Yin return S_OK; 855*5fdc4257SSteve Yin } 856*5fdc4257SSteve Yin 857*5fdc4257SSteve Yin return S_OK; 858*5fdc4257SSteve Yin 859*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 860*5fdc4257SSteve Yin } 861*5fdc4257SSteve Yin 862*5fdc4257SSteve Yin /** 863*5fdc4257SSteve Yin * Overide of IUNOXWrapper. 864*5fdc4257SSteve Yin * 865*5fdc4257SSteve Yin * @param pXInterface the pointer of UNO interface. 866*5fdc4257SSteve Yin */ 867*5fdc4257SSteve Yin STDMETHODIMP CAccTable::put_XInterface(long pXInterface) 868*5fdc4257SSteve Yin { 869*5fdc4257SSteve Yin 870*5fdc4257SSteve Yin CHECK_ENABLE_INF 871*5fdc4257SSteve Yin 872*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 873*5fdc4257SSteve Yin 874*5fdc4257SSteve Yin CUNOXWrapper::put_XInterface(pXInterface); 875*5fdc4257SSteve Yin //special query. 876*5fdc4257SSteve Yin if(pUNOInterface == NULL) 877*5fdc4257SSteve Yin return E_INVALIDARG; 878*5fdc4257SSteve Yin 879*5fdc4257SSteve Yin Reference<XAccessibleContext> pRContext = pUNOInterface->getAccessibleContext(); 880*5fdc4257SSteve Yin if( !pRContext.is() ) 881*5fdc4257SSteve Yin return E_FAIL; 882*5fdc4257SSteve Yin 883*5fdc4257SSteve Yin Reference<XAccessibleTable> pRXI(pRContext,UNO_QUERY); 884*5fdc4257SSteve Yin if( !pRXI.is() ) 885*5fdc4257SSteve Yin pRXTable = NULL; 886*5fdc4257SSteve Yin else 887*5fdc4257SSteve Yin pRXTable = pRXI.get(); 888*5fdc4257SSteve Yin return S_OK; 889*5fdc4257SSteve Yin 890*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 891*5fdc4257SSteve Yin } 892*5fdc4257SSteve Yin 893*5fdc4257SSteve Yin /** 894*5fdc4257SSteve Yin * Gets columnIndex of childIndex. 895*5fdc4257SSteve Yin * 896*5fdc4257SSteve Yin * @param childIndex childIndex 897*5fdc4257SSteve Yin */ 898*5fdc4257SSteve Yin STDMETHODIMP CAccTable::get_columnIndex(long childIndex, long * columnIndex) 899*5fdc4257SSteve Yin { 900*5fdc4257SSteve Yin 901*5fdc4257SSteve Yin CHECK_ENABLE_INF 902*5fdc4257SSteve Yin 903*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 904*5fdc4257SSteve Yin 905*5fdc4257SSteve Yin // #CHECK# 906*5fdc4257SSteve Yin if(columnIndex == NULL) 907*5fdc4257SSteve Yin return E_INVALIDARG; 908*5fdc4257SSteve Yin 909*5fdc4257SSteve Yin // #CHECK XInterface# 910*5fdc4257SSteve Yin if(!pRXTable.is()) 911*5fdc4257SSteve Yin return E_FAIL; 912*5fdc4257SSteve Yin 913*5fdc4257SSteve Yin *columnIndex = GetXInterface()->getAccessibleColumn(childIndex); 914*5fdc4257SSteve Yin return S_OK; 915*5fdc4257SSteve Yin 916*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 917*5fdc4257SSteve Yin } 918*5fdc4257SSteve Yin /** 919*5fdc4257SSteve Yin * Gets rowIndex of childIndex. 920*5fdc4257SSteve Yin * 921*5fdc4257SSteve Yin * @param childIndex childIndex 922*5fdc4257SSteve Yin */ 923*5fdc4257SSteve Yin STDMETHODIMP CAccTable::get_rowIndex(long childIndex, long * rowIndex) 924*5fdc4257SSteve Yin { 925*5fdc4257SSteve Yin 926*5fdc4257SSteve Yin CHECK_ENABLE_INF 927*5fdc4257SSteve Yin 928*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 929*5fdc4257SSteve Yin 930*5fdc4257SSteve Yin // #CHECK# 931*5fdc4257SSteve Yin if(rowIndex == NULL) 932*5fdc4257SSteve Yin return E_INVALIDARG; 933*5fdc4257SSteve Yin 934*5fdc4257SSteve Yin // #CHECK XInterface# 935*5fdc4257SSteve Yin if(!pRXTable.is()) 936*5fdc4257SSteve Yin return E_FAIL; 937*5fdc4257SSteve Yin 938*5fdc4257SSteve Yin *rowIndex = GetXInterface()->getAccessibleRow(childIndex); 939*5fdc4257SSteve Yin return S_OK; 940*5fdc4257SSteve Yin 941*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 942*5fdc4257SSteve Yin } 943*5fdc4257SSteve Yin /** 944*5fdc4257SSteve Yin * Gets childIndex of childIndex. 945*5fdc4257SSteve Yin * 946*5fdc4257SSteve Yin * @param childIndex childIndex 947*5fdc4257SSteve Yin */ 948*5fdc4257SSteve Yin STDMETHODIMP CAccTable::get_childIndex(long RowIndex , long columnIndex, long * childIndex ) 949*5fdc4257SSteve Yin { 950*5fdc4257SSteve Yin 951*5fdc4257SSteve Yin CHECK_ENABLE_INF 952*5fdc4257SSteve Yin 953*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 954*5fdc4257SSteve Yin 955*5fdc4257SSteve Yin // #CHECK# 956*5fdc4257SSteve Yin if(childIndex == NULL) 957*5fdc4257SSteve Yin return E_INVALIDARG; 958*5fdc4257SSteve Yin 959*5fdc4257SSteve Yin // #CHECK XInterface# 960*5fdc4257SSteve Yin if(!pRXTable.is()) 961*5fdc4257SSteve Yin return E_FAIL; 962*5fdc4257SSteve Yin 963*5fdc4257SSteve Yin *childIndex = GetXInterface()->getAccessibleIndex(RowIndex, columnIndex); 964*5fdc4257SSteve Yin return S_OK; 965*5fdc4257SSteve Yin 966*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 967*5fdc4257SSteve Yin } 968*5fdc4257SSteve Yin 969*5fdc4257SSteve Yin STDMETHODIMP CAccTable::get_rowColumnExtentsAtIndex(long, 970*5fdc4257SSteve Yin long *, 971*5fdc4257SSteve Yin long *, 972*5fdc4257SSteve Yin long *, 973*5fdc4257SSteve Yin long *, 974*5fdc4257SSteve Yin boolean *) 975*5fdc4257SSteve Yin { 976*5fdc4257SSteve Yin 977*5fdc4257SSteve Yin CHECK_ENABLE_INF 978*5fdc4257SSteve Yin 979*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 980*5fdc4257SSteve Yin 981*5fdc4257SSteve Yin return E_NOTIMPL; 982*5fdc4257SSteve Yin 983*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 984*5fdc4257SSteve Yin } 985*5fdc4257SSteve Yin 986*5fdc4257SSteve Yin STDMETHODIMP CAccTable::get_modelChange(IA2TableModelChange *) 987*5fdc4257SSteve Yin { 988*5fdc4257SSteve Yin 989*5fdc4257SSteve Yin return E_NOTIMPL; 990*5fdc4257SSteve Yin } 991*5fdc4257SSteve Yin 992*5fdc4257SSteve Yin // @brief Returns the total number of selected children 993*5fdc4257SSteve Yin // @param [out] childCount 994*5fdc4257SSteve Yin // Number of children currently selected 995*5fdc4257SSteve Yin STDMETHODIMP CAccTable::get_nSelectedChildren(long *childCount) 996*5fdc4257SSteve Yin { 997*5fdc4257SSteve Yin 998*5fdc4257SSteve Yin CHECK_ENABLE_INF 999*5fdc4257SSteve Yin 1000*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 1001*5fdc4257SSteve Yin 1002*5fdc4257SSteve Yin // #CHECK# 1003*5fdc4257SSteve Yin if(childCount == NULL) 1004*5fdc4257SSteve Yin return E_INVALIDARG; 1005*5fdc4257SSteve Yin 1006*5fdc4257SSteve Yin // #CHECK XInterface# 1007*5fdc4257SSteve Yin if(!pRXTable.is()) 1008*5fdc4257SSteve Yin return E_FAIL; 1009*5fdc4257SSteve Yin 1010*5fdc4257SSteve Yin Reference<XAccessibleSelection> pRSelection(GetXInterface(), UNO_QUERY); 1011*5fdc4257SSteve Yin if(!pRSelection.is()) 1012*5fdc4257SSteve Yin return E_FAIL; 1013*5fdc4257SSteve Yin 1014*5fdc4257SSteve Yin *childCount = pRSelection->getSelectedAccessibleChildCount(); 1015*5fdc4257SSteve Yin return S_OK; 1016*5fdc4257SSteve Yin 1017*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 1018*5fdc4257SSteve Yin } 1019*5fdc4257SSteve Yin 1020*5fdc4257SSteve Yin // @brief Returns a list of child indexes currently selected (0-based). 1021*5fdc4257SSteve Yin // @param [in] maxChildren 1022*5fdc4257SSteve Yin // Max children requested (possibly from IAccessibleTable::nSelectedChildren) 1023*5fdc4257SSteve Yin // @param [out] children 1024*5fdc4257SSteve Yin // array of indexes of selected children (each index is 0-based) 1025*5fdc4257SSteve Yin // @param [out] nChildren 1026*5fdc4257SSteve Yin // Length of array (not more than maxChildren) 1027*5fdc4257SSteve Yin STDMETHODIMP CAccTable::get_selectedChildren(long, long **children, long *nChildren) 1028*5fdc4257SSteve Yin { 1029*5fdc4257SSteve Yin 1030*5fdc4257SSteve Yin CHECK_ENABLE_INF 1031*5fdc4257SSteve Yin 1032*5fdc4257SSteve Yin ENTER_PROTECTED_BLOCK 1033*5fdc4257SSteve Yin 1034*5fdc4257SSteve Yin // #CHECK# 1035*5fdc4257SSteve Yin if(children == NULL || nChildren == NULL) 1036*5fdc4257SSteve Yin return E_INVALIDARG; 1037*5fdc4257SSteve Yin 1038*5fdc4257SSteve Yin // #CHECK XInterface# 1039*5fdc4257SSteve Yin if(!pRXTable.is()) 1040*5fdc4257SSteve Yin return E_FAIL; 1041*5fdc4257SSteve Yin 1042*5fdc4257SSteve Yin Reference<XAccessibleSelection> pRSelection(GetXInterface(), UNO_QUERY); 1043*5fdc4257SSteve Yin if(!pRSelection.is()) 1044*5fdc4257SSteve Yin return E_FAIL; 1045*5fdc4257SSteve Yin 1046*5fdc4257SSteve Yin long childCount = pRSelection->getSelectedAccessibleChildCount() ; 1047*5fdc4257SSteve Yin 1048*5fdc4257SSteve Yin *nChildren = childCount; 1049*5fdc4257SSteve Yin 1050*5fdc4257SSteve Yin *children = reinterpret_cast<long*>(CoTaskMemAlloc((childCount) * sizeof(long))); 1051*5fdc4257SSteve Yin 1052*5fdc4257SSteve Yin for( long i = 0; i< childCount; i++) 1053*5fdc4257SSteve Yin { 1054*5fdc4257SSteve Yin Reference<XAccessible> pRAcc = pRSelection->getSelectedAccessibleChild(i); 1055*5fdc4257SSteve Yin if(pRAcc.is()) 1056*5fdc4257SSteve Yin { 1057*5fdc4257SSteve Yin Reference<XAccessibleContext> pRContext(pRAcc, UNO_QUERY); 1058*5fdc4257SSteve Yin if( !pRContext.is() ) 1059*5fdc4257SSteve Yin return E_FAIL; 1060*5fdc4257SSteve Yin 1061*5fdc4257SSteve Yin long childIndex = pRContext->getAccessibleIndexInParent(); 1062*5fdc4257SSteve Yin (*children)[i] = childIndex; 1063*5fdc4257SSteve Yin } 1064*5fdc4257SSteve Yin } 1065*5fdc4257SSteve Yin 1066*5fdc4257SSteve Yin return S_OK; 1067*5fdc4257SSteve Yin 1068*5fdc4257SSteve Yin LEAVE_PROTECTED_BLOCK 1069*5fdc4257SSteve Yin 1070*5fdc4257SSteve Yin } 1071