summaryrefslogtreecommitdiff
path: root/sd/source/ui/toolpanel/controls/RecentlyUsedMasterPages.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sd/source/ui/toolpanel/controls/RecentlyUsedMasterPages.cxx')
-rw-r--r--sd/source/ui/toolpanel/controls/RecentlyUsedMasterPages.cxx498
1 files changed, 0 insertions, 498 deletions
diff --git a/sd/source/ui/toolpanel/controls/RecentlyUsedMasterPages.cxx b/sd/source/ui/toolpanel/controls/RecentlyUsedMasterPages.cxx
deleted file mode 100644
index 558cfd69f..000000000
--- a/sd/source/ui/toolpanel/controls/RecentlyUsedMasterPages.cxx
+++ /dev/null
@@ -1,498 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_sd.hxx"
-
-#include "RecentlyUsedMasterPages.hxx"
-#include "MasterPageObserver.hxx"
-#include "MasterPagesSelector.hxx"
-#include "MasterPageDescriptor.hxx"
-#include "tools/ConfigurationAccess.hxx"
-#include "drawdoc.hxx"
-#include "sdpage.hxx"
-
-#include <algorithm>
-#include <vector>
-
-#include <comphelper/processfactory.hxx>
-#include "unomodel.hxx"
-#include <com/sun/star/drawing/XDrawPagesSupplier.hpp>
-#include <com/sun/star/drawing/XDrawPages.hpp>
-#include <com/sun/star/frame/XComponentLoader.hpp>
-#include <com/sun/star/container/XNameAccess.hpp>
-#include <com/sun/star/container/XHierarchicalNameAccess.hpp>
-#include <com/sun/star/lang/XMultiServiceFactory.hpp>
-#include <com/sun/star/beans/PropertyValue.hpp>
-#include <com/sun/star/beans/PropertyState.hpp>
-#include <tools/urlobj.hxx>
-#include <unotools/confignode.hxx>
-#include <osl/doublecheckedlocking.h>
-#include <osl/getglobalmutex.hxx>
-
-using namespace ::std;
-using ::rtl::OUString;
-using namespace ::com::sun::star;
-using namespace ::com::sun::star::uno;
-
-
-namespace {
-
-static const OUString& GetPathToImpressConfigurationRoot (void)
-{
- static const OUString sPathToImpressConfigurationRoot (
- RTL_CONSTASCII_USTRINGPARAM("/org.openoffice.Office.Impress/"));
- return sPathToImpressConfigurationRoot;
-}
-static const OUString& GetPathToSetNode (void)
-{
- static const OUString sPathToSetNode(
- RTL_CONSTASCII_USTRINGPARAM(
- "MultiPaneGUI/ToolPanel/RecentlyUsedMasterPages"));
- return sPathToSetNode;
-}
-
-
-class Descriptor
-{
-public:
- ::rtl::OUString msURL;
- ::rtl::OUString msName;
- ::sd::toolpanel::controls::MasterPageContainer::Token maToken;
- Descriptor (const ::rtl::OUString& rsURL, const ::rtl::OUString& rsName)
- : msURL(rsURL),
- msName(rsName),
- maToken(::sd::toolpanel::controls::MasterPageContainer::NIL_TOKEN)
- {}
- Descriptor (::sd::toolpanel::controls::MasterPageContainer::Token aToken,
- const ::rtl::OUString& rsURL, const ::rtl::OUString& rsName)
- : msURL(rsURL),
- msName(rsName),
- maToken(aToken)
- {}
- class TokenComparator
- {
- public:
- TokenComparator(::sd::toolpanel::controls::MasterPageContainer::Token aToken)
- : maToken(aToken) {}
- bool operator () (const Descriptor& rDescriptor) const
- { return maToken==rDescriptor.maToken; }
- private:
- ::sd::toolpanel::controls::MasterPageContainer::Token maToken;
- };
-};
-
-} // end of anonymous namespace
-
-
-
-
-namespace sd { namespace toolpanel { namespace controls {
-
-class RecentlyUsedMasterPages::MasterPageList : public ::std::vector<Descriptor>
-{
-public:
- MasterPageList (void) {}
-};
-
-
-RecentlyUsedMasterPages* RecentlyUsedMasterPages::mpInstance = NULL;
-
-
-RecentlyUsedMasterPages& RecentlyUsedMasterPages::Instance (void)
-{
- if (mpInstance == NULL)
- {
- ::osl::GetGlobalMutex aMutexFunctor;
- ::osl::MutexGuard aGuard (aMutexFunctor());
- if (mpInstance == NULL)
- {
- RecentlyUsedMasterPages* pInstance = new RecentlyUsedMasterPages();
- pInstance->LateInit();
- SdGlobalResourceContainer::Instance().AddResource (
- ::std::auto_ptr<SdGlobalResource>(pInstance));
- OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
- mpInstance = pInstance;
- }
- }
- else {
- OSL_DOUBLE_CHECKED_LOCKING_MEMORY_BARRIER();
- }
-
- return *mpInstance;
-}
-
-
-
-
-RecentlyUsedMasterPages::RecentlyUsedMasterPages (void)
- : maListeners(),
- mpMasterPages(new MasterPageList()),
- mnMaxListSize(8),
- mpContainer(new MasterPageContainer())
-{
-}
-
-
-
-
-RecentlyUsedMasterPages::~RecentlyUsedMasterPages (void)
-{
- Link aLink (LINK(this,RecentlyUsedMasterPages,MasterPageContainerChangeListener));
- mpContainer->RemoveChangeListener(aLink);
-
- MasterPageObserver::Instance().RemoveEventListener(
- LINK(this,RecentlyUsedMasterPages,MasterPageChangeListener));
-}
-
-
-
-
-void RecentlyUsedMasterPages::LateInit (void)
-{
- Link aLink (LINK(this,RecentlyUsedMasterPages,MasterPageContainerChangeListener));
- mpContainer->AddChangeListener(aLink);
-
- LoadPersistentValues ();
- MasterPageObserver::Instance().AddEventListener(
- LINK(this,RecentlyUsedMasterPages,MasterPageChangeListener));
-}
-
-
-
-
-void RecentlyUsedMasterPages::LoadPersistentValues (void)
-{
- try
- {
- tools::ConfigurationAccess aConfiguration (
- GetPathToImpressConfigurationRoot(),
- tools::ConfigurationAccess::READ_ONLY);
- Reference<container::XNameAccess> xSet (
- aConfiguration.GetConfigurationNode(GetPathToSetNode()),
- UNO_QUERY);
- if ( ! xSet.is())
- return;
-
- const String sURLMemberName (RTL_CONSTASCII_USTRINGPARAM("URL"));
- const String sNameMemberName (RTL_CONSTASCII_USTRINGPARAM("Name"));
- OUString sURL;
- OUString sName;
-
- // Read the names and URLs of the master pages.
- Sequence<OUString> aKeys (xSet->getElementNames());
- mpMasterPages->clear();
- mpMasterPages->reserve(aKeys.getLength());
- for (int i=0; i<aKeys.getLength(); i++)
- {
- Reference<container::XNameAccess> xSetItem (
- xSet->getByName(aKeys[i]), UNO_QUERY);
- if (xSetItem.is())
- {
- Any aURL (xSetItem->getByName(sURLMemberName));
- Any aName (xSetItem->getByName(sNameMemberName));
- aURL >>= sURL;
- aName >>= sName;
- SharedMasterPageDescriptor pDescriptor (new MasterPageDescriptor(
- MasterPageContainer::TEMPLATE,
- -1,
- sURL,
- String(),
- sName,
- false,
- ::boost::shared_ptr<PageObjectProvider>(
- new TemplatePageObjectProvider(sURL)),
- ::boost::shared_ptr<PreviewProvider>(
- new TemplatePreviewProvider(sURL))));
- // For user supplied templates we use a different
- // preview provider: The preview in the document shows
- // not only shapes on the master page but also shapes on
- // the foreground. This is misleading and therefore
- // these previews are discarded and created directly
- // from the page objects.
- if (pDescriptor->GetURLClassification() == MasterPageDescriptor::URLCLASS_USER)
- pDescriptor->mpPreviewProvider = ::boost::shared_ptr<PreviewProvider>(
- new PagePreviewProvider());
- MasterPageContainer::Token aToken (mpContainer->PutMasterPage(pDescriptor));
- mpMasterPages->push_back(Descriptor(aToken,sURL,sName));
- }
- }
-
- ResolveList();
- }
- catch (Exception&)
- {
- // Ignore exception.
- }
-}
-
-
-
-
-void RecentlyUsedMasterPages::SavePersistentValues (void)
-{
- try
- {
- tools::ConfigurationAccess aConfiguration (
- GetPathToImpressConfigurationRoot(),
- tools::ConfigurationAccess::READ_WRITE);
- Reference<container::XNameContainer> xSet (
- aConfiguration.GetConfigurationNode(GetPathToSetNode()),
- UNO_QUERY);
- if ( ! xSet.is())
- return;
-
- // Clear the set.
- Sequence<OUString> aKeys (xSet->getElementNames());
- sal_Int32 i;
- for (i=0; i<aKeys.getLength(); i++)
- xSet->removeByName (aKeys[i]);
-
- // Fill it with the URLs of this object.
- const String sURLMemberName (RTL_CONSTASCII_USTRINGPARAM("URL"));
- const String sNameMemberName (RTL_CONSTASCII_USTRINGPARAM("Name"));
- Any aValue;
- Reference<lang::XSingleServiceFactory> xChildFactory (
- xSet, UNO_QUERY);
- if ( ! xChildFactory.is())
- return;
- MasterPageList::const_iterator iDescriptor;
- sal_Int32 nIndex(0);
- for (iDescriptor=mpMasterPages->begin();
- iDescriptor!=mpMasterPages->end();
- ++iDescriptor,++nIndex)
- {
- // Create new child.
- OUString sKey (RTL_CONSTASCII_USTRINGPARAM("index_"));
- sKey += OUString::valueOf(nIndex);
- Reference<container::XNameReplace> xChild(
- xChildFactory->createInstance(), UNO_QUERY);
- if (xChild.is())
- {
- xSet->insertByName (sKey, makeAny(xChild));
-
- aValue <<= OUString(iDescriptor->msURL);
- xChild->replaceByName (sURLMemberName, aValue);
-
- aValue <<= OUString(iDescriptor->msName);
- xChild->replaceByName (sNameMemberName, aValue);
- }
- }
-
- // Write the data back to disk.
- aConfiguration.CommitChanges();
- }
- catch (Exception&)
- {
- // Ignore exception.
- }
-}
-
-
-
-
-void RecentlyUsedMasterPages::AddEventListener (const Link& rEventListener)
-{
- if (::std::find (
- maListeners.begin(),
- maListeners.end(),
- rEventListener) == maListeners.end())
- {
- maListeners.push_back (rEventListener);
- }
-}
-
-
-
-
-void RecentlyUsedMasterPages::RemoveEventListener (const Link& rEventListener)
-{
- maListeners.erase (
- ::std::find (
- maListeners.begin(),
- maListeners.end(),
- rEventListener));
-}
-
-
-
-
-int RecentlyUsedMasterPages::GetMasterPageCount (void) const
-{
- return mpMasterPages->size();
-}
-
-
-
-
-MasterPageContainer::Token RecentlyUsedMasterPages::GetTokenForIndex (sal_uInt32 nIndex) const
-{
- if(nIndex<mpMasterPages->size())
- return (*mpMasterPages)[nIndex].maToken;
- else
- return MasterPageContainer::NIL_TOKEN;
-}
-
-
-
-
-void RecentlyUsedMasterPages::SendEvent (void)
-{
- ::std::vector<Link>::iterator aLink (maListeners.begin());
- ::std::vector<Link>::iterator aEnd (maListeners.end());
- while (aLink!=aEnd)
- {
- aLink->Call (NULL);
- ++aLink;
- }
-}
-
-
-
-
-IMPL_LINK(RecentlyUsedMasterPages, MasterPageChangeListener,
- MasterPageObserverEvent*, pEvent)
-{
- switch (pEvent->meType)
- {
- case MasterPageObserverEvent::ET_MASTER_PAGE_ADDED:
- case MasterPageObserverEvent::ET_MASTER_PAGE_EXISTS:
- AddMasterPage(
- mpContainer->GetTokenForStyleName(pEvent->mrMasterPageName));
- break;
-
- case MasterPageObserverEvent::ET_MASTER_PAGE_REMOVED:
- // Do not change the list of recently master pages (the deleted
- // page was recently used) but tell the listeners. They may want
- // to update their lists.
- SendEvent();
- break;
- }
- return 0;
-}
-
-
-
-
-IMPL_LINK(RecentlyUsedMasterPages, MasterPageContainerChangeListener,
- MasterPageContainerChangeEvent*, pEvent)
-{
- if (pEvent != NULL)
- switch (pEvent->meEventType)
- {
- case MasterPageContainerChangeEvent::CHILD_ADDED:
- case MasterPageContainerChangeEvent::CHILD_REMOVED:
- case MasterPageContainerChangeEvent::INDEX_CHANGED:
- case MasterPageContainerChangeEvent::INDEXES_CHANGED:
- ResolveList();
- break;
-
- default:
- // Ignored.
- break;
- }
- return 0;
-}
-
-
-
-
-void RecentlyUsedMasterPages::AddMasterPage (
- MasterPageContainer::Token aToken,
- bool bMakePersistent)
-{
- // For the page to be inserted the token has to be valid and the page
- // has to have a valid URL. This excludes master pages that do not come
- // from template files.
- if (aToken != MasterPageContainer::NIL_TOKEN
- && mpContainer->GetURLForToken(aToken).Len()>0)
- {
-
- MasterPageList::iterator aIterator (
- ::std::find_if(mpMasterPages->begin(),mpMasterPages->end(),
- Descriptor::TokenComparator(aToken)));
- if (aIterator != mpMasterPages->end())
- {
- // When an entry for the given token already exists then remove
- // it now and insert it later at the head of the list.
- mpMasterPages->erase (aIterator);
- }
-
- mpMasterPages->insert(mpMasterPages->begin(),
- Descriptor(
- aToken,
- mpContainer->GetURLForToken(aToken),
- mpContainer->GetStyleNameForToken(aToken)));
-
- // Shorten list to maximal size.
- while (mpMasterPages->size() > mnMaxListSize)
- {
- mpMasterPages->pop_back ();
- }
-
- if (bMakePersistent)
- SavePersistentValues ();
- SendEvent();
- }
-}
-
-
-
-
-void RecentlyUsedMasterPages::ResolveList (void)
-{
- bool bNotify (false);
-
- MasterPageList::iterator iDescriptor;
- for (iDescriptor=mpMasterPages->begin(); iDescriptor!=mpMasterPages->end(); ++iDescriptor)
- {
- if (iDescriptor->maToken == MasterPageContainer::NIL_TOKEN)
- {
- MasterPageContainer::Token aToken (mpContainer->GetTokenForURL(iDescriptor->msURL));
- iDescriptor->maToken = aToken;
- if (aToken != MasterPageContainer::NIL_TOKEN)
- bNotify = true;
- }
- else
- {
- if ( ! mpContainer->HasToken(iDescriptor->maToken))
- {
- iDescriptor->maToken = MasterPageContainer::NIL_TOKEN;
- bNotify = true;
- }
- }
- }
-
- if (bNotify)
- SendEvent();
-}
-
-
-} } } // end of namespace ::sd::toolpanel::controls
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */