15b190011SAndrew Rist /**************************************************************
2cdf0e10cSrcweir *
35b190011SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one
45b190011SAndrew Rist * or more contributor license agreements. See the NOTICE file
55b190011SAndrew Rist * distributed with this work for additional information
65b190011SAndrew Rist * regarding copyright ownership. The ASF licenses this file
75b190011SAndrew Rist * to you under the Apache License, Version 2.0 (the
85b190011SAndrew Rist * "License"); you may not use this file except in compliance
95b190011SAndrew Rist * with the License. You may obtain a copy of the License at
105b190011SAndrew Rist *
115b190011SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0
125b190011SAndrew Rist *
135b190011SAndrew Rist * Unless required by applicable law or agreed to in writing,
145b190011SAndrew Rist * software distributed under the License is distributed on an
155b190011SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
165b190011SAndrew Rist * KIND, either express or implied. See the License for the
175b190011SAndrew Rist * specific language governing permissions and limitations
185b190011SAndrew Rist * under the License.
195b190011SAndrew Rist *
205b190011SAndrew Rist *************************************************************/
215b190011SAndrew Rist
22cdf0e10cSrcweir #include "precompiled_sd.hxx"
23cdf0e10cSrcweir
24cdf0e10cSrcweir #include "MasterPageObserver.hxx"
25cdf0e10cSrcweir
26cdf0e10cSrcweir #include <algorithm>
27cdf0e10cSrcweir #include "drawdoc.hxx"
28cdf0e10cSrcweir #include "sdpage.hxx"
29cdf0e10cSrcweir #include <hash_map>
30cdf0e10cSrcweir #include <set>
31cdf0e10cSrcweir #include <vector>
32cdf0e10cSrcweir #include <svl/lstner.hxx>
33cdf0e10cSrcweir #include <osl/doublecheckedlocking.h>
34cdf0e10cSrcweir #include <osl/getglobalmutex.hxx>
35cdf0e10cSrcweir
36cdf0e10cSrcweir
37cdf0e10cSrcweir namespace sd {
38cdf0e10cSrcweir
39cdf0e10cSrcweir class MasterPageObserver::Implementation
40cdf0e10cSrcweir : public SfxListener
41cdf0e10cSrcweir {
42cdf0e10cSrcweir public:
43cdf0e10cSrcweir /** The single instance of this class. It is created on demand when
44cdf0e10cSrcweir Instance() is called for the first time.
45cdf0e10cSrcweir */
46cdf0e10cSrcweir static MasterPageObserver* mpInstance;
47cdf0e10cSrcweir
48cdf0e10cSrcweir /** The master page observer will listen to events of this document and
49cdf0e10cSrcweir detect changes of the use of master pages.
50cdf0e10cSrcweir */
51cdf0e10cSrcweir void RegisterDocument (SdDrawDocument& rDocument);
52cdf0e10cSrcweir
53cdf0e10cSrcweir /** The master page observer will stop to listen to events of this
54cdf0e10cSrcweir document.
55cdf0e10cSrcweir */
56cdf0e10cSrcweir void UnregisterDocument (SdDrawDocument& rDocument);
57cdf0e10cSrcweir
58cdf0e10cSrcweir /** Add a listener that is informed of master pages that are newly
59cdf0e10cSrcweir assigned to slides or become unassigned.
60cdf0e10cSrcweir @param rEventListener
61cdf0e10cSrcweir The event listener to call for future events. Call
62cdf0e10cSrcweir RemoveEventListener() before the listener is destroyed.
63cdf0e10cSrcweir */
64cdf0e10cSrcweir void AddEventListener (const Link& rEventListener);
65cdf0e10cSrcweir
66cdf0e10cSrcweir /** Remove the given listener from the list of listeners.
67cdf0e10cSrcweir @param rEventListener
68cdf0e10cSrcweir After this method returns the given listener is not called back
69cdf0e10cSrcweir from this object. Passing a listener that has not
70cdf0e10cSrcweir been registered before is safe and is silently ignored.
71cdf0e10cSrcweir */
72cdf0e10cSrcweir void RemoveEventListener (const Link& rEventListener);
73cdf0e10cSrcweir
74cdf0e10cSrcweir /** Return a set of the names of master pages for the given document.
75cdf0e10cSrcweir This convenience method exists because this set is part of the
76cdf0e10cSrcweir internal data structure and thus takes no time to create.
77cdf0e10cSrcweir */
78cdf0e10cSrcweir inline MasterPageObserver::MasterPageNameSet GetMasterPageNames (
79cdf0e10cSrcweir SdDrawDocument& rDocument);
80cdf0e10cSrcweir
81cdf0e10cSrcweir private:
82cdf0e10cSrcweir ::std::vector<Link> maListeners;
83cdf0e10cSrcweir
84cdf0e10cSrcweir struct DrawDocHash {
operator ()sd::MasterPageObserver::Implementation::DrawDocHash85cdf0e10cSrcweir size_t operator()(SdDrawDocument* argument) const
86cdf0e10cSrcweir { return reinterpret_cast<unsigned long>(argument); }
87cdf0e10cSrcweir };
88cdf0e10cSrcweir typedef ::std::hash_map<SdDrawDocument*,
89cdf0e10cSrcweir MasterPageObserver::MasterPageNameSet,
90cdf0e10cSrcweir DrawDocHash>
91cdf0e10cSrcweir MasterPageContainer;
92cdf0e10cSrcweir MasterPageContainer maUsedMasterPages;
93cdf0e10cSrcweir
94cdf0e10cSrcweir virtual void Notify(
95cdf0e10cSrcweir SfxBroadcaster& rBroadcaster,
96cdf0e10cSrcweir const SfxHint& rHint);
97cdf0e10cSrcweir
98cdf0e10cSrcweir void AnalyzeUsedMasterPages (SdDrawDocument& rDocument);
99cdf0e10cSrcweir
100cdf0e10cSrcweir void SendEvent (MasterPageObserverEvent& rEvent);
101cdf0e10cSrcweir };
102cdf0e10cSrcweir
103cdf0e10cSrcweir MasterPageObserver* MasterPageObserver::Implementation::mpInstance = NULL;
104cdf0e10cSrcweir
105cdf0e10cSrcweir
106cdf0e10cSrcweir
107cdf0e10cSrcweir //===== MasterPageObserver ====================================================
108cdf0e10cSrcweir
Instance(void)109cdf0e10cSrcweir MasterPageObserver& MasterPageObserver::Instance (void)
110cdf0e10cSrcweir {
111cdf0e10cSrcweir if (Implementation::mpInstance == NULL)
112cdf0e10cSrcweir {
113cdf0e10cSrcweir ::osl::GetGlobalMutex aMutexFunctor;
114cdf0e10cSrcweir ::osl::MutexGuard aGuard (aMutexFunctor());
115cdf0e10cSrcweir if (Implementation::mpInstance == NULL)
116cdf0e10cSrcweir {
117cdf0e10cSrcweir MasterPageObserver* pInstance = new MasterPageObserver ();
118cdf0e10cSrcweir SdGlobalResourceContainer::Instance().AddResource (
119cdf0e10cSrcweir ::std::auto_ptr<SdGlobalResource>(pInstance));
120cdf0e10cSrcweir OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
121cdf0e10cSrcweir Implementation::mpInstance = pInstance;
122cdf0e10cSrcweir }
123cdf0e10cSrcweir }
124cdf0e10cSrcweir else
125cdf0e10cSrcweir {
126cdf0e10cSrcweir OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
127cdf0e10cSrcweir }
128cdf0e10cSrcweir
129cdf0e10cSrcweir DBG_ASSERT(Implementation::mpInstance!=NULL,
130cdf0e10cSrcweir "MasterPageObserver::Instance(): instance is NULL");
131cdf0e10cSrcweir return *Implementation::mpInstance;
132cdf0e10cSrcweir }
133cdf0e10cSrcweir
134cdf0e10cSrcweir
135cdf0e10cSrcweir
136cdf0e10cSrcweir
RegisterDocument(SdDrawDocument & rDocument)137cdf0e10cSrcweir void MasterPageObserver::RegisterDocument (SdDrawDocument& rDocument)
138cdf0e10cSrcweir {
139cdf0e10cSrcweir mpImpl->RegisterDocument (rDocument);
140cdf0e10cSrcweir }
141cdf0e10cSrcweir
142cdf0e10cSrcweir
143cdf0e10cSrcweir
144cdf0e10cSrcweir
UnregisterDocument(SdDrawDocument & rDocument)145cdf0e10cSrcweir void MasterPageObserver::UnregisterDocument (SdDrawDocument& rDocument)
146cdf0e10cSrcweir {
147cdf0e10cSrcweir mpImpl->UnregisterDocument (rDocument);
148cdf0e10cSrcweir }
149cdf0e10cSrcweir
150cdf0e10cSrcweir
151cdf0e10cSrcweir
152cdf0e10cSrcweir
AddEventListener(const Link & rEventListener)153cdf0e10cSrcweir void MasterPageObserver::AddEventListener (const Link& rEventListener)
154cdf0e10cSrcweir {
155cdf0e10cSrcweir
156cdf0e10cSrcweir mpImpl->AddEventListener (rEventListener);
157cdf0e10cSrcweir }
158cdf0e10cSrcweir
159cdf0e10cSrcweir
160cdf0e10cSrcweir
161cdf0e10cSrcweir
RemoveEventListener(const Link & rEventListener)162cdf0e10cSrcweir void MasterPageObserver::RemoveEventListener (const Link& rEventListener)
163cdf0e10cSrcweir {
164cdf0e10cSrcweir mpImpl->RemoveEventListener (rEventListener);
165cdf0e10cSrcweir }
166cdf0e10cSrcweir
167cdf0e10cSrcweir
168cdf0e10cSrcweir
169cdf0e10cSrcweir
MasterPageObserver(void)170cdf0e10cSrcweir MasterPageObserver::MasterPageObserver (void)
171cdf0e10cSrcweir : mpImpl (new Implementation())
172cdf0e10cSrcweir {}
173cdf0e10cSrcweir
174cdf0e10cSrcweir
175cdf0e10cSrcweir
176cdf0e10cSrcweir
~MasterPageObserver(void)177cdf0e10cSrcweir MasterPageObserver::~MasterPageObserver (void)
178cdf0e10cSrcweir {}
179cdf0e10cSrcweir
180cdf0e10cSrcweir
181cdf0e10cSrcweir
182cdf0e10cSrcweir
183cdf0e10cSrcweir //===== MasterPageObserver::Implementation ====================================
184cdf0e10cSrcweir
RegisterDocument(SdDrawDocument & rDocument)185cdf0e10cSrcweir void MasterPageObserver::Implementation::RegisterDocument (
186cdf0e10cSrcweir SdDrawDocument& rDocument)
187cdf0e10cSrcweir {
188cdf0e10cSrcweir // Gather the names of all the master pages in the given document.
189cdf0e10cSrcweir MasterPageContainer::data_type aMasterPageSet;
190cdf0e10cSrcweir sal_uInt16 nMasterPageCount = rDocument.GetMasterSdPageCount(PK_STANDARD);
191cdf0e10cSrcweir for (sal_uInt16 nIndex=0; nIndex<nMasterPageCount; nIndex++)
192cdf0e10cSrcweir {
193cdf0e10cSrcweir SdPage* pMasterPage = rDocument.GetMasterSdPage (nIndex, PK_STANDARD);
194cdf0e10cSrcweir if (pMasterPage != NULL)
195cdf0e10cSrcweir aMasterPageSet.insert (pMasterPage->GetName());
196cdf0e10cSrcweir }
197cdf0e10cSrcweir
198cdf0e10cSrcweir maUsedMasterPages[&rDocument] = aMasterPageSet;
199cdf0e10cSrcweir
200cdf0e10cSrcweir StartListening (rDocument);
201cdf0e10cSrcweir }
202cdf0e10cSrcweir
203cdf0e10cSrcweir
204cdf0e10cSrcweir
205cdf0e10cSrcweir
UnregisterDocument(SdDrawDocument & rDocument)206cdf0e10cSrcweir void MasterPageObserver::Implementation::UnregisterDocument (
207cdf0e10cSrcweir SdDrawDocument& rDocument)
208cdf0e10cSrcweir {
209cdf0e10cSrcweir EndListening (rDocument);
210cdf0e10cSrcweir
211cdf0e10cSrcweir MasterPageContainer::iterator aMasterPageDescriptor(maUsedMasterPages.find(&rDocument));
212cdf0e10cSrcweir if(aMasterPageDescriptor != maUsedMasterPages.end())
213cdf0e10cSrcweir maUsedMasterPages.erase(aMasterPageDescriptor);
214cdf0e10cSrcweir }
215cdf0e10cSrcweir
216cdf0e10cSrcweir
217cdf0e10cSrcweir
218cdf0e10cSrcweir
AddEventListener(const Link & rEventListener)219cdf0e10cSrcweir void MasterPageObserver::Implementation::AddEventListener (
220cdf0e10cSrcweir const Link& rEventListener)
221cdf0e10cSrcweir {
222cdf0e10cSrcweir if (::std::find (
223cdf0e10cSrcweir maListeners.begin(),
224cdf0e10cSrcweir maListeners.end(),
225cdf0e10cSrcweir rEventListener) == maListeners.end())
226cdf0e10cSrcweir {
227cdf0e10cSrcweir maListeners.push_back (rEventListener);
228cdf0e10cSrcweir
229cdf0e10cSrcweir // Tell the new listener about all the master pages that are
230cdf0e10cSrcweir // currently in use.
231cdf0e10cSrcweir typedef ::std::vector<String> StringList;
232cdf0e10cSrcweir StringList aNewMasterPages;
233cdf0e10cSrcweir StringList aRemovedMasterPages;
234cdf0e10cSrcweir MasterPageContainer::iterator aDocumentIterator;
235cdf0e10cSrcweir for (aDocumentIterator=maUsedMasterPages.begin();
236cdf0e10cSrcweir aDocumentIterator!=maUsedMasterPages.end();
237cdf0e10cSrcweir ++aDocumentIterator)
238cdf0e10cSrcweir {
239cdf0e10cSrcweir ::std::set<String>::reverse_iterator aNameIterator;
240cdf0e10cSrcweir for (aNameIterator=aDocumentIterator->second.rbegin();
241cdf0e10cSrcweir aNameIterator!=aDocumentIterator->second.rend();
242cdf0e10cSrcweir ++aNameIterator)
243cdf0e10cSrcweir {
244cdf0e10cSrcweir MasterPageObserverEvent aEvent (
245cdf0e10cSrcweir MasterPageObserverEvent::ET_MASTER_PAGE_EXISTS,
246cdf0e10cSrcweir *aDocumentIterator->first,
247cdf0e10cSrcweir *aNameIterator);
248cdf0e10cSrcweir SendEvent (aEvent);
249cdf0e10cSrcweir }
250cdf0e10cSrcweir }
251cdf0e10cSrcweir }
252cdf0e10cSrcweir }
253cdf0e10cSrcweir
254cdf0e10cSrcweir
255cdf0e10cSrcweir
256cdf0e10cSrcweir
RemoveEventListener(const Link & rEventListener)257cdf0e10cSrcweir void MasterPageObserver::Implementation::RemoveEventListener (
258cdf0e10cSrcweir const Link& rEventListener)
259cdf0e10cSrcweir {
260cdf0e10cSrcweir maListeners.erase (
261cdf0e10cSrcweir ::std::find (
262cdf0e10cSrcweir maListeners.begin(),
263cdf0e10cSrcweir maListeners.end(),
264cdf0e10cSrcweir rEventListener));
265cdf0e10cSrcweir }
266cdf0e10cSrcweir
267cdf0e10cSrcweir
268cdf0e10cSrcweir
269cdf0e10cSrcweir
270cdf0e10cSrcweir MasterPageObserver::MasterPageNameSet
GetMasterPageNames(SdDrawDocument & rDocument)271cdf0e10cSrcweir MasterPageObserver::Implementation::GetMasterPageNames (
272cdf0e10cSrcweir SdDrawDocument& rDocument)
273cdf0e10cSrcweir {
274cdf0e10cSrcweir MasterPageContainer::iterator aMasterPageDescriptor (
275cdf0e10cSrcweir maUsedMasterPages.find(&rDocument));
276cdf0e10cSrcweir if (aMasterPageDescriptor != maUsedMasterPages.end())
277cdf0e10cSrcweir return aMasterPageDescriptor->second;
278cdf0e10cSrcweir else
279cdf0e10cSrcweir // Not found so return an empty set.
280cdf0e10cSrcweir return MasterPageObserver::MasterPageNameSet();
281cdf0e10cSrcweir }
282cdf0e10cSrcweir
283cdf0e10cSrcweir
284cdf0e10cSrcweir
285cdf0e10cSrcweir
Notify(SfxBroadcaster & rBroadcaster,const SfxHint & rHint)286cdf0e10cSrcweir void MasterPageObserver::Implementation::Notify(
287cdf0e10cSrcweir SfxBroadcaster& rBroadcaster,
288cdf0e10cSrcweir const SfxHint& rHint)
289cdf0e10cSrcweir {
290cdf0e10cSrcweir if (rHint.ISA(SdrHint))
291cdf0e10cSrcweir {
292cdf0e10cSrcweir SdrHint& rSdrHint (*PTR_CAST(SdrHint,&rHint));
293cdf0e10cSrcweir switch (rSdrHint.GetKind())
294cdf0e10cSrcweir {
295cdf0e10cSrcweir case HINT_PAGEORDERCHG:
296cdf0e10cSrcweir // Process the modified set of pages only when the number of
297cdf0e10cSrcweir // standard and notes master pages are equal. This test
298cdf0e10cSrcweir // filters out events that are sent in between the insertion
299cdf0e10cSrcweir // of a new standard master page and a new notes master
300cdf0e10cSrcweir // page.
301cdf0e10cSrcweir if (rBroadcaster.ISA(SdDrawDocument))
302cdf0e10cSrcweir {
303cdf0e10cSrcweir SdDrawDocument& rDocument (
304cdf0e10cSrcweir static_cast<SdDrawDocument&>(rBroadcaster));
305cdf0e10cSrcweir if (rDocument.GetMasterSdPageCount(PK_STANDARD)
306cdf0e10cSrcweir == rDocument.GetMasterSdPageCount(PK_NOTES))
307cdf0e10cSrcweir {
308cdf0e10cSrcweir AnalyzeUsedMasterPages (rDocument);
309cdf0e10cSrcweir }
310cdf0e10cSrcweir }
311cdf0e10cSrcweir break;
312cdf0e10cSrcweir
313cdf0e10cSrcweir default:
314cdf0e10cSrcweir break;
315cdf0e10cSrcweir }
316cdf0e10cSrcweir }
317cdf0e10cSrcweir }
318cdf0e10cSrcweir
319cdf0e10cSrcweir
320cdf0e10cSrcweir
321cdf0e10cSrcweir
AnalyzeUsedMasterPages(SdDrawDocument & rDocument)322cdf0e10cSrcweir void MasterPageObserver::Implementation::AnalyzeUsedMasterPages (
323cdf0e10cSrcweir SdDrawDocument& rDocument)
324cdf0e10cSrcweir {
325cdf0e10cSrcweir // Create a set of names of the master pages used by the given document.
326cdf0e10cSrcweir sal_uInt16 nMasterPageCount = rDocument.GetMasterSdPageCount(PK_STANDARD);
327cdf0e10cSrcweir ::std::set<String> aCurrentMasterPages;
328cdf0e10cSrcweir for (sal_uInt16 nIndex=0; nIndex<nMasterPageCount; nIndex++)
329cdf0e10cSrcweir {
330cdf0e10cSrcweir SdPage* pMasterPage = rDocument.GetMasterSdPage (nIndex, PK_STANDARD);
331cdf0e10cSrcweir if (pMasterPage != NULL)
332cdf0e10cSrcweir aCurrentMasterPages.insert (pMasterPage->GetName());
333cdf0e10cSrcweir OSL_TRACE("currently used master page %d is %s",
334cdf0e10cSrcweir nIndex,
335cdf0e10cSrcweir ::rtl::OUStringToOString(pMasterPage->GetName(),
336cdf0e10cSrcweir RTL_TEXTENCODING_UTF8).getStr());
337cdf0e10cSrcweir }
338cdf0e10cSrcweir
339cdf0e10cSrcweir typedef ::std::vector<String> StringList;
340cdf0e10cSrcweir StringList aNewMasterPages;
341cdf0e10cSrcweir StringList aRemovedMasterPages;
342cdf0e10cSrcweir MasterPageContainer::iterator aOldMasterPagesDescriptor (
343cdf0e10cSrcweir maUsedMasterPages.find(&rDocument));
344cdf0e10cSrcweir if (aOldMasterPagesDescriptor != maUsedMasterPages.end())
345cdf0e10cSrcweir {
346cdf0e10cSrcweir StringList::iterator I;
347cdf0e10cSrcweir
348cdf0e10cSrcweir ::std::set<String>::iterator J;
349cdf0e10cSrcweir int i=0;
350cdf0e10cSrcweir for (J=aOldMasterPagesDescriptor->second.begin();
351cdf0e10cSrcweir J!=aOldMasterPagesDescriptor->second.end();
352cdf0e10cSrcweir ++J)
353cdf0e10cSrcweir OSL_TRACE("old used master page %d is %s",
354cdf0e10cSrcweir i++,
355cdf0e10cSrcweir ::rtl::OUStringToOString(*J,
356cdf0e10cSrcweir RTL_TEXTENCODING_UTF8).getStr());
357cdf0e10cSrcweir
358cdf0e10cSrcweir // Send events about the newly used master pages.
359cdf0e10cSrcweir ::std::set_difference (
360cdf0e10cSrcweir aCurrentMasterPages.begin(),
361cdf0e10cSrcweir aCurrentMasterPages.end(),
362cdf0e10cSrcweir aOldMasterPagesDescriptor->second.begin(),
363cdf0e10cSrcweir aOldMasterPagesDescriptor->second.end(),
364cdf0e10cSrcweir ::std::back_insert_iterator<StringList>(aNewMasterPages));
365cdf0e10cSrcweir for (I=aNewMasterPages.begin(); I!=aNewMasterPages.end(); ++I)
366cdf0e10cSrcweir {
367cdf0e10cSrcweir OSL_TRACE(" added master page %s",
368cdf0e10cSrcweir ::rtl::OUStringToOString(*I,
369cdf0e10cSrcweir RTL_TEXTENCODING_UTF8).getStr());
370cdf0e10cSrcweir
371cdf0e10cSrcweir MasterPageObserverEvent aEvent (
372cdf0e10cSrcweir MasterPageObserverEvent::ET_MASTER_PAGE_ADDED,
373cdf0e10cSrcweir rDocument,
374cdf0e10cSrcweir *I);
375cdf0e10cSrcweir SendEvent (aEvent);
376cdf0e10cSrcweir }
377cdf0e10cSrcweir
378cdf0e10cSrcweir // Send events about master pages that are not used any longer.
379cdf0e10cSrcweir ::std::set_difference (
380cdf0e10cSrcweir aOldMasterPagesDescriptor->second.begin(),
381cdf0e10cSrcweir aOldMasterPagesDescriptor->second.end(),
382cdf0e10cSrcweir aCurrentMasterPages.begin(),
383cdf0e10cSrcweir aCurrentMasterPages.end(),
384cdf0e10cSrcweir ::std::back_insert_iterator<StringList>(aRemovedMasterPages));
385cdf0e10cSrcweir for (I=aRemovedMasterPages.begin(); I!=aRemovedMasterPages.end(); ++I)
386cdf0e10cSrcweir {
387cdf0e10cSrcweir OSL_TRACE(" removed master page %s",
388cdf0e10cSrcweir ::rtl::OUStringToOString(*I,
389cdf0e10cSrcweir RTL_TEXTENCODING_UTF8).getStr());
390cdf0e10cSrcweir
391cdf0e10cSrcweir MasterPageObserverEvent aEvent (
392cdf0e10cSrcweir MasterPageObserverEvent::ET_MASTER_PAGE_REMOVED,
393cdf0e10cSrcweir rDocument,
394cdf0e10cSrcweir *I);
395cdf0e10cSrcweir SendEvent (aEvent);
396cdf0e10cSrcweir }
397cdf0e10cSrcweir
398cdf0e10cSrcweir // Store the new list of master pages.
399cdf0e10cSrcweir aOldMasterPagesDescriptor->second = aCurrentMasterPages;
400cdf0e10cSrcweir }
401cdf0e10cSrcweir }
402cdf0e10cSrcweir
403cdf0e10cSrcweir
404cdf0e10cSrcweir
405cdf0e10cSrcweir
SendEvent(MasterPageObserverEvent & rEvent)406cdf0e10cSrcweir void MasterPageObserver::Implementation::SendEvent (
407cdf0e10cSrcweir MasterPageObserverEvent& rEvent)
408cdf0e10cSrcweir {
409cdf0e10cSrcweir ::std::vector<Link>::iterator aLink (maListeners.begin());
410cdf0e10cSrcweir ::std::vector<Link>::iterator aEnd (maListeners.end());
411cdf0e10cSrcweir while (aLink!=aEnd)
412cdf0e10cSrcweir {
413cdf0e10cSrcweir aLink->Call (&rEvent);
414cdf0e10cSrcweir ++aLink;
415cdf0e10cSrcweir }
416cdf0e10cSrcweir }
417cdf0e10cSrcweir
418cdf0e10cSrcweir
419cdf0e10cSrcweir } // end of namespace sd
420