[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