[Libreoffice-commits] core.git: sw/inc sw/source

Justin Luth justin_luth at sil.org
Wed Jun 7 04:54:02 UTC 2017


 sw/inc/doc.hxx                     |    2 ++
 sw/source/core/docnode/ndtbl.cxx   |   17 +++++++++++++++++
 sw/source/core/edit/edtab.cxx      |    2 +-
 sw/source/core/fields/cellfml.cxx  |    4 ++--
 sw/source/core/fields/fldbas.cxx   |    4 +---
 sw/source/core/fields/usrfld.cxx   |    4 +---
 sw/source/core/table/swtable.cxx   |   10 +++++-----
 sw/source/core/txtnode/fmtatr2.cxx |    5 +----
 sw/source/core/unocore/unotbl.cxx  |    2 +-
 9 files changed, 31 insertions(+), 19 deletions(-)

New commits:
commit 9d6bf9d45d43a00f6dc87b9c83d28b93450ec51d
Author: Justin Luth <justin_luth at sil.org>
Date:   Wed Jan 11 14:33:39 2017 +0300

    tdf#74177 writer: ignoring comment allows number recognition
    
    The presence of an annotation anchor was causing number recognition
    to fail in Writer's table cells. Formulas accessing the cell
    read a value of zero.
    
    Annotation anchors are only used in SW right now, so SVL didn't
    want the overhead in their code. So this wrapper function should
    be called first to cleanup SW specific things that interfere
    with number recognition.  Specifically known to be needed in
    cellfml.cxx, but converted everywhere for consistency.
    
    The formula in older documents is not "fixed" during document loading
    since the table/formulas are not refreshed at load time.
    Only documents saved with incorrect results will notice this,
    and any cursor access inside the table will cause a refresh.
    Printing also causes a refresh (but not print preview or PDF export).
    
    So this patch only fixes document creation or modification, which
    should be adequate for this bug.
    
    Change-Id: Ib46f2b7899ae9a0fdc3aae5887bb2d61535d29f3
    Reviewed-on: https://gerrit.libreoffice.org/32909
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Justin Luth <justin_luth at sil.org>

diff --git a/sw/inc/doc.hxx b/sw/inc/doc.hxx
index 08c590a81024..e63fb0c7dd03 100644
--- a/sw/inc/doc.hxx
+++ b/sw/inc/doc.hxx
@@ -1252,6 +1252,8 @@ public:
     SwTableBoxFormat* MakeTableBoxFormat();
     SwTableLineFormat* MakeTableLineFormat();
 
+    // helper function: cleanup before checking number value
+    bool IsNumberFormat( const OUString& rString, sal_uInt32& F_Index, double& fOutNumber);
     // Check if box has numerical value. Change format of box if required.
     void ChkBoxNumFormat( SwTableBox& rAktBox, bool bCallUpdate );
     void SetTableBoxFormulaAttrs( SwTableBox& rBox, const SfxItemSet& rSet );
diff --git a/sw/source/core/docnode/ndtbl.cxx b/sw/source/core/docnode/ndtbl.cxx
index 9d427e613372..d5c9d5357a06 100644
--- a/sw/source/core/docnode/ndtbl.cxx
+++ b/sw/source/core/docnode/ndtbl.cxx
@@ -4032,6 +4032,23 @@ bool SwDoc::SetColRowWidthHeight( SwTableBox& rAktBox, TableChgWidthHeightType e
     return bRet;
 }
 
+bool SwDoc::IsNumberFormat( const OUString& rString, sal_uInt32& F_Index, double& fOutNumber )
+{
+    if( rString.getLength() > 308 ) // optimization matches svl:IsNumberFormat arbitrary value
+        return false;
+
+    // remove any comment anchor marks
+    OUStringBuffer sStringBuffer(rString);
+    sal_Int32 nCommentPosition = sStringBuffer.indexOf( CH_TXTATR_INWORD );
+    while( nCommentPosition != -1 )
+    {
+        sStringBuffer.remove( nCommentPosition, 1 );
+        nCommentPosition = sStringBuffer.indexOf( CH_TXTATR_INWORD, nCommentPosition );
+    }
+
+    return GetNumberFormatter()->IsNumberFormat( sStringBuffer.makeStringAndClear(), F_Index, fOutNumber );
+}
+
 void SwDoc::ChkBoxNumFormat( SwTableBox& rBox, bool bCallUpdate )
 {
     // Optimization: If the Box says it's Text, it remains Text
diff --git a/sw/source/core/edit/edtab.cxx b/sw/source/core/edit/edtab.cxx
index e547f40ba83e..af961388cba9 100644
--- a/sw/source/core/edit/edtab.cxx
+++ b/sw/source/core/edit/edtab.cxx
@@ -400,7 +400,7 @@ bool SwEditShell::IsTableBoxTextFormat() const
         return false;
 
     double fVal;
-    return !GetDoc()->GetNumberFormatter()->IsNumberFormat( rText, nFormat, fVal );
+    return !GetDoc()->IsNumberFormat( rText, nFormat, fVal );
 }
 
 OUString SwEditShell::GetTableBoxText() const
diff --git a/sw/source/core/fields/cellfml.cxx b/sw/source/core/fields/cellfml.cxx
index c0655b2de3f7..1be01755be5a 100644
--- a/sw/source/core/fields/cellfml.cxx
+++ b/sw/source/core/fields/cellfml.cxx
@@ -224,12 +224,12 @@ double SwTableBox::GetValue( SwTableCalcPara& rCalcPara ) const
                     css::util::NumberFormat::PERCENT == pNumFormatr->GetType( nFormatIndex ))
             {
                 sal_uInt32 nTmpFormat = 0;
-                if( pNumFormatr->IsNumberFormat( sText, nTmpFormat, aNum ) &&
+                if( pDoc->IsNumberFormat( sText, nTmpFormat, aNum ) &&
                     css::util::NumberFormat::NUMBER == pNumFormatr->GetType( nTmpFormat ))
                     sText += "%";
             }
 
-            if( pNumFormatr->IsNumberFormat( sText, nFormatIndex, aNum ))
+            if( pDoc->IsNumberFormat( sText, nFormatIndex, aNum ))
                 nRet = aNum;
         }
         // ?? otherwise it is an error
diff --git a/sw/source/core/fields/fldbas.cxx b/sw/source/core/fields/fldbas.cxx
index 1bd796bb66f0..0eca840c2311 100644
--- a/sw/source/core/fields/fldbas.cxx
+++ b/sw/source/core/fields/fldbas.cxx
@@ -702,9 +702,7 @@ void SwFormulaField::SetExpandedFormula( const OUString& rStr )
     {
         double fTmpValue;
 
-        SvNumberFormatter* pFormatter = GetDoc()->GetNumberFormatter();
-
-        if (pFormatter->IsNumberFormat(rStr, nFormat, fTmpValue))
+        if (GetDoc()->IsNumberFormat(rStr, nFormat, fTmpValue))
         {
             SwValueField::SetValue(fTmpValue);
 
diff --git a/sw/source/core/fields/usrfld.cxx b/sw/source/core/fields/usrfld.cxx
index 080dcfc77bd1..845d02de6582 100644
--- a/sw/source/core/fields/usrfld.cxx
+++ b/sw/source/core/fields/usrfld.cxx
@@ -259,9 +259,7 @@ void SwUserFieldType::SetContent( const OUString& rStr, sal_uInt32 nFormat )
         {
             double fValue;
 
-            SvNumberFormatter* pFormatter = GetDoc()->GetNumberFormatter();
-
-            if (pFormatter->IsNumberFormat(rStr, nFormat, fValue))
+            if (GetDoc()->IsNumberFormat(rStr, nFormat, fValue))
             {
                 SetValue(fValue);
                 aContent = DoubleToString(fValue, nFormat);
diff --git a/sw/source/core/table/swtable.cxx b/sw/source/core/table/swtable.cxx
index ca0efb0f9353..281249f700f7 100644
--- a/sw/source/core/table/swtable.cxx
+++ b/sw/source/core/table/swtable.cxx
@@ -2293,19 +2293,19 @@ void SwTableBoxFormat::Modify( const SfxPoolItem* pOld, const SfxPoolItem* pNew
                                         pNumFormatr->GetType( nNewFormat ))
                                     {
                                         sal_uInt32 nTmpFormat = 0;
-                                        if( pNumFormatr->IsNumberFormat(
+                                        if( GetDoc()->IsNumberFormat(
                                                     aText, nTmpFormat, fVal ))
                                         {
                                             if( css::util::NumberFormat::NUMBER ==
                                                 pNumFormatr->GetType( nTmpFormat ))
                                                 aText += "%";
 
-                                            bIsNumFormat = pNumFormatr->IsNumberFormat(
+                                            bIsNumFormat = GetDoc()->IsNumberFormat(
                                                         aText, nTmpFormatIdx, fVal );
                                         }
                                     }
                                     else
-                                        bIsNumFormat = pNumFormatr->IsNumberFormat(
+                                        bIsNumFormat = GetDoc()->IsNumberFormat(
                                                         aText, nTmpFormatIdx, fVal );
 
                                     if( bIsNumFormat )
@@ -2393,7 +2393,7 @@ bool SwTableBox::HasNumContent( double& rNum, sal_uInt32& rFormatIndex,
             if( !rIsEmptyTextNd && css::util::NumberFormat::PERCENT == pNumFormatr->GetType( rFormatIndex ))
             {
                 sal_uInt32 nTmpFormat = 0;
-                if( pNumFormatr->IsNumberFormat( aText, nTmpFormat, rNum ) &&
+                if( GetFrameFormat()->GetDoc()->IsNumberFormat( aText, nTmpFormat, rNum ) &&
                     css::util::NumberFormat::NUMBER == pNumFormatr->GetType( nTmpFormat ))
                     aText += "%";
             }
@@ -2401,7 +2401,7 @@ bool SwTableBox::HasNumContent( double& rNum, sal_uInt32& rFormatIndex,
         else
             rFormatIndex = 0;
 
-        bRet = pNumFormatr->IsNumberFormat( aText, rFormatIndex, rNum );
+        bRet = GetFrameFormat()->GetDoc()->IsNumberFormat( aText, rFormatIndex, rNum );
     }
     else
         rIsEmptyTextNd = false;
diff --git a/sw/source/core/txtnode/fmtatr2.cxx b/sw/source/core/txtnode/fmtatr2.cxx
index f8ef2b31698b..d26594caf222 100644
--- a/sw/source/core/txtnode/fmtatr2.cxx
+++ b/sw/source/core/txtnode/fmtatr2.cxx
@@ -754,11 +754,8 @@ sal_uInt32 MetaField::GetNumberFormat(OUString const & rContent) const
     SwTextNode * const pTextNode( GetTextNode() );
     if (pTextNode)
     {
-        SvNumberFormatter *const pNumberFormatter(
-                pTextNode->GetDoc()->GetNumberFormatter() );
         double number;
-        (void) pNumberFormatter->IsNumberFormat(
-                rContent, nNumberFormat, number );
+        (void) pTextNode->GetDoc()->IsNumberFormat( rContent, nNumberFormat, number );
     }
     return nNumberFormat;
 }
diff --git a/sw/source/core/unocore/unotbl.cxx b/sw/source/core/unocore/unotbl.cxx
index 4754febbc808..1c00d99e4461 100644
--- a/sw/source/core/unocore/unotbl.cxx
+++ b/sw/source/core/unocore/unotbl.cxx
@@ -1238,7 +1238,7 @@ double SwXCell::GetForcedNumericalValue() const
         nFIndex = pNumFormatter->GetStandardIndex( eLang );
     }
     double fTmp;
-    if (!pNumFormatter->IsNumberFormat(const_cast<SwXCell*>(this)->getString(), nFIndex, fTmp))
+    if (!const_cast<SwDoc*>(GetDoc())->IsNumberFormat(const_cast<SwXCell*>(this)->getString(), nFIndex, fTmp))
         ::rtl::math::setNan(&fTmp);
     return fTmp;
 }


More information about the Libreoffice-commits mailing list