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_sc.hxx"
26*b1cdbd2cSJim Jagielski 
27*b1cdbd2cSJim Jagielski #include "scitems.hxx"
28*b1cdbd2cSJim Jagielski #include "AccessiblePreviewTable.hxx"
29*b1cdbd2cSJim Jagielski #include "AccessiblePreviewCell.hxx"
30*b1cdbd2cSJim Jagielski #include "AccessiblePreviewHeaderCell.hxx"
31*b1cdbd2cSJim Jagielski #include "AccessibilityHints.hxx"
32*b1cdbd2cSJim Jagielski #include "prevwsh.hxx"
33*b1cdbd2cSJim Jagielski #include "unoguard.hxx"
34*b1cdbd2cSJim Jagielski #include "miscuno.hxx"
35*b1cdbd2cSJim Jagielski #include "prevloc.hxx"
36*b1cdbd2cSJim Jagielski #include "attrib.hxx"
37*b1cdbd2cSJim Jagielski #include "document.hxx"
38*b1cdbd2cSJim Jagielski #include "scresid.hxx"
39*b1cdbd2cSJim Jagielski #ifndef SC_SC_HRC
40*b1cdbd2cSJim Jagielski #include "sc.hrc"
41*b1cdbd2cSJim Jagielski #endif
42*b1cdbd2cSJim Jagielski 
43*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/AccessibleRole.hpp>
44*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/AccessibleStateType.hpp>
45*b1cdbd2cSJim Jagielski #include <com/sun/star/accessibility/AccessibleEventId.hpp>
46*b1cdbd2cSJim Jagielski 
47*b1cdbd2cSJim Jagielski #include <vcl/window.hxx>
48*b1cdbd2cSJim Jagielski #include <svl/smplhint.hxx>
49*b1cdbd2cSJim Jagielski #include <unotools/accessiblestatesethelper.hxx>
50*b1cdbd2cSJim Jagielski #include <comphelper/sequence.hxx>
51*b1cdbd2cSJim Jagielski 
52*b1cdbd2cSJim Jagielski using namespace	::com::sun::star;
53*b1cdbd2cSJim Jagielski using namespace	::com::sun::star::accessibility;
54*b1cdbd2cSJim Jagielski 
55*b1cdbd2cSJim Jagielski //=====  internal  ============================================================
56*b1cdbd2cSJim Jagielski 
ScAccessiblePreviewTable(const::com::sun::star::uno::Reference<::com::sun::star::accessibility::XAccessible> & rxParent,ScPreviewShell * pViewShell,sal_Int32 nIndex)57*b1cdbd2cSJim Jagielski ScAccessiblePreviewTable::ScAccessiblePreviewTable( const ::com::sun::star::uno::Reference<
58*b1cdbd2cSJim Jagielski 						        ::com::sun::star::accessibility::XAccessible>& rxParent,
59*b1cdbd2cSJim Jagielski 							ScPreviewShell* pViewShell, sal_Int32 nIndex ) :
60*b1cdbd2cSJim Jagielski 	ScAccessibleContextBase( rxParent, AccessibleRole::TABLE ),
61*b1cdbd2cSJim Jagielski 	mpViewShell( pViewShell ),
62*b1cdbd2cSJim Jagielski 	mnIndex( nIndex ),
63*b1cdbd2cSJim Jagielski 	mpTableInfo( NULL )
64*b1cdbd2cSJim Jagielski {
65*b1cdbd2cSJim Jagielski 	if (mpViewShell)
66*b1cdbd2cSJim Jagielski 		mpViewShell->AddAccessibilityObject(*this);
67*b1cdbd2cSJim Jagielski }
68*b1cdbd2cSJim Jagielski 
~ScAccessiblePreviewTable()69*b1cdbd2cSJim Jagielski ScAccessiblePreviewTable::~ScAccessiblePreviewTable()
70*b1cdbd2cSJim Jagielski {
71*b1cdbd2cSJim Jagielski 	if (!ScAccessibleContextBase::IsDefunc() && !rBHelper.bInDispose)
72*b1cdbd2cSJim Jagielski 	{
73*b1cdbd2cSJim Jagielski 		// increment refcount to prevent double call off dtor
74*b1cdbd2cSJim Jagielski 		osl_incrementInterlockedCount( &m_refCount );
75*b1cdbd2cSJim Jagielski 		dispose();
76*b1cdbd2cSJim Jagielski 	}
77*b1cdbd2cSJim Jagielski }
78*b1cdbd2cSJim Jagielski 
disposing()79*b1cdbd2cSJim Jagielski void SAL_CALL ScAccessiblePreviewTable::disposing()
80*b1cdbd2cSJim Jagielski {
81*b1cdbd2cSJim Jagielski     ScUnoGuard aGuard;
82*b1cdbd2cSJim Jagielski 	if (mpViewShell)
83*b1cdbd2cSJim Jagielski 	{
84*b1cdbd2cSJim Jagielski 		mpViewShell->RemoveAccessibilityObject(*this);
85*b1cdbd2cSJim Jagielski 		mpViewShell = NULL;
86*b1cdbd2cSJim Jagielski 	}
87*b1cdbd2cSJim Jagielski 
88*b1cdbd2cSJim Jagielski 	if (mpTableInfo)
89*b1cdbd2cSJim Jagielski 		DELETEZ (mpTableInfo);
90*b1cdbd2cSJim Jagielski 
91*b1cdbd2cSJim Jagielski 	ScAccessibleContextBase::disposing();
92*b1cdbd2cSJim Jagielski }
93*b1cdbd2cSJim Jagielski 
94*b1cdbd2cSJim Jagielski //=====  SfxListener  =====================================================
95*b1cdbd2cSJim Jagielski 
Notify(SfxBroadcaster & rBC,const SfxHint & rHint)96*b1cdbd2cSJim Jagielski void ScAccessiblePreviewTable::Notify( SfxBroadcaster& rBC, const SfxHint& rHint )
97*b1cdbd2cSJim Jagielski {
98*b1cdbd2cSJim Jagielski 	if (rHint.ISA( SfxSimpleHint ))
99*b1cdbd2cSJim Jagielski 	{
100*b1cdbd2cSJim Jagielski 		const SfxSimpleHint& rRef = (const SfxSimpleHint&)rHint;
101*b1cdbd2cSJim Jagielski 		sal_uLong nId = rRef.GetId();
102*b1cdbd2cSJim Jagielski 		if ( nId == SFX_HINT_DATACHANGED )
103*b1cdbd2cSJim Jagielski 		{
104*b1cdbd2cSJim Jagielski 			//	column / row layout may change with any document change,
105*b1cdbd2cSJim Jagielski 			//	so it must be invalidated
106*b1cdbd2cSJim Jagielski 			DELETEZ( mpTableInfo );
107*b1cdbd2cSJim Jagielski 		}
108*b1cdbd2cSJim Jagielski         else if (rRef.GetId() == SC_HINT_ACC_VISAREACHANGED)
109*b1cdbd2cSJim Jagielski         {
110*b1cdbd2cSJim Jagielski             AccessibleEventObject aEvent;
111*b1cdbd2cSJim Jagielski             aEvent.EventId = AccessibleEventId::VISIBLE_DATA_CHANGED;
112*b1cdbd2cSJim Jagielski 			aEvent.Source = uno::Reference< XAccessibleContext >(this);
113*b1cdbd2cSJim Jagielski             CommitChange(aEvent);
114*b1cdbd2cSJim Jagielski         }
115*b1cdbd2cSJim Jagielski 	}
116*b1cdbd2cSJim Jagielski 
117*b1cdbd2cSJim Jagielski 	ScAccessibleContextBase::Notify(rBC, rHint);
118*b1cdbd2cSJim Jagielski }
119*b1cdbd2cSJim Jagielski 
120*b1cdbd2cSJim Jagielski //=====  XInterface  =====================================================
121*b1cdbd2cSJim Jagielski 
queryInterface(uno::Type const & rType)122*b1cdbd2cSJim Jagielski uno::Any SAL_CALL ScAccessiblePreviewTable::queryInterface( uno::Type const & rType )
123*b1cdbd2cSJim Jagielski 	throw (uno::RuntimeException)
124*b1cdbd2cSJim Jagielski {
125*b1cdbd2cSJim Jagielski 	uno::Any aAny (ScAccessiblePreviewTableImpl::queryInterface(rType));
126*b1cdbd2cSJim Jagielski 	return aAny.hasValue() ? aAny : ScAccessibleContextBase::queryInterface(rType);
127*b1cdbd2cSJim Jagielski }
128*b1cdbd2cSJim Jagielski 
acquire()129*b1cdbd2cSJim Jagielski void SAL_CALL ScAccessiblePreviewTable::acquire()
130*b1cdbd2cSJim Jagielski 	throw ()
131*b1cdbd2cSJim Jagielski {
132*b1cdbd2cSJim Jagielski 	ScAccessibleContextBase::acquire();
133*b1cdbd2cSJim Jagielski }
134*b1cdbd2cSJim Jagielski 
release()135*b1cdbd2cSJim Jagielski void SAL_CALL ScAccessiblePreviewTable::release()
136*b1cdbd2cSJim Jagielski 	throw ()
137*b1cdbd2cSJim Jagielski {
138*b1cdbd2cSJim Jagielski 	ScAccessibleContextBase::release();
139*b1cdbd2cSJim Jagielski }
140*b1cdbd2cSJim Jagielski 
141*b1cdbd2cSJim Jagielski //=====  XAccessibleTable  ================================================
142*b1cdbd2cSJim Jagielski 
getAccessibleRowCount()143*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL ScAccessiblePreviewTable::getAccessibleRowCount() throw (uno::RuntimeException)
144*b1cdbd2cSJim Jagielski {
145*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
146*b1cdbd2cSJim Jagielski     IsObjectValid();
147*b1cdbd2cSJim Jagielski 
148*b1cdbd2cSJim Jagielski 	FillTableInfo();
149*b1cdbd2cSJim Jagielski 
150*b1cdbd2cSJim Jagielski 	sal_Int32 nRet = 0;
151*b1cdbd2cSJim Jagielski 	if ( mpTableInfo )
152*b1cdbd2cSJim Jagielski 		nRet = mpTableInfo->GetRows();
153*b1cdbd2cSJim Jagielski 	return nRet;
154*b1cdbd2cSJim Jagielski }
155*b1cdbd2cSJim Jagielski 
getAccessibleColumnCount()156*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL ScAccessiblePreviewTable::getAccessibleColumnCount() throw (uno::RuntimeException)
157*b1cdbd2cSJim Jagielski {
158*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
159*b1cdbd2cSJim Jagielski     IsObjectValid();
160*b1cdbd2cSJim Jagielski 
161*b1cdbd2cSJim Jagielski 	FillTableInfo();
162*b1cdbd2cSJim Jagielski 
163*b1cdbd2cSJim Jagielski 	sal_Int32 nRet = 0;
164*b1cdbd2cSJim Jagielski 	if ( mpTableInfo )
165*b1cdbd2cSJim Jagielski 		nRet = mpTableInfo->GetCols();
166*b1cdbd2cSJim Jagielski 	return nRet;
167*b1cdbd2cSJim Jagielski }
168*b1cdbd2cSJim Jagielski 
getAccessibleRowDescription(sal_Int32 nRow)169*b1cdbd2cSJim Jagielski rtl::OUString SAL_CALL ScAccessiblePreviewTable::getAccessibleRowDescription( sal_Int32 nRow )
170*b1cdbd2cSJim Jagielski 								throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
171*b1cdbd2cSJim Jagielski {
172*b1cdbd2cSJim Jagielski     // is not supported or specified so not implemented
173*b1cdbd2cSJim Jagielski /*	ScUnoGuard aGuard;
174*b1cdbd2cSJim Jagielski     IsObjectValid();
175*b1cdbd2cSJim Jagielski 
176*b1cdbd2cSJim Jagielski 	FillTableInfo();
177*b1cdbd2cSJim Jagielski 
178*b1cdbd2cSJim Jagielski 	rtl::OUString sName;
179*b1cdbd2cSJim Jagielski 	if ( mpTableInfo && nRow >= 0 && nRow < mpTableInfo->GetRows() )
180*b1cdbd2cSJim Jagielski 	{
181*b1cdbd2cSJim Jagielski 		const ScPreviewColRowInfo& rInfo = mpTableInfo->GetRowInfo()[nRow];
182*b1cdbd2cSJim Jagielski 		if ( rInfo.bIsHeader )
183*b1cdbd2cSJim Jagielski 		{
184*b1cdbd2cSJim Jagielski 			//!	name of column headers row?
185*b1cdbd2cSJim Jagielski 
186*b1cdbd2cSJim Jagielski 			sName = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Column Headers"));
187*b1cdbd2cSJim Jagielski 		}
188*b1cdbd2cSJim Jagielski 		else
189*b1cdbd2cSJim Jagielski 		{
190*b1cdbd2cSJim Jagielski 			// normal row name
191*b1cdbd2cSJim Jagielski 			sName = rtl::OUString::valueOf( (sal_Int32) ( rInfo.nDocIndex + 1 ) );
192*b1cdbd2cSJim Jagielski 		}
193*b1cdbd2cSJim Jagielski 	}
194*b1cdbd2cSJim Jagielski 	else
195*b1cdbd2cSJim Jagielski 		throw lang::IndexOutOfBoundsException();*/
196*b1cdbd2cSJim Jagielski 
197*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
198*b1cdbd2cSJim Jagielski     FillTableInfo();
199*b1cdbd2cSJim Jagielski     if ( nRow < 0 || (mpTableInfo && nRow >= mpTableInfo->GetRows()) )
200*b1cdbd2cSJim Jagielski 		throw lang::IndexOutOfBoundsException();
201*b1cdbd2cSJim Jagielski 
202*b1cdbd2cSJim Jagielski     return rtl::OUString();
203*b1cdbd2cSJim Jagielski }
204*b1cdbd2cSJim Jagielski 
getAccessibleColumnDescription(sal_Int32 nColumn)205*b1cdbd2cSJim Jagielski rtl::OUString SAL_CALL ScAccessiblePreviewTable::getAccessibleColumnDescription( sal_Int32 nColumn )
206*b1cdbd2cSJim Jagielski 								throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
207*b1cdbd2cSJim Jagielski {
208*b1cdbd2cSJim Jagielski     // is not supported or specified so not implemented
209*b1cdbd2cSJim Jagielski /*	ScUnoGuard aGuard;
210*b1cdbd2cSJim Jagielski     IsObjectValid();
211*b1cdbd2cSJim Jagielski 
212*b1cdbd2cSJim Jagielski 	FillTableInfo();
213*b1cdbd2cSJim Jagielski 
214*b1cdbd2cSJim Jagielski 	rtl::OUString sName;
215*b1cdbd2cSJim Jagielski 	if ( mpTableInfo && nColumn >= 0 && nColumn < mpTableInfo->GetCols() )
216*b1cdbd2cSJim Jagielski 	{
217*b1cdbd2cSJim Jagielski 		const ScPreviewColRowInfo& rInfo = mpTableInfo->GetColInfo()[nColumn];
218*b1cdbd2cSJim Jagielski 		if ( rInfo.bIsHeader )
219*b1cdbd2cSJim Jagielski 		{
220*b1cdbd2cSJim Jagielski 			//!	name of row headers column?
221*b1cdbd2cSJim Jagielski 
222*b1cdbd2cSJim Jagielski 			sName = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("Row Headers"));
223*b1cdbd2cSJim Jagielski 		}
224*b1cdbd2cSJim Jagielski 		else
225*b1cdbd2cSJim Jagielski 		{
226*b1cdbd2cSJim Jagielski 			// normal column name
227*b1cdbd2cSJim Jagielski 			sName = ScColToAlpha( rInfo.nDocIndex );
228*b1cdbd2cSJim Jagielski 		}
229*b1cdbd2cSJim Jagielski 	}
230*b1cdbd2cSJim Jagielski 	else
231*b1cdbd2cSJim Jagielski 		throw lang::IndexOutOfBoundsException();*/
232*b1cdbd2cSJim Jagielski 
233*b1cdbd2cSJim Jagielski     ScUnoGuard aGuard;
234*b1cdbd2cSJim Jagielski 	FillTableInfo();
235*b1cdbd2cSJim Jagielski 	if ( nColumn < 0 || (mpTableInfo && nColumn >= mpTableInfo->GetCols()) )
236*b1cdbd2cSJim Jagielski 		throw lang::IndexOutOfBoundsException();
237*b1cdbd2cSJim Jagielski 
238*b1cdbd2cSJim Jagielski     return rtl::OUString();
239*b1cdbd2cSJim Jagielski }
240*b1cdbd2cSJim Jagielski 
getAccessibleRowExtentAt(sal_Int32 nRow,sal_Int32 nColumn)241*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL ScAccessiblePreviewTable::getAccessibleRowExtentAt( sal_Int32 nRow, sal_Int32 nColumn )
242*b1cdbd2cSJim Jagielski     							throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
243*b1cdbd2cSJim Jagielski {
244*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
245*b1cdbd2cSJim Jagielski     IsObjectValid();
246*b1cdbd2cSJim Jagielski 
247*b1cdbd2cSJim Jagielski 	FillTableInfo();
248*b1cdbd2cSJim Jagielski 
249*b1cdbd2cSJim Jagielski 	sal_Int32 nRows = 1;
250*b1cdbd2cSJim Jagielski 	if ( mpViewShell && mpTableInfo && nColumn >= 0 && nRow >= 0 &&
251*b1cdbd2cSJim Jagielski 			nColumn < mpTableInfo->GetCols() && nRow < mpTableInfo->GetRows() )
252*b1cdbd2cSJim Jagielski 	{
253*b1cdbd2cSJim Jagielski 		const ScPreviewColRowInfo& rColInfo = mpTableInfo->GetColInfo()[nColumn];
254*b1cdbd2cSJim Jagielski 		const ScPreviewColRowInfo& rRowInfo = mpTableInfo->GetRowInfo()[nRow];
255*b1cdbd2cSJim Jagielski 
256*b1cdbd2cSJim Jagielski 		if ( rColInfo.bIsHeader || rRowInfo.bIsHeader )
257*b1cdbd2cSJim Jagielski 		{
258*b1cdbd2cSJim Jagielski 			//	header cells only span a single cell
259*b1cdbd2cSJim Jagielski 		}
260*b1cdbd2cSJim Jagielski 		else
261*b1cdbd2cSJim Jagielski 		{
262*b1cdbd2cSJim Jagielski 			ScDocument* pDoc = mpViewShell->GetDocument();
263*b1cdbd2cSJim Jagielski 			const ScMergeAttr* pItem = (const ScMergeAttr*)pDoc->GetAttr(
264*b1cdbd2cSJim Jagielski 				static_cast<SCCOL>(rColInfo.nDocIndex), static_cast<SCROW>(rRowInfo.nDocIndex), mpTableInfo->GetTab(), ATTR_MERGE );
265*b1cdbd2cSJim Jagielski 			if ( pItem && pItem->GetRowMerge() > 0 )
266*b1cdbd2cSJim Jagielski 				nRows = pItem->GetRowMerge();
267*b1cdbd2cSJim Jagielski 		}
268*b1cdbd2cSJim Jagielski 	}
269*b1cdbd2cSJim Jagielski 	else
270*b1cdbd2cSJim Jagielski 		throw lang::IndexOutOfBoundsException();
271*b1cdbd2cSJim Jagielski 
272*b1cdbd2cSJim Jagielski 	return nRows;
273*b1cdbd2cSJim Jagielski }
274*b1cdbd2cSJim Jagielski 
getAccessibleColumnExtentAt(sal_Int32 nRow,sal_Int32 nColumn)275*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL ScAccessiblePreviewTable::getAccessibleColumnExtentAt( sal_Int32 nRow, sal_Int32 nColumn )
276*b1cdbd2cSJim Jagielski     							throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
277*b1cdbd2cSJim Jagielski {
278*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
279*b1cdbd2cSJim Jagielski     IsObjectValid();
280*b1cdbd2cSJim Jagielski 
281*b1cdbd2cSJim Jagielski 	FillTableInfo();
282*b1cdbd2cSJim Jagielski 
283*b1cdbd2cSJim Jagielski 	sal_Int32 nColumns = 1;
284*b1cdbd2cSJim Jagielski 	if ( mpViewShell && mpTableInfo && nColumn >= 0 && nRow >= 0 &&
285*b1cdbd2cSJim Jagielski 			nColumn < mpTableInfo->GetCols() && nRow < mpTableInfo->GetRows() )
286*b1cdbd2cSJim Jagielski 	{
287*b1cdbd2cSJim Jagielski 		const ScPreviewColRowInfo& rColInfo = mpTableInfo->GetColInfo()[nColumn];
288*b1cdbd2cSJim Jagielski 		const ScPreviewColRowInfo& rRowInfo = mpTableInfo->GetRowInfo()[nRow];
289*b1cdbd2cSJim Jagielski 
290*b1cdbd2cSJim Jagielski 		if ( rColInfo.bIsHeader || rRowInfo.bIsHeader )
291*b1cdbd2cSJim Jagielski 		{
292*b1cdbd2cSJim Jagielski 			//	header cells only span a single cell
293*b1cdbd2cSJim Jagielski 		}
294*b1cdbd2cSJim Jagielski 		else
295*b1cdbd2cSJim Jagielski 		{
296*b1cdbd2cSJim Jagielski 			ScDocument* pDoc = mpViewShell->GetDocument();
297*b1cdbd2cSJim Jagielski 			const ScMergeAttr* pItem = (const ScMergeAttr*)pDoc->GetAttr(
298*b1cdbd2cSJim Jagielski 				static_cast<SCCOL>(rColInfo.nDocIndex), static_cast<SCROW>(rRowInfo.nDocIndex), mpTableInfo->GetTab(), ATTR_MERGE );
299*b1cdbd2cSJim Jagielski 			if ( pItem && pItem->GetColMerge() > 0 )
300*b1cdbd2cSJim Jagielski 				nColumns = pItem->GetColMerge();
301*b1cdbd2cSJim Jagielski 		}
302*b1cdbd2cSJim Jagielski 	}
303*b1cdbd2cSJim Jagielski 	else
304*b1cdbd2cSJim Jagielski 		throw lang::IndexOutOfBoundsException();
305*b1cdbd2cSJim Jagielski 
306*b1cdbd2cSJim Jagielski 	return nColumns;
307*b1cdbd2cSJim Jagielski }
308*b1cdbd2cSJim Jagielski 
getAccessibleRowHeaders()309*b1cdbd2cSJim Jagielski uno::Reference< XAccessibleTable > SAL_CALL ScAccessiblePreviewTable::getAccessibleRowHeaders() throw (uno::RuntimeException)
310*b1cdbd2cSJim Jagielski {
311*b1cdbd2cSJim Jagielski 	//! missing
312*b1cdbd2cSJim Jagielski 	return NULL;
313*b1cdbd2cSJim Jagielski }
314*b1cdbd2cSJim Jagielski 
getAccessibleColumnHeaders()315*b1cdbd2cSJim Jagielski uno::Reference< XAccessibleTable > SAL_CALL ScAccessiblePreviewTable::getAccessibleColumnHeaders() throw (uno::RuntimeException)
316*b1cdbd2cSJim Jagielski {
317*b1cdbd2cSJim Jagielski 	//! missing
318*b1cdbd2cSJim Jagielski 	return NULL;
319*b1cdbd2cSJim Jagielski }
320*b1cdbd2cSJim Jagielski 
getSelectedAccessibleRows()321*b1cdbd2cSJim Jagielski uno::Sequence< sal_Int32 > SAL_CALL ScAccessiblePreviewTable::getSelectedAccessibleRows() throw (uno::RuntimeException)
322*b1cdbd2cSJim Jagielski {
323*b1cdbd2cSJim Jagielski 	//	in the page preview, there is no selection
324*b1cdbd2cSJim Jagielski     return uno::Sequence<sal_Int32>(0);
325*b1cdbd2cSJim Jagielski }
326*b1cdbd2cSJim Jagielski 
getSelectedAccessibleColumns()327*b1cdbd2cSJim Jagielski uno::Sequence< sal_Int32 > SAL_CALL ScAccessiblePreviewTable::getSelectedAccessibleColumns() throw (uno::RuntimeException)
328*b1cdbd2cSJim Jagielski {
329*b1cdbd2cSJim Jagielski 	//	in the page preview, there is no selection
330*b1cdbd2cSJim Jagielski 	return uno::Sequence<sal_Int32>(0);
331*b1cdbd2cSJim Jagielski }
332*b1cdbd2cSJim Jagielski 
isAccessibleRowSelected(sal_Int32 nRow)333*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL ScAccessiblePreviewTable::isAccessibleRowSelected( sal_Int32 nRow )
334*b1cdbd2cSJim Jagielski     							throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
335*b1cdbd2cSJim Jagielski {
336*b1cdbd2cSJim Jagielski 	//	in the page preview, there is no selection
337*b1cdbd2cSJim Jagielski 
338*b1cdbd2cSJim Jagielski     ScUnoGuard aGuard;
339*b1cdbd2cSJim Jagielski     FillTableInfo();
340*b1cdbd2cSJim Jagielski     if ( nRow < 0 || (mpTableInfo && nRow >= mpTableInfo->GetRows()) )
341*b1cdbd2cSJim Jagielski 		throw lang::IndexOutOfBoundsException();
342*b1cdbd2cSJim Jagielski 
343*b1cdbd2cSJim Jagielski     return sal_False;
344*b1cdbd2cSJim Jagielski }
345*b1cdbd2cSJim Jagielski 
isAccessibleColumnSelected(sal_Int32 nColumn)346*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL ScAccessiblePreviewTable::isAccessibleColumnSelected( sal_Int32 nColumn )
347*b1cdbd2cSJim Jagielski     							throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
348*b1cdbd2cSJim Jagielski {
349*b1cdbd2cSJim Jagielski 	//	in the page preview, there is no selection
350*b1cdbd2cSJim Jagielski 
351*b1cdbd2cSJim Jagielski     ScUnoGuard aGuard;
352*b1cdbd2cSJim Jagielski 	FillTableInfo();
353*b1cdbd2cSJim Jagielski 	if ( nColumn < 0 || (mpTableInfo && nColumn >= mpTableInfo->GetCols()) )
354*b1cdbd2cSJim Jagielski 		throw lang::IndexOutOfBoundsException();
355*b1cdbd2cSJim Jagielski 
356*b1cdbd2cSJim Jagielski     return sal_False;
357*b1cdbd2cSJim Jagielski }
358*b1cdbd2cSJim Jagielski 
getAccessibleCellAt(sal_Int32 nRow,sal_Int32 nColumn)359*b1cdbd2cSJim Jagielski uno::Reference< XAccessible > SAL_CALL ScAccessiblePreviewTable::getAccessibleCellAt( sal_Int32 nRow, sal_Int32 nColumn )
360*b1cdbd2cSJim Jagielski     							throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
361*b1cdbd2cSJim Jagielski {
362*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
363*b1cdbd2cSJim Jagielski     IsObjectValid();
364*b1cdbd2cSJim Jagielski 
365*b1cdbd2cSJim Jagielski 	FillTableInfo();
366*b1cdbd2cSJim Jagielski 
367*b1cdbd2cSJim Jagielski 	uno::Reference<XAccessible> xRet;
368*b1cdbd2cSJim Jagielski 	if ( mpTableInfo && nColumn >= 0 && nRow >= 0 && nColumn < mpTableInfo->GetCols() && nRow < mpTableInfo->GetRows() )
369*b1cdbd2cSJim Jagielski 	{
370*b1cdbd2cSJim Jagielski 		//	index iterates horizontally
371*b1cdbd2cSJim Jagielski 		long nNewIndex = nRow * mpTableInfo->GetCols() + nColumn;
372*b1cdbd2cSJim Jagielski 
373*b1cdbd2cSJim Jagielski 		const ScPreviewColRowInfo& rColInfo = mpTableInfo->GetColInfo()[nColumn];
374*b1cdbd2cSJim Jagielski 		const ScPreviewColRowInfo& rRowInfo = mpTableInfo->GetRowInfo()[nRow];
375*b1cdbd2cSJim Jagielski 
376*b1cdbd2cSJim Jagielski 		ScAddress aCellPos( static_cast<SCCOL>(rColInfo.nDocIndex), static_cast<SCROW>(rRowInfo.nDocIndex), mpTableInfo->GetTab() );
377*b1cdbd2cSJim Jagielski 		if ( rColInfo.bIsHeader || rRowInfo.bIsHeader )
378*b1cdbd2cSJim Jagielski 		{
379*b1cdbd2cSJim Jagielski 			ScAccessiblePreviewHeaderCell* pHeaderCell = new ScAccessiblePreviewHeaderCell( this, mpViewShell, aCellPos,
380*b1cdbd2cSJim Jagielski 										rRowInfo.bIsHeader, rColInfo.bIsHeader, nNewIndex );
381*b1cdbd2cSJim Jagielski 			xRet = pHeaderCell;
382*b1cdbd2cSJim Jagielski 			pHeaderCell->Init();
383*b1cdbd2cSJim Jagielski 		}
384*b1cdbd2cSJim Jagielski 		else
385*b1cdbd2cSJim Jagielski 		{
386*b1cdbd2cSJim Jagielski 			ScAccessiblePreviewCell* pCell = new ScAccessiblePreviewCell( this, mpViewShell, aCellPos, nNewIndex );
387*b1cdbd2cSJim Jagielski 			xRet = pCell;
388*b1cdbd2cSJim Jagielski 			pCell->Init();
389*b1cdbd2cSJim Jagielski 		}
390*b1cdbd2cSJim Jagielski 	}
391*b1cdbd2cSJim Jagielski 
392*b1cdbd2cSJim Jagielski 	if ( !xRet.is() )
393*b1cdbd2cSJim Jagielski 		throw lang::IndexOutOfBoundsException();
394*b1cdbd2cSJim Jagielski 
395*b1cdbd2cSJim Jagielski 	return xRet;
396*b1cdbd2cSJim Jagielski }
397*b1cdbd2cSJim Jagielski 
getAccessibleCaption()398*b1cdbd2cSJim Jagielski uno::Reference< XAccessible > SAL_CALL ScAccessiblePreviewTable::getAccessibleCaption() throw (uno::RuntimeException)
399*b1cdbd2cSJim Jagielski {
400*b1cdbd2cSJim Jagielski 	//! missing
401*b1cdbd2cSJim Jagielski 	return NULL;
402*b1cdbd2cSJim Jagielski }
403*b1cdbd2cSJim Jagielski 
getAccessibleSummary()404*b1cdbd2cSJim Jagielski uno::Reference< XAccessible > SAL_CALL ScAccessiblePreviewTable::getAccessibleSummary() throw (uno::RuntimeException)
405*b1cdbd2cSJim Jagielski {
406*b1cdbd2cSJim Jagielski 	//! missing
407*b1cdbd2cSJim Jagielski 	return NULL;
408*b1cdbd2cSJim Jagielski }
409*b1cdbd2cSJim Jagielski 
isAccessibleSelected(sal_Int32 nRow,sal_Int32 nColumn)410*b1cdbd2cSJim Jagielski sal_Bool SAL_CALL ScAccessiblePreviewTable::isAccessibleSelected( sal_Int32 nRow, sal_Int32 nColumn )
411*b1cdbd2cSJim Jagielski     							throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
412*b1cdbd2cSJim Jagielski {
413*b1cdbd2cSJim Jagielski 	//	in the page preview, there is no selection
414*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
415*b1cdbd2cSJim Jagielski     IsObjectValid();
416*b1cdbd2cSJim Jagielski 
417*b1cdbd2cSJim Jagielski 	FillTableInfo();
418*b1cdbd2cSJim Jagielski 
419*b1cdbd2cSJim Jagielski 	if ( mpTableInfo && nColumn >= 0 && nRow >= 0 && nColumn < mpTableInfo->GetCols() && nRow < mpTableInfo->GetRows() )
420*b1cdbd2cSJim Jagielski 	{
421*b1cdbd2cSJim Jagielski 		//	index iterates horizontally
422*b1cdbd2cSJim Jagielski 	}
423*b1cdbd2cSJim Jagielski 	else
424*b1cdbd2cSJim Jagielski 		throw lang::IndexOutOfBoundsException();
425*b1cdbd2cSJim Jagielski 
426*b1cdbd2cSJim Jagielski 	return sal_False;
427*b1cdbd2cSJim Jagielski }
428*b1cdbd2cSJim Jagielski 
getAccessibleIndex(sal_Int32 nRow,sal_Int32 nColumn)429*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL ScAccessiblePreviewTable::getAccessibleIndex( sal_Int32 nRow, sal_Int32 nColumn )
430*b1cdbd2cSJim Jagielski     							throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
431*b1cdbd2cSJim Jagielski {
432*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
433*b1cdbd2cSJim Jagielski     IsObjectValid();
434*b1cdbd2cSJim Jagielski 
435*b1cdbd2cSJim Jagielski 	FillTableInfo();
436*b1cdbd2cSJim Jagielski 
437*b1cdbd2cSJim Jagielski 	sal_Int32 nRet = 0;
438*b1cdbd2cSJim Jagielski 	if ( mpTableInfo && nColumn >= 0 && nRow >= 0 && nColumn < mpTableInfo->GetCols() && nRow < mpTableInfo->GetRows() )
439*b1cdbd2cSJim Jagielski 	{
440*b1cdbd2cSJim Jagielski 		//	index iterates horizontally
441*b1cdbd2cSJim Jagielski 		nRet = nRow * mpTableInfo->GetCols() + nColumn;
442*b1cdbd2cSJim Jagielski 	}
443*b1cdbd2cSJim Jagielski 	else
444*b1cdbd2cSJim Jagielski 		throw lang::IndexOutOfBoundsException();
445*b1cdbd2cSJim Jagielski 
446*b1cdbd2cSJim Jagielski 	return nRet;
447*b1cdbd2cSJim Jagielski }
448*b1cdbd2cSJim Jagielski 
getAccessibleRow(sal_Int32 nChildIndex)449*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL ScAccessiblePreviewTable::getAccessibleRow( sal_Int32 nChildIndex )
450*b1cdbd2cSJim Jagielski     							throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
451*b1cdbd2cSJim Jagielski {
452*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
453*b1cdbd2cSJim Jagielski     IsObjectValid();
454*b1cdbd2cSJim Jagielski 
455*b1cdbd2cSJim Jagielski 	FillTableInfo();
456*b1cdbd2cSJim Jagielski 
457*b1cdbd2cSJim Jagielski 	sal_Int32 nRow = 0;
458*b1cdbd2cSJim Jagielski 	if ( mpTableInfo && nChildIndex >= 0 && nChildIndex < static_cast<sal_Int32>(mpTableInfo->GetRows()) * mpTableInfo->GetCols() )
459*b1cdbd2cSJim Jagielski 	{
460*b1cdbd2cSJim Jagielski 		nRow = nChildIndex / mpTableInfo->GetCols();
461*b1cdbd2cSJim Jagielski 	}
462*b1cdbd2cSJim Jagielski 	else
463*b1cdbd2cSJim Jagielski 		throw lang::IndexOutOfBoundsException();
464*b1cdbd2cSJim Jagielski 
465*b1cdbd2cSJim Jagielski 	return nRow;
466*b1cdbd2cSJim Jagielski }
467*b1cdbd2cSJim Jagielski 
getAccessibleColumn(sal_Int32 nChildIndex)468*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL ScAccessiblePreviewTable::getAccessibleColumn( sal_Int32 nChildIndex )
469*b1cdbd2cSJim Jagielski     							throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
470*b1cdbd2cSJim Jagielski {
471*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
472*b1cdbd2cSJim Jagielski     IsObjectValid();
473*b1cdbd2cSJim Jagielski 
474*b1cdbd2cSJim Jagielski 	FillTableInfo();
475*b1cdbd2cSJim Jagielski 
476*b1cdbd2cSJim Jagielski 	sal_Int32 nCol = 0;
477*b1cdbd2cSJim Jagielski 	if ( mpTableInfo && nChildIndex >= 0 && nChildIndex < static_cast<sal_Int32>(mpTableInfo->GetRows()) * mpTableInfo->GetCols() )
478*b1cdbd2cSJim Jagielski 	{
479*b1cdbd2cSJim Jagielski 		nCol = nChildIndex % static_cast<sal_Int32>(mpTableInfo->GetCols());
480*b1cdbd2cSJim Jagielski 	}
481*b1cdbd2cSJim Jagielski 	else
482*b1cdbd2cSJim Jagielski 		throw lang::IndexOutOfBoundsException();
483*b1cdbd2cSJim Jagielski 
484*b1cdbd2cSJim Jagielski 	return nCol;
485*b1cdbd2cSJim Jagielski }
486*b1cdbd2cSJim Jagielski 
487*b1cdbd2cSJim Jagielski //=====  XAccessibleComponent  ============================================
488*b1cdbd2cSJim Jagielski 
getAccessibleAtPoint(const awt::Point & aPoint)489*b1cdbd2cSJim Jagielski uno::Reference< XAccessible > SAL_CALL ScAccessiblePreviewTable::getAccessibleAtPoint( const awt::Point& aPoint )
490*b1cdbd2cSJim Jagielski     							throw (uno::RuntimeException)
491*b1cdbd2cSJim Jagielski {
492*b1cdbd2cSJim Jagielski     uno::Reference<XAccessible> xRet;
493*b1cdbd2cSJim Jagielski     if (containsPoint(aPoint))
494*b1cdbd2cSJim Jagielski     {
495*b1cdbd2cSJim Jagielski 	    ScUnoGuard aGuard;
496*b1cdbd2cSJim Jagielski         IsObjectValid();
497*b1cdbd2cSJim Jagielski 
498*b1cdbd2cSJim Jagielski 	    FillTableInfo();
499*b1cdbd2cSJim Jagielski 
500*b1cdbd2cSJim Jagielski 	    if ( mpTableInfo )
501*b1cdbd2cSJim Jagielski 	    {
502*b1cdbd2cSJim Jagielski 		    SCCOL nCols = mpTableInfo->GetCols();
503*b1cdbd2cSJim Jagielski 		    SCROW nRows = mpTableInfo->GetRows();
504*b1cdbd2cSJim Jagielski 		    const ScPreviewColRowInfo* pColInfo = mpTableInfo->GetColInfo();
505*b1cdbd2cSJim Jagielski 		    const ScPreviewColRowInfo* pRowInfo = mpTableInfo->GetRowInfo();
506*b1cdbd2cSJim Jagielski 
507*b1cdbd2cSJim Jagielski             Rectangle aScreenRect(GetBoundingBox());
508*b1cdbd2cSJim Jagielski 
509*b1cdbd2cSJim Jagielski             awt::Point aMovedPoint = aPoint;
510*b1cdbd2cSJim Jagielski             aMovedPoint.X += aScreenRect.Left();
511*b1cdbd2cSJim Jagielski             aMovedPoint.Y += aScreenRect.Top();
512*b1cdbd2cSJim Jagielski 
513*b1cdbd2cSJim Jagielski 		    if ( nCols > 0 && nRows > 0 && aMovedPoint.X >= pColInfo[0].nPixelStart && aMovedPoint.Y >= pRowInfo[0].nPixelStart )
514*b1cdbd2cSJim Jagielski 		    {
515*b1cdbd2cSJim Jagielski 			    SCCOL nColIndex = 0;
516*b1cdbd2cSJim Jagielski 			    while ( nColIndex < nCols && aMovedPoint.X > pColInfo[nColIndex].nPixelEnd )
517*b1cdbd2cSJim Jagielski 				    ++nColIndex;
518*b1cdbd2cSJim Jagielski 			    SCROW nRowIndex = 0;
519*b1cdbd2cSJim Jagielski 			    while ( nRowIndex < nRows && aMovedPoint.Y > pRowInfo[nRowIndex].nPixelEnd )
520*b1cdbd2cSJim Jagielski 				    ++nRowIndex;
521*b1cdbd2cSJim Jagielski 			    if ( nColIndex < nCols && nRowIndex < nRows )
522*b1cdbd2cSJim Jagielski 			    {
523*b1cdbd2cSJim Jagielski 				    try
524*b1cdbd2cSJim Jagielski 				    {
525*b1cdbd2cSJim Jagielski 					    xRet = getAccessibleCellAt( nRowIndex, nColIndex );
526*b1cdbd2cSJim Jagielski 				    }
527*b1cdbd2cSJim Jagielski 				    catch (uno::Exception&)
528*b1cdbd2cSJim Jagielski 				    {
529*b1cdbd2cSJim Jagielski 				    }
530*b1cdbd2cSJim Jagielski 			    }
531*b1cdbd2cSJim Jagielski 		    }
532*b1cdbd2cSJim Jagielski 	    }
533*b1cdbd2cSJim Jagielski     }
534*b1cdbd2cSJim Jagielski 
535*b1cdbd2cSJim Jagielski 	return xRet;
536*b1cdbd2cSJim Jagielski }
537*b1cdbd2cSJim Jagielski 
grabFocus()538*b1cdbd2cSJim Jagielski void SAL_CALL ScAccessiblePreviewTable::grabFocus() throw (uno::RuntimeException)
539*b1cdbd2cSJim Jagielski {
540*b1cdbd2cSJim Jagielski  	ScUnoGuard aGuard;
541*b1cdbd2cSJim Jagielski     IsObjectValid();
542*b1cdbd2cSJim Jagielski 	if (getAccessibleParent().is())
543*b1cdbd2cSJim Jagielski 	{
544*b1cdbd2cSJim Jagielski 		uno::Reference<XAccessibleComponent> xAccessibleComponent(getAccessibleParent()->getAccessibleContext(), uno::UNO_QUERY);
545*b1cdbd2cSJim Jagielski 		if (xAccessibleComponent.is())
546*b1cdbd2cSJim Jagielski 			xAccessibleComponent->grabFocus();
547*b1cdbd2cSJim Jagielski 	}
548*b1cdbd2cSJim Jagielski }
549*b1cdbd2cSJim Jagielski 
550*b1cdbd2cSJim Jagielski //=====  XAccessibleContext  ==============================================
551*b1cdbd2cSJim Jagielski 
getAccessibleChildCount()552*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL ScAccessiblePreviewTable::getAccessibleChildCount() throw (uno::RuntimeException)
553*b1cdbd2cSJim Jagielski {
554*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
555*b1cdbd2cSJim Jagielski     IsObjectValid();
556*b1cdbd2cSJim Jagielski 
557*b1cdbd2cSJim Jagielski 	FillTableInfo();
558*b1cdbd2cSJim Jagielski 
559*b1cdbd2cSJim Jagielski 	long nRet = 0;
560*b1cdbd2cSJim Jagielski 	if ( mpTableInfo )
561*b1cdbd2cSJim Jagielski 		nRet = static_cast<sal_Int32>(mpTableInfo->GetCols()) * mpTableInfo->GetRows();
562*b1cdbd2cSJim Jagielski 	return nRet;
563*b1cdbd2cSJim Jagielski }
564*b1cdbd2cSJim Jagielski 
getAccessibleChild(sal_Int32 nIndex)565*b1cdbd2cSJim Jagielski uno::Reference< XAccessible > SAL_CALL ScAccessiblePreviewTable::getAccessibleChild( sal_Int32 nIndex )
566*b1cdbd2cSJim Jagielski     							throw (lang::IndexOutOfBoundsException, uno::RuntimeException)
567*b1cdbd2cSJim Jagielski {
568*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
569*b1cdbd2cSJim Jagielski     IsObjectValid();
570*b1cdbd2cSJim Jagielski 
571*b1cdbd2cSJim Jagielski 	FillTableInfo();
572*b1cdbd2cSJim Jagielski 
573*b1cdbd2cSJim Jagielski 	uno::Reference<XAccessible> xRet;
574*b1cdbd2cSJim Jagielski 	if ( mpTableInfo )
575*b1cdbd2cSJim Jagielski 	{
576*b1cdbd2cSJim Jagielski 		long nColumns = mpTableInfo->GetCols();
577*b1cdbd2cSJim Jagielski 		if ( nColumns > 0 )
578*b1cdbd2cSJim Jagielski 		{
579*b1cdbd2cSJim Jagielski 			// nCol, nRow are within the visible table, not the document
580*b1cdbd2cSJim Jagielski 			long nCol = nIndex % nColumns;
581*b1cdbd2cSJim Jagielski 			long nRow = nIndex / nColumns;
582*b1cdbd2cSJim Jagielski 
583*b1cdbd2cSJim Jagielski 			xRet = getAccessibleCellAt( nRow, nCol );
584*b1cdbd2cSJim Jagielski 		}
585*b1cdbd2cSJim Jagielski 	}
586*b1cdbd2cSJim Jagielski 
587*b1cdbd2cSJim Jagielski 	if ( !xRet.is() )
588*b1cdbd2cSJim Jagielski 		throw lang::IndexOutOfBoundsException();
589*b1cdbd2cSJim Jagielski 
590*b1cdbd2cSJim Jagielski 	return xRet;
591*b1cdbd2cSJim Jagielski }
592*b1cdbd2cSJim Jagielski 
getAccessibleIndexInParent()593*b1cdbd2cSJim Jagielski sal_Int32 SAL_CALL ScAccessiblePreviewTable::getAccessibleIndexInParent() throw (uno::RuntimeException)
594*b1cdbd2cSJim Jagielski {
595*b1cdbd2cSJim Jagielski 	return mnIndex;
596*b1cdbd2cSJim Jagielski }
597*b1cdbd2cSJim Jagielski 
getAccessibleStateSet()598*b1cdbd2cSJim Jagielski uno::Reference< XAccessibleStateSet > SAL_CALL ScAccessiblePreviewTable::getAccessibleStateSet()
599*b1cdbd2cSJim Jagielski 								throw (uno::RuntimeException)
600*b1cdbd2cSJim Jagielski {
601*b1cdbd2cSJim Jagielski 	ScUnoGuard aGuard;
602*b1cdbd2cSJim Jagielski 	uno::Reference<XAccessibleStateSet> xParentStates;
603*b1cdbd2cSJim Jagielski 	if (getAccessibleParent().is())
604*b1cdbd2cSJim Jagielski 	{
605*b1cdbd2cSJim Jagielski 		uno::Reference<XAccessibleContext> xParentContext = getAccessibleParent()->getAccessibleContext();
606*b1cdbd2cSJim Jagielski 		xParentStates = xParentContext->getAccessibleStateSet();
607*b1cdbd2cSJim Jagielski 	}
608*b1cdbd2cSJim Jagielski 	utl::AccessibleStateSetHelper* pStateSet = new utl::AccessibleStateSetHelper();
609*b1cdbd2cSJim Jagielski 	if (IsDefunc(xParentStates))
610*b1cdbd2cSJim Jagielski 		pStateSet->AddState(AccessibleStateType::DEFUNC);
611*b1cdbd2cSJim Jagielski     else
612*b1cdbd2cSJim Jagielski     {
613*b1cdbd2cSJim Jagielski         pStateSet->AddState(AccessibleStateType::MANAGES_DESCENDANTS);
614*b1cdbd2cSJim Jagielski 	    pStateSet->AddState(AccessibleStateType::ENABLED);
615*b1cdbd2cSJim Jagielski 	    pStateSet->AddState(AccessibleStateType::OPAQUE);
616*b1cdbd2cSJim Jagielski 	    if (isShowing())
617*b1cdbd2cSJim Jagielski 		    pStateSet->AddState(AccessibleStateType::SHOWING);
618*b1cdbd2cSJim Jagielski 	    if (isVisible())
619*b1cdbd2cSJim Jagielski 		    pStateSet->AddState(AccessibleStateType::VISIBLE);
620*b1cdbd2cSJim Jagielski     }
621*b1cdbd2cSJim Jagielski 	return pStateSet;
622*b1cdbd2cSJim Jagielski }
623*b1cdbd2cSJim Jagielski 
624*b1cdbd2cSJim Jagielski //=====  XServiceInfo  ====================================================
625*b1cdbd2cSJim Jagielski 
getImplementationName()626*b1cdbd2cSJim Jagielski rtl::OUString SAL_CALL ScAccessiblePreviewTable::getImplementationName() throw(uno::RuntimeException)
627*b1cdbd2cSJim Jagielski {
628*b1cdbd2cSJim Jagielski 	return rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("ScAccessiblePreviewTable"));
629*b1cdbd2cSJim Jagielski }
630*b1cdbd2cSJim Jagielski 
getSupportedServiceNames()631*b1cdbd2cSJim Jagielski uno::Sequence<rtl::OUString> SAL_CALL ScAccessiblePreviewTable::getSupportedServiceNames()
632*b1cdbd2cSJim Jagielski 													throw(uno::RuntimeException)
633*b1cdbd2cSJim Jagielski {
634*b1cdbd2cSJim Jagielski 	uno::Sequence< ::rtl::OUString > aSequence = ScAccessibleContextBase::getSupportedServiceNames();
635*b1cdbd2cSJim Jagielski     sal_Int32 nOldSize(aSequence.getLength());
636*b1cdbd2cSJim Jagielski     aSequence.realloc(nOldSize + 1);
637*b1cdbd2cSJim Jagielski     ::rtl::OUString* pNames = aSequence.getArray();
638*b1cdbd2cSJim Jagielski 
639*b1cdbd2cSJim Jagielski 	pNames[nOldSize] = rtl::OUString(RTL_CONSTASCII_USTRINGPARAM("com.sun.star.table.AccessibleTableView"));
640*b1cdbd2cSJim Jagielski 
641*b1cdbd2cSJim Jagielski 	return aSequence;
642*b1cdbd2cSJim Jagielski }
643*b1cdbd2cSJim Jagielski 
644*b1cdbd2cSJim Jagielski //=====  XTypeProvider  ===================================================
645*b1cdbd2cSJim Jagielski 
getTypes()646*b1cdbd2cSJim Jagielski uno::Sequence< uno::Type > SAL_CALL ScAccessiblePreviewTable::getTypes()
647*b1cdbd2cSJim Jagielski 		throw (uno::RuntimeException)
648*b1cdbd2cSJim Jagielski {
649*b1cdbd2cSJim Jagielski 	return comphelper::concatSequences(ScAccessiblePreviewTableImpl::getTypes(), ScAccessibleContextBase::getTypes());
650*b1cdbd2cSJim Jagielski }
651*b1cdbd2cSJim Jagielski 
getImplementationId()652*b1cdbd2cSJim Jagielski uno::Sequence<sal_Int8> SAL_CALL ScAccessiblePreviewTable::getImplementationId()
653*b1cdbd2cSJim Jagielski 													throw(uno::RuntimeException)
654*b1cdbd2cSJim Jagielski {
655*b1cdbd2cSJim Jagielski 	static uno::Sequence< sal_Int8 > aId;
656*b1cdbd2cSJim Jagielski 	if( aId.getLength() == 0 )
657*b1cdbd2cSJim Jagielski 	{
658*b1cdbd2cSJim Jagielski 		aId.realloc( 16 );
659*b1cdbd2cSJim Jagielski 		rtl_createUuid (reinterpret_cast<sal_uInt8 *>(aId.getArray()), 0, sal_True);
660*b1cdbd2cSJim Jagielski 	}
661*b1cdbd2cSJim Jagielski 	return aId;
662*b1cdbd2cSJim Jagielski }
663*b1cdbd2cSJim Jagielski 
664*b1cdbd2cSJim Jagielski //====  internal  =========================================================
665*b1cdbd2cSJim Jagielski 
createAccessibleDescription(void)666*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL ScAccessiblePreviewTable::createAccessibleDescription(void)
667*b1cdbd2cSJim Jagielski 				    throw (uno::RuntimeException)
668*b1cdbd2cSJim Jagielski {
669*b1cdbd2cSJim Jagielski     String sDesc(ScResId(STR_ACC_TABLE_DESCR));
670*b1cdbd2cSJim Jagielski /*    if (mpViewShell && mpViewShell->GetDocument())
671*b1cdbd2cSJim Jagielski     {
672*b1cdbd2cSJim Jagielski 	    FillTableInfo();
673*b1cdbd2cSJim Jagielski 
674*b1cdbd2cSJim Jagielski 	    if ( mpTableInfo )
675*b1cdbd2cSJim Jagielski 	    {
676*b1cdbd2cSJim Jagielski 	        String sCoreName;
677*b1cdbd2cSJim Jagielski 	        if (mpViewShell->GetDocument()->GetName( mpTableInfo->GetTab(), sCoreName ))
678*b1cdbd2cSJim Jagielski 		        sDesc.SearchAndReplaceAscii("%1", sCoreName);
679*b1cdbd2cSJim Jagielski         }
680*b1cdbd2cSJim Jagielski     }
681*b1cdbd2cSJim Jagielski     sDesc.SearchAndReplaceAscii("%2", String(ScResId(SCSTR_UNKNOWN)));*/
682*b1cdbd2cSJim Jagielski     return rtl::OUString(sDesc);
683*b1cdbd2cSJim Jagielski }
684*b1cdbd2cSJim Jagielski 
createAccessibleName(void)685*b1cdbd2cSJim Jagielski ::rtl::OUString SAL_CALL ScAccessiblePreviewTable::createAccessibleName(void)
686*b1cdbd2cSJim Jagielski 				    throw (uno::RuntimeException)
687*b1cdbd2cSJim Jagielski {
688*b1cdbd2cSJim Jagielski     String sName(ScResId(STR_ACC_TABLE_NAME));
689*b1cdbd2cSJim Jagielski 
690*b1cdbd2cSJim Jagielski     if (mpViewShell && mpViewShell->GetDocument())
691*b1cdbd2cSJim Jagielski     {
692*b1cdbd2cSJim Jagielski 	    FillTableInfo();
693*b1cdbd2cSJim Jagielski 
694*b1cdbd2cSJim Jagielski 	    if ( mpTableInfo )
695*b1cdbd2cSJim Jagielski 	    {
696*b1cdbd2cSJim Jagielski 	        String sCoreName;
697*b1cdbd2cSJim Jagielski 	        if (mpViewShell->GetDocument()->GetName( mpTableInfo->GetTab(), sCoreName ))
698*b1cdbd2cSJim Jagielski 		        sName.SearchAndReplaceAscii("%1", sCoreName);
699*b1cdbd2cSJim Jagielski         }
700*b1cdbd2cSJim Jagielski     }
701*b1cdbd2cSJim Jagielski 
702*b1cdbd2cSJim Jagielski     return rtl::OUString(sName);
703*b1cdbd2cSJim Jagielski }
704*b1cdbd2cSJim Jagielski 
GetBoundingBoxOnScreen() const705*b1cdbd2cSJim Jagielski Rectangle ScAccessiblePreviewTable::GetBoundingBoxOnScreen() const throw (uno::RuntimeException)
706*b1cdbd2cSJim Jagielski {
707*b1cdbd2cSJim Jagielski 	Rectangle aCellRect(GetBoundingBox());
708*b1cdbd2cSJim Jagielski 	if (mpViewShell)
709*b1cdbd2cSJim Jagielski 	{
710*b1cdbd2cSJim Jagielski 		Window* pWindow = mpViewShell->GetWindow();
711*b1cdbd2cSJim Jagielski 		if (pWindow)
712*b1cdbd2cSJim Jagielski 		{
713*b1cdbd2cSJim Jagielski 			Rectangle aRect = pWindow->GetWindowExtentsRelative(NULL);
714*b1cdbd2cSJim Jagielski 			aCellRect.setX(aCellRect.getX() + aRect.getX());
715*b1cdbd2cSJim Jagielski 			aCellRect.setY(aCellRect.getY() + aRect.getY());
716*b1cdbd2cSJim Jagielski 		}
717*b1cdbd2cSJim Jagielski 	}
718*b1cdbd2cSJim Jagielski 	return aCellRect;
719*b1cdbd2cSJim Jagielski }
720*b1cdbd2cSJim Jagielski 
GetBoundingBox() const721*b1cdbd2cSJim Jagielski Rectangle ScAccessiblePreviewTable::GetBoundingBox() const throw (uno::RuntimeException)
722*b1cdbd2cSJim Jagielski {
723*b1cdbd2cSJim Jagielski 	FillTableInfo();
724*b1cdbd2cSJim Jagielski 
725*b1cdbd2cSJim Jagielski 	Rectangle aRect;
726*b1cdbd2cSJim Jagielski 	if ( mpTableInfo )
727*b1cdbd2cSJim Jagielski 	{
728*b1cdbd2cSJim Jagielski 		SCCOL nColumns = mpTableInfo->GetCols();
729*b1cdbd2cSJim Jagielski 		SCROW nRows = mpTableInfo->GetRows();
730*b1cdbd2cSJim Jagielski 		if ( nColumns > 0 && nRows > 0 )
731*b1cdbd2cSJim Jagielski 		{
732*b1cdbd2cSJim Jagielski 			const ScPreviewColRowInfo* pColInfo = mpTableInfo->GetColInfo();
733*b1cdbd2cSJim Jagielski 			const ScPreviewColRowInfo* pRowInfo = mpTableInfo->GetRowInfo();
734*b1cdbd2cSJim Jagielski 
735*b1cdbd2cSJim Jagielski 			aRect = Rectangle( pColInfo[0].nPixelStart,
736*b1cdbd2cSJim Jagielski 							   pRowInfo[0].nPixelStart,
737*b1cdbd2cSJim Jagielski 							   pColInfo[nColumns-1].nPixelEnd,
738*b1cdbd2cSJim Jagielski 							   pRowInfo[nRows-1].nPixelEnd );
739*b1cdbd2cSJim Jagielski 		}
740*b1cdbd2cSJim Jagielski 	}
741*b1cdbd2cSJim Jagielski 	return aRect;
742*b1cdbd2cSJim Jagielski }
743*b1cdbd2cSJim Jagielski 
IsDefunc(const uno::Reference<XAccessibleStateSet> & rxParentStates)744*b1cdbd2cSJim Jagielski sal_Bool ScAccessiblePreviewTable::IsDefunc( const uno::Reference<XAccessibleStateSet>& rxParentStates )
745*b1cdbd2cSJim Jagielski {
746*b1cdbd2cSJim Jagielski 	return ScAccessibleContextBase::IsDefunc() || (mpViewShell == NULL) || !getAccessibleParent().is() ||
747*b1cdbd2cSJim Jagielski 		(rxParentStates.is() && rxParentStates->contains(AccessibleStateType::DEFUNC));
748*b1cdbd2cSJim Jagielski }
749*b1cdbd2cSJim Jagielski 
FillTableInfo() const750*b1cdbd2cSJim Jagielski void ScAccessiblePreviewTable::FillTableInfo() const
751*b1cdbd2cSJim Jagielski {
752*b1cdbd2cSJim Jagielski 	if ( mpViewShell && !mpTableInfo )
753*b1cdbd2cSJim Jagielski 	{
754*b1cdbd2cSJim Jagielski 		Size aOutputSize;
755*b1cdbd2cSJim Jagielski 		Window* pWindow = mpViewShell->GetWindow();
756*b1cdbd2cSJim Jagielski 		if ( pWindow )
757*b1cdbd2cSJim Jagielski 			aOutputSize = pWindow->GetOutputSizePixel();
758*b1cdbd2cSJim Jagielski         Point aPoint;
759*b1cdbd2cSJim Jagielski 		Rectangle aVisRect( aPoint, aOutputSize );
760*b1cdbd2cSJim Jagielski 
761*b1cdbd2cSJim Jagielski 		mpTableInfo = new ScPreviewTableInfo;
762*b1cdbd2cSJim Jagielski 		mpViewShell->GetLocationData().GetTableInfo( aVisRect, *mpTableInfo );
763*b1cdbd2cSJim Jagielski 	}
764*b1cdbd2cSJim Jagielski }
765*b1cdbd2cSJim Jagielski 
766