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