/************************************************************************* * * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * Copyright 2008 by Sun Microsystems, Inc. * * OpenOffice.org - a multi-platform office productivity suite * * $RCSfile: syslocale.cxx,v $ * $Revision: 1.11 $ * * 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 * * for a copy of the LGPLv3 License. * ************************************************************************/ // MARKER(update_precomp.py): autogen include statement, do not remove #include "precompiled_svtools.hxx" #ifndef GCC #endif #include #include #include #include #include #include #include #include #include using namespace osl; using namespace com::sun::star; SvtSysLocale_Impl* SvtSysLocale::pImpl = NULL; sal_Int32 SvtSysLocale::nRefCount = 0; class SvtSysLocale_Impl : public SvtListener { friend class SvtSysLocale; SvtSysLocaleOptions aSysLocaleOptions; LocaleDataWrapper* pLocaleData; CharClass* pCharClass; public: SvtSysLocale_Impl(); virtual ~SvtSysLocale_Impl(); virtual void Notify( SvtBroadcaster& rBC, const SfxHint& rHint ); }; // ----------------------------------------------------------------------- SvtSysLocale_Impl::SvtSysLocale_Impl() { const lang::Locale& rLocale = Application::GetSettings().GetLocale(); pLocaleData = new LocaleDataWrapper( ::comphelper::getProcessServiceFactory(), rLocale ); pCharClass = new CharClass( ::comphelper::getProcessServiceFactory(), rLocale ); aSysLocaleOptions.AddListener( *this ); } SvtSysLocale_Impl::~SvtSysLocale_Impl() { aSysLocaleOptions.RemoveListener( *this ); delete pCharClass; delete pLocaleData; } void SvtSysLocale_Impl::Notify( SvtBroadcaster&, const SfxHint& rHint ) { const SfxSimpleHint* p = PTR_CAST( SfxSimpleHint, &rHint ); if( p && (p->GetId() & SYSLOCALEOPTIONS_HINT_LOCALE) ) { MutexGuard aGuard( SvtSysLocale::GetMutex() ); const lang::Locale& rLocale = Application::GetSettings().GetLocale(); pLocaleData->setLocale( rLocale ); pCharClass->setLocale( rLocale ); } } // ==================================================================== SvtSysLocale::SvtSysLocale() { MutexGuard aGuard( GetMutex() ); if ( !pImpl ) pImpl = new SvtSysLocale_Impl; ++nRefCount; } SvtSysLocale::~SvtSysLocale() { MutexGuard aGuard( GetMutex() ); if ( !--nRefCount ) { delete pImpl; pImpl = NULL; } } // static Mutex& SvtSysLocale::GetMutex() { static Mutex* pMutex = NULL; if( !pMutex ) { MutexGuard aGuard( Mutex::getGlobalMutex() ); if( !pMutex ) { // #i77768# Due to a static reference in the toolkit lib // we need a mutex that lives longer than the svtools library. // Otherwise the dtor would use a destructed mutex!! pMutex = new Mutex; } } return *pMutex; } const LocaleDataWrapper& SvtSysLocale::GetLocaleData() const { return *(pImpl->pLocaleData); } const LocaleDataWrapper* SvtSysLocale::GetLocaleDataPtr() const { return pImpl->pLocaleData; } const CharClass& SvtSysLocale::GetCharClass() const { return *(pImpl->pCharClass); } const CharClass* SvtSysLocale::GetCharClassPtr() const { return pImpl->pCharClass; }