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:
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;
}
};
......
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