formula/source/core/api/FormulaCompiler.cxx | 60 +++++++++++-- include/formula/FormulaCompiler.hxx | 14 +-- sc/inc/compiler.hxx | 10 +- sc/source/core/tool/compiler.cxx | 124 ++++++++++++++++++++-------- 4 files changed, 153 insertions(+), 55 deletions(-)
New commits: commit 6f0ac5ddf1eedc153e3e46836f885ff59e57fd1a Author: Eike Rathke <[email protected]> Date: Sat Apr 18 00:44:06 2015 +0200 TableRef: set 3D flag if table is on different sheet Change-Id: I1a25d603333b78dc89534e45fa23f99c18bd0ee6 diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index 64b566c..023e5dc 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -5120,6 +5120,8 @@ bool ScCompiler::HandleTableRef() { aRefData.SetRowRel( true); } + if (aRange.aStart.Tab() != aPos.Tab()) + aRefData.SetFlag3D( true); aRefData.SetAddress( aRange.aStart, aPos); pTR->SetAreaRefRPN( pNew->AddSingleReference( aRefData )); } @@ -5134,6 +5136,8 @@ bool ScCompiler::HandleTableRef() aRefData.Ref1.SetRowRel( true); aRefData.Ref2.SetRowRel( true); } + if (aRange.aStart.Tab() != aPos.Tab()) + aRefData.Ref1.SetFlag3D( true); aRefData.SetRange( aRange, aPos); pTR->SetAreaRefRPN( pNew->AddDoubleReference( aRefData )); } commit 8c2173d95c8fd626c5399144d5820a791147bdbf Author: Eike Rathke <[email protected]> Date: Sat Apr 18 00:27:28 2015 +0200 TableRef: transform to reference if not supported, i.e. for ODFF Change-Id: I64f751455fbba901bb41f91daaf64ee4878a19b4 diff --git a/formula/source/core/api/FormulaCompiler.cxx b/formula/source/core/api/FormulaCompiler.cxx index 64121e6..c8e4678 100644 --- a/formula/source/core/api/FormulaCompiler.cxx +++ b/formula/source/core/api/FormulaCompiler.cxx @@ -1868,6 +1868,44 @@ const FormulaToken* FormulaCompiler::CreateStringFromToken( OUStringBuffer& rBuf case svIndex: CreateStringFromIndex( rBuffer, t ); + if (t->GetOpCode() == ocTableRef && bAllowArrAdvance && mxSymbols->getSymbol( ocTableRefOpen).isEmpty()) + { + // Suppress all TableRef related tokens, the resulting + // range was written by CreateStringFromIndex(). + const FormulaToken* p = pArr->PeekNext(); + if (p->GetOpCode() == ocTableRefOpen) + { + p = pArr->Next(); + int nLevel = 0; + do + { + // Switch cases correspond with those in + // ScCompiler::HandleTableRef() + switch (p->GetOpCode()) + { + case ocTableRefOpen: + ++nLevel; + break; + case ocTableRefClose: + --nLevel; + break; + case ocTableRefItemAll: + case ocTableRefItemHeaders: + case ocTableRefItemData: + case ocTableRefItemTotals: + case ocTableRefItemThisRow: + case ocSep: + case ocPush: + case ocRange: + case ocSpaces: + break; + default: + nLevel = 0; + bNext = false; + } + } while (nLevel && (p = pArr->Next())); + } + } break; case svExternal: { diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index 2e1ee10..64b566c 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -4527,13 +4527,52 @@ void ScCompiler::CreateStringFromIndex( OUStringBuffer& rBuffer, const FormulaTo } break; case ocDBArea: - case ocTableRef: { const ScDBData* pDBData = pDoc->GetDBCollection()->getNamedDBs().findByIndex(_pTokenP->GetIndex()); if (pDBData) aBuffer.append(pDBData->GetName()); } break; + case ocTableRef: + { + if (mxSymbols->getSymbol( ocTableRefOpen).isEmpty()) + { + // Write the resulting reference if TableRef is not supported. + const ScTableRefToken* pTR = dynamic_cast<const ScTableRefToken*>(_pTokenP); + if (!pTR) + AppendErrorConstant( aBuffer, errNoCode); + else + { + const FormulaToken* pRef = pTR->GetAreaRefRPN(); + if (!pRef) + AppendErrorConstant( aBuffer, errNoCode); + else + { + switch (pRef->GetType()) + { + case svSingleRef: + CreateStringFromSingleRef( aBuffer, pRef); + break; + case svDoubleRef: + CreateStringFromDoubleRef( aBuffer, pRef); + break; + case svError: + AppendErrorConstant( aBuffer, pRef->GetError()); + break; + default: + AppendErrorConstant( aBuffer, errNoCode); + } + } + } + } + else + { + const ScDBData* pDBData = pDoc->GetDBCollection()->getNamedDBs().findByIndex(_pTokenP->GetIndex()); + if (pDBData) + aBuffer.append(pDBData->GetName()); + } + } + break; default: ; // nothing } commit 6f25c21eb5cf311d828b77e602a17390af19c962 Author: Eike Rathke <[email protected]> Date: Fri Apr 17 22:25:20 2015 +0200 const all CreateString... FormulaToken* Change-Id: I0e0f064357543e5dc86b178ce30ee005e5483e04 diff --git a/formula/source/core/api/FormulaCompiler.cxx b/formula/source/core/api/FormulaCompiler.cxx index 78861b8..64121e6 100644 --- a/formula/source/core/api/FormulaCompiler.cxx +++ b/formula/source/core/api/FormulaCompiler.cxx @@ -1762,7 +1762,7 @@ void FormulaCompiler::CreateStringFromTokenArray( OUStringBuffer& rBuffer ) if ( pArr->IsRecalcModeForced() ) rBuffer.append( '='); - FormulaToken* t = pArr->First(); + const FormulaToken* t = pArr->First(); while( t ) t = CreateStringFromToken( rBuffer, t, true ); @@ -1773,19 +1773,21 @@ void FormulaCompiler::CreateStringFromTokenArray( OUStringBuffer& rBuffer ) } } -FormulaToken* FormulaCompiler::CreateStringFromToken( OUString& rFormula, FormulaToken* pTokenP,bool bAllowArrAdvance ) +const FormulaToken* FormulaCompiler::CreateStringFromToken( OUString& rFormula, const FormulaToken* pTokenP, + bool bAllowArrAdvance ) { OUStringBuffer aBuffer; - FormulaToken* p = CreateStringFromToken( aBuffer, pTokenP, bAllowArrAdvance ); + const FormulaToken* p = CreateStringFromToken( aBuffer, pTokenP, bAllowArrAdvance ); rFormula += aBuffer.makeStringAndClear(); return p; } -FormulaToken* FormulaCompiler::CreateStringFromToken( OUStringBuffer& rBuffer, FormulaToken* pTokenP, bool bAllowArrAdvance ) +const FormulaToken* FormulaCompiler::CreateStringFromToken( OUStringBuffer& rBuffer, const FormulaToken* pTokenP, + bool bAllowArrAdvance ) { bool bNext = true; bool bSpaces = false; - FormulaToken* t = pTokenP; + const FormulaToken* t = pTokenP; OpCode eOp = t->GetOpCode(); if( eOp >= ocAnd && eOp <= ocOr ) { @@ -2116,23 +2118,23 @@ bool FormulaCompiler::HandleTableRef() return true; } -void FormulaCompiler::CreateStringFromSingleRef( OUStringBuffer& /*rBuffer*/, FormulaToken* /*pTokenP*/) const +void FormulaCompiler::CreateStringFromSingleRef( OUStringBuffer& /*rBuffer*/, const FormulaToken* /*pToken*/) const { } -void FormulaCompiler::CreateStringFromDoubleRef( OUStringBuffer& /*rBuffer*/, FormulaToken* /*pTokenP*/) const +void FormulaCompiler::CreateStringFromDoubleRef( OUStringBuffer& /*rBuffer*/, const FormulaToken* /*pToken*/) const { } -void FormulaCompiler::CreateStringFromIndex( OUStringBuffer& /*rBuffer*/, FormulaToken* /*pTokenP*/) const +void FormulaCompiler::CreateStringFromIndex( OUStringBuffer& /*rBuffer*/, const FormulaToken* /*pToken*/) const { } -void FormulaCompiler::CreateStringFromMatrix( OUStringBuffer& /*rBuffer*/, FormulaToken* /*pTokenP*/) const +void FormulaCompiler::CreateStringFromMatrix( OUStringBuffer& /*rBuffer*/, const FormulaToken* /*pToken*/) const { } -void FormulaCompiler::CreateStringFromExternal( OUStringBuffer& /*rBuffer*/, FormulaToken* /*pTokenP*/) const +void FormulaCompiler::CreateStringFromExternal( OUStringBuffer& /*rBuffer*/, const FormulaToken* /*pToken*/) const { } diff --git a/include/formula/FormulaCompiler.hxx b/include/formula/FormulaCompiler.hxx index 74d618f..4137e62 100644 --- a/include/formula/FormulaCompiler.hxx +++ b/include/formula/FormulaCompiler.hxx @@ -242,9 +242,9 @@ public: void CreateStringFromTokenArray( OUString& rFormula ); void CreateStringFromTokenArray( OUStringBuffer& rBuffer ); - FormulaToken* CreateStringFromToken( OUString& rFormula, FormulaToken* pToken, + const FormulaToken* CreateStringFromToken( OUString& rFormula, const FormulaToken* pToken, bool bAllowArrAdvance = false ); - FormulaToken* CreateStringFromToken( OUStringBuffer& rBuffer, FormulaToken* pToken, + const FormulaToken* CreateStringFromToken( OUStringBuffer& rBuffer, const FormulaToken* pToken, bool bAllowArrAdvance = false ); void AppendBoolean( OUStringBuffer& rBuffer, bool bVal ) const; @@ -285,11 +285,11 @@ protected: virtual bool HandleDbData(); virtual bool HandleTableRef(); - virtual void CreateStringFromExternal(OUStringBuffer& rBuffer, FormulaToken* pTokenP) const; - virtual void CreateStringFromSingleRef(OUStringBuffer& rBuffer,FormulaToken* pTokenP) const; - virtual void CreateStringFromDoubleRef(OUStringBuffer& rBuffer,FormulaToken* pTokenP) const; - virtual void CreateStringFromMatrix(OUStringBuffer& rBuffer,FormulaToken* pTokenP) const; - virtual void CreateStringFromIndex(OUStringBuffer& rBuffer,FormulaToken* pTokenP) const; + virtual void CreateStringFromExternal( OUStringBuffer& rBuffer, const FormulaToken* pToken ) const; + virtual void CreateStringFromSingleRef( OUStringBuffer& rBuffer, const FormulaToken* pToken ) const; + virtual void CreateStringFromDoubleRef( OUStringBuffer& rBuffer, const FormulaToken* pToken ) const; + virtual void CreateStringFromMatrix( OUStringBuffer& rBuffer, const FormulaToken* pToken ) const; + virtual void CreateStringFromIndex( OUStringBuffer& rBuffer, const FormulaToken* pToken ) const; virtual void LocalizeString( OUString& rName ) const; // modify rName - input: exact name void AppendErrorConstant( OUStringBuffer& rBuffer, sal_uInt16 nError ) const; diff --git a/sc/inc/compiler.hxx b/sc/inc/compiler.hxx index 03baa29..b0d9c71 100644 --- a/sc/inc/compiler.hxx +++ b/sc/inc/compiler.hxx @@ -475,11 +475,11 @@ private: virtual bool HandleTableRef() SAL_OVERRIDE; virtual formula::FormulaTokenRef ExtendRangeReference( formula::FormulaToken & rTok1, formula::FormulaToken & rTok2, bool bReuseDoubleRef ) SAL_OVERRIDE; - virtual void CreateStringFromExternal(OUStringBuffer& rBuffer, formula::FormulaToken* pTokenP) const SAL_OVERRIDE; - virtual void CreateStringFromSingleRef(OUStringBuffer& rBuffer,formula::FormulaToken* _pTokenP) const SAL_OVERRIDE; - virtual void CreateStringFromDoubleRef(OUStringBuffer& rBuffer,formula::FormulaToken* _pTokenP) const SAL_OVERRIDE; - virtual void CreateStringFromMatrix( OUStringBuffer& rBuffer, formula::FormulaToken* _pTokenP) const SAL_OVERRIDE; - virtual void CreateStringFromIndex(OUStringBuffer& rBuffer,formula::FormulaToken* _pTokenP) const SAL_OVERRIDE; + virtual void CreateStringFromExternal( OUStringBuffer& rBuffer, const formula::FormulaToken* pToken ) const SAL_OVERRIDE; + virtual void CreateStringFromSingleRef( OUStringBuffer& rBuffer, const formula::FormulaToken* pToken ) const SAL_OVERRIDE; + virtual void CreateStringFromDoubleRef( OUStringBuffer& rBuffer, const formula::FormulaToken* pToken ) const SAL_OVERRIDE; + virtual void CreateStringFromMatrix( OUStringBuffer& rBuffer, const formula::FormulaToken* pToken ) const SAL_OVERRIDE; + virtual void CreateStringFromIndex( OUStringBuffer& rBuffer, const formula::FormulaToken* pToken ) const SAL_OVERRIDE; virtual void LocalizeString( OUString& rName ) const SAL_OVERRIDE; // modify rName - input: exact name /// Access the CharTable flags diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index c19b29f..2e1ee10 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -4393,9 +4393,9 @@ bool ScCompiler::IsCharFlagAllConventions( return false; } -void ScCompiler::CreateStringFromExternal(OUStringBuffer& rBuffer, FormulaToken* pTokenP) const +void ScCompiler::CreateStringFromExternal( OUStringBuffer& rBuffer, const FormulaToken* pTokenP ) const { - FormulaToken* t = pTokenP; + const FormulaToken* t = pTokenP; sal_uInt16 nFileId = t->GetIndex(); ScExternalRefManager* pRefMgr = pDoc->GetExternalRefManager(); const OUString* pFileName = pRefMgr->getExternalFileName(nFileId); @@ -4434,8 +4434,7 @@ void ScCompiler::CreateStringFromExternal(OUStringBuffer& rBuffer, FormulaToken* } } -void ScCompiler::CreateStringFromMatrix( - OUStringBuffer& rBuffer, FormulaToken* pTokenP) const +void ScCompiler::CreateStringFromMatrix( OUStringBuffer& rBuffer, const FormulaToken* pTokenP ) const { const ScMatrix* pMatrix = pTokenP->GetMatrix(); SCSIZE nC, nMaxC, nR, nMaxR; @@ -4479,7 +4478,7 @@ void ScCompiler::CreateStringFromMatrix( rBuffer.append( mxSymbols->getSymbol(ocArrayClose) ); } -void ScCompiler::CreateStringFromSingleRef(OUStringBuffer& rBuffer,FormulaToken* _pTokenP) const +void ScCompiler::CreateStringFromSingleRef( OUStringBuffer& rBuffer, const FormulaToken* _pTokenP ) const { OUString aErrRef = GetCurrentOpCodeMap()->getSymbol(ocErrRef); const OpCode eOp = _pTokenP->GetOpCode(); @@ -4507,14 +4506,14 @@ void ScCompiler::CreateStringFromSingleRef(OUStringBuffer& rBuffer,FormulaToken* GetSetupTabNames(), aRef, true); } -void ScCompiler::CreateStringFromDoubleRef(OUStringBuffer& rBuffer,FormulaToken* _pTokenP) const +void ScCompiler::CreateStringFromDoubleRef( OUStringBuffer& rBuffer, const FormulaToken* _pTokenP ) const { OUString aErrRef = GetCurrentOpCodeMap()->getSymbol(ocErrRef); pConv->makeRefStr(rBuffer, meGrammar, aPos, aErrRef, GetSetupTabNames(), *_pTokenP->GetDoubleRef(), false); } -void ScCompiler::CreateStringFromIndex(OUStringBuffer& rBuffer,FormulaToken* _pTokenP) const +void ScCompiler::CreateStringFromIndex( OUStringBuffer& rBuffer, const FormulaToken* _pTokenP ) const { const OpCode eOp = _pTokenP->GetOpCode(); OUStringBuffer aBuffer; commit aecf1ea0c8ba2cbbe40754d48f22f0a58dbe0cf3 Author: Eike Rathke <[email protected]> Date: Fri Apr 17 19:47:44 2015 +0200 TableRef: scan any column specifier Change-Id: I9eb51741d8c5ace52cff70b1954ebde678e6b338 diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index d2227cd..c19b29f 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -90,6 +90,7 @@ enum ScanState ssSkipReference, ssGetErrorConstant, ssGetTableRefItem, + ssGetTableRefColumn, ssStop }; @@ -1901,7 +1902,12 @@ Label_MaskStateMachine: case ssGetChar : { // Order is important! - if( nMask & SC_COMPILER_C_ODF_LABEL_OP ) + if (eLastOp == ocTableRefOpen && c != '[' && c != '#' && c != ']') + { + *pSym++ = c; + eState = ssGetTableRefColumn; + } + else if( nMask & SC_COMPILER_C_ODF_LABEL_OP ) { // '!!' automatic intersection if (GetCharTableFlags( pSrc[0], 0 ) & SC_COMPILER_C_ODF_LABEL_OP) @@ -2213,6 +2219,26 @@ Label_MaskStateMachine: } } break; + case ssGetTableRefColumn: + { + // Scan whatever up to the next unescaped ']' closer. + if (c != ']' || cLast == '\'') + { + if( pSym == &cSymbol[ MAXSTRLEN-1 ] ) + { + SetError( errStringOverflow); + eState = ssStop; + } + else + *pSym++ = c; + } + else + { + --pSrc; + eState = ssStop; + } + } + break; case ssGetReference: if( pSym == &cSymbol[ MAXSTRLEN-1 ] ) { commit c8b9b398fc74cb625f796a0e336c32be21c08b7a Author: Eike Rathke <[email protected]> Date: Fri Apr 17 18:43:41 2015 +0200 TableRef: activate for OOXML import Change-Id: I7ebe365c81af5ee9ea70b2efad8908b360a51a7c diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx index 63f2dd5..d2227cd 100644 --- a/sc/source/core/tool/compiler.cxx +++ b/sc/source/core/tool/compiler.cxx @@ -362,20 +362,9 @@ ScCompiler::Convention::Convention( FormulaGrammar::AddressConvention eConv ) } else if (FormulaGrammar::CONV_XL_OOX == meConv) { -#if 1 - /* TODO: currently SC_COMPILER_C_CHAR doesn't work as long as the - * table references aren't implemented. */ -/* [ */ t[91] = SC_COMPILER_C_CHAR_IDENT; -/* \ */ // FREE -/* ] */ t[93] = SC_COMPILER_C_IDENT; -#else - /* TODO: check if SC_COMPILER_C_CHAR_IDENT and SC_COMPILER_C_IDENT - * were only added to be able to import table structured - * reference of a whole table. If so, then remove here. */ /* [ */ t[91] = SC_COMPILER_C_CHAR | SC_COMPILER_C_CHAR_IDENT; /* \ */ // FREE /* ] */ t[93] = SC_COMPILER_C_CHAR | SC_COMPILER_C_IDENT; -#endif } else if (FormulaGrammar::CONV_XL_A1 == meConv) { @@ -1959,8 +1948,20 @@ Label_MaskStateMachine: } else if( nMask & SC_COMPILER_C_CHAR ) { - *pSym++ = c; - eState = ssStop; + // '[' is a special case in OOXML, it can start an external + // reference ID like [1]Sheet1!A1 that needs to be scanned + // entirely, or can be ocTableRefOpen, of which the first + // transforms an ocDBArea into an ocTableRef. + if (c == '[' && FormulaGrammar::isOOXML( meGrammar) && eLastOp != ocDBArea && maTableRefs.empty()) + { + nMask &= ~SC_COMPILER_C_CHAR; + goto Label_MaskStateMachine; + } + else + { + *pSym++ = c; + eState = ssStop; + } } else if( nMask & SC_COMPILER_C_ODF_LBRACKET ) { @@ -3010,17 +3011,6 @@ bool ScCompiler::IsExternalNamedRange( const OUString& rSymbol, bool& rbInvalidE bool ScCompiler::IsDBRange( const OUString& rName ) { - if (rName == "[]") - { - OpCode eOp = maRawToken.GetOpCode(); - if (eOp == ocDBArea || eOp == ocTableRef) - { - // In OOXML, a database range is named Table1[], Table2[] etc. - // Skip the [] part if the previous token is a valid db range. - maRawToken.eOp = ocSkip; - return true; - } - } ScDBCollection::NamedDBs& rDBs = pDoc->GetDBCollection()->getNamedDBs(); const ScDBData* p = rDBs.findByUpperName(rName); if (!p) _______________________________________________ Libreoffice-commits mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
