[Libreoffice-commits] .: Branch 'libreoffice-3-6' - sc/inc sc/source
Libreoffice Gerrit user
logerrit at kemper.freedesktop.org
Tue Sep 25 07:42:41 PDT 2012
sc/inc/rangenam.hxx | 3 +-
sc/source/core/tool/rangenam.cxx | 37 +++++++++++++++++++++-----------
sc/source/filter/oox/defnamesbuffer.cxx | 13 +++++++++--
3 files changed, 38 insertions(+), 15 deletions(-)
New commits:
commit 3a4ebb1fcc0ade5cbc88e0a29304bbd5e440c0d2
Author: Noel Power <noel.power at suse.com>
Date: Thu Sep 20 15:05:00 2012 +0100
xlsx fix cyclic referenced defined names partially fixes bnc#780296 bnc#781166
Use scoped_ptr instead of deprecated auto_ptr
Change-Id: I8dcae78d6faab29c3889e97185839d41cbc3e402
Signed-off-by: Kohei Yoshida <kohei.yoshida at gmail.com>
diff --git a/sc/inc/rangenam.hxx b/sc/inc/rangenam.hxx
index dfb7d9e..d1bd54d 100644
--- a/sc/inc/rangenam.hxx
+++ b/sc/inc/rangenam.hxx
@@ -89,7 +89,7 @@ private:
ScRangeData( sal_uInt16 nIndex );
void CompileRangeData( const String& rSymbol, bool bSetError );
-
+ void InitCode();
public:
typedef ::std::map<sal_uInt16, sal_uInt16> IndexMap;
@@ -122,6 +122,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 e671585..d9eea00 100644
--- a/sc/source/core/tool/rangenam.cxx
+++ b/sc/source/core/tool/rangenam.cxx
@@ -32,6 +32,7 @@
#include <string.h>
#include <memory>
+#include <boost/scoped_ptr.hpp>
#include <unotools/collatorwrapper.hxx>
#include <unotools/transliterationwrapper.hxx>
#include <com/sun/star/sheet/NamedRangeFlag.hpp>
@@ -110,18 +111,7 @@ ScRangeData::ScRangeData( ScDocument* pDok,
mnMaxRow (-1),
mnMaxCol (-1)
{
- if( !pCode->GetCodeError() )
- {
- pCode->Reset();
- FormulaToken* p = pCode->GetNextReference();
- if( p )// genau eine Referenz als erstes
- {
- if( p->GetType() == svSingleRef )
- eType = eType | RT_ABSPOS;
- else
- eType = eType | RT_ABSAREA;
- }
- }
+ InitCode();
}
ScRangeData::ScRangeData( ScDocument* pDok,
@@ -684,6 +674,29 @@ void ScRangeData::ValidateTabRefs()
}
}
+void ScRangeData::SetCode( ScTokenArray& rArr )
+{
+ boost::scoped_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 4eafab7..2cf0c00 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 );
More information about the Libreoffice-commits
mailing list