diff options
author | Eike Rathke <erack@redhat.com> | 2015-04-18 00:27:28 +0200 |
---|---|---|
committer | Eike Rathke <erack@redhat.com> | 2015-04-18 00:46:08 +0200 |
commit | 8c2173d95c8fd626c5399144d5820a791147bdbf (patch) | |
tree | 889a344c9085889236fb9f9816c292ada85e5746 | |
parent | 6f25c21eb5cf311d828b77e602a17390af19c962 (diff) |
TableRef: transform to reference if not supported, i.e. for ODFF
Change-Id: I64f751455fbba901bb41f91daaf64ee4878a19b4
-rw-r--r-- | formula/source/core/api/FormulaCompiler.cxx | 38 | ||||
-rw-r--r-- | sc/source/core/tool/compiler.cxx | 41 |
2 files changed, 78 insertions, 1 deletions
diff --git a/formula/source/core/api/FormulaCompiler.cxx b/formula/source/core/api/FormulaCompiler.cxx index 64121e6d6b52..c8e467821446 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 2e1ee10645c3..64b566ca3a4a 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 } |