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
SvtBroadcaster()44 SvtBroadcaster::SvtBroadcaster()
45 : pRoot( 0 )
46 {
47 }
48
49 //--------------------------------------------------------------------
50
51 // copy ctor of class SvtBroadcaster
52
SvtBroadcaster(const SvtBroadcaster & rBC)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
~SvtBroadcaster()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
Broadcast(const SfxHint & rHint)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
ListenersGone()113 void SvtBroadcaster::ListenersGone()
114 {
115 }
116
117 //--------------------------------------------------------------------
118
119 // forward a notification to all registered listeners
120
Forward(SvtBroadcaster & rBC,const SfxHint & rHint)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