diff options
author | Noel Power <noel.power@suse.com> | 2012-09-20 15:05:00 +0100 |
---|---|---|
committer | Noel Power <noel.power@suse.com> | 2012-09-20 15:52:47 +0100 |
commit | 7539a695b801b92d10ff30463a8c08672a258442 (patch) | |
tree | 29f72c48d4a44f6cc0822f968a73f53e60dcd375 /sc/source | |
parent | b5a1db961372b3fa66724ee580726c67e7683dbc (diff) |
xlsx fix cyclic referenced defined names partially fixes bnc#780296 bnc#781166
Change-Id: Ibad37ac05c608c0211063bfa73931427d48c11f9
Diffstat (limited to 'sc/source')
-rw-r--r-- | sc/source/core/tool/rangenam.cxx | 36 | ||||
-rw-r--r-- | sc/source/filter/oox/defnamesbuffer.cxx | 13 |
2 files changed, 35 insertions, 14 deletions
diff --git a/sc/source/core/tool/rangenam.cxx b/sc/source/core/tool/rangenam.cxx index a2f67a27d986..8a52a71cbd5a 100644 --- a/sc/source/core/tool/rangenam.cxx +++ b/sc/source/core/tool/rangenam.cxx @@ -100,18 +100,7 @@ ScRangeData::ScRangeData( ScDocument* pDok, mnMaxRow (-1), mnMaxCol (-1) { - if( !pCode->GetCodeError() ) - { - pCode->Reset(); - FormulaToken* p = pCode->GetNextReference(); - if( p ) // exact one reference at first - { - if( p->GetType() == svSingleRef ) - eType = eType | RT_ABSPOS; - else - eType = eType | RT_ABSAREA; - } - } + InitCode(); } ScRangeData::ScRangeData( ScDocument* pDok, @@ -648,6 +637,29 @@ void ScRangeData::ValidateTabRefs() } } +void ScRangeData::SetCode( ScTokenArray& rArr ) +{ + ::std::auto_ptr<ScTokenArray> pOldCode( pCode); // old pCode will be deleted + pCode = new ScTokenArray( rArr ); + InitCode(); +} + +void ScRangeData::InitCode() +{ + if( !pCode->GetCodeError() ) + { + pCode->Reset(); + FormulaToken* p = pCode->GetNextReference(); + if( p ) // exact one reference at first + { + if( p->GetType() == svSingleRef ) + eType = eType | RT_ABSPOS; + else + eType = eType | RT_ABSAREA; + } + } +} + extern "C" int SAL_CALL ScRangeData_QsortNameCompare( const void* p1, const void* p2 ) diff --git a/sc/source/filter/oox/defnamesbuffer.cxx b/sc/source/filter/oox/defnamesbuffer.cxx index b31b5fb16a3c..6a3a3aaefa1c 100644 --- a/sc/source/filter/oox/defnamesbuffer.cxx +++ b/sc/source/filter/oox/defnamesbuffer.cxx @@ -382,9 +382,9 @@ void DefinedName::createNameObject( sal_Int32 nIndex ) // create the name and insert it into the document, maCalcName will be changed to the resulting name if (maModel.mnSheet >= 0) - mpScRangeData = createLocalNamedRangeObject( maCalcName, getTokens(), nIndex, nNameFlags, maModel.mnSheet ); + mpScRangeData = createLocalNamedRangeObject( maCalcName, ApiTokenSequence(), nIndex, nNameFlags, maModel.mnSheet ); else - mpScRangeData = createNamedRangeObject( maCalcName, getTokens(), nIndex, nNameFlags ); + mpScRangeData = createNamedRangeObject( maCalcName, ApiTokenSequence(), nIndex, nNameFlags ); mnTokenIndex = nIndex; } @@ -426,6 +426,15 @@ DefinedName::getTokens() void DefinedName::convertFormula() { + // convert and set formula of the defined name + if ( getFilterType() == FILTER_OOXML ) + { + ApiTokenSequence aTokens = getTokens(); + ScTokenArray aTokenArray; + (void)ScTokenConversion::ConvertToTokenArray( this->getScDocument(), aTokenArray, aTokens ); + mpScRangeData->SetCode( aTokenArray ); + } + ScTokenArray* pTokenArray = mpScRangeData->GetCode(); Sequence< FormulaToken > aFTokenSeq; (void)ScTokenConversion::ConvertToTokenSequence( this->getScDocument(), aFTokenSeq, *pTokenArray ); |