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 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 } 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; 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 {} 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: 92*02c50d82SAndre Fischer TokenComparator(::sd::sidebar::MasterPageContainer::Token aToken) 93*02c50d82SAndre Fischer : maToken(aToken) {} 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: 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 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 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 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 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 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 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 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 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 343*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 351*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 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 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 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 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 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