[Libreoffice-commits] core.git: Branch 'libreoffice-5-4' - include/svl

Aron Budea aron.budea at collabora.com
Mon Jul 17 19:41:55 UTC 2017


 include/svl/ondemand.hxx |   53 +++++++++++++++++++++++++++++++----------------
 1 file changed, 35 insertions(+), 18 deletions(-)

New commits:
commit c0d9b6f6fb4a39e197297fcb16373d631881e419
Author: Aron Budea <aron.budea at collabora.com>
Date:   Mon Jul 10 15:56:32 2017 +0200

    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.
    
    Reviewed-on: https://gerrit.libreoffice.org/39762
    Reviewed-by: Noel Grandin <noel.grandin at collabora.co.uk>
    Tested-by: Noel Grandin <noel.grandin at collabora.co.uk>
    (cherry picked from commit 2a22696546ace75c38a72ad13f7383aedd00e06a)
    
    Change-Id: I3d64dbe8afa929cf416d87678762e82b45561d63
    Reviewed-on: https://gerrit.libreoffice.org/39827
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Eike Rathke <erack at redhat.com>

diff --git a/include/svl/ondemand.hxx b/include/svl/ondemand.hxx
index b48523cd594d..04984086ed8b 100644
--- a/include/svl/ondemand.hxx
+++ b/include/svl/ondemand.hxx
@@ -129,26 +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;
-            bool                bInitialized;
+    mutable css::lang::Locale  aLastAnyLocale;
+            std::unique_ptr<CalendarWrapper> pEnglishPtr;
+    mutable std::unique_ptr<CalendarWrapper> pAnyPtr;
 
 public:
                                 OnDemandCalendarWrapper()
-                                    : pPtr(nullptr)
-                                    , bValid(false)
-                                    , bInitialized(false)
-                                    {}
+                                    {
+                                        LanguageTag aEnglishLanguageTag(LANGUAGE_ENGLISH_US);
+                                        aEnglishLocale = aEnglishLanguageTag.getLocale();
+                                        aLastAnyLocale = aEnglishLocale;
+                                    }
 
             void                init(
                                     const css::uno::Reference< css::uno::XComponentContext >& rxContext,
@@ -157,26 +161,39 @@ public:
                                     {
                                         m_xContext = rxContext;
                                         changeLocale( rLocale );
-                                        pPtr.reset();
-                                        bInitialized = true;
+                                        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;
                                     }
 
 };


More information about the Libreoffice-commits mailing list