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