xref: /trunk/main/sd/source/ui/sidebar/RecentlyUsedMasterPages.cxx (revision cf6516809c57e1bb0a940545cca99cdad54d4ce2)
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