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