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
10efeef26fSAndrew Rist *
11efeef26fSAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
12efeef26fSAndrew Rist *
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.
19efeef26fSAndrew Rist *
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 #include <com/sun/star/accessibility/XAccessibleContext.hpp>
28cdf0e10cSrcweir #include <rtl/uuid.h>
29cdf0e10cSrcweir #include <vos/mutex.hxx>
30cdf0e10cSrcweir #include <vcl/svapp.hxx>
31cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleRole.hpp>
32cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleStateType.hpp>
33cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleRelation.hpp>
34cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleRelationType.hpp>
35cdf0e10cSrcweir #include <com/sun/star/accessibility/XAccessibleRelationSet.hpp>
36cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleEventId.hpp>
37cdf0e10cSrcweir #include <unotools/accessiblestatesethelper.hxx>
38cdf0e10cSrcweir #include <frmfmt.hxx>
39cdf0e10cSrcweir #include <flyfrm.hxx>
40cdf0e10cSrcweir #include <accmap.hxx>
41cdf0e10cSrcweir #include <unotools/accessiblerelationsethelper.hxx>
42cdf0e10cSrcweir // --> OD 2009-07-14 #i73249#
43cdf0e10cSrcweir #include <hints.hxx>
44cdf0e10cSrcweir // <--
45cdf0e10cSrcweir #include "acctextframe.hxx"
46cdf0e10cSrcweir
47*ca62e2c2SSteve Yin #ifndef _DOC_HXX
48*ca62e2c2SSteve Yin #include <doc.hxx>
49*ca62e2c2SSteve Yin #endif
50cdf0e10cSrcweir using namespace ::com::sun::star;
51cdf0e10cSrcweir using namespace ::com::sun::star::accessibility;
52cdf0e10cSrcweir using ::rtl::OUString;
53cdf0e10cSrcweir
54cdf0e10cSrcweir using utl::AccessibleRelationSetHelper;
55cdf0e10cSrcweir using ::com::sun::star::accessibility::XAccessibleContext;
56cdf0e10cSrcweir
57cdf0e10cSrcweir const sal_Char sServiceName[] = "com.sun.star.text.AccessibleTextFrameView";
58cdf0e10cSrcweir const sal_Char sImplementationName[] = "com.sun.star.comp.Writer.SwAccessibleTextFrameView";
59cdf0e10cSrcweir
SwAccessibleTextFrame(SwAccessibleMap * pInitMap,const SwFlyFrm * pFlyFrm)60cdf0e10cSrcweir SwAccessibleTextFrame::SwAccessibleTextFrame(
61cdf0e10cSrcweir SwAccessibleMap* pInitMap,
62cdf0e10cSrcweir const SwFlyFrm* pFlyFrm ) :
63cdf0e10cSrcweir SwAccessibleFrameBase( pInitMap, AccessibleRole::TEXT_FRAME, pFlyFrm ),
64cdf0e10cSrcweir msTitle(),
65cdf0e10cSrcweir msDesc()
66cdf0e10cSrcweir {
67cdf0e10cSrcweir if ( pFlyFrm )
68cdf0e10cSrcweir {
69cdf0e10cSrcweir const SwFlyFrmFmt* pFlyFrmFmt =
70cdf0e10cSrcweir dynamic_cast<const SwFlyFrmFmt*>( pFlyFrm->GetFmt() );
71cdf0e10cSrcweir msTitle = pFlyFrmFmt->GetObjTitle();
72cdf0e10cSrcweir
73cdf0e10cSrcweir msDesc = pFlyFrmFmt->GetObjDescription();
74cdf0e10cSrcweir if ( msDesc.getLength() == 0 &&
75cdf0e10cSrcweir msTitle != GetName() )
76cdf0e10cSrcweir {
77cdf0e10cSrcweir msDesc = msTitle;
78cdf0e10cSrcweir }
79cdf0e10cSrcweir }
80cdf0e10cSrcweir }
81cdf0e10cSrcweir
~SwAccessibleTextFrame()82cdf0e10cSrcweir SwAccessibleTextFrame::~SwAccessibleTextFrame()
83cdf0e10cSrcweir {
84cdf0e10cSrcweir }
85cdf0e10cSrcweir
Modify(const SfxPoolItem * pOld,const SfxPoolItem * pNew)86cdf0e10cSrcweir void SwAccessibleTextFrame::Modify( const SfxPoolItem* pOld, const SfxPoolItem *pNew)
87cdf0e10cSrcweir {
88cdf0e10cSrcweir const sal_uInt16 nWhich = pOld ? pOld->Which() : pNew ? pNew->Which() : 0 ;
89cdf0e10cSrcweir // --> OD 2009-07-14 #i73249#
90cdf0e10cSrcweir // suppress handling of RES_NAME_CHANGED in case that attribute Title is
91cdf0e10cSrcweir // used as the accessible name.
92cdf0e10cSrcweir if ( nWhich != RES_NAME_CHANGED ||
93cdf0e10cSrcweir msTitle.getLength() == 0 )
94cdf0e10cSrcweir {
95cdf0e10cSrcweir SwAccessibleFrameBase::Modify( pOld, pNew );
96cdf0e10cSrcweir }
97cdf0e10cSrcweir
98cdf0e10cSrcweir const SwFlyFrm *pFlyFrm = static_cast< const SwFlyFrm * >( GetFrm() );
99cdf0e10cSrcweir switch( nWhich )
100cdf0e10cSrcweir {
101cdf0e10cSrcweir // --> OD 2009-07-14 #i73249#
102cdf0e10cSrcweir case RES_TITLE_CHANGED:
103cdf0e10cSrcweir {
104cdf0e10cSrcweir const String& sOldTitle(
105cdf0e10cSrcweir dynamic_cast<const SwStringMsgPoolItem*>(pOld)->GetString() );
106cdf0e10cSrcweir const String& sNewTitle(
107cdf0e10cSrcweir dynamic_cast<const SwStringMsgPoolItem*>(pNew)->GetString() );
108cdf0e10cSrcweir if ( sOldTitle == sNewTitle )
109cdf0e10cSrcweir {
110cdf0e10cSrcweir break;
111cdf0e10cSrcweir }
112cdf0e10cSrcweir msTitle = sNewTitle;
113cdf0e10cSrcweir AccessibleEventObject aEvent;
114cdf0e10cSrcweir aEvent.EventId = AccessibleEventId::NAME_CHANGED;
115cdf0e10cSrcweir aEvent.OldValue <<= OUString( sOldTitle );
116cdf0e10cSrcweir aEvent.NewValue <<= msTitle;
117cdf0e10cSrcweir FireAccessibleEvent( aEvent );
118cdf0e10cSrcweir
119cdf0e10cSrcweir const SwFlyFrmFmt* pFlyFrmFmt =
120cdf0e10cSrcweir dynamic_cast<const SwFlyFrmFmt*>( pFlyFrm->GetFmt() );
121cdf0e10cSrcweir if ( pFlyFrmFmt->GetObjDescription().Len() != 0 )
122cdf0e10cSrcweir {
123cdf0e10cSrcweir break;
124cdf0e10cSrcweir }
125cdf0e10cSrcweir }
126cdf0e10cSrcweir // intentional no break here
127cdf0e10cSrcweir case RES_DESCRIPTION_CHANGED:
128cdf0e10cSrcweir {
129cdf0e10cSrcweir if ( pFlyFrm )
130cdf0e10cSrcweir {
131cdf0e10cSrcweir const OUString sOldDesc( msDesc );
132cdf0e10cSrcweir
133cdf0e10cSrcweir const SwFlyFrmFmt* pFlyFrmFmt =
134cdf0e10cSrcweir dynamic_cast<const SwFlyFrmFmt*>( pFlyFrm->GetFmt() );
135cdf0e10cSrcweir const String& rDesc = pFlyFrmFmt->GetObjDescription();
136cdf0e10cSrcweir msDesc = rDesc;
137cdf0e10cSrcweir if ( msDesc.getLength() == 0 &&
138cdf0e10cSrcweir msTitle != GetName() )
139cdf0e10cSrcweir {
140cdf0e10cSrcweir msDesc = msTitle;
141cdf0e10cSrcweir }
142cdf0e10cSrcweir
143cdf0e10cSrcweir if ( msDesc != sOldDesc )
144cdf0e10cSrcweir {
145cdf0e10cSrcweir AccessibleEventObject aEvent;
146cdf0e10cSrcweir aEvent.EventId = AccessibleEventId::DESCRIPTION_CHANGED;
147cdf0e10cSrcweir aEvent.OldValue <<= sOldDesc;
148cdf0e10cSrcweir aEvent.NewValue <<= msDesc;
149cdf0e10cSrcweir FireAccessibleEvent( aEvent );
150cdf0e10cSrcweir }
151cdf0e10cSrcweir }
152cdf0e10cSrcweir }
153cdf0e10cSrcweir break;
154cdf0e10cSrcweir // <--
155cdf0e10cSrcweir }
156cdf0e10cSrcweir }
157cdf0e10cSrcweir
158*ca62e2c2SSteve Yin //===== XInterface ==========================================================
159*ca62e2c2SSteve Yin
160*ca62e2c2SSteve Yin com::sun::star::uno::Any SAL_CALL
queryInterface(const com::sun::star::uno::Type & rType)161*ca62e2c2SSteve Yin SwAccessibleTextFrame::queryInterface (const com::sun::star::uno::Type & rType)
162*ca62e2c2SSteve Yin throw (::com::sun::star::uno::RuntimeException)
163*ca62e2c2SSteve Yin {
164*ca62e2c2SSteve Yin ::com::sun::star::uno::Any aReturn = SwAccessibleContext::queryInterface (rType);
165*ca62e2c2SSteve Yin if ( ! aReturn.hasValue())
166*ca62e2c2SSteve Yin aReturn = ::cppu::queryInterface (rType,
167*ca62e2c2SSteve Yin static_cast< ::com::sun::star::accessibility::XAccessibleSelection* >(this)
168*ca62e2c2SSteve Yin );
169*ca62e2c2SSteve Yin return aReturn;
170*ca62e2c2SSteve Yin }
171*ca62e2c2SSteve Yin
172*ca62e2c2SSteve Yin
173*ca62e2c2SSteve Yin
174*ca62e2c2SSteve Yin
175*ca62e2c2SSteve Yin void SAL_CALL
acquire(void)176*ca62e2c2SSteve Yin SwAccessibleTextFrame::acquire (void)
177*ca62e2c2SSteve Yin throw ()
178*ca62e2c2SSteve Yin {
179*ca62e2c2SSteve Yin SwAccessibleContext::acquire ();
180*ca62e2c2SSteve Yin }
181*ca62e2c2SSteve Yin
182*ca62e2c2SSteve Yin void SAL_CALL
release(void)183*ca62e2c2SSteve Yin SwAccessibleTextFrame::release (void)
184*ca62e2c2SSteve Yin throw ()
185*ca62e2c2SSteve Yin {
186*ca62e2c2SSteve Yin SwAccessibleContext::release ();
187*ca62e2c2SSteve Yin }
188*ca62e2c2SSteve Yin
189*ca62e2c2SSteve Yin //
190*ca62e2c2SSteve Yin //===== XAccessibleSelection ============================================
191*ca62e2c2SSteve Yin //
192*ca62e2c2SSteve Yin
193*ca62e2c2SSteve Yin //--------------------------------------------------------------------------------
selectAccessibleChild(sal_Int32)194*ca62e2c2SSteve Yin void SAL_CALL SwAccessibleTextFrame::selectAccessibleChild( sal_Int32 )
195*ca62e2c2SSteve Yin throw ( lang::IndexOutOfBoundsException, uno::RuntimeException )
196*ca62e2c2SSteve Yin {
197*ca62e2c2SSteve Yin DBG_ASSERT( false, "<SwAccessibleTextFrame::selectAccessibleChild( sal_Int32 )> - missing implementation" );
198*ca62e2c2SSteve Yin }
199*ca62e2c2SSteve Yin
200*ca62e2c2SSteve Yin //----------------------------------------------------------------------------------
isAccessibleChildSelected(sal_Int32 nChildIndex)201*ca62e2c2SSteve Yin sal_Bool SAL_CALL SwAccessibleTextFrame::isAccessibleChildSelected( sal_Int32 nChildIndex )
202*ca62e2c2SSteve Yin throw (lang::IndexOutOfBoundsException, uno::RuntimeException )
203*ca62e2c2SSteve Yin {
204*ca62e2c2SSteve Yin uno::Reference<XAccessible> xAcc = getAccessibleChild( nChildIndex );
205*ca62e2c2SSteve Yin uno::Reference<XAccessibleContext> xContext;
206*ca62e2c2SSteve Yin if( xAcc.is() )
207*ca62e2c2SSteve Yin xContext = xAcc->getAccessibleContext();
208*ca62e2c2SSteve Yin
209*ca62e2c2SSteve Yin if( xContext.is() )
210*ca62e2c2SSteve Yin {
211*ca62e2c2SSteve Yin if( xContext->getAccessibleRole() == AccessibleRole::PARAGRAPH )
212*ca62e2c2SSteve Yin {
213*ca62e2c2SSteve Yin uno::Reference< ::com::sun::star::accessibility::XAccessibleText >
214*ca62e2c2SSteve Yin xText(xAcc, uno::UNO_QUERY);
215*ca62e2c2SSteve Yin if( xText.is() )
216*ca62e2c2SSteve Yin {
217*ca62e2c2SSteve Yin if( xText->getSelectionStart() >= 0 ) return sal_True;
218*ca62e2c2SSteve Yin }
219*ca62e2c2SSteve Yin }
220*ca62e2c2SSteve Yin }
221*ca62e2c2SSteve Yin
222*ca62e2c2SSteve Yin return sal_False;
223*ca62e2c2SSteve Yin }
224*ca62e2c2SSteve Yin
225*ca62e2c2SSteve Yin //---------------------------------------------------------------------
clearAccessibleSelection()226*ca62e2c2SSteve Yin void SAL_CALL SwAccessibleTextFrame::clearAccessibleSelection( )
227*ca62e2c2SSteve Yin throw ( uno::RuntimeException )
228*ca62e2c2SSteve Yin {
229*ca62e2c2SSteve Yin DBG_ASSERT( false, "<SwAccessibleTextFrame::clearAccessibleSelection( )> - missing implementation" );
230*ca62e2c2SSteve Yin }
231*ca62e2c2SSteve Yin
232*ca62e2c2SSteve Yin //-------------------------------------------------------------------------
selectAllAccessibleChildren()233*ca62e2c2SSteve Yin void SAL_CALL SwAccessibleTextFrame::selectAllAccessibleChildren( )
234*ca62e2c2SSteve Yin throw ( uno::RuntimeException )
235*ca62e2c2SSteve Yin {
236*ca62e2c2SSteve Yin DBG_ASSERT( false, "<SwAccessibleTextFrame::selectAllAccessibleChildren( )> - missing implementation" );
237*ca62e2c2SSteve Yin }
238*ca62e2c2SSteve Yin
239*ca62e2c2SSteve Yin //----------------------------------------------------------------------------
getSelectedAccessibleChildCount()240*ca62e2c2SSteve Yin sal_Int32 SAL_CALL SwAccessibleTextFrame::getSelectedAccessibleChildCount()
241*ca62e2c2SSteve Yin throw ( uno::RuntimeException )
242*ca62e2c2SSteve Yin {
243*ca62e2c2SSteve Yin sal_Int32 nCount = 0;
244*ca62e2c2SSteve Yin sal_Int32 TotalCount = getAccessibleChildCount();
245*ca62e2c2SSteve Yin for( sal_Int32 i = 0; i < TotalCount; i++ )
246*ca62e2c2SSteve Yin if( isAccessibleChildSelected(i) ) nCount++;
247*ca62e2c2SSteve Yin
248*ca62e2c2SSteve Yin return nCount;
249*ca62e2c2SSteve Yin }
250*ca62e2c2SSteve Yin
251*ca62e2c2SSteve Yin //--------------------------------------------------------------------------------------
getSelectedAccessibleChild(sal_Int32 nSelectedChildIndex)252*ca62e2c2SSteve Yin uno::Reference<XAccessible> SAL_CALL SwAccessibleTextFrame::getSelectedAccessibleChild( sal_Int32 nSelectedChildIndex )
253*ca62e2c2SSteve Yin throw ( lang::IndexOutOfBoundsException, uno::RuntimeException)
254*ca62e2c2SSteve Yin {
255*ca62e2c2SSteve Yin if ( nSelectedChildIndex > getSelectedAccessibleChildCount() )
256*ca62e2c2SSteve Yin throw lang::IndexOutOfBoundsException();
257*ca62e2c2SSteve Yin sal_Int32 i1, i2;
258*ca62e2c2SSteve Yin for( i1 = 0, i2 = 0; i1 < getAccessibleChildCount(); i1++ )
259*ca62e2c2SSteve Yin if( isAccessibleChildSelected(i1) )
260*ca62e2c2SSteve Yin {
261*ca62e2c2SSteve Yin if( i2 == nSelectedChildIndex )
262*ca62e2c2SSteve Yin return getAccessibleChild( i1 );
263*ca62e2c2SSteve Yin i2++;
264*ca62e2c2SSteve Yin }
265*ca62e2c2SSteve Yin return uno::Reference<XAccessible>();
266*ca62e2c2SSteve Yin }
267*ca62e2c2SSteve Yin
268*ca62e2c2SSteve Yin //----------------------------------------------------------------------------------
deselectAccessibleChild(sal_Int32)269*ca62e2c2SSteve Yin void SAL_CALL SwAccessibleTextFrame::deselectAccessibleChild( sal_Int32 )
270*ca62e2c2SSteve Yin throw ( lang::IndexOutOfBoundsException, uno::RuntimeException )
271*ca62e2c2SSteve Yin {
272*ca62e2c2SSteve Yin DBG_ASSERT( false, "<SwAccessibleTextFrame::selectAllAccessibleChildren( sal_Int32 )> - missing implementation" );
273*ca62e2c2SSteve Yin }
274*ca62e2c2SSteve Yin
275cdf0e10cSrcweir // --> OD 2009-07-14 #i73249#
getAccessibleName(void)276cdf0e10cSrcweir OUString SAL_CALL SwAccessibleTextFrame::getAccessibleName (void)
277cdf0e10cSrcweir throw (uno::RuntimeException)
278cdf0e10cSrcweir {
279cdf0e10cSrcweir vos::OGuard aGuard(Application::GetSolarMutex());
280cdf0e10cSrcweir
281cdf0e10cSrcweir CHECK_FOR_DEFUNC( XAccessibleContext )
282cdf0e10cSrcweir
283cdf0e10cSrcweir if ( msTitle.getLength() != 0 )
284cdf0e10cSrcweir {
285cdf0e10cSrcweir return msTitle;
286cdf0e10cSrcweir }
287cdf0e10cSrcweir
288cdf0e10cSrcweir return SwAccessibleFrameBase::getAccessibleName();
289cdf0e10cSrcweir }
290cdf0e10cSrcweir // <--
291*ca62e2c2SSteve Yin
getAccessibleDescription(void)292cdf0e10cSrcweir OUString SAL_CALL SwAccessibleTextFrame::getAccessibleDescription (void)
293cdf0e10cSrcweir throw (uno::RuntimeException)
294cdf0e10cSrcweir {
295cdf0e10cSrcweir vos::OGuard aGuard(Application::GetSolarMutex());
296cdf0e10cSrcweir
297cdf0e10cSrcweir CHECK_FOR_DEFUNC( XAccessibleContext )
298*ca62e2c2SSteve Yin /* MT: I guess msDesc is correct noadays?
299*ca62e2c2SSteve Yin OUString longDesc;
300*ca62e2c2SSteve Yin const SwFlyFrmFmt* pFlyFmt = GetShell()->GetDoc()->FindFlyByName( GetName(), 0);
301*ca62e2c2SSteve Yin if( pFlyFmt )
302*ca62e2c2SSteve Yin {
303*ca62e2c2SSteve Yin longDesc = OUString( pFlyFmt->GetDescription() );
304*ca62e2c2SSteve Yin }
305*ca62e2c2SSteve Yin if( longDesc.getLength() > 0 )
306*ca62e2c2SSteve Yin return GetName() + OUString(' ') + longDesc;
307*ca62e2c2SSteve Yin else
308*ca62e2c2SSteve Yin return GetName();
309*ca62e2c2SSteve Yin */
310cdf0e10cSrcweir
311cdf0e10cSrcweir return msDesc;
312cdf0e10cSrcweir }
313cdf0e10cSrcweir
getImplementationName()314cdf0e10cSrcweir OUString SAL_CALL SwAccessibleTextFrame::getImplementationName()
315cdf0e10cSrcweir throw( uno::RuntimeException )
316cdf0e10cSrcweir {
317cdf0e10cSrcweir return OUString(RTL_CONSTASCII_USTRINGPARAM(sImplementationName));
318cdf0e10cSrcweir }
319cdf0e10cSrcweir
supportsService(const OUString & sTestServiceName)320cdf0e10cSrcweir sal_Bool SAL_CALL SwAccessibleTextFrame::supportsService(
321cdf0e10cSrcweir const OUString& sTestServiceName)
322cdf0e10cSrcweir throw (uno::RuntimeException)
323cdf0e10cSrcweir {
324cdf0e10cSrcweir return sTestServiceName.equalsAsciiL( sServiceName,
325cdf0e10cSrcweir sizeof(sServiceName)-1 ) ||
326cdf0e10cSrcweir sTestServiceName.equalsAsciiL( sAccessibleServiceName,
327cdf0e10cSrcweir sizeof(sAccessibleServiceName)-1 );
328cdf0e10cSrcweir }
329cdf0e10cSrcweir
getSupportedServiceNames()330cdf0e10cSrcweir uno::Sequence< OUString > SAL_CALL SwAccessibleTextFrame::getSupportedServiceNames()
331cdf0e10cSrcweir throw( uno::RuntimeException )
332cdf0e10cSrcweir {
333cdf0e10cSrcweir uno::Sequence< OUString > aRet(2);
334cdf0e10cSrcweir OUString* pArray = aRet.getArray();
335cdf0e10cSrcweir pArray[0] = OUString( RTL_CONSTASCII_USTRINGPARAM(sServiceName) );
336cdf0e10cSrcweir pArray[1] = OUString( RTL_CONSTASCII_USTRINGPARAM(sAccessibleServiceName) );
337cdf0e10cSrcweir return aRet;
338cdf0e10cSrcweir }
339cdf0e10cSrcweir
getImplementationId()340cdf0e10cSrcweir uno::Sequence< sal_Int8 > SAL_CALL SwAccessibleTextFrame::getImplementationId()
341cdf0e10cSrcweir throw(uno::RuntimeException)
342cdf0e10cSrcweir {
343cdf0e10cSrcweir vos::OGuard aGuard(Application::GetSolarMutex());
344cdf0e10cSrcweir static uno::Sequence< sal_Int8 > aId( 16 );
345cdf0e10cSrcweir static sal_Bool bInit = sal_False;
346cdf0e10cSrcweir if(!bInit)
347cdf0e10cSrcweir {
348cdf0e10cSrcweir rtl_createUuid( (sal_uInt8 *)(aId.getArray() ), 0, sal_True );
349cdf0e10cSrcweir bInit = sal_True;
350cdf0e10cSrcweir }
351cdf0e10cSrcweir return aId;
352cdf0e10cSrcweir }
353cdf0e10cSrcweir
354cdf0e10cSrcweir
355cdf0e10cSrcweir //
356cdf0e10cSrcweir // XAccessibleRelationSet
357cdf0e10cSrcweir //
358cdf0e10cSrcweir
359cdf0e10cSrcweir
getFlyFrm() const360cdf0e10cSrcweir SwFlyFrm* SwAccessibleTextFrame::getFlyFrm() const
361cdf0e10cSrcweir {
362cdf0e10cSrcweir SwFlyFrm* pFlyFrm = NULL;
363cdf0e10cSrcweir
364cdf0e10cSrcweir const SwFrm* pFrm = GetFrm();
365cdf0e10cSrcweir DBG_ASSERT( pFrm != NULL, "frame expected" );
366cdf0e10cSrcweir if( pFrm->IsFlyFrm() )
367cdf0e10cSrcweir {
368cdf0e10cSrcweir pFlyFrm = static_cast<SwFlyFrm*>( const_cast<SwFrm*>( pFrm ) );
369cdf0e10cSrcweir }
370cdf0e10cSrcweir
371cdf0e10cSrcweir return pFlyFrm;
372cdf0e10cSrcweir }
373cdf0e10cSrcweir
makeRelation(sal_Int16 nType,const SwFlyFrm * pFrm)374cdf0e10cSrcweir AccessibleRelation SwAccessibleTextFrame::makeRelation( sal_Int16 nType, const SwFlyFrm* pFrm )
375cdf0e10cSrcweir {
376cdf0e10cSrcweir uno::Sequence<uno::Reference<XInterface> > aSequence(1);
377cdf0e10cSrcweir aSequence[0] = GetMap()->GetContext( pFrm );
378cdf0e10cSrcweir return AccessibleRelation( nType, aSequence );
379cdf0e10cSrcweir }
380cdf0e10cSrcweir
381cdf0e10cSrcweir
getAccessibleRelationSet()382cdf0e10cSrcweir uno::Reference<XAccessibleRelationSet> SAL_CALL SwAccessibleTextFrame::getAccessibleRelationSet( )
383cdf0e10cSrcweir throw ( uno::RuntimeException )
384cdf0e10cSrcweir {
385cdf0e10cSrcweir vos::OGuard aGuard(Application::GetSolarMutex());
386cdf0e10cSrcweir CHECK_FOR_DEFUNC( XAccessibleContext );
387cdf0e10cSrcweir
388cdf0e10cSrcweir // get the frame, and insert prev/next relations into helper
389cdf0e10cSrcweir
390cdf0e10cSrcweir AccessibleRelationSetHelper* pHelper = new AccessibleRelationSetHelper();
391cdf0e10cSrcweir
392cdf0e10cSrcweir SwFlyFrm* pFlyFrm = getFlyFrm();
393cdf0e10cSrcweir DBG_ASSERT( pFlyFrm != NULL, "fly frame expected" );
394cdf0e10cSrcweir
395cdf0e10cSrcweir const SwFlyFrm* pPrevFrm = pFlyFrm->GetPrevLink();
396cdf0e10cSrcweir if( pPrevFrm != NULL )
397cdf0e10cSrcweir pHelper->AddRelation( makeRelation(
398cdf0e10cSrcweir AccessibleRelationType::CONTENT_FLOWS_FROM, pPrevFrm ) );
399cdf0e10cSrcweir
400cdf0e10cSrcweir const SwFlyFrm* pNextFrm = pFlyFrm->GetNextLink();
401cdf0e10cSrcweir if( pNextFrm != NULL )
402cdf0e10cSrcweir pHelper->AddRelation( makeRelation(
403cdf0e10cSrcweir AccessibleRelationType::CONTENT_FLOWS_TO, pNextFrm ) );
404cdf0e10cSrcweir
405cdf0e10cSrcweir return pHelper;
406cdf0e10cSrcweir }
407