xref: /trunk/main/sw/source/core/access/acccell.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
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 )
1179235e16eSOliver-Rainer Wittmann     , m_xTableReference( NULL )
1189235e16eSOliver-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 
1269235e16eSOliver-Rainer Wittmann     m_xTableReference = getAccessibleParent();
1279235e16eSOliver-Rainer Wittmann #if OSL_DEBUG_LEVEL > 1
1289235e16eSOliver-Rainer Wittmann     uno::Reference< XAccessibleContext > xContextTable( m_xTableReference, uno::UNO_QUERY );
1299235e16eSOliver-Rainer Wittmann     OSL_ASSERT( xContextTable.is() && xContextTable->getAccessibleRole() == AccessibleRole::TABLE );
1309235e16eSOliver-Rainer Wittmann #endif
1319235e16eSOliver-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
146*86e1cf34SPedro Giffuni         // necessary 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 }
562