diff options
-rw-r--r-- | sd/inc/sdmod.hxx | 5 | ||||
-rw-r--r-- | sd/source/ui/app/sdmod.cxx | 4 | ||||
-rw-r--r-- | sd/source/ui/inc/tools/SdGlobalResourceContainer.hxx | 2 | ||||
-rw-r--r-- | sd/source/ui/tools/SdGlobalResourceContainer.cxx | 41 |
4 files changed, 29 insertions, 23 deletions
diff --git a/sd/inc/sdmod.hxx b/sd/inc/sdmod.hxx index 6a8f7351010c..c96a1b1749c9 100644 --- a/sd/inc/sdmod.hxx +++ b/sd/inc/sdmod.hxx @@ -47,7 +47,6 @@ namespace svtools { class ColorConfig; } namespace sd { class DrawDocShell; -class SdGlobalResourceContainer; } namespace com { namespace sun { namespace star { namespace frame { @@ -156,10 +155,6 @@ private: static SfxFrame* CreateEmptyDocument( const css::uno::Reference< css::frame::XFrame >& i_rFrame ); static SfxFrame* CreateFromTemplate( const OUString& rTemplatePath, const css::uno::Reference< css::frame::XFrame >& i_rFrame ); - /** The resource container controls the lifetime of some singletons. - */ - ::std::unique_ptr< ::sd::SdGlobalResourceContainer> mpResourceContainer; - bool mbEventListenerAdded; /** Take an outline from a text document and create a new impress diff --git a/sd/source/ui/app/sdmod.cxx b/sd/source/ui/app/sdmod.cxx index ebef895ad347..bd0249929db0 100644 --- a/sd/source/ui/app/sdmod.cxx +++ b/sd/source/ui/app/sdmod.cxx @@ -53,7 +53,6 @@ #include "strings.hrc" #include "res_bmp.hrc" #include "cfgids.hxx" -#include "tools/SdGlobalResourceContainer.hxx" #define SdModule @@ -77,7 +76,6 @@ SdModule::SdModule(SfxObjectFactory* pFact1, SfxObjectFactory* pFact2 ) pSearchItem(nullptr), pNumberFormatter( nullptr ), bWaterCan(false), - mpResourceContainer(new ::sd::SdGlobalResourceContainer()), mbEventListenerAdded(false), mpColorConfig(new svtools::ColorConfig) { @@ -110,8 +108,6 @@ SdModule::~SdModule() Application::RemoveEventListener( LINK( this, SdModule, EventListenerHdl ) ); } - mpResourceContainer.reset(); - delete mpErrorHdl; mpVirtualRefDevice.disposeAndClear(); } diff --git a/sd/source/ui/inc/tools/SdGlobalResourceContainer.hxx b/sd/source/ui/inc/tools/SdGlobalResourceContainer.hxx index e1c483eec439..c8afe89a2f9a 100644 --- a/sd/source/ui/inc/tools/SdGlobalResourceContainer.hxx +++ b/sd/source/ui/inc/tools/SdGlobalResourceContainer.hxx @@ -82,7 +82,7 @@ public: void AddResource (const css::uno::Reference<css::uno::XInterface>& rxResource); protected: - friend class ::SdModule; + friend class SdGlobalResourceContainerInstance; friend struct ::std::default_delete<SdGlobalResourceContainer>; class Implementation; diff --git a/sd/source/ui/tools/SdGlobalResourceContainer.cxx b/sd/source/ui/tools/SdGlobalResourceContainer.cxx index a7f0d54cac34..14653553ec67 100644 --- a/sd/source/ui/tools/SdGlobalResourceContainer.cxx +++ b/sd/source/ui/tools/SdGlobalResourceContainer.cxx @@ -19,6 +19,13 @@ #include "tools/SdGlobalResourceContainer.hxx" +#include <comphelper/processfactory.hxx> +#include <comphelper/unique_disposing_ptr.hxx> + +#include <com/sun/star/frame/Desktop.hpp> + +#include <rtl/instance.hxx> + #include <algorithm> #include <vector> @@ -27,13 +34,30 @@ using namespace ::com::sun::star::uno; namespace sd { +class SdGlobalResourceContainerInstance + : public comphelper::unique_disposing_solar_mutex_reset_ptr<SdGlobalResourceContainer> +{ +public: + SdGlobalResourceContainerInstance() + : comphelper::unique_disposing_solar_mutex_reset_ptr<SdGlobalResourceContainer>( + uno::Reference<lang::XComponent>(frame::Desktop::create(comphelper::getProcessComponentContext()), uno::UNO_QUERY_THROW), + new SdGlobalResourceContainer, true) + { + } +}; + +namespace { + +struct theSdGlobalResourceContainerInstance : public rtl::Static<SdGlobalResourceContainerInstance, theSdGlobalResourceContainerInstance> {}; + +} // namespace + //===== SdGlobalResourceContainer::Implementation ============================= class SdGlobalResourceContainer::Implementation { private: friend class SdGlobalResourceContainer; - static SdGlobalResourceContainer* mpInstance; ::osl::Mutex maMutex; @@ -53,15 +77,11 @@ private: // static SdGlobalResourceContainer& SdGlobalResourceContainer::Instance() { - DBG_ASSERT(Implementation::mpInstance!=nullptr, - "SdGlobalResourceContainer::Instance(): instance has been deleted"); - // Maybe we should throw an exception when the instance has been deleted. - return *Implementation::mpInstance; + SdGlobalResourceContainer *const pRet(theSdGlobalResourceContainerInstance::get().get()); + assert(pRet); // error if it has been deleted and is null + return *pRet; } -SdGlobalResourceContainer* - SdGlobalResourceContainer::Implementation::mpInstance = nullptr; - //===== SdGlobalResourceContainer ============================================= void SdGlobalResourceContainer::AddResource ( @@ -128,7 +148,6 @@ void SdGlobalResourceContainer::AddResource (const Reference<XInterface>& rxReso SdGlobalResourceContainer::SdGlobalResourceContainer() : mpImpl (new SdGlobalResourceContainer::Implementation()) { - Implementation::mpInstance = this; } SdGlobalResourceContainer::~SdGlobalResourceContainer() @@ -174,10 +193,6 @@ SdGlobalResourceContainer::~SdGlobalResourceContainer() if (xComponent.is()) xComponent->dispose(); } - - DBG_ASSERT(Implementation::mpInstance == this, - "~SdGlobalResourceContainer(): more than one instance of singleton"); - Implementation::mpInstance = nullptr; } } // end of namespace sd |