summaryrefslogtreecommitdiff
path: root/svl/source/syslocale/syslocale.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'svl/source/syslocale/syslocale.cxx')
-rw-r--r--svl/source/syslocale/syslocale.cxx176
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();
+}