xref: /AOO41X/main/winaccessibility/source/UAccCOM/AccTable.cpp (revision 5fdc4257b5e43545f8f7841d9e8303d3a99b1714)
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