1*b1cdbd2cSJim Jagielski /**************************************************************
2*b1cdbd2cSJim Jagielski  *
3*b1cdbd2cSJim Jagielski  * Licensed to the Apache Software Foundation (ASF) under one
4*b1cdbd2cSJim Jagielski  * or more contributor license agreements.  See the NOTICE file
5*b1cdbd2cSJim Jagielski  * distributed with this work for additional information
6*b1cdbd2cSJim Jagielski  * regarding copyright ownership.  The ASF licenses this file
7*b1cdbd2cSJim Jagielski  * to you under the Apache License, Version 2.0 (the
8*b1cdbd2cSJim Jagielski  * "License"); you may not use this file except in compliance
9*b1cdbd2cSJim Jagielski  * with the License.  You may obtain a copy of the License at
10*b1cdbd2cSJim Jagielski  *
11*b1cdbd2cSJim Jagielski  *   http://www.apache.org/licenses/LICENSE-2.0
12*b1cdbd2cSJim Jagielski  *
13*b1cdbd2cSJim Jagielski  * Unless required by applicable law or agreed to in writing,
14*b1cdbd2cSJim Jagielski  * software distributed under the License is distributed on an
15*b1cdbd2cSJim Jagielski  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*b1cdbd2cSJim Jagielski  * KIND, either express or implied.  See the License for the
17*b1cdbd2cSJim Jagielski  * specific language governing permissions and limitations
18*b1cdbd2cSJim Jagielski  * under the License.
19*b1cdbd2cSJim Jagielski  *
20*b1cdbd2cSJim Jagielski  *************************************************************/
21*b1cdbd2cSJim Jagielski 
22*b1cdbd2cSJim Jagielski 
23*b1cdbd2cSJim Jagielski 
24*b1cdbd2cSJim Jagielski // MARKER(update_precomp.py): autogen include statement, do not remove
25*b1cdbd2cSJim Jagielski #include "precompiled_svx.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include <com/sun/star/table/XMergeableCell.hpp>
28*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/AccessibleEventId.hpp>
29*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/AccessibleStateType.hpp>
30*b1cdbd2cSJim Jagielski 
31*b1cdbd2cSJim Jagielski #include <comphelper/accessiblewrapper.hxx>
32*b1cdbd2cSJim Jagielski #include <vos/mutex.hxx>
33*b1cdbd2cSJim Jagielski #include <tools/debug.hxx>
34*b1cdbd2cSJim Jagielski #include <vcl/svapp.hxx>
35*b1cdbd2cSJim Jagielski 
36*b1cdbd2cSJim Jagielski #include <svx/AccessibleTableShape.hxx>
37*b1cdbd2cSJim Jagielski #include <svx/sdr/table/tablecontroller.hxx>
38*b1cdbd2cSJim Jagielski #include "accessiblecell.hxx"
39*b1cdbd2cSJim Jagielski 
40*b1cdbd2cSJim Jagielski #include <algorithm>
41*b1cdbd2cSJim Jagielski 
42*b1cdbd2cSJim Jagielski #include <cppuhelper/implbase1.hxx>
43*b1cdbd2cSJim Jagielski #include <svx/svdotable.hxx>
44*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/AccessibleStateType.hpp>
45*b1cdbd2cSJim Jagielski #include <com/sun/star/view/XSelectionSupplier.hpp>
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski using ::rtl::OUString;
48*b1cdbd2cSJim Jagielski 
49*b1cdbd2cSJim Jagielski using namespace ::accessibility;
50*b1cdbd2cSJim Jagielski using namespace ::sdr::table;
51*b1cdbd2cSJim Jagielski using namespace	::com::sun::star::accessibility;
52*b1cdbd2cSJim Jagielski using namespace	::com::sun::star::uno;
53*b1cdbd2cSJim Jagielski using namespace	::com::sun::star::beans;
54*b1cdbd2cSJim Jagielski using namespace	::com::sun::star::util;
55*b1cdbd2cSJim Jagielski using namespace	::com::sun::star::lang;
56*b1cdbd2cSJim Jagielski using namespace	::com::sun::star::drawing;
57*b1cdbd2cSJim Jagielski using namespace	::com::sun::star::table;
58*b1cdbd2cSJim Jagielski using namespace	::com::sun::star::container;
59*b1cdbd2cSJim Jagielski 
60*b1cdbd2cSJim Jagielski #define C2U(x) OUString(RTL_CONSTASCII_USTRINGPARAM(x))
61*b1cdbd2cSJim Jagielski 
62*b1cdbd2cSJim Jagielski namespace accessibility
63*b1cdbd2cSJim Jagielski {
64*b1cdbd2cSJim Jagielski 
65*b1cdbd2cSJim Jagielski struct hash
66*b1cdbd2cSJim Jagielski {
operator ()accessibility::hash67*b1cdbd2cSJim Jagielski 	std::size_t operator()( const Reference< XCell >& xCell ) const
68*b1cdbd2cSJim Jagielski 	{
69*b1cdbd2cSJim Jagielski 		return std::size_t( xCell.get() );
70*b1cdbd2cSJim Jagielski 	}
71*b1cdbd2cSJim Jagielski };
72*b1cdbd2cSJim Jagielski 
73*b1cdbd2cSJim Jagielski typedef std::hash_map< Reference< XCell >, rtl::Reference< AccessibleCell >, hash > AccessibleCellMap;
74*b1cdbd2cSJim Jagielski 
75*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
76*b1cdbd2cSJim Jagielski // AccessibleTableShapeImpl
77*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
78*b1cdbd2cSJim Jagielski 
79*b1cdbd2cSJim Jagielski class AccessibleTableShapeImpl : public cppu::WeakImplHelper1< XModifyListener >
80*b1cdbd2cSJim Jagielski {
81*b1cdbd2cSJim Jagielski public:
82*b1cdbd2cSJim Jagielski 	AccessibleTableShapeImpl( AccessibleShapeTreeInfo& rShapeTreeInfo );
83*b1cdbd2cSJim Jagielski 
84*b1cdbd2cSJim Jagielski 	void init( const Reference< XAccessible>& xAccessible, const Reference< XTable >& xTable );
85*b1cdbd2cSJim Jagielski 	void dispose();
86*b1cdbd2cSJim Jagielski 
87*b1cdbd2cSJim Jagielski 	Reference< XAccessible > getAccessibleChild( sal_Int32 i ) throw(IndexOutOfBoundsException);
88*b1cdbd2cSJim Jagielski 	void getColumnAndRow( sal_Int32 nChildIndex, sal_Int32& rnColumn, sal_Int32& rnRow ) throw (IndexOutOfBoundsException );
89*b1cdbd2cSJim Jagielski 
90*b1cdbd2cSJim Jagielski     // XModifyListener
91*b1cdbd2cSJim Jagielski     virtual void SAL_CALL modified( const EventObject& aEvent ) throw (RuntimeException);
92*b1cdbd2cSJim Jagielski 
93*b1cdbd2cSJim Jagielski     // XEventListener
94*b1cdbd2cSJim Jagielski     virtual void SAL_CALL disposing( const EventObject& Source ) throw (RuntimeException);
95*b1cdbd2cSJim Jagielski 
96*b1cdbd2cSJim Jagielski 	AccessibleShapeTreeInfo& mrShapeTreeInfo;
97*b1cdbd2cSJim Jagielski 	Reference< XTable > mxTable;
98*b1cdbd2cSJim Jagielski 	AccessibleCellMap maChildMap;
99*b1cdbd2cSJim Jagielski 	Reference< XAccessible> mxAccessible;
100*b1cdbd2cSJim Jagielski 	sal_Int32 mRowCount, mColCount;
101*b1cdbd2cSJim Jagielski 	//get the cached AccessibleCell from XCell
102*b1cdbd2cSJim Jagielski 	Reference< AccessibleCell > getAccessibleCell (Reference< XCell > xCell);
103*b1cdbd2cSJim Jagielski };
104*b1cdbd2cSJim Jagielski 
105*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
106*b1cdbd2cSJim Jagielski 
AccessibleTableShapeImpl(AccessibleShapeTreeInfo & rShapeTreeInfo)107*b1cdbd2cSJim Jagielski AccessibleTableShapeImpl::AccessibleTableShapeImpl( AccessibleShapeTreeInfo& rShapeTreeInfo )
108*b1cdbd2cSJim Jagielski : mrShapeTreeInfo( rShapeTreeInfo )
109*b1cdbd2cSJim Jagielski , mRowCount(0)
110*b1cdbd2cSJim Jagielski , mColCount(0)
111*b1cdbd2cSJim Jagielski {
112*b1cdbd2cSJim Jagielski }
113*b1cdbd2cSJim Jagielski 
114*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
115*b1cdbd2cSJim Jagielski 
init(const Reference<XAccessible> & xAccessible,const Reference<XTable> & xTable)116*b1cdbd2cSJim Jagielski void AccessibleTableShapeImpl::init( const Reference< XAccessible>& xAccessible, const Reference< XTable >& xTable )
117*b1cdbd2cSJim Jagielski {
118*b1cdbd2cSJim Jagielski 	mxAccessible = xAccessible;
119*b1cdbd2cSJim Jagielski 	mxTable = xTable;
120*b1cdbd2cSJim Jagielski 
121*b1cdbd2cSJim Jagielski 	if( mxTable.is() )
122*b1cdbd2cSJim Jagielski 	{
123*b1cdbd2cSJim Jagielski 		Reference< XModifyListener > xListener( this );
124*b1cdbd2cSJim Jagielski 		mxTable->addModifyListener( xListener );
125*b1cdbd2cSJim Jagielski 		//register the listener with table model
126*b1cdbd2cSJim Jagielski 		Reference< ::com::sun::star::view::XSelectionSupplier > xSelSupplier(xTable, UNO_QUERY);
127*b1cdbd2cSJim Jagielski 		Reference< ::com::sun::star::view::XSelectionChangeListener > xSelListener( xAccessible, UNO_QUERY );
128*b1cdbd2cSJim Jagielski 		if (xSelSupplier.is())
129*b1cdbd2cSJim Jagielski 			xSelSupplier->addSelectionChangeListener(xSelListener);
130*b1cdbd2cSJim Jagielski 		mRowCount = mxTable->getRowCount();
131*b1cdbd2cSJim Jagielski 		mColCount = mxTable->getColumnCount();
132*b1cdbd2cSJim Jagielski 	}
133*b1cdbd2cSJim Jagielski }
134*b1cdbd2cSJim Jagielski 
135*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
136*b1cdbd2cSJim Jagielski 
dispose()137*b1cdbd2cSJim Jagielski void AccessibleTableShapeImpl::dispose()
138*b1cdbd2cSJim Jagielski {
139*b1cdbd2cSJim Jagielski 	if( mxTable.is() )
140*b1cdbd2cSJim Jagielski 	{
141*b1cdbd2cSJim Jagielski 		//IAccessibility2 Implementation 2009-----, remove all the cell's acc object in table's dispose.
142*b1cdbd2cSJim Jagielski 		for( AccessibleCellMap::iterator iter( maChildMap.begin() ); iter != maChildMap.end(); iter++ )
143*b1cdbd2cSJim Jagielski 		{
144*b1cdbd2cSJim Jagielski 			(*iter).second->dispose();
145*b1cdbd2cSJim Jagielski 		}
146*b1cdbd2cSJim Jagielski 		Reference< XModifyListener > xListener( this );
147*b1cdbd2cSJim Jagielski 		mxTable->removeModifyListener( xListener );
148*b1cdbd2cSJim Jagielski 		mxTable.clear();
149*b1cdbd2cSJim Jagielski 	}
150*b1cdbd2cSJim Jagielski 	mxAccessible.clear();
151*b1cdbd2cSJim Jagielski }
152*b1cdbd2cSJim Jagielski 
153*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
154*b1cdbd2cSJim Jagielski //IAccessibility2 Implementation 2009-----, get the cached AccessibleCell from XCell
getAccessibleCell(Reference<XCell> xCell)155*b1cdbd2cSJim Jagielski Reference< AccessibleCell > AccessibleTableShapeImpl::getAccessibleCell (Reference< XCell > xCell)
156*b1cdbd2cSJim Jagielski {
157*b1cdbd2cSJim Jagielski 	AccessibleCellMap::iterator iter( maChildMap.find( xCell ) );
158*b1cdbd2cSJim Jagielski 
159*b1cdbd2cSJim Jagielski 	if( iter != maChildMap.end() )
160*b1cdbd2cSJim Jagielski 	{
161*b1cdbd2cSJim Jagielski 		Reference< AccessibleCell > xChild( (*iter).second.get() );
162*b1cdbd2cSJim Jagielski 		return xChild;
163*b1cdbd2cSJim Jagielski 	}
164*b1cdbd2cSJim Jagielski 	return Reference< AccessibleCell >();
165*b1cdbd2cSJim Jagielski }
166*b1cdbd2cSJim Jagielski 
167*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
getAccessibleChild(sal_Int32 nChildIndex)168*b1cdbd2cSJim Jagielski Reference< XAccessible > AccessibleTableShapeImpl::getAccessibleChild( sal_Int32 nChildIndex ) throw(IndexOutOfBoundsException)
169*b1cdbd2cSJim Jagielski {
170*b1cdbd2cSJim Jagielski 	sal_Int32 nColumn = 0, nRow = 0;
171*b1cdbd2cSJim Jagielski 	getColumnAndRow( nChildIndex, nColumn, nRow );
172*b1cdbd2cSJim Jagielski 
173*b1cdbd2cSJim Jagielski 	Reference< XCell > xCell( mxTable->getCellByPosition( nColumn, nRow ) );
174*b1cdbd2cSJim Jagielski 	AccessibleCellMap::iterator iter( maChildMap.find( xCell ) );
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski 	if( iter != maChildMap.end() )
177*b1cdbd2cSJim Jagielski 	{
178*b1cdbd2cSJim Jagielski 		Reference< XAccessible > xChild( (*iter).second.get() );
179*b1cdbd2cSJim Jagielski 		return xChild;
180*b1cdbd2cSJim Jagielski 	}
181*b1cdbd2cSJim Jagielski 	else
182*b1cdbd2cSJim Jagielski 	{
183*b1cdbd2cSJim Jagielski 		CellRef xCellRef( dynamic_cast< Cell* >( xCell.get() ) );
184*b1cdbd2cSJim Jagielski 
185*b1cdbd2cSJim Jagielski 		rtl::Reference< AccessibleCell > xAccessibleCell( new AccessibleCell( mxAccessible, xCellRef, nChildIndex, mrShapeTreeInfo ) );
186*b1cdbd2cSJim Jagielski 
187*b1cdbd2cSJim Jagielski 		xAccessibleCell->Init();
188*b1cdbd2cSJim Jagielski 		maChildMap[xCell] = xAccessibleCell;
189*b1cdbd2cSJim Jagielski 
190*b1cdbd2cSJim Jagielski         xAccessibleCell->Init();
191*b1cdbd2cSJim Jagielski 
192*b1cdbd2cSJim Jagielski 		Reference< XAccessible > xChild( xAccessibleCell.get() );
193*b1cdbd2cSJim Jagielski 		return xChild;
194*b1cdbd2cSJim Jagielski 	}
195*b1cdbd2cSJim Jagielski }
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
198*b1cdbd2cSJim Jagielski 
getColumnAndRow(sal_Int32 nChildIndex,sal_Int32 & rnColumn,sal_Int32 & rnRow)199*b1cdbd2cSJim Jagielski void AccessibleTableShapeImpl::getColumnAndRow( sal_Int32 nChildIndex, sal_Int32& rnColumn, sal_Int32& rnRow ) throw (IndexOutOfBoundsException )
200*b1cdbd2cSJim Jagielski {
201*b1cdbd2cSJim Jagielski 	rnRow = 0;
202*b1cdbd2cSJim Jagielski 	rnColumn = nChildIndex;
203*b1cdbd2cSJim Jagielski 
204*b1cdbd2cSJim Jagielski 	if( mxTable.is() )
205*b1cdbd2cSJim Jagielski 	{
206*b1cdbd2cSJim Jagielski 		const sal_Int32 nColumnCount = mxTable->getColumnCount();
207*b1cdbd2cSJim Jagielski 		while( rnColumn >= nColumnCount )
208*b1cdbd2cSJim Jagielski 		{
209*b1cdbd2cSJim Jagielski 			rnRow++;
210*b1cdbd2cSJim Jagielski 			rnColumn -= nColumnCount;
211*b1cdbd2cSJim Jagielski 		}
212*b1cdbd2cSJim Jagielski 
213*b1cdbd2cSJim Jagielski 		if( rnRow < mxTable->getRowCount() )
214*b1cdbd2cSJim Jagielski 			return;
215*b1cdbd2cSJim Jagielski 	}
216*b1cdbd2cSJim Jagielski 
217*b1cdbd2cSJim Jagielski 	throw IndexOutOfBoundsException();
218*b1cdbd2cSJim Jagielski }
219*b1cdbd2cSJim Jagielski 
220*b1cdbd2cSJim Jagielski // XModifyListener
modified(const EventObject &)221*b1cdbd2cSJim Jagielski void SAL_CALL AccessibleTableShapeImpl::modified( const EventObject& /*aEvent*/ ) throw (RuntimeException)
222*b1cdbd2cSJim Jagielski {
223*b1cdbd2cSJim Jagielski 	if( mxTable.is() ) try
224*b1cdbd2cSJim Jagielski 	{
225*b1cdbd2cSJim Jagielski 		// structural changes may have happened to the table, validate all accessible cell instances
226*b1cdbd2cSJim Jagielski 		AccessibleCellMap aTempChildMap;
227*b1cdbd2cSJim Jagielski 		aTempChildMap.swap( maChildMap );
228*b1cdbd2cSJim Jagielski 
229*b1cdbd2cSJim Jagielski 		// first move all still existing cells to maChildMap again and update their index
230*b1cdbd2cSJim Jagielski 
231*b1cdbd2cSJim Jagielski 		const sal_Int32 nRowCount = mxTable->getRowCount();
232*b1cdbd2cSJim Jagielski 		const sal_Int32 nColCount = mxTable->getColumnCount();
233*b1cdbd2cSJim Jagielski 
234*b1cdbd2cSJim Jagielski 		sal_Bool bRowOrColumnChanged = sal_False;
235*b1cdbd2cSJim Jagielski 		if (mRowCount != nRowCount || mColCount != nColCount )
236*b1cdbd2cSJim Jagielski 		{
237*b1cdbd2cSJim Jagielski 			bRowOrColumnChanged = sal_True;
238*b1cdbd2cSJim Jagielski 			mRowCount = nRowCount;
239*b1cdbd2cSJim Jagielski 			mColCount = nColCount;
240*b1cdbd2cSJim Jagielski 		}
241*b1cdbd2cSJim Jagielski 		sal_Int32 nChildIndex = 0;
242*b1cdbd2cSJim Jagielski 
243*b1cdbd2cSJim Jagielski 		for( sal_Int32 nRow = 0; nRow < nRowCount; ++nRow )
244*b1cdbd2cSJim Jagielski 		{
245*b1cdbd2cSJim Jagielski 			for( sal_Int32 nCol = 0; nCol < nColCount; ++nCol )
246*b1cdbd2cSJim Jagielski 			{
247*b1cdbd2cSJim Jagielski 				Reference< XCell > xCell( mxTable->getCellByPosition( nCol, nRow ) );
248*b1cdbd2cSJim Jagielski 				AccessibleCellMap::iterator iter( aTempChildMap.find( xCell ) );
249*b1cdbd2cSJim Jagielski 
250*b1cdbd2cSJim Jagielski 				if( iter != aTempChildMap.end() )
251*b1cdbd2cSJim Jagielski 				{
252*b1cdbd2cSJim Jagielski 					rtl::Reference< AccessibleCell > xAccessibleCell( (*iter).second );
253*b1cdbd2cSJim Jagielski 					xAccessibleCell->setIndexInParent( nChildIndex );
254*b1cdbd2cSJim Jagielski 					//IAccessibility2 Implementation 2009-----, the children may need to updated
255*b1cdbd2cSJim Jagielski 					//xAccessibleCell->CommitChange(AccessibleEventId::VISIBLE_DATA_CHANGED, Any(), Any());
256*b1cdbd2cSJim Jagielski 					xAccessibleCell->UpdateChildren();
257*b1cdbd2cSJim Jagielski 					// If row or column count is changed, there is split or merge, so all cell's acc name should be updated
258*b1cdbd2cSJim Jagielski 					if (bRowOrColumnChanged)
259*b1cdbd2cSJim Jagielski 					{
260*b1cdbd2cSJim Jagielski 						xAccessibleCell->SetAccessibleName(xAccessibleCell->getAccessibleName(), AccessibleContextBase::ManuallySet);
261*b1cdbd2cSJim Jagielski 					}
262*b1cdbd2cSJim Jagielski 					// For merged cell, add invisible & disabled state.
263*b1cdbd2cSJim Jagielski 					Reference< XMergeableCell > xMergedCell( mxTable->getCellByPosition( nCol, nRow ),  UNO_QUERY );
264*b1cdbd2cSJim Jagielski 					if (xMergedCell.is() && xMergedCell->isMerged())
265*b1cdbd2cSJim Jagielski 					{
266*b1cdbd2cSJim Jagielski 						xAccessibleCell->ResetState(AccessibleStateType::VISIBLE);
267*b1cdbd2cSJim Jagielski 						xAccessibleCell->ResetState(AccessibleStateType::ENABLED);
268*b1cdbd2cSJim Jagielski 						// IA2 CWS. MT: OFFSCREEN == !SHOWING, should stay consistent
269*b1cdbd2cSJim Jagielski 						// xAccessibleCell->SetState(AccessibleStateType::OFFSCREEN);
270*b1cdbd2cSJim Jagielski 						xAccessibleCell->ResetState(AccessibleStateType::SHOWING);
271*b1cdbd2cSJim Jagielski 					}
272*b1cdbd2cSJim Jagielski 					else
273*b1cdbd2cSJim Jagielski 					{
274*b1cdbd2cSJim Jagielski 						xAccessibleCell->SetState(AccessibleStateType::VISIBLE);
275*b1cdbd2cSJim Jagielski 						xAccessibleCell->SetState(AccessibleStateType::ENABLED);
276*b1cdbd2cSJim Jagielski 						// IA2 CWS. MT: OFFSCREEN == !SHOWING, should stay consistent
277*b1cdbd2cSJim Jagielski 						// xAccessibleCell->ResetState(AccessibleStateType::OFFSCREEN);
278*b1cdbd2cSJim Jagielski 						xAccessibleCell->SetState(AccessibleStateType::SHOWING);
279*b1cdbd2cSJim Jagielski 					}
280*b1cdbd2cSJim Jagielski 
281*b1cdbd2cSJim Jagielski 					// move still existing cell from temporary child map to our child map
282*b1cdbd2cSJim Jagielski 					maChildMap[xCell] = xAccessibleCell;
283*b1cdbd2cSJim Jagielski 					aTempChildMap.erase( iter );
284*b1cdbd2cSJim Jagielski 				}
285*b1cdbd2cSJim Jagielski 				//IAccessibility2 Implementation 2009-----, need to add the new added cell on demand
286*b1cdbd2cSJim Jagielski 				else
287*b1cdbd2cSJim Jagielski 				{
288*b1cdbd2cSJim Jagielski 					CellRef xCellRef( dynamic_cast< Cell* >( xCell.get() ) );
289*b1cdbd2cSJim Jagielski 
290*b1cdbd2cSJim Jagielski 					rtl::Reference< AccessibleCell > xAccessibleCell( new AccessibleCell( mxAccessible, xCellRef, nChildIndex, mrShapeTreeInfo ) );
291*b1cdbd2cSJim Jagielski 
292*b1cdbd2cSJim Jagielski 					xAccessibleCell->Init();
293*b1cdbd2cSJim Jagielski 					maChildMap[xCell] = xAccessibleCell;
294*b1cdbd2cSJim Jagielski 				}
295*b1cdbd2cSJim Jagielski 
296*b1cdbd2cSJim Jagielski 				++nChildIndex;
297*b1cdbd2cSJim Jagielski 			}
298*b1cdbd2cSJim Jagielski 		}
299*b1cdbd2cSJim Jagielski 
300*b1cdbd2cSJim Jagielski 		// all accessible cell instances still left in aTempChildMap must be disposed
301*b1cdbd2cSJim Jagielski 		// as they are no longer part of the table
302*b1cdbd2cSJim Jagielski 
303*b1cdbd2cSJim Jagielski 		for( AccessibleCellMap::iterator iter( aTempChildMap.begin() ); iter != aTempChildMap.end(); iter++ )
304*b1cdbd2cSJim Jagielski 		{
305*b1cdbd2cSJim Jagielski 			(*iter).second->dispose();
306*b1cdbd2cSJim Jagielski 		}
307*b1cdbd2cSJim Jagielski 		//IAccessibility2 Implementation 2009-----, notify bridge to update the acc cache.
308*b1cdbd2cSJim Jagielski 		AccessibleTableShape *pAccTable = dynamic_cast <AccessibleTableShape *> (mxAccessible.get());
309*b1cdbd2cSJim Jagielski 		pAccTable->CommitChange(AccessibleEventId::INVALIDATE_ALL_CHILDREN, Any(), Any());
310*b1cdbd2cSJim Jagielski 	}
311*b1cdbd2cSJim Jagielski 	catch( Exception& )
312*b1cdbd2cSJim Jagielski 	{
313*b1cdbd2cSJim Jagielski 		DBG_ERROR("svx::AccessibleTableShape::modified(), exception caught!");
314*b1cdbd2cSJim Jagielski 	}
315*b1cdbd2cSJim Jagielski }
316*b1cdbd2cSJim Jagielski 
317*b1cdbd2cSJim Jagielski // XEventListener
disposing(const EventObject &)318*b1cdbd2cSJim Jagielski void SAL_CALL AccessibleTableShapeImpl::disposing( const EventObject& /*Source*/ ) throw (RuntimeException)
319*b1cdbd2cSJim Jagielski {
320*b1cdbd2cSJim Jagielski }
321*b1cdbd2cSJim Jagielski 
322*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
323*b1cdbd2cSJim Jagielski // AccessibleTableShape
324*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
325*b1cdbd2cSJim Jagielski 
326*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
327*b1cdbd2cSJim Jagielski 
AccessibleTableShape(const AccessibleShapeInfo & rShapeInfo,const AccessibleShapeTreeInfo & rShapeTreeInfo)328*b1cdbd2cSJim Jagielski AccessibleTableShape::AccessibleTableShape( const AccessibleShapeInfo& rShapeInfo, const AccessibleShapeTreeInfo& rShapeTreeInfo)
329*b1cdbd2cSJim Jagielski : AccessibleTableShape_Base(rShapeInfo, rShapeTreeInfo)
330*b1cdbd2cSJim Jagielski , mnPreviousSelectionCount(0)
331*b1cdbd2cSJim Jagielski , mxImpl( new AccessibleTableShapeImpl( maShapeTreeInfo ) )
332*b1cdbd2cSJim Jagielski {
333*b1cdbd2cSJim Jagielski }
334*b1cdbd2cSJim Jagielski 
335*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
336*b1cdbd2cSJim Jagielski 
~AccessibleTableShape(void)337*b1cdbd2cSJim Jagielski AccessibleTableShape::~AccessibleTableShape (void)
338*b1cdbd2cSJim Jagielski {
339*b1cdbd2cSJim Jagielski }
340*b1cdbd2cSJim Jagielski 
341*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
342*b1cdbd2cSJim Jagielski 
Init()343*b1cdbd2cSJim Jagielski void AccessibleTableShape::Init()
344*b1cdbd2cSJim Jagielski {
345*b1cdbd2cSJim Jagielski 	try
346*b1cdbd2cSJim Jagielski 	{
347*b1cdbd2cSJim Jagielski 		Reference< XPropertySet > xSet( mxShape, UNO_QUERY_THROW );
348*b1cdbd2cSJim Jagielski 		Reference< XTable > xTable( xSet->getPropertyValue(C2U("Model")), UNO_QUERY_THROW );
349*b1cdbd2cSJim Jagielski 
350*b1cdbd2cSJim Jagielski 		mxImpl->init( this, xTable );
351*b1cdbd2cSJim Jagielski 	}
352*b1cdbd2cSJim Jagielski 	catch( Exception& )
353*b1cdbd2cSJim Jagielski 	{
354*b1cdbd2cSJim Jagielski 		DBG_ERROR("AccessibleTableShape::init(), exception caught?");
355*b1cdbd2cSJim Jagielski 	}
356*b1cdbd2cSJim Jagielski 
357*b1cdbd2cSJim Jagielski 	AccessibleTableShape_Base::Init();
358*b1cdbd2cSJim Jagielski }
359*b1cdbd2cSJim Jagielski 
360*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
361*b1cdbd2cSJim Jagielski 
getTableController()362*b1cdbd2cSJim Jagielski SvxTableController* AccessibleTableShape::getTableController()
363*b1cdbd2cSJim Jagielski {
364*b1cdbd2cSJim Jagielski 	SdrView* pView = maShapeTreeInfo.GetSdrView ();
365*b1cdbd2cSJim Jagielski 	if( pView )
366*b1cdbd2cSJim Jagielski 		return dynamic_cast< SvxTableController* >( pView->getSelectionController().get() );
367*b1cdbd2cSJim Jagielski 	else
368*b1cdbd2cSJim Jagielski 		return 0;
369*b1cdbd2cSJim Jagielski }
370*b1cdbd2cSJim Jagielski 
371*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
372*b1cdbd2cSJim Jagielski // XInterface
373*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
374*b1cdbd2cSJim Jagielski 
queryInterface(const Type & aType)375*b1cdbd2cSJim Jagielski Any SAL_CALL AccessibleTableShape::queryInterface( const Type& aType ) throw (RuntimeException)
376*b1cdbd2cSJim Jagielski {
377*b1cdbd2cSJim Jagielski 	if ( aType == ::getCppuType((Reference<XAccessibleTableSelection> *)0) )
378*b1cdbd2cSJim Jagielski     {
379*b1cdbd2cSJim Jagielski 		Reference<XAccessibleTableSelection> xThis( this );
380*b1cdbd2cSJim Jagielski 		Any aRet;
381*b1cdbd2cSJim Jagielski        	aRet <<= xThis;
382*b1cdbd2cSJim Jagielski 		return aRet;
383*b1cdbd2cSJim Jagielski 	}
384*b1cdbd2cSJim Jagielski 	else
385*b1cdbd2cSJim Jagielski 	return AccessibleTableShape_Base::queryInterface( aType );
386*b1cdbd2cSJim Jagielski }
387*b1cdbd2cSJim Jagielski 
388*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
389*b1cdbd2cSJim Jagielski 
acquire()390*b1cdbd2cSJim Jagielski void SAL_CALL AccessibleTableShape::acquire(  ) throw ()
391*b1cdbd2cSJim Jagielski {
392*b1cdbd2cSJim Jagielski 	AccessibleTableShape_Base::acquire();
393*b1cdbd2cSJim Jagielski }
394*b1cdbd2cSJim Jagielski 
395*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
396*b1cdbd2cSJim Jagielski 
release()397*b1cdbd2cSJim Jagielski void SAL_CALL AccessibleTableShape::release(  ) throw ()
398*b1cdbd2cSJim Jagielski {
399*b1cdbd2cSJim Jagielski 	AccessibleTableShape_Base::release();
400*b1cdbd2cSJim Jagielski }
401*b1cdbd2cSJim Jagielski 
402*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
403*b1cdbd2cSJim Jagielski // XAccessible
404*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
405*b1cdbd2cSJim Jagielski 
getAccessibleContext(void)406*b1cdbd2cSJim Jagielski Reference< XAccessibleContext > SAL_CALL AccessibleTableShape::getAccessibleContext(void) throw (RuntimeException)
407*b1cdbd2cSJim Jagielski {
408*b1cdbd2cSJim Jagielski 	return AccessibleShape::getAccessibleContext ();
409*b1cdbd2cSJim Jagielski }
410*b1cdbd2cSJim Jagielski 
411*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
getImplementationName(void)412*b1cdbd2cSJim Jagielski OUString SAL_CALL AccessibleTableShape::getImplementationName(void) throw (RuntimeException)
413*b1cdbd2cSJim Jagielski {
414*b1cdbd2cSJim Jagielski 	return OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.comp.accessibility.AccessibleTableShape" ) );
415*b1cdbd2cSJim Jagielski }
416*b1cdbd2cSJim Jagielski 
417*b1cdbd2cSJim Jagielski //-----------------------------------------------------------------------------
418*b1cdbd2cSJim Jagielski 
CreateAccessibleBaseName(void)419*b1cdbd2cSJim Jagielski OUString AccessibleTableShape::CreateAccessibleBaseName(void) throw (RuntimeException)
420*b1cdbd2cSJim Jagielski {
421*b1cdbd2cSJim Jagielski     return OUString (RTL_CONSTASCII_USTRINGPARAM("TableShape"));
422*b1cdbd2cSJim Jagielski }
423*b1cdbd2cSJim Jagielski 
424*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
425*b1cdbd2cSJim Jagielski 
getAccessibleChildCount()426*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleTableShape::getAccessibleChildCount( ) throw(RuntimeException)
427*b1cdbd2cSJim Jagielski {
428*b1cdbd2cSJim Jagielski     ::vos::OGuard aSolarGuard(::Application::GetSolarMutex());
429*b1cdbd2cSJim Jagielski 	return mxImpl->mxTable.is() ? mxImpl->mxTable->getRowCount() * mxImpl->mxTable->getColumnCount() : 0;
430*b1cdbd2cSJim Jagielski }
431*b1cdbd2cSJim Jagielski 
432*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
getAccessibleChild(sal_Int32 i)433*b1cdbd2cSJim Jagielski Reference< XAccessible > SAL_CALL AccessibleTableShape::getAccessibleChild( sal_Int32 i ) throw(IndexOutOfBoundsException, RuntimeException)
434*b1cdbd2cSJim Jagielski {
435*b1cdbd2cSJim Jagielski     ::vos::OGuard aSolarGuard (::Application::GetSolarMutex());
436*b1cdbd2cSJim Jagielski 	ThrowIfDisposed();
437*b1cdbd2cSJim Jagielski 
438*b1cdbd2cSJim Jagielski 	return mxImpl->getAccessibleChild( i );
439*b1cdbd2cSJim Jagielski }
440*b1cdbd2cSJim Jagielski 
441*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
getAccessibleRelationSet()442*b1cdbd2cSJim Jagielski Reference< XAccessibleRelationSet > SAL_CALL AccessibleTableShape::getAccessibleRelationSet(  ) throw (RuntimeException)
443*b1cdbd2cSJim Jagielski {
444*b1cdbd2cSJim Jagielski 	return AccessibleShape::getAccessibleRelationSet( );
445*b1cdbd2cSJim Jagielski }
446*b1cdbd2cSJim Jagielski 
447*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
448*b1cdbd2cSJim Jagielski 
getAccessibleRole(void)449*b1cdbd2cSJim Jagielski sal_Int16 SAL_CALL AccessibleTableShape::getAccessibleRole (void) throw (RuntimeException)
450*b1cdbd2cSJim Jagielski {
451*b1cdbd2cSJim Jagielski 	return AccessibleRole::TABLE;
452*b1cdbd2cSJim Jagielski }
453*b1cdbd2cSJim Jagielski 
454*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
455*b1cdbd2cSJim Jagielski 
disposing(void)456*b1cdbd2cSJim Jagielski void SAL_CALL AccessibleTableShape::disposing (void)
457*b1cdbd2cSJim Jagielski {
458*b1cdbd2cSJim Jagielski 	mxImpl->dispose();
459*b1cdbd2cSJim Jagielski 
460*b1cdbd2cSJim Jagielski 	// let the base do it's stuff
461*b1cdbd2cSJim Jagielski 	AccessibleShape::disposing();
462*b1cdbd2cSJim Jagielski }
463*b1cdbd2cSJim Jagielski 
464*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
465*b1cdbd2cSJim Jagielski // XAccessibleTable
466*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
467*b1cdbd2cSJim Jagielski 
getAccessibleRowCount()468*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleTableShape::getAccessibleRowCount() throw (RuntimeException)
469*b1cdbd2cSJim Jagielski {
470*b1cdbd2cSJim Jagielski     ::vos::OGuard aSolarGuard (::Application::GetSolarMutex());
471*b1cdbd2cSJim Jagielski 	return mxImpl->mxTable.is() ? mxImpl->mxTable->getRowCount() : 0;
472*b1cdbd2cSJim Jagielski }
473*b1cdbd2cSJim Jagielski 
474*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
475*b1cdbd2cSJim Jagielski 
getAccessibleColumnCount()476*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleTableShape::getAccessibleColumnCount(  ) throw (RuntimeException)
477*b1cdbd2cSJim Jagielski {
478*b1cdbd2cSJim Jagielski     ::vos::OGuard aSolarGuard (::Application::GetSolarMutex());
479*b1cdbd2cSJim Jagielski 	return mxImpl->mxTable.is() ? mxImpl->mxTable->getColumnCount() : 0;
480*b1cdbd2cSJim Jagielski }
481*b1cdbd2cSJim Jagielski 
482*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
483*b1cdbd2cSJim Jagielski 
getAccessibleRowDescription(sal_Int32 nRow)484*b1cdbd2cSJim Jagielski OUString SAL_CALL AccessibleTableShape::getAccessibleRowDescription( sal_Int32 nRow ) throw (IndexOutOfBoundsException, RuntimeException)
485*b1cdbd2cSJim Jagielski {
486*b1cdbd2cSJim Jagielski 	checkCellPosition( 0, nRow );
487*b1cdbd2cSJim Jagielski 	return OUString();
488*b1cdbd2cSJim Jagielski }
489*b1cdbd2cSJim Jagielski 
490*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
491*b1cdbd2cSJim Jagielski 
getAccessibleColumnDescription(sal_Int32 nColumn)492*b1cdbd2cSJim Jagielski OUString SAL_CALL AccessibleTableShape::getAccessibleColumnDescription( sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException)
493*b1cdbd2cSJim Jagielski {
494*b1cdbd2cSJim Jagielski     ::vos::OGuard aSolarGuard (::Application::GetSolarMutex());
495*b1cdbd2cSJim Jagielski 	checkCellPosition( nColumn, 0 );
496*b1cdbd2cSJim Jagielski 	return OUString();
497*b1cdbd2cSJim Jagielski }
498*b1cdbd2cSJim Jagielski 
499*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
500*b1cdbd2cSJim Jagielski 
getAccessibleRowExtentAt(sal_Int32 nRow,sal_Int32 nColumn)501*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleTableShape::getAccessibleRowExtentAt( sal_Int32 nRow, sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException)
502*b1cdbd2cSJim Jagielski {
503*b1cdbd2cSJim Jagielski     ::vos::OGuard aSolarGuard (::Application::GetSolarMutex());
504*b1cdbd2cSJim Jagielski 	checkCellPosition( nColumn, nRow );
505*b1cdbd2cSJim Jagielski 	if( mxImpl->mxTable.is() )
506*b1cdbd2cSJim Jagielski 	{
507*b1cdbd2cSJim Jagielski 		Reference< XMergeableCell > xCell( mxImpl->mxTable->getCellByPosition( nColumn, nRow ), UNO_QUERY );
508*b1cdbd2cSJim Jagielski 		if( xCell.is() )
509*b1cdbd2cSJim Jagielski 			return xCell->getRowSpan();
510*b1cdbd2cSJim Jagielski 	}
511*b1cdbd2cSJim Jagielski 	return 1;
512*b1cdbd2cSJim Jagielski }
513*b1cdbd2cSJim Jagielski 
514*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
515*b1cdbd2cSJim Jagielski 
getAccessibleColumnExtentAt(sal_Int32 nRow,sal_Int32 nColumn)516*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleTableShape::getAccessibleColumnExtentAt( sal_Int32 nRow, sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException)
517*b1cdbd2cSJim Jagielski {
518*b1cdbd2cSJim Jagielski     ::vos::OGuard aSolarGuard (::Application::GetSolarMutex());
519*b1cdbd2cSJim Jagielski 	checkCellPosition( nColumn, nRow );
520*b1cdbd2cSJim Jagielski 	if( mxImpl->mxTable.is() )
521*b1cdbd2cSJim Jagielski 	{
522*b1cdbd2cSJim Jagielski 		Reference< XMergeableCell > xCell( mxImpl->mxTable->getCellByPosition( nColumn, nRow ), UNO_QUERY );
523*b1cdbd2cSJim Jagielski 		if( xCell.is() )
524*b1cdbd2cSJim Jagielski 			return xCell->getColumnSpan();
525*b1cdbd2cSJim Jagielski 	}
526*b1cdbd2cSJim Jagielski 	return 1;
527*b1cdbd2cSJim Jagielski }
528*b1cdbd2cSJim Jagielski 
529*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
530*b1cdbd2cSJim Jagielski 
getAccessibleRowHeaders()531*b1cdbd2cSJim Jagielski Reference< XAccessibleTable > SAL_CALL AccessibleTableShape::getAccessibleRowHeaders(  ) throw (RuntimeException)
532*b1cdbd2cSJim Jagielski {
533*b1cdbd2cSJim Jagielski 	//Reference< XAccessibleTable > xRet( this ); // todo
534*b1cdbd2cSJim Jagielski 	Reference< XAccessibleTable > xRet;
535*b1cdbd2cSJim Jagielski 	SvxTableController* pController = getTableController();
536*b1cdbd2cSJim Jagielski 	if( pController )
537*b1cdbd2cSJim Jagielski 	{
538*b1cdbd2cSJim Jagielski 		if( pController->isRowHeader() )
539*b1cdbd2cSJim Jagielski 		{
540*b1cdbd2cSJim Jagielski 			AccessibleTableHeaderShape* pTableHeader = new AccessibleTableHeaderShape( this, sal_True );
541*b1cdbd2cSJim Jagielski 			xRet.set( pTableHeader );
542*b1cdbd2cSJim Jagielski 		}
543*b1cdbd2cSJim Jagielski 	}
544*b1cdbd2cSJim Jagielski 	return xRet;
545*b1cdbd2cSJim Jagielski }
546*b1cdbd2cSJim Jagielski 
547*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
548*b1cdbd2cSJim Jagielski 
getAccessibleColumnHeaders()549*b1cdbd2cSJim Jagielski Reference< XAccessibleTable > SAL_CALL AccessibleTableShape::getAccessibleColumnHeaders(  ) throw (RuntimeException)
550*b1cdbd2cSJim Jagielski {
551*b1cdbd2cSJim Jagielski 	//Reference< XAccessibleTable > xRet( this ); // todo
552*b1cdbd2cSJim Jagielski 	Reference< XAccessibleTable > xRet;
553*b1cdbd2cSJim Jagielski 	SvxTableController* pController = getTableController();
554*b1cdbd2cSJim Jagielski 	if( pController )
555*b1cdbd2cSJim Jagielski 	{
556*b1cdbd2cSJim Jagielski 		if( pController->isColumnHeader() )
557*b1cdbd2cSJim Jagielski 		{
558*b1cdbd2cSJim Jagielski 			AccessibleTableHeaderShape* pTableHeader = new AccessibleTableHeaderShape( this, sal_False );
559*b1cdbd2cSJim Jagielski 			xRet.set( pTableHeader );
560*b1cdbd2cSJim Jagielski 		}
561*b1cdbd2cSJim Jagielski 	}
562*b1cdbd2cSJim Jagielski 	return xRet;
563*b1cdbd2cSJim Jagielski }
564*b1cdbd2cSJim Jagielski 
565*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
566*b1cdbd2cSJim Jagielski 
getSelectedAccessibleRows()567*b1cdbd2cSJim Jagielski Sequence< sal_Int32 > SAL_CALL AccessibleTableShape::getSelectedAccessibleRows(  ) throw (RuntimeException)
568*b1cdbd2cSJim Jagielski {
569*b1cdbd2cSJim Jagielski 	/*Sequence< sal_Int32 > aRet;*/
570*b1cdbd2cSJim Jagielski 	sal_Int32 nRow = getAccessibleRowCount();
571*b1cdbd2cSJim Jagielski 	::std::vector< sal_Bool > aSelected( nRow, sal_True );
572*b1cdbd2cSJim Jagielski 	sal_Int32 nCount = nRow;
573*b1cdbd2cSJim Jagielski 	for( sal_Int32 i = 0; i < nRow; i++ )
574*b1cdbd2cSJim Jagielski 	{
575*b1cdbd2cSJim Jagielski 		try
576*b1cdbd2cSJim Jagielski 		{
577*b1cdbd2cSJim Jagielski 			aSelected[i] = isAccessibleRowSelected( i );
578*b1cdbd2cSJim Jagielski 		}
579*b1cdbd2cSJim Jagielski 		catch( ... )
580*b1cdbd2cSJim Jagielski 		{
581*b1cdbd2cSJim Jagielski 			return Sequence< sal_Int32 >();
582*b1cdbd2cSJim Jagielski 		}
583*b1cdbd2cSJim Jagielski 
584*b1cdbd2cSJim Jagielski 		if( !aSelected[i] )
585*b1cdbd2cSJim Jagielski 			nCount--;
586*b1cdbd2cSJim Jagielski 	}
587*b1cdbd2cSJim Jagielski 	Sequence < sal_Int32 > aRet( nCount );
588*b1cdbd2cSJim Jagielski 	sal_Int32 *pRet = aRet.getArray();
589*b1cdbd2cSJim Jagielski 	sal_Int32 nPos = 0;
590*b1cdbd2cSJim Jagielski 	size_t nSize = aSelected.size();
591*b1cdbd2cSJim Jagielski 	for( size_t i=0; i < nSize && nPos < nCount; i++ )
592*b1cdbd2cSJim Jagielski 	{
593*b1cdbd2cSJim Jagielski 		if( aSelected[i] )
594*b1cdbd2cSJim Jagielski 		{
595*b1cdbd2cSJim Jagielski 			*pRet++ = i;
596*b1cdbd2cSJim Jagielski 			nPos++;
597*b1cdbd2cSJim Jagielski 		}
598*b1cdbd2cSJim Jagielski 	}
599*b1cdbd2cSJim Jagielski 
600*b1cdbd2cSJim Jagielski 	return aRet;
601*b1cdbd2cSJim Jagielski }
602*b1cdbd2cSJim Jagielski 
603*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
604*b1cdbd2cSJim Jagielski 
getSelectedAccessibleColumns()605*b1cdbd2cSJim Jagielski Sequence< sal_Int32 > SAL_CALL AccessibleTableShape::getSelectedAccessibleColumns(  ) throw (RuntimeException)
606*b1cdbd2cSJim Jagielski {
607*b1cdbd2cSJim Jagielski 	/*Sequence< sal_Int32 > aRet;*/
608*b1cdbd2cSJim Jagielski 	sal_Int32 nColumn = getAccessibleColumnCount();
609*b1cdbd2cSJim Jagielski 	::std::vector< sal_Bool > aSelected( nColumn, sal_True );
610*b1cdbd2cSJim Jagielski 	sal_Int32 nCount = nColumn;
611*b1cdbd2cSJim Jagielski 	for( sal_Int32 i = 0; i < nColumn; i++ )
612*b1cdbd2cSJim Jagielski 	{
613*b1cdbd2cSJim Jagielski 		try
614*b1cdbd2cSJim Jagielski 		{
615*b1cdbd2cSJim Jagielski 			aSelected[i] = isAccessibleColumnSelected( i );
616*b1cdbd2cSJim Jagielski 		}
617*b1cdbd2cSJim Jagielski 		catch( ... )
618*b1cdbd2cSJim Jagielski 		{
619*b1cdbd2cSJim Jagielski 			return Sequence< sal_Int32 >();
620*b1cdbd2cSJim Jagielski 		}
621*b1cdbd2cSJim Jagielski 
622*b1cdbd2cSJim Jagielski 		if( !aSelected[i] )
623*b1cdbd2cSJim Jagielski 			nCount--;
624*b1cdbd2cSJim Jagielski 	}
625*b1cdbd2cSJim Jagielski 	Sequence < sal_Int32 > aRet( nCount );
626*b1cdbd2cSJim Jagielski 	sal_Int32 *pRet = aRet.getArray();
627*b1cdbd2cSJim Jagielski 	sal_Int32 nPos = 0;
628*b1cdbd2cSJim Jagielski 	size_t nSize = aSelected.size();
629*b1cdbd2cSJim Jagielski 	for( size_t i=0; i < nSize && nPos < nCount; i++ )
630*b1cdbd2cSJim Jagielski 	{
631*b1cdbd2cSJim Jagielski 		if( aSelected[i] )
632*b1cdbd2cSJim Jagielski 		{
633*b1cdbd2cSJim Jagielski 			*pRet++ = i;
634*b1cdbd2cSJim Jagielski 			nPos++;
635*b1cdbd2cSJim Jagielski 		}
636*b1cdbd2cSJim Jagielski 	}
637*b1cdbd2cSJim Jagielski 
638*b1cdbd2cSJim Jagielski 	return aRet;
639*b1cdbd2cSJim Jagielski }
640*b1cdbd2cSJim Jagielski 
641*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
642*b1cdbd2cSJim Jagielski 
isAccessibleRowSelected(sal_Int32 nRow)643*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL AccessibleTableShape::isAccessibleRowSelected( sal_Int32 nRow ) throw (IndexOutOfBoundsException, RuntimeException)
644*b1cdbd2cSJim Jagielski {
645*b1cdbd2cSJim Jagielski     ::vos::OGuard aSolarGuard (::Application::GetSolarMutex());
646*b1cdbd2cSJim Jagielski 	checkCellPosition( 0, nRow );
647*b1cdbd2cSJim Jagielski 	SvxTableController* pController = getTableController();
648*b1cdbd2cSJim Jagielski 	if( pController )
649*b1cdbd2cSJim Jagielski 	{
650*b1cdbd2cSJim Jagielski 		return pController->isRowSelected( nRow );
651*b1cdbd2cSJim Jagielski 	}
652*b1cdbd2cSJim Jagielski 	return sal_False;
653*b1cdbd2cSJim Jagielski }
654*b1cdbd2cSJim Jagielski 
655*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
656*b1cdbd2cSJim Jagielski 
isAccessibleColumnSelected(sal_Int32 nColumn)657*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL AccessibleTableShape::isAccessibleColumnSelected( sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException)
658*b1cdbd2cSJim Jagielski {
659*b1cdbd2cSJim Jagielski     ::vos::OGuard aSolarGuard (::Application::GetSolarMutex());
660*b1cdbd2cSJim Jagielski 	checkCellPosition( nColumn, 0 );
661*b1cdbd2cSJim Jagielski 	SvxTableController* pController = getTableController();
662*b1cdbd2cSJim Jagielski 	if( pController )
663*b1cdbd2cSJim Jagielski 	{
664*b1cdbd2cSJim Jagielski 		return pController->isColumnSelected( nColumn );
665*b1cdbd2cSJim Jagielski 	}
666*b1cdbd2cSJim Jagielski 	return sal_False;
667*b1cdbd2cSJim Jagielski }
668*b1cdbd2cSJim Jagielski 
669*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
670*b1cdbd2cSJim Jagielski 
getAccessibleCellAt(sal_Int32 nRow,sal_Int32 nColumn)671*b1cdbd2cSJim Jagielski Reference< XAccessible > SAL_CALL AccessibleTableShape::getAccessibleCellAt( sal_Int32 nRow, sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException)
672*b1cdbd2cSJim Jagielski {
673*b1cdbd2cSJim Jagielski     ::vos::OGuard aSolarGuard (::Application::GetSolarMutex());
674*b1cdbd2cSJim Jagielski 	checkCellPosition( nColumn, nRow );
675*b1cdbd2cSJim Jagielski 
676*b1cdbd2cSJim Jagielski     sal_Int32 nChildIndex = 0;
677*b1cdbd2cSJim Jagielski 	if( mxImpl->mxTable.is() )
678*b1cdbd2cSJim Jagielski 		nChildIndex = mxImpl->mxTable->getColumnCount() * nRow + nColumn;
679*b1cdbd2cSJim Jagielski 
680*b1cdbd2cSJim Jagielski     return getAccessibleChild( nChildIndex );
681*b1cdbd2cSJim Jagielski }
682*b1cdbd2cSJim Jagielski 
683*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
684*b1cdbd2cSJim Jagielski 
getAccessibleCaption()685*b1cdbd2cSJim Jagielski Reference< XAccessible > SAL_CALL AccessibleTableShape::getAccessibleCaption(  ) throw (RuntimeException)
686*b1cdbd2cSJim Jagielski {
687*b1cdbd2cSJim Jagielski 	Reference< XAccessible > xRet;
688*b1cdbd2cSJim Jagielski 	return xRet;
689*b1cdbd2cSJim Jagielski }
690*b1cdbd2cSJim Jagielski 
691*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
692*b1cdbd2cSJim Jagielski 
getAccessibleSummary()693*b1cdbd2cSJim Jagielski Reference< XAccessible > SAL_CALL AccessibleTableShape::getAccessibleSummary(  ) throw (RuntimeException)
694*b1cdbd2cSJim Jagielski {
695*b1cdbd2cSJim Jagielski 	Reference< XAccessible > xRet;
696*b1cdbd2cSJim Jagielski 	return xRet;
697*b1cdbd2cSJim Jagielski }
698*b1cdbd2cSJim Jagielski 
699*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
700*b1cdbd2cSJim Jagielski 
isAccessibleSelected(sal_Int32 nRow,sal_Int32 nColumn)701*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL AccessibleTableShape::isAccessibleSelected( sal_Int32 nRow, sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException)
702*b1cdbd2cSJim Jagielski {
703*b1cdbd2cSJim Jagielski     ::vos::OGuard aSolarGuard (::Application::GetSolarMutex());
704*b1cdbd2cSJim Jagielski 	checkCellPosition( nColumn, nRow );
705*b1cdbd2cSJim Jagielski 
706*b1cdbd2cSJim Jagielski 	SvxTableController* pController = getTableController();
707*b1cdbd2cSJim Jagielski 	if( pController && pController->hasSelectedCells() )
708*b1cdbd2cSJim Jagielski 	{
709*b1cdbd2cSJim Jagielski 		CellPos aFirstPos, aLastPos;
710*b1cdbd2cSJim Jagielski 		pController->getSelectedCells( aFirstPos, aLastPos );
711*b1cdbd2cSJim Jagielski 		if( (aFirstPos.mnRow <= nRow) && (aFirstPos.mnCol <= nColumn) && (nRow <= aLastPos.mnRow) && (nColumn <= aLastPos.mnCol) )
712*b1cdbd2cSJim Jagielski 			return sal_True;
713*b1cdbd2cSJim Jagielski 	}
714*b1cdbd2cSJim Jagielski 
715*b1cdbd2cSJim Jagielski 	return sal_False;
716*b1cdbd2cSJim Jagielski }
717*b1cdbd2cSJim Jagielski 
718*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
719*b1cdbd2cSJim Jagielski 
getAccessibleIndex(sal_Int32 nRow,sal_Int32 nColumn)720*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleTableShape::getAccessibleIndex( sal_Int32 nRow, sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException)
721*b1cdbd2cSJim Jagielski {
722*b1cdbd2cSJim Jagielski     ::vos::OGuard aSolarGuard (::Application::GetSolarMutex());
723*b1cdbd2cSJim Jagielski 	checkCellPosition( nColumn, nRow );
724*b1cdbd2cSJim Jagielski 	return  mxImpl->mxTable.is() ? (nRow * mxImpl->mxTable->getColumnCount() + nColumn) : 0;
725*b1cdbd2cSJim Jagielski }
726*b1cdbd2cSJim Jagielski 
727*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
728*b1cdbd2cSJim Jagielski 
getAccessibleRow(sal_Int32 nChildIndex)729*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleTableShape::getAccessibleRow( sal_Int32 nChildIndex ) throw (IndexOutOfBoundsException, RuntimeException)
730*b1cdbd2cSJim Jagielski {
731*b1cdbd2cSJim Jagielski     ::vos::OGuard aSolarGuard (::Application::GetSolarMutex());
732*b1cdbd2cSJim Jagielski 	sal_Int32 nColumn = 0, nRow = 0;
733*b1cdbd2cSJim Jagielski 	mxImpl->getColumnAndRow( nChildIndex, nColumn, nRow );
734*b1cdbd2cSJim Jagielski 	return nRow;
735*b1cdbd2cSJim Jagielski }
736*b1cdbd2cSJim Jagielski 
737*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
738*b1cdbd2cSJim Jagielski 
getAccessibleColumn(sal_Int32 nChildIndex)739*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleTableShape::getAccessibleColumn( sal_Int32 nChildIndex ) throw (IndexOutOfBoundsException, RuntimeException)
740*b1cdbd2cSJim Jagielski {
741*b1cdbd2cSJim Jagielski     ::vos::OGuard aSolarGuard (::Application::GetSolarMutex());
742*b1cdbd2cSJim Jagielski 	sal_Int32 nColumn = 0, nRow = 0;
743*b1cdbd2cSJim Jagielski 	mxImpl->getColumnAndRow( nChildIndex, nColumn, nRow );
744*b1cdbd2cSJim Jagielski 	//return nChildIndex;
745*b1cdbd2cSJim Jagielski 	return nColumn;
746*b1cdbd2cSJim Jagielski }
747*b1cdbd2cSJim Jagielski 
748*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
749*b1cdbd2cSJim Jagielski // XAccessibleSelection
750*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
751*b1cdbd2cSJim Jagielski 
selectAccessibleChild(sal_Int32 nChildIndex)752*b1cdbd2cSJim Jagielski void SAL_CALL AccessibleTableShape::selectAccessibleChild( sal_Int32 nChildIndex ) throw ( IndexOutOfBoundsException, RuntimeException )
753*b1cdbd2cSJim Jagielski {
754*b1cdbd2cSJim Jagielski     ::vos::OGuard aSolarGuard (::Application::GetSolarMutex());
755*b1cdbd2cSJim Jagielski 	CellPos aPos;
756*b1cdbd2cSJim Jagielski 	mxImpl->getColumnAndRow( nChildIndex, aPos.mnCol, aPos.mnRow );
757*b1cdbd2cSJim Jagielski 
758*b1cdbd2cSJim Jagielski 	// todo, select table shape?!?
759*b1cdbd2cSJim Jagielski 	SvxTableController* pController = getTableController();
760*b1cdbd2cSJim Jagielski 	if( pController )
761*b1cdbd2cSJim Jagielski 	{
762*b1cdbd2cSJim Jagielski 		CellPos aFirstPos( aPos ), aLastPos( aPos );
763*b1cdbd2cSJim Jagielski 		if( pController->hasSelectedCells() )
764*b1cdbd2cSJim Jagielski 		{
765*b1cdbd2cSJim Jagielski 			pController->getSelectedCells( aFirstPos, aLastPos );
766*b1cdbd2cSJim Jagielski 
767*b1cdbd2cSJim Jagielski 			aFirstPos.mnRow = std::min( aFirstPos.mnRow, aPos.mnRow );
768*b1cdbd2cSJim Jagielski 			aFirstPos.mnCol = std::min( aFirstPos.mnCol, aPos.mnCol );
769*b1cdbd2cSJim Jagielski 			aLastPos.mnRow = std::max( aLastPos.mnRow, aPos.mnRow );
770*b1cdbd2cSJim Jagielski 			aLastPos.mnCol = std::max( aLastPos.mnCol, aPos.mnCol );
771*b1cdbd2cSJim Jagielski 		}
772*b1cdbd2cSJim Jagielski 		pController->setSelectedCells( aFirstPos, aLastPos );
773*b1cdbd2cSJim Jagielski 	}
774*b1cdbd2cSJim Jagielski }
775*b1cdbd2cSJim Jagielski 
776*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
777*b1cdbd2cSJim Jagielski 
isAccessibleChildSelected(sal_Int32 nChildIndex)778*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL AccessibleTableShape::isAccessibleChildSelected( sal_Int32 nChildIndex ) throw ( IndexOutOfBoundsException, RuntimeException )
779*b1cdbd2cSJim Jagielski {
780*b1cdbd2cSJim Jagielski     ::vos::OGuard aSolarGuard (::Application::GetSolarMutex());
781*b1cdbd2cSJim Jagielski 	CellPos aPos;
782*b1cdbd2cSJim Jagielski 	mxImpl->getColumnAndRow( nChildIndex, aPos.mnCol, aPos.mnRow );
783*b1cdbd2cSJim Jagielski 
784*b1cdbd2cSJim Jagielski 	// Para order is not correct
785*b1cdbd2cSJim Jagielski 	//return isAccessibleSelected(aPos.mnCol, aPos.mnRow);
786*b1cdbd2cSJim Jagielski 	return isAccessibleSelected(aPos.mnRow, aPos.mnCol);
787*b1cdbd2cSJim Jagielski }
788*b1cdbd2cSJim Jagielski 
789*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
790*b1cdbd2cSJim Jagielski 
clearAccessibleSelection()791*b1cdbd2cSJim Jagielski void SAL_CALL AccessibleTableShape::clearAccessibleSelection() throw ( RuntimeException )
792*b1cdbd2cSJim Jagielski {
793*b1cdbd2cSJim Jagielski    ::vos::OGuard aSolarGuard (::Application::GetSolarMutex());
794*b1cdbd2cSJim Jagielski 
795*b1cdbd2cSJim Jagielski 	SvxTableController* pController = getTableController();
796*b1cdbd2cSJim Jagielski 	if( pController )
797*b1cdbd2cSJim Jagielski 		pController->clearSelection();
798*b1cdbd2cSJim Jagielski }
799*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
800*b1cdbd2cSJim Jagielski 
selectAllAccessibleChildren()801*b1cdbd2cSJim Jagielski void SAL_CALL AccessibleTableShape::selectAllAccessibleChildren() throw ( RuntimeException )
802*b1cdbd2cSJim Jagielski {
803*b1cdbd2cSJim Jagielski    ::vos::OGuard aSolarGuard (::Application::GetSolarMutex());
804*b1cdbd2cSJim Jagielski 
805*b1cdbd2cSJim Jagielski    // todo: force selection of shape?
806*b1cdbd2cSJim Jagielski 	SvxTableController* pController = getTableController();
807*b1cdbd2cSJim Jagielski 	if( pController )
808*b1cdbd2cSJim Jagielski 		pController->selectAll();
809*b1cdbd2cSJim Jagielski }
810*b1cdbd2cSJim Jagielski 
811*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
812*b1cdbd2cSJim Jagielski 
getSelectedAccessibleChildCount()813*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleTableShape::getSelectedAccessibleChildCount() throw ( RuntimeException )
814*b1cdbd2cSJim Jagielski {
815*b1cdbd2cSJim Jagielski     ::vos::OGuard aSolarGuard (::Application::GetSolarMutex());
816*b1cdbd2cSJim Jagielski 
817*b1cdbd2cSJim Jagielski 	SvxTableController* pController = getTableController();
818*b1cdbd2cSJim Jagielski 	if( pController && pController->hasSelectedCells() )
819*b1cdbd2cSJim Jagielski 	{
820*b1cdbd2cSJim Jagielski 		CellPos aFirstPos, aLastPos;
821*b1cdbd2cSJim Jagielski 		pController->getSelectedCells( aFirstPos, aLastPos );
822*b1cdbd2cSJim Jagielski 
823*b1cdbd2cSJim Jagielski 		const sal_Int32 nSelectedColumns = std::max( (sal_Int32)0, aLastPos.mnCol - aFirstPos.mnCol ) + 1;
824*b1cdbd2cSJim Jagielski 		const sal_Int32 nSelectedRows = std::max( (sal_Int32)0, aLastPos.mnRow - aFirstPos.mnRow ) + 1;
825*b1cdbd2cSJim Jagielski 		return nSelectedRows * nSelectedColumns;
826*b1cdbd2cSJim Jagielski 	}
827*b1cdbd2cSJim Jagielski 
828*b1cdbd2cSJim Jagielski 	return 0;
829*b1cdbd2cSJim Jagielski }
830*b1cdbd2cSJim Jagielski 
831*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
832*b1cdbd2cSJim Jagielski 
getSelectedAccessibleChild(sal_Int32 nSelectedChildIndex)833*b1cdbd2cSJim Jagielski Reference< XAccessible > SAL_CALL AccessibleTableShape::getSelectedAccessibleChild( sal_Int32 nSelectedChildIndex ) throw ( IndexOutOfBoundsException, RuntimeException)
834*b1cdbd2cSJim Jagielski {
835*b1cdbd2cSJim Jagielski     ::vos::OGuard aSolarGuard (::Application::GetSolarMutex());
836*b1cdbd2cSJim Jagielski 
837*b1cdbd2cSJim Jagielski 	/*SvxTableController* pController = getTableController();
838*b1cdbd2cSJim Jagielski 	if( pController && pController->hasSelectedCells() )
839*b1cdbd2cSJim Jagielski 	{
840*b1cdbd2cSJim Jagielski 		CellPos aFirstPos, aLastPos;
841*b1cdbd2cSJim Jagielski 		pController->getSelectedCells( aFirstPos, aLastPos );
842*b1cdbd2cSJim Jagielski 
843*b1cdbd2cSJim Jagielski 		const sal_Int32 nSelectedColumns = std::max( (sal_Int32)0, aLastPos.mnCol - aFirstPos.mnCol ) + 1;
844*b1cdbd2cSJim Jagielski 		const sal_Int32 nSelectedRows = std::max( (sal_Int32)0, aLastPos.mnRow - aFirstPos.mnRow ) + 1;
845*b1cdbd2cSJim Jagielski 
846*b1cdbd2cSJim Jagielski 		if( nSelectedChildIndex < (nSelectedRows * nSelectedColumns) )
847*b1cdbd2cSJim Jagielski 		{
848*b1cdbd2cSJim Jagielski 			while( nSelectedChildIndex >= nSelectedColumns )
849*b1cdbd2cSJim Jagielski 			{
850*b1cdbd2cSJim Jagielski 				aFirstPos.mnRow++;
851*b1cdbd2cSJim Jagielski 				nSelectedChildIndex -= nSelectedColumns;
852*b1cdbd2cSJim Jagielski 			}
853*b1cdbd2cSJim Jagielski 			return getAccessibleCellAt( nSelectedColumns, aFirstPos.mnRow );
854*b1cdbd2cSJim Jagielski 		}
855*b1cdbd2cSJim Jagielski 	}
856*b1cdbd2cSJim Jagielski 
857*b1cdbd2cSJim Jagielski 	throw IndexOutOfBoundsException();
858*b1cdbd2cSJim Jagielski 	*/
859*b1cdbd2cSJim Jagielski 	if( nSelectedChildIndex < 0 )
860*b1cdbd2cSJim Jagielski         throw IndexOutOfBoundsException();
861*b1cdbd2cSJim Jagielski 
862*b1cdbd2cSJim Jagielski 	sal_Int32 nChildIndex = GetIndexOfSelectedChild( nSelectedChildIndex );
863*b1cdbd2cSJim Jagielski 
864*b1cdbd2cSJim Jagielski 	if( nChildIndex < 0 )
865*b1cdbd2cSJim Jagielski         throw IndexOutOfBoundsException();
866*b1cdbd2cSJim Jagielski 
867*b1cdbd2cSJim Jagielski 	if ( nChildIndex >= getAccessibleChildCount() )
868*b1cdbd2cSJim Jagielski     {
869*b1cdbd2cSJim Jagielski         throw IndexOutOfBoundsException();
870*b1cdbd2cSJim Jagielski     }
871*b1cdbd2cSJim Jagielski 
872*b1cdbd2cSJim Jagielski 	return getAccessibleChild( nChildIndex );
873*b1cdbd2cSJim Jagielski }
874*b1cdbd2cSJim Jagielski 
875*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
876*b1cdbd2cSJim Jagielski 
deselectAccessibleChild(sal_Int32 nChildIndex)877*b1cdbd2cSJim Jagielski void SAL_CALL AccessibleTableShape::deselectAccessibleChild( sal_Int32 nChildIndex )  throw ( IndexOutOfBoundsException, RuntimeException )
878*b1cdbd2cSJim Jagielski {
879*b1cdbd2cSJim Jagielski    ::vos::OGuard aSolarGuard (::Application::GetSolarMutex());
880*b1cdbd2cSJim Jagielski 	CellPos aPos;
881*b1cdbd2cSJim Jagielski 	mxImpl->getColumnAndRow( nChildIndex, aPos.mnCol, aPos.mnRow );
882*b1cdbd2cSJim Jagielski 
883*b1cdbd2cSJim Jagielski 	// todo, select table shape?!?
884*b1cdbd2cSJim Jagielski 	SvxTableController* pController = getTableController();
885*b1cdbd2cSJim Jagielski 	if( pController && pController->hasSelectedCells() )
886*b1cdbd2cSJim Jagielski 	{
887*b1cdbd2cSJim Jagielski 		CellPos aFirstPos, aLastPos;
888*b1cdbd2cSJim Jagielski 		pController->getSelectedCells( aFirstPos, aLastPos );
889*b1cdbd2cSJim Jagielski 
890*b1cdbd2cSJim Jagielski 		// create a selection where aPos is not part of anymore
891*b1cdbd2cSJim Jagielski 		aFirstPos.mnRow = std::min( aFirstPos.mnRow, aPos.mnRow+1 );
892*b1cdbd2cSJim Jagielski 		aFirstPos.mnCol = std::min( aFirstPos.mnCol, aPos.mnCol+1 );
893*b1cdbd2cSJim Jagielski 		aLastPos.mnRow = std::max( aLastPos.mnRow, aPos.mnRow-1 );
894*b1cdbd2cSJim Jagielski 		aLastPos.mnCol = std::max( aLastPos.mnCol, aPos.mnCol-1 );
895*b1cdbd2cSJim Jagielski 
896*b1cdbd2cSJim Jagielski 		// new selection may be invalid (child to deselect is not at a border of the selection but in between)
897*b1cdbd2cSJim Jagielski 		if( (aFirstPos.mnRow > aLastPos.mnRow) || (aFirstPos.mnCol > aLastPos.mnCol) )
898*b1cdbd2cSJim Jagielski 			pController->clearSelection(); // if selection is invalid, clear all
899*b1cdbd2cSJim Jagielski 		else
900*b1cdbd2cSJim Jagielski 			pController->setSelectedCells( aFirstPos, aLastPos );
901*b1cdbd2cSJim Jagielski 	}
902*b1cdbd2cSJim Jagielski }
903*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
904*b1cdbd2cSJim Jagielski 
905*b1cdbd2cSJim Jagielski //=====  XAccessibleTableSelection  ============================================
selectRow(sal_Int32 row)906*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL AccessibleTableShape::selectRow( sal_Int32 row )
907*b1cdbd2cSJim Jagielski throw (IndexOutOfBoundsException, RuntimeException)
908*b1cdbd2cSJim Jagielski {
909*b1cdbd2cSJim Jagielski 	::vos::OGuard aSolarGuard (::Application::GetSolarMutex());
910*b1cdbd2cSJim Jagielski 	SvxTableController* pController = getTableController();
911*b1cdbd2cSJim Jagielski 	if( !pController )
912*b1cdbd2cSJim Jagielski 		return sal_False;
913*b1cdbd2cSJim Jagielski 	return pController->selectRow( row );
914*b1cdbd2cSJim Jagielski }
selectColumn(sal_Int32 column)915*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL AccessibleTableShape::selectColumn( sal_Int32 column )
916*b1cdbd2cSJim Jagielski throw (IndexOutOfBoundsException, RuntimeException)
917*b1cdbd2cSJim Jagielski {
918*b1cdbd2cSJim Jagielski 	::vos::OGuard aSolarGuard (::Application::GetSolarMutex());
919*b1cdbd2cSJim Jagielski 	SvxTableController* pController = getTableController();
920*b1cdbd2cSJim Jagielski 	if( !pController )
921*b1cdbd2cSJim Jagielski 		return sal_False;
922*b1cdbd2cSJim Jagielski 	return pController->selectColumn( column );
923*b1cdbd2cSJim Jagielski }
unselectRow(sal_Int32 row)924*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL AccessibleTableShape::unselectRow( sal_Int32 row )
925*b1cdbd2cSJim Jagielski throw (IndexOutOfBoundsException, RuntimeException)
926*b1cdbd2cSJim Jagielski {
927*b1cdbd2cSJim Jagielski 	::vos::OGuard aSolarGuard (::Application::GetSolarMutex());
928*b1cdbd2cSJim Jagielski 	SvxTableController* pController = getTableController();
929*b1cdbd2cSJim Jagielski 	if( !pController )
930*b1cdbd2cSJim Jagielski 		return sal_False;
931*b1cdbd2cSJim Jagielski 	return pController->deselectRow( row );
932*b1cdbd2cSJim Jagielski }
unselectColumn(sal_Int32 column)933*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL AccessibleTableShape::unselectColumn( sal_Int32 column )
934*b1cdbd2cSJim Jagielski throw (IndexOutOfBoundsException, RuntimeException)
935*b1cdbd2cSJim Jagielski {
936*b1cdbd2cSJim Jagielski 	::vos::OGuard aSolarGuard (::Application::GetSolarMutex());
937*b1cdbd2cSJim Jagielski 	SvxTableController* pController = getTableController();
938*b1cdbd2cSJim Jagielski 	if( !pController )
939*b1cdbd2cSJim Jagielski 		return sal_False;
940*b1cdbd2cSJim Jagielski 	return pController->deselectColumn( column );
941*b1cdbd2cSJim Jagielski }
GetIndexOfSelectedChild(sal_Int32 nSelectedChildIndex) const942*b1cdbd2cSJim Jagielski sal_Int32 AccessibleTableShape::GetIndexOfSelectedChild(
943*b1cdbd2cSJim Jagielski 				sal_Int32 nSelectedChildIndex ) const
944*b1cdbd2cSJim Jagielski {
945*b1cdbd2cSJim Jagielski     sal_Int32 nChildren = const_cast<AccessibleTableShape*>(this)->getAccessibleChildCount();
946*b1cdbd2cSJim Jagielski 
947*b1cdbd2cSJim Jagielski 	if( nSelectedChildIndex >= nChildren )
948*b1cdbd2cSJim Jagielski 		return -1L;
949*b1cdbd2cSJim Jagielski 
950*b1cdbd2cSJim Jagielski     sal_Int32 n = 0;
951*b1cdbd2cSJim Jagielski     while( n < nChildren )
952*b1cdbd2cSJim Jagielski     {
953*b1cdbd2cSJim Jagielski         if( const_cast<AccessibleTableShape*>(this)->isAccessibleChildSelected( n ) )
954*b1cdbd2cSJim Jagielski 		{
955*b1cdbd2cSJim Jagielski 			if( 0 == nSelectedChildIndex )
956*b1cdbd2cSJim Jagielski 				break;
957*b1cdbd2cSJim Jagielski 			else
958*b1cdbd2cSJim Jagielski 				--nSelectedChildIndex;
959*b1cdbd2cSJim Jagielski 		}
960*b1cdbd2cSJim Jagielski         ++n;
961*b1cdbd2cSJim Jagielski     }
962*b1cdbd2cSJim Jagielski 
963*b1cdbd2cSJim Jagielski 	return n < nChildren ? n : -1L;
964*b1cdbd2cSJim Jagielski }
getColumnAndRow(sal_Int32 nChildIndex,sal_Int32 & rnColumn,sal_Int32 & rnRow)965*b1cdbd2cSJim Jagielski void AccessibleTableShape::getColumnAndRow( sal_Int32 nChildIndex, sal_Int32& rnColumn, sal_Int32& rnRow ) throw (IndexOutOfBoundsException )
966*b1cdbd2cSJim Jagielski {
967*b1cdbd2cSJim Jagielski 	mxImpl->getColumnAndRow(nChildIndex, rnColumn, rnRow);
968*b1cdbd2cSJim Jagielski }
969*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
970*b1cdbd2cSJim Jagielski // XSelectionChangeListener
971*b1cdbd2cSJim Jagielski void SAL_CALL
disposing(const EventObject & aEvent)972*b1cdbd2cSJim Jagielski     AccessibleTableShape::disposing (const EventObject& aEvent)
973*b1cdbd2cSJim Jagielski     throw (RuntimeException)
974*b1cdbd2cSJim Jagielski {
975*b1cdbd2cSJim Jagielski 	AccessibleShape::disposing(aEvent);
976*b1cdbd2cSJim Jagielski }
selectionChanged(const EventObject & rEvent)977*b1cdbd2cSJim Jagielski void  SAL_CALL AccessibleTableShape::selectionChanged (const EventObject& rEvent)
978*b1cdbd2cSJim Jagielski         throw (RuntimeException)
979*b1cdbd2cSJim Jagielski {
980*b1cdbd2cSJim Jagielski 	//::sdr::table::CellRef xCellRef = static_cast< ::sdr::table::CellRef > (rEvent.Source);
981*b1cdbd2cSJim Jagielski 	Reference< XCell > xCell(rEvent.Source, UNO_QUERY);
982*b1cdbd2cSJim Jagielski 	if (xCell.is())
983*b1cdbd2cSJim Jagielski 	{
984*b1cdbd2cSJim Jagielski 		Reference< AccessibleCell > xAccCell = mxImpl->getAccessibleCell( xCell );
985*b1cdbd2cSJim Jagielski 		if (xAccCell.is())
986*b1cdbd2cSJim Jagielski 		{
987*b1cdbd2cSJim Jagielski 			sal_Int32 nIndex = xAccCell->getAccessibleIndexInParent(),
988*b1cdbd2cSJim Jagielski 				nCount = getSelectedAccessibleChildCount();
989*b1cdbd2cSJim Jagielski 			sal_Bool bSelected = isAccessibleChildSelected(nIndex);
990*b1cdbd2cSJim Jagielski 			if (mnPreviousSelectionCount == 0 && nCount > 0 && bSelected)
991*b1cdbd2cSJim Jagielski 			{
992*b1cdbd2cSJim Jagielski 				xAccCell->SetState(AccessibleStateType::SELECTED);
993*b1cdbd2cSJim Jagielski 				xAccCell->CommitChange(AccessibleEventId::SELECTION_CHANGED, Any(), Any());
994*b1cdbd2cSJim Jagielski 			}
995*b1cdbd2cSJim Jagielski 			else if (bSelected)
996*b1cdbd2cSJim Jagielski 			{
997*b1cdbd2cSJim Jagielski 				xAccCell->SetState(AccessibleStateType::SELECTED);
998*b1cdbd2cSJim Jagielski 				xAccCell->CommitChange(AccessibleEventId::SELECTION_CHANGED_ADD, Any(), Any());
999*b1cdbd2cSJim Jagielski 			}
1000*b1cdbd2cSJim Jagielski 			else
1001*b1cdbd2cSJim Jagielski 			{
1002*b1cdbd2cSJim Jagielski 				xAccCell->ResetState(AccessibleStateType::SELECTED);
1003*b1cdbd2cSJim Jagielski 				xAccCell->CommitChange(AccessibleEventId::SELECTION_CHANGED_REMOVE, Any(), Any());
1004*b1cdbd2cSJim Jagielski 			}
1005*b1cdbd2cSJim Jagielski 			mnPreviousSelectionCount = nCount;
1006*b1cdbd2cSJim Jagielski 		}
1007*b1cdbd2cSJim Jagielski 	}
1008*b1cdbd2cSJim Jagielski }
1009*b1cdbd2cSJim Jagielski // Get the currently active cell which is text editing
GetActiveAccessibleCell()1010*b1cdbd2cSJim Jagielski AccessibleCell* AccessibleTableShape::GetActiveAccessibleCell()
1011*b1cdbd2cSJim Jagielski {
1012*b1cdbd2cSJim Jagielski 	sal_Bool bCellEditing = sal_False;
1013*b1cdbd2cSJim Jagielski 	Reference< AccessibleCell > xAccCell;
1014*b1cdbd2cSJim Jagielski 	AccessibleCell* pAccCell = NULL;
1015*b1cdbd2cSJim Jagielski 	SvxTableController* pController = getTableController();
1016*b1cdbd2cSJim Jagielski 	if (pController)
1017*b1cdbd2cSJim Jagielski 	{
1018*b1cdbd2cSJim Jagielski 		::sdr::table::SdrTableObj* pTableObj = pController->GetTableObj();
1019*b1cdbd2cSJim Jagielski 		if ( pTableObj )
1020*b1cdbd2cSJim Jagielski 		{
1021*b1cdbd2cSJim Jagielski 			::sdr::table::CellRef xCellRef (pTableObj->getActiveCell());
1022*b1cdbd2cSJim Jagielski 			if ( xCellRef.is() )
1023*b1cdbd2cSJim Jagielski 			{
1024*b1cdbd2cSJim Jagielski 				bCellEditing = xCellRef->IsTextEditActive();
1025*b1cdbd2cSJim Jagielski 				if (bCellEditing)
1026*b1cdbd2cSJim Jagielski 				{
1027*b1cdbd2cSJim Jagielski 					//Reference< XCell > xCell(xCellRef.get(), UNO_QUERY);
1028*b1cdbd2cSJim Jagielski 					xAccCell = mxImpl->getAccessibleCell(Reference< XCell >( xCellRef.get() ));
1029*b1cdbd2cSJim Jagielski 					if (xAccCell.is())
1030*b1cdbd2cSJim Jagielski 						pAccCell = xAccCell.get();
1031*b1cdbd2cSJim Jagielski 				}
1032*b1cdbd2cSJim Jagielski 			}
1033*b1cdbd2cSJim Jagielski 		}
1034*b1cdbd2cSJim Jagielski 	}
1035*b1cdbd2cSJim Jagielski 	return pAccCell;
1036*b1cdbd2cSJim Jagielski }
1037*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
1038*b1cdbd2cSJim Jagielski //If current active cell is in editing, the focus state should be set to internal text
SetState(sal_Int16 aState)1039*b1cdbd2cSJim Jagielski sal_Bool AccessibleTableShape::SetState (sal_Int16 aState)
1040*b1cdbd2cSJim Jagielski {
1041*b1cdbd2cSJim Jagielski     AccessibleCell* pActiveAccessibleCell = GetActiveAccessibleCell();
1042*b1cdbd2cSJim Jagielski     sal_Bool bStateHasChanged = sal_False;
1043*b1cdbd2cSJim Jagielski     if (aState == AccessibleStateType::FOCUSED && pActiveAccessibleCell != NULL)
1044*b1cdbd2cSJim Jagielski     {
1045*b1cdbd2cSJim Jagielski 		return pActiveAccessibleCell->SetState(aState);
1046*b1cdbd2cSJim Jagielski     }
1047*b1cdbd2cSJim Jagielski     else
1048*b1cdbd2cSJim Jagielski         bStateHasChanged = AccessibleShape::SetState (aState);
1049*b1cdbd2cSJim Jagielski     return bStateHasChanged;
1050*b1cdbd2cSJim Jagielski }
1051*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
1052*b1cdbd2cSJim Jagielski //If current active cell is in editing, the focus state should be reset to internal text
ResetState(sal_Int16 aState)1053*b1cdbd2cSJim Jagielski sal_Bool AccessibleTableShape::ResetState (sal_Int16 aState)
1054*b1cdbd2cSJim Jagielski {
1055*b1cdbd2cSJim Jagielski     AccessibleCell* pActiveAccessibleCell = GetActiveAccessibleCell();
1056*b1cdbd2cSJim Jagielski     sal_Bool bStateHasChanged = sal_False;
1057*b1cdbd2cSJim Jagielski     if (aState == AccessibleStateType::FOCUSED && pActiveAccessibleCell != NULL)
1058*b1cdbd2cSJim Jagielski     {
1059*b1cdbd2cSJim Jagielski 		return pActiveAccessibleCell->ResetState(aState);
1060*b1cdbd2cSJim Jagielski     }
1061*b1cdbd2cSJim Jagielski     else
1062*b1cdbd2cSJim Jagielski         bStateHasChanged = AccessibleShape::ResetState (aState);
1063*b1cdbd2cSJim Jagielski     return bStateHasChanged;
1064*b1cdbd2cSJim Jagielski }
1065*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
SetStateDirectly(sal_Int16 aState)1066*b1cdbd2cSJim Jagielski sal_Bool AccessibleTableShape::SetStateDirectly (sal_Int16 aState)
1067*b1cdbd2cSJim Jagielski {
1068*b1cdbd2cSJim Jagielski 	return AccessibleContextBase::SetState (aState);
1069*b1cdbd2cSJim Jagielski }
1070*b1cdbd2cSJim Jagielski //--------------------------------------------------------------------
ResetStateDirectly(sal_Int16 aState)1071*b1cdbd2cSJim Jagielski sal_Bool AccessibleTableShape::ResetStateDirectly (sal_Int16 aState)
1072*b1cdbd2cSJim Jagielski {
1073*b1cdbd2cSJim Jagielski 	return AccessibleContextBase::ResetState (aState);
1074*b1cdbd2cSJim Jagielski }
checkCellPosition(sal_Int32 nCol,sal_Int32 nRow)1075*b1cdbd2cSJim Jagielski void AccessibleTableShape::checkCellPosition( sal_Int32 nCol, sal_Int32 nRow ) throw ( IndexOutOfBoundsException )
1076*b1cdbd2cSJim Jagielski {
1077*b1cdbd2cSJim Jagielski 	if( (nCol >= 0) && (nRow >= 0) && mxImpl->mxTable.is() && (nCol < mxImpl->mxTable->getColumnCount()) && (nRow < mxImpl->mxTable->getRowCount()) )
1078*b1cdbd2cSJim Jagielski 		return;
1079*b1cdbd2cSJim Jagielski 
1080*b1cdbd2cSJim Jagielski 	throw IndexOutOfBoundsException();
1081*b1cdbd2cSJim Jagielski }
1082*b1cdbd2cSJim Jagielski 
AccessibleTableHeaderShape(AccessibleTableShape * pTable,sal_Bool bRow)1083*b1cdbd2cSJim Jagielski AccessibleTableHeaderShape::AccessibleTableHeaderShape( AccessibleTableShape* pTable, sal_Bool bRow )
1084*b1cdbd2cSJim Jagielski {
1085*b1cdbd2cSJim Jagielski 	mpTable = pTable;
1086*b1cdbd2cSJim Jagielski 	mbRow = bRow;
1087*b1cdbd2cSJim Jagielski }
1088*b1cdbd2cSJim Jagielski 
~AccessibleTableHeaderShape(void)1089*b1cdbd2cSJim Jagielski AccessibleTableHeaderShape::~AccessibleTableHeaderShape (void)
1090*b1cdbd2cSJim Jagielski {
1091*b1cdbd2cSJim Jagielski 	mpTable = NULL;
1092*b1cdbd2cSJim Jagielski }
1093*b1cdbd2cSJim Jagielski 
1094*b1cdbd2cSJim Jagielski // XAccessible
getAccessibleContext(void)1095*b1cdbd2cSJim Jagielski Reference< XAccessibleContext > SAL_CALL AccessibleTableHeaderShape::getAccessibleContext(void) throw (RuntimeException)
1096*b1cdbd2cSJim Jagielski {
1097*b1cdbd2cSJim Jagielski 	return this;
1098*b1cdbd2cSJim Jagielski }
1099*b1cdbd2cSJim Jagielski 
1100*b1cdbd2cSJim Jagielski // XAccessibleContext
getAccessibleChildCount()1101*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleTableHeaderShape::getAccessibleChildCount( ) throw(RuntimeException)
1102*b1cdbd2cSJim Jagielski {
1103*b1cdbd2cSJim Jagielski 	return getAccessibleRowCount() * getAccessibleColumnCount();
1104*b1cdbd2cSJim Jagielski }
1105*b1cdbd2cSJim Jagielski 
getAccessibleChild(sal_Int32 i)1106*b1cdbd2cSJim Jagielski Reference< XAccessible > SAL_CALL AccessibleTableHeaderShape::getAccessibleChild( sal_Int32 i ) throw(IndexOutOfBoundsException, RuntimeException)
1107*b1cdbd2cSJim Jagielski {
1108*b1cdbd2cSJim Jagielski 	return mpTable->getAccessibleChild( i );
1109*b1cdbd2cSJim Jagielski }
1110*b1cdbd2cSJim Jagielski 
getAccessibleParent(void)1111*b1cdbd2cSJim Jagielski Reference< XAccessible > SAL_CALL AccessibleTableHeaderShape::getAccessibleParent (void) throw (RuntimeException)
1112*b1cdbd2cSJim Jagielski {
1113*b1cdbd2cSJim Jagielski 	Reference< XAccessible > XParent;
1114*b1cdbd2cSJim Jagielski     return XParent;
1115*b1cdbd2cSJim Jagielski }
1116*b1cdbd2cSJim Jagielski 
getAccessibleIndexInParent(void)1117*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleTableHeaderShape::getAccessibleIndexInParent (void) throw (RuntimeException)
1118*b1cdbd2cSJim Jagielski {
1119*b1cdbd2cSJim Jagielski 	return -1;
1120*b1cdbd2cSJim Jagielski }
1121*b1cdbd2cSJim Jagielski 
getAccessibleRole(void)1122*b1cdbd2cSJim Jagielski sal_Int16 SAL_CALL AccessibleTableHeaderShape::getAccessibleRole (void) throw (RuntimeException)
1123*b1cdbd2cSJim Jagielski {
1124*b1cdbd2cSJim Jagielski 	return mpTable->getAccessibleRole();
1125*b1cdbd2cSJim Jagielski }
1126*b1cdbd2cSJim Jagielski 
getAccessibleDescription(void)1127*b1cdbd2cSJim Jagielski OUString SAL_CALL AccessibleTableHeaderShape::getAccessibleDescription (void) throw (RuntimeException)
1128*b1cdbd2cSJim Jagielski {
1129*b1cdbd2cSJim Jagielski     return mpTable->getAccessibleDescription();
1130*b1cdbd2cSJim Jagielski }
1131*b1cdbd2cSJim Jagielski 
getAccessibleName(void)1132*b1cdbd2cSJim Jagielski OUString SAL_CALL AccessibleTableHeaderShape::getAccessibleName (void) throw (RuntimeException)
1133*b1cdbd2cSJim Jagielski {
1134*b1cdbd2cSJim Jagielski 	return mpTable->getAccessibleName();
1135*b1cdbd2cSJim Jagielski }
1136*b1cdbd2cSJim Jagielski 
getAccessibleStateSet(void)1137*b1cdbd2cSJim Jagielski Reference< XAccessibleStateSet > SAL_CALL AccessibleTableHeaderShape::getAccessibleStateSet (void) throw (RuntimeException)
1138*b1cdbd2cSJim Jagielski {
1139*b1cdbd2cSJim Jagielski 	return mpTable->getAccessibleStateSet();
1140*b1cdbd2cSJim Jagielski }
1141*b1cdbd2cSJim Jagielski 
getAccessibleRelationSet(void)1142*b1cdbd2cSJim Jagielski Reference< XAccessibleRelationSet > SAL_CALL AccessibleTableHeaderShape::getAccessibleRelationSet (void) throw (RuntimeException)
1143*b1cdbd2cSJim Jagielski {
1144*b1cdbd2cSJim Jagielski 	return mpTable->getAccessibleRelationSet();
1145*b1cdbd2cSJim Jagielski }
1146*b1cdbd2cSJim Jagielski 
getLocale(void)1147*b1cdbd2cSJim Jagielski Locale SAL_CALL AccessibleTableHeaderShape::getLocale (void) throw (IllegalAccessibleComponentStateException, RuntimeException)
1148*b1cdbd2cSJim Jagielski {
1149*b1cdbd2cSJim Jagielski 	return mpTable->getLocale();
1150*b1cdbd2cSJim Jagielski }
1151*b1cdbd2cSJim Jagielski 
1152*b1cdbd2cSJim Jagielski //XAccessibleComponent
containsPoint(const::com::sun::star::awt::Point & aPoint)1153*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL AccessibleTableHeaderShape::containsPoint ( const ::com::sun::star::awt::Point& aPoint ) throw (RuntimeException)
1154*b1cdbd2cSJim Jagielski {
1155*b1cdbd2cSJim Jagielski 	return mpTable->containsPoint( aPoint );
1156*b1cdbd2cSJim Jagielski }
1157*b1cdbd2cSJim Jagielski 
getAccessibleAtPoint(const::com::sun::star::awt::Point & aPoint)1158*b1cdbd2cSJim Jagielski Reference< XAccessible > SAL_CALL AccessibleTableHeaderShape::getAccessibleAtPoint ( const ::com::sun::star::awt::Point& aPoint) throw (RuntimeException)
1159*b1cdbd2cSJim Jagielski {
1160*b1cdbd2cSJim Jagielski 	return mpTable->getAccessibleAtPoint( aPoint );
1161*b1cdbd2cSJim Jagielski }
1162*b1cdbd2cSJim Jagielski 
getBounds(void)1163*b1cdbd2cSJim Jagielski ::com::sun::star::awt::Rectangle SAL_CALL AccessibleTableHeaderShape::getBounds (void) throw (RuntimeException)
1164*b1cdbd2cSJim Jagielski {
1165*b1cdbd2cSJim Jagielski 	return mpTable->getBounds();
1166*b1cdbd2cSJim Jagielski }
1167*b1cdbd2cSJim Jagielski 
getLocation(void)1168*b1cdbd2cSJim Jagielski ::com::sun::star::awt::Point SAL_CALL AccessibleTableHeaderShape::getLocation (void) throw (RuntimeException)
1169*b1cdbd2cSJim Jagielski {
1170*b1cdbd2cSJim Jagielski 	return mpTable->getLocation();
1171*b1cdbd2cSJim Jagielski }
1172*b1cdbd2cSJim Jagielski 
getLocationOnScreen(void)1173*b1cdbd2cSJim Jagielski ::com::sun::star::awt::Point SAL_CALL AccessibleTableHeaderShape::getLocationOnScreen (void) throw (RuntimeException)
1174*b1cdbd2cSJim Jagielski {
1175*b1cdbd2cSJim Jagielski 	return mpTable->getLocationOnScreen();
1176*b1cdbd2cSJim Jagielski }
1177*b1cdbd2cSJim Jagielski 
getSize(void)1178*b1cdbd2cSJim Jagielski ::com::sun::star::awt::Size SAL_CALL AccessibleTableHeaderShape::getSize (void) throw (RuntimeException)
1179*b1cdbd2cSJim Jagielski {
1180*b1cdbd2cSJim Jagielski 	return mpTable->getSize();
1181*b1cdbd2cSJim Jagielski }
1182*b1cdbd2cSJim Jagielski 
getForeground(void)1183*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleTableHeaderShape::getForeground (void) throw (RuntimeException)
1184*b1cdbd2cSJim Jagielski {
1185*b1cdbd2cSJim Jagielski     return mpTable->getForeground();
1186*b1cdbd2cSJim Jagielski }
1187*b1cdbd2cSJim Jagielski 
getBackground(void)1188*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleTableHeaderShape::getBackground (void) throw (RuntimeException)
1189*b1cdbd2cSJim Jagielski {
1190*b1cdbd2cSJim Jagielski     return mpTable->getBackground();
1191*b1cdbd2cSJim Jagielski }
1192*b1cdbd2cSJim Jagielski 
grabFocus(void)1193*b1cdbd2cSJim Jagielski void SAL_CALL AccessibleTableHeaderShape::grabFocus (void) throw (RuntimeException)
1194*b1cdbd2cSJim Jagielski {
1195*b1cdbd2cSJim Jagielski 	mpTable->grabFocus();
1196*b1cdbd2cSJim Jagielski }
1197*b1cdbd2cSJim Jagielski //=====  XAccessibleTable  ============================================
1198*b1cdbd2cSJim Jagielski 
getAccessibleRowCount()1199*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleTableHeaderShape::getAccessibleRowCount() throw (RuntimeException)
1200*b1cdbd2cSJim Jagielski {
1201*b1cdbd2cSJim Jagielski 	return mbRow ? 1 : mpTable->getAccessibleRowCount();
1202*b1cdbd2cSJim Jagielski }
1203*b1cdbd2cSJim Jagielski 
getAccessibleColumnCount()1204*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleTableHeaderShape::getAccessibleColumnCount() throw (RuntimeException)
1205*b1cdbd2cSJim Jagielski {
1206*b1cdbd2cSJim Jagielski     return !mbRow ? 1 : mpTable->getAccessibleColumnCount();
1207*b1cdbd2cSJim Jagielski }
1208*b1cdbd2cSJim Jagielski 
getAccessibleRowDescription(sal_Int32 nRow)1209*b1cdbd2cSJim Jagielski OUString SAL_CALL AccessibleTableHeaderShape::getAccessibleRowDescription( sal_Int32 nRow ) throw (IndexOutOfBoundsException, RuntimeException)
1210*b1cdbd2cSJim Jagielski {
1211*b1cdbd2cSJim Jagielski 	return mpTable->getAccessibleRowDescription( nRow );
1212*b1cdbd2cSJim Jagielski }
1213*b1cdbd2cSJim Jagielski 
getAccessibleColumnDescription(sal_Int32 nColumn)1214*b1cdbd2cSJim Jagielski OUString SAL_CALL AccessibleTableHeaderShape::getAccessibleColumnDescription( sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException)
1215*b1cdbd2cSJim Jagielski {
1216*b1cdbd2cSJim Jagielski     return mpTable->getAccessibleColumnDescription( nColumn );
1217*b1cdbd2cSJim Jagielski }
1218*b1cdbd2cSJim Jagielski 
getAccessibleRowExtentAt(sal_Int32 nRow,sal_Int32 nColumn)1219*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleTableHeaderShape::getAccessibleRowExtentAt( sal_Int32 nRow, sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException)
1220*b1cdbd2cSJim Jagielski {
1221*b1cdbd2cSJim Jagielski 	return mpTable->getAccessibleRowExtentAt( nRow, nColumn );
1222*b1cdbd2cSJim Jagielski }
1223*b1cdbd2cSJim Jagielski 
getAccessibleColumnExtentAt(sal_Int32 nRow,sal_Int32 nColumn)1224*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleTableHeaderShape::getAccessibleColumnExtentAt( sal_Int32 nRow, sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException)
1225*b1cdbd2cSJim Jagielski {
1226*b1cdbd2cSJim Jagielski 	return mpTable->getAccessibleColumnExtentAt( nRow, nColumn );
1227*b1cdbd2cSJim Jagielski }
1228*b1cdbd2cSJim Jagielski 
getAccessibleRowHeaders()1229*b1cdbd2cSJim Jagielski Reference< XAccessibleTable > SAL_CALL AccessibleTableHeaderShape::getAccessibleRowHeaders(  ) throw (RuntimeException)
1230*b1cdbd2cSJim Jagielski {
1231*b1cdbd2cSJim Jagielski 	Reference< XAccessibleTable > xRet;
1232*b1cdbd2cSJim Jagielski 	return xRet;
1233*b1cdbd2cSJim Jagielski }
1234*b1cdbd2cSJim Jagielski 
getAccessibleColumnHeaders()1235*b1cdbd2cSJim Jagielski Reference< XAccessibleTable > SAL_CALL AccessibleTableHeaderShape::getAccessibleColumnHeaders(  ) throw (RuntimeException)
1236*b1cdbd2cSJim Jagielski {
1237*b1cdbd2cSJim Jagielski 	Reference< XAccessibleTable > xRet;
1238*b1cdbd2cSJim Jagielski 	return xRet;
1239*b1cdbd2cSJim Jagielski }
1240*b1cdbd2cSJim Jagielski 
getSelectedAccessibleRows()1241*b1cdbd2cSJim Jagielski Sequence< sal_Int32 > SAL_CALL AccessibleTableHeaderShape::getSelectedAccessibleRows(  ) throw (RuntimeException)
1242*b1cdbd2cSJim Jagielski {
1243*b1cdbd2cSJim Jagielski 	sal_Int32 nRow = getAccessibleRowCount();
1244*b1cdbd2cSJim Jagielski 	::std::vector< sal_Bool > aSelected( nRow, sal_True );
1245*b1cdbd2cSJim Jagielski 	sal_Int32 nCount = nRow;
1246*b1cdbd2cSJim Jagielski 	for( sal_Int32 i = 0; i < nRow; i++ )
1247*b1cdbd2cSJim Jagielski 	{
1248*b1cdbd2cSJim Jagielski 		try
1249*b1cdbd2cSJim Jagielski 		{
1250*b1cdbd2cSJim Jagielski 			aSelected[i] = isAccessibleRowSelected( i );
1251*b1cdbd2cSJim Jagielski 		}
1252*b1cdbd2cSJim Jagielski 		catch( ... )
1253*b1cdbd2cSJim Jagielski 		{
1254*b1cdbd2cSJim Jagielski 			return Sequence< sal_Int32 >();
1255*b1cdbd2cSJim Jagielski 		}
1256*b1cdbd2cSJim Jagielski 
1257*b1cdbd2cSJim Jagielski 		if( !aSelected[i] )
1258*b1cdbd2cSJim Jagielski 			nCount--;
1259*b1cdbd2cSJim Jagielski 	}
1260*b1cdbd2cSJim Jagielski 	Sequence < sal_Int32 > aRet( nCount );
1261*b1cdbd2cSJim Jagielski 	sal_Int32 *pRet = aRet.getArray();
1262*b1cdbd2cSJim Jagielski 	sal_Int32 nPos = 0;
1263*b1cdbd2cSJim Jagielski 	size_t nSize = aSelected.size();
1264*b1cdbd2cSJim Jagielski 	for( size_t i=0; i < nSize && nPos < nCount; i++ )
1265*b1cdbd2cSJim Jagielski 	{
1266*b1cdbd2cSJim Jagielski 		if( aSelected[i] )
1267*b1cdbd2cSJim Jagielski 		{
1268*b1cdbd2cSJim Jagielski 			*pRet++ = i;
1269*b1cdbd2cSJim Jagielski 			nPos++;
1270*b1cdbd2cSJim Jagielski 		}
1271*b1cdbd2cSJim Jagielski 	}
1272*b1cdbd2cSJim Jagielski 
1273*b1cdbd2cSJim Jagielski 	return aRet;
1274*b1cdbd2cSJim Jagielski }
1275*b1cdbd2cSJim Jagielski 
getSelectedAccessibleColumns()1276*b1cdbd2cSJim Jagielski Sequence< sal_Int32 > SAL_CALL AccessibleTableHeaderShape::getSelectedAccessibleColumns(  ) throw (RuntimeException)
1277*b1cdbd2cSJim Jagielski {
1278*b1cdbd2cSJim Jagielski 	sal_Int32 nColumn = getAccessibleColumnCount();
1279*b1cdbd2cSJim Jagielski 	::std::vector< sal_Bool > aSelected( nColumn, sal_True );
1280*b1cdbd2cSJim Jagielski 	sal_Int32 nCount = nColumn;
1281*b1cdbd2cSJim Jagielski 	for( sal_Int32 i = 0; i < nColumn; i++ )
1282*b1cdbd2cSJim Jagielski 	{
1283*b1cdbd2cSJim Jagielski 		try
1284*b1cdbd2cSJim Jagielski 		{
1285*b1cdbd2cSJim Jagielski 			aSelected[i] = isAccessibleColumnSelected( i );
1286*b1cdbd2cSJim Jagielski 		}
1287*b1cdbd2cSJim Jagielski 		catch( ... )
1288*b1cdbd2cSJim Jagielski 		{
1289*b1cdbd2cSJim Jagielski 			return Sequence< sal_Int32 >();
1290*b1cdbd2cSJim Jagielski 		}
1291*b1cdbd2cSJim Jagielski 
1292*b1cdbd2cSJim Jagielski 		if( !aSelected[i] )
1293*b1cdbd2cSJim Jagielski 			nCount--;
1294*b1cdbd2cSJim Jagielski 	}
1295*b1cdbd2cSJim Jagielski 	Sequence < sal_Int32 > aRet( nCount );
1296*b1cdbd2cSJim Jagielski 	sal_Int32 *pRet = aRet.getArray();
1297*b1cdbd2cSJim Jagielski 	sal_Int32 nPos = 0;
1298*b1cdbd2cSJim Jagielski 	size_t nSize = aSelected.size();
1299*b1cdbd2cSJim Jagielski 	for( size_t i=0; i < nSize && nPos < nCount; i++ )
1300*b1cdbd2cSJim Jagielski 	{
1301*b1cdbd2cSJim Jagielski 		if( aSelected[i] )
1302*b1cdbd2cSJim Jagielski 		{
1303*b1cdbd2cSJim Jagielski 			*pRet++ = i;
1304*b1cdbd2cSJim Jagielski 			nPos++;
1305*b1cdbd2cSJim Jagielski 		}
1306*b1cdbd2cSJim Jagielski 	}
1307*b1cdbd2cSJim Jagielski 
1308*b1cdbd2cSJim Jagielski 	return aRet;
1309*b1cdbd2cSJim Jagielski }
1310*b1cdbd2cSJim Jagielski 
isAccessibleRowSelected(sal_Int32 nRow)1311*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL AccessibleTableHeaderShape::isAccessibleRowSelected( sal_Int32 nRow ) throw (IndexOutOfBoundsException, RuntimeException)
1312*b1cdbd2cSJim Jagielski {
1313*b1cdbd2cSJim Jagielski 	return mpTable->isAccessibleRowSelected( nRow );
1314*b1cdbd2cSJim Jagielski }
1315*b1cdbd2cSJim Jagielski 
isAccessibleColumnSelected(sal_Int32 nColumn)1316*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL AccessibleTableHeaderShape::isAccessibleColumnSelected( sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException)
1317*b1cdbd2cSJim Jagielski {
1318*b1cdbd2cSJim Jagielski 	return mpTable->isAccessibleColumnSelected( nColumn );
1319*b1cdbd2cSJim Jagielski }
1320*b1cdbd2cSJim Jagielski 
getAccessibleCellAt(sal_Int32 nRow,sal_Int32 nColumn)1321*b1cdbd2cSJim Jagielski Reference< XAccessible > SAL_CALL AccessibleTableHeaderShape::getAccessibleCellAt( sal_Int32 nRow, sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException)
1322*b1cdbd2cSJim Jagielski {
1323*b1cdbd2cSJim Jagielski 	return mpTable->getAccessibleCellAt( nRow, nColumn );
1324*b1cdbd2cSJim Jagielski }
1325*b1cdbd2cSJim Jagielski 
getAccessibleCaption()1326*b1cdbd2cSJim Jagielski Reference< XAccessible > SAL_CALL AccessibleTableHeaderShape::getAccessibleCaption(  ) throw (RuntimeException)
1327*b1cdbd2cSJim Jagielski {
1328*b1cdbd2cSJim Jagielski 	return mpTable->getAccessibleCaption();
1329*b1cdbd2cSJim Jagielski }
1330*b1cdbd2cSJim Jagielski 
getAccessibleSummary()1331*b1cdbd2cSJim Jagielski Reference< XAccessible > SAL_CALL AccessibleTableHeaderShape::getAccessibleSummary(  ) throw (RuntimeException)
1332*b1cdbd2cSJim Jagielski {
1333*b1cdbd2cSJim Jagielski 	return mpTable->getAccessibleSummary();
1334*b1cdbd2cSJim Jagielski }
1335*b1cdbd2cSJim Jagielski 
isAccessibleSelected(sal_Int32 nRow,sal_Int32 nColumn)1336*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL AccessibleTableHeaderShape::isAccessibleSelected( sal_Int32 nRow, sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException)
1337*b1cdbd2cSJim Jagielski {
1338*b1cdbd2cSJim Jagielski 	return mpTable->isAccessibleSelected( nRow, nColumn );
1339*b1cdbd2cSJim Jagielski }
1340*b1cdbd2cSJim Jagielski 
getAccessibleIndex(sal_Int32 nRow,sal_Int32 nColumn)1341*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleTableHeaderShape::getAccessibleIndex( sal_Int32 nRow, sal_Int32 nColumn ) throw (IndexOutOfBoundsException, RuntimeException)
1342*b1cdbd2cSJim Jagielski {
1343*b1cdbd2cSJim Jagielski 	return mpTable->getAccessibleIndex( nRow, nColumn );
1344*b1cdbd2cSJim Jagielski }
1345*b1cdbd2cSJim Jagielski 
getAccessibleRow(sal_Int32 nChildIndex)1346*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleTableHeaderShape::getAccessibleRow( sal_Int32 nChildIndex ) throw (IndexOutOfBoundsException, RuntimeException)
1347*b1cdbd2cSJim Jagielski {
1348*b1cdbd2cSJim Jagielski 	return mpTable->getAccessibleRow( nChildIndex );
1349*b1cdbd2cSJim Jagielski }
1350*b1cdbd2cSJim Jagielski 
getAccessibleColumn(sal_Int32 nChildIndex)1351*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL AccessibleTableHeaderShape::getAccessibleColumn( sal_Int32 nChildIndex ) throw (IndexOutOfBoundsException, RuntimeException)
1352*b1cdbd2cSJim Jagielski {
1353*b1cdbd2cSJim Jagielski 	return mpTable->getAccessibleColumn( nChildIndex );
1354*b1cdbd2cSJim Jagielski }
1355*b1cdbd2cSJim Jagielski 
1356*b1cdbd2cSJim Jagielski //=====  XAccessibleTableSelection  ============================================
selectRow(sal_Int32 row)1357*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL AccessibleTableHeaderShape::selectRow( sal_Int32 row )
1358*b1cdbd2cSJim Jagielski throw (IndexOutOfBoundsException, RuntimeException)
1359*b1cdbd2cSJim Jagielski {
1360*b1cdbd2cSJim Jagielski 	if( mbRow )
1361*b1cdbd2cSJim Jagielski 		return mpTable->selectRow( row );
1362*b1cdbd2cSJim Jagielski 	else
1363*b1cdbd2cSJim Jagielski 	{
1364*b1cdbd2cSJim Jagielski 		mpTable->clearAccessibleSelection();
1365*b1cdbd2cSJim Jagielski 		sal_Int32 nIndex = mpTable->getAccessibleIndex( row, 0 );
1366*b1cdbd2cSJim Jagielski 		mpTable->selectAccessibleChild( nIndex );
1367*b1cdbd2cSJim Jagielski 		return sal_True;
1368*b1cdbd2cSJim Jagielski 	}
1369*b1cdbd2cSJim Jagielski }
1370*b1cdbd2cSJim Jagielski 
selectColumn(sal_Int32 column)1371*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL AccessibleTableHeaderShape::selectColumn( sal_Int32 column )
1372*b1cdbd2cSJim Jagielski throw (IndexOutOfBoundsException, RuntimeException)
1373*b1cdbd2cSJim Jagielski {
1374*b1cdbd2cSJim Jagielski 	if( !mbRow )
1375*b1cdbd2cSJim Jagielski 		return mpTable->selectColumn( column );
1376*b1cdbd2cSJim Jagielski 	else
1377*b1cdbd2cSJim Jagielski 	{
1378*b1cdbd2cSJim Jagielski 		mpTable->clearAccessibleSelection();
1379*b1cdbd2cSJim Jagielski 		sal_Int32 nIndex = mpTable->getAccessibleIndex( 0, column );
1380*b1cdbd2cSJim Jagielski 		mpTable->selectAccessibleChild( nIndex );
1381*b1cdbd2cSJim Jagielski 		return sal_True;
1382*b1cdbd2cSJim Jagielski 	}
1383*b1cdbd2cSJim Jagielski }
1384*b1cdbd2cSJim Jagielski 
unselectRow(sal_Int32 row)1385*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL AccessibleTableHeaderShape::unselectRow( sal_Int32 row )
1386*b1cdbd2cSJim Jagielski throw (IndexOutOfBoundsException, RuntimeException)
1387*b1cdbd2cSJim Jagielski {
1388*b1cdbd2cSJim Jagielski 	if( mbRow )
1389*b1cdbd2cSJim Jagielski 		return mpTable->unselectRow( row );
1390*b1cdbd2cSJim Jagielski 	else
1391*b1cdbd2cSJim Jagielski 	{
1392*b1cdbd2cSJim Jagielski 		sal_Int32 nIndex = mpTable->getAccessibleIndex( row, 0 );
1393*b1cdbd2cSJim Jagielski 		mpTable->deselectAccessibleChild( nIndex );
1394*b1cdbd2cSJim Jagielski 		return sal_True;
1395*b1cdbd2cSJim Jagielski 	}
1396*b1cdbd2cSJim Jagielski }
1397*b1cdbd2cSJim Jagielski 
unselectColumn(sal_Int32 column)1398*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL AccessibleTableHeaderShape::unselectColumn( sal_Int32 column )
1399*b1cdbd2cSJim Jagielski throw (IndexOutOfBoundsException, RuntimeException)
1400*b1cdbd2cSJim Jagielski {
1401*b1cdbd2cSJim Jagielski 	if( !mbRow )
1402*b1cdbd2cSJim Jagielski 		return mpTable->unselectColumn( column );
1403*b1cdbd2cSJim Jagielski 	else
1404*b1cdbd2cSJim Jagielski 	{
1405*b1cdbd2cSJim Jagielski 		sal_Int32 nIndex = mpTable->getAccessibleIndex( 0, column );
1406*b1cdbd2cSJim Jagielski 		mpTable->deselectAccessibleChild( nIndex );
1407*b1cdbd2cSJim Jagielski 		return sal_True;
1408*b1cdbd2cSJim Jagielski 	}
1409*b1cdbd2cSJim Jagielski }
1410*b1cdbd2cSJim Jagielski }
1411