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 | |
parent | b5a1db961372b3fa66724ee580726c67e7683dbc (diff) |
xlsx fix cyclic referenced defined names partially fixes bnc#780296 bnc#781166
Change-Id: Ibad37ac05c608c0211063bfa73931427d48c11f9
-rw-r--r-- | sc/inc/rangenam.hxx | 3 | ||||
-rw-r--r-- | sc/source/core/tool/rangenam.cxx | 36 | ||||
-rw-r--r-- | sc/source/filter/oox/defnamesbuffer.cxx | 13 |
3 files changed, 37 insertions, 15 deletions
diff --git a/sc/inc/rangenam.hxx b/sc/inc/rangenam.hxx index d3703284fa36..64955e1bf7df 100644 --- a/sc/inc/rangenam.hxx +++ b/sc/inc/rangenam.hxx @@ -87,7 +87,7 @@ private: SCCOL mnMaxCol; void CompileRangeData( const String& rSymbol, bool bSetError ); - + void InitCode(); public: typedef ::std::map<sal_uInt16, sal_uInt16> IndexMap; @@ -120,6 +120,7 @@ public: void SetIndex( sal_uInt16 nInd ) { nIndex = nInd; } sal_uInt16 GetIndex() const { return nIndex; } ScTokenArray* GetCode() { return pCode; } + SC_DLLPUBLIC void SetCode( ScTokenArray& ); const ScTokenArray* GetCode() const { return pCode; } SC_DLLPUBLIC sal_uInt16 GetErrCode() const; bool HasReferences() const; 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 ); |