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_svl.hxx" 26 27 #ifndef GCC 28 #endif 29 #include <tools/debug.hxx> 30 31 #include <svl/listener.hxx> 32 #include <svl/listeneriter.hxx> 33 #include <svl/broadcast.hxx> 34 #include <svl/smplhint.hxx> 35 36 37 //==================================================================== 38 TYPEINIT0(SvtBroadcaster); 39 40 //==================================================================== 41 42 // simple ctor of class SvtBroadcaster 43 44 SvtBroadcaster::SvtBroadcaster() 45 : pRoot( 0 ) 46 { 47 } 48 49 //-------------------------------------------------------------------- 50 51 // copy ctor of class SvtBroadcaster 52 53 SvtBroadcaster::SvtBroadcaster( const SvtBroadcaster &rBC ) 54 : pRoot( 0 ) 55 { 56 SvtListenerIter aIter( (SvtBroadcaster&)rBC ); 57 SvtListener* pLast = aIter.GoStart(); 58 if( pLast ) 59 do { 60 pLast->StartListening( *this ); 61 } while( 0 != ( pLast = aIter.GoNext() )); 62 } 63 64 //-------------------------------------------------------------------- 65 66 // unregister all listeners 67 68 SvtBroadcaster::~SvtBroadcaster() 69 { 70 Broadcast( SfxSimpleHint(SFX_HINT_DYING) ); 71 72 SvtListenerIter aIter( *this ); 73 SvtListener* pLast = aIter.GoStart(); 74 if( pLast ) 75 do { 76 pLast->EndListening( *this ); 77 if( !HasListeners() ) // all gone ?? 78 break; 79 } while( 0 != ( pLast = aIter.GoNext() )); 80 } 81 82 //-------------------------------------------------------------------- 83 84 // broadcast immedeately 85 86 void SvtBroadcaster::Broadcast( const SfxHint &rHint ) 87 { 88 // is anybody to notify? 89 if( HasListeners() /* && !IsModifyLocked()*/ ) 90 { 91 // LockModify(); 92 // bInModify = sal_True; 93 94 SvtListenerIter aIter( *this ); 95 SvtListener* pLast = aIter.GoStart(); 96 if( pLast ) 97 do { 98 pLast->Notify( *this, rHint ); 99 if( !HasListeners() ) // all gone ?? 100 break; 101 } while( 0 != ( pLast = aIter.GoNext() )); 102 103 // bInModify = sal_False; 104 // UnlockModify(); 105 } 106 } 107 108 //-------------------------------------------------------------------- 109 110 111 // called, if no more listeners exists 112 113 void SvtBroadcaster::ListenersGone() 114 { 115 } 116 117 //-------------------------------------------------------------------- 118 119 // forward a notification to all registered listeners 120 121 void SvtBroadcaster::Forward( SvtBroadcaster& rBC, const SfxHint& rHint ) 122 { 123 // is anybody to notify? 124 if( rBC.HasListeners() /* && !IsModifyLocked()*/ ) 125 { 126 // LockModify(); 127 // bInModify = sal_True; 128 129 SvtListenerIter aIter( rBC ); 130 SvtListener* pLast = aIter.GoStart(); 131 if( pLast ) 132 do { 133 pLast->Notify( rBC, rHint ); 134 if( !rBC.HasListeners() ) // all gone ?? 135 break; 136 } while( 0 != ( pLast = aIter.GoNext() )); 137 138 // bInModify = sal_False; 139 // UnlockModify(); 140 } 141 } 142 143 144 145