[Libreoffice-commits] .: sc/inc sc/source

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Thu Sep 20 07:53:11 PDT 2012


 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.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
    
    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 );


More information about the Libreoffice-commits mailing list