diff options
Diffstat (limited to 'svl/source/syslocale/syslocale.cxx')
-rw-r--r-- | svl/source/syslocale/syslocale.cxx | 176 |
1 files changed, 176 insertions, 0 deletions
diff --git a/svl/source/syslocale/syslocale.cxx b/svl/source/syslocale/syslocale.cxx new file mode 100644 index 000000000000..9811d97fd964 --- /dev/null +++ b/svl/source/syslocale/syslocale.cxx @@ -0,0 +1,176 @@ +/************************************************************************* + * + * 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 + * <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_svtools.hxx" +#ifndef GCC +#endif + +#include <svtools/syslocale.hxx> +#include <broadcast.hxx> +#include <listener.hxx> +#include <svtools/smplhint.hxx> +#include <vcl/svapp.hxx> +#include <tools/string.hxx> +#include <svtools/syslocaleoptions.hxx> +#include <unotools/localedatawrapper.hxx> +#include <comphelper/processfactory.hxx> + + +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 ); + + CharClass* GetCharClass(); + +}; + + +// ----------------------------------------------------------------------- + +SvtSysLocale_Impl::SvtSysLocale_Impl() : pCharClass(NULL) +{ + const lang::Locale& rLocale = Application::GetSettings().GetLocale(); + pLocaleData = new LocaleDataWrapper( + ::comphelper::getProcessServiceFactory(), rLocale ); + aSysLocaleOptions.AddListener( *this ); +} + + +SvtSysLocale_Impl::~SvtSysLocale_Impl() +{ + aSysLocaleOptions.RemoveListener( *this ); + delete pCharClass; + delete pLocaleData; +} + +CharClass* SvtSysLocale_Impl::GetCharClass() +{ + if ( !pCharClass ) + { + const lang::Locale& rLocale = Application::GetSettings().GetLocale(); + pCharClass = new CharClass(::comphelper::getProcessServiceFactory(), rLocale ); + } + return pCharClass; +} +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 ); + GetCharClass()->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->GetCharClass()); +} + + +const CharClass* SvtSysLocale::GetCharClassPtr() const +{ + return pImpl->GetCharClass(); +} |