sc/inc/compiler.hxx | 8 ++++++++ sc/inc/token.hxx | 11 ++++++----- sc/source/core/tool/compiler.cxx | 29 ++++++++++++++++++++++++++--- 3 files changed, 40 insertions(+), 8 deletions(-)
New commits: commit a4d67c9c9c2672ca6d2405075790e0891930b2e0 Author: Eike Rathke <er...@redhat.com> Date: Wed Mar 11 14:26:39 2015 +0100 TableRef: need to distinguish between entire table and All specified Change-Id: I507b6dfc0ce1a7b0f28142b05e15834ad6e6ac80 diff --git a/sc/inc/token.hxx b/sc/inc/token.hxx index a0a12ab..0d1aca1 100644 --- a/sc/inc/token.hxx +++ b/sc/inc/token.hxx @@ -215,11 +215,12 @@ public: enum Item { - ALL = 0, - HEADERS = 1, - DATA = 2, - TOTALS = 4, - THIS_ROW = 8 + TABLE = 0, + ALL = 1, + HEADERS = 2, + DATA = 4, + TOTALS = 8, + THIS_ROW = 16 }; ScTableRefToken( sal_uInt16 nIndex, Item eItem ); diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index fd5edd4..e3d00e5 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -3938,7 +3938,7 @@ ScTokenArray* ScCompiler::CompileString( const OUString& rFormula ) const FormulaToken* pPrev = pArr->PeekPrev( nIdx); if (pPrev && pPrev->GetOpCode() == ocDBArea) { - FormulaToken* pTableRefToken = new ScTableRefToken( pPrev->GetIndex(), ScTableRefToken::ALL); + FormulaToken* pTableRefToken = new ScTableRefToken( pPrev->GetIndex(), ScTableRefToken::TABLE); maTableRefs.push_back( TableRefEntry( pTableRefToken)); // pPrev may be dead hereafter. static_cast<ScTokenArray*>(pArr)->ReplaceToken( 1, pTableRefToken); @@ -4700,7 +4700,7 @@ bool ScCompiler::HandleTableRef() ScTokenArray* pNew = new ScTokenArray(); ScTableRefToken::Item eItem = pTR->GetItem(); bool bGotToken = false; - if (eItem == ScTableRefToken::ALL) + if (eItem == ScTableRefToken::TABLE || eItem == ScTableRefToken::ALL) { ScComplexRefData aRefData; aRefData.InitFlags(); commit 519d2f6e5e820229d3548a33313ba15155121537 Author: Eike Rathke <er...@redhat.com> Date: Tue Mar 10 15:46:10 2015 +0100 add TableRef stack Change-Id: If781e6ab13eb5ad175352e330379776d6ca4fcd8 diff --git a/sc/inc/compiler.hxx b/sc/inc/compiler.hxx index 298e341..ec99d45 100644 --- a/sc/inc/compiler.hxx +++ b/sc/inc/compiler.hxx @@ -313,6 +313,14 @@ private: std::vector<OUString> maTabNames; /// sheet names mangled for the current grammar for output std::vector<OUString> &GetSetupTabNames() const; /// get or setup tab names for the current grammar + struct TableRefEntry + { + ScTokenRef mxToken; + sal_uInt16 mnLevel; + TableRefEntry( formula::FormulaToken* p ) : mxToken(p), mnLevel(0) {} + }; + std::vector<TableRefEntry> maTableRefs; /// "stack" of currently active ocTableRef tokens + bool NextNewToken(bool bInArray = false); virtual void SetError(sal_uInt16 nError) SAL_OVERRIDE; diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index c913ab7..fd5edd4 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -3938,11 +3938,34 @@ ScTokenArray* ScCompiler::CompileString( const OUString& rFormula ) const FormulaToken* pPrev = pArr->PeekPrev( nIdx); if (pPrev && pPrev->GetOpCode() == ocDBArea) { + FormulaToken* pTableRefToken = new ScTableRefToken( pPrev->GetIndex(), ScTableRefToken::ALL); + maTableRefs.push_back( TableRefEntry( pTableRefToken)); // pPrev may be dead hereafter. - static_cast<ScTokenArray*>(pArr)->ReplaceToken( 1, - new ScTableRefToken( pPrev->GetIndex(), ScTableRefToken::ALL)); + static_cast<ScTokenArray*>(pArr)->ReplaceToken( 1, pTableRefToken); } } + switch (eOp) + { + case ocTableRefOpen: + SAL_WARN_IF( maTableRefs.empty(), "sc.core", "ocTableRefOpen without TableRefEntry"); + if (maTableRefs.empty()) + SetError(errPair); + else + ++maTableRefs.back().mnLevel; + break; + case ocTableRefClose: + SAL_WARN_IF( maTableRefs.empty(), "sc.core", "ocTableRefClose without TableRefEntry"); + if (maTableRefs.empty()) + SetError(errPair); + else + { + if (--maTableRefs.back().mnLevel == 0) + maTableRefs.pop_back(); + } + break; + default: + break; + } eLastOp = maRawToken.GetOpCode(); if ( bAutoCorrect ) aCorrectedFormula += aCorrectedSymbol; _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits