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