Kaydet (Commit) 7539a695 authored tarafından Noel Power's avatar Noel Power

xlsx fix cyclic referenced defined names partially fixes bnc#780296 bnc#781166

Change-Id: Ibad37ac05c608c0211063bfa73931427d48c11f9
üst b5a1db96
......@@ -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;
......
......@@ -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 )
......
......@@ -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 );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment