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

Eike Rathke erack at redhat.com
Wed Nov 16 17:24:27 UTC 2016


 sc/inc/formulacell.hxx                |    7 ++++
 sc/inc/formularesult.hxx              |    7 ++++
 sc/inc/token.hxx                      |    4 ++
 sc/source/core/data/formulacell.cxx   |    5 +++
 sc/source/core/tool/formularesult.cxx |   50 +++++++++++++++++++++++++++-------
 sc/source/core/tool/token.cxx         |    7 +++-
 sc/source/filter/xml/xmlcelli.cxx     |   23 ++++++++++++---
 sc/source/filter/xml/xmlcelli.hxx     |    1 
 8 files changed, 86 insertions(+), 18 deletions(-)

New commits:
commit 83cbbc6d664d949f6405409713c5bda1a5be559f
Author: Eike Rathke <erack at redhat.com>
Date:   Wed Nov 16 18:23:25 2016 +0100

    tdf#96475 restore the EmptyDisplayedAsString condition during load
    
    So also "empty" result cells with a number format applied are displayed empty,
    instead of 1899-12-30 for example.
    
    Change-Id: I5280d0213b8a809a04c5cb152ded58028706493a

diff --git a/sc/inc/formulacell.hxx b/sc/inc/formulacell.hxx
index 180c856..d17e1e0 100644
--- a/sc/inc/formulacell.hxx
+++ b/sc/inc/formulacell.hxx
@@ -341,6 +341,13 @@ public:
         SetHybridString() or SetHybridFormula(), use SetHybridDouble() first
         for performance reasons.*/
     void SetHybridString( const svl::SharedString& r );
+    /** For import only: set an empty cell result to be displayed as empty string.
+        If for whatever reason you have to use both, SetHybridDouble() and
+        SetHybridEmptyDisplayedAsString() or SetHybridFormula(), use
+        SetHybridDouble() first for performance reasons and use
+        SetHybridEmptyDisplayedAsString() last because SetHybridDouble() and
+        SetHybridString() will override it.*/
+    void SetHybridEmptyDisplayedAsString();
     /** For import only: set a temporary formula string to be compiled later.
         If for whatever reason you have to use both, SetHybridDouble() and
         SetHybridString() or SetHybridFormula(), use SetHybridDouble() first
diff --git a/sc/inc/formularesult.hxx b/sc/inc/formularesult.hxx
index 0a977dc..033d45e 100644
--- a/sc/inc/formularesult.hxx
+++ b/sc/inc/formularesult.hxx
@@ -188,7 +188,7 @@ public:
     const OUString& GetHybridFormula() const;
 
     /** Should only be used by import filters, best in the order
-        SetHybridDouble(), SetHybridString(), or only SetHybridString() for
+        SetHybridDouble(), SetHybridString(), or only SetHybridFormula() for
         formula string to be compiled later. */
     SC_DLLPUBLIC void SetHybridDouble( double f );
 
@@ -198,6 +198,11 @@ public:
     SC_DLLPUBLIC void SetHybridString( const svl::SharedString & rStr );
 
     /** Should only be used by import filters, best in the order
+        SetHybridDouble(), SetHybridFormula(),
+        SetHybridEmptyDisplayedAsString() must be last. */
+    SC_DLLPUBLIC void SetHybridEmptyDisplayedAsString();
+
+    /** Should only be used by import filters, best in the order
         SetHybridDouble(), SetHybridString()/SetHybridFormula(), or only
         SetHybridFormula() for formula string to be compiled later. */
     SC_DLLPUBLIC void SetHybridFormula( const OUString & rFormula );
diff --git a/sc/inc/token.hxx b/sc/inc/token.hxx
index 94a1da8..e8d313a 100644
--- a/sc/inc/token.hxx
+++ b/sc/inc/token.hxx
@@ -388,11 +388,13 @@ private:
     double mfDouble;
     svl::SharedString maString;
     OUString maFormula;
+    bool mbEmptyDisplayedAsString;
 public:
     ScHybridCellToken(
-        double f, const svl::SharedString & rStr, const OUString & rFormula );
+        double f, const svl::SharedString & rStr, const OUString & rFormula, bool bEmptyDisplayedAsString );
 
     const OUString& GetFormula() const  { return maFormula; }
+    bool IsEmptyDisplayedAsString() const   { return mbEmptyDisplayedAsString; }
     virtual double GetDouble() const override;
 
     virtual svl::SharedString GetString() const override;
diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index 5750aa3..1c95096 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -2464,6 +2464,11 @@ void ScFormulaCell::SetHybridString( const svl::SharedString& r )
     aResult.SetHybridString( r);
 }
 
+void ScFormulaCell::SetHybridEmptyDisplayedAsString()
+{
+    aResult.SetHybridEmptyDisplayedAsString();
+}
+
 void ScFormulaCell::SetHybridFormula( const OUString& r,
                                     const formula::FormulaGrammar::Grammar eGrammar )
 {
diff --git a/sc/source/core/tool/formularesult.cxx b/sc/source/core/tool/formularesult.cxx
index 2c1b646..7af64f3 100644
--- a/sc/source/core/tool/formularesult.cxx
+++ b/sc/source/core/tool/formularesult.cxx
@@ -243,14 +243,27 @@ bool ScFormulaResult::IsEmptyDisplayedAsString() const
 {
     if (mbEmpty)
         return mbEmptyDisplayedAsString;
-    if (GetType() == formula::svMatrixCell)
+    switch (GetType())
     {
-        // don't need to test for mpToken here, GetType() already did it
-        const ScEmptyCellToken* p = dynamic_cast<const ScEmptyCellToken*>(
-                static_cast<const ScMatrixCellResultToken*>(
-                    mpToken)->GetUpperLeftToken().get());
-        if (p)
-            return p->IsDisplayedAsString();
+        case formula::svMatrixCell:
+            {
+                // don't need to test for mpToken here, GetType() already did it
+                const ScEmptyCellToken* p = dynamic_cast<const ScEmptyCellToken*>(
+                        static_cast<const ScMatrixCellResultToken*>(
+                            mpToken)->GetUpperLeftToken().get());
+                if (p)
+                    return p->IsDisplayedAsString();
+            }
+        break;
+        case formula::svHybridCell:
+            {
+                const ScHybridCellToken* p = dynamic_cast<const ScHybridCellToken*>(mpToken);
+                if (p)
+                    return p->IsEmptyDisplayedAsString();
+            }
+        break;
+        default:
+        break;
     }
     return false;
 }
@@ -505,7 +518,7 @@ void ScFormulaResult::SetHybridDouble( double f )
             svl::SharedString aString = GetString();
             OUString aFormula( GetHybridFormula());
             mpToken->DecRef();
-            mpToken = new ScHybridCellToken( f, aString, aFormula);
+            mpToken = new ScHybridCellToken( f, aString, aFormula, false);
             mpToken->IncRef();
         }
     }
@@ -525,7 +538,24 @@ void ScFormulaResult::SetHybridString( const svl::SharedString& rStr )
     ResetToDefaults();
     if (mbToken && mpToken)
         mpToken->DecRef();
-    mpToken = new ScHybridCellToken( f, rStr, aFormula);
+    mpToken = new ScHybridCellToken( f, rStr, aFormula, false);
+    mpToken->IncRef();
+    mbToken = true;
+}
+
+void ScFormulaResult::SetHybridEmptyDisplayedAsString()
+{
+    // Obtain values before changing anything.
+    double f = GetDouble();
+    OUString aFormula( GetHybridFormula());
+    svl::SharedString aStr = GetString();
+    ResetToDefaults();
+    if (mbToken && mpToken)
+        mpToken->DecRef();
+    // XXX NOTE: we can't use mbEmpty and mbEmptyDisplayedAsString here because
+    // GetType() intentionally returns svEmptyCell if mbEmpty==true. So stick
+    // it into the ScHybridCellToken.
+    mpToken = new ScHybridCellToken( f, aStr, aFormula, true);
     mpToken->IncRef();
     mbToken = true;
 }
@@ -538,7 +568,7 @@ void ScFormulaResult::SetHybridFormula( const OUString & rFormula )
     ResetToDefaults();
     if (mbToken && mpToken)
         mpToken->DecRef();
-    mpToken = new ScHybridCellToken( f, aStr, rFormula);
+    mpToken = new ScHybridCellToken( f, aStr, rFormula, false);
     mpToken->IncRef();
     mbToken = true;
 }
diff --git a/sc/source/core/tool/token.cxx b/sc/source/core/tool/token.cxx
index 9e3c956..880be09 100644
--- a/sc/source/core/tool/token.cxx
+++ b/sc/source/core/tool/token.cxx
@@ -1154,11 +1154,14 @@ void ScMatrixFormulaCellToken::ResetResult()
 }
 
 ScHybridCellToken::ScHybridCellToken(
-    double f, const svl::SharedString & rStr, const OUString & rFormula ) :
+    double f, const svl::SharedString & rStr, const OUString & rFormula, bool bEmptyDisplayedAsString ) :
         FormulaToken( formula::svHybridCell ),
         mfDouble( f ), maString( rStr ),
-        maFormula( rFormula )
+        maFormula( rFormula ),
+        mbEmptyDisplayedAsString( bEmptyDisplayedAsString)
 {
+    // caller, make up your mind..
+    assert( !bEmptyDisplayedAsString || (f == 0.0 && rStr.getString().isEmpty()));
 }
 
 double ScHybridCellToken::GetDouble() const { return mfDouble; }
diff --git a/sc/source/filter/xml/xmlcelli.cxx b/sc/source/filter/xml/xmlcelli.cxx
index f224852..6ac6a4c 100644
--- a/sc/source/filter/xml/xmlcelli.cxx
+++ b/sc/source/filter/xml/xmlcelli.cxx
@@ -165,7 +165,8 @@ ScXMLTableRowCellContext::ScXMLTableRowCellContext( ScXMLImport& rImport,
     mbCheckWithCompilerForError(false),
     mbEditEngineHasText(false),
     mbHasFormatRuns(false),
-    mbHasStyle(false)
+    mbHasStyle(false),
+    mbPossibleEmptyDisplay(false)
 {
     rtl::math::setNan(&fValue); // NaN by default
 
@@ -1028,6 +1029,8 @@ void ScXMLTableRowCellContext::SetFormulaCell(ScFormulaCell* pFCell) const
         else if (rtl::math::isFinite(fValue))
         {
             pFCell->SetHybridDouble(fValue);
+            if (mbPossibleEmptyDisplay && fValue == 0.0)
+                pFCell->SetHybridEmptyDisplayedAsString();
             pFCell->ResetDirty();
         }
     }
@@ -1452,12 +1455,24 @@ void ScXMLTableRowCellContext::AddFormulaCell( const ScAddress& rCellPos )
 // Libreoffice 4.1+ with ODF1.2 extended write however calcext:value-type="error" in that case
 void ScXMLTableRowCellContext::HasSpecialCaseFormulaText()
 {
-    if (!mbEditEngineHasText || mbNewValueType)
+    if (!mbEditEngineHasText)
         return;
 
-    OUString aStr = GetFirstParagraph();
+    const OUString aStr = GetFirstParagraph();
 
-    if (aStr.isEmpty() || aStr.startsWith("Err:"))
+    if (mbNewValueType)
+    {
+        if (aStr.isEmpty())
+            mbPossibleEmptyDisplay = true;
+        return;
+    }
+
+    if (aStr.isEmpty())
+    {
+        mbPossibleErrorCell = true;
+        mbPossibleEmptyDisplay = true;
+    }
+    else if (aStr.startsWith("Err:"))
         mbPossibleErrorCell = true;
     else if (aStr.startsWith("#"))
         mbCheckWithCompilerForError = true;
diff --git a/sc/source/filter/xml/xmlcelli.hxx b/sc/source/filter/xml/xmlcelli.hxx
index b84be0a..9765ca7 100644
--- a/sc/source/filter/xml/xmlcelli.hxx
+++ b/sc/source/filter/xml/xmlcelli.hxx
@@ -96,6 +96,7 @@ class ScXMLTableRowCellContext : public ScXMLImportContext
     bool mbEditEngineHasText;
     bool mbHasFormatRuns;
     bool mbHasStyle;
+    bool mbPossibleEmptyDisplay;
 
     void DoMerge(const ScAddress& rScCellPos, const SCCOL nCols, const SCROW nRows);
 


More information about the Libreoffice-commits mailing list