diff options
-rw-r--r-- | include/svl/ondemand.hxx | 50 |
1 files changed, 35 insertions, 15 deletions
diff --git a/include/svl/ondemand.hxx b/include/svl/ondemand.hxx index d1c0815dc16c..81fb6e36e5fd 100644 --- a/include/svl/ondemand.hxx +++ b/include/svl/ondemand.hxx @@ -129,24 +129,30 @@ public: const LocaleDataWrapper& operator*() const { return *get(); } }; -/** Load a calendar only if it's needed. +/** Load a calendar only if it's needed. Keep calendar for "en" locale + separately, as there can be alternation between locale dependent and + locale independent formats. 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 { css::uno::Reference< css::uno::XComponentContext > m_xContext; + css::lang::Locale aEnglishLocale; css::lang::Locale aLocale; - mutable std::unique_ptr<CalendarWrapper> - pPtr; - mutable bool bValid; + mutable css::lang::Locale aLastAnyLocale; + std::unique_ptr<CalendarWrapper> pEnglishPtr; + mutable std::unique_ptr<CalendarWrapper> pAnyPtr; public: OnDemandCalendarWrapper() - : pPtr(nullptr) - , bValid(false) - {} + { + LanguageTag aEnglishLanguageTag(LANGUAGE_ENGLISH_US); + aEnglishLocale = aEnglishLanguageTag.getLocale(); + aLastAnyLocale = aEnglishLocale; + } void init( const css::uno::Reference< css::uno::XComponentContext >& rxContext, @@ -155,25 +161,39 @@ public: { m_xContext = rxContext; changeLocale( rLocale ); - pPtr.reset(); + pEnglishPtr.reset(new CalendarWrapper( m_xContext )); + pEnglishPtr->loadDefaultCalendar( aEnglishLocale ); + pAnyPtr.reset(); } void changeLocale( const css::lang::Locale& rLocale ) { - bValid = false; aLocale = rLocale; } CalendarWrapper* get() const { - if ( !bValid ) + CalendarWrapper* pPtr; + if ( aLocale == aEnglishLocale ) { - if ( !pPtr ) - pPtr.reset(new CalendarWrapper( m_xContext )); - pPtr->loadDefaultCalendar( aLocale ); - bValid = true; + pPtr = pEnglishPtr.get(); } - return pPtr.get(); + else + { + if ( !pAnyPtr ) + { + pAnyPtr.reset(new CalendarWrapper( m_xContext )); + pAnyPtr->loadDefaultCalendar(aLocale); + aLastAnyLocale = aLocale; + } + else if ( aLocale != aLastAnyLocale ) + { + pAnyPtr->loadDefaultCalendar( aLocale ); + aLastAnyLocale = aLocale; + } + pPtr = pAnyPtr.get(); + } + return pPtr; } }; |