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