sc/inc/column.hxx | 3 +- sc/inc/compiler.hxx | 8 +++++ sc/inc/formulacell.hxx | 6 +++- sc/inc/table.hxx | 3 +- sc/inc/tokenstringcontext.hxx | 9 ++++++ sc/source/core/data/column2.cxx | 11 ++++---- sc/source/core/data/documen4.cxx | 4 ++ sc/source/core/data/formulacell.cxx | 39 +++++++++++++++++++++++++++-- sc/source/core/data/table4.cxx | 5 ++- sc/source/core/tool/compiler.cxx | 18 +++++++++++++ sc/source/core/tool/tokenstringcontext.cxx | 15 +++++++++++ 11 files changed, 108 insertions(+), 13 deletions(-)
New commits: commit 059f43f5756076c7d349e9b7d66e3605a948b508 Author: Kohei Yoshida <kohei.yosh...@collabora.com> Date: Tue Feb 4 10:19:47 2014 -0500 Pre-compile all compiler-ready sheet names to avoid doing it repeatedly. This reduces the lag after updating range names especially with a large number of range names. Change-Id: Idbfa3b6447b693a566192828e7137b2aeaa0d1f5 diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx index c64ea91..7621961 100644 --- a/sc/inc/column.hxx +++ b/sc/inc/column.hxx @@ -59,6 +59,7 @@ class DocumentStreamAccess; class CellValues; struct RowSpan; class RowHeightContext; +struct CompileFormulaContext; } @@ -463,7 +464,7 @@ public: void CompileDBFormula(); void CompileDBFormula( bool bCreateFormulaString ); - void CompileNameFormula( bool bCreateFormulaString ); + void CompileNameFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString ); void CompileColRowNameFormula(); sal_Int32 GetMaxStringLen( SCROW nRowStart, SCROW nRowEnd, rtl_TextEncoding eCharSet ) const; diff --git a/sc/inc/compiler.hxx b/sc/inc/compiler.hxx index e258532..4632641 100644 --- a/sc/inc/compiler.hxx +++ b/sc/inc/compiler.hxx @@ -78,6 +78,12 @@ class ScRangeData; class ScExternalRefManager; class ScTokenArray; +namespace sc { + +struct CompileFormulaContext; + +} + // constants and data types internal to compiler /* @@ -356,6 +362,8 @@ private: static void InitCharClassEnglish(); public: + ScCompiler( sc::CompileFormulaContext& rCxt, const ScAddress& rPos ); + ScCompiler( ScDocument* pDocument, const ScAddress&); ScCompiler( ScDocument* pDocument, const ScAddress&,ScTokenArray& rArr); diff --git a/sc/inc/formulacell.hxx b/sc/inc/formulacell.hxx index 68c620c..d96ac8e 100644 --- a/sc/inc/formulacell.hxx +++ b/sc/inc/formulacell.hxx @@ -44,6 +44,7 @@ struct RefUpdateContext; struct RefUpdateInsertTabContext; struct RefUpdateDeleteTabContext; struct RefUpdateMoveTabContext; +struct CompileFormulaContext; } @@ -221,6 +222,9 @@ public: void Compile(const OUString& rFormula, bool bNoListening = false, const formula::FormulaGrammar::Grammar = formula::FormulaGrammar::GRAM_DEFAULT ); + void Compile( + sc::CompileFormulaContext& rCxt, const OUString& rFormula, bool bNoListening = false ); + void CompileTokenArray( bool bNoListening = false ); void CompileXML( ScProgress& rProgress ); // compile temporary string tokens void CalcAfterLoad(); @@ -287,7 +291,7 @@ public: void SetRunning( bool bVal ); void CompileDBFormula(); void CompileDBFormula( bool bCreateFormulaString ); - void CompileNameFormula( bool bCreateFormulaString ); + void CompileNameFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString ); void CompileColRowNameFormula(); ScFormulaCell* GetPrevious() const; ScFormulaCell* GetNext() const; diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx index 52a6cf6..1c7cb12 100644 --- a/sc/inc/table.hxx +++ b/sc/inc/table.hxx @@ -70,6 +70,7 @@ struct NoteEntry; class DocumentStreamAccess; class CellValues; class RowHeightContext; +struct CompileFormulaContext; } @@ -1013,7 +1014,7 @@ private: bool TestTabRefAbs(SCTAB nTable) const; void CompileDBFormula(); void CompileDBFormula( bool bCreateFormulaString ); - void CompileNameFormula( bool bCreateFormulaString ); + void CompileNameFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString ); void CompileColRowNameFormula(); void RebuildFormulaGroups(); diff --git a/sc/inc/tokenstringcontext.hxx b/sc/inc/tokenstringcontext.hxx index 85b61f7..fcc7eae 100644 --- a/sc/inc/tokenstringcontext.hxx +++ b/sc/inc/tokenstringcontext.hxx @@ -46,6 +46,15 @@ struct SC_DLLPUBLIC TokenStringContext TokenStringContext( const ScDocument* pDoc, formula::FormulaGrammar::Grammar eGram ); }; +struct CompileFormulaContext +{ + ScDocument* mpDoc; + formula::FormulaGrammar::Grammar meGram; + std::vector<OUString> maTabNames; + + CompileFormulaContext( ScDocument* pDoc, formula::FormulaGrammar::Grammar eGram ); +}; + } #endif diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx index 7a58377..4ab6d17 100644 --- a/sc/source/core/data/column2.cxx +++ b/sc/source/core/data/column2.cxx @@ -3218,15 +3218,16 @@ public: class CompileNameFormulaHandler { + sc::CompileFormulaContext& mrCxt; bool mbCreateFormulaString; public: - CompileNameFormulaHandler(bool bCreateFormulaString) : - mbCreateFormulaString(bCreateFormulaString) {} + CompileNameFormulaHandler( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString) : + mrCxt(rCxt), mbCreateFormulaString(bCreateFormulaString) {} void operator() (size_t, ScFormulaCell* p) { - p->CompileNameFormula(mbCreateFormulaString); + p->CompileNameFormula(mrCxt, mbCreateFormulaString); } }; @@ -3254,9 +3255,9 @@ void ScColumn::CompileDBFormula( bool bCreateFormulaString ) RegroupFormulaCells(); } -void ScColumn::CompileNameFormula( bool bCreateFormulaString ) +void ScColumn::CompileNameFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString ) { - CompileNameFormulaHandler aFunc(bCreateFormulaString); + CompileNameFormulaHandler aFunc(rCxt, bCreateFormulaString); sc::ProcessFormula(maCells, aFunc); } diff --git a/sc/source/core/data/documen4.cxx b/sc/source/core/data/documen4.cxx index 23be5e5..c3d7a43 100644 --- a/sc/source/core/data/documen4.cxx +++ b/sc/source/core/data/documen4.cxx @@ -44,6 +44,7 @@ #include "formulacell.hxx" #include "tokenarray.hxx" #include "scmatrix.hxx" +#include <tokenstringcontext.hxx> using namespace formula; @@ -558,11 +559,12 @@ void ScDocument::CompileDBFormula( bool bCreateFormulaString ) void ScDocument::CompileNameFormula( bool bCreateFormulaString ) { + sc::CompileFormulaContext aCxt(this, eGrammar); TableContainer::iterator it = maTabs.begin(); for (;it != maTabs.end(); ++it) { if (*it) - (*it)->CompileNameFormula( bCreateFormulaString ); + (*it)->CompileNameFormula(aCxt, bCreateFormulaString); } } diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx index ca466a5..aee1517 100644 --- a/sc/source/core/data/formulacell.cxx +++ b/sc/source/core/data/formulacell.cxx @@ -939,6 +939,40 @@ void ScFormulaCell::Compile( const OUString& rFormula, bool bNoListening, pDocument->PutInFormulaTree( this ); } +void ScFormulaCell::Compile( + sc::CompileFormulaContext& rCxt, const OUString& rFormula, bool bNoListening ) +{ + if ( pDocument->IsClipOrUndo() ) + return; + bool bWasInFormulaTree = pDocument->IsInFormulaTree( this ); + if ( bWasInFormulaTree ) + pDocument->RemoveFromFormulaTree( this ); + // pCode may not deleted for queries, but must be empty + if ( pCode ) + pCode->Clear(); + ScTokenArray* pCodeOld = pCode; + ScCompiler aComp(rCxt, aPos); + pCode = aComp.CompileString( rFormula ); + if ( pCodeOld ) + delete pCodeOld; + if( !pCode->GetCodeError() ) + { + if ( !pCode->GetLen() && !aResult.GetHybridFormula().isEmpty() && rFormula == aResult.GetHybridFormula() ) + { // not recursive CompileTokenArray/Compile/CompileTokenArray + if ( rFormula[0] == '=' ) + pCode->AddBad( rFormula.copy(1) ); + else + pCode->AddBad( rFormula ); + } + bCompile = true; + CompileTokenArray( bNoListening ); + } + else + bChanged = true; + + if ( bWasInFormulaTree ) + pDocument->PutInFormulaTree( this ); +} void ScFormulaCell::CompileTokenArray( bool bNoListening ) { @@ -3278,7 +3312,7 @@ void ScFormulaCell::CompileDBFormula( bool bCreateFormulaString ) } } -void ScFormulaCell::CompileNameFormula( bool bCreateFormulaString ) +void ScFormulaCell::CompileNameFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString ) { // Two phases must be called after each other // 1. Formula String with old generated names @@ -3319,7 +3353,8 @@ void ScFormulaCell::CompileNameFormula( bool bCreateFormulaString ) } else if ( !pCode->GetLen() && !aResult.GetHybridFormula().isEmpty() ) { - Compile( aResult.GetHybridFormula(), false, eTempGrammar ); + assert(rCxt.meGram == eTempGrammar); + Compile(rCxt, aResult.GetHybridFormula(), false); aResult.SetToken( NULL); SetDirty(); } diff --git a/sc/source/core/data/table4.cxx b/sc/source/core/data/table4.cxx index 88d1f68..91b9187 100644 --- a/sc/source/core/data/table4.cxx +++ b/sc/source/core/data/table4.cxx @@ -2186,9 +2186,10 @@ void ScTable::CompileDBFormula( bool bCreateFormulaString ) for (SCCOL i=0; i<=MAXCOL; i++) aCol[i].CompileDBFormula( bCreateFormulaString ); } -void ScTable::CompileNameFormula( bool bCreateFormulaString ) +void ScTable::CompileNameFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString ) { - for (SCCOL i=0; i<=MAXCOL; i++) aCol[i].CompileNameFormula( bCreateFormulaString ); + for (SCCOL i = 0; i <= MAXCOL; ++i) + aCol[i].CompileNameFormula(rCxt, bCreateFormulaString); } void ScTable::CompileColRowNameFormula() diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index d5ea156..ce0f427 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -67,6 +67,7 @@ #include "formulaparserpool.hxx" #include "tokenarray.hxx" #include "scmatrix.hxx" +#include <tokenstringcontext.hxx> using namespace formula; using namespace ::com::sun::star; @@ -1539,6 +1540,23 @@ ScCompiler::ScCompiler( ScDocument* pDocument, const ScAddress& rPos,ScTokenArra } } +ScCompiler::ScCompiler( sc::CompileFormulaContext& rCxt, const ScAddress& rPos ) : + pDoc(rCxt.mpDoc), + aPos(rPos), + mpFormatter(pDoc ? pDoc->GetFormatTable() : NULL), + pCharClass(ScGlobal::pCharClass), + mnPredetectedReference(0), + mnRangeOpPosInSymbol(-1), + pConv(GetRefConvention(FormulaGrammar::CONV_OOO)), + meExtendedErrorDetection(EXTENDED_ERROR_DETECTION_NONE), + mbCloseBrackets(true), + mbRewind(false), + maTabNames(rCxt.maTabNames) +{ + nMaxTab = pDoc ? pDoc->GetTableCount() - 1 : 0; + SetGrammar(rCxt.meGram); +} + ScCompiler::ScCompiler( ScDocument* pDocument, const ScAddress& rPos) : pDoc( pDocument ), diff --git a/sc/source/core/tool/tokenstringcontext.cxx b/sc/source/core/tool/tokenstringcontext.cxx index a68ae75..0273a21 100644 --- a/sc/source/core/tool/tokenstringcontext.cxx +++ b/sc/source/core/tool/tokenstringcontext.cxx @@ -105,6 +105,21 @@ TokenStringContext::TokenStringContext( const ScDocument* pDoc, formula::Formula } } +CompileFormulaContext::CompileFormulaContext( ScDocument* pDoc, formula::FormulaGrammar::Grammar eGram ) : + mpDoc(pDoc), meGram(eGram) +{ + if (!pDoc) + return; + + // Fetch all sheet names. + maTabNames = pDoc->GetAllTableNames(); + { + std::vector<OUString>::iterator it = maTabNames.begin(), itEnd = maTabNames.end(); + for (; it != itEnd; ++it) + ScCompiler::CheckTabQuotes(*it, formula::FormulaGrammar::extractRefConvention(eGram)); + } +} + } /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits