diff options
Diffstat (limited to 'svl/inc/svl/ondemand.hxx')
-rw-r--r-- | svl/inc/svl/ondemand.hxx | 468 |
1 files changed, 468 insertions, 0 deletions
diff --git a/svl/inc/svl/ondemand.hxx b/svl/inc/svl/ondemand.hxx new file mode 100644 index 000000000000..3369f286b2cd --- /dev/null +++ b/svl/inc/svl/ondemand.hxx @@ -0,0 +1,468 @@ +/************************************************************************* + * + * 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: ondemand.hxx,v $ + * $Revision: 1.3 $ + * + * 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. + * + ************************************************************************/ + +#ifndef INCLUDED_SVTOOLS_ONDEMAND_HXX +#define INCLUDED_SVTOOLS_ONDEMAND_HXX + +#include <unotools/syslocale.hxx> +#include <i18npool/lang.h> +#include <unotools/localedatawrapper.hxx> +#include <unotools/calendarwrapper.hxx> +#include <unotools/collatorwrapper.hxx> +#include <com/sun/star/i18n/CollatorOptions.hpp> +#include <unotools/transliterationwrapper.hxx> +#include <com/sun/star/i18n/TransliterationModules.hpp> +#include <unotools/nativenumberwrapper.hxx> +#include <com/sun/star/uno/Reference.hxx> +#include <com/sun/star/lang/XMultiServiceFactory.hpp> + +/* + On demand instanciation and initialization of several i18n wrappers, + helping the number formatter to not perform worse than it already does. + */ + +/** @short + Switch between LANGUAGE_SYSTEM and LANGUAGE_ENGLISH_US and any other + LocaleDataWrapper. + SvNumberformatter uses it upon switching locales. + + @descr + Avoids reloading and analysing of locale data again and again. + + @ATTENTION + If the default ctor is used the init() method MUST be called before + accessing any locale data. The passed parameters Locale and LanguageType + must match each other. + */ + +class OnDemandLocaleDataWrapper +{ + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xSMgr; + SvtSysLocale aSysLocale; + LanguageType eCurrentLanguage; + LanguageType eLastAnyLanguage; + const LocaleDataWrapper* pSystem; + const LocaleDataWrapper* pEnglish; + LocaleDataWrapper* pAny; + const LocaleDataWrapper* pCurrent; + bool bInitialized; + +public: + OnDemandLocaleDataWrapper() + : eLastAnyLanguage( LANGUAGE_DONTKNOW ) + , pEnglish(0) + , pAny(0) + , bInitialized(false) + { + pCurrent = pSystem = aSysLocale.GetLocaleDataPtr(); + eCurrentLanguage = LANGUAGE_SYSTEM; + } + OnDemandLocaleDataWrapper( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxSMgr, + ::com::sun::star::lang::Locale& rLocale, + LanguageType eLang + ) + : pEnglish(0) + , pAny(0) + , pCurrent(0) + , bInitialized(false) + { + pSystem = aSysLocale.GetLocaleDataPtr(); + init( rxSMgr, rLocale, eLang ); + } + ~OnDemandLocaleDataWrapper() + { + delete pEnglish; + delete pAny; + } + + bool isInitialized() const { return bInitialized; } + + bool is() const { return pCurrent != NULL; } + + void init( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxSMgr, + ::com::sun::star::lang::Locale& rLocale, + LanguageType eLang + ) + { + xSMgr = rxSMgr; + changeLocale( rLocale, eLang ); + bInitialized = true; + } + + void changeLocale( ::com::sun::star::lang::Locale& rLocale, LanguageType eLang ) + { + switch ( eLang ) + { + case LANGUAGE_SYSTEM : + pCurrent = pSystem; + break; + case LANGUAGE_ENGLISH_US : + if ( !pEnglish ) + pEnglish = new LocaleDataWrapper( xSMgr, rLocale ); + pCurrent = pEnglish; + break; + default: + if ( !pAny ) + { + pAny = new LocaleDataWrapper( xSMgr, rLocale ); + eLastAnyLanguage = eLang; + } + else if ( eLastAnyLanguage != eLang ) + { + pAny->setLocale( rLocale ); + eLastAnyLanguage = eLang; + } + pCurrent = pAny; + } + eCurrentLanguage = eLang; + } + + LanguageType getCurrentLanguage() const + { return eCurrentLanguage; } + + LocaleDataWrapper* getAnyLocale() + { + if ( !pAny ) + { + pAny = new LocaleDataWrapper( xSMgr, pCurrent->getLocale() ); + eLastAnyLanguage = eCurrentLanguage; + } + else if ( pCurrent != pAny ) + { + pAny->setLocale( pCurrent->getLocale() ); + eLastAnyLanguage = eCurrentLanguage; + } + return pAny; + } + + const LocaleDataWrapper* get() const { return pCurrent; } + const LocaleDataWrapper* operator->() const { return get(); } + const LocaleDataWrapper& operator*() const { return *get(); } +}; + +/** Load a calendar only if it's needed. + SvNumberformatter uses it upon switching locales. + @ATTENTION If the default ctor is used the init() method MUST be called + before accessing the calendar. + */ +class OnDemandCalendarWrapper +{ + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xSMgr; + ::com::sun::star::lang::Locale aLocale; + mutable CalendarWrapper* pPtr; + mutable bool bValid; + bool bInitialized; + +public: + OnDemandCalendarWrapper() + : pPtr(0) + , bValid(false) + , bInitialized(false) + {} + OnDemandCalendarWrapper( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxSMgr, + ::com::sun::star::lang::Locale& rLocale + ) + : bValid(false) + , bInitialized(false) + { + init( rxSMgr, rLocale ); + } + ~OnDemandCalendarWrapper() + { + delete pPtr; + } + + bool isInitialized() const { return bInitialized; } + + bool is() const { return pPtr != NULL; } + + void init( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxSMgr, + ::com::sun::star::lang::Locale& rLocale + ) + { + xSMgr = rxSMgr; + changeLocale( rLocale ); + if ( pPtr ) + { + delete pPtr; + pPtr = NULL; + } + bInitialized = true; + } + + void changeLocale( ::com::sun::star::lang::Locale& rLocale ) + { + bValid = false; + aLocale = rLocale; + } + + CalendarWrapper* get() const + { + if ( !bValid ) + { + if ( !pPtr ) + pPtr = new CalendarWrapper( xSMgr ); + pPtr->loadDefaultCalendar( aLocale ); + bValid = true; + } + return pPtr; + } + + CalendarWrapper* operator->() { return get(); } + CalendarWrapper& operator*() { return *get(); } +}; + +/** Load a collator only if it's needed. + SvNumberformatter uses it upon switching locales. + @ATTENTION If the default ctor is used the init() method MUST be called + before accessing the collator. + */ +class OnDemandCollatorWrapper +{ + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xSMgr; + ::com::sun::star::lang::Locale aLocale; + mutable CollatorWrapper* pPtr; + mutable bool bValid; + bool bInitialized; + +public: + OnDemandCollatorWrapper() + : pPtr(0) + , bValid(false) + , bInitialized(false) + {} + OnDemandCollatorWrapper( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxSMgr, + ::com::sun::star::lang::Locale& rLocale + ) + : bValid(false) + , bInitialized(false) + { + init( rxSMgr, rLocale ); + } + ~OnDemandCollatorWrapper() + { + delete pPtr; + } + + bool isInitialized() const { return bInitialized; } + + bool is() const { return pPtr != NULL; } + + void init( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxSMgr, + ::com::sun::star::lang::Locale& rLocale + ) + { + xSMgr = rxSMgr; + changeLocale( rLocale ); + if ( pPtr ) + { + delete pPtr; + pPtr = NULL; + } + bInitialized = true; + } + + void changeLocale( ::com::sun::star::lang::Locale& rLocale ) + { + bValid = false; + aLocale = rLocale; + } + + const CollatorWrapper* get() const + { + if ( !bValid ) + { + if ( !pPtr ) + pPtr = new CollatorWrapper( xSMgr ); + pPtr->loadDefaultCollator( aLocale, ::com::sun::star::i18n::CollatorOptions::CollatorOptions_IGNORE_CASE ); + bValid = true; + } + return pPtr; + } + + const CollatorWrapper* operator->() const { return get(); } + const CollatorWrapper& operator*() const { return *get(); } +}; + +/** Load a transliteration only if it's needed. + SvNumberformatter uses it upon switching locales. + @ATTENTION If the default ctor is used the init() method MUST be called + before accessing the transliteration. + */ +class OnDemandTransliterationWrapper +{ + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xSMgr; + LanguageType eLanguage; + ::com::sun::star::i18n::TransliterationModules nType; + mutable ::utl::TransliterationWrapper* pPtr; + mutable bool bValid; + bool bInitialized; + +public: + OnDemandTransliterationWrapper() + : eLanguage( LANGUAGE_SYSTEM ) + , pPtr(0) + , bValid(false) + , bInitialized(false) + {} + OnDemandTransliterationWrapper( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxSMgr, + LanguageType eLang, + ::com::sun::star::i18n::TransliterationModules nTypeP + ) + : bValid(false) + , bInitialized(false) + { + init( rxSMgr, eLang, nTypeP ); + } + ~OnDemandTransliterationWrapper() + { + delete pPtr; + } + + bool isInitialized() const { return bInitialized; } + + bool is() const { return pPtr != NULL; } + + void init( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxSMgr, + LanguageType eLang, + ::com::sun::star::i18n::TransliterationModules nTypeP + ) + { + xSMgr = rxSMgr; + nType = nTypeP; + changeLocale( eLang ); + if ( pPtr ) + { + delete pPtr; + pPtr = NULL; + } + bInitialized = true; + } + + void changeLocale( LanguageType eLang ) + { + bValid = false; + eLanguage = eLang; + } + + const ::utl::TransliterationWrapper* get() const + { + if ( !bValid ) + { + if ( !pPtr ) + pPtr = new ::utl::TransliterationWrapper( xSMgr, nType ); + pPtr->loadModuleIfNeeded( eLanguage ); + bValid = true; + } + return pPtr; + } + + const ::utl::TransliterationWrapper* getForModule( const String& rModule, LanguageType eLang ) const + { + if ( !pPtr ) + pPtr = new ::utl::TransliterationWrapper( xSMgr, nType ); + pPtr->loadModuleByImplName( rModule, eLang ); + bValid = false; // reforce settings change in get() + return pPtr; + } + + const ::utl::TransliterationWrapper* operator->() const { return get(); } + const ::utl::TransliterationWrapper& operator*() const { return *get(); } +}; + +/** Load a native number service wrapper only if it's needed. + SvNumberformatter uses it. + + @ATTENTION + If the default ctor is used the init() method MUST be called + before accessing the native number supplier. + */ +class OnDemandNativeNumberWrapper +{ + ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory > xSMgr; + mutable NativeNumberWrapper* pPtr; + bool bInitialized; + +public: + OnDemandNativeNumberWrapper() + : pPtr(0) + , bInitialized(false) + {} + OnDemandNativeNumberWrapper( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxSMgr + ) + : pPtr(0) + , bInitialized(false) + { + init( rxSMgr ); + } + ~OnDemandNativeNumberWrapper() + { + delete pPtr; + } + + bool isInitialized() const { return bInitialized; } + + void init( + const ::com::sun::star::uno::Reference< ::com::sun::star::lang::XMultiServiceFactory >& rxSMgr + ) + { + xSMgr = rxSMgr; + if ( pPtr ) + { + delete pPtr; + pPtr = NULL; + } + bInitialized = true; + } + + bool is() const { return pPtr != NULL; } + + NativeNumberWrapper* get() const + { + if ( !pPtr ) + pPtr = new NativeNumberWrapper( xSMgr ); + return pPtr; + } + + NativeNumberWrapper* operator->() { return get(); } + NativeNumberWrapper& operator*() { return *get(); } +}; + +#endif // INCLUDED_SVTOOLS_ONDEMAND_HXX + |