include/svl/zforlist.hxx         |    2 ++
 svl/source/numbers/zforlist.cxx  |    8 ++++++++
 sw/source/core/table/swtable.cxx |   15 +++++++++++++--
 3 files changed, 23 insertions(+), 2 deletions(-)

New commits:
commit b6653e577af8e2902dbe2609d14dbbedbc4441f7
Author:     Justin Luth <justin_l...@sil.org>
AuthorDate: Wed Oct 20 18:09:46 2021 +0200
Commit:     Michael Stahl <michael.st...@allotropia.de>
CommitDate: Mon Jun 13 16:59:32 2022 +0200

    tdf#131025 swtable: don't apply number format to non-number text
    
    Applying a numbering style to text causes export to save that
    out as a number (valued as zero). That is not good because
    the ODF spec says that a number overrides a string.
    
    So don't accept a numbering format on non-number text.
    
    Why is this change good?
    -the cell previously had no direct formatting (by definition).
    -the cell's previous old format was text (tested).
    -any numbering format applied obviously isn't correct (by definition).
    -any previous formatting has already been overwritten with numformat.
    -the default numbering is appropriate for text.
    -empty cells still get the numbering format (tested).
    -odd human-designed formats are accepted as intentional (tested).
    
    What are the concerns?
    -the scope of this change is HUGE, way beyond this bug.
    -on both my dev box and patch box I saw occassional crashes.
    -the bug was "fixed" by a different import commit that ensured
     different languages were treated consistently.
     So this patch is no longer critical, just nice to have
     to avoid exporting out-of-spec content.
    
    Change-Id: Id3dc5f803c3cf4875bc0cab52d1019a18679da77
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/123904
    Tested-by: Jenkins
    Reviewed-by: Justin Luth <justin_l...@sil.org>
    Reviewed-by: Eike Rathke <er...@redhat.com>
    (cherry picked from commit 546e7d14b397cfd1210b891c8dc4a195c25f3876)
    
      Conflicts:
            include/svl/numformat.hxx
            svl/source/numbers/zforlist.cxx
            sw/source/core/table/swtable.cxx
    
    Change-Id: I94db018babf0323d84809accaaa898a9caf8edbe
    (cherry picked from commit 66a6cb0e02e5ea9cb4a75258928103f7ecd07f36)

diff --git a/include/svl/zforlist.hxx b/include/svl/zforlist.hxx
index 8b1574cf8a08..e8afdb225a7b 100644
--- a/include/svl/zforlist.hxx
+++ b/include/svl/zforlist.hxx
@@ -601,6 +601,8 @@ public:
                                      sal_uInt16& nPrecision, sal_uInt16& 
nLeadingCnt,
                                      LanguageType eLnge = LANGUAGE_DONTKNOW );
 
+    bool IsUserDefinedAndNotOverloaded(sal_uInt32 F_Index) const;
+
     /// Check if format code string may be deleted by user
     bool IsUserDefined( const OUString& sStr, LanguageType eLnge = 
LANGUAGE_DONTKNOW );
 
diff --git a/svl/source/numbers/zforlist.cxx b/svl/source/numbers/zforlist.cxx
index 3da7ab43c449..caa07e5002e9 100644
--- a/svl/source/numbers/zforlist.cxx
+++ b/svl/source/numbers/zforlist.cxx
@@ -3044,6 +3044,14 @@ OUString SvNumberFormatter::GenerateFormat(sal_uInt32 
nIndex,
     return sString.makeStringAndClear();
 }
 
+bool SvNumberFormatter::IsUserDefinedAndNotOverloaded(sal_uInt32 F_Index) const
+{
+    ::osl::MutexGuard aGuard( GetInstanceMutex() );
+    const SvNumberformat* pFormat = GetFormatEntry(F_Index);
+
+    return pFormat && (pFormat->GetType() & SvNumFormatType::DEFINED);
+}
+
 bool SvNumberFormatter::IsUserDefined(const OUString& sStr,
                                       LanguageType eLnge)
 {
diff --git a/sw/source/core/table/swtable.cxx b/sw/source/core/table/swtable.cxx
index fdc1633e7c73..c6a527abdb36 100644
--- a/sw/source/core/table/swtable.cxx
+++ b/sw/source/core/table/swtable.cxx
@@ -2326,6 +2326,7 @@ void SwTableBoxFormat::Modify( const SfxPoolItem* pOld, 
const SfxPoolItem* pNew
                         // format contents with the new value assigned and 
write to paragraph
                         Color* pCol = nullptr;
                         OUString sNewText;
+                        bool bChangeFormat = true;
                         if( DBL_MAX == fVal )
                         {
                             sNewText = SwViewShell::GetShellRes()->aCalc_Error;
@@ -2350,6 +2351,14 @@ void SwTableBoxFormat::Modify( const SfxPoolItem* pOld, 
const SfxPoolItem* pNew
 #else
                                 sNewText = aOrigText;
 #endif
+                                // Remove the newly assigned numbering format 
as well if text actually exists.
+                                // Exception: assume user-defined formats are 
always intentional.
+                                if (bChgText && 
pNumFormatr->IsTextFormat(nOldFormat)
+                                    && 
!pNumFormatr->IsUserDefinedAndNotOverloaded(nNewFormat))
+                                {
+                                    
pBox->GetFrameFormat()->ResetFormatAttr(RES_BOXATR_FORMAT);
+                                    bChangeFormat = false;
+                                }
                             }
 
                             if( !bChgText )
@@ -2359,9 +2368,11 @@ void SwTableBoxFormat::Modify( const SfxPoolItem* pOld, 
const SfxPoolItem* pNew
                         }
 
                         // across all boxes
-                        ChgTextToNum( *pBox, sNewText, pCol,
+                        if (bChangeFormat)
+                        {
+                            ChgTextToNum( *pBox, sNewText, pCol,
                                         GetDoc()->IsInsTableAlignNum() );
-
+                        }
                     }
                     else if( bNewIsTextFormat && nOldFormat != nNewFormat )
                     {

Reply via email to