xref: /aoo41x/main/sw/source/core/access/accdoc.cxx (revision 4d7c9de0)
1efeef26fSAndrew Rist /**************************************************************
2efeef26fSAndrew Rist  *
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 #include <vcl/window.hxx>
27cdf0e10cSrcweir #include <rootfrm.hxx>
28cdf0e10cSrcweir 
29cdf0e10cSrcweir 
30cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleRole.hpp>
31cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleStateType.hpp>
32cdf0e10cSrcweir #include <com/sun/star/beans/XPropertyChangeListener.hpp>
33cdf0e10cSrcweir #include <com/sun/star/accessibility/AccessibleEventId.hpp>
34cdf0e10cSrcweir #include <unotools/accessiblestatesethelper.hxx>
35cdf0e10cSrcweir #include <tools/link.hxx>
36cdf0e10cSrcweir #include <sfx2/viewsh.hxx>
37cdf0e10cSrcweir #include <vos/mutex.hxx>
38cdf0e10cSrcweir #include <vcl/svapp.hxx>
39cdf0e10cSrcweir #include <viewsh.hxx>
40cdf0e10cSrcweir #include <doc.hxx>
41cdf0e10cSrcweir #include <accmap.hxx>
42cdf0e10cSrcweir #include <accdoc.hxx>
43cdf0e10cSrcweir #ifndef _ACCESS_HRC
44cdf0e10cSrcweir #include "access.hrc"
45cdf0e10cSrcweir #endif
46cdf0e10cSrcweir #include <pagefrm.hxx>
47cdf0e10cSrcweir 
48*ca62e2c2SSteve Yin #include <editeng/brshitem.hxx>
49*ca62e2c2SSteve Yin #include <swatrset.hxx>
50*ca62e2c2SSteve Yin #include <frmatr.hxx>
51*ca62e2c2SSteve Yin #include "unostyle.hxx"
52*ca62e2c2SSteve Yin #include "viewsh.hxx"
53*ca62e2c2SSteve Yin #include "docsh.hxx"
54*ca62e2c2SSteve Yin #include <crsrsh.hxx>
55*ca62e2c2SSteve Yin #include "fesh.hxx"
56*ca62e2c2SSteve Yin #include <fmtclds.hxx>
57*ca62e2c2SSteve Yin #include <flyfrm.hxx>
58*ca62e2c2SSteve Yin #include <colfrm.hxx>
59*ca62e2c2SSteve Yin #include <txtfrm.hxx>
60*ca62e2c2SSteve Yin #include <sectfrm.hxx>
61*ca62e2c2SSteve Yin #include <section.hxx>
62*ca62e2c2SSteve Yin #include <svx/unoapi.hxx>
63*ca62e2c2SSteve Yin #include <swmodule.hxx>
64*ca62e2c2SSteve Yin #include <svtools/colorcfg.hxx>
65*ca62e2c2SSteve Yin 
66*ca62e2c2SSteve Yin #include <fmtanchr.hxx>
67*ca62e2c2SSteve Yin #include <viewimp.hxx>
68*ca62e2c2SSteve Yin #include <dview.hxx>
69*ca62e2c2SSteve Yin #include <dcontact.hxx>
70*ca62e2c2SSteve Yin #include <svx/svdmark.hxx>
71cdf0e10cSrcweir const sal_Char sServiceName[] = "com.sun.star.text.AccessibleTextDocumentView";
72cdf0e10cSrcweir const sal_Char sImplementationName[] = "com.sun.star.comp.Writer.SwAccessibleDocumentView";
73cdf0e10cSrcweir 
74cdf0e10cSrcweir 
75cdf0e10cSrcweir using namespace ::com::sun::star;
76cdf0e10cSrcweir using namespace ::com::sun::star::accessibility;
77cdf0e10cSrcweir using ::rtl::OUString;
78cdf0e10cSrcweir 
79cdf0e10cSrcweir using lang::IndexOutOfBoundsException;
80cdf0e10cSrcweir 
81cdf0e10cSrcweir 
82cdf0e10cSrcweir 
83cdf0e10cSrcweir //
84cdf0e10cSrcweir // SwAccessibleDocumentBase: base class for SwAccessibleDocument and
85cdf0e10cSrcweir // SwAccessiblePreview
86cdf0e10cSrcweir //
87cdf0e10cSrcweir 
SwAccessibleDocumentBase(SwAccessibleMap * _pMap)88cdf0e10cSrcweir SwAccessibleDocumentBase::SwAccessibleDocumentBase ( SwAccessibleMap *_pMap ) :
89cdf0e10cSrcweir 	SwAccessibleContext( _pMap, AccessibleRole::DOCUMENT,
90cdf0e10cSrcweir                          _pMap->GetShell()->GetLayout() ),//swmod 071107//swmod 071225
91cdf0e10cSrcweir 	mxParent( _pMap->GetShell()->GetWin()->GetAccessibleParentWindow()->GetAccessible() ),
92cdf0e10cSrcweir     mpChildWin( 0 )
93cdf0e10cSrcweir {
94cdf0e10cSrcweir }
95cdf0e10cSrcweir 
~SwAccessibleDocumentBase()96cdf0e10cSrcweir SwAccessibleDocumentBase::~SwAccessibleDocumentBase()
97cdf0e10cSrcweir {
98cdf0e10cSrcweir }
99cdf0e10cSrcweir 
SetVisArea()100cdf0e10cSrcweir void SwAccessibleDocumentBase::SetVisArea()
101cdf0e10cSrcweir {
102cdf0e10cSrcweir 	vos::OGuard aGuard(Application::GetSolarMutex());
103cdf0e10cSrcweir 
104cdf0e10cSrcweir 	SwRect aOldVisArea( GetVisArea() );
105cdf0e10cSrcweir 	const SwRect& rNewVisArea = GetMap()->GetVisArea();
106cdf0e10cSrcweir 	if( aOldVisArea != rNewVisArea )
107cdf0e10cSrcweir 	{
108cdf0e10cSrcweir 		SwAccessibleFrame::SetVisArea( GetMap()->GetVisArea() );
109cdf0e10cSrcweir         // --> OD 2007-12-07 #i58139#
110cdf0e10cSrcweir         // showing state of document view needs also be updated.
111cdf0e10cSrcweir         // Thus, call method <Scrolled(..)> instead of <ChildrenScrolled(..)>
112cdf0e10cSrcweir //        ChildrenScrolled( GetFrm(), aOldVisArea );
113cdf0e10cSrcweir         Scrolled( aOldVisArea );
114cdf0e10cSrcweir         // <--
115cdf0e10cSrcweir 	}
116cdf0e10cSrcweir }
117cdf0e10cSrcweir 
AddChild(Window * pWin,sal_Bool bFireEvent)118cdf0e10cSrcweir void SwAccessibleDocumentBase::AddChild( Window *pWin, sal_Bool bFireEvent )
119cdf0e10cSrcweir {
120cdf0e10cSrcweir 	vos::OGuard aGuard(Application::GetSolarMutex());
121cdf0e10cSrcweir 
122cdf0e10cSrcweir     ASSERT( !mpChildWin, "only one child window is supported" );
123cdf0e10cSrcweir     if( !mpChildWin )
124cdf0e10cSrcweir 	{
125cdf0e10cSrcweir         mpChildWin = pWin;
126cdf0e10cSrcweir 
127cdf0e10cSrcweir 		if( bFireEvent )
128cdf0e10cSrcweir 		{
129cdf0e10cSrcweir 			AccessibleEventObject aEvent;
130cdf0e10cSrcweir 			aEvent.EventId = AccessibleEventId::CHILD;
131cdf0e10cSrcweir             aEvent.NewValue <<= mpChildWin->GetAccessible();
132cdf0e10cSrcweir 			FireAccessibleEvent( aEvent );
133cdf0e10cSrcweir 		}
134cdf0e10cSrcweir 	}
135cdf0e10cSrcweir }
136cdf0e10cSrcweir 
RemoveChild(Window * pWin)137cdf0e10cSrcweir void SwAccessibleDocumentBase::RemoveChild( Window *pWin )
138cdf0e10cSrcweir {
139cdf0e10cSrcweir 	vos::OGuard aGuard(Application::GetSolarMutex());
140cdf0e10cSrcweir 
141cdf0e10cSrcweir     ASSERT( !mpChildWin || pWin == mpChildWin, "invalid child window to remove" );
142cdf0e10cSrcweir     if( mpChildWin && pWin == mpChildWin )
143cdf0e10cSrcweir 	{
144cdf0e10cSrcweir 		AccessibleEventObject aEvent;
145cdf0e10cSrcweir 		aEvent.EventId = AccessibleEventId::CHILD;
146cdf0e10cSrcweir         aEvent.OldValue <<= mpChildWin->GetAccessible();
147cdf0e10cSrcweir 		FireAccessibleEvent( aEvent );
148cdf0e10cSrcweir 
149cdf0e10cSrcweir         mpChildWin = 0;
150cdf0e10cSrcweir 	}
151cdf0e10cSrcweir }
152cdf0e10cSrcweir 
getAccessibleChildCount(void)153cdf0e10cSrcweir sal_Int32 SAL_CALL SwAccessibleDocumentBase::getAccessibleChildCount( void )
154cdf0e10cSrcweir         throw (uno::RuntimeException)
155cdf0e10cSrcweir {
156cdf0e10cSrcweir 	vos::OGuard aGuard(Application::GetSolarMutex());
157cdf0e10cSrcweir 
158cdf0e10cSrcweir 	// CHECK_FOR_DEFUNC is called by parent
159cdf0e10cSrcweir 
160cdf0e10cSrcweir 	sal_Int32 nChildren = SwAccessibleContext::getAccessibleChildCount();
161cdf0e10cSrcweir     if( !IsDisposing() && mpChildWin )
162cdf0e10cSrcweir 		nChildren++;
163cdf0e10cSrcweir 
164cdf0e10cSrcweir 	return nChildren;
165cdf0e10cSrcweir }
166cdf0e10cSrcweir 
167cdf0e10cSrcweir uno::Reference< XAccessible> SAL_CALL
getAccessibleChild(sal_Int32 nIndex)168cdf0e10cSrcweir 	SwAccessibleDocumentBase::getAccessibleChild( sal_Int32 nIndex )
169cdf0e10cSrcweir         throw (uno::RuntimeException,
170cdf0e10cSrcweir                 lang::IndexOutOfBoundsException)
171cdf0e10cSrcweir {
172cdf0e10cSrcweir 	vos::OGuard aGuard(Application::GetSolarMutex());
173cdf0e10cSrcweir 
174cdf0e10cSrcweir     if( mpChildWin  )
175cdf0e10cSrcweir 	{
176cdf0e10cSrcweir 		CHECK_FOR_DEFUNC( XAccessibleContext )
177cdf0e10cSrcweir         if ( nIndex == GetChildCount( *(GetMap()) ) )
178cdf0e10cSrcweir         {
179cdf0e10cSrcweir             return mpChildWin->GetAccessible();
180cdf0e10cSrcweir         }
181cdf0e10cSrcweir 	}
182cdf0e10cSrcweir 
183cdf0e10cSrcweir 	return SwAccessibleContext::getAccessibleChild( nIndex );
184cdf0e10cSrcweir }
185cdf0e10cSrcweir 
186cdf0e10cSrcweir 
getAccessibleParent(void)187cdf0e10cSrcweir uno::Reference< XAccessible> SAL_CALL SwAccessibleDocumentBase::getAccessibleParent (void)
188cdf0e10cSrcweir         throw (uno::RuntimeException)
189cdf0e10cSrcweir {
190cdf0e10cSrcweir     return mxParent;
191cdf0e10cSrcweir }
192cdf0e10cSrcweir 
getAccessibleIndexInParent(void)193cdf0e10cSrcweir sal_Int32 SAL_CALL SwAccessibleDocumentBase::getAccessibleIndexInParent (void)
194cdf0e10cSrcweir         throw (uno::RuntimeException)
195cdf0e10cSrcweir {
196cdf0e10cSrcweir 	vos::OGuard aGuard(Application::GetSolarMutex());
197cdf0e10cSrcweir 
198cdf0e10cSrcweir 	uno::Reference < XAccessibleContext > xAcc( mxParent->getAccessibleContext() );
199cdf0e10cSrcweir 	uno::Reference < XAccessible > xThis( this );
200cdf0e10cSrcweir 	sal_Int32 nCount = xAcc->getAccessibleChildCount();
201cdf0e10cSrcweir 
202cdf0e10cSrcweir 	for( sal_Int32 i=0; i < nCount; i++ )
203cdf0e10cSrcweir 	{
204*ca62e2c2SSteve Yin 		try
205*ca62e2c2SSteve Yin 		{
206*ca62e2c2SSteve Yin 			if( xAcc->getAccessibleChild( i ) == xThis )
207*ca62e2c2SSteve Yin 				return i;
208*ca62e2c2SSteve Yin 		}
209*ca62e2c2SSteve Yin 		catch(::com::sun::star::lang::IndexOutOfBoundsException e)
210*ca62e2c2SSteve Yin 		{
211*ca62e2c2SSteve Yin 			return -1L;
212*ca62e2c2SSteve Yin 		}
213cdf0e10cSrcweir 	}
214cdf0e10cSrcweir 	return -1L;
215cdf0e10cSrcweir }
216cdf0e10cSrcweir 
getAccessibleDescription(void)217cdf0e10cSrcweir OUString SAL_CALL SwAccessibleDocumentBase::getAccessibleDescription (void)
218cdf0e10cSrcweir     throw (uno::RuntimeException)
219cdf0e10cSrcweir {
220cdf0e10cSrcweir 	return GetResource( STR_ACCESS_DOC_DESC );
221cdf0e10cSrcweir }
222cdf0e10cSrcweir 
getAccessibleName(void)223*ca62e2c2SSteve Yin OUString SAL_CALL SwAccessibleDocumentBase::getAccessibleName (void)
224*ca62e2c2SSteve Yin 		throw (::com::sun::star::uno::RuntimeException)
225cdf0e10cSrcweir {
226*ca62e2c2SSteve Yin 	OUString sAccName = GetResource( STR_ACCESS_DOC_WORDPROCESSING );
227*ca62e2c2SSteve Yin 	SwDoc *pDoc = GetShell()->GetDoc();
228*ca62e2c2SSteve Yin 	if ( pDoc )
229*ca62e2c2SSteve Yin 	{
230*ca62e2c2SSteve Yin 		OUString sFileName = pDoc->getDocAccTitle();
231*ca62e2c2SSteve Yin 		if ( !sFileName.getLength() )
232*ca62e2c2SSteve Yin 		{
233*ca62e2c2SSteve Yin 			SwDocShell* pDocSh = pDoc->GetDocShell();
234*ca62e2c2SSteve Yin 			if ( pDocSh )
235*ca62e2c2SSteve Yin 			{
236*ca62e2c2SSteve Yin 				sFileName = pDocSh->GetTitle( SFX_TITLE_APINAME );
237*ca62e2c2SSteve Yin 			}
238*ca62e2c2SSteve Yin 		}
239*ca62e2c2SSteve Yin 		OUString sReadOnly;
240*ca62e2c2SSteve Yin 		if(pDoc->getDocReadOnly())
241*ca62e2c2SSteve Yin 		{
242*ca62e2c2SSteve Yin 			sReadOnly = GetResource( STR_ACCESS_DOC_WORDPROCESSING_READONLY );
243*ca62e2c2SSteve Yin 		}
244cdf0e10cSrcweir 
245*ca62e2c2SSteve Yin 		if ( sFileName.getLength() )
246*ca62e2c2SSteve Yin 		{
247*ca62e2c2SSteve Yin 			sAccName = sFileName + sReadOnly + OUString(RTL_CONSTASCII_USTRINGPARAM(" - ")) + sAccName;
248*ca62e2c2SSteve Yin 		}
249*ca62e2c2SSteve Yin 	}
250cdf0e10cSrcweir 
251*ca62e2c2SSteve Yin 	return sAccName;
252*ca62e2c2SSteve Yin }
253cdf0e10cSrcweir 
getBounds()254*ca62e2c2SSteve Yin awt::Rectangle SAL_CALL SwAccessibleDocumentBase::getBounds()
255*ca62e2c2SSteve Yin 		throw (uno::RuntimeException)
256*ca62e2c2SSteve Yin {
257*ca62e2c2SSteve Yin 	try
258*ca62e2c2SSteve Yin 	{
259*ca62e2c2SSteve Yin 		vos::OGuard aGuard(Application::GetSolarMutex());
260*ca62e2c2SSteve Yin 
261*ca62e2c2SSteve Yin 		Window *pWin = GetWindow();
262*ca62e2c2SSteve Yin 
263*ca62e2c2SSteve Yin 		CHECK_FOR_WINDOW( XAccessibleComponent, pWin )
264*ca62e2c2SSteve Yin 
265*ca62e2c2SSteve Yin 			Rectangle aPixBounds( pWin->GetWindowExtentsRelative( pWin->GetAccessibleParentWindow() ) );
266*ca62e2c2SSteve Yin 		awt::Rectangle aBox( aPixBounds.Left(), aPixBounds.Top(),
267*ca62e2c2SSteve Yin 			aPixBounds.GetWidth(), aPixBounds.GetHeight() );
268*ca62e2c2SSteve Yin 
269*ca62e2c2SSteve Yin 		return aBox;
270*ca62e2c2SSteve Yin 	}
271*ca62e2c2SSteve Yin 	catch(::com::sun::star::lang::IndexOutOfBoundsException e)
272*ca62e2c2SSteve Yin 	{
273*ca62e2c2SSteve Yin 		return awt::Rectangle();
274*ca62e2c2SSteve Yin 	}
275cdf0e10cSrcweir }
276cdf0e10cSrcweir 
277cdf0e10cSrcweir 
getLocation()278cdf0e10cSrcweir awt::Point SAL_CALL SwAccessibleDocumentBase::getLocation()
279cdf0e10cSrcweir 		throw (uno::RuntimeException)
280cdf0e10cSrcweir {
281cdf0e10cSrcweir 	vos::OGuard aGuard(Application::GetSolarMutex());
282cdf0e10cSrcweir 
283cdf0e10cSrcweir 	Window *pWin = GetWindow();
284cdf0e10cSrcweir 
285cdf0e10cSrcweir 	CHECK_FOR_WINDOW( XAccessibleComponent, pWin )
286cdf0e10cSrcweir 
287cdf0e10cSrcweir 	Point aPixPos( pWin->GetWindowExtentsRelative( pWin->GetAccessibleParentWindow() ).TopLeft() );
288cdf0e10cSrcweir 	awt::Point aLoc( aPixPos.X(), aPixPos.Y() );
289cdf0e10cSrcweir 
290cdf0e10cSrcweir 	return aLoc;
291cdf0e10cSrcweir }
292cdf0e10cSrcweir 
293cdf0e10cSrcweir 
getLocationOnScreen()294cdf0e10cSrcweir ::com::sun::star::awt::Point SAL_CALL SwAccessibleDocumentBase::getLocationOnScreen()
295cdf0e10cSrcweir 		throw (uno::RuntimeException)
296cdf0e10cSrcweir {
297cdf0e10cSrcweir 	vos::OGuard aGuard(Application::GetSolarMutex());
298cdf0e10cSrcweir 
299cdf0e10cSrcweir 	Window *pWin = GetWindow();
300cdf0e10cSrcweir 
301cdf0e10cSrcweir 	CHECK_FOR_WINDOW( XAccessibleComponent, pWin )
302cdf0e10cSrcweir 
303cdf0e10cSrcweir 	Point aPixPos( pWin->GetWindowExtentsRelative( 0 ).TopLeft() );
304cdf0e10cSrcweir 	awt::Point aLoc( aPixPos.X(), aPixPos.Y() );
305cdf0e10cSrcweir 
306cdf0e10cSrcweir 	return aLoc;
307cdf0e10cSrcweir }
308cdf0e10cSrcweir 
309cdf0e10cSrcweir 
getSize()310cdf0e10cSrcweir ::com::sun::star::awt::Size SAL_CALL SwAccessibleDocumentBase::getSize()
311cdf0e10cSrcweir 		throw (uno::RuntimeException)
312cdf0e10cSrcweir {
313cdf0e10cSrcweir 	vos::OGuard aGuard(Application::GetSolarMutex());
314cdf0e10cSrcweir 
315cdf0e10cSrcweir 	Window *pWin = GetWindow();
316cdf0e10cSrcweir 
317cdf0e10cSrcweir 	CHECK_FOR_WINDOW( XAccessibleComponent, pWin )
318cdf0e10cSrcweir 
319cdf0e10cSrcweir 	Size aPixSize( pWin->GetWindowExtentsRelative( 0 ).GetSize() );
320cdf0e10cSrcweir 	awt::Size aSize( aPixSize.Width(), aPixSize.Height() );
321cdf0e10cSrcweir 
322cdf0e10cSrcweir 	return aSize;
323cdf0e10cSrcweir }
324cdf0e10cSrcweir 
containsPoint(const awt::Point & aPoint)325cdf0e10cSrcweir sal_Bool SAL_CALL SwAccessibleDocumentBase::containsPoint(
326cdf0e10cSrcweir 			const awt::Point& aPoint )
327cdf0e10cSrcweir 		throw (uno::RuntimeException)
328cdf0e10cSrcweir {
329cdf0e10cSrcweir 	vos::OGuard aGuard(Application::GetSolarMutex());
330cdf0e10cSrcweir 
331cdf0e10cSrcweir 	Window *pWin = GetWindow();
332cdf0e10cSrcweir 
333cdf0e10cSrcweir 	CHECK_FOR_WINDOW( XAccessibleComponent, pWin )
334cdf0e10cSrcweir 
335cdf0e10cSrcweir 	Rectangle aPixBounds( pWin->GetWindowExtentsRelative( 0 ) );
336cdf0e10cSrcweir     aPixBounds.Move(-aPixBounds.Left(), -aPixBounds.Top());
337cdf0e10cSrcweir 
338cdf0e10cSrcweir 	Point aPixPoint( aPoint.X, aPoint.Y );
339cdf0e10cSrcweir 	return aPixBounds.IsInside( aPixPoint );
340cdf0e10cSrcweir }
341cdf0e10cSrcweir 
getAccessibleAtPoint(const awt::Point & aPoint)342cdf0e10cSrcweir uno::Reference< XAccessible > SAL_CALL SwAccessibleDocumentBase::getAccessibleAtPoint(
343cdf0e10cSrcweir 				const awt::Point& aPoint )
344cdf0e10cSrcweir 		throw (uno::RuntimeException)
345cdf0e10cSrcweir {
346cdf0e10cSrcweir 	vos::OGuard aGuard(Application::GetSolarMutex());
347cdf0e10cSrcweir 
348cdf0e10cSrcweir     if( mpChildWin  )
349cdf0e10cSrcweir 	{
350cdf0e10cSrcweir 		CHECK_FOR_DEFUNC( XAccessibleComponent )
351cdf0e10cSrcweir 
352cdf0e10cSrcweir 		Window *pWin = GetWindow();
353cdf0e10cSrcweir 		CHECK_FOR_WINDOW( XAccessibleComponent, pWin )
354cdf0e10cSrcweir 
355cdf0e10cSrcweir 		Point aPixPoint( aPoint.X, aPoint.Y ); // px rel to window
356cdf0e10cSrcweir         if( mpChildWin->GetWindowExtentsRelative( pWin ).IsInside( aPixPoint ) )
357cdf0e10cSrcweir             return mpChildWin->GetAccessible();
358cdf0e10cSrcweir 	}
359cdf0e10cSrcweir 
360cdf0e10cSrcweir 	return SwAccessibleContext::getAccessibleAtPoint( aPoint );
361cdf0e10cSrcweir }
362cdf0e10cSrcweir 
363cdf0e10cSrcweir //
364cdf0e10cSrcweir // SwAccessibeDocument
365cdf0e10cSrcweir //
366cdf0e10cSrcweir 
GetStates(::utl::AccessibleStateSetHelper & rStateSet)367cdf0e10cSrcweir void SwAccessibleDocument::GetStates(
368cdf0e10cSrcweir 		::utl::AccessibleStateSetHelper& rStateSet )
369cdf0e10cSrcweir {
370cdf0e10cSrcweir 	SwAccessibleContext::GetStates( rStateSet );
371cdf0e10cSrcweir 
372cdf0e10cSrcweir 	// MULTISELECTABLE
373cdf0e10cSrcweir 	rStateSet.AddState( AccessibleStateType::MULTI_SELECTABLE );
374*ca62e2c2SSteve Yin 	rStateSet.AddState( AccessibleStateType::MANAGES_DESCENDANTS );
375cdf0e10cSrcweir }
376cdf0e10cSrcweir 
377cdf0e10cSrcweir 
SwAccessibleDocument(SwAccessibleMap * pInitMap)378cdf0e10cSrcweir SwAccessibleDocument::SwAccessibleDocument ( SwAccessibleMap* pInitMap ) :
379cdf0e10cSrcweir     SwAccessibleDocumentBase( pInitMap ),
380cdf0e10cSrcweir     maSelectionHelper( *this )
381cdf0e10cSrcweir {
382cdf0e10cSrcweir 	SetName( GetResource( STR_ACCESS_DOC_NAME ) );
383cdf0e10cSrcweir     Window *pWin = pInitMap->GetShell()->GetWin();
384cdf0e10cSrcweir 	if( pWin )
385cdf0e10cSrcweir 	{
386cdf0e10cSrcweir 		pWin->AddChildEventListener( LINK( this, SwAccessibleDocument, WindowChildEventListener ));
387cdf0e10cSrcweir 		sal_uInt16 nCount =   pWin->GetChildCount();
388cdf0e10cSrcweir 		for( sal_uInt16 i=0; i < nCount; i++ )
389cdf0e10cSrcweir 		{
390cdf0e10cSrcweir             Window* pChildWin = pWin->GetChild( i );
391cdf0e10cSrcweir             if( pChildWin &&
392cdf0e10cSrcweir                 AccessibleRole::EMBEDDED_OBJECT == pChildWin->GetAccessibleRole() )
393cdf0e10cSrcweir                 AddChild( pChildWin, sal_False );
394cdf0e10cSrcweir 		}
395cdf0e10cSrcweir 	}
396cdf0e10cSrcweir }
397cdf0e10cSrcweir 
~SwAccessibleDocument()398cdf0e10cSrcweir SwAccessibleDocument::~SwAccessibleDocument()
399cdf0e10cSrcweir {
400cdf0e10cSrcweir 	Window *pWin = GetMap() ? GetMap()->GetShell()->GetWin() : 0;
401cdf0e10cSrcweir 	if( pWin )
402cdf0e10cSrcweir 		pWin->RemoveChildEventListener( LINK( this, SwAccessibleDocument, WindowChildEventListener ));
403cdf0e10cSrcweir }
404cdf0e10cSrcweir 
Dispose(sal_Bool bRecursive)405cdf0e10cSrcweir void SwAccessibleDocument::Dispose( sal_Bool bRecursive )
406cdf0e10cSrcweir {
407cdf0e10cSrcweir 	ASSERT( GetFrm() && GetMap(), "already disposed" );
408cdf0e10cSrcweir 
409cdf0e10cSrcweir 	Window *pWin = GetMap() ? GetMap()->GetShell()->GetWin() : 0;
410cdf0e10cSrcweir 	if( pWin )
411cdf0e10cSrcweir 		pWin->RemoveChildEventListener( LINK( this, SwAccessibleDocument, WindowChildEventListener ));
412cdf0e10cSrcweir 	SwAccessibleContext::Dispose( bRecursive );
413cdf0e10cSrcweir }
414cdf0e10cSrcweir 
IMPL_LINK(SwAccessibleDocument,WindowChildEventListener,VclSimpleEvent *,pEvent)415cdf0e10cSrcweir IMPL_LINK( SwAccessibleDocument, WindowChildEventListener, VclSimpleEvent*, pEvent )
416cdf0e10cSrcweir {
417cdf0e10cSrcweir 	DBG_ASSERT( pEvent && pEvent->ISA( VclWindowEvent ), "Unknown WindowEvent!" );
418cdf0e10cSrcweir 	if ( pEvent && pEvent->ISA( VclWindowEvent ) )
419cdf0e10cSrcweir 	{
420cdf0e10cSrcweir 		VclWindowEvent *pVclEvent = static_cast< VclWindowEvent * >( pEvent );
421cdf0e10cSrcweir 		DBG_ASSERT( pVclEvent->GetWindow(), "Window???" );
422cdf0e10cSrcweir 		switch ( pVclEvent->GetId() )
423cdf0e10cSrcweir 		{
424cdf0e10cSrcweir         case VCLEVENT_WINDOW_SHOW:  // send create on show for direct accessible children
425cdf0e10cSrcweir 			{
426cdf0e10cSrcweir 				Window* pChildWin = static_cast< Window* >( pVclEvent->GetData() );
427cdf0e10cSrcweir 				if( pChildWin && AccessibleRole::EMBEDDED_OBJECT == pChildWin->GetAccessibleRole() )
428cdf0e10cSrcweir 				{
429cdf0e10cSrcweir 					AddChild( pChildWin );
430cdf0e10cSrcweir 				}
431cdf0e10cSrcweir 			}
432cdf0e10cSrcweir 			break;
433cdf0e10cSrcweir         case VCLEVENT_WINDOW_HIDE:  // send destroy on hide for direct accessible children
434cdf0e10cSrcweir 			{
435cdf0e10cSrcweir 				Window* pChildWin = static_cast< Window* >( pVclEvent->GetData() );
436cdf0e10cSrcweir 				if( pChildWin && AccessibleRole::EMBEDDED_OBJECT == pChildWin->GetAccessibleRole() )
437cdf0e10cSrcweir 				{
438cdf0e10cSrcweir 					RemoveChild( pChildWin );
439cdf0e10cSrcweir 				}
440cdf0e10cSrcweir 			}
441cdf0e10cSrcweir 			break;
442cdf0e10cSrcweir         case VCLEVENT_OBJECT_DYING:  // send destroy on hide for direct accessible children
443cdf0e10cSrcweir 			{
444cdf0e10cSrcweir 				Window* pChildWin = pVclEvent->GetWindow();
445cdf0e10cSrcweir 				if( pChildWin && AccessibleRole::EMBEDDED_OBJECT == pChildWin->GetAccessibleRole() )
446cdf0e10cSrcweir 				{
447cdf0e10cSrcweir 					RemoveChild( pChildWin );
448cdf0e10cSrcweir 				}
449cdf0e10cSrcweir 			}
450cdf0e10cSrcweir 			break;
451cdf0e10cSrcweir 		}
452cdf0e10cSrcweir 	}
453cdf0e10cSrcweir 	return 0;
454cdf0e10cSrcweir }
455cdf0e10cSrcweir 
456cdf0e10cSrcweir 
getImplementationName()457cdf0e10cSrcweir OUString SAL_CALL SwAccessibleDocument::getImplementationName()
458cdf0e10cSrcweir         throw( uno::RuntimeException )
459cdf0e10cSrcweir {
460cdf0e10cSrcweir 	return OUString(RTL_CONSTASCII_USTRINGPARAM(sImplementationName));
461cdf0e10cSrcweir }
462cdf0e10cSrcweir 
supportsService(const::rtl::OUString & sTestServiceName)463cdf0e10cSrcweir sal_Bool SAL_CALL SwAccessibleDocument::supportsService(
464cdf0e10cSrcweir 		const ::rtl::OUString& sTestServiceName)
465cdf0e10cSrcweir 	throw (uno::RuntimeException)
466cdf0e10cSrcweir {
467cdf0e10cSrcweir 	return sTestServiceName.equalsAsciiL( sServiceName,
468cdf0e10cSrcweir 										  sizeof(sServiceName)-1 ) ||
469cdf0e10cSrcweir 		   sTestServiceName.equalsAsciiL( sAccessibleServiceName,
470cdf0e10cSrcweir 				   						  sizeof(sAccessibleServiceName)-1 );
471cdf0e10cSrcweir }
472cdf0e10cSrcweir 
getSupportedServiceNames()473cdf0e10cSrcweir uno::Sequence< OUString > SAL_CALL SwAccessibleDocument::getSupportedServiceNames()
474cdf0e10cSrcweir 		throw( uno::RuntimeException )
475cdf0e10cSrcweir {
476cdf0e10cSrcweir 	uno::Sequence< OUString > aRet(2);
477cdf0e10cSrcweir 	OUString* pArray = aRet.getArray();
478cdf0e10cSrcweir 	pArray[0] = OUString( RTL_CONSTASCII_USTRINGPARAM(sServiceName) );
479cdf0e10cSrcweir 	pArray[1] = OUString( RTL_CONSTASCII_USTRINGPARAM(sAccessibleServiceName) );
480cdf0e10cSrcweir 	return aRet;
481cdf0e10cSrcweir }
482cdf0e10cSrcweir 
483cdf0e10cSrcweir //=====  XInterface  ======================================================
484cdf0e10cSrcweir 
queryInterface(const uno::Type & rType)485cdf0e10cSrcweir uno::Any SwAccessibleDocument::queryInterface(
486cdf0e10cSrcweir     const uno::Type& rType )
487cdf0e10cSrcweir     throw ( uno::RuntimeException )
488cdf0e10cSrcweir {
489cdf0e10cSrcweir     uno::Any aRet;
490cdf0e10cSrcweir     if ( rType == ::getCppuType( static_cast< uno::Reference< XAccessibleSelection > * >( 0 ) ) )
491cdf0e10cSrcweir     {
492cdf0e10cSrcweir         uno::Reference<XAccessibleSelection> aSelect = this;
493cdf0e10cSrcweir         aRet <<= aSelect;
494cdf0e10cSrcweir     }
495*ca62e2c2SSteve Yin     //Solution:Add XEventListener interface support.
496*ca62e2c2SSteve Yin 	else if ( (rType == ::getCppuType((uno::Reference<com::sun::star::document::XEventListener> *)NULL)) )
497*ca62e2c2SSteve Yin     {
498*ca62e2c2SSteve Yin         uno::Reference<com::sun::star::document::XEventListener> aSelect = this;
499*ca62e2c2SSteve Yin         aRet <<= aSelect;
500*ca62e2c2SSteve Yin     }
501*ca62e2c2SSteve Yin     else  if ( rType == ::getCppuType((uno::Reference<XAccessibleExtendedAttributes> *)NULL) )
502*ca62e2c2SSteve Yin     {
503*ca62e2c2SSteve Yin         uno::Reference<XAccessibleExtendedAttributes> aAttribute = this;
504*ca62e2c2SSteve Yin         aRet <<= aAttribute;
505*ca62e2c2SSteve Yin     }
506*ca62e2c2SSteve Yin     else if(rType == ::getCppuType((uno::Reference<XAccessibleGetAccFlowTo> *)NULL) )
507*ca62e2c2SSteve Yin     {
508*ca62e2c2SSteve Yin 		uno::Reference<XAccessibleGetAccFlowTo> AccFlowTo = this;
509*ca62e2c2SSteve Yin         aRet <<= AccFlowTo;
510*ca62e2c2SSteve Yin     }
511cdf0e10cSrcweir     else
512cdf0e10cSrcweir         aRet = SwAccessibleContext::queryInterface( rType );
513cdf0e10cSrcweir     return aRet;
514cdf0e10cSrcweir }
515cdf0e10cSrcweir 
516cdf0e10cSrcweir //====== XTypeProvider ====================================================
getTypes()517cdf0e10cSrcweir uno::Sequence< uno::Type > SAL_CALL SwAccessibleDocument::getTypes()
518cdf0e10cSrcweir     throw(uno::RuntimeException)
519cdf0e10cSrcweir {
520cdf0e10cSrcweir 	uno::Sequence< uno::Type > aTypes( SwAccessibleDocumentBase::getTypes() );
521cdf0e10cSrcweir 
522cdf0e10cSrcweir 	sal_Int32 nIndex = aTypes.getLength();
523*ca62e2c2SSteve Yin 	//Solution:Reset types memory alloc
524*ca62e2c2SSteve Yin 	//aTypes.realloc( nIndex + 1 );
525*ca62e2c2SSteve Yin 	aTypes.realloc( nIndex + 2 );
526cdf0e10cSrcweir 
527cdf0e10cSrcweir 	uno::Type* pTypes = aTypes.getArray();
528cdf0e10cSrcweir 	pTypes[nIndex] = ::getCppuType( static_cast< uno::Reference< XAccessibleSelection > * >( 0 ) );
529*ca62e2c2SSteve Yin 	//Solution:Add XEventListener interface support.
530*ca62e2c2SSteve Yin 	pTypes[nIndex + 1 ] = ::getCppuType( static_cast< uno::Reference< com::sun::star::document::XEventListener > * >( 0 ) );
531cdf0e10cSrcweir 	return aTypes;
532cdf0e10cSrcweir }
533cdf0e10cSrcweir 
getImplementationId()534cdf0e10cSrcweir uno::Sequence< sal_Int8 > SAL_CALL SwAccessibleDocument::getImplementationId()
535cdf0e10cSrcweir 		throw(uno::RuntimeException)
536cdf0e10cSrcweir {
537cdf0e10cSrcweir     vos::OGuard aGuard(Application::GetSolarMutex());
538cdf0e10cSrcweir     static uno::Sequence< sal_Int8 > aId( 16 );
539cdf0e10cSrcweir     static sal_Bool bInit = sal_False;
540cdf0e10cSrcweir     if(!bInit)
541cdf0e10cSrcweir     {
542cdf0e10cSrcweir         rtl_createUuid( (sal_uInt8 *)(aId.getArray() ), 0, sal_True );
543cdf0e10cSrcweir         bInit = sal_True;
544cdf0e10cSrcweir     }
545cdf0e10cSrcweir     return aId;
546cdf0e10cSrcweir }
547cdf0e10cSrcweir 
548cdf0e10cSrcweir //=====  XAccessibleSelection  ============================================
549cdf0e10cSrcweir 
selectAccessibleChild(sal_Int32 nChildIndex)550cdf0e10cSrcweir void SwAccessibleDocument::selectAccessibleChild(
551cdf0e10cSrcweir     sal_Int32 nChildIndex )
552cdf0e10cSrcweir     throw ( lang::IndexOutOfBoundsException,
553cdf0e10cSrcweir             uno::RuntimeException )
554cdf0e10cSrcweir {
555cdf0e10cSrcweir     maSelectionHelper.selectAccessibleChild(nChildIndex);
556cdf0e10cSrcweir }
557cdf0e10cSrcweir 
isAccessibleChildSelected(sal_Int32 nChildIndex)558cdf0e10cSrcweir sal_Bool SwAccessibleDocument::isAccessibleChildSelected(
559cdf0e10cSrcweir     sal_Int32 nChildIndex )
560cdf0e10cSrcweir     throw ( lang::IndexOutOfBoundsException,
561cdf0e10cSrcweir             uno::RuntimeException )
562cdf0e10cSrcweir {
563cdf0e10cSrcweir     return maSelectionHelper.isAccessibleChildSelected(nChildIndex);
564cdf0e10cSrcweir }
565cdf0e10cSrcweir 
clearAccessibleSelection()566cdf0e10cSrcweir void SwAccessibleDocument::clearAccessibleSelection(  )
567cdf0e10cSrcweir     throw ( uno::RuntimeException )
568cdf0e10cSrcweir {
569cdf0e10cSrcweir     maSelectionHelper.clearAccessibleSelection();
570cdf0e10cSrcweir }
571cdf0e10cSrcweir 
selectAllAccessibleChildren()572cdf0e10cSrcweir void SwAccessibleDocument::selectAllAccessibleChildren(  )
573cdf0e10cSrcweir     throw ( uno::RuntimeException )
574cdf0e10cSrcweir {
575cdf0e10cSrcweir     maSelectionHelper.selectAllAccessibleChildren();
576cdf0e10cSrcweir }
577cdf0e10cSrcweir 
getSelectedAccessibleChildCount()578cdf0e10cSrcweir sal_Int32 SwAccessibleDocument::getSelectedAccessibleChildCount(  )
579cdf0e10cSrcweir     throw ( uno::RuntimeException )
580cdf0e10cSrcweir {
581cdf0e10cSrcweir     return maSelectionHelper.getSelectedAccessibleChildCount();
582cdf0e10cSrcweir }
583cdf0e10cSrcweir 
getSelectedAccessibleChild(sal_Int32 nSelectedChildIndex)584cdf0e10cSrcweir uno::Reference<XAccessible> SwAccessibleDocument::getSelectedAccessibleChild(
585cdf0e10cSrcweir     sal_Int32 nSelectedChildIndex )
586cdf0e10cSrcweir     throw ( lang::IndexOutOfBoundsException,
587cdf0e10cSrcweir             uno::RuntimeException)
588cdf0e10cSrcweir {
589cdf0e10cSrcweir     return maSelectionHelper.getSelectedAccessibleChild(nSelectedChildIndex);
590cdf0e10cSrcweir }
591cdf0e10cSrcweir 
592cdf0e10cSrcweir // --> OD 2004-11-16 #111714# - index has to be treated as global child index.
deselectAccessibleChild(sal_Int32 nChildIndex)593cdf0e10cSrcweir void SwAccessibleDocument::deselectAccessibleChild(
594cdf0e10cSrcweir     sal_Int32 nChildIndex )
595cdf0e10cSrcweir     throw ( lang::IndexOutOfBoundsException,
596cdf0e10cSrcweir             uno::RuntimeException )
597cdf0e10cSrcweir {
598cdf0e10cSrcweir     maSelectionHelper.deselectAccessibleChild( nChildIndex );
599cdf0e10cSrcweir }
600*ca62e2c2SSteve Yin //Solution:Implement XEventListener interfaces
notifyEvent(const::com::sun::star::document::EventObject & Event)601*ca62e2c2SSteve Yin void SAL_CALL SwAccessibleDocument::notifyEvent( const ::com::sun::star::document::EventObject& Event )
602*ca62e2c2SSteve Yin 			throw (::com::sun::star::uno::RuntimeException)
603*ca62e2c2SSteve Yin {
604*ca62e2c2SSteve Yin 	if ( Event.EventName.equalsAscii( "FirstPageShows" ) )
605*ca62e2c2SSteve Yin 	{
606*ca62e2c2SSteve Yin 		FireStateChangedEvent( AccessibleStateType::FOCUSED,sal_True );
607*ca62e2c2SSteve Yin 	}
608*ca62e2c2SSteve Yin 	else if ( Event.EventName.equalsAscii( "LoadFinished" ) )
609*ca62e2c2SSteve Yin 	{
610*ca62e2c2SSteve Yin 		// IA2 CWS. MT: OFFSCREEN == !SHOWING, should stay consistent
611*ca62e2c2SSteve Yin 		// FireStateChangedEvent( AccessibleStateType::OFFSCREEN,sal_True );
612*ca62e2c2SSteve Yin 		// MT: LoadFinished => Why not SHOWING == TRUE?
613*ca62e2c2SSteve Yin 		FireStateChangedEvent( AccessibleStateType::SHOWING,sal_False );
614*ca62e2c2SSteve Yin 	}
615*ca62e2c2SSteve Yin 	else if ( Event.EventName.equalsAscii( "FormatFinished" ) )
616*ca62e2c2SSteve Yin 	{
617*ca62e2c2SSteve Yin 		FireStateChangedEvent( AccessibleStateType::BUSY,sal_False );
618*ca62e2c2SSteve Yin 		// FireStateChangedEvent( AccessibleStateType::OFFSCREEN,sal_False );
619*ca62e2c2SSteve Yin 		FireStateChangedEvent( AccessibleStateType::SHOWING,sal_True );
620*ca62e2c2SSteve Yin 	}
621*ca62e2c2SSteve Yin 	else
622*ca62e2c2SSteve Yin 	{
623*ca62e2c2SSteve Yin 		isIfAsynLoad = sal_False;
624*ca62e2c2SSteve Yin 	}
625*ca62e2c2SSteve Yin }
626*ca62e2c2SSteve Yin 
disposing(const::com::sun::star::lang::EventObject &)627*ca62e2c2SSteve Yin void SAL_CALL SwAccessibleDocument::disposing( const ::com::sun::star::lang::EventObject& )
628*ca62e2c2SSteve Yin 			throw (::com::sun::star::uno::RuntimeException)
629*ca62e2c2SSteve Yin {
630*ca62e2c2SSteve Yin }
631*ca62e2c2SSteve Yin 
getExtendedAttributes()632*ca62e2c2SSteve Yin uno::Any SAL_CALL SwAccessibleDocument::getExtendedAttributes()
633*ca62e2c2SSteve Yin 		throw (::com::sun::star::lang::IndexOutOfBoundsException, ::com::sun::star::uno::RuntimeException)
634*ca62e2c2SSteve Yin {
635*ca62e2c2SSteve Yin 	uno::Any anyAtrribute;
636*ca62e2c2SSteve Yin 	SwDoc *pDoc = GetShell()->GetDoc();
637*ca62e2c2SSteve Yin 
638*ca62e2c2SSteve Yin 	if (!pDoc)
639*ca62e2c2SSteve Yin 		return anyAtrribute;
640*ca62e2c2SSteve Yin 	SwCrsrShell* pCrsrShell = GetCrsrShell();
641*ca62e2c2SSteve Yin 	if( !pCrsrShell )
642*ca62e2c2SSteve Yin 		return anyAtrribute;
643*ca62e2c2SSteve Yin 
644*ca62e2c2SSteve Yin     SwFEShell* pFEShell = pCrsrShell->ISA( SwFEShell )
645*ca62e2c2SSteve Yin 								? static_cast<SwFEShell*>( pCrsrShell )
646*ca62e2c2SSteve Yin 							: 0;
647*ca62e2c2SSteve Yin 	rtl::OUString sAttrName;
648*ca62e2c2SSteve Yin 	rtl::OUString sValue;
649*ca62e2c2SSteve Yin 	sal_uInt16 nPage, nLogPage;
650*ca62e2c2SSteve Yin 	String sDisplay;
651*ca62e2c2SSteve Yin 
652*ca62e2c2SSteve Yin 	if( pFEShell )
653*ca62e2c2SSteve Yin 	{
654*ca62e2c2SSteve Yin 		pFEShell->GetPageNumber(-1,sal_True,nPage,nLogPage,sDisplay);
655*ca62e2c2SSteve Yin 		sAttrName = rtl::OUString::createFromAscii("page-name:");
656*ca62e2c2SSteve Yin 
657*ca62e2c2SSteve Yin 
658*ca62e2c2SSteve Yin 		sValue = sAttrName + sDisplay ;
659*ca62e2c2SSteve Yin 		sAttrName = rtl::OUString::createFromAscii(";page-number:");
660*ca62e2c2SSteve Yin 		sValue += sAttrName;
661*ca62e2c2SSteve Yin 		sValue += String::CreateFromInt32( nPage ) ;
662*ca62e2c2SSteve Yin 		sAttrName = rtl::OUString::createFromAscii(";total-pages:");
663*ca62e2c2SSteve Yin 		sValue += sAttrName;
664*ca62e2c2SSteve Yin 		sValue += String::CreateFromInt32( pCrsrShell->GetPageCnt() ) ;
665*ca62e2c2SSteve Yin 		sValue +=  rtl::OUString::createFromAscii(";");
666*ca62e2c2SSteve Yin 
667*ca62e2c2SSteve Yin 
668*ca62e2c2SSteve Yin 		sAttrName=rtl::OUString::createFromAscii("line-number:");
669*ca62e2c2SSteve Yin 
670*ca62e2c2SSteve Yin 
671*ca62e2c2SSteve Yin 
672*ca62e2c2SSteve Yin 		SwCntntFrm* pCurrFrm = pCrsrShell->GetCurrFrm();
673*ca62e2c2SSteve Yin 		SwPageFrm* pCurrPage=((SwFrm*)pCurrFrm)->FindPageFrm();
674*ca62e2c2SSteve Yin 		sal_uLong nLineNum = 0;
675*ca62e2c2SSteve Yin 		SwTxtFrm* pTxtFrm = NULL;
676*ca62e2c2SSteve Yin 		SwTxtFrm* pCurrTxtFrm = NULL;
677*ca62e2c2SSteve Yin 		pTxtFrm = static_cast< SwTxtFrm* >(static_cast< SwPageFrm* > (pCurrPage)->ContainsCntnt());
678*ca62e2c2SSteve Yin 		if (pCurrFrm->IsInFly())//such as, graphic,chart
679*ca62e2c2SSteve Yin 		{
680*ca62e2c2SSteve Yin 			SwFlyFrm *pFlyFrm = pCurrFrm->FindFlyFrm();
681*ca62e2c2SSteve Yin 			const SwFmtAnchor& rAnchor = pFlyFrm->GetFmt()->GetAnchor();
682*ca62e2c2SSteve Yin 			RndStdIds eAnchorId = rAnchor.GetAnchorId();
683*ca62e2c2SSteve Yin 			if(eAnchorId == FLY_AS_CHAR)
684*ca62e2c2SSteve Yin 			{
685*ca62e2c2SSteve Yin 				const SwFrm *pSwFrm = pFlyFrm->GetAnchorFrm();
686*ca62e2c2SSteve Yin 				if(pSwFrm->IsTxtFrm())
687*ca62e2c2SSteve Yin 					pCurrTxtFrm = ((SwTxtFrm*)(pSwFrm));
688*ca62e2c2SSteve Yin 			}
689*ca62e2c2SSteve Yin 		}
690*ca62e2c2SSteve Yin 		else
691*ca62e2c2SSteve Yin 			pCurrTxtFrm = static_cast< SwTxtFrm* >(pCurrFrm);
692*ca62e2c2SSteve Yin 		//check whether the text frame where the Graph/OLE/Frame anchored is in the Header/Footer
693*ca62e2c2SSteve Yin 		SwFrm* pFrm = pCurrTxtFrm;
694*ca62e2c2SSteve Yin 		while ( pFrm && !pFrm->IsHeaderFrm() && !pFrm->IsFooterFrm() )
695*ca62e2c2SSteve Yin 			pFrm = pFrm->GetUpper();
696*ca62e2c2SSteve Yin 		if ( pFrm )
697*ca62e2c2SSteve Yin 			pCurrTxtFrm = NULL;
698*ca62e2c2SSteve Yin 		//check shape
699*ca62e2c2SSteve Yin 		if(pCrsrShell->Imp()->GetDrawView())
700*ca62e2c2SSteve Yin 		{
701*ca62e2c2SSteve Yin 			const SdrMarkList &rMrkList = pCrsrShell->Imp()->GetDrawView()->GetMarkedObjectList();
702*ca62e2c2SSteve Yin 			for ( sal_uInt16 i = 0; i < rMrkList.GetMarkCount(); ++i )
703*ca62e2c2SSteve Yin 			{
704*ca62e2c2SSteve Yin 				SdrObject *pObj = rMrkList.GetMark(i)->GetMarkedSdrObj();
705*ca62e2c2SSteve Yin 				SwFrmFmt* pFmt = ((SwDrawContact*)pObj->GetUserCall())->GetFmt();
706*ca62e2c2SSteve Yin 				const SwFmtAnchor& rAnchor = pFmt->GetAnchor();
707*ca62e2c2SSteve Yin 				if( FLY_AS_CHAR != rAnchor.GetAnchorId() )
708*ca62e2c2SSteve Yin 					pCurrTxtFrm = NULL;
709*ca62e2c2SSteve Yin 			}
710*ca62e2c2SSteve Yin 		}
711*ca62e2c2SSteve Yin 		//calculate line number
712*ca62e2c2SSteve Yin 		if (pCurrTxtFrm && pTxtFrm)
713*ca62e2c2SSteve Yin 		{
714*ca62e2c2SSteve Yin 			if (!(pCurrTxtFrm->IsInTab() || pCurrTxtFrm->IsInFtn()))
715*ca62e2c2SSteve Yin 			{
716*ca62e2c2SSteve Yin 				while( pTxtFrm != pCurrTxtFrm )
717*ca62e2c2SSteve Yin 				{
718*ca62e2c2SSteve Yin 					//check header/footer
719*ca62e2c2SSteve Yin 					pFrm = pTxtFrm;
720*ca62e2c2SSteve Yin 					while ( pFrm && !pFrm->IsHeaderFrm() && !pFrm->IsFooterFrm() )
721*ca62e2c2SSteve Yin 						pFrm = pFrm->GetUpper();
722*ca62e2c2SSteve Yin 					if ( pFrm )
723*ca62e2c2SSteve Yin 					{
724*ca62e2c2SSteve Yin 						pTxtFrm = static_cast< SwTxtFrm*>(pTxtFrm->GetNextCntntFrm());
725*ca62e2c2SSteve Yin 						continue;
726*ca62e2c2SSteve Yin 					}
727*ca62e2c2SSteve Yin 					if (!(pTxtFrm->IsInTab() || pTxtFrm->IsInFtn() || pTxtFrm->IsInFly()))
728*ca62e2c2SSteve Yin 						nLineNum += pTxtFrm->GetThisLines();
729*ca62e2c2SSteve Yin 					pTxtFrm = static_cast< SwTxtFrm* >(pTxtFrm ->GetNextCntntFrm());
730*ca62e2c2SSteve Yin 				}
731*ca62e2c2SSteve Yin 				SwPaM* pCaret = pCrsrShell->GetCrsr();
732*ca62e2c2SSteve Yin 				if (!pCurrTxtFrm->IsEmpty() && pCaret)
733*ca62e2c2SSteve Yin 				{
734*ca62e2c2SSteve Yin 					sal_uInt16 nActPos = 0;
735*ca62e2c2SSteve Yin 					if (pCurrTxtFrm->IsTxtFrm())
736*ca62e2c2SSteve Yin 					{
737*ca62e2c2SSteve Yin 						const SwPosition* pPoint = NULL;
738*ca62e2c2SSteve Yin 						if(pCurrTxtFrm->IsInFly())
739*ca62e2c2SSteve Yin 						{
740*ca62e2c2SSteve Yin 							SwFlyFrm *pFlyFrm = pCurrTxtFrm->FindFlyFrm();
741*ca62e2c2SSteve Yin 							const SwFmtAnchor& rAnchor = pFlyFrm->GetFmt()->GetAnchor();
742*ca62e2c2SSteve Yin 							pPoint= rAnchor.GetCntntAnchor();
743*ca62e2c2SSteve Yin 						}
744*ca62e2c2SSteve Yin 						else
745*ca62e2c2SSteve Yin 							pPoint = pCaret->GetPoint();
746*ca62e2c2SSteve Yin 						nActPos = pPoint->nContent.GetIndex();
747*ca62e2c2SSteve Yin 						nLineNum += pCurrTxtFrm->GetLineCount( nActPos );
748*ca62e2c2SSteve Yin 					}
749*ca62e2c2SSteve Yin 					else//graphic, form, shape, etc.
750*ca62e2c2SSteve Yin 					{
751*ca62e2c2SSteve Yin 						SwPosition* pPoint =  pCaret->GetPoint();
752*ca62e2c2SSteve Yin 						Point aPt = pCrsrShell->_GetCrsr()->GetPtPos();
753*ca62e2c2SSteve Yin 						if( pCrsrShell->GetLayout()->GetCrsrOfst( pPoint, aPt/*,* &eTmpState*/ ) )
754*ca62e2c2SSteve Yin 						{
755*ca62e2c2SSteve Yin 							nActPos = pPoint->nContent.GetIndex();
756*ca62e2c2SSteve Yin 							nLineNum += pCurrTxtFrm->GetLineCount( nActPos );
757*ca62e2c2SSteve Yin 						}
758*ca62e2c2SSteve Yin 					}
759*ca62e2c2SSteve Yin 				}
760*ca62e2c2SSteve Yin 				else
761*ca62e2c2SSteve Yin 					++nLineNum;
762*ca62e2c2SSteve Yin 			}
763*ca62e2c2SSteve Yin 		}
764*ca62e2c2SSteve Yin 
765*ca62e2c2SSteve Yin 		sValue += sAttrName;
766*ca62e2c2SSteve Yin 		sValue += String::CreateFromInt32( nLineNum ) ;
767*ca62e2c2SSteve Yin 
768*ca62e2c2SSteve Yin 		sValue +=  rtl::OUString::createFromAscii(";");
769*ca62e2c2SSteve Yin 
770*ca62e2c2SSteve Yin 
771*ca62e2c2SSteve Yin 		SwFrm* pCurrCol=((SwFrm*)pCurrFrm)->FindColFrm();
772*ca62e2c2SSteve Yin 
773*ca62e2c2SSteve Yin 		sAttrName=rtl::OUString::createFromAscii("column-number:");
774*ca62e2c2SSteve Yin 		sValue += sAttrName;
775*ca62e2c2SSteve Yin 
776*ca62e2c2SSteve Yin 		sal_uInt16 nCurrCol = 1;
777*ca62e2c2SSteve Yin 		if(pCurrCol!=NULL)
778*ca62e2c2SSteve Yin 		{
779*ca62e2c2SSteve Yin 			//SwLayoutFrm* pParent = pCurrCol->GetUpper();
780*ca62e2c2SSteve Yin 			SwFrm* pCurrPageCol=((SwFrm*)pCurrFrm)->FindColFrm();
781*ca62e2c2SSteve Yin 			while(pCurrPageCol && pCurrPageCol->GetUpper() && pCurrPageCol->GetUpper()->IsPageFrm())
782*ca62e2c2SSteve Yin 			{
783*ca62e2c2SSteve Yin 				pCurrPageCol = pCurrPageCol->GetUpper();
784*ca62e2c2SSteve Yin 			}
785*ca62e2c2SSteve Yin 
786*ca62e2c2SSteve Yin 			SwLayoutFrm* pParent = (SwLayoutFrm*)(pCurrPageCol->GetUpper());
787*ca62e2c2SSteve Yin 
788*ca62e2c2SSteve Yin 			if(pParent!=NULL)
789*ca62e2c2SSteve Yin 			{
790*ca62e2c2SSteve Yin 				SwFrm* pCol = pParent->Lower();
791*ca62e2c2SSteve Yin 				while(pCol&&(pCol!=pCurrPageCol))
792*ca62e2c2SSteve Yin 				{
793*ca62e2c2SSteve Yin 					pCol = pCol->GetNext();
794*ca62e2c2SSteve Yin 					nCurrCol +=1;
795*ca62e2c2SSteve Yin 				}
796*ca62e2c2SSteve Yin 			}
797*ca62e2c2SSteve Yin 		}
798*ca62e2c2SSteve Yin 		sValue += String::CreateFromInt32( nCurrCol ) ;
799*ca62e2c2SSteve Yin 		sValue +=  rtl::OUString::createFromAscii(";");
800*ca62e2c2SSteve Yin 
801*ca62e2c2SSteve Yin 		sAttrName=rtl::OUString::createFromAscii("total-columns:");
802*ca62e2c2SSteve Yin 
803*ca62e2c2SSteve Yin 		const SwFmtCol &rFmtCol=pCurrPage->GetAttrSet()->GetCol();
804*ca62e2c2SSteve Yin 		sal_uInt16 nColCount=rFmtCol.GetNumCols();
805*ca62e2c2SSteve Yin 		nColCount = nColCount>0?nColCount:1;
806*ca62e2c2SSteve Yin 		sValue += sAttrName;
807*ca62e2c2SSteve Yin 		sValue += String::CreateFromInt32( nColCount ) ;
808*ca62e2c2SSteve Yin 
809*ca62e2c2SSteve Yin 		sValue +=  rtl::OUString::createFromAscii(";");
810*ca62e2c2SSteve Yin 
811*ca62e2c2SSteve Yin 		if(pCurrFrm!=NULL)
812*ca62e2c2SSteve Yin 		{
813*ca62e2c2SSteve Yin 			SwSectionFrm* pCurrSctFrm=((SwFrm*)pCurrFrm)->FindSctFrm();
814*ca62e2c2SSteve Yin 			if(pCurrSctFrm!=NULL && pCurrSctFrm->GetSection()!=NULL )
815*ca62e2c2SSteve Yin 			{
816*ca62e2c2SSteve Yin 				sAttrName = rtl::OUString::createFromAscii("section-name:");
817*ca62e2c2SSteve Yin 
818*ca62e2c2SSteve Yin 				sValue += sAttrName;
819*ca62e2c2SSteve Yin 				String sectionName = pCurrSctFrm->GetSection()->GetSectionName();
820*ca62e2c2SSteve Yin 
821*ca62e2c2SSteve Yin 				sectionName.SearchAndReplace( String::CreateFromAscii( "\\" ), String::CreateFromAscii("\\\\" ));
822*ca62e2c2SSteve Yin 				sectionName.SearchAndReplace( String::CreateFromAscii( "=" ), String::CreateFromAscii("\\=" ) );
823*ca62e2c2SSteve Yin 				sectionName.SearchAndReplace( String::CreateFromAscii( ";" ), String::CreateFromAscii("\\;" ) );
824*ca62e2c2SSteve Yin 				sectionName.SearchAndReplace( String::CreateFromAscii( "," ), String::CreateFromAscii("\\," ) );
825*ca62e2c2SSteve Yin 				sectionName.SearchAndReplace( String::CreateFromAscii( ":" ), String::CreateFromAscii("\\:" ) );
826*ca62e2c2SSteve Yin 
827*ca62e2c2SSteve Yin 				sValue += sectionName;
828*ca62e2c2SSteve Yin 				//sValue += pCurrSctFrm->GetSection()->GetName();
829*ca62e2c2SSteve Yin 
830*ca62e2c2SSteve Yin 				sValue += rtl::OUString::createFromAscii(";");
831*ca62e2c2SSteve Yin 
832*ca62e2c2SSteve Yin 				//section-columns-number
833*ca62e2c2SSteve Yin 				{
834*ca62e2c2SSteve Yin 				sAttrName=rtl::OUString::createFromAscii("section-columns-number:");
835*ca62e2c2SSteve Yin 
836*ca62e2c2SSteve Yin 				nCurrCol = 1;
837*ca62e2c2SSteve Yin 
838*ca62e2c2SSteve Yin 				if(pCurrCol!=NULL)
839*ca62e2c2SSteve Yin 				{
840*ca62e2c2SSteve Yin 					SwLayoutFrm* pParent = pCurrCol->GetUpper();
841*ca62e2c2SSteve Yin 					if(pParent!=NULL)
842*ca62e2c2SSteve Yin 					{
843*ca62e2c2SSteve Yin 						SwFrm* pCol = pParent->Lower();
844*ca62e2c2SSteve Yin 						while(pCol&&(pCol!=pCurrCol))
845*ca62e2c2SSteve Yin 						{
846*ca62e2c2SSteve Yin 							pCol = pCol->GetNext();
847*ca62e2c2SSteve Yin 							nCurrCol +=1;
848*ca62e2c2SSteve Yin 						}
849*ca62e2c2SSteve Yin 					}
850*ca62e2c2SSteve Yin 				}
851*ca62e2c2SSteve Yin 				sValue += sAttrName;
852*ca62e2c2SSteve Yin 				sValue += String::CreateFromInt32( nCurrCol ) ;
853*ca62e2c2SSteve Yin 				sValue +=  rtl::OUString::createFromAscii(";");
854*ca62e2c2SSteve Yin 				}
855*ca62e2c2SSteve Yin 
856*ca62e2c2SSteve Yin 				//section-total-columns
857*ca62e2c2SSteve Yin 				{
858*ca62e2c2SSteve Yin 				sAttrName=rtl::OUString::createFromAscii("section-total-columns:");
859*ca62e2c2SSteve Yin 				const SwFmtCol &rFmtSctCol=pCurrSctFrm->GetAttrSet()->GetCol();
860*ca62e2c2SSteve Yin 				sal_uInt16 nSctColCount=rFmtSctCol.GetNumCols();
861*ca62e2c2SSteve Yin 				nSctColCount = nSctColCount>0?nSctColCount:1;
862*ca62e2c2SSteve Yin 				sValue += sAttrName;
863*ca62e2c2SSteve Yin 				sValue += String::CreateFromInt32( nSctColCount ) ;
864*ca62e2c2SSteve Yin 
865*ca62e2c2SSteve Yin 				sValue +=  rtl::OUString::createFromAscii(";");
866*ca62e2c2SSteve Yin 				}
867*ca62e2c2SSteve Yin 			}
868*ca62e2c2SSteve Yin 		}
869*ca62e2c2SSteve Yin 		anyAtrribute <<= sValue;
870*ca62e2c2SSteve Yin 	}
871*ca62e2c2SSteve Yin 	return anyAtrribute;
872*ca62e2c2SSteve Yin }
873*ca62e2c2SSteve Yin 
getBackground()874*ca62e2c2SSteve Yin sal_Int32 SAL_CALL SwAccessibleDocument::getBackground()
875*ca62e2c2SSteve Yin 		throw (::com::sun::star::uno::RuntimeException)
876*ca62e2c2SSteve Yin {
877*ca62e2c2SSteve Yin 	vos::OGuard aGuard(Application::GetSolarMutex());
878*ca62e2c2SSteve Yin 	return SW_MOD()->GetColorConfig().GetColorValue( ::svtools::DOCCOLOR ).nColor;
879*ca62e2c2SSteve Yin }
880*ca62e2c2SSteve Yin 
881*ca62e2c2SSteve Yin ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >
get_AccFlowTo(const::com::sun::star::uno::Any & rAny,sal_Int32 nType)882*ca62e2c2SSteve Yin 		SAL_CALL SwAccessibleDocument::get_AccFlowTo(const ::com::sun::star::uno::Any& rAny, sal_Int32 nType)
883*ca62e2c2SSteve Yin 		throw ( ::com::sun::star::uno::RuntimeException )
884*ca62e2c2SSteve Yin {
885*ca62e2c2SSteve Yin 	const sal_Int32 FORSPELLCHECKFLOWTO = 1;
886*ca62e2c2SSteve Yin 	const sal_Int32 FORFINDREPLACEFLOWTO = 2;
887*ca62e2c2SSteve Yin 	SwAccessibleMap* pAccMap = GetMap();
888*ca62e2c2SSteve Yin 	if ( !pAccMap )
889*ca62e2c2SSteve Yin 	{
890*ca62e2c2SSteve Yin 		goto Rt;
891*ca62e2c2SSteve Yin 	}
892*ca62e2c2SSteve Yin 
893*ca62e2c2SSteve Yin 	if ( nType == FORSPELLCHECKFLOWTO )
894*ca62e2c2SSteve Yin 	{
895*ca62e2c2SSteve Yin 		uno::Reference< ::com::sun::star::drawing::XShape > xShape;
896*ca62e2c2SSteve Yin 		rAny >>= xShape;
897*ca62e2c2SSteve Yin 		if( xShape.is() )
898*ca62e2c2SSteve Yin 		{
899*ca62e2c2SSteve Yin 			SdrObject* pObj = GetSdrObjectFromXShape(xShape);
900*ca62e2c2SSteve Yin 			if( pObj )
901*ca62e2c2SSteve Yin 			{
902*ca62e2c2SSteve Yin 				uno::Reference<XAccessible> xAcc = pAccMap->GetContext(pObj, this, sal_False);
903*ca62e2c2SSteve Yin 				uno::Reference < XAccessibleSelection > xAccSelection( xAcc, uno::UNO_QUERY );
904*ca62e2c2SSteve Yin 				if ( xAccSelection.is() )
905*ca62e2c2SSteve Yin 				{
906*ca62e2c2SSteve Yin 					try
907*ca62e2c2SSteve Yin 					{
908*ca62e2c2SSteve Yin 						if ( xAccSelection->getSelectedAccessibleChildCount() )
909*ca62e2c2SSteve Yin 						{
910*ca62e2c2SSteve Yin 							uno::Reference < XAccessible > xSel = xAccSelection->getSelectedAccessibleChild( 0 );
911*ca62e2c2SSteve Yin 							if ( xSel.is() )
912*ca62e2c2SSteve Yin 							{
913*ca62e2c2SSteve Yin 								uno::Reference < XAccessibleContext > xSelContext( xSel->getAccessibleContext() );
914*ca62e2c2SSteve Yin 								if ( xSelContext.is() )
915*ca62e2c2SSteve Yin 								{
916*ca62e2c2SSteve Yin 									//if in sw we find the selected paragraph here
917*ca62e2c2SSteve Yin 									if ( xSelContext->getAccessibleRole() == AccessibleRole::PARAGRAPH )
918*ca62e2c2SSteve Yin 									{
919*ca62e2c2SSteve Yin 										uno::Sequence<uno::Any> aRet( 1 );
920*ca62e2c2SSteve Yin 										aRet[0] = uno::makeAny( xSel );
921*ca62e2c2SSteve Yin 										return aRet;
922*ca62e2c2SSteve Yin 									}
923*ca62e2c2SSteve Yin 								}
924*ca62e2c2SSteve Yin 							}
925*ca62e2c2SSteve Yin 						}
926*ca62e2c2SSteve Yin 					}
927*ca62e2c2SSteve Yin 					catch ( com::sun::star::lang::IndexOutOfBoundsException )
928*ca62e2c2SSteve Yin 					{
929*ca62e2c2SSteve Yin 						//return empty sequence
930*ca62e2c2SSteve Yin 						goto Rt;
931*ca62e2c2SSteve Yin 					}
932*ca62e2c2SSteve Yin 					//end of try...catch
933*ca62e2c2SSteve Yin 				}
934*ca62e2c2SSteve Yin 				/*uno::Sequence< uno::Any > aRet(1);
935*ca62e2c2SSteve Yin 				aRet[0] = uno::makeAny( xAcc );
936*ca62e2c2SSteve Yin 				return aRet;*/
937*ca62e2c2SSteve Yin 			}
938*ca62e2c2SSteve Yin 		}
939*ca62e2c2SSteve Yin 		else
940*ca62e2c2SSteve Yin 		{
941*ca62e2c2SSteve Yin 			uno::Reference< XAccessible > xAcc = pAccMap->GetCursorContext();
942*ca62e2c2SSteve Yin 			SwAccessibleContext *pAccImpl = static_cast< SwAccessibleContext *>( xAcc.get() );
943*ca62e2c2SSteve Yin 			if ( pAccImpl && pAccImpl->getAccessibleRole() == AccessibleRole::PARAGRAPH )
944*ca62e2c2SSteve Yin 			{
945*ca62e2c2SSteve Yin 				uno::Sequence< uno::Any > aRet(1);
946*ca62e2c2SSteve Yin 				aRet[0] = uno::makeAny( xAcc );
947*ca62e2c2SSteve Yin 				return aRet;
948*ca62e2c2SSteve Yin 			}
949*ca62e2c2SSteve Yin 		}
950*ca62e2c2SSteve Yin 	}
951*ca62e2c2SSteve Yin 	else if ( nType == FORFINDREPLACEFLOWTO )
952*ca62e2c2SSteve Yin 	{
953*ca62e2c2SSteve Yin 		SwCrsrShell* pCrsrShell = GetCrsrShell();
954*ca62e2c2SSteve Yin 		if ( pCrsrShell )
955*ca62e2c2SSteve Yin 		{
956*ca62e2c2SSteve Yin 			SwPaM *_pStartCrsr = pCrsrShell->GetCrsr(), *__pStartCrsr = _pStartCrsr;
957*ca62e2c2SSteve Yin 			SwCntntNode* pPrevNode = NULL;
958*ca62e2c2SSteve Yin 			std::vector<SwFrm*> vFrmList;
959*ca62e2c2SSteve Yin 			do
960*ca62e2c2SSteve Yin 			{
961*ca62e2c2SSteve Yin 				if ( _pStartCrsr && _pStartCrsr->HasMark() )
962*ca62e2c2SSteve Yin 				{
963*ca62e2c2SSteve Yin 					SwCntntNode* pCntntNode = _pStartCrsr->GetCntntNode();
964*ca62e2c2SSteve Yin 					if ( pCntntNode == pPrevNode )
965*ca62e2c2SSteve Yin 					{
966*ca62e2c2SSteve Yin 						continue;
967*ca62e2c2SSteve Yin 					}
968*ca62e2c2SSteve Yin 					SwFrm* pFrm = pCntntNode ? pCntntNode->getLayoutFrm( pCrsrShell->GetLayout() ) : NULL;
969*ca62e2c2SSteve Yin 					if ( pFrm )
970*ca62e2c2SSteve Yin 					{
971*ca62e2c2SSteve Yin 						vFrmList.push_back( pFrm );
972*ca62e2c2SSteve Yin 					}
973*ca62e2c2SSteve Yin 
974*ca62e2c2SSteve Yin 					pPrevNode = pCntntNode;
975*ca62e2c2SSteve Yin 				}
976*ca62e2c2SSteve Yin 			}
977*ca62e2c2SSteve Yin 
978*ca62e2c2SSteve Yin 			while( _pStartCrsr && ( (_pStartCrsr=(SwPaM *)_pStartCrsr->GetNext()) != __pStartCrsr) );
979*ca62e2c2SSteve Yin 
980*ca62e2c2SSteve Yin 			if ( vFrmList.size() )
981*ca62e2c2SSteve Yin 			{
982*ca62e2c2SSteve Yin 				uno::Sequence< uno::Any > aRet(vFrmList.size());
983*ca62e2c2SSteve Yin 				std::vector<SwFrm*>::iterator aIter = vFrmList.begin();
984*ca62e2c2SSteve Yin 				for ( sal_Int32 nIndex = 0; aIter != vFrmList.end(); aIter++, nIndex++ )
985*ca62e2c2SSteve Yin 				{
986*ca62e2c2SSteve Yin 					uno::Reference< XAccessible > xAcc = pAccMap->GetContext(*aIter, sal_False);
987*ca62e2c2SSteve Yin 					if ( xAcc.is() )
988*ca62e2c2SSteve Yin 					{
989*ca62e2c2SSteve Yin 						SwAccessibleContext *pAccImpl = static_cast< SwAccessibleContext *>( xAcc.get() );
990*ca62e2c2SSteve Yin 						if ( pAccImpl && pAccImpl->getAccessibleRole() == AccessibleRole::PARAGRAPH )
991*ca62e2c2SSteve Yin 						{
992*ca62e2c2SSteve Yin 							aRet[nIndex] = uno::makeAny( xAcc );
993*ca62e2c2SSteve Yin 						}
994*ca62e2c2SSteve Yin 					}
995*ca62e2c2SSteve Yin 				}
996*ca62e2c2SSteve Yin 
997*ca62e2c2SSteve Yin 				return aRet;
998*ca62e2c2SSteve Yin 			}
999*ca62e2c2SSteve Yin 		}
1000*ca62e2c2SSteve Yin 	}
1001*ca62e2c2SSteve Yin 
1002*ca62e2c2SSteve Yin Rt:
1003*ca62e2c2SSteve Yin 	uno::Sequence< uno::Any > aEmpty;
1004*ca62e2c2SSteve Yin 	return aEmpty;
1005*ca62e2c2SSteve Yin }
1006