1 /*************************************************************************
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 * Copyright 2008 by Sun Microsystems, Inc.
7 * OpenOffice.org - a multi-platform office productivity suite
9 * $RCSfile: broadcast.cxx,v $
12 * This file is part of OpenOffice.org.
14 * OpenOffice.org is free software: you can redistribute it and/or modify
15 * it under the terms of the GNU Lesser General Public License version 3
16 * only, as published by the Free Software Foundation.
18 * OpenOffice.org is distributed in the hope that it will be useful,
19 * but WITHOUT ANY WARRANTY; without even the implied warranty of
20 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21 * GNU Lesser General Public License version 3 for more details
22 * (a copy is included in the LICENSE file that accompanied this code).
24 * You should have received a copy of the GNU Lesser General Public License
25 * version 3 along with OpenOffice.org. If not, see
26 * <http://www.openoffice.org/license.html>
27 * for a copy of the LGPLv3 License.
29 ************************************************************************/
31 // MARKER(update_precomp.py): autogen include statement, do not remove
32 #include "precompiled_svtools.hxx"
36 #include <tools/debug.hxx>
38 #include "listener.hxx"
39 #include "listeneriter.hxx"
40 #include "broadcast.hxx"
41 #include <svtools/smplhint.hxx>
44 //====================================================================
45 TYPEINIT0(SvtBroadcaster
);
47 //====================================================================
49 // simple ctor of class SvtBroadcaster
51 SvtBroadcaster::SvtBroadcaster()
56 //--------------------------------------------------------------------
58 // copy ctor of class SvtBroadcaster
60 SvtBroadcaster::SvtBroadcaster( const SvtBroadcaster
&rBC
)
63 SvtListenerIter
aIter( (SvtBroadcaster
&)rBC
);
64 SvtListener
* pLast
= aIter
.GoStart();
67 pLast
->StartListening( *this );
68 } while( 0 != ( pLast
= aIter
.GoNext() ));
71 //--------------------------------------------------------------------
73 // unregister all listeners
75 SvtBroadcaster::~SvtBroadcaster()
77 Broadcast( SfxSimpleHint(SFX_HINT_DYING
) );
79 SvtListenerIter
aIter( *this );
80 SvtListener
* pLast
= aIter
.GoStart();
83 pLast
->EndListening( *this );
84 if( !HasListeners() ) // all gone ??
86 } while( 0 != ( pLast
= aIter
.GoNext() ));
89 //--------------------------------------------------------------------
91 // broadcast immedeately
93 void SvtBroadcaster::Broadcast( const SfxHint
&rHint
)
95 // is anybody to notify?
96 if( HasListeners() /* && !IsModifyLocked()*/ )
101 SvtListenerIter
aIter( *this );
102 SvtListener
* pLast
= aIter
.GoStart();
105 pLast
->Notify( *this, rHint
);
106 if( !HasListeners() ) // all gone ??
108 } while( 0 != ( pLast
= aIter
.GoNext() ));
110 // bInModify = FALSE;
115 //--------------------------------------------------------------------
118 // called, if no more listeners exists
120 void SvtBroadcaster::ListenersGone()
124 //--------------------------------------------------------------------
126 // forward a notification to all registered listeners
128 void SvtBroadcaster::Forward( SvtBroadcaster
& rBC
, const SfxHint
& rHint
)
130 // is anybody to notify?
131 if( rBC
.HasListeners() /* && !IsModifyLocked()*/ )
136 SvtListenerIter
aIter( rBC
);
137 SvtListener
* pLast
= aIter
.GoStart();
140 pLast
->Notify( rBC
, rHint
);
141 if( !rBC
.HasListeners() ) // all gone ??
143 } while( 0 != ( pLast
= aIter
.GoNext() ));
145 // bInModify = FALSE;