[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