Kaydet (Commit) 2a226965 authored tarafından Aron Budea's avatar Aron Budea Kaydeden (comit) Noel Grandin

tdf#109045: store en calendar separately in OnDemandCalendarWrapper

When working with pivot cache there's alternating use of
locale dependent and locale indepentent formats, which
causes unnecessary loading of calendars due to constant
switching.

OnDemandLocaleDataWrapper already does this, now do
something similar in OnDemandCalendarWrapper.

Change-Id: I3d64dbe8afa929cf416d87678762e82b45561d63
Reviewed-on: https://gerrit.libreoffice.org/39762Reviewed-by: 's avatarNoel Grandin <noel.grandin@collabora.co.uk>
Tested-by: 's avatarNoel Grandin <noel.grandin@collabora.co.uk>
üst 65e4a776
...@@ -129,24 +129,30 @@ public: ...@@ -129,24 +129,30 @@ public:
const LocaleDataWrapper& operator*() const { return *get(); } 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. SvNumberformatter uses it upon switching locales.
@ATTENTION If the default ctor is used the init() method MUST be called @ATTENTION If the default ctor is used the init() method MUST be called
before accessing the calendar. before accessing the calendar.
*/ */
class OnDemandCalendarWrapper class OnDemandCalendarWrapper
{ {
css::uno::Reference< css::uno::XComponentContext > m_xContext; css::uno::Reference< css::uno::XComponentContext > m_xContext;
css::lang::Locale aEnglishLocale;
css::lang::Locale aLocale; css::lang::Locale aLocale;
mutable std::unique_ptr<CalendarWrapper> mutable css::lang::Locale aLastAnyLocale;
pPtr; std::unique_ptr<CalendarWrapper> pEnglishPtr;
mutable bool bValid; mutable std::unique_ptr<CalendarWrapper> pAnyPtr;
public: public:
OnDemandCalendarWrapper() OnDemandCalendarWrapper()
: pPtr(nullptr) {
, bValid(false) LanguageTag aEnglishLanguageTag(LANGUAGE_ENGLISH_US);
{} aEnglishLocale = aEnglishLanguageTag.getLocale();
aLastAnyLocale = aEnglishLocale;
}
void init( void init(
const css::uno::Reference< css::uno::XComponentContext >& rxContext, const css::uno::Reference< css::uno::XComponentContext >& rxContext,
...@@ -155,25 +161,39 @@ public: ...@@ -155,25 +161,39 @@ public:
{ {
m_xContext = rxContext; m_xContext = rxContext;
changeLocale( rLocale ); changeLocale( rLocale );
pPtr.reset(); pEnglishPtr.reset(new CalendarWrapper( m_xContext ));
pEnglishPtr->loadDefaultCalendar( aEnglishLocale );
pAnyPtr.reset();
} }
void changeLocale( const css::lang::Locale& rLocale ) void changeLocale( const css::lang::Locale& rLocale )
{ {
bValid = false;
aLocale = rLocale; aLocale = rLocale;
} }
CalendarWrapper* get() const CalendarWrapper* get() const
{ {
if ( !bValid ) CalendarWrapper* pPtr;
if ( aLocale == aEnglishLocale )
{ {
if ( !pPtr ) pPtr = pEnglishPtr.get();
pPtr.reset(new CalendarWrapper( m_xContext ));
pPtr->loadDefaultCalendar( aLocale );
bValid = true;
} }
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;
} }
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment