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_sd.hxx" 26 27 #include "EventMultiplexer.hxx" 28 29 #include "MutexOwner.hxx" 30 #include "ViewShellBase.hxx" 31 #include "drawdoc.hxx" 32 #include "DrawController.hxx" 33 #include "SlideSorterViewShell.hxx" 34 #include "framework/FrameworkHelper.hxx" 35 36 #include <com/sun/star/beans/XPropertySet.hpp> 37 #include <com/sun/star/frame/XFrame.hpp> 38 #include <com/sun/star/lang/DisposedException.hpp> 39 #include <com/sun/star/drawing/framework/XConfigurationChangeListener.hpp> 40 #include <cppuhelper/weak.hxx> 41 #include <cppuhelper/compbase4.hxx> 42 #include <sfx2/viewfrm.hxx> 43 44 using namespace ::com::sun::star; 45 using namespace ::com::sun::star::lang; 46 using namespace ::com::sun::star::uno; 47 using namespace ::com::sun::star::drawing::framework; 48 49 using ::rtl::OUString; 50 using ::sd::framework::FrameworkHelper; 51 52 class SdDrawDocument; 53 54 namespace { 55 static const sal_Int32 ResourceActivationEvent = 0; 56 static const sal_Int32 ResourceDeactivationEvent = 1; 57 static const sal_Int32 ConfigurationUpdateEvent = 2; 58 } 59 60 namespace sd { namespace tools { 61 62 typedef cppu::WeakComponentImplHelper4< 63 ::com::sun::star::beans::XPropertyChangeListener, 64 ::com::sun::star::frame::XFrameActionListener, 65 ::com::sun::star::view::XSelectionChangeListener, 66 ::com::sun::star::drawing::framework::XConfigurationChangeListener 67 > EventMultiplexerImplementationInterfaceBase; 68 69 class EventMultiplexer::Implementation 70 : protected MutexOwner, 71 public EventMultiplexerImplementationInterfaceBase, 72 public SfxListener 73 { 74 public: 75 Implementation (ViewShellBase& rBase); 76 ~Implementation (void); 77 78 void AddEventListener ( 79 Link& rCallback, 80 EventMultiplexerEvent::EventId aEventTypes); 81 82 void RemoveEventListener ( 83 Link& rCallback, 84 EventMultiplexerEvent::EventId aEventTypes); 85 86 void CallListeners (EventMultiplexerEvent& rEvent); 87 88 ViewShellBase& GetViewShellBase() const { return mrBase; } 89 90 //===== lang::XEventListener ============================================== 91 virtual void SAL_CALL 92 disposing (const ::com::sun::star::lang::EventObject& rEventObject) 93 throw (::com::sun::star::uno::RuntimeException); 94 95 96 //===== beans::XPropertySetListener ======================================= 97 virtual void SAL_CALL 98 propertyChange ( 99 const com::sun::star::beans::PropertyChangeEvent& rEvent) 100 throw (::com::sun::star::uno::RuntimeException); 101 102 //===== view::XSelectionChangeListener ==================================== 103 virtual void SAL_CALL 104 selectionChanged ( 105 const com::sun::star::lang::EventObject& rEvent) 106 throw (::com::sun::star::uno::RuntimeException); 107 108 //===== frame::XFrameActionListener ====================================== 109 /** For certain actions the listener connects to a new controller of the 110 frame it is listening to. This usually happens when the view shell 111 in the center pane is replaced by another view shell. 112 */ 113 virtual void SAL_CALL 114 frameAction (const ::com::sun::star::frame::FrameActionEvent& rEvent) 115 throw (::com::sun::star::uno::RuntimeException); 116 117 //===== drawing::framework::XConfigurationChangeListener ================== 118 virtual void SAL_CALL 119 notifyConfigurationChange ( 120 const ::com::sun::star::drawing::framework::ConfigurationChangeEvent& rEvent) 121 throw (::com::sun::star::uno::RuntimeException); 122 123 124 virtual void SAL_CALL disposing (void); 125 126 protected: 127 virtual void Notify ( 128 SfxBroadcaster& rBroadcaster, 129 const SfxHint& rHint); 130 131 private: 132 ViewShellBase& mrBase; 133 typedef ::std::pair<Link,EventMultiplexerEvent::EventId> ListenerDescriptor; 134 typedef ::std::vector<ListenerDescriptor> ListenerList; 135 ListenerList maListeners; 136 137 /// Remember whether we are listening to the UNO controller. 138 bool mbListeningToController; 139 /// Remember whether we are listening to the frame. 140 bool mbListeningToFrame; 141 142 ::com::sun::star::uno::WeakReference< 143 ::com::sun::star::frame::XController> mxControllerWeak; 144 ::com::sun::star::uno::WeakReference< 145 ::com::sun::star::frame::XFrame> mxFrameWeak; 146 ::com::sun::star::uno::WeakReference< 147 ::com::sun::star::view::XSelectionSupplier> mxSlideSorterSelectionWeak; 148 SdDrawDocument* mpDocument; 149 ::com::sun::star::uno::WeakReference< 150 ::com::sun::star::drawing::framework::XConfigurationController> 151 mxConfigurationControllerWeak; 152 153 static const ::rtl::OUString msCurrentPagePropertyName; 154 static const ::rtl::OUString msEditModePropertyName; 155 156 void ReleaseListeners (void); 157 158 void ConnectToController (void); 159 void DisconnectFromController (void); 160 161 void CallListeners ( 162 EventMultiplexerEvent::EventId eId, 163 void* pUserData = NULL); 164 165 /** This method throws a DisposedException when the object has already been 166 disposed. 167 */ 168 void ThrowIfDisposed (void) 169 throw (::com::sun::star::lang::DisposedException); 170 171 DECL_LINK(SlideSorterSelectionChangeListener, void*); 172 }; 173 174 175 const ::rtl::OUString EventMultiplexer::Implementation::msCurrentPagePropertyName ( 176 RTL_CONSTASCII_USTRINGPARAM("CurrentPage")); 177 const ::rtl::OUString EventMultiplexer::Implementation::msEditModePropertyName ( 178 RTL_CONSTASCII_USTRINGPARAM("IsMasterPageMode")); 179 180 181 //===== EventMultiplexer ====================================================== 182 183 EventMultiplexer::EventMultiplexer (ViewShellBase& rBase) 184 : mpImpl (new EventMultiplexer::Implementation(rBase)) 185 { 186 mpImpl->acquire(); 187 } 188 189 190 191 192 EventMultiplexer::~EventMultiplexer (void) 193 { 194 try 195 { 196 mpImpl->dispose(); 197 // Now we call release twice. One decreases the use count of the 198 // implementation object (if all goes well to zero and thus deletes 199 // it.) The other releases the auto_ptr and prevents the 200 // implementation object from being deleted a second time. 201 mpImpl->release(); 202 mpImpl.release(); 203 } 204 catch (RuntimeException aException) 205 { 206 } 207 catch (Exception aException) 208 { 209 } 210 } 211 212 213 214 215 void EventMultiplexer::AddEventListener ( 216 Link& rCallback, 217 EventMultiplexerEvent::EventId aEventTypes) 218 { 219 mpImpl->AddEventListener (rCallback, aEventTypes); 220 } 221 222 223 224 225 void EventMultiplexer::RemoveEventListener ( 226 Link& rCallback, 227 EventMultiplexerEvent::EventId aEventTypes) 228 { 229 mpImpl->RemoveEventListener (rCallback, aEventTypes); 230 } 231 232 233 234 235 void EventMultiplexer::MultiplexEvent( 236 EventMultiplexerEvent::EventId eEventId, 237 void* pUserData ) 238 { 239 EventMultiplexerEvent aEvent (mpImpl->GetViewShellBase(), eEventId, pUserData); 240 mpImpl->CallListeners(aEvent); 241 } 242 243 244 245 246 //===== EventMultiplexer::Implementation ====================================== 247 248 EventMultiplexer::Implementation::Implementation (ViewShellBase& rBase) 249 : MutexOwner(), 250 EventMultiplexerImplementationInterfaceBase(maMutex), 251 SfxListener(), 252 mrBase (rBase), 253 mbListeningToController (false), 254 mbListeningToFrame (false), 255 mxControllerWeak(NULL), 256 mxFrameWeak(NULL), 257 mxSlideSorterSelectionWeak(NULL), 258 mpDocument(NULL), 259 mxConfigurationControllerWeak() 260 { 261 // Connect to the frame to listen for controllers being exchanged. 262 // Listen to changes of certain properties. 263 Reference<frame::XFrame> xFrame ( 264 mrBase.GetFrame()->GetTopFrame().GetFrameInterface(), 265 uno::UNO_QUERY); 266 mxFrameWeak = xFrame; 267 if (xFrame.is()) 268 { 269 xFrame->addFrameActionListener ( 270 Reference<frame::XFrameActionListener>( 271 static_cast<XWeak*>(this), UNO_QUERY)); 272 mbListeningToFrame = true; 273 } 274 275 // Connect to the current controller. 276 ConnectToController (); 277 278 // Listen for document changes. 279 mpDocument = mrBase.GetDocument(); 280 if (mpDocument != NULL) 281 StartListening (*mpDocument); 282 283 // Listen for configuration changes. 284 Reference<XControllerManager> xControllerManager ( 285 Reference<XWeak>(&mrBase.GetDrawController()), UNO_QUERY); 286 if (xControllerManager.is()) 287 { 288 Reference<XConfigurationController> xConfigurationController ( 289 xControllerManager->getConfigurationController()); 290 mxConfigurationControllerWeak = xConfigurationController; 291 if (xConfigurationController.is()) 292 { 293 Reference<XComponent> xComponent (xConfigurationController, UNO_QUERY); 294 if (xComponent.is()) 295 xComponent->addEventListener(static_cast<beans::XPropertyChangeListener*>(this)); 296 297 xConfigurationController->addConfigurationChangeListener( 298 this, 299 FrameworkHelper::msResourceActivationEvent, 300 makeAny(ResourceActivationEvent)); 301 xConfigurationController->addConfigurationChangeListener( 302 this, 303 FrameworkHelper::msResourceDeactivationEvent, 304 makeAny(ResourceDeactivationEvent)); 305 xConfigurationController->addConfigurationChangeListener( 306 this, 307 FrameworkHelper::msConfigurationUpdateEndEvent, 308 makeAny(ConfigurationUpdateEvent)); 309 } 310 } 311 } 312 313 314 315 316 EventMultiplexer::Implementation::~Implementation (void) 317 { 318 DBG_ASSERT( !mbListeningToFrame, 319 "sd::EventMultiplexer::Implementation::~Implementation(), disposing was not called!" ); 320 } 321 322 323 324 325 void EventMultiplexer::Implementation::ReleaseListeners (void) 326 { 327 if (mbListeningToFrame) 328 { 329 mbListeningToFrame = false; 330 331 // Stop listening for changes of certain properties. 332 Reference<frame::XFrame> xFrame (mxFrameWeak); 333 if (xFrame.is()) 334 { 335 xFrame->removeFrameActionListener ( 336 Reference<frame::XFrameActionListener>( 337 static_cast<XWeak*>(this), UNO_QUERY)); 338 } 339 } 340 341 DisconnectFromController (); 342 343 if (mpDocument != NULL) 344 { 345 EndListening (*mpDocument); 346 mpDocument = NULL; 347 } 348 349 // Stop listening for configuration changes. 350 Reference<XConfigurationController> xConfigurationController (mxConfigurationControllerWeak); 351 if (xConfigurationController.is()) 352 { 353 Reference<XComponent> xComponent (xConfigurationController, UNO_QUERY); 354 if (xComponent.is()) 355 xComponent->removeEventListener(static_cast<beans::XPropertyChangeListener*>(this)); 356 357 xConfigurationController->removeConfigurationChangeListener(this); 358 } 359 } 360 361 362 363 364 void EventMultiplexer::Implementation::AddEventListener ( 365 Link& rCallback, 366 EventMultiplexerEvent::EventId aEventTypes) 367 { 368 ListenerList::iterator iListener (maListeners.begin()); 369 ListenerList::const_iterator iEnd (maListeners.end()); 370 for (;iListener!=iEnd; ++iListener) 371 if (iListener->first == rCallback) 372 break; 373 if (iListener != maListeners.end()) 374 { 375 // Listener exists. Update its event type set. 376 iListener->second |= aEventTypes; 377 } 378 else 379 { 380 maListeners.push_back (ListenerDescriptor(rCallback,aEventTypes)); 381 } 382 } 383 384 385 386 387 void EventMultiplexer::Implementation::RemoveEventListener ( 388 Link& rCallback, 389 EventMultiplexerEvent::EventId aEventTypes) 390 { 391 ListenerList::iterator iListener (maListeners.begin()); 392 ListenerList::const_iterator iEnd (maListeners.end()); 393 for (;iListener!=iEnd; ++iListener) 394 if (iListener->first == rCallback) 395 break; 396 if (iListener != maListeners.end()) 397 { 398 // Update the event type set. 399 iListener->second &= ~aEventTypes; 400 // When no events remain in the set then remove the listener. 401 if (iListener->second == EID_EMPTY_SET) 402 maListeners.erase (iListener); 403 } 404 } 405 406 407 408 409 void EventMultiplexer::Implementation::ConnectToController (void) 410 { 411 // Just in case that we missed some event we now disconnect from the old 412 // controller. 413 DisconnectFromController (); 414 415 // Register at the controller of the main view shell. 416 417 // We have to store a (weak) reference to the controller so that we can 418 // unregister without having to ask the mrBase member (which at that 419 // time may be destroyed.) 420 Reference<frame::XController> xController = mrBase.GetController(); 421 mxControllerWeak = mrBase.GetController(); 422 423 try 424 { 425 // Listen for disposing events. 426 Reference<lang::XComponent> xComponent (xController, UNO_QUERY); 427 if (xComponent.is()) 428 { 429 xComponent->addEventListener ( 430 Reference<lang::XEventListener>( 431 static_cast<XWeak*>(this), UNO_QUERY)); 432 mbListeningToController = true; 433 } 434 435 // Listen to changes of certain properties. 436 Reference<beans::XPropertySet> xSet (xController, UNO_QUERY); 437 if (xSet.is()) 438 { 439 try 440 { 441 xSet->addPropertyChangeListener(msCurrentPagePropertyName, this); 442 } 443 catch (beans::UnknownPropertyException) 444 { 445 OSL_TRACE("EventMultiplexer::ConnectToController: CurrentPage unknown"); 446 } 447 448 try 449 { 450 xSet->addPropertyChangeListener(msEditModePropertyName, this); 451 } 452 catch (beans::UnknownPropertyException) 453 { 454 OSL_TRACE("EventMultiplexer::ConnectToController: IsMasterPageMode unknown"); 455 } 456 } 457 458 // Listen for selection change events. 459 Reference<view::XSelectionSupplier> xSelection (xController, UNO_QUERY); 460 if (xSelection.is()) 461 { 462 xSelection->addSelectionChangeListener(this); 463 } 464 } 465 catch (const lang::DisposedException aException) 466 { 467 mbListeningToController = false; 468 } 469 } 470 471 472 473 474 void EventMultiplexer::Implementation::DisconnectFromController (void) 475 { 476 if (mbListeningToController) 477 { 478 mbListeningToController = false; 479 480 Reference<frame::XController> xController = mxControllerWeak; 481 482 Reference<beans::XPropertySet> xSet (xController, UNO_QUERY); 483 // Remove the property listener. 484 if (xSet.is()) 485 { 486 try 487 { 488 xSet->removePropertyChangeListener(msCurrentPagePropertyName, this); 489 } 490 catch (beans::UnknownPropertyException aEvent) 491 { 492 OSL_TRACE ("DisconnectFromController: CurrentPage unknown"); 493 } 494 495 try 496 { 497 xSet->removePropertyChangeListener(msEditModePropertyName, this); 498 } 499 catch (beans::UnknownPropertyException aEvent) 500 { 501 OSL_TRACE ("DisconnectFromController: IsMasterPageMode unknown"); 502 } 503 } 504 505 // Remove selection change listener. 506 Reference<view::XSelectionSupplier> xSelection (xController, UNO_QUERY); 507 if (xSelection.is()) 508 { 509 xSelection->removeSelectionChangeListener(this); 510 } 511 512 // Remove listener for disposing events. 513 Reference<lang::XComponent> xComponent (xController, UNO_QUERY); 514 if (xComponent.is()) 515 { 516 xComponent->removeEventListener ( 517 Reference<lang::XEventListener>(static_cast<XWeak*>(this), UNO_QUERY)); 518 } 519 } 520 } 521 522 523 524 525 //===== lang::XEventListener ================================================ 526 527 void SAL_CALL EventMultiplexer::Implementation::disposing ( 528 const lang::EventObject& rEventObject) 529 throw (RuntimeException) 530 { 531 if (mbListeningToController) 532 { 533 Reference<frame::XController> xController (mxControllerWeak); 534 if (rEventObject.Source == xController) 535 { 536 mbListeningToController = false; 537 } 538 } 539 540 Reference<XConfigurationController> xConfigurationController ( 541 mxConfigurationControllerWeak); 542 if (xConfigurationController.is() 543 && rEventObject.Source == xConfigurationController) 544 { 545 mxConfigurationControllerWeak = Reference<XConfigurationController>(); 546 } 547 } 548 549 550 551 552 //===== beans::XPropertySetListener ========================================= 553 554 void SAL_CALL EventMultiplexer::Implementation::propertyChange ( 555 const beans::PropertyChangeEvent& rEvent) 556 throw (RuntimeException) 557 { 558 ThrowIfDisposed(); 559 560 if (rEvent.PropertyName.equals(msCurrentPagePropertyName)) 561 { 562 CallListeners(EventMultiplexerEvent::EID_CURRENT_PAGE); 563 } 564 else if (rEvent.PropertyName.equals(msEditModePropertyName)) 565 { 566 bool bIsMasterPageMode (false); 567 rEvent.NewValue >>= bIsMasterPageMode; 568 if (bIsMasterPageMode) 569 CallListeners(EventMultiplexerEvent::EID_EDIT_MODE_MASTER); 570 else 571 CallListeners(EventMultiplexerEvent::EID_EDIT_MODE_NORMAL); 572 } 573 } 574 575 576 577 578 //===== frame::XFrameActionListener ========================================== 579 580 void SAL_CALL EventMultiplexer::Implementation::frameAction ( 581 const frame::FrameActionEvent& rEvent) 582 throw (::com::sun::star::uno::RuntimeException) 583 { 584 Reference<frame::XFrame> xFrame (mxFrameWeak); 585 if (rEvent.Frame == xFrame) 586 switch (rEvent.Action) 587 { 588 case frame::FrameAction_COMPONENT_DETACHING: 589 DisconnectFromController(); 590 CallListeners (EventMultiplexerEvent::EID_CONTROLLER_DETACHED); 591 break; 592 593 case frame::FrameAction_COMPONENT_REATTACHED: 594 CallListeners (EventMultiplexerEvent::EID_CONTROLLER_DETACHED); 595 DisconnectFromController(); 596 ConnectToController(); 597 CallListeners (EventMultiplexerEvent::EID_CONTROLLER_ATTACHED); 598 break; 599 600 case frame::FrameAction_COMPONENT_ATTACHED: 601 ConnectToController(); 602 CallListeners (EventMultiplexerEvent::EID_CONTROLLER_ATTACHED); 603 break; 604 605 default: 606 break; 607 } 608 } 609 610 611 612 613 //===== view::XSelectionChangeListener ======================================== 614 615 void SAL_CALL EventMultiplexer::Implementation::selectionChanged ( 616 const lang::EventObject& ) 617 throw (::com::sun::star::uno::RuntimeException) 618 { 619 CallListeners (EventMultiplexerEvent::EID_EDIT_VIEW_SELECTION); 620 } 621 622 623 624 625 //===== drawing::framework::XConfigurationChangeListener ================== 626 627 void SAL_CALL EventMultiplexer::Implementation::notifyConfigurationChange ( 628 const ConfigurationChangeEvent& rEvent) 629 throw (RuntimeException) 630 { 631 sal_Int32 nEventType = 0; 632 rEvent.UserData >>= nEventType; 633 switch (nEventType) 634 { 635 case ResourceActivationEvent: 636 if (rEvent.ResourceId->getResourceURL().match(FrameworkHelper::msViewURLPrefix)) 637 { 638 CallListeners (EventMultiplexerEvent::EID_VIEW_ADDED); 639 640 if (rEvent.ResourceId->isBoundToURL( 641 FrameworkHelper::msCenterPaneURL, AnchorBindingMode_DIRECT)) 642 { 643 CallListeners (EventMultiplexerEvent::EID_MAIN_VIEW_ADDED); 644 } 645 646 // Add selection change listener at slide sorter. 647 if (rEvent.ResourceId->getResourceURL().equals(FrameworkHelper::msSlideSorterURL)) 648 { 649 slidesorter::SlideSorterViewShell* pViewShell 650 = dynamic_cast<slidesorter::SlideSorterViewShell*>( 651 FrameworkHelper::GetViewShell( 652 Reference<XView>(rEvent.ResourceObject,UNO_QUERY)).get()); 653 if (pViewShell != NULL) 654 pViewShell->AddSelectionChangeListener ( 655 LINK(this, 656 EventMultiplexer::Implementation, 657 SlideSorterSelectionChangeListener)); 658 } 659 } 660 break; 661 662 case ResourceDeactivationEvent: 663 if (rEvent.ResourceId->getResourceURL().match(FrameworkHelper::msViewURLPrefix)) 664 { 665 CallListeners (EventMultiplexerEvent::EID_VIEW_REMOVED); 666 667 if (rEvent.ResourceId->isBoundToURL( 668 FrameworkHelper::msCenterPaneURL, AnchorBindingMode_DIRECT)) 669 { 670 CallListeners (EventMultiplexerEvent::EID_MAIN_VIEW_REMOVED); 671 } 672 673 // Remove selection change listener from slide sorter. Add 674 // selection change listener at slide sorter. 675 if (rEvent.ResourceId->getResourceURL().equals(FrameworkHelper::msSlideSorterURL)) 676 { 677 slidesorter::SlideSorterViewShell* pViewShell 678 = dynamic_cast<slidesorter::SlideSorterViewShell*>( 679 FrameworkHelper::GetViewShell( 680 Reference<XView>(rEvent.ResourceObject, UNO_QUERY)).get()); 681 if (pViewShell != NULL) 682 pViewShell->RemoveSelectionChangeListener ( 683 LINK(this, 684 EventMultiplexer::Implementation, 685 SlideSorterSelectionChangeListener)); 686 } 687 } 688 break; 689 690 case ConfigurationUpdateEvent: 691 CallListeners (EventMultiplexerEvent::EID_CONFIGURATION_UPDATED); 692 break; 693 } 694 695 } 696 697 698 699 700 void SAL_CALL EventMultiplexer::Implementation::disposing (void) 701 { 702 CallListeners (EventMultiplexerEvent::EID_DISPOSING); 703 ReleaseListeners(); 704 } 705 706 707 708 709 void EventMultiplexer::Implementation::ThrowIfDisposed (void) 710 throw (::com::sun::star::lang::DisposedException) 711 { 712 if (rBHelper.bDisposed || rBHelper.bInDispose) 713 { 714 throw lang::DisposedException ( 715 ::rtl::OUString(RTL_CONSTASCII_USTRINGPARAM( 716 "SlideSorterController object has already been disposed")), 717 static_cast<uno::XWeak*>(this)); 718 } 719 } 720 721 722 723 724 void EventMultiplexer::Implementation::Notify ( 725 SfxBroadcaster&, 726 const SfxHint& rHint) 727 { 728 if (rHint.ISA(SdrHint)) 729 { 730 SdrHint& rSdrHint (*PTR_CAST(SdrHint,&rHint)); 731 switch (rSdrHint.GetKind()) 732 { 733 case HINT_MODELCLEARED: 734 case HINT_PAGEORDERCHG: 735 CallListeners (EventMultiplexerEvent::EID_PAGE_ORDER); 736 break; 737 738 case HINT_SWITCHTOPAGE: 739 CallListeners (EventMultiplexerEvent::EID_CURRENT_PAGE); 740 break; 741 742 case HINT_OBJCHG: 743 CallListeners(EventMultiplexerEvent::EID_SHAPE_CHANGED, 744 const_cast<void*>(static_cast<const void*>(rSdrHint.GetPage()))); 745 break; 746 747 case HINT_OBJINSERTED: 748 CallListeners(EventMultiplexerEvent::EID_SHAPE_INSERTED, 749 const_cast<void*>(static_cast<const void*>(rSdrHint.GetPage()))); 750 break; 751 752 case HINT_OBJREMOVED: 753 CallListeners(EventMultiplexerEvent::EID_SHAPE_REMOVED, 754 const_cast<void*>(static_cast<const void*>(rSdrHint.GetPage()))); 755 break; 756 default: 757 break; 758 } 759 } 760 else if (rHint.ISA(SfxSimpleHint)) 761 { 762 SfxSimpleHint& rSimpleHint (*PTR_CAST(SfxSimpleHint, &rHint)); 763 if (rSimpleHint.GetId() == SFX_HINT_DYING) 764 mpDocument = NULL; 765 } 766 } 767 768 769 770 771 void EventMultiplexer::Implementation::CallListeners ( 772 EventMultiplexerEvent::EventId eId, 773 void* pUserData) 774 { 775 EventMultiplexerEvent aEvent (mrBase, eId, pUserData); 776 CallListeners(aEvent); 777 } 778 779 780 781 782 void EventMultiplexer::Implementation::CallListeners (EventMultiplexerEvent& rEvent) 783 { 784 ListenerList aCopyListeners( maListeners ); 785 ListenerList::iterator iListener (aCopyListeners.begin()); 786 ListenerList::const_iterator iListenerEnd (aCopyListeners.end()); 787 for (; iListener!=iListenerEnd; ++iListener) 788 { 789 if ((iListener->second && rEvent.meEventId) != 0) 790 iListener->first.Call(&rEvent); 791 } 792 } 793 794 795 796 797 IMPL_LINK(EventMultiplexer::Implementation, SlideSorterSelectionChangeListener, void*, EMPTYARG) 798 { 799 CallListeners (EventMultiplexerEvent::EID_SLIDE_SORTER_SELECTION); 800 return 0; 801 } 802 803 804 805 806 //===== EventMultiplexerEvent ================================================= 807 808 EventMultiplexerEvent::EventMultiplexerEvent ( 809 const ViewShellBase& rBase, 810 EventId eEventId, 811 const void* pUserData) 812 : mrBase(rBase), 813 meEventId(eEventId), 814 mpUserData(pUserData) 815 816 { 817 } 818 819 } } // end of namespace ::sd::tools 820