xref: /aoo41x/main/sw/source/core/access/acccontext.cxx (revision efeef26f)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_sw.hxx"
26 #if (OSL_DEBUG_LEVEL > 1) && defined TEST_MIB
27 	#ifndef _STRING_HXX
28 	#include <tools/string.hxx>
29 	#endif
30 
31 	#ifndef _STREAM_HXX
32 	#include <tools/stream.hxx>
33 	#endif
34 #endif // #if (OSL_DEBUG_LEVEL > 1) && defined TEST_MIB
35 #include <tools/debug.hxx>
36 #include <vcl/window.hxx>
37 #include <errhdl.hxx>
38 #include <swtypes.hxx>
39 
40 #include <com/sun/star/accessibility/XAccessible.hpp>
41 #include <com/sun/star/accessibility/XAccessibleStateSet.hpp>
42 #include <com/sun/star/accessibility/AccessibleStateType.hpp>
43 #include <com/sun/star/accessibility/AccessibleEventId.hpp>
44 #include <vos/mutex.hxx>
45 #include <vcl/svapp.hxx>
46 #include <unotools/accessiblestatesethelper.hxx>
47 #include <unotools/accessiblerelationsethelper.hxx>
48 #include <viewsh.hxx>
49 #include <crsrsh.hxx>
50 #include <fesh.hxx>
51 #include <txtfrm.hxx>
52 #include <ndtxt.hxx>
53 #include <pagefrm.hxx>
54 #include <flyfrm.hxx>
55 #include <dflyobj.hxx>
56 #include <pam.hxx>
57 #include <viewimp.hxx>
58 #include <accmap.hxx>
59 #include <accfrmobjslist.hxx>
60 #include <acccontext.hxx>
61 #include <svx/AccessibleShape.hxx>
62 #include <comphelper/accessibleeventnotifier.hxx>
63 #include <PostItMgr.hxx>
64 
65 using namespace sw::access;
66 
67 #if (OSL_DEBUG_LEVEL > 1) && defined TEST_MIB
68 #define DBG_MSG( _msg ) \
69 	lcl_SwAccessibleContext_DbgMsg( this, _msg, 0, sal_False );
70 #define DBG_MSG_CD( _msg ) \
71 	lcl_SwAccessibleContext_DbgMsg( this, _msg, 0, sal_True );
72 #define DBG_MSG_PARAM( _msg, _param ) \
73 	lcl_SwAccessibleContext_DbgMsg( this, _msg, _param, sal_False );
74 #define DBG_MSG_THIS_PARAM( _msg, _this, _param ) \
75 	lcl_SwAccessibleContext_DbgMsg( _this, _msg, _param, sal_False );
76 
77 void lcl_SwAccessibleContext_DbgMsg( SwAccessibleContext *pThisAcc,
78 									 const char *pMsg,
79 								     SwAccessibleContext *pChildAcc,
80 								  	 sal_Bool bConstrDestr );
81 #else
82 #define DBG_MSG( _msg )
83 #define DBG_MSG_PARAM( _msg, _param )
84 #define DBG_MSG_THIS_PARAM( _msg, _this, _param )
85 #define DBG_MSG_CD( _msg )
86 #endif
87 
88 using namespace ::com::sun::star;
89 using namespace ::com::sun::star::accessibility;
90 using ::rtl::OUString;
91 
92 void SwAccessibleContext::InitStates()
93 {
94     bIsShowingState = GetMap() ? IsShowing( *(GetMap()) ) : sal_False;
95 
96 	ViewShell *pVSh = GetMap()->GetShell();
97     bIsEditableState = pVSh && IsEditable( pVSh );
98 	bIsOpaqueState = pVSh && IsOpaque( pVSh );
99 	bIsDefuncState = sal_False;
100 }
101 
102 void SwAccessibleContext::SetParent( SwAccessibleContext *pParent )
103 {
104 	vos::OGuard aGuard( aMutex );
105 
106 	uno::Reference < XAccessible > xParent( pParent );
107 	xWeakParent = xParent;
108 }
109 
110 uno::Reference< XAccessible > SwAccessibleContext::GetWeakParent() const
111 {
112 	vos::OGuard aGuard( aMutex );
113 
114 	uno::Reference< XAccessible > xParent( xWeakParent );
115 	return xParent;
116 }
117 
118 Window *SwAccessibleContext::GetWindow()
119 {
120 	Window *pWin = 0;
121 
122 	if( GetMap() )
123 	{
124 		const ViewShell *pVSh = GetMap()->GetShell();
125 		ASSERT( pVSh, "no view shell" );
126 		if( pVSh )
127 			pWin = pVSh->GetWin();
128 
129 		ASSERT( pWin, "no window" );
130 	}
131 
132 	return pWin;
133 }
134 
135 // get ViewShell from accessibility map, and cast to cursor shell
136 SwCrsrShell* SwAccessibleContext::GetCrsrShell()
137 {
138     SwCrsrShell* pCrsrShell;
139     ViewShell* pViewShell = GetMap() ? GetMap()->GetShell() : 0;
140 	ASSERT( pViewShell, "no view shell" );
141     if( pViewShell && pViewShell->ISA( SwCrsrShell ) )
142         pCrsrShell = static_cast<SwCrsrShell*>( pViewShell );
143     else
144         pCrsrShell = NULL;
145 
146     return pCrsrShell;
147 }
148 
149 const SwCrsrShell* SwAccessibleContext::GetCrsrShell() const
150 {
151     // just like non-const GetCrsrShell
152     const SwCrsrShell* pCrsrShell;
153     const ViewShell* pViewShell = GetMap() ? GetMap()->GetShell() : 0;
154 	ASSERT( pViewShell, "no view shell" );
155     if( pViewShell && pViewShell->ISA( SwCrsrShell ) )
156         pCrsrShell = static_cast<const SwCrsrShell*>( pViewShell );
157     else
158         pCrsrShell = NULL;
159 
160     return pCrsrShell;
161 }
162 
163 
164 enum Action { NONE, SCROLLED, SCROLLED_WITHIN,
165 						  SCROLLED_IN, SCROLLED_OUT };
166 
167 void SwAccessibleContext::ChildrenScrolled( const SwFrm *pFrm,
168                                             const SwRect& rOldVisArea )
169 {
170 	const SwRect& rNewVisArea = GetVisArea();
171     const bool bVisibleChildrenOnly = SwAccessibleChild( pFrm ).IsVisibleChildrenOnly();
172 
173     const SwAccessibleChildSList aList( *pFrm, *(GetMap()) );
174     SwAccessibleChildSList::const_iterator aIter( aList.begin() );
175 	while( aIter != aList.end() )
176 	{
177         const SwAccessibleChild& rLower = *aIter;
178         const SwRect aBox( rLower.GetBox( *(GetMap()) ) );
179 		if( rLower.IsAccessible( GetShell()->IsPreView() ) )
180 		{
181 			Action eAction = NONE;
182 			if( aBox.IsOver( rNewVisArea ) )
183 			{
184 				if( aBox.IsOver( rOldVisArea ) )
185 				{
186 					eAction = SCROLLED_WITHIN;
187 				}
188 				else
189 				{
190                     if ( bVisibleChildrenOnly &&
191                          !rLower.AlwaysIncludeAsChild() )
192                     {
193 						eAction = SCROLLED_IN;
194                     }
195 					else
196                     {
197 						eAction = SCROLLED;
198                     }
199 				}
200 			}
201 			else if( aBox.IsOver( rOldVisArea ) )
202 			{
203                 if ( bVisibleChildrenOnly &&
204                      !rLower.AlwaysIncludeAsChild() )
205                 {
206 					eAction = SCROLLED_OUT;
207                 }
208 				else
209                 {
210 					eAction = SCROLLED;
211                 }
212 			}
213             else if( !bVisibleChildrenOnly ||
214                      rLower.AlwaysIncludeAsChild() )
215 			{
216 				// This wouldn't be required if the SwAccessibleFrame,
217 				// wouldn't know about the vis area.
218 				eAction = SCROLLED;
219 			}
220 			if( NONE != eAction )
221 			{
222                 if ( rLower.GetSwFrm() )
223 				{
224                     ASSERT( !rLower.AlwaysIncludeAsChild(),
225                             "<SwAccessibleContext::ChildrenScrolled(..)> - always included child not considered!" );
226                     const SwFrm* pLower( rLower.GetSwFrm() );
227 					::vos::ORef< SwAccessibleContext > xAccImpl =
228 						GetMap()->GetContextImpl( pLower, SCROLLED_OUT == eAction ||
229 												SCROLLED_IN == eAction );
230 					if( xAccImpl.isValid() )
231 					{
232 						switch( eAction )
233 						{
234 						case SCROLLED:
235 							xAccImpl->Scrolled( rOldVisArea );
236 							break;
237 						case SCROLLED_WITHIN:
238 							xAccImpl->ScrolledWithin( rOldVisArea );
239 							break;
240 						case SCROLLED_IN:
241 							xAccImpl->ScrolledIn();
242 							break;
243 						case SCROLLED_OUT:
244 							xAccImpl->ScrolledOut( rOldVisArea );
245 							break;
246 						case NONE:
247 							break;
248 						}
249 					}
250 					else
251 					{
252 						ChildrenScrolled( pLower, rOldVisArea );
253 					}
254 				}
255                 else if ( rLower.GetDrawObject() )
256 				{
257                     ASSERT( !rLower.AlwaysIncludeAsChild(),
258                             "<SwAccessibleContext::ChildrenScrolled(..)> - always included child not considered!" );
259 					::vos::ORef< ::accessibility::AccessibleShape > xAccImpl =
260                         GetMap()->GetContextImpl( rLower.GetDrawObject(),
261 												  this,
262 												  SCROLLED_OUT == eAction ||
263 												  SCROLLED_IN == eAction );
264 					if( xAccImpl.isValid() )
265 					{
266 						switch( eAction )
267 						{
268 						case SCROLLED:
269 						case SCROLLED_WITHIN:
270 							xAccImpl->ViewForwarderChanged(
271 								::accessibility::IAccessibleViewForwarderListener::VISIBLE_AREA,
272 								GetMap() );
273 							break;
274 						case SCROLLED_IN:
275                             ScrolledInShape( rLower.GetDrawObject(),
276 											 xAccImpl.getBodyPtr() );
277 							break;
278 						case SCROLLED_OUT:
279 							{
280 								xAccImpl->ViewForwarderChanged(
281 									::accessibility::IAccessibleViewForwarderListener::VISIBLE_AREA,
282 									GetMap() );
283                                 DisposeShape( rLower.GetDrawObject(),
284 											  xAccImpl.getBodyPtr() );
285 							}
286 							break;
287 						case NONE:
288 							break;
289 						}
290 					}
291 				}
292                 else if ( rLower.GetWindow() )
293                 {
294                     // nothing to do - as such children are always included as children.
295                     ASSERT( rLower.AlwaysIncludeAsChild(),
296                             "<SwAccessibleContext::ChildrenScrolled(..)> - not always included child not considered!" );
297                 }
298 			}
299 		}
300         else if ( rLower.GetSwFrm() &&
301                   ( !bVisibleChildrenOnly ||
302                     aBox.IsOver( rOldVisArea ) ||
303                     aBox.IsOver( rNewVisArea ) ) )
304 		{
305 			// There are no unaccessible SdrObjects that need to be notified
306             ChildrenScrolled( rLower.GetSwFrm(), rOldVisArea );
307 		}
308 		++aIter;
309 	}
310 }
311 
312 void SwAccessibleContext::Scrolled( const SwRect& rOldVisArea )
313 {
314 	SetVisArea( GetMap()->GetVisArea() );
315 
316 	ChildrenScrolled( GetFrm(), rOldVisArea );
317 
318 	sal_Bool bIsOldShowingState;
319     sal_Bool bIsNewShowingState = IsShowing( *(GetMap()) );
320 	{
321 		vos::OGuard aGuard( aMutex );
322 		bIsOldShowingState = bIsShowingState;
323 		bIsShowingState = bIsNewShowingState;
324 	}
325 
326 	if( bIsOldShowingState != bIsNewShowingState )
327 		FireStateChangedEvent( AccessibleStateType::SHOWING,
328 							   bIsNewShowingState  );
329 }
330 
331 void SwAccessibleContext::ScrolledWithin( const SwRect& rOldVisArea )
332 {
333 	SetVisArea( GetMap()->GetVisArea() );
334 
335 	ChildrenScrolled( GetFrm(), rOldVisArea );
336 
337 	FireVisibleDataEvent();
338 }
339 
340 void SwAccessibleContext::ScrolledIn()
341 {
342 	// This accessible should be freshly created, because it
343 	// was not visisble before. Therefor, its vis area must already
344 	// reflect the scrolling.
345 	ASSERT( GetVisArea() == GetMap()->GetVisArea(),
346 			"Vis area of child is wrong. Did it exist already?" );
347 
348 	// Send child event at parent. That's all we have to do here.
349     const SwFrm* pParent = GetParent();
350 	::vos::ORef< SwAccessibleContext > xParentImpl(
351 		 GetMap()->GetContextImpl( pParent, sal_False ) );
352 	uno::Reference < XAccessibleContext > xThis( this );
353 	if( xParentImpl.isValid() )
354 	{
355 		SetParent( xParentImpl.getBodyPtr() );
356 
357 		AccessibleEventObject aEvent;
358 		aEvent.EventId = AccessibleEventId::CHILD;
359 		aEvent.NewValue <<= xThis;
360 
361 		xParentImpl->FireAccessibleEvent( aEvent );
362 		DBG_MSG_PARAM( "AccessibleChild (added)", xChildImpl.getBodyPtr() );
363 
364 		if( HasCursor() )
365 		{
366 			Window *pWin = GetWindow();
367 			if( pWin && pWin->HasFocus() )
368 			{
369 				FireStateChangedEvent( AccessibleStateType::FOCUSED, sal_True );
370 			}
371 		}
372 
373 	}
374 }
375 
376 void SwAccessibleContext::ScrolledOut( const SwRect& rOldVisArea )
377 {
378 	SetVisArea( GetMap()->GetVisArea() );
379 
380 	// First of all, update the children. That's required to dispose
381 	// all children that are existing only if they are visible. They
382 	// are not disposed by the recusive Dispose call that follows later on,
383 	// because this call will only dispose children that are in the
384 	// new vis area. The children we want to dispode however are in the
385 	// old vis area all.
386 	ChildrenScrolled( GetFrm(), rOldVisArea );
387 
388 	// Broadcast a state changed event for the showing state.
389 	// It might be that the child is freshly created just to send
390 	// the child event. In this case no listener will exist.
391 	FireStateChangedEvent( AccessibleStateType::SHOWING, sal_False );
392 
393 	// We now dispose the frame
394 	Dispose( sal_True );
395 }
396 
397 // --> OD 2005-12-12 #i27301# - use new type definition for <_nStates>
398 void SwAccessibleContext::InvalidateChildrenStates( const SwFrm* _pFrm,
399                                                     tAccessibleStates _nStates )
400 {
401     const SwAccessibleChildSList aVisList( GetVisArea(), *_pFrm, *(GetMap()) );
402 
403     SwAccessibleChildSList::const_iterator aIter( aVisList.begin() );
404 	while( aIter != aVisList.end() )
405 	{
406         const SwAccessibleChild& rLower = *aIter;
407         const SwFrm* pLower = rLower.GetSwFrm();
408 		if( pLower )
409 		{
410 			::vos::ORef< SwAccessibleContext > xAccImpl;
411 			if( rLower.IsAccessible( GetShell()->IsPreView() ) )
412 				xAccImpl = GetMap()->GetContextImpl( pLower, sal_False );
413 			if( xAccImpl.isValid() )
414                 xAccImpl->InvalidateStates( _nStates );
415 			else
416                 InvalidateChildrenStates( pLower, _nStates );
417 		}
418         else if ( rLower.GetDrawObject() )
419 		{
420 			// TODO: SdrObjects
421 		}
422         else if ( rLower.GetWindow() )
423         {
424             // nothing to do ?
425         }
426 
427 		++aIter;
428 	}
429 }
430 // <--
431 
432 void SwAccessibleContext::DisposeChildren( const SwFrm *pFrm,
433 									   sal_Bool bRecursive )
434 {
435     const SwAccessibleChildSList aVisList( GetVisArea(), *pFrm, *(GetMap()) );
436     SwAccessibleChildSList::const_iterator aIter( aVisList.begin() );
437 	while( aIter != aVisList.end() )
438 	{
439         const SwAccessibleChild& rLower = *aIter;
440         const SwFrm* pLower = rLower.GetSwFrm();
441 		if( pLower )
442 		{
443 			::vos::ORef< SwAccessibleContext > xAccImpl;
444 			if( rLower.IsAccessible( GetShell()->IsPreView() ) )
445 				xAccImpl = GetMap()->GetContextImpl( pLower, sal_False );
446 			if( xAccImpl.isValid() )
447 				xAccImpl->Dispose( bRecursive );
448 			else if( bRecursive )
449 				DisposeChildren( pLower, bRecursive );
450 		}
451         else if ( rLower.GetDrawObject() )
452 		{
453 			::vos::ORef< ::accessibility::AccessibleShape > xAccImpl(
454                     GetMap()->GetContextImpl( rLower.GetDrawObject(),
455 										  this, sal_False )  );
456 			if( xAccImpl.isValid() )
457                 DisposeShape( rLower.GetDrawObject(), xAccImpl.getBodyPtr() );
458 		}
459         else if ( rLower.GetWindow() )
460         {
461             DisposeChild( rLower, sal_False );
462         }
463 		++aIter;
464 	}
465 }
466 
467 void SwAccessibleContext::_InvalidateContent( sal_Bool )
468 {
469 }
470 
471 void SwAccessibleContext::_InvalidateCursorPos()
472 {
473 }
474 
475 void SwAccessibleContext::_InvalidateFocus()
476 {
477 }
478 
479 void SwAccessibleContext::FireAccessibleEvent( AccessibleEventObject& rEvent )
480 {
481 	ASSERT( GetFrm(), "fire event for diposed frame?" );
482 	if( !GetFrm() )
483 		return;
484 
485 	if( !rEvent.Source.is() )
486 	{
487 		uno::Reference < XAccessibleContext > xThis( this );
488 		rEvent.Source = xThis;
489 	}
490 
491 	if (nClientId)
492 		comphelper::AccessibleEventNotifier::addEvent( nClientId, rEvent );
493 }
494 
495 void SwAccessibleContext::FireVisibleDataEvent()
496 {
497 	AccessibleEventObject aEvent;
498 	aEvent.EventId = AccessibleEventId::VISIBLE_DATA_CHANGED;
499 
500 	FireAccessibleEvent( aEvent );
501 	DBG_MSG( "AccessibleVisibleData" )
502 }
503 
504 void SwAccessibleContext::FireStateChangedEvent( sal_Int16 nState,
505 												 sal_Bool bNewState )
506 {
507 	AccessibleEventObject aEvent;
508 
509 	aEvent.EventId = AccessibleEventId::STATE_CHANGED;
510 	if( bNewState )
511 		aEvent.NewValue <<= nState;
512 	else
513 		aEvent.OldValue <<= nState;
514 
515 	FireAccessibleEvent( aEvent );
516 	DBG_MSG( "StateChanged" )
517 }
518 
519 void SwAccessibleContext::GetStates(
520 		::utl::AccessibleStateSetHelper& rStateSet )
521 {
522 	vos::OGuard aGuard(Application::GetSolarMutex());
523 
524 	// SHOWING
525 	if( bIsShowingState )
526 		rStateSet.AddState( AccessibleStateType::SHOWING );
527 
528 	// EDITABLE
529 	if( bIsEditableState )
530 		rStateSet.AddState( AccessibleStateType::EDITABLE );
531 
532 	// ENABLED
533 	rStateSet.AddState( AccessibleStateType::ENABLED );
534 
535 	// OPAQUE
536 	if( bIsOpaqueState )
537 		rStateSet.AddState( AccessibleStateType::OPAQUE );
538 
539 	// VISIBLE
540 	rStateSet.AddState( AccessibleStateType::VISIBLE );
541 
542 	if( bIsDefuncState )
543 		rStateSet.AddState( AccessibleStateType::DEFUNC );
544 }
545 
546 sal_Bool SwAccessibleContext::IsEditableState()
547 {
548 	sal_Bool bRet;
549 	{
550 		vos::OGuard aGuard( aMutex );
551 		bRet = bIsEditableState;
552 	}
553 
554 	return bRet;
555 }
556 
557 SwAccessibleContext::SwAccessibleContext( SwAccessibleMap *pM,
558 										  sal_Int16 nR,
559                                           const SwFrm *pF )
560     : SwAccessibleFrame( pM->GetVisArea().SVRect(), pF,
561                          pM->GetShell()->IsPreView() )
562     , pMap( pM )
563     , nClientId(0)
564     , nRole( nR )
565     , bDisposing( sal_False )
566     , bRegisteredAtAccessibleMap( true )
567 {
568 	InitStates();
569 	DBG_MSG_CD( "constructed" )
570 }
571 
572 SwAccessibleContext::~SwAccessibleContext()
573 {
574 	vos::OGuard aGuard(Application::GetSolarMutex());
575 
576 	DBG_MSG_CD( "destructed" )
577     RemoveFrmFromAccessibleMap();
578 }
579 
580 uno::Reference< XAccessibleContext > SAL_CALL
581 	SwAccessibleContext::getAccessibleContext( void )
582         throw (uno::RuntimeException)
583 {
584 	uno::Reference < XAccessibleContext > xRet( this );
585 	return xRet;
586 }
587 
588 sal_Int32 SAL_CALL SwAccessibleContext::getAccessibleChildCount( void )
589         throw (uno::RuntimeException)
590 {
591 	vos::OGuard aGuard(Application::GetSolarMutex());
592 
593 	CHECK_FOR_DEFUNC( XAccessibleContext )
594 
595     return bDisposing ? 0 : GetChildCount( *(GetMap()) );
596 }
597 
598 uno::Reference< XAccessible> SAL_CALL
599 	SwAccessibleContext::getAccessibleChild( sal_Int32 nIndex )
600         throw (uno::RuntimeException, lang::IndexOutOfBoundsException)
601 {
602 	vos::OGuard aGuard(Application::GetSolarMutex());
603 
604 	CHECK_FOR_DEFUNC( XAccessibleContext )
605 
606     const SwAccessibleChild aChild( GetChild( *(GetMap()), nIndex ) );
607 	if( !aChild.IsValid() )
608 	{
609 		uno::Reference < XAccessibleContext > xThis( this );
610 		lang::IndexOutOfBoundsException aExcept(
611 				OUString( RTL_CONSTASCII_USTRINGPARAM("index out of bounds") ),
612 				xThis );
613 		throw aExcept;
614 	}
615 
616 	uno::Reference< XAccessible > xChild;
617 	if( aChild.GetSwFrm() )
618 	{
619 		::vos::ORef < SwAccessibleContext > xChildImpl(
620 				GetMap()->GetContextImpl( aChild.GetSwFrm(), !bDisposing )  );
621 		if( xChildImpl.isValid() )
622 		{
623 			xChildImpl->SetParent( this );
624 			xChild = xChildImpl.getBodyPtr();
625 		}
626 	}
627     else if ( aChild.GetDrawObject() )
628 	{
629 		::vos::ORef < ::accessibility::AccessibleShape > xChildImpl(
630                 GetMap()->GetContextImpl( aChild.GetDrawObject(),
631 										  this, !bDisposing )  );
632 		if( xChildImpl.isValid() )
633 			xChild = xChildImpl.getBodyPtr();
634 	}
635     else if ( aChild.GetWindow() )
636     {
637         xChild = aChild.GetWindow()->GetAccessible();
638     }
639 
640 	return xChild;
641 }
642 
643 uno::Reference< XAccessible> SAL_CALL SwAccessibleContext::getAccessibleParent (void)
644         throw (uno::RuntimeException)
645 {
646 	vos::OGuard aGuard(Application::GetSolarMutex());
647 
648 	CHECK_FOR_DEFUNC( XAccessibleContext )
649 
650 	const SwFrm *pUpper = GetParent();
651 	ASSERT( pUpper != 0 || bDisposing, "no upper found" );
652 
653 	uno::Reference< XAccessible > xAcc;
654 	if( pUpper )
655 		xAcc = GetMap()->GetContext( pUpper, !bDisposing );
656 
657 	ASSERT( xAcc.is() || bDisposing, "no parent found" );
658 
659 	// Remember the parent as weak ref.
660 	{
661         vos::OGuard aWeakParentGuard( aMutex );
662 		xWeakParent = xAcc;
663 	}
664 
665 	return xAcc;
666 }
667 
668 sal_Int32 SAL_CALL SwAccessibleContext::getAccessibleIndexInParent (void)
669         throw (uno::RuntimeException)
670 {
671 	vos::OGuard aGuard(Application::GetSolarMutex());
672 
673 	CHECK_FOR_DEFUNC( XAccessibleContext )
674 
675 	const SwFrm *pUpper = GetParent();
676 	ASSERT( pUpper != 0 || bDisposing, "no upper found" );
677 
678 	sal_Int32 nIndex = -1;
679 	if( pUpper )
680 	{
681 		::vos::ORef < SwAccessibleContext > xAccImpl(
682 			GetMap()->GetContextImpl( pUpper, !bDisposing )  );
683 		ASSERT( xAccImpl.isValid() || bDisposing, "no parent found" );
684 		if( xAccImpl.isValid() )
685             nIndex = xAccImpl->GetChildIndex( *(GetMap()), SwAccessibleChild(GetFrm()) );
686 	}
687 
688 	return nIndex;
689 }
690 
691 sal_Int16 SAL_CALL SwAccessibleContext::getAccessibleRole (void)
692         throw (uno::RuntimeException)
693 {
694 	return nRole;
695 }
696 
697 OUString SAL_CALL SwAccessibleContext::getAccessibleDescription (void)
698         throw (uno::RuntimeException)
699 {
700 	ASSERT( !this, "description needs to be overloaded" );
701 	THROW_RUNTIME_EXCEPTION( XAccessibleContext, "internal error (method must be overloaded)" );
702 }
703 
704 OUString SAL_CALL SwAccessibleContext::getAccessibleName (void)
705         throw (uno::RuntimeException)
706 {
707 	return sName;
708 }
709 
710 uno::Reference< XAccessibleRelationSet> SAL_CALL
711 	SwAccessibleContext::getAccessibleRelationSet (void)
712         throw (uno::RuntimeException)
713 {
714 	// by default there are no relations
715 	uno::Reference< XAccessibleRelationSet> xRet( new utl::AccessibleRelationSetHelper() );
716 	return xRet;
717 }
718 
719 uno::Reference<XAccessibleStateSet> SAL_CALL
720 	SwAccessibleContext::getAccessibleStateSet (void)
721         throw (uno::RuntimeException)
722 {
723 	vos::OGuard aGuard(Application::GetSolarMutex());
724 
725 	CHECK_FOR_DEFUNC( XAccessibleContext )
726 
727 	::utl::AccessibleStateSetHelper *pStateSet =
728 		new ::utl::AccessibleStateSetHelper;
729 
730 	uno::Reference<XAccessibleStateSet> xStateSet( pStateSet );
731 	GetStates( *pStateSet );
732 
733 	return xStateSet;
734 }
735 
736 lang::Locale SAL_CALL SwAccessibleContext::getLocale (void)
737 		throw (IllegalAccessibleComponentStateException, uno::RuntimeException)
738 {
739 	vos::OGuard aGuard(Application::GetSolarMutex());
740 
741 	lang::Locale aLoc( Application::GetSettings().GetLocale() );
742 	return aLoc;
743 }
744 
745 void SAL_CALL SwAccessibleContext::addEventListener(
746 			const uno::Reference< XAccessibleEventListener >& xListener )
747 		throw (uno::RuntimeException)
748 {
749 	DBG_MSG( "accessible event listener added" )
750 
751 	if (xListener.is())
752     {
753     	vos::OGuard aGuard(Application::GetSolarMutex());
754 		if (!nClientId)
755             nClientId = comphelper::AccessibleEventNotifier::registerClient( );
756 		comphelper::AccessibleEventNotifier::addEventListener( nClientId, xListener );
757     }
758 }
759 
760 void SAL_CALL SwAccessibleContext::removeEventListener(
761 			const uno::Reference< XAccessibleEventListener >& xListener )
762 		throw (uno::RuntimeException)
763 {
764 	DBG_MSG( "accessible event listener removed" )
765 
766 	if (xListener.is())
767 	{
768     	vos::OGuard aGuard(Application::GetSolarMutex());
769 		sal_Int32 nListenerCount = comphelper::AccessibleEventNotifier::removeEventListener( nClientId, xListener );
770 		if ( !nListenerCount )
771 		{
772 			// no listeners anymore
773 			// -> revoke ourself. This may lead to the notifier thread dying (if we were the last client),
774 			// and at least to us not firing any events anymore, in case somebody calls
775 			// NotifyAccessibleEvent, again
776 			comphelper::AccessibleEventNotifier::revokeClient( nClientId );
777 			nClientId = 0;
778 		}
779 	}
780 }
781 
782 static sal_Bool lcl_PointInRectangle(const awt::Point & aPoint,
783                                      const awt::Rectangle & aRect)
784 {
785     long nDiffX = aPoint.X - aRect.X;
786     long nDiffY = aPoint.Y - aRect.Y;
787 
788     return
789         nDiffX >= 0 && nDiffX < aRect.Width && nDiffY >= 0 &&
790         nDiffY < aRect.Height;
791 
792 }
793 
794 sal_Bool SAL_CALL SwAccessibleContext::containsPoint(
795 			const awt::Point& aPoint )
796 		throw (uno::RuntimeException)
797 {
798     awt::Rectangle aPixBounds = getBoundsImpl(sal_True);
799     aPixBounds.X = 0;
800     aPixBounds.Y = 0;
801 
802     return lcl_PointInRectangle(aPoint, aPixBounds);
803 }
804 
805 uno::Reference< XAccessible > SAL_CALL SwAccessibleContext::getAccessibleAtPoint(
806 				const awt::Point& aPoint )
807 		throw (uno::RuntimeException)
808 {
809 	vos::OGuard aGuard(Application::GetSolarMutex());
810 
811 	CHECK_FOR_DEFUNC( XAccessibleComponent )
812 
813 	uno::Reference< XAccessible > xAcc;
814 
815 	Window *pWin = GetWindow();
816 	CHECK_FOR_WINDOW( XAccessibleComponent, pWin )
817 
818 	Point aPixPoint( aPoint.X, aPoint.Y ); // px rel to parent
819 	if( !GetFrm()->IsRootFrm() )
820 	{
821         SwRect aLogBounds( GetBounds( *(GetMap()), GetFrm() ) ); // twip rel to doc root
822 		Point aPixPos( GetMap()->CoreToPixel( aLogBounds.SVRect() ).TopLeft() );
823 		aPixPoint.X() += aPixPos.X();
824 		aPixPoint.Y() += aPixPos.Y();
825 	}
826 
827     const SwAccessibleChild aChild( GetChildAtPixel( aPixPoint, *(GetMap()) ) );
828 	if( aChild.GetSwFrm() )
829 	{
830 		xAcc = GetMap()->GetContext( aChild.GetSwFrm() );
831 	}
832     else if( aChild.GetDrawObject() )
833 	{
834         xAcc = GetMap()->GetContext( aChild.GetDrawObject(), this );
835 	}
836     else if ( aChild.GetWindow() )
837     {
838         xAcc = aChild.GetWindow()->GetAccessible();
839     }
840 
841 	return xAcc;
842 }
843 
844 
845 /**
846    Get bounding box.
847 
848    There are two modes.
849 
850    - realative
851 
852      Return bounding box relative to parent if parent is no root
853      frame. Otherwise return the absolute bounding box.
854 
855    - absolute
856 
857      Return the absolute bounding box.
858 
859    @param bRelative
860    true: Use relative mode.
861    false: Use absolute mode.
862 */
863 awt::Rectangle SAL_CALL SwAccessibleContext::getBoundsImpl(sal_Bool bRelative)
864 		throw (uno::RuntimeException)
865 {
866 	vos::OGuard aGuard(Application::GetSolarMutex());
867 
868 	CHECK_FOR_DEFUNC( XAccessibleComponent )
869 
870 	const SwFrm *pParent = GetParent();
871 	ASSERT( pParent, "no Parent found" );
872 	Window *pWin = GetWindow();
873 
874 	CHECK_FOR_WINDOW( XAccessibleComponent, pWin && pParent )
875 
876     SwRect aLogBounds( GetBounds( *(GetMap()), GetFrm() ) ); // twip rel to doc root
877 	Rectangle aPixBounds( 0, 0, 0, 0 );
878 	if( GetFrm()->IsPageFrm() &&
879 		static_cast < const SwPageFrm * >( GetFrm() )->IsEmptyPage() )
880 	{
881 		ASSERT( GetShell()->IsPreView(), "empty page accessible?" );
882 		if( GetShell()->IsPreView() )
883         {
884             // OD 15.01.2003 #103492# - adjust method call <GetMap()->GetPreViewPageSize()>
885             sal_uInt16 nPageNum =
886                 static_cast < const SwPageFrm * >( GetFrm() )->GetPhyPageNum();
887             aLogBounds.SSize( GetMap()->GetPreViewPageSize( nPageNum ) );
888         }
889 	}
890 	if( !aLogBounds.IsEmpty() )
891 	{
892 		aPixBounds = GetMap()->CoreToPixel( aLogBounds.SVRect() );
893 		if( !pParent->IsRootFrm() && bRelative)
894 		{
895             SwRect aParentLogBounds( GetBounds( *(GetMap()), pParent ) ); // twip rel to doc root
896 			Point aParentPixPos( GetMap()->CoreToPixel( aParentLogBounds.SVRect() ).TopLeft() );
897 			aPixBounds.Move( -aParentPixPos.X(), -aParentPixPos.Y() );
898 		}
899 	}
900 
901 	awt::Rectangle aBox( aPixBounds.Left(), aPixBounds.Top(),
902 						 aPixBounds.GetWidth(), aPixBounds.GetHeight() );
903 
904 	return aBox;
905 }
906 
907 
908 awt::Rectangle SAL_CALL SwAccessibleContext::getBounds()
909 		throw (uno::RuntimeException)
910 {
911     return getBoundsImpl(sal_True);
912 }
913 
914 awt::Point SAL_CALL SwAccessibleContext::getLocation()
915     throw (uno::RuntimeException)
916 {
917     awt::Rectangle aRect = getBoundsImpl(sal_True);
918     awt::Point aPoint(aRect.X, aRect.Y);
919 
920     return aPoint;
921 }
922 
923 
924 
925 awt::Point SAL_CALL SwAccessibleContext::getLocationOnScreen()
926 		throw (uno::RuntimeException)
927 {
928     awt::Rectangle aRect = getBoundsImpl(sal_False);
929 
930     Point aPixPos(aRect.X, aRect.Y);
931 
932     /* getBoundsImpl already checked that GetWindow returns valid pointer. */
933     aPixPos = GetWindow()->OutputToAbsoluteScreenPixel(aPixPos);
934     awt::Point aPoint(aPixPos.X(), aPixPos.Y());
935 
936     return aPoint;
937 }
938 
939 
940 awt::Size SAL_CALL SwAccessibleContext::getSize()
941 		throw (uno::RuntimeException)
942 {
943     awt::Rectangle aRect = getBoundsImpl(sal_False);
944 	awt::Size aSize( aRect.Width, aRect.Height );
945 
946 	return aSize;
947 }
948 
949 void SAL_CALL SwAccessibleContext::grabFocus()
950 		throw (uno::RuntimeException)
951 {
952 	vos::OGuard aGuard(Application::GetSolarMutex());
953 
954 	CHECK_FOR_DEFUNC( XAccessibleContext );
955 
956 	if( GetFrm()->IsFlyFrm() )
957 	{
958 		const SdrObject *pObj =
959 			static_cast < const SwFlyFrm * >( GetFrm() )->GetVirtDrawObj();
960 		if( pObj )
961 			Select( const_cast < SdrObject * >( pObj ), sal_False );
962 	}
963 	else
964 	{
965 		const SwCntntFrm *pCFrm = 0;
966 		if( GetFrm()->IsCntntFrm() )
967 			pCFrm = static_cast< const SwCntntFrm * >( GetFrm() );
968 		else if( GetFrm()->IsLayoutFrm() )
969 			pCFrm = static_cast< const SwLayoutFrm * >( GetFrm() )->ContainsCntnt();
970 
971 		if( pCFrm && pCFrm->IsTxtFrm() )
972 		{
973 			const SwTxtFrm *pTxtFrm = static_cast< const SwTxtFrm * >( pCFrm );
974 			const SwTxtNode *pTxtNd = pTxtFrm->GetTxtNode();
975 			if( pTxtNd )
976 			{
977 				// create pam for selection
978 				SwIndex aIndex( const_cast< SwTxtNode * >( pTxtNd ),
979 								pTxtFrm->GetOfst() );
980 				SwPosition aStartPos( *pTxtNd, aIndex );
981 				SwPaM aPaM( aStartPos );
982 
983 				// set PaM at cursor shell
984 				Select( aPaM );
985 			}
986 		}
987 	}
988 }
989 
990 
991 uno::Any SAL_CALL SwAccessibleContext::getAccessibleKeyBinding()
992 		throw (uno::RuntimeException)
993 {
994 	// There are no key bindings
995 	return uno::Any();
996 }
997 
998 sal_Int32 SAL_CALL SwAccessibleContext::getForeground()
999 		throw (uno::RuntimeException)
1000 {
1001 	return 0;
1002 }
1003 
1004 sal_Int32 SAL_CALL SwAccessibleContext::getBackground()
1005 		throw (uno::RuntimeException)
1006 {
1007 	return 0xffffff;
1008 }
1009 
1010 
1011 OUString SAL_CALL SwAccessibleContext::getImplementationName()
1012         throw( uno::RuntimeException )
1013 {
1014 	ASSERT( !this, "implementation name needs to be overloaded" );
1015 
1016 	THROW_RUNTIME_EXCEPTION( lang::XServiceInfo, "implementation name needs to be overloaded" )
1017 }
1018 
1019 sal_Bool SAL_CALL
1020     SwAccessibleContext::supportsService (const ::rtl::OUString& )
1021         throw (uno::RuntimeException)
1022 {
1023 	ASSERT( !this, "supports service needs to be overloaded" );
1024 	THROW_RUNTIME_EXCEPTION( lang::XServiceInfo, "supports service needs to be overloaded" )
1025 }
1026 
1027 uno::Sequence< OUString > SAL_CALL SwAccessibleContext::getSupportedServiceNames()
1028 		throw( uno::RuntimeException )
1029 {
1030 	ASSERT( !this, "supported services names needs to be overloaded" );
1031 	THROW_RUNTIME_EXCEPTION( lang::XServiceInfo, "supported services needs to be overloaded" )
1032 }
1033 
1034 void SwAccessibleContext::DisposeShape( const SdrObject *pObj,
1035 								::accessibility::AccessibleShape *pAccImpl )
1036 {
1037 	::vos::ORef< ::accessibility::AccessibleShape > xAccImpl( pAccImpl );
1038 	if( !xAccImpl.isValid() )
1039 		xAccImpl = GetMap()->GetContextImpl( pObj, this, sal_True );
1040 
1041 	AccessibleEventObject aEvent;
1042 	aEvent.EventId = AccessibleEventId::CHILD;
1043 	uno::Reference< XAccessible > xAcc( xAccImpl.getBodyPtr() );
1044 	aEvent.OldValue <<= xAcc;
1045 	FireAccessibleEvent( aEvent );
1046 
1047 	GetMap()->RemoveContext( pObj );
1048 	xAccImpl->dispose();
1049 }
1050 
1051 void SwAccessibleContext::ScrolledInShape( const SdrObject* ,
1052 								::accessibility::AccessibleShape *pAccImpl )
1053 {
1054 	AccessibleEventObject aEvent;
1055 	aEvent.EventId = AccessibleEventId::CHILD;
1056 	uno::Reference< XAccessible > xAcc( pAccImpl );
1057 	aEvent.NewValue <<= xAcc;
1058 	FireAccessibleEvent( aEvent );
1059 
1060 	if( pAccImpl->GetState( AccessibleStateType::FOCUSED ) )
1061 	{
1062 		Window *pWin = GetWindow();
1063 		if( pWin && pWin->HasFocus() )
1064 		{
1065             AccessibleEventObject aStateChangedEvent;
1066             aStateChangedEvent.EventId = AccessibleEventId::STATE_CHANGED;
1067             aStateChangedEvent.NewValue <<= AccessibleStateType::FOCUSED;
1068             aStateChangedEvent.Source = xAcc;
1069 
1070             FireAccessibleEvent( aStateChangedEvent );
1071 		}
1072 	}
1073 }
1074 
1075 void SwAccessibleContext::Dispose( sal_Bool bRecursive )
1076 {
1077 	vos::OGuard aGuard(Application::GetSolarMutex());
1078 
1079 	ASSERT( GetFrm() && GetMap(), "already disposed" );
1080 	ASSERT( GetMap()->GetVisArea() == GetVisArea(),
1081 				"invalid vis area for dispose" );
1082 
1083 	bDisposing = sal_True;
1084 
1085 	// dispose children
1086 	if( bRecursive )
1087 		DisposeChildren( GetFrm(), bRecursive );
1088 
1089 	// get parent
1090 	uno::Reference< XAccessible > xParent( GetWeakParent() );
1091 	uno::Reference < XAccessibleContext > xThis( this );
1092 
1093 	// send child event at parent
1094 	if( xParent.is() )
1095 	{
1096 		SwAccessibleContext *pAcc = (SwAccessibleContext *)xParent.get();
1097 
1098 		AccessibleEventObject aEvent;
1099 		aEvent.EventId = AccessibleEventId::CHILD;
1100 		aEvent.OldValue <<= xThis;
1101 		pAcc->FireAccessibleEvent( aEvent );
1102 		DBG_MSG_THIS_PARAM( "AccessibleChild (removed)", pAcc, this )
1103 	}
1104 
1105 	// set defunc state (its not required to broadcast a state changed
1106 	// event if the object is diposed afterwards)
1107 	{
1108         vos::OGuard aDefuncStateGuard( aMutex );
1109 		bIsDefuncState = sal_True;
1110 	}
1111 
1112 	// broadcast dispose event
1113 	if ( nClientId )
1114 	{
1115         comphelper::AccessibleEventNotifier::revokeClientNotifyDisposing( nClientId, *this );
1116 		nClientId =  0;
1117 		DBG_MSG_CD( "dispose" )
1118 	}
1119 
1120     RemoveFrmFromAccessibleMap();
1121 	ClearFrm();
1122 	pMap = 0;
1123 
1124 	bDisposing = sal_False;
1125 }
1126 
1127 void SwAccessibleContext::DisposeChild( const SwAccessibleChild& rChildFrmOrObj,
1128 										sal_Bool bRecursive )
1129 {
1130 	vos::OGuard aGuard(Application::GetSolarMutex());
1131 
1132     if ( IsShowing( *(GetMap()), rChildFrmOrObj ) ||
1133          rChildFrmOrObj.AlwaysIncludeAsChild() ||
1134          !SwAccessibleChild( GetFrm() ).IsVisibleChildrenOnly() )
1135 	{
1136 		// If the object could have existed before, than there is nothing to do,
1137 		// because no wrapper exists now and therefor no one is interested to
1138 		// get notified of the movement.
1139 		if( rChildFrmOrObj.GetSwFrm() )
1140 		{
1141 			::vos::ORef< SwAccessibleContext > xAccImpl =
1142 					GetMap()->GetContextImpl( rChildFrmOrObj.GetSwFrm(),
1143 											  sal_True );
1144 			xAccImpl->Dispose( bRecursive );
1145 		}
1146         else if ( rChildFrmOrObj.GetDrawObject() )
1147 		{
1148 			::vos::ORef< ::accessibility::AccessibleShape > xAccImpl =
1149                     GetMap()->GetContextImpl( rChildFrmOrObj.GetDrawObject(),
1150 											  this, sal_True );
1151             DisposeShape( rChildFrmOrObj.GetDrawObject(),
1152 						  xAccImpl.getBodyPtr() );
1153 		}
1154         else if ( rChildFrmOrObj.GetWindow() )
1155         {
1156             AccessibleEventObject aEvent;
1157             aEvent.EventId = AccessibleEventId::CHILD;
1158             uno::Reference< XAccessible > xAcc =
1159                                     rChildFrmOrObj.GetWindow()->GetAccessible();
1160             aEvent.OldValue <<= xAcc;
1161             FireAccessibleEvent( aEvent );
1162         }
1163 	}
1164 	else if( bRecursive && rChildFrmOrObj.GetSwFrm() )
1165 		DisposeChildren( rChildFrmOrObj.GetSwFrm(), bRecursive );
1166 }
1167 
1168 void SwAccessibleContext::InvalidatePosOrSize( const SwRect& )
1169 {
1170 	vos::OGuard aGuard(Application::GetSolarMutex());
1171 
1172 	ASSERT( GetFrm() && !GetFrm()->Frm().IsEmpty(), "context should have a size" );
1173 
1174 	sal_Bool bIsOldShowingState;
1175     sal_Bool bIsNewShowingState = IsShowing( *(GetMap()) );
1176 	{
1177         vos::OGuard aShowingStateGuard( aMutex );
1178 		bIsOldShowingState = bIsShowingState;
1179 		bIsShowingState = bIsNewShowingState;
1180 	}
1181 
1182 	if( bIsOldShowingState != bIsNewShowingState )
1183 	{
1184 		FireStateChangedEvent( AccessibleStateType::SHOWING,
1185 							   bIsNewShowingState  );
1186 	}
1187 	else if( bIsNewShowingState )
1188 	{
1189 		// The frame stays visible -> broadcast event
1190 		FireVisibleDataEvent();
1191 	}
1192 
1193     if( !bIsNewShowingState &&
1194         SwAccessibleChild( GetParent() ).IsVisibleChildrenOnly() )
1195 	{
1196 		// The frame is now invisible -> dispose it
1197 		Dispose( sal_True );
1198 	}
1199 	else
1200 	{
1201 		_InvalidateContent( sal_True );
1202 	}
1203 }
1204 
1205 void SwAccessibleContext::InvalidateChildPosOrSize(
1206                     const SwAccessibleChild& rChildFrmOrObj,
1207 					const SwRect& rOldFrm )
1208 {
1209 	vos::OGuard aGuard(Application::GetSolarMutex());
1210 
1211 	ASSERT( !rChildFrmOrObj.GetSwFrm() ||
1212 			!rChildFrmOrObj.GetSwFrm()->Frm().IsEmpty(),
1213 			"child context should have a size" );
1214 
1215     if ( rChildFrmOrObj.AlwaysIncludeAsChild() )
1216     {
1217         // nothing to do;
1218         return;
1219     }
1220 
1221     const bool bVisibleChildrenOnly = SwAccessibleChild( GetFrm() ).IsVisibleChildrenOnly();
1222     const bool bNew = rOldFrm.IsEmpty() ||
1223                      ( rOldFrm.Left() == 0 && rOldFrm.Top() == 0 );
1224     if( IsShowing( *(GetMap()), rChildFrmOrObj ) )
1225 	{
1226 		// If the object could have existed before, than there is nothing to do,
1227 		// because no wrapper exists now and therefor no one is interested to
1228 		// get notified of the movement.
1229         if( bNew || (bVisibleChildrenOnly && !IsShowing( rOldFrm )) )
1230 		{
1231 			if( rChildFrmOrObj.GetSwFrm() )
1232 			{
1233 				// The frame becomes visible. A child event must be send.
1234 				::vos::ORef< SwAccessibleContext > xAccImpl =
1235 					GetMap()->GetContextImpl( rChildFrmOrObj.GetSwFrm(),
1236 											  sal_True );
1237 				xAccImpl->ScrolledIn();
1238 			}
1239             else if ( rChildFrmOrObj.GetDrawObject() )
1240 			{
1241 				::vos::ORef< ::accessibility::AccessibleShape > xAccImpl =
1242                         GetMap()->GetContextImpl( rChildFrmOrObj.GetDrawObject(),
1243 												  this, sal_True );
1244                 // --> OD 2004-11-29 #i37790#
1245                 if ( xAccImpl.isValid() )
1246                 {
1247                     ScrolledInShape( rChildFrmOrObj.GetDrawObject(),
1248                                      xAccImpl.getBodyPtr() );
1249                 }
1250                 else
1251                 {
1252                     ASSERT( false ,
1253                             "<SwAccessibleContext::InvalidateChildPosOrSize(..)> - no accessible shape found." );
1254                 }
1255                 // <--
1256 			}
1257             else if ( rChildFrmOrObj.GetWindow() )
1258             {
1259                 AccessibleEventObject aEvent;
1260                 aEvent.EventId = AccessibleEventId::CHILD;
1261                 aEvent.NewValue <<= (rChildFrmOrObj.GetWindow()->GetAccessible());
1262                 FireAccessibleEvent( aEvent );
1263             }
1264 		}
1265 	}
1266 	else
1267 	{
1268 		// If the frame was visible before, than a child event for the parent
1269 		// needs to be send. However, there is no wrapper existing, and so
1270 		// no notifications for grandchildren are required. If the are
1271 		// grandgrandchildren, they would be notified by the layout.
1272         if( bVisibleChildrenOnly &&
1273 			!bNew && IsShowing( rOldFrm ) )
1274 		{
1275 			if( rChildFrmOrObj.GetSwFrm() )
1276 			{
1277 				::vos::ORef< SwAccessibleContext > xAccImpl =
1278 					GetMap()->GetContextImpl( rChildFrmOrObj.GetSwFrm(),
1279 											  sal_True );
1280 				xAccImpl->SetParent( this );
1281 				xAccImpl->Dispose( sal_True );
1282 			}
1283             else if ( rChildFrmOrObj.GetDrawObject() )
1284 			{
1285 				::vos::ORef< ::accessibility::AccessibleShape > xAccImpl =
1286                         GetMap()->GetContextImpl( rChildFrmOrObj.GetDrawObject(),
1287 												  this, sal_True );
1288                 DisposeShape( rChildFrmOrObj.GetDrawObject(),
1289 						  xAccImpl.getBodyPtr() );
1290 			}
1291             else if ( rChildFrmOrObj.GetWindow() )
1292             {
1293                 ASSERT( false,
1294                         "<SwAccessibleContext::InvalidateChildPosOrSize(..)> - not expected to handle dispose of child of type <Window>." );
1295             }
1296 		}
1297 	}
1298 }
1299 
1300 void SwAccessibleContext::InvalidateContent()
1301 {
1302 	vos::OGuard aGuard(Application::GetSolarMutex());
1303 
1304 	_InvalidateContent( sal_False );
1305 }
1306 
1307 void SwAccessibleContext::InvalidateCursorPos()
1308 {
1309 	vos::OGuard aGuard(Application::GetSolarMutex());
1310 
1311 	_InvalidateCursorPos();
1312 }
1313 
1314 void SwAccessibleContext::InvalidateFocus()
1315 {
1316 	vos::OGuard aGuard(Application::GetSolarMutex());
1317 
1318 	_InvalidateFocus();
1319 }
1320 
1321 // --> OD 2005-12-12 #i27301# - use new type definition for <_nStates>
1322 void SwAccessibleContext::InvalidateStates( tAccessibleStates _nStates )
1323 {
1324 	if( GetMap() )
1325 	{
1326 		ViewShell *pVSh = GetMap()->GetShell();
1327 		if( pVSh )
1328 		{
1329             if( (_nStates & ACC_STATE_EDITABLE) != 0 )
1330 			{
1331 				sal_Bool bIsOldEditableState;
1332 				sal_Bool bIsNewEditableState = IsEditable( pVSh );
1333 				{
1334 					vos::OGuard aGuard( aMutex );
1335 					bIsOldEditableState = bIsEditableState;
1336 					bIsEditableState = bIsNewEditableState;
1337 				}
1338 
1339 				if( bIsOldEditableState != bIsNewEditableState )
1340 					FireStateChangedEvent( AccessibleStateType::EDITABLE,
1341 										   bIsNewEditableState  );
1342 			}
1343             if( (_nStates & ACC_STATE_OPAQUE) != 0 )
1344 			{
1345 				sal_Bool bIsOldOpaqueState;
1346 				sal_Bool bIsNewOpaqueState = IsOpaque( pVSh );
1347 				{
1348 					vos::OGuard aGuard( aMutex );
1349 					bIsOldOpaqueState = bIsOpaqueState;
1350 					bIsOpaqueState = bIsNewOpaqueState;
1351 				}
1352 
1353 				if( bIsOldOpaqueState != bIsNewOpaqueState )
1354 					FireStateChangedEvent( AccessibleStateType::OPAQUE,
1355 										   bIsNewOpaqueState  );
1356 			}
1357 		}
1358 
1359         InvalidateChildrenStates( GetFrm(), _nStates );
1360 	}
1361 }
1362 // <--
1363 
1364 void SwAccessibleContext::InvalidateRelation( sal_uInt16 nType )
1365 {
1366 	AccessibleEventObject aEvent;
1367 	aEvent.EventId = nType;
1368 
1369     FireAccessibleEvent( aEvent );
1370 }
1371 
1372 /** text selection has changed
1373 
1374     OD 2005-12-14 #i27301#
1375 
1376     @author OD
1377 */
1378 void SwAccessibleContext::InvalidateTextSelection()
1379 {
1380     AccessibleEventObject aEvent;
1381     aEvent.EventId = AccessibleEventId::TEXT_SELECTION_CHANGED;
1382 
1383     FireAccessibleEvent( aEvent );
1384 }
1385 
1386 /** attributes has changed
1387 
1388     OD 2009-01-06 #i88069#
1389 
1390     @author OD
1391 */
1392 void SwAccessibleContext::InvalidateAttr()
1393 {
1394     AccessibleEventObject aEvent;
1395     aEvent.EventId = AccessibleEventId::TEXT_ATTRIBUTE_CHANGED;
1396 
1397     FireAccessibleEvent( aEvent );
1398 }
1399 
1400 sal_Bool SwAccessibleContext::HasCursor()
1401 {
1402 	return sal_False;
1403 }
1404 
1405 sal_Bool SwAccessibleContext::Select( SwPaM *pPaM, SdrObject *pObj,
1406 									  sal_Bool bAdd )
1407 {
1408     SwCrsrShell* pCrsrShell = GetCrsrShell();
1409 	if( !pCrsrShell )
1410 		return sal_False;
1411 
1412     SwFEShell* pFEShell = pCrsrShell->ISA( SwFEShell )
1413 								? static_cast<SwFEShell*>( pCrsrShell )
1414 								: 0;
1415 	// Get rid of activated OLE object
1416 	if( pFEShell )
1417 		pFEShell->FinishOLEObj();
1418 
1419 	sal_Bool bRet = sal_False;
1420 	if( pObj )
1421 	{
1422 		if( pFEShell )
1423 		{
1424 			Point aDummy;
1425 			sal_uInt8 nFlags = bAdd ? SW_ADD_SELECT : 0;
1426 			pFEShell->SelectObj( aDummy, nFlags, pObj );
1427 			bRet = sal_True;
1428 		}
1429 	}
1430 	else if( pPaM )
1431 	{
1432 		// Get rid of frame selection. If there is one, make text cursor
1433 		// visible again.
1434 		sal_Bool bCallShowCrsr = sal_False;
1435 		if( pFEShell && (pFEShell->IsFrmSelected() ||
1436 						 pFEShell->IsObjSelected()) )
1437 		{
1438 			Point aPt( LONG_MIN, LONG_MIN );
1439 			pFEShell->SelectObj( aPt, 0 );
1440 			bCallShowCrsr = sal_True;
1441 		}
1442         pCrsrShell->KillPams();
1443         pCrsrShell->SetSelection( *pPaM );
1444 		if( bCallShowCrsr )
1445 			pCrsrShell->ShowCrsr();
1446 		bRet = sal_True;
1447 	}
1448 
1449 	return bRet;
1450 }
1451 
1452 OUString SwAccessibleContext::GetResource( sal_uInt16 nResId,
1453 										   const OUString *pArg1,
1454 										   const OUString *pArg2 )
1455 {
1456 	String sStr;
1457 	{
1458 		vos::OGuard aGuard(Application::GetSolarMutex());
1459 
1460 		sStr = SW_RES( nResId );
1461 	}
1462 
1463 	if( pArg1 )
1464 	{
1465 		sStr.SearchAndReplace( String::CreateFromAscii(
1466 									RTL_CONSTASCII_STRINGPARAM( "$(ARG1)" )),
1467 							   String( *pArg1 ) );
1468 	}
1469 	if( pArg2 )
1470 	{
1471 		sStr.SearchAndReplace( String::CreateFromAscii(
1472 									RTL_CONSTASCII_STRINGPARAM( "$(ARG2)" )),
1473 							   String( *pArg2 ) );
1474 	}
1475 
1476 	return OUString( sStr );
1477 }
1478 
1479 void SwAccessibleContext::RemoveFrmFromAccessibleMap()
1480 {
1481     if( bRegisteredAtAccessibleMap && GetFrm() && GetMap() )
1482         GetMap()->RemoveContext( GetFrm() );
1483 }
1484 
1485 bool SwAccessibleContext::HasAdditionalAccessibleChildren()
1486 {
1487     bool bRet( false );
1488 
1489     if ( GetFrm()->IsTxtFrm() )
1490     {
1491         SwPostItMgr* pPostItMgr = GetMap()->GetShell()->GetPostItMgr();
1492         if ( pPostItMgr && pPostItMgr->HasNotes() && pPostItMgr->ShowNotes() )
1493         {
1494             bRet = pPostItMgr->HasFrmConnectedSidebarWins( *(GetFrm()) );
1495         }
1496     }
1497 
1498     return bRet;
1499 }
1500 /** get additional accessible child by index
1501 
1502     OD 2010-01-27 #i88070#
1503 
1504     @author OD
1505 */
1506 Window* SwAccessibleContext::GetAdditionalAccessibleChild( const sal_Int32 nIndex )
1507 {
1508     Window* pAdditionalAccessibleChild( 0 );
1509 
1510     if ( GetFrm()->IsTxtFrm() )
1511     {
1512         SwPostItMgr* pPostItMgr = GetMap()->GetShell()->GetPostItMgr();
1513         if ( pPostItMgr && pPostItMgr->HasNotes() && pPostItMgr->ShowNotes() )
1514         {
1515             pAdditionalAccessibleChild =
1516                     pPostItMgr->GetSidebarWinForFrmByIndex( *(GetFrm()), nIndex );
1517         }
1518     }
1519 
1520     return pAdditionalAccessibleChild;
1521 }
1522 
1523 /** get all additional accessible children
1524 
1525     OD 2010-01-27 #i88070#
1526 
1527     @author OD
1528 */
1529 void SwAccessibleContext::GetAdditionalAccessibleChildren( std::vector< Window* >* pChildren )
1530 {
1531     if ( GetFrm()->IsTxtFrm() )
1532     {
1533         SwPostItMgr* pPostItMgr = GetMap()->GetShell()->GetPostItMgr();
1534         if ( pPostItMgr && pPostItMgr->HasNotes() && pPostItMgr->ShowNotes() )
1535         {
1536             pPostItMgr->GetAllSidebarWinForFrm( *(GetFrm()), pChildren );
1537         }
1538     }
1539 }
1540 
1541 #if (OSL_DEBUG_LEVEL > 1) && defined TEST_MIB
1542 void lcl_SwAccessibleContext_DbgMsg( SwAccessibleContext *pThisAcc,
1543 									 const char *pMsg,
1544 								     SwAccessibleContext *pChildAcc,
1545 								  	 sal_Bool bConstrDestr )
1546 {
1547 	static SvFileStream aStrm( String::CreateFromAscii("j:\\acc.log"),
1548 					STREAM_WRITE|STREAM_TRUNC|STREAM_SHARE_DENYNONE	);
1549 	ByteString aName( String(pThisAcc->GetName()),
1550 					  RTL_TEXTENCODING_ISO_8859_1 );
1551 	if( aName.Len() )
1552 	{
1553 		aStrm << aName.GetBuffer()
1554 			  << ": ";
1555 	}
1556 	aStrm << pMsg;
1557 	if( pChildAcc )
1558 	{
1559 		ByteString aChild( String(pChildAcc->GetName()),
1560 						   RTL_TEXTENCODING_ISO_8859_1 );
1561 		aStrm << ": "
1562 		      << aChild.GetBuffer();
1563 	}
1564 	aStrm << "\r\n    (";
1565 
1566 	if( !bConstrDestr )
1567 	{
1568 		ByteString aDesc( String(pThisAcc->getAccessibleDescription()),
1569 						   RTL_TEXTENCODING_ISO_8859_1 );
1570 		aStrm << aDesc.GetBuffer()
1571 			  << ", ";
1572 	}
1573 
1574 	Rectangle aVisArea( pThisAcc->GetVisArea() );
1575 	aStrm << "VA: "
1576 		  << ByteString::CreateFromInt32( aVisArea.Left() ).GetBuffer()
1577 		  << ","
1578 		  << ByteString::CreateFromInt32( aVisArea.Top() ).GetBuffer()
1579 		  << ","
1580 		  << ByteString::CreateFromInt32( aVisArea.GetWidth() ).GetBuffer()
1581 		  << ","
1582 		  << ByteString::CreateFromInt32( aVisArea.GetHeight() ).GetBuffer();
1583 
1584 	if( pThisAcc->GetFrm() )
1585 	{
1586 		Rectangle aBounds( pThisAcc->GetBounds( pThisAcc->GetFrm() ) );
1587 		aStrm << ", BB: "
1588 			  << ByteString::CreateFromInt32( aBounds.Left() ).GetBuffer()
1589 			  << ","
1590 			  << ByteString::CreateFromInt32( aBounds.Top() ).GetBuffer()
1591 			  << ","
1592 			  << ByteString::CreateFromInt32( aBounds.GetWidth() ).GetBuffer()
1593 			  << ","
1594 			  << ByteString::CreateFromInt32( aBounds.GetHeight() ).GetBuffer()
1595 			  << ")\r\n";
1596 	}
1597 
1598 	aStrm.Flush();
1599 }
1600 #endif
1601