1*02c50d82SAndre Fischer /**************************************************************
2*02c50d82SAndre Fischer *
3*02c50d82SAndre Fischer * Licensed to the Apache Software Foundation (ASF) under one
4*02c50d82SAndre Fischer * or more contributor license agreements. See the NOTICE file
5*02c50d82SAndre Fischer * distributed with this work for additional information
6*02c50d82SAndre Fischer * regarding copyright ownership. The ASF licenses this file
7*02c50d82SAndre Fischer * to you under the Apache License, Version 2.0 (the
8*02c50d82SAndre Fischer * "License"); you may not use this file except in compliance
9*02c50d82SAndre Fischer * with the License. You may obtain a copy of the License at
10*02c50d82SAndre Fischer *
11*02c50d82SAndre Fischer * http://www.apache.org/licenses/LICENSE-2.0
12*02c50d82SAndre Fischer *
13*02c50d82SAndre Fischer * Unless required by applicable law or agreed to in writing,
14*02c50d82SAndre Fischer * software distributed under the License is distributed on an
15*02c50d82SAndre Fischer * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*02c50d82SAndre Fischer * KIND, either express or implied. See the License for the
17*02c50d82SAndre Fischer * specific language governing permissions and limitations
18*02c50d82SAndre Fischer * under the License.
19*02c50d82SAndre Fischer *
20*02c50d82SAndre Fischer *************************************************************/
21*02c50d82SAndre Fischer
22*02c50d82SAndre Fischer #include "precompiled_sd.hxx"
23*02c50d82SAndre Fischer
24*02c50d82SAndre Fischer #include "RecentlyUsedMasterPages.hxx"
25*02c50d82SAndre Fischer #include "MasterPageObserver.hxx"
26*02c50d82SAndre Fischer #include "MasterPagesSelector.hxx"
27*02c50d82SAndre Fischer #include "MasterPageDescriptor.hxx"
28*02c50d82SAndre Fischer #include "tools/ConfigurationAccess.hxx"
29*02c50d82SAndre Fischer #include "drawdoc.hxx"
30*02c50d82SAndre Fischer #include "sdpage.hxx"
31*02c50d82SAndre Fischer
32*02c50d82SAndre Fischer #include <algorithm>
33*02c50d82SAndre Fischer #include <vector>
34*02c50d82SAndre Fischer
35*02c50d82SAndre Fischer #include <comphelper/processfactory.hxx>
36*02c50d82SAndre Fischer #include "unomodel.hxx"
37*02c50d82SAndre Fischer #include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
38*02c50d82SAndre Fischer #include <com/sun/star/drawing/XDrawPages.hpp>
39*02c50d82SAndre Fischer #include <com/sun/star/frame/XComponentLoader.hpp>
40*02c50d82SAndre Fischer #include <com/sun/star/container/XNameAccess.hpp>
41*02c50d82SAndre Fischer #include <com/sun/star/container/XHierarchicalNameAccess.hpp>
42*02c50d82SAndre Fischer #include <com/sun/star/lang/XMultiServiceFactory.hpp>
43*02c50d82SAndre Fischer #include <com/sun/star/beans/PropertyValue.hpp>
44*02c50d82SAndre Fischer #include <com/sun/star/beans/PropertyState.hpp>
45*02c50d82SAndre Fischer #include <tools/urlobj.hxx>
46*02c50d82SAndre Fischer #include <unotools/confignode.hxx>
47*02c50d82SAndre Fischer #include <osl/doublecheckedlocking.h>
48*02c50d82SAndre Fischer #include <osl/getglobalmutex.hxx>
49*02c50d82SAndre Fischer
50*02c50d82SAndre Fischer using namespace ::std;
51*02c50d82SAndre Fischer using ::rtl::OUString;
52*02c50d82SAndre Fischer using namespace ::com::sun::star;
53*02c50d82SAndre Fischer using namespace ::com::sun::star::uno;
54*02c50d82SAndre Fischer
55*02c50d82SAndre Fischer
56*02c50d82SAndre Fischer namespace {
57*02c50d82SAndre Fischer
GetPathToImpressConfigurationRoot(void)58*02c50d82SAndre Fischer static const OUString& GetPathToImpressConfigurationRoot (void)
59*02c50d82SAndre Fischer {
60*02c50d82SAndre Fischer static const OUString sPathToImpressConfigurationRoot (
61*02c50d82SAndre Fischer RTL_CONSTASCII_USTRINGPARAM("/org.openoffice.Office.Impress/"));
62*02c50d82SAndre Fischer return sPathToImpressConfigurationRoot;
63*02c50d82SAndre Fischer }
GetPathToSetNode(void)64*02c50d82SAndre Fischer static const OUString& GetPathToSetNode (void)
65*02c50d82SAndre Fischer {
66*02c50d82SAndre Fischer static const OUString sPathToSetNode(
67*02c50d82SAndre Fischer RTL_CONSTASCII_USTRINGPARAM(
68*02c50d82SAndre Fischer "MultiPaneGUI/ToolPanel/RecentlyUsedMasterPages"));
69*02c50d82SAndre Fischer return sPathToSetNode;
70*02c50d82SAndre Fischer }
71*02c50d82SAndre Fischer
72*02c50d82SAndre Fischer
73*02c50d82SAndre Fischer class Descriptor
74*02c50d82SAndre Fischer {
75*02c50d82SAndre Fischer public:
76*02c50d82SAndre Fischer ::rtl::OUString msURL;
77*02c50d82SAndre Fischer ::rtl::OUString msName;
78*02c50d82SAndre Fischer ::sd::sidebar::MasterPageContainer::Token maToken;
Descriptor(const::rtl::OUString & rsURL,const::rtl::OUString & rsName)79*02c50d82SAndre Fischer Descriptor (const ::rtl::OUString& rsURL, const ::rtl::OUString& rsName)
80*02c50d82SAndre Fischer : msURL(rsURL),
81*02c50d82SAndre Fischer msName(rsName),
82*02c50d82SAndre Fischer maToken(::sd::sidebar::MasterPageContainer::NIL_TOKEN)
83*02c50d82SAndre Fischer {}
Descriptor(::sd::sidebar::MasterPageContainer::Token aToken,const::rtl::OUString & rsURL,const::rtl::OUString & rsName)84*02c50d82SAndre Fischer Descriptor (::sd::sidebar::MasterPageContainer::Token aToken,
85*02c50d82SAndre Fischer const ::rtl::OUString& rsURL, const ::rtl::OUString& rsName)
86*02c50d82SAndre Fischer : msURL(rsURL),
87*02c50d82SAndre Fischer msName(rsName),
88*02c50d82SAndre Fischer maToken(aToken)
89*02c50d82SAndre Fischer {}
90*02c50d82SAndre Fischer class TokenComparator
91*02c50d82SAndre Fischer { public:
TokenComparator(::sd::sidebar::MasterPageContainer::Token aToken)92*02c50d82SAndre Fischer TokenComparator(::sd::sidebar::MasterPageContainer::Token aToken)
93*02c50d82SAndre Fischer : maToken(aToken) {}
operator ()(const Descriptor & rDescriptor)94*02c50d82SAndre Fischer bool operator () (const Descriptor& rDescriptor)
95*02c50d82SAndre Fischer { return maToken==rDescriptor.maToken; }
96*02c50d82SAndre Fischer private: ::sd::sidebar::MasterPageContainer::Token maToken;
97*02c50d82SAndre Fischer };
98*02c50d82SAndre Fischer };
99*02c50d82SAndre Fischer
100*02c50d82SAndre Fischer } // end of anonymous namespace
101*02c50d82SAndre Fischer
102*02c50d82SAndre Fischer
103*02c50d82SAndre Fischer
104*02c50d82SAndre Fischer
105*02c50d82SAndre Fischer namespace sd { namespace sidebar {
106*02c50d82SAndre Fischer
107*02c50d82SAndre Fischer class RecentlyUsedMasterPages::MasterPageList : public ::std::vector<Descriptor>
108*02c50d82SAndre Fischer {
109*02c50d82SAndre Fischer public:
MasterPageList(void)110*02c50d82SAndre Fischer MasterPageList (void) {}
111*02c50d82SAndre Fischer };
112*02c50d82SAndre Fischer
113*02c50d82SAndre Fischer
114*02c50d82SAndre Fischer RecentlyUsedMasterPages* RecentlyUsedMasterPages::mpInstance = NULL;
115*02c50d82SAndre Fischer
116*02c50d82SAndre Fischer
Instance(void)117*02c50d82SAndre Fischer RecentlyUsedMasterPages& RecentlyUsedMasterPages::Instance (void)
118*02c50d82SAndre Fischer {
119*02c50d82SAndre Fischer if (mpInstance == NULL)
120*02c50d82SAndre Fischer {
121*02c50d82SAndre Fischer ::osl::GetGlobalMutex aMutexFunctor;
122*02c50d82SAndre Fischer ::osl::MutexGuard aGuard (aMutexFunctor());
123*02c50d82SAndre Fischer if (mpInstance == NULL)
124*02c50d82SAndre Fischer {
125*02c50d82SAndre Fischer RecentlyUsedMasterPages* pInstance = new RecentlyUsedMasterPages();
126*02c50d82SAndre Fischer pInstance->LateInit();
127*02c50d82SAndre Fischer SdGlobalResourceContainer::Instance().AddResource (
128*02c50d82SAndre Fischer ::std::auto_ptr<SdGlobalResource>(pInstance));
129*02c50d82SAndre Fischer OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
130*02c50d82SAndre Fischer mpInstance = pInstance;
131*02c50d82SAndre Fischer }
132*02c50d82SAndre Fischer }
133*02c50d82SAndre Fischer else {
134*02c50d82SAndre Fischer OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
135*02c50d82SAndre Fischer }
136*02c50d82SAndre Fischer
137*02c50d82SAndre Fischer return *mpInstance;
138*02c50d82SAndre Fischer }
139*02c50d82SAndre Fischer
140*02c50d82SAndre Fischer
141*02c50d82SAndre Fischer
142*02c50d82SAndre Fischer
RecentlyUsedMasterPages(void)143*02c50d82SAndre Fischer RecentlyUsedMasterPages::RecentlyUsedMasterPages (void)
144*02c50d82SAndre Fischer : maListeners(),
145*02c50d82SAndre Fischer mpMasterPages(new MasterPageList()),
146*02c50d82SAndre Fischer mnMaxListSize(8),
147*02c50d82SAndre Fischer mpContainer(new MasterPageContainer())
148*02c50d82SAndre Fischer {
149*02c50d82SAndre Fischer }
150*02c50d82SAndre Fischer
151*02c50d82SAndre Fischer
152*02c50d82SAndre Fischer
153*02c50d82SAndre Fischer
~RecentlyUsedMasterPages(void)154*02c50d82SAndre Fischer RecentlyUsedMasterPages::~RecentlyUsedMasterPages (void)
155*02c50d82SAndre Fischer {
156*02c50d82SAndre Fischer Link aLink (LINK(this,RecentlyUsedMasterPages,MasterPageContainerChangeListener));
157*02c50d82SAndre Fischer mpContainer->RemoveChangeListener(aLink);
158*02c50d82SAndre Fischer
159*02c50d82SAndre Fischer MasterPageObserver::Instance().RemoveEventListener(
160*02c50d82SAndre Fischer LINK(this,RecentlyUsedMasterPages,MasterPageChangeListener));
161*02c50d82SAndre Fischer }
162*02c50d82SAndre Fischer
163*02c50d82SAndre Fischer
164*02c50d82SAndre Fischer
165*02c50d82SAndre Fischer
LateInit(void)166*02c50d82SAndre Fischer void RecentlyUsedMasterPages::LateInit (void)
167*02c50d82SAndre Fischer {
168*02c50d82SAndre Fischer Link aLink (LINK(this,RecentlyUsedMasterPages,MasterPageContainerChangeListener));
169*02c50d82SAndre Fischer mpContainer->AddChangeListener(aLink);
170*02c50d82SAndre Fischer
171*02c50d82SAndre Fischer LoadPersistentValues ();
172*02c50d82SAndre Fischer MasterPageObserver::Instance().AddEventListener(
173*02c50d82SAndre Fischer LINK(this,RecentlyUsedMasterPages,MasterPageChangeListener));
174*02c50d82SAndre Fischer }
175*02c50d82SAndre Fischer
176*02c50d82SAndre Fischer
177*02c50d82SAndre Fischer
178*02c50d82SAndre Fischer
LoadPersistentValues(void)179*02c50d82SAndre Fischer void RecentlyUsedMasterPages::LoadPersistentValues (void)
180*02c50d82SAndre Fischer {
181*02c50d82SAndre Fischer try
182*02c50d82SAndre Fischer {
183*02c50d82SAndre Fischer do
184*02c50d82SAndre Fischer {
185*02c50d82SAndre Fischer tools::ConfigurationAccess aConfiguration (
186*02c50d82SAndre Fischer GetPathToImpressConfigurationRoot(),
187*02c50d82SAndre Fischer tools::ConfigurationAccess::READ_ONLY);
188*02c50d82SAndre Fischer Reference<container::XNameAccess> xSet (
189*02c50d82SAndre Fischer aConfiguration.GetConfigurationNode(GetPathToSetNode()),
190*02c50d82SAndre Fischer UNO_QUERY);
191*02c50d82SAndre Fischer if ( ! xSet.is())
192*02c50d82SAndre Fischer break;
193*02c50d82SAndre Fischer
194*02c50d82SAndre Fischer const String sURLMemberName (OUString::createFromAscii("URL"));
195*02c50d82SAndre Fischer const String sNameMemberName (OUString::createFromAscii("Name"));
196*02c50d82SAndre Fischer OUString sURL;
197*02c50d82SAndre Fischer OUString sName;
198*02c50d82SAndre Fischer
199*02c50d82SAndre Fischer // Read the names and URLs of the master pages.
200*02c50d82SAndre Fischer Sequence<OUString> aKeys (xSet->getElementNames());
201*02c50d82SAndre Fischer mpMasterPages->clear();
202*02c50d82SAndre Fischer mpMasterPages->reserve(aKeys.getLength());
203*02c50d82SAndre Fischer for (int i=0; i<aKeys.getLength(); i++)
204*02c50d82SAndre Fischer {
205*02c50d82SAndre Fischer Reference<container::XNameAccess> xSetItem (
206*02c50d82SAndre Fischer xSet->getByName(aKeys[i]), UNO_QUERY);
207*02c50d82SAndre Fischer if (xSetItem.is())
208*02c50d82SAndre Fischer {
209*02c50d82SAndre Fischer Any aURL (xSetItem->getByName(sURLMemberName));
210*02c50d82SAndre Fischer Any aName (xSetItem->getByName(sNameMemberName));
211*02c50d82SAndre Fischer aURL >>= sURL;
212*02c50d82SAndre Fischer aName >>= sName;
213*02c50d82SAndre Fischer SharedMasterPageDescriptor pDescriptor (new MasterPageDescriptor(
214*02c50d82SAndre Fischer MasterPageContainer::TEMPLATE,
215*02c50d82SAndre Fischer -1,
216*02c50d82SAndre Fischer sURL,
217*02c50d82SAndre Fischer String(),
218*02c50d82SAndre Fischer sName,
219*02c50d82SAndre Fischer false,
220*02c50d82SAndre Fischer ::boost::shared_ptr<PageObjectProvider>(
221*02c50d82SAndre Fischer new TemplatePageObjectProvider(sURL)),
222*02c50d82SAndre Fischer ::boost::shared_ptr<PreviewProvider>(
223*02c50d82SAndre Fischer new TemplatePreviewProvider(sURL))));
224*02c50d82SAndre Fischer // For user supplied templates we use a different
225*02c50d82SAndre Fischer // preview provider: The preview in the document shows
226*02c50d82SAndre Fischer // not only shapes on the master page but also shapes on
227*02c50d82SAndre Fischer // the foreground. This is misleading and therefore
228*02c50d82SAndre Fischer // these previews are discarded and created directly
229*02c50d82SAndre Fischer // from the page objects.
230*02c50d82SAndre Fischer if (pDescriptor->GetURLClassification() == MasterPageDescriptor::URLCLASS_USER)
231*02c50d82SAndre Fischer pDescriptor->mpPreviewProvider = ::boost::shared_ptr<PreviewProvider>(
232*02c50d82SAndre Fischer new PagePreviewProvider());
233*02c50d82SAndre Fischer MasterPageContainer::Token aToken (mpContainer->PutMasterPage(pDescriptor));
234*02c50d82SAndre Fischer mpMasterPages->push_back(Descriptor(aToken,sURL,sName));
235*02c50d82SAndre Fischer }
236*02c50d82SAndre Fischer }
237*02c50d82SAndre Fischer
238*02c50d82SAndre Fischer ResolveList();
239*02c50d82SAndre Fischer }
240*02c50d82SAndre Fischer while (false);
241*02c50d82SAndre Fischer }
242*02c50d82SAndre Fischer catch (Exception&)
243*02c50d82SAndre Fischer {
244*02c50d82SAndre Fischer // Ignore exception.
245*02c50d82SAndre Fischer }
246*02c50d82SAndre Fischer }
247*02c50d82SAndre Fischer
248*02c50d82SAndre Fischer
249*02c50d82SAndre Fischer
250*02c50d82SAndre Fischer
SavePersistentValues(void)251*02c50d82SAndre Fischer void RecentlyUsedMasterPages::SavePersistentValues (void)
252*02c50d82SAndre Fischer {
253*02c50d82SAndre Fischer try
254*02c50d82SAndre Fischer {
255*02c50d82SAndre Fischer do
256*02c50d82SAndre Fischer {
257*02c50d82SAndre Fischer tools::ConfigurationAccess aConfiguration (
258*02c50d82SAndre Fischer GetPathToImpressConfigurationRoot(),
259*02c50d82SAndre Fischer tools::ConfigurationAccess::READ_WRITE);
260*02c50d82SAndre Fischer Reference<container::XNameContainer> xSet (
261*02c50d82SAndre Fischer aConfiguration.GetConfigurationNode(GetPathToSetNode()),
262*02c50d82SAndre Fischer UNO_QUERY);
263*02c50d82SAndre Fischer if ( ! xSet.is())
264*02c50d82SAndre Fischer break;
265*02c50d82SAndre Fischer
266*02c50d82SAndre Fischer // Clear the set.
267*02c50d82SAndre Fischer Sequence<OUString> aKeys (xSet->getElementNames());
268*02c50d82SAndre Fischer sal_Int32 i;
269*02c50d82SAndre Fischer for (i=0; i<aKeys.getLength(); i++)
270*02c50d82SAndre Fischer xSet->removeByName (aKeys[i]);
271*02c50d82SAndre Fischer
272*02c50d82SAndre Fischer // Fill it with the URLs of this object.
273*02c50d82SAndre Fischer const String sURLMemberName (OUString::createFromAscii("URL"));
274*02c50d82SAndre Fischer const String sNameMemberName (OUString::createFromAscii("Name"));
275*02c50d82SAndre Fischer Any aValue;
276*02c50d82SAndre Fischer Reference<lang::XSingleServiceFactory> xChildFactory (
277*02c50d82SAndre Fischer xSet, UNO_QUERY);
278*02c50d82SAndre Fischer if ( ! xChildFactory.is())
279*02c50d82SAndre Fischer break;
280*02c50d82SAndre Fischer MasterPageList::const_iterator iDescriptor;
281*02c50d82SAndre Fischer sal_Int32 nIndex(0);
282*02c50d82SAndre Fischer for (iDescriptor=mpMasterPages->begin();
283*02c50d82SAndre Fischer iDescriptor!=mpMasterPages->end();
284*02c50d82SAndre Fischer ++iDescriptor,++nIndex)
285*02c50d82SAndre Fischer {
286*02c50d82SAndre Fischer // Create new child.
287*02c50d82SAndre Fischer OUString sKey (OUString::createFromAscii("index_"));
288*02c50d82SAndre Fischer sKey += OUString::valueOf(nIndex);
289*02c50d82SAndre Fischer Reference<container::XNameReplace> xChild(
290*02c50d82SAndre Fischer xChildFactory->createInstance(), UNO_QUERY);
291*02c50d82SAndre Fischer if (xChild.is())
292*02c50d82SAndre Fischer {
293*02c50d82SAndre Fischer xSet->insertByName (sKey, makeAny(xChild));
294*02c50d82SAndre Fischer
295*02c50d82SAndre Fischer aValue <<= OUString(iDescriptor->msURL);
296*02c50d82SAndre Fischer xChild->replaceByName (sURLMemberName, aValue);
297*02c50d82SAndre Fischer
298*02c50d82SAndre Fischer aValue <<= OUString(iDescriptor->msName);
299*02c50d82SAndre Fischer xChild->replaceByName (sNameMemberName, aValue);
300*02c50d82SAndre Fischer }
301*02c50d82SAndre Fischer }
302*02c50d82SAndre Fischer
303*02c50d82SAndre Fischer // Write the data back to disk.
304*02c50d82SAndre Fischer aConfiguration.CommitChanges();
305*02c50d82SAndre Fischer }
306*02c50d82SAndre Fischer while (false);
307*02c50d82SAndre Fischer }
308*02c50d82SAndre Fischer catch (Exception&)
309*02c50d82SAndre Fischer {
310*02c50d82SAndre Fischer // Ignore exception.
311*02c50d82SAndre Fischer }
312*02c50d82SAndre Fischer }
313*02c50d82SAndre Fischer
314*02c50d82SAndre Fischer
315*02c50d82SAndre Fischer
316*02c50d82SAndre Fischer
AddEventListener(const Link & rEventListener)317*02c50d82SAndre Fischer void RecentlyUsedMasterPages::AddEventListener (const Link& rEventListener)
318*02c50d82SAndre Fischer {
319*02c50d82SAndre Fischer if (::std::find (
320*02c50d82SAndre Fischer maListeners.begin(),
321*02c50d82SAndre Fischer maListeners.end(),
322*02c50d82SAndre Fischer rEventListener) == maListeners.end())
323*02c50d82SAndre Fischer {
324*02c50d82SAndre Fischer maListeners.push_back (rEventListener);
325*02c50d82SAndre Fischer }
326*02c50d82SAndre Fischer }
327*02c50d82SAndre Fischer
328*02c50d82SAndre Fischer
329*02c50d82SAndre Fischer
330*02c50d82SAndre Fischer
RemoveEventListener(const Link & rEventListener)331*02c50d82SAndre Fischer void RecentlyUsedMasterPages::RemoveEventListener (const Link& rEventListener)
332*02c50d82SAndre Fischer {
333*02c50d82SAndre Fischer maListeners.erase (
334*02c50d82SAndre Fischer ::std::find (
335*02c50d82SAndre Fischer maListeners.begin(),
336*02c50d82SAndre Fischer maListeners.end(),
337*02c50d82SAndre Fischer rEventListener));
338*02c50d82SAndre Fischer }
339*02c50d82SAndre Fischer
340*02c50d82SAndre Fischer
341*02c50d82SAndre Fischer
342*02c50d82SAndre Fischer
GetMasterPageCount(void) const343*02c50d82SAndre Fischer int RecentlyUsedMasterPages::GetMasterPageCount (void) const
344*02c50d82SAndre Fischer {
345*02c50d82SAndre Fischer return mpMasterPages->size();
346*02c50d82SAndre Fischer }
347*02c50d82SAndre Fischer
348*02c50d82SAndre Fischer
349*02c50d82SAndre Fischer
350*02c50d82SAndre Fischer
GetTokenForIndex(sal_uInt32 nIndex) const351*02c50d82SAndre Fischer MasterPageContainer::Token RecentlyUsedMasterPages::GetTokenForIndex (sal_uInt32 nIndex) const
352*02c50d82SAndre Fischer {
353*02c50d82SAndre Fischer if(nIndex<mpMasterPages->size())
354*02c50d82SAndre Fischer return (*mpMasterPages)[nIndex].maToken;
355*02c50d82SAndre Fischer else
356*02c50d82SAndre Fischer return MasterPageContainer::NIL_TOKEN;
357*02c50d82SAndre Fischer }
358*02c50d82SAndre Fischer
359*02c50d82SAndre Fischer
360*02c50d82SAndre Fischer
361*02c50d82SAndre Fischer
SendEvent(void)362*02c50d82SAndre Fischer void RecentlyUsedMasterPages::SendEvent (void)
363*02c50d82SAndre Fischer {
364*02c50d82SAndre Fischer ::std::vector<Link>::iterator aLink (maListeners.begin());
365*02c50d82SAndre Fischer ::std::vector<Link>::iterator aEnd (maListeners.end());
366*02c50d82SAndre Fischer while (aLink!=aEnd)
367*02c50d82SAndre Fischer {
368*02c50d82SAndre Fischer aLink->Call (NULL);
369*02c50d82SAndre Fischer ++aLink;
370*02c50d82SAndre Fischer }
371*02c50d82SAndre Fischer }
372*02c50d82SAndre Fischer
373*02c50d82SAndre Fischer
374*02c50d82SAndre Fischer
375*02c50d82SAndre Fischer
IMPL_LINK(RecentlyUsedMasterPages,MasterPageChangeListener,MasterPageObserverEvent *,pEvent)376*02c50d82SAndre Fischer IMPL_LINK(RecentlyUsedMasterPages, MasterPageChangeListener,
377*02c50d82SAndre Fischer MasterPageObserverEvent*, pEvent)
378*02c50d82SAndre Fischer {
379*02c50d82SAndre Fischer switch (pEvent->meType)
380*02c50d82SAndre Fischer {
381*02c50d82SAndre Fischer case MasterPageObserverEvent::ET_MASTER_PAGE_ADDED:
382*02c50d82SAndre Fischer case MasterPageObserverEvent::ET_MASTER_PAGE_EXISTS:
383*02c50d82SAndre Fischer AddMasterPage(
384*02c50d82SAndre Fischer mpContainer->GetTokenForStyleName(pEvent->mrMasterPageName));
385*02c50d82SAndre Fischer break;
386*02c50d82SAndre Fischer
387*02c50d82SAndre Fischer case MasterPageObserverEvent::ET_MASTER_PAGE_REMOVED:
388*02c50d82SAndre Fischer // Do not change the list of recently master pages (the deleted
389*02c50d82SAndre Fischer // page was recently used) but tell the listeners. They may want
390*02c50d82SAndre Fischer // to update their lists.
391*02c50d82SAndre Fischer SendEvent();
392*02c50d82SAndre Fischer break;
393*02c50d82SAndre Fischer }
394*02c50d82SAndre Fischer return 0;
395*02c50d82SAndre Fischer }
396*02c50d82SAndre Fischer
397*02c50d82SAndre Fischer
398*02c50d82SAndre Fischer
399*02c50d82SAndre Fischer
IMPL_LINK(RecentlyUsedMasterPages,MasterPageContainerChangeListener,MasterPageContainerChangeEvent *,pEvent)400*02c50d82SAndre Fischer IMPL_LINK(RecentlyUsedMasterPages, MasterPageContainerChangeListener,
401*02c50d82SAndre Fischer MasterPageContainerChangeEvent*, pEvent)
402*02c50d82SAndre Fischer {
403*02c50d82SAndre Fischer if (pEvent != NULL)
404*02c50d82SAndre Fischer switch (pEvent->meEventType)
405*02c50d82SAndre Fischer {
406*02c50d82SAndre Fischer case MasterPageContainerChangeEvent::CHILD_ADDED:
407*02c50d82SAndre Fischer case MasterPageContainerChangeEvent::CHILD_REMOVED:
408*02c50d82SAndre Fischer case MasterPageContainerChangeEvent::INDEX_CHANGED:
409*02c50d82SAndre Fischer case MasterPageContainerChangeEvent::INDEXES_CHANGED:
410*02c50d82SAndre Fischer ResolveList();
411*02c50d82SAndre Fischer break;
412*02c50d82SAndre Fischer
413*02c50d82SAndre Fischer default:
414*02c50d82SAndre Fischer // Ignored.
415*02c50d82SAndre Fischer break;
416*02c50d82SAndre Fischer }
417*02c50d82SAndre Fischer return 0;
418*02c50d82SAndre Fischer }
419*02c50d82SAndre Fischer
420*02c50d82SAndre Fischer
421*02c50d82SAndre Fischer
422*02c50d82SAndre Fischer
AddMasterPage(MasterPageContainer::Token aToken,bool bMakePersistent)423*02c50d82SAndre Fischer void RecentlyUsedMasterPages::AddMasterPage (
424*02c50d82SAndre Fischer MasterPageContainer::Token aToken,
425*02c50d82SAndre Fischer bool bMakePersistent)
426*02c50d82SAndre Fischer {
427*02c50d82SAndre Fischer // For the page to be inserted the token has to be valid and the page
428*02c50d82SAndre Fischer // has to have a valid URL. This excludes master pages that do not come
429*02c50d82SAndre Fischer // from template files.
430*02c50d82SAndre Fischer if (aToken != MasterPageContainer::NIL_TOKEN
431*02c50d82SAndre Fischer && mpContainer->GetURLForToken(aToken).Len()>0)
432*02c50d82SAndre Fischer {
433*02c50d82SAndre Fischer
434*02c50d82SAndre Fischer MasterPageList::iterator aIterator (
435*02c50d82SAndre Fischer ::std::find_if(mpMasterPages->begin(),mpMasterPages->end(),
436*02c50d82SAndre Fischer Descriptor::TokenComparator(aToken)));
437*02c50d82SAndre Fischer if (aIterator != mpMasterPages->end())
438*02c50d82SAndre Fischer {
439*02c50d82SAndre Fischer // When an entry for the given token already exists then remove
440*02c50d82SAndre Fischer // it now and insert it later at the head of the list.
441*02c50d82SAndre Fischer mpMasterPages->erase (aIterator);
442*02c50d82SAndre Fischer }
443*02c50d82SAndre Fischer
444*02c50d82SAndre Fischer mpMasterPages->insert(mpMasterPages->begin(),
445*02c50d82SAndre Fischer Descriptor(
446*02c50d82SAndre Fischer aToken,
447*02c50d82SAndre Fischer mpContainer->GetURLForToken(aToken),
448*02c50d82SAndre Fischer mpContainer->GetStyleNameForToken(aToken)));
449*02c50d82SAndre Fischer
450*02c50d82SAndre Fischer // Shorten list to maximal size.
451*02c50d82SAndre Fischer while (mpMasterPages->size() > mnMaxListSize)
452*02c50d82SAndre Fischer {
453*02c50d82SAndre Fischer mpMasterPages->pop_back ();
454*02c50d82SAndre Fischer }
455*02c50d82SAndre Fischer
456*02c50d82SAndre Fischer if (bMakePersistent)
457*02c50d82SAndre Fischer SavePersistentValues ();
458*02c50d82SAndre Fischer SendEvent();
459*02c50d82SAndre Fischer }
460*02c50d82SAndre Fischer }
461*02c50d82SAndre Fischer
462*02c50d82SAndre Fischer
463*02c50d82SAndre Fischer
464*02c50d82SAndre Fischer
ResolveList(void)465*02c50d82SAndre Fischer void RecentlyUsedMasterPages::ResolveList (void)
466*02c50d82SAndre Fischer {
467*02c50d82SAndre Fischer bool bNotify (false);
468*02c50d82SAndre Fischer
469*02c50d82SAndre Fischer MasterPageList::iterator iDescriptor;
470*02c50d82SAndre Fischer for (iDescriptor=mpMasterPages->begin(); iDescriptor!=mpMasterPages->end(); ++iDescriptor)
471*02c50d82SAndre Fischer {
472*02c50d82SAndre Fischer if (iDescriptor->maToken == MasterPageContainer::NIL_TOKEN)
473*02c50d82SAndre Fischer {
474*02c50d82SAndre Fischer MasterPageContainer::Token aToken (mpContainer->GetTokenForURL(iDescriptor->msURL));
475*02c50d82SAndre Fischer iDescriptor->maToken = aToken;
476*02c50d82SAndre Fischer if (aToken != MasterPageContainer::NIL_TOKEN)
477*02c50d82SAndre Fischer bNotify = true;
478*02c50d82SAndre Fischer }
479*02c50d82SAndre Fischer else
480*02c50d82SAndre Fischer {
481*02c50d82SAndre Fischer if ( ! mpContainer->HasToken(iDescriptor->maToken))
482*02c50d82SAndre Fischer {
483*02c50d82SAndre Fischer iDescriptor->maToken = MasterPageContainer::NIL_TOKEN;
484*02c50d82SAndre Fischer bNotify = true;
485*02c50d82SAndre Fischer }
486*02c50d82SAndre Fischer }
487*02c50d82SAndre Fischer }
488*02c50d82SAndre Fischer
489*02c50d82SAndre Fischer if (bNotify)
490*02c50d82SAndre Fischer SendEvent();
491*02c50d82SAndre Fischer }
492*02c50d82SAndre Fischer
493*02c50d82SAndre Fischer
494*02c50d82SAndre Fischer } } // end of namespace sd::sidebar
495