xref: /AOO41X/main/sw/source/core/access/acccell.cxx (revision 46b0c5debffe9fc43e60fe5cac69680d0f706d6b)
1efeef26fSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3efeef26fSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4efeef26fSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5efeef26fSAndrew Rist  * distributed with this work for additional information
6efeef26fSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7efeef26fSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8efeef26fSAndrew Rist  * "License"); you may not use this file except in compliance
9efeef26fSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11efeef26fSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13efeef26fSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14efeef26fSAndrew Rist  * software distributed under the License is distributed on an
15efeef26fSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16efeef26fSAndrew Rist  * KIND, either express or implied.  See the License for the
17efeef26fSAndrew Rist  * specific language governing permissions and limitations
18efeef26fSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20efeef26fSAndrew Rist  *************************************************************/
21efeef26fSAndrew Rist 
22efeef26fSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // MARKER(update_precomp.py): autogen include statement, do not remove
25cdf0e10cSrcweir #include "precompiled_sw.hxx"
26cdf0e10cSrcweir 
27cdf0e10cSrcweir 
28cdf0e10cSrcweir #include <vos/mutex.hxx>
29cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleRole.hpp>
30cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleStateType.hpp>
31cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleEventId.hpp>
32cdf0e10cSrcweir #include <unotools/accessiblestatesethelper.hxx>
33cdf0e10cSrcweir #include <rtl/uuid.h>
34cdf0e10cSrcweir #include <vcl/svapp.hxx>
35cdf0e10cSrcweir #include <cellfrm.hxx>
36cdf0e10cSrcweir #include <tabfrm.hxx>
37cdf0e10cSrcweir #include <swtable.hxx>
38cdf0e10cSrcweir #include "crsrsh.hxx"
39cdf0e10cSrcweir #include "viscrs.hxx"
40cdf0e10cSrcweir #include <accfrmobj.hxx>
41cdf0e10cSrcweir #include <accfrmobjslist.hxx>
42cdf0e10cSrcweir #include "frmfmt.hxx"
43cdf0e10cSrcweir #include "cellatr.hxx"
44cdf0e10cSrcweir #include "accmap.hxx"
45cdf0e10cSrcweir #include <acccell.hxx>
46cdf0e10cSrcweir 
47cdf0e10cSrcweir #ifndef _STLP_CFLOAT
48cdf0e10cSrcweir #include <cfloat>
49cdf0e10cSrcweir #endif
50cdf0e10cSrcweir 
51cdf0e10cSrcweir #include <limits.h>
52cdf0e10cSrcweir 
53ca62e2c2SSteve Yin #include <ndtxt.hxx>
54ca62e2c2SSteve Yin #include <editeng/brshitem.hxx>
55ca62e2c2SSteve Yin #include <swatrset.hxx>
56ca62e2c2SSteve Yin #include <frmatr.hxx>
57ca62e2c2SSteve Yin #include "acctable.hxx"
58ca62e2c2SSteve Yin 
59cdf0e10cSrcweir using namespace ::com::sun::star;
60cdf0e10cSrcweir using namespace ::com::sun::star::accessibility;
61cdf0e10cSrcweir using ::rtl::OUString;
62cdf0e10cSrcweir using namespace sw::access;
63cdf0e10cSrcweir 
64cdf0e10cSrcweir const sal_Char sServiceName[] = "com.sun.star.table.AccessibleCellView";
65cdf0e10cSrcweir const sal_Char sImplementationName[] = "com.sun.star.comp.Writer.SwAccessibleCellView";
66cdf0e10cSrcweir 
IsSelected()67cdf0e10cSrcweir sal_Bool SwAccessibleCell::IsSelected()
68cdf0e10cSrcweir {
69cdf0e10cSrcweir 	sal_Bool bRet = sal_False;
70cdf0e10cSrcweir 
71cdf0e10cSrcweir     DBG_ASSERT( GetMap(), "no map?" );
72cdf0e10cSrcweir 	const ViewShell *pVSh = GetMap()->GetShell();
73cdf0e10cSrcweir     DBG_ASSERT( pVSh, "no shell?" );
74cdf0e10cSrcweir 	if( pVSh->ISA( SwCrsrShell ) )
75cdf0e10cSrcweir 	{
76cdf0e10cSrcweir 		const SwCrsrShell *pCSh = static_cast< const SwCrsrShell * >( pVSh );
77cdf0e10cSrcweir 		if( pCSh->IsTableMode() )
78cdf0e10cSrcweir 		{
79cdf0e10cSrcweir 			const SwCellFrm *pCFrm =
80cdf0e10cSrcweir 				static_cast< const SwCellFrm * >( GetFrm() );
81cdf0e10cSrcweir 			SwTableBox *pBox =
82cdf0e10cSrcweir 				const_cast< SwTableBox *>( pCFrm->GetTabBox() ); //SVPtrArr!
83cdf0e10cSrcweir 			bRet = pCSh->GetTableCrsr()->GetBoxes().Seek_Entry( pBox );
84cdf0e10cSrcweir 		}
85cdf0e10cSrcweir 	}
86cdf0e10cSrcweir 
87cdf0e10cSrcweir 	return bRet;
88cdf0e10cSrcweir }
89cdf0e10cSrcweir 
GetStates(::utl::AccessibleStateSetHelper & rStateSet)90cdf0e10cSrcweir void SwAccessibleCell::GetStates( ::utl::AccessibleStateSetHelper& rStateSet )
91cdf0e10cSrcweir {
92cdf0e10cSrcweir 	SwAccessibleContext::GetStates( rStateSet );
93cdf0e10cSrcweir 
94cdf0e10cSrcweir 	// SELECTABLE
95cdf0e10cSrcweir 	const ViewShell *pVSh = GetMap()->GetShell();
96cdf0e10cSrcweir     DBG_ASSERT( pVSh, "no shell?" );
97cdf0e10cSrcweir 	if( pVSh->ISA( SwCrsrShell ) )
98cdf0e10cSrcweir 		rStateSet.AddState( AccessibleStateType::SELECTABLE );
99ca62e2c2SSteve Yin 	//Solution:Add resizable state to table cell.
100ca62e2c2SSteve Yin 	rStateSet.AddState( AccessibleStateType::RESIZABLE );
101cdf0e10cSrcweir 
102cdf0e10cSrcweir 	// SELECTED
103cdf0e10cSrcweir 	if( IsSelected() )
104cdf0e10cSrcweir 	{
105cdf0e10cSrcweir 		rStateSet.AddState( AccessibleStateType::SELECTED );
106cdf0e10cSrcweir 		ASSERT( bIsSelected, "bSelected out of sync" );
107cdf0e10cSrcweir 		::vos::ORef < SwAccessibleContext > xThis( this );
108cdf0e10cSrcweir 		GetMap()->SetCursorContext( xThis );
109cdf0e10cSrcweir 	}
110cdf0e10cSrcweir }
111cdf0e10cSrcweir 
SwAccessibleCell(SwAccessibleMap * pInitMap,const SwCellFrm * pCellFrm)112cdf0e10cSrcweir SwAccessibleCell::SwAccessibleCell( SwAccessibleMap *pInitMap,
113cdf0e10cSrcweir                                     const SwCellFrm *pCellFrm )
114cdf0e10cSrcweir     : SwAccessibleContext( pInitMap, AccessibleRole::TABLE_CELL, pCellFrm )
115ca62e2c2SSteve Yin     , aSelectionHelper( *this )
116cdf0e10cSrcweir     , bIsSelected( sal_False )
117*46b0c5deSOliver-Rainer Wittmann     , m_xTableReference( NULL )
118*46b0c5deSOliver-Rainer Wittmann     , m_pAccTable( NULL )
119cdf0e10cSrcweir {
120cdf0e10cSrcweir     vos::OGuard aGuard( Application::GetSolarMutex() );
121cdf0e10cSrcweir     OUString sBoxName( pCellFrm->GetTabBox()->GetName() );
122cdf0e10cSrcweir     SetName( sBoxName );
123cdf0e10cSrcweir 
124cdf0e10cSrcweir     bIsSelected = IsSelected();
125ca62e2c2SSteve Yin 
126*46b0c5deSOliver-Rainer Wittmann     m_xTableReference = getAccessibleParent();
127*46b0c5deSOliver-Rainer Wittmann #if OSL_DEBUG_LEVEL > 1
128*46b0c5deSOliver-Rainer Wittmann     uno::Reference< XAccessibleContext > xContextTable( m_xTableReference, uno::UNO_QUERY );
129*46b0c5deSOliver-Rainer Wittmann     OSL_ASSERT( xContextTable.is() && xContextTable->getAccessibleRole() == AccessibleRole::TABLE );
130*46b0c5deSOliver-Rainer Wittmann #endif
131*46b0c5deSOliver-Rainer Wittmann     m_pAccTable = static_cast< SwAccessibleTable * >( m_xTableReference.get() );
132cdf0e10cSrcweir }
133cdf0e10cSrcweir 
_InvalidateMyCursorPos()134cdf0e10cSrcweir sal_Bool SwAccessibleCell::_InvalidateMyCursorPos()
135cdf0e10cSrcweir {
136cdf0e10cSrcweir 	sal_Bool bNew = IsSelected();
137cdf0e10cSrcweir 	sal_Bool bOld;
138cdf0e10cSrcweir 	{
139cdf0e10cSrcweir 		vos::OGuard aGuard( aMutex );
140cdf0e10cSrcweir 		bOld = bIsSelected;
141cdf0e10cSrcweir 		bIsSelected = bNew;
142cdf0e10cSrcweir 	}
143cdf0e10cSrcweir 	if( bNew )
144cdf0e10cSrcweir 	{
145cdf0e10cSrcweir 		// remember that object as the one that has the caret. This is
146cdf0e10cSrcweir 		// neccessary to notify that object if the cursor leaves it.
147cdf0e10cSrcweir 		::vos::ORef < SwAccessibleContext > xThis( this );
148cdf0e10cSrcweir 		GetMap()->SetCursorContext( xThis );
149cdf0e10cSrcweir 	}
150cdf0e10cSrcweir 
151cdf0e10cSrcweir 	sal_Bool bChanged = bOld != bNew;
152cdf0e10cSrcweir 	if( bChanged )
153ca62e2c2SSteve Yin 	{
154cdf0e10cSrcweir 		FireStateChangedEvent( AccessibleStateType::SELECTED, bNew );
155ca62e2c2SSteve Yin 		if (m_pAccTable)
156ca62e2c2SSteve Yin 		{
157ca62e2c2SSteve Yin 			m_pAccTable->AddSelectionCell(this,bNew);
158ca62e2c2SSteve Yin 		}
159ca62e2c2SSteve Yin 	}
160cdf0e10cSrcweir 	return bChanged;
161cdf0e10cSrcweir }
162cdf0e10cSrcweir 
_InvalidateChildrenCursorPos(const SwFrm * pFrm)163cdf0e10cSrcweir sal_Bool SwAccessibleCell::_InvalidateChildrenCursorPos( const SwFrm *pFrm )
164cdf0e10cSrcweir {
165cdf0e10cSrcweir 	sal_Bool bChanged = sal_False;
166cdf0e10cSrcweir 
167cdf0e10cSrcweir     const SwAccessibleChildSList aVisList( GetVisArea(), *pFrm, *GetMap() );
168cdf0e10cSrcweir     SwAccessibleChildSList::const_iterator aIter( aVisList.begin() );
169cdf0e10cSrcweir 	while( aIter != aVisList.end() )
170cdf0e10cSrcweir 	{
171cdf0e10cSrcweir         const SwAccessibleChild& rLower = *aIter;
172cdf0e10cSrcweir 		const SwFrm *pLower = rLower.GetSwFrm();
173cdf0e10cSrcweir 		if( pLower )
174cdf0e10cSrcweir 		{
175cdf0e10cSrcweir 			if( rLower.IsAccessible( GetMap()->GetShell()->IsPreView() )  )
176cdf0e10cSrcweir 			{
177cdf0e10cSrcweir 				::vos::ORef< SwAccessibleContext > xAccImpl(
178cdf0e10cSrcweir 					GetMap()->GetContextImpl( pLower, sal_False ) );
179cdf0e10cSrcweir 				if( xAccImpl.isValid() )
180cdf0e10cSrcweir 				{
181cdf0e10cSrcweir 					ASSERT( xAccImpl->GetFrm()->IsCellFrm(),
182cdf0e10cSrcweir 						 	"table child is not a cell frame" )
183ca62e2c2SSteve Yin 					bChanged = static_cast< SwAccessibleCell *>(
184cdf0e10cSrcweir 							xAccImpl.getBodyPtr() )->_InvalidateMyCursorPos();
185cdf0e10cSrcweir 				}
186cdf0e10cSrcweir 				else
187cdf0e10cSrcweir 					bChanged = sal_True; // If the context is not know we
188cdf0e10cSrcweir 										 // don't know whether the selection
189cdf0e10cSrcweir 										 // changed or not.
190cdf0e10cSrcweir 			}
191cdf0e10cSrcweir 			else
192cdf0e10cSrcweir 			{
193cdf0e10cSrcweir 				// This is a box with sub rows.
194cdf0e10cSrcweir 				bChanged |= _InvalidateChildrenCursorPos( pLower );
195cdf0e10cSrcweir 			}
196cdf0e10cSrcweir 		}
197cdf0e10cSrcweir 		++aIter;
198cdf0e10cSrcweir 	}
199cdf0e10cSrcweir 
200cdf0e10cSrcweir 	return bChanged;
201cdf0e10cSrcweir }
202cdf0e10cSrcweir 
_InvalidateCursorPos()203cdf0e10cSrcweir void SwAccessibleCell::_InvalidateCursorPos()
204cdf0e10cSrcweir {
205ca62e2c2SSteve Yin 	if (IsSelected())
206ca62e2c2SSteve Yin 	{
207ca62e2c2SSteve Yin 		const SwAccessibleChild aChild( GetChild( *(GetMap()), 0 ) );
208ca62e2c2SSteve Yin 		if( aChild.IsValid()  && aChild.GetSwFrm() )
209ca62e2c2SSteve Yin 		{
210ca62e2c2SSteve Yin 			::vos::ORef < SwAccessibleContext > xChildImpl(	GetMap()->GetContextImpl( aChild.GetSwFrm())  );
211ca62e2c2SSteve Yin 			if(xChildImpl.isValid())
212ca62e2c2SSteve Yin 			{
213ca62e2c2SSteve Yin 				AccessibleEventObject aEvent;
214ca62e2c2SSteve Yin 				aEvent.EventId = AccessibleEventId::STATE_CHANGED;
215ca62e2c2SSteve Yin 				aEvent.NewValue<<=AccessibleStateType::FOCUSED;
216ca62e2c2SSteve Yin 				xChildImpl->FireAccessibleEvent( aEvent );
217ca62e2c2SSteve Yin 			}
218ca62e2c2SSteve Yin 		}
219ca62e2c2SSteve Yin 	}
220cdf0e10cSrcweir 
221cdf0e10cSrcweir     const SwFrm *pParent = GetParent( SwAccessibleChild(GetFrm()), IsInPagePreview() );
222cdf0e10cSrcweir 	ASSERT( pParent->IsTabFrm(), "parent is not a tab frame" );
223cdf0e10cSrcweir 	const SwTabFrm *pTabFrm = static_cast< const SwTabFrm * >( pParent );
224cdf0e10cSrcweir 	if( pTabFrm->IsFollow() )
225cdf0e10cSrcweir 		pTabFrm = pTabFrm->FindMaster();
226cdf0e10cSrcweir 
227cdf0e10cSrcweir 	while( pTabFrm )
228cdf0e10cSrcweir 	{
229ca62e2c2SSteve Yin                 _InvalidateChildrenCursorPos( pTabFrm );
230ca62e2c2SSteve Yin /*
231cdf0e10cSrcweir 		sal_Bool bChanged = _InvalidateChildrenCursorPos( pTabFrm );
232cdf0e10cSrcweir 		if( bChanged )
233cdf0e10cSrcweir 		{
234cdf0e10cSrcweir 			::vos::ORef< SwAccessibleContext > xAccImpl(
235cdf0e10cSrcweir 				GetMap()->GetContextImpl( pTabFrm, sal_False ) );
236cdf0e10cSrcweir 			if( xAccImpl.isValid() )
237cdf0e10cSrcweir 			{
238cdf0e10cSrcweir 				AccessibleEventObject aEvent;
239cdf0e10cSrcweir 				aEvent.EventId = AccessibleEventId::SELECTION_CHANGED;
240cdf0e10cSrcweir 				xAccImpl->FireAccessibleEvent( aEvent );
241cdf0e10cSrcweir 			}
242cdf0e10cSrcweir 		}
243ca62e2c2SSteve Yin */
244cdf0e10cSrcweir 		pTabFrm = pTabFrm->GetFollow();
245cdf0e10cSrcweir 	}
246ca62e2c2SSteve Yin 	if (m_pAccTable)
247ca62e2c2SSteve Yin 	{
248ca62e2c2SSteve Yin 		m_pAccTable->FireSelectionEvent();
249ca62e2c2SSteve Yin 	}
250cdf0e10cSrcweir }
251cdf0e10cSrcweir 
HasCursor()252cdf0e10cSrcweir sal_Bool SwAccessibleCell::HasCursor()
253cdf0e10cSrcweir {
254cdf0e10cSrcweir 	vos::OGuard aGuard( aMutex );
255cdf0e10cSrcweir 	return bIsSelected;
256cdf0e10cSrcweir }
257cdf0e10cSrcweir 
~SwAccessibleCell()258cdf0e10cSrcweir SwAccessibleCell::~SwAccessibleCell()
259cdf0e10cSrcweir {
260cdf0e10cSrcweir }
261cdf0e10cSrcweir 
getAccessibleDescription(void)262cdf0e10cSrcweir OUString SAL_CALL SwAccessibleCell::getAccessibleDescription (void)
263cdf0e10cSrcweir         throw (uno::RuntimeException)
264cdf0e10cSrcweir {
265cdf0e10cSrcweir 	return GetName();
266cdf0e10cSrcweir }
267cdf0e10cSrcweir 
getImplementationName()268cdf0e10cSrcweir OUString SAL_CALL SwAccessibleCell::getImplementationName()
269cdf0e10cSrcweir         throw( uno::RuntimeException )
270cdf0e10cSrcweir {
271cdf0e10cSrcweir 	return OUString(RTL_CONSTASCII_USTRINGPARAM(sImplementationName));
272cdf0e10cSrcweir }
273cdf0e10cSrcweir 
supportsService(const::rtl::OUString & sTestServiceName)274cdf0e10cSrcweir sal_Bool SAL_CALL SwAccessibleCell::supportsService(
275cdf0e10cSrcweir 		const ::rtl::OUString& sTestServiceName)
276cdf0e10cSrcweir 	throw (uno::RuntimeException)
277cdf0e10cSrcweir {
278cdf0e10cSrcweir 	return sTestServiceName.equalsAsciiL( sServiceName,
279cdf0e10cSrcweir 										  sizeof(sServiceName)-1 ) ||
280cdf0e10cSrcweir 		   sTestServiceName.equalsAsciiL( sAccessibleServiceName,
281cdf0e10cSrcweir 				   						  sizeof(sAccessibleServiceName)-1 );
282cdf0e10cSrcweir }
283cdf0e10cSrcweir 
getSupportedServiceNames()284cdf0e10cSrcweir uno::Sequence< OUString > SAL_CALL SwAccessibleCell::getSupportedServiceNames()
285cdf0e10cSrcweir 		throw( uno::RuntimeException )
286cdf0e10cSrcweir {
287cdf0e10cSrcweir 	uno::Sequence< OUString > aRet(2);
288cdf0e10cSrcweir 	OUString* pArray = aRet.getArray();
289cdf0e10cSrcweir 	pArray[0] = OUString( RTL_CONSTASCII_USTRINGPARAM(sServiceName) );
290cdf0e10cSrcweir 	pArray[1] = OUString( RTL_CONSTASCII_USTRINGPARAM(sAccessibleServiceName) );
291cdf0e10cSrcweir 	return aRet;
292cdf0e10cSrcweir }
293cdf0e10cSrcweir 
Dispose(sal_Bool bRecursive)294cdf0e10cSrcweir void SwAccessibleCell::Dispose( sal_Bool bRecursive )
295cdf0e10cSrcweir {
296cdf0e10cSrcweir     const SwFrm *pParent = GetParent( SwAccessibleChild(GetFrm()), IsInPagePreview() );
297cdf0e10cSrcweir 	::vos::ORef< SwAccessibleContext > xAccImpl(
298cdf0e10cSrcweir 			GetMap()->GetContextImpl( pParent, sal_False ) );
299cdf0e10cSrcweir 	if( xAccImpl.isValid() )
300cdf0e10cSrcweir         xAccImpl->DisposeChild( SwAccessibleChild(GetFrm()), bRecursive );
301cdf0e10cSrcweir 	SwAccessibleContext::Dispose( bRecursive );
302cdf0e10cSrcweir }
303cdf0e10cSrcweir 
InvalidatePosOrSize(const SwRect & rOldBox)304cdf0e10cSrcweir void SwAccessibleCell::InvalidatePosOrSize( const SwRect& rOldBox )
305cdf0e10cSrcweir {
306cdf0e10cSrcweir     const SwFrm *pParent = GetParent( SwAccessibleChild(GetFrm()), IsInPagePreview() );
307cdf0e10cSrcweir 	::vos::ORef< SwAccessibleContext > xAccImpl(
308cdf0e10cSrcweir 			GetMap()->GetContextImpl( pParent, sal_False ) );
309cdf0e10cSrcweir 	if( xAccImpl.isValid() )
310cdf0e10cSrcweir         xAccImpl->InvalidateChildPosOrSize( SwAccessibleChild(GetFrm()), rOldBox );
311cdf0e10cSrcweir 	SwAccessibleContext::InvalidatePosOrSize( rOldBox );
312cdf0e10cSrcweir }
313cdf0e10cSrcweir 
314cdf0e10cSrcweir 
315cdf0e10cSrcweir // =====  XAccessibleInterface  ===========================================
316cdf0e10cSrcweir 
queryInterface(const uno::Type & rType)317cdf0e10cSrcweir uno::Any SwAccessibleCell::queryInterface( const uno::Type& rType )
318cdf0e10cSrcweir     throw( uno::RuntimeException )
319cdf0e10cSrcweir {
320ca62e2c2SSteve Yin 	if (rType == ::getCppuType((const uno::Reference<XAccessibleExtendedAttributes>*)0))
321ca62e2c2SSteve Yin 	{
322ca62e2c2SSteve Yin 		uno::Any aR;
323ca62e2c2SSteve Yin 		aR <<= uno::Reference<XAccessibleExtendedAttributes>(this);
324ca62e2c2SSteve Yin 		return aR;
325ca62e2c2SSteve Yin 	}
326ca62e2c2SSteve Yin 
327ca62e2c2SSteve Yin 	if (rType == ::getCppuType((const uno::Reference<XAccessibleSelection>*)0))
328ca62e2c2SSteve Yin 	{
329ca62e2c2SSteve Yin 		uno::Any aR;
330ca62e2c2SSteve Yin 		aR <<= uno::Reference<XAccessibleSelection>(this);
331ca62e2c2SSteve Yin 		return aR;
332ca62e2c2SSteve Yin 	}
333cdf0e10cSrcweir     if ( rType == ::getCppuType( static_cast< uno::Reference< XAccessibleValue > * >( 0 ) ) )
334cdf0e10cSrcweir     {
335cdf0e10cSrcweir         uno::Reference<XAccessibleValue> xValue = this;
336cdf0e10cSrcweir         uno::Any aRet;
337cdf0e10cSrcweir         aRet <<= xValue;
338cdf0e10cSrcweir         return aRet;
339cdf0e10cSrcweir     }
340cdf0e10cSrcweir     else
341cdf0e10cSrcweir     {
342cdf0e10cSrcweir         return SwAccessibleContext::queryInterface( rType );
343cdf0e10cSrcweir     }
344cdf0e10cSrcweir }
345cdf0e10cSrcweir 
346cdf0e10cSrcweir //====== XTypeProvider ====================================================
getTypes()347cdf0e10cSrcweir uno::Sequence< uno::Type > SAL_CALL SwAccessibleCell::getTypes()
348cdf0e10cSrcweir     throw(uno::RuntimeException)
349cdf0e10cSrcweir {
350cdf0e10cSrcweir 	uno::Sequence< uno::Type > aTypes( SwAccessibleContext::getTypes() );
351cdf0e10cSrcweir 
352cdf0e10cSrcweir 	sal_Int32 nIndex = aTypes.getLength();
353cdf0e10cSrcweir 	aTypes.realloc( nIndex + 1 );
354cdf0e10cSrcweir 
355cdf0e10cSrcweir 	uno::Type* pTypes = aTypes.getArray();
356cdf0e10cSrcweir 	pTypes[nIndex] = ::getCppuType( static_cast< uno::Reference< XAccessibleValue > * >( 0 ) );
357cdf0e10cSrcweir 
358cdf0e10cSrcweir 	return aTypes;
359cdf0e10cSrcweir }
360cdf0e10cSrcweir 
getImplementationId()361cdf0e10cSrcweir uno::Sequence< sal_Int8 > SAL_CALL SwAccessibleCell::getImplementationId()
362cdf0e10cSrcweir 		throw(uno::RuntimeException)
363cdf0e10cSrcweir {
364cdf0e10cSrcweir     vos::OGuard aGuard(Application::GetSolarMutex());
365cdf0e10cSrcweir     static uno::Sequence< sal_Int8 > aId( 16 );
366cdf0e10cSrcweir     static sal_Bool bInit = sal_False;
367cdf0e10cSrcweir     if(!bInit)
368cdf0e10cSrcweir     {
369cdf0e10cSrcweir         rtl_createUuid( (sal_uInt8 *)(aId.getArray() ), 0, sal_True );
370cdf0e10cSrcweir         bInit = sal_True;
371cdf0e10cSrcweir     }
372cdf0e10cSrcweir     return aId;
373cdf0e10cSrcweir }
374cdf0e10cSrcweir 
375cdf0e10cSrcweir // =====  XAccessibleValue  ===============================================
376cdf0e10cSrcweir 
GetTblBoxFormat() const377cdf0e10cSrcweir SwFrmFmt* SwAccessibleCell::GetTblBoxFormat() const
378cdf0e10cSrcweir {
379cdf0e10cSrcweir     DBG_ASSERT( GetFrm() != NULL, "no frame?" );
380cdf0e10cSrcweir     DBG_ASSERT( GetFrm()->IsCellFrm(), "no cell frame?" );
381cdf0e10cSrcweir 
382cdf0e10cSrcweir     const SwCellFrm* pCellFrm = static_cast<const SwCellFrm*>( GetFrm() );
383cdf0e10cSrcweir     return pCellFrm->GetTabBox()->GetFrmFmt();
384cdf0e10cSrcweir }
385cdf0e10cSrcweir 
386ca62e2c2SSteve Yin //Implement TableCell currentValue
getCurrentValue()387cdf0e10cSrcweir uno::Any SwAccessibleCell::getCurrentValue( )
388cdf0e10cSrcweir     throw( uno::RuntimeException )
389cdf0e10cSrcweir {
390cdf0e10cSrcweir 	vos::OGuard aGuard(Application::GetSolarMutex());
391cdf0e10cSrcweir 	CHECK_FOR_DEFUNC( XAccessibleValue );
392cdf0e10cSrcweir 
393cdf0e10cSrcweir     uno::Any aAny;
394ca62e2c2SSteve Yin 
395ca62e2c2SSteve Yin     const SwCellFrm* pCellFrm = static_cast<const SwCellFrm*>( GetFrm() );
396ca62e2c2SSteve Yin     const SwStartNode *pSttNd = pCellFrm->GetTabBox()->GetSttNd();
397ca62e2c2SSteve Yin 	if( pSttNd )
398ca62e2c2SSteve Yin 	{
399ca62e2c2SSteve Yin 		::rtl::OUString strRet;
400ca62e2c2SSteve Yin 		SwNodeIndex aCntntIdx( *pSttNd, 0 );
401ca62e2c2SSteve Yin 		SwCntntNode* pCNd=NULL;
402ca62e2c2SSteve Yin 		for(int nIndex = 0 ;
403ca62e2c2SSteve Yin 			0 != ( pCNd = pSttNd->GetNodes().GoNext( &aCntntIdx ) ) &&
404ca62e2c2SSteve Yin 			aCntntIdx.GetIndex() < pSttNd->EndOfSectionIndex();
405ca62e2c2SSteve Yin 			++nIndex )
406ca62e2c2SSteve Yin 		{
407ca62e2c2SSteve Yin 			if(pCNd && pCNd->IsTxtNode())
408ca62e2c2SSteve Yin 			{
409ca62e2c2SSteve Yin 				if (0 != nIndex)
410ca62e2c2SSteve Yin 				{
411ca62e2c2SSteve Yin 					strRet += ::rtl::OUString::createFromAscii(" ");
412ca62e2c2SSteve Yin 				}
413ca62e2c2SSteve Yin 				strRet +=((SwTxtNode*)pCNd)->GetTxt();
414ca62e2c2SSteve Yin 			}
415ca62e2c2SSteve Yin 		}
416ca62e2c2SSteve Yin 		aAny <<= strRet;
417ca62e2c2SSteve Yin 	}
418cdf0e10cSrcweir     return aAny;
419cdf0e10cSrcweir }
420cdf0e10cSrcweir 
setCurrentValue(const uno::Any & aNumber)421cdf0e10cSrcweir sal_Bool SwAccessibleCell::setCurrentValue( const uno::Any& aNumber )
422cdf0e10cSrcweir     throw( uno::RuntimeException )
423cdf0e10cSrcweir {
424cdf0e10cSrcweir 	vos::OGuard aGuard(Application::GetSolarMutex());
425cdf0e10cSrcweir 	CHECK_FOR_DEFUNC( XAccessibleValue );
426cdf0e10cSrcweir 
427cdf0e10cSrcweir     double fValue = 0;
428cdf0e10cSrcweir     sal_Bool bValid = (aNumber >>= fValue);
429cdf0e10cSrcweir     if( bValid )
430cdf0e10cSrcweir     {
431cdf0e10cSrcweir         SwTblBoxValue aValue( fValue );
432cdf0e10cSrcweir         GetTblBoxFormat()->SetFmtAttr( aValue );
433cdf0e10cSrcweir     }
434cdf0e10cSrcweir     return bValid;
435cdf0e10cSrcweir }
436cdf0e10cSrcweir 
getMaximumValue()437cdf0e10cSrcweir uno::Any SwAccessibleCell::getMaximumValue( )
438cdf0e10cSrcweir     throw( uno::RuntimeException )
439cdf0e10cSrcweir {
440cdf0e10cSrcweir     uno::Any aAny;
441cdf0e10cSrcweir     aAny <<= DBL_MAX;
442cdf0e10cSrcweir     return aAny;
443cdf0e10cSrcweir }
444cdf0e10cSrcweir 
getMinimumValue()445cdf0e10cSrcweir uno::Any SwAccessibleCell::getMinimumValue(  )
446cdf0e10cSrcweir     throw( uno::RuntimeException )
447cdf0e10cSrcweir {
448cdf0e10cSrcweir     uno::Any aAny;
449cdf0e10cSrcweir     aAny <<= -DBL_MAX;
450cdf0e10cSrcweir     return aAny;
451cdf0e10cSrcweir }
452ca62e2c2SSteve Yin 
ReplaceOneChar(::rtl::OUString oldOUString,::rtl::OUString replacedChar,::rtl::OUString replaceStr)453ca62e2c2SSteve Yin ::rtl::OUString ReplaceOneChar(::rtl::OUString oldOUString, ::rtl::OUString replacedChar, ::rtl::OUString replaceStr)
454ca62e2c2SSteve Yin {
455ca62e2c2SSteve Yin 	int iReplace = -1;
456ca62e2c2SSteve Yin 	iReplace = oldOUString.lastIndexOf(replacedChar);
457ca62e2c2SSteve Yin 	if (iReplace > -1)
458ca62e2c2SSteve Yin 	{
459ca62e2c2SSteve Yin 		for(;iReplace>-1;)
460ca62e2c2SSteve Yin 		{
461ca62e2c2SSteve Yin 			oldOUString = oldOUString.replaceAt(iReplace,1, replaceStr);
462ca62e2c2SSteve Yin 			iReplace=oldOUString.lastIndexOf(replacedChar,iReplace);
463ca62e2c2SSteve Yin 		}
464ca62e2c2SSteve Yin 	}
465ca62e2c2SSteve Yin 	return oldOUString;
466ca62e2c2SSteve Yin }
ReplaceFourChar(::rtl::OUString oldOUString)467ca62e2c2SSteve Yin ::rtl::OUString ReplaceFourChar(::rtl::OUString oldOUString)
468ca62e2c2SSteve Yin {
469ca62e2c2SSteve Yin 	oldOUString = ReplaceOneChar(oldOUString,OUString::createFromAscii("\\"),OUString::createFromAscii("\\\\"));
470ca62e2c2SSteve Yin 	oldOUString = ReplaceOneChar(oldOUString,::rtl::OUString::createFromAscii(";"),::rtl::OUString::createFromAscii("\\;"));
471ca62e2c2SSteve Yin 	oldOUString = ReplaceOneChar(oldOUString,::rtl::OUString::createFromAscii("="),::rtl::OUString::createFromAscii("\\="));
472ca62e2c2SSteve Yin 	oldOUString = ReplaceOneChar(oldOUString,::rtl::OUString::createFromAscii(","),::rtl::OUString::createFromAscii("\\,"));
473ca62e2c2SSteve Yin 	oldOUString = ReplaceOneChar(oldOUString,::rtl::OUString::createFromAscii(":"),::rtl::OUString::createFromAscii("\\:"));
474ca62e2c2SSteve Yin 	return oldOUString;
475ca62e2c2SSteve Yin }
476ca62e2c2SSteve Yin 
getExtendedAttributes()477ca62e2c2SSteve Yin ::com::sun::star::uno::Any SAL_CALL SwAccessibleCell::getExtendedAttributes()
478ca62e2c2SSteve Yin 		throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
479ca62e2c2SSteve Yin {
480ca62e2c2SSteve Yin 	::com::sun::star::uno::Any strRet;
481ca62e2c2SSteve Yin     SwFrmFmt *pFrmFmt = GetTblBoxFormat();
482ca62e2c2SSteve Yin 	DBG_ASSERT(pFrmFmt,"Must be Valid");
483ca62e2c2SSteve Yin 
484ca62e2c2SSteve Yin 	const SwTblBoxFormula& tbl_formula = pFrmFmt->GetTblBoxFormula();
485ca62e2c2SSteve Yin 
486ca62e2c2SSteve Yin 	::rtl::OUString strFormula = ReplaceFourChar(tbl_formula.GetFormula());
487ca62e2c2SSteve Yin 	::rtl::OUString strFor = ::rtl::OUString::createFromAscii("Formula:");
488ca62e2c2SSteve Yin 	strFor += strFormula;
489ca62e2c2SSteve Yin 	strFor += ::rtl::OUString::createFromAscii(";") ;
490ca62e2c2SSteve Yin 	strRet <<= strFor;
491ca62e2c2SSteve Yin 
492ca62e2c2SSteve Yin 	return strRet;
493ca62e2c2SSteve Yin }
494ca62e2c2SSteve Yin 
getBackground()495ca62e2c2SSteve Yin sal_Int32 SAL_CALL SwAccessibleCell::getBackground()
496ca62e2c2SSteve Yin 		throw (::com::sun::star::uno::RuntimeException)
497ca62e2c2SSteve Yin {
498ca62e2c2SSteve Yin 	const SvxBrushItem &rBack = GetFrm()->GetAttrSet()->GetBackground();
499ca62e2c2SSteve Yin 	sal_uInt32 crBack = rBack.GetColor().GetColor();
500ca62e2c2SSteve Yin 
501ca62e2c2SSteve Yin 	if (COL_AUTO == crBack)
502ca62e2c2SSteve Yin 	{
503ca62e2c2SSteve Yin 		uno::Reference<XAccessible> xAccDoc = getAccessibleParent();
504ca62e2c2SSteve Yin 		if (xAccDoc.is())
505ca62e2c2SSteve Yin 		{
506ca62e2c2SSteve Yin 			uno::Reference<XAccessibleComponent> xCompoentDoc(xAccDoc, uno::UNO_QUERY);
507ca62e2c2SSteve Yin 			if (xCompoentDoc.is())
508ca62e2c2SSteve Yin 			{
509ca62e2c2SSteve Yin 				crBack = (sal_uInt32)xCompoentDoc->getBackground();
510ca62e2c2SSteve Yin 			}
511ca62e2c2SSteve Yin 		}
512ca62e2c2SSteve Yin 	}
513ca62e2c2SSteve Yin 	return crBack;
514ca62e2c2SSteve Yin }
515ca62e2c2SSteve Yin 
516ca62e2c2SSteve Yin //=====  XAccessibleSelection  ============================================
selectAccessibleChild(sal_Int32 nChildIndex)517ca62e2c2SSteve Yin void SwAccessibleCell::selectAccessibleChild(
518ca62e2c2SSteve Yin     sal_Int32 nChildIndex )
519ca62e2c2SSteve Yin 	throw ( lang::IndexOutOfBoundsException, uno::RuntimeException )
520ca62e2c2SSteve Yin {
521ca62e2c2SSteve Yin     aSelectionHelper.selectAccessibleChild(nChildIndex);
522ca62e2c2SSteve Yin }
523ca62e2c2SSteve Yin 
isAccessibleChildSelected(sal_Int32 nChildIndex)524ca62e2c2SSteve Yin sal_Bool SwAccessibleCell::isAccessibleChildSelected(
525ca62e2c2SSteve Yin     sal_Int32 nChildIndex )
526ca62e2c2SSteve Yin 	throw ( lang::IndexOutOfBoundsException, uno::RuntimeException )
527ca62e2c2SSteve Yin {
528ca62e2c2SSteve Yin     return aSelectionHelper.isAccessibleChildSelected(nChildIndex);
529ca62e2c2SSteve Yin }
530ca62e2c2SSteve Yin 
clearAccessibleSelection()531ca62e2c2SSteve Yin void SwAccessibleCell::clearAccessibleSelection(  )
532ca62e2c2SSteve Yin 	throw ( uno::RuntimeException )
533ca62e2c2SSteve Yin {
534ca62e2c2SSteve Yin     aSelectionHelper.clearAccessibleSelection();
535ca62e2c2SSteve Yin }
536ca62e2c2SSteve Yin 
selectAllAccessibleChildren()537ca62e2c2SSteve Yin void SwAccessibleCell::selectAllAccessibleChildren(  )
538ca62e2c2SSteve Yin     throw ( uno::RuntimeException )
539ca62e2c2SSteve Yin {
540ca62e2c2SSteve Yin     aSelectionHelper.selectAllAccessibleChildren();
541ca62e2c2SSteve Yin }
542ca62e2c2SSteve Yin 
getSelectedAccessibleChildCount()543ca62e2c2SSteve Yin sal_Int32 SwAccessibleCell::getSelectedAccessibleChildCount(  )
544ca62e2c2SSteve Yin     throw ( uno::RuntimeException )
545ca62e2c2SSteve Yin {
546ca62e2c2SSteve Yin     return aSelectionHelper.getSelectedAccessibleChildCount();
547ca62e2c2SSteve Yin }
548ca62e2c2SSteve Yin 
getSelectedAccessibleChild(sal_Int32 nSelectedChildIndex)549ca62e2c2SSteve Yin uno::Reference<XAccessible> SwAccessibleCell::getSelectedAccessibleChild(
550ca62e2c2SSteve Yin     sal_Int32 nSelectedChildIndex )
551ca62e2c2SSteve Yin 	throw ( lang::IndexOutOfBoundsException, uno::RuntimeException)
552ca62e2c2SSteve Yin {
553ca62e2c2SSteve Yin     return aSelectionHelper.getSelectedAccessibleChild(nSelectedChildIndex);
554ca62e2c2SSteve Yin }
555ca62e2c2SSteve Yin 
deselectAccessibleChild(sal_Int32 nSelectedChildIndex)556ca62e2c2SSteve Yin void SwAccessibleCell::deselectAccessibleChild(
557ca62e2c2SSteve Yin     sal_Int32 nSelectedChildIndex )
558ca62e2c2SSteve Yin 	throw ( lang::IndexOutOfBoundsException, uno::RuntimeException )
559ca62e2c2SSteve Yin {
560ca62e2c2SSteve Yin     aSelectionHelper.deselectAccessibleChild(nSelectedChildIndex);
561ca62e2c2SSteve Yin }
562ca62e2c2SSteve Yin 
563