sc/inc/rangenam.hxx | 3 +- sc/source/core/tool/rangenam.cxx | 36 +++++++++++++++++++++----------- sc/source/filter/oox/defnamesbuffer.cxx | 13 +++++++++-- 3 files changed, 37 insertions(+), 15 deletions(-)
New commits: commit 7539a695b801b92d10ff30463a8c08672a258442 Author: Noel Power <noel.po...@suse.com> Date: Thu Sep 20 15:05:00 2012 +0100 xlsx fix cyclic referenced defined names partially fixes bnc#780296 bnc#781166 Change-Id: Ibad37ac05c608c0211063bfa73931427d48c11f9 diff --git a/sc/inc/rangenam.hxx b/sc/inc/rangenam.hxx index d370328..64955e1 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 a2f67a2..8a52a71 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 b31b5fb..6a3a3aa 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 ); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits