[Libreoffice-commits] .: Branch 'feature/gsoc-calc-perf2' - 2 commits - sc/inc sc/qa sc/source
Daniel Bankston
dbank at kemper.freedesktop.org
Tue Jul 3 01:12:56 PDT 2012
sc/inc/document.hxx | 3 +
sc/qa/unit/subsequent_filters-test.cxx | 61 +++++++++++++--------------------
sc/source/core/data/cell.cxx | 3 +
sc/source/core/data/documen2.cxx | 1
sc/source/filter/xml/xmlcelli.cxx | 17 +++++++--
sc/source/filter/xml/xmlimprt.cxx | 12 ++++--
sc/source/ui/docshell/docsh.cxx | 2 -
7 files changed, 54 insertions(+), 45 deletions(-)
New commits:
commit 7a0fba0b0225f59f8c38b245cb21b81750271e26
Author: Daniel Bankston <daniel.e.bankston at gmail.com>
Date: Tue Jul 3 03:06:29 2012 -0500
Use imported formula results if ODS doc was generated by LibreOffice
During ODS import, use imported formula results instead of recalculating if
the document was generated by LibreOffice.
Still need to implement recalculating special cases such as NOW().
Change-Id: Ia54690224dc0d8f74b93cafd8d01b072e85c7416
diff --git a/sc/inc/document.hxx b/sc/inc/document.hxx
index b4df35b..7559a4e 100644
--- a/sc/inc/document.hxx
+++ b/sc/inc/document.hxx
@@ -371,6 +371,7 @@ private:
bool bInsertingFromOtherDoc;
bool bLoadingMedium;
bool bImportingXML; // special handling of formula text
+ bool bImportingLiboGenDoc; //to avoid recalculating formula results of libo generated docs
bool bXMLFromWrapper; // distinguish ScXMLImportWrapper from external component
bool bCalcingAfterLoad; // in CalcAfterLoad TRUE
// don't construct/destruct listeners temporarily
@@ -1563,6 +1564,8 @@ public:
void SetLoadingMedium( bool bVal );
void SetImportingXML( bool bVal );
bool IsImportingXML() const { return bImportingXML; }
+ void SetImportingLiboGenDoc( bool bVal ) { bImportingLiboGenDoc = bVal; };
+ bool IsImportingLiboGenDoc() const { return bImportingLiboGenDoc; }
void SetXMLFromWrapper( bool bVal );
bool IsXMLFromWrapper() const { return bXMLFromWrapper; }
void SetCalcingAfterLoad( bool bVal ) { bCalcingAfterLoad = bVal; }
diff --git a/sc/source/core/data/cell.cxx b/sc/source/core/data/cell.cxx
index 338b0ab..4d12292 100644
--- a/sc/source/core/data/cell.cxx
+++ b/sc/source/core/data/cell.cxx
@@ -1830,7 +1830,8 @@ void ScFormulaCell::SetDirty()
void ScFormulaCell::SetDirtyVar()
{
- bDirty = true;
+ if(!pDocument->IsImportingLiboGenDoc())
+ bDirty = true;
// mark the sheet of this cell to be calculated
//#FIXME do we need to revert this remnant of old fake vba events? pDocument->AddCalculateTable( aPos.Tab() );
}
diff --git a/sc/source/core/data/documen2.cxx b/sc/source/core/data/documen2.cxx
index 2419859..0921f20 100644
--- a/sc/source/core/data/documen2.cxx
+++ b/sc/source/core/data/documen2.cxx
@@ -188,6 +188,7 @@ ScDocument::ScDocument( ScDocumentMode eMode,
bInsertingFromOtherDoc( false ),
bLoadingMedium( false ),
bImportingXML( false ),
+ bImportingLiboGenDoc( false ),
bXMLFromWrapper( false ),
bCalcingAfterLoad( false ),
bNoListening( false ),
diff --git a/sc/source/filter/xml/xmlcelli.cxx b/sc/source/filter/xml/xmlcelli.cxx
index 1457033..fac8481 100644
--- a/sc/source/filter/xml/xmlcelli.cxx
+++ b/sc/source/filter/xml/xmlcelli.cxx
@@ -757,6 +757,8 @@ void ScXMLTableRowCellContext::AddTextCellToDoc( const ScAddress& rCurrentPos,
pFCell->SetHybridString( *pOUText );
else
bDoIncrement = false;
+ if(rXMLImport.GetDocument()->IsImportingLiboGenDoc())
+ pFCell->ResetDirty();
}
}
else
@@ -788,7 +790,12 @@ void ScXMLTableRowCellContext::AddNumberCellToDoc( const ScAddress& rCurrentPos
{
ScBaseCell* pCell = rXMLImport.GetDocument()->GetCell( rCurrentPos );
if ( pCell && pCell->GetCellType() == CELLTYPE_FORMULA )
- static_cast<ScFormulaCell*>(pCell)->SetHybridDouble( fValue );
+ {
+ ScFormulaCell* pFCell = static_cast<ScFormulaCell*>(pCell);
+ pFCell->SetHybridDouble( fValue );
+ if(rXMLImport.GetDocument()->IsImportingLiboGenDoc())
+ pFCell->ResetDirty();
+ }
}
else
{
@@ -1013,10 +1020,13 @@ void ScXMLTableRowCellContext::AddNonMatrixFormulaCell( const ScAddress& rCellPo
pNewCell = new ScFormulaCell( pDoc, rCellPos, pCode, eGrammar, MM_NONE );
delete pCode;
+ ScFormulaCell* pFCell = static_cast<ScFormulaCell*>(pNewCell);
if( bFormulaTextResult && pOUTextValue && !pOUTextValue->isEmpty() )
- static_cast<ScFormulaCell*>(pNewCell)->SetHybridString( *pOUTextValue );
+ pFCell->SetHybridString( *pOUTextValue );
else
- static_cast<ScFormulaCell*>(pNewCell)->SetHybridDouble( fValue );
+ pFCell->SetHybridDouble( fValue );
+ if(pDoc->IsImportingLiboGenDoc())
+ pFCell->ResetDirty();
}
else if ( aText[0] == '\'' && aText.getLength() > 1 )
{
@@ -1036,7 +1046,6 @@ void ScXMLTableRowCellContext::AddNonMatrixFormulaCell( const ScAddress& rCellPo
else
pNewCell = ScBaseCell::CreateTextCell( aText, pDoc );
}
-
pDoc->PutCell( rCellPos, pNewCell );
}
}
diff --git a/sc/source/filter/xml/xmlimprt.cxx b/sc/source/filter/xml/xmlimprt.cxx
index 093c3bc..4b4b605 100644
--- a/sc/source/filter/xml/xmlimprt.cxx
+++ b/sc/source/filter/xml/xmlimprt.cxx
@@ -99,6 +99,7 @@
#define SC_REPEAT_ROW "repeat-row"
#define SC_FILTER "filter"
#define SC_PRINT_RANGE "print-range"
+#define SC_LIBO_PROD_NAME "LibreOffice"
using namespace com::sun::star;
using namespace ::xmloff::token;
@@ -2807,7 +2808,14 @@ throw(::com::sun::star::lang::IllegalArgumentException, ::com::sun::star::uno::R
uno::Reference<document::XActionLockable> xActionLockable(xDoc, uno::UNO_QUERY);
if (xActionLockable.is())
xActionLockable->addActionLock();
+
pDoc->EnableAdjustHeight(false);
+
+ uno::Reference<document::XDocumentPropertiesSupplier> xDPS(GetModel(), uno::UNO_QUERY_THROW);
+ uno::Reference<document::XDocumentProperties> xDocProps = xDPS->getDocumentProperties();
+ rtl::OUString sGenerator(xDocProps->getGenerator());
+ if(sGenerator.match(SC_LIBO_PROD_NAME))
+ pDoc->SetImportingLiboGenDoc(true);
}
// XServiceInfo
@@ -3111,10 +3119,8 @@ throw( ::com::sun::star::xml::sax::SAXException, ::com::sun::star::uno::RuntimeE
}
SvXMLImport::endDocument();
- if (pDoc && bSelfImportingXMLSet)
- {
+ if(pDoc && bSelfImportingXMLSet)
ScModelObj::getImplementation(GetModel())->AfterXMLLoading(true);
- }
}
// XEventListener
diff --git a/sc/source/ui/docshell/docsh.cxx b/sc/source/ui/docshell/docsh.cxx
index e70cf2d..8b96ca6 100644
--- a/sc/source/ui/docshell/docsh.cxx
+++ b/sc/source/ui/docshell/docsh.cxx
@@ -445,7 +445,7 @@ sal_Bool ScDocShell::LoadXML( SfxMedium* pLoadMedium, const ::com::sun::star::un
aDocument.SetXMLFromWrapper( false );
AfterXMLLoading(bRet);
-
+ aDocument.SetImportingLiboGenDoc(false);
//! row heights...
return bRet;
commit 783baa016375c79a7cc95257813a90d42dfe7f4c
Author: Daniel Bankston <daniel.e.bankston at gmail.com>
Date: Mon Jul 2 13:36:36 2012 -0500
Improve performance of data validity unit test
- Now using OStringBuffer instead of OString for multiple appends.
- Simplified logic.
Change-Id: I991c3e538439d68e242a7f97bab9c2d82631467e
diff --git a/sc/qa/unit/subsequent_filters-test.cxx b/sc/qa/unit/subsequent_filters-test.cxx
index 1f29ae7..987c6e0 100644
--- a/sc/qa/unit/subsequent_filters-test.cxx
+++ b/sc/qa/unit/subsequent_filters-test.cxx
@@ -804,31 +804,24 @@ void checkValiditationEntries( const ValDataTestParams& rVDTParams )
//get actual data validation entry from document
const ScValidationData* pValDataTest = pDoc->GetValidationEntry( rVDTParams.nExpectedIndex );
- rtl::OString sCol( rtl::OString::valueOf(static_cast<sal_Int32>(rVDTParams.aPosition.Col())) );
- rtl::OString sRow( rtl::OString::valueOf(static_cast<sal_Int32>(rVDTParams.aPosition.Row())) );
- rtl::OString sTab( rtl::OString::valueOf(static_cast<sal_Int32>(rVDTParams.aPosition.Tab())) );
- rtl::OString msg( "Data Validation Entry with base-cell-address: (" +
- sCol + "," + sRow + "," + sTab + ") was not imported correctly." );
+ sal_Int32 nCol( static_cast<sal_Int32>(rVDTParams.aPosition.Col()) );
+ sal_Int32 nRow( static_cast<sal_Int32>(rVDTParams.aPosition.Row()) );
+ sal_Int32 nTab( static_cast<sal_Int32>(rVDTParams.aPosition.Tab()) );
+ rtl::OStringBuffer sMsg("Data Validation Entry with base-cell-address: (");
+ sMsg.append(nCol).append(",").append(nRow).append(",").append(nTab).append(") was not imported correctly.");
//check if expected and actual data validation entries are equal
- CPPUNIT_ASSERT_MESSAGE( msg.pData->buffer, pValDataTest && aValData.EqualEntries(*pValDataTest) );
+ CPPUNIT_ASSERT_MESSAGE( sMsg.getStr(), pValDataTest && aValData.EqualEntries(*pValDataTest) );
}
-bool checkCellValidity( const ScAddress& rValBaseAddr, const ScRange& rRange, const ScDocument* pDoc, rtl::OString& sMsg )
+void checkCellValidity( const ScAddress& rValBaseAddr, const ScRange& rRange, const ScDocument* pDoc )
{
SCCOL nBCol( rValBaseAddr.Col() );
- SCTAB nBRow( rValBaseAddr.Row() );
- SCTAB nTab( rValBaseAddr.Tab() );
+ SCROW nBRow( rValBaseAddr.Row() );
+ SCTAB nTab( static_cast<const sal_Int32>(rValBaseAddr.Tab()) );
//get from the document the data validation entry we are checking against
const SfxUInt32Item* pItem = static_cast<const SfxUInt32Item*>(pDoc->GetAttr(nBCol, nBRow, nTab, ATTR_VALIDDATA) );
const ScValidationData* pValData = pDoc->GetValidationEntry( pItem->GetValue() );
- rtl::OString sCol, sRow;
- rtl::OString sBCol = rtl::OString::valueOf(static_cast<sal_Int32>(nBCol));
- rtl::OString sBRow = rtl::OString::valueOf(static_cast<sal_Int32>(nBRow));
- rtl::OString sTab = rtl::OString::valueOf(static_cast<sal_Int32>(nTab));
- sMsg += "\nThe following cells failed to reference the data validation entry with base-cell-address: (" +
- sBCol + "," + sBRow + "," + sTab + ")\n";
- bool bPassed = true;
//check that each cell in the expected range is associated with the data validation entry
for(SCCOL i = rRange.aStart.Col(); i <= rRange.aEnd.Col(); ++i)
{
@@ -836,27 +829,25 @@ bool checkCellValidity( const ScAddress& rValBaseAddr, const ScRange& rRange, co
{
const SfxUInt32Item* pItemTest = static_cast<const SfxUInt32Item*>( pDoc->GetAttr(i, j, nTab, ATTR_VALIDDATA) );
const ScValidationData* pValDataTest = pDoc->GetValidationEntry( pItemTest->GetValue() );
-
- sCol = rtl::OString::valueOf(static_cast<sal_Int32>(i));
- sRow = rtl::OString::valueOf(static_cast<sal_Int32>(j));
+ //prevent string operations for occurring unnecessarily
if(!(pValDataTest && pValData->GetKey() == pValDataTest->GetKey()))
{
- bPassed = false;
- rtl::OString sEntryKey = rtl::OString::valueOf(static_cast<sal_Int32>(pValData->GetKey()));
- sMsg += "(" + sCol + "," + sRow + "," + sTab + "), expected key: " + sEntryKey + ", actual key: ";
+ sal_Int32 nCol = static_cast<const sal_Int32>(i);
+ sal_Int32 nRow = static_cast<const sal_Int32>(j);
+ sal_Int32 nTab32 = static_cast<const sal_Int32>(nTab);
+ rtl::OStringBuffer sMsg("\nData validation entry base-cell-address: (");
+ sMsg.append( static_cast<const sal_Int32>(nBCol) ).append(",");
+ sMsg.append( static_cast<const sal_Int32>(nBRow) ).append(",");
+ sMsg.append( nTab32 ).append(")\n");
+ sMsg.append("Cell: (").append(nCol).append(",").append(nRow).append(",").append(nTab32).append(")");
+ sal_uInt32 expectedKey(pValData->GetKey());
+ sal_uInt32 actualKey(-1);
if(pValDataTest)
- {
- rtl::OString sTestKey = rtl::OString::valueOf(static_cast<sal_Int32>(pValDataTest->GetKey()));
- sMsg += sTestKey;
- }
- else sMsg += "none";
- sMsg += "\n";
+ actualKey = pValDataTest->GetKey();
+ CPPUNIT_ASSERT_EQUAL_MESSAGE(sMsg.getStr(), expectedKey, actualKey);
}
}
}
- if(bPassed) sMsg += "None failed.\n";
- sMsg += "\n";
- return bPassed;
}
}
@@ -881,7 +872,7 @@ void ScFiltersTest::testDataValidityODS()
//sheet2's expected Data Validation Entry values
ValDataTestParams aVDTParams2(
SC_VALID_WHOLE, SC_COND_BETWEEN, String("1"), String("10"), pDoc,
- ScAddress(2,3,1), String("Error sheet 2"),
+ aValBaseAddr2, String("Error sheet 2"),
String("Must be a whole number between 1 and 10."),
SC_VALERR_STOP, 2
);
@@ -894,10 +885,8 @@ void ScFiltersTest::testDataValidityODS()
ScRange aRange2( 2,3,1, 6,7,1 ); //sheet2
//check each sheet's cells for data validity
- rtl::OString sMsg;
- bool bPassed1 = checkCellValidity( aValBaseAddr1, aRange1, pDoc, sMsg );
- bool bPassed2 = checkCellValidity( aValBaseAddr2, aRange2, pDoc, sMsg );
- CPPUNIT_ASSERT_MESSAGE( sMsg.pData->buffer, bPassed1 && bPassed2 );
+ checkCellValidity( aValBaseAddr1, aRange1, pDoc );
+ checkCellValidity( aValBaseAddr2, aRange2, pDoc );
//check each sheet's content
rtl::OUString aCSVFileName1;
More information about the Libreoffice-commits
mailing list