[Libreoffice-commits] .: Branch 'libreoffice-3-4' - sc/source

Kohei Yoshida kohei at kemper.freedesktop.org
Thu May 5 19:48:43 PDT 2011


 sc/source/core/data/documen4.cxx |   85 ++++++++++++++++++++++++++-------------
 1 file changed, 57 insertions(+), 28 deletions(-)

New commits:
commit e892251cac6d6b8830dcf61361348561b99c67f3
Author: Kohei Yoshida <kyoshida at novell.com>
Date:   Thu May 5 22:46:39 2011 -0400

    Properly cache external reference values in named ranges.
    
    Values of the external references used only in named ranges were
    not cached properly.  This commit fixes it.

diff --git a/sc/source/core/data/documen4.cxx b/sc/source/core/data/documen4.cxx
index a5ecb95..85dc636 100644
--- a/sc/source/core/data/documen4.cxx
+++ b/sc/source/core/data/documen4.cxx
@@ -296,42 +296,71 @@ void ScDocument::InsertTableOp(const ScTabOpParam& rParam,      // Mehrfachopera
                     pTab[i]->PutCell( j, k, aRefCell.CloneWithoutNote( *this, ScAddress( j, k, i ), SC_CLONECELL_STARTLISTENING ) );
 }
 
+namespace {
+
+bool setCacheTableReferenced(ScToken& rToken, ScExternalRefManager& rRefMgr)
+{
+    switch (rToken.GetType())
+    {
+        case svExternalSingleRef:
+            return rRefMgr.setCacheTableReferenced(
+                rToken.GetIndex(), rToken.GetString(), 1);
+        case svExternalDoubleRef:
+        {
+            const ScComplexRefData& rRef = rToken.GetDoubleRef();
+            size_t nSheets = rRef.Ref2.nTab - rRef.Ref1.nTab + 1;
+            return rRefMgr.setCacheTableReferenced(
+                    rToken.GetIndex(), rToken.GetString(), nSheets);
+        }
+        case svExternalName:
+            /* TODO: external names aren't supported yet, but would
+             * have to be marked as well, if so. Mechanism would be
+             * different. */
+            DBG_ERRORFILE("ScDocument::MarkUsedExternalReferences: implement the svExternalName case!");
+        default:
+            ;
+    }
+    return false;
+}
+
+}
+
 bool ScDocument::MarkUsedExternalReferences( ScTokenArray & rArr )
 {
+    if (!rArr.GetLen())
+        return false;
+
+    ScExternalRefManager* pRefMgr = NULL;
+    rArr.Reset();
+    ScToken* t = NULL;
     bool bAllMarked = false;
-    if (rArr.GetLen())
+    while (!bAllMarked && (t = static_cast<ScToken*>(rArr.GetNextReferenceOrName())) != NULL)
     {
-        ScExternalRefManager* pRefMgr = NULL;
-        rArr.Reset();
-        ScToken* t;
-        while (!bAllMarked && (t = static_cast<ScToken*>(rArr.GetNextReferenceOrName())) != NULL)
+        if (t->IsExternalRef())
+        {
+            if (!pRefMgr)
+                pRefMgr = GetExternalRefManager();
+
+            bAllMarked = setCacheTableReferenced(*t, *pRefMgr);
+        }
+        else if (t->GetType() == svIndex)
         {
-            if (t->IsExternalRef())
+            // this is a named range.  Check if the range contains an external
+            // reference.
+            ScRangeData* pRangeData = GetRangeName()->findByIndex(t->GetIndex());
+            if (!pRangeData)
+                continue;
+
+            ScTokenArray* pArray = pRangeData->GetCode();
+            for (t = static_cast<ScToken*>(pArray->First()); t; t = static_cast<ScToken*>(pArray->Next()))
             {
+                if (!t->IsExternalRef())
+                    continue;
+
                 if (!pRefMgr)
                     pRefMgr = GetExternalRefManager();
-                switch (t->GetType())
-                {
-                    case svExternalSingleRef:
-                        bAllMarked = pRefMgr->setCacheTableReferenced( 
-                                t->GetIndex(), t->GetString(), 1);
-                        break;
-                    case svExternalDoubleRef:
-                        {
-                            const ScComplexRefData& rRef = t->GetDoubleRef();
-                            size_t nSheets = rRef.Ref2.nTab - rRef.Ref1.nTab + 1;
-                            bAllMarked = pRefMgr->setCacheTableReferenced( 
-                                    t->GetIndex(), t->GetString(), nSheets);
-                        }
-                        break;
-                    case svExternalName:
-                        /* TODO: external names aren't supported yet, but would 
-                         * have to be marked as well, if so. Mechanism would be 
-                         * different. */
-                        DBG_ERRORFILE("ScDocument::MarkUsedExternalReferences: implement the svExternalName case!");
-                        break;
-                    default: break;
-                }
+
+                bAllMarked = setCacheTableReferenced(*t, *pRefMgr);
             }
         }
     }


More information about the Libreoffice-commits mailing list