xref: /trunk/main/sd/source/ui/sidebar/MasterPageObserver.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
102c50d82SAndre Fischer /**************************************************************
202c50d82SAndre Fischer  *
302c50d82SAndre Fischer  * Licensed to the Apache Software Foundation (ASF) under one
402c50d82SAndre Fischer  * or more contributor license agreements.  See the NOTICE file
502c50d82SAndre Fischer  * distributed with this work for additional information
602c50d82SAndre Fischer  * regarding copyright ownership.  The ASF licenses this file
702c50d82SAndre Fischer  * to you under the Apache License, Version 2.0 (the
802c50d82SAndre Fischer  * "License"); you may not use this file except in compliance
902c50d82SAndre Fischer  * with the License.  You may obtain a copy of the License at
1002c50d82SAndre Fischer  *
1102c50d82SAndre Fischer  *   http://www.apache.org/licenses/LICENSE-2.0
1202c50d82SAndre Fischer  *
1302c50d82SAndre Fischer  * Unless required by applicable law or agreed to in writing,
1402c50d82SAndre Fischer  * software distributed under the License is distributed on an
1502c50d82SAndre Fischer  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1602c50d82SAndre Fischer  * KIND, either express or implied.  See the License for the
1702c50d82SAndre Fischer  * specific language governing permissions and limitations
1802c50d82SAndre Fischer  * under the License.
1902c50d82SAndre Fischer  *
2002c50d82SAndre Fischer  *************************************************************/
2102c50d82SAndre Fischer 
2202c50d82SAndre Fischer #include "precompiled_sd.hxx"
2302c50d82SAndre Fischer 
2402c50d82SAndre Fischer #include "MasterPageObserver.hxx"
2502c50d82SAndre Fischer 
2602c50d82SAndre Fischer #include <algorithm>
2702c50d82SAndre Fischer #include "drawdoc.hxx"
2802c50d82SAndre Fischer #include "sdpage.hxx"
2902c50d82SAndre Fischer #include <hash_map>
3002c50d82SAndre Fischer #include <set>
3102c50d82SAndre Fischer #include <vector>
3202c50d82SAndre Fischer #include <svl/lstner.hxx>
3302c50d82SAndre Fischer #include <osl/doublecheckedlocking.h>
3402c50d82SAndre Fischer #include <osl/getglobalmutex.hxx>
3502c50d82SAndre Fischer 
3602c50d82SAndre Fischer 
3702c50d82SAndre Fischer namespace sd {
3802c50d82SAndre Fischer 
3902c50d82SAndre Fischer class MasterPageObserver::Implementation
4002c50d82SAndre Fischer     : public SfxListener
4102c50d82SAndre Fischer {
4202c50d82SAndre Fischer public:
4302c50d82SAndre Fischer     /** The single instance of this class.  It is created on demand when
4402c50d82SAndre Fischer         Instance() is called for the first time.
4502c50d82SAndre Fischer     */
4602c50d82SAndre Fischer     static MasterPageObserver* mpInstance;
4702c50d82SAndre Fischer 
4802c50d82SAndre Fischer     /** The master page observer will listen to events of this document and
4902c50d82SAndre Fischer         detect changes of the use of master pages.
5002c50d82SAndre Fischer     */
5102c50d82SAndre Fischer     void RegisterDocument (SdDrawDocument& rDocument);
5202c50d82SAndre Fischer 
5302c50d82SAndre Fischer     /** The master page observer will stop to listen to events of this
5402c50d82SAndre Fischer         document.
5502c50d82SAndre Fischer     */
5602c50d82SAndre Fischer     void UnregisterDocument (SdDrawDocument& rDocument);
5702c50d82SAndre Fischer 
5802c50d82SAndre Fischer     /** Add a listener that is informed of master pages that are newly
5902c50d82SAndre Fischer         assigned to slides or become unassigned.
6002c50d82SAndre Fischer         @param rEventListener
6102c50d82SAndre Fischer             The event listener to call for future events.  Call
6202c50d82SAndre Fischer             RemoveEventListener() before the listener is destroyed.
6302c50d82SAndre Fischer     */
6402c50d82SAndre Fischer     void AddEventListener (const Link& rEventListener);
6502c50d82SAndre Fischer 
6602c50d82SAndre Fischer     /** Remove the given listener from the list of listeners.
6702c50d82SAndre Fischer         @param rEventListener
6802c50d82SAndre Fischer             After this method returns the given listener is not called back
6902c50d82SAndre Fischer             from this object.  Passing a listener that has not
7002c50d82SAndre Fischer             been registered before is safe and is silently ignored.
7102c50d82SAndre Fischer     */
7202c50d82SAndre Fischer     void RemoveEventListener (const Link& rEventListener);
7302c50d82SAndre Fischer 
7402c50d82SAndre Fischer     /** Return a set of the names of master pages for the given document.
7502c50d82SAndre Fischer         This convenience method exists because this set is part of the
7602c50d82SAndre Fischer         internal data structure and thus takes no time to create.
7702c50d82SAndre Fischer     */
7802c50d82SAndre Fischer     inline MasterPageObserver::MasterPageNameSet GetMasterPageNames (
7902c50d82SAndre Fischer         SdDrawDocument& rDocument);
8002c50d82SAndre Fischer 
8102c50d82SAndre Fischer private:
8202c50d82SAndre Fischer     ::std::vector<Link> maListeners;
8302c50d82SAndre Fischer 
8402c50d82SAndre Fischer     struct DrawDocHash {
operator ()sd::MasterPageObserver::Implementation::DrawDocHash8502c50d82SAndre Fischer         size_t operator()(SdDrawDocument* argument) const
8602c50d82SAndre Fischer         { return reinterpret_cast<unsigned long>(argument); }
8702c50d82SAndre Fischer     };
8802c50d82SAndre Fischer     typedef ::std::hash_map<SdDrawDocument*,
8902c50d82SAndre Fischer                             MasterPageObserver::MasterPageNameSet,
9002c50d82SAndre Fischer                             DrawDocHash>
9102c50d82SAndre Fischer         MasterPageContainer;
9202c50d82SAndre Fischer     MasterPageContainer maUsedMasterPages;
9302c50d82SAndre Fischer 
9402c50d82SAndre Fischer     virtual void Notify(
9502c50d82SAndre Fischer         SfxBroadcaster& rBroadcaster,
9602c50d82SAndre Fischer         const SfxHint& rHint);
9702c50d82SAndre Fischer 
9802c50d82SAndre Fischer     void AnalyzeUsedMasterPages (SdDrawDocument& rDocument);
9902c50d82SAndre Fischer 
10002c50d82SAndre Fischer     void SendEvent (MasterPageObserverEvent& rEvent);
10102c50d82SAndre Fischer };
10202c50d82SAndre Fischer 
10302c50d82SAndre Fischer MasterPageObserver* MasterPageObserver::Implementation::mpInstance = NULL;
10402c50d82SAndre Fischer 
10502c50d82SAndre Fischer 
10602c50d82SAndre Fischer 
10702c50d82SAndre Fischer //===== MasterPageObserver ====================================================
10802c50d82SAndre Fischer 
Instance(void)10902c50d82SAndre Fischer MasterPageObserver&  MasterPageObserver::Instance (void)
11002c50d82SAndre Fischer {
11102c50d82SAndre Fischer     if (Implementation::mpInstance == NULL)
11202c50d82SAndre Fischer     {
11302c50d82SAndre Fischer         ::osl::GetGlobalMutex aMutexFunctor;
11402c50d82SAndre Fischer         ::osl::MutexGuard aGuard (aMutexFunctor());
11502c50d82SAndre Fischer         if (Implementation::mpInstance == NULL)
11602c50d82SAndre Fischer         {
11702c50d82SAndre Fischer             MasterPageObserver* pInstance = new MasterPageObserver ();
11802c50d82SAndre Fischer             SdGlobalResourceContainer::Instance().AddResource (
11902c50d82SAndre Fischer                 ::std::auto_ptr<SdGlobalResource>(pInstance));
12002c50d82SAndre Fischer             OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
12102c50d82SAndre Fischer             Implementation::mpInstance = pInstance;
12202c50d82SAndre Fischer         }
12302c50d82SAndre Fischer     }
12402c50d82SAndre Fischer     else
12502c50d82SAndre Fischer     {
12602c50d82SAndre Fischer         OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
12702c50d82SAndre Fischer     }
12802c50d82SAndre Fischer 
12902c50d82SAndre Fischer     DBG_ASSERT(Implementation::mpInstance!=NULL,
13002c50d82SAndre Fischer         "MasterPageObserver::Instance(): instance is NULL");
13102c50d82SAndre Fischer     return *Implementation::mpInstance;
13202c50d82SAndre Fischer }
13302c50d82SAndre Fischer 
13402c50d82SAndre Fischer 
13502c50d82SAndre Fischer 
13602c50d82SAndre Fischer 
RegisterDocument(SdDrawDocument & rDocument)13702c50d82SAndre Fischer void MasterPageObserver::RegisterDocument (SdDrawDocument& rDocument)
13802c50d82SAndre Fischer {
13902c50d82SAndre Fischer     mpImpl->RegisterDocument (rDocument);
14002c50d82SAndre Fischer }
14102c50d82SAndre Fischer 
14202c50d82SAndre Fischer 
14302c50d82SAndre Fischer 
14402c50d82SAndre Fischer 
UnregisterDocument(SdDrawDocument & rDocument)14502c50d82SAndre Fischer void MasterPageObserver::UnregisterDocument (SdDrawDocument& rDocument)
14602c50d82SAndre Fischer {
14702c50d82SAndre Fischer     mpImpl->UnregisterDocument (rDocument);
14802c50d82SAndre Fischer }
14902c50d82SAndre Fischer 
15002c50d82SAndre Fischer 
15102c50d82SAndre Fischer 
15202c50d82SAndre Fischer 
AddEventListener(const Link & rEventListener)15302c50d82SAndre Fischer void MasterPageObserver::AddEventListener (const Link& rEventListener)
15402c50d82SAndre Fischer {
15502c50d82SAndre Fischer 
15602c50d82SAndre Fischer     mpImpl->AddEventListener (rEventListener);
15702c50d82SAndre Fischer }
15802c50d82SAndre Fischer 
15902c50d82SAndre Fischer 
16002c50d82SAndre Fischer 
16102c50d82SAndre Fischer 
RemoveEventListener(const Link & rEventListener)16202c50d82SAndre Fischer void MasterPageObserver::RemoveEventListener (const Link& rEventListener)
16302c50d82SAndre Fischer {
16402c50d82SAndre Fischer     mpImpl->RemoveEventListener (rEventListener);
16502c50d82SAndre Fischer }
16602c50d82SAndre Fischer 
16702c50d82SAndre Fischer 
16802c50d82SAndre Fischer 
16902c50d82SAndre Fischer 
MasterPageObserver(void)17002c50d82SAndre Fischer MasterPageObserver::MasterPageObserver (void)
17102c50d82SAndre Fischer     : mpImpl (new Implementation())
17202c50d82SAndre Fischer {}
17302c50d82SAndre Fischer 
17402c50d82SAndre Fischer 
17502c50d82SAndre Fischer 
17602c50d82SAndre Fischer 
~MasterPageObserver(void)17702c50d82SAndre Fischer MasterPageObserver::~MasterPageObserver (void)
17802c50d82SAndre Fischer {}
17902c50d82SAndre Fischer 
18002c50d82SAndre Fischer 
18102c50d82SAndre Fischer 
18202c50d82SAndre Fischer 
18302c50d82SAndre Fischer //===== MasterPageObserver::Implementation ====================================
18402c50d82SAndre Fischer 
RegisterDocument(SdDrawDocument & rDocument)18502c50d82SAndre Fischer void MasterPageObserver::Implementation::RegisterDocument (
18602c50d82SAndre Fischer     SdDrawDocument& rDocument)
18702c50d82SAndre Fischer {
18802c50d82SAndre Fischer     // Gather the names of all the master pages in the given document.
189*2fb14843SHerbert Dürr     MasterPageContainer::mapped_type aMasterPageSet;
19002c50d82SAndre Fischer     sal_uInt16 nMasterPageCount = rDocument.GetMasterSdPageCount(PK_STANDARD);
19102c50d82SAndre Fischer     for (sal_uInt16 nIndex=0; nIndex<nMasterPageCount; nIndex++)
19202c50d82SAndre Fischer     {
19302c50d82SAndre Fischer         SdPage* pMasterPage = rDocument.GetMasterSdPage (nIndex, PK_STANDARD);
19402c50d82SAndre Fischer         if (pMasterPage != NULL)
19502c50d82SAndre Fischer             aMasterPageSet.insert (pMasterPage->GetName());
19602c50d82SAndre Fischer     }
19702c50d82SAndre Fischer 
19802c50d82SAndre Fischer     maUsedMasterPages[&rDocument] = aMasterPageSet;
19902c50d82SAndre Fischer 
20002c50d82SAndre Fischer     StartListening (rDocument);
20102c50d82SAndre Fischer }
20202c50d82SAndre Fischer 
20302c50d82SAndre Fischer 
20402c50d82SAndre Fischer 
20502c50d82SAndre Fischer 
UnregisterDocument(SdDrawDocument & rDocument)20602c50d82SAndre Fischer void MasterPageObserver::Implementation::UnregisterDocument (
20702c50d82SAndre Fischer     SdDrawDocument& rDocument)
20802c50d82SAndre Fischer {
20902c50d82SAndre Fischer     EndListening (rDocument);
21002c50d82SAndre Fischer 
21102c50d82SAndre Fischer     MasterPageContainer::iterator aMasterPageDescriptor(maUsedMasterPages.find(&rDocument));
21202c50d82SAndre Fischer     if(aMasterPageDescriptor != maUsedMasterPages.end())
21302c50d82SAndre Fischer         maUsedMasterPages.erase(aMasterPageDescriptor);
21402c50d82SAndre Fischer }
21502c50d82SAndre Fischer 
21602c50d82SAndre Fischer 
21702c50d82SAndre Fischer 
21802c50d82SAndre Fischer 
AddEventListener(const Link & rEventListener)21902c50d82SAndre Fischer void MasterPageObserver::Implementation::AddEventListener (
22002c50d82SAndre Fischer     const Link& rEventListener)
22102c50d82SAndre Fischer {
22202c50d82SAndre Fischer     if (::std::find (
22302c50d82SAndre Fischer         maListeners.begin(),
22402c50d82SAndre Fischer         maListeners.end(),
22502c50d82SAndre Fischer         rEventListener) == maListeners.end())
22602c50d82SAndre Fischer     {
22702c50d82SAndre Fischer         maListeners.push_back (rEventListener);
22802c50d82SAndre Fischer 
22902c50d82SAndre Fischer         // Tell the new listener about all the master pages that are
23002c50d82SAndre Fischer         // currently in use.
23102c50d82SAndre Fischer         typedef ::std::vector<String> StringList;
23202c50d82SAndre Fischer         StringList aNewMasterPages;
23302c50d82SAndre Fischer         StringList aRemovedMasterPages;
23402c50d82SAndre Fischer         MasterPageContainer::iterator aDocumentIterator;
23502c50d82SAndre Fischer         for (aDocumentIterator=maUsedMasterPages.begin();
23602c50d82SAndre Fischer              aDocumentIterator!=maUsedMasterPages.end();
23702c50d82SAndre Fischer              ++aDocumentIterator)
23802c50d82SAndre Fischer         {
23902c50d82SAndre Fischer             ::std::set<String>::reverse_iterator aNameIterator;
24002c50d82SAndre Fischer             for (aNameIterator=aDocumentIterator->second.rbegin();
24102c50d82SAndre Fischer                  aNameIterator!=aDocumentIterator->second.rend();
24202c50d82SAndre Fischer                  ++aNameIterator)
24302c50d82SAndre Fischer             {
24402c50d82SAndre Fischer               MasterPageObserverEvent aEvent (
24502c50d82SAndre Fischer                   MasterPageObserverEvent::ET_MASTER_PAGE_EXISTS,
24602c50d82SAndre Fischer                   *aDocumentIterator->first,
24702c50d82SAndre Fischer                   *aNameIterator);
24802c50d82SAndre Fischer               SendEvent (aEvent);
24902c50d82SAndre Fischer             }
25002c50d82SAndre Fischer         }
25102c50d82SAndre Fischer     }
25202c50d82SAndre Fischer }
25302c50d82SAndre Fischer 
25402c50d82SAndre Fischer 
25502c50d82SAndre Fischer 
25602c50d82SAndre Fischer 
RemoveEventListener(const Link & rEventListener)25702c50d82SAndre Fischer void MasterPageObserver::Implementation::RemoveEventListener (
25802c50d82SAndre Fischer     const Link& rEventListener)
25902c50d82SAndre Fischer {
26002c50d82SAndre Fischer     maListeners.erase (
26102c50d82SAndre Fischer         ::std::find (
26202c50d82SAndre Fischer             maListeners.begin(),
26302c50d82SAndre Fischer             maListeners.end(),
26402c50d82SAndre Fischer             rEventListener));
26502c50d82SAndre Fischer }
26602c50d82SAndre Fischer 
26702c50d82SAndre Fischer 
26802c50d82SAndre Fischer 
26902c50d82SAndre Fischer 
27002c50d82SAndre Fischer MasterPageObserver::MasterPageNameSet
GetMasterPageNames(SdDrawDocument & rDocument)27102c50d82SAndre Fischer     MasterPageObserver::Implementation::GetMasterPageNames (
27202c50d82SAndre Fischer         SdDrawDocument& rDocument)
27302c50d82SAndre Fischer {
27402c50d82SAndre Fischer     MasterPageContainer::iterator aMasterPageDescriptor (
27502c50d82SAndre Fischer         maUsedMasterPages.find(&rDocument));
27602c50d82SAndre Fischer     if (aMasterPageDescriptor != maUsedMasterPages.end())
27702c50d82SAndre Fischer         return aMasterPageDescriptor->second;
27802c50d82SAndre Fischer     else
27902c50d82SAndre Fischer         // Not found so return an empty set.
28002c50d82SAndre Fischer         return MasterPageObserver::MasterPageNameSet();
28102c50d82SAndre Fischer }
28202c50d82SAndre Fischer 
28302c50d82SAndre Fischer 
28402c50d82SAndre Fischer 
28502c50d82SAndre Fischer 
Notify(SfxBroadcaster & rBroadcaster,const SfxHint & rHint)28602c50d82SAndre Fischer void MasterPageObserver::Implementation::Notify(
28702c50d82SAndre Fischer     SfxBroadcaster& rBroadcaster,
28802c50d82SAndre Fischer     const SfxHint& rHint)
28902c50d82SAndre Fischer {
29002c50d82SAndre Fischer     if (rHint.ISA(SdrHint))
29102c50d82SAndre Fischer     {
29202c50d82SAndre Fischer         SdrHint& rSdrHint (*PTR_CAST(SdrHint,&rHint));
29302c50d82SAndre Fischer         switch (rSdrHint.GetKind())
29402c50d82SAndre Fischer         {
29502c50d82SAndre Fischer             case HINT_PAGEORDERCHG:
29602c50d82SAndre Fischer                 // Process the modified set of pages only when the number of
29702c50d82SAndre Fischer                 // standard and notes master pages are equal.  This test
29802c50d82SAndre Fischer                 // filters out events that are sent in between the insertion
29902c50d82SAndre Fischer                 // of a new standard master page and a new notes master
30002c50d82SAndre Fischer                 // page.
30102c50d82SAndre Fischer                 if (rBroadcaster.ISA(SdDrawDocument))
30202c50d82SAndre Fischer                 {
30302c50d82SAndre Fischer                     SdDrawDocument& rDocument (
30402c50d82SAndre Fischer                         static_cast<SdDrawDocument&>(rBroadcaster));
30502c50d82SAndre Fischer                     if (rDocument.GetMasterSdPageCount(PK_STANDARD)
30602c50d82SAndre Fischer                         == rDocument.GetMasterSdPageCount(PK_NOTES))
30702c50d82SAndre Fischer                     {
30802c50d82SAndre Fischer                         AnalyzeUsedMasterPages (rDocument);
30902c50d82SAndre Fischer                     }
31002c50d82SAndre Fischer                 }
31102c50d82SAndre Fischer                 break;
31202c50d82SAndre Fischer 
31302c50d82SAndre Fischer             default:
31402c50d82SAndre Fischer                 break;
31502c50d82SAndre Fischer         }
31602c50d82SAndre Fischer     }
31702c50d82SAndre Fischer }
31802c50d82SAndre Fischer 
31902c50d82SAndre Fischer 
32002c50d82SAndre Fischer 
32102c50d82SAndre Fischer 
AnalyzeUsedMasterPages(SdDrawDocument & rDocument)32202c50d82SAndre Fischer void MasterPageObserver::Implementation::AnalyzeUsedMasterPages (
32302c50d82SAndre Fischer     SdDrawDocument& rDocument)
32402c50d82SAndre Fischer {
32502c50d82SAndre Fischer     // Create a set of names of the master pages used by the given document.
32602c50d82SAndre Fischer     sal_uInt16 nMasterPageCount = rDocument.GetMasterSdPageCount(PK_STANDARD);
32702c50d82SAndre Fischer     ::std::set<String> aCurrentMasterPages;
32802c50d82SAndre Fischer     for (sal_uInt16 nIndex=0; nIndex<nMasterPageCount; nIndex++)
32902c50d82SAndre Fischer     {
33002c50d82SAndre Fischer         SdPage* pMasterPage = rDocument.GetMasterSdPage (nIndex, PK_STANDARD);
33102c50d82SAndre Fischer         if (pMasterPage != NULL)
33202c50d82SAndre Fischer             aCurrentMasterPages.insert (pMasterPage->GetName());
33302c50d82SAndre Fischer         OSL_TRACE("currently used master page %d is %s",
33402c50d82SAndre Fischer             nIndex,
33502c50d82SAndre Fischer             ::rtl::OUStringToOString(pMasterPage->GetName(),
33602c50d82SAndre Fischer                 RTL_TEXTENCODING_UTF8).getStr());
33702c50d82SAndre Fischer     }
33802c50d82SAndre Fischer 
33902c50d82SAndre Fischer     typedef ::std::vector<String> StringList;
34002c50d82SAndre Fischer     StringList aNewMasterPages;
34102c50d82SAndre Fischer     StringList aRemovedMasterPages;
34202c50d82SAndre Fischer     MasterPageContainer::iterator aOldMasterPagesDescriptor (
34302c50d82SAndre Fischer         maUsedMasterPages.find(&rDocument));
34402c50d82SAndre Fischer     if (aOldMasterPagesDescriptor != maUsedMasterPages.end())
34502c50d82SAndre Fischer     {
34602c50d82SAndre Fischer         StringList::iterator I;
34702c50d82SAndre Fischer 
34802c50d82SAndre Fischer         ::std::set<String>::iterator J;
34902c50d82SAndre Fischer         int i=0;
35002c50d82SAndre Fischer         for (J=aOldMasterPagesDescriptor->second.begin();
35102c50d82SAndre Fischer              J!=aOldMasterPagesDescriptor->second.end();
35202c50d82SAndre Fischer              ++J)
35302c50d82SAndre Fischer             OSL_TRACE("old used master page %d is %s",
35402c50d82SAndre Fischer             i++,
35502c50d82SAndre Fischer             ::rtl::OUStringToOString(*J,
35602c50d82SAndre Fischer                 RTL_TEXTENCODING_UTF8).getStr());
35702c50d82SAndre Fischer 
35802c50d82SAndre Fischer         // Send events about the newly used master pages.
35902c50d82SAndre Fischer         ::std::set_difference (
36002c50d82SAndre Fischer             aCurrentMasterPages.begin(),
36102c50d82SAndre Fischer             aCurrentMasterPages.end(),
36202c50d82SAndre Fischer             aOldMasterPagesDescriptor->second.begin(),
36302c50d82SAndre Fischer             aOldMasterPagesDescriptor->second.end(),
36402c50d82SAndre Fischer             ::std::back_insert_iterator<StringList>(aNewMasterPages));
36502c50d82SAndre Fischer         for (I=aNewMasterPages.begin(); I!=aNewMasterPages.end(); ++I)
36602c50d82SAndre Fischer         {
36702c50d82SAndre Fischer             OSL_TRACE("    added master page %s",
36802c50d82SAndre Fischer                 ::rtl::OUStringToOString(*I,
36902c50d82SAndre Fischer                     RTL_TEXTENCODING_UTF8).getStr());
37002c50d82SAndre Fischer 
37102c50d82SAndre Fischer             MasterPageObserverEvent aEvent (
37202c50d82SAndre Fischer                 MasterPageObserverEvent::ET_MASTER_PAGE_ADDED,
37302c50d82SAndre Fischer                 rDocument,
37402c50d82SAndre Fischer                 *I);
37502c50d82SAndre Fischer             SendEvent (aEvent);
37602c50d82SAndre Fischer         }
37702c50d82SAndre Fischer 
37802c50d82SAndre Fischer         // Send events about master pages that are not used any longer.
37902c50d82SAndre Fischer         ::std::set_difference (
38002c50d82SAndre Fischer             aOldMasterPagesDescriptor->second.begin(),
38102c50d82SAndre Fischer             aOldMasterPagesDescriptor->second.end(),
38202c50d82SAndre Fischer             aCurrentMasterPages.begin(),
38302c50d82SAndre Fischer             aCurrentMasterPages.end(),
38402c50d82SAndre Fischer             ::std::back_insert_iterator<StringList>(aRemovedMasterPages));
38502c50d82SAndre Fischer         for (I=aRemovedMasterPages.begin(); I!=aRemovedMasterPages.end(); ++I)
38602c50d82SAndre Fischer         {
38702c50d82SAndre Fischer             OSL_TRACE("    removed master page %s",
38802c50d82SAndre Fischer                 ::rtl::OUStringToOString(*I,
38902c50d82SAndre Fischer                     RTL_TEXTENCODING_UTF8).getStr());
39002c50d82SAndre Fischer 
39102c50d82SAndre Fischer             MasterPageObserverEvent aEvent (
39202c50d82SAndre Fischer                 MasterPageObserverEvent::ET_MASTER_PAGE_REMOVED,
39302c50d82SAndre Fischer                 rDocument,
39402c50d82SAndre Fischer                 *I);
39502c50d82SAndre Fischer             SendEvent (aEvent);
39602c50d82SAndre Fischer         }
39702c50d82SAndre Fischer 
39802c50d82SAndre Fischer         // Store the new list of master pages.
39902c50d82SAndre Fischer         aOldMasterPagesDescriptor->second = aCurrentMasterPages;
40002c50d82SAndre Fischer     }
40102c50d82SAndre Fischer }
40202c50d82SAndre Fischer 
40302c50d82SAndre Fischer 
40402c50d82SAndre Fischer 
40502c50d82SAndre Fischer 
SendEvent(MasterPageObserverEvent & rEvent)40602c50d82SAndre Fischer void MasterPageObserver::Implementation::SendEvent (
40702c50d82SAndre Fischer     MasterPageObserverEvent& rEvent)
40802c50d82SAndre Fischer {
40902c50d82SAndre Fischer     ::std::vector<Link>::iterator aLink (maListeners.begin());
41002c50d82SAndre Fischer     ::std::vector<Link>::iterator aEnd (maListeners.end());
41102c50d82SAndre Fischer     while (aLink!=aEnd)
41202c50d82SAndre Fischer     {
41302c50d82SAndre Fischer         aLink->Call (&rEvent);
41402c50d82SAndre Fischer         ++aLink;
41502c50d82SAndre Fischer     }
41602c50d82SAndre Fischer }
41702c50d82SAndre Fischer 
41802c50d82SAndre Fischer 
41902c50d82SAndre Fischer } // end of namespace sd
420