[Libreoffice-commits] core.git: sc/inc sc/source
Kohei Yoshida
kohei.yoshida at collabora.com
Tue Feb 4 10:44:27 PST 2014
sc/inc/column.hxx | 6 ++---
sc/inc/compiler.hxx | 2 -
sc/inc/formulacell.hxx | 6 ++---
sc/inc/table.hxx | 6 ++---
sc/inc/tokenstringcontext.hxx | 12 +++++++++-
sc/source/core/data/column.cxx | 12 +++++++---
sc/source/core/data/column2.cxx | 11 +++++----
sc/source/core/data/documen4.cxx | 3 +-
sc/source/core/data/document.cxx | 4 ++-
sc/source/core/data/formulacell.cxx | 24 ++++++++++-----------
sc/source/core/data/table2.cxx | 5 ++--
sc/source/core/data/table4.cxx | 5 ++--
sc/source/core/tool/compiler.cxx | 12 +++++-----
sc/source/core/tool/tokenstringcontext.cxx | 32 +++++++++++++++++++++++++++--
14 files changed, 94 insertions(+), 46 deletions(-)
New commits:
commit 295a55b647e030d3705b930bde7508cd8b058b52
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date: Tue Feb 4 13:46:43 2014 -0500
Use CompileFormulaContext in CompileDBFormula() and CalcAfterLoad().
Also make some adjustment in order to handle formula cell's "temp grammar"
correctly.
Change-Id: I6fdd5c67bb95e4de90ea71db624c9610c1e2febf
diff --git a/sc/inc/column.hxx b/sc/inc/column.hxx
index 7621961..3c8a641 100644
--- a/sc/inc/column.hxx
+++ b/sc/inc/column.hxx
@@ -59,7 +59,7 @@ class DocumentStreamAccess;
class CellValues;
struct RowSpan;
class RowHeightContext;
-struct CompileFormulaContext;
+class CompileFormulaContext;
}
@@ -335,7 +335,7 @@ public:
void SetDirtyAfterLoad();
void SetTableOpDirty( const ScRange& );
void CalcAll();
- void CalcAfterLoad();
+ void CalcAfterLoad( sc::CompileFormulaContext& rCxt );
void CompileAll();
void CompileXML( ScProgress& rProgress );
@@ -463,7 +463,7 @@ public:
void BroadcastRecalcOnRefMove();
void CompileDBFormula();
- void CompileDBFormula( bool bCreateFormulaString );
+ void CompileDBFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString );
void CompileNameFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString );
void CompileColRowNameFormula();
diff --git a/sc/inc/compiler.hxx b/sc/inc/compiler.hxx
index c9b4c20..a9f2d83 100644
--- a/sc/inc/compiler.hxx
+++ b/sc/inc/compiler.hxx
@@ -80,7 +80,7 @@ class ScTokenArray;
namespace sc {
-struct CompileFormulaContext;
+class CompileFormulaContext;
}
diff --git a/sc/inc/formulacell.hxx b/sc/inc/formulacell.hxx
index 0c572c5..bd4f128 100644
--- a/sc/inc/formulacell.hxx
+++ b/sc/inc/formulacell.hxx
@@ -44,7 +44,7 @@ struct RefUpdateContext;
struct RefUpdateInsertTabContext;
struct RefUpdateDeleteTabContext;
struct RefUpdateMoveTabContext;
-struct CompileFormulaContext;
+class CompileFormulaContext;
}
@@ -230,7 +230,7 @@ public:
void CompileTokenArray( bool bNoListening = false );
void CompileTokenArray( sc::CompileFormulaContext& rCxt, bool bNoListening = false );
void CompileXML( ScProgress& rProgress ); // compile temporary string tokens
- void CalcAfterLoad();
+ void CalcAfterLoad( sc::CompileFormulaContext& rCxt );
bool MarkUsedExternalReferences();
void Interpret();
bool IsIterCell() const;
@@ -293,7 +293,7 @@ public:
bool IsRunning() const;
void SetRunning( bool bVal );
void CompileDBFormula();
- void CompileDBFormula( bool bCreateFormulaString );
+ void CompileDBFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString );
void CompileNameFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString );
void CompileColRowNameFormula();
ScFormulaCell* GetPrevious() const;
diff --git a/sc/inc/table.hxx b/sc/inc/table.hxx
index 1c7cb12..330ca2c 100644
--- a/sc/inc/table.hxx
+++ b/sc/inc/table.hxx
@@ -70,7 +70,7 @@ struct NoteEntry;
class DocumentStreamAccess;
class CellValues;
class RowHeightContext;
-struct CompileFormulaContext;
+class CompileFormulaContext;
}
@@ -520,7 +520,7 @@ public:
void SetDirtyVar();
void SetTableOpDirty( const ScRange& );
void CalcAll();
- void CalcAfterLoad();
+ void CalcAfterLoad( sc::CompileFormulaContext& rCxt );
void CompileAll();
void CompileXML( ScProgress& rProgress );
@@ -1013,7 +1013,7 @@ private:
bool GetNextMarkedCell( SCCOL& rCol, SCROW& rRow, const ScMarkData& rMark ) const;
bool TestTabRefAbs(SCTAB nTable) const;
void CompileDBFormula();
- void CompileDBFormula( bool bCreateFormulaString );
+ void CompileDBFormula( sc::CompileFormulaContext& rCxt, 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 fcc7eae..af97d99 100644
--- a/sc/inc/tokenstringcontext.hxx
+++ b/sc/inc/tokenstringcontext.hxx
@@ -46,13 +46,23 @@ struct SC_DLLPUBLIC TokenStringContext
TokenStringContext( const ScDocument* pDoc, formula::FormulaGrammar::Grammar eGram );
};
-struct CompileFormulaContext
+class CompileFormulaContext
{
ScDocument* mpDoc;
formula::FormulaGrammar::Grammar meGram;
std::vector<OUString> maTabNames;
+ void updateTabNames();
+
+public:
CompileFormulaContext( ScDocument* pDoc, formula::FormulaGrammar::Grammar eGram );
+
+ formula::FormulaGrammar::Grammar getGrammar() const;
+ void setGrammar( formula::FormulaGrammar::Grammar eGram );
+
+ const std::vector<OUString>& getTabNames() const;
+
+ ScDocument* getDoc();
};
}
diff --git a/sc/source/core/data/column.cxx b/sc/source/core/data/column.cxx
index f65c3c7..ba0e72d 100644
--- a/sc/source/core/data/column.cxx
+++ b/sc/source/core/data/column.cxx
@@ -2912,11 +2912,15 @@ public:
bool isCompiled() const { return mbCompiled; }
};
-struct CalcAfterLoadHandler
+class CalcAfterLoadHandler
{
+ sc::CompileFormulaContext& mrCxt;
+public:
+ CalcAfterLoadHandler( sc::CompileFormulaContext& rCxt ) : mrCxt(rCxt) {}
+
void operator() (size_t /*nRow*/, ScFormulaCell* pCell)
{
- pCell->CalcAfterLoad();
+ pCell->CalcAfterLoad(mrCxt);
}
};
@@ -3185,9 +3189,9 @@ bool ScColumn::CompileErrorCells(sal_uInt16 nErrCode)
return aHdl.isCompiled();
}
-void ScColumn::CalcAfterLoad()
+void ScColumn::CalcAfterLoad( sc::CompileFormulaContext& rCxt )
{
- CalcAfterLoadHandler aFunc;
+ CalcAfterLoadHandler aFunc(rCxt);
sc::ProcessFormula(maCells, aFunc);
}
diff --git a/sc/source/core/data/column2.cxx b/sc/source/core/data/column2.cxx
index 4ab6d17..2d69ae4 100644
--- a/sc/source/core/data/column2.cxx
+++ b/sc/source/core/data/column2.cxx
@@ -3204,15 +3204,16 @@ struct CompileDBFormulaHandler
class CompileDBFormula2Handler
{
+ sc::CompileFormulaContext& mrCxt;
bool mbCreateFormulaString;
public:
- CompileDBFormula2Handler(bool bCreateFormulaString) :
- mbCreateFormulaString(bCreateFormulaString) {}
+ CompileDBFormula2Handler( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString ) :
+ mrCxt(rCxt), mbCreateFormulaString(bCreateFormulaString) {}
void operator() (size_t, ScFormulaCell* p)
{
- p->CompileDBFormula(mbCreateFormulaString);
+ p->CompileDBFormula(mrCxt, mbCreateFormulaString);
}
};
@@ -3248,9 +3249,9 @@ void ScColumn::CompileDBFormula()
RegroupFormulaCells();
}
-void ScColumn::CompileDBFormula( bool bCreateFormulaString )
+void ScColumn::CompileDBFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString )
{
- CompileDBFormula2Handler aFunc(bCreateFormulaString);
+ CompileDBFormula2Handler aFunc(rCxt, bCreateFormulaString);
sc::ProcessFormula(maCells, aFunc);
RegroupFormulaCells();
}
diff --git a/sc/source/core/data/documen4.cxx b/sc/source/core/data/documen4.cxx
index c3d7a43..64c8718 100644
--- a/sc/source/core/data/documen4.cxx
+++ b/sc/source/core/data/documen4.cxx
@@ -549,11 +549,12 @@ void ScDocument::CompileDBFormula()
void ScDocument::CompileDBFormula( bool bCreateFormulaString )
{
+ sc::CompileFormulaContext aCxt(this, eGrammar);
TableContainer::iterator it = maTabs.begin();
for (;it != maTabs.end(); ++it)
{
if (*it)
- (*it)->CompileDBFormula( bCreateFormulaString );
+ (*it)->CompileDBFormula(aCxt, bCreateFormulaString);
}
}
diff --git a/sc/source/core/data/document.cxx b/sc/source/core/data/document.cxx
index b2126b2..1ad8620 100644
--- a/sc/source/core/data/document.cxx
+++ b/sc/source/core/data/document.cxx
@@ -96,6 +96,7 @@
#include "refupdatecontext.hxx"
#include "formulagroup.hxx"
#include <tokenarray.hxx>
+#include <tokenstringcontext.hxx>
#include "formula/vectortoken.hxx"
@@ -3755,11 +3756,12 @@ void ScDocument::CalcAfterLoad()
return; // dann wird erst beim Einfuegen in das richtige Doc berechnet
bCalcingAfterLoad = true;
+ sc::CompileFormulaContext aCxt(this, eGrammar);
{
TableContainer::iterator it = maTabs.begin();
for (; it != maTabs.end(); ++it)
if (*it)
- (*it)->CalcAfterLoad();
+ (*it)->CalcAfterLoad(aCxt);
for (it = maTabs.begin(); it != maTabs.end(); ++it)
if (*it)
(*it)->SetDirtyAfterLoad();
diff --git a/sc/source/core/data/formulacell.cxx b/sc/source/core/data/formulacell.cxx
index 59a0664..939b6f8 100644
--- a/sc/source/core/data/formulacell.cxx
+++ b/sc/source/core/data/formulacell.cxx
@@ -1076,7 +1076,7 @@ void ScFormulaCell::CompileTokenArray( sc::CompileFormulaContext& rCxt, bool bNo
// Not already compiled?
if( !pCode->GetLen() && !aResult.GetHybridFormula().isEmpty() )
{
- assert(rCxt.meGram == eTempGrammar);
+ rCxt.setGrammar(eTempGrammar);
Compile(rCxt, aResult.GetHybridFormula(), bNoListening);
}
else if( bCompile && !pDocument->IsClipOrUndo() && !pCode->GetCodeError() )
@@ -1180,13 +1180,14 @@ void ScFormulaCell::CompileXML( ScProgress& rProgress )
}
-void ScFormulaCell::CalcAfterLoad()
+void ScFormulaCell::CalcAfterLoad( sc::CompileFormulaContext& rCxt )
{
bool bNewCompiled = false;
// If a Calc 1.0-doc is read, we have a result, but no token array
if( !pCode->GetLen() && !aResult.GetHybridFormula().isEmpty() )
{
- Compile( aResult.GetHybridFormula(), true, eTempGrammar);
+ rCxt.setGrammar(eTempGrammar);
+ Compile(rCxt, aResult.GetHybridFormula(), true);
aResult.SetToken( NULL);
bDirty = true;
bNewCompiled = true;
@@ -1194,8 +1195,7 @@ void ScFormulaCell::CalcAfterLoad()
// The RPN array is not created when a Calc 3.0-Doc has been read as the Range Names exist until now.
if( pCode->GetLen() && !pCode->GetCodeLen() && !pCode->GetCodeError() )
{
- ScCompiler aComp(pDocument, aPos, *pCode);
- aComp.SetGrammar(pDocument->GetGrammar());
+ ScCompiler aComp(rCxt, aPos, *pCode);
bSubTotal = aComp.CompileTokenArray();
nFormatType = aComp.GetNumFormatType();
bDirty = true;
@@ -3357,7 +3357,7 @@ void ScFormulaCell::CompileDBFormula()
}
}
-void ScFormulaCell::CompileDBFormula( bool bCreateFormulaString )
+void ScFormulaCell::CompileDBFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString )
{
// Two phases must be called after each other
// 1. Formula String with old generated names
@@ -3385,8 +3385,7 @@ void ScFormulaCell::CompileDBFormula( bool bCreateFormulaString )
}
if ( bRecompile )
{
- OUString aFormula;
- GetFormula( aFormula, formula::FormulaGrammar::GRAM_NATIVE);
+ OUString aFormula = GetFormula(rCxt);
if ( GetMatrixFlag() != MM_NONE && !aFormula.isEmpty() )
{
if ( aFormula[ aFormula.getLength()-1 ] == '}' )
@@ -3397,12 +3396,13 @@ void ScFormulaCell::CompileDBFormula( bool bCreateFormulaString )
EndListeningTo( pDocument );
pDocument->RemoveFromFormulaTree( this );
pCode->Clear();
- SetHybridFormula( aFormula, formula::FormulaGrammar::GRAM_NATIVE);
+ SetHybridFormula(aFormula, rCxt.getGrammar());
}
}
else if ( !pCode->GetLen() && !aResult.GetHybridFormula().isEmpty() )
{
- Compile( aResult.GetHybridFormula(), false, eTempGrammar );
+ rCxt.setGrammar(eTempGrammar);
+ Compile(rCxt, aResult.GetHybridFormula(), false);
aResult.SetToken( NULL);
SetDirty();
}
@@ -3443,12 +3443,12 @@ void ScFormulaCell::CompileNameFormula( sc::CompileFormulaContext& rCxt, bool bC
EndListeningTo( pDocument );
pDocument->RemoveFromFormulaTree( this );
pCode->Clear();
- SetHybridFormula(aFormula, rCxt.meGram);
+ SetHybridFormula(aFormula, rCxt.getGrammar());
}
}
else if ( !pCode->GetLen() && !aResult.GetHybridFormula().isEmpty() )
{
- assert(rCxt.meGram == eTempGrammar);
+ rCxt.setGrammar(eTempGrammar);
Compile(rCxt, aResult.GetHybridFormula(), false);
aResult.SetToken( NULL);
SetDirty();
diff --git a/sc/source/core/data/table2.cxx b/sc/source/core/data/table2.cxx
index dc35b16..eb11a5d 100644
--- a/sc/source/core/data/table2.cxx
+++ b/sc/source/core/data/table2.cxx
@@ -1766,9 +1766,10 @@ bool ScTable::CompileErrorCells(sal_uInt16 nErrCode)
return bCompiled;
}
-void ScTable::CalcAfterLoad()
+void ScTable::CalcAfterLoad( sc::CompileFormulaContext& rCxt )
{
- for (SCCOL i=0; i <= MAXCOL; i++) aCol[i].CalcAfterLoad();
+ for (SCCOL i = 0; i <= MAXCOL; ++i)
+ aCol[i].CalcAfterLoad(rCxt);
}
bool ScTable::IsEmptyData( SCCOL nCol ) const
diff --git a/sc/source/core/data/table4.cxx b/sc/source/core/data/table4.cxx
index 91b9187..610103e 100644
--- a/sc/source/core/data/table4.cxx
+++ b/sc/source/core/data/table4.cxx
@@ -2181,9 +2181,10 @@ void ScTable::CompileDBFormula()
for (SCCOL i=0; i<=MAXCOL; i++) aCol[i].CompileDBFormula();
}
-void ScTable::CompileDBFormula( bool bCreateFormulaString )
+void ScTable::CompileDBFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString )
{
- for (SCCOL i=0; i<=MAXCOL; i++) aCol[i].CompileDBFormula( bCreateFormulaString );
+ for (SCCOL i = 0; i <= MAXCOL; ++i)
+ aCol[i].CompileDBFormula(rCxt, bCreateFormulaString);
}
void ScTable::CompileNameFormula( sc::CompileFormulaContext& rCxt, bool bCreateFormulaString )
diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx
index 1ffdab4..8c6dee9 100644
--- a/sc/source/core/tool/compiler.cxx
+++ b/sc/source/core/tool/compiler.cxx
@@ -1516,7 +1516,7 @@ struct ConventionXL_R1C1 : public ScCompiler::Convention, public ConventionXL
ScCompiler::ScCompiler( sc::CompileFormulaContext& rCxt, const ScAddress& rPos, ScTokenArray& rArr ) :
FormulaCompiler(rArr),
- pDoc(rCxt.mpDoc),
+ pDoc(rCxt.getDoc()),
aPos(rPos),
mpFormatter(pDoc->GetFormatTable()),
pCharClass(ScGlobal::pCharClass),
@@ -1526,10 +1526,10 @@ ScCompiler::ScCompiler( sc::CompileFormulaContext& rCxt, const ScAddress& rPos,
meExtendedErrorDetection(EXTENDED_ERROR_DETECTION_NONE),
mbCloseBrackets(true),
mbRewind(false),
- maTabNames(rCxt.maTabNames)
+ maTabNames(rCxt.getTabNames())
{
nMaxTab = pDoc ? pDoc->GetTableCount() - 1 : 0;
- SetGrammar(rCxt.meGram);
+ SetGrammar(rCxt.getGrammar());
}
ScCompiler::ScCompiler( ScDocument* pDocument, const ScAddress& rPos,ScTokenArray& rArr)
@@ -1559,7 +1559,7 @@ ScCompiler::ScCompiler( ScDocument* pDocument, const ScAddress& rPos,ScTokenArra
}
ScCompiler::ScCompiler( sc::CompileFormulaContext& rCxt, const ScAddress& rPos ) :
- pDoc(rCxt.mpDoc),
+ pDoc(rCxt.getDoc()),
aPos(rPos),
mpFormatter(pDoc ? pDoc->GetFormatTable() : NULL),
pCharClass(ScGlobal::pCharClass),
@@ -1569,10 +1569,10 @@ ScCompiler::ScCompiler( sc::CompileFormulaContext& rCxt, const ScAddress& rPos )
meExtendedErrorDetection(EXTENDED_ERROR_DETECTION_NONE),
mbCloseBrackets(true),
mbRewind(false),
- maTabNames(rCxt.maTabNames)
+ maTabNames(rCxt.getTabNames())
{
nMaxTab = pDoc ? pDoc->GetTableCount() - 1 : 0;
- SetGrammar(rCxt.meGram);
+ SetGrammar(rCxt.getGrammar());
}
ScCompiler::ScCompiler( ScDocument* pDocument, const ScAddress& rPos)
diff --git a/sc/source/core/tool/tokenstringcontext.cxx b/sc/source/core/tool/tokenstringcontext.cxx
index 0273a21..96865fc 100644
--- a/sc/source/core/tool/tokenstringcontext.cxx
+++ b/sc/source/core/tool/tokenstringcontext.cxx
@@ -111,15 +111,43 @@ CompileFormulaContext::CompileFormulaContext( ScDocument* pDoc, formula::Formula
if (!pDoc)
return;
+ updateTabNames();
+}
+
+void CompileFormulaContext::updateTabNames()
+{
// Fetch all sheet names.
- maTabNames = pDoc->GetAllTableNames();
+ maTabNames = mpDoc->GetAllTableNames();
{
std::vector<OUString>::iterator it = maTabNames.begin(), itEnd = maTabNames.end();
for (; it != itEnd; ++it)
- ScCompiler::CheckTabQuotes(*it, formula::FormulaGrammar::extractRefConvention(eGram));
+ ScCompiler::CheckTabQuotes(*it, formula::FormulaGrammar::extractRefConvention(meGram));
}
}
+formula::FormulaGrammar::Grammar CompileFormulaContext::getGrammar() const
+{
+ return meGram;
+}
+
+void CompileFormulaContext::setGrammar( formula::FormulaGrammar::Grammar eGram )
+{
+ bool bUpdate = (meGram != eGram);
+ meGram = eGram;
+ if (bUpdate)
+ updateTabNames();
+}
+
+const std::vector<OUString>& CompileFormulaContext::getTabNames() const
+{
+ return maTabNames;
+}
+
+ScDocument* CompileFormulaContext::getDoc()
+{
+ return mpDoc;
+}
+
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
More information about the Libreoffice-commits
mailing list