[Libreoffice-commits] core.git: include/svl sc/source svl/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Wed Aug 22 17:03:50 UTC 2018


 include/svl/zformat.hxx            |    4 +++-
 sc/source/filter/excel/xestyle.cxx |   16 ++++++++++++++--
 svl/source/numbers/zforlist.cxx    |    7 ++++++-
 svl/source/numbers/zformat.cxx     |   27 +++++++++++++++++++++++++--
 4 files changed, 48 insertions(+), 6 deletions(-)

New commits:
commit d0f8daa0980ba8e403b32006831657c5a0a4ea17
Author:     Eike Rathke <erack at redhat.com>
AuthorDate: Wed Aug 22 13:16:19 2018 +0200
Commit:     Eike Rathke <erack at redhat.com>
CommitDate: Wed Aug 22 19:03:27 2018 +0200

    Resolves: tdf#73063 preserve and roundtrip LCID from/to Excel number formats
    
    Change-Id: I8e3e5ef5873af108596b387e8900d038e3942981
    Reviewed-on: https://gerrit.libreoffice.org/59441
    Tested-by: Jenkins
    Reviewed-by: Eike Rathke <erack at redhat.com>

diff --git a/include/svl/zformat.hxx b/include/svl/zformat.hxx
index b1f941656078..88b015f4adce 100644
--- a/include/svl/zformat.hxx
+++ b/include/svl/zformat.hxx
@@ -153,6 +153,7 @@ class SVL_DLLPUBLIC SvNumberformat
         };
 
         LanguageType meLanguage;
+        LanguageType meLanguageWithoutLocaleData;
         Substitute meSubstitute;
         sal_uInt8 mnNumeralShape;
         sal_uInt8 mnCalendarType;
@@ -225,7 +226,8 @@ public:
     // Build a format string of application defined keywords
     OUString GetMappedFormatstring( const NfKeywordTable& rKeywords,
                                     const LocaleDataWrapper& rLoc,
-                                    LanguageType nOriginalLang = LANGUAGE_DONTKNOW ) const;
+                                    LanguageType nOriginalLang = LANGUAGE_DONTKNOW,
+                                    bool bSystemLanguage = false ) const;
 
     void SetStarFormatSupport( bool b )         { bStarFlag = b; }
 
diff --git a/sc/source/filter/excel/xestyle.cxx b/sc/source/filter/excel/xestyle.cxx
index f0c4b5e83e08..04884494f467 100644
--- a/sc/source/filter/excel/xestyle.cxx
+++ b/sc/source/filter/excel/xestyle.cxx
@@ -44,6 +44,7 @@
 #include <editeng/eeitem.hxx>
 #include <editeng/escapementitem.hxx>
 #include <editeng/justifyitem.hxx>
+#include <editeng/langitem.hxx>
 #include <document.hxx>
 #include <stlpool.hxx>
 #include <stlsheet.hxx>
@@ -2135,10 +2136,21 @@ void XclExpXF::Init( const SfxItemSet& rItemSet, sal_Int16 nScript,
     }
 
     // number format
-    mnScNumFmt = (nForceScNumFmt == NUMBERFORMAT_ENTRY_NOT_FOUND) ?
-        rItemSet.Get( ATTR_VALUE_FORMAT ).GetValue() : nForceScNumFmt;
+    if (nForceScNumFmt != NUMBERFORMAT_ENTRY_NOT_FOUND)
+        mnXclNumFmt = nForceScNumFmt;
+    else
+    {
+        // Built-in formats of dedicated languages may be attributed using the
+        // system language (or even other?) format with a language attribute,
+        // obtain the "real" format key.
+        mnScNumFmt = rItemSet.Get( ATTR_VALUE_FORMAT ).GetValue();
+        LanguageType nLang = rItemSet.Get( ATTR_LANGUAGE_FORMAT).GetLanguage();
+        if (mnScNumFmt >= SV_COUNTRY_LANGUAGE_OFFSET || nLang != LANGUAGE_SYSTEM)
+            mnScNumFmt = GetFormatter().GetFormatForLanguageIfBuiltIn( mnScNumFmt, nLang);
+    }
     mnXclNumFmt = GetNumFmtBuffer().Insert( mnScNumFmt );
     mbFmtUsed = ScfTools::CheckItem( rItemSet, ATTR_VALUE_FORMAT, IsStyleXF() );
+
     // alignment
     mbAlignUsed = maAlignment.FillFromItemSet( rItemSet, bForceLineBreak, GetBiff(), IsStyleXF() );
 
diff --git a/svl/source/numbers/zforlist.cxx b/svl/source/numbers/zforlist.cxx
index 9d4a630df51b..023bc3788793 100644
--- a/svl/source/numbers/zforlist.cxx
+++ b/svl/source/numbers/zforlist.cxx
@@ -811,9 +811,13 @@ OUString SvNumberFormatter::GetFormatStringForExcel( sal_uInt32 nKey, const NfKe
         }
         else
         {
+            bool bSystemLanguage = false;
             LanguageType nLang = pEntry->GetLanguage();
             if (nLang == LANGUAGE_SYSTEM)
+            {
+                bSystemLanguage = true;
                 nLang = SvtSysLocale().GetLanguageTag().getLanguageType();
+            }
             if (nLang != LANGUAGE_ENGLISH_US)
             {
                 sal_Int32 nCheckPos;
@@ -833,7 +837,8 @@ OUString SvNumberFormatter::GetFormatStringForExcel( sal_uInt32 nKey, const NfKe
                 // before (which doesn't do anything if it was the same locale
                 // already).
                 rTempFormatter.ChangeIntl( LANGUAGE_ENGLISH_US);
-                aFormatStr = pEntry->GetMappedFormatstring( rKeywords, *rTempFormatter.GetLocaleData(), nLang );
+                aFormatStr = pEntry->GetMappedFormatstring( rKeywords, *rTempFormatter.GetLocaleData(), nLang,
+                        bSystemLanguage);
             }
         }
     }
diff --git a/svl/source/numbers/zformat.cxx b/svl/source/numbers/zformat.cxx
index 1d591f6e5dff..3d7e1c42bd8e 100644
--- a/svl/source/numbers/zformat.cxx
+++ b/svl/source/numbers/zformat.cxx
@@ -1042,6 +1042,10 @@ SvNumberformat::SvNumberformat(OUString& rString,
                             }
                             else
                             {
+                                if (nIndex == 0)
+                                    // Locale data not available, remember.
+                                    maLocale.meLanguageWithoutLocaleData = aTmpLocale.meLanguage;
+
                                 sStr = "$-" + aTmpLocale.generateCode();
                             }
                             NumFor[nIndex].SetNatNumLang( MsLangId::getRealLanguage( aTmpLocale.meLanguage));
@@ -1497,7 +1501,9 @@ OUString SvNumberformat::LocaleType::generateCode() const
     }
 #endif
 
-    sal_uInt16 n16 = static_cast<sal_uInt16>(meLanguage);
+    sal_uInt16 n16 = static_cast<sal_uInt16>(
+            (meLanguageWithoutLocaleData == LANGUAGE_DONTKNOW) ? meLanguage :
+            meLanguageWithoutLocaleData);
     if (meLanguage == LANGUAGE_SYSTEM)
     {
         switch (meSubstitute)
@@ -1529,6 +1535,7 @@ OUString SvNumberformat::LocaleType::generateCode() const
 
 SvNumberformat::LocaleType::LocaleType()
     : meLanguage(LANGUAGE_DONTKNOW)
+    , meLanguageWithoutLocaleData(LANGUAGE_DONTKNOW)
     , meSubstitute(Substitute::NONE)
     , mnNumeralShape(0)
     , mnCalendarType(0)
@@ -1537,6 +1544,7 @@ SvNumberformat::LocaleType::LocaleType()
 
 SvNumberformat::LocaleType::LocaleType(sal_uInt32 nRawNum)
     : meLanguage(LANGUAGE_DONTKNOW)
+    , meLanguageWithoutLocaleData(LANGUAGE_DONTKNOW)
     , meSubstitute(Substitute::NONE)
     , mnNumeralShape(0)
     , mnCalendarType(0)
@@ -5068,7 +5076,8 @@ void lcl_incrementAlphabetWithNatNum ( sal_uInt32& nAlphabetID, sal_uInt32 nNatN
 
 OUString SvNumberformat::GetMappedFormatstring( const NfKeywordTable& rKeywords,
                                                 const LocaleDataWrapper& rLocWrp,
-                                                LanguageType nOriginalLang /* =LANGUAGE_DONTKNOW */ ) const
+                                                LanguageType nOriginalLang /* =LANGUAGE_DONTKNOW */,
+                                                bool bSystemLanguage /* =false */ ) const
 {
     OUStringBuffer aStr;
     if (maLocale.meSubstitute != LocaleType::Substitute::NONE)
@@ -5385,6 +5394,20 @@ OUString SvNumberformat::GetMappedFormatstring( const NfKeywordTable& rKeywords,
             if ( aNatNum.GetDBNum() > 0 && nLanguageID == LANGUAGE_SYSTEM )
                 nLanguageID = MsLangId::getRealLanguage( aNatNum.GetLang());
         }
+        else if (!bSystemLanguage && nOriginalLang != LANGUAGE_DONTKNOW)
+        {
+            // Explicit locale, write only to the first subformat.
+            if (n == 0)
+                nLanguageID = MsLangId::getRealLanguage( nOriginalLang);
+        }
+        else if (bSystemLanguage && maLocale.meLanguageWithoutLocaleData != LANGUAGE_DONTKNOW)
+        {
+            // Explicit locale but no locale data thus assigned to system
+            // locale, preserve for roundtrip, write only to the first
+            // subformat.
+            if (n == 0)
+                nLanguageID = maLocale.meLanguageWithoutLocaleData;
+        }
         if ( nCalendarID > 0 )
         {   // Add alphabet and language to calendar
             if ( nAlphabetID == 0 )


More information about the Libreoffice-commits mailing list