sc/qa/unit/data/ods/volatile.ods |binary sc/qa/unit/subsequent_filters-test.cxx | 24 ++++++++++++++++++++++++ sc/source/core/data/cell.cxx | 4 ++++ sc/source/filter/xml/xmlcelli.cxx | 33 +++++++++++++++------------------ sc/source/filter/xml/xmlcelli.hxx | 2 ++ sc/source/ui/docshell/docsh.cxx | 2 ++ 6 files changed, 47 insertions(+), 18 deletions(-)
New commits: commit 58d870236487e09a7ffd6676854306d90ff5b31a Author: Daniel Bankston <daniel.e.banks...@gmail.com> Date: Wed Jul 11 01:54:46 2012 -0500 Add test for volatile functions for ODS import Change-Id: If2f85e32ddeb9f25b4a355ce5451dc04925bbbc9 diff --git a/sc/qa/unit/data/ods/volatile.ods b/sc/qa/unit/data/ods/volatile.ods new file mode 100644 index 0000000..6278de7 Binary files /dev/null and b/sc/qa/unit/data/ods/volatile.ods differ diff --git a/sc/qa/unit/subsequent_filters-test.cxx b/sc/qa/unit/subsequent_filters-test.cxx index 537b565..1ebb359 100644 --- a/sc/qa/unit/subsequent_filters-test.cxx +++ b/sc/qa/unit/subsequent_filters-test.cxx @@ -103,6 +103,7 @@ public: void testHardRecalcODS(); void testFunctionsODS(); void testCachedFormulaResultsODS(); + void testVolatileFunctionsODS(); void testCachedMatrixFormulaResultsODS(); void testDatabaseRangesODS(); void testDatabaseRangesXLS(); @@ -137,6 +138,7 @@ public: CPPUNIT_TEST(testHardRecalcODS); CPPUNIT_TEST(testFunctionsODS); CPPUNIT_TEST(testCachedFormulaResultsODS); + CPPUNIT_TEST(testVolatileFunctionsODS); CPPUNIT_TEST(testCachedMatrixFormulaResultsODS); CPPUNIT_TEST(testDatabaseRangesODS); CPPUNIT_TEST(testDatabaseRangesXLS); @@ -378,6 +380,28 @@ void ScFiltersTest::testCachedFormulaResultsODS() xDocSh->DoClose(); } +void ScFiltersTest::testVolatileFunctionsODS() +{ + const rtl::OUString aFileNameBase(RTL_CONSTASCII_USTRINGPARAM("volatile.")); + ScDocShellRef xDocSh = loadDoc( aFileNameBase, ODS ); + + CPPUNIT_ASSERT_MESSAGE("Failed to load volatile.ods", xDocSh.Is()); + ScDocument* pDoc = xDocSh->GetDocument(); + + //we want to me sure that volatile functions are always recalculated + //regardless of cached results. if you update the ods file, you must + //update the values here. + //if NOW() is recacluated, then it should never equal sTodayCache + OUString sTodayCache("07/11/12 12:28 AM"); + OUString sTodayRecalc(pDoc->GetString(0,1,0)); + CPPUNIT_ASSERT(sTodayCache != sTodayRecalc); + + OUString sTodayRecalcRef(pDoc->GetString(2,1,0)); + CPPUNIT_ASSERT(sTodayCache != sTodayRecalcRef); + + xDocSh->DoClose(); +} + void ScFiltersTest::testCachedMatrixFormulaResultsODS() { const rtl::OUString aFileNameBase(RTL_CONSTASCII_USTRINGPARAM("matrix.")); commit e559d58ffcf0fa0019b0ae001786d021af79813b Author: Daniel Bankston <daniel.e.banks...@gmail.com> Date: Tue Jul 10 23:54:03 2012 -0500 Always Recalc volatile formula cells in import -Previous method was flawed. It actually works now. -Thanks to Kohei and Markus for helping me with this. -Thanks to Markus for finally coming up with the actual solution. Change-Id: Iad28da12c548c583df14ab7d71f4cee8ccc3552a diff --git a/sc/source/core/data/cell.cxx b/sc/source/core/data/cell.cxx index 338b0ab..421f401 100644 --- a/sc/source/core/data/cell.cxx +++ b/sc/source/core/data/cell.cxx @@ -1099,6 +1099,10 @@ void ScFormulaCell::CompileXML( ScProgress& rProgress ) // (for macro warning, CompileXML is called at the end of loading XML file) if ( !pDocument->GetHasMacroFunc() && pCode->HasOpCodeRPN( ocMacro ) ) pDocument->SetHasMacroFunc( true ); + + //volatile cells must be added here for import + if( pCode->IsRecalcModeAlways() ) + pDocument->PutInFormulaTree(this); } diff --git a/sc/source/filter/xml/xmlcelli.cxx b/sc/source/filter/xml/xmlcelli.cxx index e78ec68..53adbc2 100644 --- a/sc/source/filter/xml/xmlcelli.cxx +++ b/sc/source/filter/xml/xmlcelli.cxx @@ -749,8 +749,7 @@ void ScXMLTableRowCellContext::SetFormulaCell(ScFormulaCell* pFCell) const pFCell->SetHybridString( *pOUTextValue ); else pFCell->SetHybridDouble( fValue ); - if( !pFCell->GetCode()->IsRecalcModeAlways() ) - pFCell->ResetDirty(); + pFCell->ResetDirty(); } } @@ -773,8 +772,7 @@ void ScXMLTableRowCellContext::AddTextCellToDoc( const ScAddress& rCurrentPos, pFCell->SetHybridString( *pOUText ); else bDoIncrement = false; - if( !pFCell->GetCode()->IsRecalcModeAlways() ) - pFCell->ResetDirty(); + pFCell->ResetDirty(); } } else diff --git a/sc/source/ui/docshell/docsh.cxx b/sc/source/ui/docshell/docsh.cxx index 6c3bb24..838fd13 100644 --- a/sc/source/ui/docshell/docsh.cxx +++ b/sc/source/ui/docshell/docsh.cxx @@ -458,6 +458,8 @@ sal_Bool ScDocShell::LoadXML( SfxMedium* pLoadMedium, const ::com::sun::star::un rtl::OUString sGenerator(xDocProps->getGenerator()); if(sGenerator.indexOf(SC_LIBO_PROD_NAME) == -1) DoHardRecalc(false); + else //still need to recalc volatile formula cells + DoRecalc(false); aDocument.SetXMLFromWrapper( false ); AfterXMLLoading(bRet); commit 1f7b58aeb1cfd2428c185108133606fb894ca04f Author: Daniel Bankston <daniel.e.banks...@gmail.com> Date: Tue Jul 10 15:11:35 2012 -0500 Reduce some redundant code Change-Id: I23bf34793c8a1409c8753f572a6122dee2f4128f diff --git a/sc/source/filter/xml/xmlcelli.cxx b/sc/source/filter/xml/xmlcelli.cxx index 99f00bd..e78ec68 100644 --- a/sc/source/filter/xml/xmlcelli.cxx +++ b/sc/source/filter/xml/xmlcelli.cxx @@ -741,6 +741,19 @@ void ScXMLTableRowCellContext::SetCellRangeSource( const ScAddress& rPosition ) } } +void ScXMLTableRowCellContext::SetFormulaCell(ScFormulaCell* pFCell) const +{ + if(pFCell) + { + if( bFormulaTextResult && pOUTextValue && !pOUTextValue->isEmpty() ) + pFCell->SetHybridString( *pOUTextValue ); + else + pFCell->SetHybridDouble( fValue ); + if( !pFCell->GetCode()->IsRecalcModeAlways() ) + pFCell->ResetDirty(); + } +} + void ScXMLTableRowCellContext::AddTextCellToDoc( const ScAddress& rCurrentPos, const SCCOL nCurrentCol, const ::boost::optional< rtl::OUString >& pOUText ) { @@ -795,12 +808,7 @@ void ScXMLTableRowCellContext::AddNumberCellToDoc( const ScAddress& rCurrentPos if ( pCell && pCell->GetCellType() == CELLTYPE_FORMULA ) { ScFormulaCell* pFCell = static_cast<ScFormulaCell*>(pCell); - if( bFormulaTextResult && pOUTextValue && !pOUTextValue->isEmpty() ) - pFCell->SetHybridString( *pOUTextValue ); - else - pFCell->SetHybridDouble( fValue ); - if( !pFCell->GetCode()->IsRecalcModeAlways() ) - pFCell->ResetDirty(); + SetFormulaCell(pFCell); } } else @@ -1027,12 +1035,7 @@ void ScXMLTableRowCellContext::AddNonMatrixFormulaCell( const ScAddress& rCellPo delete pCode; ScFormulaCell* pFCell = static_cast<ScFormulaCell*>(pNewCell); - if( bFormulaTextResult && pOUTextValue && !pOUTextValue->isEmpty() ) - pFCell->SetHybridString( *pOUTextValue ); - else - pFCell->SetHybridDouble( fValue ); - if( !(pFCell->GetCode()->IsRecalcModeOnLoad() || !pFCell->GetCode()->IsRecalcModeOnLoadOnce()) ) - pFCell->ResetDirty(); + SetFormulaCell(pFCell); } else if ( aText[0] == '\'' && aText.getLength() > 1 ) { @@ -1078,15 +1081,7 @@ void ScXMLTableRowCellContext::AddFormulaCell( const ScAddress& rCellPos ) //add the cached formula result of the first matrix position ScFormulaCell* pFCell = static_cast<ScFormulaCell*>( rXMLImport.GetDocument()->GetCell(rCellPos) ); - if(pFCell) - { - if( bFormulaTextResult && pOUTextValue && !pOUTextValue->isEmpty() ) - pFCell->SetHybridString( *pOUTextValue ); - else - pFCell->SetHybridDouble( fValue ); - if( !pFCell->GetCode()->IsRecalcModeAlways() ) - pFCell->ResetDirty(); - } + SetFormulaCell(pFCell); } } else diff --git a/sc/source/filter/xml/xmlcelli.hxx b/sc/source/filter/xml/xmlcelli.hxx index 3df155e..9b038c6 100644 --- a/sc/source/filter/xml/xmlcelli.hxx +++ b/sc/source/filter/xml/xmlcelli.hxx @@ -45,6 +45,7 @@ #include <boost/optional.hpp> class ScXMLImport; +class ScFormulaCell; struct ScXMLAnnotationData; class ScXMLTableRowCellContext : public SvXMLImportContext @@ -90,6 +91,7 @@ class ScXMLTableRowCellContext : public SvXMLImportContext bool HasSpecialContent() const; bool CellsAreRepeated() const; + void SetFormulaCell ( ScFormulaCell* pFCell ) const; void AddTextCellToDoc ( const ScAddress& rScCurrentPos, const SCCOL nCurrentCol, const ::boost::optional< rtl::OUString >& pOUText ); void AddNumberCellToDoc ( const ScAddress& rScCurrentPos ); commit 2f21028dd24f0b3883ad50cae9e1a577faa19c13 Author: Daniel Bankston <daniel.e.banks...@gmail.com> Date: Tue Jul 10 13:55:39 2012 -0500 Always recalc certain functions on import Change-Id: Ie8cffc4a856328dd658714726de7ca77028a33a7 diff --git a/sc/source/filter/xml/xmlcelli.cxx b/sc/source/filter/xml/xmlcelli.cxx index fc20f36..99f00bd 100644 --- a/sc/source/filter/xml/xmlcelli.cxx +++ b/sc/source/filter/xml/xmlcelli.cxx @@ -760,7 +760,8 @@ void ScXMLTableRowCellContext::AddTextCellToDoc( const ScAddress& rCurrentPos, pFCell->SetHybridString( *pOUText ); else bDoIncrement = false; - pFCell->ResetDirty(); + if( !pFCell->GetCode()->IsRecalcModeAlways() ) + pFCell->ResetDirty(); } } else @@ -798,7 +799,8 @@ void ScXMLTableRowCellContext::AddNumberCellToDoc( const ScAddress& rCurrentPos pFCell->SetHybridString( *pOUTextValue ); else pFCell->SetHybridDouble( fValue ); - pFCell->ResetDirty(); + if( !pFCell->GetCode()->IsRecalcModeAlways() ) + pFCell->ResetDirty(); } } else @@ -1029,7 +1031,8 @@ void ScXMLTableRowCellContext::AddNonMatrixFormulaCell( const ScAddress& rCellPo pFCell->SetHybridString( *pOUTextValue ); else pFCell->SetHybridDouble( fValue ); - pFCell->ResetDirty(); + if( !(pFCell->GetCode()->IsRecalcModeOnLoad() || !pFCell->GetCode()->IsRecalcModeOnLoadOnce()) ) + pFCell->ResetDirty(); } else if ( aText[0] == '\'' && aText.getLength() > 1 ) { @@ -1081,7 +1084,8 @@ void ScXMLTableRowCellContext::AddFormulaCell( const ScAddress& rCellPos ) pFCell->SetHybridString( *pOUTextValue ); else pFCell->SetHybridDouble( fValue ); - pFCell->ResetDirty(); + if( !pFCell->GetCode()->IsRecalcModeAlways() ) + pFCell->ResetDirty(); } } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits